add a datastar action

This commit is contained in:
Abel Luck 2026-03-30 12:48:32 +02:00
parent 33dbb143fd
commit 3fc999a69b
3 changed files with 142 additions and 2 deletions

View file

@ -7,7 +7,8 @@ from contextlib import suppress
from typing import cast
import htpy as h
from datastar_py.quart import DatastarResponse
from datastar_py import ServerSentEventGenerator as SSE
from datastar_py.quart import DatastarResponse, read_signals
from datastar_py.sse import DatastarEvent
from htpy import Renderable
from quart import Quart, Response, request, url_for
@ -77,6 +78,16 @@ def create_app(*, enable_demo_refresh: bool = True) -> Quart:
)
return DatastarResponse(_unsubscribe_on_close(queue, stream, app))
@app.post("/demo/decrement")
async def demo_decrement() -> DatastarResponse:
amount, error = _validated_decrement_amount(await read_signals())
if error is not None:
return DatastarResponse(SSE.patch_signals({"decrementError": error}))
set_active_jobs(app, max(0, get_active_jobs(app) - amount))
trigger_refresh(app)
return DatastarResponse(SSE.patch_signals({"decrementError": ""}))
return app
@ -115,3 +126,20 @@ async def _demo_refresh_loop(app: Quart) -> None:
await asyncio.sleep(1)
set_active_jobs(app, get_active_jobs(app) + 1)
trigger_refresh(app)
def _validated_decrement_amount(
signals: dict[str, object] | None,
) -> tuple[int, str | None]:
raw_amount = (
"" if signals is None else str(signals.get("decrementAmount", "")).strip()
)
try:
amount = int(raw_amount)
except ValueError:
return 0, "Decrement amount must be an odd integer."
if amount < 1 or amount % 2 == 0:
return 0, "Decrement amount must be an odd integer."
return amount, None