Fix web build: React 19 JSX runtime + AuthContext hooks order

- babel.config.js: changed jsxRuntime from 'classic' to 'automatic' (React 19 requirement)
- AuthContext.tsx: reordered useEffect/useCallback to fix "Cannot access 'checkAuth' before initialization" error on web
- CLAUDE.md: added Quick Start, Git Workflow, Credentials sections

Web version now builds and runs correctly with npm run web
This commit is contained in:
Sergei 2026-01-12 11:56:24 -08:00
parent 966d8e2aba
commit b14360f4b6
3 changed files with 126 additions and 23 deletions

View File

@ -1,5 +1,97 @@
# WellNuo - Project Architecture
## Quick Start
```bash
cd /Users/sergei/Desktop/WellNuo
git pull origin development # всегда сначала pull!
npm run web # Web-First подход
# Откроется http://localhost:8081
```
---
## Git Workflow (ОБЯЗАТЕЛЬНО!)
**Branch:** `development`
### Перед началом работы:
```bash
git pull origin development
```
### После изменений:
```bash
git add <файлы>
git commit -m "описание"
git push origin development
```
### Правило одной сессии:
**Только ОДИН Claude Code работает с этим проектом одновременно!**
---
## Credentials
### PostgreSQL
```
Host: eluxnetworks.net
Port: 5432
Database: wellnuo_app
User: sergei
Password: W31153Rg31
```
### JWT
```
JWT_SECRET: wellnuo_jwt_secret_key_2024
```
### Stripe (Test)
```
Publishable: pk_test_51P3kdqP0gvUw6M9C7ixPQHqbPcvga4G5kAYx1h6QXQAt1psbrC2rrmOojW0fTeQzaxD1Q9RKS3zZ23MCvjjZpWLi00eCFWRHMk
Secret: sk_test_51P3kdqP0gvUw6M9CFhALbFxOzOUvw3LcWH7UvfGF4NtjZLOgUlzBqKAQJrHjs1loQTPRDUxfOQ5315mjUXICFU8z00PgKEVWGo
```
### Brevo Email (OTP)
```
API Key: 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
```
---
## Текущий статус (12.01.2026)
### Работает:
- [x] Web версия (`npm run web`)
- [x] Login экран
- [x] Backend API
### TODO (Web-First):
- [ ] SecureStore → localStorage (HIGH!)
- [ ] ImagePicker → File Input
- [ ] WebView → iframe
- [ ] Stripe.js для web
### Исправленные баги:
1. `babel.config.js` — jsxRuntime: 'automatic'
2. `AuthContext.tsx` — порядок hooks
---
## Ссылки
| Что | URL |
|-----|-----|
| Production | https://wellnuo.smartlaunchhub.com/app |
| API | https://wellnuo.smartlaunchhub.com/api |
| Сервер | 91.98.205.156 |
| Системный анализ | https://scheme.smartlaunchhub.com/canvas?id=cmkatv8dp0001llnsbk6eviwr |
| Задачи в схеме | https://scheme.smartlaunchhub.com/canvas?schema=cmk8xf11g0005llbvsbt0rd5z |
---
## API-First Architecture
**IMPORTANT: This project uses an API-first approach. NO local storage for business data!**

11
babel.config.js Normal file
View File

@ -0,0 +1,11 @@
module.exports = function (api) {
api.cache(true);
return {
presets: [
['babel-preset-expo', { jsxRuntime: 'automatic' }]
],
plugins: [
'react-native-reanimated/plugin',
]
};
};

View File

@ -40,29 +40,6 @@ export function AuthProvider({ children }: { children: ReactNode }) {
error: null,
});
// Check authentication on mount
useEffect(() => {
console.log('[AuthContext] checkAuth starting...');
checkAuth();
}, [checkAuth]);
// Auto-logout when WellNuo API returns 401 (token expired)
// Token now expires after 365 days, so this should rarely happen
useEffect(() => {
setOnUnauthorizedCallback(() => {
console.log('[AuthContext] Received 401 - session expired, logging out...');
api.logout().then(() => {
setState({
user: null,
isLoading: false,
isInitializing: false,
isAuthenticated: false,
error: { message: 'Session expired. Please login again.' },
});
});
});
}, []);
const checkAuth = useCallback(async () => {
try {
console.log(`[AuthContext] checkAuth: Checking token...`);
@ -107,6 +84,29 @@ export function AuthProvider({ children }: { children: ReactNode }) {
}
}, []);
// Auto-logout when WellNuo API returns 401 (token expired)
// Token now expires after 365 days, so this should rarely happen
useEffect(() => {
setOnUnauthorizedCallback(() => {
console.log('[AuthContext] Received 401 - session expired, logging out...');
api.logout().then(() => {
setState({
user: null,
isLoading: false,
isInitializing: false,
isAuthenticated: false,
error: { message: 'Session expired. Please login again.' },
});
});
});
}, []);
// Check authentication on mount
useEffect(() => {
console.log('[AuthContext] checkAuth starting...');
checkAuth();
}, [checkAuth]);
const checkEmail = useCallback(async (email: string): Promise<CheckEmailResult> => {
setState((prev) => ({ ...prev, isLoading: true, error: null }));