mango-v4-ui/components/settings/DisplaySettings.tsx

269 lines
9.0 KiB
TypeScript
Raw Normal View History

2022-11-24 18:39:14 -08:00
import ButtonGroup from '@components/forms/ButtonGroup'
2022-11-30 21:21:28 -08:00
import Select from '@components/forms/Select'
import ChartMiddleOBLeft from '@components/icons/ChartMiddleOBLeft'
import ChartMiddleOBRight from '@components/icons/ChartMiddleOBRight'
import ChartOnLeft from '@components/icons/ChartOnLeft'
import ChartOnRight from '@components/icons/ChartOnRight'
import Tooltip from '@components/shared/Tooltip'
2023-03-26 20:11:10 -07:00
import { TradeLayout } from '@components/trade/TradeAdvancedPage'
2022-12-19 15:12:23 -08:00
// import dayjs from 'dayjs'
import { ReactNode, useEffect } from 'react'
2022-12-19 15:12:23 -08:00
// import { useRouter } from 'next/router'
// import { useCallback } from 'react'
2023-04-17 11:03:35 -07:00
import dayjs from 'dayjs'
2022-11-24 18:39:14 -08:00
import useLocalStorageState from 'hooks/useLocalStorageState'
import { useTranslation } from 'next-i18next'
import { useTheme } from 'next-themes'
2023-04-17 11:03:35 -07:00
import { useCallback } from 'react'
import { useRouter } from 'next/router'
2022-12-06 09:35:15 -08:00
import {
NOTIFICATION_POSITION_KEY,
SIZE_INPUT_UI_KEY,
TRADE_CHART_UI_KEY,
TRADE_LAYOUT_KEY,
2022-12-06 09:35:15 -08:00
} from 'utils/constants'
2023-06-06 22:00:59 -07:00
import mangoStore, { DEFAULT_THEME_DATA } from '@store/mangoStore'
import { useWallet } from '@solana/wallet-adapter-react'
2023-06-06 22:00:59 -07:00
import { ThemeData } from 'types'
2022-11-24 18:39:14 -08:00
const NOTIFICATION_POSITIONS = [
'bottom-left',
'bottom-right',
'top-left',
'top-right',
]
2022-12-22 02:04:38 -08:00
const TRADING_CHARTS = ['custom', 'trading-view']
const TRADE_FORM_UI = ['slider', 'buttons']
2023-04-17 11:03:35 -07:00
const LANGS = [
{ locale: 'en', name: 'english', description: 'english' },
// { locale: 'ru', name: 'russian', description: 'russian' },
// { locale: 'es', name: 'spanish', description: 'spanish' },
{
locale: 'zh_tw',
name: 'chinese-traditional',
description: 'traditional chinese',
},
// { locale: 'zh', name: 'chinese', description: 'simplified chinese' },
]
2022-11-24 18:39:14 -08:00
2022-12-16 03:26:42 -08:00
export const THEMES = [
2023-05-30 20:03:53 -07:00
'bonk',
2022-12-16 03:26:42 -08:00
'light',
'medium',
'dark',
'high-contrast',
'mango-classic',
'avocado',
'banana',
'blueberry',
'lychee',
'olive',
2022-11-24 18:39:14 -08:00
]
2023-06-06 22:00:59 -07:00
const BONK_META_DATA: ThemeData = {
buttonStyle: 'raised',
logoPath: '/images/themes/bonk/bonk-logo.png',
platformName: 'Bongo',
rainAnimationImagePath: '/images/themes/bonk/bonk-animation-logo.png',
sideImagePath: '/images/themes/bonk/sidenav-image.png',
sideTilePath: '/images/themes/bonk/bonk-tile.png',
topTilePath: '/images/themes/bonk/bonk-tile.png',
tvChartTheme: 'Light',
2023-06-06 23:04:38 -07:00
tvImagePath: '/images/themes/bonk/tv-chart-image.png',
2023-06-06 22:00:59 -07:00
useGradientBg: true,
}
2022-11-24 18:39:14 -08:00
const DisplaySettings = () => {
const { t } = useTranslation(['common', 'settings'])
const { theme, setTheme } = useTheme()
const nfts = mangoStore((s) => s.wallet.nfts.data)
// const nftsLoading = mangoStore((s) => s.wallet.nfts.loading)
const connection = mangoStore((s) => s.connection)
const actions = mangoStore.getState().actions
const { publicKey } = useWallet()
2023-04-17 11:03:35 -07:00
const [savedLanguage, setSavedLanguage] = useLocalStorageState(
'language',
'en'
)
const router = useRouter()
const { pathname, asPath, query } = router
2022-11-24 18:39:14 -08:00
const [notificationPosition, setNotificationPosition] = useLocalStorageState(
NOTIFICATION_POSITION_KEY,
'bottom-left'
)
const [tradeFormUi, setTradeFormUi] = useLocalStorageState(
SIZE_INPUT_UI_KEY,
'slider'
2022-11-24 18:39:14 -08:00
)
2022-12-06 09:35:15 -08:00
const [tradeChartUi, setTradeChartUi] = useLocalStorageState(
TRADE_CHART_UI_KEY,
2022-12-22 02:04:38 -08:00
'trading-view'
2022-12-06 09:35:15 -08:00
)
2023-03-26 20:11:10 -07:00
const [, setTradeLayout] = useLocalStorageState(TRADE_LAYOUT_KEY, 'chartLeft')
2022-11-24 18:39:14 -08:00
useEffect(() => {
if (connection && publicKey) {
actions.fetchNfts(connection, publicKey)
}
}, [connection, publicKey])
2023-06-06 22:00:59 -07:00
// set nft skin data to store and localStorage (move this to theme selection). will need to use localStorage for page reloads
useEffect(() => {
const set = mangoStore.getState().set
if (theme === 'Bonk') {
set((s) => {
s.themeData = BONK_META_DATA
})
} else {
set((s) => {
s.themeData = DEFAULT_THEME_DATA
})
}
}, [theme])
// use collectionAddress to enable nft skins?
console.log(nfts)
2023-04-17 11:03:35 -07:00
const handleLangChange = useCallback(
(l: string) => {
setSavedLanguage(l)
router.push({ pathname, query }, asPath, { locale: l })
dayjs.locale(l == 'zh_tw' ? 'zh-tw' : l)
},
[router, pathname, query, asPath, setSavedLanguage]
)
2022-11-24 18:39:14 -08:00
return (
<>
<h2 className="mb-4 text-base">{t('settings:display')}</h2>
<div className="flex flex-col border-t border-th-bkg-3 py-4 md:flex-row md:items-center md:justify-between md:px-4">
2022-12-05 14:33:36 -08:00
<p className="mb-2 md:mb-0">{t('settings:theme')}</p>
2022-11-30 21:21:28 -08:00
<div className="w-full min-w-[140px] md:w-auto">
<Select
value={theme}
onChange={(t) => setTheme(t)}
className="w-full"
>
2022-12-16 03:26:42 -08:00
{THEMES.map((theme) => (
<Select.Option key={theme} value={t(`settings:${theme}`)}>
{t(`settings:${theme}`)}
2022-11-30 21:21:28 -08:00
</Select.Option>
))}
</Select>
2022-11-24 18:39:14 -08:00
</div>
</div>
2023-04-17 11:03:35 -07:00
<div className="flex flex-col border-t border-th-bkg-3 py-4 md:flex-row md:items-center md:justify-between md:px-4">
2022-12-05 14:33:36 -08:00
<p className="mb-2 md:mb-0">{t('settings:language')}</p>
2023-04-17 16:17:23 -07:00
<div className="w-full min-w-[220px] md:w-auto md:pl-4">
2022-11-24 18:39:14 -08:00
<ButtonGroup
activeValue={savedLanguage}
onChange={(l) => handleLangChange(l)}
values={LANGS.map((val) => val.locale)}
names={LANGS.map((val) => t(`settings:${val.name}`))}
/>
</div>
2023-04-17 11:03:35 -07:00
</div>
2023-02-13 17:57:06 -08:00
<div className="hidden border-t border-th-bkg-3 py-4 md:flex md:flex-row md:items-center md:justify-between md:px-4">
2022-12-05 14:33:36 -08:00
<p className="mb-2 md:mb-0">{t('settings:notification-position')}</p>
<div className="w-full min-w-[140px] md:w-auto">
<Select
value={t(`settings:${notificationPosition}`)}
2022-11-24 18:39:14 -08:00
onChange={(p) => setNotificationPosition(p)}
className="w-full"
>
{NOTIFICATION_POSITIONS.map((val) => (
<Select.Option key={val} value={t(`settings:${val}`)}>
{t(`settings:${val}`)}
</Select.Option>
))}
</Select>
2022-11-24 18:39:14 -08:00
</div>
</div>
<div className="hidden border-t border-th-bkg-3 py-4 md:px-4 lg:flex lg:items-center lg:justify-between">
<p className="mb-2 md:mb-0">{t('settings:trade-layout')}</p>
<div className="flex space-x-3">
<Tooltip content={t('settings:chart-left')}>
2023-03-26 20:11:10 -07:00
<ChartLayoutButton
icon={<ChartOnLeft className="h-auto w-32" />}
position="chartLeft"
onClick={() => setTradeLayout('chartLeft')}
2023-03-26 20:11:10 -07:00
/>
</Tooltip>
<Tooltip content={t('settings:chart-middle-ob-right')}>
2023-03-26 20:11:10 -07:00
<ChartLayoutButton
icon={<ChartMiddleOBRight className="h-auto w-32" />}
position="chartMiddleOBRight"
onClick={() => setTradeLayout('chartMiddleOBRight')}
2023-03-26 20:11:10 -07:00
/>
</Tooltip>
<Tooltip content={t('settings:chart-middle-ob-left')}>
2023-03-26 20:11:10 -07:00
<ChartLayoutButton
icon={<ChartMiddleOBLeft className="h-auto w-32" />}
position="chartMiddleOBLeft"
onClick={() => setTradeLayout('chartMiddleOBLeft')}
2023-03-26 20:11:10 -07:00
/>
</Tooltip>
<Tooltip content={t('settings:chart-right')}>
2023-03-26 20:11:10 -07:00
<ChartLayoutButton
icon={<ChartOnRight className="h-auto w-32" />}
position="chartRight"
onClick={() => setTradeLayout('chartRight')}
2023-03-26 20:11:10 -07:00
/>
</Tooltip>
</div>
</div>
2022-11-24 18:39:14 -08:00
<div className="flex flex-col border-t border-th-bkg-3 py-4 md:flex-row md:items-center md:justify-between md:px-4">
2022-12-05 14:33:36 -08:00
<p className="mb-2 md:mb-0">{t('settings:swap-trade-size-selector')}</p>
2022-11-24 18:39:14 -08:00
<div className="w-full min-w-[160px] md:w-auto">
<ButtonGroup
activeValue={tradeFormUi}
onChange={(v) => setTradeFormUi(v)}
values={TRADE_FORM_UI}
names={TRADE_FORM_UI.map((val) => t(`settings:${val}`))}
2022-11-24 18:39:14 -08:00
/>
</div>
</div>
2022-12-06 09:35:15 -08:00
<div className="flex flex-col border-t border-th-bkg-3 py-4 md:flex-row md:items-center md:justify-between md:px-4">
2022-12-22 02:04:38 -08:00
<p className="mb-2 lg:mb-0">{t('settings:trade-chart')}</p>
<div className="w-full min-w-[220px] md:w-auto">
2022-12-06 09:35:15 -08:00
<ButtonGroup
activeValue={tradeChartUi}
onChange={(v) => setTradeChartUi(v)}
values={TRADING_CHARTS}
names={TRADING_CHARTS.map((val) => t(`settings:${val}`))}
2022-12-06 09:35:15 -08:00
/>
</div>
</div>
2022-11-24 18:39:14 -08:00
</>
)
}
export default DisplaySettings
2023-03-26 20:11:10 -07:00
const ChartLayoutButton = ({
onClick,
icon,
position,
}: {
onClick: (l: TradeLayout) => void
icon: ReactNode
position: TradeLayout
}) => {
const [tradeLayout] = useLocalStorageState(TRADE_LAYOUT_KEY, 'chartLeft')
return (
<button
className={`flex h-max items-center justify-center rounded border ${
tradeLayout === position
? 'border-th-active'
: 'border-th-bkg-4 md:hover:border-th-fgd-4'
} p-0.5 focus-visible:border-th-fgd-4`}
2023-03-26 20:11:10 -07:00
onClick={() => onClick(position)}
>
{icon}
</button>
)
}