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 && (
)}
{!isCreating && !selectedPrompt && (
{hasPrompts
? t("settings.postProcessing.prompts.selectToEdit")
: t("settings.postProcessing.prompts.createFirst")}
)}
{isCreating && (
)}
);
};
export const PostProcessingSettingsApi = React.memo(
PostProcessingSettingsApiComponent,
);
PostProcessingSettingsApi.displayName = "PostProcessingSettingsApi";
export const PostProcessingSettingsPrompts = React.memo(
PostProcessingSettingsPromptsComponent,
);
PostProcessingSettingsPrompts.displayName = "PostProcessingSettingsPrompts";
export const PostProcessingSettings: React.FC = () => {
const { t } = useTranslation();
return (
);
};