- Use vertical layout with icon above count (TikTok style)
- Show correct liked/favorited state with filled icons
- Add count formatting (1.5k, 2.8w)
- Improve button background and positioning
- Update tests for new component structure
- Update templateSocialStore when like/unlike succeeds
- Update templateSocialStore when favorite/unfavorite succeeds
- Sync likeCount and favoriteCount from API response
- Ensure state consistency across video page and detail page
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 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>
- Create vertical social button layout similar to TikTok/Kuaishou
- Support like and favorite actions with proper state management
- Include loading state handling
- Add comprehensive tests covering all props and interactions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Deleted the `api_integration_development_plan.md` and `api_integration_report.md` files as they are no longer needed.
- Removed `findings.md`, `message-adaptation-plan.md`, `progress.md`, `prompt.md`, and `task_plan.md` files to streamline project documentation.
- Ensured all related code and references are updated accordingly.
- Implemented useCategoriesWithTags hook to fetch categories with tags.
- Created zustand store for managing categories and tags state.
- Added error handling and loading states for improved user experience.
test: add comprehensive tests for useCategoryTemplates hook
- Developed unit tests for useCategoryTemplates to ensure correct functionality.
- Included tests for loading states, error handling, pagination, and category ID changes.
- Verified that templates are fetched and merged correctly based on category ID.
feat: create useCategoryTemplates hook for managing category templates
- Introduced useCategoryTemplates hook to fetch templates based on category ID.
- Implemented pagination and loading states for template fetching.
- Added refetch and loadMore functionalities to enhance data retrieval.
feat: modify TemplateCard and TemplateGrid to handle optional id and filter templates
refactor: clean up use-template-filter to use CategoryTemplate type
- 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>
Add useAnnouncementActions hook for marking announcements as read and useAnnouncementUnreadCount hook for fetching unread announcement count. Both hooks follow TDD principles with complete test coverage.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement useMessageActions and useMessageUnreadCount hooks following strict TDD principles (RED → GREEN → REFACTOR).
useMessageActions provides:
- markRead(id) - mark single message as read
- batchMarkRead(ids) - batch mark messages as read
- deleteMessage(id) - delete message
- Independent loading/error states for each operation
useMessageUnreadCount provides:
- Fetch total unread count and counts by message type
- refetch() method for manual refresh
- loading and error state management
All operations use MessageController from SDK with proper error handling.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>