diff options
| -rw-r--r-- | Biz/PodcastItLater/UI.py | 18 | ||||
| -rw-r--r-- | Biz/PodcastItLater/Web.py | 63 |
2 files changed, 77 insertions, 4 deletions
diff --git a/Biz/PodcastItLater/UI.py b/Biz/PodcastItLater/UI.py index 72a0bf1..a457a02 100644 --- a/Biz/PodcastItLater/UI.py +++ b/Biz/PodcastItLater/UI.py @@ -197,6 +197,24 @@ class PageLayout(Component[AnyChildren, PageLayoutAttrs]): html.i( classes=[ "bi", + "bi-globe", + "me-1", + ], + ), + "Public Feed", + href="/public", + classes=[ + "nav-link", + "active" if is_active("public") else "", + ], + ), + classes=["nav-item"], + ), + html.li( + html.a( + html.i( + classes=[ + "bi", "bi-person-circle", "me-1", ], diff --git a/Biz/PodcastItLater/Web.py b/Biz/PodcastItLater/Web.py index 60818e9..57d9b91 100644 --- a/Biz/PodcastItLater/Web.py +++ b/Biz/PodcastItLater/Web.py @@ -683,6 +683,45 @@ class HomePageAttrs(Attrs): error: str | None +class PublicFeedPageAttrs(Attrs): + """Attributes for PublicFeedPage component.""" + + episodes: list[dict[str, typing.Any]] + user: dict[str, typing.Any] | None + + +class PublicFeedPage(Component[AnyChildren, PublicFeedPageAttrs]): + """Public feed page without auto-refresh.""" + + @override + def render(self) -> UI.PageLayout: + episodes = self.attrs["episodes"] + user = self.attrs.get("user") + + return UI.PageLayout( + html.div( + html.h2( + html.i(classes=["bi", "bi-globe", "me-2"]), + "Public Feed", + classes=["mb-3"], + ), + html.p( + "Featured articles converted to audio by our community. " + "Subscribe to get new episodes in your podcast app!", + classes=["lead", "text-muted", "mb-4"], + ), + EpisodeList( + episodes=episodes, + rss_url=f"{BASE_URL}/public.rss", + user=user, + ), + ), + user=user, + current_page="public", + error=None, + ) + + class HomePage(Component[AnyChildren, HomePageAttrs]): """Main page combining all components.""" @@ -766,8 +805,26 @@ class HomePage(Component[AnyChildren, HomePageAttrs]): error = self.attrs.get("error") if not user: + # Show public feed with login form for logged-out users return UI.PageLayout( LoginForm(error=error), + html.div( + html.h4( + html.i(classes=["bi", "bi-broadcast", "me-2"]), + "Public Feed", + classes=["mb-3", "mt-4"], + ), + html.p( + "Featured articles converted to audio. " + "Sign up to create your own personal feed!", + classes=["text-muted", "mb-3"], + ), + EpisodeList( + episodes=episodes, + rss_url=None, + user=None, + ), + ), user=None, current_page="home", error=error, @@ -855,18 +912,16 @@ def index(request: Request) -> HomePage: @app.get("/public") -def public_feed(request: Request) -> HomePage: +def public_feed(request: Request) -> PublicFeedPage: """Display public feed page.""" # Always show public episodes, whether user is logged in or not episodes = Core.Database.get_public_episodes(50) user_id = request.session.get("user_id") user = Core.Database.get_user_by_id(user_id) if user_id else None - return HomePage( - queue_items=[], + return PublicFeedPage( episodes=episodes, user=user, - error=None, ) |
