ai-helpdesk-api / Frontend /src /store /ticketStore.js
ritesh19180's picture
Upload folder using huggingface_hub
d3ec6da verified
Raw
History Blame Contribute Delete
4.28 kB
import { create } from 'zustand';
import { persist } from 'zustand/middleware';
const useTicketStore = create(
persist(
(set) => ({
aiTicket: null,
activeTicket: null,
autoResolvedTickets: [], // For analytics
tickets: [], // Global queue for admins
notifications: [], // User notifications
setAITicket: (data) => set({ aiTicket: data }),
setActiveTicket: (ticket) => set({ activeTicket: ticket }),
addAutoResolvedTicket: (record) => set((state) => ({
autoResolvedTickets: [...state.autoResolvedTickets, record]
})),
addNotification: (notification) => set((state) => ({
notifications: [
{
id: Date.now().toString() + Math.random().toString(36).substr(2, 5),
timestamp: new Date().toISOString(),
read: false,
...notification
},
...(state.notifications || [])
]
})),
addTicket: (ticket) => set((state) => {
return {
tickets: [...state.tickets, ticket]
};
}),
updateTicket: (ticketId, updates) => set((state) => {
// eslint-disable-next-line no-unused-vars
const existingTicket = state.tickets.find(t => t.ticket_id === ticketId);
const updatedTickets = state.tickets.map(t => t.ticket_id === ticketId ? { ...t, ...updates } : t);
const shouldUpdateActive = state.activeTicket?.ticket_id === ticketId;
return {
tickets: updatedTickets,
activeTicket: shouldUpdateActive ? { ...state.activeTicket, ...updates } : state.activeTicket
};
}),
removeTicket: (ticketId) => set((state) => ({
tickets: state.tickets.filter(t => t.ticket_id !== ticketId),
activeTicket: state.activeTicket?.ticket_id === ticketId
? null
: state.activeTicket
})),
appendMessage: (ticketId, message) => set((state) => {
const updatedTickets = state.tickets.map(t =>
t.ticket_id === ticketId
? { ...t, messages: [...(t.messages || []), message] }
: t
);
const shouldUpdateActive = state.activeTicket?.ticket_id === ticketId;
return {
tickets: updatedTickets,
activeTicket: shouldUpdateActive
? { ...state.activeTicket, messages: [...(state.activeTicket?.messages || []), message] }
: state.activeTicket
};
}),
appendNote: (ticketId, note) => set((state) => {
const updatedTickets = state.tickets.map(t =>
t.ticket_id === ticketId
? { ...t, internal_notes: [...(t.internal_notes || []), note] }
: t
);
const shouldUpdateActive = state.activeTicket?.ticket_id === ticketId;
return {
tickets: updatedTickets,
activeTicket: shouldUpdateActive
? { ...state.activeTicket, internal_notes: [...(state.activeTicket?.internal_notes || []), note] }
: state.activeTicket
};
}),
markNotificationsRead: () => set((state) => ({
notifications: (state.notifications || []).map(n => ({ ...n, read: true }))
})),
clearTicket: () => set({ aiTicket: null, activeTicket: null, autoResolvedTickets: [] }),
}),
{
name: 'ticket-storage', // unique name for localStorage key
}
)
);
// Listen for storage changes from other tabs to keep the queue in sync
// Listen for storage changes from other tabs to keep the queue in sync
window.addEventListener('storage', () => {
// Force rehydration on any storage change to catch updates reliably
useTicketStore.persist.rehydrate();
});
export default useTicketStore;