fix(rsplat): stop double fileInput.click on mobile generate upload

Tapping inline "browse" fired both the browse handler and the bubbled
drop-area handler, causing mobile Safari to cancel and reopen the file
picker so the first selection was silently dropped.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-04-17 13:11:34 -04:00
parent 2ecee5b2e7
commit 8b8041da9f
2 changed files with 8 additions and 5 deletions

View File

@ -506,14 +506,17 @@ export class FolkSplatViewer extends HTMLElement {
let selectedFile: File | null = null;
browse?.addEventListener("click", () => fileInput.click());
browse?.addEventListener("click", (e) => {
e.stopPropagation();
fileInput.click();
});
// Make the entire dotted drop area open file browser on click
const generateMode = this.querySelector("#splat-mode-generate") as HTMLElement;
generateMode?.addEventListener("click", (e) => {
const target = e.target as HTMLElement;
// Don't trigger if clicking on buttons, inputs, or the preview image
if (target.closest("button, input, .splat-generate__preview, .splat-generate__progress")) return;
// Don't trigger if clicking on buttons, inputs, the browse link, or the preview image
if (target.closest("button, input, #generate-browse, .splat-generate__preview, .splat-generate__progress")) return;
fileInput.click();
});

View File

@ -726,7 +726,7 @@ routes.get("/", async (c) => {
`,
scripts: `
<script type="module">
import { FolkSplatViewer } from '/modules/rsplat/folk-splat-viewer.js?v=11';
import { FolkSplatViewer } from '/modules/rsplat/folk-splat-viewer.js?v=12';
const gallery = document.getElementById('gallery');
gallery.splats = ${splatsJSON};
gallery.spaceSlug = '${spaceSlug}';
@ -787,7 +787,7 @@ function renderViewerPage(spaceSlug: string, dataSpace: string, idOrSlug: string
`,
scripts: `
<script type="module">
import { FolkSplatViewer } from '/modules/rsplat/folk-splat-viewer.js?v=11';
import { FolkSplatViewer } from '/modules/rsplat/folk-splat-viewer.js?v=12';
</script>
`,
});