- Add initialLikeCount and initialFavoriteCount parameters
- Use item.likeCount/item.favoriteCount as fallback
- Fixes issue where count resets to 0 on first click
- Implement double-tap detection on video area
- Show heart animation on double-tap (similar to TikTok/Douyin)
- Toggle like/unlike on double-tap
- Add Animated and Ionicons imports
- Add tests for double-tap functionality
- Add videoPressable and heartAnimation styles
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add VideoSocialButton to VideoItem component
- Connect like/favorite actions with existing hooks
- Use Zustand store for state management
- Extend templateSocialStore to support favoriteCount
- Update tests for social button integration
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Implemented TemplateGrid component for displaying templates in a grid layout.
- Added calculateCardWidth helper function for dynamic card sizing.
- Created TitleBar component for displaying the title and points with interaction.
- Added unit tests for TemplateGrid and TitleBar components to ensure proper functionality.
- Introduced useStickyTabs and useTabNavigation hooks with tests for managing sticky tab behavior and navigation logic.
- Implemented useTemplateFilter hook for filtering templates based on video content.
- Added comprehensive tests for all new hooks and components to validate behavior and edge cases.
Following TDD principles (RED-GREEN-REFACTOR):
- RED: Created failing tests for HomeScreen rendering
- Verify RED: Confirmed tests failed due to missing mocks
- GREEN: Added necessary mocks for all dependencies
- Verify GREEN: All 4 tests passing (4/4)
Tests cover:
- Title bar rendering with app name
- Category tabs rendering when data is loaded
- Template cards rendering when category has templates
- Loading state not showing when data is loaded
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
FlashList cannot be nested inside ScrollView. Changed to FlatList with scrollEnabled=false to allow proper rendering within the parent ScrollView.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
FlashList requires estimatedItemSize prop to properly render content. Without it, the list may appear blank even when data is present.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add console logs to track template filtering process on home and video pages to diagnose black screen issue. Logs include all preview URL fields and filtering decisions.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
SDK API only accepts single MessageType value, not array. Updated to use client-side filtering for Tab-based message type filtering (all/notice/other) instead of server-side filtering.
Changes:
- hooks/use-messages.ts: Changed type parameter from array to single value
- app/(tabs)/message.tsx: Replaced getMessageTypeByTab with filterMessagesByTab for client-side filtering
- Removed useEffect dependency on activeTab to prevent unnecessary refetches
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace mock data with useMessages hook and useMessageActions for real-time message management. Add support for tab-based filtering (all/notice/other), pull-to-refresh, infinite scroll pagination, and mark-as-read functionality. Integrate LoadingState, ErrorState, and PaginationLoader components for better UX.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace inline LoadingState, ErrorState, and FooterLoading components with reusable UI components (LoadingState, ErrorState, RefreshControl, PaginationLoader). Add retry functionality to ErrorState and maintain consistent styling with #FFE500 color theme.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace custom loading/error states with reusable components (RefreshControl, LoadingState, ErrorState). Add pull-to-refresh functionality and remove duplicate styles.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>