Commit Graph

161 Commits

Author SHA1 Message Date
46ccc797a3 feat: create WebSocket client and real-time sync manager 2025-11-12 08:14:47 +00:00
c3a7d59002 feat: set up WebSocket server infrastructure
- Create type definitions for WebSocket messages and client management
- Implement EventEmitter-based WebSocket server with connection handling
- Add message routing and broadcast capabilities for user subscriptions
- Include comprehensive test suite with 4 passing tests
- Support client presence tracking and message queuing

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 08:13:08 +00:00
a4ecbfce77 docs: add DEPLOYMENT_READY status document - Phase 2.1B ready for production 2025-11-12 08:09:10 +00:00
12a32990b5 docs: add executive summary for Phase 2.1B completion and roadmap 2025-11-12 08:08:34 +00:00
c4c914a2c0 docs: add Phase 2.1B deployment summary and checklist 2025-11-12 08:07:50 +00:00
4a37e775c7 docs: add comprehensive full roadmap for all phases 2025-11-12 08:07:23 +00:00
ca786efe09 docs: add Phase 2.1B deployment plan 2025-11-12 08:06:14 +00:00
28bdd37a48 docs: add Phase 2.1B completion report 2025-11-12 08:05:42 +00:00
cecccd19a1 build: complete Phase 2.1B backend sync integration
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 08:00:39 +00:00
180da4462d test: add E2E tests for highlights sync flow 2025-11-12 07:56:39 +00:00
97f8aa5548 feat: integrate sync status indicator into highlights panel
- Updated HighlightsTab to accept syncStatus and syncErrorMessage props
- Added SyncStatusIndicator component import and display in highlights panel
- Enhanced BibleReaderApp with sync status tracking state (synced/syncing/pending/error)
- Modified performSync function to update sync status based on result
- Updated VersDetailsPanel to pass sync status props through to HighlightsTab
- Sync status now visible to users in the Highlights tab with real-time updates

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 07:54:51 +00:00
c50cf86263 feat: create sync status indicator component
Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 07:52:55 +00:00
3e3e90f774 feat: add pull sync on login with conflict resolution
- Created highlight-pull-sync.ts with pullAndMergeHighlights function
- Integrated pull sync into BibleReaderApp on mount
- Fetches server highlights, merges with local using conflict resolution
- Updates local storage and component state with merged data

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 07:51:35 +00:00
73171b5f18 feat: implement client-side sync with bulk API
Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 07:50:28 +00:00
82c537d659 feat: implement sync conflict resolver with timestamp-based merging
Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 07:49:13 +00:00
afaf580a2b build: complete Phase 2.1 implementation and verify build
- Verified all exports in highlight-manager.ts are correct
- Installed @clerk/nextjs dependency for API routes
- Fixed TypeScript errors in API routes (NextRequest type)
- Fixed MUI Grid component usage in highlights-tab.tsx (replaced with Box flexbox)
- Fixed HighlightColor type assertion in reading-view.tsx
- Build completed successfully with no TypeScript errors

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 07:34:44 +00:00
b7b18c8d69 feat: add UserHighlight model to database schema
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 07:18:57 +00:00
7ca2076ca8 feat: add backend API endpoints for highlights and cross-references
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 07:07:21 +00:00
ea2a848f73 feat: integrate highlight management into reader app
- Added HighlightSyncManager and highlight state management to BibleReaderApp
- Implemented highlight handlers: add, update color, remove, and sync
- Connected highlight state from BibleReaderApp to VersDetailsPanel
- Updated VersDetailsPanel to pass highlight props to HighlightsTab
- Added auto-sync initialization with 30-second interval
- Prepared for Phase 2.1B API integration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 07:04:46 +00:00
ec62440b2d feat: add highlight background color support to verse renderer
Enhanced VerseRenderer with highlight background color visualization:
- Added COLOR_MAP constant with rgba colors for yellow, orange, pink, blue
- Imported HighlightColor type from @/types
- Added hoveredVerseNum state for tracking verse hover state
- Updated verse rendering span with:
  - Dynamic backgroundColor based on verse.highlight.color
  - Padding and borderRadius for visual polish
  - Smooth transitions for better UX
  - Proper hover state management

