fresh icon indicating copy to clipboard operation
fresh copied to clipboard

Island Slots Don't Work With `f-client-nav`

Open lishaduck opened this issue 1 year ago • 7 comments

Hello! I've been hunting down the cause of a bug in my website on and off for the last few days, and I finally think I figured it out. It seems that partial client navigation and passing JSX as children to islands no longer (?) seem to work together.

Context

https://why-switch.deno.dev/[^1] is using HeadlessUI, which as of v2.0, requires it to be uses in a client context (#2426). I'm working around it by adding in dummy implementations and putting the actual code behind an IS_BROWSER. I recently added a component for floating "Info" buttons. It was soon noticed that the infos sometimes didn't render. I tried a few things, and it seemed fixed. Then, I noticed it again a few times yesterday and today. I was adding another page with the info components, and noticed that, when I navigated to a different page, the infos on that page displayed the same info. I looked in the inspector, and it seems that infos are all using the same <template> slot, which is the issue. If you don't start on a page with a slot, it will never get rendered. This also explains why reloading the page always fixed it. It was rerendering with the correct server serialization. For now, my solution is to just turn off f-client-nav. It works, but it isn't as nice UX.

Source

Presumably, you'll want the source, so here it is: https://github.com/PHS-TSA/webmaster-23-24/blob/miscui/src/islands/Info.tsx If you need a SSCCE, I can provide one.

[^1]: That url goes to my current development branch's last broken deployment before I disabled partial CSR, as it is what added the <Info> component.

lishaduck avatar May 21 '24 17:05 lishaduck

I stumbled across the same problem today! The solution for me was to include “children” in my alternate (IS_BROWSER === false) render path, but hiding the content with CSS.

thegaryroberts avatar May 28 '24 17:05 thegaryroberts

I'll have to try that when I get a chance, thanks for the tip!

lishaduck avatar May 30 '24 21:05 lishaduck

Had some time to look into this, but I'm not sure how I can reproduce the described issue. What I've done:

  1. Commented out the OpenAPI stuff, otherwise it crashes on startup
  2. Set f-client-nav={true} in _app.tsx
  3. Go to the about page and check the info popovers. They all work for me.

marvinhagemeister avatar Jun 05 '24 07:06 marvinhagemeister

Did you navigate straight to the info popovers? Try navigating to a different page, then to the about page.

It's primarily found by going to /green/, click on the infos, then click on the header to /about/, and click the infos. They'll be the same infos, but reloading swaps them out, so you can see that they're different after a reload.

The issue isn't found in the attribute, it's the actual navigation.

lishaduck avatar Jun 05 '24 17:06 lishaduck

Oh, and the link I posted (https://why-switch-66b9jr0wkg78.deno.dev/) reproduces fine. You don't need to clone it (though I guess you'd still want to to verify my hunch). It's associated with commit 0c2630041a52c1103e60ef45718aa6dfb9a7af0a for the last broken source. (The commit itself is unrelated. The one that introduced the bug is literally just the one that created the <Info>s. They've always been broken.) I'll try to see if I can find some time today to see if @thegaryroberts's solution works.

lishaduck avatar Jun 05 '24 17:06 lishaduck

Ah you're right. For some reason I missed the live link, thanks for helping me find it. I can reproduce the issue now.

marvinhagemeister avatar Jun 05 '24 21:06 marvinhagemeister

I can verify that @thegaryroberts's workaround works.

The diff: ^1

diff --git a/src/islands/Info.tsx b/src/islands/Info.tsx
index 94b8f6a..0fd491b 100644
--- a/src/islands/Info.tsx
+++ b/src/islands/Info.tsx
@@ -21,6 +21,7 @@ export function Info({ children }: InfoProps): JSX.Element {
         )}
       >
         <IconInfoCircle class="inline" size={20} />
+        <div class="hidden">{children}</div>
       </button>
     );
   }
diff --git a/src/routes/_app.tsx b/src/routes/_app.tsx
index d8c0dd1..f56b5ca 100644
--- a/src/routes/_app.tsx
+++ b/src/routes/_app.tsx
@@ -74,7 +74,7 @@ export default function App({ Component }: PageProps): JSX.Element {
         <link rel="stylesheet" href={asset("/styles.css")} />
       </Head>
 
-      <body f-client-nav={false} class="dark:bg-slate-950 dark:text-slate-50">
+      <body f-client-nav={true} class="dark:bg-slate-950 dark:text-slate-50">
         <Partial name="body">
           <Component />
         </Partial>

lishaduck avatar Jun 06 '24 01:06 lishaduck