'use client' import { useState, useMemo } from 'react' import DomainCard from '@/components/domains/DomainCard' import DomainFilters from '@/components/domains/DomainFilters' import PageHeader from '@/components/objects/PageHeader' import { Link, AlertCircle } from "lucide-react" import { TbCurrencyDollarOff } from "react-icons/tb" import { domains } from "@/lib/domains/data" import { getDaysUntilExpiration, getOwnershipDuration, getOwnershipMonths } from '@/lib/domains/utils' import type { DomainCategory, DomainStatus, DomainRegistrarId, DomainSortOption } from '@/lib/types' export default function Domains() { const [searchQuery, setSearchQuery] = useState('') const [selectedCategories, setSelectedCategories] = useState([]) const [selectedStatuses, setSelectedStatuses] = useState([]) const [selectedRegistrars, setSelectedRegistrars] = useState([]) const [sortBy, setSortBy] = useState('name') const uniqueRegistrars = useMemo(() => { return Array.from(new Set(domains.map(d => d.registrar))).sort() }, []) const filteredAndSortedDomains = useMemo(() => { const filtered = domains.filter(domain => { const matchesSearch = searchQuery === '' || domain.domain.toLowerCase().includes(searchQuery.toLowerCase()) || domain.usage.toLowerCase().includes(searchQuery.toLowerCase()) || domain.tags.some(tag => tag.toLowerCase().includes(searchQuery.toLowerCase())) const matchesCategory = selectedCategories.length === 0 || selectedCategories.includes(domain.category) const matchesStatus = selectedStatuses.length === 0 || selectedStatuses.includes(domain.status) const matchesRegistrar = selectedRegistrars.length === 0 || selectedRegistrars.includes(domain.registrar) return matchesSearch && matchesCategory && matchesStatus && matchesRegistrar }) filtered.sort((a, b) => { switch (sortBy) { case 'name': return a.domain.localeCompare(b.domain) case 'expiration': return getDaysUntilExpiration(a) - getDaysUntilExpiration(b) case 'ownership': return getOwnershipDuration(b) - getOwnershipDuration(a) case 'registrar': return a.registrar.localeCompare(b.registrar) default: return 0 } }) return filtered }, [searchQuery, selectedCategories, selectedStatuses, selectedRegistrars, sortBy]) const stats = useMemo(() => { const expiringSoon = domains.filter(d => getDaysUntilExpiration(d) <= 90).length const totalDomains = domains.length const activeDomains = domains.filter(d => d.status === 'active').length const avgOwnershipYears = domains.reduce((acc, d) => acc + getOwnershipDuration(d), 0) / domains.length const avgOwnershipMonths = domains.reduce((acc, d) => acc + getOwnershipMonths(d), 0) / domains.length return { expiringSoon, totalDomains, activeDomains, avgOwnershipYears, avgOwnershipMonths } }, []) return (
} title="My Domain Portfolio" />
These domains are not for sale. All requests to buy them will be declined.
{stats.totalDomains}
Total Domains
{stats.activeDomains}
Active
{stats.expiringSoon > 0 && } {stats.expiringSoon}
Expiring Soon
{stats.avgOwnershipYears < 1 ? `${Math.round(stats.avgOwnershipMonths)} mo` : `${stats.avgOwnershipYears.toFixed(1)} yr`}
Avg Time Owned
{filteredAndSortedDomains.map(domain => ( ))}
{filteredAndSortedDomains.length === 0 && (

No domains match your filters

)}
) }