From 3e060b80428943c6562250a6ff77eff10a0259b7 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Mon, 24 Oct 2022 10:46:14 +0200 Subject: repo: integrate packages from former merchant-backoffice.git --- .../merchant-backoffice-ui/src/hooks/reserves.ts | 218 +++++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 packages/merchant-backoffice-ui/src/hooks/reserves.ts (limited to 'packages/merchant-backoffice-ui/src/hooks/reserves.ts') diff --git a/packages/merchant-backoffice-ui/src/hooks/reserves.ts b/packages/merchant-backoffice-ui/src/hooks/reserves.ts new file mode 100644 index 000000000..7a662dfbc --- /dev/null +++ b/packages/merchant-backoffice-ui/src/hooks/reserves.ts @@ -0,0 +1,218 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see + */ +import useSWR, { useSWRConfig } from "swr"; +import { useBackendContext } from "../context/backend"; +import { useInstanceContext } from "../context/instance"; +import { MerchantBackend } from "../declaration"; +import { + fetcher, + HttpError, + HttpResponse, + HttpResponseOk, + request, + useMatchMutate, +} from "./backend"; + +export function useReservesAPI(): ReserveMutateAPI { + const mutateAll = useMatchMutate(); + const { mutate } = useSWRConfig(); + const { url: baseUrl, token: adminToken } = useBackendContext(); + const { token: instanceToken, id, admin } = useInstanceContext(); + + const { url, token } = !admin + ? { url: baseUrl, token: adminToken, } + : { url: `${baseUrl}/instances/${id}`, token: instanceToken, }; + + const createReserve = async ( + data: MerchantBackend.Tips.ReserveCreateRequest + ): Promise< + HttpResponseOk + > => { + const res = await request( + `${url}/private/reserves`, + { + method: "post", + token, + data, + } + ); + + //evict reserve list query + await mutateAll(/.*private\/reserves.*/); + + return res; + }; + + const authorizeTipReserve = async ( + pub: string, + data: MerchantBackend.Tips.TipCreateRequest + ): Promise> => { + const res = await request( + `${url}/private/reserves/${pub}/authorize-tip`, + { + method: "post", + token, + data, + } + ); + + //evict reserve details query + await mutate([`/private/reserves/${pub}`, token, url]); + + return res; + }; + + const authorizeTip = async ( + data: MerchantBackend.Tips.TipCreateRequest + ): Promise> => { + const res = await request( + `${url}/private/tips`, + { + method: "post", + token, + data, + } + ); + + //evict all details query + await mutateAll(/.*private\/reserves\/.*/); + + return res; + }; + + const deleteReserve = async (pub: string): Promise> => { + const res = await request(`${url}/private/reserves/${pub}`, { + method: "delete", + token, + }); + + //evict reserve list query + await mutateAll(/.*private\/reserves.*/); + + return res; + }; + + return { createReserve, authorizeTip, authorizeTipReserve, deleteReserve }; +} + +export interface ReserveMutateAPI { + createReserve: ( + data: MerchantBackend.Tips.ReserveCreateRequest + ) => Promise>; + authorizeTipReserve: ( + id: string, + data: MerchantBackend.Tips.TipCreateRequest + ) => Promise>; + authorizeTip: ( + data: MerchantBackend.Tips.TipCreateRequest + ) => Promise>; + deleteReserve: (id: string) => Promise>; +} + +export function useInstanceReserves(): HttpResponse { + const { url: baseUrl, token: baseToken } = useBackendContext(); + const { token: instanceToken, id, admin } = useInstanceContext(); + + const { url, token } = !admin + ? { url: baseUrl, token: baseToken, } + : { url: `${baseUrl}/instances/${id}`, token: instanceToken, }; + + const { data, error, isValidating } = useSWR< + HttpResponseOk, + HttpError + >([`/private/reserves`, token, url], fetcher); + + if (isValidating) return { loading: true, data: data?.data }; + if (data) return data; + if (error) return error; + return { loading: true }; +} + +export function useReserveDetails( + reserveId: string +): HttpResponse { + const { url: baseUrl } = useBackendContext(); + const { token, id: instanceId, admin } = useInstanceContext(); + + const url = !admin ? baseUrl : `${baseUrl}/instances/${instanceId}`; + + const { data, error, isValidating } = useSWR< + HttpResponseOk, + HttpError + >([`/private/reserves/${reserveId}`, token, url], reserveDetailFetcher, { + refreshInterval: 0, + refreshWhenHidden: false, + revalidateOnFocus: false, + revalidateOnReconnect: false, + refreshWhenOffline: false, + }); + + if (isValidating) return { loading: true, data: data?.data }; + if (data) return data; + if (error) return error; + return { loading: true }; +} + +export function useTipDetails( + tipId: string +): HttpResponse { + const { url: baseUrl } = useBackendContext(); + const { token, id: instanceId, admin } = useInstanceContext(); + + const url = !admin ? baseUrl : `${baseUrl}/instances/${instanceId}`; + + const { data, error, isValidating } = useSWR< + HttpResponseOk, + HttpError + >([`/private/tips/${tipId}`, token, url], tipsDetailFetcher, { + refreshInterval: 0, + refreshWhenHidden: false, + revalidateOnFocus: false, + revalidateOnReconnect: false, + refreshWhenOffline: false, + }); + + if (isValidating) return { loading: true, data: data?.data }; + if (data) return data; + if (error) return error; + return { loading: true }; +} + +function reserveDetailFetcher( + url: string, + token: string, + backend: string +): Promise> { + return request(`${backend}${url}`, { + token, + params: { + tips: "yes", + }, + }); +} + +function tipsDetailFetcher( + url: string, + token: string, + backend: string +): Promise> { + return request(`${backend}${url}`, { + token, + params: { + pickups: "yes", + }, + }); +} -- cgit v1.2.3