// // 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 React from 'react'; import { EmailEnvelope } from '@/api'; import { MailDisplayDrawer } from './mail-display-dialog'; import { EnvelopeDeleteDialog } from './delete-dialog'; import SearchProvider, { SearchDialogType } from './context'; import useDialogState from '@/hooks/use-dialog-state'; import { EditTagsDialog } from './add-tag-dialog'; import { useTranslation } from 'react-i18next'; import { RestoreMessageDialog } from './restore-message-dialog'; import { MailListTable } from './mail-list-table'; import { SortingState } from '@tanstack/react-table'; 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 [sorting, setSorting] = React.useState([{ id: "date", desc: true }]); const { emails, total, totalPages, isLoading, isFetching, page, pageSize, setPage, setPageSize, setSortBy, setSortOrder, onSubmit, reset, filter, setFilter } = 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 ( <>
{/* */}
{isLoading && (

{t('search.searching')}

)} {/* {!isLoading && total === 0 &&
Bichon Logo

{t('search.noEmailsFound')}

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

} */} { setOpen('display'); setSelectedEnvelope(envelope); }} setSortBy={setSortBy} setSortOrder={setSortOrder} /> {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')} />
); }