@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.
Files changed (150) hide show
  1. package/dist/cjs/components/XyoEmbedPlugin.d.ts.map +1 -1
  2. package/dist/cjs/components/XyoEmbedPlugin.js +5 -49
  3. package/dist/cjs/components/XyoEmbedPlugin.js.map +1 -1
  4. package/dist/cjs/components/XyoEmbedPluginProps.d.ts +2 -0
  5. package/dist/cjs/components/XyoEmbedPluginProps.d.ts.map +1 -1
  6. package/dist/cjs/components/controls/ControlWrap.d.ts +10 -0
  7. package/dist/cjs/components/controls/ControlWrap.d.ts.map +1 -0
  8. package/dist/cjs/components/controls/ControlWrap.js +12 -0
  9. package/dist/cjs/components/controls/ControlWrap.js.map +1 -0
  10. package/dist/cjs/components/controls/ListModeSelect.d.ts +6 -0
  11. package/dist/cjs/components/controls/ListModeSelect.d.ts.map +1 -0
  12. package/dist/cjs/components/controls/ListModeSelect.js +21 -0
  13. package/dist/cjs/components/controls/ListModeSelect.js.map +1 -0
  14. package/dist/cjs/components/controls/RenderSelect.d.ts +3 -0
  15. package/dist/cjs/components/controls/RenderSelect.d.ts.map +1 -0
  16. package/dist/cjs/components/controls/RenderSelect.js +15 -0
  17. package/dist/cjs/components/controls/RenderSelect.js.map +1 -0
  18. package/dist/cjs/components/controls/index.d.ts +4 -0
  19. package/dist/cjs/components/controls/index.d.ts.map +1 -0
  20. package/dist/cjs/components/controls/index.js +7 -0
  21. package/dist/cjs/components/controls/index.js.map +1 -0
  22. package/dist/cjs/components/embed-card/EmbedCardEx.d.ts +5 -0
  23. package/dist/cjs/components/embed-card/EmbedCardEx.d.ts.map +1 -0
  24. package/dist/cjs/components/embed-card/EmbedCardEx.js +28 -0
  25. package/dist/cjs/components/embed-card/EmbedCardEx.js.map +1 -0
  26. package/dist/cjs/components/embed-card/EmbedPluginContainer.d.ts +3 -0
  27. package/dist/cjs/components/embed-card/EmbedPluginContainer.d.ts.map +1 -0
  28. package/dist/cjs/components/embed-card/EmbedPluginContainer.js +21 -0
  29. package/dist/cjs/components/embed-card/EmbedPluginContainer.js.map +1 -0
  30. package/dist/cjs/components/embed-card/ValidatePlugins.d.ts +4 -0
  31. package/dist/cjs/components/embed-card/ValidatePlugins.d.ts.map +1 -0
  32. package/dist/cjs/components/embed-card/ValidatePlugins.js +17 -0
  33. package/dist/cjs/components/embed-card/ValidatePlugins.js.map +1 -0
  34. package/dist/cjs/components/embed-card/index.d.ts +3 -0
  35. package/dist/cjs/components/embed-card/index.d.ts.map +1 -0
  36. package/dist/cjs/components/embed-card/index.js +6 -0
  37. package/dist/cjs/components/embed-card/index.js.map +1 -0
  38. package/dist/cjs/components/index.d.ts +0 -1
  39. package/dist/cjs/components/index.d.ts.map +1 -1
  40. package/dist/cjs/components/index.js +0 -1
  41. package/dist/cjs/components/index.js.map +1 -1
  42. package/dist/cjs/contexts/XyoEmbedPluginContext/Context.d.ts +4 -0
  43. package/dist/cjs/contexts/XyoEmbedPluginContext/Context.d.ts.map +1 -0
  44. package/dist/cjs/contexts/XyoEmbedPluginContext/Context.js +6 -0
  45. package/dist/cjs/contexts/XyoEmbedPluginContext/Context.js.map +1 -0
  46. package/dist/cjs/contexts/XyoEmbedPluginContext/Provider.d.ts +12 -0
  47. package/dist/cjs/contexts/XyoEmbedPluginContext/Provider.d.ts.map +1 -0
  48. package/dist/cjs/contexts/XyoEmbedPluginContext/Provider.js +45 -0
  49. package/dist/cjs/contexts/XyoEmbedPluginContext/Provider.js.map +1 -0
  50. package/dist/cjs/contexts/XyoEmbedPluginContext/State.d.ts +13 -0
  51. package/dist/cjs/contexts/XyoEmbedPluginContext/State.d.ts.map +1 -0
  52. package/dist/cjs/contexts/XyoEmbedPluginContext/State.js +3 -0
  53. package/dist/cjs/contexts/XyoEmbedPluginContext/State.js.map +1 -0
  54. package/dist/cjs/contexts/XyoEmbedPluginContext/index.d.ts +3 -0
  55. package/dist/cjs/contexts/XyoEmbedPluginContext/index.d.ts.map +1 -0
  56. package/dist/cjs/contexts/XyoEmbedPluginContext/index.js +6 -0
  57. package/dist/cjs/contexts/XyoEmbedPluginContext/index.js.map +1 -0
  58. package/dist/cjs/contexts/XyoEmbedPluginContext/use.d.ts +2 -0
  59. package/dist/cjs/contexts/XyoEmbedPluginContext/use.d.ts.map +1 -0
  60. package/dist/cjs/contexts/XyoEmbedPluginContext/use.js +14 -0
  61. package/dist/cjs/contexts/XyoEmbedPluginContext/use.js.map +1 -0
  62. package/dist/cjs/contexts/index.d.ts +2 -0
  63. package/dist/cjs/contexts/index.d.ts.map +1 -0
  64. package/dist/cjs/contexts/index.js +5 -0
  65. package/dist/cjs/contexts/index.js.map +1 -0
  66. package/dist/docs.json +7 -91
  67. package/dist/esm/components/XyoEmbedPlugin.d.ts.map +1 -1
  68. package/dist/esm/components/XyoEmbedPlugin.js +5 -48
  69. package/dist/esm/components/XyoEmbedPlugin.js.map +1 -1
  70. package/dist/esm/components/XyoEmbedPluginProps.d.ts +2 -0
  71. package/dist/esm/components/XyoEmbedPluginProps.d.ts.map +1 -1
  72. package/dist/esm/components/controls/ControlWrap.d.ts +10 -0
  73. package/dist/esm/components/controls/ControlWrap.d.ts.map +1 -0
  74. package/dist/esm/components/controls/ControlWrap.js +6 -0
  75. package/dist/esm/components/controls/ControlWrap.js.map +1 -0
  76. package/dist/esm/components/controls/ListModeSelect.d.ts +6 -0
  77. package/dist/esm/components/controls/ListModeSelect.d.ts.map +1 -0
  78. package/dist/esm/components/controls/ListModeSelect.js +16 -0
  79. package/dist/esm/components/controls/ListModeSelect.js.map +1 -0
  80. package/dist/esm/components/controls/RenderSelect.d.ts +3 -0
  81. package/dist/esm/components/controls/RenderSelect.d.ts.map +1 -0
  82. package/dist/esm/components/controls/RenderSelect.js +11 -0
  83. package/dist/esm/components/controls/RenderSelect.js.map +1 -0
  84. package/dist/esm/components/controls/index.d.ts +4 -0
  85. package/dist/esm/components/controls/index.d.ts.map +1 -0
  86. package/dist/esm/components/controls/index.js +4 -0
  87. package/dist/esm/components/controls/index.js.map +1 -0
  88. package/dist/esm/components/embed-card/EmbedCardEx.d.ts +5 -0
  89. package/dist/esm/components/embed-card/EmbedCardEx.d.ts.map +1 -0
  90. package/dist/esm/components/embed-card/EmbedCardEx.js +25 -0
  91. package/dist/esm/components/embed-card/EmbedCardEx.js.map +1 -0
  92. package/dist/esm/components/embed-card/EmbedPluginContainer.d.ts +3 -0
  93. package/dist/esm/components/embed-card/EmbedPluginContainer.d.ts.map +1 -0
  94. package/dist/esm/components/embed-card/EmbedPluginContainer.js +15 -0
  95. package/dist/esm/components/embed-card/EmbedPluginContainer.js.map +1 -0
  96. package/dist/esm/components/embed-card/ValidatePlugins.d.ts +4 -0
  97. package/dist/esm/components/embed-card/ValidatePlugins.d.ts.map +1 -0
  98. package/dist/esm/components/embed-card/ValidatePlugins.js +13 -0
  99. package/dist/esm/components/embed-card/ValidatePlugins.js.map +1 -0
  100. package/dist/esm/components/embed-card/index.d.ts +3 -0
  101. package/dist/esm/components/embed-card/index.d.ts.map +1 -0
  102. package/dist/esm/components/embed-card/index.js +3 -0
  103. package/dist/esm/components/embed-card/index.js.map +1 -0
  104. package/dist/esm/components/index.d.ts +0 -1
  105. package/dist/esm/components/index.d.ts.map +1 -1
  106. package/dist/esm/components/index.js +0 -1
  107. package/dist/esm/components/index.js.map +1 -1
  108. package/dist/esm/contexts/XyoEmbedPluginContext/Context.d.ts +4 -0
  109. package/dist/esm/contexts/XyoEmbedPluginContext/Context.d.ts.map +1 -0
  110. package/dist/esm/contexts/XyoEmbedPluginContext/Context.js +3 -0
  111. package/dist/esm/contexts/XyoEmbedPluginContext/Context.js.map +1 -0
  112. package/dist/esm/contexts/XyoEmbedPluginContext/Provider.d.ts +12 -0
  113. package/dist/esm/contexts/XyoEmbedPluginContext/Provider.d.ts.map +1 -0
  114. package/dist/esm/contexts/XyoEmbedPluginContext/Provider.js +39 -0
  115. package/dist/esm/contexts/XyoEmbedPluginContext/Provider.js.map +1 -0
  116. package/dist/esm/contexts/XyoEmbedPluginContext/State.d.ts +13 -0
  117. package/dist/esm/contexts/XyoEmbedPluginContext/State.d.ts.map +1 -0
  118. package/dist/esm/contexts/XyoEmbedPluginContext/State.js +2 -0
  119. package/dist/esm/contexts/XyoEmbedPluginContext/State.js.map +1 -0
  120. package/dist/esm/contexts/XyoEmbedPluginContext/index.d.ts +3 -0
  121. package/dist/esm/contexts/XyoEmbedPluginContext/index.d.ts.map +1 -0
  122. package/dist/esm/contexts/XyoEmbedPluginContext/index.js +3 -0
  123. package/dist/esm/contexts/XyoEmbedPluginContext/index.js.map +1 -0
  124. package/dist/esm/contexts/XyoEmbedPluginContext/use.d.ts +2 -0
  125. package/dist/esm/contexts/XyoEmbedPluginContext/use.d.ts.map +1 -0
  126. package/dist/esm/contexts/XyoEmbedPluginContext/use.js +10 -0
  127. package/dist/esm/contexts/XyoEmbedPluginContext/use.js.map +1 -0
  128. package/dist/esm/contexts/index.d.ts +2 -0
  129. package/dist/esm/contexts/index.d.ts.map +1 -0
  130. package/dist/esm/contexts/index.js +2 -0
  131. package/dist/esm/contexts/index.js.map +1 -0
  132. package/package.json +11 -11
  133. package/src/components/XyoEmbedPlugin.stories.tsx +3 -1
  134. package/src/components/XyoEmbedPlugin.tsx +10 -88
  135. package/src/components/XyoEmbedPluginProps.ts +2 -0
  136. package/src/components/controls/ControlWrap.tsx +16 -0
  137. package/src/components/{ListModeSelect.tsx → controls/ListModeSelect.tsx} +13 -0
  138. package/src/components/controls/RenderSelect.tsx +22 -0
  139. package/src/components/controls/index.ts +3 -0
  140. package/src/components/embed-card/EmbedCardEx.tsx +25 -0
  141. package/src/components/embed-card/EmbedPluginContainer.tsx +48 -0
  142. package/src/components/embed-card/ValidatePlugins.tsx +17 -0
  143. package/src/components/embed-card/index.ts +2 -0
  144. package/src/components/index.ts +0 -1
  145. package/src/contexts/XyoEmbedPluginContext/Context.tsx +5 -0
  146. package/src/contexts/XyoEmbedPluginContext/Provider.tsx +67 -0
  147. package/src/contexts/XyoEmbedPluginContext/State.ts +13 -0
  148. package/src/contexts/XyoEmbedPluginContext/index.ts +2 -0
  149. package/src/contexts/XyoEmbedPluginContext/use.tsx +13 -0
  150. 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,2 @@
