diff --git a/apps/app/src/lib/i18n/dictionaries/bn.json b/apps/app/src/lib/i18n/dictionaries/bn.json
index ae8340944..a933f97dd 100644
--- a/apps/app/src/lib/i18n/dictionaries/bn.json
+++ b/apps/app/src/lib/i18n/dictionaries/bn.json
@@ -437,5 +437,10 @@
"User avatar": "ব্যবহারকারীর অবতার",
"Done": "সম্পন্ন",
"How do you want to structure your decision-making process?": "আপনি কীভাবে আপনার সিদ্ধান্ত গ্রহণ প্রক্রিয়া গঠন করতে চান?",
- "No templates found": "কোনো টেমপ্লেট পাওয়া যায়নি"
+ "No templates found": "কোনো টেমপ্লেট পাওয়া যায়নি",
+ "Members could not be loaded": "সদস্যদের লোড করা যায়নি",
+ "Try again": "আবার চেষ্টা করুন",
+ "Role updated successfully": "ভূমিকা সফলভাবে আপডেট করা হয়েছে",
+ "Failed to update role": "ভূমিকা আপডেট করতে ব্যর্থ",
+ "Members list": "সদস্যদের তালিকা"
}
diff --git a/apps/app/src/lib/i18n/dictionaries/en.json b/apps/app/src/lib/i18n/dictionaries/en.json
index 6dd83eeb0..593042006 100644
--- a/apps/app/src/lib/i18n/dictionaries/en.json
+++ b/apps/app/src/lib/i18n/dictionaries/en.json
@@ -437,5 +437,10 @@
"User avatar": "User avatar",
"Done": "Done",
"How do you want to structure your decision-making process?": "How do you want to structure your decision-making process?",
- "No templates found": "No templates found"
+ "No templates found": "No templates found",
+ "Members could not be loaded": "Members could not be loaded",
+ "Try again": "Try again",
+ "Role updated successfully": "Role updated successfully",
+ "Failed to update role": "Failed to update role",
+ "Members list": "Members list"
}
diff --git a/apps/app/src/lib/i18n/dictionaries/es.json b/apps/app/src/lib/i18n/dictionaries/es.json
index 3bc51293f..0688b03e6 100644
--- a/apps/app/src/lib/i18n/dictionaries/es.json
+++ b/apps/app/src/lib/i18n/dictionaries/es.json
@@ -436,5 +436,10 @@
"User avatar": "Avatar del usuario",
"Done": "Listo",
"How do you want to structure your decision-making process?": "¿Cómo quieres estructurar tu proceso de toma de decisiones?",
- "No templates found": "No se encontraron plantillas"
+ "No templates found": "No se encontraron plantillas",
+ "Members could not be loaded": "No se pudieron cargar los miembros",
+ "Try again": "Intentar de nuevo",
+ "Role updated successfully": "Rol actualizado exitosamente",
+ "Failed to update role": "Error al actualizar el rol",
+ "Members list": "Lista de miembros"
}
diff --git a/apps/app/src/lib/i18n/dictionaries/fr.json b/apps/app/src/lib/i18n/dictionaries/fr.json
index d1acc507d..99e93685c 100644
--- a/apps/app/src/lib/i18n/dictionaries/fr.json
+++ b/apps/app/src/lib/i18n/dictionaries/fr.json
@@ -437,5 +437,10 @@
"User avatar": "Avatar de l'utilisateur",
"Done": "Terminé",
"How do you want to structure your decision-making process?": "Comment souhaitez-vous structurer votre processus de prise de décision ?",
- "No templates found": "Aucun modèle trouvé"
+ "No templates found": "Aucun modèle trouvé",
+ "Members could not be loaded": "Les membres n'ont pas pu être chargés",
+ "Try again": "Réessayer",
+ "Role updated successfully": "Rôle mis à jour avec succès",
+ "Failed to update role": "Échec de la mise à jour du rôle",
+ "Members list": "Liste des membres"
}
diff --git a/apps/app/src/lib/i18n/dictionaries/pt.json b/apps/app/src/lib/i18n/dictionaries/pt.json
index 63543c6fe..34f7dc4a2 100644
--- a/apps/app/src/lib/i18n/dictionaries/pt.json
+++ b/apps/app/src/lib/i18n/dictionaries/pt.json
@@ -437,5 +437,10 @@
"User avatar": "Avatar do usuário",
"Done": "Concluído",
"How do you want to structure your decision-making process?": "Como você deseja estruturar seu processo de tomada de decisão?",
- "No templates found": "Nenhum modelo encontrado"
+ "No templates found": "Nenhum modelo encontrado",
+ "Members could not be loaded": "Não foi possível carregar os membros",
+ "Try again": "Tentar novamente",
+ "Role updated successfully": "Função atualizada com sucesso",
+ "Failed to update role": "Falha ao atualizar a função",
+ "Members list": "Lista de membros"
}
diff --git a/apps/app/src/utils/APIErrorBoundary.tsx b/apps/app/src/utils/APIErrorBoundary.tsx
index 7e3c8e47c..a58c54339 100644
--- a/apps/app/src/utils/APIErrorBoundary.tsx
+++ b/apps/app/src/utils/APIErrorBoundary.tsx
@@ -1,13 +1,13 @@
'use client';
-import { ReactElement, ReactNode } from 'react';
+import { ReactNode } from 'react';
import {
FallbackProps,
ErrorBoundary as ReactErrorBoundary,
} from 'react-error-boundary';
type APIFallbacks = {
- [code: string]: ReactElement
| null;
+ [code: string]: ((props: FallbackProps) => ReactNode) | null;
};
export const APIErrorBoundary = ({
@@ -19,16 +19,16 @@ export const APIErrorBoundary = ({
}) => {
return (
{
+ fallbackRender={({ error, resetErrorBoundary }: FallbackProps) => {
const fallback = fallbacks[error.data?.httpStatus];
if (fallback) {
- return fallback;
+ return fallback({ error, resetErrorBoundary });
}
// support a default fallback
if (fallbacks['default']) {
- return fallbacks['default'];
+ return fallbacks['default']({ error, resetErrorBoundary });
}
throw error;
diff --git a/apps/app/src/utils/ClientOnly.tsx b/apps/app/src/utils/ClientOnly.tsx
index 44b731990..8ab2c4fac 100644
--- a/apps/app/src/utils/ClientOnly.tsx
+++ b/apps/app/src/utils/ClientOnly.tsx
@@ -3,7 +3,13 @@
import { useEffect, useState } from 'react';
import type { ReactNode } from 'react';
-export const ClientOnly = ({ children }: { children: ReactNode }) => {
+export const ClientOnly = ({
+ children,
+ fallback = null,
+}: {
+ children: ReactNode;
+ fallback?: ReactNode;
+}) => {
const [isMounted, setIsMounted] = useState(false);
useEffect(() => {
@@ -11,7 +17,7 @@ export const ClientOnly = ({ children }: { children: ReactNode }) => {
}, []);
if (!isMounted) {
- return ;
+ return <>{fallback}>;
}
return <>{children}>;
diff --git a/packages/hooks/src/useCursorPagination.ts b/packages/hooks/src/useCursorPagination.ts
index 8ef945a29..a74257cda 100644
--- a/packages/hooks/src/useCursorPagination.ts
+++ b/packages/hooks/src/useCursorPagination.ts
@@ -1,4 +1,4 @@
-import { useState } from 'react';
+import { useCallback, useState } from 'react';
/**
* Custom hook for managing cursor-based pagination state.
@@ -55,10 +55,10 @@ export function useCursorPagination(limit: number) {
* Reset pagination to the first page.
* Useful when filters or search queries change.
*/
- const reset = () => {
+ const reset = useCallback(() => {
setCursor(null);
setCursorHistory([null]);
- };
+ }, []);
return {
cursor,
diff --git a/packages/styles/shared-styles.css b/packages/styles/shared-styles.css
index 08440c5b4..d4fe25221 100644
--- a/packages/styles/shared-styles.css
+++ b/packages/styles/shared-styles.css
@@ -320,7 +320,7 @@
--radius-lg: 0.375rem;
--radius-xs: calc(var(--radius-lg) * 0.25);
--radius-sm: calc(var(--radius-lg) * 0.5);
- --radius-md: calc(var(--radius-lg) * 0.75);
+ --radius-md: calc(var(--radius-lg) * 1.33);
--radius-xl: calc(var(--radius-lg) * 1.5);
--radius-2xl: calc(var(--radius-lg) * 2);
--radius-3xl: calc(var(--radius-lg) * 3);
@@ -614,6 +614,7 @@
100% {
transform: rotate(-5deg);
}
+
50% {
transform: rotate(5deg);
}
@@ -624,6 +625,7 @@
100% {
background-position: 0% 0%;
}
+
50% {
background-position: 100% 100%;
}
diff --git a/services/api/src/encoders/profiles.ts b/services/api/src/encoders/profiles.ts
index 3ce29b72c..256650c30 100644
--- a/services/api/src/encoders/profiles.ts
+++ b/services/api/src/encoders/profiles.ts
@@ -70,3 +70,5 @@ export const profileUserEncoder = createSelectSchema(profileUsers).extend({
// Roles using shared minimal encoder
roles: z.array(accessRoleMinimalEncoder),
});
+
+export type ProfileUser = z.infer;