@@ -52,21 +52,22 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) {
5252 const [ lanesResults , setLanesResults ] = useState < typeof lanes > ( [ ] )
5353 const searchRef = useRef < HTMLDivElement > ( null )
5454 const workerRef = useRef < Worker | null > ( null )
55+ const workerReadyRef = useRef ( false )
5556
56- // Initialize Web Worker
57- useEffect ( ( ) => {
58- if ( typeof window !== "undefined" ) {
59- // Import the worker as a URL that Vite will process
60- workerRef . current = new Worker ( new URL ( "~/workers/data-worker.ts" , import . meta. url ) , { type : "module" } )
61-
62- workerRef . current . onmessage = ( event : MessageEvent < WorkerResponse > ) => {
63- const { networks, tokens : workerTokens , lanes : workerLanes } = event . data
64- setNetworksResults ( networks || [ ] )
65- setTokensResults ( workerTokens || [ ] )
66- setLanesResults ( workerLanes || [ ] )
67- }
57+ // Lazily initialize Web Worker on first interaction
58+ const ensureWorker = ( ) => {
59+ if ( workerReadyRef . current || typeof window === "undefined" ) return
60+ workerRef . current = new Worker ( new URL ( "~/workers/data-worker.ts" , import . meta. url ) , { type : "module" } )
61+ workerRef . current . onmessage = ( event : MessageEvent < WorkerResponse > ) => {
62+ const { networks, tokens : workerTokens , lanes : workerLanes } = event . data
63+ setNetworksResults ( networks || [ ] )
64+ setTokensResults ( workerTokens || [ ] )
65+ setLanesResults ( workerLanes || [ ] )
6866 }
67+ workerReadyRef . current = true
68+ }
6969
70+ useEffect ( ( ) => {
7071 return ( ) => {
7172 if ( workerRef . current ) {
7273 workerRef . current . terminate ( )
@@ -92,6 +93,8 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) {
9293 return
9394 }
9495
96+ // Ensure worker exists before posting message
97+ if ( ! workerReadyRef . current ) ensureWorker ( )
9598 if ( workerRef . current ) {
9699 const message : WorkerMessage = {
97100 search : debouncedSearch ,
@@ -114,7 +117,7 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) {
114117 }
115118 } , [ debouncedSearch ] )
116119
117- useClickOutside ( searchRef , ( ) => setOpenSearchMenu ( false ) )
120+ useClickOutside ( searchRef , ( ) => setOpenSearchMenu ( false ) , { enabled : openSearchMenu } )
118121
119122 const generateExplorerUrl = ( lane ) : ExplorerInfo => {
120123 const directory = directoryToSupportedChain ( lane . sourceNetwork . key )
@@ -146,7 +149,10 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) {
146149 placeholder = "Network/Token/Lane"
147150 value = { search }
148151 onChange = { ( e ) => setSearch ( e . target . value ) }
149- onFocus = { ( ) => setIsActive ( true ) }
152+ onFocus = { ( ) => {
153+ setIsActive ( true )
154+ ensureWorker ( )
155+ } }
150156 onBlur = { ( ) => setIsActive ( false ) }
151157 />
152158 { openSearchMenu && (
0 commit comments