# EMI Expo App Agent Notes This file summarizes the current `/Users/adolforeyna/Projects/EMI/expoApp` codebase so future work can start with context. ## What This App Is - Expo React Native app for EMI Fellowship social network (iOS + Android + limited web support). - Main features: auth, feed/posts/comments, profile pages, groups, courses, invite flow, notifications, media playback/upload. - Backend is expected to be the EMI API and cookie-authenticated. ## Run + Build Basics - Install: `npm install` - Start dev server: `npm start` - Device targets: `npm run ios`, `npm run android` - Expo config: `/Users/adolforeyna/Projects/EMI/expoApp/app.json` - EAS config: `/Users/adolforeyna/Projects/EMI/expoApp/eas.json` ## High-Level Architecture - App entry + navigation: `/Users/adolforeyna/Projects/EMI/expoApp/App.js` - API abstraction layer: `/Users/adolforeyna/Projects/EMI/expoApp/API.js` - Global state (Valtio proxy): `/Users/adolforeyna/Projects/EMI/expoApp/contexts/GlobalState.js` - Screen modules: `/Users/adolforeyna/Projects/EMI/expoApp/Views/*` - Reusable UI pieces: `/Users/adolforeyna/Projects/EMI/expoApp/components/*` ### Navigation Shape - Root stack (`createNativeStackNavigator`) contains: - `MainNavigation` (bottom tabs) - Details/screens like `Profile`, `SinglePost`, `Search`, `Menu`, `Notifications`, `ProfileSettings`, etc. - Bottom tabs (`createBottomTabNavigator`) inside `MainNavigation`: - `Feed`, `Groups`, `NewPost`, `Courses`, `MyProfile` - Custom header in `App.js` provides menu/search/notifications shortcuts globally. ## State + Data Flow - Server source of truth via `API.js`. - `GlobalState.me` stores active viewer profile and is refreshed: - on Feed load - periodically in `MainNavigation` (30s interval) - on profile switch in Menu - Local caching with `AsyncStorage`: - feed cache - profile post cache - courses cache - profile/name cache in card/name components - `API.js` has defensive networking: - fallback responses on non-OK and invalid JSON - request error cooldown logging - profile failure cooldown cache to avoid repeated failing calls ## API Layer Notes - Base URL default in `/Users/adolforeyna/Projects/EMI/expoApp/API.js`: - `https://emiapi.reynafamily.com` - can be overridden with `global.baseUrl` - Uses `fetch(..., { credentials: 'include' })`, so backend cookie/CORS config must be correct. - Covers endpoints for: - auth/session - posts/comments/reactions/bookmarks - profiles/follow/change profile - groups/courses - invites - payments - notifications token registration ## Feature Map (Key Files) - Login/register UI: `/Users/adolforeyna/Projects/EMI/expoApp/Views/Login.js`, `/Users/adolforeyna/Projects/EMI/expoApp/components/Login.js`, `/Users/adolforeyna/Projects/EMI/expoApp/components/Register.js` - Feed: `/Users/adolforeyna/Projects/EMI/expoApp/Views/Feed.js` - Post rendering/interactions: `/Users/adolforeyna/Projects/EMI/expoApp/components/Post.js` - Media parser/player/slideshow handoff: `/Users/adolforeyna/Projects/EMI/expoApp/components/Media.js` - Profile page + tagged profile posts: `/Users/adolforeyna/Projects/EMI/expoApp/Views/Profile.js` - Create post + image uploads: `/Users/adolforeyna/Projects/EMI/expoApp/Views/NewPost.js` - Groups + courses browsing: `/Users/adolforeyna/Projects/EMI/expoApp/Views/Groups.js`, `/Users/adolforeyna/Projects/EMI/expoApp/Views/Courses.js` - Profile settings and invite flow: `/Users/adolforeyna/Projects/EMI/expoApp/Views/ProfileSettings.js`, `/Users/adolforeyna/Projects/EMI/expoApp/Views/Invite.js` ## Integrations In Use - Expo Notifications (`expo-notifications`) including push token registration. - Expo Updates (`expo-updates`) check/fetch/reload in Feed (disabled in `__DEV__`). - PostHog analytics: - setup in `/Users/adolforeyna/Projects/EMI/expoApp/PostHog.js` - provider in `/Users/adolforeyna/Projects/EMI/expoApp/App.js` - Media upload currently points to `https://social.emmint.com/upload.php` in multiple places. ## Known Risks / Footguns (Current Code) - Missing imports likely to crash at runtime: - `AsyncStorage` used but not imported in `/Users/adolforeyna/Projects/EMI/expoApp/Views/Courses.js` - `Platform` used but not imported in `/Users/adolforeyna/Projects/EMI/expoApp/Views/ProfileSettings.js` - `Platform` used but not imported in `/Users/adolforeyna/Projects/EMI/expoApp/components/NewPost.js` - A few typos are intentionally present in route/prop names and work only because both sides share the typo: - `intialContent`, `ceatedAt`, `skiptOnPress`, `skiptVideo` - `Store.js` appears unused and stale (`easy-peasy` store not wired into app). - `Views/NewGroup.js` is mostly scaffolded (UI shell, no creation flow yet). ## Debugging Checklist (Most Common Production Issues) 1. Confirm API base URL in `/Users/adolforeyna/Projects/EMI/expoApp/API.js` (or `global.baseUrl`) targets intended backend. 2. Validate backend session cookie/CORS behavior for current environment. 3. If login/feed fails, verify `API.isLoggedIn()` response shape and cookie persistence. 4. For phone testing against local backend, never use `localhost`; use machine LAN IP. 5. If feed/profile seems stale, clear AsyncStorage caches and re-open app. ## Recommended Working Style For This Repo - Prefer small defensive changes over broad refactors. - Preserve API response guards and null-safe rendering patterns. - When touching profile/post rendering, test both cached and fresh-network paths. - Keep changes isolated by feature screen/component; this code relies on many implicit shared assumptions.