fix(dashboards): prevent render loops with stable ready handlers and idempotent updates; improve filter hydration guards

fix(export): return 501 with hint when Playwright browsers missing; nicer error toast in UI

fix(site-header): export primary/secondary buttons as named for SC safety; keep static props for compat

fix(portal): add DialogDescription for a11y; tidy preview dialog

fix(csats): avoid reinit state loops with timestamp guard

chore(prisma): default dev DB to prisma/db.dev.sqlite and log path

chore(auth): add dev bypass flags wiring (server/client) for local testing

dev: seed script for Convex demo data
This commit is contained in:
Esdras Renan 2025-11-06 00:01:45 -03:00
parent ff0254df18
commit b62e14d8eb
13 changed files with 210 additions and 103 deletions

View file

@ -90,12 +90,20 @@ export function TicketCsatCard({ ticket }: TicketCsatCardProps) {
const [hoverScore, setHoverScore] = useState<number | null>(null)
const [submitting, setSubmitting] = useState(false)
const ratedAtTimestamp = ticket.csatRatedAt ? ticket.csatRatedAt.getTime() : null
useEffect(() => {
setScore(initialScore)
setComment(initialComment)
setRatedAt(ticket.csatRatedAt ?? null)
setHasSubmitted(initialScore > 0)
}, [initialScore, initialComment, ticket.csatRatedAt])
setScore((prev) => (prev === initialScore ? prev : initialScore))
setComment((prev) => (prev === initialComment ? prev : initialComment))
const nextRatedAt = ratedAtTimestamp == null ? null : new Date(ratedAtTimestamp)
setRatedAt((prev) => {
if (prev === nextRatedAt) return prev
if (prev && nextRatedAt && prev.getTime() === nextRatedAt.getTime()) return prev
return nextRatedAt
})
const nextHasSubmitted = initialScore > 0
setHasSubmitted((prev) => (prev === nextHasSubmitted ? prev : nextHasSubmitted))
}, [initialScore, initialComment, ratedAtTimestamp])
const effectiveScore = hasSubmitted ? score : hoverScore ?? score
const viewerIsStaff = viewerRole === "ADMIN" || viewerRole === "AGENT" || viewerRole === "MANAGER"