Feat/SW-755 price change non happy * fix(SW-755): dont show field error if checkbox has no children * feat(SW-755): Price change route + dialog WIP * fix(SW-755): minor refactoring * fix(SW-755): added logging to price change route * fix(SW-755): remove redundant search param logic * fix(SW-755): moved enum cast to zod instead * fix(SW-755): move prop type to types folder * fix(SW-755): Added suspense to Payment and refactored payment options hook * fix(SW-755): seperated terms and conditions copy from the checkbox label * fix(SW-755): add currency format and fixed wrong translation * fix(SW-755): change from undefined to null * fix(SW-755): added extra type safety to payment options Approved-by: Christian Andolf Approved-by: Simon.Emanuelsson
114 lines
2.6 KiB
TypeScript
114 lines
2.6 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: {
|
|
Accept: "application/json",
|
|
"Content-Type": "application/json",
|
|
},
|
|
mode: "cors",
|
|
}
|
|
|
|
const wrappedFetch = fetchRetry(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 = {}
|
|
) {
|
|
const url = new URL(env.API_BASEURL)
|
|
url.pathname = endpoint
|
|
url.search = new URLSearchParams(params).toString()
|
|
return wrappedFetch(
|
|
url,
|
|
merge.all([defaultOptions, { method: "GET" }, options])
|
|
)
|
|
}
|
|
|
|
export async function patch(
|
|
endpoint: Endpoint | `${Endpoint}/${string}`,
|
|
options: RequestOptionsWithJSONBody,
|
|
params = {}
|
|
) {
|
|
const { body, ...requestOptions } = options
|
|
const url = new URL(env.API_BASEURL)
|
|
url.pathname = endpoint
|
|
url.search = new URLSearchParams(params).toString()
|
|
return wrappedFetch(
|
|
url,
|
|
merge.all([
|
|
defaultOptions,
|
|
{ body: JSON.stringify(body), method: "PATCH" },
|
|
requestOptions,
|
|
])
|
|
)
|
|
}
|
|
|
|
export async function post(
|
|
endpoint: Endpoint | `${Endpoint}/${string}`,
|
|
options: RequestOptionsWithJSONBody,
|
|
params = {}
|
|
) {
|
|
const { body, ...requestOptions } = options
|
|
const url = new URL(env.API_BASEURL)
|
|
url.pathname = endpoint
|
|
url.search = new URLSearchParams(params).toString()
|
|
return wrappedFetch(
|
|
url,
|
|
merge.all([
|
|
defaultOptions,
|
|
{ body: JSON.stringify(body), method: "POST" },
|
|
requestOptions,
|
|
])
|
|
)
|
|
}
|
|
|
|
export async function put(
|
|
endpoint: Endpoint | `${Endpoint}/${string}`,
|
|
options: RequestOptionsWithJSONBody,
|
|
params = {}
|
|
) {
|
|
const { body, ...requestOptions } = options
|
|
const url = new URL(env.API_BASEURL)
|
|
url.pathname = endpoint
|
|
url.search = new URLSearchParams(params).toString()
|
|
return wrappedFetch(
|
|
url,
|
|
merge.all([
|
|
defaultOptions,
|
|
{ body: JSON.stringify(body), method: "PUT" },
|
|
requestOptions,
|
|
])
|
|
)
|
|
}
|
|
|
|
export async function remove(
|
|
endpoint: Endpoint | `${Endpoint}/${string}`,
|
|
options: RequestOptionsWithOutBody,
|
|
params = {}
|
|
) {
|
|
const url = new URL(env.API_BASEURL)
|
|
url.pathname = endpoint
|
|
url.search = new URLSearchParams(params).toString()
|
|
return wrappedFetch(
|
|
url,
|
|
merge.all([defaultOptions, { method: "DELETE" }, options])
|
|
)
|
|
}
|