@xyo-network/react-price-forecast-plugin 2.75.0 → 2.75.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.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","../../src/Plugin.ts"],"sourcesContent":["export * from './components'\nexport * from './Plugin'\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 ?\n <Line options={options} data={data} />\n : 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 = 600_000\n return [\n {\n baseFee: 38.901_553_878_25,\n feePerGas: { high: 47.994_586_439_6, low: 39.006_868_093, medium: 39.306_868_093, veryHigh: 44.453_843_805_25 },\n priorityFeePerGas: { high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1 },\n schema: 'network.xyo.blockchain.ethereum.gas',\n timestamp: Date.now() - tenMin,\n },\n {\n baseFee: 38.901_553_878_25,\n feePerGas: { high: 47.994_586_439_6, low: 39.006_868_093, medium: 100, veryHigh: 44.453_843_805_25 },\n priorityFeePerGas: { high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1 },\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 new 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","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"],"mappings":"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","names":["src_exports","__export","PriceForecastDetailsBox","PriceForecastRenderPlugin","__toCommonJS","import_chartjs_adapter_luxon","import_material","import_react_async_effect","import_react_flexbox","import_chart","import_react","import_react_chartjs_2","import_material","DataLineStyles","color","DataPointStyles","pointHoverBackgroundColor","MockSourcePayloads","SourcePayloads","sourcePayloads","jsonPath","instance","paths","payload","MockSourcePayloads","obj","path","result","key","defaultOptions","ForecastLineChartConfigBuilder","_ForecastLineChartConfigBuilder","theme","payload","sourcePayloadConfig","instance","includeSources","forecastData","datasets","sourceData","lastSourceDataItem","_a","_b","dark","price","DataPointStyles","DataLineStyles","sourcePrices","SourcePayloads","import_jsx_runtime","ChartJS","PriceForecastDetailsBox","payload","props","priceForecastPayload","theme","data","setData","options","setOptions","mounted","ForecastLineChartConfigBuilder","import_react_payload_plugin","PriceForecastRenderPlugin","PriceForecastDetailsBox"]}
1
+ {"version":3,"sources":["../../src/index.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","../../src/Plugin.ts"],"sourcesContent":["export * from './components'\nexport * from './Plugin'\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 ?\n <Line options={options} data={data} />\n : 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 = 600_000\n return [\n {\n baseFee: 38.901_553_878_25,\n feePerGas: { high: 47.994_586_439_6, low: 39.006_868_093, medium: 39.306_868_093, veryHigh: 44.453_843_805_25 },\n priorityFeePerGas: { high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1 },\n schema: 'network.xyo.blockchain.ethereum.gas',\n timestamp: Date.now() - tenMin,\n },\n {\n baseFee: 38.901_553_878_25,\n feePerGas: { high: 47.994_586_439_6, low: 39.006_868_093, medium: 100, veryHigh: 44.453_843_805_25 },\n priorityFeePerGas: { high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1 },\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 new 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","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"],"mappings":"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","names":["import_material","ChartJS","data","options"]}
@@ -1,2 +1,262 @@
1
- import"chartjs-adapter-luxon";import{useTheme as C}from"@mui/material";import{useAsyncEffect as D}from"@xylabs/react-async-effect";import{FlexCol as b}from"@xylabs/react-flexbox";import{CategoryScale as x,Chart as F,Legend as w,LinearScale as v,LineElement as O,PointElement as T,TimeScale as k,Title as L,Tooltip as R}from"chart.js";import{useState as p}from"react";import{Line as B}from"react-chartjs-2";import{alpha as _}from"@mui/material";var l=r=>({backgroundColor:r?_(r,.5):void 0,borderColor:r});var c=r=>({pointHitRadius:20,pointHoverBackgroundColor:r,pointHoverRadius:10,pointRadius:5,pointStyle:"circle"});var d=()=>[{baseFee:38.90155387825,feePerGas:{high:47.9945864396,low:39.006868093,medium:39.306868093,veryHigh:44.45384380525},priorityFeePerGas:{high:1.0266666666666666,low:-.41000000000000003,medium:.38,veryHigh:1.3900000000000001},schema:"network.xyo.blockchain.ethereum.gas",timestamp:Date.now()-6e5},{baseFee:38.90155387825,feePerGas:{high:47.9945864396,low:39.006868093,medium:100,veryHigh:44.45384380525},priorityFeePerGas:{high:1.0266666666666666,low:-.41000000000000003,medium:.38,veryHigh:1.3900000000000001},schema:"network.xyo.blockchain.ethereum.gas",timestamp:Date.now()}];var i=class{constructor(e){this.sourcePayloads=e}sourcePrices=[];get payloads(){return this.sourcePayloads}static async build(e){let t=await this.fetchSourcePayloads(),a=new this(t),o=e.split(".");return a.sourcePrices=t.map(s=>({x:s.timestamp,y:a.jsonPathTraverser(s,o)})),a}static async fetchSourcePayloads(){return await Promise.resolve(d())}jsonPathTraverser(e,t){let a=e;for(let o of t)if(o in a)a=a[o];else{a=void 0;break}return a}};var S=()=>({plugins:{legend:{position:"top"}},responsive:!0}),n=class r{constructor(e,t){this.payload=t;this.themeColors=this.parseTheme(e)}data={datasets:[]};options=S();themeColors;get forecastPayload(){if(this.payload)return this.payload;throw new Error("ForecastPayload was not defined")}static async create(e,t,a){let o=new r(e,t);return await o.build(a==null?void 0:a.fetch),o.refreshValues(),o}async build(e){return this.buildOptions(),await this.buildData(e),this}async buildData(e){let t=this.generateDataSetForecastData(),a=[t];if(e){let o=await this.generateDataSetSourcePayloads();a.unshift(o);let s=o.data.at(-1);t.data.unshift(s)}return this.data={datasets:a},this}buildOptions(){return this.options.plugins&&(this.options.plugins.title=this.generateTitle(),this.options.plugins.legend=this.generateLegend()),this.options.scales=this.generateScales(),this}refreshValues(){this.data={...this.data},this.options={...this.options}}generateLegend(){return{labels:{pointStyle:"circle",usePointStyle:!0}}}generateScales(){var e,t;return{x:{grid:{color:(e=this.themeColors)==null?void 0:e.gridColor},time:{unit:"minute"},type:"time"},y:{grid:{color:(t=this.themeColors)==null?void 0:t.gridColor}}}}generateTitle(){var e;return{display:!0,text:`Gas Price Forecaster (GWEI over time from ${(e=this.forecastPayload)!=null&&e.values[0].timestamp?new Date(this.forecastPayload.values[0].timestamp).toLocaleDateString():""})`}}parseTheme(e){let t=e.palette.mode==="dark";return{dataSetColorPrimary:e.palette.primary.light,dataSetColorSecondary:e.palette.secondary.light,gridColor:t?e.palette.grey[800]:e.palette.grey[300]}}generateDataSetForecastData(){var e,t;return{borderDash:[5],borderDashOffset:.5,data:this.forecastPayload.values.map(a=>({x:a.timestamp??0,y:a.value})),label:"Forecast Price",...c((e=this.themeColors)==null?void 0:e.dataSetColorPrimary),...l((t=this.themeColors)==null?void 0:t.dataSetColorPrimary)}}async generateDataSetSourcePayloads(){var t,a;let{sourcePrices:e}=await i.build("feePerGas.medium");return{data:e,label:"Source Prices",...l((t=this.themeColors)==null?void 0:t.dataSetColorSecondary),...c((a=this.themeColors)==null?void 0:a.dataSetColorSecondary)}}};import{jsx as m}from"react/jsx-runtime";F.register(x,k,T,O,v,L,R,w);var h=({payload:r,...e})=>{let t=r,a=C(),[o,s]=p({datasets:[]}),[u,y]=p({});return D(async P=>{let{data:f,options:g}=await n.create(a,t,{fetch:!0});P()&&(s(f),y(g))},[t,a]),m(b,{...e,busy:t===void 0,minHeight:"25vh",children:t?m(B,{options:u,data:o}):null})};import{createPayloadRenderPlugin as G}from"@xyo-network/react-payload-plugin";var ne={...G({canRender:()=>!0,components:{box:{detailsBox:h}},name:"PriceForecast"})};export{h as PriceForecastDetailsBox,ne as PriceForecastRenderPlugin};
1
+ // src/components/DetailsBox.tsx
2
+ import "chartjs-adapter-luxon";
3
+ import { useTheme } from "@mui/material";
4
+ import { useAsyncEffect } from "@xylabs/react-async-effect";
5
+ import { FlexCol } from "@xylabs/react-flexbox";
6
+ import {
7
+ CategoryScale,
8
+ Chart as ChartJS,
9
+ Legend,
10
+ LinearScale,
11
+ LineElement,
12
+ PointElement,
13
+ TimeScale,
14
+ Title,
15
+ Tooltip
16
+ } from "chart.js";
17
+ import { useState } from "react";
18
+ import { Line } from "react-chartjs-2";
19
+
20
+ // src/lib/DataLineStyles.ts
21
+ import { alpha } from "@mui/material";
22
+ var DataLineStyles = (color) => ({
23
+ backgroundColor: color ? alpha(color, 0.5) : void 0,
24
+ borderColor: color
25
+ });
26
+
27
+ // src/lib/DataPointStyles.ts
28
+ var DataPointStyles = (pointHoverBackgroundColor) => ({
29
+ pointHitRadius: 20,
30
+ pointHoverBackgroundColor,
31
+ pointHoverRadius: 10,
32
+ pointRadius: 5,
33
+ pointStyle: "circle"
34
+ });
35
+
36
+ // src/lib/MockSourcePayloads.ts
37
+ var MockSourcePayloads = () => {
38
+ const tenMin = 6e5;
39
+ return [
40
+ {
41
+ baseFee: 38.90155387825,
42
+ feePerGas: { high: 47.9945864396, low: 39.006868093, medium: 39.306868093, veryHigh: 44.45384380525 },
43
+ priorityFeePerGas: { high: 1.0266666666666666, low: -0.41000000000000003, medium: 0.38, veryHigh: 1.3900000000000001 },
44
+ schema: "network.xyo.blockchain.ethereum.gas",
45
+ timestamp: Date.now() - tenMin
46
+ },
47
+ {
48
+ baseFee: 38.90155387825,
49
+ feePerGas: { high: 47.9945864396, low: 39.006868093, medium: 100, veryHigh: 44.45384380525 },
50
+ priorityFeePerGas: { high: 1.0266666666666666, low: -0.41000000000000003, medium: 0.38, veryHigh: 1.3900000000000001 },
51
+ schema: "network.xyo.blockchain.ethereum.gas",
52
+ timestamp: Date.now()
53
+ }
54
+ ];
55
+ };
56
+
57
+ // src/lib/SourcePayloads.ts
58
+ var SourcePayloads = class {
59
+ constructor(sourcePayloads) {
60
+ this.sourcePayloads = sourcePayloads;
61
+ }
62
+ sourcePrices = [];
63
+ get payloads() {
64
+ return this.sourcePayloads;
65
+ }
66
+ static async build(jsonPath) {
67
+ const sourcePayloads = await this.fetchSourcePayloads();
68
+ const instance = new this(sourcePayloads);
69
+ const paths = jsonPath.split(".");
70
+ instance.sourcePrices = sourcePayloads.map((payload) => {
71
+ return { x: payload.timestamp, y: instance.jsonPathTraverser(payload, paths) };
72
+ });
73
+ return instance;
74
+ }
75
+ // TODO - fetch from archivist
76
+ static async fetchSourcePayloads() {
77
+ const payloads = await Promise.resolve(MockSourcePayloads());
78
+ return payloads;
79
+ }
80
+ jsonPathTraverser(obj, path) {
81
+ let result = obj;
82
+ for (const key of path) {
83
+ if (key in result) {
84
+ const foundKey = key;
85
+ result = result[foundKey];
86
+ } else {
87
+ result = void 0;
88
+ break;
89
+ }
90
+ }
91
+ return result;
92
+ }
93
+ };
94
+
95
+ // src/lib/ForecastLineChartConfigBuilder.ts
96
+ var defaultOptions = () => ({
97
+ plugins: {
98
+ legend: {
99
+ position: "top"
100
+ }
101
+ },
102
+ responsive: true
103
+ });
104
+ var ForecastLineChartConfigBuilder = class _ForecastLineChartConfigBuilder {
105
+ constructor(theme, payload) {
106
+ this.payload = payload;
107
+ this.themeColors = this.parseTheme(theme);
108
+ }
109
+ data = {
110
+ datasets: []
111
+ };
112
+ options = defaultOptions();
113
+ themeColors;
114
+ get forecastPayload() {
115
+ if (this.payload) {
116
+ return this.payload;
117
+ } else {
118
+ throw new Error("ForecastPayload was not defined");
119
+ }
120
+ }
121
+ static async create(theme, payload, sourcePayloadConfig) {
122
+ const instance = new _ForecastLineChartConfigBuilder(theme, payload);
123
+ await instance.build(sourcePayloadConfig == null ? void 0 : sourcePayloadConfig.fetch);
124
+ instance.refreshValues();
125
+ return instance;
126
+ }
127
+ async build(includeSources) {
128
+ this.buildOptions();
129
+ await this.buildData(includeSources);
130
+ return this;
131
+ }
132
+ async buildData(includeSources) {
133
+ const forecastData = this.generateDataSetForecastData();
134
+ const datasets = [forecastData];
135
+ if (includeSources) {
136
+ const sourceData = await this.generateDataSetSourcePayloads();
137
+ datasets.unshift(sourceData);
138
+ const lastSourceDataItem = sourceData.data.at(-1);
139
+ forecastData.data.unshift(lastSourceDataItem);
140
+ }
141
+ this.data = {
142
+ datasets
143
+ };
144
+ return this;
145
+ }
146
+ buildOptions() {
147
+ if (this.options.plugins) {
148
+ this.options.plugins.title = this.generateTitle();
149
+ this.options.plugins.legend = this.generateLegend();
150
+ }
151
+ this.options.scales = this.generateScales();
152
+ return this;
153
+ }
154
+ refreshValues() {
155
+ this.data = { ...this.data };
156
+ this.options = { ...this.options };
157
+ }
158
+ generateLegend() {
159
+ return {
160
+ labels: {
161
+ pointStyle: "circle",
162
+ usePointStyle: true
163
+ }
164
+ };
165
+ }
166
+ generateScales() {
167
+ var _a, _b;
168
+ return {
169
+ x: {
170
+ grid: {
171
+ color: (_a = this.themeColors) == null ? void 0 : _a.gridColor
172
+ },
173
+ time: {
174
+ unit: "minute"
175
+ },
176
+ type: "time"
177
+ },
178
+ y: {
179
+ grid: {
180
+ color: (_b = this.themeColors) == null ? void 0 : _b.gridColor
181
+ }
182
+ }
183
+ };
184
+ }
185
+ generateTitle() {
186
+ var _a;
187
+ return {
188
+ display: true,
189
+ 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() : ""})`
190
+ };
191
+ }
192
+ parseTheme(theme) {
193
+ const dark = theme.palette.mode === "dark";
194
+ return {
195
+ dataSetColorPrimary: theme.palette.primary.light,
196
+ dataSetColorSecondary: theme.palette.secondary.light,
197
+ gridColor: dark ? theme.palette.grey[800] : theme.palette.grey[300]
198
+ };
199
+ }
200
+ generateDataSetForecastData() {
201
+ var _a, _b;
202
+ return {
203
+ borderDash: [5],
204
+ borderDashOffset: 0.5,
205
+ data: this.forecastPayload.values.map((price) => ({ x: price.timestamp ?? 0, y: price.value })),
206
+ label: "Forecast Price",
207
+ ...DataPointStyles((_a = this.themeColors) == null ? void 0 : _a.dataSetColorPrimary),
208
+ ...DataLineStyles((_b = this.themeColors) == null ? void 0 : _b.dataSetColorPrimary)
209
+ };
210
+ }
211
+ async generateDataSetSourcePayloads() {
212
+ var _a, _b;
213
+ const { sourcePrices } = await SourcePayloads.build("feePerGas.medium");
214
+ return {
215
+ data: sourcePrices,
216
+ label: "Source Prices",
217
+ ...DataLineStyles((_a = this.themeColors) == null ? void 0 : _a.dataSetColorSecondary),
218
+ ...DataPointStyles((_b = this.themeColors) == null ? void 0 : _b.dataSetColorSecondary)
219
+ };
220
+ }
221
+ };
222
+
223
+ // src/components/DetailsBox.tsx
224
+ import { jsx } from "react/jsx-runtime";
225
+ ChartJS.register(CategoryScale, TimeScale, PointElement, LineElement, LinearScale, Title, Tooltip, Legend);
226
+ var PriceForecastDetailsBox = ({ payload, ...props }) => {
227
+ const priceForecastPayload = payload;
228
+ const theme = useTheme();
229
+ const [data, setData] = useState({ datasets: [] });
230
+ const [options, setOptions] = useState({});
231
+ useAsyncEffect(
232
+ // eslint-disable-next-line react-hooks/exhaustive-deps
233
+ async (mounted) => {
234
+ const { data: data2, options: options2 } = await ForecastLineChartConfigBuilder.create(theme, priceForecastPayload, { fetch: true });
235
+ if (mounted()) {
236
+ setData(data2);
237
+ setOptions(options2);
238
+ }
239
+ },
240
+ [priceForecastPayload, theme]
241
+ );
242
+ return /* @__PURE__ */ jsx(FlexCol, { ...props, busy: priceForecastPayload === void 0, minHeight: "25vh", children: priceForecastPayload ? /* @__PURE__ */ jsx(Line, { options, data }) : null });
243
+ };
244
+
245
+ // src/Plugin.ts
246
+ import { createPayloadRenderPlugin } from "@xyo-network/react-payload-plugin";
247
+ var PriceForecastRenderPlugin = {
248
+ ...createPayloadRenderPlugin({
249
+ canRender: () => true,
250
+ components: {
251
+ box: {
252
+ detailsBox: PriceForecastDetailsBox
253
+ }
254
+ },
255
+ name: "PriceForecast"
256
+ })
257
+ };
258
+ export {
259
+ PriceForecastDetailsBox,
260
+ PriceForecastRenderPlugin
261
+ };
2
262
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/DetailsBox.tsx","../../src/lib/DataLineStyles.ts","../../src/lib/DataPointStyles.ts","../../src/lib/MockSourcePayloads.ts","../../src/lib/SourcePayloads.ts","../../src/lib/ForecastLineChartConfigBuilder.ts","../../src/Plugin.ts"],"sourcesContent":["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 ?\n <Line options={options} data={data} />\n : 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 = 600_000\n return [\n {\n baseFee: 38.901_553_878_25,\n feePerGas: { high: 47.994_586_439_6, low: 39.006_868_093, medium: 39.306_868_093, veryHigh: 44.453_843_805_25 },\n priorityFeePerGas: { high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1 },\n schema: 'network.xyo.blockchain.ethereum.gas',\n timestamp: Date.now() - tenMin,\n },\n {\n baseFee: 38.901_553_878_25,\n feePerGas: { high: 47.994_586_439_6, low: 39.006_868_093, medium: 100, veryHigh: 44.453_843_805_25 },\n priorityFeePerGas: { high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1 },\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 new 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","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"],"mappings":"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","names":["useTheme","useAsyncEffect","FlexCol","CategoryScale","ChartJS","Legend","LinearScale","LineElement","PointElement","TimeScale","Title","Tooltip","useState","Line","alpha","DataLineStyles","color","DataPointStyles","pointHoverBackgroundColor","MockSourcePayloads","SourcePayloads","sourcePayloads","jsonPath","instance","paths","payload","MockSourcePayloads","obj","path","result","key","defaultOptions","ForecastLineChartConfigBuilder","_ForecastLineChartConfigBuilder","theme","payload","sourcePayloadConfig","instance","includeSources","forecastData","datasets","sourceData","lastSourceDataItem","_a","_b","dark","price","DataPointStyles","DataLineStyles","sourcePrices","SourcePayloads","jsx","ChartJS","CategoryScale","TimeScale","PointElement","LineElement","LinearScale","Title","Tooltip","Legend","PriceForecastDetailsBox","payload","props","priceForecastPayload","theme","useTheme","data","setData","useState","options","setOptions","useAsyncEffect","mounted","ForecastLineChartConfigBuilder","FlexCol","Line","createPayloadRenderPlugin","PriceForecastRenderPlugin","createPayloadRenderPlugin","PriceForecastDetailsBox"]}
1
+ {"version":3,"sources":["../../src/components/DetailsBox.tsx","../../src/lib/DataLineStyles.ts","../../src/lib/DataPointStyles.ts","../../src/lib/MockSourcePayloads.ts","../../src/lib/SourcePayloads.ts","../../src/lib/ForecastLineChartConfigBuilder.ts","../../src/Plugin.ts"],"sourcesContent":["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 ?\n <Line options={options} data={data} />\n : 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 = 600_000\n return [\n {\n baseFee: 38.901_553_878_25,\n feePerGas: { high: 47.994_586_439_6, low: 39.006_868_093, medium: 39.306_868_093, veryHigh: 44.453_843_805_25 },\n priorityFeePerGas: { high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1 },\n schema: 'network.xyo.blockchain.ethereum.gas',\n timestamp: Date.now() - tenMin,\n },\n {\n baseFee: 38.901_553_878_25,\n feePerGas: { high: 47.994_586_439_6, low: 39.006_868_093, medium: 100, veryHigh: 44.453_843_805_25 },\n priorityFeePerGas: { high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1 },\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 new 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","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"],"mappings":";AAAA,OAAO;AAEP,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAuB,eAAe;AAGtC;AAAA,EACE;AAAA,EACA,SAAS;AAAA,EAGT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAgB;AACzB,SAAS,YAAY;;;ACrBrB,SAAS,aAAa;AAEf,IAAM,iBAAiB,CAAC,WAAoB;AAAA,EACjD,iBAAiB,QAAQ,MAAM,OAAO,GAAG,IAAI;AAAA,EAC7C,aAAa;AACf;;;ACLO,IAAM,kBAAkB,CAAC,+BAAwC;AAAA,EACtE,gBAAgB;AAAA,EAChB;AAAA,EACA,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,YAAY;AACd;;;ACNO,IAAM,qBAAqB,MAAM;AACtC,QAAM,SAAS;AACf,SAAO;AAAA,IACL;AAAA,MACE,SAAS;AAAA,MACT,WAAW,EAAE,MAAM,eAAkB,KAAK,cAAgB,QAAQ,cAAgB,UAAU,eAAkB;AAAA,MAC9G,mBAAmB,EAAE,MAAM,oBAAyB,KAAK,sBAA2B,QAAQ,MAAM,UAAU,mBAAwB;AAAA,MACpI,QAAQ;AAAA,MACR,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,WAAW,EAAE,MAAM,eAAkB,KAAK,cAAgB,QAAQ,KAAK,UAAU,eAAkB;AAAA,MACnG,mBAAmB,EAAE,MAAM,oBAAyB,KAAK,sBAA2B,QAAQ,MAAM,UAAU,mBAAwB;AAAA,MACpI,QAAQ;AAAA,MACR,WAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AACF;;;ACbO,IAAM,iBAAN,MAAqB;AAAA,EAG1B,YAAmB,gBAA2B;AAA3B;AAAA,EAA4B;AAAA,EAF/C,eAAwB,CAAC;AAAA,EAIzB,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAa,MAAM,UAAkB;AACnC,UAAM,iBAAiB,MAAM,KAAK,oBAAoB;AACtD,UAAM,WAAW,IAAI,KAAK,cAAc;AAExC,UAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,aAAS,eAAe,eAAe,IAAI,CAAC,YAAY;AACtD,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG,SAAS,kBAAkB,SAAS,KAAK,EAAE;AAAA,IAC/E,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,aAAa,sBAAsB;AACjC,UAAM,WAAW,MAAM,QAAQ,QAAQ,mBAAmB,CAAC;AAC3D,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkB,KAAc,MAAgB;AAE9C,QAAI,SAAc;AAClB,eAAW,OAAO,MAAM;AACtB,UAAI,OAAO,QAAQ;AACjB,cAAM,WAAW;AACjB,iBAAS,OAAO,QAAQ;AAAA,MAC1B,OAAO;AACL,iBAAS;AACT;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ACzBA,IAAM,iBAA6C,OAAO;AAAA,EACxD,SAAS;AAAA,IACP,QAAQ;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,YAAY;AACd;AAEO,IAAM,iCAAN,MAAM,gCAA+B;AAAA,EAO1C,YACE,OACQ,SACR;AADQ;AAER,SAAK,cAAc,KAAK,WAAW,KAAK;AAAA,EAC1C;AAAA,EAXA,OAA0B;AAAA,IACxB,UAAU,CAAC;AAAA,EACb;AAAA,EACA,UAAgC,eAAe;AAAA,EAC/C;AAAA,EASA,IAAI,kBAAkB;AACpB,QAAI,KAAK,SAAS;AAChB,aAAO,KAAK;AAAA,IACd,OAAO;AACL,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,aAAa,OAAO,OAAc,SAA2B,qBAA2C;AACtG,UAAM,WAAW,IAAI,gCAA+B,OAAO,OAAO;AAElE,UAAM,SAAS,MAAM,2DAAqB,KAAK;AAE/C,aAAS,cAAc;AAEvB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,gBAA0B;AACpC,SAAK,aAAa;AAClB,UAAM,KAAK,UAAU,cAAc;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,gBAA0B;AACxC,UAAM,eAAe,KAAK,4BAA4B;AAEtD,UAAM,WAAmC,CAAC,YAAY;AAEtD,QAAI,gBAAgB;AAElB,YAAM,aAAa,MAAM,KAAK,8BAA8B;AAC5D,eAAS,QAAQ,UAAU;AAG3B,YAAM,qBAAqB,WAAW,KAAK,GAAG,EAAE;AAChD,mBAAa,KAAK,QAAQ,kBAAkB;AAAA,IAC9C;AAEA,SAAK,OAAO;AAAA,MACV;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe;AACb,QAAI,KAAK,QAAQ,SAAS;AACxB,WAAK,QAAQ,QAAQ,QAAQ,KAAK,cAAc;AAChD,WAAK,QAAQ,QAAQ,SAAS,KAAK,eAAe;AAAA,IACpD;AACA,SAAK,QAAQ,SAAS,KAAK,eAAe;AAE1C,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB;AACd,SAAK,OAAO,EAAE,GAAG,KAAK,KAAK;AAC3B,SAAK,UAAU,EAAE,GAAG,KAAK,QAAQ;AAAA,EACnC;AAAA,EAEU,iBAA4D;AACpE,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEU,iBAA0E;AAlHtF;AAmHI,WAAO;AAAA,MACL,GAAG;AAAA,QACD,MAAM;AAAA,UACJ,QAAO,UAAK,gBAAL,mBAAkB;AAAA,QAC3B;AAAA,QACA,MAAM;AAAA,UACJ,MAAM;AAAA,QACR;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA,GAAG;AAAA,QACD,MAAM;AAAA,UACJ,QAAO,UAAK,gBAAL,mBAAkB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEU,gBAAgB;AArI5B;AAsII,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,+CACJ,UAAK,oBAAL,mBAAsB,OAAO,GAAG,aAAY,IAAI,KAAK,KAAK,gBAAgB,OAAO,CAAC,EAAE,SAAS,EAAE,mBAAmB,IAAI,EACxH;AAAA,IACF;AAAA,EACF;AAAA,EAEU,WAAW,OAAc;AACjC,UAAM,OAAO,MAAM,QAAQ,SAAS;AACpC,WAAO;AAAA,MACL,qBAAqB,MAAM,QAAQ,QAAQ;AAAA,MAC3C,uBAAuB,MAAM,QAAQ,UAAU;AAAA,MAC/C,WAAW,OAAO,MAAM,QAAQ,KAAK,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,IACpE;AAAA,EACF;AAAA,EAEQ,8BAAoD;AAvJ9D;AAwJI,WAAO;AAAA,MACL,YAAY,CAAC,CAAC;AAAA,MACd,kBAAkB;AAAA,MAClB,MAAM,KAAK,gBAAgB,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,aAAa,GAAG,GAAG,MAAM,MAAM,EAAE;AAAA,MAC9F,OAAO;AAAA,MACP,GAAG,iBAAgB,UAAK,gBAAL,mBAAkB,mBAAmB;AAAA,MACxD,GAAG,gBAAe,UAAK,gBAAL,mBAAkB,mBAAmB;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAc,gCAA+D;AAlK/E;AAmKI,UAAM,EAAE,aAAa,IAAI,MAAM,eAAe,MAAM,kBAAkB;AACtE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,GAAG,gBAAe,UAAK,gBAAL,mBAAkB,qBAAqB;AAAA,MACzD,GAAG,iBAAgB,UAAK,gBAAL,mBAAkB,qBAAqB;AAAA,IAC5D;AAAA,EACF;AACF;;;ALvHQ;AA3BR,QAAQ,SAAS,eAAe,WAAW,cAAc,aAAa,aAAa,OAAO,SAAS,MAAM;AAMlG,IAAM,0BAAkE,CAAC,EAAE,SAAS,GAAG,MAAM,MAAM;AACxG,QAAM,uBAAuB;AAC7B,QAAM,QAAQ,SAAS;AACvB,QAAM,CAAC,MAAM,OAAO,IAAI,SAA4B,EAAE,UAAU,CAAC,EAAE,CAAC;AACpE,QAAM,CAAC,SAAS,UAAU,IAAI,SAA+B,CAAC,CAAC;AAE/D;AAAA;AAAA,IAEE,OAAO,YAAY;AACjB,YAAM,EAAE,MAAAA,OAAM,SAAAC,SAAQ,IAAI,MAAM,+BAA+B,OAAO,OAAO,sBAAsB,EAAE,OAAO,KAAK,CAAC;AAClH,UAAI,QAAQ,GAAG;AACb,gBAAQD,KAAI;AACZ,mBAAWC,QAAO;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,sBAAsB,KAAK;AAAA,EAC9B;AAEA,SACE,oBAAC,WAAS,GAAG,OAAO,MAAM,yBAAyB,QAAW,WAAU,QACrE,iCACC,oBAAC,QAAK,SAAkB,MAAY,IACpC,MACJ;AAEJ;;;AMxDA,SAAS,iCAAsD;AAIxD,IAAM,4BAAiD;AAAA,EAC5D,GAAG,0BAA0B;AAAA,IAC3B,WAAW,MAAM;AAAA,IACjB,YAAY;AAAA,MACV,KAAK;AAAA,QACH,YAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AACH;","names":["data","options"]}
package/package.json CHANGED
@@ -12,9 +12,9 @@
12
12
  "dependencies": {
13
13
  "@xylabs/react-async-effect": "^3.1.7",
14
14
  "@xylabs/react-flexbox": "^3.1.7",
15
- "@xyo-network/diviner-forecasting-model": "^2.107.0",
16
- "@xyo-network/payload-model": "^2.107.0",
17
- "@xyo-network/react-payload-plugin": "~2.78.0",
15
+ "@xyo-network/diviner-forecasting-model": "^2.107.6",
16
+ "@xyo-network/payload-model": "^2.107.6",
17
+ "@xyo-network/react-payload-plugin": "^2.78.1",
18
18
  "chart.js": "^4.4.3",
19
19
  "chartjs-adapter-luxon": "^1.3.1",
20
20
  "luxon": "^3.4.4",
@@ -22,8 +22,8 @@
22
22
  },
23
23
  "devDependencies": {
24
24
  "@storybook/react": "^7.6.20",
25
- "@xylabs/ts-scripts-yarn3": "^3.11.8",
26
- "@xylabs/tsconfig-react": "^3.11.8",
25
+ "@xylabs/ts-scripts-yarn3": "^3.11.12",
26
+ "@xylabs/tsconfig-react": "^3.11.12",
27
27
  "typescript": "^5.5.2"
28
28
  },
29
29
  "peerDependencies": {
@@ -86,6 +86,6 @@
86
86
  },
87
87
  "sideEffects": false,
88
88
  "types": "dist/browser/index.d.ts",
89
- "version": "2.75.0",
89
+ "version": "2.75.1",
90
90
  "type": "module"
91
91
  }