From 0640144e6bcd9ddf2d56ead0c51156a9ab814895 Mon Sep 17 00:00:00 2001 From: Luna Date: Mon, 30 Mar 2026 20:35:12 +0200 Subject: [PATCH] feat: add alert sound for timer and time-until done --- App.js | 18 ++++++++++++++++++ package-lock.json | 27 ++++++++++++++++++--------- package.json | 1 + 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/App.js b/App.js index 367f240..8f0034f 100644 --- a/App.js +++ b/App.js @@ -3,6 +3,7 @@ import { BackHandler, Platform, StatusBar, Modal, View, Image, StyleSheet, Butto import * as ScreenOrientation from 'expo-screen-orientation'; import * as SplashScreen from 'expo-splash-screen'; import { Accelerometer } from 'expo-sensors'; +import { Audio } from 'expo-av'; import FocusScreen from './src/screens/FocusScreen'; import HomeScreen from './src/screens/HomeScreen'; import TimeUntilScreen from './src/screens/TimeUntilScreen'; @@ -194,6 +195,23 @@ export default function App() { const timerSec = timerRemaining % 60; const tuCountdown = getTuCountdown(); + const playSound = async () => { + try { + const { sound } = await Audio.Sound.createAsync( + { uri: 'https://shx.reversed.dev/u/mCgT76.mp3' }, + { shouldPlay: true, volume: 1.0 } + ); + } catch (error) { + console.log('Error playing sound:', error); + } + }; + + useEffect(() => { + if (timerDone || tuIsOver) { + playSound(); + } + }, [timerDone, tuIsOver]); + if (focusMode) { return ( =6.9.0" } @@ -3824,7 +3823,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4432,7 +4430,6 @@ "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.33.tgz", "integrity": "sha512-3yOEfAKqo+gqHcV8vKcnq0uA5zxlohnhA3fu4G43likN8ct5ZZ3LjAh9wDdKteEkoad3tFPvwxmXW711S5OHUw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", "@expo/cli": "54.0.23", @@ -4480,6 +4477,23 @@ } } }, + "node_modules/expo-av": { + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/expo-av/-/expo-av-16.0.8.tgz", + "integrity": "sha512-cmVPftGR/ca7XBgs7R6ky36lF3OC0/MM/lpgX/yXqfv0jASTsh7AYX9JxHCwFmF+Z6JEB1vne9FDx4GiLcGreQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, "node_modules/expo-modules-autolinking": { "version": "3.0.24", "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", @@ -4957,7 +4971,6 @@ "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.11.tgz", "integrity": "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==", "license": "MIT", - "peer": true, "dependencies": { "fontfaceobserver": "^2.1.0" }, @@ -7526,7 +7539,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.26.0" }, @@ -7545,7 +7557,6 @@ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.5.tgz", "integrity": "sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==", "license": "MIT", - "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.81.5", @@ -7729,7 +7740,6 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -8607,7 +8617,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, diff --git a/package.json b/package.json index 5d3608f..9318dec 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "expo": "~54.0.33", + "expo-av": "^16.0.8", "expo-screen-orientation": "~9.0.8", "expo-sensors": "^55.0.8", "expo-splash-screen": "^55.0.10",