import React, { useState } from "react"; import { PolicyData } from "../types"; interface AIPoliciesTableProps { policies: PolicyData[]; } const AIPoliciesTable: React.FC = ({ policies }) => { const initialOpenYears = policies.reduce((acc, policy) => { const year = new Date(policy.releaseDate).getFullYear(); acc[year] = true; return acc; }, {} as { [key: number]: boolean }); const [openYears, setOpenYears] = useState<{ [key: number]: boolean }>(initialOpenYears); const toggleYear = (year: number) => { setOpenYears((prev) => ({ ...prev, [year]: !prev[year] })); }; const uniqueTags = Array.from(new Set(policies.flatMap(policy => policy.tags.map(tag => tag.toLowerCase())))).map(tag => tag.charAt(0).toUpperCase() + tag.slice(1)); const [selectedTags, setSelectedTags] = useState(uniqueTags); const handleTagChange = (tag: string) => { if (selectedTags.includes(tag)) { setSelectedTags(selectedTags.filter(t => t !== tag)); } else { setSelectedTags([...selectedTags, tag]); } }; const filteredPolicies = selectedTags.length === 0 ? policies : policies.filter(policy => policy.tags.some(tag => selectedTags.includes(tag.charAt(0).toUpperCase() + tag.slice(1)))); const groupedPolicies = filteredPolicies.reduce((acc, policy) => { const year = new Date(policy.releaseDate).getFullYear(); if (!acc[year]) { acc[year] = []; } acc[year].push(policy); return acc; }, {} as { [key: number]: PolicyData[] }); const sortedYears = Object.keys(groupedPolicies) .map(Number) .sort((a, b) => b - a); const formatDate = (dateString: string) => { const date = new Date(dateString); const options: Intl.DateTimeFormatOptions = { month: 'short', day: 'numeric', year: 'numeric' }; return date.toLocaleDateString('en-US', options); }; return (
{uniqueTags.map(tag => ( ))}
{sortedYears.map((year) => (
{openYears[year] && ( {groupedPolicies[year].map((policy, index) => ( ))}
{policy.zh}
{policy.en}
{formatDate(policy.releaseDate)}
{policy.tags.map(tag => tag.charAt(0).toUpperCase() + tag.slice(1)).join(', ')}
{policy.link.zh && ( 中文 )} {policy.link.en && ( English )} {policy.link.fr && ( Français )}
)}
))}
); }; export default AIPoliciesTable;