fix: use phone-reachable relay URL in wallet-import QR

The "Import from a patient app → QR" code baked the web app's own
API_BASE_URL (typically http://localhost:4000) into the pairing URI, so a
real phone could never reach the relay and "Scan to connect" silently
stalled. Use the backend's server-resolved, device-reachable relay URL
instead (PUBLIC_RELAY_URL, else the request host), surface it on the
WalletPairing type, and document PUBLIC_RELAY_URL in .env.example.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Khalid Abdi
2026-06-22 19:39:08 +03:00
parent 7a359d4911
commit 4e60361f77
5 changed files with 39 additions and 4 deletions
@@ -19,7 +19,7 @@ import {
} from "@/components/ui/dialog";
import { Input } from "@/components/ui/input";
import { Switch } from "@/components/ui/switch";
import { ApiError, API_BASE_URL } from "@/lib/api-client";
import { ApiError } from "@/lib/api-client";
import {
commitWalletShare,
type Patient,
@@ -159,7 +159,10 @@ export function ImportFromWalletDialog({
durationHours: temporary ? durationHours : undefined,
});
const params = new URLSearchParams({
relay: API_BASE_URL,
// Use the server-resolved, phone-reachable relay URL — NOT API_BASE_URL,
// which is often http://localhost:4000 (the phone itself) and never
// connects from a real device.
relay: pairing.relayUrl,
rid: pairing.id,
epk: pairing.ephemeralPubKey,
mode: pairing.shareMode,
+7 -1
View File
@@ -216,7 +216,13 @@ export async function requestWalletShare(input: {
// Create a QR pairing request (no wallet number — the patient scans a QR that
// carries this clinic's relay URL + the request). Returns the request plus the
// ephemeral public key the device seals to.
export type WalletPairing = WalletShareRequest & { ephemeralPubKey: string };
export type WalletPairing = WalletShareRequest & {
ephemeralPubKey: string;
// A phone-reachable relay URL the device should connect to (resolved
// server-side from PUBLIC_RELAY_URL / the request host — not necessarily this
// browser's API_BASE_URL, which may be localhost).
relayUrl: string;
};
export async function requestWalletPairing(input: {
mode: WalletShareMode;