@ledgerhq/device-management-kit-devtools-ui 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.MD +202 -0
- package/lib/build/index.d.ts +2 -0
- package/lib/build/index.d.ts.map +1 -0
- package/lib/build/index.js +2 -0
- package/lib/build/index.js.map +1 -0
- package/lib/build/src/Dashboard.d.ts +5 -0
- package/lib/build/src/Dashboard.d.ts.map +1 -0
- package/lib/build/src/Dashboard.js +50 -0
- package/lib/build/src/Dashboard.js.map +1 -0
- package/lib/build/src/ErrorBoundary.d.ts +15 -0
- package/lib/build/src/ErrorBoundary.d.ts.map +1 -0
- package/lib/build/src/ErrorBoundary.js +23 -0
- package/lib/build/src/ErrorBoundary.js.map +1 -0
- package/lib/build/src/PluginEvents.d.ts +9 -0
- package/lib/build/src/PluginEvents.d.ts.map +1 -0
- package/lib/build/src/PluginEvents.js +2 -0
- package/lib/build/src/PluginEvents.js.map +1 -0
- package/lib/build/src/components/DashboardFooter.d.ts +8 -0
- package/lib/build/src/components/DashboardFooter.d.ts.map +1 -0
- package/lib/build/src/components/DashboardFooter.js +31 -0
- package/lib/build/src/components/DashboardFooter.js.map +1 -0
- package/lib/build/src/components/DashboardNavigationBar.d.ts +16 -0
- package/lib/build/src/components/DashboardNavigationBar.d.ts.map +1 -0
- package/lib/build/src/components/DashboardNavigationBar.js +85 -0
- package/lib/build/src/components/DashboardNavigationBar.js.map +1 -0
- package/lib/build/src/components/DebugDrawer.d.ts +18 -0
- package/lib/build/src/components/DebugDrawer.d.ts.map +1 -0
- package/lib/build/src/components/DebugDrawer.js +69 -0
- package/lib/build/src/components/DebugDrawer.js.map +1 -0
- package/lib/build/src/components/SplitView.d.ts +12 -0
- package/lib/build/src/components/SplitView.d.ts.map +1 -0
- package/lib/build/src/components/SplitView.js +50 -0
- package/lib/build/src/components/SplitView.js.map +1 -0
- package/lib/build/src/hooks/commandDispatcher.d.ts +28 -0
- package/lib/build/src/hooks/commandDispatcher.d.ts.map +1 -0
- package/lib/build/src/hooks/commandDispatcher.js +38 -0
- package/lib/build/src/hooks/commandDispatcher.js.map +1 -0
- package/lib/build/src/hooks/connectorMessageHandlers.d.ts +34 -0
- package/lib/build/src/hooks/connectorMessageHandlers.d.ts.map +1 -0
- package/lib/build/src/hooks/connectorMessageHandlers.js +85 -0
- package/lib/build/src/hooks/connectorMessageHandlers.js.map +1 -0
- package/lib/build/src/hooks/useConnectorMessages.d.ts +60 -0
- package/lib/build/src/hooks/useConnectorMessages.d.ts.map +1 -0
- package/lib/build/src/hooks/useConnectorMessages.js +138 -0
- package/lib/build/src/hooks/useConnectorMessages.js.map +1 -0
- package/lib/build/src/screens/debugDevTools/index.d.ts +17 -0
- package/lib/build/src/screens/debugDevTools/index.d.ts.map +1 -0
- package/lib/build/src/screens/debugDevTools/index.js +48 -0
- package/lib/build/src/screens/debugDevTools/index.js.map +1 -0
- package/lib/build/src/screens/inspector/ApduSender.d.ts +10 -0
- package/lib/build/src/screens/inspector/ApduSender.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/ApduSender.js +118 -0
- package/lib/build/src/screens/inspector/ApduSender.js.map +1 -0
- package/lib/build/src/screens/inspector/DeviceCard.d.ts +13 -0
- package/lib/build/src/screens/inspector/DeviceCard.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/DeviceCard.js +52 -0
- package/lib/build/src/screens/inspector/DeviceCard.js.map +1 -0
- package/lib/build/src/screens/inspector/DeviceDiscoverySection.d.ts +25 -0
- package/lib/build/src/screens/inspector/DeviceDiscoverySection.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/DeviceDiscoverySection.js +8 -0
- package/lib/build/src/screens/inspector/DeviceDiscoverySection.js.map +1 -0
- package/lib/build/src/screens/inspector/DiscoveredDeviceCard.d.ts +12 -0
- package/lib/build/src/screens/inspector/DiscoveredDeviceCard.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/DiscoveredDeviceCard.js +89 -0
- package/lib/build/src/screens/inspector/DiscoveredDeviceCard.js.map +1 -0
- package/lib/build/src/screens/inspector/MyLedgerProviderControl.d.ts +9 -0
- package/lib/build/src/screens/inspector/MyLedgerProviderControl.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/MyLedgerProviderControl.js +78 -0
- package/lib/build/src/screens/inspector/MyLedgerProviderControl.js.map +1 -0
- package/lib/build/src/screens/inspector/SessionsSection.d.ts +20 -0
- package/lib/build/src/screens/inspector/SessionsSection.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/SessionsSection.js +37 -0
- package/lib/build/src/screens/inspector/SessionsSection.js.map +1 -0
- package/lib/build/src/screens/inspector/index.d.ts +34 -0
- package/lib/build/src/screens/inspector/index.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/index.js +26 -0
- package/lib/build/src/screens/inspector/index.js.map +1 -0
- package/lib/build/src/screens/inspector/styles.d.ts +41 -0
- package/lib/build/src/screens/inspector/styles.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/styles.js +266 -0
- package/lib/build/src/screens/inspector/styles.js.map +1 -0
- package/lib/build/src/screens/logger/FilterInput.d.ts +8 -0
- package/lib/build/src/screens/logger/FilterInput.d.ts.map +1 -0
- package/lib/build/src/screens/logger/FilterInput.js +179 -0
- package/lib/build/src/screens/logger/FilterInput.js.map +1 -0
- package/lib/build/src/screens/logger/LoggerOptions.d.ts +18 -0
- package/lib/build/src/screens/logger/LoggerOptions.d.ts.map +1 -0
- package/lib/build/src/screens/logger/LoggerOptions.js +75 -0
- package/lib/build/src/screens/logger/LoggerOptions.js.map +1 -0
- package/lib/build/src/screens/logger/LoggerToolbar.d.ts +19 -0
- package/lib/build/src/screens/logger/LoggerToolbar.d.ts.map +1 -0
- package/lib/build/src/screens/logger/LoggerToolbar.js +16 -0
- package/lib/build/src/screens/logger/LoggerToolbar.js.map +1 -0
- package/lib/build/src/screens/logger/SearchInput.d.ts +15 -0
- package/lib/build/src/screens/logger/SearchInput.d.ts.map +1 -0
- package/lib/build/src/screens/logger/SearchInput.js +93 -0
- package/lib/build/src/screens/logger/SearchInput.js.map +1 -0
- package/lib/build/src/screens/logger/filterUtils.d.ts +43 -0
- package/lib/build/src/screens/logger/filterUtils.d.ts.map +1 -0
- package/lib/build/src/screens/logger/filterUtils.js +125 -0
- package/lib/build/src/screens/logger/filterUtils.js.map +1 -0
- package/lib/build/src/screens/logger/filterUtils.test.d.ts +2 -0
- package/lib/build/src/screens/logger/filterUtils.test.d.ts.map +1 -0
- package/lib/build/src/screens/logger/filterUtils.test.js +300 -0
- package/lib/build/src/screens/logger/filterUtils.test.js.map +1 -0
- package/lib/build/src/screens/logger/index.d.ts +10 -0
- package/lib/build/src/screens/logger/index.d.ts.map +1 -0
- package/lib/build/src/screens/logger/index.js +86 -0
- package/lib/build/src/screens/logger/index.js.map +1 -0
- package/lib/build/src/screens/logger/inputStyles.d.ts +18 -0
- package/lib/build/src/screens/logger/inputStyles.d.ts.map +1 -0
- package/lib/build/src/screens/logger/inputStyles.js +46 -0
- package/lib/build/src/screens/logger/inputStyles.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/LogTableCells.d.ts +13 -0
- package/lib/build/src/screens/logger/logsTable/LogTableCells.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/LogTableCells.js +61 -0
- package/lib/build/src/screens/logger/logsTable/LogTableCells.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/ScrollDownButton.d.ts +8 -0
- package/lib/build/src/screens/logger/logsTable/ScrollDownButton.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/ScrollDownButton.js +20 -0
- package/lib/build/src/screens/logger/logsTable/ScrollDownButton.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/TableBody.d.ts +13 -0
- package/lib/build/src/screens/logger/logsTable/TableBody.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/TableBody.js +58 -0
- package/lib/build/src/screens/logger/logsTable/TableBody.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/TableColumns.d.ts +3 -0
- package/lib/build/src/screens/logger/logsTable/TableColumns.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/TableColumns.js +44 -0
- package/lib/build/src/screens/logger/logsTable/TableColumns.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/TableHeader.d.ts +9 -0
- package/lib/build/src/screens/logger/logsTable/TableHeader.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/TableHeader.js +53 -0
- package/lib/build/src/screens/logger/logsTable/TableHeader.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/constants.d.ts +21 -0
- package/lib/build/src/screens/logger/logsTable/constants.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/constants.js +21 -0
- package/lib/build/src/screens/logger/logsTable/constants.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/index.d.ts +11 -0
- package/lib/build/src/screens/logger/logsTable/index.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/index.js +116 -0
- package/lib/build/src/screens/logger/logsTable/index.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/useColumnSizeVars.d.ts +4 -0
- package/lib/build/src/screens/logger/logsTable/useColumnSizeVars.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/useColumnSizeVars.js +17 -0
- package/lib/build/src/screens/logger/logsTable/useColumnSizeVars.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/useResizeObserver.d.ts +2 -0
- package/lib/build/src/screens/logger/logsTable/useResizeObserver.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/useResizeObserver.js +28 -0
- package/lib/build/src/screens/logger/logsTable/useResizeObserver.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/useScrollLogic.d.ts +12 -0
- package/lib/build/src/screens/logger/logsTable/useScrollLogic.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/useScrollLogic.js +86 -0
- package/lib/build/src/screens/logger/logsTable/useScrollLogic.js.map +1 -0
- package/lib/build/src/screens/logger/mapConnectorMessageToLogData.d.ts +6 -0
- package/lib/build/src/screens/logger/mapConnectorMessageToLogData.d.ts.map +1 -0
- package/lib/build/src/screens/logger/mapConnectorMessageToLogData.js +17 -0
- package/lib/build/src/screens/logger/mapConnectorMessageToLogData.js.map +1 -0
- package/lib/build/src/screens/logger/types.d.ts +6 -0
- package/lib/build/src/screens/logger/types.d.ts.map +1 -0
- package/lib/build/src/screens/logger/types.js +2 -0
- package/lib/build/src/screens/logger/types.js.map +1 -0
- package/lib/build/src/screens/logger/useColumnSizeVars.d.ts +4 -0
- package/lib/build/src/screens/logger/useColumnSizeVars.d.ts.map +1 -0
- package/lib/build/src/screens/logger/useColumnSizeVars.js +17 -0
- package/lib/build/src/screens/logger/useColumnSizeVars.js.map +1 -0
- package/lib/build/src/screens/logger/useLogsDataAndOptions.d.ts +12 -0
- package/lib/build/src/screens/logger/useLogsDataAndOptions.d.ts.map +1 -0
- package/lib/build/src/screens/logger/useLogsDataAndOptions.js +36 -0
- package/lib/build/src/screens/logger/useLogsDataAndOptions.js.map +1 -0
- package/lib/build/src/screens/logger/useRecentFilters.d.ts +18 -0
- package/lib/build/src/screens/logger/useRecentFilters.d.ts.map +1 -0
- package/lib/build/src/screens/logger/useRecentFilters.js +96 -0
- package/lib/build/src/screens/logger/useRecentFilters.js.map +1 -0
- package/lib/build/src/screens/logger/useSearchState.d.ts +24 -0
- package/lib/build/src/screens/logger/useSearchState.d.ts.map +1 -0
- package/lib/build/src/screens/logger/useSearchState.js +74 -0
- package/lib/build/src/screens/logger/useSearchState.js.map +1 -0
- package/lib/build/src/shared/NotConnectedMessage.d.ts +9 -0
- package/lib/build/src/shared/NotConnectedMessage.d.ts.map +1 -0
- package/lib/build/src/shared/NotConnectedMessage.js +30 -0
- package/lib/build/src/shared/NotConnectedMessage.js.map +1 -0
- package/lib/build/src/shared/PluginEvents.d.ts +9 -0
- package/lib/build/src/shared/PluginEvents.d.ts.map +1 -0
- package/lib/build/src/shared/PluginEvents.js +2 -0
- package/lib/build/src/shared/PluginEvents.js.map +1 -0
- package/lib/build/tsconfig.build.tsbuildinfo +1 -0
- package/lib/cjs/index.js +2 -0
- package/lib/cjs/index.js.map +7 -0
- package/lib/cjs/package.json +73 -0
- package/lib/cjs/src/Dashboard.js +12 -0
- package/lib/cjs/src/Dashboard.js.map +7 -0
- package/lib/cjs/src/ErrorBoundary.js +2 -0
- package/lib/cjs/src/ErrorBoundary.js.map +7 -0
- package/lib/cjs/src/PluginEvents.js +2 -0
- package/lib/cjs/src/PluginEvents.js.map +7 -0
- package/lib/cjs/src/components/DashboardFooter.js +25 -0
- package/lib/cjs/src/components/DashboardFooter.js.map +7 -0
- package/lib/cjs/src/components/DashboardNavigationBar.js +64 -0
- package/lib/cjs/src/components/DashboardNavigationBar.js.map +7 -0
- package/lib/cjs/src/components/DebugDrawer.js +58 -0
- package/lib/cjs/src/components/DebugDrawer.js.map +7 -0
- package/lib/cjs/src/components/SplitView.js +37 -0
- package/lib/cjs/src/components/SplitView.js.map +7 -0
- package/lib/cjs/src/hooks/commandDispatcher.js +2 -0
- package/lib/cjs/src/hooks/commandDispatcher.js.map +7 -0
- package/lib/cjs/src/hooks/connectorMessageHandlers.js +2 -0
- package/lib/cjs/src/hooks/connectorMessageHandlers.js.map +7 -0
- package/lib/cjs/src/hooks/useConnectorMessages.js +2 -0
- package/lib/cjs/src/hooks/useConnectorMessages.js.map +7 -0
- package/lib/cjs/src/screens/debugDevTools/index.js +2 -0
- package/lib/cjs/src/screens/debugDevTools/index.js.map +7 -0
- package/lib/cjs/src/screens/inspector/ApduSender.js +79 -0
- package/lib/cjs/src/screens/inspector/ApduSender.js.map +7 -0
- package/lib/cjs/src/screens/inspector/DeviceCard.js +2 -0
- package/lib/cjs/src/screens/inspector/DeviceCard.js.map +7 -0
- package/lib/cjs/src/screens/inspector/DeviceDiscoverySection.js +2 -0
- package/lib/cjs/src/screens/inspector/DeviceDiscoverySection.js.map +7 -0
- package/lib/cjs/src/screens/inspector/DiscoveredDeviceCard.js +57 -0
- package/lib/cjs/src/screens/inspector/DiscoveredDeviceCard.js.map +7 -0
- package/lib/cjs/src/screens/inspector/MyLedgerProviderControl.js +40 -0
- package/lib/cjs/src/screens/inspector/MyLedgerProviderControl.js.map +7 -0
- package/lib/cjs/src/screens/inspector/SessionsSection.js +2 -0
- package/lib/cjs/src/screens/inspector/SessionsSection.js.map +7 -0
- package/lib/cjs/src/screens/inspector/index.js +9 -0
- package/lib/cjs/src/screens/inspector/index.js.map +7 -0
- package/lib/cjs/src/screens/inspector/styles.js +179 -0
- package/lib/cjs/src/screens/inspector/styles.js.map +7 -0
- package/lib/cjs/src/screens/logger/FilterInput.js +85 -0
- package/lib/cjs/src/screens/logger/FilterInput.js.map +7 -0
- package/lib/cjs/src/screens/logger/LoggerOptions.js +6 -0
- package/lib/cjs/src/screens/logger/LoggerOptions.js.map +7 -0
- package/lib/cjs/src/screens/logger/LoggerToolbar.js +9 -0
- package/lib/cjs/src/screens/logger/LoggerToolbar.js.map +7 -0
- package/lib/cjs/src/screens/logger/SearchInput.js +59 -0
- package/lib/cjs/src/screens/logger/SearchInput.js.map +7 -0
- package/lib/cjs/src/screens/logger/filterUtils.js +2 -0
- package/lib/cjs/src/screens/logger/filterUtils.js.map +7 -0
- package/lib/cjs/src/screens/logger/filterUtils.test.js +2 -0
- package/lib/cjs/src/screens/logger/filterUtils.test.js.map +7 -0
- package/lib/cjs/src/screens/logger/index.js +6 -0
- package/lib/cjs/src/screens/logger/index.js.map +7 -0
- package/lib/cjs/src/screens/logger/inputStyles.js +31 -0
- package/lib/cjs/src/screens/logger/inputStyles.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/LogTableCells.js +8 -0
- package/lib/cjs/src/screens/logger/logsTable/LogTableCells.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/ScrollDownButton.js +15 -0
- package/lib/cjs/src/screens/logger/logsTable/ScrollDownButton.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/TableBody.js +24 -0
- package/lib/cjs/src/screens/logger/logsTable/TableBody.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/TableColumns.js +2 -0
- package/lib/cjs/src/screens/logger/logsTable/TableColumns.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/TableHeader.js +33 -0
- package/lib/cjs/src/screens/logger/logsTable/TableHeader.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/constants.js +2 -0
- package/lib/cjs/src/screens/logger/logsTable/constants.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/index.js +26 -0
- package/lib/cjs/src/screens/logger/logsTable/index.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/useColumnSizeVars.js +2 -0
- package/lib/cjs/src/screens/logger/logsTable/useColumnSizeVars.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/useResizeObserver.js +2 -0
- package/lib/cjs/src/screens/logger/logsTable/useResizeObserver.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/useScrollLogic.js +2 -0
- package/lib/cjs/src/screens/logger/logsTable/useScrollLogic.js.map +7 -0
- package/lib/cjs/src/screens/logger/mapConnectorMessageToLogData.js +2 -0
- package/lib/cjs/src/screens/logger/mapConnectorMessageToLogData.js.map +7 -0
- package/lib/cjs/src/screens/logger/types.js +2 -0
- package/lib/cjs/src/screens/logger/types.js.map +7 -0
- package/lib/cjs/src/screens/logger/useColumnSizeVars.js +2 -0
- package/lib/cjs/src/screens/logger/useColumnSizeVars.js.map +7 -0
- package/lib/cjs/src/screens/logger/useLogsDataAndOptions.js +2 -0
- package/lib/cjs/src/screens/logger/useLogsDataAndOptions.js.map +7 -0
- package/lib/cjs/src/screens/logger/useRecentFilters.js +2 -0
- package/lib/cjs/src/screens/logger/useRecentFilters.js.map +7 -0
- package/lib/cjs/src/screens/logger/useSearchState.js +2 -0
- package/lib/cjs/src/screens/logger/useSearchState.js.map +7 -0
- package/lib/cjs/src/shared/NotConnectedMessage.js +24 -0
- package/lib/cjs/src/shared/NotConnectedMessage.js.map +7 -0
- package/lib/cjs/src/shared/PluginEvents.js +2 -0
- package/lib/cjs/src/shared/PluginEvents.js.map +7 -0
- package/lib/esm/index.js +2 -0
- package/lib/esm/index.js.map +7 -0
- package/lib/esm/package.json +73 -0
- package/lib/esm/src/Dashboard.js +12 -0
- package/lib/esm/src/Dashboard.js.map +7 -0
- package/lib/esm/src/ErrorBoundary.js +2 -0
- package/lib/esm/src/ErrorBoundary.js.map +7 -0
- package/lib/esm/src/PluginEvents.js +1 -0
- package/lib/esm/src/PluginEvents.js.map +7 -0
- package/lib/esm/src/components/DashboardFooter.js +25 -0
- package/lib/esm/src/components/DashboardFooter.js.map +7 -0
- package/lib/esm/src/components/DashboardNavigationBar.js +64 -0
- package/lib/esm/src/components/DashboardNavigationBar.js.map +7 -0
- package/lib/esm/src/components/DebugDrawer.js +58 -0
- package/lib/esm/src/components/DebugDrawer.js.map +7 -0
- package/lib/esm/src/components/SplitView.js +37 -0
- package/lib/esm/src/components/SplitView.js.map +7 -0
- package/lib/esm/src/hooks/commandDispatcher.js +2 -0
- package/lib/esm/src/hooks/commandDispatcher.js.map +7 -0
- package/lib/esm/src/hooks/connectorMessageHandlers.js +2 -0
- package/lib/esm/src/hooks/connectorMessageHandlers.js.map +7 -0
- package/lib/esm/src/hooks/useConnectorMessages.js +2 -0
- package/lib/esm/src/hooks/useConnectorMessages.js.map +7 -0
- package/lib/esm/src/screens/debugDevTools/index.js +2 -0
- package/lib/esm/src/screens/debugDevTools/index.js.map +7 -0
- package/lib/esm/src/screens/inspector/ApduSender.js +79 -0
- package/lib/esm/src/screens/inspector/ApduSender.js.map +7 -0
- package/lib/esm/src/screens/inspector/DeviceCard.js +2 -0
- package/lib/esm/src/screens/inspector/DeviceCard.js.map +7 -0
- package/lib/esm/src/screens/inspector/DeviceDiscoverySection.js +2 -0
- package/lib/esm/src/screens/inspector/DeviceDiscoverySection.js.map +7 -0
- package/lib/esm/src/screens/inspector/DiscoveredDeviceCard.js +57 -0
- package/lib/esm/src/screens/inspector/DiscoveredDeviceCard.js.map +7 -0
- package/lib/esm/src/screens/inspector/MyLedgerProviderControl.js +40 -0
- package/lib/esm/src/screens/inspector/MyLedgerProviderControl.js.map +7 -0
- package/lib/esm/src/screens/inspector/SessionsSection.js +2 -0
- package/lib/esm/src/screens/inspector/SessionsSection.js.map +7 -0
- package/lib/esm/src/screens/inspector/index.js +9 -0
- package/lib/esm/src/screens/inspector/index.js.map +7 -0
- package/lib/esm/src/screens/inspector/styles.js +179 -0
- package/lib/esm/src/screens/inspector/styles.js.map +7 -0
- package/lib/esm/src/screens/logger/FilterInput.js +85 -0
- package/lib/esm/src/screens/logger/FilterInput.js.map +7 -0
- package/lib/esm/src/screens/logger/LoggerOptions.js +6 -0
- package/lib/esm/src/screens/logger/LoggerOptions.js.map +7 -0
- package/lib/esm/src/screens/logger/LoggerToolbar.js +9 -0
- package/lib/esm/src/screens/logger/LoggerToolbar.js.map +7 -0
- package/lib/esm/src/screens/logger/SearchInput.js +59 -0
- package/lib/esm/src/screens/logger/SearchInput.js.map +7 -0
- package/lib/esm/src/screens/logger/filterUtils.js +2 -0
- package/lib/esm/src/screens/logger/filterUtils.js.map +7 -0
- package/lib/esm/src/screens/logger/filterUtils.test.js +2 -0
- package/lib/esm/src/screens/logger/filterUtils.test.js.map +7 -0
- package/lib/esm/src/screens/logger/index.js +6 -0
- package/lib/esm/src/screens/logger/index.js.map +7 -0
- package/lib/esm/src/screens/logger/inputStyles.js +31 -0
- package/lib/esm/src/screens/logger/inputStyles.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/LogTableCells.js +8 -0
- package/lib/esm/src/screens/logger/logsTable/LogTableCells.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/ScrollDownButton.js +15 -0
- package/lib/esm/src/screens/logger/logsTable/ScrollDownButton.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/TableBody.js +24 -0
- package/lib/esm/src/screens/logger/logsTable/TableBody.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/TableColumns.js +2 -0
- package/lib/esm/src/screens/logger/logsTable/TableColumns.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/TableHeader.js +33 -0
- package/lib/esm/src/screens/logger/logsTable/TableHeader.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/constants.js +2 -0
- package/lib/esm/src/screens/logger/logsTable/constants.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/index.js +26 -0
- package/lib/esm/src/screens/logger/logsTable/index.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/useColumnSizeVars.js +2 -0
- package/lib/esm/src/screens/logger/logsTable/useColumnSizeVars.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/useResizeObserver.js +2 -0
- package/lib/esm/src/screens/logger/logsTable/useResizeObserver.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/useScrollLogic.js +2 -0
- package/lib/esm/src/screens/logger/logsTable/useScrollLogic.js.map +7 -0
- package/lib/esm/src/screens/logger/mapConnectorMessageToLogData.js +2 -0
- package/lib/esm/src/screens/logger/mapConnectorMessageToLogData.js.map +7 -0
- package/lib/esm/src/screens/logger/types.js +1 -0
- package/lib/esm/src/screens/logger/types.js.map +7 -0
- package/lib/esm/src/screens/logger/useColumnSizeVars.js +2 -0
- package/lib/esm/src/screens/logger/useColumnSizeVars.js.map +7 -0
- package/lib/esm/src/screens/logger/useLogsDataAndOptions.js +2 -0
- package/lib/esm/src/screens/logger/useLogsDataAndOptions.js.map +7 -0
- package/lib/esm/src/screens/logger/useRecentFilters.js +2 -0
- package/lib/esm/src/screens/logger/useRecentFilters.js.map +7 -0
- package/lib/esm/src/screens/logger/useSearchState.js +2 -0
- package/lib/esm/src/screens/logger/useSearchState.js.map +7 -0
- package/lib/esm/src/shared/NotConnectedMessage.js +24 -0
- package/lib/esm/src/shared/NotConnectedMessage.js.map +7 -0
- package/lib/esm/src/shared/PluginEvents.js +1 -0
- package/lib/esm/src/shared/PluginEvents.js.map +7 -0
- package/package.json +73 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import e from"styled-components";import{jsx as t,jsxs as i}from"react/jsx-runtime";var b=(n=>(n.logs="logs",n.inspector="inspector",n.splitHorizontal="splitHorizontal",n.splitVertical="splitVertical",n))(b||{});const g=e.div`
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: row;
|
|
4
|
+
align-items: center;
|
|
5
|
+
gap: 8px;
|
|
6
|
+
padding: 8px 12px;
|
|
7
|
+
background: #f8f8f8;
|
|
8
|
+
border-bottom: 1px solid #e0e0e0;
|
|
9
|
+
flex-shrink: 0;
|
|
10
|
+
`,s=e.div`
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: row;
|
|
13
|
+
align-items: center;
|
|
14
|
+
gap: 4px;
|
|
15
|
+
`,h=e.div`
|
|
16
|
+
width: 1px;
|
|
17
|
+
height: 24px;
|
|
18
|
+
background: #ddd;
|
|
19
|
+
margin: 0 8px;
|
|
20
|
+
`,d=e.button`
|
|
21
|
+
padding: 6px 12px;
|
|
22
|
+
border: 1px solid ${({$isActive:o})=>o?"#2196F3":"#ddd"};
|
|
23
|
+
border-radius: 4px;
|
|
24
|
+
background: ${({$isActive:o})=>o?"#e3f2fd":"white"};
|
|
25
|
+
color: ${({$isActive:o})=>o?"#1976d2":"#333"};
|
|
26
|
+
font-weight: ${({$isActive:o})=>o?"600":"normal"};
|
|
27
|
+
font-size: 13px;
|
|
28
|
+
cursor: pointer;
|
|
29
|
+
opacity: ${({$isConnected:o})=>o===!1?.5:1};
|
|
30
|
+
transition: all 0.15s ease;
|
|
31
|
+
|
|
32
|
+
&:hover {
|
|
33
|
+
background: ${({$isActive:o})=>o?"#e3f2fd":"#f5f5f5"};
|
|
34
|
+
border-color: ${({$isActive:o})=>o?"#2196F3":"#bbb"};
|
|
35
|
+
}
|
|
36
|
+
`,c=e.button`
|
|
37
|
+
padding: 6px 8px;
|
|
38
|
+
border: 1px solid ${({$isActive:o})=>o?"#2196F3":"#ddd"};
|
|
39
|
+
border-radius: 4px;
|
|
40
|
+
background: ${({$isActive:o})=>o?"#e3f2fd":"white"};
|
|
41
|
+
color: ${({$isActive:o})=>o?"#1976d2":"#666"};
|
|
42
|
+
cursor: pointer;
|
|
43
|
+
display: flex;
|
|
44
|
+
align-items: center;
|
|
45
|
+
justify-content: center;
|
|
46
|
+
transition: all 0.15s ease;
|
|
47
|
+
|
|
48
|
+
&:hover {
|
|
49
|
+
background: ${({$isActive:o})=>o?"#e3f2fd":"#f5f5f5"};
|
|
50
|
+
border-color: ${({$isActive:o})=>o?"#2196F3":"#bbb"};
|
|
51
|
+
}
|
|
52
|
+
`,p=e.span`
|
|
53
|
+
display: inline-block;
|
|
54
|
+
width: 8px;
|
|
55
|
+
height: 8px;
|
|
56
|
+
border-radius: 50%;
|
|
57
|
+
background: ${({$connected:o})=>o?"#4CAF50":"#ff9800"};
|
|
58
|
+
margin-right: 6px;
|
|
59
|
+
`,x=e.span`
|
|
60
|
+
font-size: 12px;
|
|
61
|
+
color: #666;
|
|
62
|
+
margin-right: 4px;
|
|
63
|
+
`,f=()=>i("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:[t("rect",{x:"2",y:"2",width:"12",height:"5",rx:"1",opacity:"0.6"}),t("rect",{x:"2",y:"9",width:"12",height:"5",rx:"1"})]}),v=()=>i("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:[t("rect",{x:"2",y:"2",width:"5",height:"12",rx:"1",opacity:"0.6"}),t("rect",{x:"9",y:"2",width:"5",height:"12",rx:"1"})]}),$=({currentScreen:o,onScreenChange:r,isLoggerConnected:a,isInspectorConnected:l})=>i(g,{children:[i(s,{children:[i(d,{$isActive:o==="logs",$isConnected:a,onClick:()=>r("logs"),children:[t(p,{$connected:a}),"Logger"]}),i(d,{$isActive:o==="inspector",$isConnected:l,onClick:()=>r("inspector"),children:[t(p,{$connected:l}),"Inspector"]})]}),t(h,{}),i(s,{children:[t(x,{children:"Split:"}),t(c,{$isActive:o==="splitHorizontal",onClick:()=>r("splitHorizontal"),title:"Split Horizontal (top/bottom)",children:t(f,{})}),t(c,{$isActive:o==="splitVertical",onClick:()=>r("splitVertical"),title:"Split Vertical (left/right)",children:t(v,{})})]})]});export{$ as DashboardNavigationBar,b as DashboardScreen};
|
|
64
|
+
//# sourceMappingURL=DashboardNavigationBar.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/DashboardNavigationBar.tsx"],
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\nimport styled from \"styled-components\";\n\nexport enum DashboardScreen {\n logs = \"logs\",\n inspector = \"inspector\",\n splitHorizontal = \"splitHorizontal\",\n splitVertical = \"splitVertical\",\n}\n\nconst NavContainer = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f8f8f8;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n`;\n\nconst NavGroup = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 4px;\n`;\n\nconst Divider = styled.div`\n width: 1px;\n height: 24px;\n background: #ddd;\n margin: 0 8px;\n`;\n\nconst NavButton = styled.button<{\n $isActive?: boolean;\n $isConnected?: boolean;\n}>`\n padding: 6px 12px;\n border: 1px solid ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#ddd\")};\n border-radius: 4px;\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"white\")};\n color: ${({ $isActive }) => ($isActive ? \"#1976d2\" : \"#333\")};\n font-weight: ${({ $isActive }) => ($isActive ? \"600\" : \"normal\")};\n font-size: 13px;\n cursor: pointer;\n opacity: ${({ $isConnected }) => ($isConnected === false ? 0.5 : 1)};\n transition: all 0.15s ease;\n\n &:hover {\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"#f5f5f5\")};\n border-color: ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#bbb\")};\n }\n`;\n\nconst SplitButton = styled.button<{ $isActive?: boolean }>`\n padding: 6px 8px;\n border: 1px solid ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#ddd\")};\n border-radius: 4px;\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"white\")};\n color: ${({ $isActive }) => ($isActive ? \"#1976d2\" : \"#666\")};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n\n &:hover {\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"#f5f5f5\")};\n border-color: ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#bbb\")};\n }\n`;\n\nconst ConnectionIndicator = styled.span<{ $connected: boolean }>`\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: ${({ $connected }) => ($connected ? \"#4CAF50\" : \"#ff9800\")};\n margin-right: 6px;\n`;\n\nconst SplitLabel = styled.span`\n font-size: 12px;\n color: #666;\n margin-right: 4px;\n`;\n\n// Simple SVG icons for split buttons\nconst SplitHorizontalIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"5\" rx=\"1\" opacity=\"0.6\" />\n <rect x=\"2\" y=\"9\" width=\"12\" height=\"5\" rx=\"1\" />\n </svg>\n);\n\nconst SplitVerticalIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <rect x=\"2\" y=\"2\" width=\"5\" height=\"12\" rx=\"1\" opacity=\"0.6\" />\n <rect x=\"9\" y=\"2\" width=\"5\" height=\"12\" rx=\"1\" />\n </svg>\n);\n\ntype DashboardNavigationBarProps = {\n currentScreen: DashboardScreen;\n onScreenChange: (screen: DashboardScreen) => void;\n isLoggerConnected: boolean;\n isInspectorConnected: boolean;\n};\n\nexport const DashboardNavigationBar: React.FC<DashboardNavigationBarProps> = ({\n currentScreen,\n onScreenChange,\n isLoggerConnected,\n isInspectorConnected,\n}) => {\n return (\n <NavContainer>\n {/* Main view buttons */}\n <NavGroup>\n <NavButton\n $isActive={currentScreen === DashboardScreen.logs}\n $isConnected={isLoggerConnected}\n onClick={() => onScreenChange(DashboardScreen.logs)}\n >\n <ConnectionIndicator $connected={isLoggerConnected} />\n Logger\n </NavButton>\n <NavButton\n $isActive={currentScreen === DashboardScreen.inspector}\n $isConnected={isInspectorConnected}\n onClick={() => onScreenChange(DashboardScreen.inspector)}\n >\n <ConnectionIndicator $connected={isInspectorConnected} />\n Inspector\n </NavButton>\n </NavGroup>\n\n <Divider />\n\n {/* Split view buttons */}\n <NavGroup>\n <SplitLabel>Split:</SplitLabel>\n <SplitButton\n $isActive={currentScreen === DashboardScreen.splitHorizontal}\n onClick={() => onScreenChange(DashboardScreen.splitHorizontal)}\n title=\"Split Horizontal (top/bottom)\"\n >\n <SplitHorizontalIcon />\n </SplitButton>\n <SplitButton\n $isActive={currentScreen === DashboardScreen.splitVertical}\n onClick={() => onScreenChange(DashboardScreen.splitVertical)}\n title=\"Split Vertical (left/right)\"\n >\n <SplitVerticalIcon />\n </SplitButton>\n </NavGroup>\n </NavContainer>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["styled", "jsx", "jsxs", "DashboardScreen", "NavContainer", "NavGroup", "Divider", "NavButton", "$isActive", "$isConnected", "SplitButton", "ConnectionIndicator", "$connected", "SplitLabel", "SplitHorizontalIcon", "SplitVerticalIcon", "DashboardNavigationBar", "currentScreen", "onScreenChange", "isLoggerConnected", "isInspectorConnected"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import o from"styled-components";import{DebugDevTools as d}from"../screens/debugDevTools";import{Fragment as x,jsx as r,jsxs as t}from"react/jsx-runtime";const p=o.div`
|
|
2
|
+
position: fixed;
|
|
3
|
+
top: 0;
|
|
4
|
+
left: 0;
|
|
5
|
+
right: 0;
|
|
6
|
+
bottom: 0;
|
|
7
|
+
background: rgba(0, 0, 0, 0.3);
|
|
8
|
+
opacity: ${({$isOpen:e})=>e?1:0};
|
|
9
|
+
visibility: ${({$isOpen:e})=>e?"visible":"hidden"};
|
|
10
|
+
transition:
|
|
11
|
+
opacity 0.2s ease,
|
|
12
|
+
visibility 0.2s ease;
|
|
13
|
+
z-index: 100;
|
|
14
|
+
`,l=o.div`
|
|
15
|
+
position: fixed;
|
|
16
|
+
bottom: 0;
|
|
17
|
+
left: 0;
|
|
18
|
+
right: 0;
|
|
19
|
+
height: 50%;
|
|
20
|
+
background: white;
|
|
21
|
+
border-top: 2px solid #ddd;
|
|
22
|
+
transform: translateY(${({$isOpen:e})=>e?"0":"100%"});
|
|
23
|
+
transition: transform 0.25s ease;
|
|
24
|
+
z-index: 101;
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
`,g=o.div`
|
|
28
|
+
display: flex;
|
|
29
|
+
flex-direction: row;
|
|
30
|
+
align-items: center;
|
|
31
|
+
justify-content: space-between;
|
|
32
|
+
padding: 8px 16px;
|
|
33
|
+
background: #f5f5f5;
|
|
34
|
+
border-bottom: 1px solid #ddd;
|
|
35
|
+
flex-shrink: 0;
|
|
36
|
+
`,c=o.h4`
|
|
37
|
+
margin: 0;
|
|
38
|
+
font-size: 14px;
|
|
39
|
+
font-weight: 600;
|
|
40
|
+
color: #333;
|
|
41
|
+
`,b=o.button`
|
|
42
|
+
padding: 4px 8px;
|
|
43
|
+
border: none;
|
|
44
|
+
border-radius: 4px;
|
|
45
|
+
background: transparent;
|
|
46
|
+
color: #666;
|
|
47
|
+
font-size: 18px;
|
|
48
|
+
cursor: pointer;
|
|
49
|
+
transition: background 0.15s ease;
|
|
50
|
+
|
|
51
|
+
&:hover {
|
|
52
|
+
background: #e0e0e0;
|
|
53
|
+
}
|
|
54
|
+
`,f=o.div`
|
|
55
|
+
flex: 1;
|
|
56
|
+
overflow: hidden;
|
|
57
|
+
`,w=({isOpen:e,onClose:s,sentMessages:i,receivedMessages:n,sendMessage:a})=>t(x,{children:[r(p,{$isOpen:e,onClick:s}),t(l,{$isOpen:e,children:[t(g,{children:[r(c,{children:"Debug DevTools"}),r(b,{onClick:s,children:"\xD7"})]}),r(f,{children:r(d,{sentMessages:i,receivedMessages:n,sendMessage:a})})]})]});export{w as DebugDrawer};
|
|
58
|
+
//# sourceMappingURL=DebugDrawer.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/DebugDrawer.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * @file DebugDrawer component\n *\n * A slide-up drawer that displays the Debug DevTools panel.\n * Shows raw sent/received connector messages for debugging purposes.\n */\n\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport { DebugDevTools } from \"../screens/debugDevTools\";\nimport { type Message } from \"../shared/PluginEvents\";\n\nconst DrawerOverlay = styled.div<{ $isOpen: boolean }>`\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n opacity: ${({ $isOpen }) => ($isOpen ? 1 : 0)};\n visibility: ${({ $isOpen }) => ($isOpen ? \"visible\" : \"hidden\")};\n transition:\n opacity 0.2s ease,\n visibility 0.2s ease;\n z-index: 100;\n`;\n\nconst DrawerContainer = styled.div<{ $isOpen: boolean }>`\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n height: 50%;\n background: white;\n border-top: 2px solid #ddd;\n transform: translateY(${({ $isOpen }) => ($isOpen ? \"0\" : \"100%\")});\n transition: transform 0.25s ease;\n z-index: 101;\n display: flex;\n flex-direction: column;\n`;\n\nconst DrawerHeader = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n padding: 8px 16px;\n background: #f5f5f5;\n border-bottom: 1px solid #ddd;\n flex-shrink: 0;\n`;\n\nconst DrawerTitle = styled.h4`\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n`;\n\nconst CloseButton = styled.button`\n padding: 4px 8px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: #666;\n font-size: 18px;\n cursor: pointer;\n transition: background 0.15s ease;\n\n &:hover {\n background: #e0e0e0;\n }\n`;\n\nconst DrawerContent = styled.div`\n flex: 1;\n overflow: hidden;\n`;\n\ntype DebugDrawerProps = {\n isOpen: boolean;\n onClose: () => void;\n sentMessages: Message[];\n receivedMessages: Message[];\n sendMessage: (type: string, payload: string) => void;\n};\n\nexport const DebugDrawer: React.FC<DebugDrawerProps> = ({\n isOpen,\n onClose,\n sentMessages,\n receivedMessages,\n sendMessage,\n}) => {\n return (\n <>\n <DrawerOverlay $isOpen={isOpen} onClick={onClose} />\n <DrawerContainer $isOpen={isOpen}>\n <DrawerHeader>\n <DrawerTitle>Debug DevTools</DrawerTitle>\n <CloseButton onClick={onClose}>\u00D7</CloseButton>\n </DrawerHeader>\n <DrawerContent>\n <DebugDevTools\n sentMessages={sentMessages}\n receivedMessages={receivedMessages}\n sendMessage={sendMessage}\n />\n </DrawerContent>\n </DrawerContainer>\n </>\n );\n};\n"],
|
|
5
|
+
"mappings": "AAQA,OAAOA,MAAY,oBAEnB,OAAS,iBAAAC,MAAqB,2BAuF1B,mBAAAC,EACE,OAAAC,EAEE,QAAAC,MAHJ,oBApFJ,MAAMC,EAAgBL,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAOhB,CAAC,CAAE,QAAAM,CAAQ,IAAOA,EAAU,EAAI,CAAE;AAAA,gBAC/B,CAAC,CAAE,QAAAA,CAAQ,IAAOA,EAAU,UAAY,QAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3DC,EAAkBP,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAQL,CAAC,CAAE,QAAAM,CAAQ,IAAOA,EAAU,IAAM,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7DE,EAAeR,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWtBS,EAAcT,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOrBU,EAAcV,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAerBW,EAAgBX,EAAO;AAAA;AAAA;AAAA,EAahBY,EAA0C,CAAC,CACtD,OAAAC,EACA,QAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,YAAAC,CACF,IAEIb,EAAAF,EAAA,CACE,UAAAC,EAACE,EAAA,CAAc,QAASQ,EAAQ,QAASC,EAAS,EAClDV,EAACG,EAAA,CAAgB,QAASM,EACxB,UAAAT,EAACI,EAAA,CACC,UAAAL,EAACM,EAAA,CAAY,0BAAc,EAC3BN,EAACO,EAAA,CAAY,QAASI,EAAS,gBAAC,GAClC,EACAX,EAACQ,EAAA,CACC,SAAAR,EAACF,EAAA,CACC,aAAcc,EACd,iBAAkBC,EAClB,YAAaC,EACf,EACF,GACF,GACF",
|
|
6
|
+
"names": ["styled", "DebugDevTools", "Fragment", "jsx", "jsxs", "DrawerOverlay", "$isOpen", "DrawerContainer", "DrawerHeader", "DrawerTitle", "CloseButton", "DrawerContent", "DebugDrawer", "isOpen", "onClose", "sentMessages", "receivedMessages", "sendMessage"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import{Group as d,Panel as n,Separator as p}from"react-resizable-panels";import t from"styled-components";import{jsx as i,jsxs as m}from"react/jsx-runtime";const h=t(p)`
|
|
2
|
+
background: #e0e0e0;
|
|
3
|
+
transition: background 0.15s ease;
|
|
4
|
+
|
|
5
|
+
&:hover {
|
|
6
|
+
background: #bbb;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
&[data-resize-handle-active] {
|
|
10
|
+
background: #999;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* Horizontal split: thin horizontal bar between top/bottom panels */
|
|
14
|
+
${({$direction:e})=>e==="horizontal"&&`
|
|
15
|
+
height: 4px;
|
|
16
|
+
cursor: row-resize;
|
|
17
|
+
`}
|
|
18
|
+
|
|
19
|
+
/* Vertical split: thin vertical bar between left/right panels */
|
|
20
|
+
${({$direction:e})=>e==="vertical"&&`
|
|
21
|
+
width: 4px;
|
|
22
|
+
cursor: col-resize;
|
|
23
|
+
`}
|
|
24
|
+
`,r=t.div`
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
height: 100%;
|
|
28
|
+
overflow: hidden;
|
|
29
|
+
`,z=t.div`
|
|
30
|
+
display: flex;
|
|
31
|
+
flex: 1;
|
|
32
|
+
width: 100%;
|
|
33
|
+
height: 100%;
|
|
34
|
+
min-height: 0;
|
|
35
|
+
min-width: 0;
|
|
36
|
+
`,S=({direction:e,first:o,second:a,defaultFirstSize:l="50%",minFirstSize:c="20%",minSecondSize:s="20%"})=>i(z,{children:m(d,{orientation:e==="horizontal"?"vertical":"horizontal",style:{flex:1},children:[i(n,{defaultSize:l,minSize:c,children:i(r,{children:o})}),i(h,{$direction:e}),i(n,{minSize:s,children:i(r,{children:a})})]})});export{S as SplitView};
|
|
37
|
+
//# sourceMappingURL=SplitView.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/SplitView.tsx"],
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\nimport { Group, Panel, Separator } from \"react-resizable-panels\";\nimport styled from \"styled-components\";\n\nconst ResizeHandle = styled(Separator)<{\n $direction: \"horizontal\" | \"vertical\";\n}>`\n background: #e0e0e0;\n transition: background 0.15s ease;\n\n &:hover {\n background: #bbb;\n }\n\n &[data-resize-handle-active] {\n background: #999;\n }\n\n /* Horizontal split: thin horizontal bar between top/bottom panels */\n ${({ $direction }) =>\n $direction === \"horizontal\" &&\n `\n height: 4px;\n cursor: row-resize;\n `}\n\n /* Vertical split: thin vertical bar between left/right panels */\n ${({ $direction }) =>\n $direction === \"vertical\" &&\n `\n width: 4px;\n cursor: col-resize;\n `}\n`;\n\nconst PanelContainer = styled.div`\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n`;\n\nconst SplitViewContainer = styled.div`\n display: flex;\n flex: 1;\n width: 100%;\n height: 100%;\n min-height: 0;\n min-width: 0;\n`;\n\ntype SplitViewProps = {\n direction: \"horizontal\" | \"vertical\";\n first: React.ReactNode;\n second: React.ReactNode;\n defaultFirstSize?: number | string;\n minFirstSize?: number | string;\n minSecondSize?: number | string;\n};\n\nexport const SplitView: React.FC<SplitViewProps> = ({\n direction,\n first,\n second,\n defaultFirstSize = \"50%\",\n minFirstSize = \"20%\",\n minSecondSize = \"20%\",\n}) => {\n // react-resizable-panels uses \"horizontal\" for left/right split\n // and \"vertical\" for top/bottom split (opposite of our naming)\n const panelOrientation =\n direction === \"horizontal\" ? \"vertical\" : \"horizontal\";\n\n return (\n <SplitViewContainer>\n <Group orientation={panelOrientation} style={{ flex: 1 }}>\n <Panel defaultSize={defaultFirstSize} minSize={minFirstSize}>\n <PanelContainer>{first}</PanelContainer>\n </Panel>\n <ResizeHandle $direction={direction} />\n <Panel minSize={minSecondSize}>\n <PanelContainer>{second}</PanelContainer>\n </Panel>\n </Group>\n </SplitViewContainer>\n );\n};\n"],
|
|
5
|
+
"mappings": "AACA,OAAS,SAAAA,EAAO,SAAAC,EAAO,aAAAC,MAAiB,yBACxC,OAAOC,MAAY,oBAyEb,OAEI,OAAAC,EAFJ,QAAAC,MAAA,oBAvEN,MAAMC,EAAeH,EAAOD,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAejC,CAAC,CAAE,WAAAK,CAAW,IACdA,IAAe,cACf;AAAA;AAAA;AAAA,GAGD;AAAA;AAAA;AAAA,IAGC,CAAC,CAAE,WAAAA,CAAW,IACdA,IAAe,YACf;AAAA;AAAA;AAAA,GAGD;AAAA,EAGGC,EAAiBL,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxBM,EAAqBN,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBrBO,EAAsC,CAAC,CAClD,UAAAC,EACA,MAAAC,EACA,OAAAC,EACA,iBAAAC,EAAmB,MACnB,aAAAC,EAAe,MACf,cAAAC,EAAgB,KAClB,IAOIZ,EAACK,EAAA,CACC,SAAAJ,EAACL,EAAA,CAAM,YAJTW,IAAc,aAAe,WAAa,aAIF,MAAO,CAAE,KAAM,CAAE,EACrD,UAAAP,EAACH,EAAA,CAAM,YAAaa,EAAkB,QAASC,EAC7C,SAAAX,EAACI,EAAA,CAAgB,SAAAI,EAAM,EACzB,EACAR,EAACE,EAAA,CAAa,WAAYK,EAAW,EACrCP,EAACH,EAAA,CAAM,QAASe,EACd,SAAAZ,EAACI,EAAA,CAAgB,SAAAK,EAAO,EAC1B,GACF,EACF",
|
|
6
|
+
"names": ["Group", "Panel", "Separator", "styled", "jsx", "jsxs", "ResizeHandle", "$direction", "PanelContainer", "SplitViewContainer", "SplitView", "direction", "first", "second", "defaultFirstSize", "minFirstSize", "minSecondSize"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{INSPECTOR_COMMAND_TYPES as s}from"@ledgerhq/device-management-kit-devtools-core";function m(e){return{startListeningCommand:()=>e.sendMessage(s.START_LISTENING_DEVICES,"{}"),stopListeningCommand:()=>e.sendMessage(s.STOP_LISTENING_DEVICES,"{}"),startDiscoveringCommand:()=>e.sendMessage(s.START_DISCOVERING,"{}"),stopDiscoveringCommand:()=>e.sendMessage(s.STOP_DISCOVERING,"{}"),connectDeviceCommand:(n,r)=>e.sendMessage(s.CONNECT_DEVICE,JSON.stringify({deviceId:n,sessionRefresherOptions:r}))}}function C(e){return{getProviderCommand:()=>e.sendMessage(s.GET_PROVIDER,"{}"),setProviderCommand:n=>e.sendMessage(s.SET_PROVIDER,JSON.stringify({provider:n}))}}let d=0;function g(e){return{sendApduCommand:(n,r)=>{const t=`apdu-${++d}`,a=r.match(/.{1,2}/g)?.map(o=>parseInt(o,16))||[];return e.sendMessage(s.SEND_APDU,JSON.stringify({sessionId:n,apdu:a,requestId:t})),t}}}export{g as createApduCommands,m as createDiscoveryCommands,C as createProviderCommands};
|
|
2
|
+
//# sourceMappingURL=commandDispatcher.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/hooks/commandDispatcher.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type Connector,\n INSPECTOR_COMMAND_TYPES,\n} from \"@ledgerhq/device-management-kit-devtools-core\";\n\n/**\n * Create discovery-related command dispatchers.\n */\nexport function createDiscoveryCommands(connector: Connector) {\n return {\n startListeningCommand: () =>\n connector.sendMessage(\n INSPECTOR_COMMAND_TYPES.START_LISTENING_DEVICES,\n \"{}\",\n ),\n stopListeningCommand: () =>\n connector.sendMessage(\n INSPECTOR_COMMAND_TYPES.STOP_LISTENING_DEVICES,\n \"{}\",\n ),\n startDiscoveringCommand: () =>\n connector.sendMessage(INSPECTOR_COMMAND_TYPES.START_DISCOVERING, \"{}\"),\n stopDiscoveringCommand: () =>\n connector.sendMessage(INSPECTOR_COMMAND_TYPES.STOP_DISCOVERING, \"{}\"),\n connectDeviceCommand: (\n deviceId: string,\n sessionRefresherOptions?: {\n isRefresherDisabled: boolean;\n pollingInterval?: number;\n },\n ) =>\n connector.sendMessage(\n INSPECTOR_COMMAND_TYPES.CONNECT_DEVICE,\n JSON.stringify({ deviceId, sessionRefresherOptions }),\n ),\n };\n}\n\n/**\n * Create provider-related command dispatchers.\n */\nexport function createProviderCommands(connector: Connector) {\n return {\n getProviderCommand: () =>\n connector.sendMessage(INSPECTOR_COMMAND_TYPES.GET_PROVIDER, \"{}\"),\n setProviderCommand: (value: number) =>\n connector.sendMessage(\n INSPECTOR_COMMAND_TYPES.SET_PROVIDER,\n JSON.stringify({ provider: value }),\n ),\n };\n}\n\nlet apduRequestCounter = 0;\n\n/**\n * Create APDU-related command dispatchers.\n */\nexport function createApduCommands(connector: Connector) {\n return {\n sendApduCommand: (sessionId: string, apduHex: string): string => {\n const requestId = `apdu-${++apduRequestCounter}`;\n // Convert hex string to array of bytes\n const apdu =\n apduHex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [];\n connector.sendMessage(\n INSPECTOR_COMMAND_TYPES.SEND_APDU,\n JSON.stringify({ sessionId, apdu, requestId }),\n );\n return requestId;\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,2BAAAA,MACK,gDAKA,SAASC,EAAwBC,EAAsB,CAC5D,MAAO,CACL,sBAAuB,IACrBA,EAAU,YACRF,EAAwB,wBACxB,IACF,EACF,qBAAsB,IACpBE,EAAU,YACRF,EAAwB,uBACxB,IACF,EACF,wBAAyB,IACvBE,EAAU,YAAYF,EAAwB,kBAAmB,IAAI,EACvE,uBAAwB,IACtBE,EAAU,YAAYF,EAAwB,iBAAkB,IAAI,EACtE,qBAAsB,CACpBG,EACAC,IAKAF,EAAU,YACRF,EAAwB,eACxB,KAAK,UAAU,CAAE,SAAAG,EAAU,wBAAAC,CAAwB,CAAC,CACtD,CACJ,CACF,CAKO,SAASC,EAAuBH,EAAsB,CAC3D,MAAO,CACL,mBAAoB,IAClBA,EAAU,YAAYF,EAAwB,aAAc,IAAI,EAClE,mBAAqBM,GACnBJ,EAAU,YACRF,EAAwB,aACxB,KAAK,UAAU,CAAE,SAAUM,CAAM,CAAC,CACpC,CACJ,CACF,CAEA,IAAIC,EAAqB,EAKlB,SAASC,EAAmBN,EAAsB,CACvD,MAAO,CACL,gBAAiB,CAACO,EAAmBC,IAA4B,CAC/D,MAAMC,EAAY,QAAQ,EAAEJ,CAAkB,GAExCK,EACJF,EAAQ,MAAM,SAAS,GAAG,IAAKG,GAAS,SAASA,EAAM,EAAE,CAAC,GAAK,CAAC,EAClE,OAAAX,EAAU,YACRF,EAAwB,UACxB,KAAK,UAAU,CAAE,UAAAS,EAAW,KAAAG,EAAM,UAAAD,CAAU,CAAC,CAC/C,EACOA,CACT,CACF,CACF",
|
|
6
|
+
"names": ["INSPECTOR_COMMAND_TYPES", "createDiscoveryCommands", "connector", "deviceId", "sessionRefresherOptions", "createProviderCommands", "value", "apduRequestCounter", "createApduCommands", "sessionId", "apduHex", "requestId", "apdu", "byte"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{mapConnectorMessageToLogData as n}from"../screens/logger/mapConnectorMessageToLogData";function i(t,o){try{const{module:e}=JSON.parse(t);o(s=>new Set([...s,e]))}catch(e){console.error("Failed to parse moduleConnected payload",e)}}function c(t,o,e){const s=n({type:t,payload:o});return s!==null?(e(a=>[...a,s]),!0):!1}function p(t,o){try{const e=JSON.parse(t);o(e)}catch(e){console.error("Failed to parse connectedDevicesUpdate payload",e)}}function d(t,o){try{const{sessionId:e,state:s}=JSON.parse(t);o(a=>new Map(a).set(e,s))}catch(e){console.error("Failed to parse deviceSessionStateUpdate payload",e)}}function l(t,o){try{const e=JSON.parse(t);o(e)}catch(e){console.error("Failed to parse discoveredDevicesUpdate payload",e)}}function v(t,o){try{const{provider:e}=JSON.parse(t);o(e)}catch(e){console.error("Failed to parse providerValue payload",e)}}function S(t,o){try{const e=JSON.parse(t);o(s=>new Map(s).set(e.requestId,e))}catch(e){console.error("Failed to parse apduResponse payload",e)}}export{S as handleApduResponse,p as handleConnectedDevicesUpdate,d as handleDeviceSessionStateUpdate,l as handleDiscoveredDevicesUpdate,c as handleLogMessage,i as handleModuleConnected,v as handleProviderValue};
|
|
2
|
+
//# sourceMappingURL=connectorMessageHandlers.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/hooks/connectorMessageHandlers.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Dispatch, SetStateAction } from \"react\";\nimport {\n type ConnectedDevice,\n type DeviceSessionState,\n type DiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { type DevToolsModule } from \"@ledgerhq/device-management-kit-devtools-core\";\n\nimport { mapConnectorMessageToLogData } from \"../screens/logger/mapConnectorMessageToLogData\";\nimport { type LogData } from \"../screens/logger/types\";\nimport { type ApduResponse } from \"./useConnectorMessages\";\n\n/**\n * Handle module connected handshake message.\n */\nexport function handleModuleConnected(\n payload: string,\n setConnectedModules: Dispatch<SetStateAction<Set<DevToolsModule>>>,\n): void {\n try {\n const { module } = JSON.parse(payload) as { module: DevToolsModule };\n setConnectedModules((prev) => new Set([...prev, module]));\n } catch (e) {\n console.error(\"Failed to parse moduleConnected payload\", e);\n }\n}\n\n/**\n * Handle log message. Returns true if message was a log, false otherwise.\n */\nexport function handleLogMessage(\n type: string,\n payload: string,\n setLogs: Dispatch<SetStateAction<LogData[]>>,\n): boolean {\n const logData = mapConnectorMessageToLogData({ type, payload });\n if (logData !== null) {\n setLogs((prev) => [...prev, logData]);\n return true;\n }\n return false;\n}\n\n/**\n * Handle connected devices update message.\n */\nexport function handleConnectedDevicesUpdate(\n payload: string,\n setConnectedDevices: Dispatch<SetStateAction<ConnectedDevice[]>>,\n): void {\n try {\n const devices = JSON.parse(payload) as ConnectedDevice[];\n setConnectedDevices(devices);\n } catch (e) {\n console.error(\"Failed to parse connectedDevicesUpdate payload\", e);\n }\n}\n\n/**\n * Handle device session state update message.\n */\nexport function handleDeviceSessionStateUpdate(\n payload: string,\n setSessionStates: Dispatch<SetStateAction<Map<string, DeviceSessionState>>>,\n): void {\n try {\n const { sessionId, state } = JSON.parse(payload) as {\n sessionId: string;\n state: DeviceSessionState;\n };\n setSessionStates((prev) => new Map(prev).set(sessionId, state));\n } catch (e) {\n console.error(\"Failed to parse deviceSessionStateUpdate payload\", e);\n }\n}\n\n/**\n * Handle discovered devices update message.\n */\nexport function handleDiscoveredDevicesUpdate(\n payload: string,\n setDiscoveredDevices: Dispatch<SetStateAction<DiscoveredDevice[]>>,\n): void {\n try {\n const devices = JSON.parse(payload) as DiscoveredDevice[];\n setDiscoveredDevices(devices);\n } catch (e) {\n console.error(\"Failed to parse discoveredDevicesUpdate payload\", e);\n }\n}\n\n/**\n * Handle provider value response message.\n */\nexport function handleProviderValue(\n payload: string,\n setProviderValue: Dispatch<SetStateAction<number | null>>,\n): void {\n try {\n const { provider } = JSON.parse(payload) as { provider: number };\n setProviderValue(provider);\n } catch (e) {\n console.error(\"Failed to parse providerValue payload\", e);\n }\n}\n\n/**\n * Handle APDU response message.\n */\nexport function handleApduResponse(\n payload: string,\n setApduResponses: Dispatch<SetStateAction<Map<string, ApduResponse>>>,\n): void {\n try {\n const response = JSON.parse(payload) as ApduResponse;\n setApduResponses((prev) => new Map(prev).set(response.requestId, response));\n } catch (e) {\n console.error(\"Failed to parse apduResponse payload\", e);\n }\n}\n"],
|
|
5
|
+
"mappings": "AAQA,OAAS,gCAAAA,MAAoC,iDAOtC,SAASC,EACdC,EACAC,EACM,CACN,GAAI,CACF,KAAM,CAAE,OAAAC,CAAO,EAAI,KAAK,MAAMF,CAAO,EACrCC,EAAqBE,GAAS,IAAI,IAAI,CAAC,GAAGA,EAAMD,CAAM,CAAC,CAAC,CAC1D,OAAS,EAAG,CACV,QAAQ,MAAM,0CAA2C,CAAC,CAC5D,CACF,CAKO,SAASE,EACdC,EACAL,EACAM,EACS,CACT,MAAMC,EAAUT,EAA6B,CAAE,KAAAO,EAAM,QAAAL,CAAQ,CAAC,EAC9D,OAAIO,IAAY,MACdD,EAASH,GAAS,CAAC,GAAGA,EAAMI,CAAO,CAAC,EAC7B,IAEF,EACT,CAKO,SAASC,EACdR,EACAS,EACM,CACN,GAAI,CACF,MAAMC,EAAU,KAAK,MAAMV,CAAO,EAClCS,EAAoBC,CAAO,CAC7B,OAAS,EAAG,CACV,QAAQ,MAAM,iDAAkD,CAAC,CACnE,CACF,CAKO,SAASC,EACdX,EACAY,EACM,CACN,GAAI,CACF,KAAM,CAAE,UAAAC,EAAW,MAAAC,CAAM,EAAI,KAAK,MAAMd,CAAO,EAI/CY,EAAkBT,GAAS,IAAI,IAAIA,CAAI,EAAE,IAAIU,EAAWC,CAAK,CAAC,CAChE,OAAS,EAAG,CACV,QAAQ,MAAM,mDAAoD,CAAC,CACrE,CACF,CAKO,SAASC,EACdf,EACAgB,EACM,CACN,GAAI,CACF,MAAMN,EAAU,KAAK,MAAMV,CAAO,EAClCgB,EAAqBN,CAAO,CAC9B,OAAS,EAAG,CACV,QAAQ,MAAM,kDAAmD,CAAC,CACpE,CACF,CAKO,SAASO,EACdjB,EACAkB,EACM,CACN,GAAI,CACF,KAAM,CAAE,SAAAC,CAAS,EAAI,KAAK,MAAMnB,CAAO,EACvCkB,EAAiBC,CAAQ,CAC3B,OAAS,EAAG,CACV,QAAQ,MAAM,wCAAyC,CAAC,CAC1D,CACF,CAKO,SAASC,EACdpB,EACAqB,EACM,CACN,GAAI,CACF,MAAMC,EAAW,KAAK,MAAMtB,CAAO,EACnCqB,EAAkBlB,GAAS,IAAI,IAAIA,CAAI,EAAE,IAAImB,EAAS,UAAWA,CAAQ,CAAC,CAC5E,OAAS,EAAG,CACV,QAAQ,MAAM,uCAAwC,CAAC,CACzD,CACF",
|
|
6
|
+
"names": ["mapConnectorMessageToLogData", "handleModuleConnected", "payload", "setConnectedModules", "module", "prev", "handleLogMessage", "type", "setLogs", "logData", "handleConnectedDevicesUpdate", "setConnectedDevices", "devices", "handleDeviceSessionStateUpdate", "setSessionStates", "sessionId", "state", "handleDiscoveredDevicesUpdate", "setDiscoveredDevices", "handleProviderValue", "setProviderValue", "provider", "handleApduResponse", "setApduResponses", "response"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useCallback as c,useEffect as K,useMemo as v,useState as e}from"react";import{DEVTOOLS_MODULES as l,INSPECTOR_MESSAGE_TYPES as a,MODULE_CONNECTED_MESSAGE_TYPE as j}from"@ledgerhq/device-management-kit-devtools-core";import{createApduCommands as z,createDiscoveryCommands as B,createProviderCommands as F}from"./commandDispatcher";import{handleApduResponse as J,handleConnectedDevicesUpdate as Q,handleDeviceSessionStateUpdate as W,handleDiscoveredDevicesUpdate as X,handleLogMessage as Z,handleModuleConnected as $,handleProviderValue as ee}from"./connectorMessageHandlers";function ie(i){const[C,M]=e([]),[S,E]=e([]),[b,D]=e([]),[g,L]=e(new Set),[A,P]=e([]),[f,R]=e(new Map),[I,r]=e([]),[T,p]=e(!1),[_,u]=e(!1),[O,h]=e(null),[V,U]=e(new Map),o=v(()=>({...i,sendMessage:(d,t)=>{i.sendMessage(d,t),E(s=>[...s,{type:d,payload:t}])}}),[i]);K(()=>{const{unsubscribe:d}=i.listenToMessages((t,s)=>{switch(M(H=>[...H,{type:t,payload:s}]),t){case j:$(s,L);break;case a.CONNECTED_DEVICES_UPDATE:Q(s,P);break;case a.DEVICE_SESSION_STATE_UPDATE:W(s,R);break;case a.DISCOVERED_DEVICES_UPDATE:X(s,r);break;case a.PROVIDER_VALUE:ee(s,h);break;case a.APDU_RESPONSE:J(s,U);break;default:Z(t,s,D);break}});return d},[i]);const n=v(()=>B(o),[o]),m=v(()=>F(o),[o]),k=v(()=>z(o),[o]),N=c(()=>{p(!0),r([]),n.startListeningCommand()},[n]),y=c(()=>{p(!1),r([]),n.stopListeningCommand()},[n]),w=c(()=>{u(!0),r([]),n.startDiscoveringCommand()},[n]),x=c(()=>{u(!1),r([]),n.stopDiscoveringCommand()},[n]),G=c(()=>{D([])},[]),Y=g.has(l.LOGGER),q=g.has(l.DMK_INSPECTOR);return{receivedMessages:C,sentMessages:S,logs:b,connectedModules:g,connectedDevices:A,sessionStates:f,discoveredDevices:I,isListening:T,isActivelyDiscovering:_,isLoggerConnected:Y,isInspectorConnected:q,providerValue:O,apduResponses:V,sendMessage:o.sendMessage,clearLogs:G,startListening:N,stopListening:y,startDiscovering:w,stopDiscovering:x,connectDevice:n.connectDeviceCommand,getProvider:m.getProviderCommand,setProvider:m.setProviderCommand,sendApdu:k.sendApduCommand}}export{ie as useConnectorMessages};
|
|
2
|
+
//# sourceMappingURL=useConnectorMessages.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/hooks/useConnectorMessages.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * @file useConnectorMessages hook\n *\n * Central hook for managing DevTools connector state and actions.\n * Handles all communication between the Dashboard UI and the client app\n * via the connector (WebSocket or Rozenite).\n */\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n type ConnectedDevice,\n type DeviceSessionState,\n type DiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n type Connector,\n DEVTOOLS_MODULES,\n type DevToolsModule,\n INSPECTOR_MESSAGE_TYPES,\n MODULE_CONNECTED_MESSAGE_TYPE,\n} from \"@ledgerhq/device-management-kit-devtools-core\";\n\nimport { type Message } from \"../PluginEvents\";\nimport { type LogData } from \"../screens/logger/types\";\nimport {\n createApduCommands,\n createDiscoveryCommands,\n createProviderCommands,\n} from \"./commandDispatcher\";\nimport {\n handleApduResponse,\n handleConnectedDevicesUpdate,\n handleDeviceSessionStateUpdate,\n handleDiscoveredDevicesUpdate,\n handleLogMessage,\n handleModuleConnected,\n handleProviderValue,\n} from \"./connectorMessageHandlers\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ApduResponse = {\n requestId: string;\n success: boolean;\n statusCode?: number[];\n data?: number[];\n error?: string;\n};\n\nexport type ConnectorMessagesState = {\n receivedMessages: Message[];\n sentMessages: Message[];\n logs: LogData[];\n connectedModules: Set<DevToolsModule>;\n connectedDevices: ConnectedDevice[];\n sessionStates: Map<string, DeviceSessionState>;\n discoveredDevices: DiscoveredDevice[];\n isListening: boolean;\n isActivelyDiscovering: boolean;\n isLoggerConnected: boolean;\n isInspectorConnected: boolean;\n providerValue: number | null;\n apduResponses: Map<string, ApduResponse>;\n sendMessage: (type: string, payload: string) => void;\n clearLogs: () => void;\n startListening: () => void;\n stopListening: () => void;\n startDiscovering: () => void;\n stopDiscovering: () => void;\n connectDevice: (\n deviceId: string,\n sessionRefresherOptions?: {\n isRefresherDisabled: boolean;\n pollingInterval?: number;\n },\n ) => void;\n getProvider: () => void;\n setProvider: (value: number) => void;\n sendApdu: (sessionId: string, apduHex: string) => string;\n};\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Central hook for managing DevTools connector state and communication.\n *\n * This hook:\n * - Listens to messages from the connector and dispatches them to handlers\n * - Tracks all sent/received messages for debugging\n * - Manages device discovery, sessions, and DMK configuration state\n * - Provides action functions to send commands to the inspector module\n *\n * @param connector - The connector instance (WebSocket or Rozenite)\n * @returns State and actions for the Dashboard UI\n */\nexport function useConnectorMessages(\n connector: Connector,\n): ConnectorMessagesState {\n // === State ===\n const [receivedMessages, setReceivedMessages] = useState<Message[]>([]);\n const [sentMessages, setSentMessages] = useState<Message[]>([]);\n const [logs, setLogs] = useState<LogData[]>([]);\n const [connectedModules, setConnectedModules] = useState<Set<DevToolsModule>>(\n new Set(),\n );\n const [connectedDevices, setConnectedDevices] = useState<ConnectedDevice[]>(\n [],\n );\n const [sessionStates, setSessionStates] = useState<\n Map<string, DeviceSessionState>\n >(new Map());\n const [discoveredDevices, setDiscoveredDevices] = useState<\n DiscoveredDevice[]\n >([]);\n const [isListening, setIsListening] = useState(false);\n const [isActivelyDiscovering, setIsActivelyDiscovering] = useState(false);\n const [providerValue, setProviderValue] = useState<number | null>(null);\n const [apduResponses, setApduResponses] = useState<Map<string, ApduResponse>>(\n new Map(),\n );\n\n // === Tracked Connector (keeps all sent messages in state) ===\n const trackedConnector: Connector = useMemo(\n () => ({\n ...connector,\n sendMessage: (type: string, payload: string) => {\n connector.sendMessage(type, payload);\n setSentMessages((prev) => [...prev, { type, payload }]);\n },\n }),\n [connector],\n );\n\n // === Message Listener ===\n useEffect(() => {\n const { unsubscribe } = connector.listenToMessages((type, payload) => {\n setReceivedMessages((prev) => [...prev, { type, payload }]);\n\n switch (type) {\n case MODULE_CONNECTED_MESSAGE_TYPE:\n handleModuleConnected(payload, setConnectedModules);\n break;\n case INSPECTOR_MESSAGE_TYPES.CONNECTED_DEVICES_UPDATE:\n handleConnectedDevicesUpdate(payload, setConnectedDevices);\n break;\n case INSPECTOR_MESSAGE_TYPES.DEVICE_SESSION_STATE_UPDATE:\n handleDeviceSessionStateUpdate(payload, setSessionStates);\n break;\n case INSPECTOR_MESSAGE_TYPES.DISCOVERED_DEVICES_UPDATE:\n handleDiscoveredDevicesUpdate(payload, setDiscoveredDevices);\n break;\n case INSPECTOR_MESSAGE_TYPES.PROVIDER_VALUE:\n handleProviderValue(payload, setProviderValue);\n break;\n case INSPECTOR_MESSAGE_TYPES.APDU_RESPONSE:\n handleApduResponse(payload, setApduResponses);\n break;\n default:\n // Try to handle as log message\n handleLogMessage(type, payload, setLogs);\n break;\n }\n });\n return unsubscribe;\n }, [connector]);\n\n // === Commands (using tracked connector to log all sent messages) ===\n const discoveryCommands = useMemo(\n () => createDiscoveryCommands(trackedConnector),\n [trackedConnector],\n );\n const providerCommands = useMemo(\n () => createProviderCommands(trackedConnector),\n [trackedConnector],\n );\n const apduCommands = useMemo(\n () => createApduCommands(trackedConnector),\n [trackedConnector],\n );\n\n // === Wrapped Commands (with local state updates) ===\n const startListening = useCallback(() => {\n setIsListening(true);\n setDiscoveredDevices([]);\n discoveryCommands.startListeningCommand();\n }, [discoveryCommands]);\n\n const stopListening = useCallback(() => {\n setIsListening(false);\n setDiscoveredDevices([]);\n discoveryCommands.stopListeningCommand();\n }, [discoveryCommands]);\n\n const startDiscovering = useCallback(() => {\n setIsActivelyDiscovering(true);\n setDiscoveredDevices([]);\n discoveryCommands.startDiscoveringCommand();\n }, [discoveryCommands]);\n\n const stopDiscovering = useCallback(() => {\n setIsActivelyDiscovering(false);\n setDiscoveredDevices([]);\n discoveryCommands.stopDiscoveringCommand();\n }, [discoveryCommands]);\n\n const clearLogs = useCallback(() => {\n setLogs([]);\n }, []);\n\n // === Derived State ===\n const isLoggerConnected = connectedModules.has(DEVTOOLS_MODULES.LOGGER);\n const isInspectorConnected = connectedModules.has(\n DEVTOOLS_MODULES.DMK_INSPECTOR,\n );\n\n return {\n // State\n receivedMessages,\n sentMessages,\n logs,\n connectedModules,\n connectedDevices,\n sessionStates,\n discoveredDevices,\n isListening,\n isActivelyDiscovering,\n isLoggerConnected,\n isInspectorConnected,\n providerValue,\n apduResponses,\n // Actions\n sendMessage: trackedConnector.sendMessage,\n clearLogs,\n startListening,\n stopListening,\n startDiscovering,\n stopDiscovering,\n connectDevice: discoveryCommands.connectDeviceCommand,\n getProvider: providerCommands.getProviderCommand,\n setProvider: providerCommands.setProviderCommand,\n sendApdu: apduCommands.sendApduCommand,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useCallback", "useEffect", "useMemo", "useState", "DEVTOOLS_MODULES", "INSPECTOR_MESSAGE_TYPES", "MODULE_CONNECTED_MESSAGE_TYPE", "createApduCommands", "createDiscoveryCommands", "createProviderCommands", "handleApduResponse", "handleConnectedDevicesUpdate", "handleDeviceSessionStateUpdate", "handleDiscoveredDevicesUpdate", "handleLogMessage", "handleModuleConnected", "handleProviderValue", "useConnectorMessages", "connector", "receivedMessages", "setReceivedMessages", "sentMessages", "setSentMessages", "logs", "setLogs", "connectedModules", "setConnectedModules", "connectedDevices", "setConnectedDevices", "sessionStates", "setSessionStates", "discoveredDevices", "setDiscoveredDevices", "isListening", "setIsListening", "isActivelyDiscovering", "setIsActivelyDiscovering", "providerValue", "setProviderValue", "apduResponses", "setApduResponses", "trackedConnector", "type", "payload", "prev", "unsubscribe", "discoveryCommands", "providerCommands", "apduCommands", "startListening", "stopListening", "startDiscovering", "stopDiscovering", "clearLogs", "isLoggerConnected", "isInspectorConnected"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useMemo as r,useState as d}from"react";import{jsx as e,jsxs as o}from"react/jsx-runtime";const S=({sentMessages:s,receivedMessages:l,sendMessage:p})=>{const[i,n]=d(""),[a,v]=d(""),c=r(()=>[...new Set(s.map(t=>t.type))],[s]),u=r(()=>[...new Set(l.map(t=>t.type))],[l]),f=r(()=>i?s.filter(t=>t.type===i):s,[s,i]),x=r(()=>a?l.filter(t=>t.type===a):l,[l,a]);return o("div",{style:{display:"flex",height:"100vh"},children:[o("div",{style:{flex:1,borderRight:"1px solid #ddd",padding:"16px",boxSizing:"border-box",display:"flex",flexDirection:"column"},children:[e("h2",{children:"sent messages"}),e(m,{onSend:p}),e(g,{types:c,value:i,onChange:n,style:{marginTop:16}}),e("div",{style:{marginTop:16,flex:1,overflowY:"auto"},children:e("ul",{style:{margin:0,padding:0,listStyle:"none"},children:f.map((t,y)=>o("li",{style:{marginBottom:4},children:[o("strong",{children:[t.type,":"]})," ",t.payload]},y))})})]}),o("div",{style:{flex:1,padding:"16px",boxSizing:"border-box",display:"flex",flexDirection:"column"},children:[e("h2",{children:"received messages"}),e(g,{types:u,value:a,onChange:v}),e("div",{style:{marginTop:16,flex:1,overflowY:"auto"},children:e("ul",{style:{margin:0,padding:0,listStyle:"none"},children:x.map((t,y)=>o("li",{style:{marginBottom:4},children:[o("strong",{children:[t.type,":"]})," ",t.payload]},y))})})]})]})},g=({types:s,value:l,onChange:p,style:i})=>o("div",{style:{display:"flex",alignItems:"center",gap:8,...i},children:[e("label",{children:"Filter by type:"}),o("select",{value:l,onChange:n=>p(n.target.value),children:[o("option",{value:"",children:["All (",s.length," types)"]}),s.map(n=>e("option",{value:n,children:n},n))]}),l&&e("button",{onClick:()=>p(""),style:{padding:"2px 8px"},children:"Clear"})]}),m=({onSend:s})=>{const[l,p]=d(""),[i,n]=d("");return o("div",{style:{display:"flex",gap:"8px",alignItems:"center"},children:[e("input",{type:"text",value:l,placeholder:"type",onChange:a=>p(a.target.value),style:{flex:1}}),e("input",{type:"text",value:i,placeholder:"payload",onChange:a=>n(a.target.value),style:{flex:2}}),e("button",{onClick:()=>{l&&i&&(s(l,i),p(""),n(""))},children:"sendMessage"})]})};export{S as DebugDevTools};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/debugDevTools/index.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * @file DebugDevTools screen\n *\n * A debugging tool for DevTools developers. Displays raw sent and received\n * connector messages, allows filtering by message type, and provides a way\n * to manually send custom messages for testing.\n */\n\nimport React, { useMemo, useState } from \"react\";\n\nimport { type Message } from \"../../shared/PluginEvents\";\n\ninterface DebugDevToolsMessageProps {\n sentMessages: Message[];\n receivedMessages: Message[];\n sendMessage: (type: string, payload: string) => void;\n}\n\nexport const DebugDevTools: React.FC<DebugDevToolsMessageProps> = ({\n sentMessages,\n receivedMessages,\n sendMessage,\n}) => {\n const [sentFilter, setSentFilter] = useState(\"\");\n const [receivedFilter, setReceivedFilter] = useState(\"\");\n\n const sentMessageTypes = useMemo(\n () => [...new Set(sentMessages.map((m) => m.type))],\n [sentMessages],\n );\n const receivedMessageTypes = useMemo(\n () => [...new Set(receivedMessages.map((m) => m.type))],\n [receivedMessages],\n );\n\n const filteredSentMessages = useMemo(\n () =>\n sentFilter\n ? sentMessages.filter((m) => m.type === sentFilter)\n : sentMessages,\n [sentMessages, sentFilter],\n );\n\n const filteredReceivedMessages = useMemo(\n () =>\n receivedFilter\n ? receivedMessages.filter((m) => m.type === receivedFilter)\n : receivedMessages,\n [receivedMessages, receivedFilter],\n );\n\n return (\n <div style={{ display: \"flex\", height: \"100vh\" }}>\n {/* Left Pane: Sent Messages */}\n <div\n style={{\n flex: 1,\n borderRight: \"1px solid #ddd\",\n padding: \"16px\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <h2>sent messages</h2>\n <MessageSender onSend={sendMessage} />\n <MessageTypeFilter\n types={sentMessageTypes}\n value={sentFilter}\n onChange={setSentFilter}\n style={{ marginTop: 16 }}\n />\n <div style={{ marginTop: 16, flex: 1, overflowY: \"auto\" }}>\n <ul style={{ margin: 0, padding: 0, listStyle: \"none\" }}>\n {filteredSentMessages.map((msg, idx) => (\n <li key={idx} style={{ marginBottom: 4 }}>\n <strong>{msg.type}:</strong> {msg.payload}\n </li>\n ))}\n </ul>\n </div>\n </div>\n {/* Right Pane: Received Messages */}\n <div\n style={{\n flex: 1,\n padding: \"16px\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <h2>received messages</h2>\n <MessageTypeFilter\n types={receivedMessageTypes}\n value={receivedFilter}\n onChange={setReceivedFilter}\n />\n <div style={{ marginTop: 16, flex: 1, overflowY: \"auto\" }}>\n <ul style={{ margin: 0, padding: 0, listStyle: \"none\" }}>\n {filteredReceivedMessages.map((msg, idx) => (\n <li key={idx} style={{ marginBottom: 4 }}>\n <strong>{msg.type}:</strong> {msg.payload}\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n );\n};\n\ninterface MessageTypeFilterProps {\n types: string[];\n value: string;\n onChange: (value: string) => void;\n style?: React.CSSProperties;\n}\n\nconst MessageTypeFilter: React.FC<MessageTypeFilterProps> = ({\n types,\n value,\n onChange,\n style,\n}) => (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, ...style }}>\n <label>Filter by type:</label>\n <select value={value} onChange={(e) => onChange(e.target.value)}>\n <option value=\"\">All ({types.length} types)</option>\n {types.map((type) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n {value && (\n <button onClick={() => onChange(\"\")} style={{ padding: \"2px 8px\" }}>\n Clear\n </button>\n )}\n </div>\n);\n\ninterface MessageSenderProps {\n onSend: (type: string, payload: string) => void;\n}\n\nconst MessageSender: React.FC<MessageSenderProps> = ({ onSend }) => {\n const [type, setType] = useState(\"\");\n const [payload, setPayload] = useState(\"\");\n\n return (\n <div style={{ display: \"flex\", gap: \"8px\", alignItems: \"center\" }}>\n <input\n type=\"text\"\n value={type}\n placeholder=\"type\"\n onChange={(e) => setType(e.target.value)}\n style={{ flex: 1 }}\n />\n <input\n type=\"text\"\n value={payload}\n placeholder=\"payload\"\n onChange={(e) => setPayload(e.target.value)}\n style={{ flex: 2 }}\n />\n <button\n onClick={() => {\n if (type && payload) {\n onSend(type, payload);\n setType(\"\");\n setPayload(\"\");\n }\n }}\n >\n sendMessage\n </button>\n </div>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useMemo", "useState", "jsx", "jsxs", "DebugDevTools", "sentMessages", "receivedMessages", "sendMessage", "sentFilter", "setSentFilter", "receivedFilter", "setReceivedFilter", "sentMessageTypes", "m", "receivedMessageTypes", "filteredSentMessages", "filteredReceivedMessages", "MessageSender", "MessageTypeFilter", "msg", "idx", "types", "value", "onChange", "style", "e", "type", "onSend", "setType", "payload", "setPayload"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import{useState as i}from"react";import o from"styled-components";import{Fragment as u,jsx as e,jsxs as r}from"react/jsx-runtime";const h=o.div`
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
gap: 8px;
|
|
5
|
+
margin-top: 12px;
|
|
6
|
+
padding-top: 12px;
|
|
7
|
+
border-top: 1px solid #eee;
|
|
8
|
+
`,I=o.div`
|
|
9
|
+
display: flex;
|
|
10
|
+
align-items: center;
|
|
11
|
+
gap: 8px;
|
|
12
|
+
cursor: pointer;
|
|
13
|
+
user-select: none;
|
|
14
|
+
`,A=o.span`
|
|
15
|
+
font-size: 12px;
|
|
16
|
+
color: #666;
|
|
17
|
+
transition: transform 0.15s ease;
|
|
18
|
+
transform: rotate(${({$expanded:t})=>t?"90deg":"0deg"});
|
|
19
|
+
`,S=o.span`
|
|
20
|
+
font-size: 12px;
|
|
21
|
+
font-weight: 600;
|
|
22
|
+
color: #666;
|
|
23
|
+
`,$=o.div`
|
|
24
|
+
display: ${({$expanded:t})=>t?"flex":"none"};
|
|
25
|
+
flex-direction: column;
|
|
26
|
+
gap: 8px;
|
|
27
|
+
`,v=o.div`
|
|
28
|
+
display: flex;
|
|
29
|
+
gap: 8px;
|
|
30
|
+
align-items: center;
|
|
31
|
+
`,D=o.input`
|
|
32
|
+
flex: 1;
|
|
33
|
+
padding: 6px 8px;
|
|
34
|
+
border: 1px solid #ddd;
|
|
35
|
+
border-radius: 4px;
|
|
36
|
+
font-size: 12px;
|
|
37
|
+
font-family: monospace;
|
|
38
|
+
|
|
39
|
+
&:focus {
|
|
40
|
+
outline: none;
|
|
41
|
+
border-color: #2196f3;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
&::placeholder {
|
|
45
|
+
color: #999;
|
|
46
|
+
}
|
|
47
|
+
`,k=o.button`
|
|
48
|
+
padding: 6px 12px;
|
|
49
|
+
border: none;
|
|
50
|
+
border-radius: 4px;
|
|
51
|
+
background: #2196f3;
|
|
52
|
+
color: white;
|
|
53
|
+
font-size: 12px;
|
|
54
|
+
cursor: pointer;
|
|
55
|
+
transition: all 0.15s ease;
|
|
56
|
+
|
|
57
|
+
&:hover:not(:disabled) {
|
|
58
|
+
background: #1976d2;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
&:disabled {
|
|
62
|
+
opacity: 0.5;
|
|
63
|
+
cursor: not-allowed;
|
|
64
|
+
}
|
|
65
|
+
`,w=o.div`
|
|
66
|
+
padding: 8px;
|
|
67
|
+
border-radius: 4px;
|
|
68
|
+
background: ${({$success:t})=>t?"#e8f5e9":"#ffebee"};
|
|
69
|
+
border: 1px solid ${({$success:t})=>t?"#c8e6c9":"#ffcdd2"};
|
|
70
|
+
font-size: 12px;
|
|
71
|
+
font-family: monospace;
|
|
72
|
+
`,l=o.span`
|
|
73
|
+
font-weight: 600;
|
|
74
|
+
color: #333;
|
|
75
|
+
`,c=o.span`
|
|
76
|
+
color: #555;
|
|
77
|
+
word-break: break-all;
|
|
78
|
+
`,L=({sessionId:t,onSend:b,responses:m})=>{const[d,R]=i(!1),[a,C]=i(""),[x,y]=i(null),g=()=>{if(!a.trim())return;const n=a.replace(/\s/g,"").toUpperCase();if(!/^[0-9A-F]*$/.test(n)||n.length%2!==0){alert("Invalid hex string. Please enter a valid APDU in hex format (e.g., E0C4000000)");return}const p=b(t,n);y(p)},s=x?m.get(x):null,f=n=>!n||!Array.isArray(n)?"":n.map(p=>p.toString(16).padStart(2,"0").toUpperCase()).join(" ");return r(h,{children:[r(I,{onClick:()=>R(!d),children:[e(A,{$expanded:d,children:"\u25B6"}),e(S,{children:"Send APDU"})]}),r($,{$expanded:d,children:[r(v,{children:[e(D,{type:"text",placeholder:"APDU hex (e.g., E0C4000000)",value:a,onChange:n=>C(n.target.value),onKeyDown:n=>n.key==="Enter"&&g()}),e(k,{onClick:g,disabled:!a.trim(),children:"Send"})]}),s&&e(w,{$success:s.success,children:s.success?r(u,{children:[s.data&&s.data.length>0&&r(u,{children:[e(l,{children:"Data: "}),e(c,{children:f(s.data)}),e("br",{})]}),e(l,{children:"Status: "}),e(c,{children:f(s.statusCode)})]}):r(u,{children:[e(l,{children:"Error: "}),e(c,{children:s.error})]})})]})]})};export{L as ApduSender};
|
|
79
|
+
//# sourceMappingURL=ApduSender.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/inspector/ApduSender.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nimport { type ApduResponse } from \"../../hooks/useConnectorMessages\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid #eee;\n`;\n\nconst Header = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n`;\n\nconst ToggleIcon = styled.span<{ $expanded: boolean }>`\n font-size: 12px;\n color: #666;\n transition: transform 0.15s ease;\n transform: rotate(${({ $expanded }) => ($expanded ? \"90deg\" : \"0deg\")});\n`;\n\nconst Title = styled.span`\n font-size: 12px;\n font-weight: 600;\n color: #666;\n`;\n\nconst Content = styled.div<{ $expanded: boolean }>`\n display: ${({ $expanded }) => ($expanded ? \"flex\" : \"none\")};\n flex-direction: column;\n gap: 8px;\n`;\n\nconst InputRow = styled.div`\n display: flex;\n gap: 8px;\n align-items: center;\n`;\n\nconst Input = styled.input`\n flex: 1;\n padding: 6px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n font-family: monospace;\n\n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n\n &::placeholder {\n color: #999;\n }\n`;\n\nconst Button = styled.button`\n padding: 6px 12px;\n border: none;\n border-radius: 4px;\n background: #2196f3;\n color: white;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover:not(:disabled) {\n background: #1976d2;\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\nconst ResponseContainer = styled.div<{ $success: boolean }>`\n padding: 8px;\n border-radius: 4px;\n background: ${({ $success }) => ($success ? \"#e8f5e9\" : \"#ffebee\")};\n border: 1px solid ${({ $success }) => ($success ? \"#c8e6c9\" : \"#ffcdd2\")};\n font-size: 12px;\n font-family: monospace;\n`;\n\nconst ResponseLabel = styled.span`\n font-weight: 600;\n color: #333;\n`;\n\nconst ResponseData = styled.span`\n color: #555;\n word-break: break-all;\n`;\n\ntype ApduSenderProps = {\n sessionId: string;\n onSend: (sessionId: string, apduHex: string) => string;\n responses: Map<string, ApduResponse>;\n};\n\nexport const ApduSender: React.FC<ApduSenderProps> = ({\n sessionId,\n onSend,\n responses,\n}) => {\n const [expanded, setExpanded] = useState(false);\n const [apduInput, setApduInput] = useState(\"\");\n const [lastRequestId, setLastRequestId] = useState<string | null>(null);\n\n const handleSend = () => {\n if (!apduInput.trim()) return;\n // Remove spaces and validate hex\n const cleanHex = apduInput.replace(/\\s/g, \"\").toUpperCase();\n if (!/^[0-9A-F]*$/.test(cleanHex) || cleanHex.length % 2 !== 0) {\n alert(\n \"Invalid hex string. Please enter a valid APDU in hex format (e.g., E0C4000000)\",\n );\n return;\n }\n const requestId = onSend(sessionId, cleanHex);\n setLastRequestId(requestId);\n };\n\n const lastResponse = lastRequestId ? responses.get(lastRequestId) : null;\n\n const formatBytes = (bytes: number[] | undefined): string => {\n if (!bytes || !Array.isArray(bytes)) return \"\";\n return bytes\n .map((b) => b.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n };\n\n return (\n <Container>\n <Header onClick={() => setExpanded(!expanded)}>\n <ToggleIcon $expanded={expanded}>\u25B6</ToggleIcon>\n <Title>Send APDU</Title>\n </Header>\n <Content $expanded={expanded}>\n <InputRow>\n <Input\n type=\"text\"\n placeholder=\"APDU hex (e.g., E0C4000000)\"\n value={apduInput}\n onChange={(e) => setApduInput(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleSend()}\n />\n <Button onClick={handleSend} disabled={!apduInput.trim()}>\n Send\n </Button>\n </InputRow>\n {lastResponse && (\n <ResponseContainer $success={lastResponse.success}>\n {lastResponse.success ? (\n <>\n {lastResponse.data && lastResponse.data.length > 0 && (\n <>\n <ResponseLabel>Data: </ResponseLabel>\n <ResponseData>\n {formatBytes(lastResponse.data)}\n </ResponseData>\n <br />\n </>\n )}\n <ResponseLabel>Status: </ResponseLabel>\n <ResponseData>\n {formatBytes(lastResponse.statusCode)}\n </ResponseData>\n </>\n ) : (\n <>\n <ResponseLabel>Error: </ResponseLabel>\n <ResponseData>{lastResponse.error}</ResponseData>\n </>\n )}\n </ResponseContainer>\n )}\n </Content>\n </Container>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useState", "styled", "Fragment", "jsx", "jsxs", "Container", "Header", "ToggleIcon", "$expanded", "Title", "Content", "InputRow", "Input", "Button", "ResponseContainer", "$success", "ResponseLabel", "ResponseData", "ApduSender", "sessionId", "onSend", "responses", "expanded", "setExpanded", "apduInput", "setApduInput", "lastRequestId", "setLastRequestId", "handleSend", "cleanHex", "requestId", "lastResponse", "formatBytes", "bytes", "b", "e"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ApduSender as u}from"./ApduSender";import{BadgeRow as S,Button as p,Card as l,CardBody as C,CardHeader as m,CardHeaderLeft as g,CardSection as f,CardTitle as T,SectionLabel as D,SmallText as a,StatusBadge as o}from"./styles";import{jsx as t,jsxs as n}from"react/jsx-runtime";const v=e=>e?e.deviceStatus!=="NOT CONNECTED":!0;function y(e){switch(e){case"CONNECTED":return"success";case"LOCKED":return"warning";case"BUSY":return"info";case"NOT CONNECTED":return"error";default:return"neutral"}}function w(e){switch(String(e)){case"ReadyWithSecureChannel":return"success";case"ReadyWithoutSecureChannel":return"info";case"Connected":return"neutral";default:return"neutral"}}function B(e){return String(e).replace(/([a-z])([A-Z])/g,"$1 $2")}const x=({device:e,state:r,onDisconnect:i,onSendApdu:c,apduResponses:d})=>{const s=v(r);return n(l,{$variant:s?"default":"disconnected",children:[n(m,{children:[n(g,{children:[t(T,{children:e.name||"Unknown Device"}),r&&t(o,{$variant:y(r.deviceStatus),children:r.deviceStatus})]}),s&&t(p,{$variant:"danger",onClick:i,children:"Disconnect"})]}),n(C,{children:[n(a,{children:["Session ID: ",e.sessionId]}),n(a,{children:["Model: ",e.modelId]}),n(a,{children:["Transport: ",e.transport]}),n(a,{children:["Type: ",e.type]})]}),r&&n(f,{children:[t(D,{children:"Session State"}),t(S,{children:t(o,{$variant:w(r.sessionStateType),children:B(r.sessionStateType)})}),"currentApp"in r&&r.currentApp&&n(a,{children:["Current App: ",r.currentApp.name," v",r.currentApp.version]}),"firmwareVersion"in r&&r.firmwareVersion&&n(a,{children:["Firmware: ",r.firmwareVersion.os]})]}),s&&t(u,{sessionId:e.sessionId,onSend:c,responses:d})]})};export{x as DeviceCard};
|
|
2
|
+
//# sourceMappingURL=DeviceCard.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/inspector/DeviceCard.tsx"],
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\nimport {\n type ConnectedDevice,\n type DeviceSessionState,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type ApduResponse } from \"../../hooks/useConnectorMessages\";\nimport { ApduSender } from \"./ApduSender\";\nimport {\n BadgeRow,\n Button,\n Card,\n CardBody,\n CardHeader,\n CardHeaderLeft,\n CardSection,\n CardTitle,\n SectionLabel,\n SmallText,\n StatusBadge,\n} from \"./styles\";\n\ntype DeviceCardProps = {\n device: ConnectedDevice;\n state?: DeviceSessionState;\n onDisconnect: () => void;\n onSendApdu: (sessionId: string, apduHex: string) => string;\n apduResponses: Map<string, ApduResponse>;\n};\n\nconst isConnected = (state?: DeviceSessionState): boolean => {\n if (!state) return true; // Assume connected if no state yet\n return state.deviceStatus !== \"NOT CONNECTED\";\n};\n\n/**\n * Map deviceStatus string to a badge variant.\n */\nfunction getDeviceStatusBadgeVariant(\n status: string,\n): \"success\" | \"warning\" | \"error\" | \"info\" | \"neutral\" {\n switch (status) {\n case \"CONNECTED\":\n return \"success\";\n case \"LOCKED\":\n return \"warning\";\n case \"BUSY\":\n return \"info\";\n case \"NOT CONNECTED\":\n return \"error\";\n default:\n return \"neutral\";\n }\n}\n\n/**\n * Map sessionStateType string to a badge variant.\n */\nfunction getSessionStateBadgeVariant(\n stateType: string | number,\n): \"success\" | \"warning\" | \"error\" | \"info\" | \"neutral\" {\n const stateStr = String(stateType);\n switch (stateStr) {\n case \"ReadyWithSecureChannel\":\n return \"success\";\n case \"ReadyWithoutSecureChannel\":\n return \"info\";\n case \"Connected\":\n return \"neutral\";\n default:\n return \"neutral\";\n }\n}\n\n/**\n * Format sessionStateType for display (add spaces before uppercase letters).\n */\nfunction formatSessionStateType(stateType: string | number): string {\n return String(stateType).replace(/([a-z])([A-Z])/g, \"$1 $2\");\n}\n\nexport const DeviceCard: React.FC<DeviceCardProps> = ({\n device,\n state,\n onDisconnect,\n onSendApdu,\n apduResponses,\n}) => {\n const connected = isConnected(state);\n\n return (\n <Card $variant={connected ? \"default\" : \"disconnected\"}>\n <CardHeader>\n <CardHeaderLeft>\n <CardTitle>{device.name || \"Unknown Device\"}</CardTitle>\n {state && (\n <StatusBadge\n $variant={getDeviceStatusBadgeVariant(state.deviceStatus)}\n >\n {state.deviceStatus}\n </StatusBadge>\n )}\n </CardHeaderLeft>\n {connected && (\n <Button $variant=\"danger\" onClick={onDisconnect}>\n Disconnect\n </Button>\n )}\n </CardHeader>\n\n <CardBody>\n <SmallText>Session ID: {device.sessionId}</SmallText>\n <SmallText>Model: {device.modelId}</SmallText>\n <SmallText>Transport: {device.transport}</SmallText>\n <SmallText>Type: {device.type}</SmallText>\n </CardBody>\n\n {state && (\n <CardSection>\n <SectionLabel>Session State</SectionLabel>\n <BadgeRow>\n <StatusBadge\n $variant={getSessionStateBadgeVariant(state.sessionStateType)}\n >\n {formatSessionStateType(state.sessionStateType)}\n </StatusBadge>\n </BadgeRow>\n {\"currentApp\" in state && state.currentApp && (\n <SmallText>\n Current App: {state.currentApp.name} v{state.currentApp.version}\n </SmallText>\n )}\n {\"firmwareVersion\" in state && state.firmwareVersion && (\n <SmallText>Firmware: {state.firmwareVersion.os}</SmallText>\n )}\n </CardSection>\n )}\n\n {connected && (\n <ApduSender\n sessionId={device.sessionId}\n onSend={onSendApdu}\n responses={apduResponses}\n />\n )}\n </Card>\n );\n};\n"],
|
|
5
|
+
"mappings": "AAOA,OAAS,cAAAA,MAAkB,eAC3B,OACE,YAAAC,EACA,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,cAAAC,EACA,kBAAAC,EACA,eAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,aAAAC,EACA,eAAAC,MACK,WAyEC,OACE,OAAAC,EADF,QAAAC,MAAA,oBA/DR,MAAMC,EAAeC,GACdA,EACEA,EAAM,eAAiB,gBADX,GAOrB,SAASC,EACPC,EACsD,CACtD,OAAQA,EAAQ,CACd,IAAK,YACH,MAAO,UACT,IAAK,SACH,MAAO,UACT,IAAK,OACH,MAAO,OACT,IAAK,gBACH,MAAO,QACT,QACE,MAAO,SACX,CACF,CAKA,SAASC,EACPC,EACsD,CAEtD,OADiB,OAAOA,CAAS,EACf,CAChB,IAAK,yBACH,MAAO,UACT,IAAK,4BACH,MAAO,OACT,IAAK,YACH,MAAO,UACT,QACE,MAAO,SACX,CACF,CAKA,SAASC,EAAuBD,EAAoC,CAClE,OAAO,OAAOA,CAAS,EAAE,QAAQ,kBAAmB,OAAO,CAC7D,CAEO,MAAME,EAAwC,CAAC,CACpD,OAAAC,EACA,MAAAP,EACA,aAAAQ,EACA,WAAAC,EACA,cAAAC,CACF,IAAM,CACJ,MAAMC,EAAYZ,EAAYC,CAAK,EAEnC,OACEF,EAACV,EAAA,CAAK,SAAUuB,EAAY,UAAY,eACtC,UAAAb,EAACR,EAAA,CACC,UAAAQ,EAACP,EAAA,CACC,UAAAM,EAACJ,EAAA,CAAW,SAAAc,EAAO,MAAQ,iBAAiB,EAC3CP,GACCH,EAACD,EAAA,CACC,SAAUK,EAA4BD,EAAM,YAAY,EAEvD,SAAAA,EAAM,aACT,GAEJ,EACCW,GACCd,EAACV,EAAA,CAAO,SAAS,SAAS,QAASqB,EAAc,sBAEjD,GAEJ,EAEAV,EAACT,EAAA,CACC,UAAAS,EAACH,EAAA,CAAU,yBAAaY,EAAO,WAAU,EACzCT,EAACH,EAAA,CAAU,oBAAQY,EAAO,SAAQ,EAClCT,EAACH,EAAA,CAAU,wBAAYY,EAAO,WAAU,EACxCT,EAACH,EAAA,CAAU,mBAAOY,EAAO,MAAK,GAChC,EAECP,GACCF,EAACN,EAAA,CACC,UAAAK,EAACH,EAAA,CAAa,yBAAa,EAC3BG,EAACX,EAAA,CACC,SAAAW,EAACD,EAAA,CACC,SAAUO,EAA4BH,EAAM,gBAAgB,EAE3D,SAAAK,EAAuBL,EAAM,gBAAgB,EAChD,EACF,EACC,eAAgBA,GAASA,EAAM,YAC9BF,EAACH,EAAA,CAAU,0BACKK,EAAM,WAAW,KAAK,KAAGA,EAAM,WAAW,SAC1D,EAED,oBAAqBA,GAASA,EAAM,iBACnCF,EAACH,EAAA,CAAU,uBAAWK,EAAM,gBAAgB,IAAG,GAEnD,EAGDW,GACCd,EAACZ,EAAA,CACC,UAAWsB,EAAO,UAClB,OAAQE,EACR,UAAWC,EACb,GAEJ,CAEJ",
|
|
6
|
+
"names": ["ApduSender", "BadgeRow", "Button", "Card", "CardBody", "CardHeader", "CardHeaderLeft", "CardSection", "CardTitle", "SectionLabel", "SmallText", "StatusBadge", "jsx", "jsxs", "isConnected", "state", "getDeviceStatusBadgeVariant", "status", "getSessionStateBadgeVariant", "stateType", "formatSessionStateType", "DeviceCard", "device", "onDisconnect", "onSendApdu", "apduResponses", "connected"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{DiscoveredDeviceCard as m}from"./DiscoveredDeviceCard";import{Button as c,ButtonGroup as S,DeviceList as y,ItalicNote as b,Section as f,SectionTitle as g,SmallText as n}from"./styles";import{jsx as e,jsxs as s}from"react/jsx-runtime";const B=({discoveredDevices:i,isListening:t,isActivelyDiscovering:o,startListening:a,stopListening:v,startDiscovering:l,stopDiscovering:p,connectDevice:d})=>{const D=t||o;return s(f,{children:[e(g,{children:"Device Discovery"}),s(S,{children:[e(c,{$variant:t?"warning":"primary",$size:"medium",onClick:t?v:a,disabled:o,children:t?"Stop Listening":"Listen for Devices"}),e(c,{$variant:o?"warning":"success",$size:"medium",onClick:o?p:l,disabled:t,children:o?"Stop Discovery":"Start Discovery"})]}),t&&i.length===0&&e(n,{children:"Listening for available devices..."}),o&&i.length===0&&e(n,{children:"Discovering devices..."}),i.length>0&&e(y,{children:i.map(r=>e(m,{device:r,onConnect:u=>d(r.id,u)},r.id))}),!D&&i.length===0&&e(n,{children:'Use "Listen for Devices" to see already-paired devices, or "Start Discovery" to scan for new devices.'}),e(b,{children:"Note: this may not work in web apps due to browser security restrictions. WebHID and WebBLE require a user gesture (click) in the app context to trigger device discovery."})]})};export{B as DeviceDiscoverySection};
|
|
2
|
+
//# sourceMappingURL=DeviceDiscoverySection.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/inspector/DeviceDiscoverySection.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * @file DeviceDiscoverySection\n *\n * Section of the Inspector that handles device discovery.\n * Provides buttons to start/stop passive listening and active discovery,\n * and displays the list of discovered devices.\n */\n\nimport React from \"react\";\nimport { type DiscoveredDevice } from \"@ledgerhq/device-management-kit\";\n\nimport { DiscoveredDeviceCard } from \"./DiscoveredDeviceCard\";\nimport {\n Button,\n ButtonGroup,\n DeviceList,\n ItalicNote,\n Section,\n SectionTitle,\n SmallText,\n} from \"./styles\";\n\ntype DeviceDiscoverySectionProps = {\n discoveredDevices: DiscoveredDevice[];\n isListening: boolean;\n isActivelyDiscovering: boolean;\n startListening: () => void;\n stopListening: () => void;\n startDiscovering: () => void;\n stopDiscovering: () => void;\n connectDevice: (\n deviceId: string,\n sessionRefresherOptions?: {\n isRefresherDisabled: boolean;\n pollingInterval?: number;\n },\n ) => void;\n};\n\nexport const DeviceDiscoverySection: React.FC<DeviceDiscoverySectionProps> = ({\n discoveredDevices,\n isListening,\n isActivelyDiscovering,\n startListening,\n stopListening,\n startDiscovering,\n stopDiscovering,\n connectDevice,\n}) => {\n const isAnyDiscoveryActive = isListening || isActivelyDiscovering;\n\n return (\n <Section>\n <SectionTitle>Device Discovery</SectionTitle>\n\n <ButtonGroup>\n <Button\n $variant={isListening ? \"warning\" : \"primary\"}\n $size=\"medium\"\n onClick={isListening ? stopListening : startListening}\n disabled={isActivelyDiscovering}\n >\n {isListening ? \"Stop Listening\" : \"Listen for Devices\"}\n </Button>\n\n <Button\n $variant={isActivelyDiscovering ? \"warning\" : \"success\"}\n $size=\"medium\"\n onClick={isActivelyDiscovering ? stopDiscovering : startDiscovering}\n disabled={isListening}\n >\n {isActivelyDiscovering ? \"Stop Discovery\" : \"Start Discovery\"}\n </Button>\n </ButtonGroup>\n\n {isListening && discoveredDevices.length === 0 && (\n <SmallText>Listening for available devices...</SmallText>\n )}\n {isActivelyDiscovering && discoveredDevices.length === 0 && (\n <SmallText>Discovering devices...</SmallText>\n )}\n\n {discoveredDevices.length > 0 && (\n <DeviceList>\n {discoveredDevices.map((device) => (\n <DiscoveredDeviceCard\n key={device.id}\n device={device}\n onConnect={(options) => connectDevice(device.id, options)}\n />\n ))}\n </DeviceList>\n )}\n\n {!isAnyDiscoveryActive && discoveredDevices.length === 0 && (\n <SmallText>\n Use "Listen for Devices" to see already-paired devices, or\n "Start Discovery" to scan for new devices.\n </SmallText>\n )}\n\n <ItalicNote>\n Note: this may not work in web apps due to browser security\n restrictions. WebHID and WebBLE require a user gesture (click) in the\n app context to trigger device discovery.\n </ItalicNote>\n </Section>\n );\n};\n"],
|
|
5
|
+
"mappings": "AAWA,OAAS,wBAAAA,MAA4B,yBACrC,OACE,UAAAC,EACA,eAAAC,EACA,cAAAC,EACA,cAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,aAAAC,MACK,WAiCD,cAAAC,EAEA,QAAAC,MAFA,oBAdC,MAAMC,EAAgE,CAAC,CAC5E,kBAAAC,EACA,YAAAC,EACA,sBAAAC,EACA,eAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,cAAAC,CACF,IAAM,CACJ,MAAMC,EAAuBP,GAAeC,EAE5C,OACEJ,EAACJ,EAAA,CACC,UAAAG,EAACF,EAAA,CAAa,4BAAgB,EAE9BG,EAACP,EAAA,CACC,UAAAM,EAACP,EAAA,CACC,SAAUW,EAAc,UAAY,UACpC,MAAM,SACN,QAASA,EAAcG,EAAgBD,EACvC,SAAUD,EAET,SAAAD,EAAc,iBAAmB,qBACpC,EAEAJ,EAACP,EAAA,CACC,SAAUY,EAAwB,UAAY,UAC9C,MAAM,SACN,QAASA,EAAwBI,EAAkBD,EACnD,SAAUJ,EAET,SAAAC,EAAwB,iBAAmB,kBAC9C,GACF,EAECD,GAAeD,EAAkB,SAAW,GAC3CH,EAACD,EAAA,CAAU,8CAAkC,EAE9CM,GAAyBF,EAAkB,SAAW,GACrDH,EAACD,EAAA,CAAU,kCAAsB,EAGlCI,EAAkB,OAAS,GAC1BH,EAACL,EAAA,CACE,SAAAQ,EAAkB,IAAKS,GACtBZ,EAACR,EAAA,CAEC,OAAQoB,EACR,UAAYC,GAAYH,EAAcE,EAAO,GAAIC,CAAO,GAFnDD,EAAO,EAGd,CACD,EACH,EAGD,CAACD,GAAwBR,EAAkB,SAAW,GACrDH,EAACD,EAAA,CAAU,iHAGX,EAGFC,EAACJ,EAAA,CAAW,sLAIZ,GACF,CAEJ",
|
|
6
|
+
"names": ["DiscoveredDeviceCard", "Button", "ButtonGroup", "DeviceList", "ItalicNote", "Section", "SectionTitle", "SmallText", "jsx", "jsxs", "DeviceDiscoverySection", "discoveredDevices", "isListening", "isActivelyDiscovering", "startListening", "stopListening", "startDiscovering", "stopDiscovering", "connectDevice", "isAnyDiscoveryActive", "device", "options"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import{useCallback as g,useState as p}from"react";import n from"styled-components";import{Button as C,Card as u,CardTitle as v,CollapsibleContent as b,CollapsibleHeader as h,CollapsibleToggle as D,SmallText as a}from"./styles";import{jsx as o,jsxs as e}from"react/jsx-runtime";const w=n.div`
|
|
2
|
+
display: flex;
|
|
3
|
+
gap: 16px;
|
|
4
|
+
`,y=n.div`
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
flex: 1;
|
|
8
|
+
min-width: 0;
|
|
9
|
+
`,R=n.div`
|
|
10
|
+
display: flex;
|
|
11
|
+
flex-direction: column;
|
|
12
|
+
align-items: flex-end;
|
|
13
|
+
gap: 6px;
|
|
14
|
+
flex-shrink: 0;
|
|
15
|
+
`,I=n.div`
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-direction: column;
|
|
18
|
+
gap: 2px;
|
|
19
|
+
margin-top: 4px;
|
|
20
|
+
`,T=n.span`
|
|
21
|
+
font-size: 11px;
|
|
22
|
+
font-weight: 600;
|
|
23
|
+
color: #888;
|
|
24
|
+
`,k=n.label`
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
gap: 6px;
|
|
28
|
+
font-size: 11px;
|
|
29
|
+
color: #555;
|
|
30
|
+
cursor: pointer;
|
|
31
|
+
white-space: nowrap;
|
|
32
|
+
`,O=n.div`
|
|
33
|
+
display: flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
gap: 6px;
|
|
36
|
+
font-size: 11px;
|
|
37
|
+
color: #555;
|
|
38
|
+
white-space: nowrap;
|
|
39
|
+
`,P=n.input`
|
|
40
|
+
width: 60px;
|
|
41
|
+
padding: 2px 6px;
|
|
42
|
+
border: 1px solid #ddd;
|
|
43
|
+
border-radius: 3px;
|
|
44
|
+
font-size: 11px;
|
|
45
|
+
font-family: monospace;
|
|
46
|
+
|
|
47
|
+
&:focus {
|
|
48
|
+
outline: none;
|
|
49
|
+
border-color: #2196f3;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
&:disabled {
|
|
53
|
+
opacity: 0.4;
|
|
54
|
+
cursor: not-allowed;
|
|
55
|
+
}
|
|
56
|
+
`,B=({device:l,onConnect:d})=>{const[r,c]=p(!1),[t,f]=p(!1),[s,x]=p(""),m=g(()=>{const i=s?parseInt(s,10):void 0;d({isRefresherDisabled:t,pollingInterval:i&&!isNaN(i)?i:void 0})},[d,t,s]);return o(u,{$variant:"discovered",children:e(w,{children:[e(y,{children:[o(v,{children:l.name||"Unknown Device"}),e(I,{children:[e(a,{children:["ID: ",l.id]}),e(a,{children:["Model: ",l.deviceModel.name]}),e(a,{children:["Transport: ",l.transport]}),l.rssi!==void 0&&l.rssi!==null&&e(a,{children:["Signal: ",l.rssi," dBm"]})]})]}),e(R,{children:[o(C,{$variant:"success",onClick:m,children:"Connect"}),e(h,{onClick:()=>c(!r),children:[o(D,{$expanded:r,children:"\u25B6"}),o(T,{children:"Options"})]}),e(b,{$expanded:r,children:[e(k,{children:[o("input",{type:"checkbox",checked:t,onChange:i=>f(i.target.checked)}),"Disable refresher"]}),e(O,{children:[o("span",{children:"Polling (ms):"}),o(P,{type:"number",min:"1000",placeholder:"1000",value:s,onChange:i=>x(i.target.value),disabled:t})]})]})]})]})})};export{B as DiscoveredDeviceCard};
|
|
57
|
+
//# sourceMappingURL=DiscoveredDeviceCard.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/inspector/DiscoveredDeviceCard.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useCallback, useState } from \"react\";\nimport { type DiscoveredDevice } from \"@ledgerhq/device-management-kit\";\nimport styled from \"styled-components\";\n\nimport {\n Button,\n Card,\n CardTitle,\n CollapsibleContent,\n CollapsibleHeader,\n CollapsibleToggle,\n SmallText,\n} from \"./styles\";\n\n// ============================================================================\n// Two-column layout\n// ============================================================================\n\nconst CardColumns = styled.div`\n display: flex;\n gap: 16px;\n`;\n\nconst LeftColumn = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n`;\n\nconst RightColumn = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 6px;\n flex-shrink: 0;\n`;\n\nconst DeviceInfo = styled.div`\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: 4px;\n`;\n\n// ============================================================================\n// Compact connect options styled components\n// ============================================================================\n\nconst OptionsLabel = styled.span`\n font-size: 11px;\n font-weight: 600;\n color: #888;\n`;\n\nconst OptionRow = styled.label`\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: #555;\n cursor: pointer;\n white-space: nowrap;\n`;\n\nconst PollingRow = styled.div`\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: #555;\n white-space: nowrap;\n`;\n\nconst PollingInput = styled.input`\n width: 60px;\n padding: 2px 6px;\n border: 1px solid #ddd;\n border-radius: 3px;\n font-size: 11px;\n font-family: monospace;\n\n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`;\n\n// ============================================================================\n// Component\n// ============================================================================\n\ntype DiscoveredDeviceCardProps = {\n device: DiscoveredDevice;\n onConnect: (sessionRefresherOptions?: {\n isRefresherDisabled: boolean;\n pollingInterval?: number;\n }) => void;\n};\n\nexport const DiscoveredDeviceCard: React.FC<DiscoveredDeviceCardProps> = ({\n device,\n onConnect,\n}) => {\n const [optionsExpanded, setOptionsExpanded] = useState(false);\n const [isRefresherDisabled, setIsRefresherDisabled] = useState(false);\n const [pollingInterval, setPollingInterval] = useState<string>(\"\");\n\n const handleConnect = useCallback(() => {\n const parsedInterval = pollingInterval\n ? parseInt(pollingInterval, 10)\n : undefined;\n onConnect({\n isRefresherDisabled,\n pollingInterval:\n parsedInterval && !isNaN(parsedInterval) ? parsedInterval : undefined,\n });\n }, [onConnect, isRefresherDisabled, pollingInterval]);\n\n return (\n <Card $variant=\"discovered\">\n <CardColumns>\n <LeftColumn>\n <CardTitle>{device.name || \"Unknown Device\"}</CardTitle>\n <DeviceInfo>\n <SmallText>ID: {device.id}</SmallText>\n <SmallText>Model: {device.deviceModel.name}</SmallText>\n <SmallText>Transport: {device.transport}</SmallText>\n {device.rssi !== undefined && device.rssi !== null && (\n <SmallText>Signal: {device.rssi} dBm</SmallText>\n )}\n </DeviceInfo>\n </LeftColumn>\n\n <RightColumn>\n <Button $variant=\"success\" onClick={handleConnect}>\n Connect\n </Button>\n <CollapsibleHeader\n onClick={() => setOptionsExpanded(!optionsExpanded)}\n >\n <CollapsibleToggle $expanded={optionsExpanded}>\n ▶\n </CollapsibleToggle>\n <OptionsLabel>Options</OptionsLabel>\n </CollapsibleHeader>\n <CollapsibleContent $expanded={optionsExpanded}>\n <OptionRow>\n <input\n type=\"checkbox\"\n checked={isRefresherDisabled}\n onChange={(e) => setIsRefresherDisabled(e.target.checked)}\n />\n Disable refresher\n </OptionRow>\n <PollingRow>\n <span>Polling (ms):</span>\n <PollingInput\n type=\"number\"\n min=\"1000\"\n placeholder=\"1000\"\n value={pollingInterval}\n onChange={(e) => setPollingInterval(e.target.value)}\n disabled={isRefresherDisabled}\n />\n </PollingRow>\n </CollapsibleContent>\n </RightColumn>\n </CardColumns>\n </Card>\n );\n};\n"],
|
|
5
|
+
"mappings": "AAAA,OAAgB,eAAAA,EAAa,YAAAC,MAAgB,QAE7C,OAAOC,MAAY,oBAEnB,OACE,UAAAC,EACA,QAAAC,EACA,aAAAC,EACA,sBAAAC,EACA,qBAAAC,EACA,qBAAAC,EACA,aAAAC,MACK,WAoHG,cAAAC,EAEE,QAAAC,MAFF,oBA9GV,MAAMC,EAAcV,EAAO;AAAA;AAAA;AAAA,EAKrBW,EAAaX,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOpBY,EAAcZ,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQrBa,EAAab,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAWpBc,EAAed,EAAO;AAAA;AAAA;AAAA;AAAA,EAMtBe,EAAYf,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUnBgB,EAAahB,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASpBiB,EAAejB,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BfkB,EAA4D,CAAC,CACxE,OAAAC,EACA,UAAAC,CACF,IAAM,CACJ,KAAM,CAACC,EAAiBC,CAAkB,EAAIvB,EAAS,EAAK,EACtD,CAACwB,EAAqBC,CAAsB,EAAIzB,EAAS,EAAK,EAC9D,CAAC0B,EAAiBC,CAAkB,EAAI3B,EAAiB,EAAE,EAE3D4B,EAAgB7B,EAAY,IAAM,CACtC,MAAM8B,EAAiBH,EACnB,SAASA,EAAiB,EAAE,EAC5B,OACJL,EAAU,CACR,oBAAAG,EACA,gBACEK,GAAkB,CAAC,MAAMA,CAAc,EAAIA,EAAiB,MAChE,CAAC,CACH,EAAG,CAACR,EAAWG,EAAqBE,CAAe,CAAC,EAEpD,OACEjB,EAACN,EAAA,CAAK,SAAS,aACb,SAAAO,EAACC,EAAA,CACC,UAAAD,EAACE,EAAA,CACC,UAAAH,EAACL,EAAA,CAAW,SAAAgB,EAAO,MAAQ,iBAAiB,EAC5CV,EAACI,EAAA,CACC,UAAAJ,EAACF,EAAA,CAAU,iBAAKY,EAAO,IAAG,EAC1BV,EAACF,EAAA,CAAU,oBAAQY,EAAO,YAAY,MAAK,EAC3CV,EAACF,EAAA,CAAU,wBAAYY,EAAO,WAAU,EACvCA,EAAO,OAAS,QAAaA,EAAO,OAAS,MAC5CV,EAACF,EAAA,CAAU,qBAASY,EAAO,KAAK,QAAI,GAExC,GACF,EAEAV,EAACG,EAAA,CACC,UAAAJ,EAACP,EAAA,CAAO,SAAS,UAAU,QAAS0B,EAAe,mBAEnD,EACAlB,EAACJ,EAAA,CACC,QAAS,IAAMiB,EAAmB,CAACD,CAAe,EAElD,UAAAb,EAACF,EAAA,CAAkB,UAAWe,EAAiB,kBAE/C,EACAb,EAACM,EAAA,CAAa,mBAAO,GACvB,EACAL,EAACL,EAAA,CAAmB,UAAWiB,EAC7B,UAAAZ,EAACM,EAAA,CACC,UAAAP,EAAC,SACC,KAAK,WACL,QAASe,EACT,SAAWM,GAAML,EAAuBK,EAAE,OAAO,OAAO,EAC1D,EAAE,qBAEJ,EACApB,EAACO,EAAA,CACC,UAAAR,EAAC,QAAK,yBAAa,EACnBA,EAACS,EAAA,CACC,KAAK,SACL,IAAI,OACJ,YAAY,OACZ,MAAOQ,EACP,SAAWI,GAAMH,EAAmBG,EAAE,OAAO,KAAK,EAClD,SAAUN,EACZ,GACF,GACF,GACF,GACF,EACF,CAEJ",
|
|
6
|
+
"names": ["useCallback", "useState", "styled", "Button", "Card", "CardTitle", "CollapsibleContent", "CollapsibleHeader", "CollapsibleToggle", "SmallText", "jsx", "jsxs", "CardColumns", "LeftColumn", "RightColumn", "DeviceInfo", "OptionsLabel", "OptionRow", "PollingRow", "PollingInput", "DiscoveredDeviceCard", "device", "onConnect", "optionsExpanded", "setOptionsExpanded", "isRefresherDisabled", "setIsRefresherDisabled", "pollingInterval", "setPollingInterval", "handleConnect", "parsedInterval", "e"]
|
|
7
|
+
}
|