NOtification update

This commit is contained in:
Milan Paunovic
2024-10-12 09:15:30 +02:00
parent 3d4795c25d
commit 6e1e665b93
10 changed files with 107 additions and 17 deletions

View File

@ -17,9 +17,11 @@
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="default"/> <meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="default"/>
<meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/notification_icon_color"/> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/notification_icon_color"/>
<meta-data android:name="expo.modules.notifications.default_notification_color" android:resource="@color/notification_icon_color"/> <meta-data android:name="expo.modules.notifications.default_notification_color" android:resource="@color/notification_icon_color"/>
<meta-data android:name="expo.modules.updates.ENABLED" android:value="false"/> <meta-data android:name="expo.modules.updates.ENABLED" android:value="true"/>
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH" android:value="ALWAYS"/> <meta-data android:name="expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH" android:value="ALWAYS"/>
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS" android:value="0"/> <meta-data android:name="expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS" android:value="0"/>
<meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL" android:value="https://u.expo.dev/bdb8c57b-25bb-4d36-b3b8-5b09c5092f52"/>
<meta-data android:name="expo.modules.updates.EXPO_RUNTIME_VERSION" android:value="@string/expo_runtime_version"/>
<activity android:name=".MainActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.App.SplashScreen" android:exported="true" android:screenOrientation="portrait"> <activity android:name=".MainActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.App.SplashScreen" android:exported="true" android:screenOrientation="portrait">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>

View File

@ -3,4 +3,5 @@
<string name="expo_splash_screen_resize_mode" translatable="false">contain</string> <string name="expo_splash_screen_resize_mode" translatable="false">contain</string>
<string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string> <string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string>
<string name="expo_system_ui_user_interface_style" translatable="false">light</string> <string name="expo_system_ui_user_interface_style" translatable="false">light</string>
<string name="expo_runtime_version">1.0.0</string>
</resources> </resources>

View File

@ -24,7 +24,11 @@
"backgroundColor": "#ffffff" "backgroundColor": "#ffffff"
}, },
"package": "com.cally.app", "package": "com.cally.app",
"googleServicesFile": "./android/app/google-services.json" "googleServicesFile": "./android/app/google-services.json",
"permissions": [
"android.permission.CAMERA",
"android.permission.RECORD_AUDIO"
]
}, },
"web": { "web": {
"bundler": "metro", "bundler": "metro",
@ -70,6 +74,10 @@
"eas": { "eas": {
"projectId": "bdb8c57b-25bb-4d36-b3b8-5b09c5092f52" "projectId": "bdb8c57b-25bb-4d36-b3b8-5b09c5092f52"
} }
},
"runtimeVersion": "1.0.0",
"updates": {
"url": "https://u.expo.dev/bdb8c57b-25bb-4d36-b3b8-5b09c5092f52"
} }
} }
} }

View File

