Merge pull request #26003 from overleaf/mj-ide-duplicate-project

[web] Editor redesign: Add project duplication button

GitOrigin-RevId: 93e5aa66a7ccc13650e07fda041394811874dafa
This commit is contained in:
Mathias Jakobsen
2025-06-03 08:05:44 +00:00
committed by Copybot
parent 86e13b088a
commit 1b15dc3854
2 changed files with 50 additions and 0 deletions
@@ -0,0 +1,48 @@
import EditorCloneProjectModalWrapper from '@/features/clone-project-modal/components/editor-clone-project-modal-wrapper'
import OLDropdownMenuItem from '@/features/ui/components/ol/ol-dropdown-menu-item'
import { useEditorAnalytics } from '@/shared/hooks/use-editor-analytics'
import { useLocation } from '@/shared/hooks/use-location'
import getMeta from '@/utils/meta'
import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'
type ProjectCopyResponse = {
project_id: string
}
export const DuplicateProject = () => {
const { sendEvent } = useEditorAnalytics()
const { t } = useTranslation()
const [showModal, setShowModal] = useState(false)
const location = useLocation()
const anonymous = getMeta('ol-anonymous')
const openProject = useCallback(
({ project_id: projectId }: ProjectCopyResponse) => {
location.assign(`/project/${projectId}`)
},
[location]
)
const handleShowModal = useCallback(() => {
sendEvent('copy-project', { location: 'project-title-dropdown' })
setShowModal(true)
}, [sendEvent])
if (anonymous) {
return null
}
return (
<>
<OLDropdownMenuItem onClick={handleShowModal}>
{t('copy')}
</OLDropdownMenuItem>
<EditorCloneProjectModalWrapper
show={showModal}
handleHide={() => setShowModal(false)}
openProject={openProject}
/>
</>
)
}
@@ -13,6 +13,7 @@ import { DownloadProjectPDF, DownloadProjectZip } from './download-project'
import { useCallback, useState } from 'react'
import OLDropdownMenuItem from '@/features/ui/components/ol/ol-dropdown-menu-item'
import EditableLabel from './editable-label'
import { DuplicateProject } from './duplicate-project'
const [publishModalModules] = importOverleafModules('publishModal')
const SubmitProjectButton = publishModalModules?.import.NewPublishToolbarButton
@@ -73,6 +74,7 @@ export const ToolbarProjectTitle = () => {
<DownloadProjectPDF />
<DownloadProjectZip />
<DropdownDivider />
<DuplicateProject />
<OLDropdownMenuItem
onClick={() => {
setIsRenaming(true)