Overwrite existing saved search

This commit is contained in:
Josh Hawkins 2024-11-04 13:34:22 -06:00
parent 553676aade
commit c6165a1536
2 changed files with 30 additions and 8 deletions

View File

@ -1,4 +1,10 @@
import React, { useState, useRef, useEffect, useCallback } from "react"; import React, {
useState,
useRef,
useEffect,
useCallback,
useMemo,
} from "react";
import { import {
LuX, LuX,
LuFilter, LuFilter,
@ -88,6 +94,11 @@ export default function InputWithTags({
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
const [searchToDelete, setSearchToDelete] = useState<string | null>(null); const [searchToDelete, setSearchToDelete] = useState<string | null>(null);
const searchHistoryNames = useMemo(
() => searchHistory?.map((item) => item.name) ?? [],
[searchHistory],
);
const handleSetSearchHistory = useCallback(() => { const handleSetSearchHistory = useCallback(() => {
setIsSaveDialogOpen(true); setIsSaveDialogOpen(true);
}, []); }, []);
@ -96,12 +107,8 @@ export default function InputWithTags({
(name: string) => { (name: string) => {
if (searchHistoryLoaded) { if (searchHistoryLoaded) {
setSearchHistory([ setSearchHistory([
...(searchHistory ?? []), ...(searchHistory ?? []).filter((item) => item.name !== name),
{ { name, search, filter: filters },
name: name,
search: search,
filter: filters,
},
]); ]);
} }
}, },
@ -835,6 +842,7 @@ export default function InputWithTags({
</CommandList> </CommandList>
</Command> </Command>
<SaveSearchDialog <SaveSearchDialog
existingNames={searchHistoryNames}
isOpen={isSaveDialogOpen} isOpen={isSaveDialogOpen}
onClose={() => setIsSaveDialogOpen(false)} onClose={() => setIsSaveDialogOpen(false)}
onSave={handleSaveSearch} onSave={handleSaveSearch}

View File

@ -9,17 +9,19 @@ import {
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { useState } from "react"; import { useMemo, useState } from "react";
import { isMobile } from "react-device-detect"; import { isMobile } from "react-device-detect";
import { toast } from "sonner"; import { toast } from "sonner";
type SaveSearchDialogProps = { type SaveSearchDialogProps = {
existingNames: string[];
isOpen: boolean; isOpen: boolean;
onClose: () => void; onClose: () => void;
onSave: (name: string) => void; onSave: (name: string) => void;
}; };
export function SaveSearchDialog({ export function SaveSearchDialog({
existingNames,
isOpen, isOpen,
onClose, onClose,
onSave, onSave,
@ -37,6 +39,12 @@ export function SaveSearchDialog({
} }
}; };
const overwrite = useMemo(() => {
const existing = existingNames.find((name) => name === searchName);
return existing;
}, [existingNames, searchName]);
return ( return (
<Dialog open={isOpen} onOpenChange={onClose}> <Dialog open={isOpen} onOpenChange={onClose}>
<DialogContent <DialogContent
@ -58,6 +66,12 @@ export function SaveSearchDialog({
onChange={(e) => setSearchName(e.target.value)} onChange={(e) => setSearchName(e.target.value)}
placeholder="Enter a name for your search" placeholder="Enter a name for your search"
/> />
{overwrite && (
<div className="ml-1 text-sm text-danger">
{searchName} already exists. Saving will overwrite the existing
value.
</div>
)}
<DialogFooter> <DialogFooter>
<Button aria-label="Cancel" onClick={onClose}> <Button aria-label="Cancel" onClick={onClose}>
Cancel Cancel