From 59c03d16ebbb73bef0eea2d8e339b57714e72b4a Mon Sep 17 00:00:00 2001 From: Bekbolsun Date: Mon, 19 Feb 2024 21:41:10 +0600 Subject: [PATCH] add reload badge on sw update --- src/App.tsx | 8 +-- .../Modal/ModalEditName/ModalEditName.tsx | 4 +- src/components/ReloadBadge/ReloadBadge.tsx | 33 ++++++++++++ src/components/ReloadBadge/styled.tsx | 50 +++++++++++++++++++ src/layout/Header/Header.tsx | 17 +++++-- src/layout/Layout.tsx | 24 ++++----- src/routes/AppRoutes.tsx | 1 - src/store/index.ts | 11 +--- 8 files changed, 116 insertions(+), 32 deletions(-) create mode 100644 src/components/ReloadBadge/ReloadBadge.tsx create mode 100644 src/components/ReloadBadge/styled.tsx diff --git a/src/App.tsx b/src/App.tsx index 48d7610..ad3a79a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -9,16 +9,17 @@ import { ModalInitial } from './components/Modal/ModalInitial/ModalInitial' import { ModalImportKeys } from './components/Modal/ModalImportKeys/ModalImportKeys' import { ModalSignUp } from './components/Modal/ModalSignUp/ModalSignUp' import { ModalLogin } from './components/Modal/ModalLogin/ModalLogin' +import { useSearchParams } from 'react-router-dom' function App() { const [render, setRender] = useState(0) const dispatch = useAppDispatch() + const [searchParams, setSearchParams] = useSearchParams() const [isConnected, setIsConnected] = useState(false) const load = useCallback(async () => { const keys: DbKey[] = await dbi.listKeys() - // console.log(keys, 'keys') dispatch(setKeys({ keys })) const loadProfiles = async () => { @@ -55,7 +56,6 @@ function App() { // rerender // setRender((r) => r + 1) - // if (!keys.length) handleOpen(MODAL_PARAMS_KEYS.INITIAL) // eslint-disable-next-line }, [dispatch]) @@ -80,12 +80,14 @@ function App() { // subscribe to service worker updates swicOnReload(() => { console.log('reload') - // FIXME show 'Please reload' badge at page top + searchParams.set('reload', 'true') + setSearchParams(searchParams) }) return ( <> + diff --git a/src/components/Modal/ModalEditName/ModalEditName.tsx b/src/components/Modal/ModalEditName/ModalEditName.tsx index 09d43d0..bf3f438 100644 --- a/src/components/Modal/ModalEditName/ModalEditName.tsx +++ b/src/components/Modal/ModalEditName/ModalEditName.tsx @@ -13,7 +13,7 @@ import { DOMAIN } from '@/utils/consts' import { fetchNip05 } from '@/utils/helpers/helpers' import { Stack, Typography, useTheme } from '@mui/material' import { ChangeEvent, Fragment, useCallback, useEffect, useState } from 'react' -import { useParams, useSearchParams } from 'react-router-dom' +import { useParams } from 'react-router-dom' import { useDebounce } from 'use-debounce' import { StyledSettingContainer } from './styled' import { SectionTitle } from '@/shared/SectionTitle/SectionTitle' @@ -55,7 +55,7 @@ export const ModalEditName = () => { setIsAvailable(true) setIsChecking(false) } - }, [debouncedName]) + }, [debouncedName, npub]) useEffect(() => { checkIsUsernameAvailable() diff --git a/src/components/ReloadBadge/ReloadBadge.tsx b/src/components/ReloadBadge/ReloadBadge.tsx new file mode 100644 index 0000000..cbe858f --- /dev/null +++ b/src/components/ReloadBadge/ReloadBadge.tsx @@ -0,0 +1,33 @@ +import { FC } from 'react' +import { Collapse, Stack, Typography } from '@mui/material' +import { useSearchParams } from 'react-router-dom' +import { StyledAlert, StyledReloadButton } from './styled' + +const ReloadBadgeContent: FC = () => { + const [searchParams, setSearchParams] = useSearchParams() + + const handleReload = () => { + searchParams.delete('reload') + setSearchParams(searchParams) + window.location.reload() + } + return ( + + + + + New version available, please reload the page! + + Reload + + + + ) +} + +export const ReloadBadge = () => { + const [searchParams] = useSearchParams() + const open = searchParams.get('reload') === 'true' + + return <>{open && } +} diff --git a/src/components/ReloadBadge/styled.tsx b/src/components/ReloadBadge/styled.tsx new file mode 100644 index 0000000..1029efb --- /dev/null +++ b/src/components/ReloadBadge/styled.tsx @@ -0,0 +1,50 @@ +import { AppButtonProps, Button } from '@/shared/Button/Button' +import { Alert, AlertProps, styled } from '@mui/material' +import RefreshIcon from '@mui/icons-material/Refresh' + +export const StyledAlert = styled((props: AlertProps) => ( + +))(() => { + return { + height: 'auto', + marginTop: '0.5rem', + alignItems: 'center', + '& .message': { + flex: 1, + overflow: 'initial', + }, + '& .content': { + width: '100%', + alignItems: 'center', + gap: '1rem', + }, + '& .title': { + display: '-webkit-box', + WebkitLineClamp: 3, + WebkitBoxOrient: 'vertical', + overflow: 'hidden', + textOverflow: 'ellipsis', + }, + '@media screen and (max-width: 320px)': { + '& .title': { + fontSize: '14px', + WebkitLineClamp: 2, + }, + }, + } +}) + +export const StyledReloadButton = styled((props: AppButtonProps) =>