From d6e55f81ff3abfe586c467052f3411ce0fdcb209 Mon Sep 17 00:00:00 2001 From: David <33458145+davidmcpowell@users.noreply.github.com> Date: Thu, 18 Jun 2026 13:52:01 +0100 Subject: [PATCH] Merge pull request #34750 from overleaf/dp-cleanup-reference-settings-migration [web] Remove reference manager settings migration code GitOrigin-RevId: 1062e1f08a6e6d4547f48c965c342d2ac15e9a4f --- .../app/src/Features/User/UserController.mjs | 1 - services/web/app/src/models/User.mjs | 1 - .../hooks/use-user-wide-settings.tsx | 6 +- .../shared/context/user-settings-context.tsx | 29 ------ .../write-and-cite-settings-migration.ts | 99 ------------------- services/web/types/user-settings.ts | 1 - 6 files changed, 3 insertions(+), 134 deletions(-) delete mode 100644 services/web/frontend/js/shared/utils/write-and-cite-settings-migration.ts diff --git a/services/web/app/src/Features/User/UserController.mjs b/services/web/app/src/Features/User/UserController.mjs index 389d4b9c5c..d2f7543709 100644 --- a/services/web/app/src/Features/User/UserController.mjs +++ b/services/web/app/src/Features/User/UserController.mjs @@ -338,7 +338,6 @@ const refProviderSettingsSchema = z enabled: z.boolean().optional(), groups: z.array(z.object({ id: z.string() })).optional(), disablePersonalLibrary: z.boolean().optional(), - migrated: z.boolean().optional(), }) .optional() diff --git a/services/web/app/src/models/User.mjs b/services/web/app/src/models/User.mjs index f11c48f049..9989804b20 100644 --- a/services/web/app/src/models/User.mjs +++ b/services/web/app/src/models/User.mjs @@ -18,7 +18,6 @@ const refProviderSettingsSchema = { default: [], }, disablePersonalLibrary: { type: Boolean, default: false }, - migrated: { type: Boolean, default: false }, } export const UserSchema = new Schema( diff --git a/services/web/frontend/js/features/editor-left-menu/hooks/use-user-wide-settings.tsx b/services/web/frontend/js/features/editor-left-menu/hooks/use-user-wide-settings.tsx index 5829aa4b05..41e67ddc0a 100644 --- a/services/web/frontend/js/features/editor-left-menu/hooks/use-user-wide-settings.tsx +++ b/services/web/frontend/js/features/editor-left-menu/hooks/use-user-wide-settings.tsx @@ -162,21 +162,21 @@ export default function useUserWideSettings() { const setZotero = useCallback( (zotero: UserSettings['zotero']) => { - saveUserSettings('zotero', { ...zotero, migrated: true }) + saveUserSettings('zotero', zotero) }, [saveUserSettings] ) const setMendeley = useCallback( (mendeley: UserSettings['mendeley']) => { - saveUserSettings('mendeley', { ...mendeley, migrated: true }) + saveUserSettings('mendeley', mendeley) }, [saveUserSettings] ) const setPapers = useCallback( (papers: UserSettings['papers']) => { - saveUserSettings('papers', { ...papers, migrated: true }) + saveUserSettings('papers', papers) }, [saveUserSettings] ) diff --git a/services/web/frontend/js/shared/context/user-settings-context.tsx b/services/web/frontend/js/shared/context/user-settings-context.tsx index 4ca25d2f12..0010ba65d3 100644 --- a/services/web/frontend/js/shared/context/user-settings-context.tsx +++ b/services/web/frontend/js/shared/context/user-settings-context.tsx @@ -6,13 +6,9 @@ import { SetStateAction, FC, useState, - useEffect, } from 'react' import { UserSettings } from '../../../../types/user-settings' import getMeta from '@/utils/meta' -import customLocalStorage from '@/infrastructure/local-storage' -import { getLegacyWriteAndCiteMigration } from '../utils/write-and-cite-settings-migration' -import { saveUserSettings } from '@/features/editor-left-menu/utils/api' export const defaultSettings: UserSettings = { pdfViewer: 'pdfjs', @@ -70,31 +66,6 @@ export const UserSettingsProvider: FC = ({ () => getMeta('ol-userSettings') || defaultSettings ) - useEffect(() => { - const { patch, keysToRemove } = getLegacyWriteAndCiteMigration(userSettings) - if (Object.keys(patch).length === 0) { - keysToRemove.forEach(customLocalStorage.removeItem) - return - } - - Promise.all( - Object.entries(patch).map(([key, value]) => - saveUserSettings( - key as keyof Pick, - value - ) - ) - ).then(() => { - setUserSettings(currentSettings => ({ - ...currentSettings, - ...patch, - })) - keysToRemove.forEach(customLocalStorage.removeItem) - }) - // Only run once when the provider mounts - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) - const value = useMemo( () => ({ userSettings, diff --git a/services/web/frontend/js/shared/utils/write-and-cite-settings-migration.ts b/services/web/frontend/js/shared/utils/write-and-cite-settings-migration.ts deleted file mode 100644 index a5d0a01caa..0000000000 --- a/services/web/frontend/js/shared/utils/write-and-cite-settings-migration.ts +++ /dev/null @@ -1,99 +0,0 @@ -import customLocalStorage from '@/infrastructure/local-storage' -import getMeta from '@/utils/meta' -import { - RefProviderSettings, - UserSettings, -} from '../../../../types/user-settings' - -type RefProvider = 'mendeley' | 'zotero' | 'papers' - -const providers: RefProvider[] = ['mendeley', 'zotero', 'papers'] - -const buildLegacyKey = (userId: string, provider: RefProvider, key: string) => - `user.${userId}.write-and-cite.${provider}.${key}` - -const isBoolean = (value: unknown): value is boolean => - typeof value === 'boolean' - -const parseGroups = (value: unknown): { id: string }[] | undefined => { - return Array.isArray(value) - ? (value as { id: string | number }[]).map(group => ({ - id: typeof group.id === 'number' ? String(group.id) : group.id, - })) - : undefined -} - -export type LegacyWriteAndCiteMigration = { - patch: Partial> - keysToRemove: string[] -} - -export const getLegacyWriteAndCiteMigration = ( - userSettings: UserSettings -): LegacyWriteAndCiteMigration => { - const userId = getMeta('ol-user_id') - if (!userId) { - return { - patch: {}, - keysToRemove: [], - } - } - - const patch: LegacyWriteAndCiteMigration['patch'] = {} - const keysToRemove: string[] = [] - - for (const provider of providers) { - const currentProviderSettings = userSettings[provider] - - if (currentProviderSettings.migrated) { - continue - } - - const enabledKey = buildLegacyKey(userId, provider, 'enabled') - const groupsKey = buildLegacyKey(userId, provider, 'groups') - const disablePersonalLibraryKey = buildLegacyKey( - userId, - provider, - 'disablePersonalLibrary' - ) - - const enabledValue = customLocalStorage.getItem(enabledKey) - const groupsValue = customLocalStorage.getItem(groupsKey) - const disablePersonalLibraryValue = customLocalStorage.getItem( - disablePersonalLibraryKey - ) - - // Storage.getItem returns null if the key does not exist - const hasEnabledValue = enabledValue !== null - const hasGroupsValue = groupsValue !== null - const hasDisablePersonalLibraryValue = disablePersonalLibraryValue !== null - - if ( - !hasEnabledValue && - !hasGroupsValue && - !hasDisablePersonalLibraryValue - ) { - continue - } - - const nextProviderSettings: RefProviderSettings = { - enabled: isBoolean(enabledValue) - ? enabledValue - : currentProviderSettings.enabled, - groups: parseGroups(groupsValue) ?? currentProviderSettings.groups, - disablePersonalLibrary: isBoolean(disablePersonalLibraryValue) - ? disablePersonalLibraryValue - : currentProviderSettings.disablePersonalLibrary, - migrated: true, - } - - patch[provider] = nextProviderSettings - - keysToRemove.push(enabledKey, groupsKey, disablePersonalLibraryKey) - } - - return { - patch, - keysToRemove: [], - } -} diff --git a/services/web/types/user-settings.ts b/services/web/types/user-settings.ts index 4d2a9920a2..8da9e15fad 100644 --- a/services/web/types/user-settings.ts +++ b/services/web/types/user-settings.ts @@ -7,7 +7,6 @@ export type RefProviderSettings = { enabled: boolean disablePersonalLibrary: boolean groups: { id: string }[] - migrated?: boolean } export type UserSettings = {