'use client'; import { useEffect, useState, useCallback } from 'react'; import { Plus, Trash2, GripVertical, ExternalLink, ToggleLeft, ToggleRight, } from 'lucide-react'; import { fetchDiscoverCategories, createDiscoverCategory, updateDiscoverCategory, deleteDiscoverCategory, reorderDiscoverCategories, fetchDiscoverSources, createDiscoverSource, deleteDiscoverSource, } from '@/lib/api'; import type { DiscoverCategory, DiscoverSource } from '@/lib/types'; interface CategoryModalProps { category?: DiscoverCategory; onClose: () => void; onSave: (data: { name: string; nameRu: string; icon: string; color: string; keywords: string[]; regions: string[] }) => void; } function CategoryModal({ category, onClose, onSave }: CategoryModalProps) { const [name, setName] = useState(category?.name || ''); const [nameRu, setNameRu] = useState(category?.nameRu || ''); const [icon, setIcon] = useState(category?.icon || 'πŸ“°'); const [color, setColor] = useState(category?.color || '#6B7280'); const [keywords, setKeywords] = useState(category?.keywords?.join(', ') || ''); const [regions, setRegions] = useState(category?.regions?.join(', ') || 'world, russia'); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); onSave({ name, nameRu, icon, color, keywords: keywords.split(',').map(k => k.trim()).filter(Boolean), regions: regions.split(',').map(r => r.trim()).filter(Boolean), }); }; return (

{category ? 'Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ' : 'Новая катСгория'}

setName(e.target.value)} placeholder="tech" className="w-full px-3 py-2 bg-base border border-border/50 rounded-lg text-primary focus:outline-none focus:border-primary" required />
setNameRu(e.target.value)} placeholder="Π’Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ" className="w-full px-3 py-2 bg-base border border-border/50 rounded-lg text-primary focus:outline-none focus:border-primary" required />
setIcon(e.target.value)} placeholder="πŸ’»" className="w-full px-3 py-2 bg-base border border-border/50 rounded-lg text-primary focus:outline-none focus:border-primary text-center text-2xl" required />
setColor(e.target.value)} className="w-12 h-10 bg-base border border-border/50 rounded-lg cursor-pointer" /> setColor(e.target.value)} className="flex-1 px-3 py-2 bg-base border border-border/50 rounded-lg text-primary focus:outline-none focus:border-primary font-mono" />
setKeywords(e.target.value)} placeholder="technology, AI, software" className="w-full px-3 py-2 bg-base border border-border/50 rounded-lg text-primary focus:outline-none focus:border-primary" />
setRegions(e.target.value)} placeholder="world, russia, eu" className="w-full px-3 py-2 bg-base border border-border/50 rounded-lg text-primary focus:outline-none focus:border-primary" />
); } interface SourceModalProps { onClose: () => void; onSave: (data: { name: string; url: string; logoUrl?: string; categories: string[]; trustScore: number; description?: string }) => void; } function SourceModal({ onClose, onSave }: SourceModalProps) { const [name, setName] = useState(''); const [url, setUrl] = useState(''); const [logoUrl, setLogoUrl] = useState(''); const [categories, setCategories] = useState(''); const [trustScore, setTrustScore] = useState(0.5); const [description, setDescription] = useState(''); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); onSave({ name, url, logoUrl: logoUrl || undefined, categories: categories.split(',').map(c => c.trim()).filter(Boolean), trustScore, description: description || undefined, }); }; return (

Новый источник

setName(e.target.value)} placeholder="Habr" className="w-full px-3 py-2 bg-base border border-border/50 rounded-lg text-primary focus:outline-none focus:border-primary" required />
setUrl(e.target.value)} placeholder="https://habr.com" className="w-full px-3 py-2 bg-base border border-border/50 rounded-lg text-primary focus:outline-none focus:border-primary" required />
setLogoUrl(e.target.value)} placeholder="https://..." className="w-full px-3 py-2 bg-base border border-border/50 rounded-lg text-primary focus:outline-none focus:border-primary" />
setCategories(e.target.value)} placeholder="tech, science" className="w-full px-3 py-2 bg-base border border-border/50 rounded-lg text-primary focus:outline-none focus:border-primary" />
setTrustScore(parseFloat(e.target.value))} className="w-full" />