feat: Begins htmx integration

This commit is contained in:
2025-02-27 12:38:08 -05:00
parent 36e00cd007
commit 3e17bf2a9a
10 changed files with 227 additions and 49 deletions

View File

@@ -1,6 +1,9 @@
import ApiController
import Dependencies
import DependenciesMacros
import Elementary
import Logging
import PsychrometricClient
import Routes
public extension DependencyValues {
@@ -14,7 +17,23 @@ public typealias AnySendableHTML = (any HTML & Sendable)
@DependencyClient
public struct ViewController: Sendable {
public var view: @Sendable (SiteRoute.View) async throws -> AnySendableHTML
public var view: @Sendable (Request) async throws -> AnySendableHTML
public struct Request: Sendable {
let route: SiteRoute.View
let isHtmxRequest: Bool
let logger: Logger
public init(
_ route: SiteRoute.View,
isHtmxRequest: Bool,
logger: Logger
) {
self.route = route
self.isHtmxRequest = isHtmxRequest
self.logger = logger
}
}
}
extension ViewController: TestDependencyKey {
@@ -23,10 +42,37 @@ extension ViewController: TestDependencyKey {
extension ViewController: DependencyKey {
public static var liveValue: ViewController {
.init(view: { _ in
MainPage {
MoldRiskForm()
@Dependency(\.psychrometricClient) var psychrometricClient
return .init(view: { request in
switch request.route {
case .index:
return MainPage {
p(.class("dark:text-gray-200")) {
"Professional calculators for HVAC system design and troubleshooting."
}
}
case let .moldRisk(route):
switch route {
case .index:
return request.respond(MoldRiskForm(response: nil))
case let .submit(request):
let response = try await psychrometricClient.respond(request)
return MoldRiskResponse(response: response)
}
}
})
}
}
extension ViewController.Request {
func respond<C: HTML>(
_ html: C
) -> AnySendableHTML where C: Sendable {
guard isHtmxRequest else {
return MainPage { html }
}
return html
}
}