🚧(app-regie) use mail domain slug in mail domains feature
Stop using mailDomain.id in frontend navigation and mail-domains/ requests. Instead, uses mailDomain slug.
This commit is contained in:
committed by
Sebastien Nobour
parent
f70604df72
commit
0da30eb2e1
@@ -1,5 +1,3 @@
|
|||||||
import { UUID } from 'crypto';
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
UseMutationOptions,
|
UseMutationOptions,
|
||||||
useMutation,
|
useMutation,
|
||||||
@@ -16,14 +14,14 @@ export interface CreateMailboxParams {
|
|||||||
local_part: string;
|
local_part: string;
|
||||||
secondary_email: string;
|
secondary_email: string;
|
||||||
phone_number: string;
|
phone_number: string;
|
||||||
mailDomainId: UUID;
|
mailDomainSlug: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const createMailbox = async ({
|
export const createMailbox = async ({
|
||||||
mailDomainId,
|
mailDomainSlug,
|
||||||
...data
|
...data
|
||||||
}: CreateMailboxParams): Promise<void> => {
|
}: CreateMailboxParams): Promise<void> => {
|
||||||
const response = await fetchAPI(`mail-domains/${mailDomainId}/mailboxes/`, {
|
const response = await fetchAPI(`mail-domains/${mailDomainSlug}/mailboxes/`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: JSON.stringify(data),
|
body: JSON.stringify(data),
|
||||||
});
|
});
|
||||||
@@ -37,7 +35,7 @@ export const createMailbox = async ({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
type UseCreateMailboxParams = { domainId: UUID } & UseMutationOptions<
|
type UseCreateMailboxParams = { mailDomainSlug: string } & UseMutationOptions<
|
||||||
void,
|
void,
|
||||||
APIError,
|
APIError,
|
||||||
CreateMailboxParams
|
CreateMailboxParams
|
||||||
@@ -49,7 +47,10 @@ export function useCreateMailbox(options: UseCreateMailboxParams) {
|
|||||||
mutationFn: createMailbox,
|
mutationFn: createMailbox,
|
||||||
onSuccess: (data, variables, context) => {
|
onSuccess: (data, variables, context) => {
|
||||||
void queryClient.invalidateQueries({
|
void queryClient.invalidateQueries({
|
||||||
queryKey: [KEY_LIST_MAILBOX, { id: variables.mailDomainId }],
|
queryKey: [
|
||||||
|
KEY_LIST_MAILBOX,
|
||||||
|
{ mailDomainSlug: variables.mailDomainSlug },
|
||||||
|
],
|
||||||
});
|
});
|
||||||
if (options?.onSuccess) {
|
if (options?.onSuccess) {
|
||||||
options.onSuccess(data, variables, context);
|
options.onSuccess(data, variables, context);
|
||||||
|
|||||||
@@ -5,19 +5,19 @@ import { APIError, errorCauses, fetchAPI } from '@/api';
|
|||||||
import { MailDomain } from '../types';
|
import { MailDomain } from '../types';
|
||||||
|
|
||||||
export type MailDomainParams = {
|
export type MailDomainParams = {
|
||||||
id: string;
|
slug: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
type MailDomainResponse = MailDomain;
|
type MailDomainResponse = MailDomain;
|
||||||
|
|
||||||
export const getMailDomain = async ({
|
export const getMailDomain = async ({
|
||||||
id,
|
slug,
|
||||||
}: MailDomainParams): Promise<MailDomainResponse> => {
|
}: MailDomainParams): Promise<MailDomainResponse> => {
|
||||||
const response = await fetchAPI(`mail-domains/${id}`);
|
const response = await fetchAPI(`mail-domains/${slug}`);
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new APIError(
|
throw new APIError(
|
||||||
`Failed to get the mail domain ${id}`,
|
`Failed to get the mail domain ${slug}`,
|
||||||
await errorCauses(response),
|
await errorCauses(response),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { APIError, APIList, errorCauses, fetchAPI } from '@/api';
|
|||||||
import { MailDomainMailbox } from '../types';
|
import { MailDomainMailbox } from '../types';
|
||||||
|
|
||||||
export type MailDomainMailboxesParams = {
|
export type MailDomainMailboxesParams = {
|
||||||
id: string;
|
mailDomainSlug: string;
|
||||||
page: number;
|
page: number;
|
||||||
ordering?: string;
|
ordering?: string;
|
||||||
};
|
};
|
||||||
@@ -13,11 +13,11 @@ export type MailDomainMailboxesParams = {
|
|||||||
type MailDomainMailboxesResponse = APIList<MailDomainMailbox>;
|
type MailDomainMailboxesResponse = APIList<MailDomainMailbox>;
|
||||||
|
|
||||||
export const getMailDomainMailboxes = async ({
|
export const getMailDomainMailboxes = async ({
|
||||||
id,
|
mailDomainSlug,
|
||||||
page,
|
page,
|
||||||
ordering,
|
ordering,
|
||||||
}: MailDomainMailboxesParams): Promise<MailDomainMailboxesResponse> => {
|
}: MailDomainMailboxesParams): Promise<MailDomainMailboxesResponse> => {
|
||||||
let url = `mail-domains/${id}/mailboxes/?page=${page}`;
|
let url = `mail-domains/${mailDomainSlug}/mailboxes/?page=${page}`;
|
||||||
|
|
||||||
if (ordering) {
|
if (ordering) {
|
||||||
url += '&ordering=' + ordering;
|
url += '&ordering=' + ordering;
|
||||||
@@ -27,7 +27,7 @@ export const getMailDomainMailboxes = async ({
|
|||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new APIError(
|
throw new APIError(
|
||||||
`Failed to get the mailboxes of mail domain ${id}`,
|
`Failed to get the mailboxes of mail domain ${mailDomainSlug}`,
|
||||||
await errorCauses(response),
|
await errorCauses(response),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,10 +46,11 @@ function formatSortModel(
|
|||||||
|
|
||||||
export function MailDomainsContent({ mailDomain }: { mailDomain: MailDomain }) {
|
export function MailDomainsContent({ mailDomain }: { mailDomain: MailDomain }) {
|
||||||
const [sortModel, setSortModel] = useState<SortModel>([]);
|
const [sortModel, setSortModel] = useState<SortModel>([]);
|
||||||
const { t } = useTranslation();
|
|
||||||
const [isCreateMailboxFormVisible, setIsCreateMailboxFormVisible] =
|
const [isCreateMailboxFormVisible, setIsCreateMailboxFormVisible] =
|
||||||
useState(false);
|
useState(false);
|
||||||
|
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const pagination = usePagination({
|
const pagination = usePagination({
|
||||||
defaultPage: 1,
|
defaultPage: 1,
|
||||||
pageSize: PAGE_SIZE,
|
pageSize: PAGE_SIZE,
|
||||||
@@ -59,7 +60,7 @@ export function MailDomainsContent({ mailDomain }: { mailDomain: MailDomain }) {
|
|||||||
const ordering = sortModel.length ? formatSortModel(sortModel[0]) : undefined;
|
const ordering = sortModel.length ? formatSortModel(sortModel[0]) : undefined;
|
||||||
|
|
||||||
const { data, isLoading, error } = useMailboxes({
|
const { data, isLoading, error } = useMailboxes({
|
||||||
id: mailDomain.id,
|
mailDomainSlug: mailDomain.slug,
|
||||||
page,
|
page,
|
||||||
ordering,
|
ordering,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ export const CreateMailboxForm = ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const { mutate: createMailbox, ...queryState } = useCreateMailbox({
|
const { mutate: createMailbox, ...queryState } = useCreateMailbox({
|
||||||
domainId: mailDomain.id,
|
mailDomainSlug: mailDomain.slug,
|
||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
toast(t('Mailbox created!'), VariantType.SUCCESS, {
|
toast(t('Mailbox created!'), VariantType.SUCCESS, {
|
||||||
duration: 4000,
|
duration: 4000,
|
||||||
@@ -75,7 +75,7 @@ export const CreateMailboxForm = ({
|
|||||||
const onSubmitCallback = (event: React.FormEvent) => {
|
const onSubmitCallback = (event: React.FormEvent) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
void methods.handleSubmit((data) =>
|
void methods.handleSubmit((data) =>
|
||||||
createMailbox({ ...data, mailDomainId: mailDomain.id }),
|
createMailbox({ ...data, mailDomainSlug: mailDomain.slug }),
|
||||||
)();
|
)();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ export const PanelMailDomains = ({ mailDomain }: MailDomainProps) => {
|
|||||||
const { colorsTokens } = useCunninghamTheme();
|
const { colorsTokens } = useCunninghamTheme();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const {
|
const {
|
||||||
query: { id },
|
query: { slug },
|
||||||
} = useRouter();
|
} = useRouter();
|
||||||
|
|
||||||
const isActive = mailDomain.id === id;
|
const isActive = mailDomain.slug === slug;
|
||||||
|
|
||||||
const activeStyle = `
|
const activeStyle = `
|
||||||
border-right: 4px solid ${colorsTokens()['primary-600']};
|
border-right: 4px solid ${colorsTokens()['primary-600']};
|
||||||
@@ -51,7 +51,7 @@ export const PanelMailDomains = ({ mailDomain }: MailDomainProps) => {
|
|||||||
>
|
>
|
||||||
<StyledLink
|
<StyledLink
|
||||||
className="p-s pt-t pb-t"
|
className="p-s pt-t pb-t"
|
||||||
href={`/mail-domains/${mailDomain.id}`}
|
href={`/mail-domains/${mailDomain.slug}`}
|
||||||
>
|
>
|
||||||
<Box $align="center" $direction="row" $gap="0.5rem">
|
<Box $align="center" $direction="row" $gap="0.5rem">
|
||||||
<IconMailDomains
|
<IconMailDomains
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ export interface MailDomain {
|
|||||||
name: string;
|
name: string;
|
||||||
created_at: string;
|
created_at: string;
|
||||||
updated_at: string;
|
updated_at: string;
|
||||||
|
slug: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MailDomainMailbox {
|
export interface MailDomainMailbox {
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ import { NextPageWithLayout } from '@/types/next';
|
|||||||
const Page: NextPageWithLayout = () => {
|
const Page: NextPageWithLayout = () => {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
if (router?.query?.id && typeof router.query.id !== 'string') {
|
if (router?.query?.slug && typeof router.query.slug !== 'string') {
|
||||||
throw new Error('Invalid mail domain id');
|
throw new Error('Invalid mail domain slug');
|
||||||
}
|
}
|
||||||
|
|
||||||
const { id } = router.query;
|
const { slug } = router.query;
|
||||||
|
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@ const Page: NextPageWithLayout = () => {
|
|||||||
error: error,
|
error: error,
|
||||||
isError,
|
isError,
|
||||||
isLoading: isLoading,
|
isLoading: isLoading,
|
||||||
} = useMailDomain({ id: String(id) });
|
} = useMailDomain({ slug: String(slug) });
|
||||||
|
|
||||||
if (error?.status === 404) {
|
if (error?.status === 404) {
|
||||||
navigate.replace(`/404`);
|
navigate.replace(`/404`);
|
||||||
Reference in New Issue
Block a user