summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2021-08-03 12:53:23 -0300
committerSebastian <sebasjm@gmail.com>2021-08-03 12:53:28 -0300
commitcc02ab3992055ee43c904231e8ac96f9a783437e (patch)
treee1813b0dc49c1722795bdcdf3c3ba758d1806149 /packages
parentee3f5c57b3e226e8ae9e38bb896f9c3579804a8e (diff)
downloadmerchant-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.tsx7
-rw-r--r--packages/frontend/src/InstanceRoutes.tsx10
-rw-r--r--packages/frontend/src/context/backend.ts16
-rw-r--r--packages/frontend/src/hooks/instance.ts66
-rw-r--r--packages/frontend/src/index.tsx5
-rw-r--r--packages/frontend/src/paths/admin/list/TableDeleted.tsx12
-rw-r--r--packages/frontend/src/paths/admin/list/View.tsx7
-rw-r--r--packages/frontend/src/paths/instance/update/index.tsx16
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()