11import { ChevronLeft , ChevronRight , Home , Lock , Maximize2 , Plus , RotateCw , Star , X } from "lucide-react" ;
2- import { useEffect , useMemo , useRef , useState } from "react" ;
2+ import { useCallback , useEffect , useMemo , useRef , useState } from "react" ;
33import { actionBarClass , addressInputClass , classNames , closeButtonClass , encodeProxyUrl , formatUrl , getActualUrl , getDefaultUrl , iconButtonClass , type Tab , tabButtonClass } from "@/lib/tabs" ;
44
55type ScramjetWindow = Window & { __scramjet$config ?: unknown } ;
66
77const IconButton = ( { onClick, icon : Icon , className = "" , disabled = false , title = "" } : { onClick ?: ( ) => void ; icon : React . ComponentType < { className ?: string } > ; className ?: string ; disabled ?: boolean ; title ?: string } ) => (
8- < button
9- type = "button"
10- onClick = { onClick }
11- disabled = { disabled }
12- title = { title }
13- className = { classNames ( iconButtonClass , "disabled:opacity-30 disabled:cursor-not-allowed" , className ) }
14- >
8+ < button type = "button" onClick = { onClick } disabled = { disabled } title = { title } className = { classNames ( iconButtonClass , "disabled:opacity-30 disabled:cursor-not-allowed" , className ) } >
159 < Icon className = "h-4 w-4" />
1610 </ button >
1711) ;
@@ -21,15 +15,15 @@ export default function Browser() {
2115 const [ url , setUrl ] = useState ( "about:blank" ) ;
2216 const [ favicons , setFavicons ] = useState < Record < number , string > > ( { } ) ;
2317 const [ bookmarks , setBookmarks ] = useState < Array < { Title : string ; url : string ; favicon ?: string } > > ( [ ] ) ;
24- const [ proxyReadyTick , setProxyReadyTick ] = useState ( 0 ) ;
18+ const [ _proxyReadyTick , setProxyReadyTick ] = useState ( 0 ) ;
2519 const [ proxyReady , setProxyReady ] = useState ( false ) ;
2620 const activeTab = useMemo ( ( ) => tabs . find ( ( tab ) => tab . active ) , [ tabs ] ) ;
2721 const iframeRefs = useRef < Record < number , HTMLIFrameElement | null > > ( { } ) ;
2822
29- const openInNewTab = ( url : string ) => {
23+ const openInNewTab = useCallback ( ( url : string ) => {
3024 const newId = Date . now ( ) ;
3125 setTabs ( ( prev ) => [ ...prev . map ( ( t ) => ( { ...t , active : false } ) ) , { id : newId , title : "New Tab" , url, active : true , reloadKey : 0 } ] ) ;
32- } ;
26+ } , [ ] ) ;
3327
3428 useEffect ( ( ) => {
3529 let firstTabUrl = getDefaultUrl ( ) ;
@@ -82,7 +76,7 @@ export default function Browser() {
8276 cancelled = true ;
8377 window . clearInterval ( timer ) ;
8478 } ;
85- } , [ proxyReadyTick ] ) ;
79+ } , [ ] ) ;
8680
8781 useEffect ( ( ) => {
8882 if ( ! activeTab ) return ;
@@ -97,7 +91,7 @@ export default function Browser() {
9791 if ( url === "about:blank" && activeTab . url !== "about:blank" ) {
9892 setUrl ( activeTab . url ) ;
9993 }
100- } , [ activeTab , url , proxyReadyTick ] ) ;
94+ } , [ activeTab , url ] ) ;
10195
10296 useEffect ( ( ) => {
10397 if ( ! activeTab ) return ;
@@ -281,7 +275,7 @@ export default function Browser() {
281275 }
282276 } catch ( _e ) { }
283277 } ;
284- } , [ activeTab ] ) ;
278+ } , [ activeTab , openInNewTab ] ) ;
285279
286280 useEffect ( ( ) => {
287281 const handleKeyDown = ( e : KeyboardEvent ) => {
@@ -416,17 +410,7 @@ export default function Browser() {
416410 < div className = "flex h-screen flex-col bg-background" >
417411 < div className = "flex items-center gap-1 bg-background-secondary/50 px-2 py-1.5 border-b border-border/50" >
418412 { tabs . map ( ( tab ) => (
419- < button
420- key = { tab . id }
421- type = "button"
422- onClick = { ( ) => setActiveTab ( tab . id ) }
423- className = { classNames (
424- tabButtonClass ,
425- tab . active
426- ? "bg-background text-text border border-border/50"
427- : "text-text-secondary hover:text-text hover:bg-white/5"
428- ) }
429- >
413+ < button key = { tab . id } type = "button" onClick = { ( ) => setActiveTab ( tab . id ) } className = { classNames ( tabButtonClass , tab . active ? "bg-background text-text border border-border/50" : "text-text-secondary hover:text-text hover:bg-white/5" ) } >
430414 < div className = "flex min-w-0 flex-1 items-center gap-2" >
431415 { favicons [ tab . id ] ? (
432416 < img
@@ -455,12 +439,7 @@ export default function Browser() {
455439 </ button >
456440 </ button >
457441 ) ) }
458- < button
459- type = "button"
460- className = "inline-flex h-6 w-6 items-center justify-center rounded text-text-secondary hover:text-accent hover:bg-white/5 transition-all"
461- onClick = { addNewTab }
462- aria-label = "Add tab"
463- >
442+ < button type = "button" className = "inline-flex h-6 w-6 items-center justify-center rounded text-text-secondary hover:text-accent hover:bg-white/5 transition-all" onClick = { addNewTab } aria-label = "Add tab" >
464443 < Plus className = "h-3.5 w-3.5" />
465444 </ button >
466445 </ div >
@@ -476,13 +455,7 @@ export default function Browser() {
476455 < div className = "flex-1" >
477456 < div className = { actionBarClass } >
478457 < Lock className = "h-3.5 w-3.5 text-text-placeholder" />
479- < input
480- className = { addressInputClass }
481- value = { url }
482- placeholder = "Search or enter address"
483- onChange = { ( e ) => setUrl ( e . target . value ) }
484- onKeyDown = { ( e ) => e . key === "Enter" && handleNavigate ( e . currentTarget . value ) }
485- />
458+ < input className = { addressInputClass } value = { url } placeholder = "Search or enter address" onChange = { ( e ) => setUrl ( e . target . value ) } onKeyDown = { ( e ) => e . key === "Enter" && handleNavigate ( e . currentTarget . value ) } />
486459 </ div >
487460 </ div >
488461
0 commit comments