migrated from redux to recoil
This commit is contained in:
9
frontend/src/atoms/downloadTemplate.ts
Normal file
9
frontend/src/atoms/downloadTemplate.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { atom } from 'recoil'
|
||||
|
||||
export const downloadTemplateState = atom({
|
||||
key: 'downloadTemplateState',
|
||||
default: localStorage.getItem('lastDownloadTemplate') ?? '',
|
||||
effects: [
|
||||
({ onSet }) => onSet(e => localStorage.setItem('lastDownloadTemplate', e))
|
||||
]
|
||||
})
|
||||
7
frontend/src/atoms/downloads.ts
Normal file
7
frontend/src/atoms/downloads.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
import { atom } from 'recoil'
|
||||
import { RPCResult } from '../types'
|
||||
|
||||
export const activeDownloadsState = atom<RPCResult[] | undefined>({
|
||||
key: 'activeDownloadsState',
|
||||
default: undefined
|
||||
})
|
||||
7
frontend/src/atoms/format.ts
Normal file
7
frontend/src/atoms/format.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
import { atom } from 'recoil'
|
||||
import { DLMetadata } from '../types'
|
||||
|
||||
export const selectedFormatState = atom<Partial<DLMetadata>>({
|
||||
key: 'selectedFormatState',
|
||||
default: {},
|
||||
})
|
||||
9
frontend/src/atoms/i18n.ts
Normal file
9
frontend/src/atoms/i18n.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { selector } from 'recoil'
|
||||
import I18nBuilder from '../lib/intl'
|
||||
import { languageState } from './settings'
|
||||
|
||||
export const i18nBuilderState = selector({
|
||||
key: 'i18nBuilderState',
|
||||
get: ({ get }) => new I18nBuilder(get(languageState)),
|
||||
dangerouslyAllowMutability: true,
|
||||
})
|
||||
12
frontend/src/atoms/rpc.ts
Normal file
12
frontend/src/atoms/rpc.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { selector } from 'recoil'
|
||||
import { RPCClient } from '../lib/rpcClient'
|
||||
import { rpcHTTPEndpoint, rpcWebSocketEndpoint } from './settings'
|
||||
|
||||
export const rpcClientState = selector({
|
||||
key: 'rpcClientState',
|
||||
get: ({ get }) =>
|
||||
new RPCClient(get(rpcHTTPEndpoint), get(rpcWebSocketEndpoint)),
|
||||
set: ({ get }) =>
|
||||
new RPCClient(get(rpcHTTPEndpoint), get(rpcWebSocketEndpoint)),
|
||||
dangerouslyAllowMutability: true,
|
||||
})
|
||||
175
frontend/src/atoms/settings.ts
Normal file
175
frontend/src/atoms/settings.ts
Normal file
@@ -0,0 +1,175 @@
|
||||
import { atom, selector } from 'recoil'
|
||||
|
||||
export type Language =
|
||||
| 'english'
|
||||
| 'chinese'
|
||||
| 'russian'
|
||||
| 'italian'
|
||||
| 'spanish'
|
||||
| 'korean'
|
||||
| 'japanese'
|
||||
| 'catalan'
|
||||
| 'ukrainian'
|
||||
| 'polish'
|
||||
|
||||
export const languages = [
|
||||
'english',
|
||||
'chinese',
|
||||
'russian',
|
||||
'italian',
|
||||
'spanish',
|
||||
'korean',
|
||||
'japanese',
|
||||
'catalan',
|
||||
'ukrainian',
|
||||
'polish',
|
||||
] as const
|
||||
|
||||
export type Theme = 'light' | 'dark'
|
||||
|
||||
export interface SettingsState {
|
||||
serverAddr: string
|
||||
serverPort: number
|
||||
language: Language
|
||||
theme: Theme
|
||||
cliArgs: string
|
||||
formatSelection: boolean
|
||||
fileRenaming: boolean
|
||||
pathOverriding: boolean
|
||||
enableCustomArgs: boolean
|
||||
listView: boolean
|
||||
}
|
||||
|
||||
export const languageState = atom<Language>({
|
||||
key: 'languageState',
|
||||
default: localStorage.getItem('language') as Language ?? 'english',
|
||||
effects: [
|
||||
({ onSet }) =>
|
||||
onSet(l => localStorage.setItem('language', l.toString()))
|
||||
]
|
||||
})
|
||||
|
||||
export const themeState = atom<Theme>({
|
||||
key: 'themeStateState',
|
||||
default: localStorage.getItem('theme') as Theme ?? 'system',
|
||||
effects: [
|
||||
({ onSet }) =>
|
||||
onSet(l => localStorage.setItem('theme', l.toString()))
|
||||
]
|
||||
})
|
||||
|
||||
export const serverAddressState = atom<string>({
|
||||
key: 'serverAddressState',
|
||||
default: localStorage.getItem('server-addr') ?? window.location.hostname,
|
||||
effects: [
|
||||
({ onSet }) =>
|
||||
onSet(a => localStorage.setItem('server-addr', a.toString()))
|
||||
]
|
||||
})
|
||||
|
||||
export const serverPortState = atom<number>({
|
||||
key: 'serverPortState',
|
||||
default: Number(localStorage.getItem('server-port')) ??
|
||||
Number(window.location.port),
|
||||
effects: [
|
||||
({ onSet }) =>
|
||||
onSet(a => localStorage.setItem('server-port', a.toString()))
|
||||
]
|
||||
})
|
||||
|
||||
export const latestCliArgumentsState = atom<string>({
|
||||
key: 'latestCliArgumentsState',
|
||||
default: localStorage.getItem('cli-args') ?? '',
|
||||
effects: [
|
||||
({ onSet }) =>
|
||||
onSet(a => localStorage.setItem('cli-args', a.toString()))
|
||||
]
|
||||
})
|
||||
|
||||
export const formatSelectionState = atom({
|
||||
key: 'formatSelectionState',
|
||||
default: localStorage.getItem('format-selection') === "true",
|
||||
effects: [
|
||||
({ onSet }) =>
|
||||
onSet(a => localStorage.setItem('format-selection', a.toString()))
|
||||
]
|
||||
})
|
||||
|
||||
export const fileRenamingState = atom({
|
||||
key: 'fileRenamingState',
|
||||
default: localStorage.getItem('file-renaming') === "true",
|
||||
effects: [
|
||||
({ onSet }) =>
|
||||
onSet(a => localStorage.setItem('file-renaming', a.toString()))
|
||||
]
|
||||
})
|
||||
|
||||
export const pathOverridingState = atom({
|
||||
key: 'pathOverridingState',
|
||||
default: localStorage.getItem('path-overriding') === "true",
|
||||
effects: [
|
||||
({ onSet }) =>
|
||||
onSet(a => localStorage.setItem('path-overriding', a.toString()))
|
||||
]
|
||||
})
|
||||
|
||||
export const enableCustomArgsState = atom({
|
||||
key: 'enableCustomArgsState',
|
||||
default: localStorage.getItem('enable-custom-args') === "true",
|
||||
effects: [
|
||||
({ onSet }) =>
|
||||
onSet(a => localStorage.setItem('enable-custom-args', a.toString()))
|
||||
]
|
||||
})
|
||||
|
||||
export const listViewState = atom({
|
||||
key: 'listViewState',
|
||||
default: localStorage.getItem('listview') === "true",
|
||||
effects: [
|
||||
({ onSet }) =>
|
||||
onSet(a => localStorage.setItem('listview', a.toString()))
|
||||
]
|
||||
})
|
||||
|
||||
export const serverAddressAndPortState = selector({
|
||||
key: 'serverAddressAndPortState',
|
||||
get: ({ get }) => `${get(serverAddressState)}:${get(serverPortState)}`
|
||||
})
|
||||
|
||||
export const serverURL = selector({
|
||||
key: 'serverURL',
|
||||
get: ({ get }) =>
|
||||
`${window.location.protocol}//${get(serverAddressState)}:${get(serverPortState)}`
|
||||
})
|
||||
|
||||
export const rpcWebSocketEndpoint = selector({
|
||||
key: 'rpcWebSocketEndpoint',
|
||||
get: ({ get }) => {
|
||||
const proto = window.location.protocol === 'https:' ? 'wss:' : 'ws:'
|
||||
return `${proto}//${get(serverAddressAndPortState)}/rpc/ws`
|
||||
}
|
||||
})
|
||||
|
||||
export const rpcHTTPEndpoint = selector({
|
||||
key: 'rpcHTTPEndpoint',
|
||||
get: ({ get }) => {
|
||||
const proto = window.location.protocol
|
||||
return `${proto}//${get(serverAddressAndPortState)}/rpc/http`
|
||||
}
|
||||
})
|
||||
|
||||
export const settingsState = selector<SettingsState>({
|
||||
key: 'settingsState',
|
||||
get: ({ get }) => ({
|
||||
serverAddr: get(serverAddressState),
|
||||
serverPort: get(serverPortState),
|
||||
language: get(languageState),
|
||||
theme: get(themeState),
|
||||
cliArgs: get(latestCliArgumentsState),
|
||||
formatSelection: get(formatSelectionState),
|
||||
fileRenaming: get(fileRenamingState),
|
||||
pathOverriding: get(pathOverridingState),
|
||||
enableCustomArgs: get(enableCustomArgsState),
|
||||
listView: get(listViewState),
|
||||
})
|
||||
})
|
||||
39
frontend/src/atoms/status.ts
Normal file
39
frontend/src/atoms/status.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import { atom, selector } from 'recoil'
|
||||
|
||||
type StatusState = {
|
||||
connected: boolean,
|
||||
updated: boolean,
|
||||
downloading: boolean,
|
||||
freeSpace: number,
|
||||
}
|
||||
|
||||
|
||||
export const connectedState = atom({
|
||||
key: 'connectedState',
|
||||
default: false
|
||||
})
|
||||
|
||||
export const updatedBinaryState = atom({
|
||||
key: 'updatedBinaryState',
|
||||
default: false
|
||||
})
|
||||
|
||||
export const isDownloadingState = atom({
|
||||
key: 'isDownloadingState',
|
||||
default: false
|
||||
})
|
||||
|
||||
export const freeSpaceBytesState = atom({
|
||||
key: 'freeSpaceBytesState',
|
||||
default: 0
|
||||
})
|
||||
|
||||
export const statusState = selector<StatusState>({
|
||||
key: 'statusState',
|
||||
get: ({ get }) => ({
|
||||
connected: get(connectedState),
|
||||
updated: get(updatedBinaryState),
|
||||
downloading: get(isDownloadingState),
|
||||
freeSpace: get(freeSpaceBytesState),
|
||||
})
|
||||
})
|
||||
15
frontend/src/atoms/toast.ts
Normal file
15
frontend/src/atoms/toast.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { AlertColor } from '@mui/material'
|
||||
import { atom } from 'recoil'
|
||||
|
||||
type Toast = {
|
||||
open: boolean,
|
||||
message: string
|
||||
autoClose: boolean
|
||||
createdAt: number,
|
||||
severity?: AlertColor
|
||||
}
|
||||
|
||||
export const toastListState = atom<Toast[]>({
|
||||
key: 'toastListState',
|
||||
default: [],
|
||||
})
|
||||
Reference in New Issue
Block a user