- IncidentDetailScreen: add Delete button (confirm dialog) wired to deleteIncident()
- git.ts: fix Gitea POST vs PUT (use PUT when file exists/sha present); add
pre-flight validation for missing URL/token/owner/repo; add 15s fetch timeout
with AbortError handling; improve error messages with actionable hints
- [id].tsx: guard URL for Gitea/GitLab before calling pushIncidentToGit
- settings.tsx: move ToggleRow/SegmentRow/Field outside SettingsScreen to fix
TextInput focus loss on each keystroke (component remount on rerender)
- settings.tsx: add Title Template setting with auto-increment info card
- settings.tsx: add AI base URL + model fields; expand AI section description
- new.tsx: pre-fill title from pref_title_template; increment counter after save
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
new.tsx: service field was missing its mic button — VoiceField type
excluded "service" and the label used a plain Text instead of labelRow().
index.tsx: incident list only loaded on mount; router.back() does not
remount the screen so new incidents never appeared. useFocusEffect
replaces the one-shot useEffect so the list reloads on every focus.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
CrashBoundary and ErrorUtils debug handler were temporary scaffolding
to identify the launch crash (react version mismatch). Removing now
that the root cause is fixed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Catches React render errors (ErrorBoundary) and fatal JS errors
(ErrorUtils.setGlobalHandler) and displays the stacktrace on-screen
instead of crashing to desktop. Temporary — remove after crash identified.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SplashScreen.hideAsync() and the splash section in app.json were both
introduced after v0.1.5 and are common to every crashing build.
Reverting to the exact v0.1.5 baseline to isolate the crash source.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
expo-router 56 already calls _internal_preventAutoHideAsync() internally.
Calling preventAutoHideAsync() at module level created a second user lock
that blocked the native splash indefinitely on Android, causing a crash.
SafeAreaProvider removed as expo-router's ExpoRoot already wraps with it.
Keep SplashScreen.hideAsync() to release the splash after SecureStore reads.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add SplashScreen.preventAutoHideAsync() at module level and hideAsync()
once SecureStore reads complete. Add splash backgroundColor to app.json
to match app theme. Wrap layout in SafeAreaProvider.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>