211 lines
6.0 KiB
Swift
211 lines
6.0 KiB
Swift
import DatabaseClient
|
|
import Dependencies
|
|
import Elementary
|
|
import Foundation
|
|
import ManualDCore
|
|
|
|
extension ViewController.Request {
|
|
|
|
func render() async throws -> AnySendableHTML {
|
|
|
|
@Dependency(\.database) var database
|
|
|
|
switch route {
|
|
case .login(let route):
|
|
switch route {
|
|
case .index:
|
|
return try await _render(isHtmxRequest: isHtmxRequest, showSidebar: false) {
|
|
LoginForm()
|
|
}
|
|
case .submit(let login):
|
|
let token = try await database.users.login(login)
|
|
let user = try await database.users.get(token.userID)!
|
|
authenticate(user)
|
|
let projects = try await database.projects.fetch(user.id, .init(page: 1, per: 25))
|
|
return try await _render(isHtmxRequest: isHtmxRequest, showSidebar: false) {
|
|
ProjectsTable(userID: user.id, projects: projects)
|
|
}
|
|
}
|
|
case .signup(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 try await _render(isHtmxRequest: false) {
|
|
div { "Fix me!" }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
extension SiteRoute.View.ProjectRoute {
|
|
|
|
private var shouldShowSidebar: Bool {
|
|
switch self {
|
|
case .index, .page: return false
|
|
default: return true
|
|
}
|
|
}
|
|
|
|
func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML {
|
|
@Dependency(\.database.projects) var projects
|
|
|
|
return try await _render(
|
|
isHtmxRequest: isHtmxRequest,
|
|
showSidebar: shouldShowSidebar
|
|
) {
|
|
switch self {
|
|
case .index:
|
|
// ProjectView(project: .mock)
|
|
let page = try await projects.fetch(UUID(0), .init(page: 1, per: 25))
|
|
ProjectsTable(userID: UUID(0), projects: page)
|
|
case .page(let page, let limit):
|
|
let page = try await projects.fetch(UUID(0), .init(page: page, per: limit))
|
|
ProjectsTable.Rows(projects: page)
|
|
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 try await _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 try await _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 try await _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.SignupRoute {
|
|
|
|
func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML {
|
|
@Dependency(\.database.users) var users
|
|
|
|
switch self {
|
|
case .index:
|
|
return try await _render(isHtmxRequest: isHtmxRequest, showSidebar: false) {
|
|
LoginForm(style: .signup)
|
|
}
|
|
case .submit(let request):
|
|
_ = try await users.create(request)
|
|
// FIX: We should just login the new user at this point.
|
|
return try await _render(isHtmxRequest: isHtmxRequest, showSidebar: false) {
|
|
LoginForm()
|
|
}
|
|
|
|
// default:
|
|
// return div { "Fix Me!" }
|
|
}
|
|
}
|
|
}
|
|
|
|
// extension SiteRoute.View.LoginRoute {
|
|
// func renderView(on req: ViewController.Request) async throws -> AnySendableHTML {
|
|
//
|
|
// @Dependency(\.database) var database
|
|
//
|
|
// return try await _render(isHtmxRequest: req.isHtmxRequest, showSidebar: false) {
|
|
// switch self {
|
|
// case .index:
|
|
// LoginForm()
|
|
// case .submit(let login):
|
|
// // FIX:
|
|
// // div { "Logged in Success! Fix me!" }
|
|
// let token = try await database.users.login(login)
|
|
// let user = try await database.users.get(token.userID)!
|
|
// _ = req.authenticate(user)
|
|
// // req.authenticate(user)
|
|
// let page = try await database.projects.fetch(user.id, .init(page: 1, per: 25))
|
|
// ProjectsTable(userID: user.id, projects: page)
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
private func _render<C: HTML>(
|
|
isHtmxRequest: Bool,
|
|
active activeTab: Sidebar.ActiveTab = .projects,
|
|
showSidebar: Bool = true,
|
|
@HTMLBuilder inner: () async throws -> C
|
|
) async throws -> AnySendableHTML where C: Sendable {
|
|
let inner = try await inner()
|
|
if isHtmxRequest {
|
|
return inner
|
|
}
|
|
return MainPage(
|
|
active: activeTab,
|
|
showSidebar: showSidebar
|
|
) {
|
|
inner
|
|
}
|
|
}
|