diff options
Diffstat (limited to 'packages/merchant-backoffice-ui/src/hooks')
10 files changed, 275 insertions, 221 deletions
diff --git a/packages/merchant-backoffice-ui/src/hooks/async.ts b/packages/merchant-backoffice-ui/src/hooks/async.ts index a842c73e4..6c116e628 100644 --- a/packages/merchant-backoffice-ui/src/hooks/async.ts +++ b/packages/merchant-backoffice-ui/src/hooks/async.ts @@ -15,38 +15,41 @@ */ /** -* -* @author Sebastian Javier Marchano (sebasjm) -*/ + * + * @author Sebastian Javier Marchano (sebasjm) + */ import { useState } from "preact/hooks"; import { cancelPendingRequest } from "./backend.js"; export interface Options { - slowTolerance: number, + slowTolerance: number; } export interface AsyncOperationApi<T> { - request: (...a: any) => void, - cancel: () => void, - data: T | undefined, - isSlow: boolean, - isLoading: boolean, - error: string | undefined + request: (...a: any) => void; + cancel: () => void; + data: T | undefined; + isSlow: boolean; + isLoading: boolean; + error: string | undefined; } -export function useAsync<T>(fn?: (...args: any) => Promise<T>, { slowTolerance: tooLong }: Options = { slowTolerance: 1000 }): AsyncOperationApi<T> { +export function useAsync<T>( + fn?: (...args: any) => Promise<T>, + { slowTolerance: tooLong }: Options = { slowTolerance: 1000 }, +): AsyncOperationApi<T> { const [data, setData] = useState<T | undefined>(undefined); const [isLoading, setLoading] = useState<boolean>(false); const [error, setError] = useState<any>(undefined); - const [isSlow, setSlow] = useState(false) + const [isSlow, setSlow] = useState(false); const request = async (...args: any) => { if (!fn) return; setLoading(true); const handler = setTimeout(() => { - setSlow(true) - }, tooLong) + setSlow(true); + }, tooLong); try { const result = await fn(...args); @@ -55,14 +58,14 @@ export function useAsync<T>(fn?: (...args: any) => Promise<T>, { slowTolerance: setError(error); } setLoading(false); - setSlow(false) - clearTimeout(handler) + setSlow(false); + clearTimeout(handler); }; function cancel() { - cancelPendingRequest() + cancelPendingRequest(); setLoading(false); - setSlow(false) + setSlow(false); } return { @@ -71,6 +74,6 @@ export function useAsync<T>(fn?: (...args: any) => Promise<T>, { slowTolerance: data, isSlow, isLoading, - error + error, }; } diff --git a/packages/merchant-backoffice-ui/src/hooks/backend.ts b/packages/merchant-backoffice-ui/src/hooks/backend.ts index 0c844700b..cbfac35de 100644 --- a/packages/merchant-backoffice-ui/src/hooks/backend.ts +++ b/packages/merchant-backoffice-ui/src/hooks/backend.ts @@ -25,17 +25,20 @@ import { MerchantBackend } from "../declaration.js"; import { useBackendContext } from "../context/backend.js"; import { useEffect, useState } from "preact/hooks"; import { DEFAULT_REQUEST_TIMEOUT } from "../utils/constants.js"; -import { axiosHandler, removeAxiosCancelToken } from "../utils/switchableAxios.js"; +import { + axiosHandler, + removeAxiosCancelToken, +} from "../utils/switchableAxios.js"; export function useMatchMutate(): ( re: RegExp, - value?: unknown + value?: unknown, ) => Promise<any> { const { cache, mutate } = useSWRConfig(); if (!(cache instanceof Map)) { throw new Error( - "matchMutate requires the cache provider to be a Map instance" + "matchMutate requires the cache provider to be a Map instance", ); } @@ -154,7 +157,7 @@ interface RequestOptions { function buildRequestOk<T>( res: AxiosResponse<T>, url: string, - hasToken: boolean + hasToken: boolean, ): HttpResponseOk<T> { return { ok: true, @@ -177,7 +180,7 @@ function buildRequestOk<T>( function buildRequestFailed( ex: AxiosError<MerchantBackend.ErrorDetail>, url: string, - hasToken: boolean + hasToken: boolean, ): | HttpResponseClientError | HttpResponseServerError @@ -236,14 +239,14 @@ export function cancelPendingRequest(): void { } export function isAxiosError<T>( - error: AxiosError | any + error: AxiosError | any, ): error is AxiosError<T> { return error && error.isAxiosError; } export async function request<T>( url: string, - options: RequestOptions = {} + options: RequestOptions = {}, ): Promise<HttpResponseOk<T>> { const headers = options.token ? { Authorization: `Bearer ${options.token}` } @@ -273,7 +276,7 @@ export async function request<T>( export function multiFetcher<T>( urls: string[], token: string, - backend: string + backend: string, ): Promise<HttpResponseOk<T>[]> { return Promise.all(urls.map((url) => fetcher<T>(url, token, backend))); } @@ -281,7 +284,7 @@ export function multiFetcher<T>( export function fetcher<T>( url: string, token: string, - backend: string + backend: string, ): Promise<HttpResponseOk<T>> { return request<T>(`${backend}${url}`, { token }); } diff --git a/packages/merchant-backoffice-ui/src/hooks/index.ts b/packages/merchant-backoffice-ui/src/hooks/index.ts index 9194ec0e9..0581d9938 100644 --- a/packages/merchant-backoffice-ui/src/hooks/index.ts +++ b/packages/merchant-backoffice-ui/src/hooks/index.ts @@ -15,81 +15,109 @@ */ /** -* -* @author Sebastian Javier Marchano (sebasjm) -*/ + * + * @author Sebastian Javier Marchano (sebasjm) + */ import { StateUpdater, useCallback, useState } from "preact/hooks"; import { ValueOrFunction } from "../utils/types.js"; - const calculateRootPath = () => { - const rootPath = typeof window !== undefined ? window.location.origin + window.location.pathname : '/' - return rootPath -} - -export function useBackendURL(url?: string): [string, boolean, StateUpdater<string>, () => void] { - const [value, setter] = useNotNullLocalStorage('backend-url', url || calculateRootPath()) - const [triedToLog, setTriedToLog] = useLocalStorage('tried-login') + const rootPath = + typeof window !== undefined + ? window.location.origin + window.location.pathname + : "/"; + return rootPath; +}; + +export function useBackendURL( + url?: string, +): [string, boolean, StateUpdater<string>, () => void] { + const [value, setter] = useNotNullLocalStorage( + "backend-url", + url || calculateRootPath(), + ); + const [triedToLog, setTriedToLog] = useLocalStorage("tried-login"); const checkedSetter = (v: ValueOrFunction<string>) => { - setTriedToLog('yes') - return setter(p => (v instanceof Function ? v(p) : v).replace(/\/$/, '')) - } + setTriedToLog("yes"); + return setter((p) => (v instanceof Function ? v(p) : v).replace(/\/$/, "")); + }; const resetBackend = () => { - setTriedToLog(undefined) - } - return [value, !!triedToLog, checkedSetter, resetBackend] + setTriedToLog(undefined); + }; + return [value, !!triedToLog, checkedSetter, resetBackend]; } -export function useBackendDefaultToken(initialValue?: string): [string | undefined, StateUpdater<string | undefined>] { - return useLocalStorage('backend-token', initialValue) +export function useBackendDefaultToken( + initialValue?: string, +): [string | undefined, StateUpdater<string | undefined>] { + return useLocalStorage("backend-token", initialValue); } -export function useBackendInstanceToken(id: string): [string | undefined, StateUpdater<string | undefined>] { - const [token, setToken] = useLocalStorage(`backend-token-${id}`) - const [defaultToken, defaultSetToken] = useBackendDefaultToken() +export function useBackendInstanceToken( + id: string, +): [string | undefined, StateUpdater<string | undefined>] { + const [token, setToken] = useLocalStorage(`backend-token-${id}`); + const [defaultToken, defaultSetToken] = useBackendDefaultToken(); // instance named 'default' use the default token - if (id === 'default') { - return [defaultToken, defaultSetToken] + if (id === "default") { + return [defaultToken, defaultSetToken]; } - return [token, setToken] + return [token, setToken]; } export function useLang(initial?: string): [string, StateUpdater<string>] { - const browserLang = typeof window !== "undefined" ? navigator.language || (navigator as any).userLanguage : undefined; - const defaultLang = (browserLang || initial || 'en').substring(0, 2) - return useNotNullLocalStorage('lang-preference', defaultLang) + const browserLang = + typeof window !== "undefined" + ? navigator.language || (navigator as any).userLanguage + : undefined; + const defaultLang = (browserLang || initial || "en").substring(0, 2); + return useNotNullLocalStorage("lang-preference", defaultLang); } -export function useLocalStorage(key: string, initialValue?: string): [string | undefined, StateUpdater<string | undefined>] { - const [storedValue, setStoredValue] = useState<string | undefined>((): string | undefined => { - return typeof window !== "undefined" ? window.localStorage.getItem(key) || initialValue : initialValue; - }); - - const setValue = (value?: string | ((val?: string) => string | undefined)) => { - setStoredValue(p => { - const toStore = value instanceof Function ? value(p) : value +export function useLocalStorage( + key: string, + initialValue?: string, +): [string | undefined, StateUpdater<string | undefined>] { + const [storedValue, setStoredValue] = useState<string | undefined>( + (): string | undefined => { + return typeof window !== "undefined" + ? window.localStorage.getItem(key) || initialValue + : initialValue; + }, + ); + + const setValue = ( + value?: string | ((val?: string) => string | undefined), + ) => { + setStoredValue((p) => { + const toStore = value instanceof Function ? value(p) : value; if (typeof window !== "undefined") { if (!toStore) { - window.localStorage.removeItem(key) + window.localStorage.removeItem(key); } else { window.localStorage.setItem(key, toStore); } } - return toStore - }) + return toStore; + }); }; return [storedValue, setValue]; } -export function useNotNullLocalStorage(key: string, initialValue: string): [string, StateUpdater<string>] { +export function useNotNullLocalStorage( + key: string, + initialValue: string, +): [string, StateUpdater<string>] { const [storedValue, setStoredValue] = useState<string>((): string => { - return typeof window !== "undefined" ? window.localStorage.getItem(key) || initialValue : initialValue; + return typeof window !== "undefined" + ? window.localStorage.getItem(key) || initialValue + : initialValue; }); const setValue = (value: string | ((val: string) => string)) => { @@ -97,7 +125,7 @@ export function useNotNullLocalStorage(key: string, initialValue: string): [stri setStoredValue(valueToStore); if (typeof window !== "undefined") { if (!valueToStore) { - window.localStorage.removeItem(key) + window.localStorage.removeItem(key); } else { window.localStorage.setItem(key, valueToStore); } @@ -106,5 +134,3 @@ export function useNotNullLocalStorage(key: string, initialValue: string): [stri return [storedValue, setValue]; } - - diff --git a/packages/merchant-backoffice-ui/src/hooks/instance.ts b/packages/merchant-backoffice-ui/src/hooks/instance.ts index 7564f8ef6..ab59487de 100644 --- a/packages/merchant-backoffice-ui/src/hooks/instance.ts +++ b/packages/merchant-backoffice-ui/src/hooks/instance.ts @@ -28,7 +28,7 @@ import { interface InstanceAPI { updateInstance: ( - data: MerchantBackend.Instances.InstanceReconfigurationMessage + data: MerchantBackend.Instances.InstanceReconfigurationMessage, ) => Promise<void>; deleteInstance: () => Promise<void>; clearToken: () => Promise<void>; @@ -40,7 +40,7 @@ export function useAdminAPI(): AdminAPI { const mutateAll = useMatchMutate(); const createInstance = async ( - instance: MerchantBackend.Instances.InstanceConfigurationMessage + instance: MerchantBackend.Instances.InstanceConfigurationMessage, ): Promise<void> => { await request(`${url}/management/instances`, { method: "post", @@ -77,7 +77,7 @@ export function useAdminAPI(): AdminAPI { export interface AdminAPI { createInstance: ( - data: MerchantBackend.Instances.InstanceConfigurationMessage + data: MerchantBackend.Instances.InstanceConfigurationMessage, ) => Promise<void>; deleteInstance: (id: string) => Promise<void>; purgeInstance: (id: string) => Promise<void>; @@ -88,7 +88,7 @@ export function useManagementAPI(instanceId: string): InstanceAPI { const { url, token, updateLoginStatus } = useBackendContext(); const updateInstance = async ( - instance: MerchantBackend.Instances.InstanceReconfigurationMessage + instance: MerchantBackend.Instances.InstanceReconfigurationMessage, ): Promise<void> => { await request(`${url}/management/instances/${instanceId}`, { method: "patch", @@ -125,7 +125,7 @@ export function useManagementAPI(instanceId: string): InstanceAPI { data: { method: "token", token: newToken }, }); - updateLoginStatus(url, newToken) + updateLoginStatus(url, newToken); mutateAll(/\/management\/instances/); }; @@ -134,7 +134,11 @@ export function useManagementAPI(instanceId: string): InstanceAPI { export function useInstanceAPI(): InstanceAPI { const { mutate } = useSWRConfig(); - const { url: baseUrl, token: adminToken, updateLoginStatus } = useBackendContext(); + const { + url: baseUrl, + token: adminToken, + updateLoginStatus, + } = useBackendContext(); const { token: instanceToken, id, admin } = useInstanceContext(); const { url, token } = !admin @@ -142,7 +146,7 @@ export function useInstanceAPI(): InstanceAPI { : { url: `${baseUrl}/instances/${id}`, token: instanceToken }; const updateInstance = async ( - instance: MerchantBackend.Instances.InstanceReconfigurationMessage + instance: MerchantBackend.Instances.InstanceReconfigurationMessage, ): Promise<void> => { await request(`${url}/private/`, { method: "patch", @@ -181,7 +185,7 @@ export function useInstanceAPI(): InstanceAPI { data: { method: "token", token: newToken }, }); - updateLoginStatus(baseUrl, newToken) + updateLoginStatus(baseUrl, newToken); mutate([`/private/`, token, url], null); }; @@ -252,7 +256,7 @@ export function useInstanceKYCDetails(): HttpResponse<KYCStatus> { } export function useManagedInstanceDetails( - instanceId: string + instanceId: string, ): HttpResponse<MerchantBackend.Instances.QueryInstancesResponse> { const { url, token } = useBackendContext(); diff --git a/packages/merchant-backoffice-ui/src/hooks/listener.ts b/packages/merchant-backoffice-ui/src/hooks/listener.ts index df037de7f..d101f7bb8 100644 --- a/packages/merchant-backoffice-ui/src/hooks/listener.ts +++ b/packages/merchant-backoffice-ui/src/hooks/listener.ts @@ -15,9 +15,9 @@ */ /** -* -* @author Sebastian Javier Marchano (sebasjm) -*/ + * + * @author Sebastian Javier Marchano (sebasjm) + */ import { useState } from "preact/hooks"; @@ -26,25 +26,27 @@ import { useState } from "preact/hooks"; * an action (a button) and other child have the action implemented (like * gathering information with a form). The difference with other approaches is * that in this case the parent component is not holding the state. - * - * It will return a subscriber and activator. - * + * + * It will return a subscriber and activator. + * * The activator may be undefined, if it is undefined it is indicating that the * subscriber is not ready to be called. * * The subscriber will receive a function (the listener) that will be call when the * activator runs. The listener must return the collected information. - * + * * As a result, when the activator is triggered by a child component, the * @action function is called receives the information from the listener defined by other - * child component + * child component * * @param action from <T> to <R> * @returns activator and subscriber, undefined activator means that there is not subscriber */ -export function useListener<T, R = any>(action: (r: T) => Promise<R>): [undefined | (() => Promise<R>), (listener?: () => T) => void] { - type RunnerHandler = { toBeRan?: () => Promise<R>; }; +export function useListener<T, R = any>( + action: (r: T) => Promise<R>, +): [undefined | (() => Promise<R>), (listener?: () => T) => void] { + type RunnerHandler = { toBeRan?: () => Promise<R> }; const [state, setState] = useState<RunnerHandler>({}); /** @@ -58,24 +60,26 @@ export function useListener<T, R = any>(action: (r: T) => Promise<R>): [undefine toBeRan: () => { const whatWeGetFromTheListener = listener(); return action(whatWeGetFromTheListener); - } + }, }); } else { setState({ - toBeRan: undefined - }) + toBeRan: undefined, + }); } }; /** * activator will call runner if there is someone subscribed */ - const activator = state.toBeRan ? async () => { - if (state.toBeRan) { - return state.toBeRan(); - } - return Promise.reject(); - } : undefined; + const activator = state.toBeRan + ? async () => { + if (state.toBeRan) { + return state.toBeRan(); + } + return Promise.reject(); + } + : undefined; return [activator, subscriber]; } diff --git a/packages/merchant-backoffice-ui/src/hooks/notifications.ts b/packages/merchant-backoffice-ui/src/hooks/notifications.ts index 63b1e5e16..133ddd80b 100644 --- a/packages/merchant-backoffice-ui/src/hooks/notifications.ts +++ b/packages/merchant-backoffice-ui/src/hooks/notifications.ts @@ -15,9 +15,9 @@ */ /** -* -* @author Sebastian Javier Marchano (sebasjm) -*/ + * + * @author Sebastian Javier Marchano (sebasjm) + */ import { useState } from "preact/hooks"; import { Notification } from "../utils/types.js"; @@ -28,21 +28,29 @@ interface Result { removeNotification: (n: Notification) => void; } -type NotificationWithDate = Notification & { since: Date } +type NotificationWithDate = Notification & { since: Date }; -export function useNotifications(initial: Notification[] = [], timeout = 3000): Result { - const [notifications, setNotifications] = useState<(NotificationWithDate)[]>(initial.map(i => ({...i, since: new Date() }))) +export function useNotifications( + initial: Notification[] = [], + timeout = 3000, +): Result { + const [notifications, setNotifications] = useState<NotificationWithDate[]>( + initial.map((i) => ({ ...i, since: new Date() })), + ); const pushNotification = (n: Notification): void => { - const entry = { ...n, since: new Date() } - setNotifications(ns => [...ns, entry]) - if (n.type !== 'ERROR') setTimeout(() => { - setNotifications(ns => ns.filter(x => x.since !== entry.since)) - }, timeout) - } + const entry = { ...n, since: new Date() }; + setNotifications((ns) => [...ns, entry]); + if (n.type !== "ERROR") + setTimeout(() => { + setNotifications((ns) => ns.filter((x) => x.since !== entry.since)); + }, timeout); + }; const removeNotification = (notif: Notification) => { - setNotifications((ns: NotificationWithDate[]) => ns.filter(n => n !== notif)) - } - return { notifications, pushNotification, removeNotification } + setNotifications((ns: NotificationWithDate[]) => + ns.filter((n) => n !== notif), + ); + }; + return { notifications, pushNotification, removeNotification }; } diff --git a/packages/merchant-backoffice-ui/src/hooks/order.ts b/packages/merchant-backoffice-ui/src/hooks/order.ts index 75c474187..d1e26b671 100644 --- a/packages/merchant-backoffice-ui/src/hooks/order.ts +++ b/packages/merchant-backoffice-ui/src/hooks/order.ts @@ -32,15 +32,15 @@ import { export interface OrderAPI { //FIXME: add OutOfStockResponse on 410 createOrder: ( - data: MerchantBackend.Orders.PostOrderRequest + data: MerchantBackend.Orders.PostOrderRequest, ) => Promise<HttpResponseOk<MerchantBackend.Orders.PostOrderResponse>>; forgetOrder: ( id: string, - data: MerchantBackend.Orders.ForgetRequest + data: MerchantBackend.Orders.ForgetRequest, ) => Promise<HttpResponseOk<void>>; refundOrder: ( id: string, - data: MerchantBackend.Orders.RefundRequest + data: MerchantBackend.Orders.RefundRequest, ) => Promise<HttpResponseOk<MerchantBackend.Orders.MerchantRefundResponse>>; deleteOrder: (id: string) => Promise<HttpResponseOk<void>>; getPaymentURL: (id: string) => Promise<HttpResponseOk<string>>; @@ -56,7 +56,7 @@ export function orderFetcher<T>( refunded?: YesOrNo, wired?: YesOrNo, searchDate?: Date, - delta?: number + delta?: number, ): Promise<HttpResponseOk<T>> { const date_ms = delta && delta < 0 && searchDate @@ -78,16 +78,16 @@ export function useOrderAPI(): OrderAPI { const { url, token } = !admin ? { - url: baseUrl, - token: adminToken, - } + url: baseUrl, + token: adminToken, + } : { - url: `${baseUrl}/instances/${id}`, - token: instanceToken, - }; + url: `${baseUrl}/instances/${id}`, + token: instanceToken, + }; const createOrder = async ( - data: MerchantBackend.Orders.PostOrderRequest + data: MerchantBackend.Orders.PostOrderRequest, ): Promise<HttpResponseOk<MerchantBackend.Orders.PostOrderResponse>> => { const res = await request<MerchantBackend.Orders.PostOrderResponse>( `${url}/private/orders`, @@ -95,7 +95,7 @@ export function useOrderAPI(): OrderAPI { method: "post", token, data, - } + }, ); await mutateAll(/.*private\/orders.*/); // mutate('') @@ -103,7 +103,7 @@ export function useOrderAPI(): OrderAPI { }; const refundOrder = async ( orderId: string, - data: MerchantBackend.Orders.RefundRequest + data: MerchantBackend.Orders.RefundRequest, ): Promise<HttpResponseOk<MerchantBackend.Orders.MerchantRefundResponse>> => { mutateAll(/@"\/private\/orders"@/); const res = request<MerchantBackend.Orders.MerchantRefundResponse>( @@ -112,17 +112,17 @@ export function useOrderAPI(): OrderAPI { method: "post", token, data, - } + }, ); // order list returns refundable information, so we must evict everything await mutateAll(/.*private\/orders.*/); - return res + return res; }; const forgetOrder = async ( orderId: string, - data: MerchantBackend.Orders.ForgetRequest + data: MerchantBackend.Orders.ForgetRequest, ): Promise<HttpResponseOk<void>> => { mutateAll(/@"\/private\/orders"@/); const res = request<void>(`${url}/private/orders/${orderId}/forget`, { @@ -132,10 +132,10 @@ export function useOrderAPI(): OrderAPI { }); // we may be forgetting some fields that are pare of the listing, so we must evict everything await mutateAll(/.*private\/orders.*/); - return res + return res; }; const deleteOrder = async ( - orderId: string + orderId: string, ): Promise<HttpResponseOk<void>> => { mutateAll(/@"\/private\/orders"@/); const res = request<void>(`${url}/private/orders/${orderId}`, { @@ -143,18 +143,18 @@ export function useOrderAPI(): OrderAPI { token, }); await mutateAll(/.*private\/orders.*/); - return res + return res; }; const getPaymentURL = async ( - orderId: string + orderId: string, ): Promise<HttpResponseOk<string>> => { return request<MerchantBackend.Orders.MerchantOrderStatusResponse>( `${url}/private/orders/${orderId}`, { method: "get", token, - } + }, ).then((res) => { const url = res.data.order_status === "unpaid" @@ -170,14 +170,14 @@ export function useOrderAPI(): OrderAPI { } export function useOrderDetails( - oderId: string + oderId: string, ): HttpResponse<MerchantBackend.Orders.MerchantOrderStatusResponse> { 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, }; + ? { url: baseUrl, token: baseToken } + : { url: `${baseUrl}/instances/${id}`, token: instanceToken }; const { data, error, isValidating } = useSWR< HttpResponseOk<MerchantBackend.Orders.MerchantOrderStatusResponse>, @@ -205,14 +205,14 @@ export interface InstanceOrderFilter { export function useInstanceOrders( args?: InstanceOrderFilter, - updateFilter?: (d: Date) => void + updateFilter?: (d: Date) => void, ): HttpResponsePaginated<MerchantBackend.Orders.OrderHistory> { 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, }; + ? { url: baseUrl, token: baseToken } + : { url: `${baseUrl}/instances/${id}`, token: instanceToken }; const [pageBefore, setPageBefore] = useState(1); const [pageAfter, setPageAfter] = useState(1); @@ -241,7 +241,7 @@ export function useInstanceOrders( args?.date, totalBefore, ], - orderFetcher + orderFetcher, ); const { data: afterData, @@ -258,7 +258,7 @@ export function useInstanceOrders( args?.date, -totalAfter, ], - orderFetcher + orderFetcher, ); //this will save last result @@ -278,7 +278,8 @@ export function useInstanceOrders( // if the query returns less that we ask, then we have reach the end or beginning const isReachingEnd = afterData && afterData.data.orders.length < totalAfter; - const isReachingStart = args?.date === undefined || + const isReachingStart = + args?.date === undefined || (beforeData && beforeData.data.orders.length < totalBefore); const pagination = { @@ -290,9 +291,9 @@ export function useInstanceOrders( setPageAfter(pageAfter + 1); } else { const from = - afterData.data.orders[afterData.data.orders.length - 1].timestamp - .t_s; - if (from && from !== "never" && updateFilter) updateFilter(new Date(from * 1000)); + afterData.data.orders[afterData.data.orders.length - 1].timestamp.t_s; + if (from && from !== "never" && updateFilter) + updateFilter(new Date(from * 1000)); } }, loadMorePrev: () => { @@ -303,7 +304,8 @@ export function useInstanceOrders( const from = beforeData.data.orders[beforeData.data.orders.length - 1].timestamp .t_s; - if (from && from !== "never" && updateFilter) updateFilter(new Date(from * 1000)); + if (from && from !== "never" && updateFilter) + updateFilter(new Date(from * 1000)); } }, }; @@ -312,9 +314,9 @@ export function useInstanceOrders( !beforeData || !afterData ? [] : (beforeData || lastBefore).data.orders - .slice() - .reverse() - .concat((afterData || lastAfter).data.orders); + .slice() + .reverse() + .concat((afterData || lastAfter).data.orders); if (loadingAfter || loadingBefore) return { loading: true, data: { orders } }; if (beforeData && afterData) { return { ok: true, data: { orders }, ...pagination }; diff --git a/packages/merchant-backoffice-ui/src/hooks/product.ts b/packages/merchant-backoffice-ui/src/hooks/product.ts index 7a0c4dec1..fb7889834 100644 --- a/packages/merchant-backoffice-ui/src/hooks/product.ts +++ b/packages/merchant-backoffice-ui/src/hooks/product.ts @@ -24,21 +24,21 @@ import { HttpResponseOk, multiFetcher, request, - useMatchMutate + useMatchMutate, } from "./backend.js"; export interface ProductAPI { createProduct: ( - data: MerchantBackend.Products.ProductAddDetail + data: MerchantBackend.Products.ProductAddDetail, ) => Promise<void>; updateProduct: ( id: string, - data: MerchantBackend.Products.ProductPatchDetail + data: MerchantBackend.Products.ProductPatchDetail, ) => Promise<void>; deleteProduct: (id: string) => Promise<void>; lockProduct: ( id: string, - data: MerchantBackend.Products.LockRequest + data: MerchantBackend.Products.LockRequest, ) => Promise<void>; } @@ -49,11 +49,11 @@ export function useProductAPI(): ProductAPI { const { token: instanceToken, id, admin } = useInstanceContext(); const { url, token } = !admin - ? { url: baseUrl, token: adminToken, } - : { url: `${baseUrl}/instances/${id}`, token: instanceToken, }; + ? { url: baseUrl, token: adminToken } + : { url: `${baseUrl}/instances/${id}`, token: instanceToken }; const createProduct = async ( - data: MerchantBackend.Products.ProductAddDetail + data: MerchantBackend.Products.ProductAddDetail, ): Promise<void> => { const res = await request(`${url}/private/products`, { method: "post", @@ -66,7 +66,7 @@ export function useProductAPI(): ProductAPI { const updateProduct = async ( productId: string, - data: MerchantBackend.Products.ProductPatchDetail + data: MerchantBackend.Products.ProductPatchDetail, ): Promise<void> => { const r = await request(`${url}/private/products/${productId}`, { method: "patch", @@ -87,7 +87,7 @@ export function useProductAPI(): ProductAPI { const lockProduct = async ( productId: string, - data: MerchantBackend.Products.LockRequest + data: MerchantBackend.Products.LockRequest, ): Promise<void> => { await request(`${url}/private/products/${productId}/lock`, { method: "post", @@ -108,8 +108,8 @@ export function useInstanceProducts(): HttpResponse< const { token: instanceToken, id, admin } = useInstanceContext(); const { url, token } = !admin - ? { url: baseUrl, token: baseToken, } - : { url: `${baseUrl}/instances/${id}`, token: instanceToken, }; + ? { url: baseUrl, token: baseToken } + : { url: `${baseUrl}/instances/${id}`, token: instanceToken }; const { data: list, error: listError } = useSWR< HttpResponseOk<MerchantBackend.Products.InventorySummaryResponse>, @@ -123,7 +123,7 @@ export function useInstanceProducts(): HttpResponse< }); const paths = (list?.data.products || []).map( - (p) => `/private/products/${p.product_id}` + (p) => `/private/products/${p.product_id}`, ); const { data: products, error: productError } = useSWR< HttpResponseOk<MerchantBackend.Products.ProductDetail>[], @@ -136,7 +136,6 @@ export function useInstanceProducts(): HttpResponse< refreshWhenOffline: false, }); - if (listError) return listError; if (productError) return productError; @@ -154,20 +153,20 @@ export function useInstanceProducts(): HttpResponse< } export function useProductDetails( - productId: string + productId: string, ): HttpResponse<MerchantBackend.Products.ProductDetail> { const { url: baseUrl, token: baseToken } = useBackendContext(); const { token: instanceToken, id, admin } = useInstanceContext(); const { url, token } = !admin ? { - url: baseUrl, - token: baseToken, - } + url: baseUrl, + token: baseToken, + } : { - url: `${baseUrl}/instances/${id}`, - token: instanceToken, - }; + url: `${baseUrl}/instances/${id}`, + token: instanceToken, + }; const { data, error, isValidating } = useSWR< HttpResponseOk<MerchantBackend.Products.ProductDetail>, diff --git a/packages/merchant-backoffice-ui/src/hooks/reserves.ts b/packages/merchant-backoffice-ui/src/hooks/reserves.ts index 0810ad26c..f6d77f113 100644 --- a/packages/merchant-backoffice-ui/src/hooks/reserves.ts +++ b/packages/merchant-backoffice-ui/src/hooks/reserves.ts @@ -33,11 +33,11 @@ export function useReservesAPI(): ReserveMutateAPI { const { token: instanceToken, id, admin } = useInstanceContext(); const { url, token } = !admin - ? { url: baseUrl, token: adminToken, } - : { url: `${baseUrl}/instances/${id}`, token: instanceToken, }; + ? { url: baseUrl, token: adminToken } + : { url: `${baseUrl}/instances/${id}`, token: instanceToken }; const createReserve = async ( - data: MerchantBackend.Tips.ReserveCreateRequest + data: MerchantBackend.Tips.ReserveCreateRequest, ): Promise< HttpResponseOk<MerchantBackend.Tips.ReserveCreateConfirmation> > => { @@ -47,7 +47,7 @@ export function useReservesAPI(): ReserveMutateAPI { method: "post", token, data, - } + }, ); //evict reserve list query @@ -58,7 +58,7 @@ export function useReservesAPI(): ReserveMutateAPI { const authorizeTipReserve = async ( pub: string, - data: MerchantBackend.Tips.TipCreateRequest + data: MerchantBackend.Tips.TipCreateRequest, ): Promise<HttpResponseOk<MerchantBackend.Tips.TipCreateConfirmation>> => { const res = await request<MerchantBackend.Tips.TipCreateConfirmation>( `${url}/private/reserves/${pub}/authorize-tip`, @@ -66,7 +66,7 @@ export function useReservesAPI(): ReserveMutateAPI { method: "post", token, data, - } + }, ); //evict reserve details query @@ -76,7 +76,7 @@ export function useReservesAPI(): ReserveMutateAPI { }; const authorizeTip = async ( - data: MerchantBackend.Tips.TipCreateRequest + data: MerchantBackend.Tips.TipCreateRequest, ): Promise<HttpResponseOk<MerchantBackend.Tips.TipCreateConfirmation>> => { const res = await request<MerchantBackend.Tips.TipCreateConfirmation>( `${url}/private/tips`, @@ -84,7 +84,7 @@ export function useReservesAPI(): ReserveMutateAPI { method: "post", token, data, - } + }, ); //evict all details query @@ -110,14 +110,14 @@ export function useReservesAPI(): ReserveMutateAPI { export interface ReserveMutateAPI { createReserve: ( - data: MerchantBackend.Tips.ReserveCreateRequest + data: MerchantBackend.Tips.ReserveCreateRequest, ) => Promise<HttpResponseOk<MerchantBackend.Tips.ReserveCreateConfirmation>>; authorizeTipReserve: ( id: string, - data: MerchantBackend.Tips.TipCreateRequest + data: MerchantBackend.Tips.TipCreateRequest, ) => Promise<HttpResponseOk<MerchantBackend.Tips.TipCreateConfirmation>>; authorizeTip: ( - data: MerchantBackend.Tips.TipCreateRequest + data: MerchantBackend.Tips.TipCreateRequest, ) => Promise<HttpResponseOk<MerchantBackend.Tips.TipCreateConfirmation>>; deleteReserve: (id: string) => Promise<HttpResponse<void>>; } @@ -127,8 +127,8 @@ export function useInstanceReserves(): HttpResponse<MerchantBackend.Tips.Tipping const { token: instanceToken, id, admin } = useInstanceContext(); const { url, token } = !admin - ? { url: baseUrl, token: baseToken, } - : { url: `${baseUrl}/instances/${id}`, token: instanceToken, }; + ? { url: baseUrl, token: baseToken } + : { url: `${baseUrl}/instances/${id}`, token: instanceToken }; const { data, error, isValidating } = useSWR< HttpResponseOk<MerchantBackend.Tips.TippingReserveStatus>, @@ -142,7 +142,7 @@ export function useInstanceReserves(): HttpResponse<MerchantBackend.Tips.Tipping } export function useReserveDetails( - reserveId: string + reserveId: string, ): HttpResponse<MerchantBackend.Tips.ReserveDetail> { const { url: baseUrl } = useBackendContext(); const { token, id: instanceId, admin } = useInstanceContext(); @@ -167,7 +167,7 @@ export function useReserveDetails( } export function useTipDetails( - tipId: string + tipId: string, ): HttpResponse<MerchantBackend.Tips.TipDetails> { const { url: baseUrl } = useBackendContext(); const { token, id: instanceId, admin } = useInstanceContext(); @@ -194,7 +194,7 @@ export function useTipDetails( function reserveDetailFetcher<T>( url: string, token: string, - backend: string + backend: string, ): Promise<HttpResponseOk<T>> { return request<T>(`${backend}${url}`, { token, @@ -207,7 +207,7 @@ function reserveDetailFetcher<T>( function tipsDetailFetcher<T>( url: string, token: string, - backend: string + backend: string, ): Promise<HttpResponseOk<T>> { return request<T>(`${backend}${url}`, { token, diff --git a/packages/merchant-backoffice-ui/src/hooks/transfer.ts b/packages/merchant-backoffice-ui/src/hooks/transfer.ts index 2ab22b1a1..d1ac2c285 100644 --- a/packages/merchant-backoffice-ui/src/hooks/transfer.ts +++ b/packages/merchant-backoffice-ui/src/hooks/transfer.ts @@ -35,7 +35,7 @@ async function transferFetcher<T>( payto_uri?: string, verified?: string, position?: string, - delta?: number + delta?: number, ): Promise<HttpResponseOk<T>> { const params: any = {}; if (payto_uri !== undefined) params.payto_uri = payto_uri; @@ -55,28 +55,31 @@ export function useTransferAPI(): TransferAPI { const { url, token } = !admin ? { - url: baseUrl, - token: adminToken, - } + url: baseUrl, + token: adminToken, + } : { - url: `${baseUrl}/instances/${id}`, - token: instanceToken, - }; + url: `${baseUrl}/instances/${id}`, + token: instanceToken, + }; const informTransfer = async ( - data: MerchantBackend.Transfers.TransferInformation + data: MerchantBackend.Transfers.TransferInformation, ): Promise< HttpResponseOk<MerchantBackend.Transfers.MerchantTrackTransferResponse> > => { - const res = await request<MerchantBackend.Transfers.MerchantTrackTransferResponse>( - `${url}/private/transfers`, { - method: "post", - token, - data, - }); + const res = + await request<MerchantBackend.Transfers.MerchantTrackTransferResponse>( + `${url}/private/transfers`, + { + method: "post", + token, + data, + }, + ); await mutateAll(/.*private\/transfers.*/); - return res + return res; }; return { informTransfer }; @@ -84,7 +87,7 @@ export function useTransferAPI(): TransferAPI { export interface TransferAPI { informTransfer: ( - data: MerchantBackend.Transfers.TransferInformation + data: MerchantBackend.Transfers.TransferInformation, ) => Promise< HttpResponseOk<MerchantBackend.Transfers.MerchantTrackTransferResponse> >; @@ -98,7 +101,7 @@ export interface InstanceTransferFilter { export function useInstanceTransfers( args?: InstanceTransferFilter, - updatePosition?: (id: string) => void + updatePosition?: (id: string) => void, ): HttpResponsePaginated<MerchantBackend.Transfers.TransferList> { const { url: baseUrl, token: baseToken } = useBackendContext(); const { token: instanceToken, id, admin } = useInstanceContext(); @@ -133,7 +136,7 @@ export function useInstanceTransfers( args?.position, totalBefore, ], - transferFetcher + transferFetcher, ); const { data: afterData, @@ -149,7 +152,7 @@ export function useInstanceTransfers( args?.position, -totalAfter, ], - transferFetcher + transferFetcher, ); //this will save last result @@ -168,8 +171,10 @@ export function useInstanceTransfers( if (afterError) return afterError; // if the query returns less that we ask, then we have reach the end or beginning - const isReachingEnd = afterData && afterData.data.transfers.length < totalAfter; - const isReachingStart = args?.position === undefined || + const isReachingEnd = + afterData && afterData.data.transfers.length < totalAfter; + const isReachingStart = + args?.position === undefined || (beforeData && beforeData.data.transfers.length < totalBefore); const pagination = { @@ -180,10 +185,10 @@ export function useInstanceTransfers( if (afterData.data.transfers.length < MAX_RESULT_SIZE) { setPageAfter(pageAfter + 1); } else { - const from = - `${afterData.data - .transfers[afterData.data.transfers.length - 1] - .transfer_serial_id}`; + const from = `${ + afterData.data.transfers[afterData.data.transfers.length - 1] + .transfer_serial_id + }`; if (from && updatePosition) updatePosition(from); } }, @@ -192,10 +197,10 @@ export function useInstanceTransfers( if (beforeData.data.transfers.length < MAX_RESULT_SIZE) { setPageBefore(pageBefore + 1); } else if (beforeData) { - const from = - `${beforeData.data - .transfers[beforeData.data.transfers.length - 1] - .transfer_serial_id}`; + const from = `${ + beforeData.data.transfers[beforeData.data.transfers.length - 1] + .transfer_serial_id + }`; if (from && updatePosition) updatePosition(from); } }, @@ -205,9 +210,9 @@ export function useInstanceTransfers( !beforeData || !afterData ? [] : (beforeData || lastBefore).data.transfers - .slice() - .reverse() - .concat((afterData || lastAfter).data.transfers); + .slice() + .reverse() + .concat((afterData || lastAfter).data.transfers); if (loadingAfter || loadingBefore) return { loading: true, data: { transfers } }; if (beforeData && afterData) { |