Conversation
There was a problem hiding this comment.
Pull request overview
Adds a new VoIP call React Native example under mobile-react-native/voip-call/, consisting of an Expo client app and a small Deno push + signaling server to demonstrate ringing via native call UI (CallKit/Telecom) and connecting via a Fishjam room.
Changes:
- Introduces an Expo React Native VoIP calling client with login, user list, call screens (audio/video), and call lifecycle hooks.
- Adds a Deno server providing user registration, push routing (APNs/FCM), WebSocket signaling relay, and avatar serving.
- Adds setup/run documentation plus per-project tooling/config (Deno tasks/lockfile, Expo config, ESLint/Prettier, env examples).
Reviewed changes
Copilot reviewed 35 out of 47 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| mobile-react-native/voip-call/server/README.md | Documents server run, credentials setup, signaling, and push payload formats. |
| mobile-react-native/voip-call/server/main.ts | Implements Deno push + signaling server with SQLite registry and avatar hosting. |
| mobile-react-native/voip-call/server/deno.lock | Pins Deno dependencies for the server. |
| mobile-react-native/voip-call/server/deno.json | Defines server task and import map for Deno. |
| mobile-react-native/voip-call/server/.gitignore | Ignores local DB and credential artifacts. |
| mobile-react-native/voip-call/server/.env.example | Placeholder for server environment configuration examples. |
| mobile-react-native/voip-call/README.md | Top-level example instructions (credentials, env, running on devices). |
| mobile-react-native/voip-call/app/tsconfig.json | App TypeScript configuration (strict mode). |
| mobile-react-native/voip-call/app/src/user/UserProvider.tsx | Manages persisted username session and user list retrieval. |
| mobile-react-native/voip-call/app/src/user/UserContext.ts | Defines user context types and hook. |
| mobile-react-native/voip-call/app/src/theme/colors.ts | Adds theme color tokens used across the UI. |
| mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx | Renders user list, refresh, and call initiation UI. |
| mobile-react-native/voip-call/app/src/screens/OutgoingCallView.tsx | Outgoing “ringing” UI while waiting for connection. |
| mobile-react-native/voip-call/app/src/screens/LoginScreen.tsx | Simple username login screen. |
| mobile-react-native/voip-call/app/src/screens/InCallView.tsx | Active call UI (audio/video), including mute/hold/audio route controls. |
| mobile-react-native/voip-call/app/src/screens/CallScreen.tsx | Owns room join/leave lifecycle and connection detection. |
| mobile-react-native/voip-call/app/src/hooks/useRequestPermissions.ts | Requests mic/camera (+ Android notifications) permissions. |
| mobile-react-native/voip-call/app/src/hooks/useRecentsRedial.ts | Handles iOS Recents redial intents via SDK pending intent. |
| mobile-react-native/voip-call/app/src/hooks/usePlaceCall.ts | Initiates calls via server push then starts native call UI. |
| mobile-react-native/voip-call/app/src/hooks/useDeviceRegistration.ts | Registers device VoIP token + platform with the server. |
| mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts | WebSocket signaling for call cancel/reject flows. |
| mobile-react-native/voip-call/app/src/hooks/useCallRoom.ts | Serializes room join/leave and media start/stop during calls. |
| mobile-react-native/voip-call/app/src/components/VideoCallView.tsx | FaceTime-style video layout with PiP local preview. |
| mobile-react-native/voip-call/app/src/components/index.ts | Barrel exports for shared components. |
| mobile-react-native/voip-call/app/src/components/InCallButton.tsx | Reusable in-call control button component. |
| mobile-react-native/voip-call/app/src/components/Avatar.tsx | Avatar rendering with image fallback to initials and speaking highlight. |
| mobile-react-native/voip-call/app/README.md | App-specific run notes and iOS native registration explanation. |
| mobile-react-native/voip-call/app/prettier.config.js | App formatting configuration. |
| mobile-react-native/voip-call/app/package.json | App dependencies and scripts. |
| mobile-react-native/voip-call/app/index.js | Expo entrypoint registering the root component. |
| mobile-react-native/voip-call/app/babel.config.js | Babel configuration for Expo. |
| mobile-react-native/voip-call/app/App.tsx | Composes providers, routes screens by session/call state, wires signaling. |
| mobile-react-native/voip-call/app/app.json | Expo app configuration (bundle/package IDs, plugins, permissions). |
| mobile-react-native/voip-call/app/.gitignore | Ignores native folders, build output, and local Google services file. |
| mobile-react-native/voip-call/app/.eslintrc.js | ESLint configuration for the app. |
| mobile-react-native/voip-call/app/.env.example | Documents required Expo public env vars. |
| mobile-react-native/README.md | Adds the VoIP Call example to the mobile RN examples index. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
| // could start joining the new room while the old one is still being torn down, and | ||
| // we would briefly be in two rooms. Module-level so the leave scheduled by an | ||
| // unmounting `CallScreen` still runs before the next call's join. | ||
| let roomOperations: Promise<void> = Promise.resolve(); |
There was a problem hiding this comment.
nitpick: we could make the sloppy comments a bit more straight to the point
czerwiukk
left a comment
There was a problem hiding this comment.
Readmes are OK and straight to the point. The code quality could be overall improved, there are some components that feel a bit clustered and the backend file would benefit from breaking it down.
| const peerIds = useMemo(() => remotePeers.map((p) => p.id), [remotePeers]); | ||
| const speaking = useVAD({ peerIds }); | ||
|
|
||
| const elapsed = useElapsed(currentCall?.startedAt ?? null); |
There was a problem hiding this comment.
suggestion: There is a lot of going on in this component. Running a hook that refreshes the state each second causes some overhead. We could move it to a small child component that's responsible solely for counting time.
There was a problem hiding this comment.
yes, the code isn't perfectly optimized cuz premature otpimization is the root of all evil and it's only an example but I think for my educational purposes it's better to optimize it either way 🇧🇫
No description provided.