verify.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { verifyTwoFactor } from "@ente/accounts/api/user";
  2. import VerifyTwoFactor, {
  3. VerifyTwoFactorCallback,
  4. } from "@ente/accounts/components/two-factor/VerifyForm";
  5. import { PAGES } from "@ente/accounts/constants/pages";
  6. import { logoutUser } from "@ente/accounts/services/user";
  7. import { LS_KEYS, getData, setData } from "@ente/shared/storage/localStorage";
  8. import { User } from "@ente/shared/user/types";
  9. import { t } from "i18next";
  10. import { useEffect, useState } from "react";
  11. import { PageProps } from "@ente/shared/apps/types";
  12. import { VerticallyCentered } from "@ente/shared/components/Container";
  13. import FormPaper from "@ente/shared/components/Form/FormPaper";
  14. import FormPaperFooter from "@ente/shared/components/Form/FormPaper/Footer";
  15. import FormTitle from "@ente/shared/components/Form/FormPaper/Title";
  16. import LinkButton from "@ente/shared/components/LinkButton";
  17. import { ApiError } from "@ente/shared/error";
  18. import InMemoryStore, { MS_KEYS } from "@ente/shared/storage/InMemoryStore";
  19. import { HttpStatusCode } from "axios";
  20. export default function TwoFactorVerify({ router }: PageProps) {
  21. const [sessionID, setSessionID] = useState("");
  22. useEffect(() => {
  23. const main = async () => {
  24. const user: User = getData(LS_KEYS.USER);
  25. if (!user?.email || !user.twoFactorSessionID) {
  26. router.push(PAGES.ROOT);
  27. } else if (
  28. !user.isTwoFactorEnabled &&
  29. (user.encryptedToken || user.token)
  30. ) {
  31. router.push(PAGES.CREDENTIALS);
  32. } else {
  33. setSessionID(user.twoFactorSessionID);
  34. }
  35. };
  36. main();
  37. }, []);
  38. const onSubmit: VerifyTwoFactorCallback = async (otp) => {
  39. try {
  40. const resp = await verifyTwoFactor(otp, sessionID);
  41. const { keyAttributes, encryptedToken, token, id } = resp;
  42. setData(LS_KEYS.USER, {
  43. ...getData(LS_KEYS.USER),
  44. token,
  45. encryptedToken,
  46. id,
  47. });
  48. setData(LS_KEYS.KEY_ATTRIBUTES, keyAttributes);
  49. const redirectURL = InMemoryStore.get(MS_KEYS.REDIRECT_URL);
  50. InMemoryStore.delete(MS_KEYS.REDIRECT_URL);
  51. router.push(redirectURL ?? PAGES.CREDENTIALS);
  52. } catch (e) {
  53. if (
  54. e instanceof ApiError &&
  55. e.httpStatusCode === HttpStatusCode.NotFound
  56. ) {
  57. logoutUser();
  58. } else {
  59. throw e;
  60. }
  61. }
  62. };
  63. return (
  64. <VerticallyCentered>
  65. <FormPaper sx={{ maxWidth: "410px" }}>
  66. <FormTitle>{t("TWO_FACTOR")}</FormTitle>
  67. <VerifyTwoFactor onSubmit={onSubmit} buttonText={t("VERIFY")} />
  68. <FormPaperFooter style={{ justifyContent: "space-between" }}>
  69. <LinkButton
  70. onClick={() => router.push(PAGES.TWO_FACTOR_RECOVER)}
  71. >
  72. {t("LOST_DEVICE")}
  73. </LinkButton>
  74. <LinkButton onClick={logoutUser}>
  75. {t("CHANGE_EMAIL")}
  76. </LinkButton>
  77. </FormPaperFooter>
  78. </FormPaper>
  79. </VerticallyCentered>
  80. );
  81. }