init commit,
This commit is contained in:
133
03_source/frontend/src/actions/calendar.ts
Normal file
133
03_source/frontend/src/actions/calendar.ts
Normal file
@@ -0,0 +1,133 @@
|
||||
import type { SWRConfiguration } from 'swr';
|
||||
import type { ICalendarEvent } from 'src/types/calendar';
|
||||
|
||||
import { useMemo } from 'react';
|
||||
import useSWR, { mutate } from 'swr';
|
||||
|
||||
import axios, { fetcher, endpoints } from 'src/lib/axios';
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
const enableServer = false;
|
||||
|
||||
const CALENDAR_ENDPOINT = endpoints.calendar;
|
||||
|
||||
const swrOptions: SWRConfiguration = {
|
||||
revalidateIfStale: enableServer,
|
||||
revalidateOnFocus: enableServer,
|
||||
revalidateOnReconnect: enableServer,
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
type EventsData = {
|
||||
events: ICalendarEvent[];
|
||||
};
|
||||
|
||||
export function useGetEvents() {
|
||||
const { data, isLoading, error, isValidating } = useSWR<EventsData>(
|
||||
CALENDAR_ENDPOINT,
|
||||
fetcher,
|
||||
swrOptions
|
||||
);
|
||||
|
||||
const memoizedValue = useMemo(() => {
|
||||
const events = data?.events.map((event) => ({ ...event, textColor: event.color }));
|
||||
|
||||
return {
|
||||
events: events || [],
|
||||
eventsLoading: isLoading,
|
||||
eventsError: error,
|
||||
eventsValidating: isValidating,
|
||||
eventsEmpty: !isLoading && !isValidating && !data?.events.length,
|
||||
};
|
||||
}, [data?.events, error, isLoading, isValidating]);
|
||||
|
||||
return memoizedValue;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
export async function createEvent(eventData: ICalendarEvent) {
|
||||
/**
|
||||
* Work on server
|
||||
*/
|
||||
if (enableServer) {
|
||||
const data = { eventData };
|
||||
await axios.post(CALENDAR_ENDPOINT, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Work in local
|
||||
*/
|
||||
|
||||
mutate(
|
||||
CALENDAR_ENDPOINT,
|
||||
(currentData) => {
|
||||
const currentEvents: ICalendarEvent[] = currentData?.events;
|
||||
|
||||
const events = [...currentEvents, eventData];
|
||||
|
||||
return { ...currentData, events };
|
||||
},
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
export async function updateEvent(eventData: Partial<ICalendarEvent>) {
|
||||
/**
|
||||
* Work on server
|
||||
*/
|
||||
if (enableServer) {
|
||||
const data = { eventData };
|
||||
await axios.put(CALENDAR_ENDPOINT, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Work in local
|
||||
*/
|
||||
|
||||
mutate(
|
||||
CALENDAR_ENDPOINT,
|
||||
(currentData) => {
|
||||
const currentEvents: ICalendarEvent[] = currentData?.events;
|
||||
|
||||
const events = currentEvents.map((event) =>
|
||||
event.id === eventData.id ? { ...event, ...eventData } : event
|
||||
);
|
||||
|
||||
return { ...currentData, events };
|
||||
},
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
export async function deleteEvent(eventId: string) {
|
||||
/**
|
||||
* Work on server
|
||||
*/
|
||||
if (enableServer) {
|
||||
const data = { eventId };
|
||||
await axios.patch(CALENDAR_ENDPOINT, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Work in local
|
||||
*/
|
||||
|
||||
mutate(
|
||||
CALENDAR_ENDPOINT,
|
||||
(currentData) => {
|
||||
const currentEvents: ICalendarEvent[] = currentData?.events;
|
||||
|
||||
const events = currentEvents.filter((event) => event.id !== eventId);
|
||||
|
||||
return { ...currentData, events };
|
||||
},
|
||||
false
|
||||
);
|
||||
}
|
Reference in New Issue
Block a user