From 94bc2851d2a571567877db22c159f5999b971bfd Mon Sep 17 00:00:00 2001 From: Handiwork Date: Tue, 2 Jul 2024 21:57:55 +0800 Subject: [PATCH 01/50] fix: stretch content's container in OperationCard --- src/components/OperationCard.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/OperationCard.tsx b/src/components/OperationCard.tsx index 6cbeceb..362ed32 100644 --- a/src/components/OperationCard.tsx +++ b/src/components/OperationCard.tsx @@ -23,9 +23,9 @@ export const NeoOperationCard = ({ operation }: { operation: Operation }) => { - +
Date: Tue, 9 Jul 2024 22:21:07 +0800 Subject: [PATCH 02/50] temp storage --- .../editor/operator/EditorSheet.tsx | 3 +- .../newSheet/SheetContainerSkeleton.tsx | 34 +++++++++++++++ .../operator/newSheet/SheetNoneData.tsx | 4 ++ .../operator/newSheet/SheetOperator.tsx | 21 +++++++++ .../operator/newSheet/SheetProvider.tsx | 43 +++++++++++++++++++ 5 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/components/editor/operator/newSheet/SheetContainerSkeleton.tsx create mode 100644 src/components/editor/operator/newSheet/SheetNoneData.tsx create mode 100644 src/components/editor/operator/newSheet/SheetOperator.tsx create mode 100644 src/components/editor/operator/newSheet/SheetProvider.tsx diff --git a/src/components/editor/operator/EditorSheet.tsx b/src/components/editor/operator/EditorSheet.tsx index 0240421..b3c048e 100644 --- a/src/components/editor/operator/EditorSheet.tsx +++ b/src/components/editor/operator/EditorSheet.tsx @@ -4,9 +4,10 @@ import { FC, useState } from 'react' import { CopilotDocV1 } from 'models/copilot.schema' +import { SheetOperatorContainer } from './newSheet/SheetOperator' import { SheetGroupContainer, SheetGroupProps } from './sheet/SheetGroup' import { - SheetOperatorContainer, + // SheetOperatorContainer, SheetOperatorProps, } from './sheet/SheetOperator' diff --git a/src/components/editor/operator/newSheet/SheetContainerSkeleton.tsx b/src/components/editor/operator/newSheet/SheetContainerSkeleton.tsx new file mode 100644 index 0000000..9ca44c5 --- /dev/null +++ b/src/components/editor/operator/newSheet/SheetContainerSkeleton.tsx @@ -0,0 +1,34 @@ +import { Divider, H3, Icon, IconName, MaybeElement } from '@blueprintjs/core' + +import clsx from 'clsx' +import { ReactNode } from 'react' + +export interface SheetContainerSkeletonProps { + title: string + icon: IconName | MaybeElement + mini?: boolean + className?: string + rightOptions?: ReactNode + children?: ReactNode +} + +export const SheetContainerSkeleton = ({ + title, + icon, + children, + mini, + rightOptions, + className, +}: SheetContainerSkeletonProps) => ( +
+
+ +

+ {title} +

+ {rightOptions} +
+ {!mini && } + {children} +
+) diff --git a/src/components/editor/operator/newSheet/SheetNoneData.tsx b/src/components/editor/operator/newSheet/SheetNoneData.tsx new file mode 100644 index 0000000..cde78bf --- /dev/null +++ b/src/components/editor/operator/newSheet/SheetNoneData.tsx @@ -0,0 +1,4 @@ +import { NonIdealState } from '@blueprintjs/core' + +export const OperatorNoData = +export const GroupNoData = diff --git a/src/components/editor/operator/newSheet/SheetOperator.tsx b/src/components/editor/operator/newSheet/SheetOperator.tsx new file mode 100644 index 0000000..fe5b6c9 --- /dev/null +++ b/src/components/editor/operator/newSheet/SheetOperator.tsx @@ -0,0 +1,21 @@ +import { FC } from 'react' + +import { SheetContainerSkeleton } from './SheetContainerSkeleton' + +interface SheetOperatorProp {} + +const SheetOperator: FC = () => { + return
111
+} + +export interface SheetOperatorContainer extends SheetOperatorProp {} + +export const SheetOperatorContainer: FC = ({ + ...sheetOperatorProps +}) => { + return ( + + + + ) +} diff --git a/src/components/editor/operator/newSheet/SheetProvider.tsx b/src/components/editor/operator/newSheet/SheetProvider.tsx new file mode 100644 index 0000000..b8d4dc3 --- /dev/null +++ b/src/components/editor/operator/newSheet/SheetProvider.tsx @@ -0,0 +1,43 @@ +import React, { + Dispatch, + FC, + ReactNode, + SetStateAction, + createContext, + useContext, + useState, +} from 'react' + +import { EditorPerformerAddProps } from '../EditorPerformerAdd' + +type SubmitFuncParent = EditorPerformerAddProps + +export interface OperatorInSheet {} + +export interface SheetProviderProp { + submitOperator: SubmitFuncParent['submitOperator'] + submitGroup: SubmitFuncParent['submitGroup'] + children: ReactNode +} + +interface SheetContextValue { + useOperatorInSheet: [any, Dispatch>] + useGroupInSheet: [any, Dispatch>] +} + +const SheetContext = createContext>({}) + +export const SheetProvider: FC = ({ + children, + submitOperator, + submitGroup, +}) => { + const useOperatorInSheet = useState([]) + const useGroupInSheet = useState([]) + + return ( + + {children} + + ) +} From c3f92e5a48f9dfca52b8c19f8db98d87223e3b46 Mon Sep 17 00:00:00 2001 From: GalvinGao Date: Tue, 9 Jul 2024 16:49:57 +0000 Subject: [PATCH 03/50] chore: update generated assets [skip ci] --- .../operator-avatars/char_4146_nymph.png | Bin 0 -> 62345 bytes .../operator-avatars/char_4147_mitm.png | Bin 0 -> 62131 bytes .../token_10037_mitm_trshrb.png | Bin 0 -> 31193 bytes src/models/generated/operators.json | 24 ++++++++++++++++++ 4 files changed, 24 insertions(+) create mode 100644 public/assets/operator-avatars/char_4146_nymph.png create mode 100644 public/assets/operator-avatars/char_4147_mitm.png create mode 100644 public/assets/operator-avatars/token_10037_mitm_trshrb.png diff --git a/public/assets/operator-avatars/char_4146_nymph.png b/public/assets/operator-avatars/char_4146_nymph.png new file mode 100644 index 0000000000000000000000000000000000000000..de812a55bf9bbf92ad3ce520d131730305653fbb GIT binary patch literal 62345 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�-UZ4y(`F01Bcjj@A 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%0DD};pD_ubRS@lN}3oEaTPhkXDNvmT}L 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%0Aa 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 QQ~&?~07*qoM6N<$f{P+YYXATM literal 0 HcmV?d00001 diff --git a/public/assets/operator-avatars/token_10037_mitm_trshrb.png b/public/assets/operator-avatars/token_10037_mitm_trshrb.png new file mode 100644 index 0000000000000000000000000000000000000000..7f7e35ef5709285af51673edeb81996b3b7e05b0 GIT binary patch literal 31193 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

Apff)oQ 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 p0%>h${|D(_ftmmS literal 0 HcmV?d00001 diff --git a/src/models/generated/operators.json b/src/models/generated/operators.json index 8afaa01..5cf8221 100644 --- a/src/models/generated/operators.json +++ b/src/models/generated/operators.json @@ -584,6 +584,14 @@ "rarity": 2, "alt_name": "Durin" }, + { + "id": "char_4147_mitm", + "subProf": "tactician", + "name": "渡桥", + "alias": "duqiao dq 渡橋", + "rarity": 5, + "alt_name": "Mitm" + }, { "id": "char_294_ayer", "subProf": "lord", @@ -1768,6 +1776,14 @@ "rarity": 6, "alt_name": "Exusiai" }, + { + "id": "char_4146_nymph", + "subProf": "primcaster", + "name": "妮芙", + "alias": "nifu nf 妮芙", + "rarity": 6, + "alt_name": "Nymph" + }, { "id": "char_311_mudrok", "subProf": "unyield", @@ -2816,6 +2832,14 @@ "rarity": 0, "alt_name": "Welcome Mat" }, + { + "id": "token_10037_mitm_trshrb", + "subProf": "notchar1", + "name": "樱桃三号", + "alias": "yingtaosanhao ytsh 櫻桃三號", + "rarity": 0, + "alt_name": "Cherry-3" + }, { "id": "char_143_ghost", "subProf": "centurion", From 907af4a3035d0863a80c865904af6d5e45e213e4 Mon Sep 17 00:00:00 2001 From: gemini2035 <2530056984@qq.com> Date: Thu, 11 Jul 2024 08:34:34 +0800 Subject: [PATCH 04/50] temp storage --- .../editor/operator/EditorSheet.tsx | 22 ++++++---- .../newSheet/SheetContainerSkeleton.tsx | 34 --------------- .../operator/newSheet/SheetNoneData.tsx | 4 -- .../operator/newSheet/SheetOperator.tsx | 21 --------- .../operator/newSheet/SheetProvider.tsx | 43 ------------------- .../editor/operator/sheet/SheetGroup.tsx | 24 ++++------- .../editor/operator/sheet/SheetOperator.tsx | 23 +++------- .../operator/sheet/SheetOperatorItem.tsx | 10 +++++ .../editor/operator/sheet/SheetProvider.tsx | 33 ++++++++++++++ 9 files changed, 72 insertions(+), 142 deletions(-) delete mode 100644 src/components/editor/operator/newSheet/SheetContainerSkeleton.tsx delete mode 100644 src/components/editor/operator/newSheet/SheetNoneData.tsx delete mode 100644 src/components/editor/operator/newSheet/SheetOperator.tsx delete mode 100644 src/components/editor/operator/newSheet/SheetProvider.tsx create mode 100644 src/components/editor/operator/sheet/SheetProvider.tsx diff --git a/src/components/editor/operator/EditorSheet.tsx b/src/components/editor/operator/EditorSheet.tsx index b3c048e..d1be5f6 100644 --- a/src/components/editor/operator/EditorSheet.tsx +++ b/src/components/editor/operator/EditorSheet.tsx @@ -4,22 +4,28 @@ import { FC, useState } from 'react' import { CopilotDocV1 } from 'models/copilot.schema' -import { SheetOperatorContainer } from './newSheet/SheetOperator' -import { SheetGroupContainer, SheetGroupProps } from './sheet/SheetGroup' +import { SheetGroupContainer } from './sheet/SheetGroup' import { - // SheetOperatorContainer, + SheetOperatorContainer, SheetOperatorProps, } from './sheet/SheetOperator' +import { + SheetContextValue, + SheetProvider, + SheetProviderProp, +} from './sheet/SheetProvider' -type EditorSheetProps = SheetOperatorProps & SheetGroupProps +type EditorSheetProps = SheetContextValue export type Group = CopilotDocV1.Group export type Operator = CopilotDocV1.Operator const EditorOperatorSheet = (sheetProps: EditorSheetProps) => ( -

- - -
+ +
+ + +
+
) export const EditorSheetTrigger: FC = (sheetProps) => { diff --git a/src/components/editor/operator/newSheet/SheetContainerSkeleton.tsx b/src/components/editor/operator/newSheet/SheetContainerSkeleton.tsx deleted file mode 100644 index 9ca44c5..0000000 --- a/src/components/editor/operator/newSheet/SheetContainerSkeleton.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { Divider, H3, Icon, IconName, MaybeElement } from '@blueprintjs/core' - -import clsx from 'clsx' -import { ReactNode } from 'react' - -export interface SheetContainerSkeletonProps { - title: string - icon: IconName | MaybeElement - mini?: boolean - className?: string - rightOptions?: ReactNode - children?: ReactNode -} - -export const SheetContainerSkeleton = ({ - title, - icon, - children, - mini, - rightOptions, - className, -}: SheetContainerSkeletonProps) => ( -
-
- -

- {title} -

- {rightOptions} -
- {!mini && } - {children} -
-) diff --git a/src/components/editor/operator/newSheet/SheetNoneData.tsx b/src/components/editor/operator/newSheet/SheetNoneData.tsx deleted file mode 100644 index cde78bf..0000000 --- a/src/components/editor/operator/newSheet/SheetNoneData.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import { NonIdealState } from '@blueprintjs/core' - -export const OperatorNoData = -export const GroupNoData = diff --git a/src/components/editor/operator/newSheet/SheetOperator.tsx b/src/components/editor/operator/newSheet/SheetOperator.tsx deleted file mode 100644 index fe5b6c9..0000000 --- a/src/components/editor/operator/newSheet/SheetOperator.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { FC } from 'react' - -import { SheetContainerSkeleton } from './SheetContainerSkeleton' - -interface SheetOperatorProp {} - -const SheetOperator: FC = () => { - return
111
-} - -export interface SheetOperatorContainer extends SheetOperatorProp {} - -export const SheetOperatorContainer: FC = ({ - ...sheetOperatorProps -}) => { - return ( - - - - ) -} diff --git a/src/components/editor/operator/newSheet/SheetProvider.tsx b/src/components/editor/operator/newSheet/SheetProvider.tsx deleted file mode 100644 index b8d4dc3..0000000 --- a/src/components/editor/operator/newSheet/SheetProvider.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import React, { - Dispatch, - FC, - ReactNode, - SetStateAction, - createContext, - useContext, - useState, -} from 'react' - -import { EditorPerformerAddProps } from '../EditorPerformerAdd' - -type SubmitFuncParent = EditorPerformerAddProps - -export interface OperatorInSheet {} - -export interface SheetProviderProp { - submitOperator: SubmitFuncParent['submitOperator'] - submitGroup: SubmitFuncParent['submitGroup'] - children: ReactNode -} - -interface SheetContextValue { - useOperatorInSheet: [any, Dispatch>] - useGroupInSheet: [any, Dispatch>] -} - -const SheetContext = createContext>({}) - -export const SheetProvider: FC = ({ - children, - submitOperator, - submitGroup, -}) => { - const useOperatorInSheet = useState([]) - const useGroupInSheet = useState([]) - - return ( - - {children} - - ) -} diff --git a/src/components/editor/operator/sheet/SheetGroup.tsx b/src/components/editor/operator/sheet/SheetGroup.tsx index 22a4d10..36f0dfc 100644 --- a/src/components/editor/operator/sheet/SheetGroup.tsx +++ b/src/components/editor/operator/sheet/SheetGroup.tsx @@ -11,24 +11,18 @@ import { import { useAtom } from 'jotai' import { isEqual, isEqualWith, omit } from 'lodash-es' import { FC, useMemo, useState } from 'react' -import { UseFieldArrayRemove } from 'react-hook-form' import { AppToaster } from 'components/Toaster' import { OPERATORS, PROFESSIONS } from 'models/operator' import { favGroupAtom, ignoreKeyDic } from 'store/useFavGroups' -import { EditorPerformerGroupProps } from '../EditorPerformerGroup' import { Group, Operator } from '../EditorSheet' import { SheetContainerSkeleton } from './SheetContainerSkeleton' import { GroupNoData } from './SheetNoneData' +import { useSheet } from './SheetProvider' import { GroupItem } from './sheetGroup/SheetGroupItem' -export interface SheetGroupProps { - submitGroup: EditorPerformerGroupProps['submit'] - existedGroups: Group[] - existedOperators: Operator[] - removeGroup: UseFieldArrayRemove -} +export interface SheetGroupProps {} export interface GroupListModifyProp { groupAddHandle?: (value: Group) => void @@ -79,12 +73,10 @@ const EditorGroupName = ({ ) } -const SheetGroup = ({ - submitGroup, - existedGroups, - existedOperators, - removeGroup, -}: SheetGroupProps) => { +const SheetGroup: FC = () => { + const { submitGroup, existedGroups, existedOperators, removeGroup } = + useSheet() + const [coverGroup, setCoverGroup] = useState() const defaultGroup = useMemo(() => { @@ -283,8 +275,8 @@ const SheetGroup = ({ ) } -export const SheetGroupContainer: FC = (sheetGroupProps) => ( +export const SheetGroupContainer: FC = () => ( - + ) diff --git a/src/components/editor/operator/sheet/SheetOperator.tsx b/src/components/editor/operator/sheet/SheetOperator.tsx index 8f3bf93..8ee77e8 100644 --- a/src/components/editor/operator/sheet/SheetOperator.tsx +++ b/src/components/editor/operator/sheet/SheetOperator.tsx @@ -5,8 +5,7 @@ import { POPOVER2_DISMISS } from '@blueprintjs/popover2/lib/esm/classes' import clsx from 'clsx' import { useAtom } from 'jotai' import { isEqual, omit } from 'lodash' -import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { UseFieldArrayRemove } from 'react-hook-form' +import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { AppToaster } from 'components/Toaster' import { CopilotDocV1 } from 'models/copilot.schema' @@ -14,18 +13,13 @@ import { OPERATORS, PROFESSIONS } from 'models/operator' import { ignoreKeyDic } from 'store/useFavGroups' import { favOperatorAtom } from 'store/useFavOperators' -import { EditorPerformerOperatorProps } from '../EditorPerformerOperator' import { Group, Operator } from '../EditorSheet' import { SheetContainerSkeleton } from './SheetContainerSkeleton' import { OperatorNoData } from './SheetNoneData' import { OperatorItem } from './SheetOperatorItem' +import { useSheet } from './SheetProvider' -export interface SheetOperatorProps { - submitOperator: EditorPerformerOperatorProps['submit'] - existedOperators: Operator[] - existedGroups: Group[] - removeOperator: UseFieldArrayRemove -} +export interface SheetOperatorProps {} export interface OperatorModifyProps { operatorPinHandle?: (value: Operator) => void @@ -67,12 +61,9 @@ const defaultRarityFilter = Array.from( new Array(Math.max(...OPERATORS.map(({ rarity }) => rarity)) + 1).keys(), ).slice(Math.min(...OPERATORS.map(({ rarity }) => rarity))) -const SheetOperator = ({ - submitOperator, - existedOperators, - removeOperator, - existedGroups, -}: SheetOperatorProps) => { +const SheetOperator: FC = () => { + const { submitOperator, existedOperators, removeOperator, existedGroups } = + useSheet() const operatorScrollRef = useRef(null) const [selectedProf, setSelectedProf] = useState(formattedProfessions[0]) @@ -232,7 +223,7 @@ const SheetOperator = ({ submitOperator(value, undefined, true) } - // pagination about + // pagination about via frontened const [pageIndex, setPageIndex] = useState(0) const lastIndex = (pageIndex + 1) * paginationSize const backToTop = lastIndex > paginationSize diff --git a/src/components/editor/operator/sheet/SheetOperatorItem.tsx b/src/components/editor/operator/sheet/SheetOperatorItem.tsx index 2569cd1..aea1a4d 100644 --- a/src/components/editor/operator/sheet/SheetOperatorItem.tsx +++ b/src/components/editor/operator/sheet/SheetOperatorItem.tsx @@ -2,6 +2,7 @@ import { Button, Card, CardProps, Icon } from '@blueprintjs/core' import { Popover2 } from '@blueprintjs/popover2' import clsx from 'clsx' +import { FC } from 'react' import { OperatorAvatar } from '../EditorOperator' import { Operator } from '../EditorSheet' @@ -85,3 +86,12 @@ export const OperatorItem = ({ )} ) + +export interface OperatorItemProp { + name: string + selected: boolean +} + +export const OperatorItemV2: FC = ({ name, selected }) => { + return <>111 +} diff --git a/src/components/editor/operator/sheet/SheetProvider.tsx b/src/components/editor/operator/sheet/SheetProvider.tsx new file mode 100644 index 0000000..96db123 --- /dev/null +++ b/src/components/editor/operator/sheet/SheetProvider.tsx @@ -0,0 +1,33 @@ +import { FC, ReactNode, createContext, useContext, useState } from 'react' +import { UseFieldArrayRemove } from 'react-hook-form' + +import { EditorPerformerGroupProps } from '../EditorPerformerGroup' +import { EditorPerformerOperatorProps } from '../EditorPerformerOperator' +import { Group, Operator } from '../EditorSheet' + +export interface OperatorInSheet {} + +export interface SheetProviderProp { + submitOperator: EditorPerformerOperatorProps['submit'] + existedOperators: Operator[] + existedGroups: Group[] + removeOperator: UseFieldArrayRemove + submitGroup: EditorPerformerGroupProps['submit'] + removeGroup: UseFieldArrayRemove + children: ReactNode +} + +export type SheetContextValue = Omit + +const SheetContext = createContext({} as SheetContextValue) + +export const SheetProvider: FC = ({ + children, + ...providerValue +}) => ( + + {children} + +) + +export const useSheet = () => useContext(SheetContext) From 4b97b993bf757bcb90073a59d87e038f3d647012 Mon Sep 17 00:00:00 2001 From: GeorgeZhang2035 Date: Thu, 11 Jul 2024 17:35:01 +0800 Subject: [PATCH 05/50] temp storage --- .../editor/operator/sheet/SheetOperator.tsx | 155 +++++++++++++++++- .../operator/sheet/SheetOperatorItem.tsx | 131 ++++++++------- .../sheet/SheetOperatorSkillAbout.tsx | 56 +++---- src/store/useFavGroups.ts | 2 +- 4 files changed, 248 insertions(+), 96 deletions(-) diff --git a/src/components/editor/operator/sheet/SheetOperator.tsx b/src/components/editor/operator/sheet/SheetOperator.tsx index 8ee77e8..51d45c9 100644 --- a/src/components/editor/operator/sheet/SheetOperator.tsx +++ b/src/components/editor/operator/sheet/SheetOperator.tsx @@ -1,4 +1,14 @@ -import { Alert, Button, Divider, H4, H5, H6, Intent } from '@blueprintjs/core' +import { + Alert, + Button, + Card, + Divider, + H4, + H5, + H6, + Icon, + Intent, +} from '@blueprintjs/core' import { Popover2 } from '@blueprintjs/popover2' import { POPOVER2_DISMISS } from '@blueprintjs/popover2/lib/esm/classes' @@ -13,10 +23,12 @@ import { OPERATORS, PROFESSIONS } from 'models/operator' import { ignoreKeyDic } from 'store/useFavGroups' import { favOperatorAtom } from 'store/useFavOperators' +import { OperatorAvatar } from '../EditorOperator' import { Group, Operator } from '../EditorSheet' import { SheetContainerSkeleton } from './SheetContainerSkeleton' import { OperatorNoData } from './SheetNoneData' import { OperatorItem } from './SheetOperatorItem' +import { SkillAboutProps, SkillAboutTrigger } from './SheetOperatorSkillAbout' import { useSheet } from './SheetProvider' export interface SheetOperatorProps {} @@ -24,7 +36,7 @@ export interface SheetOperatorProps {} export interface OperatorModifyProps { operatorPinHandle?: (value: Operator) => void operatorSelectHandle?: (value: string) => void - operatorSkillHandle?: (value: Operator) => void + // operatorSkillHandle?: (value: Operator) => void } const defaultProf = [ @@ -217,9 +229,7 @@ const SheetOperator: FC = () => { ) } - const operatorSkillHandle: OperatorModifyProps['operatorSkillHandle'] = ( - value, - ) => { + const operatorSkillHandle = (value) => { submitOperator(value, undefined, true) } @@ -394,7 +404,7 @@ const SheetOperator: FC = () => { className="flex items-center flex-0 w-32 h-32" key={index} > - = () => { ? operatorPinHandle : undefined } - /> + /> */} + {/* */}
) })} @@ -523,3 +534,133 @@ export const SheetOperatorContainer = ( ) + +interface SheetOperatorItemProp { + name: string +} + +const SheetOperatorItem: FC = ({ name }) => { + const { existedOperators, existedGroups, submitOperator, removeOperator } = + useSheet() + const operatorNoneGroupedIndex = existedOperators.findIndex( + ({ name: existedName }) => existedName === name, + ) + const operatorInGroup = existedGroups + .map(({ opers }) => opers) + .flat() + .filter((item) => !!item) + .find(({ name: existedName }) => existedName === name) + const selected = operatorNoneGroupedIndex !== -1 + const grouped = !!operatorInGroup + const operator = existedOperators?.[operatorNoneGroupedIndex] || + operatorInGroup || { name } + const selectedInView = selected || grouped + + const [favOperators, setFavOperators] = useAtom(favOperatorAtom) + const pinned = isEqual( + omit(operator, [...ignoreKeyDic]), + omit( + favOperators.find(({ name: exsitedName }) => exsitedName === name), + [...ignoreKeyDic], + ), + ) + + const onOperatorSelect = () => { + if (grouped) + AppToaster.show({ + message: `干员 ${name} 已被编组`, + intent: Intent.DANGER, + }) + else { + if (selected) { + removeOperator(operatorNoneGroupedIndex) + } else submitOperator(operator, undefined, true) + } + } + + const onPinHandle = () => { + existedOperators.find(({ name }) => name === operatorInfoName) + ? operatorPinHandle + : undefined + } + + const operatorPinHandle: OperatorModifyProps['operatorPinHandle'] = ( + value, + ) => { + if (pinned) + setFavOperators( + [...favOperators].filter( + ({ name: existedName }) => existedName !== name, + ), + ) + else { + if (favOperatorFindByName(value.name)) setCoverOperator(value) + else updateFavOperator(value) + } + } + + return ( + + <> + <> + +

+ {name} +

+ + {/* {(selected || grouped) && ( +
e.stopPropagation()} + role="presentation" + > + onPinHandle?.(operator as Operator)} + > + + 移出收藏 + + } + disabled={!pinned} + > + onPinHandle?.(operator as Operator) + } + /> + +
+ )} */} + + {selected && ( + submitOperator(value, undefined, true), + disabled: grouped, + }} + /> + )} + {grouped && ( + + + 已被编组 + + )} +
+ ) +} diff --git a/src/components/editor/operator/sheet/SheetOperatorItem.tsx b/src/components/editor/operator/sheet/SheetOperatorItem.tsx index aea1a4d..927e782 100644 --- a/src/components/editor/operator/sheet/SheetOperatorItem.tsx +++ b/src/components/editor/operator/sheet/SheetOperatorItem.tsx @@ -8,6 +8,7 @@ import { OperatorAvatar } from '../EditorOperator' import { Operator } from '../EditorSheet' import { OperatorModifyProps } from './SheetOperator' import { SkillAboutProps, SkillAboutTrigger } from './SheetOperatorSkillAbout' +import { useSheet } from './SheetProvider' export interface OperatorItemPorps extends CardProps, SkillAboutProps { name: string @@ -30,68 +31,80 @@ export const OperatorItem = ({ onPinHandle, pinned, ...cardProps -}: OperatorItemPorps) => ( - - <> +}: OperatorItemPorps) => { + + return ( + <> - -

- {name} -

- - {!horizontal && selected && !!onPinHandle && ( -
e.stopPropagation()} - role="presentation" - > - onPinHandle?.(operator as Operator)} - > - - 移出收藏 - - } - disabled={!pinned} + <> + +

- onPinHandle?.(operator as Operator) + {name} +

+ + {!horizontal && selected && !!onPinHandle && ( +
e.stopPropagation()} + role="presentation" + > + onPinHandle?.(operator as Operator)} + > + + 移出收藏 + } - /> - -
+ disabled={!pinned} + > + onPinHandle?.(operator as Operator) + } + /> +
+
+ )} + + {!readOnly && selected && ( + )} - - {!readOnly && selected && ( - - )} -
-) - -export interface OperatorItemProp { - name: string - selected: boolean +
+ ) } -export const OperatorItemV2: FC = ({ name, selected }) => { - return <>111 -} +// export interface OperatorItemV2Prop { +// name: string +// selected: boolean +// grouped: boolean +// simpleMode: boolean +// } + +// export const OperatorItemV2: FC = ({ +// name, +// selected, +// grouped, +// }) => { +// const horizontal = selected && grouped +// const { existedOperators, existedGroups } = useSheet() + +// return <>111 +// } diff --git a/src/components/editor/operator/sheet/SheetOperatorSkillAbout.tsx b/src/components/editor/operator/sheet/SheetOperatorSkillAbout.tsx index 357f479..5c4fcda 100644 --- a/src/components/editor/operator/sheet/SheetOperatorSkillAbout.tsx +++ b/src/components/editor/operator/sheet/SheetOperatorSkillAbout.tsx @@ -13,13 +13,12 @@ import { EditorOperatorSkill } from '../EditorOperatorSkill' import { EditorOperatorSkillTimes } from '../EditorOperatorSkillTimes' import { EditorOperatorSkillUsage } from '../EditorOperatorSkillUsage' import { Operator } from '../EditorSheet' -import { OperatorModifyProps } from './SheetOperator' const needSkillTimeType = CopilotDocV1.SkillUsageType.ReadyToUseTimes export interface SkillAboutProps { operator?: Operator - onSkillChange?: OperatorModifyProps['operatorSkillHandle'] + onSkillChange?: (value: Operator) => void } const skillDic = operatorSkillUsages as DetailedSelectChoice[] @@ -85,7 +84,7 @@ export const SkillAboutTrigger = ({
{ShowMoreButton} @@ -542,6 +470,8 @@ interface SheetOperatorItemProp { const SheetOperatorItem: FC = ({ name }) => { const { existedOperators, existedGroups, submitOperator, removeOperator } = useSheet() + const [favOperators, setFavOperators] = useAtom(favOperatorAtom) + const operatorNoneGroupedIndex = existedOperators.findIndex( ({ name: existedName }) => existedName === name, ) @@ -553,10 +483,16 @@ const SheetOperatorItem: FC = ({ name }) => { const selected = operatorNoneGroupedIndex !== -1 const grouped = !!operatorInGroup const operator = existedOperators?.[operatorNoneGroupedIndex] || - operatorInGroup || { name } + operatorInGroup || + favOperators.find(({ name: exsitedName }) => exsitedName === name) || { + name, + } const selectedInView = selected || grouped - const [favOperators, setFavOperators] = useAtom(favOperatorAtom) + console.log( + operator, + favOperators.find(({ name: exsitedName }) => exsitedName === name), + ) const pinned = isEqual( omit(operator, [...ignoreKeyDic]), omit( @@ -578,15 +514,25 @@ const SheetOperatorItem: FC = ({ name }) => { } } - const onPinHandle = () => { - existedOperators.find(({ name }) => name === operatorInfoName) - ? operatorPinHandle - : undefined + const updateFavOperator = () => { + const { skill, skillUsage, skillTimes, ...rest } = operator + const formattedValue = { + ...rest, + skill: skill || 1, + skillUsage: skillUsage || 0, + skillTimes: + skillUsage === CopilotDocV1.SkillUsageType.ReadyToUseTimes + ? skillTimes || 1 + : undefined, + } + setFavOperators([ + ...[...favOperators].filter(({ name }) => name !== formattedValue.name), + { ...formattedValue }, + ]) + submitOperator(formattedValue, undefined, true) } - const operatorPinHandle: OperatorModifyProps['operatorPinHandle'] = ( - value, - ) => { + const onPinnedChange = () => { if (pinned) setFavOperators( [...favOperators].filter( @@ -594,8 +540,9 @@ const SheetOperatorItem: FC = ({ name }) => { ), ) else { - if (favOperatorFindByName(value.name)) setCoverOperator(value) - else updateFavOperator(value) + if (favOperators.find(({ name: existedName }) => existedName === name)) { + console.log('有重复') + } else updateFavOperator() } } @@ -617,7 +564,7 @@ const SheetOperatorItem: FC = ({ name }) => { {name}

- {/* {(selected || grouped) && ( + {selected && (
e.stopPropagation()} @@ -625,10 +572,7 @@ const SheetOperatorItem: FC = ({ name }) => { > onPinHandle?.(operator as Operator)} - > + @@ -638,13 +582,11 @@ const SheetOperatorItem: FC = ({ name }) => { onPinHandle?.(operator as Operator) - } + onClick={pinned ? undefined : onPinnedChange} />
- )} */} + )} {selected && ( { - return ( Date: Fri, 12 Jul 2024 17:59:25 +0800 Subject: [PATCH 07/50] feat: operator item completed --- .../editor/operator/sheet/SheetOperator.tsx | 202 +----------------- .../sheet/sheetOperator/OperatorFilter.tsx | 0 .../sheet/sheetOperator/SheetOperatorItem.tsx | 167 +++++++++++++++ 3 files changed, 172 insertions(+), 197 deletions(-) create mode 100644 src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx create mode 100644 src/components/editor/operator/sheet/sheetOperator/SheetOperatorItem.tsx diff --git a/src/components/editor/operator/sheet/SheetOperator.tsx b/src/components/editor/operator/sheet/SheetOperator.tsx index 5bbc0ee..d7e973b 100644 --- a/src/components/editor/operator/sheet/SheetOperator.tsx +++ b/src/components/editor/operator/sheet/SheetOperator.tsx @@ -1,34 +1,19 @@ -import { - Alert, - Button, - Card, - Divider, - H4, - H5, - H6, - Icon, - Intent, -} from '@blueprintjs/core' +import { Button, Divider, H4, H5, H6 } from '@blueprintjs/core' import { Popover2 } from '@blueprintjs/popover2' import { POPOVER2_DISMISS } from '@blueprintjs/popover2/lib/esm/classes' import clsx from 'clsx' -import { useAtom } from 'jotai' -import { isEqual, omit } from 'lodash' +import { useAtomValue } from 'jotai' import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { AppToaster } from 'components/Toaster' -import { CopilotDocV1 } from 'models/copilot.schema' import { OPERATORS, PROFESSIONS } from 'models/operator' -import { ignoreKeyDic } from 'store/useFavGroups' import { favOperatorAtom } from 'store/useFavOperators' -import { OperatorAvatar } from '../EditorOperator' -import { Group, Operator } from '../EditorSheet' +import { Operator } from '../EditorSheet' import { SheetContainerSkeleton } from './SheetContainerSkeleton' import { OperatorNoData } from './SheetNoneData' -import { SkillAboutTrigger } from './SheetOperatorSkillAbout' import { useSheet } from './SheetProvider' +import { SheetOperatorItem } from './sheetOperator/SheetOperatorItem' export interface SheetOperatorProps {} @@ -81,8 +66,7 @@ const SheetOperator: FC = () => { const [selectedSubProf, setSelectedSubProf] = useState(defaultSubProf[0]) const [operatorRarity, setOperatorRarity] = useState(defaultRarityFilter) const [rarityReverse, setRarityReverse] = useState(false) - const [favOperators, setFavOperators] = useAtom(favOperatorAtom) - const [coverOperator, setCoverOperator] = useState() + const favOperators = useAtomValue(favOperatorAtom) const favOperatorFindByName = (target: string) => { return !!favOperators.find(({ name }) => name === target) @@ -127,24 +111,6 @@ const SheetOperator: FC = () => { [existedOperators, existedGroups], ) - const updateFavOperator = (value: Operator) => { - const { skill, skillUsage, skillTimes, ...rest } = value - const formattedValue = { - ...rest, - skill: skill || 1, - skillUsage: skillUsage || 0, - skillTimes: - skillUsage === CopilotDocV1.SkillUsageType.ReadyToUseTimes - ? skillTimes || 1 - : undefined, - } - setFavOperators([ - ...[...favOperators].filter(({ name }) => name !== formattedValue.name), - { ...formattedValue }, - ]) - submitOperator(formattedValue, undefined, true) - } - const getOperatorRarity = (target: string) => operatorsGroupedByProf.find((item) => item.name === target)!.rarity @@ -362,20 +328,6 @@ const SheetOperator: FC = () => { {ProfSelect} - updateFavOperator(coverOperator as Group)} - onClose={() => setCoverOperator(undefined)} - > -
-
收藏:
-

检测到同名的已收藏干员 {coverOperator?.name},是否覆盖?

-
-
) } @@ -462,147 +414,3 @@ export const SheetOperatorContainer = ( ) - -interface SheetOperatorItemProp { - name: string -} - -const SheetOperatorItem: FC = ({ name }) => { - const { existedOperators, existedGroups, submitOperator, removeOperator } = - useSheet() - const [favOperators, setFavOperators] = useAtom(favOperatorAtom) - - const operatorNoneGroupedIndex = existedOperators.findIndex( - ({ name: existedName }) => existedName === name, - ) - const operatorInGroup = existedGroups - .map(({ opers }) => opers) - .flat() - .filter((item) => !!item) - .find(({ name: existedName }) => existedName === name) - const selected = operatorNoneGroupedIndex !== -1 - const grouped = !!operatorInGroup - const operator = existedOperators?.[operatorNoneGroupedIndex] || - operatorInGroup || - favOperators.find(({ name: exsitedName }) => exsitedName === name) || { - name, - } - const selectedInView = selected || grouped - - console.log( - operator, - favOperators.find(({ name: exsitedName }) => exsitedName === name), - ) - const pinned = isEqual( - omit(operator, [...ignoreKeyDic]), - omit( - favOperators.find(({ name: exsitedName }) => exsitedName === name), - [...ignoreKeyDic], - ), - ) - - const onOperatorSelect = () => { - if (grouped) - AppToaster.show({ - message: `干员 ${name} 已被编组`, - intent: Intent.DANGER, - }) - else { - if (selected) { - removeOperator(operatorNoneGroupedIndex) - } else submitOperator(operator, undefined, true) - } - } - - const updateFavOperator = () => { - const { skill, skillUsage, skillTimes, ...rest } = operator - const formattedValue = { - ...rest, - skill: skill || 1, - skillUsage: skillUsage || 0, - skillTimes: - skillUsage === CopilotDocV1.SkillUsageType.ReadyToUseTimes - ? skillTimes || 1 - : undefined, - } - setFavOperators([ - ...[...favOperators].filter(({ name }) => name !== formattedValue.name), - { ...formattedValue }, - ]) - submitOperator(formattedValue, undefined, true) - } - - const onPinnedChange = () => { - if (pinned) - setFavOperators( - [...favOperators].filter( - ({ name: existedName }) => existedName !== name, - ), - ) - else { - if (favOperators.find(({ name: existedName }) => existedName === name)) { - console.log('有重复') - } else updateFavOperator() - } - } - - return ( - - <> - <> - -

- {name} -

- - {selected && ( -
e.stopPropagation()} - role="presentation" - > - - - 移出收藏 - - } - disabled={!pinned} - > - - -
- )} - - {selected && ( - submitOperator(value, undefined, true), - disabled: grouped, - }} - /> - )} - {grouped && ( - - - 已被编组 - - )} -
- ) -} diff --git a/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx b/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/components/editor/operator/sheet/sheetOperator/SheetOperatorItem.tsx b/src/components/editor/operator/sheet/sheetOperator/SheetOperatorItem.tsx new file mode 100644 index 0000000..13d13f2 --- /dev/null +++ b/src/components/editor/operator/sheet/sheetOperator/SheetOperatorItem.tsx @@ -0,0 +1,167 @@ +import { Button, Card, Icon, Intent } from '@blueprintjs/core' +import { Popover2 } from '@blueprintjs/popover2' + +import clsx from 'clsx' +import { useAtom } from 'jotai' +import { isEqual, omit } from 'lodash-es' +import { FC } from 'react' + +import { AppToaster } from 'components/Toaster' +import { CopilotDocV1 } from 'models/copilot.schema' +import { ignoreKeyDic } from 'store/useFavGroups' +import { favOperatorAtom } from 'store/useFavOperators' + +import { OperatorAvatar } from '../../EditorOperator' +import { SkillAboutTrigger } from '../SheetOperatorSkillAbout' +import { useSheet } from '../SheetProvider' + +export interface SheetOperatorItemProp { + name: string +} + +export const SheetOperatorItem: FC = ({ name }) => { + const { existedOperators, existedGroups, submitOperator, removeOperator } = + useSheet() + const [favOperators, setFavOperators] = useAtom(favOperatorAtom) + + const operatorNoneGroupedIndex = existedOperators.findIndex( + ({ name: existedName }) => existedName === name, + ) + const operatorInGroup = existedGroups + .map(({ opers }) => opers) + .flat() + .filter((item) => !!item) + .find(({ name: existedName }) => existedName === name) + const selected = operatorNoneGroupedIndex !== -1 + const grouped = !!operatorInGroup + const operator = existedOperators?.[operatorNoneGroupedIndex] || + operatorInGroup || + favOperators.find(({ name: exsitedName }) => exsitedName === name) || { + name, + } + const selectedInView = selected || grouped + + const pinned = isEqual( + omit(operator, [...ignoreKeyDic]), + omit( + favOperators.find(({ name: exsitedName }) => exsitedName === name), + [...ignoreKeyDic], + ), + ) + + const onOperatorSelect = () => { + if (grouped) + AppToaster.show({ + message: `干员 ${name} 已被编组`, + intent: Intent.DANGER, + }) + else { + if (selected) { + removeOperator(operatorNoneGroupedIndex) + } else submitOperator(operator, undefined, true) + } + } + + const updateFavOperator = () => { + const { skill, skillUsage, skillTimes, ...rest } = operator + const formattedValue = { + ...rest, + skill: skill || 1, + skillUsage: skillUsage || 0, + skillTimes: + skillUsage === CopilotDocV1.SkillUsageType.ReadyToUseTimes + ? skillTimes || 1 + : undefined, + } + setFavOperators([ + ...[...favOperators].filter(({ name }) => name !== formattedValue.name), + { ...formattedValue }, + ]) + submitOperator(formattedValue, undefined, true) + } + + const onPinnedChange = () => { + if (pinned) + setFavOperators( + [...favOperators].filter( + ({ name: existedName }) => existedName !== name, + ), + ) + else updateFavOperator() + } + + return ( + + <> + <> + +

+ {name} +

+ + {selected && ( +
e.stopPropagation()} + role="presentation" + > + {(() => { + const isFavDuplicate = favOperators.find( + ({ name: existedName }) => existedName === name, + ) + return ( + + + + {pinned ? '移出收藏' : '此操作会覆盖已有干员'} + + + } + disabled={!pinned && !isFavDuplicate} + > + + + ) + })()} +
+ )} + + {selected && ( + submitOperator(value, undefined, true), + disabled: grouped, + }} + /> + )} + {grouped && ( + + + 已被编组 + + )} +
+ ) +} From 0f88b3920e933b9afc12d7959143bd9b3e167e83 Mon Sep 17 00:00:00 2001 From: gemini2035 <2530056984@qq.com> Date: Mon, 15 Jul 2024 08:20:38 +0800 Subject: [PATCH 08/50] temp storage --- .../sheet/sheetOperator/OperatorFilter.tsx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx b/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx index e69de29..cc4c9c5 100644 --- a/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx @@ -0,0 +1,19 @@ +import { OPERATORS } from 'models/operator' + +import { useSheet } from '../SheetProvider' + +interface RarityFilter { + selectedRarity: number[] + reverse: boolean +} + +interface PaginationFilter { + size: number + current: number + total: number +} + +export const useOperatorAfterFiltered = () => { + const { existedOperators } = useSheet() + return OPERATORS +} From 8ca11b7b2bfff4971ea11125751cba05880a2a89 Mon Sep 17 00:00:00 2001 From: GeorgeZhang2035 Date: Mon, 15 Jul 2024 17:44:14 +0800 Subject: [PATCH 09/50] temp storage --- .../editor/operator/sheet/SheetOperator.tsx | 611 +++++++++--------- .../editor/operator/sheet/SheetProvider.tsx | 2 +- .../sheet/sheetOperator/OperatorFilter.tsx | 41 +- .../sheetOperator/ProfClassification.tsx | 175 +++++ 4 files changed, 518 insertions(+), 311 deletions(-) create mode 100644 src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx diff --git a/src/components/editor/operator/sheet/SheetOperator.tsx b/src/components/editor/operator/sheet/SheetOperator.tsx index d7e973b..34ea48d 100644 --- a/src/components/editor/operator/sheet/SheetOperator.tsx +++ b/src/components/editor/operator/sheet/SheetOperator.tsx @@ -13,6 +13,7 @@ import { Operator } from '../EditorSheet' import { SheetContainerSkeleton } from './SheetContainerSkeleton' import { OperatorNoData } from './SheetNoneData' import { useSheet } from './SheetProvider' +import { ProfClassification } from './sheetOperator/ProfClassification' import { SheetOperatorItem } from './sheetOperator/SheetOperatorItem' export interface SheetOperatorProps {} @@ -23,81 +24,77 @@ export interface OperatorModifyProps { // operatorSkillHandle?: (value: Operator) => void } -const defaultProf = [ - { - id: 'all', - name: '全部', - sub: [], - }, - { - id: 'fav', - name: '收藏', - sub: [], - }, - { - id: 'others', - name: '其它', - sub: [], - }, -] +// const defaultProf = [ +// { +// id: 'all', +// name: '全部', +// sub: [], +// }, +// { +// id: 'fav', +// name: '收藏', +// sub: [], +// }, +// { +// id: 'others', +// name: '其它', +// sub: [], +// }, +// ] -const defaultSubProf = [ - { id: 'all', name: '全部' }, - { id: 'selected', name: '已选择' }, -] +// const defaultSubProf = [ +// { id: 'allSubProf', name: '全部' }, +// { id: 'selected', name: '已选择' }, +// ] -const formattedProfessions = [ - ...defaultProf.slice(0, defaultProf.length - 1), - ...PROFESSIONS, - ...defaultProf.slice(defaultProf.length - 1), -] +// const formattedProfessions = [ +// ...defaultProf.slice(0, defaultProf.length - 1), +// ...PROFESSIONS, +// ...defaultProf.slice(defaultProf.length - 1), +// ] const paginationSize = 60 -const defaultRarityFilter = Array.from( - new Array(Math.max(...OPERATORS.map(({ rarity }) => rarity)) + 1).keys(), -).slice(Math.min(...OPERATORS.map(({ rarity }) => rarity))) +// const defaultRarityFilter = Array.from( +// new Array(Math.max(...OPERATORS.map(({ rarity }) => rarity)) + 1).keys(), +// ).slice(Math.min(...OPERATORS.map(({ rarity }) => rarity))) const SheetOperator: FC = () => { const { submitOperator, existedOperators, removeOperator, existedGroups } = useSheet() const operatorScrollRef = useRef(null) - const [selectedProf, setSelectedProf] = useState(formattedProfessions[0]) - const [selectedSubProf, setSelectedSubProf] = useState(defaultSubProf[0]) - const [operatorRarity, setOperatorRarity] = useState(defaultRarityFilter) + // const [selectedProf, setSelectedProf] = useState(formattedProfessions[0]) + // const [selectedSubProf, setSelectedSubProf] = useState(defaultSubProf[0]) + // const [operatorRarity, setOperatorRarity] = useState(defaultRarityFilter) const [rarityReverse, setRarityReverse] = useState(false) - const favOperators = useAtomValue(favOperatorAtom) + // const favOperators = useAtomValue(favOperatorAtom) - const favOperatorFindByName = (target: string) => { - return !!favOperators.find(({ name }) => name === target) - } - - const [formattedSubProfessions, operatorsGroupedByProf] = useMemo( - () => [ - // handle customize operators - [...defaultSubProf, ...(selectedProf.sub || [])], - [ - ...existedOperators - .filter((item) => !OPERATORS.find(({ name }) => name === item.name)) - .map(({ name }) => { - return { - name, - subProf: '', - rarity: 0, - } - }), - ...OPERATORS, - ].filter((item) => { - if (selectedProf.id === defaultProf[0].id) return true - if (selectedProf.id === defaultProf[1].id) - return favOperatorFindByName(item.name) - else if (selectedProf.id === defaultProf[2].id) { - return item.subProf === 'notchar1' || !item.subProf - } else return !!selectedProf.sub?.find((op) => op.id === item.subProf) - }), - ], - [selectedProf, existedOperators, favOperators], - ) + // const [formattedSubProfessions, operatorsGroupedByProf] = useMemo( + // () => [ + // // handle customize operators + // [...defaultSubProf, ...(selectedProf.sub || [])], + // [ + // ...existedOperators + // .filter((item) => !OPERATORS.find(({ name }) => name === item.name)) + // .map(({ name }) => { + // return { + // name, + // subProf: '', + // rarity: 0, + // } + // }), + // ...OPERATORS, + // ].filter((item) => { + // if (selectedProf.id === defaultProf[0].id) return true + // if (selectedProf.id === defaultProf[1].id) + // return !!favOperators.find(({ name }) => name === item.name) + // else if (selectedProf.id === defaultProf[2].id) { + // return item.subProf === 'notchar1' || !item.subProf + // } else return !!selectedProf.sub?.find((op) => op.id === item.subProf) + // }), + // ], + // [selectedProf.sub, selectedProf.id, existedOperators, favOperators], + // ) const checkOperatorSelected = useCallback( (target: string) => { @@ -111,43 +108,43 @@ const SheetOperator: FC = () => { [existedOperators, existedGroups], ) - const getOperatorRarity = (target: string) => - operatorsGroupedByProf.find((item) => item.name === target)!.rarity + // const getOperatorRarity = (target: string) => + // operatorsGroupedByProf.find((item) => item.name === target)!.rarity - const operatorsGroupedBySubProf = useMemo(() => { - let result: Operator[] = [] - if (selectedSubProf.id === 'all') result = operatorsGroupedByProf - else if (selectedSubProf.id === 'selected') - result = operatorsGroupedByProf.filter((item) => - checkOperatorSelected(item.name), - ) - else - result = operatorsGroupedByProf.filter( - (item) => item.subProf === selectedSubProf.id, - ) + // const operatorsGroupedBySubProf = useMemo(() => { + // let result: Operator[] = [] + // if (selectedSubProf.id === 'all') result = operatorsGroupedByProf + // else if (selectedSubProf.id === 'selected') + // result = operatorsGroupedByProf.filter((item) => + // checkOperatorSelected(item.name), + // ) + // else + // result = operatorsGroupedByProf.filter( + // (item) => item.subProf === selectedSubProf.id, + // ) - result = result - .filter(({ name }) => { - return ( - operatorRarity.findIndex( - (rarity) => getOperatorRarity(name) === rarity, - ) !== -1 - ) - }) - .sort( - ({ name: aName }, { name: bName }) => - getOperatorRarity(bName) - getOperatorRarity(aName), - ) + // result = result + // .filter(({ name }) => { + // return ( + // operatorRarity.findIndex( + // (rarity) => getOperatorRarity(name) === rarity, + // ) !== -1 + // ) + // }) + // .sort( + // ({ name: aName }, { name: bName }) => + // getOperatorRarity(bName) - getOperatorRarity(aName), + // ) - return rarityReverse ? result.reverse() : result - }, [ - selectedSubProf, - operatorsGroupedByProf, - checkOperatorSelected, - operatorRarity, - rarityReverse, - getOperatorRarity, - ]) + // return rarityReverse ? result.reverse() : result + // }, [ + // selectedSubProf, + // operatorsGroupedByProf, + // checkOperatorSelected, + // operatorRarity, + // rarityReverse, + // getOperatorRarity, + // ]) // pagination about via frontened const [pageIndex, setPageIndex] = useState(0) @@ -159,151 +156,152 @@ const SheetOperator: FC = () => { operatorScrollRef?.current?.scrollIntoView() } - useEffect(resetPaginationState, [selectedProf, selectedSubProf]) + // useEffect(resetPaginationState, [selectedProf, selectedSubProf]) - const selectAll = () => { - operatorsGroupedBySubProf.forEach((item) => { - submitOperator(item, () => {}) - }) - } + // const selectAll = () => { + // operatorsGroupedBySubProf.forEach((item) => { + // submitOperator(item, () => {}) + // }) + // } - const cancelAll = () => { - const deleteIndexList: number[] = [] - operatorsGroupedBySubProf.forEach(({ name }) => { - const index = existedOperators.findIndex((item) => item.name === name) - if (index !== -1) deleteIndexList.push(index) - }) - removeOperator(deleteIndexList) - } + // const cancelAll = () => { + // const deleteIndexList: number[] = [] + // operatorsGroupedBySubProf.forEach(({ name }) => { + // const index = existedOperators.findIndex((item) => item.name === name) + // if (index !== -1) deleteIndexList.push(index) + // }) + // removeOperator(deleteIndexList) + // } - const ActionList = ( -
- - } - > -
- ) + // const ActionList = ( + //
+ // + // } + // > + //
+ // ) - const ShowMoreButton = ( -
- {lastIndex >= operatorsGroupedBySubProf.length ? ( - <> -
已经展示全部干员了({operatorsGroupedBySubProf.length})
- {operatorsGroupedBySubProf.length > paginationSize && ( -
- 收起 -
- )} - - ) : ( -
setPageIndex(pageIndex + 1)} - > - 显示更多干员(剩余{operatorsGroupedBySubProf.length - lastIndex}) -
- )} -
- ) + // console.log(selectedProf, selectedSubProf) - const ProfSelect = ( -
-
- {formattedProfessions.map((prof) => ( -
{ - setSelectedProf(prof) - setSelectedSubProf(defaultSubProf[0]) - }} - role="presentation" - > - {defaultProf.find(({ id }) => id === prof.id) ? ( -
{prof.name}
- ) : ( - {prof.name} - )} - {prof.id === selectedProf.id && ( -
- )} -
- ))} -
- -
-
- {formattedSubProfessions?.map((subProf) => ( -

3 && '!text-base', - )} - onClick={() => setSelectedSubProf(subProf)} - > - {subProf.name} -

- ))} -
- {ActionList} -
-
- ) + // const ShowMoreButton = ( + //
+ // {lastIndex >= operatorsGroupedBySubProf.length ? ( + // <> + //
已经展示全部干员了({operatorsGroupedBySubProf.length})
+ // {operatorsGroupedBySubProf.length > paginationSize && ( + //
+ // 收起 + //
+ // )} + // + // ) : ( + //
setPageIndex(pageIndex + 1)} + // > + // 显示更多干员(剩余{operatorsGroupedBySubProf.length - lastIndex}) + //
+ // )} + //
+ // ) + + // const ProfSelect = ( + //
+ //
+ // {formattedProfessions.map((prof) => ( + //
{ + // setSelectedProf(prof) + // setSelectedSubProf(defaultSubProf[0]) + // }} + // role="presentation" + // > + // ( + //
{prof.name}
+ // )} + // title={prof.name} + // /> + // {prof.id === selectedProf.id && ( + //
+ // )} + //
+ // ))} + //
+ // + //
+ //
+ // {formattedSubProfessions?.map((subProf) => ( + //

3 && '!text-base', + // )} + // onClick={() => setSelectedSubProf(subProf)} + // > + // {subProf.name} + //

+ // ))} + //
+ // {ActionList} + //
+ //
+ // ) return ( <>
- {operatorsGroupedBySubProf.length ? ( + {/* {operatorsGroupedBySubProf.length ? ( <>
= () => { ) : ( OperatorNoData - )} + )} */}
- {ProfSelect} + {/* {ProfSelect} */} +
) } -const RaritySelector = ({ - operatorRarity, - setOperatorRarity, - rarityReverse, - setRarityReverse, -}: { - operatorRarity: number[] - setOperatorRarity: (target: number[]) => void - rarityReverse: boolean - setRarityReverse: (target: boolean) => void -}) => { - const selectClass = 'scale-90' - const [rarity, setRarity] = useState(operatorRarity) - const [reverse, setReverse] = useState(rarityReverse) +// const RaritySelector = ({ +// operatorRarity, +// setOperatorRarity, +// rarityReverse, +// setRarityReverse, +// }: { +// operatorRarity: number[] +// setOperatorRarity: (target: number[]) => void +// rarityReverse: boolean +// setRarityReverse: (target: boolean) => void +// }) => { +// const selectClass = 'scale-90' +// const [rarity, setRarity] = useState(operatorRarity) +// const [reverse, setReverse] = useState(rarityReverse) - const resetFilter = () => { - setRarity(defaultRarityFilter) - setReverse(false) - } - const submitFilter = () => { - setOperatorRarity(rarity) - setRarityReverse(reverse) - } +// const resetFilter = () => { +// setRarity(defaultRarityFilter) +// setReverse(false) +// } +// const submitFilter = () => { +// setOperatorRarity(rarity) +// setRarityReverse(reverse) +// } - return ( -
-
-
按干员稀有度展示
-
-
- {Array(7) - .fill(0) - .map((_, index) => { - const isSelect = rarity.findIndex((item) => item === index) !== -1 - return ( -
-
-
- -
- ) -} +// return ( +//
+//
+//
按干员稀有度展示
+//
+//
+// {Array(7) +// .fill(0) +// .map((_, index) => { +// const isSelect = rarity.findIndex((item) => item === index) !== -1 +// return ( +//
+//
+//
+// +//
+// ) +// } export const SheetOperatorContainer = ( sheetOperatorProp: SheetOperatorProps, diff --git a/src/components/editor/operator/sheet/SheetProvider.tsx b/src/components/editor/operator/sheet/SheetProvider.tsx index 96db123..b0b18ed 100644 --- a/src/components/editor/operator/sheet/SheetProvider.tsx +++ b/src/components/editor/operator/sheet/SheetProvider.tsx @@ -1,4 +1,4 @@ -import { FC, ReactNode, createContext, useContext, useState } from 'react' +import { FC, ReactNode, createContext, useContext } from 'react' import { UseFieldArrayRemove } from 'react-hook-form' import { EditorPerformerGroupProps } from '../EditorPerformerGroup' diff --git a/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx b/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx index cc4c9c5..6bfff17 100644 --- a/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx @@ -1,19 +1,52 @@ -import { OPERATORS } from 'models/operator' +import { OperatorInfo as ModelsOperator, OPERATORS } from 'models/operator' import { useSheet } from '../SheetProvider' -interface RarityFilter { +type OperatorInfo = ModelsOperator + +export enum DEFAULTPROFID { + ALL = 'allProf', + FAV = 'favProf', + OTHERS = 'othersProf', +} + +export enum DEFAULTSUBPROFID { + ALL = 'allSubProf', + SELECTED = 'selectedProf', +} + +export interface ProfFilter { + selectedProf: [DEFAULTPROFID, DEFAULTSUBPROFID] +} + +export interface RarityFilter { selectedRarity: number[] reverse: boolean } -interface PaginationFilter { +export interface PaginationFilter { size: number current: number total: number } -export const useOperatorAfterFiltered = () => { +export const useOperatorAfterFiltered = (profFilter: ProfFilter) => { const { existedOperators } = useSheet() + // Priority: prof > sub prof > rarity/rarityReverse + return OPERATORS } + +const profFilterHandle = ( + profFilter: ProfFilter = { + selectedProf: [DEFAULTPROFID.ALL, DEFAULTSUBPROFID.ALL], + }, + originData: OperatorInfo[] = OPERATORS, +) => { + if (!profFilter) return originData + const { + selectedProf: [_, subProf], + } = profFilter + + return originData +} diff --git a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx new file mode 100644 index 0000000..14ca054 --- /dev/null +++ b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx @@ -0,0 +1,175 @@ +import { Button, Divider, H4, H5 } from '@blueprintjs/core' +import { Popover2 } from '@blueprintjs/popover2' + +import clsx from 'clsx' +import { FC, ImgHTMLAttributes, useMemo, useState } from 'react' + +import { PROFESSIONS } from 'models/operator' + +import { DEFAULTPROFID, DEFAULTSUBPROFID } from './OperatorFilter' + +const formattedProfessions = [ + { + id: DEFAULTPROFID.ALL, + name: '全部', + sub: [], + }, + { + id: DEFAULTPROFID.FAV, + name: '收藏', + sub: [], + }, + ...PROFESSIONS, + { + id: DEFAULTPROFID.OTHERS, + name: '其它', + sub: [], + }, +] + +export interface ProfClassificationProp {} + +export const ProfClassification: FC = () => { + const [activeProf, setActiveProf] = useState([ + DEFAULTPROFID.ALL, + 'allSubProf', + ]) + + const subProfs = useMemo(() => { + return [ + { id: DEFAULTSUBPROFID.ALL, name: '全部' }, + { id: DEFAULTSUBPROFID.SELECTED, name: '已选择' }, + ...(formattedProfessions.find(({ id }) => id === activeProf[0])?.sub || + []), + ] + }, [activeProf]) + + // const ActionList = ( + //
+ // + // } + // > + //
+ // ) + + return ( +
+
    + {formattedProfessions.map(({ id, name }) => ( + { + console.log('111', id) + setActiveProf([id, DEFAULTSUBPROFID.ALL]) + }} + /> + ))} +
+ +
+
    + {subProfs.map(({ id, name }) => ( +
  • +

    3 && '!text-base', + )} + onClick={() => + setActiveProf((prev) => [...prev.slice(0, 1), id]) + } + > + {name} +

    +
  • + ))} +
+ {/* {ActionList} */} +
+
+ ) +} + +interface ProfIconProp extends ImgHTMLAttributes { + name: string + profId: string + selected: boolean + onProfClick: () => void +} + +const ProfIcon: FC = ({ + name, + profId, + selected, + onProfClick, + ...restImgProps +}) => { + const [imgError, setImgError] = useState(false) + + return ( +
  • + {imgError ? ( +
    {name}
    + ) : ( + setImgError(true)} + title={name} + /> + )} + {selected && ( +
    + )} +
  • + ) +} From 3638045b5aaa77ac37157ff7f90b221598b7436d Mon Sep 17 00:00:00 2001 From: gemini2035 <2530056984@qq.com> Date: Tue, 16 Jul 2024 08:47:51 +0800 Subject: [PATCH 10/50] temp storage --- .../operator/sheet/sheetOperator/OperatorFilter.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx b/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx index 6bfff17..3b34d5b 100644 --- a/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx @@ -1,4 +1,7 @@ +import { useAtomValue } from 'jotai' + import { OperatorInfo as ModelsOperator, OPERATORS } from 'models/operator' +import { favOperatorAtom } from 'store/useFavOperators' import { useSheet } from '../SheetProvider' @@ -32,6 +35,7 @@ export interface PaginationFilter { export const useOperatorAfterFiltered = (profFilter: ProfFilter) => { const { existedOperators } = useSheet() + const favOperators = useAtomValue(favOperatorAtom) // Priority: prof > sub prof > rarity/rarityReverse return OPERATORS @@ -48,5 +52,7 @@ const profFilterHandle = ( selectedProf: [_, subProf], } = profFilter - return originData + return originData.filter( + ({ subProf: operatorSubProf }) => operatorSubProf === subProf, + ) } From c4c04aafb36c80eeeb4f4623025542ecc26280c0 Mon Sep 17 00:00:00 2001 From: GeorgeZhang2035 Date: Tue, 16 Jul 2024 14:37:02 +0800 Subject: [PATCH 11/50] perf: code of filter by prof completed --- scripts/shared.ts | 1 + .../editor/operator/sheet/SheetOperator.tsx | 56 ++- .../sheet/sheetOperator/OperatorFilter.tsx | 96 +++- .../sheetOperator/ProfClassification.tsx | 33 +- src/models/generated/operators.json | 409 ++++++++++++++++++ src/models/operator.ts | 17 +- 6 files changed, 557 insertions(+), 55 deletions(-) diff --git a/scripts/shared.ts b/scripts/shared.ts index f953c4d..66506a7 100644 --- a/scripts/shared.ts +++ b/scripts/shared.ts @@ -111,6 +111,7 @@ export async function getOperators() { return [ { id: id, + prof: op.profession, subProf: op.subProfessionId, ...transformOperatorName(op.name), rarity: diff --git a/src/components/editor/operator/sheet/SheetOperator.tsx b/src/components/editor/operator/sheet/SheetOperator.tsx index 34ea48d..3027c53 100644 --- a/src/components/editor/operator/sheet/SheetOperator.tsx +++ b/src/components/editor/operator/sheet/SheetOperator.tsx @@ -13,7 +13,15 @@ import { Operator } from '../EditorSheet' import { SheetContainerSkeleton } from './SheetContainerSkeleton' import { OperatorNoData } from './SheetNoneData' import { useSheet } from './SheetProvider' -import { ProfClassification } from './sheetOperator/ProfClassification' +import { + DEFAULTPROFID, + DEFAULTSUBPROFID, + useOperatorAfterFiltered, +} from './sheetOperator/OperatorFilter' +import { + ProfClassification, + ProfClassificationProp, +} from './sheetOperator/ProfClassification' import { SheetOperatorItem } from './sheetOperator/SheetOperatorItem' export interface SheetOperatorProps {} @@ -59,10 +67,14 @@ const paginationSize = 60 // ).slice(Math.min(...OPERATORS.map(({ rarity }) => rarity))) const SheetOperator: FC = () => { - const { submitOperator, existedOperators, removeOperator, existedGroups } = - useSheet() + // const { submitOperator, existedOperators, removeOperator, existedGroups } = + // useSheet() const operatorScrollRef = useRef(null) + const [activeProf, setActiveProf] = useState< + ProfClassificationProp['activeProf'] + >([DEFAULTPROFID.ALL, DEFAULTSUBPROFID.ALL]) + // const [selectedProf, setSelectedProf] = useState(formattedProfessions[0]) // const [selectedSubProf, setSelectedSubProf] = useState(defaultSubProf[0]) // const [operatorRarity, setOperatorRarity] = useState(defaultRarityFilter) @@ -96,17 +108,17 @@ const SheetOperator: FC = () => { // [selectedProf.sub, selectedProf.id, existedOperators, favOperators], // ) - const checkOperatorSelected = useCallback( - (target: string) => { - if (existedOperators.find((item) => item.name === target)) return true - else - return !!existedGroups - .map((item) => item.opers) - .flat() - .find((item) => item?.name === target) - }, - [existedOperators, existedGroups], - ) + // const checkOperatorSelected = useCallback( + // (target: string) => { + // if (existedOperators.find((item) => item.name === target)) return true + // else + // return !!existedGroups + // .map((item) => item.opers) + // .flat() + // .find((item) => item?.name === target) + // }, + // [existedOperators, existedGroups], + // ) // const getOperatorRarity = (target: string) => // operatorsGroupedByProf.find((item) => item.name === target)!.rarity @@ -297,17 +309,23 @@ const SheetOperator: FC = () => { //
    // ) + const operatorsAfterFiltered = useOperatorAfterFiltered({ + selectedProf: activeProf, + }) + + console.log(operatorsAfterFiltered) + return ( <>
    - {/* {operatorsGroupedBySubProf.length ? ( + {operatorsAfterFiltered.length ? ( <>
    - {operatorsGroupedBySubProf + {operatorsAfterFiltered .slice(0, lastIndex) .map(({ name }, index) => (
    = () => {
    ))}
    - {ShowMoreButton} + {/* {ShowMoreButton} */} ) : ( OperatorNoData - )} */} + )}
    {/* {ProfSelect} */} - +
    ) diff --git a/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx b/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx index 3b34d5b..76b1531 100644 --- a/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx @@ -1,4 +1,5 @@ import { useAtomValue } from 'jotai' +import { useMemo } from 'react' import { OperatorInfo as ModelsOperator, OPERATORS } from 'models/operator' import { favOperatorAtom } from 'store/useFavOperators' @@ -19,7 +20,7 @@ export enum DEFAULTSUBPROFID { } export interface ProfFilter { - selectedProf: [DEFAULTPROFID, DEFAULTSUBPROFID] + selectedProf: [string, string] } export interface RarityFilter { @@ -33,26 +34,101 @@ export interface PaginationFilter { total: number } +const generateCustomizedOperInfo = (name: string): OperatorInfo => ({ + id: 'customized-' + name, + name, + prof: 'TOKEN', + subProf: 'customized', + alias: 'customized-operator', + rarity: 0, + alt_name: 'custormized operator', +}) + export const useOperatorAfterFiltered = (profFilter: ProfFilter) => { - const { existedOperators } = useSheet() - const favOperators = useAtomValue(favOperatorAtom) // Priority: prof > sub prof > rarity/rarityReverse + // filterResult init and prof filter about + const filterResult: { name: string }[] = useProfFilterHandle(profFilter) + // rarity about - return OPERATORS + // filterResult + console.log(filterResult) + return filterResult } -const profFilterHandle = ( +const useProfFilterHandle = ( profFilter: ProfFilter = { selectedProf: [DEFAULTPROFID.ALL, DEFAULTSUBPROFID.ALL], }, - originData: OperatorInfo[] = OPERATORS, ) => { - if (!profFilter) return originData const { - selectedProf: [_, subProf], + selectedProf: [prof, subProf], } = profFilter + const { existedOperators } = useSheet() - return originData.filter( - ({ subProf: operatorSubProf }) => operatorSubProf === subProf, + const favOperators = useAtomValue(favOperatorAtom) + const customizedOperatorsInfo = useMemo( + () => + existedOperators + .map(({ name }) => + OPERATORS.find(({ name: OPERName }) => OPERName === name) + ? undefined + : generateCustomizedOperInfo(name), + ) + .filter((item) => !!item), + [existedOperators], ) + const favOperatorsInfo = useMemo( + () => + favOperators.map( + ({ name }) => + OPERATORS.find(({ name: OPERName }) => OPERName === name) || + generateCustomizedOperInfo(name), + ), + [favOperators], + ) + + let operatorsFilteredByProf: OperatorInfo[] = [] + const OPERATORSWITHINCUSTOMIZED = [...OPERATORS, ...customizedOperatorsInfo] + switch (prof) { + case DEFAULTPROFID.ALL: { + operatorsFilteredByProf = OPERATORSWITHINCUSTOMIZED + break + } + case DEFAULTPROFID.FAV: { + operatorsFilteredByProf = favOperatorsInfo + break + } + case DEFAULTPROFID.OTHERS: { + operatorsFilteredByProf = OPERATORSWITHINCUSTOMIZED.filter( + ({ prof }) => prof === 'TOKEN', + ) + break + } + + default: { + operatorsFilteredByProf = OPERATORSWITHINCUSTOMIZED.filter( + ({ prof: OPERProf }) => OPERProf === prof, + ) + break + } + } + + switch (subProf) { + case DEFAULTSUBPROFID.ALL: { + return operatorsFilteredByProf + } + case DEFAULTSUBPROFID.SELECTED: { + return operatorsFilteredByProf.filter( + ({ name }) => + !!existedOperators.find( + ({ name: existedName }) => existedName === name, + ), + ) + } + default: { + return operatorsFilteredByProf.filter( + ({ subProf: operatorSubProf }) => operatorSubProf === subProf, + ) + } + } } diff --git a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx index 14ca054..9f50296 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx @@ -1,12 +1,18 @@ -import { Button, Divider, H4, H5 } from '@blueprintjs/core' -import { Popover2 } from '@blueprintjs/popover2' +import { Divider, H4, H5 } from '@blueprintjs/core' import clsx from 'clsx' -import { FC, ImgHTMLAttributes, useMemo, useState } from 'react' +import { + Dispatch, + FC, + ImgHTMLAttributes, + SetStateAction, + useMemo, + useState, +} from 'react' import { PROFESSIONS } from 'models/operator' -import { DEFAULTPROFID, DEFAULTSUBPROFID } from './OperatorFilter' +import { DEFAULTPROFID, DEFAULTSUBPROFID, ProfFilter } from './OperatorFilter' const formattedProfessions = [ { @@ -27,14 +33,17 @@ const formattedProfessions = [ }, ] -export interface ProfClassificationProp {} +type ActiveProf = ProfFilter['selectedProf'] -export const ProfClassification: FC = () => { - const [activeProf, setActiveProf] = useState([ - DEFAULTPROFID.ALL, - 'allSubProf', - ]) +export interface ProfClassificationProp { + activeProf: ActiveProf + setActiveProf: Dispatch> +} +export const ProfClassification: FC = ({ + activeProf, + setActiveProf, +}) => { const subProfs = useMemo(() => { return [ { id: DEFAULTSUBPROFID.ALL, name: '全部' }, @@ -117,9 +126,7 @@ export const ProfClassification: FC = () => { activeProf.includes(id) && '!opacity-100 underline', name.length > 3 && '!text-base', )} - onClick={() => - setActiveProf((prev) => [...prev.slice(0, 1), id]) - } + onClick={() => setActiveProf((prev) => [prev[0], id])} > {name} diff --git a/src/models/generated/operators.json b/src/models/generated/operators.json index 8afaa01..3656cbc 100644 --- a/src/models/generated/operators.json +++ b/src/models/generated/operators.json @@ -2,6 +2,7 @@ "OPERATORS": [ { "id": "token_10026_bgsnow_subbow", + "prof": "TOKEN", "subProf": "notchar1", "name": "“打字机”", "alias": "daziji dzj “打字機” 打字機", @@ -10,6 +11,7 @@ }, { "id": "token_10013_robin_mine", + "prof": "TOKEN", "subProf": "notchar1", "name": "“夹子”", "alias": "jiazi gazi jz gz “夾子” 夾子", @@ -18,6 +20,7 @@ }, { "id": "token_10020_ling_soul1", + "prof": "TOKEN", "subProf": "notchar1", "name": "“清平”", "alias": "qingping qp “清平” 清平", @@ -26,6 +29,7 @@ }, { "id": "token_10020_ling_soul3", + "prof": "TOKEN", "subProf": "notchar1", "name": "“弦惊”", "alias": "xianjing xj “弦驚” 弦驚", @@ -34,6 +38,7 @@ }, { "id": "token_10020_ling_soul2", + "prof": "TOKEN", "subProf": "notchar1", "name": "“逍遥”", "alias": "xiaoyao xy “逍遙” 逍遙", @@ -42,6 +47,7 @@ }, { "id": "token_10015_dusk_drgn", + "prof": "TOKEN", "subProf": "notchar1", "name": "“小自在”", "alias": "xiaozizai xzz “小自在” 小自在", @@ -50,6 +56,7 @@ }, { "id": "token_10019_nearl2_sword", + "prof": "TOKEN", "subProf": "notchar1", "name": "“耀阳”", "alias": "yaoyang yy “耀陽” 耀陽", @@ -58,6 +65,7 @@ }, { "id": "char_009_12fce", + "prof": "CASTER", "subProf": "splashcaster", "name": "12F", "alias": "12F", @@ -66,6 +74,7 @@ }, { "id": "char_225_haak", + "prof": "SPECIAL", "subProf": "geek", "name": "阿", "alias": "ae 阿", @@ -74,6 +83,7 @@ }, { "id": "char_446_aroma", + "prof": "CASTER", "subProf": "blastcaster", "name": "阿罗玛", "alias": "aluoma eluoma alm elm 阿羅瑪", @@ -82,6 +92,7 @@ }, { "id": "char_002_amiya", + "prof": "CASTER", "subProf": "corecaster", "name": "阿米娅", "alias": "amiya emiya amy emy 阿米婭", @@ -90,6 +101,7 @@ }, { "id": "char_4132_ascln", + "prof": "SPECIAL", "subProf": "stalker", "name": "阿斯卡纶", "alias": "asikalun asikaguan asiqialun asiqiaguan esikalun esikaguan esiqialun esiqiaguan askl askg asql asqg eskl eskg esql esqg 阿斯卡綸", @@ -98,6 +110,7 @@ }, { "id": "char_277_sqrrel", + "prof": "SPECIAL", "subProf": "pusher", "name": "阿消", "alias": "axiao exiao ax ex 阿消", @@ -106,6 +119,7 @@ }, { "id": "char_4123_ela", + "prof": "SPECIAL", "subProf": "traper", "name": "艾拉", "alias": "aila yila al yl 艾拉", @@ -114,6 +128,7 @@ }, { "id": "char_4043_erato", + "prof": "SNIPER", "subProf": "siegesniper", "name": "埃拉托", "alias": "ailatuo alt 埃拉托", @@ -122,6 +137,7 @@ }, { "id": "char_4009_irene", + "prof": "WARRIOR", "subProf": "sword", "name": "艾丽妮", "alias": "ailini yilini aln yln 艾麗妮", @@ -130,6 +146,7 @@ }, { "id": "char_338_iris", + "prof": "CASTER", "subProf": "mystic", "name": "爱丽丝", "alias": "ailisi als 愛麗絲", @@ -138,6 +155,7 @@ }, { "id": "char_127_estell", + "prof": "WARRIOR", "subProf": "centurion", "name": "艾丝黛尔", "alias": "aisidaier yisidaier asde ysde 艾絲黛爾", @@ -146,6 +164,7 @@ }, { "id": "char_180_amgoat", + "prof": "CASTER", "subProf": "corecaster", "name": "艾雅法拉", "alias": "aiyafala yiyafala ayfl yyfl 艾雅法拉", @@ -154,6 +173,7 @@ }, { "id": "char_302_glaze", + "prof": "SNIPER", "subProf": "longrange", "name": "安比尔", "alias": "anbier abe 安比爾", @@ -162,6 +182,7 @@ }, { "id": "char_211_adnach", + "prof": "SNIPER", "subProf": "fastshot", "name": "安德切尔", "alias": "andeqieer adqe 安德切爾", @@ -170,6 +191,7 @@ }, { "id": "char_291_aglina", + "prof": "SUPPORT", "subProf": "slower", "name": "安洁莉娜", "alias": "anjielina anjielinuo ajln 安潔莉娜", @@ -178,6 +200,7 @@ }, { "id": "char_212_ansel", + "prof": "MEDIC", "subProf": "physician", "name": "安赛尔", "alias": "ansaier ase 安賽爾", @@ -186,6 +209,7 @@ }, { "id": "char_236_rope", + "prof": "SPECIAL", "subProf": "hookmaster", "name": "暗索", "alias": "ansuo as 暗索", @@ -194,6 +218,7 @@ }, { "id": "char_218_cuttle", + "prof": "SNIPER", "subProf": "longrange", "name": "安哲拉", "alias": "anzhela azl 安哲拉", @@ -202,6 +227,7 @@ }, { "id": "char_4131_odda", + "prof": "WARRIOR", "subProf": "hammer", "name": "奥达", "alias": "aoda yuda ad yd 奧達", @@ -210,6 +236,7 @@ }, { "id": "char_346_aosta", + "prof": "SNIPER", "subProf": "reaperrange", "name": "奥斯塔", "alias": "aosita yusita ast yst 奧斯塔", @@ -218,6 +245,7 @@ }, { "id": "char_252_bibeak", + "prof": "WARRIOR", "subProf": "sword", "name": "柏喙", "alias": "baihui bohui bh 柏喙", @@ -226,6 +254,7 @@ }, { "id": "char_204_platnm", + "prof": "SNIPER", "subProf": "fastshot", "name": "白金", "alias": "baijin bj 白金", @@ -234,6 +263,7 @@ }, { "id": "char_1026_gvial2", + "prof": "WARRIOR", "subProf": "centurion", "name": "百炼嘉维尔", "alias": "bailianjiaweier bljwe 百煉嘉維爾", @@ -242,6 +272,7 @@ }, { "id": "char_128_plosis", + "prof": "MEDIC", "subProf": "ringhealer", "name": "白面鸮", "alias": "baimianxiao bmx 白麵鴞", @@ -250,6 +281,7 @@ }, { "id": "char_325_bison", + "prof": "TANK", "subProf": "protector", "name": "拜松", "alias": "baisong bs 拜鬆", @@ -258,6 +290,7 @@ }, { "id": "char_4072_ironmn", + "prof": "SUPPORT", "subProf": "craftsman", "name": "白铁", "alias": "baitie bt 白鐵", @@ -266,6 +299,7 @@ }, { "id": "token_10027_ironmn_pile1", + "prof": "TOKEN", "subProf": "notchar1", "name": "白铁™多功能平台", "alias": "baitie™duogongnengpingtai baitie™duogongnaipingtai bt™dgnpt 白鐵™多功能平台", @@ -274,6 +308,7 @@ }, { "id": "char_118_yuki", + "prof": "SNIPER", "subProf": "aoesniper", "name": "白雪", "alias": "baixue bx 白雪", @@ -282,6 +317,7 @@ }, { "id": "char_284_spot", + "prof": "TANK", "subProf": "guardian", "name": "斑点", "alias": "bandian bd 斑點", @@ -290,6 +326,7 @@ }, { "id": "char_230_savage", + "prof": "WARRIOR", "subProf": "centurion", "name": "暴行", "alias": "baohang baoxing puhang puxing bh bx ph px 暴行", @@ -298,6 +335,7 @@ }, { "id": "char_388_mint", + "prof": "CASTER", "subProf": "phalanx", "name": "薄绿", "alias": "baolv baolu bolv bolu bl 薄綠", @@ -306,6 +344,7 @@ }, { "id": "char_304_zebra", + "prof": "TANK", "subProf": "protector", "name": "暴雨", "alias": "baoyu puyu by py 暴雨", @@ -314,6 +353,7 @@ }, { "id": "char_369_bena", + "prof": "SPECIAL", "subProf": "dollkeeper", "name": "贝娜", "alias": "beina beinuo bn 貝娜", @@ -322,6 +362,7 @@ }, { "id": "char_265_sophia", + "prof": "WARRIOR", "subProf": "instructor", "name": "鞭刃", "alias": "bianren br 鞭刃", @@ -330,6 +371,7 @@ }, { "id": "char_4104_coldst", + "prof": "SNIPER", "subProf": "hunter", "name": "冰酿", "alias": "bingniang bn 冰釀", @@ -338,6 +380,7 @@ }, { "id": "char_258_podego", + "prof": "SUPPORT", "subProf": "slower", "name": "波登可", "alias": "bodengke bdk 波登可", @@ -346,6 +389,7 @@ }, { "id": "char_4004_pudd", + "prof": "CASTER", "subProf": "chain", "name": "布丁", "alias": "buding buzheng bd bz 布丁", @@ -354,6 +398,7 @@ }, { "id": "char_356_broca", + "prof": "WARRIOR", "subProf": "centurion", "name": "布洛卡", "alias": "buluoka buluoqia blk blq 布洛卡", @@ -362,6 +407,7 @@ }, { "id": "char_4106_bryota", + "prof": "WARRIOR", "subProf": "instructor", "name": "苍苔", "alias": "cangtai ct 蒼苔", @@ -370,6 +416,7 @@ }, { "id": "char_286_cast3", + "prof": "WARRIOR", "subProf": "fearless", "name": "Castle-3", "alias": "Castle-3", @@ -378,6 +425,7 @@ }, { "id": "char_289_gyuki", + "prof": "WARRIOR", "subProf": "fearless", "name": "缠丸", "alias": "chanwan cw 纏丸", @@ -386,6 +434,7 @@ }, { "id": "char_4047_pianst", + "prof": "TANK", "subProf": "artsprotector", "name": "车尔尼", "alias": "cheerni juerni cen jen 車爾尼", @@ -394,6 +443,7 @@ }, { "id": "char_010_chen", + "prof": "WARRIOR", "subProf": "sword", "name": "陈", "alias": "chen c 陳", @@ -402,6 +452,7 @@ }, { "id": "char_377_gdglow", + "prof": "CASTER", "subProf": "funnel", "name": "澄闪", "alias": "chengshan dengshan cs ds 澄閃", @@ -410,6 +461,7 @@ }, { "id": "char_1027_greyy2", + "prof": "SNIPER", "subProf": "bombarder", "name": "承曦格雷伊", "alias": "chengxigeleiyi cxgly 承曦格雷伊", @@ -418,6 +470,7 @@ }, { "id": "char_475_akafyu", + "prof": "WARRIOR", "subProf": "musha", "name": "赤冬", "alias": "chidong cd 赤冬", @@ -426,6 +479,7 @@ }, { "id": "char_4065_judge", + "prof": "TANK", "subProf": "unyield", "name": "斥罪", "alias": "chizui cz 斥罪", @@ -434,6 +488,7 @@ }, { "id": "char_4082_qiubai", + "prof": "WARRIOR", "subProf": "lord", "name": "仇白", "alias": "choubai qiubai cb qb 仇白", @@ -442,6 +497,7 @@ }, { "id": "token_10001_deepcl_tentac", + "prof": "TOKEN", "subProf": "notchar1", "name": "触手", "alias": "chushou cs 觸手", @@ -450,6 +506,7 @@ }, { "id": "char_174_slbell", + "prof": "SUPPORT", "subProf": "underminer", "name": "初雪", "alias": "chuxue cx 初雪", @@ -458,6 +515,7 @@ }, { "id": "char_1016_agoat2", + "prof": "MEDIC", "subProf": "wandermedic", "name": "纯烬艾雅法拉", "alias": "chunjinaiyafala chunjinyiyafala cjayfl cjyyfl 純燼艾雅法拉", @@ -466,6 +524,7 @@ }, { "id": "char_494_vendla", + "prof": "MEDIC", "subProf": "incantationmedic", "name": "刺玫", "alias": "cimei cm 刺玫", @@ -474,6 +533,7 @@ }, { "id": "token_10008_cqbw_box", + "prof": "TOKEN", "subProf": "notchar1", "name": "此面向敌", "alias": "cimianxiangdi cmxd 此麵向敵", @@ -482,6 +542,7 @@ }, { "id": "token_10039_ulpia_block", + "prof": "TOKEN", "subProf": "notchar1", "name": "从不混淆的方向", "alias": "congbuhunxiaodefangxiang congbuhunxiaodifangxiang congfouhunxiaodefangxiang congfouhunxiaodifangxiang zongbuhunxiaodefangxiang zongbuhunxiaodifangxiang zongfouhunxiaodefangxiang zongfouhunxiaodifangxiang cbhxdfx cfhxdfx zbhxdfx zfhxdfx 從不混淆的方向", @@ -490,6 +551,7 @@ }, { "id": "char_1031_slent2", + "prof": "SUPPORT", "subProf": "blessing", "name": "淬羽赫默", "alias": "cuiyuhemo cyhm 淬羽赫默", @@ -498,6 +560,7 @@ }, { "id": "char_362_saga", + "prof": "PIONEER", "subProf": "pioneer", "name": "嵯峨", "alias": "cuoe ce 嵯峨", @@ -506,6 +569,7 @@ }, { "id": "char_157_dagda", + "prof": "WARRIOR", "subProf": "fighter", "name": "达格达", "alias": "dageda dgd 達格達", @@ -514,6 +578,7 @@ }, { "id": "char_4110_delphn", + "prof": "CASTER", "subProf": "mystic", "name": "戴菲恩", "alias": "daifeien dfe 戴菲恩", @@ -522,6 +587,7 @@ }, { "id": "char_4032_provs", + "prof": "SUPPORT", "subProf": "slower", "name": "但书", "alias": "danshu ds 但書", @@ -530,6 +596,7 @@ }, { "id": "char_4126_fuze", + "prof": "WARRIOR", "subProf": "centurion", "name": "导火索", "alias": "daohuosuo dhs 導火索", @@ -538,6 +605,7 @@ }, { "id": "char_102_texas", + "prof": "PIONEER", "subProf": "pioneer", "name": "德克萨斯", "alias": "dekesasi dkss 德克薩斯", @@ -546,6 +614,7 @@ }, { "id": "char_1034_jesca2", + "prof": "TANK", "subProf": "shotprotector", "name": "涤火杰西卡", "alias": "dihuojiexika dihuojiexiqia dhjxk dhjxq 滌火傑西卡", @@ -554,6 +623,7 @@ }, { "id": "char_183_skgoat", + "prof": "SUPPORT", "subProf": "slower", "name": "地灵", "alias": "diling deling dl 地靈", @@ -562,6 +632,7 @@ }, { "id": "char_452_bstalk", + "prof": "PIONEER", "subProf": "tactician", "name": "豆苗", "alias": "doumiao dm 豆苗", @@ -570,6 +641,7 @@ }, { "id": "char_130_doberm", + "prof": "WARRIOR", "subProf": "instructor", "name": "杜宾", "alias": "dubin db 杜賓", @@ -578,14 +650,25 @@ }, { "id": "char_501_durin", + "prof": "CASTER", "subProf": "corecaster", "name": "杜林", "alias": "dulin dl 杜林", "rarity": 2, "alt_name": "Durin" }, + { + "id": "char_4147_mitm", + "prof": "PIONEER", + "subProf": "tactician", + "name": "渡桥", + "alias": "duqiao dq 渡橋", + "rarity": 5, + "alt_name": "Mitm" + }, { "id": "char_294_ayer", + "prof": "WARRIOR", "subProf": "lord", "name": "断崖", "alias": "duanya dy 斷崖", @@ -594,6 +677,7 @@ }, { "id": "char_159_peacok", + "prof": "WARRIOR", "subProf": "fearless", "name": "断罪者", "alias": "duanzuizhe dzz 斷罪者", @@ -602,6 +686,7 @@ }, { "id": "char_4083_chimes", + "prof": "WARRIOR", "subProf": "crusher", "name": "铎铃", "alias": "duoling dl 鐸鈴", @@ -610,6 +695,7 @@ }, { "id": "char_4048_doroth", + "prof": "SPECIAL", "subProf": "traper", "name": "多萝西", "alias": "duoluoxi dlx 多蘿西", @@ -618,6 +704,7 @@ }, { "id": "char_271_spikes", + "prof": "WARRIOR", "subProf": "lord", "name": "芳汀", "alias": "fangting ft 芳汀", @@ -626,6 +713,7 @@ }, { "id": "char_300_phenxi", + "prof": "SNIPER", "subProf": "aoesniper", "name": "菲亚梅塔", "alias": "feiyameita fymt 菲亞梅塔", @@ -634,6 +722,7 @@ }, { "id": "char_123_fang", + "prof": "PIONEER", "subProf": "pioneer", "name": "芬", "alias": "fen f 芬", @@ -642,6 +731,7 @@ }, { "id": "char_222_bpipe", + "prof": "PIONEER", "subProf": "charger", "name": "风笛", "alias": "fengdi fd 風笛", @@ -650,6 +740,7 @@ }, { "id": "char_4016_kazema", + "prof": "SPECIAL", "subProf": "dollkeeper", "name": "风丸", "alias": "fengwan fw 風丸", @@ -658,6 +749,7 @@ }, { "id": "char_4093_frston", + "prof": "TANK", "subProf": "protector", "name": "Friston-3", "alias": "Friston-3", @@ -666,6 +758,7 @@ }, { "id": "char_106_franka", + "prof": "WARRIOR", "subProf": "fearless", "name": "芙兰卡", "alias": "fulanka fulanqia flk flq 芙蘭卡", @@ -674,6 +767,7 @@ }, { "id": "char_120_hibisc", + "prof": "MEDIC", "subProf": "physician", "name": "芙蓉", "alias": "furong fr 芙蓉", @@ -682,6 +776,7 @@ }, { "id": "char_220_grani", + "prof": "PIONEER", "subProf": "charger", "name": "格拉尼", "alias": "gelani gln 格拉尼", @@ -690,6 +785,7 @@ }, { "id": "char_326_glacus", + "prof": "SUPPORT", "subProf": "slower", "name": "格劳克斯", "alias": "gelaokesi glks 格勞克斯", @@ -698,6 +794,7 @@ }, { "id": "char_474_glady", + "prof": "SPECIAL", "subProf": "hookmaster", "name": "歌蕾蒂娅", "alias": "geleidiya gldy 歌蕾蒂婭", @@ -706,6 +803,7 @@ }, { "id": "char_253_greyy", + "prof": "CASTER", "subProf": "splashcaster", "name": "格雷伊", "alias": "geleiyi gly 格雷伊", @@ -714,6 +812,7 @@ }, { "id": "token_10009_weedy_cannon", + "prof": "TOKEN", "subProf": "notchar1", "name": "工程蓄水炮", "alias": "gongchengxushuipao gongchengxushuibao gcxsp gcxsb 工程蓄水炮", @@ -722,6 +821,7 @@ }, { "id": "token_10025_doroth_recttp", + "prof": "TOKEN", "subProf": "notchar1", "name": "共振装置", "alias": "gongzhenzhuangzhi gzzz 共振裝置", @@ -730,6 +830,7 @@ }, { "id": "char_196_sunbr", + "prof": "TANK", "subProf": "guardian", "name": "古米", "alias": "gumi gm 古米", @@ -738,6 +839,7 @@ }, { "id": "char_1023_ghost2", + "prof": "SPECIAL", "subProf": "dollkeeper", "name": "归溟幽灵鲨", "alias": "guimingyoulingsha gmyls 歸溟幽靈鯊", @@ -746,6 +848,7 @@ }, { "id": "char_4114_harold", + "prof": "MEDIC", "subProf": "wandermedic", "name": "哈洛德", "alias": "haluode hld 哈洛德", @@ -754,6 +857,7 @@ }, { "id": "char_4045_heidi", + "prof": "SUPPORT", "subProf": "bard", "name": "海蒂", "alias": "haidi hd 海蒂", @@ -762,6 +866,7 @@ }, { "id": "char_4066_highmo", + "prof": "WARRIOR", "subProf": "reaper", "name": "海沫", "alias": "haimo hm 海沫", @@ -770,6 +875,7 @@ }, { "id": "char_4079_haini", + "prof": "SUPPORT", "subProf": "underminer", "name": "海霓", "alias": "haini hn 海霓", @@ -778,6 +884,7 @@ }, { "id": "char_1021_kroos2", + "prof": "SNIPER", "subProf": "fastshot", "name": "寒芒克洛丝", "alias": "hanmangkeluosi hmkls 寒芒克洛絲", @@ -786,6 +893,7 @@ }, { "id": "char_341_sntlla", + "prof": "CASTER", "subProf": "splashcaster", "name": "寒檀", "alias": "hantan ht 寒檀", @@ -794,6 +902,7 @@ }, { "id": "char_4039_horn", + "prof": "TANK", "subProf": "fortress", "name": "号角", "alias": "haojiao haojue hj 號角", @@ -802,6 +911,7 @@ }, { "id": "char_4088_hodrer", + "prof": "WARRIOR", "subProf": "crusher", "name": "赫德雷", "alias": "hedelei hdl 赫德雷", @@ -810,6 +920,7 @@ }, { "id": "char_4041_chnut", + "prof": "MEDIC", "subProf": "wandermedic", "name": "褐果", "alias": "heguo hg 褐果", @@ -818,6 +929,7 @@ }, { "id": "char_188_helage", + "prof": "WARRIOR", "subProf": "musha", "name": "赫拉格", "alias": "helage hlg 赫拉格", @@ -826,6 +938,7 @@ }, { "id": "char_108_silent", + "prof": "MEDIC", "subProf": "physician", "name": "赫默", "alias": "hemo hm 赫默", @@ -834,6 +947,7 @@ }, { "id": "char_297_hamoni", + "prof": "CASTER", "subProf": "mystic", "name": "和弦", "alias": "hexian huoxian huxian hx 和弦", @@ -842,6 +956,7 @@ }, { "id": "char_340_shwaz", + "prof": "SNIPER", "subProf": "closerange", "name": "黑", "alias": "hei h 黑", @@ -850,6 +965,7 @@ }, { "id": "char_4046_ebnhlz", + "prof": "CASTER", "subProf": "mystic", "name": "黑键", "alias": "heijian hj 黑鍵", @@ -858,6 +974,7 @@ }, { "id": "char_500_noirc", + "prof": "TANK", "subProf": "protector", "name": "黑角", "alias": "heijiao heijue hj 黑角", @@ -866,6 +983,7 @@ }, { "id": "char_144_red", + "prof": "SPECIAL", "subProf": "executor", "name": "红", "alias": "honggong hg 紅", @@ -874,6 +992,7 @@ }, { "id": "char_290_vigna", + "prof": "PIONEER", "subProf": "charger", "name": "红豆", "alias": "hongdou gongdou hd gd 紅豆", @@ -882,6 +1001,7 @@ }, { "id": "char_4023_rfalcn", + "prof": "PIONEER", "subProf": "pioneer", "name": "红隼", "alias": "hongsun gongsun hs gs 紅隼", @@ -890,6 +1010,7 @@ }, { "id": "char_4055_bgsnow", + "prof": "SNIPER", "subProf": "closerange", "name": "鸿雪", "alias": "hongxue hx 鴻雪", @@ -898,6 +1019,7 @@ }, { "id": "char_190_clour", + "prof": "SNIPER", "subProf": "fastshot", "name": "红云", "alias": "hongyun gongyun hy gy 紅雲", @@ -906,6 +1028,7 @@ }, { "id": "char_226_hmau", + "prof": "TANK", "subProf": "guardian", "name": "吽", "alias": "houhongou ho 吽", @@ -914,6 +1037,7 @@ }, { "id": "char_171_bldsk", + "prof": "MEDIC", "subProf": "physician", "name": "华法琳", "alias": "huafalin hfl 華法琳", @@ -922,6 +1046,7 @@ }, { "id": "char_243_waaifu", + "prof": "SPECIAL", "subProf": "executor", "name": "槐琥", "alias": "huaihu hh 槐琥", @@ -930,6 +1055,7 @@ }, { "id": "token_10003_cgbird_bird", + "prof": "TOKEN", "subProf": "notchar1", "name": "幻影", "alias": "huanying hy 幻影", @@ -938,6 +1064,7 @@ }, { "id": "char_017_huang", + "prof": "WARRIOR", "subProf": "centurion", "name": "煌", "alias": "huang h 煌", @@ -946,6 +1073,7 @@ }, { "id": "char_431_ashlok", + "prof": "TANK", "subProf": "fortress", "name": "灰毫", "alias": "huihao hh 灰毫", @@ -954,6 +1082,7 @@ }, { "id": "char_367_swllow", + "prof": "SNIPER", "subProf": "fastshot", "name": "灰喉", "alias": "huihou hh 灰喉", @@ -962,6 +1091,7 @@ }, { "id": "char_456_ash", + "prof": "SNIPER", "subProf": "fastshot", "name": "灰烬", "alias": "huijin hj 灰燼", @@ -970,6 +1100,7 @@ }, { "id": "token_10035_wisdel_wward", + "prof": "TOKEN", "subProf": "notchar1", "name": "魂灵之影", "alias": "hunlingzhiying hlzy 魂靈之影", @@ -978,6 +1109,7 @@ }, { "id": "char_4027_heyak", + "prof": "CASTER", "subProf": "corecaster", "name": "霍尔海雅", "alias": "huoerhaiya hehy 霍爾海雅", @@ -986,6 +1118,7 @@ }, { "id": "char_1030_noirc2", + "prof": "WARRIOR", "subProf": "musha", "name": "火龙S黑角", "alias": "huolongSheijiao huolongSheijue hlShj 火龍S黑角", @@ -994,6 +1127,7 @@ }, { "id": "char_493_firwhl", + "prof": "TANK", "subProf": "fortress", "name": "火哨", "alias": "huoshao hs 火哨", @@ -1002,6 +1136,7 @@ }, { "id": "char_163_hpsts", + "prof": "TANK", "subProf": "unyield", "name": "火神", "alias": "huoshen hs 火神", @@ -1010,6 +1145,7 @@ }, { "id": "char_293_thorns", + "prof": "WARRIOR", "subProf": "lord", "name": "棘刺", "alias": "jici jc 棘刺", @@ -1018,6 +1154,7 @@ }, { "id": "token_10032_jesca2_jckshd", + "prof": "TOKEN", "subProf": "notchar1", "name": "机动盾牌", "alias": "jidongdunpai jddp 機動盾牌", @@ -1026,6 +1163,7 @@ }, { "id": "char_422_aurora", + "prof": "TANK", "subProf": "duelist", "name": "极光", "alias": "jiguang jg 極光", @@ -1034,6 +1172,7 @@ }, { "id": "char_401_elysm", + "prof": "PIONEER", "subProf": "bearer", "name": "极境", "alias": "jijing jj 極境", @@ -1042,6 +1181,7 @@ }, { "id": "token_10004_otter_motter", + "prof": "TOKEN", "subProf": "notchar1", "name": "机械水獭", "alias": "jixieshuita jxst 機械水獺", @@ -1050,6 +1190,7 @@ }, { "id": "char_1013_chen2", + "prof": "SNIPER", "subProf": "reaperrange", "name": "假日威龙陈", "alias": "jiariweilongchen jrwlc 假日威龍陳", @@ -1058,6 +1199,7 @@ }, { "id": "char_349_chiave", + "prof": "PIONEER", "subProf": "pioneer", "name": "贾维", "alias": "jiawei guwei jw gw 賈維", @@ -1066,6 +1208,7 @@ }, { "id": "char_187_ccheal", + "prof": "MEDIC", "subProf": "physician", "name": "嘉维尔", "alias": "jiaweier jwe 嘉維爾", @@ -1074,6 +1217,7 @@ }, { "id": "char_4116_blkkgt", + "prof": "WARRIOR", "subProf": "sword", "name": "锏", "alias": "jian j 鐧", @@ -1082,6 +1226,7 @@ }, { "id": "char_4036_forcer", + "prof": "SPECIAL", "subProf": "pusher", "name": "见行者", "alias": "jianhangzhe jianxingzhe xianhangzhe xianxingzhe jhz jxz xhz xxz 見行者", @@ -1090,6 +1235,7 @@ }, { "id": "char_260_durnar", + "prof": "TANK", "subProf": "artsprotector", "name": "坚雷", "alias": "jianlei jl 堅雷", @@ -1098,6 +1244,7 @@ }, { "id": "char_1028_texas2", + "prof": "SPECIAL", "subProf": "executor", "name": "缄默德克萨斯", "alias": "jianmodekesasi jmdkss 緘默德克薩斯", @@ -1106,6 +1253,7 @@ }, { "id": "char_199_yak", + "prof": "TANK", "subProf": "protector", "name": "角峰", "alias": "jiaofeng juefeng jf 角峰", @@ -1114,6 +1262,7 @@ }, { "id": "char_272_strong", + "prof": "SPECIAL", "subProf": "merchant", "name": "孑", "alias": "jie j 孑", @@ -1122,6 +1271,7 @@ }, { "id": "char_347_jaksel", + "prof": "WARRIOR", "subProf": "fighter", "name": "杰克", "alias": "jieke jk 傑克", @@ -1130,6 +1280,7 @@ }, { "id": "char_235_jesica", + "prof": "SNIPER", "subProf": "fastshot", "name": "杰西卡", "alias": "jiexika jiexiqia jxk jxq 傑西卡", @@ -1138,6 +1289,7 @@ }, { "id": "char_4078_bdhkgt", + "prof": "SNIPER", "subProf": "aoesniper", "name": "截云", "alias": "jieyun jy 截雲", @@ -1146,6 +1298,7 @@ }, { "id": "char_306_leizi", + "prof": "CASTER", "subProf": "chain", "name": "惊蛰", "alias": "jingzhe jz 驚蟄", @@ -1154,6 +1307,7 @@ }, { "id": "token_10007_phatom_twin", + "prof": "TOKEN", "subProf": "executor", "name": "镜中虚影", "alias": "jingzhongxuying jzxy 鏡中虛影", @@ -1162,6 +1316,7 @@ }, { "id": "token_10024_ebnhlz_rcube", + "prof": "TOKEN", "subProf": "notchar1", "name": "旧日残影", "alias": "jiuricanying jrcy 舊日殘影", @@ -1170,6 +1325,7 @@ }, { "id": "char_4019_ncdeer", + "prof": "SUPPORT", "subProf": "blessing", "name": "九色鹿", "alias": "jiuselu jsl 九色鹿", @@ -1178,6 +1334,7 @@ }, { "id": "char_328_cammou", + "prof": "CASTER", "subProf": "funnel", "name": "卡达", "alias": "kada qiada kd qd 卡達", @@ -1186,6 +1343,7 @@ }, { "id": "char_214_kafka", + "prof": "SPECIAL", "subProf": "executor", "name": "卡夫卡", "alias": "kafuka kafuqia qiafuka qiafuqia kfk kfq qfk qfq 卡夫卡", @@ -1194,6 +1352,7 @@ }, { "id": "char_426_billro", + "prof": "CASTER", "subProf": "phalanx", "name": "卡涅利安", "alias": "kanielian qianielian knla qnla 卡涅利安", @@ -1202,6 +1361,7 @@ }, { "id": "char_209_ardign", + "prof": "TANK", "subProf": "protector", "name": "卡缇", "alias": "kati qiati kt qt 卡緹", @@ -1210,6 +1370,7 @@ }, { "id": "char_003_kalts", + "prof": "MEDIC", "subProf": "physician", "name": "凯尔希", "alias": "kaierxi kex 凱爾希", @@ -1218,6 +1379,7 @@ }, { "id": "char_301_cutter", + "prof": "WARRIOR", "subProf": "sword", "name": "刻刀", "alias": "kedao kd 刻刀", @@ -1226,6 +1388,7 @@ }, { "id": "char_2013_cerber", + "prof": "CASTER", "subProf": "corecaster", "name": "刻俄柏", "alias": "keebai keebo keb 刻俄柏", @@ -1234,6 +1397,7 @@ }, { "id": "token_10023_windft_wrench", + "prof": "TOKEN", "subProf": "notchar1", "name": "可靠电池", "alias": "kekaodianchi kkdc 可靠電池", @@ -1242,6 +1406,7 @@ }, { "id": "char_124_kroos", + "prof": "SNIPER", "subProf": "fastshot", "name": "克洛丝", "alias": "keluosi kls 克洛絲", @@ -1250,6 +1415,7 @@ }, { "id": "char_201_moeshd", + "prof": "TANK", "subProf": "protector", "name": "可颂", "alias": "kesong ks 可頌", @@ -1258,6 +1424,7 @@ }, { "id": "char_101_sora", + "prof": "SUPPORT", "subProf": "bard", "name": "空", "alias": "kong k 空", @@ -1266,6 +1433,7 @@ }, { "id": "char_282_catap", + "prof": "SNIPER", "subProf": "aoesniper", "name": "空爆", "alias": "kongbao kb 空爆", @@ -1274,6 +1442,7 @@ }, { "id": "char_4015_spuria", + "prof": "SPECIAL", "subProf": "geek", "name": "空构", "alias": "konggou kg 空構", @@ -1282,6 +1451,7 @@ }, { "id": "char_332_archet", + "prof": "SNIPER", "subProf": "fastshot", "name": "空弦", "alias": "kongxian kx 空弦", @@ -1290,6 +1460,7 @@ }, { "id": "char_405_absin", + "prof": "CASTER", "subProf": "corecaster", "name": "苦艾", "alias": "kuai kuyi ka ky 苦艾", @@ -1298,6 +1469,7 @@ }, { "id": "char_250_phatom", + "prof": "SPECIAL", "subProf": "executor", "name": "傀影", "alias": "kuiying guiying ky gy 傀影", @@ -1306,6 +1478,7 @@ }, { "id": "char_140_whitew", + "prof": "WARRIOR", "subProf": "lord", "name": "拉普兰德", "alias": "lapulande lpld 拉普蘭德", @@ -1314,6 +1487,7 @@ }, { "id": "char_373_lionhd", + "prof": "CASTER", "subProf": "splashcaster", "name": "莱恩哈特", "alias": "laienhate leht 萊恩哈特", @@ -1322,6 +1496,7 @@ }, { "id": "char_4117_ray", + "prof": "SNIPER", "subProf": "hunter", "name": "莱伊", "alias": "laiyi ly 萊伊", @@ -1330,6 +1505,7 @@ }, { "id": "char_129_bluep", + "prof": "SNIPER", "subProf": "fastshot", "name": "蓝毒", "alias": "landu landai ld 藍毒", @@ -1338,6 +1514,7 @@ }, { "id": "char_285_medic2", + "prof": "MEDIC", "subProf": "physician", "name": "Lancet-2", "alias": "Lancet-2", @@ -1346,6 +1523,7 @@ }, { "id": "token_10028_vigil_wolf", + "prof": "TOKEN", "subProf": "notchar1", "name": "狼群", "alias": "langqun lq 狼群", @@ -1354,6 +1532,7 @@ }, { "id": "char_322_lmlee", + "prof": "SPECIAL", "subProf": "merchant", "name": "老鲤", "alias": "laoli ll 老鯉", @@ -1362,6 +1541,7 @@ }, { "id": "token_10033_ela_grzmot", + "prof": "TOKEN", "subProf": "notchar1", "name": "雷鸣地雷", "alias": "leimingdilei leimingdelei lmdl 雷鳴地雷", @@ -1370,6 +1550,7 @@ }, { "id": "char_107_liskam", + "prof": "TANK", "subProf": "shotprotector", "name": "雷蛇", "alias": "leishe leiyi ls ly 雷蛇", @@ -1378,6 +1559,7 @@ }, { "id": "char_237_gravel", + "prof": "SPECIAL", "subProf": "executor", "name": "砾", "alias": "li l 礫", @@ -1386,6 +1568,7 @@ }, { "id": "char_1036_fang2", + "prof": "PIONEER", "subProf": "charger", "name": "历阵锐枪芬", "alias": "lizhenruiqiangfen lzrqf 曆陣銳槍芬", @@ -1394,6 +1577,7 @@ }, { "id": "trap_079_allydonq", + "prof": "TOKEN", "subProf": "pioneer", "name": "猎潮的骑士", "alias": "liechaodeqishi liechaodiqishi lcdqs 獵潮的騎士", @@ -1402,6 +1586,7 @@ }, { "id": "char_137_brownb", + "prof": "WARRIOR", "subProf": "fighter", "name": "猎蜂", "alias": "liefeng lf 獵蜂", @@ -1410,6 +1595,7 @@ }, { "id": "char_194_leto", + "prof": "WARRIOR", "subProf": "lord", "name": "烈夏", "alias": "liexia lx 烈夏", @@ -1418,6 +1604,7 @@ }, { "id": "char_4080_lin", + "prof": "CASTER", "subProf": "phalanx", "name": "林", "alias": "lin l 林", @@ -1426,6 +1613,7 @@ }, { "id": "char_115_headbr", + "prof": "PIONEER", "subProf": "pioneer", "name": "凛冬", "alias": "lindong ld 凜冬", @@ -1434,6 +1622,7 @@ }, { "id": "char_148_nearl", + "prof": "TANK", "subProf": "guardian", "name": "临光", "alias": "linguang lg 臨光", @@ -1442,6 +1631,7 @@ }, { "id": "char_1033_swire2", + "prof": "SPECIAL", "subProf": "merchant", "name": "琳琅诗怀雅", "alias": "linlangshihuaiya llshy 琳琅詩懷雅", @@ -1450,6 +1640,7 @@ }, { "id": "char_4102_threye", + "prof": "SUPPORT", "subProf": "ritualist", "name": "凛视", "alias": "linshi ls 凜視", @@ -1458,6 +1649,7 @@ }, { "id": "char_2023_ling", + "prof": "SUPPORT", "subProf": "summoner", "name": "令", "alias": "ling l 令", @@ -1466,6 +1658,7 @@ }, { "id": "char_358_lisa", + "prof": "SUPPORT", "subProf": "slower", "name": "铃兰", "alias": "linglan ll 鈴蘭", @@ -1474,6 +1667,7 @@ }, { "id": "char_192_falco", + "prof": "PIONEER", "subProf": "charger", "name": "翎羽", "alias": "lingyu ly 翎羽", @@ -1482,6 +1676,7 @@ }, { "id": "char_206_gnosis", + "prof": "SUPPORT", "subProf": "underminer", "name": "灵知", "alias": "lingzhi lz 靈知", @@ -1490,6 +1685,7 @@ }, { "id": "char_4042_lumen", + "prof": "MEDIC", "subProf": "healer", "name": "流明", "alias": "liuming lm 流明", @@ -1498,6 +1694,7 @@ }, { "id": "char_126_shotst", + "prof": "SNIPER", "subProf": "fastshot", "name": "流星", "alias": "liuxing lx 流星", @@ -1506,6 +1703,7 @@ }, { "id": "token_10030_mlyss_wtrman", + "prof": "TOKEN", "subProf": "notchar1", "name": "流形", "alias": "liuxing lx 流形", @@ -1514,6 +1712,7 @@ }, { "id": "char_486_takila", + "prof": "WARRIOR", "subProf": "librator", "name": "龙舌兰", "alias": "longshelan lsl 龍舌蘭", @@ -1522,6 +1721,7 @@ }, { "id": "token_10005_mgllan_drone3", + "prof": "TOKEN", "subProf": "notchar1", "name": "龙腾.A", "alias": "longteng.A lt.A 龍騰.A", @@ -1530,6 +1730,7 @@ }, { "id": "token_10005_mgllan_drone1", + "prof": "TOKEN", "subProf": "notchar1", "name": "龙腾.F", "alias": "longteng.F lt.F 龍騰.F", @@ -1538,6 +1739,7 @@ }, { "id": "token_10005_mgllan_drone2", + "prof": "TOKEN", "subProf": "notchar1", "name": "龙腾.L", "alias": "longteng.L lt.L 龍騰.L", @@ -1546,6 +1748,7 @@ }, { "id": "char_4130_luton", + "prof": "TANK", "subProf": "unyield", "name": "露托", "alias": "loutuo lutuo lt 露托", @@ -1554,6 +1757,7 @@ }, { "id": "char_433_windft", + "prof": "SUPPORT", "subProf": "craftsman", "name": "掠风", "alias": "lvefeng lf 掠風", @@ -1562,6 +1766,7 @@ }, { "id": "char_484_robrta", + "prof": "SUPPORT", "subProf": "craftsman", "name": "罗比菈塔", "alias": "luobilata lblt 羅比菈塔", @@ -1570,6 +1775,7 @@ }, { "id": "char_451_robin", + "prof": "SPECIAL", "subProf": "traper", "name": "罗宾", "alias": "luobin lb 羅賓", @@ -1578,6 +1784,7 @@ }, { "id": "char_4133_logos", + "prof": "CASTER", "subProf": "corecaster", "name": "逻各斯", "alias": "luogesi lgs 邏各斯", @@ -1586,6 +1793,7 @@ }, { "id": "char_4040_rockr", + "prof": "CASTER", "subProf": "funnel", "name": "洛洛", "alias": "luoluo ll 洛洛", @@ -1594,6 +1802,7 @@ }, { "id": "char_4067_lolxh", + "prof": "WARRIOR", "subProf": "lord", "name": "罗小黑", "alias": "luoxiaohei lxh 羅小黑", @@ -1602,6 +1811,7 @@ }, { "id": "char_4064_mlynar", + "prof": "WARRIOR", "subProf": "librator", "name": "玛恩纳", "alias": "maenna men 瑪恩納", @@ -1610,6 +1820,7 @@ }, { "id": "char_248_mgllan", + "prof": "SUPPORT", "subProf": "summoner", "name": "麦哲伦", "alias": "maizhelun mzl 麥哲倫", @@ -1618,6 +1829,7 @@ }, { "id": "char_133_mm", + "prof": "SNIPER", "subProf": "fastshot", "name": "梅", "alias": "mei m 梅", @@ -1626,6 +1838,7 @@ }, { "id": "char_242_otter", + "prof": "SUPPORT", "subProf": "summoner", "name": "梅尔", "alias": "meier me 梅爾", @@ -1634,6 +1847,7 @@ }, { "id": "char_4006_melnte", + "prof": "SNIPER", "subProf": "closerange", "name": "玫拉", "alias": "meila ml 玫拉", @@ -1642,6 +1856,7 @@ }, { "id": "char_208_melan", + "prof": "WARRIOR", "subProf": "fearless", "name": "玫兰莎", "alias": "meilansuo meilansha mls 玫蘭莎", @@ -1650,6 +1865,7 @@ }, { "id": "char_391_rosmon", + "prof": "SNIPER", "subProf": "bombarder", "name": "迷迭香", "alias": "midiexiang mdx 迷迭香", @@ -1658,6 +1874,7 @@ }, { "id": "char_122_beagle", + "prof": "TANK", "subProf": "protector", "name": "米格鲁", "alias": "migelu mgl 米格魯", @@ -1666,6 +1883,7 @@ }, { "id": "char_344_beewax", + "prof": "CASTER", "subProf": "phalanx", "name": "蜜蜡", "alias": "mila ml 蜜蠟", @@ -1674,6 +1892,7 @@ }, { "id": "char_449_glider", + "prof": "MEDIC", "subProf": "wandermedic", "name": "蜜莓", "alias": "mimei mm 蜜莓", @@ -1682,6 +1901,7 @@ }, { "id": "char_4017_puzzle", + "prof": "PIONEER", "subProf": "agent", "name": "谜图", "alias": "mitu mt 謎圖", @@ -1690,6 +1910,7 @@ }, { "id": "token_10021_blkngt_hypnos", + "prof": "TOKEN", "subProf": "notchar1", "name": "眠兽", "alias": "mianshou ms 眠獸", @@ -1698,6 +1919,7 @@ }, { "id": "char_4071_peper", + "prof": "MEDIC", "subProf": "chainhealer", "name": "明椒", "alias": "mingjiao mj 明椒", @@ -1706,6 +1928,7 @@ }, { "id": "char_154_morgan", + "prof": "WARRIOR", "subProf": "fearless", "name": "摩根", "alias": "mogen magen mg 摩根", @@ -1714,6 +1937,7 @@ }, { "id": "char_213_mostma", + "prof": "CASTER", "subProf": "splashcaster", "name": "莫斯提马", "alias": "mositima mosidima musitima musidima mstm msdm 莫斯提馬", @@ -1722,6 +1946,7 @@ }, { "id": "char_4134_cetsyr", + "prof": "SUPPORT", "subProf": "bard", "name": "魔王", "alias": "mowang mw 魔王", @@ -1730,6 +1955,7 @@ }, { "id": "char_117_myrrh", + "prof": "MEDIC", "subProf": "physician", "name": "末药", "alias": "moyao my 末藥", @@ -1738,6 +1964,7 @@ }, { "id": "token_10002_kalts_mon3tr", + "prof": "TOKEN", "subProf": "notchar1", "name": "Mon3tr", "alias": "Mon3tr", @@ -1746,6 +1973,7 @@ }, { "id": "char_249_mlyss", + "prof": "PIONEER", "subProf": "tactician", "name": "缪尔赛思", "alias": "mouersaisi mouersaisai miuersaisi miuersaisai miaoersaisi miaoersaisai muersaisi muersaisai liaoersaisi liaoersaisai mess less 繆爾賽思", @@ -1754,6 +1982,7 @@ }, { "id": "char_185_frncat", + "prof": "WARRIOR", "subProf": "artsfghter", "name": "慕斯", "alias": "musi ms 慕斯", @@ -1762,14 +1991,25 @@ }, { "id": "char_103_angel", + "prof": "SNIPER", "subProf": "fastshot", "name": "能天使", "alias": "nengtianshi naitianshi nts 能天使", "rarity": 6, "alt_name": "Exusiai" }, + { + "id": "char_4146_nymph", + "prof": "CASTER", + "subProf": "primcaster", + "name": "妮芙", + "alias": "nifu nf 妮芙", + "rarity": 6, + "alt_name": "Nymph" + }, { "id": "char_311_mudrok", + "prof": "TANK", "subProf": "unyield", "name": "泥岩", "alias": "niyan ny 泥岩", @@ -1778,6 +2018,7 @@ }, { "id": "char_2014_nian", + "prof": "TANK", "subProf": "protector", "name": "年", "alias": "nian n 年", @@ -1786,6 +2027,7 @@ }, { "id": "char_485_pallas", + "prof": "WARRIOR", "subProf": "instructor", "name": "帕拉斯", "alias": "palasi pls 帕拉斯", @@ -1794,6 +2036,7 @@ }, { "id": "token_10014_bstalk_crab", + "prof": "TOKEN", "subProf": "notchar1", "name": "磐蟹护卫队", "alias": "panxiehuweidui pxhwd 磐蟹護衛隊 panxiehuweizhui pxhwz", @@ -1802,6 +2045,7 @@ }, { "id": "char_381_bubble", + "prof": "TANK", "subProf": "protector", "name": "泡泡", "alias": "paopao pp 泡泡", @@ -1810,6 +2054,7 @@ }, { "id": "char_281_popka", + "prof": "WARRIOR", "subProf": "centurion", "name": "泡普卡", "alias": "paopuka paopuqia ppk ppq 泡普卡", @@ -1818,6 +2063,7 @@ }, { "id": "char_4136_phonor", + "prof": "SUPPORT", "subProf": "ritualist", "name": "PhonoR-0", "alias": "PhonoR-0", @@ -1826,6 +2072,7 @@ }, { "id": "char_509_acast", + "prof": "CASTER", "subProf": "splashcaster", "name": "Pith", "alias": "Pith", @@ -1834,6 +2081,7 @@ }, { "id": "char_145_prove", + "prof": "SNIPER", "subProf": "closerange", "name": "普罗旺斯", "alias": "puluowangsi plws 普羅旺斯", @@ -1842,6 +2090,7 @@ }, { "id": "char_478_kirara", + "prof": "SPECIAL", "subProf": "stalker", "name": "绮良", "alias": "qiliang ql 綺良", @@ -1850,6 +2099,7 @@ }, { "id": "char_1029_yato2", + "prof": "SPECIAL", "subProf": "executor", "name": "麒麟R夜刀", "alias": "qilinRyedao qlRyd 麒麟R夜刀", @@ -1858,6 +2108,7 @@ }, { "id": "char_4062_totter", + "prof": "SNIPER", "subProf": "siegesniper", "name": "铅踝", "alias": "qianhuai yanhuai qh yh 鉛踝", @@ -1866,6 +2117,7 @@ }, { "id": "char_479_sleach", + "prof": "PIONEER", "subProf": "bearer", "name": "琴柳", "alias": "qinliu ql 琴柳", @@ -1874,6 +2126,7 @@ }, { "id": "char_149_scave", + "prof": "PIONEER", "subProf": "pioneer", "name": "清道夫", "alias": "qingdaofu qdf 清道夫", @@ -1882,6 +2135,7 @@ }, { "id": "char_385_finlpp", + "prof": "MEDIC", "subProf": "healer", "name": "清流", "alias": "qingliu ql 清流", @@ -1890,6 +2144,7 @@ }, { "id": "char_488_buildr", + "prof": "PIONEER", "subProf": "pioneer", "name": "青枳", "alias": "qingzhi qz 青枳", @@ -1898,6 +2153,7 @@ }, { "id": "token_10018_robrta_mach", + "prof": "TOKEN", "subProf": "notchar1", "name": "全自动造型仪", "alias": "quanzidongzaoxingyi qzdzxy 全自動造型儀", @@ -1906,6 +2162,7 @@ }, { "id": "char_363_toddi", + "prof": "SNIPER", "subProf": "siegesniper", "name": "熔泉", "alias": "rongquan rq 熔泉", @@ -1914,6 +2171,7 @@ }, { "id": "char_202_demkni", + "prof": "TANK", "subProf": "guardian", "name": "塞雷娅", "alias": "saileiya seleiya sly 塞雷婭", @@ -1922,6 +2180,7 @@ }, { "id": "char_473_mberry", + "prof": "MEDIC", "subProf": "wandermedic", "name": "桑葚", "alias": "sangshen ss 桑葚", @@ -1930,6 +2189,7 @@ }, { "id": "char_416_zumama", + "prof": "TANK", "subProf": "duelist", "name": "森蚺", "alias": "senran sr 森蚺", @@ -1938,6 +2198,7 @@ }, { "id": "token_10034_ray_sndbst", + "prof": "TOKEN", "subProf": "notchar1", "name": "沙地兽", "alias": "shadishou shadeshou sds 沙地獸", @@ -1946,6 +2207,7 @@ }, { "id": "token_10011_beewax_oblisk", + "prof": "TOKEN", "subProf": "notchar1", "name": "沙之碑", "alias": "shazhibei szb 沙之碑", @@ -1954,6 +2216,7 @@ }, { "id": "char_264_f12yin", + "prof": "WARRIOR", "subProf": "fighter", "name": "山", "alias": "shan s 山", @@ -1962,6 +2225,7 @@ }, { "id": "char_457_blitz", + "prof": "TANK", "subProf": "shotprotector", "name": "闪击", "alias": "shanji sj 閃擊", @@ -1970,6 +2234,7 @@ }, { "id": "char_147_shining", + "prof": "MEDIC", "subProf": "physician", "name": "闪灵", "alias": "shanling sl 閃靈", @@ -1978,6 +2243,7 @@ }, { "id": "char_508_aguard", + "prof": "WARRIOR", "subProf": "fearless", "name": "Sharp", "alias": "Sharp", @@ -1986,6 +2252,7 @@ }, { "id": "char_379_sesa", + "prof": "SNIPER", "subProf": "aoesniper", "name": "慑砂", "alias": "shesha ss 懾砂", @@ -1994,6 +2261,7 @@ }, { "id": "char_150_snakek", + "prof": "TANK", "subProf": "protector", "name": "蛇屠箱", "alias": "shetuxiang yituxiang stx ytx 蛇屠箱", @@ -2002,6 +2270,7 @@ }, { "id": "char_469_indigo", + "prof": "CASTER", "subProf": "mystic", "name": "深靛", "alias": "shendian sd 深靛", @@ -2010,6 +2279,7 @@ }, { "id": "char_110_deepcl", + "prof": "SUPPORT", "subProf": "summoner", "name": "深海色", "alias": "shenhaise shs 深海色", @@ -2018,6 +2288,7 @@ }, { "id": "char_4109_baslin", + "prof": "TANK", "subProf": "guardian", "name": "深律", "alias": "shenlv sl 深律", @@ -2026,6 +2297,7 @@ }, { "id": "char_4137_udflow", + "prof": "TANK", "subProf": "shotprotector", "name": "深巡", "alias": "shenxun sx 深巡", @@ -2034,6 +2306,7 @@ }, { "id": "char_1032_excu2", + "prof": "WARRIOR", "subProf": "reaper", "name": "圣约送葬人", "alias": "shengyuesongzangren shengyaosongzangren syszr 聖約送葬人", @@ -2042,6 +2315,7 @@ }, { "id": "char_210_stward", + "prof": "CASTER", "subProf": "corecaster", "name": "史都华德", "alias": "shiduhuade shidouhuade sdhd 史都華德", @@ -2050,6 +2324,7 @@ }, { "id": "char_350_surtr", + "prof": "WARRIOR", "subProf": "artsfghter", "name": "史尔特尔", "alias": "shierteer sete 史爾特爾", @@ -2058,6 +2333,7 @@ }, { "id": "char_308_swire", + "prof": "WARRIOR", "subProf": "instructor", "name": "诗怀雅", "alias": "shihuaiya shy 詩懷雅", @@ -2066,6 +2342,7 @@ }, { "id": "char_378_asbest", + "prof": "TANK", "subProf": "artsprotector", "name": "石棉", "alias": "shimian danmian sm dm 石棉", @@ -2074,6 +2351,7 @@ }, { "id": "char_489_serum", + "prof": "CASTER", "subProf": "blastcaster", "name": "蚀清", "alias": "shiqing sq 蝕清", @@ -2082,6 +2360,7 @@ }, { "id": "char_241_panda", + "prof": "SPECIAL", "subProf": "pusher", "name": "食铁兽", "alias": "shitieshou sitieshou yitieshou sts yts 食鐵獸", @@ -2090,6 +2369,7 @@ }, { "id": "char_215_mantic", + "prof": "SPECIAL", "subProf": "stalker", "name": "狮蝎", "alias": "shixie sx 獅蠍", @@ -2098,6 +2378,7 @@ }, { "id": "char_4063_quartz", + "prof": "WARRIOR", "subProf": "crusher", "name": "石英", "alias": "shiying danying sy dy 石英", @@ -2106,6 +2387,7 @@ }, { "id": "char_158_milu", + "prof": "SNIPER", "subProf": "longrange", "name": "守林人", "alias": "shoulinren slr 守林人", @@ -2114,6 +2396,7 @@ }, { "id": "char_2025_shu", + "prof": "TANK", "subProf": "guardian", "name": "黍", "alias": "shu s 黍", @@ -2122,6 +2405,7 @@ }, { "id": "char_458_rfrost", + "prof": "SPECIAL", "subProf": "traper", "name": "霜华", "alias": "shuanghua sh 霜華", @@ -2130,6 +2414,7 @@ }, { "id": "char_193_frostl", + "prof": "WARRIOR", "subProf": "lord", "name": "霜叶", "alias": "shuangye shuangxie sy sx 霜葉", @@ -2138,6 +2423,7 @@ }, { "id": "char_4124_iana", + "prof": "SPECIAL", "subProf": "dollkeeper", "name": "双月", "alias": "shuangyue sy 雙月", @@ -2146,6 +2432,7 @@ }, { "id": "char_437_mizuki", + "prof": "SPECIAL", "subProf": "stalker", "name": "水月", "alias": "shuiyue sy 水月", @@ -2154,6 +2441,7 @@ }, { "id": "char_263_skadi", + "prof": "WARRIOR", "subProf": "fearless", "name": "斯卡蒂", "alias": "sikadi siqiadi skd sqd 斯卡蒂", @@ -2162,6 +2450,7 @@ }, { "id": "token_10017_skadi2_dedant", + "prof": "TOKEN", "subProf": "notchar1", "name": "斯卡蒂的海嗣", "alias": "sikadidehaisi sikadidihaisi siqiadidehaisi siqiadidihaisi skddhs sqddhs 斯卡蒂的海嗣", @@ -2170,6 +2459,7 @@ }, { "id": "char_427_vigil", + "prof": "PIONEER", "subProf": "tactician", "name": "伺夜", "alias": "siye ciye sy cy 伺夜", @@ -2178,6 +2468,7 @@ }, { "id": "char_365_aprl", + "prof": "SNIPER", "subProf": "fastshot", "name": "四月", "alias": "siyue sy 四月", @@ -2186,6 +2477,7 @@ }, { "id": "char_440_pinecn", + "prof": "SNIPER", "subProf": "reaperrange", "name": "松果", "alias": "songguo sg 鬆果", @@ -2194,6 +2486,7 @@ }, { "id": "char_279_excu", + "prof": "SNIPER", "subProf": "reaperrange", "name": "送葬人", "alias": "songzangren szr 送葬人", @@ -2202,6 +2495,7 @@ }, { "id": "char_511_asnipe", + "prof": "SNIPER", "subProf": "fastshot", "name": "Stormeye", "alias": "Stormeye", @@ -2210,6 +2504,7 @@ }, { "id": "char_298_susuro", + "prof": "MEDIC", "subProf": "physician", "name": "苏苏洛", "alias": "susuluo ssl 蘇蘇洛", @@ -2218,6 +2513,7 @@ }, { "id": "char_245_cello", + "prof": "SUPPORT", "subProf": "ritualist", "name": "塑心", "alias": "suxin sx 塑心", @@ -2226,6 +2522,7 @@ }, { "id": "char_366_acdrop", + "prof": "SNIPER", "subProf": "closerange", "name": "酸糖", "alias": "suantang st 酸糖", @@ -2234,6 +2531,7 @@ }, { "id": "char_415_flint", + "prof": "WARRIOR", "subProf": "fighter", "name": "燧石", "alias": "suishi suidan ss sd 燧石", @@ -2242,6 +2540,7 @@ }, { "id": "char_4077_palico", + "prof": "SNIPER", "subProf": "bombarder", "name": "泰拉大陆调查团", "alias": "tailadalutiaochatuan tailadalutiaozhatuan tailadaludiaochatuan tailadaludiaozhatuan tailadaluzhouchatuan tailadaluzhouzhatuan tailadailutiaochatuan tailadailutiaozhatuan tailadailudiaochatuan tailadailudiaozhatuan tailadailuzhouchatuan tailadailuzhouzhatuan tailatailutiaochatuan tailatailutiaozhatuan tailatailudiaochatuan tailatailudiaozhatuan tailatailuzhouchatuan tailatailuzhouzhatuan tldltct tldltzt tldldct tldldzt tldlzct tldlzzt tltltct tltltzt tltldct tltldzt tltlzct tltlzzt 泰拉大陸調查團", @@ -2250,6 +2549,7 @@ }, { "id": "char_151_myrtle", + "prof": "PIONEER", "subProf": "bearer", "name": "桃金娘", "alias": "taojinniang tjn 桃金娘", @@ -2258,6 +2558,7 @@ }, { "id": "char_411_tomimi", + "prof": "CASTER", "subProf": "corecaster", "name": "特米米", "alias": "temimi tmm 特米米", @@ -2266,6 +2567,7 @@ }, { "id": "char_376_therex", + "prof": "SPECIAL", "subProf": "executor", "name": "THRM-EX", "alias": "THRM-EX", @@ -2274,6 +2576,7 @@ }, { "id": "char_2012_typhon", + "prof": "SNIPER", "subProf": "siegesniper", "name": "提丰", "alias": "tifeng difeng tf df 提豐", @@ -2282,6 +2585,7 @@ }, { "id": "char_166_skfire", + "prof": "CASTER", "subProf": "splashcaster", "name": "天火", "alias": "tianhuo th 天火", @@ -2290,6 +2594,7 @@ }, { "id": "char_181_flower", + "prof": "MEDIC", "subProf": "ringhealer", "name": "调香师", "alias": "tiaoxiangshi diaoxiangshi zhouxiangshi txs dxs zxs 調香師", @@ -2298,6 +2603,7 @@ }, { "id": "token_10027_ironmn_pile3", + "prof": "TOKEN", "subProf": "notchar1", "name": "铁钳号·原型机", "alias": "tieqianhao·yuanxingji tqh·yxj 鐵鉗號·原型機", @@ -2306,6 +2612,7 @@ }, { "id": "char_510_amedic", + "prof": "MEDIC", "subProf": "physician", "name": "Touch", "alias": "Touch", @@ -2314,6 +2621,7 @@ }, { "id": "char_402_tuye", + "prof": "MEDIC", "subProf": "physician", "name": "图耶", "alias": "tuye ty 圖耶", @@ -2322,6 +2630,7 @@ }, { "id": "char_112_siege", + "prof": "PIONEER", "subProf": "pioneer", "name": "推进之王", "alias": "tuijinzhiwang tjzw 推進之王", @@ -2330,6 +2639,7 @@ }, { "id": "char_4091_ulika", + "prof": "SUPPORT", "subProf": "bard", "name": "U-Official", "alias": "U-Official", @@ -2338,6 +2648,7 @@ }, { "id": "char_113_cqbw", + "prof": "SNIPER", "subProf": "aoesniper", "name": "W", "alias": "W", @@ -2346,6 +2657,7 @@ }, { "id": "char_4119_wanqin", + "prof": "PIONEER", "subProf": "bearer", "name": "万顷", "alias": "wanqing moqing wq mq 萬頃", @@ -2354,6 +2666,7 @@ }, { "id": "char_261_sddrag", + "prof": "PIONEER", "subProf": "charger", "name": "苇草", "alias": "weicao wc 葦草", @@ -2362,6 +2675,7 @@ }, { "id": "char_4107_vrdant", + "prof": "SPECIAL", "subProf": "dollkeeper", "name": "维荻", "alias": "weidi wd 維荻", @@ -2370,6 +2684,7 @@ }, { "id": "char_275_breeze", + "prof": "MEDIC", "subProf": "ringhealer", "name": "微风", "alias": "weifeng wf 微風", @@ -2378,6 +2693,7 @@ }, { "id": "char_1035_wisdel", + "prof": "SNIPER", "subProf": "bombarder", "name": "维什戴尔", "alias": "weishidaier weishendaier wsde 維什戴爾", @@ -2386,6 +2702,7 @@ }, { "id": "char_4098_vvana", + "prof": "WARRIOR", "subProf": "artsfghter", "name": "薇薇安娜", "alias": "weiweianna weiweiannuo wwan 薇薇安娜", @@ -2394,6 +2711,7 @@ }, { "id": "char_400_weedy", + "prof": "SPECIAL", "subProf": "pusher", "name": "温蒂", "alias": "wendi wd 溫蒂", @@ -2402,6 +2720,7 @@ }, { "id": "char_4081_warmy", + "prof": "CASTER", "subProf": "primcaster", "name": "温米", "alias": "wenmi wm 溫米", @@ -2410,6 +2729,7 @@ }, { "id": "char_4145_ulpia", + "prof": "WARRIOR", "subProf": "crusher", "name": "乌尔比安", "alias": "wuerbian weba 烏爾比安", @@ -2418,6 +2738,7 @@ }, { "id": "char_254_vodfox", + "prof": "SUPPORT", "subProf": "underminer", "name": "巫恋", "alias": "wulian wl 巫戀", @@ -2426,6 +2747,7 @@ }, { "id": "char_455_nothin", + "prof": "SPECIAL", "subProf": "merchant", "name": "乌有", "alias": "wuyou wy 烏有", @@ -2434,6 +2756,7 @@ }, { "id": "char_2015_dusk", + "prof": "CASTER", "subProf": "splashcaster", "name": "夕", "alias": "xi x 夕", @@ -2442,6 +2765,7 @@ }, { "id": "char_348_ceylon", + "prof": "MEDIC", "subProf": "healer", "name": "锡兰", "alias": "xilan xl 錫蘭", @@ -2450,6 +2774,7 @@ }, { "id": "char_336_folivo", + "prof": "SUPPORT", "subProf": "summoner", "name": "稀音", "alias": "xiyin xy 稀音", @@ -2458,6 +2783,7 @@ }, { "id": "char_423_blemsh", + "prof": "TANK", "subProf": "guardian", "name": "瑕光", "alias": "xiaguang xg 瑕光", @@ -2466,6 +2792,7 @@ }, { "id": "char_492_quercu", + "prof": "SUPPORT", "subProf": "blessing", "name": "夏栎", "alias": "xiali xiayue xl xy 夏櫟", @@ -2474,6 +2801,7 @@ }, { "id": "token_10031_swire2_gdtrap", + "prof": "TOKEN", "subProf": "notchar1", "name": "香槟炸弹", "alias": "xiangbinzhadan xiangbinzhatan xiangbingzhadan xiangbingzhatan xbzd xbzt 香檳炸彈", @@ -2482,6 +2810,7 @@ }, { "id": "char_240_wyvern", + "prof": "PIONEER", "subProf": "pioneer", "name": "香草", "alias": "xiangcao xc 香草", @@ -2490,6 +2819,7 @@ }, { "id": "char_497_ctable", + "prof": "PIONEER", "subProf": "agent", "name": "晓歌", "alias": "xiaoge xg 曉歌", @@ -2498,6 +2828,7 @@ }, { "id": "char_4122_grabds", + "prof": "SUPPORT", "subProf": "slower", "name": "小满", "alias": "xiaoman xm 小滿", @@ -2506,6 +2837,7 @@ }, { "id": "char_274_astesi", + "prof": "WARRIOR", "subProf": "artsfghter", "name": "星极", "alias": "xingji xj 星極", @@ -2514,6 +2846,7 @@ }, { "id": "char_4105_almond", + "prof": "SPECIAL", "subProf": "hookmaster", "name": "杏仁", "alias": "xingren xr 杏仁", @@ -2522,6 +2855,7 @@ }, { "id": "char_136_hsguma", + "prof": "TANK", "subProf": "protector", "name": "星熊", "alias": "xingxiong xx 星熊", @@ -2530,6 +2864,7 @@ }, { "id": "char_135_halo", + "prof": "CASTER", "subProf": "chain", "name": "星源", "alias": "xingyuan xy 星源", @@ -2538,6 +2873,7 @@ }, { "id": "char_491_humus", + "prof": "WARRIOR", "subProf": "reaper", "name": "休谟斯", "alias": "xiumosi xumosi xms 休謨斯", @@ -2546,6 +2882,7 @@ }, { "id": "char_436_whispr", + "prof": "MEDIC", "subProf": "healer", "name": "絮雨", "alias": "xuyu xy 絮雨", @@ -2554,6 +2891,7 @@ }, { "id": "char_466_qanik", + "prof": "CASTER", "subProf": "corecaster", "name": "雪绒", "alias": "xuerong xr 雪絨", @@ -2562,6 +2900,7 @@ }, { "id": "char_383_snsant", + "prof": "SPECIAL", "subProf": "hookmaster", "name": "雪雉", "alias": "xuezhi xz 雪雉", @@ -2570,6 +2909,7 @@ }, { "id": "char_503_rang", + "prof": "SNIPER", "subProf": "fastshot", "name": "巡林者", "alias": "xunlinzhe xlz 巡林者", @@ -2578,6 +2918,7 @@ }, { "id": "char_198_blackd", + "prof": "PIONEER", "subProf": "pioneer", "name": "讯使", "alias": "xunshi xs 訊使", @@ -2586,6 +2927,7 @@ }, { "id": "char_173_slchan", + "prof": "SPECIAL", "subProf": "hookmaster", "name": "崖心", "alias": "yaxin yx 崖心", @@ -2594,6 +2936,7 @@ }, { "id": "char_345_folnic", + "prof": "MEDIC", "subProf": "physician", "name": "亚叶", "alias": "yaye yaxie yy yx 亞葉", @@ -2602,6 +2945,7 @@ }, { "id": "char_337_utage", + "prof": "WARRIOR", "subProf": "musha", "name": "宴", "alias": "yan y 宴", @@ -2610,6 +2954,7 @@ }, { "id": "char_131_flameb", + "prof": "WARRIOR", "subProf": "fearless", "name": "炎客", "alias": "yanke yk 炎客", @@ -2618,6 +2963,7 @@ }, { "id": "char_121_lava", + "prof": "CASTER", "subProf": "splashcaster", "name": "炎熔", "alias": "yanrong yr 炎熔", @@ -2626,6 +2972,7 @@ }, { "id": "char_420_flamtl", + "prof": "PIONEER", "subProf": "pioneer", "name": "焰尾", "alias": "yanwei yanyi yw yy 焰尾", @@ -2634,6 +2981,7 @@ }, { "id": "char_1020_reed2", + "prof": "MEDIC", "subProf": "incantationmedic", "name": "焰影苇草", "alias": "yanyingweicao yywc 焰影葦草", @@ -2642,6 +2990,7 @@ }, { "id": "char_1011_lava2", + "prof": "CASTER", "subProf": "splashcaster", "name": "炎狱炎熔", "alias": "yanyuyanrong yyyr 炎獄炎熔", @@ -2650,6 +2999,7 @@ }, { "id": "char_464_cement", + "prof": "TANK", "subProf": "duelist", "name": "洋灰", "alias": "yanghui yh 洋灰", @@ -2658,6 +3008,7 @@ }, { "id": "char_1014_nearl2", + "prof": "WARRIOR", "subProf": "fearless", "name": "耀骑士临光", "alias": "yaoqishilinguang yqslg 耀騎士臨光", @@ -2666,6 +3017,7 @@ }, { "id": "char_476_blkngt", + "prof": "PIONEER", "subProf": "tactician", "name": "夜半", "alias": "yeban yb 夜半", @@ -2674,6 +3026,7 @@ }, { "id": "char_502_nblade", + "prof": "PIONEER", "subProf": "pioneer", "name": "夜刀", "alias": "yedao yd 夜刀", @@ -2682,6 +3035,7 @@ }, { "id": "token_10029_slent2_protrb", + "prof": "TOKEN", "subProf": "notchar1", "name": "夜灯", "alias": "yedeng yd 夜燈", @@ -2690,6 +3044,7 @@ }, { "id": "char_4013_kjera", + "prof": "CASTER", "subProf": "funnel", "name": "耶拉", "alias": "yela yl 耶拉", @@ -2698,6 +3053,7 @@ }, { "id": "char_164_nightm", + "prof": "CASTER", "subProf": "corecaster", "name": "夜魔", "alias": "yemo ym 夜魔", @@ -2706,6 +3062,7 @@ }, { "id": "char_141_nights", + "prof": "CASTER", "subProf": "corecaster", "name": "夜烟", "alias": "yeyan yy 夜煙", @@ -2714,6 +3071,7 @@ }, { "id": "char_179_cgbird", + "prof": "MEDIC", "subProf": "ringhealer", "name": "夜莺", "alias": "yeying yy 夜鶯", @@ -2722,6 +3080,7 @@ }, { "id": "char_496_wildmn", + "prof": "PIONEER", "subProf": "charger", "name": "野鬃", "alias": "yezong yz 野鬃", @@ -2730,6 +3089,7 @@ }, { "id": "token_10010_folivo_car", + "prof": "TOKEN", "subProf": "notchar1", "name": "移动摄影器", "alias": "yidongsheyingqi yidongnieyingqi ydsyq ydnyq 移動攝影器", @@ -2738,6 +3098,7 @@ }, { "id": "char_134_ifrit", + "prof": "CASTER", "subProf": "blastcaster", "name": "伊芙利特", "alias": "yifulite yflt 伊芙利特", @@ -2746,6 +3107,7 @@ }, { "id": "char_472_pasngr", + "prof": "CASTER", "subProf": "chain", "name": "异客", "alias": "yike yk 異客", @@ -2754,6 +3116,7 @@ }, { "id": "token_10000_silent_healrb", + "prof": "TOKEN", "subProf": "notchar1", "name": "医疗探机", "alias": "yiliaotanji yltj 醫療探機", @@ -2762,6 +3125,7 @@ }, { "id": "char_4087_ines", + "prof": "PIONEER", "subProf": "agent", "name": "伊内丝", "alias": "yineisi yinasi yns 伊內絲", @@ -2770,6 +3134,7 @@ }, { "id": "char_355_ethan", + "prof": "SPECIAL", "subProf": "stalker", "name": "伊桑", "alias": "yisang ys 伊桑", @@ -2778,6 +3143,7 @@ }, { "id": "char_4125_rdoc", + "prof": "WARRIOR", "subProf": "instructor", "name": "医生", "alias": "yisheng ys 醫生", @@ -2786,6 +3152,7 @@ }, { "id": "char_172_svrash", + "prof": "WARRIOR", "subProf": "lord", "name": "银灰", "alias": "yinhui yh 銀灰", @@ -2794,6 +3161,7 @@ }, { "id": "char_155_tiger", + "prof": "WARRIOR", "subProf": "fighter", "name": "因陀罗", "alias": "yintuoluo ytl 因陀羅", @@ -2802,6 +3170,7 @@ }, { "id": "char_498_inside", + "prof": "SNIPER", "subProf": "fastshot", "name": "隐现", "alias": "yinxian yx 隱現", @@ -2810,14 +3179,25 @@ }, { "id": "token_10016_rfrost_mine", + "prof": "TOKEN", "subProf": "notchar1", "name": "迎宾踏垫", "alias": "yingbintadian ybtd 迎賓踏墊", "rarity": 0, "alt_name": "Welcome Mat" }, + { + "id": "token_10037_mitm_trshrb", + "prof": "TOKEN", + "subProf": "notchar1", + "name": "樱桃三号", + "alias": "yingtaosanhao ytsh 櫻桃三號", + "rarity": 0, + "alt_name": "Cherry-3" + }, { "id": "char_143_ghost", + "prof": "WARRIOR", "subProf": "centurion", "name": "幽灵鲨", "alias": "youlingsha yls 幽靈鯊", @@ -2826,6 +3206,7 @@ }, { "id": "char_506_rmedic", + "prof": "MEDIC", "subProf": "physician", "name": "预备干员-后勤", "alias": "yubeiganyuan-houqin yubeiganyun-houqin ybgy-hq 預備幹員-後勤", @@ -2834,6 +3215,7 @@ }, { "id": "char_504_rguard", + "prof": "PIONEER", "subProf": "pioneer", "name": "预备干员-近战", "alias": "yubeiganyuan-jinzhan yubeiganyun-jinzhan ybgy-jz 預備幹員-近戰", @@ -2842,6 +3224,7 @@ }, { "id": "char_507_rsnipe", + "prof": "SNIPER", "subProf": "fastshot", "name": "预备干员-狙击", "alias": "yubeiganyuan-juji yubeiganyun-juji ybgy-jj 預備幹員-狙擊", @@ -2850,6 +3233,7 @@ }, { "id": "char_505_rcast", + "prof": "CASTER", "subProf": "corecaster", "name": "预备干员-术师", "alias": "yubeiganyuan-shushi yubeiganyuan-zhushi yubeiganyun-shushi yubeiganyun-zhushi ybgy-ss ybgy-zs 預備幹員-術師", @@ -2858,6 +3242,7 @@ }, { "id": "char_514_rdfend", + "prof": "TANK", "subProf": "protector", "name": "预备干员-重装", "alias": "yubeiganyuan-zhongzhuang yubeiganyuan-chongzhuang yubeiganyun-zhongzhuang yubeiganyun-chongzhuang ybgy-zz ybgy-cz 預備幹員-重裝", @@ -2866,6 +3251,7 @@ }, { "id": "char_513_apionr", + "prof": "PIONEER", "subProf": "pioneer", "name": "郁金香", "alias": "yujinxiang yjx 鬱金香", @@ -2874,6 +3260,7 @@ }, { "id": "char_421_crow", + "prof": "WARRIOR", "subProf": "reaper", "name": "羽毛笔", "alias": "yumaobi ymb 羽毛筆", @@ -2882,6 +3269,7 @@ }, { "id": "char_109_fmout", + "prof": "CASTER", "subProf": "splashcaster", "name": "远山", "alias": "yuanshan ys 遠山", @@ -2890,6 +3278,7 @@ }, { "id": "char_430_fartth", + "prof": "SNIPER", "subProf": "longrange", "name": "远牙", "alias": "yuanya yy 遠牙", @@ -2898,6 +3287,7 @@ }, { "id": "char_343_tknogi", + "prof": "SUPPORT", "subProf": "blessing", "name": "月禾", "alias": "yuehe yh 月禾", @@ -2906,6 +3296,7 @@ }, { "id": "char_283_midn", + "prof": "WARRIOR", "subProf": "lord", "name": "月见夜", "alias": "yuejianye yuexianye yjy yxy 月見夜", @@ -2914,6 +3305,7 @@ }, { "id": "char_4100_caper", + "prof": "SNIPER", "subProf": "loopshooter", "name": "跃跃", "alias": "yueyue yy 躍躍", @@ -2922,6 +3314,7 @@ }, { "id": "char_219_meteo", + "prof": "SNIPER", "subProf": "aoesniper", "name": "陨星", "alias": "yunxing yx 隕星", @@ -2930,6 +3323,7 @@ }, { "id": "char_197_poca", + "prof": "SNIPER", "subProf": "siegesniper", "name": "早露", "alias": "zaolou zaolu zl 早露", @@ -2938,6 +3332,7 @@ }, { "id": "char_459_tachak", + "prof": "WARRIOR", "subProf": "sword", "name": "战车", "alias": "zhanche zhanju zc zj 戰車", @@ -2946,6 +3341,7 @@ }, { "id": "char_499_kaitou", + "prof": "CASTER", "subProf": "primcaster", "name": "折光", "alias": "zheguang sheguang zg sg 折光", @@ -2954,6 +3350,7 @@ }, { "id": "char_195_glassb", + "prof": "SUPPORT", "subProf": "slower", "name": "真理", "alias": "zhenli zl 真理", @@ -2962,6 +3359,7 @@ }, { "id": "char_4000_jnight", + "prof": "SNIPER", "subProf": "fastshot", "name": "正义骑士号", "alias": "zhengyiqishihao zyqsh 正義騎士號", @@ -2970,6 +3368,7 @@ }, { "id": "char_4054_malist", + "prof": "CASTER", "subProf": "funnel", "name": "至简", "alias": "zhijian zj 至簡", @@ -2978,6 +3377,7 @@ }, { "id": "token_10022_kazema_shadow", + "prof": "TOKEN", "subProf": "notchar1", "name": "纸偶", "alias": "zhiou zo 紙偶", @@ -2986,6 +3386,7 @@ }, { "id": "char_4011_lessng", + "prof": "WARRIOR", "subProf": "fearless", "name": "止颂", "alias": "zhisong zs 止頌", @@ -2994,6 +3395,7 @@ }, { "id": "char_2024_chyue", + "prof": "WARRIOR", "subProf": "fighter", "name": "重岳", "alias": "zhongyue chongyue zy cy 重嶽", @@ -3002,6 +3404,7 @@ }, { "id": "char_333_sidero", + "prof": "WARRIOR", "subProf": "artsfghter", "name": "铸铁", "alias": "zhutie zt 鑄鐵", @@ -3010,6 +3413,7 @@ }, { "id": "char_1024_hbisc2", + "prof": "MEDIC", "subProf": "incantationmedic", "name": "濯尘芙蓉", "alias": "zhuochenfurong zhaochenfurong zcfr 濯塵芙蓉", @@ -3018,6 +3422,7 @@ }, { "id": "char_1012_skadi2", + "prof": "SUPPORT", "subProf": "bard", "name": "浊心斯卡蒂", "alias": "zhuoxinsikadi zhuoxinsiqiadi zxskd zxsqd 濁心斯卡蒂", @@ -3026,6 +3431,7 @@ }, { "id": "char_278_orchid", + "prof": "SUPPORT", "subProf": "slower", "name": "梓兰", "alias": "zilan zl 梓蘭", @@ -3034,6 +3440,7 @@ }, { "id": "char_4014_lunacu", + "prof": "SNIPER", "subProf": "longrange", "name": "子月", "alias": "ziyue zy 子月", @@ -3042,6 +3449,7 @@ }, { "id": "token_10006_vodfox_doll", + "prof": "TOKEN", "subProf": "notchar1", "name": "诅咒娃娃", "alias": "zuzhouwawa zzww 詛咒娃娃", @@ -3050,6 +3458,7 @@ }, { "id": "char_4121_zuole", + "prof": "WARRIOR", "subProf": "musha", "name": "左乐", "alias": "zuole zuoyue zuoyao zuolao zl zy 左樂", diff --git a/src/models/operator.ts b/src/models/operator.ts index 0f42746..2fa1483 100644 --- a/src/models/operator.ts +++ b/src/models/operator.ts @@ -7,26 +7,17 @@ import { DetailedSelectItem, isChoice, } from '../components/editor/DetailedSelect' +import { OPERATORS, PROFESSIONS } from '../models/generated/operators.json' -export { OPERATORS, PROFESSIONS } from '../models/generated/operators.json' +export { OPERATORS, PROFESSIONS } const defaultSkillUsage = CopilotDocV1.SkillUsageType.None export type DetailedOperatorSkillUsage = DetailedSelectChoice -export interface OperatorInfo { - id: string - name: string - subProf: string - alias: string - alt_name: string -} +export type OperatorInfo = (typeof OPERATORS)[number] -export interface Profession { - id: string - name: string - sub?: Profession[] -} +export type Profession = (typeof PROFESSIONS)[number] export const operatorSkillUsages: readonly DetailedSelectItem[] = [ { From d43af6879e9335b19076d27dbf595a634d56f46b Mon Sep 17 00:00:00 2001 From: GeorgeZhang2035 Date: Tue, 16 Jul 2024 15:18:11 +0800 Subject: [PATCH 12/50] fix: bug fixed! --- .../editor/operator/EditorSheet.tsx | 11 +--- .../editor/operator/sheet/SheetOperator.tsx | 66 ++----------------- .../operator/sheet/SheetOperatorItem.tsx | 7 +- .../sheetOperator/ProfClassification.tsx | 36 ++++++---- 4 files changed, 39 insertions(+), 81 deletions(-) diff --git a/src/components/editor/operator/EditorSheet.tsx b/src/components/editor/operator/EditorSheet.tsx index d1be5f6..015ac89 100644 --- a/src/components/editor/operator/EditorSheet.tsx +++ b/src/components/editor/operator/EditorSheet.tsx @@ -5,15 +5,8 @@ import { FC, useState } from 'react' import { CopilotDocV1 } from 'models/copilot.schema' import { SheetGroupContainer } from './sheet/SheetGroup' -import { - SheetOperatorContainer, - SheetOperatorProps, -} from './sheet/SheetOperator' -import { - SheetContextValue, - SheetProvider, - SheetProviderProp, -} from './sheet/SheetProvider' +import { SheetOperatorContainer } from './sheet/SheetOperator' +import { SheetContextValue, SheetProvider } from './sheet/SheetProvider' type EditorSheetProps = SheetContextValue export type Group = CopilotDocV1.Group diff --git a/src/components/editor/operator/sheet/SheetOperator.tsx b/src/components/editor/operator/sheet/SheetOperator.tsx index 3027c53..1fdf9b1 100644 --- a/src/components/editor/operator/sheet/SheetOperator.tsx +++ b/src/components/editor/operator/sheet/SheetOperator.tsx @@ -26,12 +26,6 @@ import { SheetOperatorItem } from './sheetOperator/SheetOperatorItem' export interface SheetOperatorProps {} -export interface OperatorModifyProps { - operatorPinHandle?: (value: Operator) => void - operatorSelectHandle?: (value: string) => void - // operatorSkillHandle?: (value: Operator) => void -} - // const defaultProf = [ // { // id: 'all', @@ -67,58 +61,14 @@ const paginationSize = 60 // ).slice(Math.min(...OPERATORS.map(({ rarity }) => rarity))) const SheetOperator: FC = () => { - // const { submitOperator, existedOperators, removeOperator, existedGroups } = - // useSheet() const operatorScrollRef = useRef(null) - const [activeProf, setActiveProf] = useState< - ProfClassificationProp['activeProf'] - >([DEFAULTPROFID.ALL, DEFAULTSUBPROFID.ALL]) - - // const [selectedProf, setSelectedProf] = useState(formattedProfessions[0]) - // const [selectedSubProf, setSelectedSubProf] = useState(defaultSubProf[0]) - // const [operatorRarity, setOperatorRarity] = useState(defaultRarityFilter) + const [profFilter, setProfFilter] = useState< + ProfClassificationProp['profFilter'] + >({ + selectedProf: [DEFAULTPROFID.ALL, DEFAULTSUBPROFID.ALL], + }) const [rarityReverse, setRarityReverse] = useState(false) - // const favOperators = useAtomValue(favOperatorAtom) - - // const [formattedSubProfessions, operatorsGroupedByProf] = useMemo( - // () => [ - // // handle customize operators - // [...defaultSubProf, ...(selectedProf.sub || [])], - // [ - // ...existedOperators - // .filter((item) => !OPERATORS.find(({ name }) => name === item.name)) - // .map(({ name }) => { - // return { - // name, - // subProf: '', - // rarity: 0, - // } - // }), - // ...OPERATORS, - // ].filter((item) => { - // if (selectedProf.id === defaultProf[0].id) return true - // if (selectedProf.id === defaultProf[1].id) - // return !!favOperators.find(({ name }) => name === item.name) - // else if (selectedProf.id === defaultProf[2].id) { - // return item.subProf === 'notchar1' || !item.subProf - // } else return !!selectedProf.sub?.find((op) => op.id === item.subProf) - // }), - // ], - // [selectedProf.sub, selectedProf.id, existedOperators, favOperators], - // ) - - // const checkOperatorSelected = useCallback( - // (target: string) => { - // if (existedOperators.find((item) => item.name === target)) return true - // else - // return !!existedGroups - // .map((item) => item.opers) - // .flat() - // .find((item) => item?.name === target) - // }, - // [existedOperators, existedGroups], - // ) // const getOperatorRarity = (target: string) => // operatorsGroupedByProf.find((item) => item.name === target)!.rarity @@ -309,9 +259,7 @@ const SheetOperator: FC = () => { //
    // ) - const operatorsAfterFiltered = useOperatorAfterFiltered({ - selectedProf: activeProf, - }) + const operatorsAfterFiltered = useOperatorAfterFiltered(profFilter) console.log(operatorsAfterFiltered) @@ -343,7 +291,7 @@ const SheetOperator: FC = () => { )}
    {/* {ProfSelect} */} - + ) diff --git a/src/components/editor/operator/sheet/SheetOperatorItem.tsx b/src/components/editor/operator/sheet/SheetOperatorItem.tsx index 19212c1..03e095a 100644 --- a/src/components/editor/operator/sheet/SheetOperatorItem.tsx +++ b/src/components/editor/operator/sheet/SheetOperatorItem.tsx @@ -6,10 +6,15 @@ import { FC } from 'react' import { OperatorAvatar } from '../EditorOperator' import { Operator } from '../EditorSheet' -import { OperatorModifyProps } from './SheetOperator' import { SkillAboutProps, SkillAboutTrigger } from './SheetOperatorSkillAbout' import { useSheet } from './SheetProvider' +export interface OperatorModifyProps { + operatorPinHandle?: (value: Operator) => void + operatorSelectHandle?: (value: string) => void + // operatorSkillHandle?: (value: Operator) => void +} + export interface OperatorItemPorps extends CardProps, SkillAboutProps { name: string selected: boolean diff --git a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx index 9f50296..f466251 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx @@ -12,7 +12,11 @@ import { import { PROFESSIONS } from 'models/operator' -import { DEFAULTPROFID, DEFAULTSUBPROFID, ProfFilter } from './OperatorFilter' +import { + DEFAULTPROFID, + DEFAULTSUBPROFID, + ProfFilter as ProfFilterOuter, +} from './OperatorFilter' const formattedProfessions = [ { @@ -33,25 +37,25 @@ const formattedProfessions = [ }, ] -type ActiveProf = ProfFilter['selectedProf'] +type ProfFilter = ProfFilterOuter export interface ProfClassificationProp { - activeProf: ActiveProf - setActiveProf: Dispatch> + profFilter: ProfFilter + setProfFilter: Dispatch> } export const ProfClassification: FC = ({ - activeProf, - setActiveProf, + profFilter: { selectedProf }, + setProfFilter, }) => { const subProfs = useMemo(() => { return [ { id: DEFAULTSUBPROFID.ALL, name: '全部' }, { id: DEFAULTSUBPROFID.SELECTED, name: '已选择' }, - ...(formattedProfessions.find(({ id }) => id === activeProf[0])?.sub || + ...(formattedProfessions.find(({ id }) => id === selectedProf[0])?.sub || []), ] - }, [activeProf]) + }, [selectedProf]) // const ActionList = ( //
    @@ -107,10 +111,13 @@ export const ProfClassification: FC = ({ key={id} profId={id} name={name} - selected={activeProf.includes(id)} + selected={selectedProf.includes(id)} onProfClick={() => { console.log('111', id) - setActiveProf([id, DEFAULTSUBPROFID.ALL]) + setProfFilter((prev) => ({ + ...prev, + selectedProf: [id, DEFAULTSUBPROFID.ALL], + })) }} /> ))} @@ -123,10 +130,15 @@ export const ProfClassification: FC = ({

    3 && '!text-base', )} - onClick={() => setActiveProf((prev) => [prev[0], id])} + onClick={() => + setProfFilter(({ selectedProf, ...rest }) => ({ + selectedProf: [selectedProf[0], id], + ...rest, + })) + } > {name}

    From b621f6d4026979f914085f6cb1568d6a1733a94a Mon Sep 17 00:00:00 2001 From: GeorgeZhang2035 Date: Tue, 16 Jul 2024 17:58:53 +0800 Subject: [PATCH 13/50] perf: part of pagination refacted --- .../editor/operator/sheet/SheetOperator.tsx | 220 +++--------------- .../sheetOperator/ProfClassification.tsx | 11 +- .../operator/sheet/sheetOperator/ShowMore.tsx | 53 +++++ .../operator/sheet/sheetOperator/ToolBox.tsx | 0 ...eratorFilter.tsx => useOperatorFilter.tsx} | 30 ++- 5 files changed, 123 insertions(+), 191 deletions(-) create mode 100644 src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx create mode 100644 src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx rename src/components/editor/operator/sheet/sheetOperator/{OperatorFilter.tsx => useOperatorFilter.tsx} (81%) diff --git a/src/components/editor/operator/sheet/SheetOperator.tsx b/src/components/editor/operator/sheet/SheetOperator.tsx index 1fdf9b1..127bb6e 100644 --- a/src/components/editor/operator/sheet/SheetOperator.tsx +++ b/src/components/editor/operator/sheet/SheetOperator.tsx @@ -1,60 +1,21 @@ -import { Button, Divider, H4, H5, H6 } from '@blueprintjs/core' -import { Popover2 } from '@blueprintjs/popover2' -import { POPOVER2_DISMISS } from '@blueprintjs/popover2/lib/esm/classes' +import { FC, useEffect, useRef, useState } from 'react' -import clsx from 'clsx' -import { useAtomValue } from 'jotai' -import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' - -import { OPERATORS, PROFESSIONS } from 'models/operator' -import { favOperatorAtom } from 'store/useFavOperators' - -import { Operator } from '../EditorSheet' import { SheetContainerSkeleton } from './SheetContainerSkeleton' import { OperatorNoData } from './SheetNoneData' -import { useSheet } from './SheetProvider' -import { - DEFAULTPROFID, - DEFAULTSUBPROFID, - useOperatorAfterFiltered, -} from './sheetOperator/OperatorFilter' import { ProfClassification, ProfClassificationProp, + defaultProfFilter, } from './sheetOperator/ProfClassification' import { SheetOperatorItem } from './sheetOperator/SheetOperatorItem' +import { ShowMore, defaultPagination } from './sheetOperator/ShowMore' +import { + PaginationFilter, + useOperatorAfterFiltered, +} from './sheetOperator/useOperatorFilter' export interface SheetOperatorProps {} -// const defaultProf = [ -// { -// id: 'all', -// name: '全部', -// sub: [], -// }, -// { -// id: 'fav', -// name: '收藏', -// sub: [], -// }, -// { -// id: 'others', -// name: '其它', -// sub: [], -// }, -// ] - -// const defaultSubProf = [ -// { id: 'allSubProf', name: '全部' }, -// { id: 'selected', name: '已选择' }, -// ] - -// const formattedProfessions = [ -// ...defaultProf.slice(0, defaultProf.length - 1), -// ...PROFESSIONS, -// ...defaultProf.slice(defaultProf.length - 1), -// ] - const paginationSize = 60 // const defaultRarityFilter = Array.from( // new Array(Math.max(...OPERATORS.map(({ rarity }) => rarity)) + 1).keys(), @@ -63,60 +24,15 @@ const paginationSize = 60 const SheetOperator: FC = () => { const operatorScrollRef = useRef(null) - const [profFilter, setProfFilter] = useState< - ProfClassificationProp['profFilter'] - >({ - selectedProf: [DEFAULTPROFID.ALL, DEFAULTSUBPROFID.ALL], - }) - const [rarityReverse, setRarityReverse] = useState(false) + const [profFilter, setProfFilter] = + useState(defaultProfFilter) // const getOperatorRarity = (target: string) => // operatorsGroupedByProf.find((item) => item.name === target)!.rarity - // const operatorsGroupedBySubProf = useMemo(() => { - // let result: Operator[] = [] - // if (selectedSubProf.id === 'all') result = operatorsGroupedByProf - // else if (selectedSubProf.id === 'selected') - // result = operatorsGroupedByProf.filter((item) => - // checkOperatorSelected(item.name), - // ) - // else - // result = operatorsGroupedByProf.filter( - // (item) => item.subProf === selectedSubProf.id, - // ) - - // result = result - // .filter(({ name }) => { - // return ( - // operatorRarity.findIndex( - // (rarity) => getOperatorRarity(name) === rarity, - // ) !== -1 - // ) - // }) - // .sort( - // ({ name: aName }, { name: bName }) => - // getOperatorRarity(bName) - getOperatorRarity(aName), - // ) - - // return rarityReverse ? result.reverse() : result - // }, [ - // selectedSubProf, - // operatorsGroupedByProf, - // checkOperatorSelected, - // operatorRarity, - // rarityReverse, - // getOperatorRarity, - // ]) - // pagination about via frontened - const [pageIndex, setPageIndex] = useState(0) - const lastIndex = (pageIndex + 1) * paginationSize - const backToTop = lastIndex > paginationSize - - const resetPaginationState = () => { - setPageIndex(0) - operatorScrollRef?.current?.scrollIntoView() - } + const [pagination, setPagination] = + useState(defaultPagination) // useEffect(resetPaginationState, [selectedProf, selectedSubProf]) @@ -183,85 +99,27 @@ const SheetOperator: FC = () => { // console.log(selectedProf, selectedSubProf) - // const ShowMoreButton = ( - //
    - // {lastIndex >= operatorsGroupedBySubProf.length ? ( - // <> - //
    已经展示全部干员了({operatorsGroupedBySubProf.length})
    - // {operatorsGroupedBySubProf.length > paginationSize && ( - //
    - // 收起 - //
    - // )} - // - // ) : ( - //
    setPageIndex(pageIndex + 1)} - // > - // 显示更多干员(剩余{operatorsGroupedBySubProf.length - lastIndex}) - //
    - // )} - //
    - // ) + const toTop = () => { + operatorScrollRef?.current?.scrollIntoView() + } - // const ProfSelect = ( - //
    - //
    - // {formattedProfessions.map((prof) => ( - //
    { - // setSelectedProf(prof) - // setSelectedSubProf(defaultSubProf[0]) - // }} - // role="presentation" - // > - // ( - //
    {prof.name}
    - // )} - // title={prof.name} - // /> - // {prof.id === selectedProf.id && ( - //
    - // )} - //
    - // ))} - //
    - // - //
    - //
    - // {formattedSubProfessions?.map((subProf) => ( - //

    3 && '!text-base', - // )} - // onClick={() => setSelectedSubProf(subProf)} - // > - // {subProf.name} - //

    - // ))} - //
    - // {ActionList} - //
    - //
    - // ) + const { + data: operatorsAfterFiltered, + meta: { pagination: paginationAfterFiltered }, + } = useOperatorAfterFiltered(profFilter, pagination) - const operatorsAfterFiltered = useOperatorAfterFiltered(profFilter) + // prof listener + useEffect(() => { + setPagination(defaultPagination) + toTop() + }, [profFilter]) - console.log(operatorsAfterFiltered) + // pagination listener + useEffect(() => { + if (paginationAfterFiltered.total === pagination.total) return + setPagination(paginationAfterFiltered) + if (paginationAfterFiltered.current === 1) toTop() + }, [pagination.total, paginationAfterFiltered]) return ( <> @@ -273,18 +131,16 @@ const SheetOperator: FC = () => { key="operatorContainer" className="flex flex-wrap items-start content-start overscroll-contain relative" > - {operatorsAfterFiltered - .slice(0, lastIndex) - .map(({ name }, index) => ( -
    - -
    - ))} + {operatorsAfterFiltered.map(({ name }, index) => ( +
    + +
    + ))}
    - {/* {ShowMoreButton} */} + ) : ( OperatorNoData diff --git a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx index f466251..be1232f 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx @@ -16,7 +16,7 @@ import { DEFAULTPROFID, DEFAULTSUBPROFID, ProfFilter as ProfFilterOuter, -} from './OperatorFilter' +} from './useOperatorFilter' const formattedProfessions = [ { @@ -39,6 +39,10 @@ const formattedProfessions = [ type ProfFilter = ProfFilterOuter +export const defaultProfFilter: ProfFilter = { + selectedProf: [DEFAULTPROFID.ALL, DEFAULTSUBPROFID.ALL], +} + export interface ProfClassificationProp { profFilter: ProfFilter setProfFilter: Dispatch> @@ -112,13 +116,12 @@ export const ProfClassification: FC = ({ profId={id} name={name} selected={selectedProf.includes(id)} - onProfClick={() => { - console.log('111', id) + onProfClick={() => setProfFilter((prev) => ({ ...prev, selectedProf: [id, DEFAULTSUBPROFID.ALL], })) - }} + } /> ))} diff --git a/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx b/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx new file mode 100644 index 0000000..036c612 --- /dev/null +++ b/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx @@ -0,0 +1,53 @@ +import { H6 } from '@blueprintjs/core' + +import { Dispatch, FC, SetStateAction } from 'react' + +import { PaginationFilter } from './useOperatorFilter' + +export interface ShowMoreProp { + pagination: PaginationFilter + setPagination: Dispatch> +} + +export const defaultPagination: PaginationFilter = { + current: 1, + size: 60, + total: 0, +} + +export const ShowMore: FC = ({ + pagination: { current, size, total }, + setPagination, +}) => { + const lastIndex = current * size + + return ( +
    + {lastIndex >= total ? ( + <> +
    已经展示全部干员了({total})
    + {total > size && ( +
    setPagination(defaultPagination)} + > + 收起 +
    + )} + + ) : ( +
    + setPagination(({ current, ...rest }) => ({ + ...rest, + current: current + 1, + })) + } + > + 显示更多干员(剩余{total - lastIndex}) +
    + )} +
    + ) +} diff --git a/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx b/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx b/src/components/editor/operator/sheet/sheetOperator/useOperatorFilter.tsx similarity index 81% rename from src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx rename to src/components/editor/operator/sheet/sheetOperator/useOperatorFilter.tsx index 76b1531..f67700b 100644 --- a/src/components/editor/operator/sheet/sheetOperator/OperatorFilter.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/useOperatorFilter.tsx @@ -41,18 +41,33 @@ const generateCustomizedOperInfo = (name: string): OperatorInfo => ({ subProf: 'customized', alias: 'customized-operator', rarity: 0, - alt_name: 'custormized operator', + alt_name: 'custormized operator named' + name, }) -export const useOperatorAfterFiltered = (profFilter: ProfFilter) => { +export const useOperatorAfterFiltered = ( + profFilter: ProfFilter, + paginationFilter: PaginationFilter, +) => { // Priority: prof > sub prof > rarity/rarityReverse // filterResult init and prof filter about - const filterResult: { name: string }[] = useProfFilterHandle(profFilter) + const filterResult = useProfFilterHandle(profFilter) // rarity about + const total = filterResult.length + // pagination about + // filterResult - console.log(filterResult) - return filterResult + // console.log(filterResult) + return { + // return data after being paginated + data: paginationFilterHandle(paginationFilter, filterResult), + meta: { + pagination: { + ...paginationFilter, + total, + }, + }, + } } const useProfFilterHandle = ( @@ -132,3 +147,8 @@ const useProfFilterHandle = ( } } } + +const paginationFilterHandle = ( + { current, size }: PaginationFilter, + originData: OperatorInfo[] = OPERATORS, +) => originData.slice(0, current * size) From 6b989d221e85e4b6bbc263bb30df0d037b26c400 Mon Sep 17 00:00:00 2001 From: gemini2035 <2530056984@qq.com> Date: Tue, 16 Jul 2024 18:39:10 +0800 Subject: [PATCH 14/50] perf: dataTotal about optimized --- .../editor/operator/sheet/SheetOperator.tsx | 11 ++++------- .../operator/sheet/sheetOperator/ShowMore.tsx | 13 +++++++------ .../sheet/sheetOperator/useOperatorFilter.tsx | 8 ++------ 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/components/editor/operator/sheet/SheetOperator.tsx b/src/components/editor/operator/sheet/SheetOperator.tsx index 127bb6e..4ce3d1e 100644 --- a/src/components/editor/operator/sheet/SheetOperator.tsx +++ b/src/components/editor/operator/sheet/SheetOperator.tsx @@ -16,7 +16,6 @@ import { export interface SheetOperatorProps {} -const paginationSize = 60 // const defaultRarityFilter = Array.from( // new Array(Math.max(...OPERATORS.map(({ rarity }) => rarity)) + 1).keys(), // ).slice(Math.min(...OPERATORS.map(({ rarity }) => rarity))) @@ -105,7 +104,7 @@ const SheetOperator: FC = () => { const { data: operatorsAfterFiltered, - meta: { pagination: paginationAfterFiltered }, + meta: { dataTotal }, } = useOperatorAfterFiltered(profFilter, pagination) // prof listener @@ -116,10 +115,8 @@ const SheetOperator: FC = () => { // pagination listener useEffect(() => { - if (paginationAfterFiltered.total === pagination.total) return - setPagination(paginationAfterFiltered) - if (paginationAfterFiltered.current === 1) toTop() - }, [pagination.total, paginationAfterFiltered]) + if (pagination.current === 1) toTop() + }, [pagination]) return ( <> @@ -140,7 +137,7 @@ const SheetOperator: FC = () => {
    ))} - + ) : ( OperatorNoData diff --git a/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx b/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx index 036c612..44caad0 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx @@ -6,27 +6,28 @@ import { PaginationFilter } from './useOperatorFilter' export interface ShowMoreProp { pagination: PaginationFilter + dataTotal: number setPagination: Dispatch> } export const defaultPagination: PaginationFilter = { current: 1, size: 60, - total: 0, } export const ShowMore: FC = ({ - pagination: { current, size, total }, + pagination: { current, size }, + dataTotal, setPagination, }) => { const lastIndex = current * size return (
    - {lastIndex >= total ? ( + {lastIndex >= dataTotal ? ( <> -
    已经展示全部干员了({total})
    - {total > size && ( +
    已经展示全部干员了({dataTotal})
    + {dataTotal > size && (
    setPagination(defaultPagination)} @@ -45,7 +46,7 @@ export const ShowMore: FC = ({ })) } > - 显示更多干员(剩余{total - lastIndex}) + 显示更多干员(剩余{dataTotal - lastIndex})
    )}
    diff --git a/src/components/editor/operator/sheet/sheetOperator/useOperatorFilter.tsx b/src/components/editor/operator/sheet/sheetOperator/useOperatorFilter.tsx index f67700b..c12d381 100644 --- a/src/components/editor/operator/sheet/sheetOperator/useOperatorFilter.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/useOperatorFilter.tsx @@ -31,7 +31,6 @@ export interface RarityFilter { export interface PaginationFilter { size: number current: number - total: number } const generateCustomizedOperInfo = (name: string): OperatorInfo => ({ @@ -53,7 +52,7 @@ export const useOperatorAfterFiltered = ( const filterResult = useProfFilterHandle(profFilter) // rarity about - const total = filterResult.length + const dataTotal = filterResult.length // pagination about // filterResult @@ -62,10 +61,7 @@ export const useOperatorAfterFiltered = ( // return data after being paginated data: paginationFilterHandle(paginationFilter, filterResult), meta: { - pagination: { - ...paginationFilter, - total, - }, + dataTotal, }, } } From 0ed2e807de5e8f15fe97da4bdb2ede36e3bf33d8 Mon Sep 17 00:00:00 2001 From: GalvinGao Date: Tue, 16 Jul 2024 16:49:37 +0000 Subject: [PATCH 15/50] chore: update generated assets [skip ci] --- .../operator-avatars/char_4151_tinman.png | Bin 0 -> 47050 bytes src/models/generated/operators.json | 11 ++++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 public/assets/operator-avatars/char_4151_tinman.png diff --git a/public/assets/operator-avatars/char_4151_tinman.png b/public/assets/operator-avatars/char_4151_tinman.png new file mode 100644 index 0000000000000000000000000000000000000000..712173e30fa06d3745a8c6e83e98bafb6dda3c0a GIT binary patch literal 47050 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 Date: Wed, 17 Jul 2024 08:39:25 +0800 Subject: [PATCH 16/50] temp storage --- .../editor/operator/sheet/sheetOperator/ToolBox.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx b/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx index e69de29..059a93b 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx @@ -0,0 +1,7 @@ +import { FC } from 'react' + +export interface ToolBoxProp {} + +export const ToolBox: FC = () => { + return <>111 +} From 3b42d771f1e6354cb233f83be9bf9668f19a4ae8 Mon Sep 17 00:00:00 2001 From: GeorgeZhang2035 Date: Wed, 17 Jul 2024 17:21:04 +0800 Subject: [PATCH 17/50] perf: filter about refacted --- .../editor/operator/sheet/SheetOperator.tsx | 98 +++++++------------ .../sheetOperator/ProfClassification.tsx | 28 +++--- ...er.tsx => SheetOperatorFilterProvider.tsx} | 60 +++++++++++- .../operator/sheet/sheetOperator/ShowMore.tsx | 24 ++--- .../operator/sheet/sheetOperator/ToolBox.tsx | 16 ++- .../sheetOperator/toolBox/mutipleSelect.tsx | 3 + 6 files changed, 133 insertions(+), 96 deletions(-) rename src/components/editor/operator/sheet/sheetOperator/{useOperatorFilter.tsx => SheetOperatorFilterProvider.tsx} (70%) create mode 100644 src/components/editor/operator/sheet/sheetOperator/toolBox/mutipleSelect.tsx diff --git a/src/components/editor/operator/sheet/SheetOperator.tsx b/src/components/editor/operator/sheet/SheetOperator.tsx index 4ce3d1e..2860277 100644 --- a/src/components/editor/operator/sheet/SheetOperator.tsx +++ b/src/components/editor/operator/sheet/SheetOperator.tsx @@ -1,18 +1,14 @@ -import { FC, useEffect, useRef, useState } from 'react' +import { FC, useRef } from 'react' import { SheetContainerSkeleton } from './SheetContainerSkeleton' import { OperatorNoData } from './SheetNoneData' +import { ProfClassification } from './sheetOperator/ProfClassification' import { - ProfClassification, - ProfClassificationProp, - defaultProfFilter, -} from './sheetOperator/ProfClassification' + OperatorFilterProvider, + useOperatorFilterProvider, +} from './sheetOperator/SheetOperatorFilterProvider' import { SheetOperatorItem } from './sheetOperator/SheetOperatorItem' -import { ShowMore, defaultPagination } from './sheetOperator/ShowMore' -import { - PaginationFilter, - useOperatorAfterFiltered, -} from './sheetOperator/useOperatorFilter' +import { ShowMore } from './sheetOperator/ShowMore' export interface SheetOperatorProps {} @@ -23,18 +19,9 @@ export interface SheetOperatorProps {} const SheetOperator: FC = () => { const operatorScrollRef = useRef(null) - const [profFilter, setProfFilter] = - useState(defaultProfFilter) - // const getOperatorRarity = (target: string) => // operatorsGroupedByProf.find((item) => item.name === target)!.rarity - // pagination about via frontened - const [pagination, setPagination] = - useState(defaultPagination) - - // useEffect(resetPaginationState, [selectedProf, selectedSubProf]) - // const selectAll = () => { // operatorsGroupedBySubProf.forEach((item) => { // submitOperator(item, () => {}) @@ -98,55 +85,34 @@ const SheetOperator: FC = () => { // console.log(selectedProf, selectedSubProf) - const toTop = () => { - operatorScrollRef?.current?.scrollIntoView() - } - const { - data: operatorsAfterFiltered, - meta: { dataTotal }, - } = useOperatorAfterFiltered(profFilter, pagination) - - // prof listener - useEffect(() => { - setPagination(defaultPagination) - toTop() - }, [profFilter]) - - // pagination listener - useEffect(() => { - if (pagination.current === 1) toTop() - }, [pagination]) + operatorFiltered: { data: operatorFilteredData }, + } = useOperatorFilterProvider() return ( - <> -
    -
    - {operatorsAfterFiltered.length ? ( - <> -
    - {operatorsAfterFiltered.map(({ name }, index) => ( -
    - -
    - ))} -
    - - - ) : ( - OperatorNoData - )} -
    - {/* {ProfSelect} */} - +
    +
    + {operatorFilteredData.length ? ( + <> +
    + {operatorFilteredData.map(({ name }, index) => ( +
    + +
    + ))} +
    + + + ) : ( + OperatorNoData + )}
    - + {/* {ProfSelect} */} + +
    ) } @@ -229,6 +195,8 @@ export const SheetOperatorContainer = ( sheetOperatorProp: SheetOperatorProps, ) => ( - + + + ) diff --git a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx index be1232f..dfb74c9 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx @@ -1,14 +1,7 @@ import { Divider, H4, H5 } from '@blueprintjs/core' import clsx from 'clsx' -import { - Dispatch, - FC, - ImgHTMLAttributes, - SetStateAction, - useMemo, - useState, -} from 'react' +import { FC, ImgHTMLAttributes, useEffect, useMemo, useState } from 'react' import { PROFESSIONS } from 'models/operator' @@ -16,7 +9,8 @@ import { DEFAULTPROFID, DEFAULTSUBPROFID, ProfFilter as ProfFilterOuter, -} from './useOperatorFilter' + useOperatorFilterProvider, +} from './SheetOperatorFilterProvider' const formattedProfessions = [ { @@ -44,14 +38,14 @@ export const defaultProfFilter: ProfFilter = { } export interface ProfClassificationProp { - profFilter: ProfFilter - setProfFilter: Dispatch> + toTop: () => void } -export const ProfClassification: FC = ({ - profFilter: { selectedProf }, - setProfFilter, -}) => { +export const ProfClassification: FC = ({ toTop }) => { + const { + useProfFilterState: [{ selectedProf }, setProfFilter], + } = useOperatorFilterProvider() + const subProfs = useMemo(() => { return [ { id: DEFAULTSUBPROFID.ALL, name: '全部' }, @@ -61,6 +55,10 @@ export const ProfClassification: FC = ({ ] }, [selectedProf]) + useEffect(() => { + toTop() + }, [selectedProf, toTop]) + // const ActionList = ( //
    // = [T, Dispatch>] + +type OperatorFilterProviderData = { + usePaginationFilterState: UseState + useProfFilterState: UseState + // useRarityFilterState: UseState + operatorFiltered: { + data: OperatorInfo[] + meta: { + dataTotal: number + } + } +} + +const OperatorFilterContext = createContext( + {} as OperatorFilterProviderData, +) + +export const OperatorFilterProvider: FC = ({ + children, +}) => { + const [paginationFilter, setPaginationFilter] = + useState(defaultPagination) + const [profFilter, setProfFilter] = useState(defaultProfFilter) + + return ( + + {children} + + ) +} + +export const useOperatorFilterProvider = () => useContext(OperatorFilterContext) + const generateCustomizedOperInfo = (name: string): OperatorInfo => ({ id: 'customized-' + name, name, @@ -43,7 +99,7 @@ const generateCustomizedOperInfo = (name: string): OperatorInfo => ({ alt_name: 'custormized operator named' + name, }) -export const useOperatorAfterFiltered = ( +const useOperatorFiltered = ( profFilter: ProfFilter, paginationFilter: PaginationFilter, ) => { diff --git a/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx b/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx index 44caad0..e8308fc 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx @@ -2,24 +2,26 @@ import { H6 } from '@blueprintjs/core' import { Dispatch, FC, SetStateAction } from 'react' -import { PaginationFilter } from './useOperatorFilter' +import { + PaginationFilter, + useOperatorFilterProvider, +} from './SheetOperatorFilterProvider' -export interface ShowMoreProp { - pagination: PaginationFilter - dataTotal: number - setPagination: Dispatch> -} +export interface ShowMoreProp {} export const defaultPagination: PaginationFilter = { current: 1, size: 60, } -export const ShowMore: FC = ({ - pagination: { current, size }, - dataTotal, - setPagination, -}) => { +export const ShowMore: FC = () => { + const { + operatorFiltered: { + meta: { dataTotal }, + }, + usePaginationFilterState: [{ current, size }, setPagination], + } = useOperatorFilterProvider() + const lastIndex = current * size return ( diff --git a/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx b/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx index 059a93b..1dc08bf 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx @@ -1,7 +1,17 @@ -import { FC } from 'react' +import { Dispatch, FC, SetStateAction } from 'react' -export interface ToolBoxProp {} +import { RarityFilter } from './SheetOperatorFilterProvider' -export const ToolBox: FC = () => { +export interface ToolBoxProp { + toTop: () => void + rarityFilter: RarityFilter + setRarityFilter: Dispatch> +} + +export const ToolBox: FC = ({ + toTop, + rarityFilter, + setRarityFilter, +}) => { return <>111 } diff --git a/src/components/editor/operator/sheet/sheetOperator/toolBox/mutipleSelect.tsx b/src/components/editor/operator/sheet/sheetOperator/toolBox/mutipleSelect.tsx new file mode 100644 index 0000000..fe6c086 --- /dev/null +++ b/src/components/editor/operator/sheet/sheetOperator/toolBox/mutipleSelect.tsx @@ -0,0 +1,3 @@ +export interface MutipleSelectProp { + +} \ No newline at end of file From e5ae8a19fb11939375ff67c174e008c15b52468d Mon Sep 17 00:00:00 2001 From: GeorgeZhang2035 Date: Wed, 17 Jul 2024 17:27:21 +0800 Subject: [PATCH 18/50] fix: emergency bug fixed --- .../editor/operator/sheet/SheetOperator.tsx | 6 ++++-- .../sheet/sheetOperator/ProfClassification.tsx | 5 ++++- .../editor/operator/sheet/sheetOperator/ShowMore.tsx | 12 +++++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/components/editor/operator/sheet/SheetOperator.tsx b/src/components/editor/operator/sheet/SheetOperator.tsx index 2860277..dfbd949 100644 --- a/src/components/editor/operator/sheet/SheetOperator.tsx +++ b/src/components/editor/operator/sheet/SheetOperator.tsx @@ -85,6 +85,8 @@ const SheetOperator: FC = () => { // console.log(selectedProf, selectedSubProf) + const toTop = () => operatorScrollRef?.current?.scrollIntoView() + const { operatorFiltered: { data: operatorFilteredData }, } = useOperatorFilterProvider() @@ -104,14 +106,14 @@ const SheetOperator: FC = () => {
    ))}
    - + ) : ( OperatorNoData )} {/* {ProfSelect} */} - + ) } diff --git a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx index dfb74c9..47530c3 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx @@ -11,6 +11,7 @@ import { ProfFilter as ProfFilterOuter, useOperatorFilterProvider, } from './SheetOperatorFilterProvider' +import { defaultPagination } from './ShowMore' const formattedProfessions = [ { @@ -44,6 +45,7 @@ export interface ProfClassificationProp { export const ProfClassification: FC = ({ toTop }) => { const { useProfFilterState: [{ selectedProf }, setProfFilter], + usePaginationFilterState: [_, setPaginationFilter], } = useOperatorFilterProvider() const subProfs = useMemo(() => { @@ -57,7 +59,8 @@ export const ProfClassification: FC = ({ toTop }) => { useEffect(() => { toTop() - }, [selectedProf, toTop]) + setPaginationFilter(defaultPagination) + }, [selectedProf, setPaginationFilter, toTop]) // const ActionList = ( //
    diff --git a/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx b/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx index e8308fc..958cd17 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx @@ -1,20 +1,22 @@ import { H6 } from '@blueprintjs/core' -import { Dispatch, FC, SetStateAction } from 'react' +import { FC, useEffect } from 'react' import { PaginationFilter, useOperatorFilterProvider, } from './SheetOperatorFilterProvider' -export interface ShowMoreProp {} +export interface ShowMoreProp { + toTop: () => void +} export const defaultPagination: PaginationFilter = { current: 1, size: 60, } -export const ShowMore: FC = () => { +export const ShowMore: FC = ({ toTop }) => { const { operatorFiltered: { meta: { dataTotal }, @@ -24,6 +26,10 @@ export const ShowMore: FC = () => { const lastIndex = current * size + useEffect(() => { + if (current === 1) toTop() + }, [current, toTop]) + return (
    {lastIndex >= dataTotal ? ( From b0b40e9575f75e2894bea39cc709696e9eec3016 Mon Sep 17 00:00:00 2001 From: GeorgeZhang2035 Date: Wed, 17 Jul 2024 17:57:13 +0800 Subject: [PATCH 19/50] temp storga --- .../sheetOperator/toolBox/mutipleSelect.tsx | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/src/components/editor/operator/sheet/sheetOperator/toolBox/mutipleSelect.tsx b/src/components/editor/operator/sheet/sheetOperator/toolBox/mutipleSelect.tsx index fe6c086..f7a8972 100644 --- a/src/components/editor/operator/sheet/sheetOperator/toolBox/mutipleSelect.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/toolBox/mutipleSelect.tsx @@ -1,3 +1,47 @@ -export interface MutipleSelectProp { - -} \ No newline at end of file +import { Button } from '@blueprintjs/core' + +import { FC, useMemo } from 'react' + +import { useSheet } from '../../SheetProvider' +import { useOperatorFilterProvider } from '../SheetOperatorFilterProvider' + +export interface MutipleSelectProp {} + +export const MutipleSelect: FC = () => { + const { + operatorFiltered: { data: operatorFilteredData }, + } = useOperatorFilterProvider() + const { existedOperators } = useSheet() + + const { cancelAllDisabled, selectAllDisabled } = useMemo(() => { + console.log('111') + const existedOperatorsNames = existedOperators.map(({ name }) => name) + return { + cancelAllDisabled: !operatorFilteredData.some(({ name }) => + existedOperatorsNames.includes(name), + ), + selectAllDisabled: operatorFilteredData.every(({ name }) => + existedOperatorsNames.includes(name), + ), + } + }, [existedOperators, operatorFilteredData]) + + return ( +
    +
    + ) +} From 798adad1be849f30c790f1bd48fe053ab0177962 Mon Sep 17 00:00:00 2001 From: gemini2035 <2530056984@qq.com> Date: Wed, 17 Jul 2024 19:30:14 +0800 Subject: [PATCH 20/50] mutiple select completed --- .../editor/operator/sheet/SheetOperator.tsx | 103 ++++++------------ .../sheetOperator/ProfClassification.tsx | 93 ++++------------ .../operator/sheet/sheetOperator/ToolBox.tsx | 17 --- ...leSelect.tsx => OperatorMutipleSelect.tsx} | 25 ++++- 4 files changed, 77 insertions(+), 161 deletions(-) delete mode 100644 src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx rename src/components/editor/operator/sheet/sheetOperator/toolBox/{mutipleSelect.tsx => OperatorMutipleSelect.tsx} (65%) diff --git a/src/components/editor/operator/sheet/SheetOperator.tsx b/src/components/editor/operator/sheet/SheetOperator.tsx index dfbd949..3a30696 100644 --- a/src/components/editor/operator/sheet/SheetOperator.tsx +++ b/src/components/editor/operator/sheet/SheetOperator.tsx @@ -1,4 +1,4 @@ -import { FC, useRef } from 'react' +import { FC, useCallback, useRef } from 'react' import { SheetContainerSkeleton } from './SheetContainerSkeleton' import { OperatorNoData } from './SheetNoneData' @@ -9,6 +9,7 @@ import { } from './sheetOperator/SheetOperatorFilterProvider' import { SheetOperatorItem } from './sheetOperator/SheetOperatorItem' import { ShowMore } from './sheetOperator/ShowMore' +import { OperatorMutipleSelect } from './sheetOperator/toolBox/OperatorMutipleSelect' export interface SheetOperatorProps {} @@ -22,71 +23,37 @@ const SheetOperator: FC = () => { // const getOperatorRarity = (target: string) => // operatorsGroupedByProf.find((item) => item.name === target)!.rarity - // const selectAll = () => { - // operatorsGroupedBySubProf.forEach((item) => { - // submitOperator(item, () => {}) - // }) - // } - - // const cancelAll = () => { - // const deleteIndexList: number[] = [] - // operatorsGroupedBySubProf.forEach(({ name }) => { - // const index = existedOperators.findIndex((item) => item.name === name) - // if (index !== -1) deleteIndexList.push(index) - // }) - // removeOperator(deleteIndexList) - // } - - // const ActionList = ( - //
    - // - // } - // > - //
    - // ) - - // console.log(selectedProf, selectedSubProf) - - const toTop = () => operatorScrollRef?.current?.scrollIntoView() + const ToolBox = ( +
    + {/* + } + > +
    + ) + const toTop = useCallback( + () => operatorScrollRef?.current?.scrollIntoView(), + [operatorScrollRef], + ) const { operatorFiltered: { data: operatorFilteredData }, } = useOperatorFilterProvider() @@ -112,8 +79,10 @@ const SheetOperator: FC = () => { OperatorNoData )}
    - {/* {ProfSelect} */} - +
    + + {ToolBox} +
    ) } diff --git a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx index 47530c3..81d7070 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx @@ -62,54 +62,8 @@ export const ProfClassification: FC = ({ toTop }) => { setPaginationFilter(defaultPagination) }, [selectedProf, setPaginationFilter, toTop]) - // const ActionList = ( - //
    - // - // } - // > - //
    - // ) - return ( -
    +
      {formattedProfessions.map(({ id, name }) => ( = ({ toTop }) => { ))}
    -
    -
      - {subProfs.map(({ id, name }) => ( -
    • -

      3 && '!text-base', - )} - onClick={() => - setProfFilter(({ selectedProf, ...rest }) => ({ - selectedProf: [selectedProf[0], id], - ...rest, - })) - } - > - {name} -

      -
    • - ))} -
    - {/* {ActionList} */} -
    +
      + {subProfs.map(({ id, name }) => ( +
    • +

      3 && '!text-base', + )} + onClick={() => + setProfFilter(({ selectedProf, ...rest }) => ({ + selectedProf: [selectedProf[0], id], + ...rest, + })) + } + > + {name} +

      +
    • + ))} +
    ) } diff --git a/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx b/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx deleted file mode 100644 index 1dc08bf..0000000 --- a/src/components/editor/operator/sheet/sheetOperator/ToolBox.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Dispatch, FC, SetStateAction } from 'react' - -import { RarityFilter } from './SheetOperatorFilterProvider' - -export interface ToolBoxProp { - toTop: () => void - rarityFilter: RarityFilter - setRarityFilter: Dispatch> -} - -export const ToolBox: FC = ({ - toTop, - rarityFilter, - setRarityFilter, -}) => { - return <>111 -} diff --git a/src/components/editor/operator/sheet/sheetOperator/toolBox/mutipleSelect.tsx b/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorMutipleSelect.tsx similarity index 65% rename from src/components/editor/operator/sheet/sheetOperator/toolBox/mutipleSelect.tsx rename to src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorMutipleSelect.tsx index f7a8972..585c13e 100644 --- a/src/components/editor/operator/sheet/sheetOperator/toolBox/mutipleSelect.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorMutipleSelect.tsx @@ -5,16 +5,15 @@ import { FC, useMemo } from 'react' import { useSheet } from '../../SheetProvider' import { useOperatorFilterProvider } from '../SheetOperatorFilterProvider' -export interface MutipleSelectProp {} +export interface OperatorMutipleSelectProp {} -export const MutipleSelect: FC = () => { +export const OperatorMutipleSelect: FC = () => { const { operatorFiltered: { data: operatorFilteredData }, } = useOperatorFilterProvider() - const { existedOperators } = useSheet() + const { existedOperators, submitOperator, removeOperator } = useSheet() const { cancelAllDisabled, selectAllDisabled } = useMemo(() => { - console.log('111') const existedOperatorsNames = existedOperators.map(({ name }) => name) return { cancelAllDisabled: !operatorFilteredData.some(({ name }) => @@ -26,8 +25,22 @@ export const MutipleSelect: FC = () => { } }, [existedOperators, operatorFilteredData]) + const selectAll = () => + operatorFilteredData.forEach((item) => { + submitOperator(item, () => {}) + }) + + const cancelAll = () => { + const deleteIndexList: number[] = [] + operatorFilteredData.forEach(({ name }) => { + const index = existedOperators.findIndex((item) => item.name === name) + if (index !== -1) deleteIndexList.push(index) + }) + removeOperator(deleteIndexList) + } + return ( -
    + <>
    + ) } From ec589d6a9bca4f33a12b711d7763e4ec486a5747 Mon Sep 17 00:00:00 2001 From: gemini2035 <2530056984@qq.com> Date: Wed, 17 Jul 2024 21:58:01 +0800 Subject: [PATCH 21/50] feat: back to top button completed! --- .../editor/operator/sheet/SheetOperator.tsx | 20 ++++++-------- .../sheet/sheetOperator/SheetOperatorItem.tsx | 2 +- .../toolBox/OperatorBackToTop.tsx | 26 +++++++++++++++++++ 3 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorBackToTop.tsx diff --git a/src/components/editor/operator/sheet/SheetOperator.tsx b/src/components/editor/operator/sheet/SheetOperator.tsx index 3a30696..ca20c65 100644 --- a/src/components/editor/operator/sheet/SheetOperator.tsx +++ b/src/components/editor/operator/sheet/SheetOperator.tsx @@ -9,6 +9,7 @@ import { } from './sheetOperator/SheetOperatorFilterProvider' import { SheetOperatorItem } from './sheetOperator/SheetOperatorItem' import { ShowMore } from './sheetOperator/ShowMore' +import { OperatorBackToTop } from './sheetOperator/toolBox/OperatorBackToTop' import { OperatorMutipleSelect } from './sheetOperator/toolBox/OperatorMutipleSelect' export interface SheetOperatorProps {} @@ -20,11 +21,16 @@ export interface SheetOperatorProps {} const SheetOperator: FC = () => { const operatorScrollRef = useRef(null) + const toTop = useCallback( + () => operatorScrollRef?.current?.scrollIntoView(), + [operatorScrollRef], + ) + // const getOperatorRarity = (target: string) => // operatorsGroupedByProf.find((item) => item.name === target)!.rarity const ToolBox = ( -
    +
    {/* = () => {
    ) - const toTop = useCallback( - () => operatorScrollRef?.current?.scrollIntoView(), - [operatorScrollRef], - ) const { operatorFiltered: { data: operatorFilteredData }, } = useOperatorFilterProvider() diff --git a/src/components/editor/operator/sheet/sheetOperator/SheetOperatorItem.tsx b/src/components/editor/operator/sheet/sheetOperator/SheetOperatorItem.tsx index 13d13f2..7ed82ec 100644 --- a/src/components/editor/operator/sheet/sheetOperator/SheetOperatorItem.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/SheetOperatorItem.tsx @@ -94,7 +94,7 @@ export const SheetOperatorItem: FC = ({ name }) => { void +} + +export const OperatorBackToTop: FC = ({ toTop }) => { + const { + usePaginationFilterState: [{ current }, setPaginationFilter], + } = useOperatorFilterProvider() + + return ( +
    - ) - const { operatorFiltered: { data: operatorFilteredData }, } = useOperatorFilterProvider() @@ -76,88 +56,12 @@ const SheetOperator: FC = () => { )}
    - - {ToolBox} +
    ) } -// const RaritySelector = ({ -// operatorRarity, -// setOperatorRarity, -// rarityReverse, -// setRarityReverse, -// }: { -// operatorRarity: number[] -// setOperatorRarity: (target: number[]) => void -// rarityReverse: boolean -// setRarityReverse: (target: boolean) => void -// }) => { -// const selectClass = 'scale-90' -// const [rarity, setRarity] = useState(operatorRarity) -// const [reverse, setReverse] = useState(rarityReverse) - -// const resetFilter = () => { -// setRarity(defaultRarityFilter) -// setReverse(false) -// } -// const submitFilter = () => { -// setOperatorRarity(rarity) -// setRarityReverse(reverse) -// } - -// return ( -//
    -//
    -//
    按干员稀有度展示
    -//
    -//
    -// {Array(7) -// .fill(0) -// .map((_, index) => { -// const isSelect = rarity.findIndex((item) => item === index) !== -1 -// return ( -//
    -//
    -//
    -// -//
    -// ) -// } - export const SheetOperatorContainer = ( sheetOperatorProp: SheetOperatorProps, ) => ( diff --git a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx b/src/components/editor/operator/sheet/sheetOperator/ProfClassificationWithFilters.tsx similarity index 61% rename from src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx rename to src/components/editor/operator/sheet/sheetOperator/ProfClassificationWithFilters.tsx index 81d7070..739e952 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ProfClassification.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ProfClassificationWithFilters.tsx @@ -1,4 +1,5 @@ -import { Divider, H4, H5 } from '@blueprintjs/core' +import { Button, Divider, H4, H5 } from '@blueprintjs/core' +import { Popover2 } from '@blueprintjs/popover2' import clsx from 'clsx' import { FC, ImgHTMLAttributes, useEffect, useMemo, useState } from 'react' @@ -8,10 +9,12 @@ import { PROFESSIONS } from 'models/operator' import { DEFAULTPROFID, DEFAULTSUBPROFID, - ProfFilter as ProfFilterOuter, + defaultPagination, useOperatorFilterProvider, } from './SheetOperatorFilterProvider' -import { defaultPagination } from './ShowMore' +import { OperatorBackToTop } from './toolBox/OperatorBackToTop' +import { OperatorMutipleSelect } from './toolBox/OperatorMutipleSelect' +import { OperatorRaritySelect } from './toolBox/OperatorRaritySelect' const formattedProfessions = [ { @@ -32,17 +35,13 @@ const formattedProfessions = [ }, ] -type ProfFilter = ProfFilterOuter - -export const defaultProfFilter: ProfFilter = { - selectedProf: [DEFAULTPROFID.ALL, DEFAULTSUBPROFID.ALL], -} - -export interface ProfClassificationProp { +export interface ProfClassificationWithFiltersProp { toTop: () => void } -export const ProfClassification: FC = ({ toTop }) => { +export const ProfClassificationWithFilters: FC< + ProfClassificationWithFiltersProp +> = ({ toTop }) => { const { useProfFilterState: [{ selectedProf }, setProfFilter], usePaginationFilterState: [_, setPaginationFilter], @@ -62,6 +61,22 @@ export const ProfClassification: FC = ({ toTop }) => { setPaginationFilter(defaultPagination) }, [selectedProf, setPaginationFilter, toTop]) + const ToolBox = ( +
    + + + + } + > +
    + ) + return (
      @@ -81,27 +96,30 @@ export const ProfClassification: FC = ({ toTop }) => { ))}
    -
      - {subProfs.map(({ id, name }) => ( -
    • -

      3 && '!text-base', - )} - onClick={() => - setProfFilter(({ selectedProf, ...rest }) => ({ - selectedProf: [selectedProf[0], id], - ...rest, - })) - } - > - {name} -

      -
    • - ))} -
    +
    +
      + {subProfs.map(({ id, name }) => ( +
    • +

      3 && '!text-base', + )} + onClick={() => + setProfFilter(({ selectedProf, ...rest }) => ({ + selectedProf: [selectedProf[0], id], + ...rest, + })) + } + > + {name} +

      +
    • + ))} +
    + {ToolBox} +
    ) } diff --git a/src/components/editor/operator/sheet/sheetOperator/SheetOperatorFilterProvider.tsx b/src/components/editor/operator/sheet/sheetOperator/SheetOperatorFilterProvider.tsx index 06b5c2d..d1fcef1 100644 --- a/src/components/editor/operator/sheet/sheetOperator/SheetOperatorFilterProvider.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/SheetOperatorFilterProvider.tsx @@ -14,8 +14,6 @@ import { OperatorInfo as ModelsOperator, OPERATORS } from 'models/operator' import { favOperatorAtom } from 'store/useFavOperators' import { useSheet } from '../SheetProvider' -import { defaultProfFilter } from './ProfClassification' -import { defaultPagination } from './ShowMore' type OperatorInfo = ModelsOperator @@ -33,16 +31,29 @@ export enum DEFAULTSUBPROFID { export interface ProfFilter { selectedProf: [string, string] } +export const defaultProfFilter: ProfFilter = { + selectedProf: [DEFAULTPROFID.ALL, DEFAULTSUBPROFID.ALL], +} export interface RarityFilter { selectedRarity: number[] reverse: boolean } +export const defaultRarityFilter: RarityFilter = { + selectedRarity: Array.from( + new Array(Math.max(...OPERATORS.map(({ rarity }) => rarity)) + 1).keys(), + ).slice(Math.min(...OPERATORS.map(({ rarity }) => rarity))), + reverse: false, +} export interface PaginationFilter { size: number current: number } +export const defaultPagination: PaginationFilter = { + current: 1, + size: 60, +} interface OperatorFilterProviderProp { children: ReactNode @@ -53,7 +64,7 @@ type UseState = [T, Dispatch>] type OperatorFilterProviderData = { usePaginationFilterState: UseState useProfFilterState: UseState - // useRarityFilterState: UseState + useRarityFilterState: UseState operatorFiltered: { data: OperatorInfo[] meta: { @@ -72,13 +83,15 @@ export const OperatorFilterProvider: FC = ({ const [paginationFilter, setPaginationFilter] = useState(defaultPagination) const [profFilter, setProfFilter] = useState(defaultProfFilter) + const [rarityFilter, setRarityFilter] = + useState(defaultRarityFilter) return ( @@ -141,7 +154,7 @@ const useProfFilterHandle = ( ? undefined : generateCustomizedOperInfo(name), ) - .filter((item) => !!item), + .filter((item) => !!item) as OperatorInfo[], [existedOperators], ) const favOperatorsInfo = useMemo( diff --git a/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx b/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx index 958cd17..8e50cc0 100644 --- a/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/ShowMore.tsx @@ -3,7 +3,7 @@ import { H6 } from '@blueprintjs/core' import { FC, useEffect } from 'react' import { - PaginationFilter, + defaultPagination, useOperatorFilterProvider, } from './SheetOperatorFilterProvider' @@ -11,11 +11,6 @@ export interface ShowMoreProp { toTop: () => void } -export const defaultPagination: PaginationFilter = { - current: 1, - size: 60, -} - export const ShowMore: FC = ({ toTop }) => { const { operatorFiltered: { diff --git a/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorBackToTop.tsx b/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorBackToTop.tsx index f3304fe..17f663e 100644 --- a/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorBackToTop.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorBackToTop.tsx @@ -2,8 +2,10 @@ import { Button } from '@blueprintjs/core' import { FC } from 'react' -import { useOperatorFilterProvider } from '../SheetOperatorFilterProvider' -import { defaultPagination } from '../ShowMore' +import { + defaultPagination, + useOperatorFilterProvider, +} from '../SheetOperatorFilterProvider' export interface OperatorBackToTopProp { toTop: () => void diff --git a/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorRaritySelect.tsx b/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorRaritySelect.tsx new file mode 100644 index 0000000..c9633b4 --- /dev/null +++ b/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorRaritySelect.tsx @@ -0,0 +1,88 @@ +import { Button, Divider, H5 } from '@blueprintjs/core' + +import clsx from 'clsx' +import { FC } from 'react' + +import { + defaultRarityFilter, + useOperatorFilterProvider, +} from '../SheetOperatorFilterProvider' + +export interface OperatorRaritySelectProp {} + +export const OperatorRaritySelect: FC = () => { + const { + useRarityFilterState: [{ selectedRarity, reverse }, setRarityFilter], + } = useOperatorFilterProvider() + + const selectClass = 'scale-90' + + return ( + <> +
    +
    按干员稀有度展示
    +
    +
    + {defaultRarityFilter.selectedRarity.map((rarityIndex) => { + const isSelect = selectedRarity.includes(rarityIndex) + return ( +
    +
    +
    + + {/* - } - disabled={!pinned} - > - onPinHandle?.(operator as Operator) - } - /> - - - )} - - {!readOnly && selected && ( - - )} -
    - ) -} \ No newline at end of file diff --git a/src/components/editor/operator/sheet/SheetProvider.tsx b/src/components/editor/operator/sheet/SheetProvider.tsx index 032acb5..b480828 100644 --- a/src/components/editor/operator/sheet/SheetProvider.tsx +++ b/src/components/editor/operator/sheet/SheetProvider.tsx @@ -15,15 +15,30 @@ export interface SheetProviderProp { children: ReactNode } -export type SheetContextValue = Omit +export type SheetContextValue = { + existedOperators: SheetProviderProp['existedOperators'] + existedGroups: SheetProviderProp['existedGroups'] + removeOperator: SheetProviderProp['removeOperator'] + removeGroup: SheetProviderProp['removeGroup'] + submitOperatorInSheet: (value: Operator) => void + submitGroupInSheet: (value: Group) => void +} const SheetContext = createContext({} as SheetContextValue) export const SheetProvider: FC = ({ children, - ...providerValue + submitGroup, + submitOperator, + ...restValueField }) => ( - + submitOperator(value, undefined, true), + submitGroupInSheet: (value) => submitGroup(value, undefined, true), + ...restValueField, + }} + > {children} ) diff --git a/src/components/editor/operator/sheet/sheetGroup/SheetGroupItem.tsx b/src/components/editor/operator/sheet/sheetGroup/SheetGroupItem.tsx index cb7f710..f97abf1 100644 --- a/src/components/editor/operator/sheet/sheetGroup/SheetGroupItem.tsx +++ b/src/components/editor/operator/sheet/sheetGroup/SheetGroupItem.tsx @@ -205,7 +205,7 @@ const useSheetGroupItemController = ({ groupInfo: { name, opers = [], ...rest }, itemType, }: SheetGroupItemProp): SheetGroupItemController => { - const { submitGroup, removeGroup, existedGroups } = useSheet() + const { submitGroupInSheet, removeGroup, existedGroups } = useSheet() const [favGroup, setFavGroup] = useAtom(favGroupAtom) switch (itemType) { @@ -228,7 +228,7 @@ const useSheetGroupItemController = ({ return { selected: true, onGroupNameChange: (name: string) => - submitGroup({ opers, ...rest, name }, undefined, true), + submitGroupInSheet({ opers, ...rest, name }), defaultOperatorCollapseOpen: true, onOperatorSkillChange: (operator: Operator) => { opers.splice( @@ -238,7 +238,7 @@ const useSheetGroupItemController = ({ 1, operator, ) - submitGroup({ opers, name, ...rest }, undefined, true) + submitGroupInSheet({ opers, name, ...rest }) }, ActionList: ( <> @@ -272,7 +272,7 @@ const useSheetGroupItemController = ({ minimal icon="arrow-left" title="添加干员组" - onClick={() => submitGroup({ name, opers }, undefined, true)} + onClick={() => submitGroupInSheet({ name, opers })} /> ), @@ -329,7 +329,7 @@ const useSheetGroupItemController = ({ : '检测到同名干员组' : '使用该推荐分组' } - onClick={() => submitGroup({ name, opers }, undefined, true)} + onClick={() => submitGroupInSheet({ name, opers })} /> diff --git a/src/components/editor/operator/sheet/sheetGroup/SheetOperatorEditor.tsx b/src/components/editor/operator/sheet/sheetGroup/SheetOperatorEditor.tsx index 93bc603..b725804 100644 --- a/src/components/editor/operator/sheet/sheetGroup/SheetOperatorEditor.tsx +++ b/src/components/editor/operator/sheet/sheetGroup/SheetOperatorEditor.tsx @@ -67,8 +67,12 @@ const SheetOperatorEditorForm: FC = ({ name, opers = [], }) => { - const { existedOperators, existedGroups, removeOperator, submitGroup } = - useSheet() + const { + existedOperators, + existedGroups, + removeOperator, + submitGroupInSheet, + } = useSheet() const [selectedOperators, setSelectedOperators] = useState< OperatorInSheetOperatorEditor[] >( @@ -90,40 +94,54 @@ const SheetOperatorEditorForm: FC = ({ React.FormHTMLAttributes, HTMLFormElement >['onSubmit'] = (e) => { - console.log(selectedOperators) e.preventDefault() - const targetGroup = existedGroups.find( - ({ name: exsitedName }) => exsitedName === name, - ) || { name, opers: [] } - const deleteArray: number[] = [] - // const needModifyGroup: Record - const opers = selectedOperators.map(({ groupName, operName }) => { - if (groupName) { - const { opers: otherGroupOpers, ...rest } = existedGroups.find( - ({ name }) => name === groupName, - ) || { name: groupName, opers: [] } - const targetIndex = - otherGroupOpers?.findIndex( - ({ name: otherOpersName }) => otherOpersName === operName, - ) || -1 - const target = otherGroupOpers?.splice( - Math.max(targetIndex - 1, 0), - 1, - )[0] - console.log(target) - console.log(otherGroupOpers) - submitGroup({ ...rest, opers: otherGroupOpers }, undefined, true) - return target + const needModifyGroups = selectedOperators.reduce( + (acc, { groupName, operName }) => { + const key = groupName || 'noneGrouped' + if (acc[key]) acc[key].push(operName) + else acc[key] = [operName] + return acc + }, + {} as Record, + ) + let newOpers: Group['opers'] = [] + Object.entries(needModifyGroups).forEach(([key, value]) => { + if (key === 'noneGrouped') { + removeOperator( + value.map((name) => { + const index = existedOperators.findIndex( + ({ name: existedName }) => existedName === name, + ) + newOpers?.push(existedOperators[index]) + return index + }), + ) } else { - const index = existedOperators.findIndex( - ({ name }) => name === operName, + const { opers: otherGroupOpers, ...groupRestField } = + existedGroups.find( + ({ name: existedGroups }) => existedGroups === key, + )! + newOpers = newOpers?.concat( + value.map( + (name) => + otherGroupOpers?.find( + ({ name: existedName }) => existedName === name, + )!, + ), ) - deleteArray.push(index) - removeOperator(deleteArray) - return existedOperators[index] + if (key !== name) + submitGroupInSheet({ + ...groupRestField, + opers: otherGroupOpers?.filter(({ name }) => !value.includes(name)), + }) } - }) as Group['opers'] - submitGroup({ ...targetGroup, opers }, undefined, true) + }) + + console.log(newOpers) + submitGroupInSheet({ + ...existedGroups.find(({ name: existedName }) => existedName === name)!, + opers: newOpers, + }) } const onReset = () => { diff --git a/src/components/editor/operator/sheet/sheetOperator/SheetOperatorItem.tsx b/src/components/editor/operator/sheet/sheetOperator/SheetOperatorItem.tsx index 7ed82ec..f1d5ce0 100644 --- a/src/components/editor/operator/sheet/sheetOperator/SheetOperatorItem.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/SheetOperatorItem.tsx @@ -20,8 +20,12 @@ export interface SheetOperatorItemProp { } export const SheetOperatorItem: FC = ({ name }) => { - const { existedOperators, existedGroups, submitOperator, removeOperator } = - useSheet() + const { + existedOperators, + existedGroups, + submitOperatorInSheet, + removeOperator, + } = useSheet() const [favOperators, setFavOperators] = useAtom(favOperatorAtom) const operatorNoneGroupedIndex = existedOperators.findIndex( @@ -58,7 +62,7 @@ export const SheetOperatorItem: FC = ({ name }) => { else { if (selected) { removeOperator(operatorNoneGroupedIndex) - } else submitOperator(operator, undefined, true) + } else submitOperatorInSheet(operator) } } @@ -77,7 +81,7 @@ export const SheetOperatorItem: FC = ({ name }) => { ...[...favOperators].filter(({ name }) => name !== formattedValue.name), { ...formattedValue }, ]) - submitOperator(formattedValue, undefined, true) + submitOperatorInSheet(formattedValue) } const onPinnedChange = () => { @@ -151,7 +155,7 @@ export const SheetOperatorItem: FC = ({ name }) => { submitOperator(value, undefined, true), + onSkillChange: (value) => submitOperatorInSheet(value), disabled: grouped, }} /> diff --git a/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorMutipleSelect.tsx b/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorMutipleSelect.tsx index 585c13e..76c3e6b 100644 --- a/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorMutipleSelect.tsx +++ b/src/components/editor/operator/sheet/sheetOperator/toolBox/OperatorMutipleSelect.tsx @@ -11,7 +11,7 @@ export const OperatorMutipleSelect: FC = () => { const { operatorFiltered: { data: operatorFilteredData }, } = useOperatorFilterProvider() - const { existedOperators, submitOperator, removeOperator } = useSheet() + const { existedOperators, submitOperatorInSheet, removeOperator } = useSheet() const { cancelAllDisabled, selectAllDisabled } = useMemo(() => { const existedOperatorsNames = existedOperators.map(({ name }) => name) @@ -27,7 +27,7 @@ export const OperatorMutipleSelect: FC = () => { const selectAll = () => operatorFilteredData.forEach((item) => { - submitOperator(item, () => {}) + submitOperatorInSheet(item) }) const cancelAll = () => { From faba50e40fa887f7ba65fd6fbe27cd27cef98269 Mon Sep 17 00:00:00 2001 From: Handiwork Date: Sat, 27 Jul 2024 16:49:05 +0800 Subject: [PATCH 39/50] lint-fix: make eslint happy --- .editorconfig | 1 + .vscode/extensions.json | 5 ++ src/components/FactItem.tsx | 8 ++- src/components/HelperText.tsx | 7 ++- src/components/OperationCard.tsx | 11 ++-- src/components/Paragraphs.tsx | 6 +- src/components/Suspensable.tsx | 1 + src/components/ThemeSwitchButton.tsx | 8 +-- src/components/account/EditDialog.tsx | 2 +- src/components/announcement/AnnPanel.tsx | 8 +-- src/components/editor/EditorFieldProps.tsx | 6 +- src/components/editor/NumericInput2.tsx | 1 + src/components/editor/OperationEditor.tsx | 2 +- .../editor/action/EditorActionAdd.tsx | 21 ++++--- .../editor/floatingMap/FloatingMap.tsx | 8 +-- .../editor/operator/EditorOperator.tsx | 2 +- .../editor/operator/EditorPerformerAdd.tsx | 62 +++++++++++-------- .../operator/EditorPerformerOperator.tsx | 19 +++--- .../editor/operator/sheet/SheetOperator.tsx | 21 ++++--- .../sheet/SheetOperatorSkillAbout.tsx | 2 +- src/components/editor/useAutosave.tsx | 17 ++--- src/components/viewer/OperationViewer.tsx | 4 +- src/main.tsx | 5 +- src/store/useFavGroups.ts | 2 +- src/store/useFavOperators.ts | 2 +- src/utils/useLazyStorage.tsx | 2 +- 26 files changed, 137 insertions(+), 96 deletions(-) create mode 100644 .vscode/extensions.json diff --git a/.editorconfig b/.editorconfig index 9d93cb3..b802215 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,6 +6,7 @@ indent_style = space indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true +end_of_line = lf [*.{js,ts,jsx,tsx,css,json,md,mdx,yml,yaml}] indent_size = 2 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..b308e58 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint" + ] +} diff --git a/src/components/FactItem.tsx b/src/components/FactItem.tsx index c57df08..174e505 100644 --- a/src/components/FactItem.tsx +++ b/src/components/FactItem.tsx @@ -19,8 +19,12 @@ export const FactItem: FCC<{ className, )} > - {icon && } -
    {title}
    + {icon && ( + + )} +
    + {title} +
    {children} ) diff --git a/src/components/HelperText.tsx b/src/components/HelperText.tsx index 6c85125..2a8c8b9 100644 --- a/src/components/HelperText.tsx +++ b/src/components/HelperText.tsx @@ -22,7 +22,12 @@ export const HelperText: FCC<{ } return ( -
    +
    {child()}
    diff --git a/src/components/OperationCard.tsx b/src/components/OperationCard.tsx index 362ed32..7bee455 100644 --- a/src/components/OperationCard.tsx +++ b/src/components/OperationCard.tsx @@ -20,12 +20,11 @@ export const NeoOperationCard = ({ operation }: { operation: Operation }) => { const { data: levels } = useLevels() return ( - - + +
    limitHeight) - }, [paragraphElementRef.current, limitHeight]) + }, [limitHeight]) const mask = exceededLimitHeight ? 'linear-gradient(to bottom, rgba(0,0,0,1) 0%, rgba(0,0,0,1) calc(100% - 2rem), rgba(0,0,0,0) 100%)' @@ -40,9 +40,7 @@ export const Paragraphs: FC<{ }} >
    - {paragraphs?.map((paragraph, index) => ( -

    {paragraph}

    - ))} + {paragraphs?.map((paragraph, index) =>

    {paragraph}

    )}
    ) diff --git a/src/components/Suspensable.tsx b/src/components/Suspensable.tsx index 70b1854..420d79c 100644 --- a/src/components/Suspensable.tsx +++ b/src/components/Suspensable.tsx @@ -24,6 +24,7 @@ export const Suspensable: FCC = ({ useEffect(() => { resetError.current?.() resetError.current = undefined + // eslint-disable-next-line react-hooks/exhaustive-deps }, retryDeps) return ( diff --git a/src/components/ThemeSwitchButton.tsx b/src/components/ThemeSwitchButton.tsx index 0d57c51..b1ac4ab 100644 --- a/src/components/ThemeSwitchButton.tsx +++ b/src/components/ThemeSwitchButton.tsx @@ -1,16 +1,16 @@ import { Button } from '@blueprintjs/core' -import { useEffect, useState } from 'react' +import { useCallback, useEffect, useState } from 'react' const themeMedia = window.matchMedia('(prefers-color-scheme: light)') export const ThemeSwitchButton = () => { const [theme, setTheme] = useState(localStorage.getItem('theme') || '') - const handleThemeSwitch = () => { + const handleThemeSwitch = useCallback(() => { const isCurrentDark = theme === 'dark' setTheme(isCurrentDark ? 'light' : 'dark') localStorage.setItem('theme', isCurrentDark ? 'light' : 'dark') - } + }, [theme]) useEffect(() => { if (!themeMedia.matches && !localStorage.getItem('theme')) { handleThemeSwitch() @@ -23,7 +23,7 @@ export const ThemeSwitchButton = () => { document.body.classList.remove('bp4-dark') document.body.classList.remove('dark') } - }, [theme]) + }, [theme, handleThemeSwitch]) return (
    diff --git a/src/models/comment.ts b/src/models/comment.ts index a6d665e..a7c726c 100644 --- a/src/models/comment.ts +++ b/src/models/comment.ts @@ -11,6 +11,7 @@ export const enum CommentRating { } export const MAX_COMMENT_LENGTH = 150 +export const AUTHOR_MAX_COMMENT_LENGTH = 500 export function isMainComment( comment: CommentInfo, From bd573d66623659380466a8948c0b620386b21816 Mon Sep 17 00:00:00 2001 From: Guan <821143943@qq.com> Date: Fri, 6 Sep 2024 07:38:15 +0800 Subject: [PATCH 50/50] refactor: default max length for comment form --- src/components/viewer/comment/CommentForm.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/viewer/comment/CommentForm.tsx b/src/components/viewer/comment/CommentForm.tsx index 91f885f..0ebc7e2 100644 --- a/src/components/viewer/comment/CommentForm.tsx +++ b/src/components/viewer/comment/CommentForm.tsx @@ -4,6 +4,7 @@ import { sendComment } from 'apis/comment' import clsx from 'clsx' import { useContext, useState } from 'react' +import { MAX_COMMENT_LENGTH } from '../../../models/comment' import { formatError } from '../../../utils/error' import { wrapErrorMessage } from '../../../utils/wrapErrorMessage' import { Markdown } from '../../Markdown' @@ -23,7 +24,7 @@ export const CommentForm = ({ primary, placeholder = '发一条友善的评论吧', inputAutoFocus, - maxLength, + maxLength = MAX_COMMENT_LENGTH, }: CommentFormProps) => { const { operationId, replyTo, reload } = useContext(CommentAreaContext) @@ -83,7 +84,7 @@ export const CommentForm = ({ rows={2} growVertically large - maxLength={maxLength ?? 150} + maxLength={maxLength} placeholder={placeholder} value={message} onChange={(e) => setMessage(e.target.value)} @@ -112,7 +113,7 @@ export const CommentForm = ({
    - {message.length}/{maxLength ?? 150} + {message.length}/{maxLength}