"use client"; import { useRouter } from "next/navigation"; import { useState, useTransition } from "react"; import { resetAssistantName, resetAssistantSystemPrompt, setAssistantEnabled, setAssistantName, setAssistantSystemPrompt, } from "@/app/settings/assistant-actions"; import { DEFAULT_ASSISTANT_NAME, MAX_ASSISTANT_NAME_LENGTH } from "@/lib/assistant-config"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Switch } from "@/components/ui/switch"; type Props = { enabled: boolean; name: string; systemPrompt: string | null; defaultSystemPrompt: string; }; export function AssistantSettings({ enabled, name, systemPrompt, defaultSystemPrompt }: Props) { const [isPending, startTransition] = useTransition(); const router = useRouter(); const effectivePrompt = systemPrompt ?? defaultSystemPrompt; const [savedName, setSavedName] = useState(name); const [draftName, setDraftName] = useState(name); const [savedPrompt, setSavedPrompt] = useState(systemPrompt); const [draftPrompt, setDraftPrompt] = useState(effectivePrompt); const nameDirty = draftName.trim() !== savedName; const promptDirty = savedPrompt === null ? draftPrompt.trim() !== defaultSystemPrompt.trim() : draftPrompt.trim() !== savedPrompt.trim(); const usingDefaultPrompt = savedPrompt === null; function toggle(next: boolean) { startTransition(async () => { await setAssistantEnabled(next); router.refresh(); }); } function saveName() { const next = draftName.trim(); if (!next) return; startTransition(async () => { await setAssistantName(next); setSavedName(next); setDraftName(next); router.refresh(); }); } function savePrompt() { const next = draftPrompt.trim(); if (!next) return; startTransition(async () => { const isDefault = next === defaultSystemPrompt.trim(); await setAssistantSystemPrompt(isDefault ? null : next); setSavedPrompt(isDefault ? null : next); setDraftPrompt(next); router.refresh(); }); } function handleResetName() { startTransition(async () => { await resetAssistantName(); setSavedName(DEFAULT_ASSISTANT_NAME); setDraftName(DEFAULT_ASSISTANT_NAME); router.refresh(); }); } function handleResetPrompt() { startTransition(async () => { await resetAssistantSystemPrompt(); setSavedPrompt(null); setDraftPrompt(defaultSystemPrompt); router.refresh(); }); } return (
Shown in the chat bubble and message labels.
Instructions sent to the model before each conversation. Customize tone, priorities, or household context.