From 9e304160896a7d55eadfe171de78fda8c2055343 Mon Sep 17 00:00:00 2001 From: Shim MunSeong Date: Tue, 12 Nov 2024 22:15:09 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=B6=9C=EC=97=B0=EC=A7=84=20=ED=8C=80?= =?UTF-8?q?=20=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .pnp.cjs | 92 ++++++++ apps/admin/package.json | 2 + apps/admin/src/App.tsx | 6 +- .../ShowCastInfo/ShowCastInfo.styles.ts | 24 +- .../src/components/ShowCastInfo/index.tsx | 218 +++++++++++------- .../ShowCastInfoFormDialogContent/index.tsx | 5 +- apps/admin/src/pages/ShowInfoPage/index.tsx | 54 ++++- packages/api/src/mutations/index.ts | 2 + .../src/mutations/useChangeCastTeamOrder.ts | 15 ++ packages/api/src/queries/useCastTeamList.ts | 11 +- packages/icon/src/components/Menu.tsx | 6 +- yarn.lock | 79 ++++++- 12 files changed, 423 insertions(+), 91 deletions(-) create mode 100644 packages/api/src/mutations/useChangeCastTeamOrder.ts diff --git a/.pnp.cjs b/.pnp.cjs index 23326a13..94112257 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -5654,6 +5654,33 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["@react-dnd/asap", [\ + ["npm:5.0.2", {\ + "packageLocation": "./.yarn/cache/@react-dnd-asap-npm-5.0.2-66021d3d61-0063db616d.zip/node_modules/@react-dnd/asap/",\ + "packageDependencies": [\ + ["@react-dnd/asap", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@react-dnd/invariant", [\ + ["npm:4.0.2", {\ + "packageLocation": "./.yarn/cache/@react-dnd-invariant-npm-4.0.2-826eacc1ea-b303cc53fc.zip/node_modules/@react-dnd/invariant/",\ + "packageDependencies": [\ + ["@react-dnd/invariant", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@react-dnd/shallowequal", [\ + ["npm:4.0.2", {\ + "packageLocation": "./.yarn/cache/@react-dnd-shallowequal-npm-4.0.2-f944714335-9a352fd176.zip/node_modules/@react-dnd/shallowequal/",\ + "packageDependencies": [\ + ["@react-dnd/shallowequal", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@react-pdf/fns", [\ ["npm:2.2.1", {\ "packageLocation": "./.yarn/cache/@react-pdf-fns-npm-2.2.1-77536ed89f-457bdff57e.zip/node_modules/@react-pdf/fns/",\ @@ -8560,6 +8587,8 @@ const RAW_RUNTIME_STATE = ["qrcode.react", "virtual:9845906954fdbefbb879db24fa8772d77a945dca59f459806df47a5b67245d4bc6502880b373cca7201062c81bea9f13f699f52de2004c037e79dbdbd5d97fb3#npm:3.1.0"],\ ["react", "npm:18.2.0"],\ ["react-daum-postcode", "virtual:9845906954fdbefbb879db24fa8772d77a945dca59f459806df47a5b67245d4bc6502880b373cca7201062c81bea9f13f699f52de2004c037e79dbdbd5d97fb3#npm:3.1.3"],\ + ["react-dnd", "virtual:9845906954fdbefbb879db24fa8772d77a945dca59f459806df47a5b67245d4bc6502880b373cca7201062c81bea9f13f699f52de2004c037e79dbdbd5d97fb3#npm:16.0.1"],\ + ["react-dnd-html5-backend", "npm:16.0.1"],\ ["react-dom", "virtual:de80dc576383b2386358abc0e9fe49c00e3397fe355a0337462b73ab3115c2e557eb85784ee0fe776394cc11dd020b4e84dbbd75acf72ee6d54415d82d21f5c5#npm:18.2.0"],\ ["react-dropzone", "virtual:9845906954fdbefbb879db24fa8772d77a945dca59f459806df47a5b67245d4bc6502880b373cca7201062c81bea9f13f699f52de2004c037e79dbdbd5d97fb3#npm:14.2.3"],\ ["react-hook-form", "virtual:9845906954fdbefbb879db24fa8772d77a945dca59f459806df47a5b67245d4bc6502880b373cca7201062c81bea9f13f699f52de2004c037e79dbdbd5d97fb3#npm:7.50.0"],\ @@ -10326,6 +10355,18 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["dnd-core", [\ + ["npm:16.0.1", {\ + "packageLocation": "./.yarn/cache/dnd-core-npm-16.0.1-552224cee0-6b852c576c.zip/node_modules/dnd-core/",\ + "packageDependencies": [\ + ["dnd-core", "npm:16.0.1"],\ + ["@react-dnd/asap", "npm:5.0.2"],\ + ["@react-dnd/invariant", "npm:4.0.2"],\ + ["redux", "npm:4.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["doctrine", [\ ["npm:2.1.0", {\ "packageLocation": "./.yarn/cache/doctrine-npm-2.1.0-ac15d049b7-b6416aaff1.zip/node_modules/doctrine/",\ @@ -16234,6 +16275,47 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["react-dnd", [\ + ["npm:16.0.1", {\ + "packageLocation": "./.yarn/cache/react-dnd-npm-16.0.1-974f047d7b-d069435750.zip/node_modules/react-dnd/",\ + "packageDependencies": [\ + ["react-dnd", "npm:16.0.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:9845906954fdbefbb879db24fa8772d77a945dca59f459806df47a5b67245d4bc6502880b373cca7201062c81bea9f13f699f52de2004c037e79dbdbd5d97fb3#npm:16.0.1", {\ + "packageLocation": "./.yarn/__virtual__/react-dnd-virtual-4b292e52c3/0/cache/react-dnd-npm-16.0.1-974f047d7b-d069435750.zip/node_modules/react-dnd/",\ + "packageDependencies": [\ + ["react-dnd", "virtual:9845906954fdbefbb879db24fa8772d77a945dca59f459806df47a5b67245d4bc6502880b373cca7201062c81bea9f13f699f52de2004c037e79dbdbd5d97fb3#npm:16.0.1"],\ + ["@react-dnd/invariant", "npm:4.0.2"],\ + ["@react-dnd/shallowequal", "npm:4.0.2"],\ + ["@types/hoist-non-react-statics", null],\ + ["@types/node", null],\ + ["@types/react", "npm:18.2.48"],\ + ["dnd-core", "npm:16.0.1"],\ + ["fast-deep-equal", "npm:3.1.3"],\ + ["hoist-non-react-statics", "npm:3.3.2"],\ + ["react", "npm:18.2.0"]\ + ],\ + "packagePeers": [\ + "@types/hoist-non-react-statics",\ + "@types/node",\ + "@types/react",\ + "react"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["react-dnd-html5-backend", [\ + ["npm:16.0.1", {\ + "packageLocation": "./.yarn/cache/react-dnd-html5-backend-npm-16.0.1-754940d855-6e4b632a11.zip/node_modules/react-dnd-html5-backend/",\ + "packageDependencies": [\ + ["react-dnd-html5-backend", "npm:16.0.1"],\ + ["dnd-core", "npm:16.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["react-docgen", [\ ["npm:7.0.3", {\ "packageLocation": "./.yarn/cache/react-docgen-npm-7.0.3-ea0f679a0f-74622750e6.zip/node_modules/react-docgen/",\ @@ -16964,6 +17046,16 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["redux", [\ + ["npm:4.2.1", {\ + "packageLocation": "./.yarn/cache/redux-npm-4.2.1-e7e2cf2e37-136d98b3d5.zip/node_modules/redux/",\ + "packageDependencies": [\ + ["redux", "npm:4.2.1"],\ + ["@babel/runtime", "npm:7.23.9"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["regenerate", [\ ["npm:1.4.2", {\ "packageLocation": "./.yarn/cache/regenerate-npm-1.4.2-b296c5b63a-f73c9eba5d.zip/node_modules/regenerate/",\ diff --git a/apps/admin/package.json b/apps/admin/package.json index 9432d0e0..f49ff77f 100644 --- a/apps/admin/package.json +++ b/apps/admin/package.json @@ -29,6 +29,8 @@ "qrcode.react": "^3.1.0", "react": "^18.2.0", "react-daum-postcode": "^3.1.3", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", "react-hook-form": "^7.50.0", diff --git a/apps/admin/src/App.tsx b/apps/admin/src/App.tsx index 2ed23ccf..6e602774 100644 --- a/apps/admin/src/App.tsx +++ b/apps/admin/src/App.tsx @@ -3,6 +3,8 @@ import './index.css'; import { QueryClientProvider } from '@boolti/api'; import { BooltiUIProvider } from '@boolti/ui'; +import { DndProvider } from 'react-dnd' +import { HTML5Backend } from 'react-dnd-html5-backend' import { setDefaultOptions } from 'date-fns'; import { ko } from 'date-fns/locale'; import { @@ -155,7 +157,9 @@ const routes: RouteObject[] = [ - + + + diff --git a/apps/admin/src/components/ShowCastInfo/ShowCastInfo.styles.ts b/apps/admin/src/components/ShowCastInfo/ShowCastInfo.styles.ts index da058c2d..d04a1082 100644 --- a/apps/admin/src/components/ShowCastInfo/ShowCastInfo.styles.ts +++ b/apps/admin/src/components/ShowCastInfo/ShowCastInfo.styles.ts @@ -18,8 +18,6 @@ const Header = styled.div` align-items: center; border-radius: 8px 8px 0px 0px; border: 1px solid ${({ theme }) => theme.palette.grey.g20}; - color: ${({ theme }) => theme.palette.grey.g90}; - ${({ theme }) => theme.typo.sh2}; padding: 24px 28px; &:last-child { @@ -27,6 +25,25 @@ const Header = styled.div` } `; +const HeaderNameWrapper = styled.div` + display: flex; + align-items: center; + gap: 12px; +` + +const Handle = styled.div` + display: inline-flex; + align-items: center; + justify-content: center; + color: ${({ theme }) => theme.palette.grey.g40}; + cursor: move; +` + +const Name = styled.span` + color: ${({ theme }) => theme.palette.grey.g90}; + ${({ theme }) => theme.typo.sh2}; +`; + const EditButton = styled(Button)` padding: 13px 18px; & > svg { @@ -118,6 +135,9 @@ const CollapseButton = styled.button` export default { Container, Header, + HeaderNameWrapper, + Handle, + Name, Cast, CollapseButton, EditButton, diff --git a/apps/admin/src/components/ShowCastInfo/index.tsx b/apps/admin/src/components/ShowCastInfo/index.tsx index 05d7ae62..9ffcbd4e 100644 --- a/apps/admin/src/components/ShowCastInfo/index.tsx +++ b/apps/admin/src/components/ShowCastInfo/index.tsx @@ -1,19 +1,72 @@ import { useDialog } from '@boolti/ui'; +import { useDrag, useDrop } from 'react-dnd' import Styled from './ShowCastInfo.styles'; -import { EditIcon, ChevronDownIcon, ChevronUpIcon, UserIcon } from '@boolti/icon'; -import { useState } from 'react'; +import { EditIcon, ChevronDownIcon, ChevronUpIcon, UserIcon, MenuIcon } from '@boolti/icon'; +import { useRef, useState } from 'react'; import ShowCastInfoFormDialogContent, { TempShowCastInfoFormInput, } from '../ShowCastInfoFormDialogContent'; +import { ShowCastTeamReadResponse } from '@boolti/api'; + +export interface CastTeamListDraft extends ShowCastTeamReadResponse { + index: number; +} interface Props { - showCastInfo: TempShowCastInfoFormInput; + showCastInfo: CastTeamListDraft; + index: number; onSave: (value: TempShowCastInfoFormInput) => Promise; + onDropHover: (draggedItemId: number, hoverIndex: number) => void; + onDrop: () => void; onDelete?: () => Promise; } -const ShowCastInfo = ({ showCastInfo, onSave, onDelete }: Props) => { +interface DragItem { + id: number + index: number +} + +const ShowCastInfo = ({ showCastInfo, index, onSave, onDropHover, onDrop, onDelete }: Props) => { + const ref = useRef(null) + const [{ isDragging }, drag, preview] = useDrag(() => ({ + type: 'castTeam', + previewOptions: { + captureDraggingState: true, + }, + item: { id: showCastInfo.id, index: showCastInfo.index }, + collect: (monitor) => ({ + isDragging: monitor.isDragging() + }), + })) + const [, drop] = useDrop({ + accept: 'castTeam', + hover(item: DragItem, monitor) { + if (!ref.current) return + if (!monitor.canDrop()) return + if (item.id === showCastInfo.id) return + + const dragIndex = item.index + const hoverIndex = index + + const hoverBoundingRect = ref.current.getBoundingClientRect() + const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2 + const clientOffset = monitor.getClientOffset() + if (!clientOffset) return + + const hoverClientY = clientOffset.y - hoverBoundingRect.top + if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) return + if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) return + + item.index = hoverIndex + + onDropHover(item.id, index) + }, + drop() { + onDrop() + } + }) + const { members = [] } = showCastInfo; const memberLength = members.length ?? 0; const dialog = useDialog(); @@ -22,79 +75,90 @@ const ShowCastInfo = ({ showCastInfo, onSave, onDelete }: Props) => { const toggle = () => setIsOpen((prev) => !prev); return ( - - - {showCastInfo.name} - { - e.preventDefault(); - dialog.open({ - title: '출연진 정보 편집', - isAuto: true, - content: ( - { - try { - await onSave(castInfo); - dialog.close(); - } catch { - return new Promise((_, reject) => reject('저장 중 오류가 발생하였습니다.')); - } - }} - prevShowCastInfo={showCastInfo} - onDelete={async () => { - try { - await onDelete?.(); - dialog.close(); - } catch { - return new Promise((_, reject) => reject('삭제 중 오류가 발생하였습니다.')); - } - }} - /> - ), - }); - }} - > - - 편집하기 - - - {memberLength > 0 && ( - <> - - {members.map((member) => ( - - {member.userImgPath ? ( - - ) : ( - - )} - {member.userNickname} - ({member.roleName}) - - ))} - - { - e.preventDefault(); - toggle(); - }} - > - {isOpen ? '팀원 리스트 접기' : '팀원 리스트 펼쳐보기'} - {isOpen ? : } - - - )} - + +
+
+ + + + + + + {showCastInfo.name} + + + { + e.preventDefault(); + dialog.open({ + title: '출연진 정보 편집', + isAuto: true, + content: ( + { + try { + await onSave(castInfo); + dialog.close(); + } catch { + return new Promise((_, reject) => reject('저장 중 오류가 발생하였습니다.')); + } + }} + prevShowCastInfo={showCastInfo} + onDelete={async () => { + try { + await onDelete?.(); + dialog.close(); + } catch { + return new Promise((_, reject) => reject('삭제 중 오류가 발생하였습니다.')); + } + }} + /> + ), + }); + }} + > + + 편집하기 + + + {memberLength > 0 && ( + <> + + {members.map((member) => ( + + {member.userImgPath ? ( + + ) : ( + + )} + {member.userNickname} + ({member.roleName}) + + ))} + + { + e.preventDefault(); + toggle(); + }} + > + {isOpen ? '팀원 리스트 접기' : '팀원 리스트 펼쳐보기'} + {isOpen ? : } + + + )} +
+
+
); }; diff --git a/apps/admin/src/components/ShowCastInfoFormDialogContent/index.tsx b/apps/admin/src/components/ShowCastInfoFormDialogContent/index.tsx index ace1e584..836e94c5 100644 --- a/apps/admin/src/components/ShowCastInfoFormDialogContent/index.tsx +++ b/apps/admin/src/components/ShowCastInfoFormDialogContent/index.tsx @@ -10,6 +10,7 @@ import { replaceUserCode } from '~/utils/replace'; export interface TempShowCastInfoFormInput { name: string; members?: Array>; + order?: number; } interface Props { @@ -163,8 +164,8 @@ const ShowCastInfoFormDialogContent = ({ onDelete, prevShowCastInfo, onSave }: P } catch { toast.error( '불티에 회원으로 등록된 식별 코드로만 등록이 가능합니다.' + - '\n' + - '식별 코드를 확인 후 다시 시도해 주세요.', + '\n' + + '식별 코드를 확인 후 다시 시도해 주세요.', ); } finally { setIsMemberFieldBlurred((prev) => { diff --git a/apps/admin/src/pages/ShowInfoPage/index.tsx b/apps/admin/src/pages/ShowInfoPage/index.tsx index e9196acd..bd2ee527 100644 --- a/apps/admin/src/pages/ShowInfoPage/index.tsx +++ b/apps/admin/src/pages/ShowInfoPage/index.tsx @@ -4,6 +4,7 @@ import { ShowImage, queryKeys, useCastTeamList, + useChangeCastTeamOrder, useDeleteCastTeams, useDeleteShow, useEditShowInfo, @@ -34,7 +35,7 @@ import { HostType } from '@boolti/api/src/types/host'; import ShowDetailUnauthorized from '~/components/ShowDetailUnauthorized'; import Portal from '@boolti/ui/src/components/Portal'; import ShowCastInfoFormContent from '~/components/ShowInfoFormContent/ShowCastInfoFormContent'; -import ShowCastInfo from '~/components/ShowCastInfo'; +import ShowCastInfo, { CastTeamListDraft } from '~/components/ShowCastInfo'; import { TempShowCastInfoFormInput } from '~/components/ShowCastInfoFormDialogContent'; import { useBodyScrollLock } from '~/hooks/useBodyScrollLock'; @@ -54,7 +55,9 @@ const ShowInfoPage = () => { const showId = Number(params!.showId); const { data: show } = useShowDetail(showId); const { data: showSalesInfo } = useShowSalesInfo(showId); - const { data: castTeamList } = useCastTeamList(showId); + const { data: castTeamList, refetch: refetchCastTeamList } = useCastTeamList(showId); + + const [castTeamListDraft, setCastTeamListDraft] = useState(null); const editShowInfoMutation = useEditShowInfo(); const uploadShowImageMutation = useUploadShowImage(); @@ -62,6 +65,7 @@ const ShowInfoPage = () => { const putCastTeams = usePutCastTeams(); const postCastTeams = usePostCastTeams(); const deleteCastTeams = useDeleteCastTeams(); + const changeCastTeamOrder = useChangeCastTeamOrder(); const toast = useToast(); const confirm = useConfirm(); @@ -134,6 +138,39 @@ const ShowInfoPage = () => { return true; }, [confirm, isImageFilesDirty, onSubmit, showInfoForm]); + const changeCastTeamIndex = useCallback((draggedItemId: number, targetIndex: number) => { + setCastTeamListDraft((prevDraft) => { + if (prevDraft === null) return prevDraft; + + const draggedItem = prevDraft.find(({ id }) => id === draggedItemId); + if (!draggedItem) return prevDraft; + + const nextDraft = [...prevDraft]; + + nextDraft.splice(nextDraft.indexOf(draggedItem), 1); + nextDraft.splice(targetIndex, 0, draggedItem); + + return nextDraft; + }) + }, []) + + const castTeamDropHoverHandler = useCallback((draggedItemId: number, hoverIndex: number) => { + changeCastTeamIndex(draggedItemId, hoverIndex); + }, [changeCastTeamIndex]); + + const castTeamDropHandler = useCallback(async () => { + if (!castTeamListDraft) return; + + await changeCastTeamOrder.mutateAsync({ + showId, + body: { + castTeamIds: castTeamListDraft.map(({ id }) => id), + }, + }); + + refetchCastTeamList(); + }, [castTeamListDraft, changeCastTeamOrder, refetchCastTeamList, showId]) + useEffect(() => { if (!show) return; @@ -154,6 +191,12 @@ const ShowInfoPage = () => { setShowImages(show.images); }, [show, showInfoForm]); + useEffect(() => { + if (!castTeamList) return; + + setCastTeamListDraft(castTeamList); + }, [castTeamList]) + useEffect(() => { setMiddleware(() => confirmSaveShowInfo); return () => { @@ -247,10 +290,11 @@ const ShowInfoPage = () => { ); }} /> - {castTeamList.map((info, index) => ( + {castTeamListDraft?.map((info, index) => ( { await putCastTeams.mutateAsync( { @@ -271,6 +315,8 @@ const ShowInfoPage = () => { }, ); }} + onDropHover={castTeamDropHoverHandler} + onDrop={castTeamDropHandler} onDelete={async () => { await deleteCastTeams.mutateAsync(info.id, { onSuccess: () => { diff --git a/packages/api/src/mutations/index.ts b/packages/api/src/mutations/index.ts index 9c1a8bc5..830ff458 100644 --- a/packages/api/src/mutations/index.ts +++ b/packages/api/src/mutations/index.ts @@ -41,6 +41,7 @@ import useSuperAdminEditSalesInfo from './useSuperAdminEditSalesInfo'; import usePutCastTeams from './usePutCastTeams'; import useDeleteCastTeams from './useDeleteCastTeams'; import usePostCastTeams from './usePostCastTeams'; +import useChangeCastTeamOrder from './useChangeCastTeamOrder'; export { usePostCastTeams, @@ -86,6 +87,7 @@ export { useSuperAdminCreateSalesTicket, useSuperAdminCreateInvitationTicket, useSuperAdminEditSalesInfo, + useChangeCastTeamOrder }; export type { ImageFile }; diff --git a/packages/api/src/mutations/useChangeCastTeamOrder.ts b/packages/api/src/mutations/useChangeCastTeamOrder.ts new file mode 100644 index 00000000..cd64e5ee --- /dev/null +++ b/packages/api/src/mutations/useChangeCastTeamOrder.ts @@ -0,0 +1,15 @@ +import { useMutation } from '@tanstack/react-query'; + +import { fetcher } from '../fetcher'; + +interface PostChangeCastTeamOrderRequest { + castTeamIds: number[]; +} + +const postChangeCastTeamOrder = (showId: number, body: PostChangeCastTeamOrderRequest) => + fetcher.post(`web/v1/shows/${showId}/cast-teams/change-sequence`, { json: body }); + +const useChangeCastTeamOrder = () => + useMutation(({ showId, body }: { showId: number, body: PostChangeCastTeamOrderRequest }) => postChangeCastTeamOrder(showId, body)); + +export default useChangeCastTeamOrder; diff --git a/packages/api/src/queries/useCastTeamList.ts b/packages/api/src/queries/useCastTeamList.ts index f130bd9f..0fdb6aee 100644 --- a/packages/api/src/queries/useCastTeamList.ts +++ b/packages/api/src/queries/useCastTeamList.ts @@ -1,7 +1,16 @@ import { useQuery } from '@tanstack/react-query'; import { queryKeys } from '../queryKey'; +import { ShowCastTeamReadResponse } from '../types'; -const useCastTeamList = (showId: number) => useQuery(queryKeys.castTeams.list(showId)); +const useCastTeamList = (showId: number) => useQuery({ + ...queryKeys.castTeams.list(showId), + select: (data: ShowCastTeamReadResponse[]) => { + return data.map((team, index) => ({ + ...team, + index + })); + } +}); export default useCastTeamList; diff --git a/packages/icon/src/components/Menu.tsx b/packages/icon/src/components/Menu.tsx index dfb928d1..1a42ff3a 100644 --- a/packages/icon/src/components/Menu.tsx +++ b/packages/icon/src/components/Menu.tsx @@ -3,21 +3,21 @@ export const Menu = () => { = 3.3.1" + "@types/node": ">= 12" + "@types/react": ">= 16" + react: ">= 16.14" + peerDependenciesMeta: + "@types/hoist-non-react-statics": + optional: true + "@types/node": + optional: true + "@types/react": + optional: true + checksum: 10c0/d069435750f0d6653cfa2b951cac8abb3583fb144ff134a20176608877d9c5964c63384ebbacaa0fdeef819b592a103de0d8e06f3b742311d64a029ffed0baa3 + languageName: node + linkType: hard + "react-docgen-typescript@npm:^2.2.2": version: 2.2.2 resolution: "react-docgen-typescript@npm:2.2.2" @@ -12075,6 +12143,15 @@ __metadata: languageName: node linkType: hard +"redux@npm:^4.2.0": + version: 4.2.1 + resolution: "redux@npm:4.2.1" + dependencies: + "@babel/runtime": "npm:^7.9.2" + checksum: 10c0/136d98b3d5dbed1cd6279c8c18a6a74c416db98b8a432a46836bdd668475de6279a2d4fd9d1363f63904e00f0678a8a3e7fa532c897163340baf1e71bb42c742 + languageName: node + linkType: hard + "regenerate-unicode-properties@npm:^10.1.0": version: 10.1.1 resolution: "regenerate-unicode-properties@npm:10.1.1"