@leav/ui 1.9.0-ce48a072 → 1.9.0-e09e8fd5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_gqlTypes/index.d.ts +103 -20
- package/dist/_gqlTypes/index.js +46 -11
- package/dist/_gqlTypes/index.js.map +1 -1
- package/dist/_queries/records/createRecordMutation.js +2 -2
- package/dist/_queries/records/createRecordMutation.js.map +1 -1
- package/dist/components/Explorer/Explorer.js +21 -11
- package/dist/components/Explorer/Explorer.js.map +1 -1
- package/dist/components/Explorer/ExplorerToolbar.js +2 -1
- package/dist/components/Explorer/ExplorerToolbar.js.map +1 -1
- package/dist/components/Explorer/_queries/useExplorerCountData.d.ts +16 -0
- package/dist/components/Explorer/_queries/useExplorerCountData.js +26 -0
- package/dist/components/Explorer/_queries/useExplorerCountData.js.map +1 -0
- package/dist/components/Explorer/actions-mass/ResultsCount.d.ts +10 -0
- package/dist/components/Explorer/actions-mass/ResultsCount.js +8 -0
- package/dist/components/Explorer/actions-mass/ResultsCount.js.map +1 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.d.ts +9 -2
- package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.js +18 -4
- package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.js.map +1 -1
- package/dist/components/Explorer/actions-mass/useMassActions.d.ts +5 -3
- package/dist/components/Explorer/actions-mass/useMassActions.js +19 -13
- package/dist/components/Explorer/actions-mass/useMassActions.js.map +1 -1
- package/dist/components/Explorer/actions-primary/useCreatePrimaryAction.d.ts +3 -1
- package/dist/components/Explorer/actions-primary/useCreatePrimaryAction.js +5 -1
- package/dist/components/Explorer/actions-primary/useCreatePrimaryAction.js.map +1 -1
- package/dist/components/RecordEdition/EditRecordContent/_types.d.ts +4 -0
- package/dist/components/RecordEdition/EditRecordContent/_types.js.map +1 -1
- package/dist/components/RecordEdition/EditRecordModal/EditRecordModal.js +27 -16
- package/dist/components/RecordEdition/EditRecordModal/EditRecordModal.js.map +1 -1
- package/dist/components/RecordEdition/EditRecordPage/EditRecordPage.js +28 -16
- package/dist/components/RecordEdition/EditRecordPage/EditRecordPage.js.map +1 -1
- package/dist/components/RecordEdition/EditRecordPage/ErrorComponent.d.ts +2 -0
- package/dist/components/RecordEdition/EditRecordPage/ErrorComponent.js +11 -0
- package/dist/components/RecordEdition/EditRecordPage/ErrorComponent.js.map +1 -0
- package/dist/components/RecordEdition/EditRecordPage/getInitialRecordValues.d.ts +2 -0
- package/dist/components/RecordEdition/EditRecordPage/getInitialRecordValues.js +35 -0
- package/dist/components/RecordEdition/EditRecordPage/getInitialRecordValues.js.map +1 -0
- package/dist/hooks/useIFrameMessenger/types.d.ts +5 -0
- package/dist/hooks/useIFrameMessenger/types.js.map +1 -1
- package/dist/locales/en/shared.json +2 -2
- package/dist/locales/fr/shared.json +2 -2
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorComponent.js","sourceRoot":"","sources":["../../../../src/components/RecordEdition/EditRecordPage/ErrorComponent.tsx"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAyB,SAAS,EAAC,MAAM,OAAO,CAAC;AAExD,MAAM,CAAC,MAAM,cAAc,GAAsB,GAAG,EAAE;IAClD,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,IAAI,KAAK,EAAE,CAAC;IACtB,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type FunctionComponent, useEffect} from 'react';\n\nexport const ErrorComponent: FunctionComponent = () => {\n useEffect(() => {\n throw new Error();\n }, []);\n return null;\n};\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06
|
|
2
|
+
// This file is released under LGPL V3
|
|
3
|
+
// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt
|
|
4
|
+
export const INITIAL_VALUES_QUERY_PARAMS = 'formInitialValues';
|
|
5
|
+
const removeFromQueryParams = (paramToRemove) => {
|
|
6
|
+
const searchParams = new URLSearchParams(location.search);
|
|
7
|
+
if (searchParams.get(paramToRemove)) {
|
|
8
|
+
searchParams.delete(paramToRemove);
|
|
9
|
+
const queryParams = searchParams.size > 0 ? `?${searchParams.toString()}` : '';
|
|
10
|
+
history.replaceState({}, '', `${location.pathname}${queryParams}`);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export const useGetInitialRecordValues = () => {
|
|
14
|
+
const searchParams = new URLSearchParams(location.search);
|
|
15
|
+
const decodedParams = decodeURIComponent(searchParams.get(INITIAL_VALUES_QUERY_PARAMS) ?? '{}');
|
|
16
|
+
let initialValues = null;
|
|
17
|
+
try {
|
|
18
|
+
initialValues = JSON.parse(decodedParams);
|
|
19
|
+
removeFromQueryParams(INITIAL_VALUES_QUERY_PARAMS);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
if (!initialValues || Object.keys(initialValues).length === 0) {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
const values = [];
|
|
28
|
+
Object.keys(initialValues).forEach(attributeId => {
|
|
29
|
+
initialValues[attributeId].forEach(val => {
|
|
30
|
+
values.push({ attribute: attributeId, payload: val });
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
return values;
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=getInitialRecordValues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getInitialRecordValues.js","sourceRoot":"","sources":["../../../../src/components/RecordEdition/EditRecordPage/getInitialRecordValues.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,MAAM,CAAC,MAAM,2BAA2B,GAAG,mBAAmB,CAAC;AAE/D,MAAM,qBAAqB,GAAG,CAAC,aAAqB,EAAE,EAAE;IACpD,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACnC,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,QAAQ,GAAG,WAAW,EAAE,CAAC,CAAC;IACvE,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE;IAC1C,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,kBAAkB,CAAC,YAAY,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,IAAI,CAAC,CAAC;IAChG,IAAI,aAAa,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC;QACD,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC1C,qBAAqB,CAAC,2BAA2B,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;QAC7C,aAAa,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACrC,MAAM,CAAC,IAAI,CAAC,EAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nexport const INITIAL_VALUES_QUERY_PARAMS = 'formInitialValues';\n\nconst removeFromQueryParams = (paramToRemove: string) => {\n const searchParams = new URLSearchParams(location.search);\n if (searchParams.get(paramToRemove)) {\n searchParams.delete(paramToRemove);\n const queryParams = searchParams.size > 0 ? `?${searchParams.toString()}` : '';\n history.replaceState({}, '', `${location.pathname}${queryParams}`);\n }\n};\n\nexport const useGetInitialRecordValues = () => {\n const searchParams = new URLSearchParams(location.search);\n const decodedParams = decodeURIComponent(searchParams.get(INITIAL_VALUES_QUERY_PARAMS) ?? '{}');\n let initialValues = null;\n try {\n initialValues = JSON.parse(decodedParams);\n removeFromQueryParams(INITIAL_VALUES_QUERY_PARAMS);\n } catch {\n return [];\n }\n\n if (!initialValues || Object.keys(initialValues).length === 0) {\n return [];\n }\n\n const values = [];\n Object.keys(initialValues).forEach(attributeId => {\n initialValues[attributeId].forEach(val => {\n values.push({attribute: attributeId, payload: val});\n });\n });\n\n return values;\n};\n"]}
|
|
@@ -4,6 +4,8 @@ import { type KitNotification } from 'aristid-ds';
|
|
|
4
4
|
import { type IKitConfirmDialog } from 'aristid-ds/dist/Kit/Feedback/Modal/types';
|
|
5
5
|
import { type ToastedAlertProps } from 'aristid-ds/dist/Kit/Feedback/Alert/types';
|
|
6
6
|
import { type LibraryIdSchema, type WhereSchema, type PanelIdSchema, type PanelSchema, type PanelIFrameSchema, type FlapPanelIdSchema, type attributeExplorerPanelSchema, type baseExplorerPanelSchema } from '../../hooks/useIFrameMessenger/schema';
|
|
7
|
+
import { type AnyPrimitive } from '@leav/utils';
|
|
8
|
+
import { type IRecordIdentity, type ITreeNodeWithRecord } from '../../types';
|
|
7
9
|
export declare const packetId = "__fromIframeMessenger";
|
|
8
10
|
export interface IEncodedMessage {
|
|
9
11
|
payload: string;
|
|
@@ -67,6 +69,9 @@ export type NavigateToPanelMessage = IMessageBase & {
|
|
|
67
69
|
flapRecordId?: string;
|
|
68
70
|
flapLibraryId?: LibraryId;
|
|
69
71
|
flapPanelId?: FlapPanelId;
|
|
72
|
+
queryParams?: Record<string, string> & {
|
|
73
|
+
formInitialValues?: Record<string, Array<AnyPrimitive | IRecordIdentity | ITreeNodeWithRecord>>;
|
|
74
|
+
};
|
|
70
75
|
};
|
|
71
76
|
};
|
|
72
77
|
export type ClosePanelMessage = IMessageBase & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/hooks/useIFrameMessenger/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/hooks/useIFrameMessenger/types.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,QAAQ,GAAG,uBAAuB,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type RefObject, type ComponentProps, type Key, type JSXElementConstructor} from 'react';\nimport type * as z from 'zod/v4';\nimport {type KitNotification} from 'aristid-ds';\nimport {type IKitConfirmDialog} from 'aristid-ds/dist/Kit/Feedback/Modal/types';\nimport {type ToastedAlertProps} from 'aristid-ds/dist/Kit/Feedback/Alert/types';\nimport {\n type LibraryIdSchema,\n type WhereSchema,\n type PanelIdSchema,\n type PanelSchema,\n type PanelIFrameSchema,\n type FlapPanelIdSchema,\n type attributeExplorerPanelSchema,\n type baseExplorerPanelSchema,\n} from '_ui/hooks/useIFrameMessenger/schema';\nimport {type AnyPrimitive} from '@leav/utils';\nimport {type IRecordIdentity, type ITreeNodeWithRecord} from '_ui/types';\n\nexport const packetId = '__fromIframeMessenger';\n\nexport interface IEncodedMessage {\n payload: string;\n [packetId]: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ComponentPropsWithKey<T extends keyof JSX.IntrinsicElements | JSXElementConstructor<any>> =\n ComponentProps<T> & {\n key?: Key;\n };\n\nexport interface IMessageBase {\n __frameId?: string;\n}\n\nexport type ModalConfirmMessage = IMessageBase & {\n type: 'modal-confirm';\n id: string;\n data: IKitConfirmDialog;\n overrides?: string[];\n};\n\nexport type AlertMessage = IMessageBase & {\n type: 'alert';\n id: string;\n data: ToastedAlertProps;\n overrides?: string[];\n};\n\nexport type NotificationMessage = IMessageBase & {\n type: 'notification';\n id: string;\n data: ComponentPropsWithKey<typeof KitNotification>;\n overrides?: string[];\n};\n\nexport type ChangeLanguageMessage = IMessageBase & {\n type: 'change-language';\n language: string;\n};\n\nexport type SimpleMessage = IMessageBase & {\n type: 'message';\n id: string;\n data: unknown;\n};\n\nexport type RegisterMessage = IMessageBase & {\n type: 'register';\n id: string;\n};\n\nexport type UnregisterMessage = IMessageBase & {\n type: 'unregister';\n id: string;\n};\n\nexport type Panel = z.infer<typeof PanelSchema>;\n\nexport type AttributeExplorerPanel = Panel &\n z.infer<typeof baseExplorerPanelSchema> &\n z.infer<typeof attributeExplorerPanelSchema>;\n\nexport type LibraryId = z.infer<typeof LibraryIdSchema>;\n\nexport type PanelId = z.infer<typeof PanelIdSchema>;\n\nexport type Where = z.infer<typeof WhereSchema>;\n\nexport type PanelIFrame = z.infer<typeof PanelIFrameSchema>;\n\ntype FlapPanelId = z.infer<typeof FlapPanelIdSchema>;\n\nexport type NavigateToPanelMessage = IMessageBase & {\n type: 'navigate-to-panel';\n data: {\n where: Where;\n libraryId: LibraryId;\n panelId?: PanelId;\n recordId?: string;\n flapRecordId?: string;\n flapLibraryId?: LibraryId;\n flapPanelId?: FlapPanelId;\n queryParams?: Record<string, string> & {\n formInitialValues?: Record<string, Array<AnyPrimitive | IRecordIdentity | ITreeNodeWithRecord>>;\n };\n };\n};\n\nexport type ClosePanelMessage = IMessageBase & {\n type: 'close-panel';\n data: {\n recordId: string;\n where: string;\n recordPanelId: string;\n };\n};\n\nexport type NavigateToIframeMessage = IMessageBase & {\n type: 'navigate-to-iframe';\n data: {\n panel: PanelIFrame;\n destination: {libraryId: LibraryId};\n where: Where;\n recordId: string;\n recordPanelId: string;\n };\n};\n\nexport type MessageToPanelMessage = IMessageBase & {\n type: 'message-to-panel';\n data: {\n type: string;\n target?: string;\n payload: unknown;\n };\n};\n\nexport type OpenFlapPanelMessage = IMessageBase & {\n type: 'open-flap-panel';\n data: {\n flapRecordId: string;\n flapLibraryId: LibraryId;\n flapPanelId: FlapPanelId;\n redirectUrl?: string;\n };\n};\n\nexport type CloseFlapPanelMessage = IMessageBase & {\n type: 'close-flap-panel';\n};\n\nexport type GetUrlMessage = IMessageBase & {\n type: 'get-url';\n id: string;\n data: {\n onGetUrl: (url: string) => void;\n flapParams?: {\n flapRecordId: string;\n flapLibraryId: LibraryId;\n flapPanelId: FlapPanelId;\n };\n panelParams?: {\n recordId: string;\n where: Where;\n recordPanelId: PanelId;\n };\n };\n overrides?: string[];\n};\n\nexport type GetPanelConfigMessage = IMessageBase & {\n type: 'get-panel-config';\n id: string;\n data: {\n panelId?: string;\n onGetPanelConfig: (data: PanelIFrame) => void;\n };\n overrides?: string[];\n};\n\nexport type MessageToParent =\n | ModalConfirmMessage\n | AlertMessage\n | NotificationMessage\n | SimpleMessage\n | RegisterMessage\n | UnregisterMessage\n | NavigateToPanelMessage\n | ClosePanelMessage\n | NavigateToIframeMessage\n | MessageToPanelMessage\n | OpenFlapPanelMessage\n | CloseFlapPanelMessage\n | GetUrlMessage\n | GetPanelConfigMessage;\n\nexport type MessageFromParent =\n | (IMessageBase & {\n type: 'on-call-callback';\n path: string;\n data: unknown;\n })\n | ChangeLanguageMessage;\n\nexport type Message = MessageToParent | MessageFromParent;\n\nexport type MessageHandler<T = Message> = (message: T, dispatch: MessageDispatcher<T>) => void;\nexport type MessageDispatcher<T = Message> = (message: T, frameId?: string) => void;\n\nexport type CallCbFunction = (path: string, data: unknown, frameId: string) => void;\n\nexport type CallbackFunction = (...args: never[]) => void;\nexport type Callbacks = Record<string, Record<string, CallbackFunction>>;\n\nexport type MessageToPanelMessageHandler = (data: MessageToPanelMessage['data']['payload']) => void;\nexport type AddMessageToPanelMessageHandler = (type: string, handler: MessageToPanelMessageHandler) => void;\n\nexport interface IUseIFrameMessengerOptions {\n ref?: RefObject<HTMLIFrameElement>;\n id?: string;\n handlers?: {\n onModalConfirm?: (\n data: ModalConfirmMessage['data'],\n id: string,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n ) => void;\n onAlert?: (data: AlertMessage['data'], id: string, dispatch: MessageDispatcher, callCb: CallCbFunction) => void;\n onNotification?: (\n data: NotificationMessage['data'],\n id: string,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n ) => void;\n onMessage?: (data: unknown, id: string, dispatch: MessageDispatcher, callCb: CallCbFunction) => void;\n onNavigateToPanel?: (data: NavigateToPanelMessage['data']) => void;\n onClosePanel?: (data: ClosePanelMessage['data']) => void;\n onNavigateToIframe?: (data: NavigateToIframeMessage['data']) => void;\n onOpenFlapPanel?: (data: OpenFlapPanelMessage['data']) => void;\n onGetUrl?: (data: GetUrlMessage['data']) => void;\n onGetPanelConfig?: (\n data: GetPanelConfigMessage['data'],\n id: string,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n ) => void;\n onCloseFlapPanel?: () => void;\n };\n}\n"]}
|
|
@@ -746,8 +746,8 @@
|
|
|
746
746
|
"copied": "Copied"
|
|
747
747
|
},
|
|
748
748
|
"massAction": {
|
|
749
|
-
"
|
|
750
|
-
"
|
|
749
|
+
"results_one": "result",
|
|
750
|
+
"results_other": "results",
|
|
751
751
|
"selectedItems_one": "{{count, number}} selected",
|
|
752
752
|
"selectedItems_other": "{{count, number}} selected",
|
|
753
753
|
"deactivate": "Deactivate",
|
|
@@ -746,8 +746,8 @@
|
|
|
746
746
|
"copied": "Copié"
|
|
747
747
|
},
|
|
748
748
|
"massAction": {
|
|
749
|
-
"
|
|
750
|
-
"
|
|
749
|
+
"results_one": "résultat",
|
|
750
|
+
"results_other": "résultats",
|
|
751
751
|
"selectedItems_one": "{{count, number}} sélectionné",
|
|
752
752
|
"selectedItems_other": "{{count, number}} sélectionnés",
|
|
753
753
|
"deactivate": "Supprimer",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leav/ui",
|
|
3
|
-
"version": "1.9.0-
|
|
3
|
+
"version": "1.9.0-e09e8fd5",
|
|
4
4
|
"description": "Shared React components and hooks",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"prepublishOnly": "yarn build",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"@types/react": "18.2.14",
|
|
45
45
|
"@types/react-dom": "18.2.6",
|
|
46
46
|
"@types/react-table": "7.7.20",
|
|
47
|
-
"aristid-ds": "15.0.0-
|
|
47
|
+
"aristid-ds": "15.0.0-6a7cc18",
|
|
48
48
|
"babel-jest": "29.7.0",
|
|
49
49
|
"graphql": "16.12.0",
|
|
50
50
|
"i18next": "22.5.1",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
|
64
64
|
"@apollo/client": ">=3.8.1",
|
|
65
|
-
"aristid-ds": "15.0.0-
|
|
65
|
+
"aristid-ds": "15.0.0-6a7cc18",
|
|
66
66
|
"i18next": ">=22.5.1",
|
|
67
67
|
"react": "^18.2.0",
|
|
68
68
|
"react-dom": "^18.2.0",
|