import { Component, inject, AfterViewInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Router, RouterOutlet, NavigationEnd } from '@angular/router';
import { filter, map } from 'rxjs/operators';
import { toSignal } from '@angular/core/rxjs-interop';
import { SidebarComponent } from '../components/sidebar/sidebar.component';
import { StatsPanelComponent } from '../components/stats-panel/stats-panel.component';
import { MinerSwitcherComponent } from '../components/miner-switcher/miner-switcher.component';
import { ToastComponent } from '../components/toast/toast.component';
import { ApiStatusComponent } from '../components/api-status/api-status.component';
@Component({
selector: 'app-main-layout',
standalone: true,
imports: [
CommonModule,
RouterOutlet,
SidebarComponent,
StatsPanelComponent,
MinerSwitcherComponent,
ToastComponent,
ApiStatusComponent,
],
template: `
`,
styles: [`
.main-layout {
display: flex;
min-height: 100vh;
background: var(--color-surface-400);
}
.main-content {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
}
.top-bar {
display: flex;
align-items: center;
gap: 1rem;
background: var(--color-surface-100);
border-bottom: 1px solid rgb(37 37 66 / 0.2);
padding-right: 1rem;
}
.top-bar app-stats-panel {
flex: 1;
}
.page-content {
flex: 1;
overflow-y: auto;
padding: 1rem;
}
/* Mobile responsive styles */
@media (max-width: 768px) {
.top-bar {
flex-direction: column;
align-items: stretch;
gap: 0.5rem;
padding: 0.75rem;
padding-left: 3.5rem; /* Space for hamburger menu */
}
.page-content {
padding: 0.75rem;
}
}
`]
})
export class MainLayoutComponent implements AfterViewInit {
private router = inject(Router);
// Track current route from router events
currentRoute = toSignal(
this.router.events.pipe(
filter((event): event is NavigationEnd => event instanceof NavigationEnd),
map(event => {
// Extract route from URL like "/#/workers" or "/workers"
const url = event.urlAfterRedirects;
const segments = url.split('/').filter(s => s && s !== '#');
return segments[0] || 'dashboard';
})
),
{ initialValue: this.getInitialRoute() }
);
private getInitialRoute(): string {
const url = this.router.url;
const segments = url.split('/').filter(s => s && s !== '#');
return segments[0] || 'dashboard';
}
ngAfterViewInit() {
// Re-trigger navigation after router-outlet is available
// This handles the case where router tried to navigate before outlet existed
const route = this.getInitialRoute();
setTimeout(() => this.router.navigate(['/', route]), 0);
}
onRouteChange(route: string) {
this.router.navigate(['/', route]);
}
navigateToProfiles(profileId: string) {
// TODO: Could pass profileId via query params or state
this.router.navigate(['/', 'profiles']);
}
}