From 27894e67d553c64294ea69adda5ac0012541b151 Mon Sep 17 00:00:00 2001 From: Assad Isah Date: Mon, 29 Jun 2026 07:50:24 +0100 Subject: [PATCH] feat: add SDK playground page --- frontend/app/sandbox/playground/page.tsx | 132 +++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 frontend/app/sandbox/playground/page.tsx diff --git a/frontend/app/sandbox/playground/page.tsx b/frontend/app/sandbox/playground/page.tsx new file mode 100644 index 0000000..fa21742 --- /dev/null +++ b/frontend/app/sandbox/playground/page.tsx @@ -0,0 +1,132 @@ +"use client"; + +import { useState } from "react"; +import { BridgeletClient } from "@/lib/create-bridgelet-client"; +import type { BridgeletClientOptions } from "@/lib/create-bridgelet-client"; + +type Endpoint = "getClaimDetails" | "createPaymentIntent" | "redeemClaim"; + +const ENDPOINT_LABELS: Record = { + getClaimDetails: "GET /claim/:token", + createPaymentIntent: "POST /send", + redeemClaim: "POST /claim/:token/redeem", +}; + +const INITIAL_PARAMS: Record> = { + getClaimDetails: { token: "demo_token_here" }, + createPaymentIntent: { senderPublicKey: "G...", amountStroops: "10000000", assetCode: "USDC" }, + redeemClaim: { token: "demo_token_here", recipientPublicKey: "G..." }, +}; + +export default function PlaygroundPage() { + const [selected, setSelected] = useState("getClaimDetails"); + const [params, setParams] = useState>(INITIAL_PARAMS.getClaimDetails); + const [response, setResponse] = useState(""); + const [error, setError] = useState(""); + const [loading, setLoading] = useState(false); + + const client = new BridgeletClient({ + baseUrl: process.env.NEXT_PUBLIC_API_BASE_URL, + apiKey: process.env.NEXT_PUBLIC_API_KEY, + } as BridgeletClientOptions); + + const handleEndpointChange = (endpoint: Endpoint) => { + setSelected(endpoint); + setParams(INITIAL_PARAMS[endpoint]); + setResponse(""); + setError(""); + }; + + const handleParamChange = (key: string, value: string) => { + setParams((prev) => ({ ...prev, [key]: value })); + }; + + const execute = async () => { + setLoading(true); + setResponse(""); + setError(""); + try { + let result: unknown; + switch (selected) { + case "getClaimDetails": + result = await client.getClaimDetails(params.token); + break; + case "createPaymentIntent": + result = await client.createPaymentIntent({ + senderPublicKey: params.senderPublicKey, + amountStroops: params.amountStroops, + assetCode: params.assetCode, + }); + break; + case "redeemClaim": + result = await client.redeemClaim(params.token, { + recipientPublicKey: params.recipientPublicKey, + }); + break; + } + setResponse(JSON.stringify(result, null, 2)); + } catch (err) { + setError(JSON.stringify(err, null, 2)); + } finally { + setLoading(false); + } + }; + + return ( +
+

Bridgelet SDK Playground

+

Test SDK endpoints and inspect raw responses.

+ +
+ {(Object.keys(ENDPOINT_LABELS) as Endpoint[]).map((ep) => ( + + ))} +
+ +
+

Parameters

+ {Object.entries(params).map(([key, val]) => ( +
+ + handleParamChange(key, e.target.value)} + className="flex-1 rounded border px-2 py-1 text-sm font-mono" + /> +
+ ))} + +
+ + {response && ( +
+

Response

+
{response}
+
+ )} + + {error && ( +
+

Error

+
{error}
+
+ )} +
+ ); +}