Merge branch 'main' into alpha
This commit is contained in:
commit
22986301ac
|
@ -6,18 +6,19 @@ import { MangoAccount } from '@blockworks-foundation/mango-v4'
|
||||||
import useMangoAccount from 'hooks/useMangoAccount'
|
import useMangoAccount from 'hooks/useMangoAccount'
|
||||||
import useInterval from './shared/useInterval'
|
import useInterval from './shared/useInterval'
|
||||||
|
|
||||||
|
const set = mangoStore.getState().set
|
||||||
|
const actions = mangoStore.getState().actions
|
||||||
|
|
||||||
const HydrateStore = () => {
|
const HydrateStore = () => {
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const { name: marketName } = router.query
|
const { name: marketName } = router.query
|
||||||
const { mangoAccount } = useMangoAccount()
|
const { mangoAccount } = useMangoAccount()
|
||||||
|
|
||||||
const fetchData = useCallback(async () => {
|
const fetchData = useCallback(async () => {
|
||||||
const actions = mangoStore.getState().actions
|
|
||||||
await actions.fetchGroup()
|
await actions.fetchGroup()
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const set = mangoStore.getState().set
|
|
||||||
if (marketName && typeof marketName === 'string') {
|
if (marketName && typeof marketName === 'string') {
|
||||||
set((s) => {
|
set((s) => {
|
||||||
s.selectedMarket.name = marketName
|
s.selectedMarket.name = marketName
|
||||||
|
@ -34,7 +35,6 @@ const HydrateStore = () => {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const connection = mangoStore.getState().connection
|
const connection = mangoStore.getState().connection
|
||||||
const client = mangoStore.getState().client
|
const client = mangoStore.getState().client
|
||||||
const set = mangoStore.getState().set
|
|
||||||
|
|
||||||
if (!mangoAccount) return
|
if (!mangoAccount) return
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ const HydrateStore = () => {
|
||||||
decodedMangoAccount
|
decodedMangoAccount
|
||||||
)
|
)
|
||||||
await newMangoAccount.reloadAccountData(client)
|
await newMangoAccount.reloadAccountData(client)
|
||||||
|
actions.fetchOpenOrders()
|
||||||
// newMangoAccount.spotOpenOrdersAccounts =
|
// newMangoAccount.spotOpenOrdersAccounts =
|
||||||
// mangoAccount.spotOpenOrdersAccounts
|
// mangoAccount.spotOpenOrdersAccounts
|
||||||
// newMangoAccount.advancedOrders = mangoAccount.advancedOrders
|
// newMangoAccount.advancedOrders = mangoAccount.advancedOrders
|
||||||
|
|
|
@ -129,12 +129,21 @@ const EditProfileForm = ({
|
||||||
<InlineNotification type="error" desc={updateError} />
|
<InlineNotification type="error" desc={updateError} />
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
|
{!profile ? (
|
||||||
|
<div className="py-3">
|
||||||
|
<InlineNotification
|
||||||
|
type="error"
|
||||||
|
desc={t('profile:profile-api-error')}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
<div className="my-6 flex justify-center">
|
<div className="my-6 flex justify-center">
|
||||||
<div className="relative ">
|
<div className="relative ">
|
||||||
<IconButton
|
<IconButton
|
||||||
className="absolute -top-2 -right-2 bg-th-button md:hover:bg-th-button-hover"
|
className="absolute -top-2 -right-2 bg-th-button md:hover:bg-th-button-hover"
|
||||||
size="small"
|
size="small"
|
||||||
onClick={onEditProfileImage}
|
onClick={onEditProfileImage}
|
||||||
|
disabled={!profile}
|
||||||
>
|
>
|
||||||
{profile?.profile_image_url ? (
|
{profile?.profile_image_url ? (
|
||||||
<PencilIcon className="h-4 w-4" />
|
<PencilIcon className="h-4 w-4" />
|
||||||
|
@ -186,7 +195,8 @@ const EditProfileForm = ({
|
||||||
disabled={
|
disabled={
|
||||||
!!Object.keys(inputError).length ||
|
!!Object.keys(inputError).length ||
|
||||||
loadUniquenessCheck ||
|
loadUniquenessCheck ||
|
||||||
!profileName
|
!profileName ||
|
||||||
|
!profile
|
||||||
}
|
}
|
||||||
onClick={saveProfile}
|
onClick={saveProfile}
|
||||||
size="large"
|
size="large"
|
||||||
|
|
|
@ -9,8 +9,8 @@ import Switch from '@components/forms/Switch'
|
||||||
import {
|
import {
|
||||||
BASE_CHART_QUERY,
|
BASE_CHART_QUERY,
|
||||||
CHART_QUERY,
|
CHART_QUERY,
|
||||||
DEFAULT_MAIN_INDICATORS,
|
// DEFAULT_MAIN_INDICATORS,
|
||||||
DEFAULT_SUB_INDICATOR,
|
// DEFAULT_SUB_INDICATOR,
|
||||||
HISTORY,
|
HISTORY,
|
||||||
mainTechnicalIndicatorTypes,
|
mainTechnicalIndicatorTypes,
|
||||||
MAIN_INDICATOR_CLASS,
|
MAIN_INDICATOR_CLASS,
|
||||||
|
@ -18,10 +18,13 @@ import {
|
||||||
RES_NAME_TO_RES_VAL,
|
RES_NAME_TO_RES_VAL,
|
||||||
subTechnicalIndicatorTypes,
|
subTechnicalIndicatorTypes,
|
||||||
} from 'utils/kLineChart'
|
} from 'utils/kLineChart'
|
||||||
import { ArrowsPointingOutIcon } from '@heroicons/react/24/outline'
|
// import Loading from '@components/shared/Loading'
|
||||||
import Loading from '@components/shared/Loading'
|
|
||||||
import clsx from 'clsx'
|
import clsx from 'clsx'
|
||||||
import { API_URL, BE_API_KEY } from 'apis/birdeye/helpers'
|
import { API_URL, BE_API_KEY } from 'apis/birdeye/helpers'
|
||||||
|
import { useTheme } from 'next-themes'
|
||||||
|
import { COLORS } from 'styles/colors'
|
||||||
|
import { IconButton } from '@components/shared/Button'
|
||||||
|
import { ArrowsPointingOutIcon, XMarkIcon } from '@heroicons/react/20/solid'
|
||||||
|
|
||||||
const UPDATE_INTERVAL = 10000
|
const UPDATE_INTERVAL = 10000
|
||||||
|
|
||||||
|
@ -32,6 +35,7 @@ type Props = {
|
||||||
|
|
||||||
const TradingViewChartKline = ({ setIsFullView, isFullView }: Props) => {
|
const TradingViewChartKline = ({ setIsFullView, isFullView }: Props) => {
|
||||||
const { width } = useViewport()
|
const { width } = useViewport()
|
||||||
|
const { theme } = useTheme()
|
||||||
const prevWidth = usePrevious(width)
|
const prevWidth = usePrevious(width)
|
||||||
const selectedMarket = mangoStore((s) => s.selectedMarket.current)
|
const selectedMarket = mangoStore((s) => s.selectedMarket.current)
|
||||||
const selectedMarketName = selectedMarket?.name
|
const selectedMarketName = selectedMarket?.name
|
||||||
|
@ -43,15 +47,15 @@ const TradingViewChartKline = ({ setIsFullView, isFullView }: Props) => {
|
||||||
//indicatorName: class
|
//indicatorName: class
|
||||||
[indicatorName: string]: string
|
[indicatorName: string]: string
|
||||||
}>({})
|
}>({})
|
||||||
const [isLoading, setIsLoading] = useState(false)
|
// const [isLoading, setIsLoading] = useState(false)
|
||||||
const [resolution, setResolution] = useState(RES_NAME_TO_RES_VAL['1H'])
|
const [resolution, setResolution] = useState(RES_NAME_TO_RES_VAL['1H'])
|
||||||
const [chart, setChart] = useState<klinecharts.Chart | null>(null)
|
const [chart, setChart] = useState<klinecharts.Chart | null>(null)
|
||||||
const previousChart = usePrevious(chart)
|
// const previousChart = usePrevious(chart)
|
||||||
const [baseChartQuery, setQuery] = useState<BASE_CHART_QUERY | null>(null)
|
const [baseChartQuery, setQuery] = useState<BASE_CHART_QUERY | null>(null)
|
||||||
const clearTimerRef = useRef<NodeJS.Timeout | null>(null)
|
const clearTimerRef = useRef<NodeJS.Timeout | null>(null)
|
||||||
const fetchData = async (baseQuery: BASE_CHART_QUERY, from: number) => {
|
const fetchData = async (baseQuery: BASE_CHART_QUERY, from: number) => {
|
||||||
try {
|
try {
|
||||||
setIsLoading(true)
|
// setIsLoading(true)
|
||||||
const query: CHART_QUERY = {
|
const query: CHART_QUERY = {
|
||||||
...baseQuery,
|
...baseQuery,
|
||||||
time_from: from,
|
time_from: from,
|
||||||
|
@ -77,10 +81,10 @@ const TradingViewChartKline = ({ setIsFullView, isFullView }: Props) => {
|
||||||
}
|
}
|
||||||
dataList.push(kLineModel)
|
dataList.push(kLineModel)
|
||||||
}
|
}
|
||||||
setIsLoading(false)
|
// setIsLoading(false)
|
||||||
return dataList
|
return dataList
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
setIsLoading(false)
|
// setIsLoading(false)
|
||||||
console.log(e)
|
console.log(e)
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
|
@ -155,67 +159,248 @@ const TradingViewChartKline = ({ setIsFullView, isFullView }: Props) => {
|
||||||
}
|
}
|
||||||
}, [selectedMarketName, resolution])
|
}, [selectedMarketName, resolution])
|
||||||
|
|
||||||
//init default technical indicators after init of chart
|
// init default technical indicators after init of chart
|
||||||
useEffect(() => {
|
// useEffect(() => {
|
||||||
if (chart !== null && previousChart === null) {
|
// if (chart !== null && previousChart === null) {
|
||||||
if (DEFAULT_SUB_INDICATOR) {
|
// if (DEFAULT_SUB_INDICATOR) {
|
||||||
const subId = chart.createTechnicalIndicator(
|
// const subId = chart.createTechnicalIndicator(
|
||||||
DEFAULT_SUB_INDICATOR,
|
// DEFAULT_SUB_INDICATOR,
|
||||||
true
|
// true
|
||||||
)
|
// )
|
||||||
setSubTechnicalIndicators({ [DEFAULT_SUB_INDICATOR]: subId })
|
// setSubTechnicalIndicators({ [DEFAULT_SUB_INDICATOR]: subId })
|
||||||
}
|
// }
|
||||||
if (DEFAULT_MAIN_INDICATORS?.length) {
|
// if (DEFAULT_MAIN_INDICATORS?.length) {
|
||||||
for (const type of DEFAULT_MAIN_INDICATORS) {
|
// for (const type of DEFAULT_MAIN_INDICATORS) {
|
||||||
chart?.createTechnicalIndicator(type, true, {
|
// chart?.createTechnicalIndicator(type, true, {
|
||||||
id: MAIN_INDICATOR_CLASS,
|
// id: MAIN_INDICATOR_CLASS,
|
||||||
})
|
// })
|
||||||
}
|
// }
|
||||||
setMainTechnicalIndicators(DEFAULT_MAIN_INDICATORS)
|
// setMainTechnicalIndicators(DEFAULT_MAIN_INDICATORS)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}, [chart !== null])
|
// }, [chart !== null])
|
||||||
|
|
||||||
//init chart without data
|
//init chart without data
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const initKline = async () => {
|
const initKline = async () => {
|
||||||
const style = getComputedStyle(document.body)
|
|
||||||
const gridColor = style.getPropertyValue('--bkg-3')
|
|
||||||
const kLineChart = init('update-k-line')
|
const kLineChart = init('update-k-line')
|
||||||
kLineChart.setStyleOptions({
|
kLineChart.setStyleOptions({
|
||||||
grid: {
|
grid: {
|
||||||
show: true,
|
show: false,
|
||||||
horizontal: {
|
|
||||||
style: 'solid',
|
|
||||||
color: gridColor,
|
|
||||||
},
|
|
||||||
vertical: {
|
|
||||||
style: 'solid',
|
|
||||||
color: gridColor,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
candle: {
|
candle: {
|
||||||
|
bar: {
|
||||||
|
upColor: COLORS.UP[theme],
|
||||||
|
downColor: COLORS.DOWN[theme],
|
||||||
|
},
|
||||||
tooltip: {
|
tooltip: {
|
||||||
labels: ['T: ', 'O: ', 'C: ', 'H: ', 'L: ', 'V: '],
|
labels: ['', 'O:', 'C:', 'H:', 'L:', 'V:'],
|
||||||
|
text: {
|
||||||
|
size: 12,
|
||||||
|
family: 'TT Mono',
|
||||||
|
weight: 'normal',
|
||||||
|
color: COLORS.FGD4[theme],
|
||||||
|
marginLeft: 8,
|
||||||
|
marginTop: 6,
|
||||||
|
marginRight: 8,
|
||||||
|
marginBottom: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
priceMark: {
|
||||||
|
show: true,
|
||||||
|
high: {
|
||||||
|
show: true,
|
||||||
|
color: COLORS.FGD4[theme],
|
||||||
|
textMargin: 5,
|
||||||
|
textSize: 10,
|
||||||
|
textFamily: 'TT Mono',
|
||||||
|
textWeight: 'normal',
|
||||||
|
},
|
||||||
|
low: {
|
||||||
|
show: true,
|
||||||
|
color: COLORS.FGD4[theme],
|
||||||
|
textMargin: 5,
|
||||||
|
textSize: 10,
|
||||||
|
textFamily: 'TT Mono',
|
||||||
|
textWeight: 'normal',
|
||||||
|
},
|
||||||
|
last: {
|
||||||
|
show: true,
|
||||||
|
upColor: COLORS.BKG4[theme],
|
||||||
|
downColor: COLORS.BKG4[theme],
|
||||||
|
noChangeColor: COLORS.BKG4[theme],
|
||||||
|
line: {
|
||||||
|
show: true,
|
||||||
|
// 'solid'|'dash'
|
||||||
|
style: 'dash',
|
||||||
|
dashValue: [4, 4],
|
||||||
|
size: 1,
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
show: true,
|
||||||
|
size: 10,
|
||||||
|
paddingLeft: 2,
|
||||||
|
paddingTop: 2,
|
||||||
|
paddingRight: 2,
|
||||||
|
paddingBottom: 2,
|
||||||
|
color: '#FFFFFF',
|
||||||
|
family: 'TT Mono',
|
||||||
|
weight: 'normal',
|
||||||
|
borderRadius: 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
xAxis: {
|
xAxis: {
|
||||||
axisLine: {
|
axisLine: {
|
||||||
show: true,
|
show: true,
|
||||||
color: gridColor,
|
color: COLORS.BKG4[theme],
|
||||||
size: 1,
|
size: 1,
|
||||||
},
|
},
|
||||||
|
tickLine: {
|
||||||
|
show: true,
|
||||||
|
size: 1,
|
||||||
|
length: 3,
|
||||||
|
color: COLORS.BKG4[theme],
|
||||||
|
},
|
||||||
|
tickText: {
|
||||||
|
show: true,
|
||||||
|
color: COLORS.FGD4[theme],
|
||||||
|
family: 'TT Mono',
|
||||||
|
weight: 'normal',
|
||||||
|
size: 10,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
yAxis: {
|
yAxis: {
|
||||||
axisLine: {
|
axisLine: {
|
||||||
show: true,
|
show: true,
|
||||||
color: gridColor,
|
color: COLORS.BKG4[theme],
|
||||||
size: 1,
|
size: 1,
|
||||||
},
|
},
|
||||||
|
tickLine: {
|
||||||
|
show: true,
|
||||||
|
size: 1,
|
||||||
|
length: 3,
|
||||||
|
color: COLORS.BKG4[theme],
|
||||||
|
},
|
||||||
|
tickText: {
|
||||||
|
show: true,
|
||||||
|
color: COLORS.FGD4[theme],
|
||||||
|
family: 'TT Mono',
|
||||||
|
weight: 'normal',
|
||||||
|
size: 10,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
crosshair: {
|
||||||
|
show: true,
|
||||||
|
horizontal: {
|
||||||
|
show: true,
|
||||||
|
line: {
|
||||||
|
show: true,
|
||||||
|
style: 'dash',
|
||||||
|
dashValue: [4, 2],
|
||||||
|
size: 1,
|
||||||
|
color: COLORS.FGD4[theme],
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
show: true,
|
||||||
|
color: '#FFFFFF',
|
||||||
|
size: 10,
|
||||||
|
family: 'TT Mono',
|
||||||
|
weight: 'normal',
|
||||||
|
paddingLeft: 2,
|
||||||
|
paddingRight: 2,
|
||||||
|
paddingTop: 2,
|
||||||
|
paddingBottom: 2,
|
||||||
|
borderSize: 1,
|
||||||
|
borderColor: COLORS.FGD4[theme],
|
||||||
|
borderRadius: 2,
|
||||||
|
backgroundColor: COLORS.FGD4[theme],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
vertical: {
|
||||||
|
show: true,
|
||||||
|
line: {
|
||||||
|
show: true,
|
||||||
|
style: 'dash',
|
||||||
|
dashValue: [4, 2],
|
||||||
|
size: 1,
|
||||||
|
color: COLORS.FGD4[theme],
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
show: true,
|
||||||
|
color: '#FFFFFF',
|
||||||
|
size: 10,
|
||||||
|
family: 'TT Mono',
|
||||||
|
weight: 'normal',
|
||||||
|
paddingLeft: 2,
|
||||||
|
paddingRight: 2,
|
||||||
|
paddingTop: 2,
|
||||||
|
paddingBottom: 2,
|
||||||
|
borderSize: 1,
|
||||||
|
borderColor: COLORS.FGD4[theme],
|
||||||
|
borderRadius: 2,
|
||||||
|
backgroundColor: COLORS.FGD4[theme],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
technicalIndicator: {
|
||||||
|
margin: {
|
||||||
|
top: 0.2,
|
||||||
|
bottom: 0.1,
|
||||||
|
},
|
||||||
|
bar: {
|
||||||
|
upColor: COLORS.UP[theme],
|
||||||
|
downColor: COLORS.DOWN[theme],
|
||||||
|
noChangeColor: '#888888',
|
||||||
|
},
|
||||||
|
line: {
|
||||||
|
size: 1,
|
||||||
|
colors: ['#FF9600', '#9D65C9', '#2196F3', '#E11D74', '#01C5C4'],
|
||||||
|
},
|
||||||
|
circle: {
|
||||||
|
upColor: '#26A69A',
|
||||||
|
downColor: '#EF5350',
|
||||||
|
noChangeColor: '#888888',
|
||||||
|
},
|
||||||
|
lastValueMark: {
|
||||||
|
show: false,
|
||||||
|
text: {
|
||||||
|
show: false,
|
||||||
|
color: '#ffffff',
|
||||||
|
size: 12,
|
||||||
|
family: 'Helvetica Neue',
|
||||||
|
weight: 'normal',
|
||||||
|
paddingLeft: 3,
|
||||||
|
paddingTop: 2,
|
||||||
|
paddingRight: 3,
|
||||||
|
paddingBottom: 2,
|
||||||
|
borderRadius: 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
// 'always' | 'follow_cross' | 'none'
|
||||||
|
showRule: 'always',
|
||||||
|
// 'standard' | 'rect'
|
||||||
|
showType: 'standard',
|
||||||
|
showName: true,
|
||||||
|
showParams: true,
|
||||||
|
defaultValue: 'n/a',
|
||||||
|
text: {
|
||||||
|
size: 12,
|
||||||
|
family: 'TT Mono',
|
||||||
|
weight: 'normal',
|
||||||
|
color: COLORS.FGD4[theme],
|
||||||
|
marginTop: 6,
|
||||||
|
marginRight: 8,
|
||||||
|
marginBottom: 0,
|
||||||
|
marginLeft: 8,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
separator: {
|
separator: {
|
||||||
size: 2,
|
size: 2,
|
||||||
color: gridColor,
|
color: COLORS.BKG4[theme],
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
setChart(kLineChart)
|
setChart(kLineChart)
|
||||||
|
@ -230,43 +415,52 @@ const TradingViewChartKline = ({ setIsFullView, isFullView }: Props) => {
|
||||||
<div
|
<div
|
||||||
className={clsx(
|
className={clsx(
|
||||||
'fixed h-full w-full',
|
'fixed h-full w-full',
|
||||||
isFullView &&
|
isFullView
|
||||||
'left-[64px] top-0 right-0 bottom-0 bg-th-bkg-1 text-th-fgd-1'
|
? 'left-0 top-0 right-0 bottom-0 z-40 bg-th-bkg-1 text-th-fgd-1'
|
||||||
|
: ''
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<div className="flex w-full">
|
<div className="mb-1 flex w-full items-center justify-between border-b border-th-bkg-3 p-1 text-th-fgd-2">
|
||||||
{Object.keys(RES_NAME_TO_RES_VAL).map((key) => (
|
<div className="flex text-th-fgd-3">
|
||||||
<div
|
{Object.keys(RES_NAME_TO_RES_VAL).map((key) => (
|
||||||
className={clsx(
|
<button
|
||||||
'cursor-pointer py-1 px-2',
|
className={clsx(
|
||||||
resolution === RES_NAME_TO_RES_VAL[key] && 'text-th-active'
|
'default-transition px-2 md:hover:text-th-fgd-2',
|
||||||
)}
|
resolution === RES_NAME_TO_RES_VAL[key] && 'text-th-active'
|
||||||
key={key}
|
)}
|
||||||
onClick={() => setResolution(RES_NAME_TO_RES_VAL[key])}
|
key={key}
|
||||||
|
onClick={() => setResolution(RES_NAME_TO_RES_VAL[key])}
|
||||||
|
>
|
||||||
|
{key}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
<button
|
||||||
|
className="default-transition px-2 md:hover:text-th-fgd-2"
|
||||||
|
onClick={() => setIsTechnicalModalOpen(true)}
|
||||||
>
|
>
|
||||||
{key}
|
Indicator
|
||||||
</div>
|
</button>
|
||||||
))}
|
|
||||||
<div
|
|
||||||
className="cursor-pointer py-1 px-2 "
|
|
||||||
onClick={() => setIsTechnicalModalOpen(true)}
|
|
||||||
>
|
|
||||||
Indicator
|
|
||||||
</div>
|
</div>
|
||||||
{setIsFullView && (
|
{setIsFullView ? (
|
||||||
<div className="cursor-pointer py-1 px-2">
|
<IconButton
|
||||||
<ArrowsPointingOutIcon
|
className="text-th-fgd-3"
|
||||||
onClick={() => setIsFullView(!isFullView)}
|
size="small"
|
||||||
className="w-5"
|
hideBg
|
||||||
></ArrowsPointingOutIcon>
|
onClick={() => setIsFullView(!isFullView)}
|
||||||
</div>
|
>
|
||||||
)}
|
{isFullView ? (
|
||||||
<div className="py-1 px-2">
|
<XMarkIcon className="h-5 w-5" />
|
||||||
|
) : (
|
||||||
|
<ArrowsPointingOutIcon className="h-5 w-5" />
|
||||||
|
)}
|
||||||
|
</IconButton>
|
||||||
|
) : null}
|
||||||
|
{/* <div className="px-2">
|
||||||
{isLoading && <Loading className="w-4"></Loading>}
|
{isLoading && <Loading className="w-4"></Loading>}
|
||||||
</div>
|
</div> */}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
style={{ height: 'calc(100% - 30px)', width: '100%' }}
|
style={{ height: 'calc(100% - 48px)', width: '100%' }}
|
||||||
id="update-k-line"
|
id="update-k-line"
|
||||||
className="k-line-chart"
|
className="k-line-chart"
|
||||||
/>
|
/>
|
||||||
|
@ -275,7 +469,7 @@ const TradingViewChartKline = ({ setIsFullView, isFullView }: Props) => {
|
||||||
onClose={() => setIsTechnicalModalOpen(false)}
|
onClose={() => setIsTechnicalModalOpen(false)}
|
||||||
>
|
>
|
||||||
<div className="hide-scroll flex max-h-96 flex-col overflow-auto text-left">
|
<div className="hide-scroll flex max-h-96 flex-col overflow-auto text-left">
|
||||||
<h2 className="py-4">Main Indicator</h2>
|
<h2 className="py-4 text-base">Main Indicator</h2>
|
||||||
{mainTechnicalIndicatorTypes.map((type) => {
|
{mainTechnicalIndicatorTypes.map((type) => {
|
||||||
return (
|
return (
|
||||||
<IndicatorSwitch
|
<IndicatorSwitch
|
||||||
|
@ -301,7 +495,7 @@ const TradingViewChartKline = ({ setIsFullView, isFullView }: Props) => {
|
||||||
></IndicatorSwitch>
|
></IndicatorSwitch>
|
||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
<h2 className="py-4">Sub Indicator</h2>
|
<h2 className="py-4 text-base">Bottom Indicator</h2>
|
||||||
{subTechnicalIndicatorTypes.map((type) => {
|
{subTechnicalIndicatorTypes.map((type) => {
|
||||||
return (
|
return (
|
||||||
<IndicatorSwitch
|
<IndicatorSwitch
|
||||||
|
|
|
@ -11,7 +11,6 @@ import mangoStore from '@store/mangoStore'
|
||||||
import { notify } from '../../utils/notifications'
|
import { notify } from '../../utils/notifications'
|
||||||
import ProfileImage from '../profile/ProfileImage'
|
import ProfileImage from '../profile/ProfileImage'
|
||||||
import { abbreviateAddress } from '../../utils/formatting'
|
import { abbreviateAddress } from '../../utils/formatting'
|
||||||
import { PublicKey } from '@solana/web3.js'
|
|
||||||
import { useViewport } from 'hooks/useViewport'
|
import { useViewport } from 'hooks/useViewport'
|
||||||
import { breakpoints } from '../../utils/theme'
|
import { breakpoints } from '../../utils/theme'
|
||||||
import EditProfileModal from '@components/modals/EditProfileModal'
|
import EditProfileModal from '@components/modals/EditProfileModal'
|
||||||
|
@ -91,11 +90,7 @@ const ConnectedMenu = () => {
|
||||||
{!loadProfileDetails && !isMobile ? (
|
{!loadProfileDetails && !isMobile ? (
|
||||||
<div className="ml-2.5 overflow-hidden text-left">
|
<div className="ml-2.5 overflow-hidden text-left">
|
||||||
<p className="font-mono text-xs text-th-fgd-3">
|
<p className="font-mono text-xs text-th-fgd-3">
|
||||||
{profileDetails?.wallet_pk
|
{publicKey ? abbreviateAddress(publicKey) : ''}
|
||||||
? abbreviateAddress(
|
|
||||||
new PublicKey(profileDetails?.wallet_pk)
|
|
||||||
)
|
|
||||||
: ''}
|
|
||||||
</p>
|
</p>
|
||||||
<p className="truncate pr-2 text-sm font-bold capitalize text-th-fgd-1">
|
<p className="truncate pr-2 text-sm font-bold capitalize text-th-fgd-1">
|
||||||
{profileDetails?.profile_name
|
{profileDetails?.profile_name
|
||||||
|
|
|
@ -9,7 +9,6 @@ export function useUnsettledSpotBalances() {
|
||||||
const { mangoAccount } = useMangoAccount()
|
const { mangoAccount } = useMangoAccount()
|
||||||
const openOrdersAccounts =
|
const openOrdersAccounts =
|
||||||
mangoStore.getState().mangoAccount.openOrderAccounts
|
mangoStore.getState().mangoAccount.openOrderAccounts
|
||||||
console.log('openOrdersAccount', openOrdersAccounts)
|
|
||||||
|
|
||||||
const unsettledSpotBalances = useMemo(() => {
|
const unsettledSpotBalances = useMemo(() => {
|
||||||
if (!group || !mangoAccount || !openOrdersAccounts) return {}
|
if (!group || !mangoAccount || !openOrdersAccounts) return {}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
"no-nfts": "😞 No NFTs found...",
|
"no-nfts": "😞 No NFTs found...",
|
||||||
"no-profile-exists": "This profile doesn't exist...",
|
"no-profile-exists": "This profile doesn't exist...",
|
||||||
"profile": "Profile",
|
"profile": "Profile",
|
||||||
|
"profile-api-error": "Profile update is unavailable. Please try again later",
|
||||||
"profile-fetch-fail": "Failed to fetch profile details",
|
"profile-fetch-fail": "Failed to fetch profile details",
|
||||||
"profile-name": "Profile Name",
|
"profile-name": "Profile Name",
|
||||||
"profile-pic-failure": "Failed to set profile pic",
|
"profile-pic-failure": "Failed to set profile pic",
|
||||||
|
|
|
@ -17,8 +17,9 @@
|
||||||
"no-following": "No Accounts Followed",
|
"no-following": "No Accounts Followed",
|
||||||
"no-following-desc": "The lone sheep is in danger of the wolf",
|
"no-following-desc": "The lone sheep is in danger of the wolf",
|
||||||
"no-nfts": "😞 No NFTs found...",
|
"no-nfts": "😞 No NFTs found...",
|
||||||
"profile": "Profile",
|
|
||||||
"no-profile-exists": "This profile doesn't exist...",
|
"no-profile-exists": "This profile doesn't exist...",
|
||||||
|
"profile": "Profile",
|
||||||
|
"profile-api-error": "Profile update is unavailable. Please try again later",
|
||||||
"profile-fetch-fail": "Failed to fetch profile details",
|
"profile-fetch-fail": "Failed to fetch profile details",
|
||||||
"profile-name": "Profile Name",
|
"profile-name": "Profile Name",
|
||||||
"profile-pic-failure": "Failed to set profile pic",
|
"profile-pic-failure": "Failed to set profile pic",
|
||||||
|
|
|
@ -1,43 +1,44 @@
|
||||||
{
|
{
|
||||||
"browse-profiles": "瀏覽",
|
"browse-profiles": "Browse",
|
||||||
"choose-profile": "選擇頭像",
|
"choose-profile": "Profile Image",
|
||||||
"connect-view-profile": "連接錢包來查看帳戶",
|
"connect-view-profile": "Connect your wallet to view your profile",
|
||||||
"day-trader": "日內交易者",
|
"day-trader": "Day Trader",
|
||||||
"degen": "Degen",
|
"degen": "Degen",
|
||||||
"discretionary": "零錢",
|
"discretionary": "Discretionary",
|
||||||
"edit-profile": "編輯帳戶",
|
"edit-profile": "Edit Profile",
|
||||||
"edit-profile-pic": "切換頭像",
|
"edit-profile-pic": "Edit Profile Pic",
|
||||||
"follow": "追蹤",
|
"follow": "Follow",
|
||||||
"following": "追蹤中",
|
"following": "Following",
|
||||||
"invalid-characters": "限制於字母、数字和空格",
|
"invalid-characters": "Only alphanumeric characters and single spaces allowed",
|
||||||
"length-error": "Names must be less than 20 characters",
|
"length-error": "Names must be less than 20 characters",
|
||||||
"market-maker": "做市商",
|
"market-maker": "Market Maker",
|
||||||
"no-followers": "無追蹤者",
|
"no-followers": "No Followers",
|
||||||
"no-followers-desc": "以隱身模式交易😎",
|
"no-followers-desc": "Trading in stealth mode 😎",
|
||||||
"no-following": "還沒追蹤別帳戶",
|
"no-following": "No Accounts Followed",
|
||||||
"no-following-desc": "跟朋友團結比較安全吧",
|
"no-following-desc": "The lone sheep is in danger of the wolf",
|
||||||
"no-nfts": "😞 未找到NFT...",
|
"no-nfts": "😞 No NFTs found...",
|
||||||
"no-profile-exists": "此帳戶不存在...",
|
"no-profile-exists": "This profile doesn't exist...",
|
||||||
"profile": "帳戶",
|
"profile": "Profile",
|
||||||
"profile-fetch-fail": "查帳戶細節出錯",
|
"profile-api-error": "Profile update is unavailable. Please try again later",
|
||||||
"profile-name": "帳戶標籤",
|
"profile-fetch-fail": "Failed to fetch profile details",
|
||||||
"profile-pic-failure": "設置頭像失敗",
|
"profile-name": "Profile Name",
|
||||||
"profile-pic-success": "設置頭像成功",
|
"profile-pic-failure": "Failed to set profile pic",
|
||||||
"profile-pic-remove-failure": "刪除頭像失敗",
|
"profile-pic-success": "Successfully set profile pic",
|
||||||
"profile-pic-remove-success": "刪除頭像成功",
|
"profile-pic-remove-failure": "Failed to remove profile pic",
|
||||||
"profile-update-fail": "更新帳戶出錯",
|
"profile-pic-remove-success": "Successfully removed profile pic",
|
||||||
"profile-update-success": "帳戶已更新",
|
"profile-update-fail": "Failed to update profile",
|
||||||
"remove": "刪除",
|
"profile-update-success": "Profile updated",
|
||||||
"save-profile": "保存帳戶",
|
"remove": "Remove",
|
||||||
"set-profile-pic": "設置頭像",
|
"save-profile": "Save Profile",
|
||||||
"swing-trader": "擺動交易者",
|
"set-profile-pic": "Set Profile Pic",
|
||||||
"total-pnl": "組合總盈虧",
|
"swing-trader": "Swing Trader",
|
||||||
"total-value": "組合總價值",
|
"total-pnl": "Total Portfolio PnL",
|
||||||
"trader": "交易者",
|
"total-value": "Total Portfolio Value",
|
||||||
"trader-category": "交易模式",
|
"trader": "Trader",
|
||||||
"unfollow": "取消追蹤",
|
"trader-category": "Trader Category",
|
||||||
|
"unfollow": "Unfollow",
|
||||||
"uniqueness-api-fail": "Failed to check profile name uniqueness",
|
"uniqueness-api-fail": "Failed to check profile name uniqueness",
|
||||||
"uniqueness-fail": "Profile name is taken. Try another one",
|
"uniqueness-fail": "Profile name is taken. Try another one",
|
||||||
"yolo": "YOLO",
|
"yolo": "YOLO",
|
||||||
"your-profile": "您的帳戶"
|
"your-profile": "Your Profile"
|
||||||
}
|
}
|
|
@ -19,6 +19,7 @@
|
||||||
"no-nfts": "😞 未找到NFT...",
|
"no-nfts": "😞 未找到NFT...",
|
||||||
"no-profile-exists": "此帐户不存在...",
|
"no-profile-exists": "此帐户不存在...",
|
||||||
"profile": "帐户",
|
"profile": "帐户",
|
||||||
|
"profile-api-error": "Profile update is unavailable. Please try again later",
|
||||||
"profile-fetch-fail": "查帐户细节出错",
|
"profile-fetch-fail": "查帐户细节出错",
|
||||||
"profile-name": "帐户标签",
|
"profile-name": "帐户标签",
|
||||||
"profile-pic-failure": "设置头像失败",
|
"profile-pic-failure": "设置头像失败",
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
"no-nfts": "😞 未找到NFT...",
|
"no-nfts": "😞 未找到NFT...",
|
||||||
"no-profile-exists": "此帳戶不存在...",
|
"no-profile-exists": "此帳戶不存在...",
|
||||||
"profile": "帳戶",
|
"profile": "帳戶",
|
||||||
|
"profile-api-error": "Profile update is unavailable. Please try again later",
|
||||||
"profile-fetch-fail": "查帳戶細節出錯",
|
"profile-fetch-fail": "查帳戶細節出錯",
|
||||||
"profile-name": "帳戶標籤",
|
"profile-name": "帳戶標籤",
|
||||||
"profile-pic-failure": "設置頭像失敗",
|
"profile-pic-failure": "設置頭像失敗",
|
||||||
|
|
|
@ -412,7 +412,6 @@ module.exports = {
|
||||||
'th-link-hover': 'var(--link-hover)',
|
'th-link-hover': 'var(--link-hover)',
|
||||||
'th-button': 'var(--button)',
|
'th-button': 'var(--button)',
|
||||||
'th-button-hover': 'var(--button-hover)',
|
'th-button-hover': 'var(--button-hover)',
|
||||||
'th-warning': 'var(--warning)',
|
|
||||||
'th-input-bkg': 'var(--input-bkg)',
|
'th-input-bkg': 'var(--input-bkg)',
|
||||||
'th-input-border': 'var(--input-border)',
|
'th-input-border': 'var(--input-border)',
|
||||||
'th-input-border-hover': 'var(--input-border-hover)',
|
'th-input-border-hover': 'var(--input-border-hover)',
|
||||||
|
|
Loading…
Reference in New Issue