diff --git a/src/components/Calendar/Calendar.tsx b/src/components/Calendar/Calendar.tsx index 1dde554..32eed06 100644 --- a/src/components/Calendar/Calendar.tsx +++ b/src/components/Calendar/Calendar.tsx @@ -13,6 +13,7 @@ import CalendarPopover from "../../features/Calendars/CalendarModal"; import { CalendarEvent } from "../../features/Events/EventsTypes"; import CalendarSelection from "./CalendarSelection"; import { getCalendarDetailAsync } from "../../features/Calendars/CalendarSlice"; +import ImportAlert from "../../features/Events/ImportAlert"; export default function CalendarApp() { const calendarRef = useRef(null); @@ -22,10 +23,10 @@ export default function CalendarApp() { const calendars = useAppSelector((state) => state.calendars.list); const pending = useAppSelector((state) => state.calendars.pending); const userId = useAppSelector((state) => state.user.userData.openpaasId); + const [selectedCalendars, setSelectedCalendars] = useState( Object.keys(calendars).filter((id) => id.split("/")[0] === userId) ); - const fetchedIdsRef = useRef>(new Set()); let filteredEvents: CalendarEvent[] = []; @@ -131,6 +132,7 @@ export default function CalendarApp() {
+ { if (ref) { diff --git a/src/components/Calendar/CalendarSelection.tsx b/src/components/Calendar/CalendarSelection.tsx index 1c7945b..0c98fcc 100644 --- a/src/components/Calendar/CalendarSelection.tsx +++ b/src/components/Calendar/CalendarSelection.tsx @@ -13,7 +13,6 @@ export default function CalendarSelection({ const calendars = useAppSelector((state) => state.calendars.list); const handleCalendarToggle = (name: string) => { - setSelectedCalendars((prev: string[]) => prev.includes(name) ? prev.filter((n) => n !== name) : [...prev, name] ); diff --git a/src/features/Calendars/CalendarSlice.ts b/src/features/Calendars/CalendarSlice.ts index 482f673..3a79bd4 100644 --- a/src/features/Calendars/CalendarSlice.ts +++ b/src/features/Calendars/CalendarSlice.ts @@ -39,7 +39,7 @@ export const getCalendarDetailAsync = createAsyncThunk< const events: CalendarEvent[] = calendar._embedded["dav:item"].map( (eventdata: any) => { const datas = eventdata.data[2][0][1]; - return parseCalendarEvent(datas, color); + return parseCalendarEvent(datas, color, calId); } ); diff --git a/src/features/Events/EventsTypes.ts b/src/features/Events/EventsTypes.ts index 5bea959..c27d337 100644 --- a/src/features/Events/EventsTypes.ts +++ b/src/features/Events/EventsTypes.ts @@ -15,5 +15,6 @@ export interface CalendarEvent { stamp?: Date; sequence?: Number; color?: string; - allday?:Boolean + allday?: Boolean; + error?: string; } diff --git a/src/features/Events/ImportAlert.tsx b/src/features/Events/ImportAlert.tsx new file mode 100644 index 0000000..0f3a292 --- /dev/null +++ b/src/features/Events/ImportAlert.tsx @@ -0,0 +1,40 @@ +import { Alert, Collapse } from "@mui/material"; +import { useState } from "react"; +import { useAppSelector } from "../../app/hooks"; + +export default function ImportAlert() { + const [visibleAlerts, setVisibleAlerts] = useState>( + {} + ); + const calendars = useAppSelector((state) => state.calendars.list); + + const toggleEventAlert = (eventId: string) => { + setVisibleAlerts((prev) => ({ + ...prev, + [eventId]: false, + })); + }; + + return ( + <> + {Object.keys(calendars).map((calendarId) => + calendars[calendarId].events + .filter((event) => event.error) + .map((event) => { + const isVisible = visibleAlerts[event.uid] ?? true; // default to visible + + return ( + + toggleEventAlert(event.uid)} + > + {event.error} + + + ); + }) + )} + + ); +} diff --git a/src/features/Events/eventUtils.ts b/src/features/Events/eventUtils.ts index a810089..6d238ea 100644 --- a/src/features/Events/eventUtils.ts +++ b/src/features/Events/eventUtils.ts @@ -5,7 +5,8 @@ type RawEntry = [string, Record, string, any]; export function parseCalendarEvent( data: RawEntry[], - color: string + color: string, + calendarid: string ): CalendarEvent { const event: Partial = { color, attendee: [] }; @@ -64,7 +65,11 @@ export function parseCalendarEvent( } if (!event.uid || !event.start) { - throw new Error(`Missing required event fields`); + console.error( + `missing crucial event param in calendar ${calendarid} `, + data + ); + event.error = `missing crucial event param in calendar ${calendarid} `; } return event as CalendarEvent;