kline wip

This commit is contained in:
Adrian Brzeziński 2022-11-29 18:09:32 +01:00
parent b4b2198af6
commit 0d7c899730
3 changed files with 193 additions and 80 deletions

View File

@ -1,16 +1,15 @@
import { useEffect, useRef, useMemo, useState } from 'react'
import { useEffect, useRef, useMemo } from 'react'
import { useTheme } from 'next-themes'
import {
widget,
ChartingLibraryWidgetOptions,
IChartingLibraryWidget,
ResolutionString,
} from '@public/charting_library'
import mangoStore from '@store/mangoStore'
import { useViewport } from 'hooks/useViewport'
import { CHART_DATA_FEED, DEFAULT_MARKET_NAME } from 'utils/constants'
import { breakpoints } from 'utils/theme'
import { CHART_DATA_FEED } from 'utils/constants'
import { COLORS } from 'styles/colors'
import { init, dispose } from 'klinecharts'
import axios from 'axios'
export interface ChartContainerProps {
container: ChartingLibraryWidgetOptions['container']
@ -30,15 +29,20 @@ export interface ChartContainerProps {
const TradingViewChart = () => {
const { theme } = useTheme()
const { width } = useViewport()
const [chartReady, setChartReady] = useState(false)
const selectedMarketName = mangoStore((s) => s.selectedMarket.current?.name)
const isMobile = width ? width < breakpoints.sm : false
const interval = 60
console.log(selectedMarketName)
const query = {
resolution: interval,
symbol: 'SOL/USDC',
from: Math.floor(Date.now() / 1000) - 60 * 60 * 24 * 14,
to: Math.floor(Date.now() / 1000),
countback: 2,
}
const defaultProps = useMemo(
() => ({
symbol: DEFAULT_MARKET_NAME,
symbol: 'SOL/USDC',
interval: '60' as ResolutionString,
theme: 'Dark',
container: 'tv_chart_container',
@ -54,7 +58,7 @@ const TradingViewChart = () => {
}),
[theme]
)
console.log(defaultProps)
const tvWidgetRef = useRef<IChartingLibraryWidget | null>(null)
let chartStyleOverrides = {
@ -92,7 +96,7 @@ const TradingViewChart = () => {
})
useEffect(() => {
if (tvWidgetRef.current && chartReady && selectedMarketName) {
if (tvWidgetRef.current && selectedMarketName) {
tvWidgetRef.current.setSymbol(
selectedMarketName!,
tvWidgetRef.current.activeChart().resolution(),
@ -101,77 +105,127 @@ const TradingViewChart = () => {
}
)
}
}, [selectedMarketName, chartReady])
}, [selectedMarketName])
// useEffect(() => {
// if (window) {
// const widgetOptions: ChartingLibraryWidgetOptions = {
// // debug: true,
// symbol: defaultProps.symbol,
// // BEWARE: no trailing slash is expected in feed URL
// // tslint:disable-next-line:no-any
// datafeed: new (window as any).Datafeeds.UDFCompatibleDatafeed(
// defaultProps.datafeedUrl
// ),
// interval:
// defaultProps.interval as ChartingLibraryWidgetOptions['interval'],
// container:
// defaultProps.container as ChartingLibraryWidgetOptions['container'],
// library_path: defaultProps.libraryPath as string,
// locale: 'en',
// enabled_features: ['hide_left_toolbar_by_default'],
// disabled_features: [
// 'use_localstorage_for_settings',
// 'timeframes_toolbar',
// isMobile ? 'left_toolbar' : '',
// 'show_logo_on_all_charts',
// 'caption_buttons_text_if_possible',
// 'header_settings',
// // 'header_chart_type',
// 'header_compare',
// 'compare_symbol',
// 'header_screenshot',
// // 'header_widget_dom_node',
// // 'header_widget',
// 'header_saveload',
// 'header_undo_redo',
// 'header_interval_dialog_button',
// 'show_interval_dialog_on_key_press',
// 'header_symbol_search',
// 'popup_hints',
// ],
// fullscreen: defaultProps.fullscreen,
// autosize: defaultProps.autosize,
// studies_overrides: defaultProps.studiesOverrides,
// theme: theme === 'Light' ? 'Light' : 'Dark',
// custom_css_url: '/styles/tradingview.css',
// loading_screen: {
// backgroundColor:
// theme === 'Dark'
// ? COLORS.BKG1.Dark
// : theme === 'Light'
// ? COLORS.BKG1.Light
// : COLORS.BKG1.Mango,
// },
// overrides: {
// timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
// ...chartStyleOverrides,
// },
// }
// const tvWidget = new widget(widgetOptions)
// tvWidgetRef.current = tvWidget
// tvWidgetRef.current.onChartReady(function () {
// setChartReady(true)
// })
// //eslint-disable-next-line
// }
// }, [theme, isMobile, defaultProps])
const generatedKLineDataList = async (dataSize = 336) => {
const response = await axios.get(`${CHART_DATA_FEED}/history`, {
params: query,
})
const newData = response.data as any
const dataList = []
for (let i = 0; i < dataSize; i++) {
const kLineModel = {
open: parseFloat(newData.o[i]),
low: parseFloat(newData.l[i]),
high: parseFloat(newData.h[i]),
close: parseFloat(newData.c[i]),
volume: parseFloat(newData.v[i]),
timestamp: newData.t[i],
}
dataList.unshift(kLineModel)
}
return dataList
}
function updateData(kLineChart: any) {
setTimeout(async () => {
if (kLineChart) {
const newData = (await generatedKLineDataList(1))[0]
newData.timestamp += 10000 * 60
kLineChart.updateData(newData)
}
updateData(kLineChart)
}, 10000)
}
useEffect(() => {
if (window) {
const widgetOptions: ChartingLibraryWidgetOptions = {
// debug: true,
symbol: defaultProps.symbol,
// BEWARE: no trailing slash is expected in feed URL
// tslint:disable-next-line:no-any
datafeed: new (window as any).Datafeeds.UDFCompatibleDatafeed(
defaultProps.datafeedUrl
),
interval:
defaultProps.interval as ChartingLibraryWidgetOptions['interval'],
container:
defaultProps.container as ChartingLibraryWidgetOptions['container'],
library_path: defaultProps.libraryPath as string,
locale: 'en',
enabled_features: ['hide_left_toolbar_by_default'],
disabled_features: [
'use_localstorage_for_settings',
'timeframes_toolbar',
isMobile ? 'left_toolbar' : '',
'show_logo_on_all_charts',
'caption_buttons_text_if_possible',
'header_settings',
// 'header_chart_type',
'header_compare',
'compare_symbol',
'header_screenshot',
// 'header_widget_dom_node',
// 'header_widget',
'header_saveload',
'header_undo_redo',
'header_interval_dialog_button',
'show_interval_dialog_on_key_press',
'header_symbol_search',
'popup_hints',
],
fullscreen: defaultProps.fullscreen,
autosize: defaultProps.autosize,
studies_overrides: defaultProps.studiesOverrides,
theme: theme === 'Light' ? 'Light' : 'Dark',
custom_css_url: '/styles/tradingview.css',
loading_screen: {
backgroundColor:
theme === 'Dark'
? COLORS.BKG1.Dark
: theme === 'Light'
? COLORS.BKG1.Light
: COLORS.BKG1.Mango,
},
overrides: {
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
...chartStyleOverrides,
},
}
const tvWidget = new widget(widgetOptions)
tvWidgetRef.current = tvWidget
tvWidgetRef.current.onChartReady(function () {
setChartReady(true)
})
//eslint-disable-next-line
const initKline = async () => {
const kLineChart = init('update-k-line')
const data = await generatedKLineDataList()
kLineChart.applyNewData(data)
updateData(kLineChart)
}
}, [theme, isMobile, defaultProps])
initKline()
return () => {
dispose('update-k-line')
}
}, [])
return (
<div id={defaultProps.container as string} className="tradingview-chart" />
<>
<div
style={{ height: '300px' }}
id="update-k-line"
className="k-line-chart"
/>
</>
)
}

View File

@ -25,6 +25,7 @@
"@types/howler": "^2.2.7",
"@types/lodash": "^4.14.185",
"assert": "^2.0.0",
"axios": "^1.2.0",
"big.js": "^6.2.1",
"date-fns": "^2.29.3",
"dayjs": "^1.11.3",
@ -32,6 +33,7 @@
"howler": "^2.2.3",
"html-react-parser": "^3.0.4",
"immer": "^9.0.12",
"klinecharts": "^8.6.3",
"lodash": "^4.17.21",
"next": "^13.0.0",
"next-i18next": "^11.1.1",

View File

@ -2156,6 +2156,11 @@ async-mutex@^0.3.2:
dependencies:
tslib "^2.3.1"
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
atomic-sleep@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b"
@ -2190,6 +2195,15 @@ axios@^0.21.0, axios@^0.21.1:
dependencies:
follow-redirects "^1.14.0"
axios@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.0.tgz#1cb65bd75162c70e9f8d118a905126c4a201d383"
integrity sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==
dependencies:
follow-redirects "^1.15.0"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
axobject-query@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be"
@ -2636,6 +2650,13 @@ color-name@^1.1.4, color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
commander@^2.20.3:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@ -2911,6 +2932,11 @@ delay@^5.0.0:
resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d"
integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
des.js@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
@ -3702,7 +3728,7 @@ flatted@^3.1.0:
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
follow-redirects@^1.14.0:
follow-redirects@^1.14.0, follow-redirects@^1.15.0:
version "1.15.2"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
@ -3712,6 +3738,15 @@ foreach@^2.0.5:
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k=
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
fraction.js@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950"
@ -4379,6 +4414,11 @@ keyvaluestorage-interface@^1.0.0:
resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff"
integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==
klinecharts@^8.6.3:
version "8.6.3"
resolved "https://registry.yarnpkg.com/klinecharts/-/klinecharts-8.6.3.tgz#9ff2c40e31d86ca0600abc5fb8bf546c61daf130"
integrity sha512-hGDtWiMNywEDneZFmt+vZ6tOYutCDWV5FPBcXcn7L8kGwe73Q5yJayk8UzP9pIQSBWyxswWIySKh/BVFA6GhuQ==
language-subtag-registry@~0.3.2:
version "0.3.21"
resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a"
@ -4538,6 +4578,18 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0"
brorand "^1.0.1"
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.12:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
@ -5114,6 +5166,11 @@ prop-types@15.x, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, pro
object-assign "^4.1.1"
react-is "^16.13.1"
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
ps-tree@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd"