@@ -30,6 +30,7 @@ import {
3030 readGetParameters ,
3131} from "../states/leaderboard-selection" ;
3232import { configurationPromise as serverConfigurationPromise } from "../ape/server-configuration" ;
33+ import { showBlockingLoadingScreen } from "./loading-screen" ;
3334
3435type ChangeOptions = {
3536 force ?: boolean ;
@@ -95,111 +96,6 @@ function updateTitle(nextPage: { id: string; display?: string }): void {
9596 }
9697}
9798
98- async function showSyncLoading ( {
99- loadingOptions,
100- totalDuration,
101- } : {
102- loadingOptions : LoadingOptions [ ] ;
103- totalDuration : number ;
104- } ) : Promise < void > {
105- PageLoading . page . element . show ( ) . setStyle ( { opacity : "0" } ) ;
106- await PageLoading . page . beforeShow ( { } ) ;
107-
108- const fillDivider = loadingOptions . length ;
109- const fillOffset = 100 / fillDivider ;
110-
111- //void here to run the loading promise as soon as possible
112- void PageLoading . page . element . promiseAnimate ( {
113- opacity : "1" ,
114- duration : totalDuration / 2 ,
115- } ) ;
116-
117- for ( let i = 0 ; i < loadingOptions . length ; i ++ ) {
118- const currentOffset = fillOffset * i ;
119- const options = loadingOptions [ i ] as LoadingOptions ;
120- if ( options . style === "bar" ) {
121- await PageLoading . showBar ( ) ;
122- if ( i === 0 ) {
123- await PageLoading . updateBar ( 0 , 0 ) ;
124- PageLoading . updateText ( "" ) ;
125- }
126- } else {
127- PageLoading . showSpinner ( ) ;
128- }
129-
130- if ( options . style === "bar" ) {
131- await getLoadingPromiseWithBarKeyframes (
132- options ,
133- fillDivider ,
134- currentOffset ,
135- ) ;
136- void PageLoading . updateBar ( 100 , 125 ) ;
137- PageLoading . updateText ( "Done" ) ;
138- } else {
139- await options . loadingPromise ( ) ;
140- }
141- }
142-
143- await PageLoading . page . element . promiseAnimate ( {
144- opacity : "0" ,
145- duration : totalDuration / 2 ,
146- } ) ;
147-
148- await PageLoading . page . afterHide ( ) ;
149- PageLoading . page . element . hide ( ) ;
150- }
151-
152- // Global abort controller for keyframe promises
153- let keyframeAbortController : AbortController | null = null ;
154-
155- async function getLoadingPromiseWithBarKeyframes (
156- loadingOptions : Extract <
157- NonNullable < Page < unknown > [ "loadingOptions" ] > ,
158- { style : "bar" }
159- > ,
160- fillDivider : number ,
161- fillOffset : number ,
162- ) : Promise < void > {
163- let loadingPromise = loadingOptions . loadingPromise ( ) ;
164-
165- // Create abort controller for this keyframe sequence
166- const localAbortController = new AbortController ( ) ;
167- keyframeAbortController = localAbortController ;
168-
169- // Animate bar keyframes, but allow aborting if loading.promise finishes first or if globally aborted
170- const keyframePromise = ( async ( ) => {
171- for ( const keyframe of loadingOptions . keyframes ) {
172- if ( localAbortController . signal . aborted ) break ;
173- if ( keyframe . text !== undefined ) {
174- PageLoading . updateText ( keyframe . text ) ;
175- }
176- await PageLoading . updateBar (
177- fillOffset + keyframe . percentage / fillDivider ,
178- keyframe . durationMs ,
179- ) ;
180- }
181- } ) ( ) ;
182-
183- // Wait for either the keyframes or the loading.promise to finish
184- await Promise . race ( [
185- keyframePromise ,
186- ( async ( ) => {
187- await loadingPromise ;
188- localAbortController . abort ( ) ;
189- } ) ( ) ,
190- ] ) ;
191-
192- // Always wait for loading.promise to finish before continuing
193- await loadingPromise ;
194-
195- // Clean up the abort controller
196- if ( keyframeAbortController === localAbortController ) {
197- keyframeAbortController = null ;
198- }
199-
200- return ;
201- }
202-
20399export async function change (
204100 pageName : PageName ,
205101 options = { } as ChangeOptions ,
@@ -256,23 +152,12 @@ export async function change(
256152 }
257153
258154 if ( syncLoadingOptions . length > 0 ) {
259- await showSyncLoading ( {
155+ await showBlockingLoadingScreen ( {
260156 loadingOptions : syncLoadingOptions ,
261157 totalDuration,
262158 } ) ;
263159 }
264-
265- // Clean up abort controller after successful loading
266- if ( keyframeAbortController ) {
267- keyframeAbortController = null ;
268- }
269160 } catch ( error ) {
270- // Abort any running keyframe promises
271- if ( keyframeAbortController ) {
272- keyframeAbortController . abort ( ) ;
273- keyframeAbortController = null ;
274- }
275-
276161 pages . loading . element . addClass ( "active" ) ;
277162 setActivePage ( pages . loading . id ) ;
278163 Focus . set ( false ) ;
0 commit comments