|
import type { Middleware } from '@reduxjs/toolkit'; |
|
import { isRejectedWithValue } from '@reduxjs/toolkit'; |
|
import { toast } from 'features/toast/toast'; |
|
import { t } from 'i18next'; |
|
import { z } from 'zod'; |
|
|
|
const zRejectedForbiddenAction = z.object({ |
|
payload: z.object({ |
|
status: z.literal(403), |
|
data: z.object({ |
|
detail: z.string(), |
|
}), |
|
}), |
|
meta: z |
|
.object({ |
|
arg: z |
|
.object({ |
|
endpointName: z.string().optional(), |
|
}) |
|
.optional(), |
|
}) |
|
.optional(), |
|
}); |
|
|
|
export const authToastMiddleware: Middleware = () => (next) => (action) => { |
|
if (isRejectedWithValue(action)) { |
|
try { |
|
const parsed = zRejectedForbiddenAction.parse(action); |
|
const endpointName = parsed.meta?.arg?.endpointName; |
|
if (endpointName === 'getImageDTO') { |
|
|
|
return next(action); |
|
} |
|
|
|
const customMessage = parsed.payload.data.detail !== 'Forbidden' ? parsed.payload.data.detail : undefined; |
|
toast({ |
|
id: `auth-error-toast-${endpointName}`, |
|
title: t('toast.somethingWentWrong'), |
|
status: 'error', |
|
description: customMessage, |
|
}); |
|
} catch (error) { |
|
|
|
} |
|
} |
|
|
|
return next(action); |
|
}; |
|
|