import React, { useEffect, useState, useCallback } from 'react'
import { Link, useNavigate } from 'react-router-dom'
import * as rb from 'react-bootstrap'
import { useTranslation } from 'react-i18next'
import Sprite from './Sprite'
import Seedphrase from './Seedphrase'
import ToggleSwitch from './ToggleSwitch'
import Alert from './Alert'
import { ConfirmModal } from './Modal'
import { useSettings, useSettingsDispatch } from '../context/SettingsContext'
import { useCurrentWallet } from '../context/WalletContext'
import { useServiceInfo } from '../context/ServiceInfoContext'
import { SATS, BTC, walletDisplayName } from '../utils'
import * as Api from '../libs/JmWalletApi'
import { routes } from '../constants/routes'
import languages from '../i18n/languages'
import styles from './Settings.module.css'
function SeedModal({ show = false, onHide }) {
const { t } = useTranslation()
const currentWallet = useCurrentWallet()
const [revealSeed, setRevealSeed] = useState(false)
const [seedError, setSeedError] = useState(false)
const [seed, setSeed] = useState(null)
const [isLoading, setIsLoading] = useState(true)
useEffect(() => {
const loadSeed = async () => {
setIsLoading(true)
try {
const { name: walletName, token } = currentWallet
const res = await Api.getWalletSeed({ walletName, token })
const { seedphrase } = await (res.ok ? res.json() : Api.Helper.throwError(res))
setIsLoading(false)
setSeed(seedphrase)
} catch (e) {
setIsLoading(false)
setSeedError(true)
}
}
if (show) {
loadSeed()
}
}, [show, currentWallet])
return (
{walletDisplayName(currentWallet.name)}
<>
{isLoading && (
)}
{seedError && (
{t('settings.error_loading_seed_failed')}
)}
{seed && (
<>
{t('settings.seed_modal_info_text')}
setRevealSeed(isToggled)}
/>
>
)}
>
)
}
export default function Settings({ stopWallet }) {
const [showingSeed, setShowingSeed] = useState(false)
const [lockingWallet, setLockingWallet] = useState(false)
const [showConfirmLockModal, setShowConfirmLockModal] = useState(null)
const [alert, setAlert] = useState(null)
const { t } = useTranslation()
const settings = useSettings()
const settingsDispatch = useSettingsDispatch()
const { i18n } = useTranslation()
const currentWallet = useCurrentWallet()
const navigate = useNavigate()
const serviceInfo = useServiceInfo()
const setTheme = (theme) => {
if (window.JM.THEMES.includes(theme)) {
document.documentElement.setAttribute(window.JM.THEME_ROOT_ATTR, theme)
settingsDispatch({ theme })
}
}
const isSats = settings.unit === SATS
const isLightTheme = settings.theme === window.JM.THEMES[0]
const lockWallet = useCallback(
async ({ force, destination }) => {
if (!force && (serviceInfo.coinjoinInProgress || serviceInfo.makerRunning)) {
setShowConfirmLockModal({ destination })
return
}
setLockingWallet(true)
try {
const { name: walletName, token } = currentWallet
const res = await Api.getWalletLock({ walletName, token })
setLockingWallet(false)
if (res.ok || res.status === 401) {
stopWallet()
navigate(destination)
} else {
await Api.Helper.throwError(res)
}
} catch (e) {
setLockingWallet(false)
setAlert({ variant: 'danger', dismissible: false, message: e.message })
}
},
[currentWallet, stopWallet, navigate, serviceInfo]
)
return (
{t('settings.title')}
{alert &&
}
setShowConfirmLockModal(null)}
onConfirm={() => {
setShowConfirmLockModal(null)
lockWallet({ force: true, destination: showConfirmLockModal?.destination })
}}
/>
settingsDispatch({ showBalance: !settings.showBalance })}
>
{settings.showBalance ? t('settings.hide_balance') : t('settings.show_balance')}
settingsDispatch({ unit: isSats ? BTC : SATS })}
>
{isSats ? t('settings.use_btc') : t('settings.use_sats')}
setTheme(isLightTheme ? window.JM.THEMES[1] : window.JM.THEMES[0])}
>
{isLightTheme ? t('settings.use_dark_theme') : t('settings.use_light_theme')}
settingsDispatch({ useAdvancedWalletMode: !settings.useAdvancedWalletMode })}
>
{settings.useAdvancedWalletMode ? t('settings.use_normal_mode') : t('settings.use_dev_mode')}
{languages.find((lng) => lng.key === (i18n.resolvedLanguage || i18n.language))?.description ||
languages[0].description}
{languages.map((lng, index) => {
return (
i18n.changeLanguage(lng.key)}>
{lng.description}
)
})}
{t('settings.text_help_translate')}
{t('settings.section_title_wallet')}
setShowingSeed(true)}>
{showingSeed ? t('settings.hide_seed') : t('settings.show_seed')}
{showingSeed && setShowingSeed(false)} />}
lockWallet({ force: false, destination: routes.walletList })}
>
{lockingWallet ? (
<>
{t('settings.button_locking_wallet')}
>
) : (
<>
{t('settings.button_lock_wallet')}
>
)}
{t('settings.button_switch_wallet')}
lockWallet({ force: false, destination: routes.createWallet })}
>
{lockingWallet ? (
<>
{t('settings.button_locking_wallet')}
>
) : (
<>
{t('settings.button_create_wallet')}
>
)}
{t('settings.section_title_community')}
)
}