telegram-files/web/src/components/settings-form.tsx
2025-01-07 23:10:27 +08:00

211 lines
7.9 KiB
TypeScript

import {Bell, Copy} from "lucide-react";
import { Label } from "@/components/ui/label";
import { Checkbox } from "@/components/ui/checkbox";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import React, { type FormEvent } from "react";
import { useSettings } from "@/hooks/use-settings";
import { useTelegramAccount } from "@/hooks/use-telegram-account";
import {useCopyToClipboard} from "@/hooks/use-copy-to-clipboard";
export default function SettingsForm() {
const { settings, setSetting, updateSettings } = useSettings();
const { account } = useTelegramAccount();
const [, copyToClipboard] = useCopyToClipboard();
const imageLoadSizeOptions = [
{ value: "s", label: "box 100x100" },
{ value: "m", label: "box 320x320" },
{ value: "x", label: "box 800x800" },
{ value: "y", label: "box 1280x1280" },
{ value: "w", label: "box 2560x2560" },
{ value: "a", label: "crop 160x160" },
{ value: "b", label: "crop 320x320" },
{ value: "c", label: "crop 640x640" },
{ value: "d", label: "crop 1280x1280" },
];
const avgSpeedIntervalOptions = [
{ value: "60", label: "1 minute" },
{ value: "300", label: "5 minutes" },
{ value: "600", label: "10 minutes" },
{ value: "900", label: "15 minutes" },
{ value: "1800", label: "30 minutes" },
];
const handleSave = async (e: FormEvent) => {
e.preventDefault();
await updateSettings();
};
return (
<form
onSubmit={handleSave}
className="flex h-full flex-col overflow-hidden"
>
<div className="flex flex-col space-y-4 overflow-y-scroll">
<p className="rounded-md bg-gray-50 p-2 text-sm text-muted-foreground shadow">
<Bell className="mr-2 inline-block h-4 w-4" />
These settings will be applied to all accounts.
</p>
<div className="w-full rounded-md border p-4 shadow">
<p className="mb-1 text-xs text-muted-foreground">Your root path</p>
<div className="flex items-center justify-between space-x-1">
<p className="bg-gray-50 rounded-md p-2 text-xs text-muted-foreground">
{account?.rootPath}
</p>
<Button
variant="ghost"
size="sm"
onClick={(e) => {
e.preventDefault();
void copyToClipboard(account?.rootPath ?? "");
}}
>
<Copy className="h-4 w-4" />
</Button>
</div>
</div>
<div className="flex w-full flex-col space-y-4 rounded-md border p-4 shadow">
<div className="flex items-center space-x-2">
<Label htmlFor="unique-only">Unique Only</Label>
<Checkbox
id="unique-only"
checked={settings?.uniqueOnly === "true"}
onCheckedChange={(checked) =>
void setSetting("uniqueOnly", String(checked))
}
/>
</div>
<p className="text-xs text-muted-foreground">
Show only unique file in the table. If disabled, will show all.{" "}
<br />
<strong>Warning:</strong> If enabled, the number of documents on the
form will be inaccurate.
</p>
</div>
<div className="flex w-full flex-col space-y-4 rounded-md border p-4 shadow">
<div className="flex items-center space-x-2">
<Label htmlFor="need-load-preview-images">
Need Load Preview Images
</Label>
<Checkbox
id="need-load-preview-images"
checked={settings?.needToLoadImages === "true"}
onCheckedChange={(checked) => {
void setSetting("needToLoadImages", String(checked));
}}
/>
</div>
{settings?.needToLoadImages === "true" && (
<div className="space-y-2">
<Label htmlFor="image-load-size">Load Size</Label>
<Select
value={settings.imageLoadSize}
onValueChange={(v) => void setSetting("imageLoadSize", v)}
>
<SelectTrigger id="image-load-size">
<SelectValue placeholder="Select Image Load Size" />
</SelectTrigger>
<SelectContent>
{imageLoadSizeOptions.map((option) => (
<SelectItem key={option.value} value={option.value}>
{option.label}
</SelectItem>
))}
</SelectContent>
</Select>
<p className="text-xs text-muted-foreground">
The size of the image to load in the browser.
</p>
</div>
)}
</div>
<div className="flex w-full flex-col space-y-4 rounded-md border p-4 shadow">
<div className="flex items-center space-x-2">
<Label htmlFor="always-hide">Always Hide</Label>
<Checkbox
id="always-hide"
checked={settings?.alwaysHide === "true"}
onCheckedChange={(checked) =>
void setSetting("alwaysHide", String(checked))
}
/>
</div>
<p className="text-xs text-muted-foreground">
Always hide content and extra info in the table.
</p>
{settings?.alwaysHide === "false" && (
<>
<div className="flex items-center space-x-2">
<Label htmlFor="show-sensitive-content">
Show Sensitive Content
</Label>
<Checkbox
id="show-sensitive-content"
checked={settings?.showSensitiveContent === "true"}
onCheckedChange={(checked) =>
void setSetting("showSensitiveContent", String(checked))
}
/>
</div>
<p className="text-xs text-muted-foreground">
Show sensitive content in the table, Will use a spoiler to hide
sensitive content if disabled.
</p>
</>
)}
</div>
<div className="flex w-full flex-col space-y-4 rounded-md border p-4 shadow">
<Label>Auto Download Settings</Label>
<div className="flex flex-col space-y-2">
<Label htmlFor="limit">Limit Per Account</Label>
<Input
id="limit"
className="w-24"
type="number"
min={1}
max={10}
value={settings?.autoDownloadLimit ?? 5}
onChange={(e) => {
void setSetting("autoDownloadLimit", e.target.value);
}}
/>
</div>
<div className="flex flex-col space-y-2">
<Label htmlFor="avg-speed-interval">Avg Speed Interval</Label>
<Select
value={String(settings?.avgSpeedInterval)}
onValueChange={(v) => void setSetting("avgSpeedInterval", v)}
>
<SelectTrigger id="avg-speed-interval">
<SelectValue placeholder="Select Avg Speed Interval" />
</SelectTrigger>
<SelectContent>
{avgSpeedIntervalOptions.map((option) => (
<SelectItem key={option.value} value={option.value}>
{option.label}
</SelectItem>
))}
</SelectContent>
</Select>
<p className="text-xs text-muted-foreground">
The interval to calculate the average download speed. <br />
Longer intervals may consume more memory.
</p>
</div>
</div>
</div>
<div className="mt-2 flex flex-1 justify-end">
<Button type="submit">Submit</Button>
</div>
</form>
);
}