Fetch Sample

Demo
Code
from dataclasses import dataclass

from webcompy.aio import AsyncWrapper
from webcompy.ajax import HttpClient
from webcompy.app import WebComPyApp
from webcompy.components import ComponentContext, define_component
from webcompy.elements import html, repeat
from webcompy.signal import use_reactive_list, use_state


@dataclass
class User:
    id: int
    name: str


@dataclass
class UsersResponse:
    data: list[User]


@define_component("fetch-sample-app")
def FetchSample(context: ComponentContext[None]):
    users = use_reactive_list(lambda: [])
    scalar_text = use_state(lambda: "")
    raw_text = use_state(lambda: "")

    @AsyncWrapper()
    async def fetch_object():
        res = await HttpClient.get("/_demos/fetch_sample/sample_object.json", response_type=UsersResponse)
        users.value = res.data

    @AsyncWrapper()
    async def fetch_array():
        res = await HttpClient.get("/_demos/fetch_sample/sample_array.json", response_type=list[User])
        users.value = res

    @AsyncWrapper()
    async def fetch_scalar():
        count = await HttpClient.get("/_demos/fetch_sample/sample_scalar.json", response_type=int)
        scalar_text.value = f"Total users: {count}"

    @AsyncWrapper()
    async def async_test():
        res = await HttpClient.get("/_demos/fetch_sample/sample_array.json")
        raw_text.value = res.text

    @context.on_after_rendering
    def _():
        fetch_object()
        fetch_array()
        fetch_scalar()
        async_test()

    return html.DIV(
        {},
        html.DIV(
            {},
            html.H5(
                {},
                "User Data",
            ),
            repeat(
                sequence=users,
                template=lambda user_data: html.DIV(
                    {"class": "user-data"},
                    html.UL(
                        {},
                        html.LI({}, "User ID: " + str(user_data.id)),
                        html.LI({}, "User Name: " + user_data.name),
                    ),
                ),
            ),
        ),
        html.DIV(
            {},
            html.H5(
                {},
                "Scalar Data",
            ),
            html.PRE(
                {},
                html.CODE(
                    {},
                    scalar_text,
                ),
            ),
        ),
        html.DIV(
            {},
            html.H5(
                {},
                "Response Data",
            ),
            html.PRE(
                {},
                html.CODE(
                    {},
                    raw_text,
                ),
            ),
        ),
    )


FetchSample.scoped_style = {
    ".user-data": {
        "margin": "10px auto",
        "padding": "10px",
        "background-color": "#fafafa",
        "border-radius": "15px",
    },
}

app = WebComPyApp(root_component=FetchSample)
app.run()