Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
53538a7
Add Supabase setup design doc for family testing phase
gavyncaldwell Mar 1, 2026
cd00b6d
Add Supabase setup implementation plan
gavyncaldwell Mar 1, 2026
32ab62d
Add Supabase JS SDK, AsyncStorage, and react-native-config
gavyncaldwell Mar 1, 2026
246d829
Add .env.example for Supabase config
gavyncaldwell Mar 1, 2026
f1a5247
Replace Supabase stub client with real SDK
gavyncaldwell Mar 1, 2026
bc18a8d
Update auth services to use real Supabase SDK
gavyncaldwell Mar 1, 2026
a9c1e3f
Update UserService and ContactsService for real Supabase SDK
gavyncaldwell Mar 1, 2026
a5e0bf2
Add initial database schema migration for users, contacts, push_tokens
gavyncaldwell Mar 1, 2026
e33bda6
Update authStore to use real Supabase session management
gavyncaldwell Mar 1, 2026
63fcdfc
Wire AuthProvider, ContactsProvider, and auth-gated navigation
gavyncaldwell Mar 1, 2026
ab8e126
Wire login and signup screens to auth service
gavyncaldwell Mar 1, 2026
b54ece3
Wire contacts, favorites, and search screens to real Supabase data
gavyncaldwell Mar 1, 2026
8d0cf77
Add real JWT verification to signaling server using jose
gavyncaldwell Mar 1, 2026
c5c48ad
Fix null checks in authStore for signUp/signIn dispatch
gavyncaldwell Mar 1, 2026
9f43d5a
Fix Supabase security advisories: search_path and pg_trgm schema
gavyncaldwell Mar 1, 2026
a327739
Add react-native-url-polyfill for Supabase Realtime compatibility
gavyncaldwell Mar 1, 2026
558b0dc
Add call infrastructure design doc for family testing phase
gavyncaldwell Mar 1, 2026
a68986a
Add call infrastructure implementation plan
gavyncaldwell Mar 1, 2026
c809de7
Add native call dependencies (WebRTC, CallKeep, InCallManager, permis…
gavyncaldwell Mar 1, 2026
4831f96
Add camera/mic permissions and VoIP background modes to Info.plist
gavyncaldwell Mar 1, 2026
1b5c5f1
Add SIGNALING_URL to environment config
gavyncaldwell Mar 1, 2026
6c452eb
Add CallProvider context for signaling and call management
gavyncaldwell Mar 1, 2026
661a4cb
Wire CallProvider into app component tree
gavyncaldwell Mar 1, 2026
e185090
Wire call screens to real CallManager actions
gavyncaldwell Mar 1, 2026
862a197
Fix native service type errors to match installed package APIs
gavyncaldwell Mar 1, 2026
dc22171
Wire real data into RecentsScreen and SettingsScreen, fix iOS build c…
gavyncaldwell Mar 1, 2026
30ef2f6
Fix CI: build shared package before typechecking signaling
gavyncaldwell Mar 1, 2026
78ba98e
Fix signaling lint: add ESLint config and fix src pattern
gavyncaldwell Mar 1, 2026
f4f570c
Fix CI: Android monorepo paths, iOS bundler compat, and test auth mock
gavyncaldwell Mar 1, 2026
677028c
Fix test mock to use static import instead of top-level await
gavyncaldwell Mar 1, 2026
53b0e50
Fix iOS and Android CI builds for monorepo
gavyncaldwell Mar 1, 2026
503ab1c
Fix Android build: add AsyncStorage local Maven repo
gavyncaldwell Mar 1, 2026
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
9 changes: 6 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ jobs:

- run: npm ci

- name: Typecheck shared package
run: npm run typecheck --workspace=@farscry/shared
- name: Build shared package
run: npm run build --workspace=@farscry/shared

- name: Typecheck signaling server
run: npm run typecheck --workspace=@farscry/signaling
Expand All @@ -41,6 +41,9 @@ jobs:

- run: npm ci

- name: Build shared package
run: npm run build --workspace=@farscry/shared

- name: Run server tests
run: npm run test --workspace=@farscry/signaling

Expand All @@ -59,7 +62,7 @@ jobs:

- uses: ruby/setup-ruby@v1
with:
ruby-version: 3.2
ruby-version: '3.1'
bundler-cache: true
working-directory: apps/mobile

Expand Down
3 changes: 3 additions & 0 deletions apps/mobile/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_ANON_KEY=your-anon-key
SIGNALING_URL=ws://localhost:8080
21 changes: 15 additions & 6 deletions apps/mobile/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import {StatusBar} from 'react-native';
import {SafeAreaProvider} from 'react-native-safe-area-context';
import {NavigationContainer} from '@react-navigation/native';
import {GestureHandlerRootView} from 'react-native-gesture-handler';
import {AuthProvider} from './src/stores/authStore';
import {ContactsProvider} from './src/stores/contactsStore';
import {CallProvider} from './src/stores/callStore';
import {RootNavigator} from './src/navigation/RootNavigator';
import {colors} from './src/theme/colors';

Expand All @@ -27,12 +30,18 @@ const navTheme = {
export default function App() {
return (
<GestureHandlerRootView style={{flex: 1}}>
<SafeAreaProvider>
<StatusBar barStyle="light-content" backgroundColor={colors.background} />
<NavigationContainer theme={navTheme}>
<RootNavigator />
</NavigationContainer>
</SafeAreaProvider>
<AuthProvider>
<ContactsProvider>
<SafeAreaProvider>
<StatusBar barStyle="light-content" backgroundColor={colors.background} />
<NavigationContainer theme={navTheme}>
<CallProvider>
<RootNavigator />
</CallProvider>
</NavigationContainer>
</SafeAreaProvider>
</ContactsProvider>
</AuthProvider>
</GestureHandlerRootView>
);
}
108 changes: 108 additions & 0 deletions apps/mobile/Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.9)
activesupport (6.1.7.10)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
zeitwerk (~> 2.3)
addressable (2.8.9)
public_suffix (>= 2.0.2, < 8.0)
algoliasearch (1.27.5)
httpclient (~> 2.8, >= 2.8.3)
json (>= 1.5.1)
atomos (0.1.3)
benchmark (0.5.0)
bigdecimal (4.0.1)
claide (1.1.0)
cocoapods (1.15.2)
addressable (~> 2.8)
claide (>= 1.0.2, < 2.0)
cocoapods-core (= 1.15.2)
cocoapods-deintegrate (>= 1.0.3, < 2.0)
cocoapods-downloader (>= 2.1, < 3.0)
cocoapods-plugins (>= 1.0.0, < 2.0)
cocoapods-search (>= 1.0.0, < 2.0)
cocoapods-trunk (>= 1.6.0, < 2.0)
cocoapods-try (>= 1.1.0, < 2.0)
colored2 (~> 3.1)
escape (~> 0.0.4)
fourflusher (>= 2.3.0, < 3.0)
gh_inspector (~> 1.0)
molinillo (~> 0.8.0)
nap (~> 1.0)
ruby-macho (>= 2.3.0, < 3.0)
xcodeproj (>= 1.23.0, < 2.0)
cocoapods-core (1.15.2)
activesupport (>= 5.0, < 8)
addressable (~> 2.8)
algoliasearch (~> 1.0)
concurrent-ruby (~> 1.1)
fuzzy_match (~> 2.0.4)
nap (~> 1.0)
netrc (~> 0.11)
public_suffix (~> 4.0)
typhoeus (~> 1.0)
cocoapods-deintegrate (1.0.5)
cocoapods-downloader (2.1)
cocoapods-plugins (1.0.0)
nap
cocoapods-search (1.0.1)
cocoapods-trunk (1.6.0)
nap (>= 0.8, < 2.0)
netrc (~> 0.11)
cocoapods-try (1.2.0)
colored2 (3.1.2)
concurrent-ruby (1.3.3)
escape (0.0.4)
ethon (0.15.0)
ffi (>= 1.15.0)
ffi (1.17.3)
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3)
httpclient (2.9.0)
mutex_m
i18n (1.14.8)
concurrent-ruby (~> 1.0)
json (2.7.6)
logger (1.7.0)
minitest (5.25.4)
molinillo (0.8.0)
mutex_m (0.3.0)
nanaimo (0.3.0)
nap (1.1.0)
netrc (0.11.0)
public_suffix (4.0.7)
rexml (3.4.4)
ruby-macho (2.5.1)
typhoeus (1.5.0)
ethon (>= 0.9.0, < 0.16.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
xcodeproj (1.25.1)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
nanaimo (~> 0.3.0)
rexml (>= 3.3.6, < 4.0)
zeitwerk (2.6.18)

PLATFORMS
ruby

DEPENDENCIES
activesupport (>= 6.1.7.5, != 7.1.0)
benchmark
bigdecimal
cocoapods (>= 1.13, != 1.15.1, != 1.15.0)
concurrent-ruby (< 1.3.4)
logger
mutex_m
xcodeproj (< 1.26.0)

BUNDLED WITH
2.5.6
14 changes: 5 additions & 9 deletions apps/mobile/android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,11 @@ apply plugin: "com.facebook.react"
* By default you don't need to apply any configuration, just uncomment the lines you need.
*/
react {
/* Folders */
// The root of your project, i.e. where "package.json" lives. Default is '../..'
// root = file("../../")
// The folder where the react-native NPM package is. Default is ../../node_modules/react-native
// reactNativeDir = file("../../node_modules/react-native")
// The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen
// codegenDir = file("../../node_modules/@react-native/codegen")
// The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js
// cliFile = file("../../node_modules/react-native/cli.js")
/* Folders — overridden for monorepo (npm workspaces hoists to root node_modules) */
root = file("../../../../")
reactNativeDir = file("../../../../node_modules/react-native")
codegenDir = file("../../../../node_modules/@react-native/codegen")
cliFile = file("../../../../node_modules/react-native/cli.js")

/* Variants */
// The list of variants to that are debuggable. For those we're going to
Expand Down
11 changes: 11 additions & 0 deletions apps/mobile/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,15 @@ buildscript {
}
}

allprojects {
repositories {
google()
mavenCentral()
// AsyncStorage v3 ships a local Maven repo for shared_storage
maven {
url("$rootDir/../../../node_modules/@react-native-async-storage/async-storage/android/local_repo")
}
}
}

apply plugin: "com.facebook.react.rootproject"
4 changes: 2 additions & 2 deletions apps/mobile/android/settings.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") }
pluginManagement { includeBuild("../../../node_modules/@react-native/gradle-plugin") }
plugins { id("com.facebook.react.settings") }
extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() }
rootProject.name = 'com.farscry.app'
include ':app'
includeBuild('../node_modules/@react-native/gradle-plugin')
includeBuild('../../../node_modules/@react-native/gradle-plugin')
23 changes: 21 additions & 2 deletions apps/mobile/ios/Farscry.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; };
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
D70DD04924B96B78169E29B7 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
Expand Down Expand Up @@ -159,6 +160,7 @@
files = (
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
D70DD04924B96B78169E29B7 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -271,7 +273,7 @@
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.farscry.app";
PRODUCT_BUNDLE_IDENTIFIER = com.farscry.app;
PRODUCT_NAME = Farscry;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
Expand Down Expand Up @@ -300,7 +302,7 @@
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.farscry.app";
PRODUCT_BUNDLE_IDENTIFIER = com.farscry.app;
PRODUCT_NAME = Farscry;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SWIFT_VERSION = 5.0;
Expand Down Expand Up @@ -370,15 +372,24 @@
);
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"$(inherited)",
"-DRCT_REMOVE_LEGACY_ARCH=1",
);
OTHER_CPLUSPLUSFLAGS = (
"$(OTHER_CFLAGS)",
"-DFOLLY_NO_CONFIG",
"-DFOLLY_MOBILE=1",
"-DFOLLY_USE_LIBCPP=1",
"-DFOLLY_CFG_NO_COROUTINES=1",
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
"-DRCT_REMOVE_LEGACY_ARCH=1",
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
SWIFT_ENABLE_EXPLICIT_MODULES = NO;
USE_HERMES = true;
};
name = Debug;
};
Expand Down Expand Up @@ -435,15 +446,23 @@
"\"$(inherited)\"",
);
MTL_ENABLE_DEBUG_INFO = NO;
OTHER_CFLAGS = (
"$(inherited)",
"-DRCT_REMOVE_LEGACY_ARCH=1",
);
OTHER_CPLUSPLUSFLAGS = (
"$(OTHER_CFLAGS)",
"-DFOLLY_NO_CONFIG",
"-DFOLLY_MOBILE=1",
"-DFOLLY_USE_LIBCPP=1",
"-DFOLLY_CFG_NO_COROUTINES=1",
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
"-DRCT_REMOVE_LEGACY_ARCH=1",
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ENABLE_EXPLICIT_MODULES = NO;
USE_HERMES = true;
VALIDATE_PRODUCT = YES;
};
name = Release;
Expand Down
10 changes: 10 additions & 0 deletions apps/mobile/ios/Farscry.xcworkspace/contents.xcworkspacedata

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 11 additions & 3 deletions apps/mobile/ios/Farscry/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,22 @@
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<!-- Do not change NSAllowsArbitraryLoads to true, or you will risk app rejection! -->
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<key>NSMicrophoneUsageDescription</key>
<string>Farscry needs microphone access for voice and video calls</string>
<key>NSCameraUsageDescription</key>
<string>Farscry needs camera access for video calls</string>
<key>UIBackgroundModes</key>
<array>
<string>voip</string>
<string>audio</string>
</array>
<key>RCTNewArchEnabled</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
Expand Down
Loading