Skip to content

Commit 4cd06c5

Browse files
committed
fix: 🚑 changed browser-checking logic to not use context
Using context breaks i18n completely.
1 parent 7600c95 commit 4cd06c5

File tree

4 files changed

+22
-37
lines changed

4 files changed

+22
-37
lines changed

packages/perseus/src/build.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,7 @@ pub async fn build_template(
6767
.await?;
6868
// Prerender the template using that state
6969
let prerendered = sycamore::render_to_string(|| {
70-
template.render_for_template(
71-
Some(initial_state.clone()),
72-
Rc::clone(&translator),
73-
true,
74-
)
70+
template.render_for_template(Some(initial_state.clone()), Rc::clone(&translator))
7571
});
7672
// Write that prerendered HTML to a static file
7773
config_manager
@@ -108,7 +104,7 @@ pub async fn build_template(
108104
// It's safe to add a property to the render options here because `.is_basic()` will only return true if path generation is not being used (or anything else)
109105
if template.is_basic() {
110106
let prerendered = sycamore::render_to_string(|| {
111-
template.render_for_template(None, Rc::clone(&translator), true)
107+
template.render_for_template(None, Rc::clone(&translator))
112108
});
113109
let head_str = template.render_head_str(None, Rc::clone(&translator));
114110
// Write that prerendered HTML to a static file

packages/perseus/src/serve.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ async fn render_request_state(
6969
let state = Some(template.get_request_state(path.to_string(), req).await?);
7070
// Use that to render the static HTML
7171
let html = sycamore::render_to_string(|| {
72-
template.render_for_template(state.clone(), Rc::clone(&translator), true)
72+
template.render_for_template(state.clone(), Rc::clone(&translator))
7373
});
7474
let head = template.render_head_str(state.clone(), Rc::clone(&translator));
7575

@@ -142,7 +142,7 @@ async fn revalidate(
142142
.await?,
143143
);
144144
let html = sycamore::render_to_string(|| {
145-
template.render_for_template(state.clone(), Rc::clone(&translator), true)
145+
template.render_for_template(state.clone(), Rc::clone(&translator))
146146
});
147147
let head = template.render_head_str(state.clone(), Rc::clone(&translator));
148148
// Handle revalidation, we need to parse any given time strings into datetimes
@@ -254,7 +254,7 @@ pub async fn get_page_for_template(
254254
// We need to generate and cache this page for future usage
255255
let state = Some(template.get_build_state(path.to_string()).await?);
256256
let html_val = sycamore::render_to_string(|| {
257-
template.render_for_template(state.clone(), Rc::clone(&translator), true)
257+
template.render_for_template(state.clone(), Rc::clone(&translator))
258258
});
259259
let head_val = template.render_head_str(state.clone(), Rc::clone(&translator));
260260
// Handle revalidation, we need to parse any given time strings into datetimes

packages/perseus/src/shell.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ pub async fn app_shell(
259259
// BUG (Sycamore): this will double-render if the component is just text (no nodes)
260260
sycamore::hydrate_to(
261261
// This function provides translator context as needed
262-
|| template.render_for_template(state, Rc::clone(&translator), false),
262+
|| template.render_for_template(state, Rc::clone(&translator)),
263263
&container_rx_elem,
264264
);
265265
checkpoint("page_interactive");
@@ -341,7 +341,6 @@ pub async fn app_shell(
341341
template.render_for_template(
342342
page_data.state,
343343
Rc::clone(&translator),
344-
false,
345344
)
346345
},
347346
&container_rx_elem,

packages/perseus/src/template.rs

+16-26
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,8 @@ use std::pin::Pin;
1212
use std::rc::Rc;
1313
use sycamore::context::{ContextProvider, ContextProviderProps};
1414
use sycamore::prelude::{template, GenericNode, Template as SycamoreTemplate};
15-
16-
/// Used to encapsulate whether or not a template is running on the client or server. We use a `struct` so as not to interfere with
17-
/// any user-set context.
18-
#[derive(Clone, Debug)]
19-
pub struct RenderCtx {
20-
/// Whether or not we're being executed on the server-side.
21-
pub is_server: bool,
22-
}
15+
use wasm_bindgen::prelude::*;
16+
use wasm_bindgen::{JsCast, JsValue};
2317

2418
/// Represents all the different states that can be generated for a single template, allowing amalgamation logic to be run with the knowledge
2519
/// of what did what (rather than blindly working on a vector).
@@ -217,22 +211,12 @@ impl<G: GenericNode> Template<G> {
217211
&self,
218212
props: Option<String>,
219213
translator: Rc<Translator>,
220-
is_server: bool,
221214
) -> SycamoreTemplate<G> {
222215
template! {
223216
// We provide the translator through context, which avoids having to define a separate variable for every translation due to Sycamore's `template!` macro taking ownership with `move` closures
224217
ContextProvider(ContextProviderProps {
225218
value: Rc::clone(&translator),
226-
children: || template! {
227-
// We then provide whether this is being rendered on the client or the server as a context element
228-
// This allows easy specification of client-side-only logic without having to worry about `web_sys` panicking
229-
ContextProvider(ContextProviderProps {
230-
value: RenderCtx {
231-
is_server
232-
},
233-
children: || (self.template)(props)
234-
})
235-
}
219+
children: || (self.template)(props)
236220
})
237221
}
238222
}
@@ -491,13 +475,19 @@ macro_rules! get_templates_map {
491475
};
492476
}
493477

494-
/// Checks in a template if the code is being run on client-side or the server-side. This uses Sycamore context, and so will only work
495-
/// in a reactive scope.
496-
#[macro_export]
497-
macro_rules! is_client {
498-
() => {
499-
!::sycamore::context::use_context::<::perseus::template::RenderCtx>().is_server;
500-
};
478+
/// Checks in a template if the code is being run on client-side or the server-side. This will work anywhere in your code, and will
479+
/// return `true` for any browser environment (including web workers).
480+
pub fn is_client() -> bool {
481+
#[wasm_bindgen]
482+
extern "C" {
483+
type Global;
484+
485+
#[wasm_bindgen(method, getter, js_name = Window)]
486+
fn window(this: &Global) -> JsValue;
487+
}
488+
489+
let global: Global = js_sys::global().unchecked_into();
490+
!global.window().is_undefined()
501491
}
502492

503493
/// A type alias for a `HashMap` of `Template`s.

0 commit comments

Comments
 (0)