""" All-markets blueprint — shows markets across ALL pages. Mounted at / (root of market app). No slug context. Routes: GET / — full page with first page of markets GET /all-markets — HTMX fragment for infinite scroll """ from __future__ import annotations from quart import Blueprint, g, request, render_template, make_response from shared.browser.app.utils.htmx import is_htmx_request from shared.services.registry import services def register() -> Blueprint: bp = Blueprint("all_markets", __name__) async def _load_markets(page, per_page=20): """Load all markets + page info for container badges.""" markets, has_more = await services.market.list_marketplaces( g.s, page=page, per_page=per_page, ) # Batch-load page info for container_ids page_info = {} if markets: post_ids = list({ m.container_id for m in markets if m.container_type == "page" }) if post_ids: posts = await services.blog.get_posts_by_ids(g.s, post_ids) for p in posts: page_info[p.id] = {"title": p.title, "slug": p.slug} return markets, has_more, page_info @bp.get("/") async def index(): page = int(request.args.get("page", 1)) markets, has_more, page_info = await _load_markets(page) ctx = dict( markets=markets, has_more=has_more, page_info=page_info, page=page, ) if is_htmx_request(): html = await render_template("_types/all_markets/_main_panel.html", **ctx) else: html = await render_template("_types/all_markets/index.html", **ctx) return await make_response(html, 200) @bp.get("/all-markets") async def markets_fragment(): page = int(request.args.get("page", 1)) markets, has_more, page_info = await _load_markets(page) html = await render_template( "_types/all_markets/_cards.html", markets=markets, has_more=has_more, page_info=page_info, page=page, ) return await make_response(html, 200) return bp