diff --git a/apps/mobile/android/app/build.gradle b/apps/mobile/android/app/build.gradle index ca45a38..23297f9 100644 --- a/apps/mobile/android/app/build.gradle +++ b/apps/mobile/android/app/build.gradle @@ -93,7 +93,7 @@ android { applicationId 'com.sauci.app' minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 12 + versionCode 17 versionName "1.0.0" } signingConfigs { diff --git a/apps/mobile/android/app/google-services.json b/apps/mobile/android/app/google-services.json index d2755f7..9bd1e03 100644 --- a/apps/mobile/android/app/google-services.json +++ b/apps/mobile/android/app/google-services.json @@ -52,4 +52,4 @@ } ], "configuration_version": "1" -} +} \ No newline at end of file diff --git a/apps/mobile/app.json b/apps/mobile/app.json index 9944b04..1c14d1a 100644 --- a/apps/mobile/app.json +++ b/apps/mobile/app.json @@ -16,7 +16,7 @@ "ios": { "supportsTablet": false, "bundleIdentifier": "com.sauci.app", - "buildNumber": "20", + "buildNumber": "24", "usesAppleSignIn": true, "infoPlist": { "UIBackgroundModes": [ @@ -176,7 +176,7 @@ "backgroundColor": "#1a1a2e" }, "package": "com.sauci.app", - "versionCode": 17, + "versionCode": 20, "googleServicesFile": "./google-services.json", "permissions": [ "RECEIVE_BOOT_COMPLETED", diff --git a/apps/mobile/app/(app)/_layout.tsx b/apps/mobile/app/(app)/_layout.tsx index 6bbbea3..07937a0 100755 --- a/apps/mobile/app/(app)/_layout.tsx +++ b/apps/mobile/app/(app)/_layout.tsx @@ -337,9 +337,9 @@ export default function AppLayout() { } }, [user?.id, fetchUnreadCount]); - // Initialize RevenueCat for subscription management + // Initialize RevenueCat for subscription management (iOS and Android only) useEffect(() => { - if (user?.id && Platform.OS === "ios") { + if (user?.id && Platform.OS !== "web") { initializeRevenueCat(user.id); } }, [user?.id, initializeRevenueCat]); diff --git a/apps/mobile/eas.json b/apps/mobile/eas.json index 1f6031d..68bf88e 100644 --- a/apps/mobile/eas.json +++ b/apps/mobile/eas.json @@ -1,7 +1,7 @@ { "cli": { "version": ">= 16.28.0", - "appVersionSource": "remote" + "appVersionSource": "local" }, "build": { "development": { diff --git a/apps/mobile/ios/Sauci.xcodeproj/project.pbxproj b/apps/mobile/ios/Sauci.xcodeproj/project.pbxproj index e449118..ec427f6 100644 --- a/apps/mobile/ios/Sauci.xcodeproj/project.pbxproj +++ b/apps/mobile/ios/Sauci.xcodeproj/project.pbxproj @@ -410,11 +410,11 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = com.sauci.app; - PRODUCT_NAME = Sauci; + PRODUCT_NAME = "Sauci"; SWIFT_OBJC_BRIDGING_HEADER = "Sauci/Sauci-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1"; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -442,10 +442,10 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.sauci.app; - PRODUCT_NAME = Sauci; + PRODUCT_NAME = "Sauci"; SWIFT_OBJC_BRIDGING_HEADER = "Sauci/Sauci-Bridging-Header.h"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1"; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; diff --git a/apps/mobile/ios/Sauci/Info.plist b/apps/mobile/ios/Sauci/Info.plist index 89beec2..7e1787c 100644 --- a/apps/mobile/ios/Sauci/Info.plist +++ b/apps/mobile/ios/Sauci/Info.plist @@ -47,7 +47,7 @@ CFBundleVersion - 5 + 20 LSMinimumSystemVersion 12.0 LSRequiresIPhoneOS @@ -60,15 +60,15 @@ NSCameraUsageDescription - Allow $(PRODUCT_NAME) to access your camera + Sauci uses your camera to take photos and videos that you can share privately with your partner in encrypted chat messages. NSFaceIDUsageDescription Sauci uses Face ID to unlock the app and keep your conversations private. NSMicrophoneUsageDescription - Allow $(PRODUCT_NAME) to access your microphone + Sauci uses your microphone to record audio when you capture videos to share privately with your partner. NSPhotoLibraryAddUsageDescription - Allow $(PRODUCT_NAME) to save photos + Sauci saves photos and videos from your partner's messages to your photo library when you tap the save button. NSPhotoLibraryUsageDescription - Allow $(PRODUCT_NAME) to access your photos + Sauci uses your photo library so you can select photos and videos to share privately with your partner in encrypted chat messages. NSUserActivityTypes $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route diff --git a/apps/mobile/ios/sentry.properties b/apps/mobile/ios/sentry.properties index 2a03adb..68a02c4 100644 --- a/apps/mobile/ios/sentry.properties +++ b/apps/mobile/ios/sentry.properties @@ -1,4 +1,4 @@ defaults.url=https://sentry.io/ defaults.org=molten-prints defaults.project=sauci -# auth.token is provided via SENTRY_AUTH_TOKEN environment variable \ No newline at end of file +# Using SENTRY_AUTH_TOKEN environment variable \ No newline at end of file diff --git a/apps/mobile/package.json b/apps/mobile/package.json index f9ad011..f12b99c 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -13,8 +13,8 @@ "test": "jest", "test:watch": "jest --watch", "test:ci": "jest --runInBand --ci", - "release:ios": "dotenv -e .env -- eas build --platform ios --profile production --local", - "release:android": "dotenv -e .env -- eas build --platform android --profile production --local" + "release:ios": "dotenv -e .env -- npx expo prebuild --platform ios && dotenv -e .env -- eas build --platform ios --profile production --local", + "release:android": "dotenv -e .env -- npx expo prebuild --platform android && dotenv -e .env -- eas build --platform android --profile production --local" }, "dependencies": { "@expo/ngrok": "^4.1.0", diff --git a/apps/supabase/migrations/20260107000001_add_message_reports_profiles_fk.sql b/apps/supabase/migrations/20260107000001_add_message_reports_profiles_fk.sql new file mode 100644 index 0000000..8ded8c5 --- /dev/null +++ b/apps/supabase/migrations/20260107000001_add_message_reports_profiles_fk.sql @@ -0,0 +1,5 @@ +-- Add foreign key from message_reports.reporter_id to profiles.id +-- This allows Supabase to join with profiles table in admin queries +ALTER TABLE message_reports +ADD CONSTRAINT message_reports_reporter_profile_fk +FOREIGN KEY (reporter_id) REFERENCES profiles(id) ON DELETE CASCADE;