1
+ export declare const useXyoEmbedPluginState: () => import("./State").XyoEmbedPluginState;
2
+ //# sourceMappingURL=use.d.ts.map
@@ -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,2 @@
1
+ export * from './XyoEmbedPluginContext';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export * from './XyoEmbedPluginContext';
2
+ //# sourceMappingURL=index.js.map
@@ -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.10",
20
- "@xyo-network/payload": "^2.24.10",
21
- "@xyo-network/react-auth-service": "^2.27.6",
22
- "@xyo-network/react-payload-plugin": "^2.27.6",
23
- "@xyo-network/react-shared": "^2.27.6",
24
- "@xyo-network/react-webapp": "^2.27.6",
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.13",
33
- "@xyo-network/react-aggregate-price-plugin": "^2.27.5",
34
- "@xyo-network/react-crypto-market-uniswap-payload-plugin": "^2.27.6",
35
- "@xyo-network/react-storybook": "^2.27.6",
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.4"
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://beta.api.archivist.xyo.network/f78f3ab27794eaab4658313fe871fb5a513de10cf89cf935a079c5ebb75fdce9'
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 { ListModeSelect } from './ListModeSelect'
14
- import { RenderComponent } from './RenderComponent'
3
+ import { XyoEmbedPluginProvider } from '../contexts'
4
+ import { EmbedPluginContainer, ValidatePlugins } from './embed-card'
15
5
  import { XyoEmbedPluginProps } from './XyoEmbedPluginProps'
