_app.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import App, { AppContext } from "next/app";
  2. import { StoreProvider } from "easy-peasy";
  3. import Head from "next/head";
  4. import Router from "next/router";
  5. import React from "react";
  6. import { Provider } from "react-redux";
  7. import decode from "jwt-decode";
  8. import withReduxStore from "../with-redux-store";
  9. import { initializeStore } from "../store";
  10. import { TokenPayload } from "../types";
  11. // TODO: types
  12. class MyApp extends App<any> {
  13. static async getInitialProps({ Component, ctx }: AppContext) {
  14. const store = initializeStore();
  15. ctx.store = store;
  16. let pageProps = {};
  17. if (Component.getInitialProps) {
  18. pageProps = await Component.getInitialProps(ctx);
  19. }
  20. const token =
  21. ctx.req && (ctx.req as any).cookies && (ctx.req as any).cookies.token;
  22. const tokenPayload: TokenPayload = token ? decode(token) : null;
  23. if (tokenPayload) {
  24. store.dispatch.auth.add(tokenPayload);
  25. }
  26. return { pageProps, tokenPayload, initialState: store.getState() };
  27. }
  28. store: ReturnType<typeof initializeStore>;
  29. constructor(props) {
  30. super(props);
  31. this.store = initializeStore(props.initialState);
  32. }
  33. componentDidMount() {
  34. const { loading } = this.store.dispatch;
  35. Router.events.on("routeChangeStart", () => loading.show());
  36. Router.events.on("routeChangeComplete", () => loading.hide());
  37. Router.events.on("routeChangeError", () => loading.hide());
  38. }
  39. render() {
  40. const { Component, pageProps, reduxStore } = this.props;
  41. return (
  42. <>
  43. <Head>
  44. <title>Kutt.it | Modern Open Source URL shortener.</title>
  45. </Head>
  46. <Provider store={reduxStore}>
  47. <StoreProvider store={this.store}>
  48. <Component {...pageProps} />
  49. </StoreProvider>
  50. </Provider>
  51. </>
  52. );
  53. }
  54. }
  55. export default withReduxStore(MyApp);