From a5f6cb542dad6eb1ef7fa3ec8856d4c67c39df88 Mon Sep 17 00:00:00 2001 From: Nathan Panchout Date: Mon, 16 Dec 2024 10:20:16 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A5(frontend)=20remove=20unused=20docu?= =?UTF-8?q?ment=20management=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Deleted `DocVisibility`, `ModalShare`, `InvitationList`, `MemberList`, and related components to streamline the document management feature. - Updated component exports to reflect the removal of these components. - Cleaned up associated assets and styles to improve code maintainability. --- .../components/DocVisibility.tsx | 144 ------------- .../doc-management/components/ModalShare.tsx | 138 ------------ .../docs/doc-management/components/index.ts | 1 - .../src/features/docs/doc-share/api/index.ts | 9 + .../api/useCreateDocAccess.tsx | 2 +- .../api/useCreateDocInvitation.tsx | 4 +- .../api/useDeleteDocAccess.ts | 2 +- .../api/useDeleteDocInvitation.ts | 0 .../api/useDocAccesses.tsx | 0 .../api/useDocInvitations.tsx | 3 +- .../api/useUpdateDocAccess.ts | 0 .../api/useUpdateDocInvitation.ts | 3 +- .../api/useUsers.tsx | 0 .../component/DocShareAddMemberList.tsx | 8 +- .../component/DocShareInvitationItem.tsx | 6 +- .../component/DocShareMemberItem.tsx | 7 +- .../doc-share/component/DocShareModal.tsx | 11 +- .../doc-share/component/DocVisibility.tsx | 11 +- .../features/docs/doc-share/hooks/index.ts | 2 + .../hooks/useWhoAmI.tsx | 0 .../src/features/docs/doc-share/index.ts | 2 + .../members-add => doc-share}/types.tsx | 17 ++ .../docs/members/invitation-list/api/index.ts | 4 - .../components/InvitationItem.tsx | 146 ------------- .../components/InvitationList.tsx | 142 ------------ .../invitation-list/components/index.ts | 1 - .../docs/members/invitation-list/conf.ts | 1 - .../docs/members/invitation-list/index.ts | 2 - .../docs/members/invitation-list/types.ts | 17 -- .../docs/members/members-add/api/index.ts | 2 - .../members/members-add/assets/add-user.svg | 14 -- .../members-add/components/AddMembers.tsx | 203 ------------------ .../members-add/components/ChooseRole.tsx | 37 ---- .../members-add/components/SearchUsers.tsx | 161 -------------- .../members/members-add/components/index.ts | 2 - .../docs/members/members-add/index.ts | 2 - .../docs/members/members-list/api/index.ts | 3 - .../members-list/components/MemberItem.tsx | 166 -------------- .../members-list/components/MemberList.tsx | 125 ----------- .../members/members-list/components/index.ts | 1 - .../docs/members/members-list/conf.ts | 1 - .../docs/members/members-list/index.ts | 2 - 42 files changed, 58 insertions(+), 1344 deletions(-) delete mode 100644 src/frontend/apps/impress/src/features/docs/doc-management/components/DocVisibility.tsx delete mode 100644 src/frontend/apps/impress/src/features/docs/doc-management/components/ModalShare.tsx create mode 100644 src/frontend/apps/impress/src/features/docs/doc-share/api/index.ts rename src/frontend/apps/impress/src/features/docs/{members/members-add => doc-share}/api/useCreateDocAccess.tsx (95%) rename src/frontend/apps/impress/src/features/docs/{members/invitation-list => doc-share}/api/useCreateDocInvitation.tsx (92%) rename src/frontend/apps/impress/src/features/docs/{members/members-list => doc-share}/api/useDeleteDocAccess.ts (96%) rename src/frontend/apps/impress/src/features/docs/{members/invitation-list => doc-share}/api/useDeleteDocInvitation.ts (100%) rename src/frontend/apps/impress/src/features/docs/{members/members-list => doc-share}/api/useDocAccesses.tsx (100%) rename src/frontend/apps/impress/src/features/docs/{members/invitation-list => doc-share}/api/useDocInvitations.tsx (97%) rename src/frontend/apps/impress/src/features/docs/{members/members-list => doc-share}/api/useUpdateDocAccess.ts (100%) rename src/frontend/apps/impress/src/features/docs/{members/invitation-list => doc-share}/api/useUpdateDocInvitation.ts (96%) rename src/frontend/apps/impress/src/features/docs/{members/members-add => doc-share}/api/useUsers.tsx (100%) create mode 100644 src/frontend/apps/impress/src/features/docs/doc-share/hooks/index.ts rename src/frontend/apps/impress/src/features/docs/{members/members-list => doc-share}/hooks/useWhoAmI.tsx (100%) create mode 100644 src/frontend/apps/impress/src/features/docs/doc-share/index.ts rename src/frontend/apps/impress/src/features/docs/{members/members-add => doc-share}/types.tsx (62%) delete mode 100644 src/frontend/apps/impress/src/features/docs/members/invitation-list/api/index.ts delete mode 100644 src/frontend/apps/impress/src/features/docs/members/invitation-list/components/InvitationItem.tsx delete mode 100644 src/frontend/apps/impress/src/features/docs/members/invitation-list/components/InvitationList.tsx delete mode 100644 src/frontend/apps/impress/src/features/docs/members/invitation-list/components/index.ts delete mode 100644 src/frontend/apps/impress/src/features/docs/members/invitation-list/conf.ts delete mode 100644 src/frontend/apps/impress/src/features/docs/members/invitation-list/index.ts delete mode 100644 src/frontend/apps/impress/src/features/docs/members/invitation-list/types.ts delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-add/api/index.ts delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-add/assets/add-user.svg delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-add/components/AddMembers.tsx delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-add/components/ChooseRole.tsx delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-add/components/SearchUsers.tsx delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-add/components/index.ts delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-add/index.ts delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-list/api/index.ts delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-list/components/MemberItem.tsx delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-list/components/MemberList.tsx delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-list/components/index.ts delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-list/conf.ts delete mode 100644 src/frontend/apps/impress/src/features/docs/members/members-list/index.ts 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 ( - - - - - ({ - label: transRole(role), - value: role, - disabled: currentRole !== Role.OWNER && role === Role.OWNER, - }))} - onChange={(evt) => setRole(evt.target.value as Role)} - disabled={disabled} - value={defaultRole} - /> - ); -}; diff --git a/src/frontend/apps/impress/src/features/docs/members/members-add/components/SearchUsers.tsx b/src/frontend/apps/impress/src/features/docs/members/members-add/components/SearchUsers.tsx deleted file mode 100644 index 5d6a172a..00000000 --- a/src/frontend/apps/impress/src/features/docs/members/members-add/components/SearchUsers.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import { useCallback, useMemo, useRef, useState } from 'react'; -import { useTranslation } from 'react-i18next'; -import { InputActionMeta, Options } from 'react-select'; -import AsyncSelect from 'react-select/async'; - -import { useCunninghamTheme } from '@/cunningham'; -import { Doc } from '@/features/docs/doc-management'; -import { isValidEmail } from '@/utils'; - -import { KEY_LIST_USER, useUsers } from '../api/useUsers'; -import { OptionSelect, OptionType } from '../types'; - -export type OptionsSelect = Options; - -interface SearchUsersProps { - doc: Doc; - selectedUsers: OptionsSelect; - setSelectedUsers: (value: OptionsSelect) => void; - disabled?: boolean; -} - -export const SearchUsers = ({ - doc, - selectedUsers, - setSelectedUsers, - disabled, -}: SearchUsersProps) => { - const { colorsTokens } = useCunninghamTheme(); - const { t } = useTranslation(); - const [input, setInput] = useState(''); - const [userQuery, setUserQuery] = useState(''); - const resolveOptionsRef = useRef<((value: OptionsSelect) => void) | null>( - null, - ); - const { data } = useUsers( - { query: userQuery, docId: doc.id }, - { - enabled: !!userQuery, - queryKey: [KEY_LIST_USER, { query: userQuery }], - }, - ); - - const options = data?.results; - - const optionsSelect = useMemo(() => { - if (!resolveOptionsRef.current || !options) { - return; - } - - const optionsFiltered = options.filter( - (user) => - !selectedUsers?.find( - (selectedUser) => selectedUser.value.email === user.email, - ), - ); - - let users: OptionsSelect = optionsFiltered.map((user) => ({ - value: user, - label: user.email, - type: OptionType.NEW_MEMBER, - })); - - if (userQuery && isValidEmail(userQuery)) { - const isFoundUser = !!optionsFiltered.find( - (user) => user.email === userQuery, - ); - const isFoundEmail = !!selectedUsers.find( - (selectedUser) => selectedUser.value.email === userQuery, - ); - - if (!isFoundUser && !isFoundEmail) { - users = [ - ...users, - { - value: { email: userQuery }, - label: userQuery, - type: OptionType.INVITATION, - }, - ]; - } - } - - resolveOptionsRef.current(users); - resolveOptionsRef.current = null; - - return users; - }, [options, selectedUsers, userQuery]); - - const loadOptions = (): Promise => { - return new Promise((resolve) => { - resolveOptionsRef.current = resolve; - }); - }; - - const timeout = useRef(null); - const onInputChangeHandle = useCallback( - (newValue: string, actionMeta: InputActionMeta) => { - if ( - actionMeta.action === 'input-blur' || - actionMeta.action === 'menu-close' - ) { - return; - } - - setInput(newValue); - if (timeout.current) { - clearTimeout(timeout.current); - } - - timeout.current = setTimeout(() => { - setUserQuery(newValue); - }, 1000); - }, - [], - ); - - return ( - ({ - ...base, - fontSize: '14px', - color: disabled - ? colorsTokens()['greyscale-300'] - : colorsTokens()['primary-600'], - }), - control: (base) => ({ - ...base, - minHeight: '45px', - borderColor: disabled - ? colorsTokens()['greyscale-300'] - : colorsTokens()['primary-600'], - backgroundColor: 'white', - }), - input: (base) => ({ - ...base, - minHeight: '45px', - fontSize: '14px', - }), - }} - isDisabled={disabled} - aria-label={t('Find a member to add to the document')} - isMulti - loadOptions={loadOptions} - defaultOptions={optionsSelect} - onInputChange={onInputChangeHandle} - inputValue={input} - placeholder={t('Search by email')} - noOptionsMessage={() => - input - ? t("We didn't find a mail matching, try to be more accurate") - : t('Invite new members to {{title}}', { title: doc.title }) - } - onChange={(value) => { - setInput(''); - setUserQuery(''); - setSelectedUsers(value); - }} - /> - ); -}; diff --git a/src/frontend/apps/impress/src/features/docs/members/members-add/components/index.ts b/src/frontend/apps/impress/src/features/docs/members/members-add/components/index.ts deleted file mode 100644 index b0e7a660..00000000 --- a/src/frontend/apps/impress/src/features/docs/members/members-add/components/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './AddMembers'; -export * from './ChooseRole'; diff --git a/src/frontend/apps/impress/src/features/docs/members/members-add/index.ts b/src/frontend/apps/impress/src/features/docs/members/members-add/index.ts deleted file mode 100644 index 0ef46430..00000000 --- a/src/frontend/apps/impress/src/features/docs/members/members-add/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/members-list/api/index.ts b/src/frontend/apps/impress/src/features/docs/members/members-list/api/index.ts deleted file mode 100644 index 385fe981..00000000 --- a/src/frontend/apps/impress/src/features/docs/members/members-list/api/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './useDeleteDocAccess'; -export * from './useDocAccesses'; -export * from './useUpdateDocAccess'; diff --git a/src/frontend/apps/impress/src/features/docs/members/members-list/components/MemberItem.tsx b/src/frontend/apps/impress/src/features/docs/members/members-list/components/MemberItem.tsx deleted file mode 100644 index a5c2eca5..00000000 --- a/src/frontend/apps/impress/src/features/docs/members/members-list/components/MemberItem.tsx +++ /dev/null @@ -1,166 +0,0 @@ -import { - Alert, - Button, - Loader, - VariantType, - useToastProvider, -} from '@openfun/cunningham-react'; -import { useRouter } from 'next/router'; -import React, { useState } from 'react'; -import { useTranslation } from 'react-i18next'; - -import { Box, IconBG, Text, TextErrors } from '@/components'; -import { Access, Doc, Role } from '@/features/docs/doc-management'; -import { ChooseRole } from '@/features/docs/members/members-add/'; -import { useResponsiveStore } from '@/stores'; - -import { useDeleteDocAccess, useUpdateDocAccess } from '../api'; -import { useWhoAmI } from '../hooks/useWhoAmI'; - -interface MemberItemProps { - role: Role; - currentRole: Role; - access: Access; - doc: Doc; -} - -export const MemberItem = ({ - doc, - role, - access, - currentRole, -}: MemberItemProps) => { - const { isMyself, isLastOwner, isOtherOwner } = useWhoAmI(access); - const { t } = useTranslation(); - const { isSmallMobile, screenWidth } = useResponsiveStore(); - const [localRole, setLocalRole] = useState(role); - const { toast } = useToastProvider(); - const { push } = useRouter(); - const { mutate: updateDocAccess, error: errorUpdate } = useUpdateDocAccess({ - onSuccess: () => { - toast(t('The role has been updated'), VariantType.SUCCESS, { - duration: 4000, - }); - }, - }); - - const { mutate: removeDocAccess, error: errorDelete } = useDeleteDocAccess({ - onSuccess: () => { - toast( - t('The member has been removed from the document'), - VariantType.SUCCESS, - { - duration: 4000, - }, - ); - - if (isMyself) { - void push('/'); - } - }, - }); - - const isNotAllowed = - isOtherOwner || isLastOwner || !doc.abilities.accesses_manage; - - if (!access.user) { - return ( - - - - ); - } - - return ( - - - - - - {access.user.full_name && {access.user.full_name}} - {access.user.email} - - - - { - setLocalRole(role); - updateDocAccess({ - docId: doc.id, - accessId: access.id, - role, - }); - }} - /> - - {doc.abilities.accesses_manage && ( - -