Skip to content

Commit 81ca7a5

Browse files
committed
feat: selected operators are now persisted by jotai atoms
1 parent f747d06 commit 81ca7a5

File tree

3 files changed

+39
-13
lines changed

3 files changed

+39
-13
lines changed

src/components/Operations.tsx

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,33 @@ import {
77
} from '@blueprintjs/core'
88

99
import { UseOperationsParams } from 'apis/operation'
10-
import { useAtom } from 'jotai'
10+
import { useAtom, useAtomValue } from 'jotai'
1111
import { debounce } from 'lodash-es'
1212
import { ComponentType, useMemo, useState } from 'react'
1313

1414
import { CardTitle } from 'components/CardTitle'
1515
import { OperationList } from 'components/OperationList'
1616
import { OperationSetList } from 'components/OperationSetList'
1717
import { neoLayoutAtom } from 'store/pref'
18+
import {
19+
selectedOperatorQueryAtom,
20+
selectedOperatorsAtom,
21+
} from 'store/selectedOperators'
1822

1923
import { authAtom } from '../store/auth'
2024
import { OperatorSelect } from './OperatorSelect'
2125
import { withSuspensable } from './Suspensable'
2226

2327
export const Operations: ComponentType = withSuspensable(() => {
24-
const [queryParams, setQueryParams] = useState<UseOperationsParams>({
28+
const [queryParams, setQueryParams] = useState<
29+
Omit<UseOperationsParams, 'operator'>
30+
>({
2531
orderBy: 'hot',
2632
})
33+
const [selectedOperators, setSelectedOperators] = useAtom(
34+
selectedOperatorsAtom,
35+
)
36+
const selectedOperatorQuery = useAtomValue(selectedOperatorQueryAtom)
2737
const debouncedSetQueryParams = useMemo(
2838
() => debounce(setQueryParams, 500),
2939
[],
@@ -95,7 +105,7 @@ export const Operations: ComponentType = withSuspensable(() => {
95105
<div className="flex mr-4">
96106
<FormGroup
97107
helperText={
98-
queryParams.operator?.length
108+
selectedOperators.length
99109
? '点击干员标签以标记为排除该干员'
100110
: undefined
101111
}
@@ -135,13 +145,8 @@ export const Operations: ComponentType = withSuspensable(() => {
135145
/>
136146
<OperatorSelect
137147
className="mt-2"
138-
operators={queryParams.operator?.split(',') || []}
139-
onChange={(operators) =>
140-
setQueryParams((old) => ({
141-
...old,
142-
operator: operators.join(','),
143-
}))
144-
}
148+
operators={selectedOperatorQuery.split(',')}
149+
onChange={setSelectedOperators}
145150
/>
146151
</FormGroup>
147152
</div>
@@ -210,9 +215,12 @@ export const Operations: ComponentType = withSuspensable(() => {
210215
</Card>
211216

212217
<div className="tabular-nums">
213-
{listMode === 'operation' && <OperationList {...queryParams} />}
218+
{listMode === 'operation' && (
219+
<OperationList {...queryParams} operator={selectedOperatorQuery} />
220+
)}
214221
{listMode === 'operationSet' && <OperationSetList {...queryParams} />}
215222
</div>
216223
</>
217224
)
218225
})
226+
Operations.displayName = 'Operations'

src/components/OperatorSelect.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ interface OperatorSelectProps {
1414
onChange: (operators: string[]) => void
1515
}
1616

17-
type OperatorInfo = typeof OPERATORS[number]
17+
type OperatorInfo = (typeof OPERATORS)[number]
1818

1919
interface OperatorEntry {
2020
name: string
@@ -122,11 +122,12 @@ export const OperatorSelect: FC<OperatorSelectProps> = ({
122122
leftIcon: 'person',
123123
className: '!flex !p-0 !pl-[5px]',
124124
large: true,
125-
tagProps(value, index) {
125+
tagProps(_value, index) {
126126
const operator = operators[index]
127127

128128
return {
129129
interactive: true,
130+
className: operator.exclude ? 'line-through' : undefined,
130131
intent: operator?.exclude ? 'danger' : 'primary',
131132
onClick: () => setExclude(index, !operator?.exclude),
132133
}

src/store/selectedOperators.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { atom } from 'jotai'
2+
import { atomWithStorage } from 'jotai/utils'
3+
4+
interface OperatorEntry {
5+
name: string
6+
exclude?: boolean
7+
}
8+
9+
export const selectedOperatorsAtom = atomWithStorage(
10+
'maa-copilot-selectedOperators',
11+
[] as string[],
12+
)
13+
14+
export const selectedOperatorQueryAtom = atom((get) => {
15+
const operators = get(selectedOperatorsAtom)
16+
return operators.join(',')
17+
})

0 commit comments

Comments
 (0)