♻️(service-worker) create useSWRegister hook
Create useSWRegister hook, which will be used to register the service worker in the app.
This commit is contained in:
@@ -1,26 +1,15 @@
|
||||
import '@testing-library/jest-dom';
|
||||
import { render } from '@testing-library/react';
|
||||
import { Router } from 'next/router';
|
||||
import { PropsWithChildren, ReactElement } from 'react';
|
||||
|
||||
import App from '@/pages/_app';
|
||||
import { AppWrapper } from '@/tests/utils';
|
||||
import { NextPageWithLayout } from '@/types/next';
|
||||
import { useSWRegister } from '../hooks/useSWRegister';
|
||||
|
||||
const TestComponent = () => {
|
||||
useSWRegister();
|
||||
|
||||
const Page: NextPageWithLayout = () => {
|
||||
return <div>Test Page</div>;
|
||||
};
|
||||
|
||||
Page.getLayout = function getLayout(page: ReactElement) {
|
||||
return <div>{page}</div>;
|
||||
};
|
||||
|
||||
jest.mock('@/core/', () => ({
|
||||
...jest.requireActual('@/core/'),
|
||||
AppProvider: ({ children }: PropsWithChildren) => <div>{children}</div>,
|
||||
}));
|
||||
|
||||
describe('App', () => {
|
||||
describe('useSWRegister', () => {
|
||||
it('checks service-worker is register', () => {
|
||||
process.env.NEXT_PUBLIC_BUILD_ID = '123456';
|
||||
jest.spyOn(console, 'error').mockImplementation(() => {});
|
||||
@@ -39,9 +28,7 @@ describe('App', () => {
|
||||
writable: true,
|
||||
});
|
||||
|
||||
render(<App Component={Page} router={{} as Router} pageProps={{}} />, {
|
||||
wrapper: AppWrapper,
|
||||
});
|
||||
render(<TestComponent />);
|
||||
|
||||
expect(registerSpy).toHaveBeenCalledWith('/service-worker.js?v=123456');
|
||||
});
|
||||
@@ -64,9 +51,7 @@ describe('App', () => {
|
||||
writable: true,
|
||||
});
|
||||
|
||||
render(<App Component={Page} router={{} as Router} pageProps={{}} />, {
|
||||
wrapper: AppWrapper,
|
||||
});
|
||||
render(<TestComponent />);
|
||||
|
||||
expect(registerSpy).not.toHaveBeenCalledWith('/service-worker.js?v=123456');
|
||||
});
|
||||
@@ -0,0 +1,16 @@
|
||||
import { useEffect } from 'react';
|
||||
|
||||
export const useSWRegister = () => {
|
||||
useEffect(() => {
|
||||
if (
|
||||
'serviceWorker' in navigator &&
|
||||
process.env.NEXT_PUBLIC_SW_DEACTIVATED !== 'true'
|
||||
) {
|
||||
navigator.serviceWorker
|
||||
.register(`/service-worker.js?v=${process.env.NEXT_PUBLIC_BUILD_ID}`)
|
||||
.catch((err) => {
|
||||
console.error('Service worker registration failed:', err);
|
||||
});
|
||||
}
|
||||
}, []);
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
export * from './hooks/useSWRegister';
|
||||
@@ -1,9 +1,9 @@
|
||||
import type { AppProps } from 'next/app';
|
||||
import Head from 'next/head';
|
||||
import { useEffect } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import { AppProvider } from '@/core/';
|
||||
import { useSWRegister } from '@/features/service-worker/';
|
||||
import { NextPageWithLayout } from '@/types/next';
|
||||
|
||||
import './globals.css';
|
||||
@@ -13,22 +13,10 @@ type AppPropsWithLayout = AppProps & {
|
||||
};
|
||||
|
||||
export default function App({ Component, pageProps }: AppPropsWithLayout) {
|
||||
useSWRegister();
|
||||
const getLayout = Component.getLayout ?? ((page) => page);
|
||||
const { t } = useTranslation();
|
||||
|
||||
useEffect(() => {
|
||||
if (
|
||||
'serviceWorker' in navigator &&
|
||||
process.env.NEXT_PUBLIC_SW_DEACTIVATED !== 'true'
|
||||
) {
|
||||
navigator.serviceWorker
|
||||
.register(`/service-worker.js?v=${process.env.NEXT_PUBLIC_BUILD_ID}`)
|
||||
.catch((err) => {
|
||||
console.error('Service worker registration failed:', err);
|
||||
});
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<>
|
||||
<Head>
|
||||
|
||||
Reference in New Issue
Block a user