feat: continue music when app is closed

This commit is contained in:
2026-01-12 09:44:50 +01:00
parent eb820a149c
commit 85c6084351
5 changed files with 60 additions and 39 deletions
+49 -33
View File
@@ -1,4 +1,8 @@
import { useAudioPlayer, useAudioPlayerStatus } from "expo-audio";
import {
setAudioModeAsync,
useAudioPlayer,
useAudioPlayerStatus,
} from "expo-audio";
import React, {
createContext,
useCallback,
@@ -63,8 +67,8 @@ const HIDDEN_ROUTE_NAMES = new Set([
Routes.Register,
]);
const noopAsync = async () => {};
const noop = () => {};
const noopAsync = async () => { };
const noop = () => { };
const DEFAULT_CONTEXT = {
currentTrack: null,
@@ -274,36 +278,36 @@ const PlayerProvider = ({ children }) => {
(items = [], options = {}) => {
const normalized = Array.isArray(items)
? items
.map((item) => {
if (!item) return null;
if (typeof item === "object") {
const { metadata, context, ...rest } = item;
const safeMetadata =
metadata && typeof metadata === "object"
? { ...metadata }
: undefined;
if (safeMetadata) {
delete safeMetadata.queue;
}
const safeContext =
context && typeof context === "object"
? { ...context }
: undefined;
if (safeContext) {
delete safeContext.queue;
}
return normalizeTrack(
{
...rest,
...(safeMetadata ? { metadata: safeMetadata } : {}),
...(safeContext ? { context: safeContext } : {}),
},
{}
);
.map((item) => {
if (!item) return null;
if (typeof item === "object") {
const { metadata, context, ...rest } = item;
const safeMetadata =
metadata && typeof metadata === "object"
? { ...metadata }
: undefined;
if (safeMetadata) {
delete safeMetadata.queue;
}
return normalizeTrack(item, {});
})
.filter((track) => !!track?.source)
const safeContext =
context && typeof context === "object"
? { ...context }
: undefined;
if (safeContext) {
delete safeContext.queue;
}
return normalizeTrack(
{
...rest,
...(safeMetadata ? { metadata: safeMetadata } : {}),
...(safeContext ? { context: safeContext } : {}),
},
{}
);
}
return normalizeTrack(item, {});
})
.filter((track) => !!track?.source)
: [];
queueRef.current = normalized;
@@ -374,6 +378,18 @@ const PlayerProvider = ({ children }) => {
return Platform.OS === "web" ? ms : ms / 1000;
}, []);
useEffect(() => {
setAudioModeAsync({
playsInSilentMode: true,
shouldPlayInBackground: true,
interruptionMode: "doNotMix",
allowsRecording: false,
shouldRouteThroughEarpiece: false,
}).catch((err) =>
console.warn("PlayerProvider: impossible de configurer le mode audio", err)
);
}, []);
useEffect(() => {
if (!status) return;
@@ -450,7 +466,7 @@ const PlayerProvider = ({ children }) => {
if (!player) return;
try {
player.loop = !!isLooping;
} catch (_err) {}
} catch (_err) { }
}, [player, isLooping]);
const seekDebounceRef = useRef(null);
+3 -4
View File
@@ -1,11 +1,10 @@
import React from "react";
import { ShakeReportProvider } from "expo-minuit-shake-report";
import SharedProviders from "./SharedProviders";
export default ({ children }) => {
return (
<ShakeReportProvider projectID="musicland" defaultEmail="user@email.com">
<SharedProviders>{children}</SharedProviders>
</ShakeReportProvider>
// <ShakeReportProvider projectID="musicland" defaultEmail="user@email.com">
<SharedProviders>{children}</SharedProviders>
// </ShakeReportProvider>
);
};