verify.tsx 2.3 KB

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