From 7eb9cfda2b15c8490ab651b2e29e748a8044c3cd Mon Sep 17 00:00:00 2001 From: Eli Mallon Date: Thu, 11 Jul 2024 21:34:20 +0000 Subject: [PATCH] app: firebase push notifications See merge request aquareum-tv/aquareum!19 --- Makefile | 3 +- go.mod | 7 + go.sum | 8 + hack/push.mjs | 25 + js/app/.env.development | 2 + js/app/.env.production | 2 + js/app/.gitignore | 1 + js/app/GoogleService-Info.plist | 30 + js/app/android/app/build.gradle | 2 + js/app/android/app/google-services.json | 29 + .../android/app/src/main/AndroidManifest.xml | 4 +- .../app/src/main/res/values/styles.xml | 2 +- js/app/android/build.gradle | 1 + js/app/android/gradle.properties | 2 + js/app/app.json | 23 +- js/app/app/_layout.tsx | 5 + js/app/app/background.tsx | 7 + js/app/app/layout.tsx | 0 js/app/app/platform/index.tsx | 1 + js/app/app/platform/platform.android.tsx | 1 + js/app/app/platform/platform.ios.tsx | 1 + js/app/app/platform/platform.mobile.tsx | 91 ++ js/app/app/platform/platform.tsx | 1 + js/app/app/platform/platform.web.tsx | 3 + js/app/assets/sound/bubble.wav | Bin 0 -> 117802 bytes js/app/google-services.json | 29 + js/app/ios/Aquareum.xcodeproj/project.pbxproj | 377 +++--- js/app/ios/Aquareum/AppDelegate.mm | 4 + js/app/ios/Aquareum/Aquareum.entitlements | 5 +- js/app/ios/Aquareum/GoogleService-Info.plist | 30 + js/app/ios/Aquareum/Info.plist | 203 ++- js/app/ios/Aquareum/PrivacyInfo.xcprivacy | 14 +- js/app/ios/Podfile.lock | 186 ++- js/app/ios/Podfile.properties.json | 6 +- js/app/package.json | 7 +- package.json | 7 +- pkg/api/api.go | 97 +- pkg/cmd/aquareum.go | 1 + pkg/config/config.go | 1 + pkg/model/model.go | 10 + yarn.lock | 1180 ++++++++++++++++- 41 files changed, 2048 insertions(+), 360 deletions(-) create mode 100644 hack/push.mjs create mode 100644 js/app/.env.development create mode 100644 js/app/.env.production create mode 100644 js/app/GoogleService-Info.plist create mode 100644 js/app/android/app/google-services.json create mode 100644 js/app/app/background.tsx create mode 100644 js/app/app/layout.tsx create mode 100644 js/app/app/platform/index.tsx create mode 100644 js/app/app/platform/platform.android.tsx create mode 100644 js/app/app/platform/platform.ios.tsx create mode 100644 js/app/app/platform/platform.mobile.tsx create mode 100644 js/app/app/platform/platform.tsx create mode 100644 js/app/app/platform/platform.web.tsx create mode 100644 js/app/assets/sound/bubble.wav create mode 100644 js/app/google-services.json create mode 100644 js/app/ios/Aquareum/GoogleService-Info.plist diff --git a/Makefile b/Makefile index 6a6b8a2a..440e0834 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,8 @@ ci: version install check app test node-all-platforms ci-upload-node android ci- .PHONY: android android: app - cd ./js/app/android \ + export NODE_ENV=production \ + && cd ./js/app/android \ && ./gradlew build \ && cd - \ && mv ./js/app/android/app/build/outputs/apk/release/app-release.apk ./bin/aquareum-$(VERSION)-android-release.apk \ diff --git a/go.mod b/go.mod index 66a1a9f6..eb4c48d2 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/lmittmann/tint v1.0.4 github.com/orandin/slog-gorm v1.3.2 github.com/peterbourgon/ff/v3 v3.3.1 + github.com/samber/slog-http v1.4.0 github.com/stretchr/testify v1.9.0 golang.org/x/sync v0.6.0 gorm.io/driver/sqlite v1.5.5 @@ -27,3 +28,9 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + +require ( + github.com/google/uuid v1.6.0 // indirect + go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.19.0 // indirect +) diff --git a/go.sum b/go.sum index cb281d03..d40e0d33 100644 --- a/go.sum +++ b/go.sum @@ -7,6 +7,8 @@ github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= @@ -23,10 +25,16 @@ github.com/peterbourgon/ff/v3 v3.3.1 h1:XSWvXxeNdgeppLNGGJEAOiXRdX2YMF/LuZfdnqQ1 github.com/peterbourgon/ff/v3 v3.3.1/go.mod h1:zjJVUhx+twciwfDl0zBcFzl4dW8axCRyXE/eKY9RztQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/samber/slog-http v1.4.0 h1:s2hSzMlQBFDIPTUBDm6G+SGfv7F4xR9q8edjxtY6aho= +github.com/samber/slog-http v1.4.0/go.mod h1:n6h4x2ZBeTgLqMKf95EuNlU6mcJF1b/RVLxo1od5+V0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/hack/push.mjs b/hack/push.mjs new file mode 100644 index 00000000..3eb48235 --- /dev/null +++ b/hack/push.mjs @@ -0,0 +1,25 @@ +import admin from "firebase-admin"; +import fs from "fs"; + +const serviceAccount = JSON.parse( + fs.readFileSync(`${process.env.AQKEYS}/firebase-admin.json`, "utf8"), +); + +admin.initializeApp({ + credential: admin.credential.cert(serviceAccount), +}); + +(async () => { + const res = await admin.messaging().sendMulticast({ + tokens: process.argv.slice(2), + notification: { + title: "Basic Notification", + body: "This is a basic notification sent from the server!", + // imageUrl: "https://my-cdn.com/app-logo.png", + }, + android: { + priority: "high", + }, + }); + console.log(JSON.stringify(res)); +})(); diff --git a/js/app/.env.development b/js/app/.env.development new file mode 100644 index 00000000..55d1f761 --- /dev/null +++ b/js/app/.env.development @@ -0,0 +1,2 @@ +EXPO_PUBLIC_AQUAREUM_URL=http://localhost:8080 +EXPO_USE_METRO_WORKSPACE_ROOT=1 \ No newline at end of file diff --git a/js/app/.env.production b/js/app/.env.production new file mode 100644 index 00000000..ca52c778 --- /dev/null +++ b/js/app/.env.production @@ -0,0 +1,2 @@ +EXPO_PUBLIC_AQUAREUM_URL=https://aquareum.tv +EXPO_USE_METRO_WORKSPACE_ROOT=0 \ No newline at end of file diff --git a/js/app/.gitignore b/js/app/.gitignore index 3e9e296d..0673a11f 100644 --- a/js/app/.gitignore +++ b/js/app/.gitignore @@ -53,3 +53,4 @@ apps/studio/types/** tamagui-web.css android/app/src/main/assets +ios/Aquareum.xcworkspace/xcshareddata diff --git a/js/app/GoogleService-Info.plist b/js/app/GoogleService-Info.plist new file mode 100644 index 00000000..c7128a55 --- /dev/null +++ b/js/app/GoogleService-Info.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyACfGDkEbxUnr_vsltGvZNIAyoUy5U4K6w + GCM_SENDER_ID + 881925734448 + PLIST_VERSION + 1 + BUNDLE_ID + tv.aquareum + PROJECT_ID + aquareum-tv + STORAGE_BUCKET + aquareum-tv.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:881925734448:ios:7c0a7b43219f309e40edf5 + + \ No newline at end of file diff --git a/js/app/android/app/build.gradle b/js/app/android/app/build.gradle index a318ebed..9a798ed2 100644 --- a/js/app/android/app/build.gradle +++ b/js/app/android/app/build.gradle @@ -170,3 +170,5 @@ dependencies { apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); applyNativeModulesAppBuildGradle(project) + +apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/js/app/android/app/google-services.json b/js/app/android/app/google-services.json new file mode 100644 index 00000000..8bb2aaaf --- /dev/null +++ b/js/app/android/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "881925734448", + "project_id": "aquareum-tv", + "storage_bucket": "aquareum-tv.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:881925734448:android:07710b8baa75c6dd40edf5", + "android_client_info": { + "package_name": "tv.aquareum" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAR7VBxreSy2UlSBSd8kRQC9kMHdXg3mgA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} diff --git a/js/app/android/app/src/main/AndroidManifest.xml b/js/app/android/app/src/main/AndroidManifest.xml index 8357a19d..d5393320 100644 --- a/js/app/android/app/src/main/AndroidManifest.xml +++ b/js/app/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,8 @@ - + + + diff --git a/js/app/android/app/src/main/res/values/styles.xml b/js/app/android/app/src/main/res/values/styles.xml index f03e23f8..ab7cb49e 100644 --- a/js/app/android/app/src/main/res/values/styles.xml +++ b/js/app/android/app/src/main/res/values/styles.xml @@ -4,7 +4,7 @@ @style/ResetEditText @drawable/rn_edit_text_material @color/colorPrimary - @color/colorPrimaryDark + #ffffff