Skip to content

Migrate NativeWind styling system and harden calendar sync#30

Open
DerpcatMusic wants to merge 131 commits into
masterfrom
feat/nativewind-styling
Open

Migrate NativeWind styling system and harden calendar sync#30
DerpcatMusic wants to merge 131 commits into
masterfrom
feat/nativewind-styling

Conversation

@DerpcatMusic
Copy link
Copy Markdown
Owner

Summary

  • finish the NativeWind v5 migration and semantic token rollout across the app
  • add zero-tolerance hardcoded-style enforcement and docs for the new token system
  • harden Google Calendar sync so incomplete integrations no longer crash the client

Validation

  • node ./scripts/check-no-hardcoded-styles.mjs
  • bun run typecheck
  • bunx expo-doctor

DerpcatMusic and others added 30 commits March 7, 2026 12:07
…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>
@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

Codex Agent added 2 commits March 24, 2026 03:32
…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
@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

Comment thread src/components/ui/kit/kit-switch.tsx Outdated
const { interaction } = useKitTheme();
const progress = useSharedValue(value ? 1 : 0);
const pressedTrackColor = value
? (interaction.switchThumbOn as string)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 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(() => {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 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).
@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector
Copy link
Copy Markdown

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) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 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
@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant