feat: Begins htmx integration
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user