local activity storage and convert page fixes
- Replace rdp dependency with inline pure-Python RDP implementation
so the bincio wheel runs in Pyodide (no pure-Python wheel existed for rdp)
- Fix convert page script: remove define:vars so Vite bundles it and
TypeScript imports (localstore, format) work correctly
- Rename wheel to proper PEP 427 filename (bincio-0.1.0-py3-none-any.whl)
- Use en-GB date format on convert result, consistent with the feed
- Add /activity/local/ page + LocalActivityDetail for IDB-only activities;
feed links local activities there instead of the SSG route
- Fix getStaticPaths: try public/data symlink as fallback, never crash on
missing index.json
- Fix ActivityDetail.onMount: load detail even when detail_url is absent
so locally converted activities show map and charts
- Derive track_url and detail_url from id in toSummary() since they are
not present in the detail JSON
- Reload on bfcache restore (pageshow) so client:only components re-mount
after back navigation
This commit is contained in:
@@ -27,9 +27,8 @@
|
||||
$: displayTitle = localTitle || activity.title;
|
||||
|
||||
onMount(async () => {
|
||||
if (!activity.detail_url) return;
|
||||
try {
|
||||
detail = await loadActivity(activity.id, activity.detail_url, base);
|
||||
detail = await loadActivity(activity.id, activity.detail_url ?? '', base);
|
||||
if (!detail) throw new Error('Activity not found');
|
||||
} catch (e: any) {
|
||||
error = e.message;
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||
{#each visible as a (a.id)}
|
||||
<a
|
||||
href={`${import.meta.env.BASE_URL}activity/${a.id}/`}
|
||||
href={a.detail_url ? `${import.meta.env.BASE_URL}activity/${a.id}/` : `${import.meta.env.BASE_URL}activity/local/?id=${a.id}`}
|
||||
class="block rounded-xl bg-zinc-900 border border-zinc-800 p-4 hover:border-zinc-600 hover:bg-zinc-800/80 transition-all group"
|
||||
>
|
||||
<!-- header -->
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
<script lang="ts">
|
||||
import { onMount } from 'svelte';
|
||||
import { getLocalActivity } from '../lib/localstore';
|
||||
import type { ActivitySummary } from '../lib/types';
|
||||
import ActivityDetail from './ActivityDetail.svelte';
|
||||
|
||||
export let base: string = '/';
|
||||
|
||||
let activity: ActivitySummary | null = null;
|
||||
let error = '';
|
||||
|
||||
onMount(async () => {
|
||||
const id = new URLSearchParams(window.location.search).get('id');
|
||||
if (!id) { error = 'No activity ID in URL.'; return; }
|
||||
const found = await getLocalActivity(id);
|
||||
if (!found) { error = `Activity "${id}" not found on this device.`; return; }
|
||||
activity = found;
|
||||
});
|
||||
</script>
|
||||
|
||||
{#if error}
|
||||
<p class="text-red-400 text-sm py-12 text-center">{error}</p>
|
||||
{:else if activity}
|
||||
<ActivityDetail {activity} {base} athlete={null} />
|
||||
{:else}
|
||||
<div class="h-32 rounded-xl bg-zinc-900 border border-zinc-800 animate-pulse mt-4"></div>
|
||||
{/if}
|
||||
Reference in New Issue
Block a user