From d7daf2c8f383c1ef8b848ab4dbd3a0fda2104c22 Mon Sep 17 00:00:00 2001 From: Oliver Barnwell Date: Sun, 27 Jun 2021 16:49:47 +0100 Subject: [PATCH] feat: IT RENDERS --- config-overrides.js | 44 ++++---- next.config.js | 8 ++ package.json | 5 + src/Auth.tsx | 22 ++-- src/components/Button/Button.tsx | 27 ++--- src/components/EntryForm.tsx | 4 +- src/components/Footer.tsx | 10 +- src/components/Header/Header.tsx | 3 +- .../LocationSearch/LocationSearch.tsx | 2 +- src/components/LooMap/AccessibilityList.tsx | 3 +- src/components/LooMap/LooMap.tsx | 14 +-- src/components/PageLayout.tsx | 2 +- src/components/Portal.tsx | 2 +- src/components/ProtectedRoute.tsx | 4 +- src/components/Sidebar.tsx | 10 +- src/components/Spacer/Spacer.tsx | 11 +- src/components/ToiletDetailsPanel.tsx | 13 ++- src/config.ts | 5 +- src/explorer/Areas/index.tsx | 6 +- src/explorer/HeadlineStats/index.tsx | 2 +- src/explorer/Layout.tsx | 2 +- src/explorer/Loo/index.tsx | 9 +- src/explorer/Map/Chloropleth.tsx | 2 +- src/explorer/Search/Form/SearchForm.tsx | 2 +- src/explorer/Search/Results/Row.tsx | 4 +- src/explorer/Search/index.tsx | 2 +- src/explorer/explorer.module.css | 9 +- src/explorer/index.tsx | 51 +++++---- src/index.tsx | 98 ----------------- src/mocks.tsx | 2 +- src/pages/AboutPage.tsx | 6 +- src/pages/AddPage.tsx | 2 +- src/pages/CookiesPage.tsx | 2 +- src/pages/EditPage.tsx | 6 +- src/pages/HomePage.tsx | 20 ++-- src/pages/RemovePage.tsx | 2 +- src/pages/_app.tsx | 102 ++++++++++++++++++ src/pages/_document.tsx | 22 ++++ tsconfig.json | 1 + 39 files changed, 284 insertions(+), 257 deletions(-) create mode 100644 next.config.js delete mode 100644 src/index.tsx create mode 100644 src/pages/_app.tsx create mode 100644 src/pages/_document.tsx diff --git a/config-overrides.js b/config-overrides.js index 39816aa0c..5958308e4 100644 --- a/config-overrides.js +++ b/config-overrides.js @@ -1,24 +1,24 @@ -const webpack = require('webpack'); -const { - useBabelRc, - override, - useEslintRc, - addBabelPreset, -} = require('customize-cra'); +// const webpack = require('webpack'); +// const { +// useBabelRc, +// override, +// useEslintRc, +// addBabelPreset, +// } = require('customize-cra'); -module.exports = { - webpack: override( - useBabelRc(), - useEslintRc(), - addBabelPreset('@emotion/babel-preset-css-prop'), - function (config, env) { - config.plugins.push( - new webpack.ProvidePlugin({ - L: 'leaflet', - }) - ); +// module.exports = { +// webpack: override( +// useBabelRc(), +// useEslintRc(), +// addBabelPreset('@emotion/babel-preset-css-prop'), +// function (config, env) { +// config.plugins.push( +// new webpack.ProvidePlugin({ +// L: 'leaflet', +// }) +// ); - return config; - } - ), -}; +// return config; +// } +// ), +// }; diff --git a/next.config.js b/next.config.js new file mode 100644 index 000000000..b0e999c5f --- /dev/null +++ b/next.config.js @@ -0,0 +1,8 @@ +module.exports = { + webpack: (config, { isServer }) => { + if (!isServer) { + config.resolve.fallback.fs = false; + } + return config; + }, + } \ No newline at end of file diff --git a/package.json b/package.json index 524941a29..d16af7ce6 100644 --- a/package.json +++ b/package.json @@ -145,5 +145,10 @@ }, "msw": { "workerDirectory": "public" + }, + "browser": { + "fs": false, + "path": false, + "os": false } } diff --git a/src/Auth.tsx b/src/Auth.tsx index 0aca48302..3a4ba7bfe 100644 --- a/src/Auth.tsx +++ b/src/Auth.tsx @@ -19,7 +19,7 @@ export const useAuth = () => React.useContext(AuthContext); export const isAuthenticated = () => { // Check whether the current time is past the // Access Token's expiry time - let expiresAt = JSON.parse(localStorage.getItem('expires_at')); + let expiresAt = JSON.parse((typeof localStorage !== 'undefined') && localStorage.getItem('expires_at')); return new Date().getTime() < expiresAt; }; @@ -32,17 +32,19 @@ const redirectOnNextLogin = (location) => { }; const redirectOnLogin = () => { - return JSON.parse(localStorage.getItem('redirectOnLogin')); + return JSON.parse((typeof localStorage !== 'undefined') && localStorage.getItem('redirectOnLogin')); }; const logout = () => { - // Clear Access Token and ID Token from local storage also the cached email - localStorage.removeItem('name'); - localStorage.removeItem('nickname'); - localStorage.removeItem('access_token'); - localStorage.removeItem('id_token'); - localStorage.removeItem('expires_at'); - localStorage.removeItem('permissions'); + if(typeof window.localStorage !== 'undefined') { + // Clear Access Token and ID Token from local storage also the cached email + localStorage.removeItem('name'); + localStorage.removeItem('nickname'); + localStorage.removeItem('access_token'); + localStorage.removeItem('id_token'); + localStorage.removeItem('expires_at'); + localStorage.removeItem('permissions'); + } }; const checkPermission = (perm) => { @@ -58,7 +60,7 @@ const AuthProvider = ({ children }) => { audience: 'https://www.toiletmap.org.uk/graphql', scope: 'openid profile report:loo', clientID: CLIENT_ID, - redirectUri: `${window.location.origin}/callback`, + redirectUri: `${(typeof window !== 'undefined') ? window.location.origin : ''}/callback`, }) ); diff --git a/src/components/Button/Button.tsx b/src/components/Button/Button.tsx index 722c95321..c94423d68 100644 --- a/src/components/Button/Button.tsx +++ b/src/components/Button/Button.tsx @@ -1,14 +1,13 @@ -import React, { AnchorHTMLAttributes, ComponentPropsWithoutRef, ElementType, LegacyRef } from 'react'; -import styled, { StyledComponent } from '@emotion/styled'; -import { buttonStyle, ButtonStyleProps, variant } from 'styled-system'; +import React from 'react'; +import styled from '@emotion/styled'; +import { variant } from 'styled-system'; import Box from '../Box'; import Text from '../Text'; const BUTTON_HEIGHT = 34; - -const StyledButton = styled.button( +const StyledButton = styled.button( (props) => ` display: inline-flex; @@ -69,28 +68,20 @@ const StyledButton = styled.button( minHeight: 0, }, }, - }), - buttonStyle + }) ); const ButtonIcon = ({ icon }) => { return {icon}; }; - -interface IButtonProps extends ButtonStyleProps { - icon?: JSX.Element; -} - -type ButtonProps = IButtonProps & ComponentPropsWithoutRef; - -const Button = React.forwardRef(({ children, icon, ...props }, ref) => ( - +const Button = ({ children, icon, ...props }) => ( + {Boolean(icon) && } {children} -)); +); Button.defaultProps = { variant: 'primary', @@ -98,4 +89,4 @@ Button.defaultProps = { }; /** @component */ -export default Button; +export default StyledButton; diff --git a/src/components/EntryForm.tsx b/src/components/EntryForm.tsx index 35f464c7c..9d751c1db 100644 --- a/src/components/EntryForm.tsx +++ b/src/components/EntryForm.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import styled from '@emotion/styled'; import { useForm, Controller } from 'react-hook-form'; -import { Link } from 'next/link'; +import Link from 'next/link'; import isFunction from 'lodash/isFunction'; import omit from 'lodash/omit'; import pick from 'lodash/pick'; @@ -600,7 +600,7 @@ const EntryForm = ({ title, loo, center, children, ...props }) => { and bars.  . We also use open data and request information from councils,{' '} @@ -138,7 +138,7 @@ const AboutPage = (props) => { The Explorer

 to get an overview of the statistics and details related to the Toilet Map. These statistics are calculated on-demand, so will be up diff --git a/src/pages/AddPage.tsx b/src/pages/AddPage.tsx index e20f86959..0c484ad8e 100644 --- a/src/pages/AddPage.tsx +++ b/src/pages/AddPage.tsx @@ -3,7 +3,7 @@ import { Helmet } from 'react-helmet'; import queryString from 'query-string'; import { Redirect } from 'next/link'; import { mutate } from 'swr'; -import { loader } from 'graphql.macro'; +// import { loader } from 'graphql.macro'; import { print } from 'graphql/language/printer'; import PageLayout from '../components/PageLayout'; diff --git a/src/pages/CookiesPage.tsx b/src/pages/CookiesPage.tsx index 908edfa3e..5dc736f0c 100644 --- a/src/pages/CookiesPage.tsx +++ b/src/pages/CookiesPage.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Link } from 'next/link'; +import Link from 'next/link'; import { Helmet } from 'react-helmet'; import PageLayout from '../components/PageLayout'; diff --git a/src/pages/EditPage.tsx b/src/pages/EditPage.tsx index f1177e856..45ab65b4b 100644 --- a/src/pages/EditPage.tsx +++ b/src/pages/EditPage.tsx @@ -1,12 +1,12 @@ import React, { useState, useEffect } from 'react'; import { Helmet } from 'react-helmet'; -import { Link, Redirect } from 'next/link'; +import Link from 'next/link'; import merge from 'lodash/merge'; import cloneDeep from 'lodash/cloneDeep'; import uniqBy from 'lodash/uniqBy'; -import { css } from '@emotion/core'; +import { css } from '@emotion/react'; import useSWR, { mutate } from 'swr'; -import { loader } from 'graphql.macro'; +// import { loader } from 'graphql.macro'; import { print } from 'graphql/language/printer'; import PageLayout from '../components/PageLayout'; diff --git a/src/pages/HomePage.tsx b/src/pages/HomePage.tsx index b2a3f69a6..944a25a10 100644 --- a/src/pages/HomePage.tsx +++ b/src/pages/HomePage.tsx @@ -1,17 +1,15 @@ import React, { useState } from 'react'; import PropTypes from 'prop-types'; -import { useParams, useRouteMatch } from 'next/link'; +import Link from 'next/link'; import queryString from 'query-string'; import { Helmet } from 'react-helmet'; import useSWR from 'swr'; -import { loader } from 'graphql.macro'; -import { print } from 'graphql/language/printer'; - +// // import { loader } from 'graphql.macro'; +// import { print } from 'graphql/language/printer'; +import dynamic from 'next/dynamic'; import PageLayout from '../components/PageLayout'; -import LooMap from '../components/LooMap'; import useNearbyLoos from '../components/useNearbyLoos'; import Box from '../components/Box'; -import ToiletDetailsPanel from '../components/ToiletDetailsPanel'; import Sidebar from '../components/Sidebar'; import Notification from '../components/Notification'; import VisuallyHidden from '../components/VisuallyHidden'; @@ -19,13 +17,14 @@ import { useMapState } from '../components/MapState'; import config, { FILTERS_KEY } from '../config'; -const FIND_LOO_BY_ID_QUERY = print(loader('../graphql/findLooById.graphql')); +// const FIND_LOO_BY_ID_QUERY = print(loader('../graphql/findLooById.graphql')); const SIDEBAR_BOTTOM_MARGIN = 32; const HomePage = ({ initialPosition, ...props }) => { const [mapState, setMapState] = useMapState(); - + const LooMap = React.useMemo(() => dynamic(() => import('../components/LooMap'), { loading: () =>

