@xyo-network/react-embed 2.27.4 → 2.27.7
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/cjs/components/XyoEmbedPlugin.d.ts.map +1 -1
- package/dist/cjs/components/XyoEmbedPlugin.js +5 -49
- package/dist/cjs/components/XyoEmbedPlugin.js.map +1 -1
- package/dist/cjs/components/XyoEmbedPluginProps.d.ts +2 -0
- package/dist/cjs/components/XyoEmbedPluginProps.d.ts.map +1 -1
- package/dist/cjs/components/controls/ControlWrap.d.ts +10 -0
- package/dist/cjs/components/controls/ControlWrap.d.ts.map +1 -0
- package/dist/cjs/components/controls/ControlWrap.js +12 -0
- package/dist/cjs/components/controls/ControlWrap.js.map +1 -0
- package/dist/cjs/components/controls/ListModeSelect.d.ts +6 -0
- package/dist/cjs/components/controls/ListModeSelect.d.ts.map +1 -0
- package/dist/cjs/components/controls/ListModeSelect.js +21 -0
- package/dist/cjs/components/controls/ListModeSelect.js.map +1 -0
- package/dist/cjs/components/controls/RenderSelect.d.ts +3 -0
- package/dist/cjs/components/controls/RenderSelect.d.ts.map +1 -0
- package/dist/cjs/components/controls/RenderSelect.js +15 -0
- package/dist/cjs/components/controls/RenderSelect.js.map +1 -0
- package/dist/cjs/components/controls/index.d.ts +4 -0
- package/dist/cjs/components/controls/index.d.ts.map +1 -0
- package/dist/cjs/components/controls/index.js +7 -0
- package/dist/cjs/components/controls/index.js.map +1 -0
- package/dist/cjs/components/embed-card/EmbedCardEx.d.ts +5 -0
- package/dist/cjs/components/embed-card/EmbedCardEx.d.ts.map +1 -0
- package/dist/cjs/components/embed-card/EmbedCardEx.js +28 -0
- package/dist/cjs/components/embed-card/EmbedCardEx.js.map +1 -0
- package/dist/cjs/components/embed-card/EmbedPluginContainer.d.ts +3 -0
- package/dist/cjs/components/embed-card/EmbedPluginContainer.d.ts.map +1 -0
- package/dist/cjs/components/embed-card/EmbedPluginContainer.js +21 -0
- package/dist/cjs/components/embed-card/EmbedPluginContainer.js.map +1 -0
- package/dist/cjs/components/embed-card/ValidatePlugins.d.ts +4 -0
- package/dist/cjs/components/embed-card/ValidatePlugins.d.ts.map +1 -0
- package/dist/cjs/components/embed-card/ValidatePlugins.js +17 -0
- package/dist/cjs/components/embed-card/ValidatePlugins.js.map +1 -0
- package/dist/cjs/components/embed-card/index.d.ts +3 -0
- package/dist/cjs/components/embed-card/index.d.ts.map +1 -0
- package/dist/cjs/components/embed-card/index.js +6 -0
- package/dist/cjs/components/embed-card/index.js.map +1 -0
- package/dist/cjs/components/index.d.ts +0 -1
- package/dist/cjs/components/index.d.ts.map +1 -1
- package/dist/cjs/components/index.js +0 -1
- package/dist/cjs/components/index.js.map +1 -1
- package/dist/cjs/contexts/XyoEmbedPluginContext/Context.d.ts +4 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/Context.d.ts.map +1 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/Context.js +6 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/Context.js.map +1 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/Provider.d.ts +12 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/Provider.d.ts.map +1 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/Provider.js +45 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/Provider.js.map +1 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/State.d.ts +13 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/State.d.ts.map +1 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/State.js +3 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/State.js.map +1 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/index.d.ts +3 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/index.d.ts.map +1 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/index.js +6 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/index.js.map +1 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/use.d.ts +2 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/use.d.ts.map +1 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/use.js +14 -0
- package/dist/cjs/contexts/XyoEmbedPluginContext/use.js.map +1 -0
- package/dist/cjs/contexts/index.d.ts +2 -0
- package/dist/cjs/contexts/index.d.ts.map +1 -0
- package/dist/cjs/contexts/index.js +5 -0
- package/dist/cjs/contexts/index.js.map +1 -0
- package/dist/docs.json +7 -91
- package/dist/esm/components/XyoEmbedPlugin.d.ts.map +1 -1
- package/dist/esm/components/XyoEmbedPlugin.js +5 -48
- package/dist/esm/components/XyoEmbedPlugin.js.map +1 -1
- package/dist/esm/components/XyoEmbedPluginProps.d.ts +2 -0
- package/dist/esm/components/XyoEmbedPluginProps.d.ts.map +1 -1
- package/dist/esm/components/controls/ControlWrap.d.ts +10 -0
- package/dist/esm/components/controls/ControlWrap.d.ts.map +1 -0
- package/dist/esm/components/controls/ControlWrap.js +6 -0
- package/dist/esm/components/controls/ControlWrap.js.map +1 -0
- package/dist/esm/components/controls/ListModeSelect.d.ts +6 -0
- package/dist/esm/components/controls/ListModeSelect.d.ts.map +1 -0
- package/dist/esm/components/controls/ListModeSelect.js +16 -0
- package/dist/esm/components/controls/ListModeSelect.js.map +1 -0
- package/dist/esm/components/controls/RenderSelect.d.ts +3 -0
- package/dist/esm/components/controls/RenderSelect.d.ts.map +1 -0
- package/dist/esm/components/controls/RenderSelect.js +11 -0
- package/dist/esm/components/controls/RenderSelect.js.map +1 -0
- package/dist/esm/components/controls/index.d.ts +4 -0
- package/dist/esm/components/controls/index.d.ts.map +1 -0
- package/dist/esm/components/controls/index.js +4 -0
- package/dist/esm/components/controls/index.js.map +1 -0
- package/dist/esm/components/embed-card/EmbedCardEx.d.ts +5 -0
- package/dist/esm/components/embed-card/EmbedCardEx.d.ts.map +1 -0
- package/dist/esm/components/embed-card/EmbedCardEx.js +25 -0
- package/dist/esm/components/embed-card/EmbedCardEx.js.map +1 -0
- package/dist/esm/components/embed-card/EmbedPluginContainer.d.ts +3 -0
- package/dist/esm/components/embed-card/EmbedPluginContainer.d.ts.map +1 -0
- package/dist/esm/components/embed-card/EmbedPluginContainer.js +15 -0
- package/dist/esm/components/embed-card/EmbedPluginContainer.js.map +1 -0
- package/dist/esm/components/embed-card/ValidatePlugins.d.ts +4 -0
- package/dist/esm/components/embed-card/ValidatePlugins.d.ts.map +1 -0
- package/dist/esm/components/embed-card/ValidatePlugins.js +13 -0
- package/dist/esm/components/embed-card/ValidatePlugins.js.map +1 -0
- package/dist/esm/components/embed-card/index.d.ts +3 -0
- package/dist/esm/components/embed-card/index.d.ts.map +1 -0
- package/dist/esm/components/embed-card/index.js +3 -0
- package/dist/esm/components/embed-card/index.js.map +1 -0
- package/dist/esm/components/index.d.ts +0 -1
- package/dist/esm/components/index.d.ts.map +1 -1
- package/dist/esm/components/index.js +0 -1
- package/dist/esm/components/index.js.map +1 -1
- package/dist/esm/contexts/XyoEmbedPluginContext/Context.d.ts +4 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/Context.d.ts.map +1 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/Context.js +3 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/Context.js.map +1 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/Provider.d.ts +12 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/Provider.d.ts.map +1 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/Provider.js +39 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/Provider.js.map +1 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/State.d.ts +13 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/State.d.ts.map +1 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/State.js +2 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/State.js.map +1 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/index.d.ts +3 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/index.d.ts.map +1 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/index.js +3 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/index.js.map +1 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/use.d.ts +2 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/use.d.ts.map +1 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/use.js +10 -0
- package/dist/esm/contexts/XyoEmbedPluginContext/use.js.map +1 -0
- package/dist/esm/contexts/index.d.ts +2 -0
- package/dist/esm/contexts/index.d.ts.map +1 -0
- package/dist/esm/contexts/index.js +2 -0
- package/dist/esm/contexts/index.js.map +1 -0
- package/package.json +11 -11
- package/src/components/XyoEmbedPlugin.stories.tsx +3 -1
- package/src/components/XyoEmbedPlugin.tsx +10 -88
- package/src/components/XyoEmbedPluginProps.ts +2 -0
- package/src/components/controls/ControlWrap.tsx +16 -0
- package/src/components/{ListModeSelect.tsx → controls/ListModeSelect.tsx} +13 -0
- package/src/components/controls/RenderSelect.tsx +22 -0
- package/src/components/controls/index.ts +3 -0
- package/src/components/embed-card/EmbedCardEx.tsx +25 -0
- package/src/components/embed-card/EmbedPluginContainer.tsx +48 -0
- package/src/components/embed-card/ValidatePlugins.tsx +17 -0
- package/src/components/embed-card/index.ts +2 -0
- package/src/components/index.ts +0 -1
- package/src/contexts/XyoEmbedPluginContext/Context.tsx +5 -0
- package/src/contexts/XyoEmbedPluginContext/Provider.tsx +67 -0
- package/src/contexts/XyoEmbedPluginContext/State.ts +13 -0
- package/src/contexts/XyoEmbedPluginContext/index.ts +2 -0
- package/src/contexts/XyoEmbedPluginContext/use.tsx +13 -0
- package/src/contexts/index.ts +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/contexts/XyoEmbedPluginContext/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,OAAO,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../../../src/contexts/XyoEmbedPluginContext/use.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,sBAAsB,6CAQlC,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { XyoEmbedPluginContext } from './Context';
|
|
3
|
+
export const useXyoEmbedPluginState = () => {
|
|
4
|
+
const context = useContext(XyoEmbedPluginContext);
|
|
5
|
+
if (context === undefined) {
|
|
6
|
+
console.warn('useXyoEmbedPluginState must be used within an XyoEmbedPluginContext');
|
|
7
|
+
}
|
|
8
|
+
return context;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use.js","sourceRoot":"","sources":["../../../../src/contexts/XyoEmbedPluginContext/use.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAElC,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAEjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAA;IAEjD,IAAI,OAAO,KAAK,SAAS,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAA;KACpF;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/contexts/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/contexts/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA"}
|
package/package.json
CHANGED
|
@@ -16,12 +16,12 @@
|
|
|
16
16
|
"@xylabs/react-button": "^2.14.10",
|
|
17
17
|
"@xylabs/react-flexbox": "^2.14.10",
|
|
18
18
|
"@xylabs/react-shared": "^2.14.10",
|
|
19
|
-
"@xyo-network/api": "^2.24.
|
|
20
|
-
"@xyo-network/payload": "^2.24.
|
|
21
|
-
"@xyo-network/react-auth-service": "^2.27.
|
|
22
|
-
"@xyo-network/react-payload-plugin": "^2.27.
|
|
23
|
-
"@xyo-network/react-shared": "^2.27.
|
|
24
|
-
"@xyo-network/react-webapp": "^2.27.
|
|
19
|
+
"@xyo-network/api": "^2.24.12",
|
|
20
|
+
"@xyo-network/payload": "^2.24.12",
|
|
21
|
+
"@xyo-network/react-auth-service": "^2.27.9",
|
|
22
|
+
"@xyo-network/react-payload-plugin": "^2.27.9",
|
|
23
|
+
"@xyo-network/react-shared": "^2.27.9",
|
|
24
|
+
"@xyo-network/react-webapp": "^2.27.9",
|
|
25
25
|
"react": "^18.2.0",
|
|
26
26
|
"react-dom": "^18.2.0",
|
|
27
27
|
"tslib": "^2.4.0"
|
|
@@ -29,10 +29,10 @@
|
|
|
29
29
|
"description": "Common React library for all XYO projects that use React",
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@storybook/react": "^6.5.10",
|
|
32
|
-
"@xylabs/tsconfig-dom": "^2.5.
|
|
33
|
-
"@xyo-network/react-aggregate-price-plugin": "^2.27.
|
|
34
|
-
"@xyo-network/react-crypto-market-uniswap-payload-plugin": "^2.27.
|
|
35
|
-
"@xyo-network/react-storybook": "^2.27.
|
|
32
|
+
"@xylabs/tsconfig-dom": "^2.5.75",
|
|
33
|
+
"@xyo-network/react-aggregate-price-plugin": "^2.27.8",
|
|
34
|
+
"@xyo-network/react-crypto-market-uniswap-payload-plugin": "^2.27.9",
|
|
35
|
+
"@xyo-network/react-storybook": "^2.27.9",
|
|
36
36
|
"react-router-dom": "^6.3.0"
|
|
37
37
|
},
|
|
38
38
|
"browser": "dist/esm/index.js",
|
|
@@ -84,5 +84,5 @@
|
|
|
84
84
|
},
|
|
85
85
|
"sideEffects": false,
|
|
86
86
|
"types": "dist/esm/index.d.ts",
|
|
87
|
-
"version": "2.27.
|
|
87
|
+
"version": "2.27.7"
|
|
88
88
|
}
|
|
@@ -6,7 +6,7 @@ import { BrowserRouter } from 'react-router-dom'
|
|
|
6
6
|
|
|
7
7
|
import { XyoEmbedPlugin } from './XyoEmbedPlugin'
|
|
8
8
|
|
|
9
|
-
const AggregatePricePointer = 'https://
|
|
9
|
+
const AggregatePricePointer = 'https://api.archivist.xyo.network/9663b2f80395a9e7e95948fdd5988b778a4dcc047202bf67e855ff6cd459b8c0'
|
|
10
10
|
const UniswapPairPointer = 'https://beta.api.archivist.xyo.network/e36602006239d86b6e08412f7879372b2c622d74f4d6bc508a08a46fa8ad6523'
|
|
11
11
|
|
|
12
12
|
// eslint-disable-next-line import/no-default-export
|
|
@@ -49,12 +49,14 @@ const AggregatePriceExample = Template.bind({})
|
|
|
49
49
|
AggregatePriceExample.args = {
|
|
50
50
|
huri: AggregatePricePointer,
|
|
51
51
|
plugins: [CryptoAssetRenderPlugin],
|
|
52
|
+
timestampLabel: 'Last Updated - ',
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
const UniswapPairsExample = Template.bind({})
|
|
55
56
|
UniswapPairsExample.args = {
|
|
56
57
|
huri: UniswapPairPointer,
|
|
57
58
|
plugins: [UniswapPairsRenderPlugin],
|
|
59
|
+
timestampLabel: 'Last Updated - ',
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
export { AggregatePriceExample, Default, UniswapPairsExample }
|
|
@@ -1,95 +1,17 @@
|
|
|
1
|
-
import { Alert, AlertTitle, FormControl, InputLabel, MenuItem, Select } from '@mui/material'
|
|
2
|
-
import { ButtonEx } from '@xylabs/react-button'
|
|
3
|
-
import { FlexGrowRow } from '@xylabs/react-flexbox'
|
|
4
|
-
import { useAsyncEffect } from '@xylabs/react-shared'
|
|
5
|
-
import { XyoApiError } from '@xyo-network/api'
|
|
6
|
-
import { Huri, XyoPayload } from '@xyo-network/payload'
|
|
7
|
-
import { XyoApiErrorRender } from '@xyo-network/react-auth-service'
|
|
8
|
-
import { XyoPayloadRenderPlugin } from '@xyo-network/react-payload-plugin'
|
|
9
1
|
import { ListModeProvider } from '@xyo-network/react-shared'
|
|
10
|
-
import { ResultLoader } from '@xyo-network/react-webapp'
|
|
11
|
-
import { useState } from 'react'
|
|
12
2
|
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
3
|
+
import { XyoEmbedPluginProvider } from '../contexts'
|
|
4
|
+
import { EmbedPluginContainer, ValidatePlugins } from './embed-card'
|
|
15
5
|
import { XyoEmbedPluginProps } from './XyoEmbedPluginProps'
|
|
16
6
|
|
|
17
|
-
const
|
|
18
|
-
const renderSelectLabel = 'Renderer'
|
|
19
|
-
|
|
20
|
-
const listModeSelectId = 'listmode-select-id'
|
|
21
|
-
const listModeSelectLabel = 'List Mode'
|
|
22
|
-
|
|
23
|
-
export const XyoEmbedPlugin: React.FC<XyoEmbedPluginProps> = ({ plugins = [], huri, ...props }) => {
|
|
24
|
-
const [payload, setPayload] = useState<XyoPayload>()
|
|
25
|
-
const [notFound, setNotFound] = useState<boolean>()
|
|
26
|
-
const [huriApiError, setHuriApiError] = useState<XyoApiError>()
|
|
27
|
-
const [ActivePlugin, setActivePlugin] = useState<XyoPayloadRenderPlugin>(plugins[0])
|
|
28
|
-
|
|
29
|
-
useAsyncEffect(
|
|
30
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
31
|
-
async (mounted) => {
|
|
32
|
-
if (!payload && huri) {
|
|
33
|
-
try {
|
|
34
|
-
const huriInstance = new Huri(huri)
|
|
35
|
-
const result = await huriInstance.fetch()
|
|
36
|
-
|
|
37
|
-
if (mounted()) {
|
|
38
|
-
if (result === null) setNotFound(true)
|
|
39
|
-
if (payload === undefined) setPayload(result)
|
|
40
|
-
}
|
|
41
|
-
} catch (e) {
|
|
42
|
-
setHuriApiError(e as XyoApiError)
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
[huri, payload]
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
const refreshHuri = () => {
|
|
50
|
-
setHuriApiError(undefined)
|
|
51
|
-
setNotFound(undefined)
|
|
52
|
-
setPayload(undefined)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (payload && plugins?.length === 0) {
|
|
56
|
-
return (
|
|
57
|
-
<Alert severity="warning">
|
|
58
|
-
<AlertTitle>Missing plugins!</AlertTitle>Payload found but no plugins were present.
|
|
59
|
-
</Alert>
|
|
60
|
-
)
|
|
61
|
-
}
|
|
62
|
-
|
|
7
|
+
export const XyoEmbedPlugin: React.FC<XyoEmbedPluginProps> = ({ plugins = [], huri, refreshTitle = '', timestampLabel = 'Data From', ...props }) => {
|
|
63
8
|
return (
|
|
64
|
-
<
|
|
65
|
-
<
|
|
66
|
-
<
|
|
67
|
-
<
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
{plugins?.map((plugin) => (
|
|
72
|
-
<MenuItem value={plugin.name} key={plugin.name} onClick={() => setActivePlugin(plugin)}>
|
|
73
|
-
{plugin.name}
|
|
74
|
-
</MenuItem>
|
|
75
|
-
))}
|
|
76
|
-
</Select>
|
|
77
|
-
</FormControl>
|
|
78
|
-
{(ActivePlugin?.components?.box?.listModes?.length ?? 0) > 1 ? (
|
|
79
|
-
<FormControl>
|
|
80
|
-
<InputLabel id={listModeSelectId}>{listModeSelectLabel}</InputLabel>
|
|
81
|
-
<ListModeSelect size="small" label={listModeSelectLabel} labelId={listModeSelectId} />
|
|
82
|
-
</FormControl>
|
|
83
|
-
) : null}
|
|
84
|
-
</FlexGrowRow>
|
|
85
|
-
<RenderComponent payload={payload} ActivePlugin={ActivePlugin} />
|
|
86
|
-
<FlexGrowRow>
|
|
87
|
-
<ButtonEx variant="contained" onClick={refreshHuri}>
|
|
88
|
-
Refresh
|
|
89
|
-
</ButtonEx>
|
|
90
|
-
</FlexGrowRow>
|
|
91
|
-
</XyoApiErrorRender>
|
|
92
|
-
</ResultLoader>
|
|
93
|
-
</ListModeProvider>
|
|
9
|
+
<XyoEmbedPluginProvider refreshTitle={refreshTitle} timestampLabel={timestampLabel} plugins={plugins} huri={huri}>
|
|
10
|
+
<ListModeProvider>
|
|
11
|
+
<ValidatePlugins>
|
|
12
|
+
<EmbedPluginContainer {...props} />
|
|
13
|
+
</ValidatePlugins>
|
|
14
|
+
</ListModeProvider>
|
|
15
|
+
</XyoEmbedPluginProvider>
|
|
94
16
|
)
|
|
95
17
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FormControl, FormControlProps, InputLabel } from '@mui/material'
|
|
2
|
+
import { WithChildren } from '@xylabs/react-shared'
|
|
3
|
+
|
|
4
|
+
interface EmbedControlWrapProps extends FormControlProps {
|
|
5
|
+
formId?: string
|
|
6
|
+
formLabel?: string
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const EmbedControlWrap: React.FC<WithChildren<EmbedControlWrapProps>> = ({ formId, formLabel, children, ...props }) => {
|
|
10
|
+
return (
|
|
11
|
+
<FormControl {...props}>
|
|
12
|
+
<InputLabel id={formId}>{formLabel}</InputLabel>
|
|
13
|
+
{children}
|
|
14
|
+
</FormControl>
|
|
15
|
+
)
|
|
16
|
+
}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { MenuItem, Select, SelectProps } from '@mui/material'
|
|
2
2
|
import { ListMode, useListMode } from '@xyo-network/react-shared'
|
|
3
3
|
|
|
4
|
+
import { EmbedControlWrap } from './ControlWrap'
|
|
5
|
+
|
|
6
|
+
const listModeSelectId = 'listmode-select-id'
|
|
7
|
+
const listModeSelectLabel = 'List Mode'
|
|
8
|
+
|
|
4
9
|
export const ListModeSelect: React.FC<SelectProps<ListMode>> = (props) => {
|
|
5
10
|
const { listMode, setListMode } = useListMode()
|
|
6
11
|
|
|
@@ -24,3 +29,11 @@ export const ListModeSelect: React.FC<SelectProps<ListMode>> = (props) => {
|
|
|
24
29
|
</Select>
|
|
25
30
|
)
|
|
26
31
|
}
|
|
32
|
+
|
|
33
|
+
export const ListModeSelectFormControl: React.FC<SelectProps<ListMode>> = (props) => {
|
|
34
|
+
return (
|
|
35
|
+
<EmbedControlWrap formId={listModeSelectId} formLabel={listModeSelectLabel}>
|
|
36
|
+
<ListModeSelect size="small" label={listModeSelectLabel} labelId={listModeSelectId} {...props} />
|
|
37
|
+
</EmbedControlWrap>
|
|
38
|
+
)
|
|
39
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { MenuItem, Select } from '@mui/material'
|
|
2
|
+
|
|
3
|
+
import { useXyoEmbedPluginState } from '../../contexts'
|
|
4
|
+
import { EmbedControlWrap } from './ControlWrap'
|
|
5
|
+
|
|
6
|
+
const renderSelectId = 'render-select-id'
|
|
7
|
+
const renderSelectLabel = 'Renderer'
|
|
8
|
+
|
|
9
|
+
export const EmbedRenderSelect: React.FC = (props) => {
|
|
10
|
+
const { activePlugin, setActivePlugin, plugins } = useXyoEmbedPluginState()
|
|
11
|
+
return (
|
|
12
|
+
<EmbedControlWrap formId={renderSelectId} formLabel={renderSelectLabel}>
|
|
13
|
+
<Select size="small" value={activePlugin?.name} {...props}>
|
|
14
|
+
{plugins?.map((plugin) => (
|
|
15
|
+
<MenuItem value={plugin.name} key={plugin.name} onClick={() => setActivePlugin?.(plugin)}>
|
|
16
|
+
{plugin.name}
|
|
17
|
+
</MenuItem>
|
|
18
|
+
))}
|
|
19
|
+
</Select>
|
|
20
|
+
</EmbedControlWrap>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Card, CardProps, SxProps, Theme } from '@mui/material'
|
|
2
|
+
import { WithChildren } from '@xylabs/react-shared'
|
|
3
|
+
import { useAppSettings } from '@xyo-network/react-app-settings'
|
|
4
|
+
import { useCallback } from 'react'
|
|
5
|
+
|
|
6
|
+
export const EmbedCardEx: React.FC<WithChildren<CardProps>> = ({ children, ...props }) => {
|
|
7
|
+
const { darkMode } = useAppSettings()
|
|
8
|
+
const cardProps = useCallback(() => {
|
|
9
|
+
if (darkMode) {
|
|
10
|
+
return props
|
|
11
|
+
} else {
|
|
12
|
+
const lightModeOverrides: { sx: SxProps<Theme> } = {
|
|
13
|
+
sx: {
|
|
14
|
+
bgcolor: props.elevation ? '#F6F5FA' : 'inherit',
|
|
15
|
+
},
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
...props,
|
|
19
|
+
...lightModeOverrides,
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}, [darkMode, props])
|
|
23
|
+
|
|
24
|
+
return <Card {...cardProps()}>{children}</Card>
|
|
25
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import RefreshIcon from '@mui/icons-material/Refresh'
|
|
2
|
+
import { Avatar, CardContent, CardHeader, Link, Theme } from '@mui/material'
|
|
3
|
+
import { FlexGrowRow } from '@xylabs/react-flexbox'
|
|
4
|
+
import { TypographyEx } from '@xyo-network/react-shared'
|
|
5
|
+
import { Fragment } from 'react'
|
|
6
|
+
|
|
7
|
+
import { useXyoEmbedPluginState } from '../../contexts'
|
|
8
|
+
import { EmbedRenderSelect, ListModeSelectFormControl } from '../controls'
|
|
9
|
+
import { RenderComponent } from '../RenderComponent'
|
|
10
|
+
import { EmbedCardEx } from './EmbedCardEx'
|
|
11
|
+
|
|
12
|
+
export const EmbedPluginContainer: React.FC = () => {
|
|
13
|
+
const { activePlugin, payload, timestampLabel, refreshHuri, refreshTitle, plugins } = useXyoEmbedPluginState()
|
|
14
|
+
return (
|
|
15
|
+
<EmbedCardEx elevation={3}>
|
|
16
|
+
<CardHeader
|
|
17
|
+
sx={{ flexWrap: 'wrap', rowGap: 1 }}
|
|
18
|
+
avatar={
|
|
19
|
+
<Avatar sx={{ bgcolor: (theme: Theme) => theme.palette.primary.main }} aria-label={activePlugin?.name}>
|
|
20
|
+
{activePlugin?.name?.charAt(0)}
|
|
21
|
+
</Avatar>
|
|
22
|
+
}
|
|
23
|
+
action={
|
|
24
|
+
<Fragment>
|
|
25
|
+
{payload?.timestamp ? (
|
|
26
|
+
<FlexGrowRow>
|
|
27
|
+
<TypographyEx variant="caption">{`${timestampLabel} ${new Date(payload.timestamp).toLocaleString()}`}</TypographyEx>
|
|
28
|
+
<Link onClick={refreshHuri} sx={{ cursor: 'pointer' }} title={refreshTitle}>
|
|
29
|
+
<RefreshIcon sx={{ height: (theme: Theme) => theme.spacing(1), position: 'relative', top: '2px' }} />
|
|
30
|
+
</Link>
|
|
31
|
+
</FlexGrowRow>
|
|
32
|
+
) : (
|
|
33
|
+
<></>
|
|
34
|
+
)}
|
|
35
|
+
</Fragment>
|
|
36
|
+
}
|
|
37
|
+
title={activePlugin?.name}
|
|
38
|
+
/>
|
|
39
|
+
<FlexGrowRow columnGap={2} rowGap={2} flexWrap="wrap" justifyContent="center" pb={1}>
|
|
40
|
+
{plugins && plugins.length > 1 ? <EmbedRenderSelect /> : null}
|
|
41
|
+
{(activePlugin?.components?.box?.listModes?.length ?? 0) > 1 ? <ListModeSelectFormControl /> : null}
|
|
42
|
+
</FlexGrowRow>
|
|
43
|
+
<CardContent>
|
|
44
|
+
<RenderComponent payload={payload} ActivePlugin={activePlugin} />
|
|
45
|
+
</CardContent>
|
|
46
|
+
</EmbedCardEx>
|
|
47
|
+
)
|
|
48
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Alert, AlertTitle } from '@mui/material'
|
|
2
|
+
import { WithChildren } from '@xylabs/react-shared'
|
|
3
|
+
|
|
4
|
+
import { useXyoEmbedPluginState } from '../../contexts'
|
|
5
|
+
|
|
6
|
+
export const ValidatePlugins: React.FC<WithChildren> = ({ children }) => {
|
|
7
|
+
const { payload, plugins } = useXyoEmbedPluginState()
|
|
8
|
+
if (payload && plugins?.length === 0) {
|
|
9
|
+
return (
|
|
10
|
+
<Alert severity="warning">
|
|
11
|
+
<AlertTitle>Missing plugins!</AlertTitle>Payload found but no plugins were present.
|
|
12
|
+
</Alert>
|
|
13
|
+
)
|
|
14
|
+
} else {
|
|
15
|
+
return <>{children}</>
|
|
16
|
+
}
|
|
17
|
+
}
|
package/src/components/index.ts
CHANGED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { FlexBoxProps } from '@xylabs/react-flexbox'
|
|
2
|
+
import { useAsyncEffect, WithChildren } from '@xylabs/react-shared'
|
|
3
|
+
import { XyoApiError } from '@xyo-network/api'
|
|
4
|
+
import { Huri, XyoPayload } from '@xyo-network/payload'
|
|
5
|
+
import { XyoApiErrorRender } from '@xyo-network/react-auth-service'
|
|
6
|
+
import { XyoPayloadRenderPlugin } from '@xyo-network/react-payload-plugin'
|
|
7
|
+
import { ResultLoader } from '@xyo-network/react-webapp'
|
|
8
|
+
import { useState } from 'react'
|
|
9
|
+
|
|
10
|
+
import { XyoEmbedPluginContext } from './Context'
|
|
11
|
+
|
|
12
|
+
export interface XyoEmbedPluginProviderProps extends FlexBoxProps {
|
|
13
|
+
plugins?: XyoPayloadRenderPlugin[]
|
|
14
|
+
huri?: string
|
|
15
|
+
refreshTitle?: string
|
|
16
|
+
timestampLabel?: string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const XyoEmbedPluginProvider: React.FC<WithChildren<XyoEmbedPluginProviderProps>> = ({
|
|
20
|
+
children,
|
|
21
|
+
refreshTitle,
|
|
22
|
+
timestampLabel,
|
|
23
|
+
huri,
|
|
24
|
+
plugins,
|
|
25
|
+
...props
|
|
26
|
+
}) => {
|
|
27
|
+
const [payload, setPayload] = useState<XyoPayload>()
|
|
28
|
+
const [notFound, setNotFound] = useState<boolean>()
|
|
29
|
+
const [huriApiError, setHuriApiError] = useState<XyoApiError>()
|
|
30
|
+
const [activePlugin, setActivePlugin] = useState<XyoPayloadRenderPlugin | undefined>(plugins ? plugins[0] : undefined)
|
|
31
|
+
|
|
32
|
+
useAsyncEffect(
|
|
33
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
34
|
+
async (mounted) => {
|
|
35
|
+
if (!payload && huri) {
|
|
36
|
+
try {
|
|
37
|
+
const huriInstance = new Huri(huri)
|
|
38
|
+
const result = await huriInstance.fetch()
|
|
39
|
+
|
|
40
|
+
if (mounted()) {
|
|
41
|
+
if (result === null) setNotFound(true)
|
|
42
|
+
if (payload === undefined) setPayload(result)
|
|
43
|
+
}
|
|
44
|
+
} catch (e) {
|
|
45
|
+
setHuriApiError(e as XyoApiError)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
[huri, payload]
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
const refreshHuri = () => {
|
|
53
|
+
setHuriApiError(undefined)
|
|
54
|
+
setNotFound(undefined)
|
|
55
|
+
setPayload(undefined)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<XyoEmbedPluginContext.Provider value={{ activePlugin, payload, refreshHuri, refreshTitle, setActivePlugin, timestampLabel }}>
|
|
60
|
+
<ResultLoader searchResult={payload} notFound={!!notFound} apiError={huriApiError}>
|
|
61
|
+
<XyoApiErrorRender apiError={huriApiError} {...props}>
|
|
62
|
+
{children}
|
|
63
|
+
</XyoApiErrorRender>
|
|
64
|
+
</ResultLoader>
|
|
65
|
+
</XyoEmbedPluginContext.Provider>
|
|
66
|
+
)
|
|
67
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { XyoPayload } from '@xyo-network/payload'
|
|
2
|
+
import { XyoPayloadRenderPlugin } from '@xyo-network/react-payload-plugin'
|
|
3
|
+
import { Dispatch, SetStateAction } from 'react'
|
|
4
|
+
|
|
5
|
+
export interface XyoEmbedPluginState {
|
|
6
|
+
activePlugin?: XyoPayloadRenderPlugin
|
|
7
|
+
setActivePlugin?: Dispatch<SetStateAction<XyoPayloadRenderPlugin | undefined>>
|
|
8
|
+
payload?: XyoPayload
|
|
9
|
+
plugins?: XyoPayloadRenderPlugin[]
|
|
10
|
+
refreshHuri?: () => void
|
|
11
|
+
refreshTitle?: string
|
|
12
|
+
timestampLabel?: string
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useContext } from 'react'
|
|
2
|
+
|
|
3
|
+
import { XyoEmbedPluginContext } from './Context'
|
|
4
|
+
|
|
5
|
+
export const useXyoEmbedPluginState = () => {
|
|
6
|
+
const context = useContext(XyoEmbedPluginContext)
|
|
7
|
+
|
|
8
|
+
if (context === undefined) {
|
|
9
|
+
console.warn('useXyoEmbedPluginState must be used within an XyoEmbedPluginContext')
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return context
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './XyoEmbedPluginContext'
|