init commit,
This commit is contained in:
93
03_source/frontend/src/actions/mail.ts
Normal file
93
03_source/frontend/src/actions/mail.ts
Normal file
@@ -0,0 +1,93 @@
|
||||
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;
|
||||
}
|
Reference in New Issue
Block a user