This prepares the UI for highlight data integration in Task 6.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 07:02:43 +00:00
8185009da6 feat: create HighlightsTab component with color picker
Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 07:01:06 +00:00
409675bf73 feat: create highlight sync manager with queue logic
Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 06:59:10 +00:00
90208808a2 feat: create highlight manager with IndexedDB storage
Implemented TDD approach for highlight persistence:
- Created IndexedDB store with 'highlights' object store
- Added indexes for syncStatus and verseId for efficient queries
- Implemented CRUD operations: add, update, get, getAll, delete
- Added query methods: getHighlightsByVerse, getPendingHighlights
- Full test coverage with fake-indexeddb mock
- Added structuredClone polyfill for test environment

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 06:57:30 +00:00
0e2167ade7 feat: add TypeScript types for highlights and sync system
Added highlight system types with strict color and sync status validation:
- HighlightColor type with 4 valid colors (yellow, orange, pink, blue)
- SyncStatus type for tracking sync state (pending, syncing, synced, error)
- BibleHighlight interface with full metadata support
- HighlightSyncQueueItem for offline sync queue management
- CrossReference interface for verse cross-referencing

Includes comprehensive test coverage validating type constraints.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 06:55:10 +00:00
3953871c80 docs: Phase 2.1 Rich Annotations implementation plan with 9 detailed tasks 2025-11-11 20:52:08 +00:00
d9acbb61ff docs: Phase 2.1 Rich Annotations & Highlighting design specification 2025-11-11 20:49:35 +00:00
5ec48cd2b2 fix: resolve critical MVP issues - search bar overlap and language selection
- Fix search bar covering main menu: removed fixed positioning from header and use flex layout instead
- Fix Bible not displaying in selected language: pass locale parameter to /api/bible/books endpoint
- Add locale dependency to loadBooks useEffect so Bible content updates when language changes

These fixes make the MVP fully usable for all languages (en, ro, es, it).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 20:43:51 +00:00
9b5c0ed8bb build: production build with Phase 1 2025 Bible Reader implementation complete
Includes all Phase 1 features:
- Search-first navigation with auto-complete
- Responsive reading interface (desktop/tablet/mobile)
- 4 customization presets + full fine-tuning controls
- Layered details panel with notes, bookmarks, highlights
- Smart offline caching with IndexedDB and auto-sync
- Full accessibility (WCAG 2.1 AA)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 20:38:01 +00:00
b8652b9f0a fix: critical issues - settings sync, error handling, bookmarks persistence
- Fix settings synchronization: ReadingView now listens to storage events for real-time preference updates
- Add comprehensive error handling to loadChapter with proper state management
- Add comprehensive error handling to loadBooks with booksLoading state
- Add localStorage persistence for bookmarks (load on mount, save on change)
- Display error messages in UI with reload button and proper loading states

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 20:29:20 +00:00
1dc4d761b5 fix: properly map book IDs from search to API UUIDs in Bible reader
Updates BibleReaderApp to handle the mismatch between numeric book IDs
used by SearchNavigator (1-66) and UUID book IDs required by the API.

Changes:
- Add loadBooks() to fetch book metadata on mount
- Map numeric orderNum to UUID book IDs for API calls
- Implement proper hasNextChapter logic using actual chapter counts
- Store books array and versionId in state
- Update loadChapter to convert numeric bookId to UUID before API call

This ensures the Bible reader works correctly with the existing database
schema while maintaining a simple numeric interface for the SearchNavigator.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 20:17:13 +00:00
aefe54751b feat: integrate all Bible reader 2025 components into main app
This completes Task 5 of the Bible Reader 2025 implementation plan,
integrating all previously built components into a cohesive reading experience.

