feat: add company management and manager role support

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This commit is contained in:
esdrasrenan 2025-10-06 21:26:43 -03:00
parent 409cbea7b9
commit 854887f499
16 changed files with 955 additions and 126 deletions

View file

@ -34,7 +34,8 @@ 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 { convexUserId, isStaff } = useAuth()
const { convexUserId, isStaff, role } = useAuth()
const isManager = role === "manager"
const addComment = useMutation(api.tickets.addComment)
const removeAttachment = useMutation(api.tickets.removeCommentAttachment)
const updateComment = useMutation(api.tickets.updateComment)
@ -119,6 +120,7 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
event.preventDefault()
if (!convexUserId) return
const now = new Date()
const selectedVisibility = isManager ? "PUBLIC" : visibility
const attachments = attachmentsToSend.map((item) => ({ ...item }))
const previewsToRevoke = attachments
.map((attachment) => attachment.previewUrl)
@ -126,7 +128,7 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
const optimistic = {
id: `temp-${now.getTime()}`,
author: ticket.requester,
visibility,
visibility: selectedVisibility,
body: sanitizeEditorHtml(body),
attachments: attachments.map((attachment) => ({
id: attachment.storageId,
@ -153,7 +155,7 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
await addComment({
ticketId: ticket.id as Id<"tickets">,
authorId: convexUserId as Id<"users">,
visibility,
visibility: selectedVisibility,
body: optimistic.body,
attachments: payload,
})
@ -414,13 +416,20 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
) : null}
<div className="flex items-center gap-2">
Visibilidade:
<Select value={visibility} onValueChange={(value) => setVisibility(value as "PUBLIC" | "INTERNAL")}>
<Select
value={visibility}
onValueChange={(value) => {
if (isManager) return
setVisibility(value as "PUBLIC" | "INTERNAL")
}}
disabled={isManager}
>
<SelectTrigger className={selectTriggerClass}>
<SelectValue placeholder="Visibilidade" />
</SelectTrigger>
<SelectContent className="rounded-lg border border-slate-200 bg-white text-neutral-800 shadow-sm">
<SelectItem value="PUBLIC">Pública</SelectItem>
<SelectItem value="INTERNAL">Interna</SelectItem>
{!isManager ? <SelectItem value="INTERNAL">Interna</SelectItem> : null}
</SelectContent>
</Select>
</div>