Migrate NativeWind styling system and harden calendar sync#30
Migrate NativeWind styling system and harden calendar sync#30DerpcatMusic wants to merge 131 commits into
Conversation
…oard-ui Harden Rapyd integration and refresh responsive dashboard UI across tabs
# Conflicts: # src/app/(app)/(instructor-tabs)/instructor/profile/index.tsx # src/app/(app)/(studio-tabs)/studio/profile/index.tsx # src/components/calendar/calendar-tab-screen.tsx # src/components/calendar/use-calendar-tab-controller.ts # src/components/jobs/studio-feed.tsx # src/components/layout/tab-screen-root.tsx # src/components/maps/queue-map.native.tsx # src/components/maps/queue-map.web.tsx
- add `convex/lib/marketplace.ts` with shared payment, ledger, and payout helpers - sync legacy payment updates into payment-order flow and provider link handling - trigger payout eligibility evaluation when lessons move to `completed` - include updated Expo export smoke artifacts and metadata
- add migration helpers to backfill payment orders, provider links, payout schedules, and payouts - insert missing ledger entries for capture, release, payout lifecycle, and refunds with dedupe keys - add `getMarketplaceFinanceBackfillReport` and `backfillMarketplaceFinance`/batch actions with cursor pagination and metrics
- Replace inferred internalMutation handler context types with `MutationCtx` - Make optional migration args explicitly `| undefined` - Add index callback annotations to satisfy TypeScript in migration queries
- Add payout preference UI with Auto, Schedule, and Hold modes plus date picker - Validate scheduled dates server-side and trigger/rescind scheduling when preference changes - Harden finance backfill inserts/patches with optional-field handling and typed results
Co-authored-by: Codex Agent <codex@local.dev>
Deduplicate verified auth accounts by email
Co-authored-by: Codex Agent <codex@local.dev>
Co-authored-by: Codex Agent <codex@local.dev>
Co-authored-by: Codex Agent <codex@local.dev>
Co-authored-by: Codex Agent <codex@local.dev>
Co-authored-by: Codex Agent <codex@local.dev>
Co-authored-by: Codex Agent <codex@local.dev>
Co-authored-by: Codex Agent <codex@local.dev>
Co-authored-by: Codex Agent <codex@local.dev>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
…tion UI
Schema
- Added addressCity, addressStreet, addressNumber, addressFloor, addressPostalCode to instructorProfiles and studioProfiles tables (convex/schema.ts)
Convex backend
- Updated getMyInstructorSettings / updateMyInstructorSettings to read/write all 5 new structured fields (convex/users.ts)
- Updated getMyStudioSettings / updateMyStudioSettings to read/write all 5 new structured fields (convex/users.ts)
OSM address parsing (src/lib/google-places.ts)
- Extended PlaceCoordinates type with city?, street?, streetNumber?, postalCode?
- Rewrote fetchOsmAutocomplete to parse OSM addressdetails, extract structured parts, cache them, and return cleaner mainText (street+number) and secondaryText (city, postal code)
- Added fetchPlaceByZipCode() for Israeli postal code lookup via OSM Nominatim (countrycodes=il)
Location resolution (src/lib/location-zone.ts)
- Extended ResolvedLocation type with structured address fields
- Rewrote reverseGeocodeOnWeb and geocodeAddressOnWeb to extract and return structured address data from OSM
- Simplified formatAddress — outputs only "{streetNumber} {street} | {city}, {postalCode}", removed subregion/region noise
- Updated resolveCoordinatesToZone and resolveAddressToZone to populate structured fields
UI (src/app/(app)/(instructor-tabs)/instructor/profile/location.tsx)
- Rewrote with distill principles: removed hero card, single search bar as primary path, auto-filled structured address summary below search bar, manual mode as quiet escape-hatch link, zip lookup as secondary action link, compact zone section with dot indicator
- Added ManualField + FieldLabel sub-components with NativeWind 5 (no hardcoded values, BrandSpacing/BrandType/palette tokens throughout)
- All new translation strings added to both en.ts and he.ts
i18n
- Added English + Hebrew translation keys: enterManually, backToSearch, findByZip, fieldCity/Street/Number/Floor/ZipCode, fieldCityPlaceholder, fieldStreetPlaceholder, zipNotFound
Lint
- Fixed import ordering in onboarding.tsx, profile-role-switcher-card.tsx, address-autocomplete.tsx, tw/index.tsx
Top sheet
- Reworked the global top sheet transition path so the sheet frame stays anchored while content animates inside it
- Switched content transitions to a lightweight fade and restored animation coverage for sticky header/footer rich-render paths
- Fixed multiple layout regressions in the transition wrapper that caused hidden content in map, home, calendar, and profile tabs
- Removed jobs-specific local header layout animation so instructor jobs uses the same global top-sheet behavior as other tabs
- Measured real profile header/subpage header content to drive collapsed sheet height instead of relying on hardcoded step guesses
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
| const { interaction } = useKitTheme(); | ||
| const progress = useSharedValue(value ? 1 : 0); | ||
| const pressedTrackColor = value | ||
| ? (interaction.switchThumbOn as string) |
There was a problem hiding this comment.
🔥 The Roast: When the switch is ON and pressed, pressedTrackColor uses interaction.switchThumbOn — the thumb color — instead of interaction.switchTrackOn — the track color. That's like pressing a doorbell and having the house paint itself. The thumb and track are not interchangeable.
🩹 The Fix: The pressed ON state should use interaction.switchTrackOn (track color when on), not interaction.switchThumbOn (thumb color when on).
📏 Severity: warning
|
|
||
| // Gentle breathing pulse for the symbol | ||
| const pulse = useSharedValue(1); | ||
| useEffect(() => { |
There was a problem hiding this comment.
🔥 The Roast: This useEffect kicks off withRepeat(-1) — an infinite loop animation — but returns no cleanup function. When this component unmounts (navigation away, error boundary, etc.), React Native Reanimated will complain about "animation on unmounted component." Classic "I will remember to add cleanup later" energy.
🩹 The Fix:
useEffect(() => {
pulse.value = withRepeat(
withSequence(
withTiming(1.04, { duration: 1200, easing: Easing.out(Easing.exp) }),
withTiming(1, { duration: 1200, easing: Easing.in(Easing.exp) }),
),
-1,
false,
);
return () => {
pulse.value = 1;
};
}, [pulse]);📏 Severity: warning
…ept/reject - Instructor home: horizontal snap-to-page carousel for available jobs with animated dot indicators (shared JobCarouselDots component). Empty state card when no jobs are available. - Studio home: review queue carousel with per-application Accept/Reject buttons wired to reviewApplication mutation. Empty state when queue is clear. Optimistic update via Convex refetch after mutation. - JobCarouselDots: reusable animated dot component using Reanimated SharedValue + withSpring for smooth active-dot scale/opacity transitions. - i18n: new keys for empty states (instructor + studio review queues).
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
| setReviewingId(applicationId); | ||
| try { | ||
| await reviewApplication({ applicationId, status }); | ||
| } catch (_err) { |
There was a problem hiding this comment.
🔥 The Roast: Silent error handling is like a driver who nods yes but never actually brakes. The button goes into "reviewing" mode, then silently snaps back — leaving the user wondering if their "accept" actually worked.
🩹 The Fix: Add user-facing error feedback. Even a simple Alert.alert(t("common.error"), t("home.studio.reviewError")) would prevent users from thinking their tap glitched.
📏 Severity: suggestion
…p, kit-switch pressed color - studio-home-content: surface error text on card when reviewApplication mutation fails instead of silently swallowing the error - loading-screen: add cancelAnimation() cleanup to infinite pulse useEffect to prevent animation leak on unmount - kit-switch: pressedTrackColor now uses switchTrackOn (not switchThumbOn) when switch value is true + pressed
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Summary
Validation