Move and preamble
This commit is contained in:
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
@@ -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";
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user