"use client"; import { useQuery } from "@tanstack/react-query"; import { useAtomValue } from "jotai"; import { Info, RotateCcw, Save } from "lucide-react"; import { useTranslations } from "next-intl"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { updateSearchSpaceMutationAtom } from "@/atoms/search-spaces/search-space-mutation.atoms"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Skeleton } from "@/components/ui/skeleton"; import { searchSpacesApiService } from "@/lib/apis/search-spaces-api.service"; import { cacheKeys } from "@/lib/query-client/cache-keys"; interface GeneralSettingsManagerProps { searchSpaceId: number; } export function GeneralSettingsManager({ searchSpaceId }: GeneralSettingsManagerProps) { const t = useTranslations("searchSpaceSettings"); const tCommon = useTranslations("common"); const { data: searchSpace, isLoading: loading, refetch: fetchSearchSpace, } = useQuery({ queryKey: cacheKeys.searchSpaces.detail(searchSpaceId.toString()), queryFn: () => searchSpacesApiService.getSearchSpace({ id: searchSpaceId }), enabled: !!searchSpaceId, }); const { mutateAsync: updateSearchSpace } = useAtomValue(updateSearchSpaceMutationAtom); const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [saving, setSaving] = useState(false); const [hasChanges, setHasChanges] = useState(false); // Initialize state from fetched search space useEffect(() => { if (searchSpace) { setName(searchSpace.name || ""); setDescription(searchSpace.description || ""); setHasChanges(false); } }, [searchSpace]); // Track changes useEffect(() => { if (searchSpace) { const currentName = searchSpace.name || ""; const currentDescription = searchSpace.description || ""; const changed = currentName !== name || currentDescription !== description; setHasChanges(changed); } }, [searchSpace, name, description]); const handleSave = async () => { try { setSaving(true); await updateSearchSpace({ id: searchSpaceId, data: { name: name.trim(), description: description.trim() || undefined, }, }); setHasChanges(false); await fetchSearchSpace(); } catch (error: any) { console.error("Error saving search space details:", error); toast.error(error.message || "Failed to save search space details"); } finally { setSaving(false); } }; const handleReset = () => { if (searchSpace) { setName(searchSpace.name || ""); setDescription(searchSpace.description || ""); setHasChanges(false); } }; if (loading) { return (
); } return (
Update your search space name and description. These details help identify and organize your workspace. {/* Search Space Details Card */} Search Space Details Manage the basic information for this search space.
setName(e.target.value)} className="text-sm md:text-base h-9 md:h-10" />

{t("general_name_description")}

setDescription(e.target.value)} className="text-sm md:text-base h-9 md:h-10" />

{t("general_description_description")}

{/* Action Buttons */}
{hasChanges && ( {t("general_unsaved_changes")} )}
); }