feat: enhance CalendarPage and DutyList components for improved loading state handling
- Removed the loading state placeholder from CalendarPage, directly rendering the CalendarGrid component. - Updated DutyList to display a loading message when data is being fetched, enhancing user experience during data loading. - Introduced a new dataForMonthKey in the app store to manage month-specific data more effectively. - Refactored useMonthData hook to reset duties and calendarEvents when a new month is detected, ensuring accurate data representation. - Added tests to verify the new loading state behavior in both components.
This commit is contained in:
@@ -9,11 +9,16 @@ import { getStartParamFromUrl } from "@/lib/launch-params";
|
||||
|
||||
export type CurrentView = "calendar" | "currentDuty";
|
||||
|
||||
/** YYYY-MM key for the month that duties/calendarEvents belong to; null when none loaded. */
|
||||
export type DataForMonthKey = string | null;
|
||||
|
||||
export interface AppState {
|
||||
currentMonth: Date;
|
||||
lang: "ru" | "en";
|
||||
duties: DutyWithUser[];
|
||||
calendarEvents: CalendarEvent[];
|
||||
/** YYYY-MM: duties and calendarEvents are for this month; null when loading or no data. */
|
||||
dataForMonthKey: DataForMonthKey;
|
||||
loading: boolean;
|
||||
error: string | null;
|
||||
accessDenied: boolean;
|
||||
@@ -35,7 +40,7 @@ export interface AppState {
|
||||
setCurrentView: (v: CurrentView) => void;
|
||||
setSelectedDay: (key: string | null) => void;
|
||||
/** Batch multiple state updates into a single re-render. */
|
||||
batchUpdate: (partial: Partial<Pick<AppState, "currentMonth" | "lang" | "duties" | "calendarEvents" | "loading" | "error" | "accessDenied" | "accessDeniedDetail" | "currentView" | "selectedDay">>) => void;
|
||||
batchUpdate: (partial: Partial<Pick<AppState, "currentMonth" | "lang" | "duties" | "calendarEvents" | "dataForMonthKey" | "loading" | "error" | "accessDenied" | "accessDeniedDetail" | "currentView" | "selectedDay">>) => void;
|
||||
}
|
||||
|
||||
const now = new Date();
|
||||
@@ -52,6 +57,7 @@ export const useAppStore = create<AppState>((set) => ({
|
||||
lang: "en",
|
||||
duties: [],
|
||||
calendarEvents: [],
|
||||
dataForMonthKey: null,
|
||||
loading: false,
|
||||
error: null,
|
||||
accessDenied: false,
|
||||
|
||||
Reference in New Issue
Block a user