@xyo-network/react-price-forecast-plugin 2.61.9 → 2.62.0

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 (98) hide show
  1. package/dist/browser/lib/ForecastLineChartConfigBuilder.d.cts +4 -2
  2. package/dist/browser/lib/ForecastLineChartConfigBuilder.d.cts.map +1 -1
  3. package/dist/browser/lib/ForecastLineChartConfigBuilder.d.mts +4 -2
  4. package/dist/browser/lib/ForecastLineChartConfigBuilder.d.mts.map +1 -1
  5. package/dist/browser/lib/ForecastLineChartConfigBuilder.d.ts +4 -2
  6. package/dist/browser/lib/ForecastLineChartConfigBuilder.d.ts.map +1 -1
  7. package/dist/browser/lib/SourcePayloads.d.cts +2 -2
  8. package/dist/browser/lib/SourcePayloads.d.cts.map +1 -1
  9. package/dist/browser/lib/SourcePayloads.d.mts +2 -2
  10. package/dist/browser/lib/SourcePayloads.d.mts.map +1 -1
  11. package/dist/browser/lib/SourcePayloads.d.ts +2 -2
  12. package/dist/browser/lib/SourcePayloads.d.ts.map +1 -1
  13. package/dist/node/lib/ForecastLineChartConfigBuilder.d.cts +4 -2
  14. package/dist/node/lib/ForecastLineChartConfigBuilder.d.cts.map +1 -1
  15. package/dist/node/lib/ForecastLineChartConfigBuilder.d.mts +4 -2
  16. package/dist/node/lib/ForecastLineChartConfigBuilder.d.mts.map +1 -1
  17. package/dist/node/lib/ForecastLineChartConfigBuilder.d.ts +4 -2
  18. package/dist/node/lib/ForecastLineChartConfigBuilder.d.ts.map +1 -1
  19. package/dist/node/lib/SourcePayloads.d.cts +2 -2
  20. package/dist/node/lib/SourcePayloads.d.cts.map +1 -1
  21. package/dist/node/lib/SourcePayloads.d.mts +2 -2
  22. package/dist/node/lib/SourcePayloads.d.mts.map +1 -1
  23. package/dist/node/lib/SourcePayloads.d.ts +2 -2
  24. package/dist/node/lib/SourcePayloads.d.ts.map +1 -1
  25. package/package.json +8 -8
  26. package/dist/browser/Plugin.cjs +0 -270
  27. package/dist/browser/Plugin.cjs.map +0 -1
  28. package/dist/browser/Plugin.js +0 -259
  29. package/dist/browser/Plugin.js.map +0 -1
  30. package/dist/browser/components/DetailsBox.cjs +0 -254
  31. package/dist/browser/components/DetailsBox.cjs.map +0 -1
  32. package/dist/browser/components/DetailsBox.js +0 -243
  33. package/dist/browser/components/DetailsBox.js.map +0 -1
  34. package/dist/browser/components/index.cjs +0 -256
  35. package/dist/browser/components/index.cjs.map +0 -1
  36. package/dist/browser/components/index.js +0 -243
  37. package/dist/browser/components/index.js.map +0 -1
  38. package/dist/browser/lib/DataLineStyles.cjs +0 -31
  39. package/dist/browser/lib/DataLineStyles.cjs.map +0 -1
  40. package/dist/browser/lib/DataLineStyles.js +0 -10
  41. package/dist/browser/lib/DataLineStyles.js.map +0 -1
  42. package/dist/browser/lib/DataPointStyles.cjs +0 -33
  43. package/dist/browser/lib/DataPointStyles.cjs.map +0 -1
  44. package/dist/browser/lib/DataPointStyles.js +0 -12
  45. package/dist/browser/lib/DataPointStyles.js.map +0 -1
  46. package/dist/browser/lib/ForecastLineChartConfigBuilder.cjs +0 -225
  47. package/dist/browser/lib/ForecastLineChartConfigBuilder.cjs.map +0 -1
  48. package/dist/browser/lib/ForecastLineChartConfigBuilder.js +0 -202
  49. package/dist/browser/lib/ForecastLineChartConfigBuilder.js.map +0 -1
  50. package/dist/browser/lib/MockSourcePayloads.cjs +0 -45
  51. package/dist/browser/lib/MockSourcePayloads.cjs.map +0 -1
  52. package/dist/browser/lib/MockSourcePayloads.js +0 -24
  53. package/dist/browser/lib/MockSourcePayloads.js.map +0 -1
  54. package/dist/browser/lib/SourcePayloads.cjs +0 -85
  55. package/dist/browser/lib/SourcePayloads.cjs.map +0 -1
  56. package/dist/browser/lib/SourcePayloads.js +0 -62
  57. package/dist/browser/lib/SourcePayloads.js.map +0 -1
  58. package/dist/browser/lib/index.cjs +0 -227
  59. package/dist/browser/lib/index.cjs.map +0 -1
  60. package/dist/browser/lib/index.js +0 -204
  61. package/dist/browser/lib/index.js.map +0 -1
  62. package/dist/docs.json +0 -23326
  63. package/dist/node/Plugin.cjs +0 -278
  64. package/dist/node/Plugin.cjs.map +0 -1
  65. package/dist/node/Plugin.js +0 -263
  66. package/dist/node/Plugin.js.map +0 -1
  67. package/dist/node/components/DetailsBox.cjs +0 -262
  68. package/dist/node/components/DetailsBox.cjs.map +0 -1
  69. package/dist/node/components/DetailsBox.js +0 -247
  70. package/dist/node/components/DetailsBox.js.map +0 -1
  71. package/dist/node/components/index.cjs +0 -264
  72. package/dist/node/components/index.cjs.map +0 -1
  73. package/dist/node/components/index.js +0 -247
  74. package/dist/node/components/index.js.map +0 -1
  75. package/dist/node/lib/DataLineStyles.cjs +0 -35
  76. package/dist/node/lib/DataLineStyles.cjs.map +0 -1
  77. package/dist/node/lib/DataLineStyles.js +0 -10
  78. package/dist/node/lib/DataLineStyles.js.map +0 -1
  79. package/dist/node/lib/DataPointStyles.cjs +0 -37
  80. package/dist/node/lib/DataPointStyles.cjs.map +0 -1
  81. package/dist/node/lib/DataPointStyles.js +0 -12
  82. package/dist/node/lib/DataPointStyles.js.map +0 -1
  83. package/dist/node/lib/ForecastLineChartConfigBuilder.cjs +0 -233
  84. package/dist/node/lib/ForecastLineChartConfigBuilder.cjs.map +0 -1
  85. package/dist/node/lib/ForecastLineChartConfigBuilder.js +0 -206
  86. package/dist/node/lib/ForecastLineChartConfigBuilder.js.map +0 -1
  87. package/dist/node/lib/MockSourcePayloads.cjs +0 -49
  88. package/dist/node/lib/MockSourcePayloads.cjs.map +0 -1
  89. package/dist/node/lib/MockSourcePayloads.js +0 -24
  90. package/dist/node/lib/MockSourcePayloads.js.map +0 -1
  91. package/dist/node/lib/SourcePayloads.cjs +0 -89
  92. package/dist/node/lib/SourcePayloads.cjs.map +0 -1
  93. package/dist/node/lib/SourcePayloads.js +0 -62
  94. package/dist/node/lib/SourcePayloads.js.map +0 -1
  95. package/dist/node/lib/index.cjs +0 -237
  96. package/dist/node/lib/index.cjs.map +0 -1
  97. package/dist/node/lib/index.js +0 -208
  98. package/dist/node/lib/index.js.map +0 -1
