From a417bd3b9847b7fa67582105a835c8d9c9ffe60f Mon Sep 17 00:00:00 2001 From: Niels Mokkenstorm Date: Fri, 3 Oct 2025 13:39:00 +0200 Subject: [PATCH] doc: add readme for app --- app/README.md | 122 ++++++++++++++++++++++++++++++++-------- app/navigation_flow.png | Bin 0 -> 32758 bytes 2 files changed, 98 insertions(+), 24 deletions(-) create mode 100644 app/navigation_flow.png diff --git a/app/README.md b/app/README.md index 48dd63f..fcf2e18 100644 --- a/app/README.md +++ b/app/README.md @@ -1,50 +1,124 @@ -# Welcome to your Expo app πŸ‘‹ +# React Native Demo App -This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app). +A simple **mobile banking application** built with **React Native** and **Expo**, powered by the provided API (`react-native-demo`). +This app demonstrates clean architecture, modular code, and mobile development best practices. -## Get started +--- -1. Install dependencies +## πŸ“± Features + +The app implements the core requirements from the assignment: + +1. **Authentication** β€” Login with credentials (`test@test.test` / `password@123` by default). +2. **Accounts Overview** β€” List of accounts (checking, savings, etc.). +3. **Transactions** β€” View transactions for a selected account, with: + - search + - sort + - pagination + - infinite scroll +4. **Cards Overview** β€” List of stored cards. + +--- + +## πŸ—οΈ Architecture Decisions + +- **Framework**: [Expo](https://expo.dev/) for fast development, simple build tooling, and easy testing on iOS, Android, and web. +- **Language**: [TypeScript](https://www.typescriptlang.org/) for strong typing and maintainability. +- **Navigation**: [React Navigation](https://reactnavigation.org/) for stack + tab navigation. +- **Styling**: Basic **React Native styles** with the [Catppuccin](https://catppuccin.com/) color palette. + - In a real-world project, a UI component library (React Native Paper, Tamagui, NativeBase) would be added for consistency and scalability. +- **Lists**: [FlashList](https://shopify.github.io/flash-list/) by Shopify for efficient rendering of large lists (transactions). + - FlashList provides smoother scrolling and better performance compared to FlatList. +- **Data Fetching & State Management**: [TanStack Query](https://tanstack.com/query) for server-state management. + - Handles caching, background refetching, and pagination logic cleanly. + - Used together with FlashList to implement **infinite scroll** on transactions. +- **Auth & App State**: Context + hooks for lightweight client state. + +--- + +## πŸ”§ Prerequisites + +- [Node.js](https://nodejs.org/) **v18 or higher** +- [Expo CLI](https://docs.expo.dev/get-started/installation/): + + ```bash + npm install -g expo + ``` + +- The API server (`react-native-demo`) running locally at `http://localhost:3001`. + +--- + +## πŸš€ Installation + +1. Clone the repository and navigate to the app folder: + + ```bash + git clone git@tangled.sh:mokkenstorm.dev/react-native-demo + cd react-native-demo/app + ``` + +2. Install dependencies: ```bash npm install ``` -2. Start the app +3. Generate API bindings from the OpenAPI spec: ```bash - npx expo start + npm run generate ``` -In the output, you'll find options to open the app in a +--- -- [development build](https://docs.expo.dev/develop/development-builds/introduction/) -- [Android emulator](https://docs.expo.dev/workflow/android-studio-emulator/) -- [iOS simulator](https://docs.expo.dev/workflow/ios-simulator/) -- [Expo Go](https://expo.dev/go), a limited sandbox for trying out app development with Expo +## ▢️ Running the App -You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction). +Run with Expo: + +```bash +npm run ios # iOS simulator +npm run android # Android emulator +npm run web # Web browser +``` -## Get a fresh project +Expo will guide you to open the app on your device or emulator. -When you're ready, run: +⚠️ **Note:** The API server **must be running** on `http://localhost:3001` for login and data fetching to work. + +--- + +## πŸ§ͺ Testing + +Unit tests are written with **Jest** and **React Native Testing Library**. +Run tests with: ```bash -npm run reset-project +npm test ``` -This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing. +--- + +## πŸ“¦ Node & NPM Versions + +- **Node.js**: v18+ +- **npm**: v9+ + +(Verified using `nvm` for version consistency.) -## Learn more +--- -To learn more about developing your project with Expo, look at the following resources: +## ✨ Bonus Features -- [Expo documentation](https://docs.expo.dev/): Learn fundamentals, or go into advanced topics with our [guides](https://docs.expo.dev/guides). -- [Learn Expo tutorial](https://docs.expo.dev/tutorial/introduction/): Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web. +- βœ… Refresh token handling to keep the user logged in. +- βœ… Pull-to-refresh on accounts/transactions. +- βœ… Loading indicators on API calls. +- βœ… Infinite scroll for transactions (FlashList + TanStack Query). +- πŸ”² Accessibility improvements (VoiceOver, keyboard navigation). +- πŸ”² CI/CD setup for Expo builds. -## Join the community +--- -Join our community of developers creating universal apps. +## πŸ—ΊοΈ Navigation Flow -- [Expo on GitHub](https://github.com/expo/expo): View our open source platform and contribute. -- [Discord community](https://chat.expo.dev): Chat with Expo users and ask questions. +![App Navigation Flow](./navigation_flow.png) diff --git a/app/navigation_flow.png b/app/navigation_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d7abf09dd06aaf098c3534b7dcdc0556a3e975 GIT binary patch literal 32758 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 literal 0 HcmV?d00001 -- 2.51.2