import { ReactNode } from 'react'; import { AuthParams, BulkUploadSelectorData, BulkUploadSortKey, CompletedSubTab, ID, MissingReceiptsTab, MonthYearPeriod, SortOrder, TransactionType } from '@zeniai/client-epic-state'; import { FooterFormIdType } from '../../common'; import { default as TableSection } from '../../components/TableSection'; import { MissingReceiptsBulkUploadInteractions } from './useMissingReceiptsBulkUploadFiles'; export interface PendingMatchInfo { attachmentId: ID; batchId: ID; fileName: string; transactionId: ID; transactionType: string; } export interface MissingReceiptsPageProps { authParams: AuthParams; /** Upload + drag/drop state from ExpenseAutomationPage (nav strip uses same handlers). */ bulkUploadInteractions: MissingReceiptsBulkUploadInteractions; bulkUploadSelector: BulkUploadSelectorData | undefined; isAccountingClassesEnabled: boolean; missingReceiptsTab: MissingReceiptsTab; missingTransactionCount: number; pendingMatchAttachmentId: ID | null; pendingMatchTransactionId: ID | null; selectedPeriod: MonthYearPeriod; tableSectionProps: { allThreadsSectionOpen: boolean; currentFooterFormId: FooterFormIdType; isCOTEnabled: boolean; parentProps: Parameters[0] extends infer T ? Omit : never; onCloseAllThreadsSection: () => void; setCurrentFooterFormId: (formId: FooterFormIdType) => void; setIsJeAccountSettingsOpened: (isOpened: boolean) => void; setResetJeAccountSettingsForm: (fn: () => void) => void; }; bulkUploadEndpoint?: string; /** When the nav is hidden (full-view panel), bulk upload chrome is rendered in the page body. */ missingReceiptsBulkUploadChromeInPageBody?: ReactNode; /** When the nav is hidden (full-view panel), completed-tab sub-tabs + description render in the page body. */ missingReceiptsCompletedChromeInPageBody?: ReactNode; transactionAttachmentsEndpoint?: string; onMissingReceiptsRowClick: (transactionId: ID, transactionType: TransactionType) => void; onPendingMatchChange: (info: PendingMatchInfo | null) => void; setMissingReceiptsTab: (tab: MissingReceiptsTab) => void; onBulkUploadFiles?: (files: File[]) => void; onBulkUploadSuccess?: (batchId: string) => void; /** * Wipes the bulk-upload details cache and `initialBatchDetailsLoaded` flag on tenant/period * change. Distinct from a stale-while-revalidate refresh — the new scope's data is genuinely * unknown, so the Unmatched skeleton is the correct UX. */ onClearBulkUploadBatchDetailsForScopeChange?: () => void; onDeleteUnmatchedReceipt?: (attachmentId: ID) => void; onFetchBulkUploadBatches?: (input?: { cacheOverride?: boolean; invalidateBatchDetailsCache?: boolean; }) => void; onFetchCompletedTransactions?: (pageToken?: string, cacheOverride?: boolean) => void; onFetchMoreBatchDetails?: () => void; onLoadMoreManualSearch?: () => void; onResetBulkUploadSort?: () => void; /** Empty `query` or fewer than 2 trimmed chars: clear manual search results (no new search). */ onSearchTransactionsForManualMatch?: (query: string, pageToken?: string | null) => void; onSetBulkUploadCompletedSubTab?: (tab: CompletedSubTab) => void; onSetBulkUploadSortConfig?: (sortKey: BulkUploadSortKey, sortOrder: SortOrder) => void; } export declare const MissingReceiptsPage: (props: MissingReceiptsPageProps) => import("react/jsx-runtime").JSX.Element;