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
79 lines
1.7 KiB
TypeScript
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])
|
|
)
|
|
}
|