mirror of
https://github.com/movie-web/native-app.git
synced 2025-09-13 18:13:25 +00:00
56 lines
1.6 KiB
TypeScript
56 lines
1.6 KiB
TypeScript
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<DownloadItemProps> = ({
|
|
filename,
|
|
progress,
|
|
speed,
|
|
fileSize,
|
|
downloaded,
|
|
}) => {
|
|
const percentage = (progress * 100).toFixed(0);
|
|
const formattedFileSize = formatBytes(fileSize);
|
|
const formattedDownloaded = formatBytes(downloaded);
|
|
|
|
return (
|
|
<View className="mb-4 rounded-lg border border-gray-300 p-4">
|
|
<Text className="mb-2 text-lg text-gray-200">{filename}</Text>
|
|
<ProgressBar
|
|
progress={progress}
|
|
width={null}
|
|
color={colors.primary[400]}
|
|
unfilledColor={colors.gray[200]}
|
|
borderWidth={0}
|
|
height={10}
|
|
borderRadius={5}
|
|
/>
|
|
<View className="mt-2 flex-row items-center justify-between">
|
|
<Text className="text-sm text-gray-600">
|
|
{percentage}% - {formattedDownloaded} of {formattedFileSize}
|
|
</Text>
|
|
<Text className="text-sm text-gray-600">{speed} MB/s</Text>
|
|
</View>
|
|
</View>
|
|
);
|
|
};
|