diff --git a/apps/accounts/src/pages/account-handoff.tsx b/apps/accounts/src/pages/account-handoff.tsx
new file mode 100644
index 000000000..733de573f
--- /dev/null
+++ b/apps/accounts/src/pages/account-handoff.tsx
@@ -0,0 +1,41 @@
+import EnteSpinner from '@ente/shared/components/EnteSpinner';
+import { VerticallyCentered } from '@ente/shared/components/Container';
+import { setData, LS_KEYS } from '@ente/shared/storage/localStorage';
+import { useRouter } from 'next/router';
+import { ACCOUNTS_PAGES } from '@ente/shared/constants/pages';
+import { useEffect } from 'react';
+import { logError } from '@ente/shared/sentry';
+
+const AccountHandoff = () => {
+ const router = useRouter();
+
+ const retrieveAccountData = () => {
+ try {
+ // get the data from the fragment
+ const fragment = window.location.hash;
+
+ const stringified = window.atob(fragment);
+
+ const deserialized = JSON.parse(stringified);
+
+ setData(LS_KEYS.USER, deserialized);
+
+ router.push(ACCOUNTS_PAGES.PASSKEYS);
+ } catch (e) {
+ logError(e, 'Failed to deserialize and set passed user data');
+ router.push(ACCOUNTS_PAGES.LOGIN);
+ }
+ };
+
+ useEffect(() => {
+ retrieveAccountData();
+ }, []);
+
+ return (
+
+
+
+ );
+};
+
+export default AccountHandoff;
diff --git a/apps/auth/public/locales/en/translation.json b/apps/auth/public/locales/en/translation.json
index 0b315b9d6..851666e30 100644
--- a/apps/auth/public/locales/en/translation.json
+++ b/apps/auth/public/locales/en/translation.json
@@ -615,5 +615,6 @@
"FLIP": "Flip",
"ROTATION": "Rotation",
"RESET": "Reset",
- "PHOTO_EDITOR": "Photo Editor"
+ "PHOTO_EDITOR": "Photo Editor",
+ "PASSKEYS": "Passkeys"
}
diff --git a/apps/photos/src/components/Sidebar/UtilitySection.tsx b/apps/photos/src/components/Sidebar/UtilitySection.tsx
index 46dc602d9..98b268ddf 100644
--- a/apps/photos/src/components/Sidebar/UtilitySection.tsx
+++ b/apps/photos/src/components/Sidebar/UtilitySection.tsx
@@ -4,14 +4,17 @@ import { t } from 'i18next';
// import FixLargeThumbnails from 'components/FixLargeThumbnail';
import RecoveryKey from '@ente/shared/components/RecoveryKey';
import TwoFactorModal from 'components/TwoFactor/Modal';
-import { PHOTOS_PAGES as PAGES } from '@ente/shared/constants/pages';
+import {
+ PHOTOS_PAGES as PAGES,
+ ACCOUNTS_PAGES,
+} from '@ente/shared/constants/pages';
import { useRouter } from 'next/router';
import { AppContext } from 'pages/_app';
// import mlIDbStorage from 'utils/storage/mlIDbStorage';
import isElectron from 'is-electron';
import WatchFolder from 'components/WatchFolder';
import { getDownloadAppMessage } from 'utils/ui';
-
+import { getData, LS_KEYS } from '@ente/shared/storage/localStorage';
import { isInternalUser } from 'utils/user';
import Preferences from './Preferences';
import { EnteMenuItem } from 'components/Menu/EnteMenuItem';
@@ -62,6 +65,17 @@ export default function UtilitySection({ closeSidebar }) {
router.push(PAGES.CHANGE_EMAIL);
};
+ const redirectToAccountsPage = () => {
+ closeSidebar();
+
+ // serialize the user data to pass it over to accounts
+ const userData = getData(LS_KEYS.USER);
+ const serialized = JSON.stringify(userData);
+ const serializeB64 = window.btoa(serialized);
+
+ window.location.href = `${process.env.NEXT_PUBLIC_ACCOUNTS_ENDPOINT}${ACCOUNTS_PAGES.ACCOUNT_HANDOFF}#${serializeB64}`;
+ };
+
const redirectToDeduplicatePage = () => router.push(PAGES.DEDUPLICATE);
const somethingWentWrong = () =>
@@ -112,6 +126,12 @@ export default function UtilitySection({ closeSidebar }) {
label={t('TWO_FACTOR')}
/>
+
+