From 04dbf7224c8d3581659acc318725ebd4229d10a4 Mon Sep 17 00:00:00 2001 From: Ian Mancini Date: Sun, 15 Nov 2020 16:15:38 -0300 Subject: [PATCH] Show error screen on socket disconnect --- packages/client/src/components/Error.tsx | 48 ++++++++++++++++++++++++ packages/client/src/components/Museo.tsx | 21 +++++++++-- packages/client/src/store.ts | 6 +++ 3 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 packages/client/src/components/Error.tsx diff --git a/packages/client/src/components/Error.tsx b/packages/client/src/components/Error.tsx new file mode 100644 index 0000000..6b937d3 --- /dev/null +++ b/packages/client/src/components/Error.tsx @@ -0,0 +1,48 @@ +import React from 'react' +import useStore from '../store' +import { Box, Heading, Link, Stack, Text } from '@chakra-ui/react' + +const Error: React.FC = () => { + const error = useStore((state) => state.error) + + const errorText = (): string => { + switch (error) { + case 'SOCKET': { + return 'Ocurrió un error de conexión' + } + default: + return 'Ocurrió un error desconocido' + } + } + + const reloadPage = () => { + window.location.reload() + return false + } + + return ( + + ¡Oh no! + + {errorText()} + + Por favor,{' '} + reloadPage()}>clickeá acá para recargar la página + + + + Si el problema persiste, envía un correo electrónico a{' '} + ianmethyst@gmail.com + + + ) +} + +export default Error diff --git a/packages/client/src/components/Museo.tsx b/packages/client/src/components/Museo.tsx index bcf530b..090e8fe 100644 --- a/packages/client/src/components/Museo.tsx +++ b/packages/client/src/components/Museo.tsx @@ -5,27 +5,40 @@ import { Box } from '@chakra-ui/react' import { Canvas } from 'react-three-fiber' import MenuOverlay from './MenuOverlay' +import Error from './Error' import Scene from '../3d' import useStore from '../store' const Museo: React.FC = () => { const setSocket = useStore((state) => state.setSocket) + const setError = useStore((state) => state.setError) + const error = useStore((state) => state.error) + useEffect(() => { const socket = io() setSocket(socket) + socket.on('disconnect', () => setError('SOCKET')) + return () => { socket.close() setSocket(null) } }, []) + return ( - - - - + {error ? ( + + ) : ( + <> + + + + + + )} ) } diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts index a1cbb01..6d56be4 100644 --- a/packages/client/src/store.ts +++ b/packages/client/src/store.ts @@ -2,6 +2,8 @@ import create from 'zustand' import { PointerLockControls } from '@react-three/drei' import { Socket } from 'socket.io-client' +type Error = null | 'SOCKET' + type State = { pointerLockControls: PointerLockControls | undefined pointerLocked: boolean @@ -9,6 +11,8 @@ type State = { setPointerLockControls: (controls: PointerLockControls) => void socket: null | Socket setSocket: (socket: Socket | null) => void + error: Error + setError: (error: Error) => void } const useStore = create((set) => ({ @@ -18,6 +22,8 @@ const useStore = create((set) => ({ setPointerLockControls: (controls) => set(() => ({ pointerLockControls: controls })), socket: null, setSocket: (socket) => set(() => ({ socket })), + error: null, + setError: (error) => set(() => ({ error })), })) export default useStore