Files
dmgnr 38fa0bc45b chore: upgrade Next.js 16.2.6 to 16.4.0
Move to the newer stable same-major release for current Next.js fixes and improvements. Update the pinned dependency and lockfile, align Bun and build configuration, and adjust compatibility changes in settings, health, error, donate, and rubgram routes.
2026-10-09 10:42:11 +00:00

117 lines
3.5 KiB
TypeScript
Executable File

"use client";
import { Bomb, FolderSync } from "lucide-react";
import { useState } from "react";
import { ActionButton } from "@/components/action-button";
import { CdnChooser } from "@/components/chooser";
import { Input } from "@/components/ui/input";
import { Switch } from "@/components/ui/switch";
import { shared } from "@/lib/comms";
import {
forceRefresh,
syncAmber,
toggleDonatePaymentMethod,
toggleEnka,
} from "./api";
import { Broadcaster } from "./broadcaster";
import { Section } from "./section";
export function SettingsServicesSection({
enka: enkaInitial,
donPp: initialDonPp,
donTmn: initialDonTmn,
}: {
enka: boolean;
donPp: boolean;
donTmn: boolean;
}) {
const [syncResult, setSyncResult] = useState("");
const [enka, setEnka] = useState<boolean>(enkaInitial);
const [donPp, setDonPp] = useState<boolean>(initialDonPp);
const [donTmn, setDonTmn] = useState<boolean>(initialDonTmn);
const [pathToReload, setPathToReload] = useState("");
const [debug] = shared.state("debug");
async function sync() {
return syncAmber().then(setSyncResult);
}
return (
<Section title="บริการนอก">
<div className="flex h-full flex-col gap-2">
<div className="flex items-center gap-2">
<Switch
checked={enka}
onCheckedChange={(v) => (
setEnka(v),
toggleEnka(v).then(forceRefresh.bind(null, "/artifact"))
)}
/>
เปิดใช้การดึงตัวละครใน Artifact
</div>
<div className="flex items-center gap-2">
<ActionButton action={sync}>
<FolderSync />
Sync Amber
</ActionButton>
<ActionButton action={forceRefresh} variant="destructive">
<Bomb />
FORCE RELOAD
</ActionButton>
</div>
<div className="flex items-center gap-2">
<Input
placeholder="/path/prefix/to/reload"
className="w-60"
onChange={(v) => setPathToReload(v.target.value)}
/>
<ActionButton
action={forceRefresh.bind(null, pathToReload)}
variant="destructive"
>
<Bomb />
Reload
</ActionButton>
</div>
<span>Donate Payment Method</span>
<div className="flex items-center gap-2">
<Switch
checked={donPp}
onCheckedChange={(v) => (
setDonPp(v),
toggleDonatePaymentMethod("donatePromptpay", v).then(
forceRefresh.bind(null, "/donate"),
)
)}
/>
Promptpay
</div>
<div className="flex items-center gap-2">
<Switch
checked={donTmn}
onCheckedChange={(v) => (
setDonTmn(v),
toggleDonatePaymentMethod("donateTruemoney", v).then(
forceRefresh.bind(null, "/donate"),
)
)}
/>
Truemoney
</div>
{debug && (
<div className="grid w-fit gap-1 rounded-sm border border-dashed p-1">
<span className="text-sm text-muted-foreground">
Test file input
</span>
<CdnChooser onChange={alert} />
</div>
)}
{syncResult && (
<pre className="h-full rounded border bg-muted p-2">{syncResult}</pre>
)}
<Broadcaster />
</div>
</Section>
);
}