@@ -1435,6 +1435,27 @@ export function App({ address, packetStore, nodeStore, skipConfig = false, skipN
14351435 }
14361436 } , [ myNodeNum , transport , nodeStore , showNotification ] ) ;
14371437
1438+ const removeAllUnknownNodes = useCallback ( async ( ) => {
1439+ if ( ! transport || ! myNodeNum ) return ;
1440+ const unknownNodes = nodes . filter ( n => n . num !== myNodeNum && ( ! n . shortName || n . shortName === "???" ) ) ;
1441+ if ( unknownNodes . length === 0 ) {
1442+ showNotification ( "No unknown nodes to remove" ) ;
1443+ return ;
1444+ }
1445+ let removed = 0 ;
1446+ for ( const node of unknownNodes ) {
1447+ try {
1448+ const binary = adminHelper . createRemoveNodeRequest ( node . num , { myNodeNum } ) ;
1449+ await transport . send ( binary ) ;
1450+ nodeStore . removeNode ( node . num ) ;
1451+ removed ++ ;
1452+ } catch { /* continue removing others */ }
1453+ }
1454+ setNodes ( ( prev ) => prev . filter ( ( n ) => n . num === myNodeNum || ( n . shortName && n . shortName !== "???" ) ) ) ;
1455+ setSelectedNodeIndex ( 0 ) ;
1456+ showNotification ( `Removed ${ removed } unknown node${ removed !== 1 ? "s" : "" } ` ) ;
1457+ } , [ myNodeNum , transport , nodes , nodeStore , showNotification ] ) ;
1458+
14381459 const toggleFavoriteNode = useCallback ( async ( nodeNum : number ) => {
14391460 if ( ! transport || ! myNodeNum ) return ;
14401461 const node = nodes . find ( ( n ) => n . num === nodeNum ) ;
@@ -2291,6 +2312,10 @@ export function App({ address, packetStore, nodeStore, skipConfig = false, skipN
22912312 if ( input === "x" && selectedNode && selectedNode . num !== myNodeNum ) {
22922313 removeNode ( selectedNode . num ) ;
22932314 }
2315+ // 'X' (shift+x) to remove all unknown nodes
2316+ if ( input === "X" ) {
2317+ removeAllUnknownNodes ( ) ;
2318+ }
22942319 if ( input === "f" && selectedNode ) {
22952320 toggleFavoriteNode ( selectedNode . num ) ;
22962321 }
0 commit comments