"use client"; import { useState, useCallback, useMemo } from "react"; import { IconPlus, IconTrash, IconRefresh } from "@tabler/icons-react"; import { Button } from "@kandev/ui/button"; import { Input } from "@kandev/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@kandev/ui/select"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "@kandev/ui/tabs"; import { useToast } from "@/components/toast-provider"; import { SettingsSection } from "@/components/settings/settings-section"; import { useDefaultQueryPresets, toStored, type StoredQueryPreset, } from "@/components/github/my-github/use-default-query-presets"; import { PR_PRESETS as BUILTIN_PR_PRESETS, ISSUE_PRESETS as BUILTIN_ISSUE_PRESETS, } from "@/components/github/my-github/search-bar"; function newPreset(): StoredQueryPreset { return { value: `q_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`, label: "New query", filter: "", group: "inbox", }; } function QueryRow({ preset, onPatch, onRemove, }: { preset: StoredQueryPreset; onPatch: (patch: Partial) => void; onRemove: () => void; }) { return (
Label onPatch({ label: e.target.value })} />
Query onPatch({ filter: e.target.value })} />
Group
); } function QueryEditor({ presets, onChange, addLabel, }: { presets: StoredQueryPreset[]; onChange: (presets: StoredQueryPreset[]) => void; addLabel: string; }) { const patch = useCallback( (index: number, change: Partial) => { onChange(presets.map((p, i) => (i === index ? { ...p, ...change } : p))); }, [presets, onChange], ); const remove = useCallback( (index: number) => onChange(presets.filter((_, i) => i !== index)), [presets, onChange], ); const add = useCallback(() => onChange([...presets, newPreset()]), [presets, onChange]); return (
{presets.map((preset, index) => ( patch(index, p)} onRemove={() => remove(index)} /> ))}
); } export function DefaultQueriesSection() { const { toast } = useToast(); const { prPresets, issuePresets, save, reset, isCustomized } = useDefaultQueryPresets(); const [prDraft, setPrDraft] = useState(prPresets); const [issueDraft, setIssueDraft] = useState(issuePresets); // Sync drafts when external state changes const [syncedPr, setSyncedPr] = useState(prPresets); const [syncedIssue, setSyncedIssue] = useState(issuePresets); if (prPresets !== syncedPr) { setSyncedPr(prPresets); setPrDraft(prPresets); } if (issuePresets !== syncedIssue) { setSyncedIssue(issuePresets); setIssueDraft(issuePresets); } const dirty = useMemo( () => JSON.stringify(prPresets) !== JSON.stringify(prDraft) || JSON.stringify(issuePresets) !== JSON.stringify(issueDraft), [prPresets, issuePresets, prDraft, issueDraft], ); const handleSave = useCallback(() => { save({ pr: prDraft, issue: issueDraft }); toast({ description: "Default queries saved", variant: "success" }); }, [save, prDraft, issueDraft, toast]); const handleReset = useCallback(() => { reset(); setPrDraft(toStored(BUILTIN_PR_PRESETS)); setIssueDraft(toStored(BUILTIN_ISSUE_PRESETS)); toast({ description: "Default queries reset to defaults", variant: "success" }); }, [reset, toast]); return ( } > Pull requests Issues ); }