Loading map...

, ssr: false, }), []) + const ToiletDetailsPanel = React.useMemo(() => dynamic(() => import('../components/ToiletDetailsPanel'), { loading: () =>

Loading map...

, ssr: false, }), []) let initialState = config.getSettings(FILTERS_KEY); // default any unsaved filters as 'false' @@ -122,9 +121,8 @@ const HomePage = ({ initialPosition, ...props }) => { right={0} m={3} maxWidth={326} - maxHeight={`calc(100% - ${ - toiletPanelDimensions.height || 0 - }px - ${SIDEBAR_BOTTOM_MARGIN}px)`} + maxHeight={`calc(100% - ${toiletPanelDimensions.height || 0 + }px - ${SIDEBAR_BOTTOM_MARGIN}px)`} overflowY="auto" // center on small viewports mx={['auto', 0]} diff --git a/src/pages/RemovePage.tsx b/src/pages/RemovePage.tsx index 4cec53881..1fec37685 100644 --- a/src/pages/RemovePage.tsx +++ b/src/pages/RemovePage.tsx @@ -2,7 +2,7 @@ import React, { useState } from 'react'; import { Helmet } from 'react-helmet'; import useSWR from 'swr'; import { Redirect, useParams, useHistory } from 'next/link'; -import { loader } from 'graphql.macro'; +// import { loader } from 'graphql.macro'; import { print } from 'graphql/language/printer'; import config from '../config'; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx new file mode 100644 index 000000000..3b159f729 --- /dev/null +++ b/src/pages/_app.tsx @@ -0,0 +1,102 @@ +// Polyfills +import 'react-app-polyfill/ie11'; +import 'react-app-polyfill/stable'; +import 'resize-observer-polyfill'; + +import React, { Suspense, lazy } from 'react'; +import ReactDOM from 'react-dom'; +import Router from 'next/router'; +import Link from 'next/link'; +import { SWRConfig } from 'swr'; + +import ProtectedRoute from '../components/ProtectedRoute'; +import AuthCallback from './AuthCallback'; +import HomePage from './HomePage'; +import AboutPage from './AboutPage'; +import ContactPage from './ContactPage'; +import ContributePage from './ContributePage'; +import MapPage from './MapPage'; +import UseOurLoosPage from './UseOurLoosPage'; +import CookiesPage from './CookiesPage'; +import PrivacyPage from './PrivacyPage'; +import NotFound from './404'; +import PageLoading from '../components/PageLoading'; + +import AuthProvider from '../Auth'; +import fetcher from '../graphql/fetcher'; +import { MapStateProvider } from '../components/MapState'; + +// if (process.env.REACT_APP_MOCKS) { +// lazy(() => +// import(/*webpackChunkName: 'explorer'*/ '../mocks') +// ); +// } + +const Explorer = lazy(() => + import(/*webpackChunkName: 'explorer'*/ '../explorer') +); +const AddPage = lazy(() => + import(/*webpackChunkName: 'add'*/ './AddPage') +); +const EditPage = lazy(() => + import(/*webpackChunkName: 'edit'*/ './EditPage') +); +const RemovePage = lazy(() => + import(/*webpackChunkName: 'remove'*/ './RemovePage') +); + +// ReactDOM.render( +// , +// (typeof document !== 'undefined') && document.getElementById('root') +// ); + + +const App = ({Component, pageProps}) => ( + + + + + {/* }> */} + {/* */} + {/* + + + + + + + } + /> + } + /> + } + /> + } + /> + } + /> + + + */} + {/* */} + + + +) + +export default App; diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx new file mode 100644 index 000000000..bb720f603 --- /dev/null +++ b/src/pages/_document.tsx @@ -0,0 +1,22 @@ +import Document, { Html, Head, Main, NextScript } from 'next/document' + +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx) + return { ...initialProps } + } + + render() { + return ( + + + +
+ + + + ) + } +} + +export default MyDocument \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 37afa241f..47aeaa895 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "types": ["node", "@emotion/react"], "target": "es5", "lib": [ "dom",