aboutsummaryrefslogtreecommitdiff
path: root/src/components/hooks/useMessages.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/hooks/useMessages.ts')
-rw-r--r--src/components/hooks/useMessages.ts48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/components/hooks/useMessages.ts b/src/components/hooks/useMessages.ts
new file mode 100644
index 0000000..d5bc242
--- /dev/null
+++ b/src/components/hooks/useMessages.ts
@@ -0,0 +1,48 @@
+import { FormattedMessage, type MessageDescriptor, useIntl } from 'react-intl';
+import { labels, messages } from '@/components/messages';
+import type { ApiError } from '@/lib/types';
+
+type FormatMessage = (
+ descriptor: MessageDescriptor,
+ values?: Record<string, string | number | boolean | null | undefined>,
+ opts?: any,
+) => string | null;
+
+interface UseMessages {
+ formatMessage: FormatMessage;
+ messages: typeof messages;
+ labels: typeof labels;
+ getMessage: (id: string) => string;
+ getErrorMessage: (error: ApiError) => string | undefined;
+ FormattedMessage: typeof FormattedMessage;
+}
+
+export function useMessages(): UseMessages {
+ const intl = useIntl();
+
+ const getMessage = (id: string) => {
+ const message = Object.values(messages).find(value => value.id === `message.${id}`);
+
+ return message ? formatMessage(message) : id;
+ };
+
+ const getErrorMessage = (error: ApiError) => {
+ if (!error) {
+ return undefined;
+ }
+
+ const code = error?.code;
+
+ return code ? getMessage(code) : error?.message || 'Unknown error';
+ };
+
+ const formatMessage = (
+ descriptor: MessageDescriptor,
+ values?: Record<string, string | number | boolean | null | undefined>,
+ opts?: any,
+ ) => {
+ return descriptor ? intl.formatMessage(descriptor, values, opts) : null;
+ };
+
+ return { formatMessage, messages, labels, getMessage, getErrorMessage, FormattedMessage };
+}