personal memory agent
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

convey/activities: adopt wave 0 error primitives for day loadData (wave 1)

Migrate loadData to apiJson(...) with array shape validation, upgrade the first-paint loading scaffold to the shared surface-state loading markup, and route failures through replaceLoading('timelineView', errorCard(...)). Valid empty arrays still render the legitimate empty-day copy instead of an error state.

Co-authored-by: OpenAI Codex <codex@openai.com>

+27 -7
+27 -7
apps/activities/_day.html
··· 495 495 496 496 <div id="dayView"> 497 497 <div id="timelineView"> 498 - <div class="timeline-empty">Loading...</div> 498 + <div class="surface-state surface-state--loading" role="status" aria-busy="true"> 499 + <div class="surface-state-spinner" aria-hidden="true"></div> 500 + <span class="surface-state-text" data-role="loading-status">Loading activities...</span> 501 + </div> 499 502 </div> 500 503 <div id="activitiesView"></div> 501 504 </div> ··· 893 896 renderActivities(activities); 894 897 } 895 898 896 - function loadData() { 897 - fetch(`/app/activities/api/day/${day}/activities`).then(r => r.json()).then(acts => { 898 - allActivities = acts || []; 899 + async function loadData() { 900 + try { 901 + const acts = await window.apiJson(`/app/activities/api/day/${day}/activities`); 902 + if (!Array.isArray(acts)) { 903 + throw new window.ApiError({ 904 + status: 200, 905 + statusText: 'OK', 906 + serverMessage: 'Malformed activities response', 907 + url: `/app/activities/api/day/${day}/activities`, 908 + cause: 'parse', 909 + }); 910 + } 911 + 912 + allActivities = acts; 899 913 applyFilters(); 900 914 901 915 // Check for initial hash ··· 936 950 } 937 951 } 938 952 }; 939 - }).catch(() => { 940 - document.getElementById('timelineView').innerHTML = '<div class="timeline-empty">Failed to load data.</div>'; 941 - }); 953 + } catch (err) { 954 + window.SurfaceState.replaceLoading('timelineView', window.SurfaceState.errorCard({ 955 + heading: 'Couldn\'t load activities', 956 + desc: 'Reload the page to try again.', 957 + serverMessage: err?.serverMessage || err?.message || '', 958 + })); 959 + document.getElementById('activitiesView').innerHTML = ''; 960 + document.getElementById('daySummary').textContent = ''; 961 + } 942 962 } 943 963 944 964 // ── Hash routing ──