Skip to content

feat: mobile navigation overhaul with bottom tab bar and swipe gestures#189

Merged
chriswritescode-dev merged 20 commits intomainfrom
dev
Apr 19, 2026
Merged

feat: mobile navigation overhaul with bottom tab bar and swipe gestures#189
chriswritescode-dev merged 20 commits intomainfrom
dev

Conversation

@chriswritescode-dev
Copy link
Copy Markdown
Owner

@chriswritescode-dev chriswritescode-dev commented Apr 19, 2026

Summary

Changes

  • Added frontend/src/components/navigation/MobileTabBar.tsx: Bottom tab navigation for mobile with route-aware tabs
  • Added frontend/src/components/navigation/MoreDrawer.tsx: Route-aware menu with URL-based dialog state
  • Added frontend/src/components/navigation/NotificationsSheet.tsx, RepoQuickSwitchSheet.tsx, MobileSheetHost.tsx: Mobile sheet components
  • Added frontend/src/hooks/useMobileTabBar.ts, useSwipeNavigationContext.tsx: Mobile navigation hooks
  • Added frontend/src/components/ui/bottom-sheet.tsx, side-drawer.tsx: Mobile UI components
  • Modified frontend/src/hooks/useMobile.ts: Rebuilt mobile detection and safe area handling
  • Modified frontend/src/components/session/SessionList.tsx: Various improvements
  • Modified backend/src/services/opencode-single-server.ts: Service improvements
  • Added shared/src/config/env.ts: Environment config

Full diff: 71 files changed, ~4000 insertions, ~1000 deletions

Type of Change

  • Bug fix
  • New feature
  • Refactor
  • Documentation

Checklist

  • Code follows project style (no comments, named imports)
  • TypeScript types are properly defined
  • Tests added/updated (80% coverage target)
  • pnpm lint passes locally
  • pnpm typecheck passes locally

- Add runtime permission fix in docker-entrypoint.sh to ensure
  /app/data volume has correct ownership before app starts
- Remove build-time chown for /app/data from Dockerfile since
  Docker volumes are mounted at runtime, not build time
- This resolves SQLITE_READONLY error when upgrading to OpenCode 1.4.0

The database volume may have incorrect ownership when mounted by Docker,
causing the SQLite database to be read-only. The entrypoint script now
fixes permissions before starting the backend (runs as root before USER node).
…sions

Entrypoint ran as USER node (inherited from Dockerfile) so chown
silently failed with EPERM. SQLite needs write access to the directory
to create WAL/journal files alongside the database.

- Remove USER node from Dockerfile so entrypoint runs as root
- Restore mkdir /app/data + chown for fresh volume initialization
- Entrypoint now fixes ownership then drops to node via runuser before exec
Major Features:
- Add mobile bottom tab navigation with swipe gestures
- Implement MobileTabBar component with navigation store
- Add RepoQuickSwitchSheet and NotificationsSheet components
- Add OpenCode server authentication with Basic Auth support
- Add OpenCode models editor UI

Improvements:
- Add side-drawer and bottom-sheet UI components
- Implement useMobileTabBar and useNavigationDirection hooks
- Add useAutoPlayLastResponse hook for TTS
- Improve OAuth dialog UX with copy buttons and toast notifications
- Add floating TTS button with better state management
- Add model fallback logic and validation

Fixes:
- Correctly handle modelIDs containing slashes
- Fix OAuth dialog state management
- Clean up stale models from recentModels
- Fix SQLite readonly issues in Docker
- Fix mobile repo controls event bubbling

Refactoring:
- Remove custom title generation, use OpenCode API
- Merge RepoSelectionBar into RepoListControls
- Replace radio buttons with Tabs in AddRepoDialog
- Remove title.ts route and tests

Infrastructure:
- Add cache and opencode directories to Docker setup
- Fix Docker volume permissions for SQLite database
- Add migration for repo last accessed timestamp

Testing:
- Add comprehensive tests for mobile navigation components
- Add tests for bottom-sheet, side-drawer, and MobileTabBar
- Add model fallback tests
- Add proxy service tests
- Remove navigation store, useNavigationDirection, and useSwipeBack hook
- Add vertical swipe-to-close direction support to useSwipeToClose
- Add stable callback identities to useMobileTabBar and useScheduleTab
- Add error boundary wrapper around app root
- Replace ListToolbar with inline manage mode UI in SessionList
- Memoize AuthContext value and remove location dependency from EventContext
- Add production start scripts and preview host config
- Adjust safe-area padding across mobile pages
- Prevent mobile tab bar from appearing on session detail pages
- Add bottom padding to Memories page for iPhone home indicator
Restore dev versions of files that were corrupted by the merge, and remove
unused PageTransition, useNavigationDirection, and navigationStore files
replaced by dev's SwipeNavigationContext-based approach.
@chriswritescode-dev chriswritescode-dev merged commit 4a90dda into main Apr 19, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant