From d64470da06927cfcecdaf67ed3174b8882459e44 Mon Sep 17 00:00:00 2001 From: Oliver Bryan <04oliverbryan@gmail.com> Date: Fri, 9 Jan 2026 22:25:03 +0000 Subject: [PATCH] frontend helper functions for timer --- packages/frontend/src/lib/server/index.ts | 1 + packages/frontend/src/lib/server/timer/end.ts | 31 +++++++++++++++++ packages/frontend/src/lib/server/timer/get.ts | 30 +++++++++++++++++ .../frontend/src/lib/server/timer/index.ts | 4 +++ .../frontend/src/lib/server/timer/list.ts | 33 +++++++++++++++++++ .../frontend/src/lib/server/timer/toggle.ts | 31 +++++++++++++++++ 6 files changed, 130 insertions(+) create mode 100644 packages/frontend/src/lib/server/timer/end.ts create mode 100644 packages/frontend/src/lib/server/timer/get.ts create mode 100644 packages/frontend/src/lib/server/timer/index.ts create mode 100644 packages/frontend/src/lib/server/timer/list.ts create mode 100644 packages/frontend/src/lib/server/timer/toggle.ts diff --git a/packages/frontend/src/lib/server/index.ts b/packages/frontend/src/lib/server/index.ts index 7ac78f8..177ddab 100644 --- a/packages/frontend/src/lib/server/index.ts +++ b/packages/frontend/src/lib/server/index.ts @@ -1,6 +1,7 @@ export * as issue from "@/lib/server/issue"; export * as organisation from "@/lib/server/organisation"; export * as project from "@/lib/server/project"; +export * as timer from "@/lib/server/timer"; export * as user from "@/lib/server/user"; export type ServerQueryInput = { diff --git a/packages/frontend/src/lib/server/timer/end.ts b/packages/frontend/src/lib/server/timer/end.ts new file mode 100644 index 0000000..863fbaf --- /dev/null +++ b/packages/frontend/src/lib/server/timer/end.ts @@ -0,0 +1,31 @@ +import { getCsrfToken, getServerURL } from "@/lib/utils"; +import type { ServerQueryInput } from ".."; + +export async function end({ + issueId, + onSuccess, + onError, +}: { + issueId: number; +} & ServerQueryInput) { + const url = new URL(`${getServerURL()}/timer/end`); + url.searchParams.set("issueId", `${issueId}`); + + const csrfToken = getCsrfToken(); + const headers: HeadersInit = {}; + if (csrfToken) headers["X-CSRF-Token"] = csrfToken; + + const res = await fetch(url.toString(), { + method: "POST", + headers, + credentials: "include", + }); + + if (!res.ok) { + const error = await res.text(); + onError?.(error || `failed to end timer (${res.status})`); + } else { + const data = await res.json(); + onSuccess?.(data, res); + } +} diff --git a/packages/frontend/src/lib/server/timer/get.ts b/packages/frontend/src/lib/server/timer/get.ts new file mode 100644 index 0000000..2357146 --- /dev/null +++ b/packages/frontend/src/lib/server/timer/get.ts @@ -0,0 +1,30 @@ +import { getCsrfToken, getServerURL } from "@/lib/utils"; +import type { ServerQueryInput } from ".."; + +export async function get({ + issueId, + onSuccess, + onError, +}: { + issueId: number; +} & ServerQueryInput) { + const url = new URL(`${getServerURL()}/timer/get`); + url.searchParams.set("issueId", `${issueId}`); + + const csrfToken = getCsrfToken(); + const headers: HeadersInit = {}; + if (csrfToken) headers["X-CSRF-Token"] = csrfToken; + + const res = await fetch(url.toString(), { + headers, + credentials: "include", + }); + + if (!res.ok) { + const error = await res.text(); + onError?.(error || `failed to get timer (${res.status})`); + } else { + const data = await res.json(); + onSuccess?.(data, res); + } +} diff --git a/packages/frontend/src/lib/server/timer/index.ts b/packages/frontend/src/lib/server/timer/index.ts new file mode 100644 index 0000000..a910c46 --- /dev/null +++ b/packages/frontend/src/lib/server/timer/index.ts @@ -0,0 +1,4 @@ +export { end } from "@/lib/server/timer/end"; +export { get } from "@/lib/server/timer/get"; +export { list } from "@/lib/server/timer/list"; +export { toggle } from "@/lib/server/timer/toggle"; diff --git a/packages/frontend/src/lib/server/timer/list.ts b/packages/frontend/src/lib/server/timer/list.ts new file mode 100644 index 0000000..8b45f70 --- /dev/null +++ b/packages/frontend/src/lib/server/timer/list.ts @@ -0,0 +1,33 @@ +import { getCsrfToken, getServerURL } from "@/lib/utils"; +import type { ServerQueryInput } from ".."; + +export async function list({ + limit, + offset, + onSuccess, + onError, +}: { + limit?: number; + offset?: number; +} & ServerQueryInput) { + const url = new URL(`${getServerURL()}/timers`); + if (limit != null) url.searchParams.set("limit", `${limit}`); + if (offset != null) url.searchParams.set("offset", `${offset}`); + + const csrfToken = getCsrfToken(); + const headers: HeadersInit = {}; + if (csrfToken) headers["X-CSRF-Token"] = csrfToken; + + const res = await fetch(url.toString(), { + headers, + credentials: "include", + }); + + if (!res.ok) { + const error = await res.text(); + onError?.(error || `failed to get timers (${res.status})`); + } else { + const data = await res.json(); + onSuccess?.(data, res); + } +} diff --git a/packages/frontend/src/lib/server/timer/toggle.ts b/packages/frontend/src/lib/server/timer/toggle.ts new file mode 100644 index 0000000..ef650e7 --- /dev/null +++ b/packages/frontend/src/lib/server/timer/toggle.ts @@ -0,0 +1,31 @@ +import { getCsrfToken, getServerURL } from "@/lib/utils"; +import type { ServerQueryInput } from ".."; + +export async function toggle({ + issueId, + onSuccess, + onError, +}: { + issueId: number; +} & ServerQueryInput) { + const url = new URL(`${getServerURL()}/timer/toggle`); + url.searchParams.set("issueId", `${issueId}`); + + const csrfToken = getCsrfToken(); + const headers: HeadersInit = {}; + if (csrfToken) headers["X-CSRF-Token"] = csrfToken; + + const res = await fetch(url.toString(), { + method: "POST", + headers, + credentials: "include", + }); + + if (!res.ok) { + const error = await res.text(); + onError?.(error || `failed to toggle timer (${res.status})`); + } else { + const data = await res.json(); + onSuccess?.(data, res); + } +}