From 756c904bbbdde3f55cbb544f83c831a45c359642 Mon Sep 17 00:00:00 2001 From: mbaharip <62494292+mbahArip@users.noreply.github.com> Date: Fri, 24 Jan 2025 17:49:11 +0700 Subject: [PATCH] update: Move media icons to lib --- src/lib/previewHelper.ts | 137 ----------- src/lib/previewHelper.tsx | 499 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 499 insertions(+), 137 deletions(-) delete mode 100644 src/lib/previewHelper.ts create mode 100644 src/lib/previewHelper.tsx diff --git a/src/lib/previewHelper.ts b/src/lib/previewHelper.ts deleted file mode 100644 index 72292dc..0000000 --- a/src/lib/previewHelper.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { type icons } from "lucide-react"; - -type FileTypes = - | "image" - | "video" - | "audio" - | "markdown" - | "pdf" - | "document" - | "code" - | "text" - | "manga" - | "executable"; - -/** - * File extensions and their corresponding file types - * Add more file extensions if needed - */ -const extensionsMap: Record = { - image: ["png", "jpg", "jpeg", "gif", "webp", "svg", "ico", "bmp", "avif"], - video: [ - "mp4", - "mkv", - "webm", - // "avi", - // "mov", - // "flv", - // "wmv", - "mpg", - "mpeg", - "m4v", - "3gp", - ], - audio: ["mp3", "ogg", "wav", "flac", "m4a", "wma", "aac"], - markdown: ["md"], - pdf: ["pdf"], - document: ["odt", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "csv"], - executable: ["exe", "msi"], - code: [ - "html", - "css", - "js", - "ts", - "tsx", - "jsx", - "vue", - "py", - "php", - "go", - "java", - "c", - "cpp", - "h", - "hpp", - "cs", - "swift", - "kt", - "vb", - "rs", - "rb", - "pl", - "sh", - "sql", - "json", - "xml", - "yml", - "yaml", - "toml", - "ini", - "cfg", - "env", - "lock", - ], - text: ["txt"], - manga: ["cbz"], -}; - -/** - * Icon for each file type - * Use icons from lucide - * https://lucide.dev/icons/ - */ -const iconMap: Record = { - image: "Image", - audio: "Music", - video: "Video", - markdown: "FileType", - pdf: "FileText", - document: "FileSpreadsheet", - code: "Code", - executable: "AppWindow", - text: "Text", - manga: "BookText", - unknown: "File", -}; - -/** - * Get file type based on file extension and mime type - * @param fileExtension - * @param mimeType - * @returns FileTypes or "unknown" - */ -export function getFileType(fileExtension: string, mimeType: string): FileTypes | "unknown" { - // Handle .ts video file - if (fileExtension === "ts") { - if (mimeType.includes("video")) { - return "video"; - } else { - return "code"; - } - } - const type = Object.keys(extensionsMap).find((key) => - extensionsMap[key as keyof typeof extensionsMap].includes(fileExtension), - ); - - return type ? (type as FileTypes) : "unknown"; -} - -/** - * Get icon for file preview based on file extension and mime type - * @param fileExtension - * @param mimeType - * @returns Icon component - */ -export function getPreviewIcon(fileExtension: string, mimeType: string) { - if (fileExtension === "ts") { - if (mimeType.includes("video")) { - return iconMap.video; - } else { - return iconMap.code; - } - } - const type = Object.keys(extensionsMap).find((key) => - extensionsMap[key as keyof typeof extensionsMap].includes(fileExtension), - ); - return iconMap[type as keyof typeof iconMap] ?? iconMap.unknown; -} diff --git a/src/lib/previewHelper.tsx b/src/lib/previewHelper.tsx new file mode 100644 index 0000000..64185bb --- /dev/null +++ b/src/lib/previewHelper.tsx @@ -0,0 +1,499 @@ +import { defaultLayoutIcons } from "@vidstack/react/player/layouts/default"; +import { type icons } from "lucide-react"; + +import Icon from "~/components/ui/icon"; + +type FileTypes = + | "image" + | "video" + | "audio" + | "markdown" + | "pdf" + | "document" + | "code" + | "text" + | "manga" + | "executable"; + +/** + * File extensions and their corresponding file types + * Add more file extensions if needed + */ +const extensionsMap: Record = { + image: ["png", "jpg", "jpeg", "gif", "webp", "svg", "ico", "bmp", "avif"], + video: [ + "mp4", + "mkv", + "webm", + // "avi", + // "mov", + // "flv", + // "wmv", + "mpg", + "mpeg", + "m4v", + "3gp", + ], + audio: ["mp3", "ogg", "wav", "flac", "m4a", "wma", "aac"], + markdown: ["md"], + pdf: ["pdf"], + document: ["odt", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "csv"], + executable: ["exe", "msi"], + code: [ + "html", + "css", + "js", + "ts", + "tsx", + "jsx", + "vue", + "py", + "php", + "go", + "java", + "c", + "cpp", + "h", + "hpp", + "cs", + "swift", + "kt", + "vb", + "rs", + "rb", + "pl", + "sh", + "sql", + "json", + "xml", + "yml", + "yaml", + "toml", + "ini", + "cfg", + "env", + "lock", + ], + text: ["txt"], + manga: ["cbz"], +}; + +/** + * Icon for each file type + * Use icons from lucide + * https://lucide.dev/icons/ + */ +const iconMap: Record = { + image: "Image", + audio: "Music", + video: "Video", + markdown: "FileType", + pdf: "FileText", + document: "FileSpreadsheet", + code: "Code", + executable: "AppWindow", + text: "Text", + manga: "BookText", + unknown: "File", +}; + +/** + * Get file type based on file extension and mime type + * @param fileExtension + * @param mimeType + * @returns FileTypes or "unknown" + */ +export function getFileType(fileExtension: string, mimeType: string): FileTypes | "unknown" { + // Handle .ts video file + if (fileExtension === "ts") { + if (mimeType.includes("video")) { + return "video"; + } else { + return "code"; + } + } + const type = Object.keys(extensionsMap).find((key) => + extensionsMap[key as keyof typeof extensionsMap].includes(fileExtension), + ); + + return type ? (type as FileTypes) : "unknown"; +} + +/** + * Get icon for file preview based on file extension and mime type + * @param fileExtension + * @param mimeType + * @returns Icon component + */ +export function getPreviewIcon(fileExtension: string, mimeType: string) { + if (fileExtension === "ts") { + if (mimeType.includes("video")) { + return iconMap.video; + } else { + return iconMap.code; + } + } + const type = Object.keys(extensionsMap).find((key) => + extensionsMap[key as keyof typeof extensionsMap].includes(fileExtension), + ); + return iconMap[type as keyof typeof iconMap] ?? iconMap.unknown; +} + +export const MediaPlayerIcons = { + ...defaultLayoutIcons, + AirPlayButton: { + Default: () => ( + + ), + Connecting: () => ( + + ), + Connected: () => ( + + ), + }, + GoogleCastButton: { + Default: () => ( + + ), + Connecting: () => ( + + ), + Connected: () => ( + + ), + }, + PlayButton: { + Play: () => ( + + ), + Pause: () => ( + + ), + Replay: () => ( + + ), + }, + MuteButton: { + Mute: () => ( + + ), + VolumeLow: () => ( + + ), + VolumeHigh: () => ( + + ), + }, + CaptionButton: { + On: () => ( + + ), + Off: () => ( + + ), + }, + PIPButton: { + Enter: () => ( + + ), + Exit: () => ( + + ), + }, + FullscreenButton: { + Enter: () => ( + + ), + Exit: () => ( + + ), + }, + SeekButton: { + Backward: () => ( + + ), + Forward: () => ( + + ), + }, + DownloadButton: { + Default: () => ( + + ), + }, + Menu: { + Accessibility: () => ( + + ), + ArrowLeft: () => null, + ArrowRight: () => ( + + ), + Audio: () => ( + + ), + AudioBoostUp: () => ( + + ), + AudioBoostDown: () => ( + + ), + Chapters: () => ( + + ), + Captions: () => ( + + ), + Playback: () => ( + + ), + Settings: () => ( + + ), + SpeedUp: () => ( + + ), + SpeedDown: () => ( + + ), + QualityUp: () => null, + QualityDown: () => null, + FontSizeUp: () => null, + FontSizeDown: () => null, + OpacityUp: () => null, + OpacityDown: () => null, + RadioCheck: () => null, + }, + KeyboardDisplay: { + Play: () => ( +
+ +
+ ), + Pause: () => ( +
+ +
+ ), + Mute: () => ( +
+ +
+ ), + VolumeUp: () => ( +
+ +
+ ), + VolumeDown: () => ( +
+ +
+ ), + EnterFullscreen: () => ( +
+ +
+ ), + ExitFullscreen: () => ( +
+ +
+ ), + // EnterPiP: () => null, + // ExitPiP: () => null, + CaptionsOn: () => ( +
+ +
+ ), + CaptionsOff: () => ( +
+ +
+ ), + SeekForward: () => ( +
+ +
+ ), + SeekBackward: () => ( +
+ +
+ ), + }, +};