1- import { useCallback , useEffect , useMemo , useRef , useState } from "react" ;
1+ import { useCallback , useEffect , useMemo , useState } from "react" ;
22import { Host , PortForwardingRule } from "../../domain/models" ;
33import {
44 STORAGE_KEY_PF_PREFER_FORM_MODE ,
@@ -10,7 +10,6 @@ import {
1010 clearReconnectTimer ,
1111 getActiveConnection ,
1212 getActiveRuleIds ,
13- setReconnectCallback ,
1413 startPortForward ,
1514 stopPortForward ,
1615 syncWithBackend ,
@@ -64,16 +63,7 @@ export interface UsePortForwardingStateResult {
6463 selectedRule : PortForwardingRule | undefined ;
6564}
6665
67- export interface UsePortForwardingStateOptions {
68- hosts ?: Host [ ] ;
69- keys ?: { id : string ; privateKey : string } [ ] ;
70- }
71-
72- export const usePortForwardingState = (
73- options : UsePortForwardingStateOptions = { } ,
74- ) : UsePortForwardingStateResult => {
75- const { hosts = [ ] , keys = [ ] } = options ;
76-
66+ export const usePortForwardingState = ( ) : UsePortForwardingStateResult => {
7767 const [ rules , setRules ] = useState < PortForwardingRule [ ] > ( [ ] ) ;
7868 const [ selectedRuleId , setSelectedRuleId ] = useState < string | null > ( null ) ;
7969 const [ viewMode , setViewMode ] = useStoredViewMode (
@@ -91,27 +81,6 @@ export const usePortForwardingState = (
9181 localStorageAdapter . writeBoolean ( STORAGE_KEY_PF_PREFER_FORM_MODE , prefer ) ;
9282 } , [ ] ) ;
9383
94- // Ref to store the current rules, hosts, and keys for the reconnect callback
95- const rulesRef = useRef < PortForwardingRule [ ] > ( rules ) ;
96- const hostsRef = useRef < Host [ ] > ( hosts ) ;
97- const keysRef = useRef < { id : string ; privateKey : string } [ ] > ( keys ) ;
98-
99- // Keep refs in sync
100- useEffect ( ( ) => {
101- rulesRef . current = rules ;
102- } , [ rules ] ) ;
103-
104- useEffect ( ( ) => {
105- hostsRef . current = hosts ;
106- } , [ hosts ] ) ;
107-
108- useEffect ( ( ) => {
109- keysRef . current = keys ;
110- } , [ keys ] ) ;
111-
112- // Track if auto-start has been executed
113- const autoStartExecutedRef = useRef ( false ) ;
114-
11584 // Load rules from storage on mount and sync with backend
11685 useEffect ( ( ) => {
11786 const loadAndSync = async ( ) => {
@@ -145,76 +114,6 @@ export const usePortForwardingState = (
145114 localStorageAdapter . write ( STORAGE_KEY_PORT_FORWARDING , updatedRules ) ;
146115 } , [ ] ) ;
147116
148- // Reconnect callback - used by the service layer to trigger reconnection
149- const handleReconnect = useCallback (
150- async (
151- ruleId : string ,
152- onStatusChange : ( status : PortForwardingRule [ "status" ] , error ?: string ) => void ,
153- ) => {
154- const rule = rulesRef . current . find ( ( r ) => r . id === ruleId ) ;
155- if ( ! rule || ! rule . hostId ) {
156- return { success : false , error : "Rule or host not found" } ;
157- }
158-
159- const host = hostsRef . current . find ( ( h ) => h . id === rule . hostId ) ;
160- if ( ! host ) {
161- return { success : false , error : "Host not found" } ;
162- }
163-
164- return startPortForward ( rule , host , keysRef . current , onStatusChange , true ) ;
165- } ,
166- [ ] ,
167- ) ;
168-
169- // Set up the reconnect callback in the service layer
170- useEffect ( ( ) => {
171- setReconnectCallback ( handleReconnect ) ;
172- return ( ) => {
173- setReconnectCallback ( null ) ;
174- } ;
175- } , [ handleReconnect ] ) ;
176-
177- // Auto-start rules when hosts and keys become available
178- useEffect ( ( ) => {
179- if ( autoStartExecutedRef . current ) return ;
180- if ( rules . length === 0 || hosts . length === 0 ) return ;
181-
182- const autoStartRules = rules . filter (
183- ( r ) => r . autoStart && r . status === "inactive" && r . hostId ,
184- ) ;
185-
186- if ( autoStartRules . length === 0 ) return ;
187-
188- autoStartExecutedRef . current = true ;
189-
190- // Start each auto-start rule
191- for ( const rule of autoStartRules ) {
192- const host = hosts . find ( ( h ) => h . id === rule . hostId ) ;
193- if ( host ) {
194- void startPortForward (
195- rule ,
196- host ,
197- keys ,
198- ( status , error ) => {
199- setRules ( ( prev ) =>
200- prev . map ( ( r ) =>
201- r . id === rule . id
202- ? {
203- ...r ,
204- status,
205- error,
206- lastUsedAt : status === "active" ? Date . now ( ) : r . lastUsedAt ,
207- }
208- : r ,
209- ) ,
210- ) ;
211- } ,
212- true , // Enable reconnect for auto-start rules
213- ) ;
214- }
215- }
216- } , [ rules , hosts , keys ] ) ;
217-
218117 const addRule = useCallback (
219118 (
220119 rule : Omit < PortForwardingRule , "id" | "createdAt" | "status" > ,
0 commit comments