fix(calendar): remove false offline indicator and reduce spacing - #23
Merged
Conversation
…afe area CategoryLimitError thrown on POST /categories 403 — shows upgrade alert instead of generic error. QuickAddButton and AddTaskButton now respect bottom safe area inset so buttons don't overlap home indicator on notched devices. SafeAreaView on Home now excludes bottom edge to avoid double inset with tab bar.
GET /auth/me now returns monthly limits for text and voice. UserSubscription gains chat_text_monthly_limit, chat_voice_monthly_limit, chat_voice_daily_limit. WS close code 4029 (monthly voice quota exhausted) no longer triggers reconnect — fires onVoiceMonthlyLimitReached instead. Code 4003 stays for plans without voice. POST /billing/cancel wired via cancelSubscription() in planService. Voice display in AISettings/Settings switches from enabled/disabled boolean to monthly quota number (or Unlimited). Locales: daily instead of monthly for text quota; new keys for voice monthly limit alert.
…gration - Install react-native-purchases for Play Store IAP - Add planLimits.ts with tier limits and product IDs - Create revenueCatService.ts singleton (configure, getOfferings, purchasePlan, restorePurchases) - Add SubscriptionPlans screen with plan cards (Free/Pro/Premium) - Wire upgrade buttons in Settings/AISettings to navigate - Implement purchase, cancel, and restore flows - Add EN/IT localization for subscriptionPlans - Navigation: add SubscriptionPlans to RootStackParamList Note: User must add REVENUECAT_ANDROID_PUBLIC_KEY to .env before build
- Remove test buttons and render local plans properly
- Map real prices from RevenueCat when available
- Show offline warning and placeholder price ('--') when RevenueCat fetch fails
- Improve UI with modern layout, shadows, colors, and feature checkmarks
- Replace navigation.navigate with navigation.reset in Login to prevent back gesture returning to login screen - Force dismiss WebBrowser after Google OAuth to prevent browser tab remaining in Android back stack - Set showInRecents to false on auth session
…, and improved UI
Document duplicated UI patterns across Categories, TaskList, Calendar, Calendar20, and Home, and mark task 1.1 as completed to establish the migration baseline. Made-with: Cursor
Establish the shared naming rules and folder responsibilities for `src/theme` and `src/components/UI/foundation`, and mark task 1.2 as completed. Made-with: Cursor
Add a reusable UI validation checklist for Categories, TaskList, Calendar, and Home, and mark task 1.3 as completed. Made-with: Cursor
Introduce spacing, radius, elevation, color, and typography tokens in `src/theme/tokens.ts` and mark task 2.1 as completed for the foundation rollout. Made-with: Cursor
Introduce the reusable `AppText` component backed by shared typography tokens and mark tasks 2.2 and 6.1 as completed. Made-with: Cursor
Create `ScreenContainer` and `ContentContainer` for shared background/padding behavior and mark tasks 2.3, 6.2, and 6.3 as completed. Made-with: Cursor
Implement `ScreenHeader` with title, right action slot, and alignment variants, and mark tasks 2.4 and 6.4 as completed. Made-with: Cursor
Add reusable card surface variants with accent border support and mark tasks 2.5 and 6.5 as completed. Made-with: Cursor
…l, and input primitives Implement composable UI building blocks for section headers, status chips, loading states, empty states, modal shell, input shell, and icon action button, then mark tasks 3.1-3.6 and 6.6-6.12 as completed. Made-with: Cursor
Migrate Categories screen to `ScreenContainer`, `ScreenHeader`, and `ContentContainer` while preserving existing behavior, and mark task 4.1 as completed. Made-with: Cursor
Commit the remaining OpenSpec change artifacts so the reusable UI foundation plan is fully tracked in git. Made-with: Cursor
…patterns Adopt `CardSurface` in `CategoryCard` and `SectionHeader` in category empty state to align category UI with reusable foundation components, and mark task 4.2 as completed. Made-with: Cursor
…mitives Replace custom dot animation with shared LoadingState (dots variant), inline empty view with EmptyState, and section title with SectionHeader. Remove unused loadingStyles, TaskListHeader import.
Replace hardcoded card shell with CardSurface (interactive + accent border), Text elements with AppText variants, and category/status badges with StatusChip.
…ation primitives Replace custom LoadingComponent with LoadingState (dots), inline sync indicators with StatusChip (neutral/danger/warning tones), empty tasks view with EmptyState, header title with AppText subtitle.
…ngState Use shared LoadingState spinner instead of raw ActivityIndicator in Calendar20View. Container background already matches tokens.
Replace mainTitle Text with AppText display variant, swap hardcoded hex colors with token references (backgrounds, borders, text, icons). Chat loading bubble preserved as-is (chat-specific UX pattern).
…wrapper Replace Text mainTitle with AppText display (weight 200), swap hardcoded hex colors with token references. Cleanup 5.2 — remove inline duplicates.
…t guide Document all 12 foundation primitives with usage examples, token table, and composition guidelines to prevent new macro-components.
Add PurchasesPackage type annotations to .find() callbacks, fix
formatFeatureLimit param types to match isUnlimitedPlan signature,
and rename i18n {{count}} to {{num}} to avoid Intl.PluralRules
which is unavailable in Hermes engine on Android.
Remove offline StatusChip from CalendarView that showed false negatives. NetworkService now pings backend /support/health instead of google.com with 2-consecutive-failure threshold. Move hardcoded secrets to env vars. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…e badge with price - Move Active badge from title row to price row on the right side - Restructure dark card with top row containing left (title+trial) and right (price+badge+period) - Use plan-specific offerings lookup instead of current offering - Simplify price calculation by removing monthly equivalent logic - Show warning only when both pro and premium offerings are missing - Remove unused darkCardHeader and darkCardTitleRow styles Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…RevenueCat permissions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Remove offline StatusChip from CalendarView that showed false negatives. NetworkService now pings backend /support/health instead of google.com with 2-consecutive-failure threshold. Move hardcoded secrets to env vars.