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_switch_wallet')} lockWallet({ force: false, destination: routes.createWallet })} > {lockingWallet ? ( <>
{t('settings.section_title_community')}
{t('settings.github')}
{t('settings.telegram')}
{t('settings.jm_twitter')}
) }