import { useState, useMemo, useEffect } from "react"; import SectionCard from "./SectionCard"; import Toggle from "./Toggle"; import SaveToast from "./SaveToast"; import useSettings from "../../hooks/useSettings"; const ALL_PROVIDER_OPTIONS = [ { value: "pexels", label: "Pexels" }, { value: "pixabay", label: "Pixabay" }, { value: "unsplash", label: "Unsplash" }, { value: "openverse", label: "Openverse" }, { value: "wikimedia", label: "Wikimedia" }, { value: "giphy", label: "Giphy" }, { value: "openai", label: "OpenAI" }, { value: "gemini", label: "Gemini" }, ]; const config = typeof AI_IMAGE_AdminConfig !== "undefined" ? AI_IMAGE_AdminConfig : {}; const generatorUrl = config.generator_url || ""; /** * Keep an upload dimension inside the 1–9999 range the UI advertises. * * An empty string is preserved so the field can be cleared and retyped; the * server falls back to its default for a blank value. */ function clampDimension(raw) { if (raw === "") return ""; const value = parseInt(raw, 10); if (Number.isNaN(value)) return ""; return Math.min(9999, Math.max(1, value)); } export default function GeneralSection() { const { generalSettings, setGeneralSetting, providerEnabled, saveSettings, saving, resetGeneralSettings, } = useSettings(); const [saveMessage, setSaveMessage] = useState({ type: null, text: "" }); // Filter provider options to only show enabled providers const availableProviders = useMemo(() => { return ALL_PROVIDER_OPTIONS.filter(opt => providerEnabled[opt.value] !== false); }, [providerEnabled]); // Auto-update default provider if current one becomes disabled useEffect(() => { const currentProvider = generalSettings.default_provider; const isCurrentProviderAvailable = availableProviders.some(p => p.value === currentProvider); if (!isCurrentProviderAvailable && availableProviders.length > 0) { setGeneralSetting("default_provider", availableProviders[0].value); } }, [availableProviders, generalSettings.default_provider, setGeneralSetting]); const handleReset = () => { if (confirm("Reset all general settings to default values? This will not save automatically.")) { resetGeneralSettings(); setSaveMessage({ type: "success", text: "Settings reset to defaults. Click 'Save Settings' to apply." }); } }; const handleSave = async () => { setSaveMessage({ type: null, text: "" }); const result = await saveSettings("general"); setSaveMessage({ type: result.success ? "success" : "error", text: result.message, }); }; // Toast handles auto-dismiss return (
{/* Max Upload Width */}

Maximum width in pixels for imported images (1–9999)

setGeneralSetting("max_upload_width", clampDimension(e.target.value))} className="block w-full sm:max-w-xs rounded-md border border-gray-200 px-4 py-2.5 text-sm transition-all outline-none focus:border-indigo-500 focus:ring-0" />
{/* Max Upload Height */}

Maximum height in pixels for imported images (1–9999)

setGeneralSetting("max_upload_height", clampDimension(e.target.value))} className="block w-full sm:max-w-xs rounded-md border border-gray-200 px-4 py-2.5 text-sm transition-all outline-none focus:border-indigo-500 focus:ring-0" />
{/* Default Provider */}

Pre-selected tab when opening the Image Generator.

{availableProviders.length === 0 && (

Please enable at least one provider in Image sources settings.

)}
{/* Image Metadata Section */}

Image Metadata on Import

Alternative Text

Automatically set the image source title as Alternative Text when importing.

setGeneralSetting("auto_alt_text", on)} id="auto-alt-text" ariaLabel="Alternative Text" />

Image Title

Automatically set the image source title as WordPress Title when importing.

setGeneralSetting("auto_title", on)} id="auto-title" ariaLabel="Image Title" />

Image Attribution

Automatically add author attribution as Caption (e.g. "Photo by Author Name") when importing.

setGeneralSetting("image_attribution", on)} id="image-attribution" ariaLabel="Image Attribution" />

Media Modal

Remove the Instant Images tab in the Media Modal.

setGeneralSetting("hide_media_modal_tab", on)} id="hide-media-modal-tab" ariaLabel="Remove the Image Generator tab from the Media Modal" />
{generatorUrl && (
Open Image Generator
)} setSaveMessage({ type: null, text: "" })} />
); }