import { HTMLInputTypeAttribute, JSX, useEffect, useState } from "react"; import { SettingsType } from "../../../shared/constants"; import { useMutation, useQuery } from "@tanstack/react-query"; import { OptionSpace } from "./OptionSpace"; import { OptionInput } from "./OptionInput"; import { Button } from "./Button"; import { FileSearchCorner, FolderSearch, Pen, Save } from "lucide-react"; import { ContextDialog } from "../ContextDialog"; import FilePicker from "../FilePicker"; import { setFocus } from "@noriginmedia/norigin-spatial-navigation"; import { getSettingQuery, setSettingMutation } from "@queries/settings"; type KeysWithValueAssignableTo = { [K in keyof T]: Exclude extends Value ? K : never; }[keyof T]; export interface PathSettingsOptionParams { label: string; id: KeysWithValueAssignableTo; type: HTMLInputTypeAttribute; placeholder?: string; icon?: JSX.Element; children?: any; onBrowseAction?: (path: string | undefined) => void; requireConfirmation?: boolean; isDirectoryPicker?: boolean; allowNewFolderCreation?: boolean; } export function PathSettingsOption (data: PathSettingsOptionParams) { const [localValue, setLocalValue] = useState(); const [dirty, setDirty] = useState(false); const setMutation = useMutation({ ...setSettingMutation(data.id), onSuccess: (d, v, r, cx) => { setDirty(r !== localValue); } }); return { setLocalValue(v); setDirty(true); }} />; } export function PathSettingsOptionBase (data: PathSettingsOptionParams & { save: (value: string | undefined) => void; localValue: string | undefined; setLocalValue: (value: string | undefined) => void; isDirty: boolean; }) { const [isBrowsing, setIsBrowsing] = useState(false); const { data: defaultValue } = useQuery(getSettingQuery(data.id)); const changed = defaultValue !== data.localValue; useEffect(() => { if (!data.isDirty) { data.setLocalValue(String(defaultValue)); } }, [data.isDirty, defaultValue]); const handleSelectPath = (path: string) => { data.setLocalValue(path); handleCloseSeatch(); if (data.requireConfirmation !== true) { data.save(path); } }; const handleCloseSeatch = () => { setIsBrowsing(false); setFocus(`${data.id}-browse`); }; const handleInputBlur = () => { if (data.requireConfirmation !== true) { data.save(data.localValue); } }; return ( {data.label}{changed && }}> { data.setLocalValue(e); }} value={data.localValue} /> {data.requireConfirmation === true && } {isBrowsing && } {data.children} ); }