Skip to content

Commit 675e1be

Browse files
committed
add hx-trigger example
1 parent 2f5e395 commit 675e1be

File tree

5 files changed

+65
-8
lines changed

5 files changed

+65
-8
lines changed

Examples/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ Start the server by running `swift run App` in the project root
88

99
- (HX-Location)[Sources/App/HtmxExamples/HXLocationHandlers.swift] - Do a client side redirect via `HX-Location`
1010
- (HX-Reswap)[Sources/App/HtmxExamples/HXReswapHandlers.swift] - Swap an element via `HX-Reswap`
11+
- (HX-Trigger)[Sources/App/HtmxExamples/HXTriggerHandlers.swift] - Trigger a client-side event via `HX-Trigger`

Examples/Sources/App/Application+build.swift

+2
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,7 @@ func buildRouter() -> Router<AppRequestContext> {
5656
router.on(route: .hxLocationB, use: hxLocationBHandler)
5757
router.on(route: .hxLocationBSubmit, use: hxLocationBSubmitHandler)
5858
router.on(route: .hxReswapHttp, use: hxReswapHandler)
59+
router.on(route: .hxTrigger, use: hxTriggerHandler)
60+
router.on(route: .hxTriggerAlert, use: hxTriggerAlertHandler)
5961
return router
6062
}

Examples/Sources/App/HtmxExamples/HXLocationHandlers.swift

+8-8
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ extension Route {
3232
}
3333

3434
@Sendable func hxLocationSubmitHandler(_ req: Request) -> Response {
35-
if req.isHtmxRequest {
36-
return Response(
37-
status: .ok,
38-
headers: HTTPFields([
39-
.hxLocation(Route.hxLocationB.path)
40-
])
41-
)
35+
guard req.isHtmxRequest else {
36+
return Response(status: .badRequest)
4237
}
43-
return Response(status: .badRequest)
38+
return Response(
39+
status: .ok,
40+
headers: HTTPFields([
41+
.hxLocation(Route.hxLocationB.path)
42+
])
43+
)
4444
}
4545

4646
@Sendable func hxLocationBHandler(_ req: Request) -> Response {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import Foundation
2+
import HTTPTypesHtmx
3+
import Hummingbird
4+
5+
#if canImport(FoundationNetworking)
6+
import FoundationNetworking
7+
#endif
8+
9+
extension Route {
10+
static let hxTrigger = Route(.get, "/examples/hx-trigger")
11+
static let hxTriggerAlert = Route(.post, "/examples/hx-trigger")
12+
}
13+
14+
@Sendable func hxTriggerHandler(_ req: Request) -> Response {
15+
.html(
16+
htmlLayout(
17+
"""
18+
<div>
19+
<h2>HX-Trigger Example</h2>
20+
<p>This example uses HX-Trigger to trigger a client-side event that shows an alert</p>
21+
<div>
22+
<button
23+
hx-post="\(Route.hxTriggerAlert.path)"
24+
hx-swap="none"
25+
>Trigger</button>
26+
</div>
27+
<script>
28+
document.body.addEventListener("showMessage", function(evt){
29+
alert(evt.detail.value);
30+
})
31+
</script>
32+
</div>
33+
"""
34+
)
35+
)
36+
}
37+
38+
@Sendable func hxTriggerAlertHandler(_ req: Request) -> Response {
39+
guard req.isHtmxRequest else {
40+
return Response(status: .badRequest)
41+
}
42+
43+
return Response(
44+
status: .ok,
45+
headers: HTTPFields([
46+
.hxTrigger(
47+
event: """
48+
{"showMessage":"This alert was triggered by HX-Trigger"}
49+
"""
50+
)
51+
])
52+
)
53+
}

Examples/Sources/App/HtmxExamples/Support/HtmlLayout.swift

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ func htmlLayout(_ content: String) -> String {
1616
<ul>
1717
<li><a href="\(Route.hxLocation.path)">HX-Location</a></li>
1818
<li><a href="\(Route.hxReswapHttp.path)">HX-Reswap</a></li>
19+
<li><a href="\(Route.hxTrigger.path)">HX-Trigger</a></li>
1920
</ul>
2021
</nav>
2122
</header>

0 commit comments

Comments
 (0)