diff --git a/CHANGELOG.md b/CHANGELOG.md index 854f5a931..c7653de09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to ### Added +- 🚩(setting) add feature flag on Duplicate with Children #2721 - 💄(frontend) redesign 404 error standalone page #2696 - 💄(frontend) redesign 403 access denied page #2720 - ✨(frontend) duplicate with subdocuments #2584 diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/components/DocToolBox.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/components/DocToolBox.tsx index e610fadcd..7d1057041 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/components/DocToolBox.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-management/components/DocToolBox.tsx @@ -39,6 +39,7 @@ import SharedIcon from '@/icons/shared.svg'; import StarSlashIcon from '@/icons/star-slash.svg'; import StarIcon from '@/icons/star.svg'; import DeleteIcon from '@/icons/trash.svg'; +import { useAnalytics } from '@/libs/Analytics'; import { useFocusStore, useResponsiveStore } from '@/stores'; import { isMacOS } from '@/utils/userAgent'; @@ -52,6 +53,8 @@ import { import { useCopyDocLink, useTrans } from '../hooks'; import { Doc, Role } from '../types'; +const DUPLICATE_WITH_CHILDREN_FEATURE_FLAG = 'duplicate_with_children'; + const ConfirmationDuplicateModal = dynamic( () => import('@/docs/doc-management/components/ConfirmationDuplicateModal').then( @@ -154,6 +157,10 @@ const DocToolBoxComponent = ({ const [isModalLeaveOpen, setIsModalLeaveOpen] = useState(false); const [isModalMoveOpen, setIsModalMoveOpen] = useState(false); const { onClick: onButtonClick, ...buttonPropsLeft } = buttonProps || {}; + const { isFeatureFlagActivated } = useAnalytics(); + const duplicateWithChildrenAllowed = !!( + isFeatureFlagActivated(DUPLICATE_WITH_CHILDREN_FEATURE_FLAG) && doc.numchild + ); const editor = useEditorStore((state) => state.editor); const wordCountLabel = useMemo(() => { @@ -301,7 +308,7 @@ const DocToolBoxComponent = ({ icon: , isDisabled: !doc.abilities.duplicate, callback: () => { - if (doc.numchild) { + if (duplicateWithChildrenAllowed) { setIsModalDuplicateOpen(true); } else { duplicateDoc({ diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/components/__tests__/DocToolBox.spec.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/components/__tests__/DocToolBox.spec.tsx new file mode 100644 index 000000000..f6948580a --- /dev/null +++ b/src/frontend/apps/impress/src/features/docs/doc-management/components/__tests__/DocToolBox.spec.tsx @@ -0,0 +1,157 @@ +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import React from 'react'; +import { describe, expect, test, vi } from 'vitest'; + +import { AppWrapper } from '@/tests/utils'; + +import { Doc, LinkReach, Role } from '../../types'; +import { DocToolBox } from '../DocToolBox'; + +vi.mock('next/router', () => ({ + useRouter: () => ({ + push: vi.fn(), + pathname: '/', + }), +})); + +vi.mock('@/features/auth', () => ({ + useAuth: () => ({ authenticated: true }), +})); + +const isFeatureFlagActivatedMock = vi.fn(); +vi.mock('@/libs/Analytics', () => ({ + useAnalytics: () => ({ + isFeatureFlagActivated: isFeatureFlagActivatedMock, + trackEvent: vi.fn(), + }), +})); + +const duplicateDocMock = vi.fn(); +vi.mock('@/docs/doc-management/components/ConfirmationDuplicateModal', () => ({ + useDuplicatedDoc: () => ({ + mutate: duplicateDocMock, + isPending: false, + }), + ConfirmationDuplicateModal: () => ( +
+ ), +})); + +const createDoc = (overrides: Partial