import { Injectable, computed, signal } from '@angular/core';
import { BehaviorSubject, Observable, Subject, fromEvent } from 'rxjs';
export enum Platform {
MOBILE,
TABLET,
DESKTOP,
}
@Injectable({
providedIn: 'root',
})
export class PlatformService {
private resizeEvent$: Observable<any>;
// 초기값 : DESKTOP 설정
public platform$ = new BehaviorSubject<Platform>(Platform.DESKTOP);
private width = signal<number>(window.innerWidth);
private isMobile = computed(() => this.width() < 480);
private isTablet = computed(() => this.width() < 640 && this.width() >= 480);
private isDesktop = computed(() => this.width() >= 640);
constructor() {
this.resizeEvent$ = fromEvent(window, 'resize');
this.resizeEvent$.subscribe({
next: () => {
this.width.set(window.innerWidth);
this.setPlatform();
},
});
this.setPlatform();
}
setPlatform() {
console.log(this.isMobile(), this.isTablet(), this.isDesktop());
if (this.isMobile()) {
this.platform$.next(Platform.MOBILE);
} else if (this.isTablet()) {
this.platform$.next(Platform.TABLET);
} else if (this.isDesktop()) {
this.platform$.next(Platform.DESKTOP);
}
}
platform() {
return this.platform$.asObservable();
}
}
platform$ with the type BehaviorSubject<Platform>.BehaviorSubject is a type of Observable that stores the current value and emits it to new subscribers.<Platform> specifies the type of values that will be emitted by the BehaviorSubject, in this case, the Platform enum.Platform.DESKTOP is passed as the initial value to the BehaviorSubject. It means that the initial platform value is set to DESKTOP.In summary, the platform$ property is a BehaviorSubject that will emit platform values of type Platform. It starts with an initial value of DESKTOP. Other parts of the code can subscribe to this BehaviorSubject to receive updates whenever the platform changes.