-
-
-
- {shareSuccess && (
-
{shareSuccess}
- )}
- {shareError && (
-
{shareError}
- )}
-
-
- setShareEmail(e.target.value)}
- placeholder={t('calendar.shareCalendar.emailPlaceholder')}
- fullWidth
- onKeyDown={(e) => {
- if (e.key === 'Enter') {
- e.preventDefault();
- handleShare();
- }
- }}
- />
-
-
-
- {t('calendar.shareCalendar.hint')}
-
-
- )}
);
diff --git a/src/frontend/apps/calendars/src/features/calendar/components/calendar-list/CalendarShareModal.tsx b/src/frontend/apps/calendars/src/features/calendar/components/calendar-list/CalendarShareModal.tsx
new file mode 100644
index 0000000..2d22072
--- /dev/null
+++ b/src/frontend/apps/calendars/src/features/calendar/components/calendar-list/CalendarShareModal.tsx
@@ -0,0 +1,218 @@
+/**
+ * CalendarShareModal component.
+ * Wraps the UI Kit ShareModal for managing calendar sharing via CalDAV.
+ */
+
+import { useState, useEffect, useCallback } from "react";
+import { useTranslation } from "react-i18next";
+import { ShareModal } from "@gouvfr-lasuite/ui-kit";
+
+import { useCalendarContext } from "../../contexts";
+import { useAuth } from "../../../auth/Auth";
+import {
+ addToast,
+ ToasterItem,
+} from "../../../ui/components/toaster/Toaster";
+import type { CalDavCalendar } from "../../services/dav/types/caldav-service";
+
+interface CalendarShareModalProps {
+ isOpen: boolean;
+ calendar: CalDavCalendar | null;
+ onClose: () => void;
+}
+
+type ShareUser = {
+ id: string;
+ full_name: string;
+ email: string;
+};
+
+type ShareAccess = {
+ id: string;
+ role: string;
+ user: ShareUser;
+ can_delete?: boolean;
+};
+
+const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+
+export const CalendarShareModal = ({
+ isOpen,
+ calendar,
+ onClose,
+}: CalendarShareModalProps) => {
+ const { t } = useTranslation();
+ const { caldavService, shareCalendar } = useCalendarContext();
+ const { user } = useAuth();
+ const [accesses, setAccesses] = useState