import React, { useState, useEffect } from 'react'; import { Website } from '../types'; import { getWebsiteIcon } from './utils/iconService'; interface WebsiteEditModalProps { website?: Website; edit: boolean; onClose: () => void; onSave: (website: Partial) => void; onDelete: () => void; } interface IconMetadata { name: string; base: string; aliases: string[]; categories: string[]; update: { timestamp: string; author: { id: number; name: string; }; }; colors: any; // this can be anything I guess } const WebsiteEditModal: React.FC = ({ website, edit, onClose, onSave, onDelete }) => { const [name, setName] = useState(website ? website.name : ''); const [url, setUrl] = useState(website ? website.url : ''); const [icon, setIcon] = useState(website ? website.icon : ''); const [iconQuery, setIconQuery] = useState(''); const [iconMetadata, setIconMetadata] = useState([]); const [filteredIcons, setFilteredIcons] = useState([]); useEffect(() => { fetch('/icon-metadata.json') .then(response => response.json()) .then(data => { const iconsArray = Object.entries(data).map(([name, details]) => ({ name, ...details })); // Expand colors into separate entries iconsArray.forEach(icon => { if (icon.colors) { const colors = Object.values(icon.colors).filter(key => key !== icon.name); for (const color of colors) { const newIcon = { ...icon }; newIcon.name = color; iconsArray.push(newIcon); } } }); setIconMetadata(iconsArray); }); }, []); useEffect(() => { if (iconQuery && Array.isArray(iconMetadata)) { const lowerCaseQuery = iconQuery.toLowerCase(); const filtered = iconMetadata .filter(icon => icon.name.toLowerCase().includes(lowerCaseQuery)) .slice(0, 50); setFilteredIcons(filtered); } else { setFilteredIcons([]); } }, [iconQuery, iconMetadata]); const fetchIcon = async () => { if (url) { const fetchedIcon = await getWebsiteIcon(url); setIcon(fetchedIcon); } }; const handleSave = () => { onSave({ id: website?.id, name, url, icon }); }; const handleOverlayClick = (e: React.MouseEvent) => { if (e.target === e.currentTarget) { onClose(); } }; return (

{edit ? 'Edit Website' : 'Add Website'}

{icon ? ( Website Icon ) : (
)}
setName(e.target.value)} className="bg-white/10 p-3 rounded-lg focus:outline-none focus:ring-2 focus:ring-cyan-400" /> setUrl(e.target.value)} className="bg-white/10 p-3 rounded-lg focus:outline-none focus:ring-2 focus:ring-cyan-400" />
{ setIcon(e.target.value); setIconQuery(e.target.value); }} className="bg-white/10 p-3 rounded-lg focus:outline-none focus:ring-2 focus:ring-cyan-400 w-full" /> {filteredIcons.length > 0 && (
{filteredIcons.map(iconData => (
{ const iconUrl = `https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/${iconData.base}/${iconData.name}.${iconData.base}`; setIcon(iconUrl); setFilteredIcons([]); }} className="cursor-pointer flex items-center p-2 hover:bg-gray-700" > {iconData.name} {iconData.name}
))}
)}
{edit && ( )}
); }; export default WebsiteEditModal;