import {Translatable} from "tc-shared/ui/react-elements/i18n"; import * as React from "react"; import {createContext, useContext, useRef, useState} from "react"; import {IpcRegistryDescription, Registry} from "tc-shared/events"; import {ModalGlobalSettingsEditorEvents, Setting} from "tc-shared/ui/modal/global-settings-editor/Definitions"; import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots"; import {FlatInputField} from "tc-shared/ui/react-elements/InputField"; import {AbstractModal} from "tc-shared/ui/react-elements/modal/Definitions"; const ModalEvents = createContext>(undefined); const cssStyle = require("./Renderer.scss"); const SettingInfoRenderer = (props: { children: [React.ReactNode, React.ReactNode ], className?: string }) => (
{props.children[0]}
{props.children[1]}
); const SettingEditor = () => { const events = useContext(ModalEvents); const [ isApplying, setApplying ] = useState(false); const [ currentValue, setCurrentValue ] = useState(); const [ currentSetting, setCurrentSetting ] = useState(undefined); const currentSettingKey = useRef(); events.reactUse("notify_selected_setting", event => { if(event.setting === currentSettingKey.current) { return; } currentSettingKey.current = event.setting; events.fire("query_setting", { setting: event.setting }); }); events.reactUse("notify_setting", event => { if(event.setting !== currentSettingKey.current) { return; } setApplying(false); if(event.status === "not-found") { setCurrentSetting("not-found"); } else { setCurrentValue(event.value); setCurrentSetting(event.info); } }); events.reactUse("action_set_value", event => { if(event.setting !== currentSettingKey.current) { return; } setApplying(true); }); events.reactUse("notify_setting_value", event => { if(event.setting !== currentSettingKey.current) { return; } setApplying(false); setCurrentValue(event.value); }); if(currentSetting === "not-found") { return null; } else if(!currentSetting) { return null; } return (
Setting key {currentSetting.key} Description {currentSetting.description} Default Value {typeof currentSetting.defaultValue !== "undefined" ? (currentSetting.defaultValue + "") : tr("unset")} Value { setCurrentValue(text); }} finishOnEnter={true} onBlur={() => { events.fire("action_set_value", { setting: currentSettingKey.current, value: currentValue }); }} />
); } const SettingEntryRenderer = (props: { setting: Setting, selected: boolean }) => { const events = useContext(ModalEvents); return (
events.fire("action_select_setting", { setting: props.setting.key })}> {props.setting.key}
); } const SettingList = () => { const events = useContext(ModalEvents); const [ settings, setSettings ] = useState<"loading" | Setting[]>(() => { events.fire("query_settings"); return "loading"; }); const [ selectedSetting, setSelectedSetting ] = useState(undefined); const [ filter, setFilter ] = useState(undefined); events.reactUse("notify_settings", event => setSettings(event.settings)); events.reactUse("notify_selected_setting", event => setSelectedSetting(event.setting)); events.reactUse("action_set_filter", event => setFilter((event.filter || "").toLowerCase())); return (
{settings === "loading" ? undefined : settings.map(setting => { filterBlock: if(filter) { if(setting.key.toLowerCase().indexOf(filter) !== -1) { break filterBlock; } if(setting.description && setting.description.toLowerCase().indexOf(filter) !== -1) { break filterBlock; } return undefined; } return ; }) }
events.fire("action_set_filter", { filter: text })} placeholder={tr("Filter settings")} />
); } class ModalGlobalSettingsEditor extends AbstractModal { protected readonly events: Registry; constructor(events: IpcRegistryDescription) { super(); this.events = Registry.fromIpcDescription(events); } renderBody(): React.ReactElement { return ( ); } renderTitle(): string | React.ReactElement { return Global settings registry; } } export = ModalGlobalSettingsEditor;