verify.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { Flex } from "reflexbox/styled-components";
  2. import React, { useEffect } from "react";
  3. import styled from "styled-components";
  4. import decode from "jwt-decode";
  5. import cookie from "js-cookie";
  6. import Link from "next/link";
  7. import AppWrapper from "../components/AppWrapper";
  8. import { Button } from "../components/Button";
  9. import { useStoreActions } from "../store";
  10. import { Col } from "../components/Layout";
  11. import { TokenPayload } from "../types";
  12. import Icon from "../components/Icon";
  13. import { NextPage } from "next";
  14. import { Colors } from "../consts";
  15. import ALink from "../components/ALink";
  16. interface Props {
  17. token?: string;
  18. }
  19. const MessageWrapper = styled(Flex).attrs({
  20. justifyContent: "center",
  21. alignItems: "center",
  22. my: 32
  23. })``;
  24. const Message = styled.p`
  25. font-size: 24px;
  26. font-weight: 300;
  27. @media only screen and (max-width: 768px) {
  28. font-size: 18px;
  29. }
  30. `;
  31. const Verify: NextPage<Props> = ({ token }) => {
  32. const addAuth = useStoreActions(s => s.auth.add);
  33. useEffect(() => {
  34. if (token) {
  35. cookie.set("token", token, { expires: 7 });
  36. const payload: TokenPayload = decode(token);
  37. addAuth(payload);
  38. }
  39. }, []);
  40. return (
  41. <AppWrapper>
  42. {token ? (
  43. <Col alignItems="center">
  44. <MessageWrapper>
  45. <Icon name="check" size={32} mr={3} stroke={Colors.CheckIcon} />
  46. <Message>Your account has been verified successfully!</Message>
  47. </MessageWrapper>
  48. <Link href="/">
  49. <ALink href="/" forButton>
  50. <Button>
  51. <Icon name="arrowLeft" stroke="white" mr={2} />
  52. Back to homepage
  53. </Button>
  54. </ALink>
  55. </Link>
  56. </Col>
  57. ) : (
  58. <Col alignItems="center">
  59. <MessageWrapper>
  60. <Icon name="x" size={32} mr={3} stroke={Colors.TrashIcon} />
  61. <Message>Invalid verification.</Message>
  62. </MessageWrapper>
  63. <Link href="/login">
  64. <ALink href="/login" forButton>
  65. <Button color="purple">
  66. <Icon name="arrowLeft" stroke="white" mr={2} />
  67. Back to signup
  68. </Button>
  69. </ALink>
  70. </Link>
  71. </Col>
  72. )}
  73. </AppWrapper>
  74. );
  75. };
  76. Verify.getInitialProps = async ({ req }) => {
  77. return { token: req && (req as any).token }; // TODO: types bro
  78. };
  79. export default Verify;