Overview
Where the app lives
client/— React + Ionic + Capacitor (web, iOS, Android)- Entry:
client/src/index.js(Sentry, Customer.io, analytics bootstrap) - Router:
client/src/App.js - Logged-in shell (tabs):
client/src/components/appTabs/AppTabs.js
Route map
| Path | Component / area | Auth |
|---|---|---|
/ | Redirect → /app/home or /signin | — |
/signin, /signup, /reset-password | components/authentication/* | Public |
/open | utils/Open.js (web deep-link fallback) | Public |
/app/home | components/home/Home | Logged in |
/app/sports | components/sports/Sports | Logged in |
/app/restaurant, /app/events | components/restaurant/Restaurant (same component) | Logged in |
/app/profile | components/profile/Profile | Logged in |
/app/friendprofile/:userId | components/friendProfile/FriendProfile | Logged in |
/app/friendprofile/:userId/friendslist | components/friendProfile/FriendsListPage | Logged in |
/app/notificationCenter | components/home/homepageNotifications/HomepageNotification | Logged in |
/chat/:channelId | components/chat/Chat | Varies |
/partner/* | components/partner/PartnerApp | Partner gating |
See Routing & auth for AuthContext and PartnerRoute.
Feature map
Use this table to jump from a product area to folders and API wrappers. Paths are under client/src/ unless noted.
| Feature | Primary UI | API / data layer | Notes |
|---|---|---|---|
| Auth (Cognito) | components/authentication/ (SignIn, SignUp, ResetPassword, AuthContext) | global/request/auth.js, user.js | Tokens in localStorage (tokens) |
| Home feed | components/home/ (Home, PromoFeed, Trending, carousels) | global/request/carousel.js, restaurant.js, bet.js (getLiveBets) | Tabs inside home; matchmaking feed largely commented out |
| Sports & games | components/sports/ (Sports, GamesList, home/sports/* league views) | global/request/sports.js, bet.js | Picking a game opens Start Fight flow |
| Food fights (bets) | components/fight/ (StartFightModal, StartFightContext, takerFightProcess/, summary/, fightCardV2.1.0/) | global/request/bet.js | Challenger + taker modals; payment in fight/summary/ (Stripe) — Payments |
| Venue / restaurant | components/restaurant/ (Restaurant, RestaurantModal, tiles) | global/request/restaurant.js, useRestaurants.js, useHours.js | Venue selection drives fights; check-in events → Customer.io |
| Reservations | components/reservations/ (ReservationsModal opened from Restaurant.js; wallet UI in profile/) | global/request/reservation.ts, useReservationVenues.js | Open slots per venue; redeem flow on profile wallet |
| Profile & wallet | components/profile/ (Profile, fight cards, reservation redemption) | global/useProfile.js, bet.js, reservation.ts | WebSocket for live fight updates (see below) |
| Rewards / promos | components/rewards/ (RedeemModal, etc.), fightCardV2.1.0/PromoCoupon* | global/request/prizeOffers.js, usePromoCounts.js | Redeem from tab bar via AppTabs ref |
| Friends & social | components/friendProfile/ | global/useUsers.js, user.js | Friend profile routes outside tab outlet |
| Chat | components/chat/ (Chat, RecentChats, UnreadCountPopup) | (chat backend / channels — see chat components) | Route /chat/:channelId; unread popup at app root |
| Notifications (push) | components/notifications/ (PushNotifications.js, prompts) | global/request/user.js (addDevice) | Push notifications |
| Partner dashboard | components/partner/ (PartnerApp, pages/*, PartnerRoute) | partner/pages/*/*ApiService.js → /partner_dashboard/* | Partner Dashboard · API |
| Lucra (bar games) | components/sports/GamesList.js, utils/lucraUtils.js | lucra-plugin (local package) | iOS native only when enabled |
| Deep links | utils/BranchDeepLinkHandler.js, DeepLinkHandler.js, Open.js | Branch server_code + in-app handlers | Deep links |
| Analytics / messaging | customerio-init.js, utils/customerio.js, utils/analytics.js | Customer.io CDP; some calls via user API | Customer.io |
| Error monitoring | index.js, utils/sentry*.js | Sentry SDK | Sentry |
| Live fight updates (WS) | components/websocket/WebSocketClient.js, profile/Profile.js | API Gateway WS (REACT_APP_WS_URL) | WebSockets |
| Settings | components/settingsModal/SettingsModal.js | user.js, auth sign-out | Logout, delete account, device toggle |
| User feedback | components/userFeedback/ | — | Contact / review forms (some flows commented in App.js) |
| Version gate | components/versionPopup/VersionPopup.js | — | Shown from App.js when version check fails |
Partner dashboard routes (/partner)
| Path | Page |
|---|---|
/partner | Redirect → /partner/analytics |
/partner/analytics | pages/transactions/AnalyticsPage |
/partner/contests | pages/transactions/ContestsPage |
/partner/menus | pages/menu/MenusPage |
/partner/create-promos, /partner/manage-promos | Offers pages |
/partner/report-bug | pages/reportBug/ReportBugPage |
FinancePage, DashboardPage, and ProfilePage exist under partner/pages/ but are not wired in PartnerApp.js today—check those folders if you are looking for older or in-progress partner UI.
Cross-cutting code
| Concern | Location |
|---|---|
| HTTP client (timeouts, retry, Bearer) | global/request/request.js |
| App-wide restaurant / venue context | global/AppContext.js |
| Matchmaking state | global/MatchmakingContext.js |
| Product tour (onboarding highlights) | global/ProductTourContext.js |
| Page-level modals & fight UI refs | contexts/AppContexts.js (PageContext) |
| In-app notification prompts | contexts/NotificationContext.js |
| Live bet WebSocket | WebSockets — WebSocketClient.js + Profile.js |
| Env / API base URLs | utils/env.js (prod vs dev hosts on request modules) |
Shared request modules in global/request/:
auth.js,user.js— identity, devices, profilebet.js— fights, live bets, outcomesrestaurant.js— venues, menus, hoursreservation.ts— open reservations, book, redeemsports.js,carousel.js,prizeOffers.js,teamsUIConfig.js
Details: API calls.
Native & platform
| Topic | Doc |
|---|---|
| Capacitor sync, Android release, iOS Fastlane | Mobile |
| Stripe / Apple Pay / Google Pay | Payments |
Related contribution notes
Longer design write-ups (not maintained as primary runbooks) live under docs/contributions/, for example:
- WebSockets (operational); App WebSockets (contributing) (original design)
- Impression analytics
- Partner Dashboard (contribution)