import React from "react"; import { Panel } from "../UI/Panel"; import { Button } from "../UI/Button"; import { Skeleton } from "../UI/Loading"; import { supabase } from "../../supabaseClient"; export const StopWordsPanel = () => { const [words, setWords] = React.useState([]); const [newWord, setNewWord] = React.useState(""); const [isLoading, setIsLoading] = React.useState(true); const [error, setError] = React.useState(""); const [deletingId, setDeletingId] = React.useState(null); const loadWords = React.useCallback(async () => { setIsLoading(true); setError(""); const { data, error: fetchError } = await supabase .from("stop_words") .select("id, word, created_at") .order("word", { ascending: true }); if (fetchError) { setError(fetchError.message); } else { setWords(data || []); } setIsLoading(false); }, []); React.useEffect(() => { loadWords(); }, [loadWords]); const handleAdd = async () => { const trimmed = newWord.trim().toLowerCase(); if (!trimmed) return; if (words.some((w) => w.word === trimmed)) { setError("Такое слово уже есть"); return; } setError(""); const { error: insertError } = await supabase .from("stop_words") .insert({ word: trimmed }); if (insertError) { setError(insertError.message); return; } setNewWord(""); await loadWords(); }; const handleDelete = async (id) => { setDeletingId(id); const { error: deleteError } = await supabase .from("stop_words") .delete() .eq("id", id); if (deleteError) { setError(deleteError.message); } else { await loadWords(); } setDeletingId(null); }; const handleKeyDown = (e) => { if (e.key === "Enter") { e.preventDefault(); handleAdd(); } }; return (

Стоп-слова

Позиции с этими словами не показываются клиентам в карточке доставки. Добавляйте слова-маркеры: «сверление», «обмер» и т.д.

setNewWord(e.target.value)} onKeyDown={handleKeyDown} placeholder="Новое стоп-слово" className="flex-1 rounded-2xl border border-[var(--color-border)] bg-[var(--color-surface)] px-4 py-2.5 text-sm !text-[var(--color-text)] outline-none transition focus:border-[var(--color-accent)]" maxLength={100} />
{error && (

{error}

)} {isLoading ? (
{Array.from({ length: 6 }).map((_, i) => ( ))}
) : !words.length ? (

Стоп-слов пока нет. Добавьте первое.

) : (
{words.map((w) => ( {w.word} ))}
)}
); };