"use client" import { Icon } from "@iconify/react" import { Archive, ArrowLeft, CalendarX2, ChevronDown, ChevronLeft, ChevronRight, CheckSquare, Clock, FolderInput, ListTodo, Mail, MailOpen, Menu, MoreVertical, Paperclip, RefreshCw, Search, Send, ShieldAlert, SquareArrowOutUpRight, Tag, Trash2, User as UserIcon, VolumeX, X, } from "lucide-react" import { Button } from "@/components/ui/button" import { Checkbox } from "@/components/ui/checkbox" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip" import { CompactInboxCategoryTabs } from "@/components/gmail/compact-inbox-category-tabs" import { EmailLabelPickerBlock } from "@/components/gmail/email-label-picker-block" import type { CatalogLabelPresence } from "@/components/gmail/email-label-picker-block" import { MailSearchBar } from "@/components/gmail/mail-search-bar" import { MoveToDropdownItems, } from "@/components/gmail/email-list/move-to-menu-items" import type { MailMoveTargets } from "@/components/gmail/move-to-menu-items" import { cn } from "@/lib/utils" import type { Email } from "@/lib/email-data" import { MAIL_INBOX_CATEGORY_TAB_CONTENT_DARK_CLASS, MAIL_MENU_SURFACE_CLASS, } from "@/lib/mail-chrome-classes" import { DATE_RANGE_OPTIONS, type SearchParams, } from "@/lib/mail-search/search-params" import { inboxTabActiveAccentColor } from "@/lib/inbox-category-tabs" import { inboxTabShowsInactiveMeta } from "@/lib/mail-url" import { CATEGORY_TAB_ICON_CLASS, inboxTabBadgeCountClass, inboxTabBadgeDotClass, REFRESH_SPIN_CLASS, } from "@/components/gmail/email-list/email-list-helpers" import { LIST_PAGE_SIZE_OPTIONS, type ListPageSize, } from "@/lib/mail-list-page-size" export type EmailListToolbarProps = { isViewMode: boolean splitView: boolean listToolbarMode: boolean compactInboxTabs: boolean isSearchMode: boolean selectedFolder: string mobileFolderLabel: string displayListEmails: Email[] mobileUnreadCount: number mobileSelectionMode: boolean setMobileSelectionMode: (v: boolean | ((p: boolean) => boolean)) => void setSelectedEmails: (v: string[] | ((p: string[]) => string[])) => void mobileXsMoreMenuOpen: boolean setMobileXsMoreMenuOpen: (v: boolean) => void showBulkToolbar: boolean bulkSelectMenuOpen: boolean setBulkSelectMenuOpen: (v: boolean) => void selectAllChecked: boolean | "indeterminate" handleSelectAllChange: (checked: boolean | "indeterminate") => void selectMenuAll: () => void selectMenuNone: () => void selectMenuRead: () => void selectMenuUnread: () => void selectMenuStarred: () => void selectMenuUnstarred: () => void bulkArchive: () => void bulkDelete: () => void bulkSpam: () => void hasUnreadInSelection: boolean bulkMarkRead: () => void bulkMarkUnread: () => void moveTargets: MailMoveTargets bulkMoveTo: (targetId: string) => void labelPickerQuery: string setLabelPickerQuery: (q: string) => void catalogLabels: string[] resolveLabelVisual: (label: string) => ReturnType bulkTargetIds: string[] getCatalogLabelPresence: (ids: string[], catalogLabel: string) => CatalogLabelPresence toggleLabelOnEmails: (ids: string[], label: string) => void addLabelToEmails: (ids: string[], label: string) => void isRefreshing: boolean handleManualRefresh: () => void markAllInViewAsRead: () => void openMobileXsMoveSheet: () => void openMobileXsLabelSheet: () => void listPage: number totalPages: number paginationTotal?: number listPageSize: number paginationRangeStart: number paginationRangeEnd: number onListPageSizeChange: (size: ListPageSize) => void openMailIndex: number goListPrevPage: () => void goListNextPage: () => void goToPrev: () => void goToNext: () => void goBack: () => void openEmail: Email | null viewModeIsRead: boolean singleArchive: () => void singleDelete: () => void singleNotSpam: () => void singleSpam: () => void singleToggleRead: () => void singleMoveTo: (targetId: string) => void onToggleSidebar?: () => void inboxTabBarItems: Array<{ id: string; label: string; icon: string; badgeColor: string }> activeInboxTabId: string unseenInTabById: Record tabUnseenSenderLineById: Record handleCategoryInboxTabClick: (tabId: string) => void searchParams: SearchParams | null searchAccount: { email: string } | null allEmails: Email[] setSearchFilter: (patch: Partial) => void toggleSearchFilter: (key: keyof SearchParams, value: string) => void setAdvancedOpen: (open: boolean) => void searchRouter: { push: (url: string) => void } buildSearchUrl: (params: SearchParams) => string variant?: "list" | "reading-pane" part?: "mobile" | "list" | "all" } export function EmailListToolbar(props: EmailListToolbarProps) { const { isViewMode, splitView, listToolbarMode, compactInboxTabs, isSearchMode, selectedFolder, mobileFolderLabel, displayListEmails, mobileUnreadCount, mobileSelectionMode, setMobileSelectionMode, setSelectedEmails, mobileXsMoreMenuOpen, setMobileXsMoreMenuOpen, showBulkToolbar, bulkSelectMenuOpen, setBulkSelectMenuOpen, selectAllChecked, handleSelectAllChange, selectMenuAll, selectMenuNone, selectMenuRead, selectMenuUnread, selectMenuStarred, selectMenuUnstarred, bulkArchive, bulkDelete, bulkSpam, hasUnreadInSelection, bulkMarkRead, bulkMarkUnread, moveTargets, bulkMoveTo, labelPickerQuery, setLabelPickerQuery, catalogLabels, resolveLabelVisual, bulkTargetIds, getCatalogLabelPresence, toggleLabelOnEmails, addLabelToEmails, isRefreshing, handleManualRefresh, markAllInViewAsRead, openMobileXsMoveSheet, openMobileXsLabelSheet, listPage, totalPages, paginationTotal, listPageSize, paginationRangeStart, paginationRangeEnd, onListPageSizeChange, openMailIndex, goListPrevPage, goListNextPage, goToPrev, goToNext, goBack, openEmail, viewModeIsRead, singleArchive, singleDelete, singleNotSpam, singleSpam, singleToggleRead, singleMoveTo, onToggleSidebar, inboxTabBarItems, activeInboxTabId, unseenInTabById, tabUnseenSenderLineById, handleCategoryInboxTabClick, searchParams, searchAccount, allEmails, setSearchFilter, toggleSearchFilter, setAdvancedOpen, searchRouter, buildSearchUrl, variant = "list", part = "all", } = props const dropdownSurfaceClass = MAIL_MENU_SURFACE_CLASS const openMailToolbar = (showBack: boolean) => ( <> {showBack ? ( Retour à la boîte de réception ) : null}
{openEmail?.spam === true ? ( <>
Archiver
{viewModeIsRead ? "Marquer comme non lu" : "Marquer comme lu"}
) : ( <>
Archiver Signaler comme spam Supprimer
{viewModeIsRead ? "Marquer comme non lu" : "Marquer comme lu"}
)}
) const mailPaginationControls = (mode: "list" | "view") => { const totalCount = paginationTotal ?? (mode === "view" ? displayListEmails.length : paginationRangeEnd) return (
{displayListEmails.length === 0 ? ( Aucun résultat ) : mode === "view" ? ( {openMailIndex >= 0 ? openMailIndex + 1 : "–"} sur {displayListEmails.length} ) : ( {paginationRangeStart} à{" "} {LIST_PAGE_SIZE_OPTIONS.map((size) => ( onListPageSizeChange(size)} className={cn(size === listPageSize && "font-medium")} > {size} par page ))} {" "} sur {totalCount} )} {mode === "view" ? "Plus récent" : "Page précédente"} {mode === "view" ? "Plus ancien" : "Page suivante"}
) } if (variant === "reading-pane") { return (
{openMailToolbar(false)}
{mailPaginationControls("view")}
) } return ( <> {part !== "list" && !isViewMode && (

{mobileFolderLabel}

{displayListEmails.length} message{displayListEmails.length !== 1 ? "s" : ""} {mobileUnreadCount > 0 && ` · ${mobileUnreadCount} non lu${mobileUnreadCount !== 1 ? "s" : ""}`}

{showBulkToolbar ? ( <> Archiver Supprimer Signaler comme spam {hasUnreadInSelection ? ( <> Marquer comme lu ) : ( <> Marquer comme non lu )} { e.preventDefault() openMobileXsMoveSheet() }} > Déplacer vers { e.preventDefault() openMobileXsLabelSheet() }} > Ajouter le libellé Ignorer la conversation ) : ( <> Tout marquer comme lu
Sélectionnez des messages pour plus d'actions
)}
)} {part !== "mobile" && ( <> {splitView ? (
{onToggleSidebar ? ( ) : null}
) : null} {/* Toolbar — relative: scroll lives in sibling below */}
{!splitView && isViewMode ? ( openMailToolbar(true) ) : ( /* ── LIST MODE TOOLBAR (original) ── */ <>
Tous Aucun Lus Non lus Suivis Non suivis
{showBulkToolbar ? ( <>
Archiver Signaler comme spam Supprimer
{hasUnreadInSelection ? "Marquer comme lu" : "Marquer comme non lu"}
{ if (!open) setLabelPickerQuery("") }} > Mettre en attente Ajouter à Tasks Ajouter le libellé getCatalogLabelPresence(bulkTargetIds, lab) } onToggleCatalogLabel={(lab) => toggleLabelOnEmails(bulkTargetIds, lab) } onCreateLabel={(lab) => { addLabelToEmails(bulkTargetIds, lab) setLabelPickerQuery("") }} /> Ignorer la conversation Ouvrir dans une nouvelle fenêtre
) : ( <> Tout marquer comme lu
Sélectionnez des messages pour afficher plus d'actions
)} )}
{listToolbarMode ? mailPaginationControls("list") : null} {!splitView && !listToolbarMode ? mailPaginationControls("view") : null}
{selectedFolder === "inbox" && (
{listToolbarMode && (compactInboxTabs ? ( ) : (
{inboxTabBarItems.map((tab) => { const isActive = activeInboxTabId === tab.id const accentColor = isActive ? inboxTabActiveAccentColor(tab.id, tab.badgeColor) : undefined const unseen = unseenInTabById[tab.id] ?? 0 const senderLine = tabUnseenSenderLineById[tab.id] ?? "" const showMeta = inboxTabShowsInactiveMeta(tab.id) && !isActive && unseen > 0 const showSenderLine = showMeta && Boolean(senderLine) const isExpandedTabMeta = showSenderLine return ( ) })}
))}
)} {isSearchMode && searchParams && listToolbarMode && (
{/* De dropdown */} setSearchFilter({ from: "" })}> N'importe qui setSearchFilter({ from: searchAccount?.email ?? "" })}> De moi ({searchAccount?.email}) {Array.from(new Set(allEmails.map((e) => e.senderEmail).filter(Boolean))).slice(0, 8).map((addr) => ( setSearchFilter({ from: addr! })}> {addr} ))} {/* Date dropdown */} setSearchFilter({ within: "" })}> Indifférente {DATE_RANGE_OPTIONS.map((opt) => ( setSearchFilter({ within: opt.value })}> {opt.label} ))} {/* Contient une pièce jointe */} {/* Exclure les mises à jour d'agenda */} {/* À dropdown */} setSearchFilter({ to: "" })}> N'importe qui setSearchFilter({ to: searchAccount?.email ?? "" })}> À moi ({searchAccount?.email}) {/* Non lu */} {/* Recherche avancée */}
)} )} ) }