front-hub/src/stores/tickets.ts

44 lines
1.4 KiB
TypeScript
Raw Normal View History

2023-03-30 12:34:09 +00:00
import { Ticket } from "@root/model/ticket";
import { create } from "zustand";
import { devtools } from "zustand/middleware";
interface TicketStore {
2023-03-31 15:00:29 +00:00
ticketCount: number;
2023-03-30 12:34:09 +00:00
tickets: Ticket[];
2023-03-31 15:00:29 +00:00
fetchState: "idle" | "fetching" | "all fetched";
currentPage: number;
ticketsPerPage: number;
2023-03-30 12:34:09 +00:00
}
export const useTicketStore = create<TicketStore>()(
devtools(
(set, get) => ({
2023-03-31 15:00:29 +00:00
ticketCount: 0,
2023-03-30 12:34:09 +00:00
tickets: [],
2023-03-31 15:00:29 +00:00
fetchState: "idle",
currentPage: 0,
ticketsPerPage: 2,
2023-03-30 12:34:09 +00:00
}),
{
2023-03-31 15:00:29 +00:00
name: "Tickets store (client)"
2023-03-30 12:34:09 +00:00
}
)
);
2023-03-31 15:00:29 +00:00
export const setTicketCount = (ticketCount: number) => useTicketStore.setState({ ticketCount });
export const setFetchState = (fetchState: "idle" | "fetching" | "all fetched") => useTicketStore.setState({ fetchState });
export const setCurrentPage = (currentPage: number) => useTicketStore.setState({ currentPage });
2023-03-30 12:34:09 +00:00
export const updateTickets = (receivedTickets: Ticket[]) => {
const state = useTicketStore.getState();
const ticketIdToTicketMap: { [ticketId: string]: Ticket; } = {};
[...state.tickets, ...receivedTickets].forEach(ticket => ticketIdToTicketMap[ticket.id] = ticket);
useTicketStore.setState({ tickets: Object.values(ticketIdToTicketMap) });
};
export const clearTickets = () => useTicketStore.setState({ tickets: [] });