From a796bf8cae213529c3d90e2ec9e3679f5e39a95b Mon Sep 17 00:00:00 2001 From: Davide Scaini Date: Sat, 25 Apr 2026 20:39:55 +0200 Subject: [PATCH] fix: write timeseries directly when wheel's write_activity silently skips it Diagnosed via on-device debug: build_timeseries produces 3271 points correctly, but the installed wheel's write_activity has a silent exception path that skips writing the timeseries file. The workaround calls build_timeseries directly and writes the file if missing. Also moves useTheme import to @/ThemeContext across all tab screens. --- mobile/app/(tabs)/_layout.tsx | 2 +- mobile/app/(tabs)/import.tsx | 2 +- mobile/app/(tabs)/index.tsx | 2 +- mobile/app/activity/[id].tsx | 2 +- mobile/extraction/PyodideWebView.tsx | 7 +++++++ 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/mobile/app/(tabs)/_layout.tsx b/mobile/app/(tabs)/_layout.tsx index c95b97d..fe2925c 100644 --- a/mobile/app/(tabs)/_layout.tsx +++ b/mobile/app/(tabs)/_layout.tsx @@ -1,5 +1,5 @@ import { Tabs } from 'expo-router'; -import { useTheme } from '@/theme'; +import { useTheme } from '@/ThemeContext'; export default function TabLayout() { const theme = useTheme(); diff --git a/mobile/app/(tabs)/import.tsx b/mobile/app/(tabs)/import.tsx index deb58cd..08f509d 100644 --- a/mobile/app/(tabs)/import.tsx +++ b/mobile/app/(tabs)/import.tsx @@ -6,7 +6,7 @@ import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'; import { insertActivity } from '@/db/queries'; import { PyodideWebView } from '@/extraction/PyodideWebView'; import { extractFile } from '@/extraction/extractActivity'; -import { useTheme } from '@/theme'; +import { useTheme } from '@/ThemeContext'; const FIT_EXTENSIONS = ['.fit', '.fit.gz']; const OTHER_EXTENSIONS = ['.gpx', '.tcx', '.gpx.gz', '.tcx.gz']; diff --git a/mobile/app/(tabs)/index.tsx b/mobile/app/(tabs)/index.tsx index 0f4335c..7594f77 100644 --- a/mobile/app/(tabs)/index.tsx +++ b/mobile/app/(tabs)/index.tsx @@ -5,7 +5,7 @@ import { useCallback, useState } from 'react'; import { Alert, FlatList, Pressable, RefreshControl, StyleSheet, Text, View } from 'react-native'; import { deleteActivities, useActivities, type ActivitySummary } from '@/db/queries'; import { syncFeed } from '@/db/sync'; -import { useTheme } from '@/theme'; +import { useTheme } from '@/ThemeContext'; export default function FeedScreen() { const db = useSQLiteContext(); diff --git a/mobile/app/activity/[id].tsx b/mobile/app/activity/[id].tsx index 7d08574..3a37ece 100644 --- a/mobile/app/activity/[id].tsx +++ b/mobile/app/activity/[id].tsx @@ -6,7 +6,7 @@ import { ActivityIndicator, Alert, Modal, Pressable, ScrollView, StyleSheet, Tex import Svg, { Defs, LinearGradient, Path, Stop } from 'react-native-svg'; import { useSQLiteContext } from 'expo-sqlite'; import { deleteActivity, useActivity, useSetting } from '@/db/queries'; -import { useTheme } from '@/theme'; +import { useTheme } from '@/ThemeContext'; const MAP_STYLE = 'https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json'; diff --git a/mobile/extraction/PyodideWebView.tsx b/mobile/extraction/PyodideWebView.tsx index 1a4aed7..856d337 100644 --- a/mobile/extraction/PyodideWebView.tsx +++ b/mobile/extraction/PyodideWebView.tsx @@ -39,6 +39,13 @@ const PY_EXTRACT = [ 'ts_path = outdir / "activities" / (act_id + ".timeseries.json")', 'geojson_path = outdir / "activities" / (act_id + ".geojson")', '', + '# write_activity in the installed wheel silently skips timeseries — write it directly.', + 'if not ts_path.exists():', + ' from bincio.extract.timeseries import build_timeseries as _bts', + ' _ts = _bts(activity.points, activity.started_at, "public")', + ' if _ts.get("t"):', + ' ts_path.write_text(json.dumps(_ts))', + '', 'json.dumps({', ' "id": act_id,', ' "detail": json.loads(detail_path.read_text()),',