chore: add repro button for expo issue lol

This commit is contained in:
Adrian Castro
2024-03-26 11:39:37 +01:00
parent 2b77651322
commit 800f0c3481
2 changed files with 41 additions and 7 deletions

View File

@@ -1,29 +1,57 @@
import type { Asset } from "expo-media-library"; import type { Asset } from "expo-media-library";
import React from "react"; import React from "react";
import { Platform } from "react-native";
import { ScrollView } from "react-native-gesture-handler"; import { ScrollView } from "react-native-gesture-handler";
import { useRouter } from "expo-router"; import { useRouter } from "expo-router";
import { MaterialCommunityIcons } from "@expo/vector-icons";
import { useTheme } from "tamagui";
import { DownloadItem } from "~/components/DownloadItem"; import { DownloadItem } from "~/components/DownloadItem";
import ScreenLayout from "~/components/layout/ScreenLayout"; import ScreenLayout from "~/components/layout/ScreenLayout";
import { MWButton } from "~/components/ui/Button";
import { useDownloadManager } from "~/hooks/DownloadManagerContext"; import { useDownloadManager } from "~/hooks/DownloadManagerContext";
import { usePlayerStore } from "~/stores/player/store"; import { usePlayerStore } from "~/stores/player/store";
const DownloadsScreen: React.FC = () => { const DownloadsScreen: React.FC = () => {
const { downloads, removeDownload } = useDownloadManager(); const { startDownload, downloads, removeDownload } = useDownloadManager();
const resetVideo = usePlayerStore((state) => state.resetVideo); const resetVideo = usePlayerStore((state) => state.resetVideo);
const setAsset = usePlayerStore((state) => state.setAsset);
const router = useRouter(); const router = useRouter();
const theme = useTheme();
const handlePress = (asset?: Asset) => { const handlePress = (asset?: Asset) => {
if (!asset) return; if (!asset) return;
resetVideo(); resetVideo();
setAsset(asset);
router.push({ router.push({
pathname: "/videoPlayer", pathname: "/videoPlayer",
params: { data: JSON.stringify(asset) },
}); });
}; };
return ( return (
<ScreenLayout title="Downloads"> <ScreenLayout title="Downloads">
<MWButton
type="secondary"
backgroundColor="$sheetItemBackground"
icon={
<MaterialCommunityIcons
name={Platform.select({ ios: "apple", android: "android" })}
size={24}
color={theme.buttonSecondaryText.val}
/>
}
onPress={async () => {
const asset = await startDownload(
"https://samplelib.com/lib/preview/mp4/sample-5s.mp4",
"mp4",
).catch(console.error);
if (asset) {
handlePress(asset);
}
}}
>
test local playback (expo-av)
</MWButton>
<ScrollView> <ScrollView>
{downloads.map((item) => ( {downloads.map((item) => (
<DownloadItem <DownloadItem

View File

@@ -23,7 +23,7 @@ export interface DownloadItem {
interface DownloadManagerContextType { interface DownloadManagerContextType {
downloads: DownloadItem[]; downloads: DownloadItem[];
startDownload: (url: string, type: "mp4" | "hls") => Promise<void>; startDownload: (url: string, type: "mp4" | "hls") => Promise<Asset | void>;
removeDownload: (id: string) => void; removeDownload: (id: string) => void;
} }
@@ -66,7 +66,7 @@ export const DownloadManagerProvider: React.FC<{ children: ReactNode }> = ({
url: string, url: string,
type: "mp4" | "hls", type: "mp4" | "hls",
headers?: Record<string, string>, headers?: Record<string, string>,
) => { ): Promise<Asset | void> => {
toastController.show("Download started", { toastController.show("Download started", {
burntOptions: { preset: "none" }, burntOptions: { preset: "none" },
native: true, native: true,
@@ -87,7 +87,8 @@ export const DownloadManagerProvider: React.FC<{ children: ReactNode }> = ({
setDownloads((currentDownloads) => [newDownload, ...currentDownloads]); setDownloads((currentDownloads) => [newDownload, ...currentDownloads]);
if (type === "mp4") { if (type === "mp4") {
await downloadMP4(url, newDownload.id, headers ?? {}); const asset = await downloadMP4(url, newDownload.id, headers ?? {});
return asset;
} else if (type === "hls") { } else if (type === "hls") {
// HLS stuff later // HLS stuff later
} }
@@ -151,7 +152,11 @@ export const DownloadManagerProvider: React.FC<{ children: ReactNode }> = ({
const result = await downloadResumable.downloadAsync(); const result = await downloadResumable.downloadAsync();
if (result) { if (result) {
console.log("Finished downloading to ", result.uri); console.log("Finished downloading to ", result.uri);
await saveFileToMediaLibraryAndDeleteOriginal(result.uri, downloadId); const asset = await saveFileToMediaLibraryAndDeleteOriginal(
result.uri,
downloadId,
);
return asset;
} }
} catch (e) { } catch (e) {
console.error(e); console.error(e);
@@ -161,7 +166,7 @@ export const DownloadManagerProvider: React.FC<{ children: ReactNode }> = ({
const saveFileToMediaLibraryAndDeleteOriginal = async ( const saveFileToMediaLibraryAndDeleteOriginal = async (
fileUri: string, fileUri: string,
downloadId: string, downloadId: string,
) => { ): Promise<Asset | void> => {
try { try {
updateDownloadItem(downloadId, { statusText: "Importing" }); updateDownloadItem(downloadId, { statusText: "Importing" });
@@ -183,6 +188,7 @@ export const DownloadManagerProvider: React.FC<{ children: ReactNode }> = ({
burntOptions: { preset: "done" }, burntOptions: { preset: "done" },
native: true, native: true,
}); });
return asset;
} catch (error) { } catch (error) {
console.error("Error saving file to media library:", error); console.error("Error saving file to media library:", error);
toastController.show("Download failed", { toastController.show("Download failed", {