ghost-portal/packages/page-settings/src/General.tsx
Jaco Greeff 33892a2e31
Nav re-imagined (#3422)
* 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.
2020-08-20 17:50:30 +02:00

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);