feat: migrate auth stack and admin portal

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This commit is contained in:
esdrasrenan 2025-10-05 17:25:57 -03:00
parent ff674d5bb5
commit 7946b8d017
46 changed files with 2564 additions and 178 deletions

View file

@ -33,7 +33,7 @@ const submitButtonClass =
"inline-flex items-center gap-2 rounded-lg border border-black bg-black px-3 py-2 text-sm font-semibold text-white transition hover:bg-[#18181b]/85 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#18181b]/30"
export function TicketComments({ ticket }: TicketCommentsProps) {
const { userId } = useAuth()
const { convexUserId } = useAuth()
const addComment = useMutation(api.tickets.addComment)
const removeAttachment = useMutation(api.tickets.removeCommentAttachment)
const updateComment = useMutation(api.tickets.updateComment)
@ -59,7 +59,7 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
const saveEditedComment = useCallback(
async (commentId: string, originalBody: string) => {
if (!editingComment || editingComment.id !== commentId) return
if (!userId) return
if (!convexUserId) return
if (commentId.startsWith("temp-")) return
const sanitized = sanitizeEditorHtml(editingComment.value)
@ -75,7 +75,7 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
await updateComment({
ticketId: ticket.id as Id<"tickets">,
commentId: commentId as unknown as Id<"ticketComments">,
actorId: userId as Id<"users">,
actorId: convexUserId as Id<"users">,
body: sanitized,
})
setLocalBodies((prev) => ({ ...prev, [commentId]: sanitized }))
@ -88,7 +88,7 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
setSavingCommentId(null)
}
},
[editingComment, ticket.id, updateComment, userId]
[editingComment, ticket.id, updateComment, convexUserId]
)
const commentsAll = useMemo(() => {
@ -97,7 +97,7 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
async function handleSubmit(event: React.FormEvent) {
event.preventDefault()
if (!userId) return
if (!convexUserId) return
const now = new Date()
const attachments = attachmentsToSend.map((item) => ({ ...item }))
const previewsToRevoke = attachments
@ -132,7 +132,7 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
}))
await addComment({
ticketId: ticket.id as Id<"tickets">,
authorId: userId as Id<"users">,
authorId: convexUserId as Id<"users">,
visibility,
body: optimistic.body,
attachments: payload,
@ -153,7 +153,7 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
}
async function handleRemoveAttachment() {
if (!attachmentToRemove || !userId) return
if (!attachmentToRemove || !convexUserId) return
setRemovingAttachment(true)
toast.loading("Removendo anexo...", { id: "remove-attachment" })
try {
@ -161,7 +161,7 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
ticketId: ticket.id as unknown as Id<"tickets">,
commentId: attachmentToRemove.commentId as Id<"ticketComments">,
attachmentId: attachmentToRemove.attachmentId as Id<"_storage">,
actorId: userId as Id<"users">,
actorId: convexUserId as Id<"users">,
})
toast.success("Anexo removido.", { id: "remove-attachment" })
setAttachmentToRemove(null)
@ -203,7 +203,7 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
const bodyPlain = storedBody.replace(/<[^>]*>/g, "").trim()
const isEditing = editingComment?.id === commentId
const isPending = commentId.startsWith("temp-")
const canEdit = Boolean(userId && String(comment.author.id) === userId && !isPending)
const canEdit = Boolean(convexUserId && String(comment.author.id) === convexUserId && !isPending)
const hasBody = bodyPlain.length > 0 || isEditing
return (