@php
$helpdeskAttachmentAccept = collect(config('helpdesk.allowed_extensions', config('helpdesk.allowed_mimes', [])))
->filter(fn ($extension) => is_string($extension) && trim($extension) !== '')
->map(fn ($extension) => '.' . strtolower(ltrim(trim($extension), '.')))
->unique()
->implode(',');
@endphp
@props(['comments', 'level' => 0, 'ticket' => null, 'canSeeInternalNotes' => false])
@foreach ($comments as $comment)
@php
$commentUser = $comment->relationLoaded('user') ? $comment->getRelation('user') : null;
$commentAttachments = $comment->relationLoaded('attachments')
? $comment->getRelation('attachments')
: collect();
$commentReplies = $comment->relationLoaded('replies') ? $comment->getRelation('replies') : collect();
$replyFormId = 'helpdesk-reply-form-' . $comment->id;
$currentTicket = $ticket ?? ($comment->ticket ?? null);
$replyCount = $commentReplies->count();
$isInternal = (bool) $comment->is_internal;
$borderClass = $isInternal
? 'border-purple-400/70 dark:border-purple-600/70'
: 'border-zinc-200 dark:border-zinc-700';
$railClass = $isInternal
? 'bg-purple-500'
: ((int) $level % 3 === 0
? 'bg-red-500'
: ((int) $level % 3 === 1
? 'bg-blue-500'
: 'bg-emerald-500'));
$commentSubject = trim((string) ($comment->subject ?? ''));
if ($commentSubject === '') {
$plainSubject = trim((string) ($comment->body_text ?? strip_tags((string) $comment->body)));
$commentSubject = Str::limit($plainSubject !== '' ? $plainSubject : 'Response', 72);
}
if ($isInternal && !Str::startsWith(Str::lower($commentSubject), 'internal')) {
$commentSubject = 'Internal note';
}
$renderedBody = html_entity_decode((string) $comment->body, ENT_QUOTES | ENT_HTML5, 'UTF-8');
while (
str_contains($renderedBody, '<') ||
str_contains($renderedBody, '>') ||
str_contains($renderedBody, '<')
) {
$decodedBody = html_entity_decode($renderedBody, ENT_QUOTES | ENT_HTML5, 'UTF-8');
if ($decodedBody === $renderedBody) {
break;
}
$renderedBody = $decodedBody;
}
if ($currentTicket !== null) {
$renderedBody = strtr($renderedBody, [
'{{ ticket . reference }}' => (string) e((string) ($currentTicket->reference ?? '')),
'{{ ticket . subject }}' => (string) e((string) ($currentTicket->subject ?? '')),
'{{ ticket . status }}' => (string) e((string) ($currentTicket->status?->name ?? '')),
'{{ ticket . priority }}' => (string) e((string) ($currentTicket->priority?->name ?? '')),
'{{ ticket . category }}' => (string) e((string) ($currentTicket->category?->name ?? '')),
'{{ ticket . project }}' => (string) e((string) ($currentTicket->project?->title ?? '')),
'{{ ticket . team }}' => (string) e((string) ($currentTicket->team?->name ?? '')),
'{{ requester . name }}' => (string) e(
(string) ($currentTicket->owner?->name ?? ($currentTicket->user?->name ?? '')),
),
'{{ agent . name }}' => (string) e((string) ($currentTicket->agent?->name ?? '')),
'{{ actor . name }}' => (string) e((string) ($commentUser?->name ?? '')),
'{{ ticket . url }}' => (string) e(
route('helpdesk.tickets.show', ['ticket' => $currentTicket->getKey()]),
),
]);
}
$containsHtml = $renderedBody !== strip_tags($renderedBody);
$renderedBody = preg_replace('/<\s*(script|style)[^>]*>.*?<\s*\/\s*\1\s*>/is', '', $renderedBody) ?: '';
$renderedBody = preg_replace('/\s+on[a-z]+\s*=\s*("[^"]*"|\'[^\']*\'|[^\s>]+)/i', '', $renderedBody) ?: '';
$renderedBody = preg_replace('/javascript\s*:/i', '', $renderedBody) ?: '';
$renderedBody = strip_tags(
$renderedBody,
'