diff options
| author | Adam Mathes <adam@adammathes.com> | 2026-02-15 17:44:55 -0800 |
|---|---|---|
| committer | Adam Mathes <adam@adammathes.com> | 2026-02-15 17:44:55 -0800 |
| commit | c652ac6a2cd23ef29f48465be09c2b674783e8e9 (patch) | |
| tree | c5c05a71a1d5b8155b05dad4a512b18ff7258f47 /frontend-vanilla/src/api.ts | |
| parent | 90c1a68d6478138f538094fc83e48da8ddd21fa0 (diff) | |
| download | neko-c652ac6a2cd23ef29f48465be09c2b674783e8e9.tar.gz neko-c652ac6a2cd23ef29f48465be09c2b674783e8e9.tar.bz2 neko-c652ac6a2cd23ef29f48465be09c2b674783e8e9.zip | |
Vanilla JS (v3): Implement 3-pane layout, item fetching, reading, and testing
Diffstat (limited to 'frontend-vanilla/src/api.ts')
| -rw-r--r-- | frontend-vanilla/src/api.ts | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/frontend-vanilla/src/api.ts b/frontend-vanilla/src/api.ts new file mode 100644 index 0000000..c32299d --- /dev/null +++ b/frontend-vanilla/src/api.ts @@ -0,0 +1,29 @@ +export function getCookie(name: string): string | undefined { + const value = `; ${document.cookie}`; + const parts = value.split(`; ${name}=`); + if (parts.length === 2) return parts.pop()?.split(';').shift(); +} + +/** + * A wrapper around fetch that automatically includes the CSRF token + * for state-changing requests (POST, PUT, DELETE). + */ +export async function apiFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> { + const method = init?.method?.toUpperCase() || 'GET'; + const isStateChanging = ['POST', 'PUT', 'DELETE'].includes(method); + + const headers = new Headers(init?.headers || {}); + + if (isStateChanging) { + const token = getCookie('csrf_token'); + if (token) { + headers.set('X-CSRF-Token', token); + } + } + + return fetch(input, { + ...init, + headers, + credentials: 'include', // Ensure cookies are sent + }); +} |
