First Commit
Build and Push Auth Portal Docker Image / build-and-push (push) Successful in 5m26s
Build and Push Auth Portal Docker Image / create-release (push) Skipped

This commit is contained in:
Denozordec committed 2026-07-18 13:27:37 +07:00
commit bac95bdb2e
154 files changed
+26610

No files matched your search

+64
View File
@@ -0,0 +1,64 @@
import { clearToken, getToken } from '@/lib/auth'
export class ApiError extends Error {
status: number
code: string
constructor(status: number, code: string, message: string) {
super(message)
this.status = status
this.code = code
}
}
async function request<T>(
method: string,
path: string,
body?: unknown,
): Promise<T> {
const headers: Record<string, string> = {
Accept: 'application/json',
}
const token = getToken()
if (token) headers.Authorization = `Bearer ${token}`
if (body !== undefined) headers['Content-Type'] = 'application/json'
const res = await fetch(path, {
method,
headers,
credentials: 'include',
body: body === undefined ? undefined : JSON.stringify(body),
})
if (res.status === 204) return undefined as T
const text = await res.text()
let data: unknown = null
if (text) {
try {
data = JSON.parse(text)
} catch {
data = { error: { code: 'PARSE_ERROR', message: text } }
}
}
if (!res.ok) {
if (res.status === 401) clearToken()
const err = data as { error?: { code?: string; message?: string } } | null
throw new ApiError(
res.status,
err?.error?.code ?? 'ERROR',
err?.error?.message ?? res.statusText,
)
}
return data as T
}
export const api = {
get: <T>(path: string) => request<T>('GET', path),
post: <T>(path: string, body?: unknown) => request<T>('POST', path, body),
patch: <T>(path: string, body?: unknown) => request<T>('PATCH', path, body),
put: <T>(path: string, body?: unknown) => request<T>('PUT', path, body),
delete: <T>(path: string) => request<T>('DELETE', path),
}
+13
View File
@@ -0,0 +1,13 @@
const TOKEN_KEY = 'authportal_token'
export function getToken(): string | null {
return localStorage.getItem(TOKEN_KEY)
}
export function setToken(token: string) {
localStorage.setItem(TOKEN_KEY, token)
}
export function clearToken() {
localStorage.removeItem(TOKEN_KEY)
}