Files
alla-allaos-fullstack/src/features/crm/calendar/upstream-big-calendar/contexts/calendar-context.tsx
2026-07-13 22:29:11 +07:00

111 lines
3.1 KiB
TypeScript

"use client";
import { createContext, useContext, useEffect, useState } from "react";
import type { Dispatch, ReactNode, SetStateAction } from "react";
import type { IEvent, IUser } from "@/features/crm/calendar/upstream-big-calendar/interfaces";
import type {
TBadgeVariant,
TCalendarView,
TVisibleHours,
TWorkingHours
} from "@/features/crm/calendar/upstream-big-calendar/types";
interface ICalendarContext {
selectedDate: Date;
setSelectedDate: (date: Date | undefined) => void;
selectedUserId: IUser["id"] | "all";
setSelectedUserId: (userId: IUser["id"] | "all") => void;
selectedView: TCalendarView;
setSelectedView: (view: TCalendarView) => void;
badgeVariant: TBadgeVariant;
setBadgeVariant: (variant: TBadgeVariant) => void;
users: IUser[];
workingHours: TWorkingHours;
setWorkingHours: Dispatch<SetStateAction<TWorkingHours>>;
visibleHours: TVisibleHours;
setVisibleHours: Dispatch<SetStateAction<TVisibleHours>>;
events: IEvent[];
setLocalEvents: Dispatch<SetStateAction<IEvent[]>>;
onEventChange?: (event: IEvent) => void;
}
const CalendarContext = createContext<ICalendarContext | null>(null);
const WORKING_HOURS = {
0: { from: 0, to: 0 },
1: { from: 8, to: 17 },
2: { from: 8, to: 17 },
3: { from: 8, to: 17 },
4: { from: 8, to: 17 },
5: { from: 8, to: 17 },
6: { from: 8, to: 12 }
};
const VISIBLE_HOURS = { from: 7, to: 18 };
export function CalendarProvider({
children,
users,
events,
initialDate,
initialView = "agenda",
onEventChange
}: {
children: ReactNode;
users: IUser[];
events: IEvent[];
initialDate?: string;
initialView?: TCalendarView;
onEventChange?: (event: IEvent) => void;
}) {
const [badgeVariant, setBadgeVariant] = useState<TBadgeVariant>("colored");
const [visibleHours, setVisibleHours] = useState<TVisibleHours>(VISIBLE_HOURS);
const [workingHours, setWorkingHours] = useState<TWorkingHours>(WORKING_HOURS);
const [selectedDate, setSelectedDateState] = useState(() =>
initialDate ? new Date(initialDate) : new Date()
);
const [selectedView, setSelectedView] = useState<TCalendarView>(initialView);
const [selectedUserId, setSelectedUserId] = useState<IUser["id"] | "all">("all");
const [localEvents, setLocalEvents] = useState<IEvent[]>(events);
useEffect(() => {
setLocalEvents(events);
}, [events]);
const setSelectedDate = (date: Date | undefined) => {
if (date) setSelectedDateState(date);
};
return (
<CalendarContext.Provider
value={{
selectedDate,
setSelectedDate,
selectedUserId,
setSelectedUserId,
selectedView,
setSelectedView,
badgeVariant,
setBadgeVariant,
users,
workingHours,
setWorkingHours,
visibleHours,
setVisibleHours,
events: localEvents,
setLocalEvents,
onEventChange
}}
>
{children}
</CalendarContext.Provider>
);
}
export function useCalendar() {
const context = useContext(CalendarContext);
if (!context) throw new Error("useCalendar must be used within CalendarProvider.");
return context;
}