This repository has been archived on 2026-02-12. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
swift-duct-calc/Sources/ViewController/Live.swift

157 lines
4.0 KiB
Swift

import Elementary
import ManualDCore
extension ViewController.Request {
func render() async throws -> AnySendableHTML {
switch route {
case .login(let route):
return try await route.renderView(isHtmxRequest: isHtmxRequest)
case .project(let route):
return try await route.renderView(isHtmxRequest: isHtmxRequest)
case .room(let route):
return try await route.renderView(isHtmxRequest: isHtmxRequest)
case .frictionRate(let route):
return try await route.renderView(isHtmxRequest: isHtmxRequest)
case .effectiveLength(let route):
return try await route.renderView(isHtmxRequest: isHtmxRequest)
case .user(let route):
return try await route.renderView(isHtmxRequest: isHtmxRequest)
default:
// FIX: FIX
return _render(isHtmxRequest: false) {
div { "Fix me!" }
}
}
}
}
extension SiteRoute.View.ProjectRoute {
func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML {
_render(isHtmxRequest: isHtmxRequest) {
switch self {
case .index:
ProjectView(project: .mock)
case .form(let dismiss):
ProjectForm(dismiss: dismiss)
case .create:
div { "Fix me!" }
}
}
}
}
extension SiteRoute.View.RoomRoute {
func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML {
switch self {
case .form(let dismiss):
return RoomForm(dismiss: dismiss)
case .index:
return _render(isHtmxRequest: isHtmxRequest, active: .rooms) {
RoomsView(rooms: Room.mocks)
}
}
}
}
extension SiteRoute.View.FrictionRateRoute {
func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML {
switch self {
case .index:
return _render(isHtmxRequest: isHtmxRequest, active: .frictionRate) {
FrictionRateView()
}
case .form(let type, let dismiss):
// FIX: Forms need to reference existing items.
switch type {
case .equipmentInfo:
return EquipmentForm(dismiss: dismiss)
case .componentPressureLoss:
return ComponentLossForm(dismiss: dismiss)
}
}
}
}
extension SiteRoute.View.FrictionRateRoute.FormType {
var id: String {
switch self {
case .equipmentInfo:
return "equipmentForm"
case .componentPressureLoss:
return "componentLossForm"
}
}
}
extension SiteRoute.View.EffectiveLengthRoute {
func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML {
switch self {
case .index:
return _render(isHtmxRequest: isHtmxRequest, active: .effectiveLength) {
EffectiveLengthsView(effectiveLengths: EffectiveLength.mocks)
}
case .form(let dismiss):
return EffectiveLengthForm(dismiss: dismiss)
case .field(let type):
switch type {
case .straightLength:
return StraightLengthField()
case .group:
return GroupField()
}
}
}
}
extension SiteRoute.View.UserRoute {
func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML {
switch self {
// case .login(.index):
// return _render(isHtmxRequest: isHtmxRequest, showSidebar: false) {
// LoginForm()
// }
case .signup(.index):
return _render(isHtmxRequest: isHtmxRequest, showSidebar: false) {
LoginForm(style: .signup)
}
default:
return div { "Fix Me!" }
}
}
}
extension SiteRoute.View.LoginRoute {
func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML {
_render(isHtmxRequest: isHtmxRequest, showSidebar: false) {
switch self {
case .index:
LoginForm()
case .submit:
// FIX:
div { "Fix me!" }
}
}
}
}
private func _render<C: HTML>(
isHtmxRequest: Bool,
active activeTab: Sidebar.ActiveTab = .projects,
showSidebar: Bool = true,
@HTMLBuilder inner: () -> C
) -> AnySendableHTML where C: Sendable {
if isHtmxRequest {
return inner()
}
return MainPage(
active: activeTab,
showSidebar: showSidebar
) {
inner()
}
}