Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,18 @@ yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

# Dependencies
node_modules
.pnpm-store

# Build outputs
dist
dist-ssr
*.local
build
.next
.nuxt
.output

# Editor directories and files
.vscode/*
Expand All @@ -22,3 +30,53 @@ dist-ssr
*.njsproj
*.sln
*.sw?

# Expo / React Native
.expo/
web-build/
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*

# iOS
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
ios/.xcode.env.local

# Android
*.apk
*.aab
*.dex
*.class
*.iml
.gradle
local.properties
android/.idea
android/app/build/
android/captures/

# Temporary files
*.tmp
*.temp
.cache

# Environment files
.env
.env.local
.env.*.local
148 changes: 139 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,146 @@
# React + Vite
# Imposter Radar Tapatío

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
A fun Mexican-themed party game inspired by social deduction games. Find out who the imposter is!

Currently, two official plugins are available:
## Features

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
- **Multiple Game Modes**: Play locally on one screen or use WiFi mode with each player on their own device
- **Bilingual Support**: Full Spanish and English translations
- **Character Selection**: Choose from 12 fun character avatars
- **Category Variety**: 20+ word categories from Guadalajara culture to international topics
- **Dark/Light Theme**: Automatic theme support based on system preferences
- **WhatsApp Integration**: Send role reminders directly via WhatsApp (web version)

## React Compiler
## Project Structure

The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
This is a monorepo powered by pnpm workspaces:

## Expanding the ESLint configuration
```
imposter-tapatio/
├── apps/
│ ├── web/ # React web app (Vite)
│ └── mobile/ # Expo React Native app
├── packages/
│ └── shared/ # Shared code (data, utils)
├── package.json # Root workspace config
└── pnpm-workspace.yaml
```

If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.
## Getting Started

### Prerequisites

- Node.js 18+
- pnpm 8+

### Installation

```bash
# Install pnpm if you haven't
npm install -g pnpm

# Install all dependencies
pnpm install
```

### Development

**Web App:**
```bash
pnpm dev
```
Opens at http://localhost:5173

**Mobile App:**
```bash
pnpm dev:mobile
```
Opens Expo dev server - scan QR code with Expo Go app

### Building

**Web:**
```bash
pnpm build
```

**Mobile (iOS):**
```bash
pnpm build:mobile:ios
```

**Mobile (Android):**
```bash
pnpm build:mobile:android
```

## Mobile App Publishing

### iOS App Store

1. Set up an Apple Developer account ($99/year)
2. Create an app in App Store Connect
3. Update `apps/mobile/app.json`:
- Set your `bundleIdentifier`
- Update version numbers
4. Build with EAS:
```bash
cd apps/mobile
eas build --platform ios --profile production
```
5. Submit:
```bash
eas submit --platform ios
```

### Google Play Store

1. Set up a Google Play Developer account ($25 one-time)
2. Create an app in Google Play Console
3. Update `apps/mobile/app.json`:
- Set your `package` name
- Update `versionCode`
4. Build with EAS:
```bash
cd apps/mobile
eas build --platform android --profile production
```
5. Submit:
```bash
eas submit --platform android
```

## Tech Stack

### Web
- React 19
- Vite 7
- React Router DOM
- PeerJS (P2P connections)

### Mobile
- Expo SDK 52
- Expo Router
- React Native
- React Native Reanimated

### Shared
- Game categories (Spanish & English)
- Character definitions
- Utility functions

## Contributing

1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## License

Made with 💚 in Guadalajara

---

**Note**: The WiFi P2P mode in the mobile app is currently under development. For full multiplayer functionality, use the web version.
53 changes: 53 additions & 0 deletions apps/mobile/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Expo
.expo/
dist/
web-build/

# Native
*.orig.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision

# Metro
.metro-health-check*

# Node
node_modules/

# iOS
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
ios/.xcode.env.local

# Android
*.apk
*.aab
*.dex
*.class
*.iml
.gradle
local.properties
android/.idea
android/app/build/
android/captures/

# Temporary files
*.log
*.tmp
*.temp
49 changes: 49 additions & 0 deletions apps/mobile/app.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
{
"expo": {
"name": "Imposter Radar",
"slug": "imposter-radar",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"scheme": "imposter-radar",
"userInterfaceStyle": "automatic",
"newArchEnabled": true,
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#8b5687"
},
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com.imposter.radar",
"buildNumber": "1"
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#8b5687"
},
"package": "com.imposter.radar",
"versionCode": 1
},
"web": {
"bundler": "metro",
"output": "static",
"favicon": "./assets/favicon.png"
},
"plugins": [
"expo-router"
],
"experiments": {
"typedRoutes": true
},
"extra": {
"router": {
"origin": false
},
"eas": {
"projectId": "your-project-id"
}
}
}
}
50 changes: 50 additions & 0 deletions apps/mobile/app/_layout.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { Stack } from 'expo-router';
import { StatusBar } from 'expo-status-bar';
import { useColorScheme } from '../hooks/useColorScheme';
import { Colors } from '../constants/Colors';

export default function RootLayout() {
const colorScheme = useColorScheme();
const colors = Colors[colorScheme];

return (
<>
<StatusBar style={colorScheme === 'dark' ? 'light' : 'dark'} />
<Stack
screenOptions={{
headerStyle: {
backgroundColor: colors.background,
},
headerTintColor: colors.text,
headerTitleStyle: {
fontWeight: 'bold',
},
contentStyle: {
backgroundColor: colors.background,
},
}}
>
<Stack.Screen
name="index"
options={{
headerShown: false,
}}
/>
<Stack.Screen
name="play"
options={{
title: 'Jugar',
presentation: 'modal',
}}
/>
<Stack.Screen
name="wifi"
options={{
title: 'WiFi Local',
presentation: 'modal',
}}
/>
</Stack>
</>
);
}
Loading