From 8bc9649146fa8e185b77570e4000473a46f90321 Mon Sep 17 00:00:00 2001 From: Sergei Date: Wed, 24 Dec 2025 17:13:13 -0800 Subject: [PATCH] WellNuo Lite v1.0.0 - simplified version for App Store review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Removed voice input features - Simplified profile page (only legal links and logout) - Chat with AI context working - Auto-select first beneficiary - Dashboard WebView intact šŸ¤– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .gitignore | 44 + .vscode/extensions.json | 1 + .vscode/settings.json | 7 + README.md | 50 + app.json | 59 + app/(auth)/_layout.tsx | 15 + app/(auth)/login.tsx | 210 + app/(tabs)/_layout.tsx | 83 + app/(tabs)/beneficiaries/[id]/dashboard.tsx | 336 + app/(tabs)/beneficiaries/[id]/index.tsx | 386 + app/(tabs)/beneficiaries/_layout.tsx | 16 + app/(tabs)/chat.tsx | 672 + app/(tabs)/dashboard.tsx | 162 + app/(tabs)/explore.tsx | 112 + app/(tabs)/index.tsx | 279 + app/(tabs)/profile.tsx | 253 + app/_layout.tsx | 62 + app/modal.tsx | 29 + assets/images/android-icon-background.png | Bin 0 -> 6515 bytes assets/images/android-icon-foreground.png | Bin 0 -> 137980 bytes assets/images/android-icon-monochrome.png | Bin 0 -> 116733 bytes assets/images/favicon.png | Bin 0 -> 1349 bytes assets/images/icon.png | Bin 0 -> 134020 bytes assets/images/partial-react-logo.png | Bin 0 -> 5075 bytes assets/images/react-logo.png | Bin 0 -> 6341 bytes assets/images/react-logo@2x.png | Bin 0 -> 14225 bytes assets/images/react-logo@3x.png | Bin 0 -> 21252 bytes assets/images/splash-icon.png | Bin 0 -> 35752 bytes assets/logo.png | Bin 0 -> 21465 bytes components/external-link.tsx | 25 + components/haptic-tab.tsx | 18 + components/hello-wave.tsx | 19 + components/parallax-scroll-view.tsx | 79 + components/themed-text.tsx | 60 + components/themed-view.tsx | 14 + components/ui/Button.tsx | 137 + components/ui/ErrorMessage.tsx | 141 + components/ui/Input.tsx | 143 + components/ui/LoadingSpinner.tsx | 50 + components/ui/collapsible.tsx | 45 + components/ui/icon-symbol.ios.tsx | 32 + components/ui/icon-symbol.tsx | 41 + constants/theme.ts | 122 + contexts/AuthContext.tsx | 136 + contexts/BeneficiaryContext.tsx | 86 + eas.json | 29 + eslint.config.js | 10 + hooks/use-color-scheme.ts | 1 + hooks/use-color-scheme.web.ts | 21 + hooks/use-theme-color.ts | 21 + package-lock.json | 13440 ++++++++++++++++++ package.json | 51 + scripts/reset-project.js | 112 + services/api.ts | 234 + tsconfig.json | 17 + types/index.ts | 72 + 56 files changed, 17932 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 README.md create mode 100644 app.json create mode 100644 app/(auth)/_layout.tsx create mode 100644 app/(auth)/login.tsx create mode 100644 app/(tabs)/_layout.tsx create mode 100644 app/(tabs)/beneficiaries/[id]/dashboard.tsx create mode 100644 app/(tabs)/beneficiaries/[id]/index.tsx create mode 100644 app/(tabs)/beneficiaries/_layout.tsx create mode 100644 app/(tabs)/chat.tsx create mode 100644 app/(tabs)/dashboard.tsx create mode 100644 app/(tabs)/explore.tsx create mode 100644 app/(tabs)/index.tsx create mode 100644 app/(tabs)/profile.tsx create mode 100644 app/_layout.tsx create mode 100644 app/modal.tsx create mode 100644 assets/images/android-icon-background.png create mode 100644 assets/images/android-icon-foreground.png create mode 100644 assets/images/android-icon-monochrome.png create mode 100644 assets/images/favicon.png create mode 100644 assets/images/icon.png create mode 100644 assets/images/partial-react-logo.png create mode 100644 assets/images/react-logo.png create mode 100644 assets/images/react-logo@2x.png create mode 100644 assets/images/react-logo@3x.png create mode 100644 assets/images/splash-icon.png create mode 100644 assets/logo.png create mode 100644 components/external-link.tsx create mode 100644 components/haptic-tab.tsx create mode 100644 components/hello-wave.tsx create mode 100644 components/parallax-scroll-view.tsx create mode 100644 components/themed-text.tsx create mode 100644 components/themed-view.tsx create mode 100644 components/ui/Button.tsx create mode 100644 components/ui/ErrorMessage.tsx create mode 100644 components/ui/Input.tsx create mode 100644 components/ui/LoadingSpinner.tsx create mode 100644 components/ui/collapsible.tsx create mode 100644 components/ui/icon-symbol.ios.tsx create mode 100644 components/ui/icon-symbol.tsx create mode 100644 constants/theme.ts create mode 100644 contexts/AuthContext.tsx create mode 100644 contexts/BeneficiaryContext.tsx create mode 100644 eas.json create mode 100644 eslint.config.js create mode 100644 hooks/use-color-scheme.ts create mode 100644 hooks/use-color-scheme.web.ts create mode 100644 hooks/use-theme-color.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100755 scripts/reset-project.js create mode 100644 services/api.ts create mode 100644 tsconfig.json create mode 100644 types/index.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2a6edee --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files + +# dependencies +node_modules/ + +# Expo +.expo/ +dist/ +web-build/ +expo-env.d.ts + +# Native +.kotlin/ +*.orig.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision + +# Metro +.metro-health-check* + +# debug +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store +*.pem + +# local env files +.env*.local + +# typescript +*.tsbuildinfo + +app-example + +# generated native folders +/ios +/android +.git-credentials diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..b7ed837 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1 @@ +{ "recommendations": ["expo.vscode-expo-tools"] } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e2798e4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.organizeImports": "explicit", + "source.sortMembers": "explicit" + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..48dd63f --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +# Welcome to your Expo app šŸ‘‹ + +This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app). + +## Get started + +1. Install dependencies + + ```bash + npm install + ``` + +2. Start the app + + ```bash + npx expo start + ``` + +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 + +You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction). + +## Get a fresh project + +When you're ready, run: + +```bash +npm run reset-project +``` + +This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing. + +## Learn more + +To learn more about developing your project with Expo, look at the following resources: + +- [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. + +## Join the community + +Join our community of developers creating universal apps. + +- [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. diff --git a/app.json b/app.json new file mode 100644 index 0000000..a9510c5 --- /dev/null +++ b/app.json @@ -0,0 +1,59 @@ +{ + "expo": { + "name": "WellNuo Lite", + "slug": "WellNuoLite", + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/images/icon.png", + "scheme": "wellnuo", + "userInterfaceStyle": "automatic", + "newArchEnabled": true, + "ios": { + "supportsTablet": true, + "bundleIdentifier": "com.wellnuo.app", + "infoPlist": { + "ITSAppUsesNonExemptEncryption": false + } + }, + "android": { + "adaptiveIcon": { + "backgroundColor": "#E6F4FE", + "foregroundImage": "./assets/images/android-icon-foreground.png", + "backgroundImage": "./assets/images/android-icon-background.png", + "monochromeImage": "./assets/images/android-icon-monochrome.png" + }, + "edgeToEdgeEnabled": true, + "predictiveBackGestureEnabled": false + }, + "web": { + "output": "static", + "favicon": "./assets/images/favicon.png" + }, + "plugins": [ + "expo-router", + [ + "expo-splash-screen", + { + "image": "./assets/images/splash-icon.png", + "imageWidth": 200, + "resizeMode": "contain", + "backgroundColor": "#ffffff", + "dark": { + "backgroundColor": "#000000" + } + } + ] + ], + "experiments": { + "typedRoutes": true, + "reactCompiler": true + }, + "extra": { + "router": {}, + "eas": { + "projectId": "4a77e46d-7b0e-4ace-a385-006b07027234" + } + }, + "owner": "kosyakorel1" + } +} diff --git a/app/(auth)/_layout.tsx b/app/(auth)/_layout.tsx new file mode 100644 index 0000000..9ac3ffe --- /dev/null +++ b/app/(auth)/_layout.tsx @@ -0,0 +1,15 @@ +import { Stack } from 'expo-router'; +import { AppColors } from '@/constants/theme'; + +export default function AuthLayout() { + return ( + + + + ); +} diff --git a/app/(auth)/login.tsx b/app/(auth)/login.tsx new file mode 100644 index 0000000..ed77ae5 --- /dev/null +++ b/app/(auth)/login.tsx @@ -0,0 +1,210 @@ +import React, { useState, useCallback } from 'react'; +import { + View, + Text, + StyleSheet, + KeyboardAvoidingView, + Platform, + ScrollView, + TouchableOpacity, + Image, +} from 'react-native'; +import { router } from 'expo-router'; +import { useAuth } from '@/contexts/AuthContext'; +import { Button } from '@/components/ui/Button'; +import { Input } from '@/components/ui/Input'; +import { ErrorMessage } from '@/components/ui/ErrorMessage'; +import { AppColors, BorderRadius, FontSizes, Spacing } from '@/constants/theme'; + +export default function LoginScreen() { + const { login, isLoading, error, clearError } = useAuth(); + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [validationError, setValidationError] = useState(null); + + const handleLogin = useCallback(async () => { + // Clear previous errors + clearError(); + setValidationError(null); + + // Validate + if (!username.trim()) { + setValidationError('Username is required'); + return; + } + if (!password.trim()) { + setValidationError('Password is required'); + return; + } + + const success = await login({ username: username.trim(), password }); + + if (success) { + router.replace('/(tabs)'); + } + }, [username, password, login, clearError]); + + const displayError = validationError || error?.message; + + return ( + + + {/* Logo / Header */} + + + WellNuo + + Welcome Back + Sign in to continue monitoring your loved ones + + + {/* Form */} + + {displayError && ( + { + clearError(); + setValidationError(null); + }} + /> + )} + + { + setUsername(text); + setValidationError(null); + }} + autoCapitalize="none" + autoCorrect={false} + editable={!isLoading} + /> + + { + setPassword(text); + setValidationError(null); + }} + editable={!isLoading} + onSubmitEditing={handleLogin} + returnKeyType="done" + /> + + + Forgot Password? + + +