/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * Shared constants, helper components, and utility functions for BCF panel components. */ import { useMemo } from 'react'; import { AlertCircle, CheckCircle, Clock } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; // ============================================================================ // Constants // ============================================================================ export const TOPIC_TYPES = ['Issue', 'Request', 'Comment', 'Error', 'Warning', 'Info']; export const TOPIC_STATUSES = ['Open', 'In Progress', 'Resolved', 'Closed']; export const PRIORITIES = ['High', 'Medium', 'Low']; // ============================================================================ // Helper Components // ============================================================================ export function StatusBadge({ status }: { status?: string }) { const variant = useMemo(() => { switch (status?.toLowerCase()) { case 'open': return 'default'; case 'in progress': return 'secondary'; case 'resolved': case 'closed': return 'outline'; default: return 'default'; } }, [status]); const Icon = useMemo(() => { switch (status?.toLowerCase()) { case 'open': return AlertCircle; case 'in progress': return Clock; case 'resolved': case 'closed': return CheckCircle; default: return AlertCircle; } }, [status]); return ( {status || 'Open'} ); } export function PriorityBadge({ priority }: { priority?: string }) { const colorClass = useMemo(() => { switch (priority?.toLowerCase()) { case 'high': return 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200'; case 'medium': return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200'; case 'low': return 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200'; default: return ''; } }, [priority]); if (!priority) return null; return ( {priority} ); } // ============================================================================ // Date Formatters // ============================================================================ export function formatDate(isoDate: string): string { const date = new Date(isoDate); if (isNaN(date.getTime())) return isoDate; return date.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric', }); } export function formatDateTime(isoDate: string): string { const date = new Date(isoDate); if (isNaN(date.getTime())) return isoDate; return date.toLocaleString(undefined, { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }); }