Skip to content

Commit 32106be

Browse files
authored
Merge pull request #26 from YAPP-Github/feat/#17
feat: PWA 환경 구축 (#17)
2 parents 2047e3d + 393e7b8 commit 32106be

File tree

11 files changed

+100
-8
lines changed

11 files changed

+100
-8
lines changed

public/images/icons/pwa-192.png

18 KB
Loading

public/images/icons/pwa-512.png

80.4 KB
Loading

public/pwaServiceWorker.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
const CACHE_NAME = "timeat-cache-v1";
2+
const PRECACHE_ASSETS = [
3+
"/",
4+
"/manifest.webmanifest",
5+
"/images/icons/pwa-192.png",
6+
"/images/icons/pwa-512.png"
7+
];
8+
9+
self.addEventListener("install", (event) => {
10+
event.waitUntil(
11+
caches.open(CACHE_NAME)
12+
.then(cache => cache.addAll(PRECACHE_ASSETS))
13+
.then(() => self.skipWaiting())
14+
);
15+
});
16+
17+
self.addEventListener("activate", (event) => {
18+
event.waitUntil(
19+
caches.keys().then(keys =>
20+
Promise.all(
21+
keys.filter(key => key !== CACHE_NAME)
22+
.map(key => caches.delete(key))
23+
)
24+
)
25+
);
26+
self.clients.claim();
27+
});
28+
29+
self.addEventListener("fetch", (event) => {
30+
const { request } = event;
31+
32+
if (request.mode === "navigate") {
33+
event.respondWith(
34+
fetch(request)
35+
.catch(() => caches.match("/"))
36+
);
37+
return;
38+
}
39+
40+
event.respondWith(
41+
caches.match(request)
42+
.then(cached => cached || fetch(request))
43+
);
44+
});

src/app/layout.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import type { Metadata } from "next";
22

3-
import { MSWProvider } from "@/providers/MSWProvider";
4-
import QueryProvider from "@/providers/QueryProvider";
3+
import { RegisterServiceWorkerClient } from "@/lib/pwa";
4+
import { MSWProvider, QueryProvider } from "@/providers";
55

66
export const metadata: Metadata = {
7-
title: "Create Next App",
7+
title: "Timeat",
88
description: "Generated by create next app",
99
};
1010

@@ -22,6 +22,7 @@ export default function RootLayout({
2222
return (
2323
<html lang='en'>
2424
<body>
25+
<RegisterServiceWorkerClient />
2526
<QueryProvider>
2627
<MSWProvider>{children}</MSWProvider>
2728
</QueryProvider>

src/app/manifest.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import type { MetadataRoute } from "next";
2+
3+
export default function manifest(): MetadataRoute.Manifest {
4+
return {
5+
name: "Timeat",
6+
short_name: "Timeat",
7+
description:
8+
"내 주변, 싸고 맛있는 할인하는 가게 없나? 타임잇에서 더 싸고, 더 맛있게!",
9+
start_url: "/",
10+
display: "standalone",
11+
background_color: "#ffffff",
12+
theme_color: "#000000",
13+
icons: [
14+
{ src: "/images/icons/pwa-192.png", sizes: "192x192", type: "image/png" },
15+
{ src: "/images/icons/pwa-512.png", sizes: "512x512", type: "image/png" },
16+
],
17+
};
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
"use client";
2+
3+
import { useEffect } from "react";
4+
5+
import { registerServiceWorker } from "./utils";
6+
7+
export const RegisterServiceWorkerClient = () => {
8+
useEffect(() => {
9+
registerServiceWorker();
10+
}, []);
11+
12+
return null;
13+
};

src/lib/pwa/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { RegisterServiceWorkerClient } from "./RegisterServiceWorkerClient";

src/lib/pwa/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { registerServiceWorker } from "./registerServiceWorker";
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export const registerServiceWorker = () => {
2+
if (typeof window === "undefined") return;
3+
4+
if ("serviceWorker" in navigator) {
5+
window.addEventListener("load", () => {
6+
navigator.serviceWorker
7+
.register("/pwaServiceWorker.js")
8+
.then(registration => {
9+
console.info("Service Worker registered:", registration);
10+
})
11+
.catch(error => {
12+
console.error("Service Worker registration failed:", error);
13+
});
14+
});
15+
}
16+
};

src/providers/QueryProvider.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@ import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
55

66
import getQueryClient from "@/lib/tanstack/getQueryClient";
77

8-
export default function QueryProvider({
9-
children,
10-
}: {
11-
children: React.ReactNode;
12-
}) {
8+
export function QueryProvider({ children }: { children: React.ReactNode }) {
139
const queryClient = getQueryClient();
1410

1511
return (

0 commit comments

Comments
 (0)