Files
web/lib/api/index.ts
Tobias Johansson 84f5e74f00 Merged in feat/SW-104-add-card (pull request #410)
Feat/SW-104 add card

* feat: add api endpoints for adding and removing credit card

* feat(SW-104): Added Sonner toast lib

* feat(SW-104): Add route handlers for add card flow

* feat(SW-104): Added link to route handler and trigger toast when query params from callback is set

* feat(SW-104): Added translations for add card success toast

* feat(SW-104): Refactored to use client request for initiate save card

* fix(SW-104): Return proper status codes when initiating save card fails

* fix(SW-104): remove delete card endpoint because it was added in SW-245

* fix(SW-104): remove console.log

* fix(SW-104): Use api.post for save card request

* fix(SW-104): move function declaration above export

* fix(SW-104): handle response of save card and use Lang enum

* fix(SW-104): added comment for why setTimeout is needed for toast and also removed lang prop

* fix(SW-104): added type for AddCreditCardButton props

* feat: add toasts

* fix(SW-104): start using toasts from ToastHandler and fix problem with duplicate toasts

* fix(SW-104): remove unnecessary wrapping div


Approved-by: Michael Zetterberg
2024-08-20 15:04:02 +00:00

79 lines
1.7 KiB
TypeScript

import merge from "deepmerge"
import fetchRetry from "fetch-retry"
import { env } from "@/env/server"
import type {
RequestOptionsWithJSONBody,
RequestOptionsWithOutBody,
} from "@/types/fetch"
import type { Endpoint } from "./endpoints"
export { endpoints } from "./endpoints"
const defaultOptions: RequestInit = {
cache: "no-store",
headers: {
"Content-Type": "application/json",
},
mode: "cors",
}
const fetch = fetchRetry(global.fetch, {
retries: 3,
retryDelay: function (attempt, error, response) {
return Math.pow(2, attempt) * 150 // 150, 300, 600
},
})
export async function get(
endpoint: Endpoint,
options: RequestOptionsWithOutBody,
params?: URLSearchParams
) {
const url = new URL(
`${env.API_BASEURL}/${endpoint}${params ? `?${params.toString()}` : ""}`
)
return fetch(url, merge.all([defaultOptions, { method: "GET" }, options]))
}
export async function patch(
endpoint: Endpoint,
options: RequestOptionsWithJSONBody
) {
const { body, ...requestOptions } = options
return fetch(
`${env.API_BASEURL}/${endpoint}`,
merge.all([
defaultOptions,
{ body: JSON.stringify(body), method: "PATCH" },
requestOptions,
])
)
}
export async function post(
endpoint: Endpoint | `${Endpoint}/${string}`,
options: RequestOptionsWithJSONBody
) {
const { body, ...requestOptions } = options
return fetch(
`${env.API_BASEURL}/${endpoint}`,
merge.all([
defaultOptions,
{ body: JSON.stringify(body), method: "POST" },
requestOptions,
])
)
}
export async function remove(
endpoint: Endpoint,
options: RequestOptionsWithOutBody
) {
return fetch(
`${env.API_BASEURL}/${endpoint}`,
merge.all([defaultOptions, { method: "DELETE" }, options])
)
}