= { 1: 'info', 2: 'warn', 3: 'error' };
+ return map[level] ?? 'info';
+ }
+
+ /**
+ * Checks whether the current time falls within the declared maintenance window.
+ *
+ * @param maintenance - The maintenance object containing `start` and `end` date strings
+ * @returns `true` if now is between the start and end, otherwise `false`
+ */
+ private isWithinMaintenanceWindow(maintenance: MaintenanceModel): boolean {
+ if (!maintenance.start || !maintenance.end) return false;
+ const now = new Date();
+ return now >= new Date(maintenance.start) && now <= new Date(maintenance.end);
+ }
+}
diff --git a/src/app/core/components/root/root.component.html b/src/app/core/components/root/root.component.html
index bf50403cf..d2892e0bd 100644
--- a/src/app/core/components/root/root.component.html
+++ b/src/app/core/components/root/root.component.html
@@ -4,7 +4,7 @@
}
-
+
@if (isWeb()) {
diff --git a/src/app/core/components/root/root.component.spec.ts b/src/app/core/components/root/root.component.spec.ts
index 3abb0c762..5af86e7e0 100644
--- a/src/app/core/components/root/root.component.spec.ts
+++ b/src/app/core/components/root/root.component.spec.ts
@@ -13,14 +13,14 @@ import { HeaderComponent } from '@core/components/header/header.component';
import { TopnavComponent } from '@core/components/topnav/topnav.component';
import { IS_WEB, IS_XSMALL } from '@osf/shared/helpers';
-import { MaintenanceBannerComponent } from '../maintenance-banner/maintenance-banner.component';
+import { OSFBannerComponent } from '../osf-banners/osf-banner.component';
import { SidenavComponent } from '../sidenav/sidenav.component';
import { RootComponent } from './root.component';
import { OSFTestingModule } from '@testing/osf.testing.module';
-describe('RootComponent', () => {
+describe('Component: Root', () => {
let component: RootComponent;
let fixture: ComponentFixture;
let isWebSubject: BehaviorSubject;
@@ -41,7 +41,7 @@ describe('RootComponent', () => {
ConfirmDialog,
BreadcrumbComponent,
SidenavComponent,
- MaintenanceBannerComponent
+ OSFBannerComponent
),
],
providers: [
diff --git a/src/app/core/components/root/root.component.ts b/src/app/core/components/root/root.component.ts
index 7f7888e51..81b867196 100644
--- a/src/app/core/components/root/root.component.ts
+++ b/src/app/core/components/root/root.component.ts
@@ -13,24 +13,24 @@ import { IS_MEDIUM, IS_WEB } from '@osf/shared/helpers';
import { BreadcrumbComponent } from '../breadcrumb/breadcrumb.component';
import { FooterComponent } from '../footer/footer.component';
import { HeaderComponent } from '../header/header.component';
-import { MaintenanceBannerComponent } from '../maintenance-banner/maintenance-banner.component';
+import { OSFBannerComponent } from '../osf-banners/osf-banner.component';
import { SidenavComponent } from '../sidenav/sidenav.component';
import { TopnavComponent } from '../topnav/topnav.component';
@Component({
selector: 'osf-root',
imports: [
+ BreadcrumbComponent,
CommonModule,
- HeaderComponent,
- FooterComponent,
- TopnavComponent,
ConfirmDialog,
- BreadcrumbComponent,
+ FooterComponent,
+ HeaderComponent,
+ OSFBannerComponent,
RouterOutlet,
+ ScrollTopOnRouteChangeDirective,
SidenavComponent,
- MaintenanceBannerComponent,
+ TopnavComponent,
TranslatePipe,
- ScrollTopOnRouteChangeDirective,
],
templateUrl: './root.component.html',
styleUrls: ['./root.component.scss'],
diff --git a/src/app/core/models/maintenance.model.ts b/src/app/core/models/maintenance.model.ts
deleted file mode 100644
index 3fc82e1f1..000000000
--- a/src/app/core/models/maintenance.model.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-export interface Maintenance {
- level: number;
- message: string;
- start: string;
- end: string;
- severity?: MaintenanceSeverity;
-}
-
-export type MaintenanceSeverity = 'info' | 'warn' | 'error';
diff --git a/src/app/core/services/maintenance.service.ts b/src/app/core/services/maintenance.service.ts
deleted file mode 100644
index 012f03e38..000000000
--- a/src/app/core/services/maintenance.service.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { catchError, Observable, of } from 'rxjs';
-import { map } from 'rxjs/operators';
-
-import { HttpClient } from '@angular/common/http';
-import { inject, Injectable } from '@angular/core';
-
-import { ENVIRONMENT } from '@core/provider/environment.provider';
-
-import { Maintenance, MaintenanceSeverity } from '../models/maintenance.model';
-
-@Injectable({ providedIn: 'root' })
-export class MaintenanceService {
- private readonly http = inject(HttpClient);
- private readonly environment = inject(ENVIRONMENT);
- private readonly apiUrl = `${this.environment.apiDomainUrl}/v2`;
-
- fetchMaintenanceStatus(): Observable {
- return this.http.get<{ maintenance?: Maintenance }>(`${this.apiUrl}/status/`).pipe(
- map((data) => {
- const maintenance = data.maintenance;
- if (maintenance && this.isWithinMaintenanceWindow(maintenance)) {
- return { ...maintenance, severity: this.getSeverity(maintenance.level) };
- }
- return null;
- }),
- catchError(() => of(null))
- );
- }
-
- getSeverity(level: number): MaintenanceSeverity {
- const map: Record = { 1: 'info', 2: 'warn', 3: 'error' };
- return map[level] ?? 'info';
- }
-
- private isWithinMaintenanceWindow(maintenance: Maintenance): boolean {
- if (!maintenance.start || !maintenance.end) return false;
- const now = new Date();
- return now >= new Date(maintenance.start) && now <= new Date(maintenance.end);
- }
-}
diff --git a/src/testing/osf.testing.module.ts b/src/testing/osf.testing.module.ts
index 8687591d1..a4e376233 100644
--- a/src/testing/osf.testing.module.ts
+++ b/src/testing/osf.testing.module.ts
@@ -3,13 +3,11 @@ import { TranslateModule } from '@ngx-translate/core';
import { CommonModule } from '@angular/common';
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
import { provideHttpClientTesting } from '@angular/common/http/testing';
-import { NgModule, PLATFORM_ID } from '@angular/core';
+import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { NoopAnimationsModule, provideNoopAnimations } from '@angular/platform-browser/animations';
import { provideRouter } from '@angular/router';
-import { WINDOW, windowFactory } from '@core/provider/window.provider';
-
import { DynamicDialogRefMock } from './mocks/dynamic-dialog-ref.mock';
import { EnvironmentTokenMock } from './mocks/environment.token.mock';
import { StoreMock } from './mocks/store.mock';
@@ -37,11 +35,6 @@ import { TranslationServiceMock } from './mocks/translation.service.mock';
DynamicDialogRefMock,
EnvironmentTokenMock,
ToastServiceMock,
- {
- provide: WINDOW,
- useFactory: windowFactory,
- deps: [PLATFORM_ID],
- },
],
})
export class OSFTestingModule {}