From 836491f87f45011d396b382d966c31cf89143e28 Mon Sep 17 00:00:00 2001 From: David <33458145+davidmcpowell@users.noreply.github.com> Date: Wed, 13 Aug 2025 13:49:56 +0100 Subject: [PATCH] Merge pull request #27878 from overleaf/dp-share-project-modal-utils-typescript Convert remaining share-project-modal utils to typescript GitOrigin-RevId: fc3fc7fbf7c8057c57f0aab261e4cedc3f7c602e --- .../components/add-collaborators.tsx | 5 ++- .../utils/{api.js => api.ts} | 37 ++++++++++++++----- .../utils/{captcha.js => captcha.ts} | 11 +++--- services/web/types/window.ts | 1 + 4 files changed, 38 insertions(+), 16 deletions(-) rename services/web/frontend/js/features/share-project-modal/utils/{api.js => api.ts} (55%) rename services/web/frontend/js/features/share-project-modal/utils/{captcha.js => captcha.ts} (65%) diff --git a/services/web/frontend/js/features/share-project-modal/components/add-collaborators.tsx b/services/web/frontend/js/features/share-project-modal/components/add-collaborators.tsx index 5b2db810b5..1792f7e287 100644 --- a/services/web/frontend/js/features/share-project-modal/components/add-collaborators.tsx +++ b/services/web/frontend/js/features/share-project-modal/components/add-collaborators.tsx @@ -13,9 +13,10 @@ import OLForm from '@/shared/components/ol/ol-form' import OLFormGroup from '@/shared/components/ol/ol-form-group' import { Select } from '@/shared/components/select' import OLButton from '@/shared/components/ol/ol-button' +import { PermissionsLevel } from '@/features/ide-react/types/permissions' export default function AddCollaborators({ readOnly }: { readOnly?: boolean }) { - const [privileges, setPrivileges] = useState('readAndWrite') + const [privileges, setPrivileges] = useState('readAndWrite') const isMounted = useIsMounted() @@ -176,7 +177,7 @@ export default function AddCollaborators({ readOnly }: { readOnly?: boolean }) { const privilegeOptions = useMemo(() => { const options: { - key: string + key: PermissionsLevel label: string description?: string | null }[] = [ diff --git a/services/web/frontend/js/features/share-project-modal/utils/api.js b/services/web/frontend/js/features/share-project-modal/utils/api.ts similarity index 55% rename from services/web/frontend/js/features/share-project-modal/utils/api.js rename to services/web/frontend/js/features/share-project-modal/utils/api.ts index 38b2040f2b..a59ed8d322 100644 --- a/services/web/frontend/js/features/share-project-modal/utils/api.js +++ b/services/web/frontend/js/features/share-project-modal/utils/api.ts @@ -1,3 +1,4 @@ +import { ProjectMember } from '@/shared/context/types/project-metadata' import { deleteJSON, getJSON, @@ -6,8 +7,13 @@ import { } from '../../../infrastructure/fetch-json' import { executeV2Captcha } from './captcha' import getMeta from '@/utils/meta' +import { PermissionsLevel } from '@/features/ide-react/types/permissions' -export function sendInvite(projectId, email, privileges) { +export function sendInvite( + projectId: string, + email: string, + privileges: PermissionsLevel +) { return executeV2Captcha( getMeta('ol-ExposedSettings').recaptchaDisabled?.invite ).then(grecaptchaResponse => { @@ -21,25 +27,35 @@ export function sendInvite(projectId, email, privileges) { }) } -export function resendInvite(projectId, invite) { +export function resendInvite(projectId: string, invite: ProjectMember) { return postJSON(`/project/${projectId}/invite/${invite._id}/resend`) } -export function revokeInvite(projectId, invite) { +export function revokeInvite(projectId: string, invite: ProjectMember) { return deleteJSON(`/project/${projectId}/invite/${invite._id}`) } -export function updateMember(projectId, member, data) { +export function updateMember( + projectId: string, + member: ProjectMember, + data: { privilegeLevel: PermissionsLevel } +) { return putJSON(`/project/${projectId}/users/${member._id}`, { body: data, }) } -export function removeMemberFromProject(projectId, member) { +export function removeMemberFromProject( + projectId: string, + member: ProjectMember +) { return deleteJSON(`/project/${projectId}/users/${member._id}`) } -export function transferProjectOwnership(projectId, member) { +export function transferProjectOwnership( + projectId: string, + member: ProjectMember +) { return postJSON(`/project/${projectId}/transfer-ownership`, { body: { user_id: member._id, @@ -47,16 +63,19 @@ export function transferProjectOwnership(projectId, member) { }) } -export function setPublicAccessLevel(projectId, publicAccessLevel) { +export function setPublicAccessLevel( + projectId: string, + publicAccessLevel: string +) { return postJSON(`/project/${projectId}/settings/admin`, { body: { publicAccessLevel }, }) } -export function listProjectMembers(projectId) { +export function listProjectMembers(projectId: string) { return getJSON(`/project/${projectId}/members`) } -export function listProjectInvites(projectId) { +export function listProjectInvites(projectId: string) { return getJSON(`/project/${projectId}/invites`) } diff --git a/services/web/frontend/js/features/share-project-modal/utils/captcha.js b/services/web/frontend/js/features/share-project-modal/utils/captcha.ts similarity index 65% rename from services/web/frontend/js/features/share-project-modal/utils/captcha.js rename to services/web/frontend/js/features/share-project-modal/utils/captcha.ts index 2e27b89733..5f04e3d2dc 100644 --- a/services/web/frontend/js/features/share-project-modal/utils/captcha.js +++ b/services/web/frontend/js/features/share-project-modal/utils/captcha.ts @@ -1,7 +1,8 @@ -let _recaptchaId -let _recaptchaResolve -export function executeV2Captcha(disabled = false) { - return new Promise((resolve, reject) => { +let _recaptchaId: string +let _recaptchaResolve: ((token: string) => void) | undefined + +export function executeV2Captcha(disabled: boolean = false) { + return new Promise((resolve, reject) => { if (disabled || !window.grecaptcha) { return resolve() } @@ -9,7 +10,7 @@ export function executeV2Captcha(disabled = false) { try { if (!_recaptchaId) { _recaptchaId = window.grecaptcha.render('recaptcha', { - callback: token => { + callback: (token: string) => { if (_recaptchaResolve) { _recaptchaResolve(token) _recaptchaResolve = undefined diff --git a/services/web/types/window.ts b/services/web/types/window.ts index 6869e90957..f0bde42d3e 100644 --- a/services/web/types/window.ts +++ b/services/web/types/window.ts @@ -28,5 +28,6 @@ declare global { propensity?: (propensityId?: string) => void olLoadGA?: () => void + grecaptcha?: any } }