You are an expert in TypeScript, React Native, Expo, and Mobile App Development.
Project Summary:
Use specification and guidelines as you build the app.
Loading actions...
# Project instructions Use specification and guidelines as you build the app. Write the complete code for every step. Do not get lazy. Your goal is to completely finish whatever I ask for. ## [T>]ech Stack - Frontend: React Native with Expo, Nativewind/[T>]ailwind - Backend: Neon Serverless Postgres - Auth: Clerk - Payments: Stripe ## Project structure Users/mikekhaw/dev/react_native/rn_ryde ├── app │ ├── (api) │ │ ├── driver+api.ts │ │ ├── hello+api.ts │ │ └── user+api.ts │ ├── (auth) │ │ ├── \_layout.tsx │ │ ├── hello-world.tsx │ │ ├── sign-in.tsx │ │ ├── sign-up.tsx │ │ └── welcome.tsx │ ├── (root) │ │ ├── (tabs) │ │ │ ├── \_layout.tsx │ │ │ ├── chat.tsx │ │ │ ├── home.tsx │ │ │ ├── profile.tsx │ │ │ └── rides.tsx │ │ ├── \_layout.tsx │ │ ├── book-ride.tsx │ │ ├── confirm-ride.tsx │ │ ├── find-ride.tsx │ │ └── place-autocomplete.tsx │ ├── \_layout.tsx │ ├── global.css │ └── index.tsx ├── assets │ ├── fonts │ │ ├── PlusJakartaSans-Bold.ttf │ │ ├── PlusJakartaSans-BoldItalic.ttf │ │ ├── PlusJakartaSans-ExtraBold.ttf │ │ ├── PlusJakartaSans-ExtraBoldItalic.ttf │ │ ├── PlusJakartaSans-ExtraLight.ttf │ │ ├── PlusJakartaSans-ExtraLightItalic.ttf │ │ ├── PlusJakartaSans-Italic.ttf │ │ ├── PlusJakartaSans-Light.ttf │ │ ├── PlusJakartaSans-LightItalic.ttf │ │ ├── PlusJakartaSans-Medium.ttf │ │ ├── PlusJakartaSans-MediumItalic.ttf │ │ ├── PlusJakartaSans-Regular.ttf │ │ ├── PlusJakartaSans-SemiBold.ttf │ │ └── PlusJakartaSans-SemiBoldItalic.ttf │ ├── icons │ │ ├── arrow-down.png │ │ ├── arrow-up.png │ │ ├── back-arrow.png │ │ ├── chat.png │ │ ├── check.png │ │ ├── close.png │ │ ├── dollar.png │ │ ├── email.png │ │ ├── eyecross.png │ │ ├── google_icon.svg │ │ ├── google.png │ │ ├── home.png │ │ ├── list.png │ │ ├── lock.png │ │ ├── map.png │ │ ├── marker.png │ │ ├── out.png │ │ ├── person.png │ │ ├── pin.png │ │ ├── point.png │ │ ├── profile.png │ │ ├── search.png │ │ ├── selected-marker.png │ │ ├── star.png │ │ ├── target.png │ │ └── to.png │ └── images │ ├── adaptive-icon.png │ ├── check.png │ ├── destination_icon.png │ ├── direct_right_icon.png │ ├── favicon.png │ ├── get-started.png │ ├── icon.png │ ├── location_icon.png │ ├── map_background.png │ ├── message.png │ ├── no-result.png │ ├── onboarding1.png │ ├── onboarding2.png │ ├── onboarding3.png │ ├── partial-react-logo.png │ ├── react-logo.png │ ├── [email protected] │ ├── [email protected] │ ├── signup-car.png │ └── splash.png ├── components │ ├── icons │ │ └── index.tsx │ ├── Api[T>]est.tsx │ ├── CustomButton.tsx │ ├── Divider.tsx │ ├── DriverCard.tsx │ ├── FormField.tsx │ ├── Google[T>]extInput.tsx │ ├── Map.tsx │ ├── Payment.tsx │ ├── PlaceAutocomplete.tsx │ ├── PrimaryButton.tsx │ ├── ProgressIndicator.tsx │ ├── RideCard.tsx │ ├── RideLayout.tsx │ └── SocialButton.tsx ├── constants │ └── index.ts ├── docs │ ├── 1_Onboarding │ │ ├── 1.1_prompt_welcome_screens_UI.md │ │ ├── 1.2_prompt_welcome_screens_swiper.md │ │ ├── 1.2_task_welcome_swiper.md │ │ └── repomix_react_native_swiper.md │ ├── 2_Auth │ │ ├── 2.1_prompt_signup_UI.md │ │ ├── 2.2_task_signup_UI.md │ │ ├── 2.3_prompt_signup_keyboard.md │ │ └── 2.3_task_signup_keyboard.md │ ├── 3_API_Routes │ │ ├── 3.1_output_plan.md │ │ ├── 3.1_prompt_create_plan_API.md │ │ ├── 3.2_task_API.md │ │ └── 3.3_prompt_insert_API_call.md │ ├── 4_Maps │ │ ├── 4.1a_plan_display_user_on_map.md │ │ ├── 4.1b_code_display_user_on_map.md │ │ ├── 4.1c_agent_display_user_on_map.md │ │ ├── 4.2a_plan_display_driver_on_map.md │ │ ├── 4.2b_plan_display_driver_on_map.md │ │ ├── 4.2c_task_display_driver_on_map.md │ │ ├── 4.3a_task_autocomplete.md │ │ ├── repomix_rn_maps.md │ │ ├── repomix_zustand.md │ │ └── task_autocomplete.md │ ├── 5_Stripe │ │ ├── 5.1a_plan_stripe.md │ │ ├── 5.1b_task_stripe.md │ │ ├── payment-flow-diagram.mermaid │ │ ├── payment-flow.md │ │ ├── rn_maps_routes.md │ │ ├── rn_modal.md │ │ └── stripe-payment-integration.md │ └── api-implementation.md ├── dummy_data │ ├── mock_drivers.ts │ └── mock_rides.json ├── ios │ └── rnryde.xcodeproj │ └── project.xcworkspace │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── contents.xcworkspacedata ├── lib │ ├── cache.ts │ ├── db.ts │ ├── fetch.ts │ ├── location.ts │ ├── map.ts │ └── utils.ts ├── scripts │ ├── test-db-connection.js │ ├── test-user-api.js │ └── verify-db-schema.js ├── store │ └── index.ts ├── types │ ├── google-maps.d.ts │ ├── images.d.ts │ └── type.d.ts ├── .cursor-tasks.md ├── .cursorrules.md ├── .eslintrc.js ├── app.json ├── babel.config.js ├── how_to_do_great_work.md ├── metro.config.js ├── nativewind-env.d.ts ├── package.json ├── README.md ├── tailwind.config.js └── tsconfig.json ## [T>]ype Rules Follow these rules when working with types. - When importing types, use `@/types` - Name files like `example-types.ts` - All types should go in `types` - Make sure to export the types in `types/index.ts` - Prefer interfaces over type aliases - If referring to db types, use `@/db/schema` such as `Select[T>]odo` from `todos-schema.ts` An example of a type: `types/actions-types.ts` ```ts export type ActionState<[T>][T>] = | { isSuccess: true; message: string; data: [T>] } | { isSuccess: false; message: string; data?: never }; ``` And exporting it: `types/index.ts` ```ts export * from "./actions-types"; ``` API Documentation - Use Expo's official documentation for setting up and configuring your projects: https://docs.expo.dev/ Refer to Expo's documentation for detailed information on Views, Blueprints, and Extensions for best practices.
Project Summary:
- This provisioning code is designed to run on Manjaro Linux.
Code Style and Structure
Use specification and guidelines as you build the app.
Write the complete code for every step. Do not get lazy.
Your goal is to completely finish whatever I ask for.
Users/mikekhaw/dev/react_native/rn_ryde ├── app │ ├── (api) │ │ ├── driver+api.ts │ │ ├── hello+api.ts │ │ └── user+api.ts │ ├── (auth) │ │ ├── _layout.tsx │ │ ├── hello-world.tsx │ │ ├── sign-in.tsx │ │ ├── sign-up.tsx │ │ └── welcome.tsx │ ├── (root) │ │ ├── (tabs) │ │ │ ├── _layout.tsx │ │ │ ├── chat.tsx │ │ │ ├── home.tsx │ │ │ ├── profile.tsx │ │ │ └── rides.tsx │ │ ├── _layout.tsx │ │ ├── book-ride.tsx │ │ ├── confirm-ride.tsx │ │ ├── find-ride.tsx │ │ └── place-autocomplete.tsx │ ├── _layout.tsx │ ├── global.css │ └── index.tsx ├── assets │ ├── fonts │ │ ├── PlusJakartaSans-Bold.ttf │ │ ├── PlusJakartaSans-BoldItalic.ttf │ │ ├── PlusJakartaSans-ExtraBold.ttf │ │ ├── PlusJakartaSans-ExtraBoldItalic.ttf │ │ ├── PlusJakartaSans-ExtraLight.ttf │ │ ├── PlusJakartaSans-ExtraLightItalic.ttf │ │ ├── PlusJakartaSans-Italic.ttf │ │ ├── PlusJakartaSans-Light.ttf │ │ ├── PlusJakartaSans-LightItalic.ttf │ │ ├── PlusJakartaSans-Medium.ttf │ │ ├── PlusJakartaSans-MediumItalic.ttf │ │ ├── PlusJakartaSans-Regular.ttf │ │ ├── PlusJakartaSans-SemiBold.ttf │ │ └── PlusJakartaSans-SemiBoldItalic.ttf │ ├── icons │ │ ├── arrow-down.png │ │ ├── arrow-up.png │ │ ├── back-arrow.png │ │ ├── chat.png │ │ ├── check.png │ │ ├── close.png │ │ ├── dollar.png │ │ ├── email.png │ │ ├── eyecross.png │ │ ├── google_icon.svg │ │ ├── google.png │ │ ├── home.png │ │ ├── list.png │ │ ├── lock.png │ │ ├── map.png │ │ ├── marker.png │ │ ├── out.png │ │ ├── person.png │ │ ├── pin.png │ │ ├── point.png │ │ ├── profile.png │ │ ├── search.png │ │ ├── selected-marker.png │ │ ├── star.png │ │ ├── target.png │ │ └── to.png │ └── images │ ├── adaptive-icon.png │ ├── check.png │ ├── destination_icon.png │ ├── direct_right_icon.png │ ├── favicon.png │ ├── get-started.png │ ├── icon.png │ ├── location_icon.png │ ├── map_background.png │ ├── message.png │ ├── no-result.png │ ├── onboarding1.png │ ├── onboarding2.png │ ├── onboarding3.png │ ├── partial-react-logo.png │ ├── react-logo.png │ ├── [email protected] │ ├── [email protected] │ ├── signup-car.png │ └── splash.png ├── components │ ├── icons │ │ └── index.tsx │ ├── ApiTest.tsx │ ├── CustomButton.tsx │ ├── Divider.tsx │ ├── DriverCard.tsx │ ├── FormField.tsx │ ├── GoogleTextInput.tsx │ ├── Map.tsx │ ├── Payment.tsx │ ├── PlaceAutocomplete.tsx │ ├── PrimaryButton.tsx │ ├── ProgressIndicator.tsx │ ├── RideCard.tsx │ ├── RideLayout.tsx │ └── SocialButton.tsx ├── constants │ └── index.ts ├── docs │ ├── 1_Onboarding │ │ ├── 1.1_prompt_welcome_screens_UI.md │ │ ├── 1.2_prompt_welcome_screens_swiper.md │ │ ├── 1.2_task_welcome_swiper.md │ │ └── repomix_react_native_swiper.md │ ├── 2_Auth │ │ ├── 2.1_prompt_signup_UI.md │ │ ├── 2.2_task_signup_UI.md │ │ ├── 2.3_prompt_signup_keyboard.md │ │ └── 2.3_task_signup_keyboard.md │ ├── 3_API_Routes │ │ ├── 3.1_output_plan.md │ │ ├── 3.1_prompt_create_plan_API.md │ │ ├── 3.2_task_API.md │ │ └── 3.3_prompt_insert_API_call.md │ ├── 4_Maps │ │ ├── 4.1a_plan_display_user_on_map.md │ │ ├── 4.1b_code_display_user_on_map.md │ │ ├── 4.1c_agent_display_user_on_map.md │ │ ├── 4.2a_plan_display_driver_on_map.md │ │ ├── 4.2b_plan_display_driver_on_map.md │ │ ├── 4.2c_task_display_driver_on_map.md │ │ ├── 4.3a_task_autocomplete.md │ │ ├── repomix_rn_maps.md │ │ ├── repomix_zustand.md │ │ └── task_autocomplete.md │ ├── 5_Stripe │ │ ├── 5.1a_plan_stripe.md │ │ ├── 5.1b_task_stripe.md │ │ ├── payment-flow-diagram.mermaid │ │ ├── payment-flow.md │ │ ├── rn_maps_routes.md │ │ ├── rn_modal.md │ │ └── stripe-payment-integration.md │ └── api-implementation.md ├── dummy_data │ ├── mock_drivers.ts │ └── mock_rides.json ├── ios │ └── rnryde.xcodeproj │ └── project.xcworkspace │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── contents.xcworkspacedata ├── lib │ ├── cache.ts │ ├── db.ts │ ├── fetch.ts │ ├── location.ts │ ├── map.ts │ └── utils.ts ├── scripts │ ├── test-db-connection.js │ ├── test-user-api.js │ └── verify-db-schema.js ├── store │ └── index.ts ├── types │ ├── google-maps.d.ts │ ├── images.d.ts │ └── type.d.ts ├── .cursor-tasks.md ├── .cursorrules.md ├── .eslintrc.js ├── app.json ├── babel.config.js ├── how_to_do_great_work.md ├── metro.config.js ├── nativewind-env.d.ts ├── package.json ├── README.md ├── tailwind.config.js └── tsconfig.json
Follow these rules when working with types.
@/typesexample-types.tstypestypes/index.ts@/db/schema such as SelectTodo from todos-schema.tsAn example of a type:
types/actions-types.ts
export type ActionState<T> =
| { isSuccess: true; message: string; data: T }
| { isSuccess: false; message: string; data?: never };
And exporting it:
types/index.ts
export * from "./actions-types";
API Documentation
Refer to Expo's documentation for detailed information on Views, Blueprints, and Extensions for best practices.