const ITSupportView = ({ showCreateForm, onShowCreateForm, initialDescription, initialDraft = null, initialAttachments = [], fromAIChat, onBackToChat }) => { const { useState, useEffect } = React; const [tickets, setTickets] = useState([]); const [comments, setComments] = useState({}); const [selectedTicket, setSelectedTicket] = useState(null); const [replyText, setReplyText] = useState(''); const [searchText, setSearchText] = useState(''); const [statusFilter, setStatusFilter] = useState('All Statuses'); const [priorityFilter, setPriorityFilter] = useState('All Priorities'); const [createdFilter, setCreatedFilter] = useState('Created (All Time)'); const [updatedFilter, setUpdatedFilter] = useState('Updated (All Time)'); const [editingCommentId, setEditingCommentId] = useState(null); const [editCommentText, setEditCommentText] = useState(''); useEffect(() => { if (tickets.length > 0 && !selectedTicket && !showCreateForm) { setSelectedTicket(tickets[0]); } }, [showCreateForm, tickets]); const filterByTime = (dateString, filter) => { const date = new Date(dateString); const now = new Date(); const diffMinutes = (now - date) / 60000; if (filter.includes('Last Hour')) return diffMinutes <= 60; if (filter.includes('Last 24 Hours')) return diffMinutes <= 1440; if (filter.includes('Last 7 Days')) return diffMinutes <= 10080; if (filter.includes('Last 30 Days')) return diffMinutes <= 43200; return true; }; const filteredTickets = tickets.filter(ticket => { const matchesStatus = statusFilter === 'All Statuses' || ticket.Status === statusFilter; const matchesPriority = priorityFilter === 'All Priorities' || ticket.Priority === priorityFilter; const matchesCreated = filterByTime(ticket.IssueDate, createdFilter); const matchesUpdated = filterByTime(ticket.LastUpdated, updatedFilter); const matchesSearch = searchText === '' || ticket.Subject.toLowerCase().includes(searchText.toLowerCase()) || ticket.IssueID.toString().includes(searchText) || ticket.Category.toLowerCase().includes(searchText.toLowerCase()); return matchesStatus && matchesPriority && matchesCreated && matchesUpdated && matchesSearch; }); const handleSendReply = () => { if (!replyText.trim() || !selectedTicket) return; const newComment = { CommentID: Math.floor(Math.random() * 90000) + 10000, UserName: "Hotel Rep", CommentDate: new Date().toISOString(), Body: replyText, IsSystem: false }; setComments(prev => ({ ...prev, [selectedTicket.IssueID]: [...(prev[selectedTicket.IssueID] || []), newComment] })); setTickets(prev => prev.map(t => t.IssueID === selectedTicket.IssueID ? { ...t, LastUpdated: new Date().toISOString() } : t )); setReplyText(''); }; const handleEditComment = (commentId, currentBody) => { setEditingCommentId(commentId); setEditCommentText(currentBody); }; const handleSaveEdit = (commentId) => { if (!editCommentText.trim() || !selectedTicket) return; const originalComment = comments[selectedTicket.IssueID].find(c => c.CommentID === commentId); const textChanged = originalComment && editCommentText.trim() !== originalComment.Body.trim(); setComments(prev => ({ ...prev, [selectedTicket.IssueID]: prev[selectedTicket.IssueID].map(c => c.CommentID === commentId ? { ...c, Body: editCommentText, CommentDate: textChanged ? new Date().toISOString() : c.CommentDate, Edited: textChanged ? true : (c.Edited || false) } : c ) })); setEditingCommentId(null); setEditCommentText(''); }; const handleCancelEdit = () => { setEditingCommentId(null); setEditCommentText(''); }; const handleTicketSubmit = (newTicket) => { setTickets(prev => [newTicket, ...prev]); if (!comments[newTicket.IssueID]) { setComments(prev => ({ ...prev, [newTicket.IssueID]: [] })); } setSelectedTicket(newTicket); // If ticket was created from AI chat, clear chat for new conversation if (fromAIChat && onBackToChat) { onBackToChat(true); // Pass true to indicate successful submission } }; if (showCreateForm) { return onShowCreateForm(false, '')} initialDescription={initialDescription} initialDraft={initialDraft} initialAttachments={initialAttachments} fromAIChat={fromAIChat} onBackToChat={onBackToChat} onSubmit={handleTicketSubmit} />; } return (

Ticket History

setSearchText(e.target.value)} className="w-full border border-gray-300 rounded-lg px-3 py-2 text-sm" />
{filteredTickets.length === 0 ? (
No tickets match your filters
) : ( filteredTickets.map(ticket => (
setSelectedTicket(ticket)} className={`p-4 rounded-xl border-2 cursor-pointer transition-all ${selectedTicket?.IssueID === ticket.IssueID ? 'border-primary bg-primary/5' : 'border-gray-200 bg-white hover:border-gray-300' }`} >
#{ticket.IssueID} {ticket.Subject}
{ticket.Status} {ticket.Priority} Updated {getRelativeTime(ticket.LastUpdated)}
)) )}
{selectedTicket ? (

{selectedTicket.Subject}

#{selectedTicket.IssueID}
Status: {selectedTicket.Status}
Priority: {selectedTicket.Priority}
Category: {selectedTicket.Category}
Assigned: {selectedTicket.AssignedTo}
Created: {formatDate(selectedTicket.IssueDate)}
Updated: {formatDate(selectedTicket.LastUpdated)}
{selectedTicket.Description && (

Description

{selectedTicket.Description}

)}
{comments[selectedTicket.IssueID] && comments[selectedTicket.IssueID].length > 0 && (

Comments

{comments[selectedTicket.IssueID].map(comment => (
{comment.UserName}
{formatDate(comment.CommentDate)} {comment.Edited && (edited)} {comment.UserName === "Hotel Rep" && editingCommentId !== comment.CommentID && ( )}
{editingCommentId === comment.CommentID ? (