TheNoiseClock/TheNoiseClock/Views/Clock/ClockView.swift

75 lines
2.2 KiB
Swift

//
// ClockView.swift
// TheNoiseClock
//
// Created by Matt Bruce on 9/7/25.
//
import SwiftUI
/// Main clock display view with settings and display mode
struct ClockView: View {
// MARK: - Properties
@State private var viewModel = ClockViewModel()
@State private var showSettings = false
// MARK: - Body
var body: some View {
ZStack {
viewModel.style.effectiveBackgroundColor
.ignoresSafeArea()
GeometryReader { geometry in
ZStack {
// Main clock display container
ClockDisplayContainer(
currentTime: viewModel.currentTime,
style: viewModel.style,
isDisplayMode: viewModel.isDisplayMode
)
// Top overlay container
ClockOverlayContainer(style: viewModel.style)
}
}
}
.ignoresSafeArea(.all, edges: viewModel.isDisplayMode ? .bottom : [])
.statusBarHidden(viewModel.isDisplayMode)
.sheet(isPresented: $showSettings) {
ClockSettingsView(style: viewModel.style) { newStyle in
viewModel.updateStyle(newStyle)
}
.presentationDetents(UIDevice.current.userInterfaceIdiom == .pad ? [.large] : [.medium, .large])
.presentationDragIndicator(.visible)
.presentationBackgroundInteraction(.enabled)
}
.overlay {
// Toolbar overlay
ClockToolbar(
isDisplayMode: viewModel.isDisplayMode,
onSettingsTap: { showSettings = true }
)
}
.overlay {
// Tab bar management overlay
ClockTabBarManager(isDisplayMode: viewModel.isDisplayMode)
}
.overlay {
// Gesture handling overlay
ClockGestureHandler {
viewModel.toggleDisplayMode()
}
}
}
}
// MARK: - Preview
#Preview {
NavigationStack {
ClockView()
}
.frame(width: 400, height: 600)
.background(Color.black)
}