"use client" import { useEffect, useState } from "react" import { Calendar, ChevronDown, Search } from "lucide-react" import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { useSearchContacts } from "@/lib/api/hooks/use-contact-queries" import type { DriveMimeCategory, DriveSourceId } from "@/lib/drive/drive-filters" import { useDriveFiltersStore, type DriveDatePreset, } from "@/lib/stores/drive-filters-store" import { suitePublicAsset } from "@/lib/suite/suite-public-asset" import { DriveMimeCategoryIcon } from "@/lib/drive/drive-file-icon" import { DRIVE_CARD_PAD_X } from "@/lib/drive/drive-chrome-classes" import { cn } from "@/lib/utils" const FILTER_BORDER = "border-mail-border-subtle" const FILTER_DIVIDER = "border-mail-border-subtle" const FILTER_DROPDOWN_CONTENT_CLASS = cn( FILTER_BORDER, "bg-mail-surface-elevated shadow-sm" ) const FILTER_CHECKBOX_ITEM_CLASS = "gap-3 py-2 pl-2 pr-8 [&>span:first-child]:left-auto [&>span:first-child]:right-2" const TYPE_OPTIONS: { id: DriveMimeCategory; label: string }[] = [ { id: "folder", label: "Dossiers" }, { id: "document", label: "Documents" }, { id: "spreadsheet", label: "Feuilles de calcul" }, { id: "presentation", label: "Présentations" }, { id: "image", label: "Photos et images" }, { id: "pdf", label: "Fichiers PDF" }, { id: "video", label: "Vidéos" }, { id: "audio", label: "Audio" }, { id: "archive", label: "Archives (zip)" }, { id: "other", label: "Autres fichiers" }, ] const SOURCE_OPTIONS: { id: DriveSourceId; label: string; iconSrc: string }[] = [ { id: "ultimail", label: "Ultimail", iconSrc: suitePublicAsset("/ultimail-mark.svg"), }, { id: "ultimeet", label: "Ultimeet", iconSrc: suitePublicAsset("/ultimeet-mark.svg"), }, ] function SourceAppIcon({ src, alt }: { src: string; alt: string }) { return ( {alt} ) } const DATE_OPTIONS: { id: Exclude; label: string }[] = [ { id: "today", label: "Aujourd'hui" }, { id: "last7", label: "7 derniers jours" }, { id: "last30", label: "30 derniers jours" }, { id: "thisYear", label: `Cette année (${new Date().getFullYear()})` }, { id: "lastYear", label: `Année dernière (${new Date().getFullYear() - 1})` }, ] function FilterChip({ label, active, children, }: { label: string active?: boolean children: React.ReactNode }) { return ( {children} ) } function TypeFilterDropdown() { const types = useDriveFiltersStore((s) => s.types) const toggleType = useDriveFiltersStore((s) => s.toggleType) return ( 0}> {TYPE_OPTIONS.map((opt) => ( toggleType(opt.id)} className={FILTER_CHECKBOX_ITEM_CLASS} > {opt.label} ))} ) } function ContactsFilterDropdown() { const contactName = useDriveFiltersStore((s) => s.contactName) const setContact = useDriveFiltersStore((s) => s.setContact) const [query, setQuery] = useState("") const { data: results = [] } = useSearchContacts(query) const chipLabel = contactName ?? "Contacts" return (
setQuery(e.target.value)} placeholder="Rechercher des contacts…" className={cn("h-9 pl-8", FILTER_BORDER)} />
{query.length < 2 ? (

Saisissez au moins 2 caractères

) : results.length === 0 ? (

Aucun contact

) : ( results.map((c) => ( { setContact({ name: c.full_name, email: c.email }) setQuery("") }} > {c.full_name} {c.email ? ( {c.email} ) : null} )) )}
{contactName ? (
) : null}
) } function DateFilterDropdown() { const datePreset = useDriveFiltersStore((s) => s.datePreset) const setDateRange = useDriveFiltersStore((s) => s.setDateRange) const [open, setOpen] = useState(false) const [customMode, setCustomMode] = useState(false) const [draftFrom, setDraftFrom] = useState("") const [draftTo, setDraftTo] = useState("") useEffect(() => { if (open) { setCustomMode(datePreset === "custom") setDraftFrom(useDriveFiltersStore.getState().dateFrom ?? "") setDraftTo(useDriveFiltersStore.getState().dateTo ?? "") } }, [open, datePreset]) const dateLabel = datePreset === "today" ? "Aujourd'hui" : datePreset === "last7" ? "7 derniers jours" : datePreset === "last30" ? "30 derniers jours" : datePreset === "thisYear" ? "Cette année" : datePreset === "lastYear" ? "Année dernière" : datePreset === "custom" ? "Période personnalisée" : "Date de modification" return (
{DATE_OPTIONS.map((opt) => ( { setDateRange(opt.id) setOpen(false) }} className={cn(datePreset === opt.id && !customMode && "bg-accent")} > {opt.label} ))} { e.preventDefault() setCustomMode(true) }} className={cn((datePreset === "custom" || customMode) && "bg-accent")} > Période personnalisée
{customMode ? ( <>
) : null}
) } function SourceFilterDropdown() { const sources = useDriveFiltersStore((s) => s.sources) const toggleSource = useDriveFiltersStore((s) => s.toggleSource) return ( 0}> {SOURCE_OPTIONS.map((opt) => ( toggleSource(opt.id)} className={FILTER_CHECKBOX_ITEM_CLASS} > {opt.label} ))} ) } export function DriveFilterBar({ showContacts = true }: { showContacts?: boolean }) { const clearAll = useDriveFiltersStore((s) => s.clearAll) const hasFilters = useDriveFiltersStore((s) => s.types.size > 0 || s.sources.size > 0 || Boolean(s.contactName) || Boolean(s.datePreset) ) return (
{showContacts ? : null} {hasFilters ? ( ) : null}
) }