94 lines
2.5 KiB
TypeScript
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;
|
|
}
|