···75#[component]
76pub fn AppLink(props: AppLinkProps) -> Element {
77 let link_mode = use_context::<LinkMode>();
078 let class = props.class.clone().unwrap_or_default();
7980 match link_mode {
···75#[component]
76pub fn AppLink(props: AppLinkProps) -> Element {
77 let link_mode = use_context::<LinkMode>();
78+ tracing::info!(?link_mode, "AppLink: reading LinkMode context");
79 let class = props.class.clone().unwrap_or_default();
8081 match link_mode {
+8-8
crates/weaver-app/src/components/entry.rs
···1#![allow(non_snake_case)]
23-use crate::components::{AppLink, AppLinkTarget};
4-use crate::Route;
5#[cfg(feature = "server")]
6use crate::blobcache::BlobCache;
7use crate::components::AuthorList;
08use crate::{components::EntryActions, data::use_handle};
9use dioxus::prelude::*;
10use jacquard::types::aturi::AtUri;
···32) -> Element {
33 // Use feature-gated hook for SSR support
34 let (entry_res, entry) = crate::data::use_entry_data(ident, book_title, title);
35- let route = use_route::<Route>();
36- let mut last_route = use_signal(|| route.clone());
03738 #[cfg(all(
39 target_family = "wasm",
···47 let mut entry_res = entry_res?;
4849 #[cfg(feature = "fullstack-server")]
50- use_effect(use_reactive!(|route| {
51- if route != last_route() {
52- tracing::debug!("[EntryPage] route changed, restarting resource");
53 entry_res.restart();
54- last_route.set(route.clone());
55 }
56 }));
57
···1#![allow(non_snake_case)]
2003#[cfg(feature = "server")]
4use crate::blobcache::BlobCache;
5use crate::components::AuthorList;
6+use crate::components::{AppLink, AppLinkTarget};
7use crate::{components::EntryActions, data::use_handle};
8use dioxus::prelude::*;
9use jacquard::types::aturi::AtUri;
···31) -> Element {
32 // Use feature-gated hook for SSR support
33 let (entry_res, entry) = crate::data::use_entry_data(ident, book_title, title);
34+35+ // Track props for change detection (works with both Route and SubdomainRoute)
36+ let mut last_title = use_signal(|| title().clone());
3738 #[cfg(all(
39 target_family = "wasm",
···47 let mut entry_res = entry_res?;
4849 #[cfg(feature = "fullstack-server")]
50+ use_effect(use_reactive!(|title| {
51+ if title != last_title() {
52+ tracing::debug!("[EntryPage] title changed, restarting resource");
53 entry_res.restart();
54+ last_title.set(title());
55 }
56 }));
57
···1213/// Determines if the current route should show the full footer or just the minimal version.
14/// Full footer shows on shell pages (Home, Editor) and on owner's content pages.
15-fn should_show_full_footer(route: &Route) -> bool {
16 match route {
17 // Shell pages: always show full footer
18 Route::Home {}
···67}
6869#[component]
70-pub fn Footer() -> Element {
71- let route = use_route::<Route>();
72- let show_full = should_show_full_footer(&route);
73-74 rsx! {
75 document::Link { rel: "stylesheet", href: FOOTER_CSS }
76···174 rel: "noopener",
175 "Report Bug"
176 }
000000000177 }
178 }
179 }
···1213/// Determines if the current route should show the full footer or just the minimal version.
14/// Full footer shows on shell pages (Home, Editor) and on owner's content pages.
15+pub fn should_show_full_footer(route: &Route) -> bool {
16 match route {
17 // Shell pages: always show full footer
18 Route::Home {}
···67}
6869#[component]
70+pub fn Footer(#[props(default = true)] show_full: bool) -> Element {
00071 rsx! {
72 document::Link { rel: "stylesheet", href: FOOTER_CSS }
73···171 rel: "noopener",
172 "Report Bug"
173 }
174+175+ span { class: "footer-separator", "|" }
176+177+ Link {
178+ to: crate::env::WEAVER_APP_HOST,
179+ class: "footer-link",
180+ "weaver.sh"
181+ }
182+183 }
184 }
185 }
+1-1
crates/weaver-app/src/views/mod.rs
···39pub use invites::InvitesPage;
4041mod footer;
42-pub use footer::Footer;
4344mod static_page;
45pub use static_page::{AboutPage, PrivacyPage, TermsPage};
···39pub use invites::InvitesPage;
4041mod footer;
42+pub use footer::{Footer, should_show_full_footer};
4344mod static_page;
45pub use static_page::{AboutPage, PrivacyPage, TermsPage};
···8 a.status as account_status,
9 'account' as source,
10 a.event_time,
11- now64(3) as indexed_at
12FROM raw_account_events a
13INNER JOIN handle_mappings h ON h.did = a.did AND h.freed = 0
14WHERE a.active = 0 AND a.status != ''
···8 a.status as account_status,
9 'account' as source,
10 a.event_time,
11+ a.indexed_at
12FROM raw_account_events a
13INNER JOIN handle_mappings h ON h.did = a.did AND h.freed = 0
14WHERE a.active = 0 AND a.status != ''
···14 -- Position from array index
15 assumeNotNull(entry_position) as position,
1617- now64(3) as indexed_at
18FROM notebooks
19ARRAY JOIN
20 record.entryList[].uri as entry_uri,
···14 -- Position from array index
15 assumeNotNull(entry_position) as position,
1617+ indexed_at
18FROM notebooks
19ARRAY JOIN
20 record.entryList[].uri as entry_uri,