import React, { useMemo, useState } from 'react'; import { IframeBridge, callHandlerJson } from '@alga-psa/extension-iframe-sdk'; import { Button, Card, Stack, Text } from '@alga-psa/ui-kit'; const bridge = new IframeBridge({ devAllowWildcard: true }); bridge.ready(); function formatError(error: unknown): string { return error instanceof Error ? error.message : String(error); } async function runProxyCall(path: string) { return callHandlerJson(bridge, path); } export default function App() { const [activeAction, setActiveAction] = useState(null); const [result, setResult] = useState('Ready.'); const output = useMemo(() => JSON.stringify(result, null, 2), [result]); const runAction = async (actionKey: string, path: string) => { setActiveAction(actionKey); try { const nextResult = await runProxyCall(path); setResult({ ok: true, path, result: nextResult }); } catch (error) { setResult({ ok: false, path, error: formatError(error) }); } finally { setActiveAction(null); } }; return (
Client/Service Read Demo Uses host capabilities for tenant-scoped client and service reads without calling internal APIs from the handler.
What It Tests Separate UI actions for the two read capabilities exposed by this sample. GET /api/clients GET /api/services Output Live handler response from the installed extension.
                  {output}
                
); }