* Inital UI + layout setup * use booker approach of grid * event-select - sidebar + store work * adds get schedule by event-type-slug * Calendar toggle * Load schedule from event slug * Add busy events to calendar * useschedule * Store more event info than just slug * Add date override to calendar * Changes sizes on smaller screens * add event title as a tooltip * Ensure header navigation works * Stop navigator throwing errors on inital render * Correct br * Event duration fixes * Add getMoreInfo if user is authed with current request.username * Add calendar color map wip * Add WIP comments for coloured outlines * Revert more info changes * Calculate date override correctly * Add description option * Fix inital schedule data not being populated * Nudge overlap over to make it clearer * Fix disabled state * WIP on math logic * Event list overlapping events logic * NIT about width * i18n + manage calendars link * Delete old troubleshooter * Update packages/features/calendars/weeklyview/components/event/EventList.tsx * Remove t-slots * Fix i18n & install calendar action * sm:imrovments * NITS * Fix types * fix: back button * Month prop null as we control from query param * Add head SEO * Fix headseo import * Fix date override tests
80 lines
2.7 KiB
TypeScript
80 lines
2.7 KiB
TypeScript
import { create } from "zustand";
|
|
|
|
import dayjs from "@calcom/dayjs";
|
|
|
|
import type {
|
|
CalendarComponentProps,
|
|
CalendarPublicActions,
|
|
CalendarState,
|
|
CalendarStoreProps,
|
|
} from "../types/state";
|
|
import { mergeOverlappingDateRanges, weekdayDates } from "../utils";
|
|
|
|
const defaultState: CalendarComponentProps = {
|
|
view: "week",
|
|
startDate: weekdayDates(0, new Date()).startDate,
|
|
endDate: weekdayDates(0, new Date()).endDate,
|
|
events: [],
|
|
startHour: 0,
|
|
endHour: 23,
|
|
gridCellsPerHour: 4,
|
|
};
|
|
|
|
export const useCalendarStore = create<CalendarStoreProps>((set) => ({
|
|
...defaultState,
|
|
setView: (view: CalendarComponentProps["view"]) => set({ view }),
|
|
setStartDate: (startDate: CalendarComponentProps["startDate"]) => set({ startDate }),
|
|
setEndDate: (endDate: CalendarComponentProps["endDate"]) => set({ endDate }),
|
|
setEvents: (events: CalendarComponentProps["events"]) => set({ events }),
|
|
// This looks a bit odd but init state only overrides the public props + actions as we don't want to override our internal state
|
|
initState: (state: CalendarState & CalendarPublicActions) => {
|
|
// Handle sorting of events if required
|
|
let events = state.events;
|
|
|
|
if (state.sortEvents) {
|
|
events = state.events.sort((a, b) => dayjs(a.start).valueOf() - dayjs(b.start).valueOf());
|
|
}
|
|
const blockingDates = mergeOverlappingDateRanges(state.blockingDates || []); // We merge overlapping dates so we don't get duplicate blocking "Cells" in the UI
|
|
|
|
set({
|
|
...state,
|
|
blockingDates,
|
|
events,
|
|
});
|
|
},
|
|
setSelectedEvent: (event) => set({ selectedEvent: event }),
|
|
handleDateChange: (payload) =>
|
|
set((state) => {
|
|
const { startDate, endDate } = state;
|
|
if (payload === "INCREMENT") {
|
|
const newStartDate = dayjs(startDate).add(1, state.view).toDate();
|
|
const newEndDate = dayjs(endDate).add(1, state.view).toDate();
|
|
|
|
// Do nothing if
|
|
if (
|
|
(state.minDate && newStartDate < state.minDate) ||
|
|
(state.maxDate && newEndDate > state.maxDate)
|
|
) {
|
|
return {
|
|
startDate,
|
|
endDate,
|
|
};
|
|
}
|
|
|
|
// We call this callback if we have it -> Allows you to change your state outside of the component
|
|
state.onDateChange && state.onDateChange(newStartDate, newEndDate);
|
|
return {
|
|
startDate: newStartDate,
|
|
endDate: newEndDate,
|
|
};
|
|
}
|
|
const newStartDate = dayjs(startDate).subtract(1, state.view).toDate();
|
|
const newEndDate = dayjs(endDate).subtract(1, state.view).toDate();
|
|
state.onDateChange && state.onDateChange(newStartDate, newEndDate);
|
|
return {
|
|
startDate: newStartDate,
|
|
endDate: newEndDate,
|
|
};
|
|
}),
|
|
}));
|