Files
HKSingleParty/03_source/frontend/src/actions/mail.ts
2025-05-28 09:55:51 +08:00

94 lines
2.5 KiB
TypeScript

import type { SWRConfiguration } from 'swr';
import type { IMail, IMailLabel } from 'src/types/mail';
import useSWR from 'swr';
import { useMemo } from 'react';
import { keyBy } from 'es-toolkit';
import { fetcher, endpoints } from 'src/lib/axios';
// ----------------------------------------------------------------------
const swrOptions: SWRConfiguration = {
revalidateIfStale: false,
revalidateOnFocus: false,
revalidateOnReconnect: false,
};
// ----------------------------------------------------------------------
type LabelsData = {
labels: IMailLabel[];
};
export function useGetLabels() {
const url = endpoints.mail.labels;
const { data, isLoading, error, isValidating } = useSWR<LabelsData>(url, fetcher, swrOptions);
const memoizedValue = useMemo(
() => ({
labels: data?.labels || [],
labelsLoading: isLoading,
labelsError: error,
labelsValidating: isValidating,
labelsEmpty: !isLoading && !isValidating && !data?.labels.length,
}),
[data?.labels, error, isLoading, isValidating]
);
return memoizedValue;
}
// ----------------------------------------------------------------------
type MailsData = {
mails: IMail[];
};
export function useGetMails(labelId: string) {
const url = labelId ? [endpoints.mail.list, { params: { labelId } }] : '';
const { data, isLoading, error, isValidating } = useSWR<MailsData>(url, fetcher, swrOptions);
const memoizedValue = useMemo(() => {
const byId = data?.mails.length ? keyBy(data?.mails, (option) => option.id) : {};
const allIds = Object.keys(byId);
return {
mails: { byId, allIds },
mailsLoading: isLoading,
mailsError: error,
mailsValidating: isValidating,
mailsEmpty: !isLoading && !isValidating && !allIds.length,
};
}, [data?.mails, error, isLoading, isValidating]);
return memoizedValue;
}
// ----------------------------------------------------------------------
type MailData = {
mail: IMail;
};
export function useGetMail(mailId: string) {
const url = mailId ? [endpoints.mail.details, { params: { mailId } }] : '';
const { data, isLoading, error, isValidating } = useSWR<MailData>(url, fetcher, swrOptions);
const memoizedValue = useMemo(
() => ({
mail: data?.mail,
mailLoading: isLoading,
mailError: error,
mailValidating: isValidating,
mailEmpty: !isLoading && !isValidating && !data?.mail,
}),
[data?.mail, error, isLoading, isValidating]
);
return memoizedValue;
}