From ee79dce340a048478c68197bf5b5f89b9b3fb6cd Mon Sep 17 00:00:00 2001 From: ayrisdev Date: Wed, 2 Sep 2026 15:10:24 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20Ayarlar=20sayfas=C4=B1ndaki=20switch'ler?= =?UTF-8?q?=20kapat=C4=B1l=C4=B1p=20kaydedilince=20kal=C4=B1c=C4=B1=20olmu?= =?UTF-8?q?yordu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Radix Switch'in kendi gizli-input form entegrasyonu bu ortamda Server Action'ın FormData'sına güvenilir şekilde ulaşmıyordu — switch'i "off" yapıp Kaydet'e basınca eski değer kalıcı oluyordu (STT hep otomatik çalışmaya devam ediyordu). Artık her switch kendi değerini doğrudan kontrol eden bir hidden input'la (SettingSwitch) submit ediliyor, Radix'in iç mekanizmasına bağımlı değil. Co-Authored-By: Claude Sonnet 5 --- apps/frontend/app/actions.ts | 6 ++--- .../frontend/app/components/SettingSwitch.tsx | 22 +++++++++++++++++++ apps/frontend/app/settings/page.tsx | 8 +++---- 3 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 apps/frontend/app/components/SettingSwitch.tsx diff --git a/apps/frontend/app/actions.ts b/apps/frontend/app/actions.ts index 57af7f3..b31e410 100644 --- a/apps/frontend/app/actions.ts +++ b/apps/frontend/app/actions.ts @@ -137,7 +137,7 @@ export async function updateSystemSettings(formData: FormData) { } export async function updateSttEnabled(formData: FormData) { - const enabled = formData.get("sttEnabled") === "on"; + const enabled = formData.get("sttEnabled") === "true"; await prisma.appSetting.upsert({ where: { key: "stt_enabled" }, create: { key: "stt_enabled", value: String(enabled) }, @@ -147,8 +147,8 @@ export async function updateSttEnabled(formData: FormData) { } export async function updateNotificationPrefs(formData: FormData) { - const streamStart = formData.get("notifyStreamStart") === "on"; - const renderDone = formData.get("notifyRenderDone") === "on"; + const streamStart = formData.get("notifyStreamStart") === "true"; + const renderDone = formData.get("notifyRenderDone") === "true"; await prisma.appSetting.upsert({ where: { key: "notify_stream_start" }, diff --git a/apps/frontend/app/components/SettingSwitch.tsx b/apps/frontend/app/components/SettingSwitch.tsx new file mode 100644 index 0000000..7cbb571 --- /dev/null +++ b/apps/frontend/app/components/SettingSwitch.tsx @@ -0,0 +1,22 @@ +"use client"; + +import { useState } from "react"; + +import { Switch } from "@/components/ui/switch"; + +/** + * Radix Switch's own hidden-input form integration wasn't reliably reaching + * the Server Action's FormData in this app (toggling off + saving silently + * kept the old value) — this owns the submitted value directly instead of + * depending on that mechanism. + */ +export function SettingSwitch({ name, defaultChecked }: { name: string; defaultChecked: boolean }) { + const [checked, setChecked] = useState(defaultChecked); + + return ( + <> + + + + ); +} diff --git a/apps/frontend/app/settings/page.tsx b/apps/frontend/app/settings/page.tsx index bf93d09..1004675 100644 --- a/apps/frontend/app/settings/page.tsx +++ b/apps/frontend/app/settings/page.tsx @@ -4,7 +4,7 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; -import { Switch } from "@/components/ui/switch"; +import { SettingSwitch } from "../components/SettingSwitch"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle, CardDescription, CardFooter } from "@/components/ui/card"; @@ -110,7 +110,7 @@ export default async function SettingsPage() { @@ -127,11 +127,11 @@ export default async function SettingsPage() {