feat(email): expose provider-neutral reads
This commit is contained in:
@@ -37,12 +37,22 @@ export type CorrespondenceInboxItem = {
|
||||
attachmentCount: number;
|
||||
};
|
||||
|
||||
type EmailProviderStatus = {
|
||||
provider: string;
|
||||
displayName: string;
|
||||
connected: boolean;
|
||||
address?: string | null;
|
||||
canRead: boolean;
|
||||
canSend: boolean;
|
||||
};
|
||||
|
||||
export default function CorrespondenceInboxPage() {
|
||||
const navigate = useNavigate();
|
||||
const [searchParams, setSearchParams] = useSearchParams();
|
||||
const view = searchParams.get("view") === "review" ? "review" : "inbox";
|
||||
const { toast } = useToast();
|
||||
const [items, setItems] = useState<CorrespondenceInboxItem[]>([]);
|
||||
const [providers, setProviders] = useState<EmailProviderStatus[]>([]);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [query, setQuery] = useState("");
|
||||
const [direction, setDirection] = useState<string>("all");
|
||||
@@ -70,6 +80,12 @@ export default function CorrespondenceInboxPage() {
|
||||
if (view === "inbox") void load();
|
||||
}, [load, view]);
|
||||
|
||||
useEffect(() => {
|
||||
api.get<EmailProviderStatus[]>("/email/providers")
|
||||
.then((response) => setProviders(response.data ?? []))
|
||||
.catch(() => setProviders([]));
|
||||
}, []);
|
||||
|
||||
const filteredSummary = useMemo(() => {
|
||||
const linked = items.filter((item) => item.externalThreadId).length;
|
||||
const inbound = items.filter((item) => item.direction === "inbound").length;
|
||||
@@ -102,6 +118,18 @@ export default function CorrespondenceInboxPage() {
|
||||
</Box>
|
||||
</Box>
|
||||
|
||||
<Box sx={{ display: "flex", gap: 1, flexWrap: "wrap", mb: 2 }} aria-label="Email provider status">
|
||||
{providers.map((provider) => (
|
||||
<Chip
|
||||
key={provider.provider}
|
||||
size="small"
|
||||
color={provider.connected ? "success" : "default"}
|
||||
variant="outlined"
|
||||
label={`${provider.displayName}: ${provider.connected ? provider.address || "Connected" : "Not connected"}${provider.canSend ? " · Send enabled" : " · Read only"}`}
|
||||
/>
|
||||
))}
|
||||
</Box>
|
||||
|
||||
{view === "review" ? <GmailReviewPage embedded /> : <>
|
||||
<Box sx={{ display: "grid", gridTemplateColumns: { xs: "1fr", md: "2fr 1fr 1fr auto" }, gap: 1.25, mb: 2 }}>
|
||||
<TextField label="Search" value={query} onChange={(e) => setQuery(e.target.value)} placeholder="Company, role, recruiter, subject" />
|
||||
|
||||
Reference in New Issue
Block a user