diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/components/DocVisibility.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/components/DocVisibility.tsx
deleted file mode 100644
index fb0da949..00000000
--- a/src/frontend/apps/impress/src/features/docs/doc-management/components/DocVisibility.tsx
+++ /dev/null
@@ -1,144 +0,0 @@
-import {
- Radio,
- RadioGroup,
- Select,
- VariantType,
- useToastProvider,
-} from '@openfun/cunningham-react';
-import { useTranslation } from 'react-i18next';
-
-import { Box, Card, IconBG } from '@/components';
-import { useCunninghamTheme } from '@/cunningham';
-
-import { KEY_DOC, KEY_LIST_DOC, useUpdateDocLink } from '../api';
-import { Doc, LinkReach, LinkRole } from '../types';
-
-interface DocVisibilityProps {
- doc: Doc;
-}
-
-export const DocVisibility = ({ doc }: DocVisibilityProps) => {
- const { t } = useTranslation();
- const { toast } = useToastProvider();
- const { colorsTokens } = useCunninghamTheme();
- const api = useUpdateDocLink({
- onSuccess: () => {
- toast(
- t('The document visibility has been updated.'),
- VariantType.SUCCESS,
- {
- duration: 4000,
- },
- );
- },
- listInvalideQueries: [KEY_LIST_DOC, KEY_DOC],
- });
-
- const transLinkReach = {
- [LinkReach.RESTRICTED]: {
- label: t('Restricted'),
- description: t('Only for people with access'),
- },
- [LinkReach.AUTHENTICATED]: {
- label: t('Authenticated'),
- description: t('Only for authenticated users'),
- },
- [LinkReach.PUBLIC]: {
- label: t('Public'),
- description: t('Anyone on the internet with the link can view'),
- },
- };
-
- const linkRoleList = [
- {
- label: t('Read only'),
- value: LinkRole.READER,
- },
- {
- label: t('Can read and edit'),
- value: LinkRole.EDITOR,
- },
- ];
-
- const showLinkRoleOptions = doc.link_reach !== LinkReach.RESTRICTED;
-
- return (
-
-
-
-
-
- {showLinkRoleOptions && (
-
-
- {linkRoleList.map((radio) => (
-
- api.mutate({
- link_role: radio.value,
- id: doc.id,
- })
- }
- checked={doc.link_role === radio.value}
- disabled={!doc.abilities.link_configuration}
- />
- ))}
-
-
- )}
-
-
- );
-};
diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalShare.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalShare.tsx
deleted file mode 100644
index f55c97f2..00000000
--- a/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalShare.tsx
+++ /dev/null
@@ -1,138 +0,0 @@
-import {
- Button,
- VariantType,
- useToastProvider,
-} from '@openfun/cunningham-react';
-import { useTranslation } from 'react-i18next';
-import { createGlobalStyle } from 'styled-components';
-
-import { Box, Card, IconBG, SideModal, Text } from '@/components';
-import { InvitationList } from '@/features/docs/members/invitation-list';
-import { AddMembers } from '@/features/docs/members/members-add';
-import { MemberList } from '@/features/docs/members/members-list';
-import { useResponsiveStore } from '@/stores';
-
-import { Doc } from '../types';
-import { currentDocRole } from '../utils';
-
-import { DocVisibility } from './DocVisibility';
-
-const ModalShareStyle = createGlobalStyle`
- & .c__modal__scroller{
- background: #FAFAFA;
- padding: 1.5rem .5rem;
-
- .c__modal__title{
- padding: 0;
- margin: 0;
- }
-
- .c__modal__close{
- margin-right: 1rem;
-
- button{
- border-bottom: 1px solid #E0E0E0;
- border-left: 1px solid #E0E0E0;
- }
- }
- }
-`;
-
-interface ModalShareProps {
- onClose: () => void;
- doc: Doc;
-}
-
-export const ModalShare = ({ onClose, doc }: ModalShareProps) => {
- const { t } = useTranslation();
- const { isMobile, isSmallMobile } = useResponsiveStore();
- const width = isSmallMobile ? '100vw' : isMobile ? '90vw' : '70vw';
- const { toast } = useToastProvider();
-
- return (
- <>
-
-
-
-
-
-
-
-
-
- {t('Share')}
-
-
- {doc.title}
-
-
-
-
-
-
-
-
- {doc.abilities.accesses_manage && (
-
- )}
-
-
- {doc.abilities.accesses_view && (
- <>
-
-
- >
- )}
-
-
-
- >
- );
-};
diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/components/index.ts b/src/frontend/apps/impress/src/features/docs/doc-management/components/index.ts
index 120ce76f..639460cd 100644
--- a/src/frontend/apps/impress/src/features/docs/doc-management/components/index.ts
+++ b/src/frontend/apps/impress/src/features/docs/doc-management/components/index.ts
@@ -1,2 +1 @@
export * from './ModalRemoveDoc';
-export * from './ModalShare';
diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/api/index.ts b/src/frontend/apps/impress/src/features/docs/doc-share/api/index.ts
new file mode 100644
index 00000000..bbd7a27d
--- /dev/null
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/api/index.ts
@@ -0,0 +1,9 @@
+export * from './useDeleteDocAccess';
+export * from './useDocAccesses';
+export * from './useUpdateDocAccess';
+export * from './useCreateDocAccess';
+export * from './useUsers';
+export * from './useCreateDocInvitation';
+export * from './useDeleteDocInvitation';
+export * from './useDocInvitations';
+export * from './useUpdateDocInvitation';
diff --git a/src/frontend/apps/impress/src/features/docs/members/members-add/api/useCreateDocAccess.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/api/useCreateDocAccess.tsx
similarity index 95%
rename from src/frontend/apps/impress/src/features/docs/members/members-add/api/useCreateDocAccess.tsx
rename to src/frontend/apps/impress/src/features/docs/doc-share/api/useCreateDocAccess.tsx
index a2230b3d..9f2edc16 100644
--- a/src/frontend/apps/impress/src/features/docs/members/members-add/api/useCreateDocAccess.tsx
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/api/useCreateDocAccess.tsx
@@ -9,7 +9,7 @@ import {
KEY_LIST_DOC,
Role,
} from '@/features/docs/doc-management';
-import { KEY_LIST_DOC_ACCESSES } from '@/features/docs/members/members-list';
+import { KEY_LIST_DOC_ACCESSES } from '@/features/docs/doc-share';
import { ContentLanguage } from '@/i18n/types';
import { useBroadcastStore } from '@/stores';
diff --git a/src/frontend/apps/impress/src/features/docs/members/invitation-list/api/useCreateDocInvitation.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/api/useCreateDocInvitation.tsx
similarity index 92%
rename from src/frontend/apps/impress/src/features/docs/members/invitation-list/api/useCreateDocInvitation.tsx
rename to src/frontend/apps/impress/src/features/docs/doc-share/api/useCreateDocInvitation.tsx
index 85aa80d8..921af05b 100644
--- a/src/frontend/apps/impress/src/features/docs/members/invitation-list/api/useCreateDocInvitation.tsx
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/api/useCreateDocInvitation.tsx
@@ -3,11 +3,9 @@ import { useMutation, useQueryClient } from '@tanstack/react-query';
import { APIError, errorCauses, fetchAPI } from '@/api';
import { User } from '@/core/auth';
import { Doc, Role } from '@/features/docs/doc-management';
-import { OptionType } from '@/features/docs/members/members-add/types';
+import { Invitation, OptionType } from '@/features/docs/doc-share/types';
import { ContentLanguage } from '@/i18n/types';
-import { Invitation } from '../types';
-
import { KEY_LIST_DOC_INVITATIONS } from './useDocInvitations';
interface CreateDocInvitationParams {
diff --git a/src/frontend/apps/impress/src/features/docs/members/members-list/api/useDeleteDocAccess.ts b/src/frontend/apps/impress/src/features/docs/doc-share/api/useDeleteDocAccess.ts
similarity index 96%
rename from src/frontend/apps/impress/src/features/docs/members/members-list/api/useDeleteDocAccess.ts
rename to src/frontend/apps/impress/src/features/docs/doc-share/api/useDeleteDocAccess.ts
index b18414ae..fd7196d2 100644
--- a/src/frontend/apps/impress/src/features/docs/members/members-list/api/useDeleteDocAccess.ts
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/api/useDeleteDocAccess.ts
@@ -6,7 +6,7 @@ import {
import { APIError, errorCauses, fetchAPI } from '@/api';
import { KEY_DOC, KEY_LIST_DOC } from '@/features/docs/doc-management';
-import { KEY_LIST_USER } from '@/features/docs/members/members-add';
+import { KEY_LIST_USER } from '@/features/docs/doc-share';
import { useBroadcastStore } from '@/stores';
import { KEY_LIST_DOC_ACCESSES } from './useDocAccesses';
diff --git a/src/frontend/apps/impress/src/features/docs/members/invitation-list/api/useDeleteDocInvitation.ts b/src/frontend/apps/impress/src/features/docs/doc-share/api/useDeleteDocInvitation.ts
similarity index 100%
rename from src/frontend/apps/impress/src/features/docs/members/invitation-list/api/useDeleteDocInvitation.ts
rename to src/frontend/apps/impress/src/features/docs/doc-share/api/useDeleteDocInvitation.ts
diff --git a/src/frontend/apps/impress/src/features/docs/members/members-list/api/useDocAccesses.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/api/useDocAccesses.tsx
similarity index 100%
rename from src/frontend/apps/impress/src/features/docs/members/members-list/api/useDocAccesses.tsx
rename to src/frontend/apps/impress/src/features/docs/doc-share/api/useDocAccesses.tsx
diff --git a/src/frontend/apps/impress/src/features/docs/members/invitation-list/api/useDocInvitations.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/api/useDocInvitations.tsx
similarity index 97%
rename from src/frontend/apps/impress/src/features/docs/members/invitation-list/api/useDocInvitations.tsx
rename to src/frontend/apps/impress/src/features/docs/doc-share/api/useDocInvitations.tsx
index 55a29112..58ab3609 100644
--- a/src/frontend/apps/impress/src/features/docs/members/invitation-list/api/useDocInvitations.tsx
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/api/useDocInvitations.tsx
@@ -8,8 +8,7 @@ import {
} from '@tanstack/react-query';
import { APIError, APIList, errorCauses, fetchAPI } from '@/api';
-
-import { Invitation } from '../types';
+import { Invitation } from '@/features/docs/doc-share/types';
export type DocInvitationsParams = {
docId: string;
diff --git a/src/frontend/apps/impress/src/features/docs/members/members-list/api/useUpdateDocAccess.ts b/src/frontend/apps/impress/src/features/docs/doc-share/api/useUpdateDocAccess.ts
similarity index 100%
rename from src/frontend/apps/impress/src/features/docs/members/members-list/api/useUpdateDocAccess.ts
rename to src/frontend/apps/impress/src/features/docs/doc-share/api/useUpdateDocAccess.ts
diff --git a/src/frontend/apps/impress/src/features/docs/members/invitation-list/api/useUpdateDocInvitation.ts b/src/frontend/apps/impress/src/features/docs/doc-share/api/useUpdateDocInvitation.ts
similarity index 96%
rename from src/frontend/apps/impress/src/features/docs/members/invitation-list/api/useUpdateDocInvitation.ts
rename to src/frontend/apps/impress/src/features/docs/doc-share/api/useUpdateDocInvitation.ts
index 1678ba9b..4b1eb859 100644
--- a/src/frontend/apps/impress/src/features/docs/members/invitation-list/api/useUpdateDocInvitation.ts
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/api/useUpdateDocInvitation.ts
@@ -6,8 +6,7 @@ import {
import { APIError, errorCauses, fetchAPI } from '@/api';
import { Role } from '@/features/docs/doc-management';
-
-import { Invitation } from '../types';
+import { Invitation } from '@/features/docs/doc-share/types';
import { KEY_LIST_DOC_INVITATIONS } from './useDocInvitations';
diff --git a/src/frontend/apps/impress/src/features/docs/members/members-add/api/useUsers.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/api/useUsers.tsx
similarity index 100%
rename from src/frontend/apps/impress/src/features/docs/members/members-add/api/useUsers.tsx
rename to src/frontend/apps/impress/src/features/docs/doc-share/api/useUsers.tsx
diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareAddMemberList.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareAddMemberList.tsx
index 6b8d5a1f..f7ee0864 100644
--- a/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareAddMemberList.tsx
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareAddMemberList.tsx
@@ -12,9 +12,11 @@ import { Box } from '@/components';
import { User } from '@/core';
import { useCunninghamTheme } from '@/cunningham';
import { Doc, Role } from '@/features/docs';
-import { useCreateDocInvitation } from '@/features/docs/members/invitation-list';
-import { useCreateDocAccess } from '@/features/docs/members/members-add';
-import { OptionType } from '@/features/docs/members/members-add/types';
+import {
+ useCreateDocAccess,
+ useCreateDocInvitation,
+} from '@/features/docs/doc-share';
+import { OptionType } from '@/features/docs/doc-share/types';
import { useLanguage } from '@/i18n/hooks/useLanguage';
import { DocRoleDropdown } from './DocRoleDropdown';
diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareInvitationItem.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareInvitationItem.tsx
index 8763129b..694294aa 100644
--- a/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareInvitationItem.tsx
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareInvitationItem.tsx
@@ -9,12 +9,12 @@ import {
} from '@/components';
import { User } from '@/core';
import { Doc, Role } from '@/features/docs/doc-management';
-import { SearchUserRow } from '@/features/docs/doc-share/component/SearchUserRow';
import {
useDeleteDocInvitation,
useUpdateDocInvitation,
-} from '@/features/docs/members/invitation-list';
-import { Invitation } from '@/features/docs/members/invitation-list/types';
+} from '@/features/docs/doc-share';
+import { SearchUserRow } from '@/features/docs/doc-share/component/SearchUserRow';
+import { Invitation } from '@/features/docs/doc-share/types';
import { DocRoleDropdown } from './DocRoleDropdown';
diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareMemberItem.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareMemberItem.tsx
index 154a4737..2897c0f7 100644
--- a/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareMemberItem.tsx
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareMemberItem.tsx
@@ -8,14 +8,11 @@ import {
IconOptions,
} from '@/components';
import { SearchUserRow } from '@/features/docs/doc-share/component/SearchUserRow';
-import {
- useDeleteDocAccess,
- useUpdateDocAccess,
-} from '@/features/docs/members/members-list';
-import { useWhoAmI } from '@/features/docs/members/members-list/hooks/useWhoAmI';
+import { useWhoAmI } from '@/features/docs/doc-share/hooks/useWhoAmI';
import { useResponsiveStore } from '@/stores';
import { Access, Doc, Role } from '../../doc-management/types';
+import { useDeleteDocAccess, useUpdateDocAccess } from '../index';
import { DocRoleDropdown } from './DocRoleDropdown';
diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareModal.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareModal.tsx
index 5de1c412..b510eb38 100644
--- a/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareModal.tsx
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/component/DocShareModal.tsx
@@ -13,10 +13,13 @@ import {
import { QuickSearchGroup } from '@/components/quick-search/QuickSearchGroup';
import { User } from '@/core';
import { Access, Doc } from '@/features/docs';
-import { useDocInvitationsInfinite } from '@/features/docs/members/invitation-list';
-import { Invitation } from '@/features/docs/members/invitation-list/types';
-import { KEY_LIST_USER, useUsers } from '@/features/docs/members/members-add';
-import { useDocAccessesInfinite } from '@/features/docs/members/members-list';
+import {
+ KEY_LIST_USER,
+ useDocAccessesInfinite,
+ useDocInvitationsInfinite,
+ useUsers,
+} from '@/features/docs/doc-share';
+import { Invitation } from '@/features/docs/doc-share/types';
import { useResponsiveStore } from '@/stores';
import { isValidEmail } from '@/utils';
diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/component/DocVisibility.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/component/DocVisibility.tsx
index 0421c475..02962f7e 100644
--- a/src/frontend/apps/impress/src/features/docs/doc-share/component/DocVisibility.tsx
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/component/DocVisibility.tsx
@@ -11,15 +11,16 @@ import {
Text,
} from '@/components';
import { useCunninghamTheme } from '@/cunningham';
-import { useResponsiveStore } from '@/stores';
-
import {
+ Doc,
KEY_DOC,
KEY_LIST_DOC,
+ LinkReach,
+ LinkRole,
useUpdateDocLink,
-} from '../../doc-management/api';
-import { useTranslatedShareSettings } from '../hooks/useTranslatedShareSettings';
-import { Doc, LinkReach, LinkRole } from '../../doc-management/types';
+} from '@/features/docs';
+import { useTranslatedShareSettings } from '@/features/docs/doc-share';
+import { useResponsiveStore } from '@/stores';
interface DocVisibilityProps {
doc: Doc;
diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/hooks/index.ts b/src/frontend/apps/impress/src/features/docs/doc-share/hooks/index.ts
new file mode 100644
index 00000000..6b41a977
--- /dev/null
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/hooks/index.ts
@@ -0,0 +1,2 @@
+export * from './useTranslatedShareSettings';
+export * from './useWhoAmI';
diff --git a/src/frontend/apps/impress/src/features/docs/members/members-list/hooks/useWhoAmI.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/hooks/useWhoAmI.tsx
similarity index 100%
rename from src/frontend/apps/impress/src/features/docs/members/members-list/hooks/useWhoAmI.tsx
rename to src/frontend/apps/impress/src/features/docs/doc-share/hooks/useWhoAmI.tsx
diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/index.ts b/src/frontend/apps/impress/src/features/docs/doc-share/index.ts
new file mode 100644
index 00000000..3fdace48
--- /dev/null
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/index.ts
@@ -0,0 +1,2 @@
+export * from './api';
+export * from './hooks';
diff --git a/src/frontend/apps/impress/src/features/docs/members/members-add/types.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/types.tsx
similarity index 62%
rename from src/frontend/apps/impress/src/features/docs/members/members-add/types.tsx
rename to src/frontend/apps/impress/src/features/docs/doc-share/types.tsx
index d33c83c2..58d4848a 100644
--- a/src/frontend/apps/impress/src/features/docs/members/members-add/types.tsx
+++ b/src/frontend/apps/impress/src/features/docs/doc-share/types.tsx
@@ -1,4 +1,21 @@
import { User } from '@/core/auth';
+import { Role } from '@/features/docs';
+
+export interface Invitation {
+ id: string;
+ role: Role;
+ document: string;
+ created_at: string;
+ is_expired: boolean;
+ issuer: string;
+ email: string;
+ abilities: {
+ destroy: boolean;
+ retrieve: boolean;
+ partial_update: boolean;
+ update: boolean;
+ };
+}
export enum OptionType {
INVITATION = 'invitation',
diff --git a/src/frontend/apps/impress/src/features/docs/members/invitation-list/api/index.ts b/src/frontend/apps/impress/src/features/docs/members/invitation-list/api/index.ts
deleted file mode 100644
index b2dc95f2..00000000
--- a/src/frontend/apps/impress/src/features/docs/members/invitation-list/api/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export * from './useCreateDocInvitation';
-export * from './useDeleteDocInvitation';
-export * from './useDocInvitations';
-export * from './useUpdateDocInvitation';
diff --git a/src/frontend/apps/impress/src/features/docs/members/invitation-list/components/InvitationItem.tsx b/src/frontend/apps/impress/src/features/docs/members/invitation-list/components/InvitationItem.tsx
deleted file mode 100644
index 9de0e8db..00000000
--- a/src/frontend/apps/impress/src/features/docs/members/invitation-list/components/InvitationItem.tsx
+++ /dev/null
@@ -1,146 +0,0 @@
-import {
- Button,
- Loader,
- VariantType,
- useToastProvider,
-} from '@openfun/cunningham-react';
-import React, { useState } from 'react';
-import { useTranslation } from 'react-i18next';
-
-import { Box, IconBG, Text, TextErrors } from '@/components';
-import { useCunninghamTheme } from '@/cunningham';
-import { Doc, Role } from '@/features/docs/doc-management';
-import { ChooseRole } from '@/features/docs/members/members-add/';
-import { useResponsiveStore } from '@/stores';
-
-import { useDeleteDocInvitation, useUpdateDocInvitation } from '../api';
-import { Invitation } from '../types';
-
-interface InvitationItemProps {
- role: Role;
- currentRole: Role;
- invitation: Invitation;
- doc: Doc;
-}
-
-export const InvitationItem = ({
- doc,
- role,
- invitation,
- currentRole,
-}: InvitationItemProps) => {
- const canDelete = invitation.abilities.destroy;
- const canUpdate = invitation.abilities.partial_update;
- const { t } = useTranslation();
- const { isSmallMobile, screenWidth } = useResponsiveStore();
- const [localRole, setLocalRole] = useState(role);
- const { colorsTokens } = useCunninghamTheme();
- const { toast } = useToastProvider();
- const { mutate: updateDocInvitation, error: errorUpdate } =
- useUpdateDocInvitation({
- onSuccess: () => {
- toast(t('The role has been updated.'), VariantType.SUCCESS, {
- duration: 4000,
- });
- },
- });
-
- const { mutate: removeDocInvitation, error: errorDelete } =
- useDeleteDocInvitation({
- onSuccess: () => {
- toast(t('The invitation has been removed.'), VariantType.SUCCESS, {
- duration: 4000,
- });
- },
- });
-
- if (!invitation.email) {
- return (
-
-
-
- );
- }
-
- return (
-
-
-
-
-
-
- {t('Invited')}
-
- {invitation.email}
-
-
-
- {
- setLocalRole(role);
- updateDocInvitation({
- docId: doc.id,
- invitationId: invitation.id,
- role,
- });
- }}
- />
-
- {doc.abilities.accesses_manage && (
-
-
- )}
-
-
-
- {(errorUpdate || errorDelete) && (
-
- )}
-
- );
-};
diff --git a/src/frontend/apps/impress/src/features/docs/members/invitation-list/components/InvitationList.tsx b/src/frontend/apps/impress/src/features/docs/members/invitation-list/components/InvitationList.tsx
deleted file mode 100644
index 95098696..00000000
--- a/src/frontend/apps/impress/src/features/docs/members/invitation-list/components/InvitationList.tsx
+++ /dev/null
@@ -1,142 +0,0 @@
-import { Loader } from '@openfun/cunningham-react';
-import React, { useEffect, useMemo, useRef, useState } from 'react';
-import { useTranslation } from 'react-i18next';
-
-import { APIError } from '@/api';
-import { Box, Card, InfiniteScroll, TextErrors } from '@/components';
-import { useCunninghamTheme } from '@/cunningham';
-import { Doc, currentDocRole } from '@/features/docs/doc-management';
-import { useResponsiveStore } from '@/stores';
-
-import { useDocInvitationsInfinite } from '../api';
-import { Invitation } from '../types';
-
-import { InvitationItem } from './InvitationItem';
-
-interface InvitationListStateProps {
- isLoading: boolean;
- error: APIError | null;
- invitations?: Invitation[];
- doc: Doc;
-}
-
-const InvitationListState = ({
- invitations,
- error,
- isLoading,
- doc,
-}: InvitationListStateProps) => {
- const { colorsTokens } = useCunninghamTheme();
- const { isSmallMobile } = useResponsiveStore();
-
- if (error) {
- return ;
- }
-
- if (isLoading || !invitations) {
- return (
-
-
-
- );
- }
-
- return invitations?.map((invitation, index) => {
- if (!invitation.email) {
- return null;
- }
-
- return (
-
-
-
- );
- });
-};
-
-interface InvitationListProps {
- doc: Doc;
-}
-
-export const InvitationList = ({ doc }: InvitationListProps) => {
- const { t } = useTranslation();
- const containerRef = useRef(null);
- const [, setRefInitialized] = useState(false);
- const {
- data,
- isLoading,
- error,
- fetchNextPage,
- hasNextPage,
- isFetchingNextPage,
- } = useDocInvitationsInfinite({
- docId: doc.id,
- });
-
- const invitations = useMemo(() => {
- return data?.pages.reduce((acc, page) => {
- return acc.concat(page.results);
- }, [] as Invitation[]);
- }, [data?.pages]);
-
- /**
- * The "return null;" statement below blocks a necessary rerender
- * for the InfiniteScroll component to work properly.
- * This useEffect is a workaround to force the rerender.
- */
- useEffect(() => {
- if (containerRef.current) {
- setRefInitialized(true);
- }
- }, [invitations?.length]);
-
- if (!invitations?.length) {
- return null;
- }
-
- return (
-
-
- {
- void fetchNextPage();
- }}
- scrollContainer={containerRef.current}
- as="ul"
- role="listbox"
- $padding="none"
- $margin="none"
- >
-
-
-
-
- );
-};
diff --git a/src/frontend/apps/impress/src/features/docs/members/invitation-list/components/index.ts b/src/frontend/apps/impress/src/features/docs/members/invitation-list/components/index.ts
deleted file mode 100644
index 68dace93..00000000
--- a/src/frontend/apps/impress/src/features/docs/members/invitation-list/components/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './InvitationList';
diff --git a/src/frontend/apps/impress/src/features/docs/members/invitation-list/conf.ts b/src/frontend/apps/impress/src/features/docs/members/invitation-list/conf.ts
deleted file mode 100644
index bfab9067..00000000
--- a/src/frontend/apps/impress/src/features/docs/members/invitation-list/conf.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const PAGE_SIZE = 20;
diff --git a/src/frontend/apps/impress/src/features/docs/members/invitation-list/index.ts b/src/frontend/apps/impress/src/features/docs/members/invitation-list/index.ts
deleted file mode 100644
index 0ef46430..00000000
--- a/src/frontend/apps/impress/src/features/docs/members/invitation-list/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './api';
-export * from './components';
diff --git a/src/frontend/apps/impress/src/features/docs/members/invitation-list/types.ts b/src/frontend/apps/impress/src/features/docs/members/invitation-list/types.ts
deleted file mode 100644
index 2d24b957..00000000
--- a/src/frontend/apps/impress/src/features/docs/members/invitation-list/types.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { Role } from '@/features/docs/doc-management';
-
-export interface Invitation {
- id: string;
- role: Role;
- document: string;
- created_at: string;
- is_expired: boolean;
- issuer: string;
- email: string;
- abilities: {
- destroy: boolean;
- retrieve: boolean;
- partial_update: boolean;
- update: boolean;
- };
-}
diff --git a/src/frontend/apps/impress/src/features/docs/members/members-add/api/index.ts b/src/frontend/apps/impress/src/features/docs/members/members-add/api/index.ts
deleted file mode 100644
index 14221b85..00000000
--- a/src/frontend/apps/impress/src/features/docs/members/members-add/api/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './useCreateDocAccess';
-export * from './useUsers';
diff --git a/src/frontend/apps/impress/src/features/docs/members/members-add/assets/add-user.svg b/src/frontend/apps/impress/src/features/docs/members/members-add/assets/add-user.svg
deleted file mode 100644
index 08de3aae..00000000
--- a/src/frontend/apps/impress/src/features/docs/members/members-add/assets/add-user.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
diff --git a/src/frontend/apps/impress/src/features/docs/members/members-add/components/AddMembers.tsx b/src/frontend/apps/impress/src/features/docs/members/members-add/components/AddMembers.tsx
deleted file mode 100644
index 3b8fddb3..00000000
--- a/src/frontend/apps/impress/src/features/docs/members/members-add/components/AddMembers.tsx
+++ /dev/null
@@ -1,203 +0,0 @@
-import {
- Button,
- VariantType,
- useToastProvider,
-} from '@openfun/cunningham-react';
-import { useState } from 'react';
-import { useTranslation } from 'react-i18next';
-
-import { APIError } from '@/api';
-import { Box, Card, IconBG } from '@/components';
-import { Doc, Role } from '@/features/docs/doc-management';
-import { useCreateDocInvitation } from '@/features/docs/members/invitation-list/';
-import { useLanguage } from '@/i18n/hooks/useLanguage';
-import { useResponsiveStore } from '@/stores';
-
-import { useCreateDocAccess } from '../api';
-import {
- OptionInvitation,
- OptionNewMember,
- OptionSelect,
- OptionType,
- isOptionNewMember,
-} from '../types';
-
-import { ChooseRole } from './ChooseRole';
-import { OptionsSelect, SearchUsers } from './SearchUsers';
-
-type APIErrorUser = APIError<{
- value: string;
- type: OptionType;
-}>;
-
-interface ModalAddMembersProps {
- currentRole: Role;
- doc: Doc;
-}
-
-export const AddMembers = ({ currentRole, doc }: ModalAddMembersProps) => {
- const { contentLanguage } = useLanguage();
- const { t } = useTranslation();
- const { isSmallMobile } = useResponsiveStore();
- const [selectedUsers, setSelectedUsers] = useState([]);
- const [selectedRole, setSelectedRole] = useState();
- const { toast } = useToastProvider();
- const { mutateAsync: createInvitation } = useCreateDocInvitation();
- const { mutateAsync: createDocAccess } = useCreateDocAccess();
- const [resetKey, setResetKey] = useState(1);
-
- const [isPending, setIsPending] = useState(false);
-
- const switchActions = (selectedUsers: OptionsSelect, selectedRole: Role) =>
- selectedUsers.map(async (selectedUser) => {
- switch (selectedUser.type) {
- case OptionType.INVITATION:
- await createInvitation({
- email: selectedUser.value.email,
- role: selectedRole,
- docId: doc.id,
- contentLanguage,
- });
- break;
-
- case OptionType.NEW_MEMBER:
- await createDocAccess({
- role: selectedRole,
- docId: doc.id,
- memberId: selectedUser.value.id,
- contentLanguage,
- });
- break;
- }
-
- return selectedUser;
- });
-
- const toastOptions = {
- duration: 4000,
- };
-
- const onError = (dataError: APIErrorUser) => {
- let messageError =
- dataError['data']?.type === OptionType.INVITATION
- ? t(`Failed to create the invitation for {{email}}.`, {
- email: dataError['data']?.value,
- })
- : t(`Failed to add the member in the document.`);
-
- if (
- dataError.cause?.[0] ===
- 'Document invitation with this Email address and Document already exists.'
- ) {
- messageError = t('"{{email}}" is already invited to the document.', {
- email: dataError['data']?.value,
- });
- }
-
- if (
- dataError.cause?.[0] ===
- 'This email is already associated to a registered user.'
- ) {
- messageError = t('"{{email}}" is already member of the document.', {
- email: dataError['data']?.value,
- });
- }
-
- toast(messageError, VariantType.ERROR, toastOptions);
- };
-
- const onSuccess = (option: OptionSelect) => {
- const message = !isOptionNewMember(option)
- ? t('Invitation sent to {{email}}.', {
- email: option.value.email,
- })
- : t('User {{email}} added to the document.', {
- email: option.value.email,
- });
-
- toast(message, VariantType.SUCCESS, toastOptions);
- };
-
- const handleValidate = async () => {
- setIsPending(true);
-
- if (!selectedRole) {
- return;
- }
-
- const settledPromises = await Promise.allSettled<
- OptionInvitation | OptionNewMember
- >(switchActions(selectedUsers, selectedRole));
-
- setIsPending(false);
- setResetKey(resetKey + 1);
- setSelectedUsers([]);
- setSelectedRole(undefined);
-
- settledPromises.forEach((settledPromise) => {
- switch (settledPromise.status) {
- case 'rejected':
- onError(settledPromise.reason as APIErrorUser);
- break;
-
- case 'fulfilled':
- onSuccess(settledPromise.value);
- break;
- }
- });
- };
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-};
diff --git a/src/frontend/apps/impress/src/features/docs/members/members-add/components/ChooseRole.tsx b/src/frontend/apps/impress/src/features/docs/members/members-add/components/ChooseRole.tsx
deleted file mode 100644
index ba95302f..00000000
--- a/src/frontend/apps/impress/src/features/docs/members/members-add/components/ChooseRole.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { Select } from '@openfun/cunningham-react';
-import { useTranslation } from 'react-i18next';
-
-import { Role, useTrans } from '@/features/docs/doc-management';
-
-interface ChooseRoleProps {
- currentRole: Role;
- disabled: boolean;
- defaultRole?: Role;
- setRole: (role: Role) => void;
- label?: string;
-}
-
-export const ChooseRole = ({
- defaultRole,
- disabled,
- currentRole,
- setRole,
- label,
-}: ChooseRoleProps) => {
- const { t } = useTranslation();
- const { transRole } = useTrans();
-
- return (
-