Update App.tsx
This commit is contained in:
100
App.tsx
100
App.tsx
@@ -53,7 +53,8 @@ const App: React.FC = () => {
|
|||||||
queues: data.queues,
|
queues: data.queues,
|
||||||
articles: data.articles,
|
articles: data.articles,
|
||||||
surveys: data.surveys,
|
surveys: data.surveys,
|
||||||
tickets: tickets
|
tickets: tickets,
|
||||||
|
settings: data.settings || prev.settings
|
||||||
}));
|
}));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
showToast("Errore caricamento dati dal server", 'error');
|
showToast("Errore caricamento dati dal server", 'error');
|
||||||
@@ -63,16 +64,15 @@ const App: React.FC = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Carica i dati all'avvio solo se l'utente è loggato, oppure carica dati pubblici se necessario.
|
// Carica dati al caricamento se l'utente è loggato
|
||||||
// In questo design, carichiamo tutto dopo il login per sicurezza, o pre-fetch.
|
if (state.currentUser) {
|
||||||
// Per semplicità, carichiamo tutto all'avvio per popolare le liste, ma in prod si farebbe dopo auth.
|
loadData();
|
||||||
// Qui chiamiamo loadData solo se c'è un utente, altrimenti auth screen
|
}
|
||||||
}, []);
|
}, [state.currentUser]);
|
||||||
|
|
||||||
// Effect to refresh tickets periodically if logged in
|
// Effect to refresh tickets periodically if logged in
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (state.currentUser) {
|
if (state.currentUser) {
|
||||||
loadData();
|
|
||||||
const interval = setInterval(loadData, 10000); // Poll every 10s
|
const interval = setInterval(loadData, 10000); // Poll every 10s
|
||||||
return () => clearInterval(interval);
|
return () => clearInterval(interval);
|
||||||
}
|
}
|
||||||
@@ -155,12 +155,10 @@ const App: React.FC = () => {
|
|||||||
body: JSON.stringify({ role, content: message })
|
body: JSON.stringify({ role, content: message })
|
||||||
});
|
});
|
||||||
|
|
||||||
// Update local state optimistically or via re-fetch
|
|
||||||
setState(prev => ({
|
setState(prev => ({
|
||||||
...prev,
|
...prev,
|
||||||
tickets: prev.tickets.map(t => {
|
tickets: prev.tickets.map(t => {
|
||||||
if (t.id !== ticketId) return t;
|
if (t.id !== ticketId) return t;
|
||||||
// Se l'utente risponde, riapri il ticket se era risolto (gestito anche dal backend)
|
|
||||||
const shouldReopen = role === 'user' && t.status === TicketStatus.RESOLVED;
|
const shouldReopen = role === 'user' && t.status === TicketStatus.RESOLVED;
|
||||||
return {
|
return {
|
||||||
...t,
|
...t,
|
||||||
@@ -254,16 +252,80 @@ const App: React.FC = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// --- Stub functions for settings (implement API if needed) ---
|
// --- Settings & Management (Now with Persistence) ---
|
||||||
const addAgent = (agent: Agent) => { setState(prev => ({ ...prev, agents: [...prev.agents, agent] })); };
|
|
||||||
const updateAgent = (agent: Agent) => { setState(prev => ({ ...prev, agents: prev.agents.map(a => a.id === agent.id ? agent : a) })); };
|
const addAgent = async (agent: Agent) => {
|
||||||
const removeAgent = (id: string) => { setState(prev => ({ ...prev, agents: prev.agents.filter(a => a.id !== id) })); };
|
try {
|
||||||
const addClientUser = (user: ClientUser) => { setState(prev => ({ ...prev, clientUsers: [...prev.clientUsers, user] })); };
|
await apiFetch('/agents', { method: 'POST', body: JSON.stringify(agent) });
|
||||||
const updateClientUser = (user: ClientUser) => { setState(prev => ({ ...prev, clientUsers: prev.clientUsers.map(u => u.id === user.id ? user : u) })); };
|
setState(prev => ({ ...prev, agents: [...prev.agents, agent] }));
|
||||||
const removeClientUser = (id: string) => { setState(prev => ({ ...prev, clientUsers: prev.clientUsers.filter(u => u.id !== id) })); };
|
showToast("Agente creato", 'success');
|
||||||
const updateSettings = (newSettings: AppSettings) => { setState(prev => ({ ...prev, settings: newSettings })); };
|
} catch(e) { showToast("Errore creazione agente", 'error'); }
|
||||||
const addQueue = (queue: TicketQueue) => { setState(prev => ({ ...prev, queues: [...prev.queues, queue] })); };
|
};
|
||||||
const removeQueue = (id: string) => { setState(prev => ({ ...prev, queues: prev.queues.filter(q => q.id !== id) })); };
|
|
||||||
|
const updateAgent = async (agent: Agent) => {
|
||||||
|
try {
|
||||||
|
await apiFetch(`/agents/${agent.id}`, { method: 'PUT', body: JSON.stringify(agent) });
|
||||||
|
setState(prev => ({ ...prev, agents: prev.agents.map(a => a.id === agent.id ? agent : a) }));
|
||||||
|
showToast("Agente aggiornato", 'success');
|
||||||
|
} catch(e) { showToast("Errore aggiornamento agente", 'error'); }
|
||||||
|
};
|
||||||
|
|
||||||
|
const removeAgent = async (id: string) => {
|
||||||
|
try {
|
||||||
|
await apiFetch(`/agents/${id}`, { method: 'DELETE' });
|
||||||
|
setState(prev => ({ ...prev, agents: prev.agents.filter(a => a.id !== id) }));
|
||||||
|
showToast("Agente rimosso", 'info');
|
||||||
|
} catch(e) { showToast("Errore rimozione agente", 'error'); }
|
||||||
|
};
|
||||||
|
|
||||||
|
const addClientUser = async (user: ClientUser) => {
|
||||||
|
// Reuses auth/register usually, but for admin adding user:
|
||||||
|
try {
|
||||||
|
await apiFetch('/auth/register', { method: 'POST', body: JSON.stringify(user) });
|
||||||
|
setState(prev => ({ ...prev, clientUsers: [...prev.clientUsers, user] }));
|
||||||
|
showToast("Utente aggiunto", 'success');
|
||||||
|
} catch(e) { showToast("Errore aggiunta utente", 'error'); }
|
||||||
|
};
|
||||||
|
|
||||||
|
const updateClientUser = async (user: ClientUser) => {
|
||||||
|
try {
|
||||||
|
await apiFetch(`/client_users/${user.id}`, { method: 'PUT', body: JSON.stringify(user) });
|
||||||
|
setState(prev => ({ ...prev, clientUsers: prev.clientUsers.map(u => u.id === user.id ? user : u) }));
|
||||||
|
showToast("Utente aggiornato", 'success');
|
||||||
|
} catch(e) { showToast("Errore aggiornamento utente", 'error'); }
|
||||||
|
};
|
||||||
|
|
||||||
|
const removeClientUser = async (id: string) => {
|
||||||
|
try {
|
||||||
|
await apiFetch(`/client_users/${id}`, { method: 'DELETE' });
|
||||||
|
setState(prev => ({ ...prev, clientUsers: prev.clientUsers.filter(u => u.id !== id) }));
|
||||||
|
showToast("Utente rimosso", 'info');
|
||||||
|
} catch(e) { showToast("Errore rimozione utente", 'error'); }
|
||||||
|
};
|
||||||
|
|
||||||
|
const updateSettings = async (newSettings: AppSettings) => {
|
||||||
|
try {
|
||||||
|
await apiFetch('/settings', { method: 'PUT', body: JSON.stringify(newSettings) });
|
||||||
|
setState(prev => ({ ...prev, settings: newSettings }));
|
||||||
|
// Note: Real-time update of theme might require reload or context update, but setState handles it for current session
|
||||||
|
} catch(e) { showToast("Errore salvataggio impostazioni", 'error'); }
|
||||||
|
};
|
||||||
|
|
||||||
|
const addQueue = async (queue: TicketQueue) => {
|
||||||
|
try {
|
||||||
|
await apiFetch('/queues', { method: 'POST', body: JSON.stringify(queue) });
|
||||||
|
setState(prev => ({ ...prev, queues: [...prev.queues, queue] }));
|
||||||
|
showToast("Coda aggiunta", 'success');
|
||||||
|
} catch(e) { showToast("Errore aggiunta coda", 'error'); }
|
||||||
|
};
|
||||||
|
|
||||||
|
const removeQueue = async (id: string) => {
|
||||||
|
try {
|
||||||
|
await apiFetch(`/queues/${id}`, { method: 'DELETE' });
|
||||||
|
setState(prev => ({ ...prev, queues: prev.queues.filter(q => q.id !== id) }));
|
||||||
|
showToast("Coda rimossa", 'info');
|
||||||
|
} catch(e) { showToast("Errore rimozione coda", 'error'); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// Render Logic
|
// Render Logic
|
||||||
|
|||||||
Reference in New Issue
Block a user