@ -5,12 +5,16 @@
"build": { "build": {
"development": { "development": {
"developmentClient": true, "developmentClient": true,
"distribution": "internal" "distribution": "internal",
"channel": "development"
}, },
"preview": { "preview": {
"distribution": "internal" "distribution": "internal",
"channel": "preview"
}, },
"production": {} "production": {
"channel": "production"
}
}, },
"submit": { "submit": {
"production": { "production": {

View File

@ -16,8 +16,14 @@ exports.sendNotificationOnEventCreation = functions.firestore
.document('Events/{eventId}') .document('Events/{eventId}')
.onCreate(async (snapshot, context) => { .onCreate(async (snapshot, context) => {
const eventData = snapshot.data(); const eventData = snapshot.data();
const { familyId, creatorId } = eventData;
const pushTokens = await getPushTokensForEvent(eventData); if (!familyId || !creatorId) {
console.error('Missing familyId or creatorId in event data');
return;
}
const pushTokens = await getPushTokensForFamilyExcludingCreator(familyId, creatorId);
if (!pushTokens.length) { if (!pushTokens.length) {
console.log('No push tokens available for the event.'); console.log('No push tokens available for the event.');
@ -45,7 +51,6 @@ exports.sendNotificationOnEventCreation = functions.firestore
for (let chunk of chunks) { for (let chunk of chunks) {
try { try {
let ticketChunk = await expo.sendPushNotificationsAsync(chunk); let ticketChunk = await expo.sendPushNotificationsAsync(chunk);
tickets.push(...ticketChunk); tickets.push(...ticketChunk);
for (let ticket of ticketChunk) { for (let ticket of ticketChunk) {
@ -53,7 +58,6 @@ exports.sendNotificationOnEventCreation = functions.firestore
console.log('Notification successfully sent:', ticket.id); console.log('Notification successfully sent:', ticket.id);
} else if (ticket.status === 'error') { } else if (ticket.status === 'error') {
console.error(`Notification error: ${ticket.message}`); console.error(`Notification error: ${ticket.message}`);
if (ticket.details && ticket.details.error) { if (ticket.details && ticket.details.error) {
console.error('Error details:', ticket.details.error); console.error('Error details:', ticket.details.error);
if (ticket.details.error === 'DeviceNotRegistered') { if (ticket.details.error === 'DeviceNotRegistered') {
@ -63,12 +67,12 @@ exports.sendNotificationOnEventCreation = functions.firestore
} }
} }
} }
} catch (error) { } catch (error) {
console.error('Error sending notification:', error); console.error('Error sending notification:', error);
} }
} }
// Retrieve and handle notification receipts
let receiptIds = []; let receiptIds = [];
for (let ticket of tickets) { for (let ticket of tickets) {
if (ticket.id) { if (ticket.id) {
@ -84,7 +88,6 @@ exports.sendNotificationOnEventCreation = functions.firestore
for (let receiptId in receipts) { for (let receiptId in receipts) {
let { status, message, details } = receipts[receiptId]; let { status, message, details } = receipts[receiptId];
if (status === 'ok') { if (status === 'ok') {
console.log(`Notification with receipt ID ${receiptId} was delivered successfully`); console.log(`Notification with receipt ID ${receiptId} was delivered successfully`);
} else if (status === 'error') { } else if (status === 'error') {
@ -99,7 +102,6 @@ exports.sendNotificationOnEventCreation = functions.firestore
} }
} }
return null; return null;
}); });
@ -207,3 +209,18 @@ async function getPushTokensForEvent() {
return pushTokens; return pushTokens;
} }
async function getPushTokensForFamilyExcludingCreator(familyId, creatorId) {
const usersRef = db.collection('Profiles');
const snapshot = await usersRef.where('familyId', '==', familyId).get();
let pushTokens = [];
snapshot.forEach(doc => {
const data = doc.data();
// Exclude the creator
if (data.uid !== creatorId && data.pushToken) {
pushTokens.push(data.pushToken);
}
});
return pushTokens;
}

View File

@ -4,7 +4,7 @@ import firestore from "@react-native-firebase/firestore";
import { EventData } from "@/hooks/firebase/types/eventData"; import { EventData } from "@/hooks/firebase/types/eventData";
export const useCreateEvent = () => { export const useCreateEvent = () => {
const {user: currentUser} = useAuthContext() const {user: currentUser, profileData} = useAuthContext()
const queryClients = useQueryClient() const queryClients = useQueryClient()
return useMutation({ return useMutation({
@ -14,7 +14,7 @@ export const useCreateEvent = () => {
console.log("CALLLLL") console.log("CALLLLL")
await firestore() await firestore()
.collection("Events") .collection("Events")
.add({...eventData, creatorId: currentUser?.uid}) .add({...eventData, creatorId: currentUser?.uid, familyId: profileData?.familyId})
} catch (e) { } catch (e) {
console.error(e) console.error(e)
} }

View File

@ -86,6 +86,9 @@
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string> <string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string> <string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string> <string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
</array> </array>
<key>UILaunchStoryboardName</key> <key>UILaunchStoryboardName</key>
<string>SplashScreen</string> <string>SplashScreen</string>

View File

@ -5,8 +5,12 @@
<key>EXUpdatesCheckOnLaunch</key> <key>EXUpdatesCheckOnLaunch</key>
<string>ALWAYS</string> <string>ALWAYS</string>
<key>EXUpdatesEnabled</key> <key>EXUpdatesEnabled</key>
<false/> <true/>
<key>EXUpdatesLaunchWaitMs</key> <key>EXUpdatesLaunchWaitMs</key>
<integer>0</integer> <integer>0</integer>
<key>EXUpdatesRuntimeVersion</key>
<string>1.0.0</string>
<key>EXUpdatesURL</key>
<string>https://u.expo.dev/bdb8c57b-25bb-4d36-b3b8-5b09c5092f52</string>
</dict> </dict>
</plist> </plist>

View File

@ -19,7 +19,7 @@
"lint": "expo lint", "lint": "expo lint",
"submit": "npx eas-cli submit -p ios", "submit": "npx eas-cli submit -p ios",
"prebuild": "npx expo prebuild -p ios", "prebuild": "npx expo prebuild -p ios",
"prebuild-build-submit-ios": "npm run prebuild && npm run build-ios && npm run submit", "prebuild-build-submit-ios": "yarn run prebuild && yarn run build-ios && yarn run submit",
"prebuild-build-submit-ios-cicd": "yarn build-ios-cicd", "prebuild-build-submit-ios-cicd": "yarn build-ios-cicd",
"prebuild-build-submit-cicd": "yarn build-cicd" "prebuild-build-submit-cicd": "yarn build-cicd"
}, },
@ -55,6 +55,7 @@
"expo-splash-screen": "~0.27.5", "expo-splash-screen": "~0.27.5",
"expo-status-bar": "~1.12.1", "expo-status-bar": "~1.12.1",
"expo-system-ui": "~3.0.7", "expo-system-ui": "~3.0.7",
"expo-updates": "~0.25.27",
"expo-web-browser": "~13.0.3", "expo-web-browser": "~13.0.3",
"firebase-admin": "^12.3.1", "firebase-admin": "^12.3.1",
"firebase-functions": "^5.1.0", "firebase-functions": "^5.1.0",

View File

@ -1018,6 +1018,20 @@
dotenv-expand "~11.0.6" dotenv-expand "~11.0.6"
getenv "^1.0.0" getenv "^1.0.0"
"@expo/fingerprint@^0.10.2":
version "0.10.3"
resolved "https://registry.yarnpkg.com/@expo/fingerprint/-/fingerprint-0.10.3.tgz#87c2811fe7773ec7d00cae86ab041d578f9041b5"
integrity sha512-h/BnnyloJyMSrzeXonKLE6HfiMpRg3e9m8CAv+eUaAozG9heKMG9ftHW4cfm2StDYj/rWjFc5YK6MSIX6qd+xg==
dependencies:
"@expo/spawn-async" "^1.7.2"
chalk "^4.1.2"
debug "^4.3.4"
find-up "^5.0.0"
minimatch "^3.0.4"
p-limit "^3.1.0"
resolve-from "^5.0.0"
semver "^7.6.0"
"@expo/image-utils@^0.5.0": "@expo/image-utils@^0.5.0":
version "0.5.1" version "0.5.1"
resolved "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.5.1.tgz" resolved "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.5.1.tgz"
@ -3228,6 +3242,11 @@ application-config-path@^0.1.0:
resolved "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz" resolved "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz"
integrity sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw== integrity sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==
arg@4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0"
integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==
arg@5.0.2: arg@5.0.2:
version "5.0.2" version "5.0.2"
resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz"
@ -4945,6 +4964,11 @@ expo-device@~6.0.2:
dependencies: dependencies:
ua-parser-js "^0.7.33" ua-parser-js "^0.7.33"
expo-eas-client@~0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/expo-eas-client/-/expo-eas-client-0.12.0.tgz#e8b6f7d33873e6f630f37f7bfc41646ae7b0b2a9"
integrity sha512-Jkww9Cwpv0z7DdLYiRX0r4fqBEcI9cKqTn7cHx63S09JaZ2rcwEE4zYHgrXwjahO+tU2VW8zqH+AJl6RhhW4zA==
expo-file-system@~17.0.1: expo-file-system@~17.0.1:
version "17.0.1" version "17.0.1"
resolved "https://registry.npmjs.org/expo-file-system/-/expo-file-system-17.0.1.tgz" resolved "https://registry.npmjs.org/expo-file-system/-/expo-file-system-17.0.1.tgz"
@ -5056,6 +5080,11 @@ expo-status-bar@~1.12.1:
resolved "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.12.1.tgz" resolved "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.12.1.tgz"
integrity sha512-/t3xdbS8KB0prj5KG5w7z+wZPFlPtkgs95BsmrP/E7Q0xHXTcDcQ6Cu2FkFuRM+PKTb17cJDnLkawyS5vDLxMA== integrity sha512-/t3xdbS8KB0prj5KG5w7z+wZPFlPtkgs95BsmrP/E7Q0xHXTcDcQ6Cu2FkFuRM+PKTb17cJDnLkawyS5vDLxMA==
expo-structured-headers@~3.8.0:
version "3.8.0"
resolved "https://registry.yarnpkg.com/expo-structured-headers/-/expo-structured-headers-3.8.0.tgz#11797a4c3a7a6770b21126cecffcda148030e361"
integrity sha512-R+gFGn0x5CWl4OVlk2j1bJTJIz4KO8mPoCHpRHmfqMjmrMvrOM0qQSY3V5NHXwp1yT/L2v8aUmFQsBRIdvi1XA==
expo-system-ui@~3.0.7: expo-system-ui@~3.0.7:
version "3.0.7" version "3.0.7"
resolved "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-3.0.7.tgz" resolved "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-3.0.7.tgz"
@ -5069,6 +5098,27 @@ expo-updates-interface@~0.16.2:
resolved "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-0.16.2.tgz" resolved "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-0.16.2.tgz"
integrity sha512-929XBU70q5ELxkKADj1xL0UIm3HvhYhNAOZv5DSk7rrKvLo7QDdPyl+JVnwZm9LrkNbH4wuE2rLoKu1KMgZ+9A== integrity sha512-929XBU70q5ELxkKADj1xL0UIm3HvhYhNAOZv5DSk7rrKvLo7QDdPyl+JVnwZm9LrkNbH4wuE2rLoKu1KMgZ+9A==
expo-updates@~0.25.27:
version "0.25.27"
resolved "https://registry.yarnpkg.com/expo-updates/-/expo-updates-0.25.27.tgz#4aff889fea2aa221d8341a902646288f84c48b9e"
integrity sha512-1hyYZqBEXcAiEuSRPJ6dINTndGlWi6/bwlyYGjSnyoYfu/vzZQrJ+XA8JUP4EvJ3b0g8a0UOIjlDJ9ke9kMcfg==
dependencies:
"@expo/code-signing-certificates" "0.0.5"
"@expo/config" "~9.0.0-beta.0"
"@expo/config-plugins" "~8.0.8"
"@expo/fingerprint" "^0.10.2"
"@expo/spawn-async" "^1.7.2"
arg "4.1.0"
chalk "^4.1.2"
expo-eas-client "~0.12.0"
expo-manifests "~0.14.0"
expo-structured-headers "~3.8.0"
expo-updates-interface "~0.16.2"
fast-glob "^3.3.2"
fbemitter "^3.0.0"
ignore "^5.3.1"
resolve-from "^5.0.0"
expo-web-browser@~13.0.0, expo-web-browser@~13.0.3: expo-web-browser@~13.0.0, expo-web-browser@~13.0.3:
version "13.0.3" version "13.0.3"
resolved "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-13.0.3.tgz" resolved "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-13.0.3.tgz"
@ -5963,7 +6013,7 @@ ieee754@^1.1.13:
resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
ignore@^5.2.0: ignore@^5.2.0, ignore@^5.3.1:
version "5.3.2" version "5.3.2"
resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"
integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==