diff --git a/app/(tabs)/settings.tsx b/app/(tabs)/settings.tsx
index da719a8..3b6f9fc 100644
--- a/app/(tabs)/settings.tsx
+++ b/app/(tabs)/settings.tsx
@@ -88,13 +88,13 @@ export default function SettingsScreen() {
- {user.username || 'Profil'}
+ {user.username}
{user.email}
@@ -169,7 +169,7 @@ const styles = StyleSheet.create({
padding: Spacing.md,
borderWidth: 1,
borderColor: Palette.cream,
- borderRadius: Radius.xl,
+ borderRadius: Radius.md,
backgroundColor: Palette.white,
},
previewContent: {
diff --git a/constants/styles.ts b/constants/styles.ts
index f1e039a..4718633 100644
--- a/constants/styles.ts
+++ b/constants/styles.ts
@@ -8,6 +8,7 @@ export const Spacing = {
} as const;
export const Radius = {
+ xs: 4,
sm: 8,
md: 12,
lg: 16,
diff --git a/firebase-debug.log b/firebase-debug.log
index 164cf0d..5abe70b 100644
--- a/firebase-debug.log
+++ b/firebase-debug.log
@@ -1,31 +1,31 @@
-[debug] [2026-04-19T16:48:31.474Z] ----------------------------------------------------------------------
-[debug] [2026-04-19T16:48:31.476Z] Command: /usr/local/bin/firebase /home/leon/.cache/firebase/tools/lib/node_modules/firebase-tools/lib/bin/firebase emulators:start --only functions
-[debug] [2026-04-19T16:48:31.476Z] CLI Version: 15.15.0
-[debug] [2026-04-19T16:48:31.476Z] Platform: linux
-[debug] [2026-04-19T16:48:31.476Z] Node Version: v20.18.2
-[debug] [2026-04-19T16:48:31.476Z] Time: Sun Apr 19 2026 18:48:31 GMT+0200 (GMT+02:00)
-[debug] [2026-04-19T16:48:31.476Z] ----------------------------------------------------------------------
+[debug] [2026-04-20T06:11:15.602Z] ----------------------------------------------------------------------
+[debug] [2026-04-20T06:11:15.604Z] Command: /usr/local/bin/firebase /home/leon/.cache/firebase/tools/lib/node_modules/firebase-tools/lib/bin/firebase emulators:start --only functions
+[debug] [2026-04-20T06:11:15.604Z] CLI Version: 15.15.0
+[debug] [2026-04-20T06:11:15.604Z] Platform: linux
+[debug] [2026-04-20T06:11:15.604Z] Node Version: v20.18.2
+[debug] [2026-04-20T06:11:15.604Z] Time: Mon Apr 20 2026 08:11:15 GMT+0200 (GMT+02:00)
+[debug] [2026-04-20T06:11:15.604Z] ----------------------------------------------------------------------
[debug]
-[debug] [2026-04-19T16:48:31.907Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
-[debug] [2026-04-19T16:48:31.907Z] > authorizing via signed-in user (leon.morival@gmail.com)
+[debug] [2026-04-20T06:11:16.006Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
+[debug] [2026-04-20T06:11:16.006Z] > authorizing via signed-in user (leon.morival@gmail.com)
[info] i emulators: Starting emulators: functions {"metadata":{"emulator":{"name":"hub"},"message":"Starting emulators: functions"}}
-[debug] [2026-04-19T16:48:31.917Z] [logging] Logging Emulator only supports listening on one address (127.0.0.1). Not listening on ::1
-[debug] [2026-04-19T16:48:31.917Z] assigned listening specs for emulators {"user":{"ui":[{"address":"0.0.0.0","family":"IPv4","port":4000}],"hub":[{"address":"127.0.0.1","family":"IPv4","port":4400},{"address":"::1","family":"IPv6","port":4400}],"logging":[{"address":"127.0.0.1","family":"IPv4","port":4500}]},"metadata":{"message":"assigned listening specs for emulators"}}
-[debug] [2026-04-19T16:48:31.919Z] Write emulator hub locator at /tmp/hub-expo-starter-9daef.json
-[debug] [2026-04-19T16:48:31.923Z] [eventarc] Eventarc Emulator only supports listening on one address (127.0.0.1). Not listening on ::1
-[debug] [2026-04-19T16:48:31.923Z] [tasks] Cloud Tasks Emulator only supports listening on one address (127.0.0.1). Not listening on ::1
-[debug] [2026-04-19T16:48:31.923Z] late-assigned ports for functions and eventarc emulators {"user":{"ui":[{"address":"0.0.0.0","family":"IPv4","port":4000}],"hub":[{"address":"127.0.0.1","family":"IPv4","port":4400},{"address":"::1","family":"IPv6","port":4400}],"logging":[{"address":"127.0.0.1","family":"IPv4","port":4500}],"functions":[{"address":"0.0.0.0","family":"IPv4","port":5001}],"eventarc":[{"address":"127.0.0.1","family":"IPv4","port":9299}],"tasks":[{"address":"127.0.0.1","family":"IPv4","port":9499}]},"metadata":{"message":"late-assigned ports for functions and eventarc emulators"}}
+[debug] [2026-04-20T06:11:16.015Z] [logging] Logging Emulator only supports listening on one address (127.0.0.1). Not listening on ::1
+[debug] [2026-04-20T06:11:16.015Z] assigned listening specs for emulators {"user":{"ui":[{"address":"0.0.0.0","family":"IPv4","port":4000}],"hub":[{"address":"127.0.0.1","family":"IPv4","port":4400},{"address":"::1","family":"IPv6","port":4400}],"logging":[{"address":"127.0.0.1","family":"IPv4","port":4500}]},"metadata":{"message":"assigned listening specs for emulators"}}
+[debug] [2026-04-20T06:11:16.017Z] Write emulator hub locator at /tmp/hub-expo-starter-9daef.json
+[debug] [2026-04-20T06:11:16.021Z] [eventarc] Eventarc Emulator only supports listening on one address (127.0.0.1). Not listening on ::1
+[debug] [2026-04-20T06:11:16.021Z] [tasks] Cloud Tasks Emulator only supports listening on one address (127.0.0.1). Not listening on ::1
+[debug] [2026-04-20T06:11:16.021Z] late-assigned ports for functions and eventarc emulators {"user":{"ui":[{"address":"0.0.0.0","family":"IPv4","port":4000}],"hub":[{"address":"127.0.0.1","family":"IPv4","port":4400},{"address":"::1","family":"IPv6","port":4400}],"logging":[{"address":"127.0.0.1","family":"IPv4","port":4500}],"functions":[{"address":"0.0.0.0","family":"IPv4","port":5001}],"eventarc":[{"address":"127.0.0.1","family":"IPv4","port":9299}],"tasks":[{"address":"127.0.0.1","family":"IPv4","port":9499}]},"metadata":{"message":"late-assigned ports for functions and eventarc emulators"}}
[warn] ⚠ functions: The following emulators are not running, calls to these services from the Functions emulator will affect production: apphosting, auth, firestore, database, hosting, pubsub, storage, dataconnect {"metadata":{"emulator":{"name":"functions"},"message":"The following emulators are not running, calls to these services from the Functions emulator will affect production: \u001b[1mapphosting, auth, firestore, database, hosting, pubsub, storage, dataconnect\u001b[22m"}}
-[debug] [2026-04-19T16:48:31.939Z] defaultcredentials: writing to file /home/leon/.config/firebase/leon_morival_gmail.com_application_default_credentials.json
-[debug] [2026-04-19T16:48:31.940Z] Setting GAC to /home/leon/.config/firebase/leon_morival_gmail.com_application_default_credentials.json {"metadata":{"emulator":{"name":"functions"},"message":"Setting GAC to /home/leon/.config/firebase/leon_morival_gmail.com_application_default_credentials.json"}}
-[debug] [2026-04-19T16:48:31.940Z] Checked if tokens are valid: true, expires at: 1776620760607
-[debug] [2026-04-19T16:48:31.940Z] Checked if tokens are valid: true, expires at: 1776620760607
-[debug] [2026-04-19T16:48:31.941Z] >>> [apiv2][query] GET https://firebase.googleapis.com/v1beta1/projects/expo-starter-9daef/adminSdkConfig [none]
-[debug] [2026-04-19T16:48:32.358Z] <<< [apiv2][status] GET https://firebase.googleapis.com/v1beta1/projects/expo-starter-9daef/adminSdkConfig 200
-[debug] [2026-04-19T16:48:32.358Z] <<< [apiv2][body] GET https://firebase.googleapis.com/v1beta1/projects/expo-starter-9daef/adminSdkConfig {"projectId":"expo-starter-9daef","storageBucket":"expo-starter-9daef.firebasestorage.app"}
+[debug] [2026-04-20T06:11:16.034Z] defaultcredentials: writing to file /home/leon/.config/firebase/leon_morival_gmail.com_application_default_credentials.json
+[debug] [2026-04-20T06:11:16.035Z] Setting GAC to /home/leon/.config/firebase/leon_morival_gmail.com_application_default_credentials.json {"metadata":{"emulator":{"name":"functions"},"message":"Setting GAC to /home/leon/.config/firebase/leon_morival_gmail.com_application_default_credentials.json"}}
+[debug] [2026-04-20T06:11:16.035Z] Checked if tokens are valid: true, expires at: 1776668874171
+[debug] [2026-04-20T06:11:16.035Z] Checked if tokens are valid: true, expires at: 1776668874171
+[debug] [2026-04-20T06:11:16.036Z] >>> [apiv2][query] GET https://firebase.googleapis.com/v1beta1/projects/expo-starter-9daef/adminSdkConfig [none]
+[debug] [2026-04-20T06:11:16.463Z] <<< [apiv2][status] GET https://firebase.googleapis.com/v1beta1/projects/expo-starter-9daef/adminSdkConfig 200
+[debug] [2026-04-20T06:11:16.464Z] <<< [apiv2][body] GET https://firebase.googleapis.com/v1beta1/projects/expo-starter-9daef/adminSdkConfig {"projectId":"expo-starter-9daef","storageBucket":"expo-starter-9daef.firebasestorage.app"}
[info] i functions: Watching "/home/leon/Workspace/perso/starter/expo-starter/functions" for Cloud Functions... {"metadata":{"emulator":{"name":"functions"},"message":"Watching \"/home/leon/Workspace/perso/starter/expo-starter/functions\" for Cloud Functions..."}}
-[debug] [2026-04-19T16:48:32.373Z] Validating nodejs source
-[debug] [2026-04-19T16:48:32.726Z] > [functions] package.json contents: {
+[debug] [2026-04-20T06:11:16.479Z] Validating nodejs source
+[debug] [2026-04-20T06:11:16.835Z] > [functions] package.json contents: {
"name": "functions",
"scripts": {
"lint": "ESLINT_USE_FLAT_CONFIG=false eslint --ext .js,.ts src",
@@ -56,22 +56,19 @@
},
"private": true
}
-[debug] [2026-04-19T16:48:32.726Z] Building nodejs source
-[debug] [2026-04-19T16:48:32.727Z] Failed to find version of module node: reached end of search path /home/leon/Workspace/perso/starter/expo-starter/functions/node_modules
+[debug] [2026-04-20T06:11:16.836Z] Building nodejs source
+[debug] [2026-04-20T06:11:16.836Z] Failed to find version of module node: reached end of search path /home/leon/Workspace/perso/starter/expo-starter/functions/node_modules
[warn] ⚠ functions: You've requested "node" version "24", but the standalone Firebase CLI comes with bundled Node "20".
[info] ✔ functions: To use a different Node.js version, consider removing the standalone Firebase CLI and switching to "firebase-tools" on npm.
-[debug] [2026-04-19T16:48:32.728Z] Could not find functions.yaml. Must use http discovery
-[debug] [2026-04-19T16:48:32.730Z] Found firebase-functions binary at '/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/.bin/firebase-functions'
-[info] Serving at port 8679
+[debug] [2026-04-20T06:11:16.837Z] Could not find functions.yaml. Must use http discovery
+[debug] [2026-04-20T06:11:16.839Z] Found firebase-functions binary at '/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/.bin/firebase-functions'
+[info] Serving at port 8224
-[debug] [2026-04-19T16:48:33.073Z] Got response from /__/functions.yaml {"endpoints":{"deleteUserAuthOnUserDocumentDeleted":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":10,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.deleted","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"users/{uid}"},"retry":false},"entryPoint":"deleteUserAuthOnUserDocumentDeleted"},"sendTestPushNotification":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":10,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"sendTestPushNotification"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}}
-[debug] [2026-04-19T16:48:34.822Z] [work-queue] {"queuedWork":["/expo-starter-9daef/us-central1/sendTestPushNotification-2026-04-19T16:48:34.822Z"],"queueLength":1,"runningWork":[],"workRunningCount":0}
-[debug] [2026-04-19T16:48:34.822Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/expo-starter-9daef/us-central1/sendTestPushNotification-2026-04-19T16:48:34.822Z"],"workRunningCount":1}
-[debug] [2026-04-19T16:48:34.823Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0}
+[debug] [2026-04-20T06:11:17.159Z] Got response from /__/functions.yaml {"endpoints":{"deleteUserAuthOnUserDocumentDeleted":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":10,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.deleted","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"users/{uid}"},"retry":false},"entryPoint":"deleteUserAuthOnUserDocumentDeleted"},"sendTestPushNotification":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":10,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"sendTestPushNotification"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}}
[info] ✔ functions: Loaded functions definitions from source: deleteUserAuthOnUserDocumentDeleted, sendTestPushNotification. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: deleteUserAuthOnUserDocumentDeleted, sendTestPushNotification."}}
[info] i functions[us-central1-deleteUserAuthOnUserDocumentDeleted]: function ignored because the firestore emulator does not exist or is not running. {"metadata":{"emulator":{"name":"functions"},"message":"function ignored because the firestore emulator does not exist or is not running."}}
[info] ✔ functions[us-central1-sendTestPushNotification]: http function initialized (http://127.0.0.1:5001/expo-starter-9daef/us-central1/sendTestPushNotification). {"metadata":{"emulator":{"name":"functions"},"message":"\u001b[1mhttp\u001b[22m function initialized (http://127.0.0.1:5001/expo-starter-9daef/us-central1/sendTestPushNotification)."}}
-[debug] [2026-04-19T16:48:37.112Z] Could not find VSCode notification endpoint: FetchError: request to http://localhost:40001/vscode/notify failed, reason: connect ECONNREFUSED 127.0.0.1:40001. If you are not running the Firebase SQL Connect VSCode extension, this is expected and not an issue.
+[debug] [2026-04-20T06:11:21.191Z] Could not find VSCode notification endpoint: FetchError: request to http://localhost:40001/vscode/notify failed, reason: connect ECONNREFUSED 127.0.0.1:40001. If you are not running the Firebase SQL Connect VSCode extension, this is expected and not an issue.
[info]
┌─────────────────────────────────────────────────────────────┐
│ ✔ All emulators ready! It is now safe to connect your app. │
@@ -88,89 +85,10 @@
Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.
-[debug] [2026-04-19T16:48:40.336Z] [work-queue] {"queuedWork":["/expo-starter-9daef/us-central1/sendTestPushNotification-2026-04-19T16:48:40.336Z"],"queueLength":1,"runningWork":[],"workRunningCount":0}
-[debug] [2026-04-19T16:48:40.337Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/expo-starter-9daef/us-central1/sendTestPushNotification-2026-04-19T16:48:40.336Z"],"workRunningCount":1}
-[debug] [2026-04-19T16:48:40.337Z] Accepted request POST /expo-starter-9daef/us-central1/sendTestPushNotification --> us-central1-sendTestPushNotification
-[debug] [2026-04-19T16:48:40.338Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}}
-[debug] [2026-04-19T16:48:40.339Z] [functions] Got req.url=/expo-starter-9daef/us-central1/sendTestPushNotification, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/expo-starter-9daef/us-central1/sendTestPushNotification, mapping to path=/"}}
-[debug] [2026-04-19T16:48:40.344Z] [worker-pool] addWorker(us-central1-sendTestPushNotification) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] addWorker(us-central1-sendTestPushNotification)"}}
-[debug] [2026-04-19T16:48:40.345Z] [worker-pool] Adding worker with key us-central1-sendTestPushNotification, total=1 {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] Adding worker with key us-central1-sendTestPushNotification, total=1"}}
-[debug] [2026-04-19T16:48:40.707Z] [runtime-status] [63867] Resolved module firebase-admin {"declared":true,"installed":true,"version":"13.8.0","resolution":"/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/firebase-admin/lib/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[runtime-status] [63867] Resolved module firebase-admin {\"declared\":true,\"installed\":true,\"version\":\"13.8.0\",\"resolution\":\"/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/firebase-admin/lib/index.js\"}"}}
-[debug] [2026-04-19T16:48:40.707Z] [runtime-status] [63867] Resolved module firebase-functions {"declared":true,"installed":true,"version":"7.2.5","resolution":"/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[runtime-status] [63867] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"7.2.5\",\"resolution\":\"/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}}
-[debug] [2026-04-19T16:48:40.707Z] [runtime-status] [63867] Outgoing network have been stubbed. [{"name":"http","status":"mocked"},{"name":"http","status":"mocked"},{"name":"https","status":"mocked"},{"name":"https","status":"mocked"},{"name":"net","status":"mocked"}] {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[runtime-status] [63867] Outgoing network have been stubbed. [{\"name\":\"http\",\"status\":\"mocked\"},{\"name\":\"http\",\"status\":\"mocked\"},{\"name\":\"https\",\"status\":\"mocked\"},{\"name\":\"https\",\"status\":\"mocked\"},{\"name\":\"net\",\"status\":\"mocked\"}]"}}
-[debug] [2026-04-19T16:48:40.707Z] [runtime-status] [63867] Resolved module firebase-functions {"declared":true,"installed":true,"version":"7.2.5","resolution":"/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[runtime-status] [63867] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"7.2.5\",\"resolution\":\"/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}}
-[debug] [2026-04-19T16:48:40.707Z] [runtime-status] [63867] Detected firebase-functions v7+, skipping legacy stubs. {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[runtime-status] [63867] Detected firebase-functions v7+, skipping legacy stubs."}}
-[debug] [2026-04-19T16:48:40.707Z] [runtime-status] [63867] Resolved module firebase-admin {"declared":true,"installed":true,"version":"13.8.0","resolution":"/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/firebase-admin/lib/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[runtime-status] [63867] Resolved module firebase-admin {\"declared\":true,\"installed\":true,\"version\":\"13.8.0\",\"resolution\":\"/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/firebase-admin/lib/index.js\"}"}}
-[debug] [2026-04-19T16:48:40.727Z] [runtime-status] [63867] Resolved module firebase-functions {"declared":true,"installed":true,"version":"7.2.5","resolution":"/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[runtime-status] [63867] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"7.2.5\",\"resolution\":\"/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}}
-[debug] [2026-04-19T16:48:40.798Z] [runtime-status] [63867] firebase-admin has been stubbed. {"adminResolution":{"declared":true,"installed":true,"version":"13.8.0","resolution":"/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/firebase-admin/lib/index.js"}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[runtime-status] [63867] firebase-admin has been stubbed. {\"adminResolution\":{\"declared\":true,\"installed\":true,\"version\":\"13.8.0\",\"resolution\":\"/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/firebase-admin/lib/index.js\"}}"}}
-[debug] [2026-04-19T16:48:40.803Z] [runtime-status] [63867] Functions runtime initialized. {"cwd":"/home/leon/Workspace/perso/starter/expo-starter/functions","node_version":"20.18.2"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[runtime-status] [63867] Functions runtime initialized. {\"cwd\":\"/home/leon/Workspace/perso/starter/expo-starter/functions\",\"node_version\":\"20.18.2\"}"}}
-[debug] [2026-04-19T16:48:40.803Z] [runtime-status] [63867] Listening to port: /tmp/fire_emu_5ad7eed774b9d705.sock {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[runtime-status] [63867] Listening to port: /tmp/fire_emu_5ad7eed774b9d705.sock"}}
-[debug] [2026-04-19T16:48:40.855Z] [worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: IDLE"}}
-[debug] [2026-04-19T16:48:40.855Z] [worker-pool] submitRequest(triggerId=us-central1-sendTestPushNotification) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-sendTestPushNotification)"}}
-[info] i functions: Beginning execution of "us-central1-sendTestPushNotification" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Beginning execution of \"us-central1-sendTestPushNotification\""}}
-[debug] [2026-04-19T16:48:40.856Z] [worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: BUSY"}}
-[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}}
-[warn] ⚠ Google API requested!
- - URL: "https://oauth2.googleapis.com/token"
- - Be careful, this may be a production service. {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Google API requested!\n - URL: \"https://oauth2.googleapis.com/token\"\n - Be careful, this may be a production service."}}
-[info] > {"uid":"O8lgsPxjejS7WZYVN1qa8wAZfiA2","response":[{"status":"error","message":"\"fn_xv7aZRAGC92nuZbTRYM:APA91bE...wLvTQTf_J3VmP7wcfgFOmXiYgYo\" is not a valid Expo push token","details":{"error":"DeviceNotRegistered","expoPushToken":"fn_xv7aZRAGC92nuZbTRYM:APA91bE...wLvTQTf_J3VmP7wcfgFOmXiYgYo"}},{"status":"error","message":"Unable to retrieve the FCM server key for the recipient's app. Make sure you have provided a server key as directed by the Expo FCM documentation.","details":{"error":"InvalidCredentials","fault":"developer"}}],"severity":"INFO","message":"Test push notification sent."} {"user":{"uid":"O8lgsPxjejS7WZYVN1qa8wAZfiA2","response":[{"status":"error","message":"\"fn_xv7aZRAGC92nuZbTRYM:APA91bE...wLvTQTf_J3VmP7wcfgFOmXiYgYo\" is not a valid Expo push token","details":{"error":"DeviceNotRegistered","expoPushToken":"fn_xv7aZRAGC92nuZbTRYM:APA91bE...wLvTQTf_J3VmP7wcfgFOmXiYgYo"}},{"status":"error","message":"Unable to retrieve the FCM server key for the recipient's app. Make sure you have provided a server key as directed by the Expo FCM documentation.","details":{"error":"InvalidCredentials","fault":"developer"}}],"severity":"INFO","message":"Test push notification sent."},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"uid\":\"O8lgsPxjejS7WZYVN1qa8wAZfiA2\",\"response\":[{\"status\":\"error\",\"message\":\"\\\"fn_xv7aZRAGC92nuZbTRYM:APA91bE...wLvTQTf_J3VmP7wcfgFOmXiYgYo\\\" is not a valid Expo push token\",\"details\":{\"error\":\"DeviceNotRegistered\",\"expoPushToken\":\"fn_xv7aZRAGC92nuZbTRYM:APA91bE...wLvTQTf_J3VmP7wcfgFOmXiYgYo\"}},{\"status\":\"error\",\"message\":\"Unable to retrieve the FCM server key for the recipient's app. Make sure you have provided a server key as directed by the Expo FCM documentation.\",\"details\":{\"error\":\"InvalidCredentials\",\"fault\":\"developer\"}}],\"severity\":\"INFO\",\"message\":\"Test push notification sent.\"}"}}
-[debug] [2026-04-19T16:48:41.877Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finishing up request with event=pause"}}
-[info] i functions: Finished "us-central1-sendTestPushNotification" in 1021.358853ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finished \"us-central1-sendTestPushNotification\" in 1021.358853ms"}}
-[debug] [2026-04-19T16:48:41.878Z] [worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: IDLE"}}
-[debug] [2026-04-19T16:48:41.878Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finishing up request with event=finish"}}
-[debug] [2026-04-19T16:48:41.878Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finishing up request with event=close"}}
-[debug] [2026-04-19T16:48:41.878Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0}
-[debug] [2026-04-19T16:50:23.257Z] [work-queue] {"queuedWork":["/expo-starter-9daef/us-central1/sendTestPushNotification-2026-04-19T16:50:23.257Z"],"queueLength":1,"runningWork":[],"workRunningCount":0}
-[debug] [2026-04-19T16:50:23.257Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/expo-starter-9daef/us-central1/sendTestPushNotification-2026-04-19T16:50:23.257Z"],"workRunningCount":1}
-[debug] [2026-04-19T16:50:23.257Z] Accepted request POST /expo-starter-9daef/us-central1/sendTestPushNotification --> us-central1-sendTestPushNotification
-[debug] [2026-04-19T16:50:23.258Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}}
-[debug] [2026-04-19T16:50:23.259Z] [functions] Got req.url=/expo-starter-9daef/us-central1/sendTestPushNotification, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/expo-starter-9daef/us-central1/sendTestPushNotification, mapping to path=/"}}
-[debug] [2026-04-19T16:50:23.259Z] [worker-pool] submitRequest(triggerId=us-central1-sendTestPushNotification) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-sendTestPushNotification)"}}
-[info] i functions: Beginning execution of "us-central1-sendTestPushNotification" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Beginning execution of \"us-central1-sendTestPushNotification\""}}
-[debug] [2026-04-19T16:50:23.260Z] [worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: BUSY"}}
-[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}}
-[info] > {"uid":"O8lgsPxjejS7WZYVN1qa8wAZfiA2","response":[{"status":"error","message":"Unable to retrieve the FCM server key for the recipient's app. Make sure you have provided a server key as directed by the Expo FCM documentation.","details":{"error":"InvalidCredentials","fault":"developer"}}],"severity":"INFO","message":"Test push notification sent."} {"user":{"uid":"O8lgsPxjejS7WZYVN1qa8wAZfiA2","response":[{"status":"error","message":"Unable to retrieve the FCM server key for the recipient's app. Make sure you have provided a server key as directed by the Expo FCM documentation.","details":{"error":"InvalidCredentials","fault":"developer"}}],"severity":"INFO","message":"Test push notification sent."},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"uid\":\"O8lgsPxjejS7WZYVN1qa8wAZfiA2\",\"response\":[{\"status\":\"error\",\"message\":\"Unable to retrieve the FCM server key for the recipient's app. Make sure you have provided a server key as directed by the Expo FCM documentation.\",\"details\":{\"error\":\"InvalidCredentials\",\"fault\":\"developer\"}}],\"severity\":\"INFO\",\"message\":\"Test push notification sent.\"}"}}
-[debug] [2026-04-19T16:50:23.660Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finishing up request with event=pause"}}
-[info] i functions: Finished "us-central1-sendTestPushNotification" in 400.343794ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finished \"us-central1-sendTestPushNotification\" in 400.343794ms"}}
-[debug] [2026-04-19T16:50:23.660Z] [worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: IDLE"}}
-[debug] [2026-04-19T16:50:23.660Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finishing up request with event=finish"}}
-[debug] [2026-04-19T16:50:23.661Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finishing up request with event=close"}}
-[debug] [2026-04-19T16:50:23.661Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0}
-[debug] [2026-04-19T16:54:50.209Z] [work-queue] {"queuedWork":["/expo-starter-9daef/us-central1/sendTestPushNotification-2026-04-19T16:54:50.209Z"],"queueLength":1,"runningWork":[],"workRunningCount":0}
-[debug] [2026-04-19T16:54:50.209Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/expo-starter-9daef/us-central1/sendTestPushNotification-2026-04-19T16:54:50.209Z"],"workRunningCount":1}
-[debug] [2026-04-19T16:54:50.210Z] Accepted request POST /expo-starter-9daef/us-central1/sendTestPushNotification --> us-central1-sendTestPushNotification
-[debug] [2026-04-19T16:54:50.210Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}}
-[debug] [2026-04-19T16:54:50.211Z] [functions] Got req.url=/expo-starter-9daef/us-central1/sendTestPushNotification, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/expo-starter-9daef/us-central1/sendTestPushNotification, mapping to path=/"}}
-[debug] [2026-04-19T16:54:50.211Z] [worker-pool] submitRequest(triggerId=us-central1-sendTestPushNotification) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-sendTestPushNotification)"}}
-[info] i functions: Beginning execution of "us-central1-sendTestPushNotification" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Beginning execution of \"us-central1-sendTestPushNotification\""}}
-[debug] [2026-04-19T16:54:50.211Z] [worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: BUSY"}}
-[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}}
-[info] > {"uid":"O8lgsPxjejS7WZYVN1qa8wAZfiA2","response":[{"status":"ok","id":"019da6aa-95b7-71d2-94fb-4eba9aa8650e"}],"severity":"INFO","message":"Test push notification sent."} {"user":{"uid":"O8lgsPxjejS7WZYVN1qa8wAZfiA2","response":[{"status":"ok","id":"019da6aa-95b7-71d2-94fb-4eba9aa8650e"}],"severity":"INFO","message":"Test push notification sent."},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"uid\":\"O8lgsPxjejS7WZYVN1qa8wAZfiA2\",\"response\":[{\"status\":\"ok\",\"id\":\"019da6aa-95b7-71d2-94fb-4eba9aa8650e\"}],\"severity\":\"INFO\",\"message\":\"Test push notification sent.\"}"}}
-[debug] [2026-04-19T16:54:50.715Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finishing up request with event=pause"}}
-[info] i functions: Finished "us-central1-sendTestPushNotification" in 503.61932ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finished \"us-central1-sendTestPushNotification\" in 503.61932ms"}}
-[debug] [2026-04-19T16:54:50.715Z] [worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: IDLE"}}
-[debug] [2026-04-19T16:54:50.715Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finishing up request with event=finish"}}
-[debug] [2026-04-19T16:54:50.715Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finishing up request with event=close"}}
-[debug] [2026-04-19T16:54:50.715Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0}
-[debug] [2026-04-19T16:55:02.329Z] [work-queue] {"queuedWork":["/expo-starter-9daef/us-central1/sendTestPushNotification-2026-04-19T16:55:02.329Z"],"queueLength":1,"runningWork":[],"workRunningCount":0}
-[debug] [2026-04-19T16:55:02.329Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/expo-starter-9daef/us-central1/sendTestPushNotification-2026-04-19T16:55:02.329Z"],"workRunningCount":1}
-[debug] [2026-04-19T16:55:02.330Z] Accepted request POST /expo-starter-9daef/us-central1/sendTestPushNotification --> us-central1-sendTestPushNotification
-[debug] [2026-04-19T16:55:02.330Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}}
-[debug] [2026-04-19T16:55:02.330Z] [functions] Got req.url=/expo-starter-9daef/us-central1/sendTestPushNotification, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/expo-starter-9daef/us-central1/sendTestPushNotification, mapping to path=/"}}
-[debug] [2026-04-19T16:55:02.331Z] [worker-pool] submitRequest(triggerId=us-central1-sendTestPushNotification) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-sendTestPushNotification)"}}
-[info] i functions: Beginning execution of "us-central1-sendTestPushNotification" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Beginning execution of \"us-central1-sendTestPushNotification\""}}
-[debug] [2026-04-19T16:55:02.331Z] [worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: BUSY"}}
-[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}}
-[info] > {"uid":"O8lgsPxjejS7WZYVN1qa8wAZfiA2","response":[{"status":"ok","id":"019da6aa-c4a6-75d0-8e77-b9ff5b055321"}],"severity":"INFO","message":"Test push notification sent."} {"user":{"uid":"O8lgsPxjejS7WZYVN1qa8wAZfiA2","response":[{"status":"ok","id":"019da6aa-c4a6-75d0-8e77-b9ff5b055321"}],"severity":"INFO","message":"Test push notification sent."},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"uid\":\"O8lgsPxjejS7WZYVN1qa8wAZfiA2\",\"response\":[{\"status\":\"ok\",\"id\":\"019da6aa-c4a6-75d0-8e77-b9ff5b055321\"}],\"severity\":\"INFO\",\"message\":\"Test push notification sent.\"}"}}
-[debug] [2026-04-19T16:55:02.693Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finishing up request with event=pause"}}
-[info] i functions: Finished "us-central1-sendTestPushNotification" in 361.626998ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finished \"us-central1-sendTestPushNotification\" in 361.626998ms"}}
-[debug] [2026-04-19T16:55:02.693Z] [worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: IDLE"}}
-[debug] [2026-04-19T16:55:02.693Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finishing up request with event=finish"}}
-[debug] [2026-04-19T16:55:02.694Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"Finishing up request with event=close"}}
-[debug] [2026-04-19T16:55:02.694Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0}
-[debug] [2026-04-19T16:57:32.477Z] File /home/leon/Workspace/perso/starter/expo-starter/functions/src/notifications.ts changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /home/leon/Workspace/perso/starter/expo-starter/functions/src/notifications.ts changed, reloading triggers"}}
-[debug] [2026-04-19T16:57:33.478Z] Validating nodejs source
-[debug] [2026-04-19T16:57:33.929Z] > [functions] package.json contents: {
+[debug] [2026-04-20T06:14:50.136Z] Functions emulator received unknown request at path /favicon.ico
+[debug] [2026-04-20T06:17:58.356Z] File /home/leon/Workspace/perso/starter/expo-starter/functions/src/notifications.ts changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /home/leon/Workspace/perso/starter/expo-starter/functions/src/notifications.ts changed, reloading triggers"}}
+[debug] [2026-04-20T06:17:59.356Z] Validating nodejs source
+[debug] [2026-04-20T06:17:59.732Z] > [functions] package.json contents: {
"name": "functions",
"scripts": {
"lint": "ESLINT_USE_FLAT_CONFIG=false eslint --ext .js,.ts src",
@@ -201,17 +119,61 @@ Issues? Report them at https://github.com/firebase/firebase-tools/issues and att
},
"private": true
}
-[debug] [2026-04-19T16:57:33.929Z] Building nodejs source
-[debug] [2026-04-19T16:57:33.929Z] Failed to find version of module node: reached end of search path /home/leon/Workspace/perso/starter/expo-starter/functions/node_modules
+[debug] [2026-04-20T06:17:59.732Z] Building nodejs source
+[debug] [2026-04-20T06:17:59.732Z] Failed to find version of module node: reached end of search path /home/leon/Workspace/perso/starter/expo-starter/functions/node_modules
[warn] ⚠ functions: You've requested "node" version "24", but the standalone Firebase CLI comes with bundled Node "20".
[info] ✔ functions: To use a different Node.js version, consider removing the standalone Firebase CLI and switching to "firebase-tools" on npm.
-[debug] [2026-04-19T16:57:33.930Z] Could not find functions.yaml. Must use http discovery
-[debug] [2026-04-19T16:57:33.930Z] Found firebase-functions binary at '/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/.bin/firebase-functions'
-[info] Serving at port 8523
+[debug] [2026-04-20T06:17:59.733Z] Could not find functions.yaml. Must use http discovery
+[debug] [2026-04-20T06:17:59.734Z] Found firebase-functions binary at '/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/.bin/firebase-functions'
+[info] Serving at port 8152
-[debug] [2026-04-19T16:57:34.271Z] Got response from /__/functions.yaml {"endpoints":{"deleteUserAuthOnUserDocumentDeleted":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":10,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.deleted","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"users/{uid}"},"retry":false},"entryPoint":"deleteUserAuthOnUserDocumentDeleted"},"sendTestPushNotification":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":10,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"sendTestPushNotification"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}}
+[debug] [2026-04-20T06:18:00.131Z] Got response from /__/functions.yaml {"endpoints":{"deleteUserAuthOnUserDocumentDeleted":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":10,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.deleted","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"users/{uid}"},"retry":false},"entryPoint":"deleteUserAuthOnUserDocumentDeleted"},"sendTestPushNotification":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":10,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"sendTestPushNotification"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}}
+[info] ✔ functions: Loaded functions definitions from source: deleteUserAuthOnUserDocumentDeleted, sendTestPushNotification. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: deleteUserAuthOnUserDocumentDeleted, sendTestPushNotification."}}
+[debug] [2026-04-20T06:18:04.814Z] File /home/leon/Workspace/perso/starter/expo-starter/functions/lib/users.js.map changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /home/leon/Workspace/perso/starter/expo-starter/functions/lib/users.js.map changed, reloading triggers"}}
+[debug] [2026-04-20T06:18:04.814Z] File /home/leon/Workspace/perso/starter/expo-starter/functions/lib/users.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /home/leon/Workspace/perso/starter/expo-starter/functions/lib/users.js changed, reloading triggers"}}
+[debug] [2026-04-20T06:18:04.821Z] File /home/leon/Workspace/perso/starter/expo-starter/functions/lib/notifications.js.map changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /home/leon/Workspace/perso/starter/expo-starter/functions/lib/notifications.js.map changed, reloading triggers"}}
+[debug] [2026-04-20T06:18:04.822Z] File /home/leon/Workspace/perso/starter/expo-starter/functions/lib/notifications.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /home/leon/Workspace/perso/starter/expo-starter/functions/lib/notifications.js changed, reloading triggers"}}
+[debug] [2026-04-20T06:18:04.823Z] File /home/leon/Workspace/perso/starter/expo-starter/functions/lib/index.js.map changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /home/leon/Workspace/perso/starter/expo-starter/functions/lib/index.js.map changed, reloading triggers"}}
+[debug] [2026-04-20T06:18:04.823Z] File /home/leon/Workspace/perso/starter/expo-starter/functions/lib/index.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /home/leon/Workspace/perso/starter/expo-starter/functions/lib/index.js changed, reloading triggers"}}
+[debug] [2026-04-20T06:18:05.823Z] Validating nodejs source
+[debug] [2026-04-20T06:18:06.192Z] > [functions] package.json contents: {
+ "name": "functions",
+ "scripts": {
+ "lint": "ESLINT_USE_FLAT_CONFIG=false eslint --ext .js,.ts src",
+ "build": "tsc",
+ "build:watch": "tsc --watch",
+ "serve": "npm run build && firebase emulators:start --only functions",
+ "shell": "npm run build && firebase functions:shell",
+ "start": "npm run shell",
+ "deploy": "firebase deploy --only functions",
+ "logs": "firebase functions:log"
+ },
+ "engines": {
+ "node": "24"
+ },
+ "main": "lib/index.js",
+ "dependencies": {
+ "firebase-admin": "^13.6.0",
+ "firebase-functions": "^7.0.0"
+ },
+ "devDependencies": {
+ "@typescript-eslint/eslint-plugin": "^5.12.0",
+ "@typescript-eslint/parser": "^5.12.0",
+ "eslint": "^8.9.0",
+ "eslint-config-google": "^0.14.0",
+ "eslint-plugin-import": "^2.25.4",
+ "firebase-functions-test": "^3.4.1",
+ "typescript": "^6.0.0"
+ },
+ "private": true
+}
+[debug] [2026-04-20T06:18:06.192Z] Building nodejs source
+[debug] [2026-04-20T06:18:06.192Z] Failed to find version of module node: reached end of search path /home/leon/Workspace/perso/starter/expo-starter/functions/node_modules
+[warn] ⚠ functions: You've requested "node" version "24", but the standalone Firebase CLI comes with bundled Node "20".
+[info] ✔ functions: To use a different Node.js version, consider removing the standalone Firebase CLI and switching to "firebase-tools" on npm.
+[debug] [2026-04-20T06:18:06.193Z] Could not find functions.yaml. Must use http discovery
+[debug] [2026-04-20T06:18:06.193Z] Found firebase-functions binary at '/home/leon/Workspace/perso/starter/expo-starter/functions/node_modules/.bin/firebase-functions'
+[info] Serving at port 8735
+
+[debug] [2026-04-20T06:18:06.554Z] Got response from /__/functions.yaml {"endpoints":{"deleteUserAuthOnUserDocumentDeleted":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":10,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.deleted","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"users/{uid}"},"retry":false},"entryPoint":"deleteUserAuthOnUserDocumentDeleted"},"sendTestPushNotification":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":10,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"sendTestPushNotification"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}}
[info] ✔ functions: Loaded functions definitions from source: deleteUserAuthOnUserDocumentDeleted, sendTestPushNotification. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: deleteUserAuthOnUserDocumentDeleted, sendTestPushNotification."}}
-[debug] [2026-04-19T16:57:38.293Z] [worker-pool] Shutting down IDLE worker (us-central1-sendTestPushNotification) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] Shutting down IDLE worker (us-central1-sendTestPushNotification)"}}
-[debug] [2026-04-19T16:57:38.293Z] [worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: FINISHING {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: FINISHING"}}
-[debug] [2026-04-19T16:57:38.302Z] [worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: exited {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: exited"}}
-[debug] [2026-04-19T16:57:38.302Z] [worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: FINISHED {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-sendTestPushNotification"},"extension":{},"message":"[worker-us-central1-sendTestPushNotification-b55f52a6-94a7-4563-9b9b-a70f4e52f589]: FINISHED"}}
diff --git a/functions/src/notifications.ts b/functions/src/notifications.ts
index 6a0bf15..851cbd4 100644
--- a/functions/src/notifications.ts
+++ b/functions/src/notifications.ts
@@ -22,6 +22,11 @@ type ExpoPushResponse = {
errors?: unknown[];
};
+function isExpoPushToken(token: string) {
+ return token.startsWith("ExponentPushToken[") ||
+ token.startsWith("ExpoPushToken[");
+}
+
/**
* Sends one or more push notifications through the Expo Push API.
* @param {ExpoPushMessage[]} messages Notification payloads to send.
@@ -55,7 +60,7 @@ export const sendTestPushNotification = onCall(async (request) => {
const userSnapshot = await db.doc(`users/${request.auth.uid}`).get();
const user = userSnapshot.data() as UserDocument | undefined;
- const expoPushTokens = user?.expoPushTokens ?? [];
+ const expoPushTokens = (user?.expoPushTokens ?? []).filter(isExpoPushToken);
if (expoPushTokens.length === 0) {
throw new HttpsError(
diff --git a/lib/firebase.ts b/lib/firebase.ts
index 3391289..f795cb1 100644
--- a/lib/firebase.ts
+++ b/lib/firebase.ts
@@ -32,7 +32,7 @@ const firebaseConfig = {
const isAppInitialized = getApps().length > 0;
const app = isAppInitialized ? getApps()[0] : initializeApp(firebaseConfig);
const useFirebaseEmulators = true;
-const firebaseEmulatorHost = '192.168.1.171';
+const firebaseEmulatorHost = '192.168.1.127';
const reactNativeAuth =
Platform.OS === 'web'
? null
diff --git a/providers/AuthProvider.tsx b/providers/AuthProvider.tsx
index 3231d59..cb19ab3 100644
--- a/providers/AuthProvider.tsx
+++ b/providers/AuthProvider.tsx
@@ -29,7 +29,7 @@ export function AuthProvider({ children }: PropsWithChildren) {
const [authUser, setAuthUser] = useState(null);
const [user, setUser] = useState(null);
const [initializing, setInitializing] = useState(true);
-
+ console.log("user is ", JSON.stringify(user))
useEffect(() => {
let unsubscribeUserSnapshot: (() => void) | undefined;
diff --git a/services/auth.ts b/services/auth.ts
index 1c3c498..122a105 100644
--- a/services/auth.ts
+++ b/services/auth.ts
@@ -39,7 +39,7 @@ export async function registerWithEmail({
await setDoc(userDocRef(credential.user.uid), {
uid: credential.user.uid,
- email: credential.user.email ?? normalizedEmail,
+ email: normalizedEmail,
username: normalizedUsername,
profilePicture: credential.user.photoURL,
expoPushTokens: [],
diff --git a/services/notifications.ts b/services/notifications.ts
index b4ed161..1b5a340 100644
--- a/services/notifications.ts
+++ b/services/notifications.ts
@@ -14,8 +14,8 @@ import { userDocRef } from '@/lib/firestore';
Notifications.setNotificationHandler({
handleNotification: async () => ({
- shouldPlaySound: false,
- shouldSetBadge: false,
+ shouldPlaySound: true,
+ shouldSetBadge: true,
shouldShowBanner: true,
shouldShowList: true,
}),
@@ -24,17 +24,28 @@ Notifications.setNotificationHandler({
type NotificationSettingsPayload = {
expoPushToken: string | null;
pushEnabled: boolean;
- platform: 'android' | 'ios' | 'web' | null;
+ platform: 'android' | 'ios' | null;
};
type SendTestPushNotificationResult = {
success: boolean;
};
+function isExpoPushToken(token: string) {
+ return (
+ token.startsWith('ExponentPushToken[') ||
+ token.startsWith('ExpoPushToken[')
+ );
+}
+
async function saveExpoPushToken(
uid: string,
expoPushToken: string
) {
+ if (!isExpoPushToken(expoPushToken)) {
+ return;
+ }
+
await setDoc(
userDocRef(uid),
{
@@ -95,6 +106,10 @@ export function subscribeToPushTokenRefresh(uid: string) {
}
const subscription = Notifications.addPushTokenListener((token) => {
+ if (!isExpoPushToken(token.data)) {
+ return;
+ }
+
void saveExpoPushToken(uid, token.data);
});