diff options
author | Sebastian <sebasjm@gmail.com> | 2021-08-03 12:53:23 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2021-08-03 12:53:28 -0300 |
commit | cc02ab3992055ee43c904231e8ac96f9a783437e (patch) | |
tree | e1813b0dc49c1722795bdcdf3c3ba758d1806149 /packages | |
parent | ee3f5c57b3e226e8ae9e38bb896f9c3579804a8e (diff) | |
download | merchant-backoffice-cc02ab3992055ee43c904231e8ac96f9a783437e.tar.gz merchant-backoffice-cc02ab3992055ee43c904231e8ac96f9a783437e.tar.bz2 merchant-backoffice-cc02ab3992055ee43c904231e8ac96f9a783437e.zip |
use management api when updating instance details from default instance credentials
Diffstat (limited to 'packages')
-rw-r--r-- | packages/frontend/src/ApplicationReadyRoutes.tsx | 7 | ||||
-rw-r--r-- | packages/frontend/src/InstanceRoutes.tsx | 10 | ||||
-rw-r--r-- | packages/frontend/src/context/backend.ts | 16 | ||||
-rw-r--r-- | packages/frontend/src/hooks/instance.ts | 66 | ||||
-rw-r--r-- | packages/frontend/src/index.tsx | 5 | ||||
-rw-r--r-- | packages/frontend/src/paths/admin/list/TableDeleted.tsx | 12 | ||||
-rw-r--r-- | packages/frontend/src/paths/admin/list/View.tsx | 7 | ||||
-rw-r--r-- | packages/frontend/src/paths/instance/update/index.tsx | 16 |
8 files changed, 109 insertions, 30 deletions
diff --git a/packages/frontend/src/ApplicationReadyRoutes.tsx b/packages/frontend/src/ApplicationReadyRoutes.tsx index d9bd75d..994226a 100644 --- a/packages/frontend/src/ApplicationReadyRoutes.tsx +++ b/packages/frontend/src/ApplicationReadyRoutes.tsx @@ -29,16 +29,11 @@ import { NotYetReadyAppMenu, Menu, NotificationCard } from './components/menu'; import { useTranslator } from './i18n'; import { createHashHistory } from 'history'; import { useState } from 'preact/hooks'; -import { CreateStockNoRestock } from './components/form/InputStock.stories'; export function ApplicationReadyRoutes(): VNode { const i18n = useTranslator(); - const { url: backendURL, changeBackend, updateToken, clearAllTokens } = useBackendContext(); + const { url: backendURL, updateLoginStatus, clearAllTokens } = useBackendContext(); - const updateLoginStatus = (url: string, token?: string) => { - changeBackend(url); - if (token) updateToken(token); - }; const result = useBackendInstancesTestForAdmin() const clearTokenAndGoToRoot = () => { diff --git a/packages/frontend/src/InstanceRoutes.tsx b/packages/frontend/src/InstanceRoutes.tsx index 2914f5f..588cfb4 100644 --- a/packages/frontend/src/InstanceRoutes.tsx +++ b/packages/frontend/src/InstanceRoutes.tsx @@ -42,7 +42,7 @@ import TransferCreatePage from './paths/instance/transfers/create'; import ReservesCreatePage from './paths/instance/reserves/create'; import ReservesDetailsPage from './paths/instance/reserves/details'; import ReservesListPage from './paths/instance/reserves/list'; -import InstanceUpdatePage, { Props as InstanceUpdatePageProps } from "./paths/instance/update"; +import InstanceUpdatePage, { Props as InstanceUpdatePageProps, AdminUpdate as InstanceAdminUpdatePage } from "./paths/instance/update"; import LoginPage from './paths/login'; import NotFoundPage from './paths/notfound'; import { Notification } from './utils/types'; @@ -86,7 +86,7 @@ export interface Props { export function InstanceRoutes({ id, admin, setInstanceName }: Props): VNode { const [_, updateDefaultToken] = useBackendDefaultToken() const [token, updateToken] = useBackendInstanceToken(id); - const { changeBackend, addTokenCleaner } = useBackendContext(); + const { updateLoginStatus: changeBackend, addTokenCleaner } = useBackendContext(); const cleaner = useCallback(() => { updateToken(undefined); }, [id]); const i18n = useTranslator(); const [globalNotification, setGlobalNotification] = useState<Notification & { to: string } | undefined>(undefined) @@ -302,7 +302,7 @@ export function Redirect({ to }: { to: string }): null { function AdminInstanceUpdatePage({ id, ...rest }: { id: string } & InstanceUpdatePageProps) { const [token, changeToken] = useBackendInstanceToken(id); - const { changeBackend } = useBackendContext(); + const { updateLoginStatus: changeBackend } = useBackendContext(); const updateLoginStatus = (url: string, token?: string) => { changeBackend(url); if (token) @@ -310,8 +310,10 @@ function AdminInstanceUpdatePage({ id, ...rest }: { id: string } & InstanceUpdat }; const value = useMemo(() => ({ id, token, admin: true, changeToken }), [id, token]) const i18n = useTranslator(); + return <InstanceContextProvider value={value}> - <InstanceUpdatePage {...rest} + <InstanceAdminUpdatePage {...rest} + instanceId={id} onLoadError={(error: HttpError) => { return <Fragment> <NotificationCard notification={{ diff --git a/packages/frontend/src/context/backend.ts b/packages/frontend/src/context/backend.ts index 1a7cd72..9168d32 100644 --- a/packages/frontend/src/context/backend.ts +++ b/packages/frontend/src/context/backend.ts @@ -27,25 +27,23 @@ interface BackendContextType { url: string; token?: string; triedToLog: boolean; - changeBackend: (url: string) => void; resetBackend: () => void; clearAllTokens: () => void; addTokenCleaner: (c: () => void) => void; - updateToken: (token?:string) => void; + updateLoginStatus: (url: string, token?: string) => void; } const BackendContext = createContext<BackendContextType>({ url: '', token: undefined, triedToLog: false, - changeBackend: () => null, resetBackend: () => null, clearAllTokens: () => null, addTokenCleaner: () => null, - updateToken: () => null, + updateLoginStatus: () => null, }) -export function useBackendContextState(defaultUrl?:string): BackendContextType { +function useBackendContextState(defaultUrl?:string): BackendContextType { const [url, triedToLog, changeBackend, resetBackend] = useBackendURL(defaultUrl); const [token, _updateToken] = useBackendDefaultToken(); const updateToken = (t?:string) => { @@ -66,7 +64,13 @@ export function useBackendContextState(defaultUrl?:string): BackendContextType { resetBackend() } - return { url, token, triedToLog, changeBackend, updateToken, resetBackend, clearAllTokens, addTokenCleaner: addTokenCleanerMemo } + const updateLoginStatus = (url: string, token?: string) => { + changeBackend(url); + if (token) updateToken(token); + }; + + + return { url, token, triedToLog, updateLoginStatus, resetBackend, clearAllTokens, addTokenCleaner: addTokenCleanerMemo } } export const BackendContextProvider = ({children, defaultUrl}:{children:any, defaultUrl?:string}):VNode => { diff --git a/packages/frontend/src/hooks/instance.ts b/packages/frontend/src/hooks/instance.ts index 462870f..4ac0b4f 100644 --- a/packages/frontend/src/hooks/instance.ts +++ b/packages/frontend/src/hooks/instance.ts @@ -27,6 +27,51 @@ interface InstanceAPI { setNewToken: (token: string) => Promise<void>; } +export function useManagementAPI(instanceId: string) : InstanceAPI { + const { url, token } = useBackendContext() + + const updateInstance = async (instance: MerchantBackend.Instances.InstanceReconfigurationMessage): Promise<void> => { + await request(`${url}/private/instances/${instanceId}`, { + method: 'patch', + token, + data: instance + }) + + mutate([`/private/`, token, url], null) + }; + + const deleteInstance = async (): Promise<void> => { + await request(`${url}/private/instances/${instanceId}`, { + method: 'delete', + token, + }) + + mutate([`/private/`, token, url], null) + } + + const clearToken = async (): Promise<void> => { + await request(`${url}/private/instances/${instanceId}/auth`, { + method: 'post', + token, + data: { method: 'external' } + }) + + mutate([`/private/`, token, url], null) + } + + const setNewToken = async (newToken: string): Promise<void> => { + await request(`${url}/private/instances/${instanceId}/auth`, { + method: 'post', + token, + data: { method: 'token', token: newToken } + }) + + mutate([`/private/`, token, url], null) + } + + return { updateInstance, deleteInstance, setNewToken, clearToken } +} + export function useInstanceAPI(): InstanceAPI { const { url: baseUrl, token: adminToken } = useBackendContext() const { token: instanceToken, id, admin } = useInstanceContext() @@ -109,6 +154,26 @@ export function useInstanceDetails(): HttpResponse<MerchantBackend.Instances.Que return {loading: true} } +export function useManagedInstanceDetails(instanceId: string): HttpResponse<MerchantBackend.Instances.QueryInstancesResponse> { + const { url, token } = useBackendContext(); + + const { data, error, isValidating } = useSWR<HttpResponseOk<MerchantBackend.Instances.QueryInstancesResponse>, HttpError>([`/private/instances/${instanceId}`, token, url], fetcher, { + refreshInterval:0, + refreshWhenHidden: false, + revalidateOnFocus: false, + revalidateOnReconnect: false, + refreshWhenOffline: false, + errorRetryCount: 0, + errorRetryInterval: 1, + shouldRetryOnError: false, + }) + + if (isValidating) return {loading:true, data: data?.data} + if (data) return data + if (error) return error + return {loading: true} +} + export function useBackendInstances(): HttpResponse<MerchantBackend.Instances.InstancesResponse> { const { url } = useBackendContext() const { token } = useInstanceContext(); @@ -120,4 +185,3 @@ export function useBackendInstances(): HttpResponse<MerchantBackend.Instances.In if (error) return error return {loading: true} } - diff --git a/packages/frontend/src/index.tsx b/packages/frontend/src/index.tsx index 0a77533..26dcc3e 100644 --- a/packages/frontend/src/index.tsx +++ b/packages/frontend/src/index.tsx @@ -47,13 +47,12 @@ export default function Application(): VNode { } function ApplicationStatusRoutes(): VNode { - const { changeBackend, triedToLog, updateToken } = useBackendContext() + const { updateLoginStatus, triedToLog } = useBackendContext() const result = useBackendConfig(); const i18n = useTranslator() const updateLoginInfoAndGoToRoot = (url: string, token?: string) => { - changeBackend(url) - if (token) updateToken(token) + updateLoginStatus(url, token) route('/') } diff --git a/packages/frontend/src/paths/admin/list/TableDeleted.tsx b/packages/frontend/src/paths/admin/list/TableDeleted.tsx index 667ff19..95bfede 100644 --- a/packages/frontend/src/paths/admin/list/TableDeleted.tsx +++ b/packages/frontend/src/paths/admin/list/TableDeleted.tsx @@ -27,9 +27,10 @@ import { Translate, useTranslator } from "../../../i18n"; interface Props { instances: MerchantBackend.Instances.Instance[]; onPurge: (id: MerchantBackend.Instances.Instance) => void; + setInstanceName: (s: string) => void; } -export function CardTable({ instances, onPurge }: Props): VNode { +export function CardTable({ instances, onPurge, setInstanceName }: Props): VNode { const i18n = useTranslator() @@ -42,7 +43,7 @@ export function CardTable({ instances, onPurge }: Props): VNode { <div class="b-table has-pagination"> <div class="table-wrapper has-mobile-cards"> {instances.length > 0 ? - <Table instances={instances} onPurge={onPurge} /> : + <Table instances={instances} onPurge={onPurge} setInstanceName={setInstanceName} /> : <EmptyTable /> } </div> @@ -53,13 +54,14 @@ export function CardTable({ instances, onPurge }: Props): VNode { interface TableProps { instances: MerchantBackend.Instances.Instance[]; onPurge: (id: MerchantBackend.Instances.Instance) => void; + setInstanceName: (s: string) => void; } function toggleSelected<T>(id: T): (prev: T[]) => T[] { return (prev: T[]): T[] => prev.indexOf(id) == -1 ? [...prev, id] : prev.filter(e => e != id) } -function Table({ instances, onPurge }: TableProps): VNode { +function Table({ instances, onPurge, setInstanceName }: TableProps): VNode { return ( <div class="table-container"> <table class="table is-fullwidth is-striped is-hoverable is-fullwidth"> @@ -77,7 +79,9 @@ function Table({ instances, onPurge }: TableProps): VNode { return <tr key={i.id}> <td class="is-checkbox-cell"> </td> - <td>{i.id}</td> + <td><a href={`#/orders?instance=${i.id}`} onClick={(e) => { + setInstanceName(i.id); + }}>{i.id}</a></td> <td >{i.name}</td> <td class="is-actions-cell right-sticky"> <div class="buttons is-right"> diff --git a/packages/frontend/src/paths/admin/list/View.tsx b/packages/frontend/src/paths/admin/list/View.tsx index e7413c1..a5df3c4 100644 --- a/packages/frontend/src/paths/admin/list/View.tsx +++ b/packages/frontend/src/paths/admin/list/View.tsx @@ -35,6 +35,7 @@ interface Props { } export function View({ instances, onCreate, onDelete, onPurge, onUpdate, setInstanceName, selected }: Props): VNode { + const deletedInstances = instances.filter(i => i.deleted); return <div id="app"> @@ -42,9 +43,9 @@ export function View({ instances, onCreate, onDelete, onPurge, onUpdate, setInst <CardTableActive instances={instances.filter(i => !i.deleted)} onDelete={onDelete} setInstanceName={setInstanceName} onUpdate={onUpdate} selected={selected} onCreate={onCreate} /> </section> - <section class="section is-main-section"> - <CardTableDeleted instances={instances.filter(i => i.deleted)} onPurge={onPurge} /> - </section> + {deletedInstances.length > 0 && <section class="section is-main-section"> + <CardTableDeleted instances={deletedInstances} onPurge={onPurge} setInstanceName={setInstanceName}/> + </section> } </div > }
\ No newline at end of file diff --git a/packages/frontend/src/paths/instance/update/index.tsx b/packages/frontend/src/paths/instance/update/index.tsx index b226af0..33dc476 100644 --- a/packages/frontend/src/paths/instance/update/index.tsx +++ b/packages/frontend/src/paths/instance/update/index.tsx @@ -17,8 +17,8 @@ import { Fragment, h, VNode } from "preact"; import { Loading } from "../../../components/exception/loading"; import { useInstanceContext } from "../../../context/instance"; import { MerchantBackend } from "../../../declaration"; -import { HttpError } from "../../../hooks/backend"; -import { useInstanceAPI, useInstanceDetails } from "../../../hooks/instance"; +import { HttpError, HttpResponse } from "../../../hooks/backend"; +import { useInstanceAPI, useInstanceDetails, useManagedInstanceDetails, useManagementAPI } from "../../../hooks/instance"; import { UpdatePage } from "./UpdatePage"; export interface Props { @@ -32,9 +32,19 @@ export interface Props { } -export default function Update({ onBack, onConfirm, onLoadError, onNotFound, onUpdateError, onUnauthorized }: Props): VNode { +export default function Update(props: Props): VNode { const { updateInstance, clearToken, setNewToken } = useInstanceAPI(); const result = useInstanceDetails() + return CommonUpdate(props, result, updateInstance, clearToken, setNewToken) +} + +export function AdminUpdate(props:Props & {instanceId:string}): VNode { + const { updateInstance, clearToken, setNewToken } = useManagementAPI(props.instanceId); + const result = useManagedInstanceDetails(props.instanceId) + return CommonUpdate(props, result, updateInstance, clearToken, setNewToken) +} + +function CommonUpdate({ onBack, onConfirm, onLoadError, onNotFound, onUpdateError, onUnauthorized }: Props, result: HttpResponse<MerchantBackend.Instances.QueryInstancesResponse>, updateInstance: any, clearToken: any, setNewToken: any): VNode { const { changeToken } = useInstanceContext() if (result.clientError && result.isUnauthorized) return onUnauthorized() |