@@ -1,278 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/Plugin.ts
21
- var Plugin_exports = {};
22
- __export(Plugin_exports, {
23
- PriceForecastRenderPlugin: () => PriceForecastRenderPlugin
24
- });
25
- module.exports = __toCommonJS(Plugin_exports);
26
- var import_react_payload_plugin = require("@xyo-network/react-payload-plugin");
27
-
28
- // src/components/DetailsBox.tsx
29
- var import_chartjs_adapter_luxon = require("chartjs-adapter-luxon");
30
- var import_material2 = require("@mui/material");
31
- var import_react_async_effect = require("@xylabs/react-async-effect");
32
- var import_react_flexbox = require("@xylabs/react-flexbox");
33
- var import_chart = require("chart.js");
34
- var import_react = require("react");
35
- var import_react_chartjs_2 = require("react-chartjs-2");
36
-
37
- // src/lib/DataLineStyles.ts
38
- var import_material = require("@mui/material");
39
- var DataLineStyles = (color) => ({
40
- backgroundColor: color ? (0, import_material.alpha)(color, 0.5) : void 0,
41
- borderColor: color
42
- });
43
-
44
- // src/lib/DataPointStyles.ts
45
- var DataPointStyles = (pointHoverBackgroundColor) => ({
46
- pointHitRadius: 20,
47
- pointHoverBackgroundColor,
48
- pointHoverRadius: 10,
49
- pointRadius: 5,
50
- pointStyle: "circle"
51
- });
52
-
53
- // src/lib/MockSourcePayloads.ts
54
- var MockSourcePayloads = () => {
55
- const tenMin = 6e5;
56
- return [
57
- {
58
- baseFee: 38.90155387825,
59
- feePerGas: { high: 47.9945864396, low: 39.006868093, medium: 39.306868093, veryHigh: 44.45384380525 },
60
- priorityFeePerGas: { high: 1.0266666666666666, low: -0.41000000000000003, medium: 0.38, veryHigh: 1.3900000000000001 },
61
- schema: "network.xyo.blockchain.ethereum.gas",
62
- timestamp: Date.now() - tenMin
63
- },
64
- {
65
- baseFee: 38.90155387825,
66
- feePerGas: { high: 47.9945864396, low: 39.006868093, medium: 100, veryHigh: 44.45384380525 },
67
- priorityFeePerGas: { high: 1.0266666666666666, low: -0.41000000000000003, medium: 0.38, veryHigh: 1.3900000000000001 },
68
- schema: "network.xyo.blockchain.ethereum.gas",
69
- timestamp: Date.now()
70
- }
71
- ];
72
- };
73
-
74
- // src/lib/SourcePayloads.ts
75
- var SourcePayloads = class {
76
- constructor(sourcePayloads) {
77
- this.sourcePayloads = sourcePayloads;
78
- }
79
- sourcePrices = [];
80
- get payloads() {
81
- return this.sourcePayloads;
82
- }
83
- static async build(jsonPath) {
84
- const sourcePayloads = await this.fetchSourcePayloads();
85
- const instance = new this(sourcePayloads);
86
- const paths = jsonPath.split(".");
87
- instance.sourcePrices = sourcePayloads.map((payload) => {
88
- return { x: payload.timestamp, y: instance.jsonPathTraverser(payload, paths) };
89
- });
90
- return instance;
91
- }
92
- // TODO - fetch from archivist
93
- static async fetchSourcePayloads() {
94
- const payloads = await Promise.resolve(MockSourcePayloads());
95
- return payloads;
96
- }
97
- jsonPathTraverser(obj, path) {
98
- let result = obj;
99
- for (const key of path) {
100
- if (key in result) {
101
- const foundKey = key;
102
- result = result[foundKey];
103
- } else {
104
- result = void 0;
105
- break;
106
- }
107
- }
108
- return result;
109
- }
110
- };
111
-
112
- // src/lib/ForecastLineChartConfigBuilder.ts
113
- var defaultOptions = () => ({
114
- plugins: {
115
- legend: {
116
- position: "top"
117
- }
118
- },
119
- responsive: true
120
- });
121
- var ForecastLineChartConfigBuilder = class _ForecastLineChartConfigBuilder {
122
- constructor(theme, payload) {
123
- this.payload = payload;
124
- this.themeColors = this.parseTheme(theme);
125
- }
126
- data = {
127
- datasets: []
128
- };
129
- options = defaultOptions();
130
- themeColors;
131
- get forecastPayload() {
132
- if (this.payload) {
133
- return this.payload;
134
- } else {
135
- throw Error("ForecastPayload was not defined");
136
- }
137
- }
138
- static async create(theme, payload, sourcePayloadConfig) {
139
- const instance = new _ForecastLineChartConfigBuilder(theme, payload);
140
- await instance.build(sourcePayloadConfig == null ? void 0 : sourcePayloadConfig.fetch);
141
- instance.refreshValues();
142
- return instance;
143
- }
144
- async build(includeSources) {
145
- this.buildOptions();
146
- await this.buildData(includeSources);
147
- return this;
148
- }
149
- async buildData(includeSources) {
150
- const forecastData = this.generateDataSetForecastData();
151
- const datasets = [forecastData];
152
- if (includeSources) {
153
- const sourceData = await this.generateDataSetSourcePayloads();
154
- datasets.unshift(sourceData);
155
- const lastSourceDataItem = sourceData.data.at(-1);
156
- forecastData.data.unshift(lastSourceDataItem);
157
- }
158
- this.data = {
159
- datasets
160
- };
161
- return this;
162
- }
163
- buildOptions() {
164
- if (this.options.plugins) {
165
- this.options.plugins.title = this.generateTitle();
166
- this.options.plugins.legend = this.generateLegend();
167
- }
168
- this.options.scales = this.generateScales();
169
- return this;
170
- }
171
- refreshValues() {
172
- this.data = { ...this.data };
173
- this.options = { ...this.options };
174
- }
175
- generateLegend() {
176
- return {
177
- labels: {
178
- pointStyle: "circle",
179
- usePointStyle: true
180
- }
181
- };
182
- }
183
- generateScales() {
184
- var _a, _b;
185
- return {
186
- x: {
187
- grid: {
188
- color: (_a = this.themeColors) == null ? void 0 : _a.gridColor
189
- },
190
- time: {
191
- unit: "minute"
192
- },
193
- type: "time"
194
- },
195
- y: {
196
- grid: {
197
- color: (_b = this.themeColors) == null ? void 0 : _b.gridColor
198
- }
199
- }
200
- };
201
- }
202
- generateTitle() {
203
- var _a;
204
- return {
205
- display: true,
206
- text: `Gas Price Forecaster (GWEI over time from ${((_a = this.forecastPayload) == null ? void 0 : _a.values[0].timestamp) ? new Date(this.forecastPayload.values[0].timestamp).toLocaleDateString() : ""})`
207
- };
208
- }
209
- parseTheme(theme) {
210
- const dark = theme.palette.mode === "dark";
211
- return {
212
- dataSetColorPrimary: theme.palette.primary.light,
213
- dataSetColorSecondary: theme.palette.secondary.light,
214
- gridColor: dark ? theme.palette.grey[800] : theme.palette.grey[300]
215
- };
216
- }
217
- generateDataSetForecastData() {
218
- var _a, _b;
219
- return {
220
- borderDash: [5],
221
- borderDashOffset: 0.5,
222
- data: this.forecastPayload.values.map((price) => ({ x: price.timestamp ?? 0, y: price.value })),
223
- label: "Forecast Price",
224
- ...DataPointStyles((_a = this.themeColors) == null ? void 0 : _a.dataSetColorPrimary),
225
- ...DataLineStyles((_b = this.themeColors) == null ? void 0 : _b.dataSetColorPrimary)
226
- };
227
- }
228
- async generateDataSetSourcePayloads() {
229
- var _a, _b;
230
- const { sourcePrices } = await SourcePayloads.build("feePerGas.medium");
231
- return {
232
- data: sourcePrices,
233
- label: "Source Prices",
234
- ...DataLineStyles((_a = this.themeColors) == null ? void 0 : _a.dataSetColorSecondary),
235
- ...DataPointStyles((_b = this.themeColors) == null ? void 0 : _b.dataSetColorSecondary)
236
- };
237
- }
238
- };
239
-
240
- // src/components/DetailsBox.tsx
241
- var import_jsx_runtime = require("react/jsx-runtime");
242
- import_chart.Chart.register(import_chart.CategoryScale, import_chart.TimeScale, import_chart.PointElement, import_chart.LineElement, import_chart.LinearScale, import_chart.Title, import_chart.Tooltip, import_chart.Legend);
243
- var PriceForecastDetailsBox = ({ payload, ...props }) => {
244
- const priceForecastPayload = payload;
245
- const theme = (0, import_material2.useTheme)();
246
- const [data, setData] = (0, import_react.useState)({ datasets: [] });
247
- const [options, setOptions] = (0, import_react.useState)({});
248
- (0, import_react_async_effect.useAsyncEffect)(
249
- // eslint-disable-next-line react-hooks/exhaustive-deps
250
- async (mounted) => {
251
- const { data: data2, options: options2 } = await ForecastLineChartConfigBuilder.create(theme, priceForecastPayload, { fetch: true });
252
- if (mounted()) {
253
- setData(data2);
254
- setOptions(options2);
255
- }
256
- },
257
- [priceForecastPayload, theme]
258
- );
259
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_flexbox.FlexCol, { ...props, busy: priceForecastPayload === void 0, minHeight: "25vh", children: priceForecastPayload ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_chartjs_2.Line, { options, data }) : null });
260
- };
261
-
262
- // src/Plugin.ts
263
- var PriceForecastRenderPlugin = {
264
- ...(0, import_react_payload_plugin.createPayloadRenderPlugin)({
265
- canRender: () => true,
266
- components: {
267
- box: {
268
- detailsBox: PriceForecastDetailsBox
269
- }
270
- },
271
- name: "PriceForecast"
272
- })
273
- };
274
- // Annotate the CommonJS export names for ESM import in node:
275
- 0 && (module.exports = {
276
- PriceForecastRenderPlugin
277
- });
278
- //# sourceMappingURL=Plugin.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/Plugin.ts","../../src/components/DetailsBox.tsx","../../src/lib/DataLineStyles.ts","../../src/lib/DataPointStyles.ts","../../src/lib/MockSourcePayloads.ts","../../src/lib/SourcePayloads.ts","../../src/lib/ForecastLineChartConfigBuilder.ts"],"sourcesContent":["import { createPayloadRenderPlugin, PayloadRenderPlugin } from '@xyo-network/react-payload-plugin'\n\nimport { PriceForecastDetailsBox } from './components'\n\nexport const PriceForecastRenderPlugin: PayloadRenderPlugin = {\n ...createPayloadRenderPlugin({\n canRender: () => true,\n components: {\n box: {\n detailsBox: PriceForecastDetailsBox,\n },\n },\n name: 'PriceForecast',\n }),\n}\n","import 'chartjs-adapter-luxon'\n\nimport { useTheme } from '@mui/material'\nimport { useAsyncEffect } from '@xylabs/react-async-effect'\nimport { FlexBoxProps, FlexCol } from '@xylabs/react-flexbox'\nimport { ForecastPayload } from '@xyo-network/diviner-forecasting-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CategoryScale,\n Chart as ChartJS,\n ChartData,\n ChartOptions,\n Legend,\n LinearScale,\n LineElement,\n PointElement,\n TimeScale,\n Title,\n Tooltip,\n} from 'chart.js'\nimport { useState } from 'react'\nimport { Line } from 'react-chartjs-2'\n\nimport { ForecastLineChartConfigBuilder } from '../lib'\n\nChartJS.register(CategoryScale, TimeScale, PointElement, LineElement, LinearScale, Title, Tooltip, Legend)\n\nexport interface PriceForecastDetailsBoxProps extends FlexBoxProps {\n payload?: Payload\n}\n\nexport const PriceForecastDetailsBox: React.FC<PriceForecastDetailsBoxProps> = ({ payload, ...props }) => {\n const priceForecastPayload = payload as ForecastPayload | undefined\n const theme = useTheme()\n const [data, setData] = useState<ChartData<'line'>>({ datasets: [] })\n const [options, setOptions] = useState<ChartOptions<'line'>>({})\n\n useAsyncEffect(\n // eslint-disable-next-line react-hooks/exhaustive-deps\n async (mounted) => {\n const { data, options } = await ForecastLineChartConfigBuilder.create(theme, priceForecastPayload, { fetch: true })\n if (mounted()) {\n setData(data)\n setOptions(options)\n }\n },\n [priceForecastPayload, theme],\n )\n\n return (\n <FlexCol {...props} busy={priceForecastPayload === undefined} minHeight=\"25vh\">\n {priceForecastPayload ? <Line options={options} data={data} /> : null}\n </FlexCol>\n )\n}\n","import { alpha } from '@mui/material'\n\nexport const DataLineStyles = (color?: string) => ({\n backgroundColor: color ? alpha(color, 0.5) : undefined,\n borderColor: color,\n})\n","export const DataPointStyles = (pointHoverBackgroundColor?: string) => ({\n pointHitRadius: 20,\n pointHoverBackgroundColor,\n pointHoverRadius: 10,\n pointRadius: 5,\n pointStyle: 'circle',\n})\n","export const MockSourcePayloads = () => {\n const tenMin = 600000\n return [\n {\n baseFee: 38.90155387825,\n feePerGas: { high: 47.9945864396, low: 39.006868093, medium: 39.306868093, veryHigh: 44.45384380525 },\n priorityFeePerGas: { high: 1.0266666666666666, low: -0.41000000000000003, medium: 0.38, veryHigh: 1.3900000000000001 },\n schema: 'network.xyo.blockchain.ethereum.gas',\n timestamp: Date.now() - tenMin,\n },\n {\n baseFee: 38.90155387825,\n feePerGas: { high: 47.9945864396, low: 39.006868093, medium: 100, veryHigh: 44.45384380525 },\n priorityFeePerGas: { high: 1.0266666666666666, low: -0.41000000000000003, medium: 0.38, veryHigh: 1.3900000000000001 },\n schema: 'network.xyo.blockchain.ethereum.gas',\n timestamp: Date.now(),\n },\n ]\n}\n","import { Payload } from '@xyo-network/payload-model'\nimport { Point } from 'chart.js'\n\nimport { MockSourcePayloads } from './MockSourcePayloads'\n\nexport class SourcePayloads {\n sourcePrices: Point[] = []\n\n constructor(public sourcePayloads: Payload[]) {}\n\n get payloads() {\n return this.sourcePayloads\n }\n\n static async build(jsonPath: string) {\n const sourcePayloads = await this.fetchSourcePayloads()\n const instance = new this(sourcePayloads)\n\n const paths = jsonPath.split('.')\n instance.sourcePrices = sourcePayloads.map((payload) => {\n return { x: payload.timestamp, y: instance.jsonPathTraverser(payload, paths) }\n })\n return instance\n }\n\n // TODO - fetch from archivist\n static async fetchSourcePayloads() {\n const payloads = await Promise.resolve(MockSourcePayloads())\n return payloads\n }\n\n jsonPathTraverser(obj: Payload, path: string[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any = obj\n for (const key of path) {\n if (key in result) {\n const foundKey = key as keyof typeof result\n result = result[foundKey]\n } else {\n result = undefined\n break\n }\n }\n\n return result\n }\n}\n","import { Theme } from '@mui/material'\nimport { ForecastPayload } from '@xyo-network/diviner-forecasting-model'\nimport { ChartData, ChartDataset, ChartOptions, LegendOptions, Point, ScaleChartOptions } from 'chart.js'\n// eslint-disable-next-line import/no-unresolved\nimport { _DeepPartialObject } from 'chart.js/dist/types/utils'\n\nimport { DataLineStyles } from './DataLineStyles'\nimport { DataPointStyles } from './DataPointStyles'\nimport { SourcePayloads } from './SourcePayloads'\n\ninterface SourcePayloadConfig {\n fetch: boolean\n sampleSize?: number\n}\n\ninterface ThemeColors {\n dataSetColorPrimary: string\n dataSetColorSecondary: string\n gridColor: string\n}\n\nconst defaultOptions: () => ChartOptions<'line'> = () => ({\n plugins: {\n legend: {\n position: 'top' as const,\n },\n },\n responsive: true,\n})\n\nexport class ForecastLineChartConfigBuilder {\n data: ChartData<'line'> = {\n datasets: [],\n }\n options: ChartOptions<'line'> = defaultOptions()\n themeColors: ThemeColors | undefined\n\n constructor(\n theme: Theme,\n private payload?: ForecastPayload,\n ) {\n this.themeColors = this.parseTheme(theme)\n }\n\n get forecastPayload() {\n if (this.payload) {\n return this.payload\n } else {\n throw Error('ForecastPayload was not defined')\n }\n }\n\n static async create(theme: Theme, payload?: ForecastPayload, sourcePayloadConfig?: SourcePayloadConfig) {\n const instance = new ForecastLineChartConfigBuilder(theme, payload)\n\n await instance.build(sourcePayloadConfig?.fetch)\n\n instance.refreshValues()\n\n return instance\n }\n\n async build(includeSources?: boolean) {\n this.buildOptions()\n await this.buildData(includeSources)\n return this\n }\n\n async buildData(includeSources?: boolean) {\n const forecastData = this.generateDataSetForecastData()\n\n const datasets: ChartDataset<'line'>[] = [forecastData]\n\n if (includeSources) {\n // build data from sources in forecastPayload\n const sourceData = await this.generateDataSetSourcePayloads()\n datasets.unshift(sourceData)\n\n // add last source point as first item in prediction to connect the lines\n const lastSourceDataItem = sourceData.data.at(-1) as Point\n forecastData.data.unshift(lastSourceDataItem)\n }\n\n this.data = {\n datasets,\n }\n\n return this\n }\n\n buildOptions() {\n if (this.options.plugins) {\n this.options.plugins.title = this.generateTitle()\n this.options.plugins.legend = this.generateLegend()\n }\n this.options.scales = this.generateScales()\n\n return this\n }\n\n refreshValues() {\n this.data = { ...this.data }\n this.options = { ...this.options }\n }\n\n protected generateLegend(): _DeepPartialObject<LegendOptions<'line'>> {\n return {\n labels: {\n pointStyle: 'circle',\n usePointStyle: true,\n },\n }\n }\n\n protected generateScales(): _DeepPartialObject<ScaleChartOptions<'line'>['scales']> {\n return {\n x: {\n grid: {\n color: this.themeColors?.gridColor,\n },\n time: {\n unit: 'minute',\n },\n type: 'time',\n },\n y: {\n grid: {\n color: this.themeColors?.gridColor,\n },\n },\n }\n }\n\n protected generateTitle() {\n return {\n display: true,\n text: `Gas Price Forecaster (GWEI over time from ${\n this.forecastPayload?.values[0].timestamp ? new Date(this.forecastPayload.values[0].timestamp).toLocaleDateString() : ''\n })`,\n }\n }\n\n protected parseTheme(theme: Theme) {\n const dark = theme.palette.mode === 'dark'\n return {\n dataSetColorPrimary: theme.palette.primary.light,\n dataSetColorSecondary: theme.palette.secondary.light,\n gridColor: dark ? theme.palette.grey[800] : theme.palette.grey[300],\n }\n }\n\n private generateDataSetForecastData(): ChartDataset<'line'> {\n return {\n borderDash: [5],\n borderDashOffset: 0.5,\n data: this.forecastPayload.values.map((price) => ({ x: price.timestamp ?? 0, y: price.value })),\n label: 'Forecast Price',\n ...DataPointStyles(this.themeColors?.dataSetColorPrimary),\n ...DataLineStyles(this.themeColors?.dataSetColorPrimary),\n }\n }\n\n private async generateDataSetSourcePayloads(): Promise<ChartDataset<'line'>> {\n const { sourcePrices } = await SourcePayloads.build('feePerGas.medium')\n return {\n data: sourcePrices,\n label: 'Source Prices',\n ...DataLineStyles(this.themeColors?.dataSetColorSecondary),\n ...DataPointStyles(this.themeColors?.dataSetColorSecondary),\n }\n }\n}\n"],"mappings":"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","names":["import_material","ChartJS","data","options"]}
@@ -1,263 +0,0 @@
1
- // src/Plugin.ts
2
- import { createPayloadRenderPlugin } from "@xyo-network/react-payload-plugin";
3
-
4
- // src/components/DetailsBox.tsx
5
- import "chartjs-adapter-luxon";
6
- import { useTheme } from "@mui/material";
7
- import { useAsyncEffect } from "@xylabs/react-async-effect";
8
- import { FlexCol } from "@xylabs/react-flexbox";
9
- import {
10
- CategoryScale,
11
- Chart as ChartJS,
12
- Legend,
13
- LinearScale,
14
- LineElement,
15
- PointElement,
16
- TimeScale,
17
- Title,
18
- Tooltip
19
- } from "chart.js";
20
- import { useState } from "react";
21
- import { Line } from "react-chartjs-2";
22
-
23
- // src/lib/DataLineStyles.ts
24
- import { alpha } from "@mui/material";
25
- var DataLineStyles = (color) => ({
26
- backgroundColor: color ? alpha(color, 0.5) : void 0,
27
- borderColor: color
28
- });
29
-
30
- // src/lib/DataPointStyles.ts
31
- var DataPointStyles = (pointHoverBackgroundColor) => ({
32
- pointHitRadius: 20,
33
- pointHoverBackgroundColor,
34
- pointHoverRadius: 10,
35
- pointRadius: 5,
36
- pointStyle: "circle"
37
- });
38
-
39
- // src/lib/MockSourcePayloads.ts
40
- var MockSourcePayloads = () => {
41
- const tenMin = 6e5;
42
- return [
43
- {
44
- baseFee: 38.90155387825,
45
- feePerGas: { high: 47.9945864396, low: 39.006868093, medium: 39.306868093, veryHigh: 44.45384380525 },
46
- priorityFeePerGas: { high: 1.0266666666666666, low: -0.41000000000000003, medium: 0.38, veryHigh: 1.3900000000000001 },
47
- schema: "network.xyo.blockchain.ethereum.gas",
48
- timestamp: Date.now() - tenMin
49
- },
50
- {
51
- baseFee: 38.90155387825,
52
- feePerGas: { high: 47.9945864396, low: 39.006868093, medium: 100, veryHigh: 44.45384380525 },
53
- priorityFeePerGas: { high: 1.0266666666666666, low: -0.41000000000000003, medium: 0.38, veryHigh: 1.3900000000000001 },
54
- schema: "network.xyo.blockchain.ethereum.gas",
55
- timestamp: Date.now()
56
- }
57
- ];
58
- };
59
-
60
- // src/lib/SourcePayloads.ts
61
- var SourcePayloads = class {
62
- constructor(sourcePayloads) {
63
- this.sourcePayloads = sourcePayloads;
64
- }
65
- sourcePrices = [];
66
- get payloads() {
67
- return this.sourcePayloads;
68
- }
69
- static async build(jsonPath) {
70
- const sourcePayloads = await this.fetchSourcePayloads();
71
- const instance = new this(sourcePayloads);
72
- const paths = jsonPath.split(".");
73
- instance.sourcePrices = sourcePayloads.map((payload) => {
74
- return { x: payload.timestamp, y: instance.jsonPathTraverser(payload, paths) };
75
- });
76
- return instance;
77
- }
78
- // TODO - fetch from archivist
79
- static async fetchSourcePayloads() {
80
- const payloads = await Promise.resolve(MockSourcePayloads());
81
- return payloads;
82
- }
83
- jsonPathTraverser(obj, path) {
84
- let result = obj;
85
- for (const key of path) {
86
- if (key in result) {
87
- const foundKey = key;
88
- result = result[foundKey];
89
- } else {
90
- result = void 0;
91
- break;
92
- }
93
- }
94
- return result;
95
- }
96
- };
97
-
98
- // src/lib/ForecastLineChartConfigBuilder.ts
99
- var defaultOptions = () => ({
100
- plugins: {
101
- legend: {
102
- position: "top"
103
- }
104
- },
105
- responsive: true
106
- });
107
- var ForecastLineChartConfigBuilder = class _ForecastLineChartConfigBuilder {
108
- constructor(theme, payload) {
109
- this.payload = payload;
110
- this.themeColors = this.parseTheme(theme);
111
- }
112
- data = {
113
- datasets: []
114
- };
115
- options = defaultOptions();
116
- themeColors;
117
- get forecastPayload() {
118
- if (this.payload) {
119
- return this.payload;
120
- } else {
121
- throw Error("ForecastPayload was not defined");
122
- }
123
- }
124
- static async create(theme, payload, sourcePayloadConfig) {
125
- const instance = new _ForecastLineChartConfigBuilder(theme, payload);
126
- await instance.build(sourcePayloadConfig == null ? void 0 : sourcePayloadConfig.fetch);
127
- instance.refreshValues();
128
- return instance;
129
- }
130
- async build(includeSources) {
131
- this.buildOptions();
132
- await this.buildData(includeSources);
133
- return this;
134
- }
135
- async buildData(includeSources) {
136
- const forecastData = this.generateDataSetForecastData();
137
- const datasets = [forecastData];
138
- if (includeSources) {
139
- const sourceData = await this.generateDataSetSourcePayloads();
140
- datasets.unshift(sourceData);
141
- const lastSourceDataItem = sourceData.data.at(-1);
142
- forecastData.data.unshift(lastSourceDataItem);
143
- }
144
- this.data = {
145
- datasets
146
- };
147
- return this;
148
- }
149
- buildOptions() {
150
- if (this.options.plugins) {
151
- this.options.plugins.title = this.generateTitle();
152
- this.options.plugins.legend = this.generateLegend();
153
- }
154
- this.options.scales = this.generateScales();
155
- return this;
156
- }
157
- refreshValues() {
158
- this.data = { ...this.data };
159
- this.options = { ...this.options };
160
- }
161
- generateLegend() {
162
- return {
163
- labels: {
164
- pointStyle: "circle",
165
- usePointStyle: true
166
- }
167
- };
168
- }
169
- generateScales() {
170
- var _a, _b;
171
- return {
172
- x: {
173
- grid: {
174
- color: (_a = this.themeColors) == null ? void 0 : _a.gridColor
175
- },
176
- time: {
177
- unit: "minute"
178
- },
179
- type: "time"
180
- },
181
- y: {
182
- grid: {
183
- color: (_b = this.themeColors) == null ? void 0 : _b.gridColor
184
- }
185
- }
186
- };
187
- }
188
- generateTitle() {
189
- var _a;
190
- return {
191
- display: true,
192
- text: `Gas Price Forecaster (GWEI over time from ${((_a = this.forecastPayload) == null ? void 0 : _a.values[0].timestamp) ? new Date(this.forecastPayload.values[0].timestamp).toLocaleDateString() : ""})`
193
- };
194
- }
195
- parseTheme(theme) {
196
- const dark = theme.palette.mode === "dark";
197
- return {
198
- dataSetColorPrimary: theme.palette.primary.light,
199
- dataSetColorSecondary: theme.palette.secondary.light,
200
- gridColor: dark ? theme.palette.grey[800] : theme.palette.grey[300]
201
- };
202
- }
203
- generateDataSetForecastData() {
204
- var _a, _b;
205
- return {
206
- borderDash: [5],
207
- borderDashOffset: 0.5,
208
- data: this.forecastPayload.values.map((price) => ({ x: price.timestamp ?? 0, y: price.value })),
209
- label: "Forecast Price",
210
- ...DataPointStyles((_a = this.themeColors) == null ? void 0 : _a.dataSetColorPrimary),
211
- ...DataLineStyles((_b = this.themeColors) == null ? void 0 : _b.dataSetColorPrimary)
212
- };
213
- }
214
- async generateDataSetSourcePayloads() {
215
- var _a, _b;
216
- const { sourcePrices } = await SourcePayloads.build("feePerGas.medium");
217
- return {
218
- data: sourcePrices,
219
- label: "Source Prices",
220
- ...DataLineStyles((_a = this.themeColors) == null ? void 0 : _a.dataSetColorSecondary),
221
- ...DataPointStyles((_b = this.themeColors) == null ? void 0 : _b.dataSetColorSecondary)
222
- };
223
- }
224
- };
225
-
226
- // src/components/DetailsBox.tsx
227
- import { jsx } from "react/jsx-runtime";
228
- ChartJS.register(CategoryScale, TimeScale, PointElement, LineElement, LinearScale, Title, Tooltip, Legend);
229
- var PriceForecastDetailsBox = ({ payload, ...props }) => {
230
- const priceForecastPayload = payload;
231
- const theme = useTheme();
232
- const [data, setData] = useState({ datasets: [] });
233
- const [options, setOptions] = useState({});
234
- useAsyncEffect(
235
- // eslint-disable-next-line react-hooks/exhaustive-deps
236
- async (mounted) => {
237
- const { data: data2, options: options2 } = await ForecastLineChartConfigBuilder.create(theme, priceForecastPayload, { fetch: true });
238
- if (mounted()) {
239
- setData(data2);
240
- setOptions(options2);
241
- }
242
- },
243
- [priceForecastPayload, theme]
244
- );
245
- return /* @__PURE__ */ jsx(FlexCol, { ...props, busy: priceForecastPayload === void 0, minHeight: "25vh", children: priceForecastPayload ? /* @__PURE__ */ jsx(Line, { options, data }) : null });
246
- };
247
-
248
- // src/Plugin.ts
249
- var PriceForecastRenderPlugin = {
250
- ...createPayloadRenderPlugin({
251
- canRender: () => true,
252
- components: {
253
- box: {
254
- detailsBox: PriceForecastDetailsBox
255
- }
256
- },
257
- name: "PriceForecast"
258
- })
259
- };
260
- export {
261
- PriceForecastRenderPlugin
262
- };
263
- //# sourceMappingURL=Plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/Plugin.ts","../../src/components/DetailsBox.tsx","../../src/lib/DataLineStyles.ts","../../src/lib/DataPointStyles.ts","../../src/lib/MockSourcePayloads.ts","../../src/lib/SourcePayloads.ts","../../src/lib/ForecastLineChartConfigBuilder.ts"],"sourcesContent":["import { createPayloadRenderPlugin, PayloadRenderPlugin } from '@xyo-network/react-payload-plugin'\n\nimport { PriceForecastDetailsBox } from './components'\n\nexport const PriceForecastRenderPlugin: PayloadRenderPlugin = {\n ...createPayloadRenderPlugin({\n canRender: () => true,\n components: {\n box: {\n detailsBox: PriceForecastDetailsBox,\n },\n },\n name: 'PriceForecast',\n }),\n}\n","import 'chartjs-adapter-luxon'\n\nimport { useTheme } from '@mui/material'\nimport { useAsyncEffect } from '@xylabs/react-async-effect'\nimport { FlexBoxProps, FlexCol } from '@xylabs/react-flexbox'\nimport { ForecastPayload } from '@xyo-network/diviner-forecasting-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CategoryScale,\n Chart as ChartJS,\n ChartData,\n ChartOptions,\n Legend,\n LinearScale,\n LineElement,\n PointElement,\n TimeScale,\n Title,\n Tooltip,\n} from 'chart.js'\nimport { useState } from 'react'\nimport { Line } from 'react-chartjs-2'\n\nimport { ForecastLineChartConfigBuilder } from '../lib'\n\nChartJS.register(CategoryScale, TimeScale, PointElement, LineElement, LinearScale, Title, Tooltip, Legend)\n\nexport interface PriceForecastDetailsBoxProps extends FlexBoxProps {\n payload?: Payload\n}\n\nexport const PriceForecastDetailsBox: React.FC<PriceForecastDetailsBoxProps> = ({ payload, ...props }) => {\n const priceForecastPayload = payload as ForecastPayload | undefined\n const theme = useTheme()\n const [data, setData] = useState<ChartData<'line'>>({ datasets: [] })\n const [options, setOptions] = useState<ChartOptions<'line'>>({})\n\n useAsyncEffect(\n // eslint-disable-next-line react-hooks/exhaustive-deps\n async (mounted) => {\n const { data, options } = await ForecastLineChartConfigBuilder.create(theme, priceForecastPayload, { fetch: true })\n if (mounted()) {\n setData(data)\n setOptions(options)\n }\n },\n [priceForecastPayload, theme],\n )\n\n return (\n <FlexCol {...props} busy={priceForecastPayload === undefined} minHeight=\"25vh\">\n {priceForecastPayload ? <Line options={options} data={data} /> : null}\n </FlexCol>\n )\n}\n","import { alpha } from '@mui/material'\n\nexport const DataLineStyles = (color?: string) => ({\n backgroundColor: color ? alpha(color, 0.5) : undefined,\n borderColor: color,\n})\n","export const DataPointStyles = (pointHoverBackgroundColor?: string) => ({\n pointHitRadius: 20,\n pointHoverBackgroundColor,\n pointHoverRadius: 10,\n pointRadius: 5,\n pointStyle: 'circle',\n})\n","export const MockSourcePayloads = () => {\n const tenMin = 600000\n return [\n {\n baseFee: 38.90155387825,\n feePerGas: { high: 47.9945864396, low: 39.006868093, medium: 39.306868093, veryHigh: 44.45384380525 },\n priorityFeePerGas: { high: 1.0266666666666666, low: -0.41000000000000003, medium: 0.38, veryHigh: 1.3900000000000001 },\n schema: 'network.xyo.blockchain.ethereum.gas',\n timestamp: Date.now() - tenMin,\n },\n {\n baseFee: 38.90155387825,\n feePerGas: { high: 47.9945864396, low: 39.006868093, medium: 100, veryHigh: 44.45384380525 },\n priorityFeePerGas: { high: 1.0266666666666666, low: -0.41000000000000003, medium: 0.38, veryHigh: 1.3900000000000001 },\n schema: 'network.xyo.blockchain.ethereum.gas',\n timestamp: Date.now(),\n },\n ]\n}\n","import { Payload } from '@xyo-network/payload-model'\nimport { Point } from 'chart.js'\n\nimport { MockSourcePayloads } from './MockSourcePayloads'\n\nexport class SourcePayloads {\n sourcePrices: Point[] = []\n\n constructor(public sourcePayloads: Payload[]) {}\n\n get payloads() {\n return this.sourcePayloads\n }\n\n static async build(jsonPath: string) {\n const sourcePayloads = await this.fetchSourcePayloads()\n const instance = new this(sourcePayloads)\n\n const paths = jsonPath.split('.')\n instance.sourcePrices = sourcePayloads.map((payload) => {\n return { x: payload.timestamp, y: instance.jsonPathTraverser(payload, paths) }\n })\n return instance\n }\n\n // TODO - fetch from archivist\n static async fetchSourcePayloads() {\n const payloads = await Promise.resolve(MockSourcePayloads())\n return payloads\n }\n\n jsonPathTraverser(obj: Payload, path: string[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any = obj\n for (const key of path) {\n if (key in result) {\n const foundKey = key as keyof typeof result\n result = result[foundKey]\n } else {\n result = undefined\n break\n }\n }\n\n return result\n }\n}\n","import { Theme } from '@mui/material'\nimport { ForecastPayload } from '@xyo-network/diviner-forecasting-model'\nimport { ChartData, ChartDataset, ChartOptions, LegendOptions, Point, ScaleChartOptions } from 'chart.js'\n// eslint-disable-next-line import/no-unresolved\nimport { _DeepPartialObject } from 'chart.js/dist/types/utils'\n\nimport { DataLineStyles } from './DataLineStyles'\nimport { DataPointStyles } from './DataPointStyles'\nimport { SourcePayloads } from './SourcePayloads'\n\ninterface SourcePayloadConfig {\n fetch: boolean\n sampleSize?: number\n}\n\ninterface ThemeColors {\n dataSetColorPrimary: string\n dataSetColorSecondary: string\n gridColor: string\n}\n\nconst defaultOptions: () => ChartOptions<'line'> = () => ({\n plugins: {\n legend: {\n position: 'top' as const,\n },\n },\n responsive: true,\n})\n\nexport class ForecastLineChartConfigBuilder {\n data: ChartData<'line'> = {\n datasets: [],\n }\n options: ChartOptions<'line'> = defaultOptions()\n themeColors: ThemeColors | undefined\n\n constructor(\n theme: Theme,\n private payload?: ForecastPayload,\n ) {\n this.themeColors = this.parseTheme(theme)\n }\n\n get forecastPayload() {\n if (this.payload) {\n return this.payload\n } else {\n throw Error('ForecastPayload was not defined')\n }\n }\n\n static async create(theme: Theme, payload?: ForecastPayload, sourcePayloadConfig?: SourcePayloadConfig) {\n const instance = new ForecastLineChartConfigBuilder(theme, payload)\n\n await instance.build(sourcePayloadConfig?.fetch)\n\n instance.refreshValues()\n\n return instance\n }\n\n async build(includeSources?: boolean) {\n this.buildOptions()\n await this.buildData(includeSources)\n return this\n }\n\n async buildData(includeSources?: boolean) {\n const forecastData = this.generateDataSetForecastData()\n\n const datasets: ChartDataset<'line'>[] = [forecastData]\n\n if (includeSources) {\n // build data from sources in forecastPayload\n const sourceData = await this.generateDataSetSourcePayloads()\n datasets.unshift(sourceData)\n\n // add last source point as first item in prediction to connect the lines\n const lastSourceDataItem = sourceData.data.at(-1) as Point\n forecastData.data.unshift(lastSourceDataItem)\n }\n\n this.data = {\n datasets,\n }\n\n return this\n }\n\n buildOptions() {\n if (this.options.plugins) {\n this.options.plugins.title = this.generateTitle()\n this.options.plugins.legend = this.generateLegend()\n }\n this.options.scales = this.generateScales()\n\n return this\n }\n\n refreshValues() {\n this.data = { ...this.data }\n this.options = { ...this.options }\n }\n\n protected generateLegend(): _DeepPartialObject<LegendOptions<'line'>> {\n return {\n labels: {\n pointStyle: 'circle',\n usePointStyle: true,\n },\n }\n }\n\n protected generateScales(): _DeepPartialObject<ScaleChartOptions<'line'>['scales']> {\n return {\n x: {\n grid: {\n color: this.themeColors?.gridColor,\n },\n time: {\n unit: 'minute',\n },\n type: 'time',\n },\n y: {\n grid: {\n color: this.themeColors?.gridColor,\n },\n },\n }\n }\n\n protected generateTitle() {\n return {\n display: true,\n text: `Gas Price Forecaster (GWEI over time from ${\n this.forecastPayload?.values[0].timestamp ? new Date(this.forecastPayload.values[0].timestamp).toLocaleDateString() : ''\n })`,\n }\n }\n\n protected parseTheme(theme: Theme) {\n const dark = theme.palette.mode === 'dark'\n return {\n dataSetColorPrimary: theme.palette.primary.light,\n dataSetColorSecondary: theme.palette.secondary.light,\n gridColor: dark ? theme.palette.grey[800] : theme.palette.grey[300],\n }\n }\n\n private generateDataSetForecastData(): ChartDataset<'line'> {\n return {\n borderDash: [5],\n borderDashOffset: 0.5,\n data: this.forecastPayload.values.map((price) => ({ x: price.timestamp ?? 0, y: price.value })),\n label: 'Forecast Price',\n ...DataPointStyles(this.themeColors?.dataSetColorPrimary),\n ...DataLineStyles(this.themeColors?.dataSetColorPrimary),\n }\n }\n\n private async generateDataSetSourcePayloads(): Promise<ChartDataset<'line'>> {\n const { sourcePrices } = await SourcePayloads.build('feePerGas.medium')\n return {\n data: sourcePrices,\n label: 'Source Prices',\n ...DataLineStyles(this.themeColors?.dataSetColorSecondary),\n ...DataPointStyles(this.themeColors?.dataSetColorSecondary),\n }\n }\n}\n"],"mappings":"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","names":["data","options"]}