172 lines
4.5 KiB
TypeScript
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>
|
|
);
|
|
}
|