5htp-core 0.1.2 → 0.2.1
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/changelog.md +5 -0
- package/doc/TODO.md +71 -0
- package/package.json +5 -4
- package/src/client/{App.tsx → app/component.tsx} +15 -11
- package/src/client/app/index.ts +128 -0
- package/src/client/app/service.ts +34 -0
- package/src/client/app.tsconfig.json +0 -4
- package/src/client/assets/css/components.less +52 -0
- package/src/client/assets/css/core.less +7 -28
- package/src/client/assets/css/theme.less +1 -1
- package/src/client/assets/css/{borders.less → utils/borders.less} +0 -0
- package/src/client/assets/css/{layouts.less → utils/layouts.less} +0 -0
- package/src/client/assets/css/{medias.less → utils/medias.less} +14 -1
- package/src/client/assets/css/{sizing.less → utils/sizing.less} +0 -0
- package/src/client/assets/css/{spacing.less → utils/spacing.less} +0 -0
- package/src/client/components/Card/index.tsx +13 -7
- package/src/client/components/Dialog/Manager.tsx +41 -14
- package/src/client/components/Dialog/index.less +2 -4
- package/src/client/components/Form/index.tsx +1 -1
- package/src/client/components/Row/index.less +0 -2
- package/src/client/components/Table/index.tsx +3 -2
- package/src/client/components/button.tsx +2 -2
- package/src/client/components/containers/Popover/index.tsx +1 -1
- package/src/client/components/containers/champs.less +0 -2
- package/src/client/components/data/spintext/index.tsx +1 -1
- package/src/client/components/dropdown/index.tsx +1 -1
- package/src/client/components/index.ts +23 -0
- package/src/client/components/input/BaseV2/index.less +0 -2
- package/src/client/components/input/BaseV2/index.tsx +1 -1
- package/src/client/components/input/Date/index.less +0 -2
- package/src/client/components/input/Periode/index.less +0 -2
- package/src/client/components/input/Radio/index.less +0 -2
- package/src/client/components/input/UploadImage/index.less +0 -2
- package/src/client/components/input/UploadImage/index.tsx +1 -1
- package/src/client/hooks/index.ts +5 -0
- package/src/client/hooks/useState/index.tsx +2 -2
- package/src/client/hooks.ts +22 -0
- package/src/client/index.ts +5 -0
- package/src/client/pages/_layout/landing/index.tsx +0 -2
- package/src/client/pages/_messages/400.tsx +2 -2
- package/src/client/pages/_messages/401.tsx +2 -2
- package/src/client/pages/_messages/403.tsx +2 -2
- package/src/client/pages/_messages/404.tsx +2 -2
- package/src/client/pages/_messages/500.tsx +2 -2
- package/src/client/pages/bug.tsx +1 -1
- package/src/client/pages/useHeader.tsx +1 -1
- package/src/client/{context/captcha.ts → services/captcha/index.ts} +0 -0
- package/src/client/services/metrics/index.ts +37 -0
- package/src/client/{router → services/router/components}/Link.tsx +1 -1
- package/src/client/services/router/components/Page.tsx +59 -0
- package/src/client/{router/component.tsx → services/router/components/router.tsx} +52 -74
- package/src/client/services/router/index.tsx +453 -0
- package/src/client/services/router/request/api.ts +227 -0
- package/src/client/{router → services/router}/request/history.ts +0 -0
- package/src/client/services/router/request/index.ts +52 -0
- package/src/client/services/router/response/index.tsx +107 -0
- package/src/client/services/router/response/page.ts +90 -0
- package/src/client/{context/socket.ts → services/socket/index.ts} +2 -2
- package/src/client/utils/dom.ts +1 -1
- package/src/common/app/index.ts +9 -0
- package/src/common/data/chaines/index.ts +9 -6
- package/src/common/data/input/validate.ts +3 -166
- package/src/common/data/objets.ts +25 -0
- package/src/common/data/tableaux.ts +8 -0
- package/src/common/errors/index.ts +3 -1
- package/src/common/router/index.ts +67 -88
- package/src/common/router/layouts.ts +50 -0
- package/src/common/router/register.ts +62 -0
- package/src/common/router/request/api.ts +72 -0
- package/src/common/router/request/index.ts +31 -0
- package/src/common/router/{response.ts → response/index.ts} +9 -13
- package/src/common/router/response/page.ts +46 -54
- package/src/common/validation/index.ts +3 -0
- package/src/common/validation/schema.ts +185 -0
- package/src/common/validation/validator.ts +95 -0
- package/src/common/validation/validators.ts +313 -0
- package/src/server/app/config.ts +9 -27
- package/src/server/app/index.ts +81 -124
- package/src/server/app/service.ts +98 -0
- package/src/server/app.tsconfig.json +0 -8
- package/src/server/index.ts +5 -0
- package/src/server/patch.ts +0 -6
- package/src/server/{data/Cache.ts → services/cache/index.ts} +79 -47
- package/src/server/services/console/bugReporter.ts +26 -16
- package/src/server/services/console/index.ts +59 -51
- package/src/server/services/cron/index.ts +12 -26
- package/src/server/services/database/bucket.ts +40 -0
- package/src/server/services/database/connection.ts +213 -80
- package/src/server/services/database/datatypes.ts +63 -40
- package/src/server/services/database/debug.ts +20 -0
- package/src/server/services/database/index.ts +295 -272
- package/src/server/services/database/metas.ts +246 -135
- package/src/server/services/database/stats.ts +151 -126
- package/src/server/services/email/index.ts +30 -62
- package/src/server/services/email/transporter.ts +38 -0
- package/src/server/services/{router/request/services → metrics}/detect.ts +8 -10
- package/src/server/services/{router/request/services/tracking.ts → metrics/index.ts} +68 -45
- package/src/server/services/{http → router/http}/index.ts +28 -70
- package/src/server/services/{http → router/http}/multipart.ts +0 -0
- package/src/server/services/{http → router/http}/session.ts.old +0 -0
- package/src/server/services/router/index.ts +273 -202
- package/src/server/services/router/request/api.ts +76 -0
- package/src/server/services/router/request/index.ts +16 -97
- package/src/server/services/router/request/service.ts +21 -0
- package/src/server/services/router/response/index.ts +131 -65
- package/src/server/services/router/response/{filter → mask}/Filter.ts +0 -0
- package/src/server/services/router/response/{filter → mask}/index.ts +0 -2
- package/src/server/services/router/response/{filter → mask}/selecteurs.ts +0 -0
- package/src/server/services/router/response/page/document.tsx +194 -0
- package/src/server/services/router/response/page/index.tsx +157 -0
- package/src/server/{libs/pages → services/router/response/page}/schemaGenerator.ts +0 -0
- package/src/server/services/router/service.ts +48 -0
- package/src/server/services/schema/index.ts +47 -0
- package/src/server/services/schema/request.ts +55 -0
- package/src/server/services/schema/router.ts +33 -0
- package/src/server/services/socket/index.ts +38 -43
- package/src/server/services/socket/scope.ts +6 -4
- package/src/server/services/users/index.ts +203 -0
- package/src/server/services/{auth/base.ts → users/old.ts} +28 -112
- package/src/server/services/users/router/index.ts +72 -0
- package/src/server/services/users/router/request.ts +49 -0
- package/src/server/{data → services_old}/SocketClient.ts +0 -0
- package/src/server/{data/Token.olg.ts → services_old/Token.old.ts} +0 -0
- package/src/server/{data → services_old}/aes.ts +0 -0
- package/src/types/aliases.d.ts +43 -2
- package/templates/composant.tsx +1 -1
- package/templates/modal.tsx +1 -1
- package/templates/page.tsx +1 -1
- package/tsconfig.common.json +0 -4
- package/src/client/assets/css/components/components.less +0 -31
- package/src/client/context/api.ts +0 -92
- package/src/client/context/index.ts +0 -246
- package/src/client/index.tsx +0 -129
- package/src/client/router/index.ts +0 -286
- package/src/client/router/request/index.ts +0 -106
- package/src/client/router/response/index.ts +0 -38
- package/src/client/router/route.ts +0 -75
- package/src/common/data/input/validators/basic.ts +0 -299
- package/src/common/data/input/validators/build.ts +0 -63
- package/src/common/router/request.ts +0 -83
- package/src/server/data/ApiClient.ts +0 -119
- package/src/server/data/input.ts +0 -41
- package/src/server/libs/pages/document.static.tsx +0 -41
- package/src/server/libs/pages/document.tsx +0 -203
- package/src/server/libs/pages/render.tsx +0 -90
- package/src/server/routes/auth.ts +0 -151
- package/src/server/services/redis/index.ts +0 -71
- package/src/server/services/router/request/services/auth.ts +0 -177
|
@@ -13,7 +13,7 @@ import { propsDefautChampForm, TBasePropsChamp } from '@client/components/input/
|
|
|
13
13
|
import { TSchema, TRetourValidation, initDonnees, validate as validerSchema, TSchemaChampComplet } from '@common/data/input/validate';
|
|
14
14
|
import { simpleDeepCopy, chemin } from '@common/data/objets';
|
|
15
15
|
import { ContexteOnglets } from '@client/components/containers/tabs';
|
|
16
|
-
import useContext from '
|
|
16
|
+
import useContext from '@/client/context';
|
|
17
17
|
|
|
18
18
|
/*----------------------------------
|
|
19
19
|
- TYPES ENTREE
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
/*----------------------------------
|
|
2
3
|
- DEPENDANCES
|
|
3
4
|
----------------------------------*/
|
|
@@ -22,7 +23,7 @@ export type Props<TRow> = {
|
|
|
22
23
|
columns: (row: TRow, rows: TRow[], index: number) => TColumn[];
|
|
23
24
|
|
|
24
25
|
setData?: (rows: TRow[]) => void,
|
|
25
|
-
|
|
26
|
+
empty?: ComponentChild,
|
|
26
27
|
className?: string,
|
|
27
28
|
|
|
28
29
|
actions?: TAction<TRow>[]
|
|
@@ -39,7 +40,7 @@ export type TColumn = {
|
|
|
39
40
|
- COMPOSANTS
|
|
40
41
|
----------------------------------*/
|
|
41
42
|
export default function Liste<TRow extends TDonneeInconnue>({
|
|
42
|
-
data: rows, setData,
|
|
43
|
+
data: rows, setData, empty ,
|
|
43
44
|
columns, actions, ...props
|
|
44
45
|
}: Props<TRow>) {
|
|
45
46
|
|
|
@@ -7,8 +7,8 @@ import React from 'react';
|
|
|
7
7
|
import { VNode, RefObject,ComponentChild } from 'preact';
|
|
8
8
|
|
|
9
9
|
// Core
|
|
10
|
-
import { history } from '@client/router/request/history';
|
|
11
|
-
import useContext from '
|
|
10
|
+
import { history } from '@client/services/router/request/history';
|
|
11
|
+
import useContext from '@/client/context';
|
|
12
12
|
|
|
13
13
|
/*----------------------------------
|
|
14
14
|
- TYPES
|
|
@@ -15,7 +15,7 @@ import Bouton, { Props as PropsBouton } from '@client/components/button';
|
|
|
15
15
|
// Libs
|
|
16
16
|
import getPosition, { TSide } from './getPosition';
|
|
17
17
|
import { blurable, deepContains } from '@client/utils/dom';
|
|
18
|
-
import useContexte from '
|
|
18
|
+
import useContexte from '@/client/context';
|
|
19
19
|
|
|
20
20
|
/*----------------------------------
|
|
21
21
|
- TYPES
|
|
@@ -12,7 +12,7 @@ import { TDialogControls } from '../Dialog/Manager';
|
|
|
12
12
|
export type { TDialogControls } from '../Dialog/Manager';
|
|
13
13
|
|
|
14
14
|
// Libs
|
|
15
|
-
import useContexte from '
|
|
15
|
+
import useContexte from '@/client/context';
|
|
16
16
|
|
|
17
17
|
/*----------------------------------
|
|
18
18
|
- TYPES
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export { default as Button } from './button';
|
|
2
|
+
export { default as Row } from './row';
|
|
3
|
+
export { default as Card } from './card';
|
|
4
|
+
export { default as Table } from './Table';
|
|
5
|
+
export { default as Select } from './Select';
|
|
6
|
+
export { default as Amount } from './Amount';
|
|
7
|
+
export { default as Logo } from './Logo';
|
|
8
|
+
|
|
9
|
+
export { default as Input } from './input';
|
|
10
|
+
export { default as Textarea } from './input/Textarea';
|
|
11
|
+
export { default as Number } from './input/Number';
|
|
12
|
+
export { default as Slider } from './input/Slider';
|
|
13
|
+
export { default as Upload } from './input/Upload';
|
|
14
|
+
export { default as Radio } from './input/Radio';
|
|
15
|
+
|
|
16
|
+
// TOD: fix popover component
|
|
17
|
+
//export { default as Date } from './input/Date';
|
|
18
|
+
//export { default as Periode } from './input/Periode';
|
|
19
|
+
|
|
20
|
+
// TODO: adapt
|
|
21
|
+
//export { default as Couleur } from './input/Couleur';
|
|
22
|
+
//export { default as Code } from './input/Code';
|
|
23
|
+
//export { default as Rte } from './input/Rte';
|
|
@@ -9,7 +9,7 @@ import { ComponentChild } from 'preact';
|
|
|
9
9
|
import Bouton from '@client/components/button';
|
|
10
10
|
|
|
11
11
|
// Libs
|
|
12
|
-
import useContext, { useState } from '
|
|
12
|
+
import useContext, { useState } from '@/client/context';
|
|
13
13
|
import NormalisedFile from '@common/data/file';
|
|
14
14
|
|
|
15
15
|
// Ressources
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as useState } from './useState';
|
|
2
|
+
export { default as useActivity } from './useActivity';
|
|
3
|
+
export { default as useComponent } from './useComponent';
|
|
4
|
+
export { default as useScript } from './useScript';
|
|
5
|
+
export { default as useVisible } from './useVisible';
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { useState as reactUseState, useEffect as reactUseEffect } from 'preact/hooks';
|
|
7
7
|
|
|
8
8
|
// Libs
|
|
9
|
-
import useContexte from '
|
|
9
|
+
import useContexte from '@/client/context';
|
|
10
10
|
|
|
11
11
|
// Libs spécifiques
|
|
12
12
|
import { execFetchersState, initStateAsync } from './fetchers';
|
|
@@ -18,7 +18,7 @@ import { execFetchersState, initStateAsync } from './fetchers';
|
|
|
18
18
|
|
|
19
19
|
import TRequeteApi, { TOptionsRequete } from '@common/api';
|
|
20
20
|
|
|
21
|
-
import { TDataResolved } from '@client/router';
|
|
21
|
+
import { TDataResolved } from '@client/services/router';
|
|
22
22
|
|
|
23
23
|
/*----------------------------------
|
|
24
24
|
- TYPES: DEFINITIONS
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ComponentChild } from 'preact';
|
|
3
|
+
|
|
4
|
+
// Hooks
|
|
5
|
+
/*export { default as useState } from '@client/hooks/useState';
|
|
6
|
+
export type { TActions as TActionsState } from '@client/hooks/useState';
|
|
7
|
+
export { default as useComponent } from '@client/hooks/useComponent';
|
|
8
|
+
export { default as useScript } from '@client/hooks/useScript';*/
|
|
9
|
+
|
|
10
|
+
// Utils
|
|
11
|
+
export const Switch = (val: string | number, options: { [cle: string]: ComponentChild }) => {
|
|
12
|
+
return (val in options) ? options[val] : null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const useState = <TData extends TObjetDonnees>(initial: TData): [
|
|
16
|
+
TData,
|
|
17
|
+
(data: Partial<TData>) => void
|
|
18
|
+
] => {
|
|
19
|
+
const [state, setState] = React.useState<TData>(initial);
|
|
20
|
+
const setPartialState = (data: Partial<TData>) => setState(current => ({ ...current, ...data }));
|
|
21
|
+
return [state, setPartialState]
|
|
22
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
8
8
|
// Core
|
|
9
|
-
import
|
|
9
|
+
import { router } from '@app';
|
|
10
10
|
import Button from '@client/components/button';
|
|
11
11
|
|
|
12
12
|
// App
|
|
@@ -15,7 +15,7 @@ import useHeader from '@client/pages/useHeader';
|
|
|
15
15
|
/*----------------------------------
|
|
16
16
|
- CONTROLEUR
|
|
17
17
|
----------------------------------*/
|
|
18
|
-
|
|
18
|
+
router.error(400, {}, ({ message, modal }) => {
|
|
19
19
|
|
|
20
20
|
if (!message)
|
|
21
21
|
message = "The request you made is incorrect.";
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
8
8
|
// Core
|
|
9
|
-
import
|
|
9
|
+
import { router } from '@app';
|
|
10
10
|
import Button from '@client/components/button';
|
|
11
11
|
|
|
12
12
|
// App
|
|
@@ -18,7 +18,7 @@ import Button from '@client/components/button';
|
|
|
18
18
|
/*----------------------------------
|
|
19
19
|
- CONTROLEUR
|
|
20
20
|
----------------------------------*/
|
|
21
|
-
|
|
21
|
+
router.error(401, { }, ({ api, toast, modal, request, page }) => {
|
|
22
22
|
|
|
23
23
|
request.response?.redirect('/');
|
|
24
24
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
8
8
|
// Core
|
|
9
|
-
import
|
|
9
|
+
import { router } from '@app';
|
|
10
10
|
import Button from '@client/components/button';
|
|
11
11
|
|
|
12
12
|
// App
|
|
@@ -15,7 +15,7 @@ import useHeader from '@client/pages/useHeader';
|
|
|
15
15
|
/*----------------------------------
|
|
16
16
|
- CONTROLEUR
|
|
17
17
|
----------------------------------*/
|
|
18
|
-
|
|
18
|
+
router.error( 403, {}, ({ message, modal }) => {
|
|
19
19
|
|
|
20
20
|
if (!message)
|
|
21
21
|
message = "You do not have sufficient permissions to access this content.";
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
8
8
|
// Core
|
|
9
|
-
import
|
|
9
|
+
import { router } from '@app';
|
|
10
10
|
import Button from '@client/components/button';
|
|
11
11
|
|
|
12
12
|
// App
|
|
@@ -15,7 +15,7 @@ import useHeader from '@client/pages/useHeader';
|
|
|
15
15
|
/*----------------------------------
|
|
16
16
|
- CONTROLEUR
|
|
17
17
|
----------------------------------*/
|
|
18
|
-
|
|
18
|
+
router.error( 404, {}, ({ message, modal }) => {
|
|
19
19
|
|
|
20
20
|
if (!message)
|
|
21
21
|
message = "The content you asked for was not found.";
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
8
8
|
// Core
|
|
9
|
-
import
|
|
9
|
+
import { router } from '@app';
|
|
10
10
|
import Button from '@client/components/button';
|
|
11
11
|
|
|
12
12
|
// App
|
|
@@ -15,7 +15,7 @@ import useHeader from '@client/pages/useHeader';
|
|
|
15
15
|
/*----------------------------------
|
|
16
16
|
- CONTROLEUR
|
|
17
17
|
----------------------------------*/
|
|
18
|
-
|
|
18
|
+
router.error( 500, {}, ({ message }) => {
|
|
19
19
|
|
|
20
20
|
if (!message)
|
|
21
21
|
message = "A technical error occurred.";
|
package/src/client/pages/bug.tsx
CHANGED
|
@@ -10,7 +10,7 @@ import Textarea from '@client/components/input/Textarea';
|
|
|
10
10
|
import Card, { Props as CardProps } from '@client/components/Dialog/card';
|
|
11
11
|
|
|
12
12
|
// Core libs
|
|
13
|
-
import useContext from '
|
|
13
|
+
import useContext from '@/client/context';
|
|
14
14
|
|
|
15
15
|
/*----------------------------------
|
|
16
16
|
- TYPES
|
|
File without changes
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Npm
|
|
6
|
+
|
|
7
|
+
// Core
|
|
8
|
+
import type ClientApplication from '@client/app';
|
|
9
|
+
|
|
10
|
+
/*----------------------------------
|
|
11
|
+
- TYPES
|
|
12
|
+
----------------------------------*/
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
/*----------------------------------
|
|
17
|
+
- SERVICE
|
|
18
|
+
----------------------------------*/
|
|
19
|
+
export default class ClientMetrics {
|
|
20
|
+
|
|
21
|
+
public constructor( public app: ClientApplication ) {
|
|
22
|
+
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public start() {
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Tracking
|
|
30
|
+
public event( name: string, params?: object ) {
|
|
31
|
+
if (!window.gtag) return;
|
|
32
|
+
if (name === 'pageview')
|
|
33
|
+
window.gtag('send', name);
|
|
34
|
+
else
|
|
35
|
+
window.gtag('event', name, params);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
// Npm
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
// Core
|
|
8
|
+
import useContext from '@/client/context';
|
|
9
|
+
|
|
10
|
+
// Specific
|
|
11
|
+
import type Page from '../response/page';
|
|
12
|
+
|
|
13
|
+
/*----------------------------------
|
|
14
|
+
- PAGE STATE
|
|
15
|
+
----------------------------------*/
|
|
16
|
+
|
|
17
|
+
export default ({ page, isCurrent }: { page: Page, isCurrent?: boolean }) => {
|
|
18
|
+
|
|
19
|
+
const context = useContext();
|
|
20
|
+
|
|
21
|
+
const [apiData, setApiData] = React.useState<{[k: string]: any} | null>(
|
|
22
|
+
page.loading ? null : page.data
|
|
23
|
+
);
|
|
24
|
+
page.setAllData = setApiData;
|
|
25
|
+
|
|
26
|
+
React.useEffect(() => {
|
|
27
|
+
|
|
28
|
+
// Fetch the data asynchronously for the first time
|
|
29
|
+
if (/*apiData === null && */isCurrent)
|
|
30
|
+
page.fetchData().then( loadedData => {
|
|
31
|
+
page.loading = false;
|
|
32
|
+
setApiData(loadedData);
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
}, [page]);
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<div
|
|
39
|
+
class={"page" + (isCurrent ? ' current' : '')}
|
|
40
|
+
id={page.chunkId === undefined ? undefined : 'page_' + page.chunkId}
|
|
41
|
+
>
|
|
42
|
+
|
|
43
|
+
{/* Make request parameters and api data accessible from the page component */}
|
|
44
|
+
{page.renderer ? (
|
|
45
|
+
|
|
46
|
+
<page.renderer
|
|
47
|
+
// Services
|
|
48
|
+
{...context}
|
|
49
|
+
// URL params
|
|
50
|
+
{...context.request.data}
|
|
51
|
+
// API data
|
|
52
|
+
{...apiData}
|
|
53
|
+
/>
|
|
54
|
+
|
|
55
|
+
) : null}
|
|
56
|
+
|
|
57
|
+
</div>
|
|
58
|
+
)
|
|
59
|
+
}
|