(
props: ParentProps<{
directory: string | Accessor<string>
draftID?: string
server?: Accessor<ServerConnection.Key | undefined>
}>,
)
| 14 | import { useServerSync } from "@/context/server-sync" |
| 15 | |
| 16 | export function DirectoryDataProvider( |
| 17 | props: ParentProps<{ |
| 18 | directory: string | Accessor<string> |
| 19 | draftID?: string |
| 20 | server?: Accessor<ServerConnection.Key | undefined> |
| 21 | }>, |
| 22 | ) { |
| 23 | const location = useLocation() |
| 24 | const navigate = useNavigate() |
| 25 | const params = useParams() |
| 26 | const sync = useSync() |
| 27 | const serverSync = useServerSync() |
| 28 | const directory = () => (typeof props.directory === "function" ? props.directory() : props.directory) |
| 29 | const slug = createMemo(() => base64Encode(directory())) |
| 30 | const href = (sessionID: string) => { |
| 31 | const server = props.server?.() |
| 32 | if (server) return sessionHref(server, sessionID) |
| 33 | return `/${slug()}/session/${sessionID}` |
| 34 | } |
| 35 | |
| 36 | createEffect(() => { |
| 37 | // A draft lives at /new-session?draftId=… and has no directory segment to normalize. |
| 38 | if (props.draftID || props.server?.()) return |
| 39 | const next = sync().data.path.directory |
| 40 | if (!next || next === directory()) return |
| 41 | const path = location.pathname.slice(slug().length + 1) |
| 42 | navigate(`/${base64Encode(next)}${path}${location.search}${location.hash}`, { replace: true }) |
| 43 | }) |
| 44 | |
| 45 | createResource( |
| 46 | () => params.id, |
| 47 | (id) => |
| 48 | sync() |
| 49 | .session.sync(id) |
| 50 | .catch(() => {}), |
| 51 | ) |
| 52 | |
| 53 | createEffect(() => { |
| 54 | const sessionID = params.id |
| 55 | if (!sessionID) return |
| 56 | serverSync().session.pin(sessionID) |
| 57 | onCleanup(() => serverSync().session.unpin(sessionID)) |
| 58 | }) |
| 59 | |
| 60 | return ( |
| 61 | <Show when={directory()} keyed> |
| 62 | {(directory) => ( |
| 63 | <DataProvider |
| 64 | data={sync().data} |
| 65 | directory={directory} |
| 66 | onNavigateToSession={(sessionID: string) => navigate(href(sessionID))} |
| 67 | onSessionHref={href} |
| 68 | > |
| 69 | <LocalProvider>{props.children}</LocalProvider> |
| 70 | </DataProvider> |
| 71 | )} |
| 72 | </Show> |
| 73 | ) |
nothing calls this directly
no test coverage detected