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 WebSocketsWebSocketClient.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, profile
  • bet.js — fights, live bets, outcomes
  • restaurant.js — venues, menus, hours
  • reservation.ts — open reservations, book, redeem
  • sports.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

Longer design write-ups (not maintained as primary runbooks) live under docs/contributions/, for example: