From 69d99079b1d7f787cf60d4479392aef695d926b3 Mon Sep 17 00:00:00 2001 From: David <33458145+davidmcpowell@users.noreply.github.com> Date: Thu, 15 May 2025 11:04:28 +0100 Subject: [PATCH] Merge pull request #25553 from overleaf/dp-clone-project-modal-proptypes Remove Proptypes from CloneProjectModal GitOrigin-RevId: 400f4c9de72eb1910a0ca067882a6358663303d3 --- ...nt.jsx => clone-project-modal-content.tsx} | 39 +++++++++---------- ...ject-modal.jsx => clone-project-modal.tsx} | 25 +++++------- ...=> editor-clone-project-modal-wrapper.tsx} | 17 ++++---- .../shared/context/types/project-context.tsx | 7 +--- 4 files changed, 38 insertions(+), 50 deletions(-) rename services/web/frontend/js/features/clone-project-modal/components/{clone-project-modal-content.jsx => clone-project-modal-content.tsx} (84%) rename services/web/frontend/js/features/clone-project-modal/components/{clone-project-modal.jsx => clone-project-modal.tsx} (71%) rename services/web/frontend/js/features/clone-project-modal/components/{editor-clone-project-modal-wrapper.jsx => editor-clone-project-modal-wrapper.tsx} (74%) diff --git a/services/web/frontend/js/features/clone-project-modal/components/clone-project-modal-content.jsx b/services/web/frontend/js/features/clone-project-modal/components/clone-project-modal-content.tsx similarity index 84% rename from services/web/frontend/js/features/clone-project-modal/components/clone-project-modal-content.jsx rename to services/web/frontend/js/features/clone-project-modal/components/clone-project-modal-content.tsx index 404af82ca4..5754522360 100644 --- a/services/web/frontend/js/features/clone-project-modal/components/clone-project-modal-content.jsx +++ b/services/web/frontend/js/features/clone-project-modal/components/clone-project-modal-content.tsx @@ -1,6 +1,5 @@ /* eslint-disable jsx-a11y/no-autofocus */ -import PropTypes from 'prop-types' -import { useCallback, useMemo, useState } from 'react' +import { FormEvent, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { postJSON } from '../../../infrastructure/fetch-json' import { CloneProjectTag } from './clone-project-tag' @@ -16,6 +15,7 @@ import OLFormGroup from '@/features/ui/components/ol/ol-form-group' import OLFormControl from '@/features/ui/components/ol/ol-form-control' import OLFormLabel from '@/features/ui/components/ol/ol-form-label' import OLButton from '@/features/ui/components/ol/ol-button' +import { Tag } from '../../../../../app/src/Features/Tags/types' export default function CloneProjectModalContent({ handleHide, @@ -25,10 +25,18 @@ export default function CloneProjectModalContent({ projectId, projectName, projectTags, +}: { + handleHide: () => void + inFlight: boolean + setInFlight: (inFlight: boolean) => void + handleAfterCloned: (clonedProject: any, tags: Tag[]) => void + projectId: string + projectName: string + projectTags: Tag[] }) { const { t } = useTranslation() - const [error, setError] = useState() + const [error, setError] = useState() const [clonedProjectName, setClonedProjectName] = useState( `${projectName} (Copy)` ) @@ -42,7 +50,7 @@ export default function CloneProjectModalContent({ ) // form submission: clone the project if the name is valid - const handleSubmit = event => { + const handleSubmit = (event: FormEvent) => { event.preventDefault() if (!valid) { @@ -75,7 +83,7 @@ export default function CloneProjectModalContent({ }) } - const removeTag = useCallback(tag => { + const removeTag = useCallback((tag: Tag) => { setClonedProjectTags(value => value.filter(item => item._id !== tag._id)) }, []) @@ -120,7 +128,11 @@ export default function CloneProjectModalContent({ {error && ( )} @@ -142,18 +154,3 @@ export default function CloneProjectModalContent({ ) } -CloneProjectModalContent.propTypes = { - handleHide: PropTypes.func.isRequired, - inFlight: PropTypes.bool, - setInFlight: PropTypes.func.isRequired, - handleAfterCloned: PropTypes.func.isRequired, - projectId: PropTypes.string, - projectName: PropTypes.string, - projectTags: PropTypes.arrayOf( - PropTypes.shape({ - _id: PropTypes.string.isRequired, - name: PropTypes.string.isRequired, - color: PropTypes.string, - }) - ), -} diff --git a/services/web/frontend/js/features/clone-project-modal/components/clone-project-modal.jsx b/services/web/frontend/js/features/clone-project-modal/components/clone-project-modal.tsx similarity index 71% rename from services/web/frontend/js/features/clone-project-modal/components/clone-project-modal.jsx rename to services/web/frontend/js/features/clone-project-modal/components/clone-project-modal.tsx index 4ebc22545d..8c5793b87e 100644 --- a/services/web/frontend/js/features/clone-project-modal/components/clone-project-modal.jsx +++ b/services/web/frontend/js/features/clone-project-modal/components/clone-project-modal.tsx @@ -1,7 +1,8 @@ import React, { memo, useCallback, useState } from 'react' -import PropTypes from 'prop-types' import CloneProjectModalContent from './clone-project-modal-content' import OLModal from '@/features/ui/components/ol/ol-modal' +import { ClonedProject } from '../../../../../types/project/dashboard/api' +import { Tag } from '../../../../../app/src/Features/Tags/types' function CloneProjectModal({ show, @@ -10,6 +11,13 @@ function CloneProjectModal({ projectId, projectName, projectTags, +}: { + show: boolean + handleHide: () => void + handleAfterCloned: (clonedProject: ClonedProject, tags: Tag[]) => void + projectId: string + projectName: string + projectTags: Tag[] }) { const [inFlight, setInFlight] = useState(false) @@ -42,19 +50,4 @@ function CloneProjectModal({ ) } -CloneProjectModal.propTypes = { - handleHide: PropTypes.func.isRequired, - show: PropTypes.bool.isRequired, - handleAfterCloned: PropTypes.func.isRequired, - projectId: PropTypes.string, - projectName: PropTypes.string, - projectTags: PropTypes.arrayOf( - PropTypes.shape({ - _id: PropTypes.string.isRequired, - name: PropTypes.string.isRequired, - color: PropTypes.string, - }) - ), -} - export default memo(CloneProjectModal) diff --git a/services/web/frontend/js/features/clone-project-modal/components/editor-clone-project-modal-wrapper.jsx b/services/web/frontend/js/features/clone-project-modal/components/editor-clone-project-modal-wrapper.tsx similarity index 74% rename from services/web/frontend/js/features/clone-project-modal/components/editor-clone-project-modal-wrapper.jsx rename to services/web/frontend/js/features/clone-project-modal/components/editor-clone-project-modal-wrapper.tsx index 2ebc6edece..aba9a87fbc 100644 --- a/services/web/frontend/js/features/clone-project-modal/components/editor-clone-project-modal-wrapper.jsx +++ b/services/web/frontend/js/features/clone-project-modal/components/editor-clone-project-modal-wrapper.tsx @@ -1,11 +1,18 @@ import React from 'react' -import PropTypes from 'prop-types' import { useProjectContext } from '../../../shared/context/project-context' import withErrorBoundary from '../../../infrastructure/error-boundary' import CloneProjectModal from './clone-project-modal' const EditorCloneProjectModalWrapper = React.memo( - function EditorCloneProjectModalWrapper({ show, handleHide, openProject }) { + function EditorCloneProjectModalWrapper({ + show, + handleHide, + openProject, + }: { + show: boolean + handleHide: () => void + openProject: ({ project_id }: { project_id: string }) => void + }) { const { _id: projectId, name: projectName, @@ -30,10 +37,4 @@ const EditorCloneProjectModalWrapper = React.memo( } ) -EditorCloneProjectModalWrapper.propTypes = { - handleHide: PropTypes.func.isRequired, - show: PropTypes.bool.isRequired, - openProject: PropTypes.func.isRequired, -} - export default withErrorBoundary(EditorCloneProjectModalWrapper) diff --git a/services/web/frontend/js/shared/context/types/project-context.tsx b/services/web/frontend/js/shared/context/types/project-context.tsx index 18eb42010c..4e1abdc420 100644 --- a/services/web/frontend/js/shared/context/types/project-context.tsx +++ b/services/web/frontend/js/shared/context/types/project-context.tsx @@ -1,6 +1,7 @@ import { UserId } from '../../../../../types/user' import { PublicAccessLevel } from '../../../../../types/public-access-level' import { ProjectSnapshot } from '@/infrastructure/project-snapshot' +import { Tag } from '../../../../../app/src/Features/Tags/types' export type ProjectContextMember = { _id: UserId @@ -43,11 +44,7 @@ export type ProjectContextValue = { privileges: string signUpDate: string } - tags: { - _id: string - name: string - color?: string - }[] + tags: Tag[] trackChangesState: boolean | Record projectSnapshot: ProjectSnapshot joinedOnce: boolean