Skip to content

Commit 9b77be9

Browse files
committed
MOBILE-4975 core: Fix reading screen orientation too soon
1 parent 2058623 commit 9b77be9

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/core/components/tests/iframe.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ describe('CoreIframeComponent', () => {
2222

2323
beforeEach(() => {
2424
mockSingleton(CoreScreen, {
25+
_orientationSignal: signal(CoreScreenOrientation.PORTRAIT), // eslint-disable-line @typescript-eslint/naming-convention
2526
orientationSignal: signal(CoreScreenOrientation.PORTRAIT).asReadonly(),
2627
});
2728
});

src/core/services/screen.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export class CoreScreenService {
6666

6767
protected breakpointsSubject: BehaviorSubject<Record<Breakpoint, boolean>>;
6868
private _layoutObservable: Observable<CoreScreenLayout>;
69-
private readonly _orientationSignal = signal<CoreScreenOrientation>(this.orientation);
69+
private readonly _orientationSignal = signal<CoreScreenOrientation>(CoreScreenOrientation.PORTRAIT);
7070

7171
constructor() {
7272
this.breakpointsSubject = new BehaviorSubject(BREAKPOINT_NAMES.reduce((breakpoints, breakpoint) => ({
@@ -78,6 +78,8 @@ export class CoreScreenService {
7878
map(breakpoints => this.calculateLayout(breakpoints)),
7979
distinctUntilChanged<CoreScreenLayout>(),
8080
);
81+
82+
this.initializeOrientation();
8183
}
8284

8385
get breakpoints(): Record<Breakpoint, boolean> {
@@ -105,7 +107,12 @@ export class CoreScreenService {
105107
}
106108

107109
get orientation(): CoreScreenOrientation {
108-
return screen.orientation.type.startsWith(CoreScreenOrientation.LANDSCAPE)
110+
if (!this.orientationDataExists()) {
111+
// Not initialized yet, assume portrait.
112+
return CoreScreenOrientation.PORTRAIT;
113+
}
114+
115+
return screen.orientation.type?.startsWith(CoreScreenOrientation.LANDSCAPE)
109116
? CoreScreenOrientation.LANDSCAPE
110117
: CoreScreenOrientation.PORTRAIT;
111118
}
@@ -203,6 +210,24 @@ export class CoreScreenService {
203210
return CoreScreenLayout.MOBILE;
204211
}
205212

213+
/**
214+
* Initialize the orientation signal value.
215+
*/
216+
protected async initializeOrientation(): Promise<void> {
217+
await CorePlatform.ready();
218+
219+
this._orientationSignal.set(this.orientation);
220+
}
221+
222+
/**
223+
* Check if the orientation data exists.
224+
*
225+
* @returns Whether the orientation data exists.
226+
*/
227+
protected orientationDataExists(): boolean {
228+
return !!screen?.orientation;
229+
}
230+
206231
}
207232

208233
export const CoreScreen = makeSingleton(CoreScreenService);

0 commit comments

Comments
 (0)