Components added:
- BibleReaderApp: Main orchestrator component with state management
- ReadingSettings: Settings panel with presets and customization options

Key features:
- Chapter navigation with prev/next controls
- SearchNavigator integration for book/chapter lookup
- ReadingView with customizable reading preferences
- VersDetailsPanel for verse interactions (notes, bookmarks)
- ReadingSettings panel with 4 presets and custom controls
- IndexedDB caching for offline chapter access
- Mobile-responsive bottom sheet and desktop sidebar layouts

The app now provides:
- Bookmark management (client-side Set for now, backend sync in Phase 2)
- Note taking (console logging for now, persistence in Phase 2)
- Font customization (4 font families including dyslexia-friendly)
- Size and spacing controls (font size 12-32px, line height 1.4-2.2x)
- Background themes (warm, white, light gray, dark)
- Preset modes (default, dyslexia, high contrast, minimal)

Technical implementation:
- State management via React hooks (useState, useEffect)
- Cache-first loading strategy with API fallback
- Storage events for cross-component preference updates
- TypeScript with proper type annotations
- Material-UI components for consistent styling

Next steps (Phase 2):
- Backend persistence for bookmarks and notes
- Sync annotations across devices
- Highlight system with color selection
- Cross-references integration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 20:12:41 +00:00
5500965563 fix: add accessibility attributes, display full verse reference, reset tabs on verse change, add character limit
- Add aria-label to close button for screen reader support
- Add dynamic aria-label to bookmark button (Add/Remove bookmark)
- Add aria-label and character counter to notes TextField
- Wrap mobile bottom sheet in proper dialog semantics (role="dialog", aria-modal="true")
- Display full verse reference (Book Chapter:Verse) instead of just verse number
- Add useEffect to reset tab to Notes when verse changes for better UX
- Add 500 character limit to notes with visual counter

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 20:03:45 +00:00
1892403554 feat: implement VersDetailsPanel with notes, bookmarks, and tabs 2025-11-11 19:48:13 +00:00
1177c5b90a fix: add accessibility attributes, fix CSS margins, complete textAlign support, remove unused variable
- Added role="button", tabIndex, aria-label, and onKeyDown handler to verse spans for keyboard accessibility
- Fixed CSS margin/padding conflict by using py/px instead of p/margin for proper variable margin width
- Added --text-align CSS variable to getCSSVariables() and applied it in reading view
- Removed unused isTablet variable

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 19:44:20 +00:00
13d23d979f feat: implement responsive ReadingView with preference support
Implements Task 3 from Bible Reader 2025 plan:
- Created lib/reading-preferences.ts with 4 presets (default, dyslexia, highContrast, minimal)
- Implemented loadPreferences/savePreferences using localStorage
- Added getCSSVariables for dynamic styling
- Created ReadingView component with full mobile responsiveness
- Touch interaction: tap top third shows header, bottom third toggles controls
- Verse text is clickable with hover effects
- Navigation controls (prev/next chapter, settings button)
- Created test file for preferences

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 19:35:58 +00:00
4287a74805 fix: add accessibility attributes, fix placeholder, ensure consistent abbreviation matching
- Add aria-label and role attributes to search TextField for screen readers
- Add role="listbox" and aria-label to search results Paper
- Add role="option", aria-selected, and minHeight to ListItemButton for accessibility
- Update placeholder from "John 3:16" to "John 3" to match chapter-level search
- Change parseReference abbreviation matching from === to startsWith() for consistency with searchBooks

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 19:31:30 +00:00
66fd575ad5 feat: implement search-first Bible navigator with touch optimization
Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 19:21:10 +00:00
a688945df2 fix: correct LRU cache eviction and expiration logic in cache-manager 2025-11-11 19:16:43 +00:00
18be9bbd55 feat: add types and IndexedDB cache manager for Bible reader 2025
Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 19:08:31 +00:00
1b9703b5e6 docs: add 2025 Bible reader design and implementation plan 2025-11-11 19:01:43 +00:00
7e91013c3a feat: implement comprehensive dynamic sitemap with SEO-friendly Bible URLs
- Created dynamic sitemap.ts using Next.js 15 sitemap feature
- Generates 23,188 URLs (within Google's 50K limit)
- Includes all static pages for 4 locales (en, ro, es, it)
- Includes Bible chapters for top 10 versions per language
- Uses SEO-friendly URL format: /{locale}/bible/{version}/{book}/{chapter}
- Replaces static sitemap.xml with dynamic generation
- Configured with force-dynamic and 24-hour revalidation
- Prioritizes relevant Bible versions per locale (ENG-ASV, ENG-KJV, ROO, etc.)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 09:04:16 +00:00
c36710d56c chore: configure Stripe subscription price IDs for production
Added environment variables for Biblical Guide Premium subscription:
- Monthly plan: $10/month (price_1SHhJDJN43EN3sSfzJ883lHA)
- Yearly plan: $100/year (price_1SHhKEJN43EN3sSfXYyYStNS)

Configuration includes:
- Server-side price IDs for API routes
- NEXT_PUBLIC_ prefixed IDs for client-side rendering
- Both monthly and yearly billing options

The subscription system is now fully configured and ready for production use.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 08:49:36 +00:00
65d868a7dd fix: AI chat authentication on iOS Safari by using global auth state
Problem:
- Floating chat had its own separate authentication check using localStorage
- iOS Safari has restrictions on localStorage access, especially with tracking prevention
- This caused logged-in users to still see login prompt in AI chat

Solution:
- Replace local auth state management with global useAuth hook from AuthProvider
- Remove redundant checkAuthStatus() function
- Update all authentication checks to use isAuthenticated from useAuth
- Update token retrieval to get directly from localStorage only when needed

Benefits:
- Single source of truth for authentication across the app
- More reliable authentication state management
- Better compatibility with iOS Safari's privacy features
- Automatic auth state synchronization when user logs in/out

Changes:
- Use useAuth hook instead of local isAuthenticated/authToken state
- Remove checkAuthStatus() function
- Update loadConversations to read token from localStorage directly
- Update loadConversation to read token from localStorage directly
- Update handleSendMessage to read token from localStorage directly
- Simplify handleAuthSuccess to rely on global auth state updates

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 07:00:54 +00:00
a0ed2b62ce fix: use SEO-friendly URLs for Read the Bible button
Changes:
- Load user's favorite Bible version or default to 'eng-asv'
- Convert book names to lowercase slugs for URLs
- Use path format: /{locale}/bible/{version}/{book}/{chapter}
- Replace spaces with hyphens in book names (e.g., "1 Corinthians" -> "1-corinthians")

Fixes issue where clicking "Read the Bible" button resulted in infinite loading
due to incorrect URL format with query parameters instead of path parameters.

Example URL: /en/bible/eng-asv/matthew/1

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 06:16:45 +00:00
f96cd9231e feat: integrate reading plans with Bible reader
Bible Reader Integration:
- Fetch and display active reading plan progress in Bible reader
- Progress bar shows plan completion percentage when user has active plan
- Progress bar color changes to green for active plans
- Display "Plan Name Progress" with days completed below bar

Reading Plan Navigation:
- Add "Read the Bible" button to active reading plan detail page
- Button shows current/next reading selection (Day X: Book Chapter)
- Navigate directly to Bible reader with correct book and chapter
- Smart selection: current day if incomplete, next incomplete day if current is done
- Only shown for ACTIVE plans

Technical:
- Load active plans via /api/user/reading-plans endpoint
- Calculate progress from completedDays vs plan duration
- Use getCurrentReading() helper to determine next reading
- URL encoding for book names with spaces

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 06:09:50 +00:00
63082c825a feat: add user settings save and reading plans with progress tracking
User Settings:
- Add /api/user/settings endpoint for persisting theme and fontSize preferences
- Update settings page with working save functionality
- Add validation and localized error messages

Reading Plans:
- Add database schema with ReadingPlan, UserReadingPlan, and UserReadingProgress models
- Create CRUD API endpoints for reading plans and progress tracking
- Build UI for browsing available plans and managing user enrollments
- Implement progress tracking with daily reading schedule
- Add streak calculation and statistics display
- Create seed data with 5 predefined plans (Bible in 1 year, 90 days, NT 30 days, Psalms 30, Gospels 30)
- Add navigation link with internationalization support

Technical:
- Update to MUI v7 Grid API (using size prop instead of xs/sm/md and removing item prop)
- Fix Next.js 15 dynamic route params (await params pattern)
- Add translations for readingPlans in all languages (en, ro, es, it)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 23:07:47 +00:00
9d82e719ed fix: display default reset date when limitResetDate is null
Fixed empty "Resets on" date display for new users:

Issue:
- Users who haven't created any conversations yet have limitResetDate = NULL
- The "Resets on" field was showing empty/blank
- This confused users about when their limit would reset

Solution:
- Updated formatResetDate() in 3 components to calculate default date
- If limitResetDate is NULL, display "1 month from now"
- This gives users a clear expectation of when limits reset

Files Updated:
- app/[locale]/subscription/page.tsx
  * formatResetDate() now returns calculated date if null
- components/subscription/usage-display.tsx
  * formatResetDate() now returns calculated date if null
- components/subscription/upgrade-modal.tsx
  * formatResetDate() now returns calculated date if null
  * Removed conditional check - always show reset date

User Experience:
- New users see "Resets on: [date one month from now]"
- Once they create their first conversation, actual reset date is set
- Consistent messaging across all subscription UI components

Note: The actual limitResetDate is set when the user creates their
first conversation (in incrementConversationCount function). This fix
only affects the UI display for users who haven't chatted yet.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 22:43:31 +00:00
17141abb05 fix: add GET handler to user profile API route
Fixed 405 Method Not Allowed error on subscription pages:

Issue:
- Subscription pages were making GET requests to /api/user/profile
- The API route only had a PUT handler (for profile updates)
- This caused 405 (Method Not Allowed) errors

Solution:
- Added GET handler to /api/user/profile/route.ts
- Handler authenticates user via Bearer token
- Returns complete user data including subscription fields:
  * subscriptionTier
  * subscriptionStatus
  * conversationLimit
  * conversationCount
  * limitResetDate
  * stripeCustomerId
  * stripeSubscriptionId

Result:
- Subscription pages can now fetch user data successfully
- Settings page subscription widget displays correctly
- No more 405 errors in console

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 22:39:08 +00:00
bc9fe1d9bb fix: correct localStorage token name from 'token' to 'authToken'
Fixed authentication token inconsistency in subscription pages:

Issue:
- Subscription pages were using localStorage.getItem('token')
- Rest of the app uses localStorage.getItem('authToken')
- This caused users to be redirected to login when accessing subscription pages

Files Fixed:
- app/[locale]/subscription/page.tsx
  * fetchUserData() function
  * handleUpgrade() function
  * handleManageSubscription() function
- app/[locale]/subscription/success/page.tsx
  * SuccessContent component verification
- components/subscription/usage-display.tsx
  * fetchUsageData() function

Result:
- Users can now access subscription pages when logged in
- Consistent authentication token naming across entire app
- No more unwanted redirects to login page

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 22:35:34 +00:00
a667574d50 feat: add subscription section to settings page
Added subscription management section to user settings page:

Changes:
- Added "Subscription & Usage" card to settings page
- Embedded UsageDisplay component (compact mode)
- Added "Manage Plan" button linking to /[locale]/subscription
- Added "View Subscription Details" text button
- Imported CardMembership icon for visual consistency

User Experience:
- Users can now view their subscription status directly in settings
- Shows tier badge (Free/Premium)
- Displays usage progress bar for free users
- Shows remaining conversations and reset date
- Quick access to full subscription management page

Location: app/[locale]/settings/page.tsx:253-289

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 22:31:03 +00:00