// // Copyright (c) 2025 rustmailer.com (https://rustmailer.com) // // This file is part of the Bichon Email Archiving Project // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import { Card, CardContent } from '@/components/ui/card'; import { FixedHeader } from '@/components/layout/fixed-header'; import { Main } from '@/components/layout/main'; import { useSearchMessages } from '@/hooks/use-search-messages'; import { SearchFormDialog } from './search-form'; import { EnvelopeListPagination } from '@/components/pagination'; import { MailList } from './mail-list'; import React from 'react'; import { EmailEnvelope } from '@/api'; import { Filter, SearchIcon } from 'lucide-react'; import { MailDisplayDrawer } from './mail-display-dialog'; import { EnvelopeDeleteDialog } from './delete-dialog'; import SearchProvider, { SearchDialogType } from './context'; import useDialogState from '@/hooks/use-dialog-state'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from '@/components/ui/sheet'; import { Button } from '@/components/ui/button'; import { EnvelopeTags } from './tag-facet'; import { EditTagsDialog } from './add-tag-dialog'; import { useTranslation } from 'react-i18next'; import Logo from '@/assets/logo.svg' import { RestoreMessageDialog } from './restore-message-dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Label } from '@/components/ui/label'; export default function Search() { const { t } = useTranslation() const [selectedEnvelope, setSelectedEnvelope] = React.useState(undefined); const [open, setOpen] = useDialogState(null) const [toDelete, setToDelete] = React.useState>>(new Map()); const [selected, setSelected] = React.useState>>(new Map()); const [selectedTags, setSelectedTags] = React.useState([]); const { emails, total, totalPages, isLoading, isFetching, page, pageSize, sortBy, setPage, setPageSize, setSortBy, onSubmit, reset, filter } = useSearchMessages(); const handleSetPageSize = (pageSize: number) => { setPage(1); setPageSize(pageSize) } const handleReset = () => { reset(); setSelectedTags([]); }; const handleTagToggle = (tag: string) => { setSelectedTags(prev => prev.includes(tag) ? prev.filter(t => t !== tag) : [...prev, tag] ); }; return ( <>
{t('search.tagFilter')}
{isLoading && (

{t('search.searching')}

)} {total === 0 &&
Bichon Logo

{t('search.noEmailsFound')}

{Object.keys(filter).length === 0 ? t('search.startSearching') : t('search.adjustSearch')}

} {total > 0 && { setOpen('display'); setSelectedEnvelope(envelope); }} /> } {total > 0 && page < totalPages} pageIndex={page - 1} pageSize={pageSize} setPageIndex={(index) => setPage(index + 1)} setPageSize={handleSetPageSize} />}
setOpen('display')} /> setOpen('delete')} /> setOpen('edit-tags')} /> setOpen('search-form')} /> setOpen('restore')} />
); }