diff --git a/src/lib/index.ts b/src/lib/index.ts
index e69de29..46540d3 100644
--- a/src/lib/index.ts
+++ b/src/lib/index.ts
@@ -0,0 +1,15 @@
+import type { Cookies } from '@sveltejs/kit'
+
+export const scopeCookies = (cookies: Cookies, path: string) => {
+ return {
+ get: (key: string) => {
+ return cookies.get(key)
+ },
+ set: (key: string, value: string, props: import('cookie').CookieSerializeOptions = {}) => {
+ cookies.set(key, value, { ...props, path })
+ },
+ delete: (key: string, props: import('cookie').CookieSerializeOptions = {}) => {
+ cookies.delete(key, { ...props, path })
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts
new file mode 100644
index 0000000..f33adb7
--- /dev/null
+++ b/src/routes/+layout.server.ts
@@ -0,0 +1,25 @@
+import { scopeCookies } from '$lib';
+import { get, writable } from 'svelte/store';
+
+export const csr = true;
+export const ssr = true;
+export const prerender = true;
+export const trailingSlash = 'always';
+
+const visitCount = writable(0);
+
+export async function load({ cookies, url, setHeaders }) {
+ setHeaders({ 'Cache-Control': 'no-cache' })
+ const scopedCookies = scopeCookies(cookies, '/')
+ const visitedTimestamp = parseInt(scopedCookies.get('visitedTimestamp') || "0")
+ const currentTime = new Date().getTime()
+ const timeSinceVisit = currentTime - visitedTimestamp
+ if (visitedTimestamp === 0 || timeSinceVisit > 1000 * 60 * 60) {
+ visitCount.set(get(visitCount) + 1)
+ scopedCookies.set('visitedTimestamp', currentTime.toString())
+ }
+ return {
+ route: url.pathname,
+ visitCount: get(visitCount),
+ }
+}
\ No newline at end of file
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index fe08266..a4d97d2 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -150,16 +150,25 @@
{/if}
{/each}
-
+
-
-
-
+
+
{data.visitCount} visit(s)
+
+
+
+
\ No newline at end of file
diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts
deleted file mode 100644
index ee4e645..0000000
--- a/src/routes/+layout.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-export const csr = true;
-export const ssr = true;
-export const prerender = true;
-export const trailingSlash = 'always';
-
-export async function load({ url, setHeaders }) {
- setHeaders({'Cache-Control': 'no-cache'})
- return { route: url.pathname }
-}
\ No newline at end of file
diff --git a/src/routes/guestbook/+page.server.ts b/src/routes/guestbook/+page.server.ts
index 5a7ae91..afb2eaf 100644
--- a/src/routes/guestbook/+page.server.ts
+++ b/src/routes/guestbook/+page.server.ts
@@ -1,6 +1,7 @@
import { GUESTBOOK_BASE_URL } from '$env/static/private'
import { redirect, type Cookies } from '@sveltejs/kit'
import auth from '$lib/guestbookAuth'
+import { scopeCookies as _scopeCookies } from '$lib';
export const prerender = false;
@@ -11,17 +12,7 @@ interface Entry {
}
const scopeCookies = (cookies: Cookies) => {
- return {
- get: (key: string) => {
- return cookies.get(key)
- },
- set: (key: string, value: string, props: import('cookie').CookieSerializeOptions = {}) => {
- cookies.set(key, value, { ...props, path: "/guestbook/" })
- },
- delete: (key: string, props: import('cookie').CookieSerializeOptions = {}) => {
- cookies.delete(key, { ...props, path: "/guestbook/" })
- }
- }
+ return _scopeCookies(cookies, '/guestbook')
}
const postAction = (client: any, scopes: string[]) => {
diff --git a/src/styles/app.css b/src/styles/app.css
index a03d99e..23ee585 100644
--- a/src/styles/app.css
+++ b/src/styles/app.css
@@ -65,8 +65,12 @@
text-shadow: 0 0 4px theme(colors.ralsei.pink.regular);
}
- a,button,input[type=submit] {
+ .text-shadow-green {
text-shadow: 0 0 2px theme(colors.ralsei.black), 0 0 5px theme(colors.ralsei.green.light);
+ }
+
+ a,button,input[type=submit] {
+ @apply text-shadow-green;
cursor: url('/icons/gaze.png'), pointer;
}