Skip to content

Commit 6730a79

Browse files
committed
service worker fix + scroll images
1 parent a90bb76 commit 6730a79

File tree

5 files changed

+86
-47
lines changed

5 files changed

+86
-47
lines changed

src/components/Home.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,11 @@ export default function Home() {
4646
</div>
4747
</div>
4848
<div className="mt-10 mb-40">
49-
<div className="flex justify-center">
49+
<div className="flex flex-col justify-center items-center gap-y-2">
5050
<h2 className="text-6xl font-bold tracking-tighter">Projects</h2>
51+
<span className="text-lg text-prim/60">
52+
Every side projects I made, and some from university
53+
</span>
5154
</div>
5255
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-10 mt-10">
5356
{projects.map((p, index) => (

src/components/ImageViewer.tsx

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState } from "react";
1+
import { useEffect, useState, type WheelEvent } from "react";
22

33
interface ImageEvent {
44
images: string[];
@@ -11,24 +11,24 @@ export default function ImageViewer() {
1111
const [index, setIndex] = useState<number>(0);
1212

1313
useEffect(() => {
14-
function updateImages(event: CustomEventInit<ImageEvent>) {
14+
function onUpdateImages(event: CustomEventInit<ImageEvent>) {
1515
const { images, index } = event.detail as ImageEvent;
1616
setImages(images);
1717
setIndex(index);
1818
setVisible(true);
1919
}
2020

21-
function keyPressed(event: KeyboardEvent) {
21+
function onKeyUp(event: KeyboardEvent) {
2222
if (event.key === "Escape") {
2323
setVisible(false);
2424
}
2525
}
2626

27-
window.addEventListener("image-viewer", updateImages);
28-
window.addEventListener("keyup", keyPressed);
27+
window.addEventListener("image-viewer", onUpdateImages);
28+
window.addEventListener("keyup", onKeyUp);
2929
return () => {
30-
window.removeEventListener("image-viewer", updateImages);
31-
window.removeEventListener("keyup", keyPressed);
30+
window.removeEventListener("image-viewer", onUpdateImages);
31+
window.removeEventListener("keyup", onKeyUp);
3232
};
3333
}, []);
3434

@@ -47,12 +47,28 @@ export default function ImageViewer() {
4747
}
4848
}, [index, images]);
4949

50+
const onWheel = (event: WheelEvent) => {
51+
const isTrackpad =
52+
event.deltaMode === 0 &&
53+
(Math.abs(event.deltaX) > 0 || Math.abs(event.deltaY) < 50);
54+
55+
if (!isTrackpad) {
56+
event.currentTarget.scrollBy({
57+
left: event.deltaY * 10,
58+
behavior: "smooth",
59+
});
60+
}
61+
};
62+
5063
return (
5164
<div
5265
className={`${visible ? "fixed" : "hidden"} top-0 left-0 w-full h-full bg-black/50 backdrop-blur`}
5366
onClick={() => setVisible(false)}
5467
>
55-
<div className="relative w-full h-full flex items-center gap-20 snap-x snap-mandatory overflow-x-auto px-2 md:px-10 lg:px-20">
68+
<div
69+
className="relative w-full h-full flex items-center gap-20 snap-x snap-mandatory overflow-x-auto px-2 md:px-10 lg:px-20"
70+
onWheel={onWheel}
71+
>
5672
{images.map((image, i) => (
5773
<div
5874
key={i}

src/hooks/serviceWorker.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { useCallback, useEffect, useState } from "react";
2-
3-
const PATH = "/service-worker.js";
2+
import swUrl from "../service-worker.js?url";
43

54
export default function useServiceWorker() {
65
const [supported, setSupported] = useState<boolean | null>(null);
@@ -12,7 +11,7 @@ export default function useServiceWorker() {
1211
try {
1312
let registration;
1413
if (register) {
15-
registration = await navigator.serviceWorker.register(PATH);
14+
registration = await navigator.serviceWorker.register(swUrl);
1615
} else {
1716
registration = await navigator.serviceWorker.ready;
1817
}

src/service-worker.js

Lines changed: 54 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,66 @@
1-
/* eslint-env serviceworker */
1+
const ASSET_CACHE = "cache";
22

3-
const ASSET_CACHE = 'assets';
4-
5-
self.addEventListener('install', (event) => {
3+
self.addEventListener("install", (event) => {
64
self.skipWaiting();
7-
event.waitUntil((async () => {
8-
const cache = await caches.open(ASSET_CACHE);
9-
const assets = await fetch('/assets-manifest.json').then((response) => response.json());
10-
Object.keys(assets).map((a) => cache.add(new Request(`/${assets[a]}`)));
11-
})());
5+
event.waitUntil(
6+
(async () => {
7+
const cache = await caches.open(ASSET_CACHE);
8+
9+
try {
10+
const response = await fetch("/.vite/manifest.json");
11+
const assets = await response.json();
12+
console.log(assets);
13+
await Promise.all(
14+
Object.keys(assets).map((key) =>
15+
cache.add(new Request(`/${assets[key].file}`)),
16+
),
17+
);
18+
} catch (error) {
19+
console.error("Erreur lors de l'installation du SW:", error);
20+
}
21+
})(),
22+
);
1223
});
1324

14-
self.addEventListener('active', () => {
15-
clients.claim();
25+
self.addEventListener("activate", (event) => {
26+
event.waitUntil(clients.claim());
1627
});
1728

18-
self.addEventListener('fetch', (event) => {
19-
if (event.request.mode === 'navigate') {
20-
event.respondWith((async () => {
21-
try {
22-
const preloadResponse = await event.preloadResponse;
23-
if (preloadResponse) {
24-
return preloadResponse;
25-
}
26-
return await fetch(event.request);
27-
} catch (e) {
28-
const cache = await caches.open(ASSET_CACHE);
29-
return cache.match('index.html');
30-
}
31-
})());
32-
} else {
33-
const url = new URL(event.request.url);
34-
if (url.host === location.host && url.pathname.match(/\.(html|js|css|png|jpe?g|gif|svg|woff2|ttf|md)$/) !== null) {
35-
event.respondWith((async () => {
36-
const cache = await caches.open(ASSET_CACHE);
29+
self.addEventListener("fetch", (event) => {
30+
if (event.request.mode === "navigate") {
31+
event.respondWith(
32+
(async () => {
3733
try {
38-
const asset = await fetch(event.request);
39-
cache.put(event.request, asset.clone());
40-
return asset;
34+
const preloadResponse = await event.preloadResponse;
35+
if (preloadResponse) {
36+
return preloadResponse;
37+
}
38+
return await fetch(event.request);
4139
} catch (e) {
42-
return cache.match(url.pathname);
40+
const cache = await caches.open(ASSET_CACHE);
41+
return cache.match("/") || cache.match("/index.html");
4342
}
44-
})());
43+
})(),
44+
);
45+
} else {
46+
const url = new URL(event.request.url);
47+
if (
48+
url.host === location.host &&
49+
url.pathname.match(/\.(html|js|css|png|jpe?g|gif|svg|woff2|ttf|md)$/) !==
50+
null
51+
) {
52+
event.respondWith(
53+
(async () => {
54+
const cache = await caches.open(ASSET_CACHE);
55+
try {
56+
const asset = await fetch(event.request);
57+
cache.put(event.request, asset.clone());
58+
return asset;
59+
} catch (e) {
60+
return cache.match(event.request) || cache.match(url.pathname);
61+
}
62+
})(),
63+
);
4564
}
4665
}
4766
});

vite.config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ export default defineConfig({
66
assetsInclude: ["**/*.md"],
77
build: {
88
outDir: "../dist",
9+
emptyOutDir: true,
10+
manifest: true,
911
},
1012
plugins: [react(), tailwindcss()],
1113
root: "./src",

0 commit comments

Comments
 (0)