diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index 1c3b86b..770ef68 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -1,31 +1,30 @@
module.exports = {
root: true,
- parser: '@typescript-eslint/parser',
- extends: ['plugin:svelte/recommended'],
- plugins: ['@typescript-eslint'],
- ignorePatterns: ['*.cjs'],
- overrides: [
- {
- files: ['*.svelte'],
- parser: 'svelte-eslint-parser',
- // Parse the `
%sveltekit.head%
diff --git a/src/hooks.client.ts b/src/hooks.client.ts
new file mode 100644
index 0000000..9f2d761
--- /dev/null
+++ b/src/hooks.client.ts
@@ -0,0 +1,24 @@
+// import { dev } from '$app/environment';
+// import { handleErrorWithSentry, Replay } from '@sentry/sveltekit';
+// import * as Sentry from '@sentry/sveltekit';
+
+// TODO: Fix Sentry
+// Sentry.init({
+// dsn: 'https://742e43279df93a3c4a4a78c12eb1f879@o4506057768632320.ingest.sentry.io/4506057770401792',
+// tracesSampleRate: 1.0,
+
+// // This sets the sample rate to be 10%. You may want this to be 100% while
+// // in development and sample at a lower rate in production
+// replaysSessionSampleRate: 0.1,
+
+// // If the entire session is not sampled, use the below sample rate to sample
+// // sessions when an error occurs.
+// replaysOnErrorSampleRate: 1.0,
+
+// // If you don't want to use Session Replay, just remove the line below:
+// integrations: [new Replay()],
+// environment: dev ? 'development' : 'production'
+// });
+
+// // If you have a custom error handler, pass it to `handleErrorWithSentry`
+// export const handleError = handleErrorWithSentry();
diff --git a/src/hooks.server..ts b/src/hooks.server..ts
deleted file mode 100644
index ef64e7f..0000000
--- a/src/hooks.server..ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import type { Handle } from '@sveltejs/kit';
-
-export const handle: Handle = async ({ event, resolve }) => {
- let userid = event.cookies.get('userid');
-
- if (!userid) {
- // if this is the first time the user has visited this app,
- // set a cookie so that we recognise them when they return
- userid = crypto.randomUUID();
- event.cookies.set('userid', userid, { path: '/' });
- }
-
- event.locals.userid = userid;
-
- return resolve(event);
-};
diff --git a/src/hooks.server.ts b/src/hooks.server.ts
new file mode 100644
index 0000000..a7776f0
--- /dev/null
+++ b/src/hooks.server.ts
@@ -0,0 +1,60 @@
+// import * as Sentry from '@sentry/sveltekit';
+import { sequence } from '@sveltejs/kit/hooks';
+import type { Handle } from '@sveltejs/kit';
+import { dev } from '$app/environment';
+import { lucia } from '$lib/server/auth';
+
+// TODO: Fix Sentry as it is not working on SvelteKit v2
+// Sentry.init({
+// dsn: 'https://742e43279df93a3c4a4a78c12eb1f879@o4506057768632320.ingest.sentry.io/4506057770401792',
+// tracesSampleRate: 1,
+// environment: dev ? 'development' : 'production',
+// enabled: !dev
+// });
+
+export const authentication: Handle = async function ({ event, resolve }) {
+ const startTimer = Date.now();
+ event.locals.startTimer = startTimer;
+
+ const ip = event.request.headers.get('x-forwarded-for') as string;
+ const country = event.request.headers.get('x-vercel-ip-country') as string;
+ event.locals.ip = dev ? '127.0.0.1' : ip; // || event.getClientAddress();
+ event.locals.country = dev ? 'us' : country;
+
+ const sessionId = event.cookies.get(lucia.sessionCookieName);
+ if (!sessionId) {
+ event.locals.user = null;
+ event.locals.session = null;
+ return resolve(event);
+ }
+
+ const { session, user } = await lucia.validateSession(sessionId);
+ if (session && session.fresh) {
+ const sessionCookie = lucia.createSessionCookie(session.id);
+ console.log('sessionCookie', JSON.stringify(sessionCookie, null, 2));
+ // sveltekit types deviates from the de-facto standard
+ // you can use 'as any' too
+ event.cookies.set(sessionCookie.name, sessionCookie.value, {
+ path: '.',
+ ...sessionCookie.attributes
+ });
+ }
+ if (!session) {
+ const sessionCookie = lucia.createBlankSessionCookie();
+ console.log('blank sessionCookie', JSON.stringify(sessionCookie, null, 2));
+ event.cookies.set(sessionCookie.name, sessionCookie.value, {
+ path: ".",
+ ...sessionCookie.attributes
+ });
+ }
+ event.locals.user = user;
+ event.locals.session = session;
+
+ return resolve(event);
+};
+
+export const handle: Handle = sequence(
+ // Sentry.sentryHandle(),
+ authentication
+);
+// export const handleError = Sentry.handleErrorWithSentry();
\ No newline at end of file
diff --git a/src/lib/Counter.svelte b/src/lib/Counter.svelte
deleted file mode 100644
index 9c2199c..0000000
--- a/src/lib/Counter.svelte
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
-
-
- {Math.floor($displayed_count + 1)}
- {Math.floor($displayed_count)}
-
-
-
-
-
-
-
diff --git a/src/lib/components/header/bored-game.png b/src/lib/assets/bored-game.png
similarity index 100%
rename from src/lib/components/header/bored-game.png
rename to src/lib/assets/bored-game.png
diff --git a/src/lib/assets/bored-game.svg b/src/lib/assets/bored-game.svg
new file mode 100644
index 0000000..159ae83
--- /dev/null
+++ b/src/lib/assets/bored-game.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/lib/components/AddToList.svelte b/src/lib/components/AddToList.svelte
new file mode 100644
index 0000000..7756276
--- /dev/null
+++ b/src/lib/components/AddToList.svelte
@@ -0,0 +1,112 @@
+
+
+
+ {#if in_wishlist}
+
+ {:else}
+
+ {/if}
+
+ {#if in_collection}
+
+ {:else}
+
+ {/if}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/lib/components/analytics.svelte b/src/lib/components/Analytics.svelte
similarity index 100%
rename from src/lib/components/analytics.svelte
rename to src/lib/components/Analytics.svelte
diff --git a/src/lib/components/Footer.svelte b/src/lib/components/Footer.svelte
new file mode 100644
index 0000000..2e779a4
--- /dev/null
+++ b/src/lib/components/Footer.svelte
@@ -0,0 +1,27 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/lib/components/Game.svelte b/src/lib/components/Game.svelte
new file mode 100644
index 0000000..33950ba
--- /dev/null
+++ b/src/lib/components/Game.svelte
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+ {#if game?.players}
+
Players: {game.players}
+
Time: {game.playtime} minutes
+ {#if isGameType(game) && game?.min_age}
+
Min Age: {game.min_age}
+ {/if}
+ {#if detailed && isGameType(game) && game?.description}
+
{@html game.description}
+ {/if}
+ {/if}
+
+
+
+
+
+
+
diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte
new file mode 100644
index 0000000..9384909
--- /dev/null
+++ b/src/lib/components/Header.svelte
@@ -0,0 +1,158 @@
+
+
+
+
+
diff --git a/src/lib/components/LinkWithIcon.svelte b/src/lib/components/LinkWithIcon.svelte
index e09ab3d..1ca4829 100644
--- a/src/lib/components/LinkWithIcon.svelte
+++ b/src/lib/components/LinkWithIcon.svelte
@@ -19,5 +19,6 @@
grid-template-columns: repeat(2, auto);
place-items: center;
gap: 0.25rem;
+ margin: 1rem;
}
diff --git a/src/lib/components/loading.svelte b/src/lib/components/Loading.svelte
similarity index 100%
rename from src/lib/components/loading.svelte
rename to src/lib/components/Loading.svelte
diff --git a/src/lib/components/WishlistButton.svelte b/src/lib/components/WishlistButton.svelte
new file mode 100644
index 0000000..0a8728d
--- /dev/null
+++ b/src/lib/components/WishlistButton.svelte
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/lib/components/button/index.svelte b/src/lib/components/button/index.svelte
index 482acd5..80e0419 100644
--- a/src/lib/components/button/index.svelte
+++ b/src/lib/components/button/index.svelte
@@ -1,6 +1,5 @@
@@ -9,29 +8,22 @@
-
diff --git a/src/lib/components/dialog/ClearCollectionDialog.svelte b/src/lib/components/dialog/ClearCollectionDialog.svelte
index 6a9d3c5..5f6ed4d 100644
--- a/src/lib/components/dialog/ClearCollectionDialog.svelte
+++ b/src/lib/components/dialog/ClearCollectionDialog.svelte
@@ -1,13 +1,13 @@
-