Skip to content

Commit

Permalink
add error fallback and loader
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewwolfe committed Jul 4, 2020
1 parent 2faa4cc commit e3e8545
Show file tree
Hide file tree
Showing 13 changed files with 86 additions and 28 deletions.
25 changes: 14 additions & 11 deletions src/components/App/App.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
import { Box } from '@material-ui/core';
import { AppProvider } from '../AppProvider';
import { CoordsProvider } from '../CoordsProvider';
import { LeftPanel } from '../LeftPanel';
import { RightPanel } from '../RightPanel';
import { WeatherProvider } from '../WeatherProvider';

function App() {
return (
<CoordsProvider>
<WeatherProvider>
<Box
display="flex"
flexDirection={['column-reverse', 'column-reverse', 'row']}
>
<LeftPanel />
<RightPanel />
</Box>
</WeatherProvider>
</CoordsProvider>
<AppProvider>
<CoordsProvider>
<WeatherProvider>
<Box
display="flex"
flexDirection={['column-reverse', 'column-reverse', 'row']}
>
<LeftPanel />
<RightPanel />
</Box>
</WeatherProvider>
</CoordsProvider>
</AppProvider>
);
}

Expand Down
14 changes: 14 additions & 0 deletions src/components/AppProvider/AppProvider.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { useState } from 'react';
import { AppContext } from '../../contexts';

function AppProvider({ children }) {
const [loading, setLoading] = useState(true);

return (
<AppContext.Provider value={{ loading, setLoading }}>
{children}
</AppContext.Provider>
);
}

export default AppProvider;
1 change: 1 addition & 0 deletions src/components/AppProvider/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default as AppProvider } from './AppProvider';
21 changes: 9 additions & 12 deletions src/components/CoordsProvider/CoordsProvider.js
Original file line number Diff line number Diff line change
@@ -1,36 +1,33 @@
import { useState, useEffect } from 'react';
import { ErrorFallback } from '../ErrorFallback';
import { Loader } from '../Loader';
import { CoordsContext } from '../../contexts';

function CoordsProvider({ children }) {
const [coords, setCoords] = useState(null);
const [error, setError] = useState(null);
const [loading, setLoading] = useState(true);

useEffect(() => {
navigator.geolocation.getCurrentPosition(
({ coords }) => {
setCoords(coords);
setLoading(false);
},
(geoError) => {
setError(geoError);
setLoading(false);
},
);
}, []);

if (loading || error) {
return null;
if (error) {
return <ErrorFallback />;
}

if (!coords) {
return <Loader />;
}

return (
<CoordsContext.Provider
value={{
coords,
error,
loading,
}}
>
<CoordsContext.Provider value={{ coords, error }}>
{children}
</CoordsContext.Provider>
);
Expand Down
14 changes: 14 additions & 0 deletions src/components/ErrorFallback/ErrorFallback.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Box, Typography } from '@material-ui/core';

function ErrorFallback() {
return (
<Box p={5}>
<Typography variant="h4">
Something went wrong. Either the API could not be reached, or permission
to access location was not granted.
</Typography>
</Box>
);
}

export default ErrorFallback;
1 change: 1 addition & 0 deletions src/components/ErrorFallback/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default as ErrorFallback } from './ErrorFallback';
11 changes: 11 additions & 0 deletions src/components/Loader/Loader.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Box, CircularProgress } from '@material-ui/core';

function Loader() {
return (
<Box p={10} textAlign="center" width={1}>
<CircularProgress />
</Box>
);
}

export default Loader;
1 change: 1 addition & 0 deletions src/components/Loader/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default as Loader } from './Loader';
11 changes: 6 additions & 5 deletions src/components/WeatherProvider/WeatherProvider.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import useSWR from 'swr';
import { ErrorFallback } from '../ErrorFallback';
import { Loader } from '../Loader';
import { WeatherContext } from '../../contexts';
import {
DAILY_FORECAST_URL,
Expand All @@ -16,12 +17,12 @@ function WeatherProvider({ children }) {
HOURLY_FORECAST_URL,
);

if (!dailyData || !hourlyData) {
return null;
if (dailyError || hourlyError) {
return <ErrorFallback />;
}

if (dailyError || hourlyError) {
return <div>Something went wrong :(</div>;
if (!dailyData || !hourlyData) {
return <Loader />;
}

return (
Expand Down
5 changes: 5 additions & 0 deletions src/contexts/AppContext.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { createContext } from 'react';

const AppContext = createContext({});

export default AppContext;
1 change: 1 addition & 0 deletions src/contexts/index.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export { default as AppContext } from './AppContext';
export { default as CoordsContext } from './CoordsContext';
export { default as WeatherContext } from './WeatherContext';
1 change: 1 addition & 0 deletions src/hooks/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export { default as useApp } from './useApp';
export { default as useCurrentCoords } from './useCurrentCoords';
export { default as useGetForecast } from './useGetForecast';
export { default as useTodayHourlyData } from './useTodayHourlyData';
Expand Down
8 changes: 8 additions & 0 deletions src/hooks/useApp.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { useContext } from 'react';
import { AppContext } from '../contexts';

function useApp() {
return useContext(AppContext);
}

export default useApp;

0 comments on commit e3e8545

Please sign in to comment.