Files
cnapp/README.md
T

5.6 KiB

cnapp

The mobile app for Chateau Neuf using React and Expo.

📚 Expo Documentation

Install

Use mise to install Node, Java and the Android SDK command-line tools.

mise trust
mise install
npm install
cp env-example .env.local

Development

This app uses native functionality that isn't supported by Expo Go, so you need a development build compiled from source. Follow Expo's local development setup guide for your platform, then build and run once (see below). After that, just start the dev server and open the app on your device or simulator:

npm run start

Android

mise install provides the Android SDK command-line tools (the android CLI for managing the SDK, emulators and devices, and platform-tools for adb), plus an accepted SDK license. The first build downloads the remaining SDK packages automatically.

Enable USB debugging or wireless debugging on a connected device, or start an emulator (android emulator start), then:

npm run android

iOS (requires macOS)

Install Xcode, then run on the Simulator or a connected device:

npm run ios

Scripts

  • npm run start - Start Expo development server on port 19001
  • npm run android - Run app in Android emulator
  • npm run ios - Run app in iOS simulator (requires macOS)
  • npm run web - Run app in web browser
  • npm run lint - Check code with ESLint
  • npm run format - Fix code formatting with ESLint
  • npm run check-types - Run TypeScript type checking
  • npm test - Run the test suite
  • npm run test:watch - Run the test suite in watch mode

History

This is a fork of dusken-client with some history, code and binary blobs related to React Native functionality filtered out before commit 7f6b2c21.

TODO

  • add functionality needed to pass new store requirements
    • privacy policy
    • delete my account
    • ???
  • test in android emulator? (npm run android)
  • test in ios emulator? (npm run ios, requires macOS)
  • use Expo Application Services to build and submit app to stores
  • replace redux (redux v5 + redux-thunk, hand-written actions and the deprecated createStore): nearly everything in the store is server state (user data) plus one auth token, so drop redux for TanStack Query for fetching/caching, with the token in React context + AsyncStorage — replaces src/reducers.ts, the fetch thunks in src/api.ts and the isFetching*/error flags
  • replace moment (maintenance mode) with date-fns
  • replace unmaintained UI packages:
    • react-native-confetti (last release 2017, mocked out in tests)
    • react-native-simple-radio-button (react-native-ui-lib already ships RadioButton/RadioGroup)
  • migrate ESLint 8 + airbnb config (both EOL) to ESLint 9 flat config or eslint-config-expo
  • follow-ups from the Expo SDK 54 upgrade:
    • decide on Sentry: @sentry/react-native is installed but never initialized (see the commented-out init in index.ts), and its config plugin (now applied via app.json) warns about missing organization/project at every build — either finish the setup or drop the dependency
    • verify Android UI on a device/emulator: edge-to-edge is now always enabled and can no longer be disabled
    • try the React Compiler (enabled by default in new SDK 54 projects, opt-in for existing ones via "experiments": { "reactCompiler": true } in app.json)
    • add an iOS 26 liquid glass icon: a .icon file made with Apple's Icon Composer, referenced from ios.icon (old icon remains as fallback for older iOS); optionally play with expo-glass-effect
    • consider remote build caching (now stable) so npm run android/ios can download a cached build instead of compiling locally when the native fingerprint is unchanged
  • add Apple Pay for membership payments: either natively in the payment sheet (register the merchant ID merchant.no.neuf.chateau + Apple Pay certificate, set merchantIdentifier in the @stripe/stripe-react-native plugin config, pass applePay to initPaymentSheet, new iOS build), or for free by moving payment to a Stripe-hosted Checkout page in the browser (needs a backend Checkout Session endpoint and a return deep link)
  • add Google Pay for membership payments: either natively in the payment sheet (enableGooglePay: true in the plugin config, pass googlePay to initPaymentSheet, request production access in the Google Pay & Wallet Console, new Android build), or for free via the same Stripe-hosted Checkout page as for Apple Pay