16
6
 
17
- const renderSelectId = 'render-select-id'
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
- <ListModeProvider>
65
- <ResultLoader searchResult={payload} notFound={!!notFound} apiError={huriApiError}>
66
- <XyoApiErrorRender apiError={huriApiError} rowGap={2} {...props}>
67
- <FlexGrowRow columnGap={2} rowGap={2} flexWrap="wrap">
68
- <FormControl>
69
- <InputLabel id={renderSelectId}>{renderSelectLabel}</InputLabel>
70
- <Select size="small" value={ActivePlugin.name} label={renderSelectLabel} labelId={renderSelectId}>
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
  }
@@ -4,4 +4,6 @@ import { XyoPayloadRenderPlugin } from '@xyo-network/react-payload-plugin'
4
4
  export interface XyoEmbedPluginProps extends FlexBoxProps {
5
5
  plugins?: XyoPayloadRenderPlugin[]
6
6
  huri?: string
7
+ refreshTitle?: string
8
+ timestampLabel?: string
7
9
  }
@@ -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,3 @@
1
+ export * from './ControlWrap'
2
+ export * from './ListModeSelect'
3
+ export * from './RenderSelect'
@@ -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
+ }
@@ -0,0 +1,2 @@
1
+ export * from './EmbedPluginContainer'
2
+ export * from './ValidatePlugins'
@@ -1,2 +1 @@
1
- export * from './ListModeSelect'
2
1
  export * from './XyoEmbedPlugin'
@@ -0,0 +1,5 @@
1
+ import { createContext } from 'react'
2
+
3
+ import { XyoEmbedPluginState } from './State'
4
+
5
+ export const XyoEmbedPluginContext = createContext<XyoEmbedPluginState>({})
@@ -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,2 @@
1
+ export * from './Provider'
2
+ export * from './use'
@@ -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'