import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { RefreshCcw } from "lucide-react"; import { commands } from "@/bindings"; import { Alert } from "../../ui/Alert"; import { Dropdown, SettingContainer, SettingsGroup, Textarea, } from "@/components/ui"; import { Button } from "../../ui/Button"; import { ResetButton } from "../../ui/ResetButton"; import { Input } from "../../ui/Input"; import { ProviderSelect } from "../PostProcessingSettingsApi/ProviderSelect"; import { BaseUrlField } from "../PostProcessingSettingsApi/BaseUrlField"; import { ApiKeyField } from "../PostProcessingSettingsApi/ApiKeyField"; import { ModelSelect } from "../PostProcessingSettingsApi/ModelSelect"; import { usePostProcessProviderState } from "../PostProcessingSettingsApi/usePostProcessProviderState"; import { ShortcutInput } from "../ShortcutInput"; import { useSettings } from "../../../hooks/useSettings"; const PostProcessingSettingsApiComponent: React.FC = () => { const { t } = useTranslation(); const state = usePostProcessProviderState(); return ( <>
{state.isAppleProvider ? ( state.appleIntelligenceUnavailable ? ( {t("settings.postProcessing.api.appleIntelligence.unavailable")} ) : null ) : ( <> {state.selectedProvider?.id === "custom" && (
)}
)} {!state.isAppleProvider && (
0 ? t( "settings.postProcessing.api.model.placeholderWithOptions", ) : t("settings.postProcessing.api.model.placeholderNoOptions") } onSelect={state.handleModelSelect} onCreate={state.handleModelCreate} onBlur={() => {}} className="flex-1 min-w-[380px]" />
)} ); }; const PostProcessingSettingsPromptsComponent: React.FC = () => { const { t } = useTranslation(); const { getSetting, updateSetting, isUpdating, refreshSettings } = useSettings(); const [isCreating, setIsCreating] = useState(false); const [draftName, setDraftName] = useState(""); const [draftText, setDraftText] = useState(""); const prompts = getSetting("post_process_prompts") || []; const selectedPromptId = getSetting("post_process_selected_prompt_id") || ""; const selectedPrompt = prompts.find((prompt) => prompt.id === selectedPromptId) || null; useEffect(() => { if (isCreating) return; if (selectedPrompt) { setDraftName(selectedPrompt.name); setDraftText(selectedPrompt.prompt); } else { setDraftName(""); setDraftText(""); } }, [ isCreating, selectedPromptId, selectedPrompt?.name, selectedPrompt?.prompt, ]); const handlePromptSelect = (promptId: string | null) => { if (!promptId) return; updateSetting("post_process_selected_prompt_id", promptId); setIsCreating(false); }; const handleCreatePrompt = async () => { if (!draftName.trim() || !draftText.trim()) return; try { const result = await commands.addPostProcessPrompt( draftName.trim(), draftText.trim(), ); if (result.status === "ok") { await refreshSettings(); updateSetting("post_process_selected_prompt_id", result.data.id); setIsCreating(false); } } catch (error) { console.error("Failed to create prompt:", error); } }; const handleUpdatePrompt = async () => { if (!selectedPromptId || !draftName.trim() || !draftText.trim()) return; try { await commands.updatePostProcessPrompt( selectedPromptId, draftName.trim(), draftText.trim(), ); await refreshSettings(); } catch (error) { console.error("Failed to update prompt:", error); } }; const handleDeletePrompt = async (promptId: string) => { if (!promptId) return; try { await commands.deletePostProcessPrompt(promptId); await refreshSettings(); setIsCreating(false); } catch (error) { console.error("Failed to delete prompt:", error); } }; const handleCancelCreate = () => { setIsCreating(false); if (selectedPrompt) { setDraftName(selectedPrompt.name); setDraftText(selectedPrompt.prompt); } else { setDraftName(""); setDraftText(""); } }; const handleStartCreate = () => { setIsCreating(true); setDraftName(""); setDraftText(""); }; const hasPrompts = prompts.length > 0; const isDirty = !!selectedPrompt && (draftName.trim() !== selectedPrompt.name || draftText.trim() !== selectedPrompt.prompt.trim()); return (
({ value: p.id, label: p.name, }))} onSelect={(value) => handlePromptSelect(value)} placeholder={ prompts.length === 0 ? t("settings.postProcessing.prompts.noPrompts") : t("settings.postProcessing.prompts.selectPrompt") } disabled={ isUpdating("post_process_selected_prompt_id") || isCreating } className="flex-1" />
{!isCreating && hasPrompts && selectedPrompt && (
setDraftName(e.target.value)} placeholder={t( "settings.postProcessing.prompts.promptLabelPlaceholder", )} variant="compact" />