+
+
+ {action.description && (
+ {action.description}
+ )}
+
+
+ {showParameters && hasParameters && (
+
+
Parameters:
+ {action.parameters!.map((param) => renderParameterInput(param))}
+
+
+
+
+
+ )}
+
+ {lastResult && (
+
+
+
+ {lastResult.success ? "✓" : "✗"}
+
+
+ {lastResult.message ||
+ (lastResult.success
+ ? "Action completed successfully"
+ : "Action failed")}
+
+
+
+ {lastResult.data && Object.keys(lastResult.data).length > 0 && (
+
+
Result Data:
+
{JSON.stringify(lastResult.data, null, 2)}
+
+ )}
+
+ {renderLogs(lastResult.logs || [])}
+
+ )}
+
+ );
+};
+
+export default ActionButton;
diff --git a/bridge-settings/react-app/src/components/ESimSettings.tsx b/bridge-settings/react-app/src/components/ESimSettings.tsx
new file mode 100644
index 0000000..a0e74c2
--- /dev/null
+++ b/bridge-settings/react-app/src/components/ESimSettings.tsx
@@ -0,0 +1,220 @@
+import React, { useState, useEffect } from "react";
+import ActionButton from "./ActionButton";
+import { ActionDefinition, ActionResult } from "../types/settings";
+
+interface ESimSettingsProps {
+ onExecuteAction: (
+ appId: string,
+ action: string,
+ params: Record