Move and preamble

This commit is contained in:
Manav Rathi
2025-07-02 14:16:50 +05:30
parent cd51f1f147
commit d2a0c74554
26 changed files with 108 additions and 77 deletions

View File

@@ -1,6 +1,7 @@
import "@fontsource-variable/inter";
import { CssBaseline } from "@mui/material";
import { ThemeProvider } from "@mui/material/styles";
import { getData } from "ente-accounts/services/accounts-db";
import { accountLogout } from "ente-accounts/services/logout";
import type { User } from "ente-accounts/services/user";
import { staticAppTitle } from "ente-base/app";
@@ -19,7 +20,6 @@ import {
import { authTheme } from "ente-base/components/utils/theme";
import { BaseContext, deriveBaseContext } from "ente-base/context";
import { logStartupBanner } from "ente-base/log-web";
import { getData } from "ente-shared/storage/localStorage";
import { t } from "i18next";
import type { AppProps } from "next/app";
import React, { useCallback, useEffect, useMemo } from "react";

View File

@@ -1,4 +1,5 @@
import { VerifyMasterPasswordForm } from "ente-accounts/components/VerifyMasterPasswordForm";
import { getData } from "ente-accounts/services/accounts-db";
import { checkSessionValidity } from "ente-accounts/services/session";
import type { KeyAttributes, User } from "ente-accounts/services/user";
import {
@@ -8,7 +9,6 @@ import {
import type { ModalVisibilityProps } from "ente-base/components/utils/modal";
import { useBaseContext } from "ente-base/context";
import log from "ente-base/log";
import { getData } from "ente-shared/storage/localStorage";
import { t } from "i18next";
import { useCallback, useEffect, useState } from "react";

View File

@@ -3,6 +3,10 @@ import ArrowForwardIcon from "@mui/icons-material/ArrowForward";
import { CssBaseline, Typography } from "@mui/material";
import { styled, ThemeProvider } from "@mui/material/styles";
import { useNotification } from "components/utils/hooks-app";
import {
getData,
isLocalStorageAndIndexedDBMismatch,
} from "ente-accounts/services/accounts-db";
import type { User } from "ente-accounts/services/user";
import { isDesktop, staticAppTitle } from "ente-base/app";
import { CenteredRow } from "ente-base/components/containers";
@@ -39,10 +43,6 @@ import { runMigrations } from "ente-new/photos/services/migration";
import { initML, isMLSupported } from "ente-new/photos/services/ml";
import { getFamilyPortalRedirectURL } from "ente-new/photos/services/user-details";
import { PhotosAppContext } from "ente-new/photos/types/context";
import {
getData,
isLocalStorageAndIndexedDBMismatch,
} from "ente-shared/storage/localStorage";
import { t } from "i18next";
import type { AppProps } from "next/app";
import { useRouter } from "next/router";

View File

@@ -14,6 +14,13 @@ import { FixCreationTime } from "components/FixCreationTime";
import { Sidebar } from "components/Sidebar";
import { Upload } from "components/Upload";
import { sessionExpiredDialogAttributes } from "ente-accounts/components/utils/dialog";
import {
getData,
isFirstLogin,
justSignedUp,
setIsFirstLogin,
setJustSignedUp,
} from "ente-accounts/services/accounts-db";
import { stashRedirect } from "ente-accounts/services/redirect";
import { isSessionInvalid } from "ente-accounts/services/session";
import type { MiniDialogAttributes } from "ente-base/components/MiniDialog";
@@ -109,13 +116,6 @@ import {
verifyStripeSubscription,
} from "ente-new/photos/services/user-details";
import { usePhotosAppContext } from "ente-new/photos/types/context";
import { getData } from "ente-shared/storage/localStorage";
import {
isFirstLogin,
justSignedUp,
setIsFirstLogin,
setJustSignedUp,
} from "ente-shared/storage/localStorage/helpers";
import { PromiseQueue } from "ente-utils/promise";
import { t } from "i18next";
import { useRouter, type NextRouter } from "next/router";

View File

@@ -1,6 +1,7 @@
import { Box, Stack, Typography, styled } from "@mui/material";
import { LoginContents } from "ente-accounts/components/LoginContents";
import { SignUpContents } from "ente-accounts/components/SignUpContents";
import { getData } from "ente-accounts/services/accounts-db";
import { CenteredFill, CenteredRow } from "ente-base/components/containers";
import { EnteLogo } from "ente-base/components/EnteLogo";
import { ActivityIndicator } from "ente-base/components/mui/ActivityIndicator";
@@ -13,7 +14,6 @@ import {
} from "ente-base/session";
import { canAccessIndexedDB } from "ente-gallery/services/files-db";
import { DevSettings } from "ente-new/photos/components/DevSettings";
import { getData } from "ente-shared/storage/localStorage";
import { t } from "i18next";
import { useRouter } from "next/router";
import React, { useCallback, useEffect, useRef, useState } from "react";

View File

@@ -1,3 +1,4 @@
import { getData } from "ente-accounts/services/accounts-db";
import type { LocalUser, User } from "ente-accounts/services/user";
import { joinPath } from "ente-base/file-name";
import log from "ente-base/log";
@@ -23,7 +24,6 @@ import {
} from "ente-new/photos/services/collection";
import { updateFilesVisibility } from "ente-new/photos/services/file";
import { safeFileName } from "ente-new/photos/utils/native-fs";
import { getData } from "ente-shared/storage/localStorage";
import { wait } from "ente-utils/promise";
import { t } from "i18next";
import {

View File

@@ -13,6 +13,11 @@ import {
Tooltip,
Typography,
} from "@mui/material";
import {
setData,
setJustSignedUp,
setLocalReferralSource,
} from "ente-accounts/services/accounts-db";
import {
generateSRPSetupAttributes,
stashSRPSetupAttributes,
@@ -32,11 +37,6 @@ import { deriveKeyInsufficientMemoryErrorMessage } from "ente-base/crypto/types"
import { isMuseumHTTPError } from "ente-base/http";
import log from "ente-base/log";
import { saveMasterKeyInSessionAndSafeStore } from "ente-base/session";
import { setData } from "ente-shared/storage/localStorage";
import {
setJustSignedUp,
setLocalReferralSource,
} from "ente-shared/storage/localStorage/helpers";
import { useFormik } from "formik";
import { t } from "i18next";
import type { NextRouter } from "next/router";

View File

@@ -4,6 +4,7 @@ import {
AccountsPageFooter,
AccountsPageTitle,
} from "ente-accounts/components/layouts/centered-paper";
import { getData, setData } from "ente-accounts/services/accounts-db";
import { appHomeRoute, stashRedirect } from "ente-accounts/services/redirect";
import {
changePassword,
@@ -14,7 +15,6 @@ import { LinkButton } from "ente-base/components/LinkButton";
import { LoadingIndicator } from "ente-base/components/loaders";
import { deriveKeyInsufficientMemoryErrorMessage } from "ente-base/crypto/types";
import log from "ente-base/log";
import { getData, setData } from "ente-shared/storage/localStorage";
import { t } from "i18next";
import { useRouter } from "next/router";
import React, { useCallback, useEffect, useState } from "react";

View File

@@ -14,6 +14,14 @@ import {
VerifyMasterPasswordForm,
type VerifyMasterPasswordFormProps,
} from "ente-accounts/components/VerifyMasterPasswordForm";
import {
getData,
getToken,
isFirstLogin,
setData,
setIsFirstLogin,
setLSUser,
} from "ente-accounts/services/accounts-db";
import {
openPasskeyVerificationURL,
passkeyVerificationRedirectURL,
@@ -50,12 +58,6 @@ import {
unstashKeyEncryptionKeyFromSession,
updateSessionFromElectronSafeStorageIfNeeded,
} from "ente-base/session";
import { getData, setData, setLSUser } from "ente-shared/storage/localStorage";
import {
getToken,
isFirstLogin,
setIsFirstLogin,
} from "ente-shared/storage/localStorage/helpers";
import { t } from "i18next";
import { useRouter } from "next/router";
import { useCallback, useEffect, useState } from "react";

View File

@@ -5,6 +5,11 @@ import {
AccountsPageTitle,
} from "ente-accounts/components/layouts/centered-paper";
import { RecoveryKey } from "ente-accounts/components/RecoveryKey";
import {
getData,
justSignedUp,
setJustSignedUp,
} from "ente-accounts/services/accounts-db";
import { appHomeRoute } from "ente-accounts/services/redirect";
import {
generateSRPSetupAttributes,
@@ -25,11 +30,6 @@ import {
haveCredentialsInSession,
saveMasterKeyInSessionAndSafeStore,
} from "ente-base/session";
import { getData } from "ente-shared/storage/localStorage";
import {
justSignedUp,
setJustSignedUp,
} from "ente-shared/storage/localStorage/helpers";
import { t } from "i18next";
import { useRouter } from "next/router";
import { useEffect, useState } from "react";

View File

@@ -1,8 +1,8 @@
import { AccountsPageContents } from "ente-accounts/components/layouts/centered-paper";
import { LoginContents } from "ente-accounts/components/LoginContents";
import { getData } from "ente-accounts/services/accounts-db";
import { LoadingIndicator } from "ente-base/components/loaders";
import { customAPIHost } from "ente-base/origins";
import { getData } from "ente-shared/storage/localStorage";
import { useRouter } from "next/router";
import React, { useEffect, useState } from "react";

View File

@@ -1,8 +1,12 @@
import {
getData,
setData,
setLSUser,
} from "ente-accounts/services/accounts-db";
import { unstashRedirect } from "ente-accounts/services/redirect";
import { LoadingIndicator } from "ente-base/components/loaders";
import { fromB64URLSafeNoPadding } from "ente-base/crypto";
import log from "ente-base/log";
import { getData, setData, setLSUser } from "ente-shared/storage/localStorage";
import { nullToUndefined } from "ente-utils/transform";
import { useRouter } from "next/router";
import React, { useEffect } from "react";

View File

@@ -3,6 +3,7 @@ import {
AccountsPageFooter,
AccountsPageTitle,
} from "ente-accounts/components/layouts/centered-paper";
import { getData, setData } from "ente-accounts/services/accounts-db";
import { recoveryKeyFromMnemonic } from "ente-accounts/services/recovery-key";
import { appHomeRoute, stashRedirect } from "ente-accounts/services/redirect";
import type { KeyAttributes, User } from "ente-accounts/services/user";
@@ -20,7 +21,6 @@ import {
haveCredentialsInSession,
saveMasterKeyInSessionAndSafeStore,
} from "ente-base/session";
import { getData, setData } from "ente-shared/storage/localStorage";
import { t } from "i18next";
import { useRouter } from "next/router";
import { useEffect, useState } from "react";

View File

@@ -4,6 +4,7 @@ import {
AccountsPageFooter,
AccountsPageTitle,
} from "ente-accounts/components/layouts/centered-paper";
import { getData } from "ente-accounts/services/accounts-db";
import {
recoverTwoFactor,
recoverTwoFactorFinish,
@@ -20,7 +21,6 @@ import {
import { useBaseContext } from "ente-base/context";
import { isHTTP4xxError, isHTTPErrorWithStatus } from "ente-base/http";
import log from "ente-base/log";
import { getData } from "ente-shared/storage/localStorage";
import { t } from "i18next";
import { useRouter } from "next/router";
import { useCallback, useEffect, useMemo, useState } from "react";

View File

@@ -1,10 +1,14 @@
import { Verify2FACodeForm } from "ente-accounts/components/Verify2FACodeForm";
import {
getData,
setData,
setLSUser,
} from "ente-accounts/services/accounts-db";
import type { User } from "ente-accounts/services/user";
import { verifyTwoFactor } from "ente-accounts/services/user";
import { LinkButton } from "ente-base/components/LinkButton";
import { useBaseContext } from "ente-base/context";
import { isHTTPErrorWithStatus } from "ente-base/http";
import { getData, setData, setLSUser } from "ente-shared/storage/localStorage";
import { t } from "i18next";
import { useRouter } from "next/router";
import { useEffect, useState } from "react";

View File

@@ -7,6 +7,13 @@ import {
import { VerifyingPasskey } from "ente-accounts/components/LoginComponents";
import { SecondFactorChoice } from "ente-accounts/components/SecondFactorChoice";
import { useSecondFactorChoiceIfNeeded } from "ente-accounts/components/utils/second-factor-choice";
import {
getData,
getLocalReferralSource,
setData,
setIsFirstLogin,
setLSUser,
} from "ente-accounts/services/accounts-db";
import {
openPasskeyVerificationURL,
passkeyVerificationRedirectURL,
@@ -37,11 +44,6 @@ import { useBaseContext } from "ente-base/context";
import { isHTTPErrorWithStatus } from "ente-base/http";
import log from "ente-base/log";
import { clearSessionStorage } from "ente-base/session";
import { getData, setData, setLSUser } from "ente-shared/storage/localStorage";
import {
getLocalReferralSource,
setIsFirstLogin,
} from "ente-shared/storage/localStorage/helpers";
import { t } from "i18next";
import { useRouter } from "next/router";
import { useEffect, useState } from "react";

View File

@@ -9,7 +9,6 @@ export type LocalStorageKey =
| "isFirstLogin"
| "justSignedUp"
| "showBackButton"
| "export"
// Moved to ente-accounts
// "srpSetupAttributes"
| "srpAttributes"
@@ -21,6 +20,23 @@ export const setData = (key: LocalStorageKey, value: object) =>
export const removeData = (key: LocalStorageKey) =>
localStorage.removeItem(key);
/**
* [Note: Accounts DB]
*
* The accounts package stores various state both during the login / signup
* flow, and post login to identify the logged in user.
*
* This state is stored in local storage.
*
* Most of this state is meant to be transitory - various bits and bobs that we
* accumulate and want to persist as the user goes through the login or signup
* flow. One the user is successfully logged in and the first pull has
* completed, then only a few of these are expected to remain:
*
* - "user"
* - "keyAttributes"
* - "srpAttributes"
*/
export const getData = (key: LocalStorageKey) => {
try {
if (
@@ -109,3 +125,28 @@ export const isLocalStorageAndIndexedDBMismatch = async () => {
!(await getKVS("token"))
);
};
export const getToken = (): string => {
const token = getData("user")?.token;
return token;
};
export const isFirstLogin = () => getData("isFirstLogin")?.status ?? false;
export function setIsFirstLogin(status: boolean) {
setData("isFirstLogin", { status });
}
export const justSignedUp = () => getData("justSignedUp")?.status ?? false;
export function setJustSignedUp(status: boolean) {
setData("justSignedUp", { status });
}
export function getLocalReferralSource() {
return getData("referralSource")?.source;
}
export function setLocalReferralSource(source: string) {
setData("referralSource", { source });
}

View File

@@ -1,3 +1,8 @@
import {
getData,
setData,
setLSUser,
} from "ente-accounts/services/accounts-db";
import { TwoFactorAuthorizationResponse } from "ente-accounts/services/user";
import { clientPackageName, isDesktop } from "ente-base/app";
import { encryptBox, generateKey } from "ente-base/crypto";
@@ -8,7 +13,6 @@ import {
publicRequestHeaders,
} from "ente-base/http";
import { apiURL } from "ente-base/origins";
import { getData, setData, setLSUser } from "ente-shared/storage/localStorage";
import { z } from "zod/v4";
import { getUserRecoveryKey } from "./recovery-key";
import { unstashRedirect } from "./redirect";

View File

@@ -1,4 +1,5 @@
import * as bip39 from "bip39";
import { getData } from "ente-accounts/services/accounts-db";
import type { KeyAttributes } from "ente-accounts/services/user";
import {
decryptBox,
@@ -7,7 +8,6 @@ import {
toHex,
} from "ente-base/crypto";
import { ensureMasterKeyFromSession } from "ente-base/session";
import { getData } from "ente-shared/storage/localStorage";
import { putUserRecoveryKeyAttributes, saveKeyAttributes } from "./user";
// Mobile client library only supports English.

View File

@@ -1,9 +1,9 @@
import { getData } from "ente-accounts/services/accounts-db";
import type { KeyAttributes } from "ente-accounts/services/user";
import { authenticatedRequestHeaders, HTTPError } from "ente-base/http";
import log from "ente-base/log";
import { apiURL } from "ente-base/origins";
import { getAuthToken } from "ente-base/token";
import { getData } from "ente-shared/storage/localStorage";
import { nullToUndefined } from "ente-utils/transform";
import { z } from "zod/v4";
import { getSRPAttributes, type SRPAttributes } from "./srp";

View File

@@ -1,3 +1,4 @@
import { getData, setLSUser } from "ente-accounts/services/accounts-db";
import {
generateSRPSetupAttributes,
getSRPAttributes,
@@ -25,7 +26,6 @@ import {
saveMasterKeyInSessionAndSafeStore,
} from "ente-base/session";
import { getAuthToken } from "ente-base/token";
import { getData, setLSUser } from "ente-shared/storage/localStorage";
import { ensure } from "ente-utils/ensure";
import { nullToUndefined } from "ente-utils/transform";
import { z } from "zod/v4";

View File

@@ -1,8 +1,8 @@
// TODO: Audit this file, this can be better. e.g. do we need the Object.assign?
import { getData, setLSUser } from "ente-accounts/services/accounts-db";
import { type KeyAttributes } from "ente-accounts/services/user";
import { boxSealOpenBytes, decryptBox, toB64URLSafe } from "ente-base/crypto";
import { getData, setLSUser } from "ente-shared/storage/localStorage";
export async function decryptAndStoreToken(
keyAttributes: KeyAttributes,

View File

@@ -1,4 +1,4 @@
import { getToken } from "ente-shared/storage/localStorage/helpers";
import { getToken } from "ente-accounts/services/accounts-db";
import { z } from "zod/v4";
import { decryptBox, encryptBox, generateKey } from "./crypto";
import { isDevBuild } from "./env";

View File

@@ -1,5 +1,6 @@
import LockIcon from "@mui/icons-material/Lock";
import { Stack, Typography } from "@mui/material";
import { getData, setLSUser } from "ente-accounts/services/accounts-db";
import {
RowButton,
RowButtonGroup,
@@ -13,7 +14,6 @@ import {
} from "ente-base/components/mui/SidebarDrawer";
import { useBaseContext } from "ente-base/context";
import { disable2FA, get2FAStatus } from "ente-new/photos/services/user";
import { getData, setLSUser } from "ente-shared/storage/localStorage";
import { t } from "i18next";
import router, { useRouter } from "next/router";
import { useEffect, useState } from "react";

View File

@@ -1,10 +1,10 @@
import { getData, setLSUser } from "ente-accounts/services/accounts-db";
import { ensureLocalUser } from "ente-accounts/services/user";
import { isDesktop } from "ente-base/app";
import { authenticatedRequestHeaders, ensureOk } from "ente-base/http";
import { getKV, setKV } from "ente-base/kv";
import log from "ente-base/log";
import { apiURL } from "ente-base/origins";
import { getData, setLSUser } from "ente-shared/storage/localStorage";
import {
nullishToEmpty,
nullishToZero,

View File

@@ -1,26 +0,0 @@
import { getData, setData } from ".";
export const getToken = (): string => {
const token = getData("user")?.token;
return token;
};
export const isFirstLogin = () => getData("isFirstLogin")?.status ?? false;
export function setIsFirstLogin(status: boolean) {
setData("isFirstLogin", { status });
}
export const justSignedUp = () => getData("justSignedUp")?.status ?? false;
export function setJustSignedUp(status: boolean) {
setData("justSignedUp", { status });
}
export function getLocalReferralSource() {
return getData("referralSource")?.source;
}
export function setLocalReferralSource(source: string) {
setData("referralSource", { source });
}