stoat-for-desktop/components/app/interface/settings/user/Native.tsx

172 lines
4.5 KiB
TypeScript

import { createSignal, onMount } from "solid-js";
import { Trans, useLingui } from "@lingui-solid/solid/macro";
import { CategoryButton, Checkbox, Column } from "@revolt/ui";
import { Symbol } from "@revolt/ui/components/utils/Symbol";
declare type DesktopConfig = {
firstLaunch: boolean;
customFrame: boolean;
minimiseToTray: boolean;
spellchecker: boolean;
hardwareAcceleration: boolean;
discordRpc: boolean;
windowState: {
isMaximised: boolean;
};
};
declare global {
interface Window {
native: {
versions: {
node(): string;
chrome(): string;
electron(): string;
desktop(): string;
};
minimise(): void;
maximise(): void;
close(): void;
};
desktopConfig: {
get(): DesktopConfig;
set(config: Partial<DesktopConfig>): void;
getAutostart(): Promise<boolean>;
setAutostart(value: boolean): Promise<boolean>;
};
}
}
/**
* Desktop Configuration Page
*/
export default function Native() {
const { t } = useLingui();
const [autostart, setAutostart] = createSignal(false);
const [config, setConfig] = createSignal(window.desktopConfig.get());
function set(config: Partial<DesktopConfig>) {
window.desktopConfig.set(config);
setConfig((conf) => ({ ...conf, ...config }));
}
onMount(async () => {
const value = await window.desktopConfig.getAutostart();
setAutostart(value);
});
async function toggleAutostart() {
const newValue = !autostart();
const savedValue = await window.desktopConfig.setAutostart(newValue);
setAutostart(savedValue);
}
const toggles: Partial<Record<keyof DesktopConfig, () => void>> = {
minimiseToTray: () => set({ minimiseToTray: !config().minimiseToTray }),
customFrame: () => set({ customFrame: !config().customFrame }),
discordRpc: () => set({ discordRpc: !config().discordRpc }),
spellchecker: () => set({ spellchecker: !config().spellchecker }),
hardwareAcceleration: () =>
set({ hardwareAcceleration: !config().hardwareAcceleration }),
};
function CheckboxButton<K extends keyof DesktopConfig>(
key: K,
icon: string,
label: string,
description: string,
) {
return (
<CategoryButton
action={
<Checkbox
checked={config()[key]}
onClick={(e) => e.stopPropagation()}
onChange={(e) => {
e.stopPropagation();
toggles[key]!();
}}
/>
}
onClick={toggles[key]}
icon={<Symbol>{icon}</Symbol>}
description={description}
>
{label}
</CategoryButton>
);
}
return (
<Column gap="lg">
<CategoryButton.Group>
<CategoryButton
action={
<Checkbox
checked={autostart()}
onClick={(e) => e.stopPropagation()}
onChange={toggleAutostart}
/>
}
onClick={toggleAutostart}
icon={<Symbol>exit_to_app</Symbol>}
description={
<Trans>Launch Stoat when you log into your computer.</Trans>
}
>
<Trans>Start with Computer</Trans>
</CategoryButton>
{CheckboxButton(
"minimiseToTray",
"cancel_presentation",
t`Minimise to Tray`,
t`Instead of closing, Stoat will hide in your tray.`,
)}
{CheckboxButton(
"customFrame",
"web_asset",
t`Custom window frame`,
t`Let Stoat use its own custom titlebar.`,
)}
</CategoryButton.Group>
<CategoryButton.Group>
{CheckboxButton(
"discordRpc",
"groups_2",
t`Discord RPC`,
t`Rep Stoat using Discord rich presence.`,
)}
{CheckboxButton(
"spellchecker",
"spellcheck",
t`Spellchecker`,
t`Show corrections and suggestions as you type.`,
)}
{CheckboxButton(
"hardwareAcceleration",
"speed",
t`Hardware Acceleration`,
t`Use the graphics card to improve performance.`,
)}
</CategoryButton.Group>
<CategoryButton.Group>
<CategoryButton
icon={<Symbol>desktop_windows</Symbol>}
description={
<>
<Trans>Version:</Trans> {window.native.versions.desktop()}
</>
}
>
<Trans>Stoat for Desktop</Trans>
</CategoryButton>
</CategoryButton.Group>
</Column>
);
}