From 0dbfd4c2bead42ef075da59365fb2a0407362b7e Mon Sep 17 00:00:00 2001 From: Adrian Castro <22133246+castdrian@users.noreply.github.com> Date: Tue, 5 Mar 2024 19:53:24 +0100 Subject: [PATCH] feat: downloaditem placeholder --- apps/expo/package.json | 1 + apps/expo/src/app/(tabs)/downloads.tsx | 28 +++++++++++- apps/expo/src/components/DownloadItem.tsx | 55 +++++++++++++++++++++++ pnpm-lock.yaml | 12 +++++ 4 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 apps/expo/src/components/DownloadItem.tsx diff --git a/apps/expo/package.json b/apps/expo/package.json index b152b72..82e49a6 100644 --- a/apps/expo/package.json +++ b/apps/expo/package.json @@ -49,6 +49,7 @@ "react-native-css-interop": "^0.0.35", "react-native-gesture-handler": "~2.14.1", "react-native-modal": "^13.0.1", + "react-native-progress": "^5.0.1", "react-native-quick-base64": "^2.0.8", "react-native-quick-crypto": "^0.6.1", "react-native-reanimated": "~3.6.2", diff --git a/apps/expo/src/app/(tabs)/downloads.tsx b/apps/expo/src/app/(tabs)/downloads.tsx index f1dbb9e..d496dee 100644 --- a/apps/expo/src/app/(tabs)/downloads.tsx +++ b/apps/expo/src/app/(tabs)/downloads.tsx @@ -1,10 +1,34 @@ +import { ScrollView } from "react-native-gesture-handler"; + +import type { DownloadItemProps } from "~/components/DownloadItem"; +import { DownloadItem } from "~/components/DownloadItem"; import ScreenLayout from "~/components/layout/ScreenLayout"; -import { Text } from "~/components/ui/Text"; export default function DownloadsScreen() { + const downloads: DownloadItemProps[] = [ + { + filename: "episode.mp4", + progress: 0.3, + speed: 1.2, + fileSize: 500 * 1024 * 1024, + downloaded: 150 * 1024 * 1024, + }, + { + filename: "episode.m3u8", + progress: 0.7, + speed: 0.8, + fileSize: 200 * 1024 * 1024, + downloaded: 140 * 1024 * 1024, + }, + ]; + return ( - Downloads tab + + {downloads.map((item, index) => ( + + ))} + ); } diff --git a/apps/expo/src/components/DownloadItem.tsx b/apps/expo/src/components/DownloadItem.tsx new file mode 100644 index 0000000..6e56497 --- /dev/null +++ b/apps/expo/src/components/DownloadItem.tsx @@ -0,0 +1,55 @@ +import React from "react"; +import { Text, View } from "react-native"; +import { Bar as ProgressBar } from "react-native-progress"; + +import colors from "@movie-web/tailwind-config/colors"; + +export interface DownloadItemProps { + filename: string; + progress: number; + speed: number; + fileSize: number; + downloaded: number; +} + +const formatBytes = (bytes: number, decimals = 2) => { + if (bytes === 0) return "0 Bytes"; + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i]; +}; + +export const DownloadItem: React.FC = ({ + filename, + progress, + speed, + fileSize, + downloaded, +}) => { + const percentage = (progress * 100).toFixed(0); + const formattedFileSize = formatBytes(fileSize); + const formattedDownloaded = formatBytes(downloaded); + + return ( + + {filename} + + + + {percentage}% - {formattedDownloaded} of {formattedFileSize} + + {speed} MB/s + + + ); +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24e29a5..7e6911d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -119,6 +119,9 @@ importers: react-native-modal: specifier: ^13.0.1 version: 13.0.1(react-native@0.73.2)(react@18.2.0) + react-native-progress: + specifier: ^5.0.1 + version: 5.0.1(react-native-svg@14.1.0) react-native-quick-base64: specifier: ^2.0.8 version: 2.0.8(react-native@0.73.2)(react@18.2.0) @@ -9253,6 +9256,15 @@ packages: react-native-animatable: 1.3.3 dev: false + /react-native-progress@5.0.1(react-native-svg@14.1.0): + resolution: {integrity: sha512-TYfJ4auAe5vubDma2yfFvt7ktSI+UCfysqJnkdHEcLXqAitRFOozgF/cLgN5VNi/iLdaf3ga1ETi2RF4jVZ/+g==} + peerDependencies: + react-native-svg: '*' + dependencies: + prop-types: 15.8.1 + react-native-svg: 14.1.0(react-native@0.73.2)(react@18.2.0) + dev: false + /react-native-quick-base64@2.0.8(react-native@0.73.2)(react@18.2.0): resolution: {integrity: sha512-2kMlnLSy0qz4NA0KXMGugd3qNB5EAizxZ6ghEVNGIxAOlc9CGvC8miv35wgpFbSKeiaBRfcPfkdTM/5Erb/6SQ==} peerDependencies: