* Playthrough with top navigation * Sycky, but navigation works... * Adjust * grouping * It works, but is not great * Cleanups * Cleanups * hover color * Highlights * Highlights, part 2 * Background to body * Small adjustments (size, items) * Localize Modal/route switching * Remove light/full mode * Flatter single-entry menus * Adjustments for single-enrties (e.g. Kulupu) * Display NodeInfo * Misc * Content & Tabs sizing * Tab counters as bubbles * Alignment * Tabs styling * Adjust font color to defaults * Small tabs menu color adjustments * ... the previous, again, adjusted * Display Wiki/Github links * ar motions * Adjust Endpoints location * Ensure content grows to available height * Adjust tabs * Menu background adjustment * Adjust popup colors * Adjust highlights * Sligh breathing room * Adaptive header background * 2/3 * Adaptive is ok... for now. * Back to black... erm, gray * Lighten * Touchups. Stop playin, it is ok... * Sides readability * Cleanups. * Adjust. * Overall adjustments (theme). Fix Tag yellow. * Ok. Done. * Ship it.
136 lines
4.0 KiB
TypeScript
136 lines
4.0 KiB
TypeScript
// Copyright 2017-2020 @polkadot/app-settings authors & contributors
|
|
// This software may be modified and distributed under the terms
|
|
// of the Apache-2.0 license. See the LICENSE file for details.
|
|
|
|
import { Option } from '@polkadot/apps-config/settings/types';
|
|
|
|
import React, { useCallback, useEffect, useState, useMemo } from 'react';
|
|
import { createLanguages, createSs58 } from '@polkadot/apps-config/settings';
|
|
import { isLedgerCapable } from '@polkadot/react-api';
|
|
import { Button, Dropdown } from '@polkadot/react-components';
|
|
import uiSettings, { SettingsStruct } from '@polkadot/ui-settings';
|
|
|
|
import { useTranslation } from './translate';
|
|
import { createIdenticon, createOption, save, saveAndReload } from './util';
|
|
|
|
interface Props {
|
|
className?: string;
|
|
}
|
|
|
|
const ledgerConnOptions = uiSettings.availableLedgerConn;
|
|
|
|
function General ({ className = '' }: Props): React.ReactElement<Props> {
|
|
const { t } = useTranslation();
|
|
// tri-state: null = nothing changed, false = no reload, true = reload required
|
|
const [changed, setChanged] = useState<boolean | null>(null);
|
|
const [settings, setSettings] = useState(uiSettings.get());
|
|
|
|
const iconOptions = useMemo(
|
|
() => uiSettings.availableIcons.map((o): Option => createIdenticon(o, ['default'])),
|
|
[]
|
|
);
|
|
|
|
const prefixOptions = useMemo(
|
|
() => createSs58(t).map((o): Option | React.ReactNode => createOption(o, ['default'])),
|
|
[t]
|
|
);
|
|
|
|
const translateLanguages = useMemo(
|
|
() => createLanguages(t),
|
|
[t]
|
|
);
|
|
|
|
useEffect((): void => {
|
|
const prev = uiSettings.get() as unknown as Record<string, unknown>;
|
|
const hasChanges = Object.entries(settings).some(([key, value]) => prev[key] !== value);
|
|
const needsReload = prev.apiUrl !== settings.apiUrl || prev.prefix !== settings.prefix;
|
|
|
|
setChanged(
|
|
hasChanges
|
|
? needsReload
|
|
: null
|
|
);
|
|
}, [settings]);
|
|
|
|
const _handleChange = useCallback(
|
|
(key: keyof SettingsStruct) => <T extends string | number>(value: T): void =>
|
|
setSettings((settings) => ({ ...settings, [key]: value })),
|
|
[]
|
|
);
|
|
|
|
const _saveAndReload = useCallback(
|
|
() => saveAndReload(settings),
|
|
[settings]
|
|
);
|
|
|
|
const _save = useCallback(
|
|
(): void => {
|
|
save(settings);
|
|
setChanged(null);
|
|
},
|
|
[settings]
|
|
);
|
|
|
|
const { i18nLang, icon, ledgerConn, prefix } = settings;
|
|
|
|
return (
|
|
<div className={className}>
|
|
<div className='ui--row'>
|
|
<Dropdown
|
|
defaultValue={prefix}
|
|
help={t<string>('Override the default ss58 prefix for address generation')}
|
|
label={t<string>('address prefix')}
|
|
onChange={_handleChange('prefix')}
|
|
options={prefixOptions}
|
|
/>
|
|
</div>
|
|
<div className='ui--row'>
|
|
<Dropdown
|
|
defaultValue={icon}
|
|
help={t<string>('Override the default identity icon display with a specific theme')}
|
|
label={t<string>('default icon theme')}
|
|
onChange={_handleChange('icon')}
|
|
options={iconOptions}
|
|
/>
|
|
</div>
|
|
{isLedgerCapable() && (
|
|
<div className='ui--row'>
|
|
<Dropdown
|
|
defaultValue={ledgerConn}
|
|
help={t<string>('Manage your connection to Ledger S')}
|
|
label={t<string>('manage hardware connections')}
|
|
onChange={_handleChange('ledgerConn')}
|
|
options={ledgerConnOptions}
|
|
/>
|
|
</div>
|
|
)}
|
|
<div className='ui--row'>
|
|
<Dropdown
|
|
defaultValue={i18nLang}
|
|
label={t<string>('default interface language')}
|
|
onChange={_handleChange('i18nLang')}
|
|
options={translateLanguages}
|
|
/>
|
|
</div>
|
|
<Button.Group>
|
|
<Button
|
|
icon='save'
|
|
isDisabled={changed === null}
|
|
label={
|
|
changed
|
|
? t<string>('Save & Reload')
|
|
: t<string>('Save')
|
|
}
|
|
onClick={
|
|
changed
|
|
? _saveAndReload
|
|
: _save
|
|
}
|
|
/>
|
|
</Button.Group>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default React.memo(General);
|