make sync visible

pull/41/head
ahmed.mujtaba 2026-08-31 17:03:21 +05:00
parent d0737e03ad
commit 0f6de132f8
1 changed files with 30 additions and 0 deletions

View File

@ -959,6 +959,24 @@ export default function Inbox() {
markDuplicate.mutate({ id: item.id, isDuplicate: !item.duplicate, kind: item.kind }) markDuplicate.mutate({ id: item.id, isDuplicate: !item.duplicate, kind: item.kind })
} }
const sync = useMutation({
mutationFn: () => inboxApi.syncMailbox(),
onSuccess: async (res) => {
await qc.invalidateQueries({ queryKey: qk.mailbox.all() })
// /email/fetch reports what the intake gate did with the page. The key is
// additive and absent when the gate is disabled, so fall back to the old
// message rather than rendering "undefined filtered out".
const t = res?.triage
toast(
t
? `Mailbox synced — ${t.ingested} imported, ${t.skipped} filtered out`
: 'Mailbox synced',
'success',
)
},
onError: (err) => toast(friendlyAuthError(err, 'Sync failed'), 'error'),
})
return ( return (
<div className="page"> <div className="page">
<PageHeader <PageHeader
@ -989,6 +1007,18 @@ export default function Inbox() {
{isForms && ( {isForms && (
<span className="integration-status"><span className="pulse" />Google Sheets · Form data</span> <span className="integration-status"><span className="pulse" />Google Sheets · Form data</span>
)} )}
{!isForms && (
<button
className="btn btn-secondary"
disabled={sync.isPending}
onClick={() => {
toast('Fetching from Outlook…', 'info')
sync.mutate()
}}
>
<Icon name="refresh" /> {sync.isPending ? 'Syncing…' : 'Sync'}
</button>
)}
<button className="btn btn-primary" onClick={() => navigate('/import')}> <button className="btn btn-primary" onClick={() => navigate('/import')}>
<Icon name="upload" /> Upload CVs <Icon name="upload" /> Upload CVs
</button> </button>