From 7ecb4c111063716d0cd11431ced2623d6bb4287a Mon Sep 17 00:00:00 2001 From: esdrasrenan Date: Sun, 7 Dec 2025 21:09:02 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20corrige=20tipo=20JSON=20para=20String=20?= =?UTF-8?q?no=20SQLite=20e=20acentua=C3=A7=C3=A3o=20nos=20textos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Altera typePreferences e categoryPreferences de Json para String no Prisma - Atualiza API de preferências para fazer parse/stringify de JSON - Corrige todos os textos sem acentuação nos componentes de notificação 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- prisma/schema.prisma | 4 +- .../api/notifications/preferences/route.ts | 31 ++++++-- src/app/portal/profile/notifications/page.tsx | 12 +-- src/app/rate/[token]/page.tsx | 38 +++++----- src/app/settings/notifications/page.tsx | 10 +-- src/app/ticket-view/[token]/page.tsx | 24 +++--- .../notification-preferences-form.tsx | 74 +++++++++---------- 7 files changed, 104 insertions(+), 89 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index b0fd008..9fe293c 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -462,11 +462,11 @@ model NotificationPreferences { // Preferências por tipo de notificação (JSON) // Ex: { "ticket_created": true, "ticket_resolved": true, "comment_public": false } - typePreferences Json @default("{}") + typePreferences String @default("{}") // Preferências por categoria de ticket (JSON) // Ex: { "category_id_1": true, "category_id_2": false } - categoryPreferences Json @default("{}") + categoryPreferences String @default("{}") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt diff --git a/src/app/api/notifications/preferences/route.ts b/src/app/api/notifications/preferences/route.ts index 3b3def9..fa5046c 100644 --- a/src/app/api/notifications/preferences/route.ts +++ b/src/app/api/notifications/preferences/route.ts @@ -80,10 +80,17 @@ export async function GET(_request: NextRequest) { ? Object.keys(NOTIFICATION_TYPES) : COLLABORATOR_VISIBLE_TYPES + // Parse JSON strings + const typePrefs: Record = prefs!.typePreferences + ? JSON.parse(prefs!.typePreferences as string) + : {} + const catPrefs = prefs!.categoryPreferences + ? JSON.parse(prefs!.categoryPreferences as string) + : {} + // Monta resposta com configuração de cada tipo const typeConfigs = availableTypes.map((type) => { const config = NOTIFICATION_TYPES[type as NotificationType] - const typePrefs = prefs!.typePreferences as Record const enabled = typePrefs[type] ?? config.defaultEnabled return { @@ -104,7 +111,7 @@ export async function GET(_request: NextRequest) { timezone: prefs.timezone, digestFrequency: prefs.digestFrequency, types: typeConfigs, - categoryPreferences: prefs.categoryPreferences, + categoryPreferences: catPrefs, isStaff, }) } catch (error) { @@ -194,11 +201,19 @@ export async function PUT(request: NextRequest) { quietHoursEnd: quietHoursEnd ?? null, timezone: timezone ?? "America/Sao_Paulo", digestFrequency: digestFrequency ?? "immediate", - typePreferences: validatedTypePrefs, - categoryPreferences: categoryPreferences ?? {}, + typePreferences: JSON.stringify(validatedTypePrefs), + categoryPreferences: JSON.stringify(categoryPreferences ?? {}), }, }) } else { + // Parse existing JSON strings + const existingTypePrefs = existingPrefs.typePreferences + ? JSON.parse(existingPrefs.typePreferences as string) + : {} + const existingCatPrefs = existingPrefs.categoryPreferences + ? JSON.parse(existingPrefs.categoryPreferences as string) + : {} + // Atualiza preferências existentes await prisma.notificationPreferences.update({ where: { userId }, @@ -208,11 +223,11 @@ export async function PUT(request: NextRequest) { quietHoursEnd: quietHoursEnd !== undefined ? quietHoursEnd : existingPrefs.quietHoursEnd, timezone: timezone ?? existingPrefs.timezone, digestFrequency: digestFrequency ?? existingPrefs.digestFrequency, - typePreferences: { - ...(existingPrefs.typePreferences as Record), + typePreferences: JSON.stringify({ + ...existingTypePrefs, ...validatedTypePrefs, - }, - categoryPreferences: categoryPreferences ?? existingPrefs.categoryPreferences, + }), + categoryPreferences: JSON.stringify(categoryPreferences ?? existingCatPrefs), }, }) } diff --git a/src/app/portal/profile/notifications/page.tsx b/src/app/portal/profile/notifications/page.tsx index f88d231..827afba 100644 --- a/src/app/portal/profile/notifications/page.tsx +++ b/src/app/portal/profile/notifications/page.tsx @@ -5,8 +5,8 @@ import { NotificationPreferencesForm } from "@/components/settings/notification- import { requireAuthenticatedSession } from "@/lib/auth-server" export const metadata: Metadata = { - title: "Preferencias de notificacao", - description: "Configure quais notificacoes por e-mail deseja receber.", + title: "Preferências de notificação", + description: "Configure quais notificações por e-mail deseja receber.", } export default async function PortalNotificationSettingsPage() { @@ -14,7 +14,7 @@ export default async function PortalNotificationSettingsPage() { const role = (session.user.role ?? "").toLowerCase() const persona = (session.user.machinePersona ?? "").toLowerCase() - // Colaboradores e maquinas com persona de colaborador podem acessar + // Colaboradores e máquinas com persona de colaborador podem acessar const allowedRoles = new Set(["collaborator", "manager", "admin", "agent"]) const isMachinePersonaAllowed = role === "machine" && (persona === "collaborator" || persona === "manager") const allowed = allowedRoles.has(role) || isMachinePersonaAllowed @@ -23,7 +23,7 @@ export default async function PortalNotificationSettingsPage() { redirect("/portal") } - // Staff deve usar a pagina de configuracoes completa + // Staff deve usar a página de configurações completa const staffRoles = new Set(["admin", "manager", "agent"]) if (staffRoles.has(role)) { redirect("/settings/notifications") @@ -32,9 +32,9 @@ export default async function PortalNotificationSettingsPage() { return (
-

Preferencias de notificacao

+

Preferências de notificação

- Configure quais notificacoes por e-mail deseja receber sobre seus chamados. + Configure quais notificações por e-mail deseja receber sobre seus chamados.

diff --git a/src/app/rate/[token]/page.tsx b/src/app/rate/[token]/page.tsx index 3d94192..67f500c 100644 --- a/src/app/rate/[token]/page.tsx +++ b/src/app/rate/[token]/page.tsx @@ -28,7 +28,7 @@ export default function RatePage() { const [comment, setComment] = useState("") const [error, setError] = useState(null) - // Se ja avaliou, mostra mensagem + // Se já avaliou, mostra mensagem if (alreadyRated && existingRating) { return (
@@ -37,9 +37,9 @@ export default function RatePage() {
- Chamado ja avaliado + Chamado já avaliado - Voce ja avaliou este chamado anteriormente. + Você já avaliou este chamado anteriormente. @@ -54,7 +54,7 @@ export default function RatePage() { ))}

- Sua avaliacao: {existingRating} estrela{existingRating > 1 ? "s" : ""} + Sua avaliação: {existingRating} estrela{existingRating > 1 ? "s" : ""}

@@ -62,7 +62,7 @@ export default function RatePage() { ) } - // Se acabou de avaliar, mostra formulario para comentario + // Se acabou de avaliar, mostra formulário para comentário if (submitted && rating > 0) { return (
@@ -71,9 +71,9 @@ export default function RatePage() {
- Obrigado pela avaliacao! + Obrigado pela avaliação! - Sua opiniao e muito importante para nos. + Sua opinião é muito importante para nós. @@ -89,10 +89,10 @@ export default function RatePage() {
- +