aboutsummaryrefslogtreecommitdiffstats
path: root/src/api.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/api.ts')
-rw-r--r--src/api.ts50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/api.ts b/src/api.ts
new file mode 100644
index 0000000..7fd9e64
--- /dev/null
+++ b/src/api.ts
@@ -0,0 +1,50 @@
+import useSWR, { SWRResponse } from "swr"
+
+const API_URL = import.meta.env.VITE_API_URL
+
+const fetcher = (path: string) => fetch(`${API_URL}${path}`)
+ .then(res => res.json())
+ .catch((err) => {
+ console.error(`An error occurred when fetching API path ${path}`)
+ console.error(err)
+ throw err
+ })
+
+interface Snippet {
+ id: string
+ title: string
+ content: string
+}
+
+interface APISuccess<D> {
+ readonly type: "success"
+ data: D
+}
+
+interface APILoading {
+ readonly type: "loading"
+}
+
+interface APIFailed<E> {
+ readonly type: "failed"
+ error: E
+}
+
+type APIResult<D, E> = APISuccess<D> | APILoading | APIFailed<E>
+
+const mapSWRResult = <D, E>({ data, error }: SWRResponse<D, E>): APIResult<D, E> => {
+ if (error !== undefined) {
+ return { type: "failed", error }
+ }
+
+ const isLoading = data === undefined
+ if (isLoading) {
+ return { type: "loading" }
+ }
+
+ return { type: "success", data }
+}
+
+export const useSnippets = () => mapSWRResult<Snippet[], Error>(
+ useSWR("/snippets", fetcher),
+)