@@ -34,98 +34,6 @@ const AUTO_ARCHIVE_ZERO_QUOTA = true;
3434const AUTO_UNARCHIVE_NON_ZERO_QUOTA = true ;
3535const AUTO_SWITCH_AWAY_FROM_DEPLETED_OR_FROZEN = true ;
3636
37- type BridgeResult < T > = {
38- ok : boolean ;
39- value ?: T ;
40- error ?: string ;
41- } ;
42-
43- const isDesktopBridgeRuntime = ( ) : boolean => {
44- if ( typeof window === "undefined" ) {
45- return false ;
46- }
47-
48- return typeof window . cm_window_close === "function" || typeof window . webui ?. call === "function" ;
49- } ;
50-
51- const runWindowAction = async < T , > (
52- actionNames : string [ ] ,
53- action : ( ( ...args : never [ ] ) => Promise < T > | T ) | undefined ,
54- ...args : unknown [ ]
55- ) : Promise < T | null > => {
56- const parseBridgeResult = ( raw : unknown ) : T | null => {
57- if ( typeof raw === "string" ) {
58- const trimmed = raw . trim ( ) ;
59- if ( trimmed . startsWith ( "{" ) || trimmed . startsWith ( "[" ) ) {
60- let parsedJson : unknown ;
61- try {
62- parsedJson = JSON . parse ( raw ) ;
63- } catch {
64- return raw as T ;
65- }
66-
67- if ( parsedJson && typeof parsedJson === "object" && "ok" in ( parsedJson as Record < string , unknown > ) ) {
68- const parsed = parsedJson as BridgeResult < T > ;
69- if ( ! parsed . ok ) {
70- throw new Error ( parsed . error || "Backend bridge call failed." ) ;
71- }
72- return ( parsed . value ?? null ) as T | null ;
73- }
74- }
75- return raw as T ;
76- }
77-
78- if ( raw && typeof raw === "object" && "ok" in ( raw as Record < string , unknown > ) ) {
79- const parsed = raw as BridgeResult < T > ;
80- if ( ! parsed . ok ) {
81- throw new Error ( parsed . error || "Backend bridge call failed." ) ;
82- }
83- return ( parsed . value ?? null ) as T | null ;
84- }
85-
86- return ( raw ?? null ) as T | null ;
87- } ;
88-
89- let lastError : string | null = null ;
90- if ( typeof action === "function" ) {
91- try {
92- const directRaw = await action ( ...( args as never [ ] ) ) ;
93- // For side-effect commands (close/minimize/toggle), many WebUI bindings return
94- // `undefined` even when they succeed. Treat that as success and do not re-issue
95- // the same action through fallback RPC (which causes lag/double-toggle).
96- if ( directRaw === undefined ) {
97- return null ;
98- }
99- return parseBridgeResult ( directRaw ) ;
100- } catch ( error ) {
101- lastError = error instanceof Error ? error . message : String ( error ) ;
102- }
103- }
104-
105- if ( ! isDesktopBridgeRuntime ( ) ) {
106- throw new Error ( lastError || "Desktop window bridge is unavailable." ) ;
107- }
108-
109- const webuiCall = window . webui ?. call ;
110- if ( typeof webuiCall !== "function" ) {
111- throw new Error ( lastError || "WebUI call bridge is unavailable." ) ;
112- }
113-
114- for ( const name of actionNames ) {
115- try {
116- const raw = await webuiCall ( name , ...args ) ;
117- return parseBridgeResult ( raw ) ;
118- } catch ( error ) {
119- lastError = error instanceof Error ? error . message : String ( error ) ;
120- }
121- }
122-
123- throw new Error ( lastError || `Window action failed: ${ actionNames . join ( ", " ) } ` ) ;
124- } ;
125-
126- const windowFullscreenGetter = ( ) => window . cm_window_is_fullscreen ;
127- const windowFullscreenToggler = ( ) => window . cm_window_toggle_fullscreen ;
128-
12937const nowEpoch = ( ) : number => Math . floor ( Date . now ( ) / 1000 ) ;
13038
13139const formatEpoch = ( epoch : number | null | undefined ) : string => {
@@ -346,28 +254,8 @@ const IconClose = () => (
346254 </ svg >
347255) ;
348256
349- const IconMinimize = ( ) => (
350- < svg viewBox = "0 0 24 24" aria-hidden = "true" >
351- < path d = "M5 12h14" />
352- </ svg >
353- ) ;
354-
355- const IconMaximize = ( ) => (
356- < svg viewBox = "0 0 24 24" aria-hidden = "true" >
357- < rect x = "5" y = "5" width = "14" height = "14" />
358- </ svg >
359- ) ;
360-
361- const IconRestore = ( ) => (
362- < svg viewBox = "0 0 24 24" aria-hidden = "true" >
363- < path d = "M8 8h11v11H8z" />
364- < path d = "M5 5h11v3" />
365- </ svg >
366- ) ;
367-
368257function App ( ) {
369258 const embeddedState = getEmbeddedBootstrapState ( ) ;
370- const showDesktopTopBar = embeddedState ?. showWindowBar ?? false ;
371259 const hasEmbeddedState =
372260 Boolean ( embeddedState ?. view ) || Boolean ( embeddedState && Object . keys ( embeddedState . usageById ) . length > 0 ) ;
373261
@@ -376,7 +264,6 @@ function App() {
376264 const [ browserStart , setBrowserStart ] = createSignal < BrowserLoginStart | null > ( null ) ;
377265 const [ apiKeyDraft , setApiKeyDraft ] = createSignal ( "" ) ;
378266 const [ theme , setTheme ] = createSignal < Theme > ( embeddedState ?. theme === "dark" ? "dark" : "light" ) ;
379- const [ fullscreen , setFullscreen ] = createSignal ( false ) ;
380267 const [ addMenuOpen , setAddMenuOpen ] = createSignal ( false ) ;
381268 const [ isListeningForCallback , setIsListeningForCallback ] = createSignal ( false ) ;
382269 const [ showDepleted , setShowDepleted ] = createSignal ( false ) ;
@@ -490,7 +377,6 @@ function App() {
490377
491378 void saveEmbeddedBootstrapState ( {
492379 theme : theme ( ) ,
493- showWindowBar : showDesktopTopBar ,
494380 autoArchiveZeroQuota : AUTO_ARCHIVE_ZERO_QUOTA ,
495381 autoUnarchiveNonZeroQuota : AUTO_UNARCHIVE_NON_ZERO_QUOTA ,
496382 autoSwitchAwayFromArchived : AUTO_SWITCH_AWAY_FROM_DEPLETED_OR_FROZEN ,
@@ -1311,61 +1197,6 @@ function App() {
13111197 setNotice ( "Account removed." ) ;
13121198 } ;
13131199
1314- const refreshWindowState = async ( ) => {
1315- try {
1316- const status = await runWindowAction < boolean > (
1317- [ "cm_window_is_fullscreen" ] ,
1318- windowFullscreenGetter ( ) ,
1319- ) ;
1320- setFullscreen ( Boolean ( status ) ) ;
1321- } catch {
1322- setFullscreen ( false ) ;
1323- }
1324- } ;
1325-
1326- const handleMinimize = async ( ) => {
1327- try {
1328- await runWindowAction ( [ "cm_window_minimize" ] , window . cm_window_minimize ) ;
1329- } catch ( error ) {
1330- const message = error instanceof Error ? error . message : String ( error ) ;
1331- setError ( `Minimize failed: ${ message } ` ) ;
1332- }
1333- } ;
1334-
1335- const handleToggleFullscreen = async ( ) => {
1336- try {
1337- await runWindowAction < boolean > (
1338- [ "cm_window_toggle_fullscreen" ] ,
1339- windowFullscreenToggler ( ) ,
1340- ) ;
1341- const status = await runWindowAction < boolean > (
1342- [ "cm_window_is_fullscreen" ] ,
1343- windowFullscreenGetter ( ) ,
1344- ) ;
1345- setFullscreen ( Boolean ( status ) ) ;
1346- } catch ( error ) {
1347- const message = error instanceof Error ? error . message : String ( error ) ;
1348- setError ( `Fullscreen toggle failed: ${ message } ` ) ;
1349- }
1350- } ;
1351-
1352- const handleCloseWindow = async ( ) => {
1353- try {
1354- await runWindowAction ( [ "cm_window_close" ] , window . cm_window_close ) ;
1355- } catch ( error ) {
1356- const message = error instanceof Error ? error . message : String ( error ) ;
1357- setError ( `Close failed: ${ message } ` ) ;
1358- }
1359- } ;
1360-
1361- const handleTitleBarDoubleClick = async ( event : MouseEvent ) => {
1362- const target = event . target as HTMLElement | null ;
1363- if ( target ?. closest ( ".window-controls" ) ) {
1364- return ;
1365- }
1366- await handleToggleFullscreen ( ) ;
1367- } ;
1368-
13691200 const toggleTheme = ( ) => {
13701201 const nextTheme : Theme = theme ( ) === "light" ? "dark" : "light" ;
13711202 setTheme ( nextTheme ) ;
@@ -1418,51 +1249,14 @@ function App() {
14181249 } ) ;
14191250
14201251 try {
1421- await Promise . all ( [ refreshWindowState ( ) , refreshAccounts ( true ) ] ) ;
1252+ await refreshAccounts ( true ) ;
14221253 } finally {
14231254 setInitializing ( false ) ;
14241255 }
14251256 } ) ;
14261257
14271258 return (
14281259 < div class = "app-root" >
1429- < Show when = { showDesktopTopBar } >
1430- < header class = "window-bar reveal" onDblClick = { ( event ) => void handleTitleBarDoubleClick ( event ) } >
1431- < div class = "window-title mono" >
1432- Codex Account Manager
1433- </ div >
1434- < div class = "window-drag-area" />
1435- < div class = "window-controls" >
1436- < button
1437- class = "window-btn"
1438- type = "button"
1439- onClick = { handleMinimize }
1440- aria-label = "Minimize"
1441- >
1442- < IconMinimize />
1443- </ button >
1444- < button
1445- class = "window-btn"
1446- type = "button"
1447- onClick = { handleToggleFullscreen }
1448- aria-label = "Toggle fullscreen"
1449- >
1450- < Show when = { fullscreen ( ) } fallback = { < IconMaximize /> } >
1451- < IconRestore />
1452- </ Show >
1453- </ button >
1454- < button
1455- class = "window-btn window-btn-close"
1456- type = "button"
1457- onClick = { handleCloseWindow }
1458- aria-label = "Close"
1459- >
1460- < IconClose />
1461- </ button >
1462- </ div >
1463- </ header >
1464- </ Show >
1465-
14661260 < header class = "topbar reveal" >
14671261 < div class = "topbar-main" >
14681262 < h1 > Managed Accounts</ h1 >
0 commit comments