@vinaup/media-ui 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @vinaup/media-ui might be problematic. Click here for more details.
- package/dist/index.css +101 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.mts +244 -0
- package/dist/index.d.ts +244 -0
- package/dist/index.js +896 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +873 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/MediaUpload.tsx","../src/utils/helpers.ts","../src/components/styles/media-upload.module.scss","../src/components/MediaGrid.tsx","../src/components/styles/media-grid.module.scss","../src/components/MediaDetail.tsx","../src/components/styles/media-detail.module.scss"],"sourcesContent":["// MediaUpload.tsx\n'use client';\nimport '@mantine/dropzone/styles.css';\nimport { Group, Text, Loader, Stack, Paper, Image, Grid, GridCol, UnstyledButton } from \"@mantine/core\";\nimport { Dropzone, DropzoneAccept, DropzoneIdle, DropzoneReject, FileRejection } from '@mantine/dropzone';\nimport { TbUpload, TbPhoto } from \"react-icons/tb\";\nimport { HiOutlineX } from \"react-icons/hi\";\nimport { useState, useEffect } from \"react\";\nimport { notifications } from \"@mantine/notifications\";\nimport { IMedia, UploadResult, ICreateMedia } from '../types';\nimport { validateImageFile, formatFileSize, cx } from '../utils/helpers';\nimport defaultClasses from './styles/media-upload.module.scss';\nimport { MediaUploadProps, UploadFileItem } from './props/media-upload-props';\n\nexport type { MediaUploadProps, UploadFileItem, MediaUploadClassNames } from './props/media-upload-props';\n\nexport function MediaUpload({\n onUpload,\n onSave,\n onUploadSuccess,\n onUploadError,\n maxSize = 2 * 1024 ** 2,\n acceptedTypes = ['image/png', 'image/jpeg', 'image/jpg'],\n multiple = true,\n folder = 'media',\n classNames,\n}: MediaUploadProps) {\n const [isUploading, setIsUploading] = useState(false);\n const [uploadFiles, setUploadFiles] = useState<UploadFileItem[]>([]);\n\n const handleDrop = async (files: File[]) => {\n if (files.length === 0) return;\n\n const invalidFiles = files.filter(file => !validateImageFile(file));\n if (invalidFiles.length > 0) {\n notifications.show({\n title: 'Invalid file type',\n message: `${invalidFiles.length} file(s) have invalid type.`,\n color: 'red',\n });\n return;\n }\n\n setIsUploading(true);\n\n const newUploadFiles: UploadFileItem[] = files.map((file, index) => ({\n id: `${Date.now()}-${index}`,\n file,\n preview: URL.createObjectURL(file),\n status: 'uploading',\n }));\n\n setUploadFiles((prev) => [...newUploadFiles, ...prev]);\n\n try {\n // 1. Call external upload handler (Cloudinary, S3, etc.)\n const uploadResults = await onUpload(files);\n\n // Update status\n setUploadFiles((prev) =>\n prev.map((item) => {\n const idx = newUploadFiles.findIndex((f) => f.id === item.id);\n if (idx !== -1 && uploadResults[idx]) {\n return { ...item, status: 'success', url: uploadResults[idx].url };\n }\n return item;\n })\n );\n\n // 2. Save to database if handler provided\n if (onSave) {\n const mediaData: ICreateMedia[] = uploadResults.map((result) => ({\n name: result.name,\n title: null,\n description: null,\n url: result.url,\n type: 'image',\n folder,\n }));\n\n const savedMedia = await onSave(mediaData);\n onUploadSuccess?.(savedMedia);\n }\n\n notifications.show({\n title: 'Upload successful',\n message: `Successfully uploaded ${uploadResults.length} image(s)`,\n color: 'green',\n });\n } catch (error) {\n setUploadFiles((prev) =>\n prev.map((item) =>\n newUploadFiles.some((f) => f.id === item.id)\n ? { ...item, status: 'error', error: (error as Error).message }\n : item\n )\n );\n onUploadError?.(error as Error);\n notifications.show({\n title: 'Upload failed',\n message: (error as Error).message,\n color: 'red',\n });\n } finally {\n setIsUploading(false);\n }\n };\n\n const handleReject = (files: FileRejection[]) => {\n notifications.show({\n title: 'Files rejected',\n message: `${files.length} file(s) were rejected. Please check file type and size (≤ 2MB).`,\n color: 'red',\n });\n };\n\n // Cleanup preview URLs to prevent memory leaks\n useEffect(() => {\n return () => {\n uploadFiles.forEach((item) => {\n if (item.preview.startsWith('blob:')) {\n URL.revokeObjectURL(item.preview);\n }\n });\n };\n }, [uploadFiles]);\n\n const handleCopyLink = async (url: string) => {\n try {\n await navigator.clipboard.writeText(url);\n notifications.show({\n title: 'Link copied',\n message: 'Image URL has been copied to clipboard',\n color: 'green',\n });\n } catch (error) {\n notifications.show({\n title: 'Copy failed',\n message: error instanceof Error ? error.message : 'Failed to copy link to clipboard',\n color: 'red',\n });\n }\n };\n\n return (\n <Stack \n gap=\"lg\"\n classNames={{\n root: classNames?.rootStack?.root\n }}\n >\n <Dropzone\n onDrop={handleDrop}\n onReject={handleReject}\n maxSize={maxSize}\n accept={acceptedTypes}\n disabled={isUploading}\n multiple={multiple}\n classNames={classNames?.dropzone}\n >\n <Group \n justify=\"center\" \n gap=\"xl\" \n mih={220}\n classNames={{\n root: classNames?.dropzoneGroup?.root\n }}\n >\n {isUploading ? (\n <Loader size={52} />\n ) : (\n <>\n <DropzoneAccept>\n <TbUpload size={52} color=\"blue\" />\n </DropzoneAccept>\n <DropzoneReject>\n <HiOutlineX size={52} color=\"red\" />\n </DropzoneReject>\n <DropzoneIdle>\n <TbPhoto size={52} />\n </DropzoneIdle>\n </>\n )}\n\n <div>\n <Text \n size=\"xl\" \n inline\n classNames={{\n root: classNames?.dropzoneText?.root\n }}\n >\n Drag images here or click to select files\n </Text>\n <Text \n size=\"sm\" \n c=\"dimmed\" \n inline \n mt={7}\n classNames={{\n root: classNames?.dropzoneSubtext?.root\n }}\n >\n (png, jpg, jpeg; Size ≤ 2M)\n </Text>\n </div>\n </Group>\n </Dropzone>\n {uploadFiles.length > 0 && (\n <Stack \n gap='xs'\n classNames={{\n root: classNames?.recentStack?.root\n }}\n >\n <Text \n fw={500}\n classNames={{\n root: cx(defaultClasses.sectionTitleRoot, classNames?.sectionTitle?.root)\n }}\n >\n Recently Uploaded Images\n </Text>\n <Grid classNames={classNames?.grid}>\n {uploadFiles.map((item) => (\n <GridCol key={item.id} span={{ base: 6, sm: 6, md: 3, lg: 2 }}>\n <Paper \n p=\"sm\" \n withBorder \n radius=\"md\"\n classNames={{\n root: classNames?.itemPaper?.root\n }}\n >\n <Stack \n gap={6}\n classNames={{\n root: classNames?.itemStack?.root\n }}\n >\n <div className={cx(defaultClasses.imageContainer, classNames?.imageContainer)}>\n <Image\n src={item.preview}\n alt={item.file.name}\n fit=\"cover\"\n classNames={{\n root: cx(defaultClasses.itemImageRoot, classNames?.itemImage?.root)\n }}\n />\n {item.status === 'uploading' && (\n <div className={cx(defaultClasses.uploadingOverlay, classNames?.uploadingOverlay)}>\n <Loader size=\"sm\" color=\"white\" />\n </div>\n )}\n {item.status === 'success' && (\n <div className={cx(\n defaultClasses.statusBadge, \n defaultClasses.statusBadgeSuccess,\n classNames?.statusBadge,\n classNames?.statusBadgeSuccess\n )}>\n <Text size=\"xs\" c=\"white\" fw={700}>\n ✓\n </Text>\n </div>\n )}\n {item.status === 'error' && (\n <div className={cx(\n defaultClasses.statusBadge,\n defaultClasses.statusBadgeError,\n classNames?.statusBadge,\n classNames?.statusBadgeError\n )}>\n <HiOutlineX size={16} color=\"white\" />\n </div>\n )}\n </div>\n <Text \n size=\"xs\" \n c=\"dimmed\" \n lineClamp={1} \n title={item.file.name}\n classNames={{\n root: classNames?.itemFilename?.root\n }}\n >\n {item.file.name}\n </Text>\n <Group \n justify=\"space-between\" \n align=\"end\" \n gap=\"xs\"\n classNames={{\n root: classNames?.itemGroup?.root\n }}\n >\n <Text \n size=\"xs\" \n c=\"dimmed\"\n classNames={{\n root: classNames?.itemFilesize?.root\n }}\n >\n {formatFileSize(item.file.size)}\n </Text>\n {item.status === 'success' && item.url && (\n <UnstyledButton\n onClick={() => handleCopyLink(item.url!)}\n classNames={{\n root: cx(defaultClasses.copyButtonRoot, classNames?.copyButton?.root)\n }}\n >\n <Text \n size=\"sm\" \n c=\"blue\"\n classNames={{\n root: classNames?.copyButtonText?.root\n }}\n >\n Copy link\n </Text>\n </UnstyledButton>\n )}\n </Group>\n {item.status === 'error' && (\n <Text \n size=\"xs\" \n c=\"red\"\n classNames={{\n root: classNames?.itemError?.root\n }}\n >\n {item.error || 'Upload failed'}\n </Text>\n )}\n </Stack>\n </Paper>\n </GridCol>\n ))}\n </Grid>\n </Stack>\n )}\n </Stack>\n );\n}","export const validateImageFile = (file: File): boolean => {\n const validTypes = ['image/png', 'image/jpeg', 'image/jpg'];\n return validTypes.includes(file.type);\n};\n\nexport const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n};\n\n\n/**\n * Merge multiple className strings into one, filtering out falsy values\n * @param classNames - Array of className strings (can include undefined)\n * @returns Single merged className string\n */\nexport const cx = (...classNames: (string | undefined)[]): string => {\n // Step 1: Filter out falsy values\n const validClassNames = classNames.filter(Boolean);\n // Step 2: Join the class names with a space\n const result = validClassNames.join(' ');\n return result;\n};",".sectionTitleRoot {\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.copyButtonRoot {\n opacity: 0.9;\n transition: opacity 0.2s;\n cursor: pointer;\n}\n\n.imageContainer {\n position: relative;\n width: 100%;\n padding-bottom: 100%;\n}\n\n.itemImageRoot {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 4px;\n}\n\n.uploadingOverlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n}\n\n.statusBadge {\n position: absolute;\n top: 8px;\n right: 8px;\n border-radius: 50%;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.statusBadgeSuccess {\n background-color: green;\n}\n\n.statusBadgeError {\n background-color: red;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL1VzZXJzL2RvYW52aW5ocGh1L0RvY3VtZW50cy9Xb3JrL1ZpbmFVcC9AdmluYXVwL21lZGlhLXVpL3NyYy9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsibWVkaWEtdXBsb2FkLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBO0VBQ0U7RUFDQTs7O0FBSUY7RUFDRTtFQUNBO0VBQ0E7OztBQUlGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRSIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRleHQgY29tcG9uZW50IChzZWN0aW9uIHRpdGxlKVxuLnNlY3Rpb25UaXRsZVJvb3Qge1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBmb250LXdlaWdodDogNTAwO1xufVxuXG4vLyBVbnN0eWxlZEJ1dHRvbiBjb21wb25lbnQgKGNvcHkgYnV0dG9uKVxuLmNvcHlCdXR0b25Sb290IHtcbiAgb3BhY2l0eTogMC45O1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLy8gTmF0aXZlIGRpdnMgKGltYWdlIGNvbnRhaW5lciBhbmQgb3ZlcmxheXMpXG4uaW1hZ2VDb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nLWJvdHRvbTogMTAwJTtcbn1cblxuLml0ZW1JbWFnZVJvb3Qge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgb2JqZWN0LWZpdDogY292ZXI7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLnVwbG9hZGluZ092ZXJsYXkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4uc3RhdHVzQmFkZ2Uge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogOHB4O1xuICByaWdodDogOHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIHdpZHRoOiAyNHB4O1xuICBoZWlnaHQ6IDI0cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uc3RhdHVzQmFkZ2VTdWNjZXNzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JlZW47XG59XG5cbi5zdGF0dXNCYWRnZUVycm9yIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmVkO1xufSJdfQ== */","'use client';\nimport { Grid, GridCol, Group, Image, Paper, Stack, Text, TextInput, Select } from \"@mantine/core\";\nimport { useState } from \"react\";\nimport { IoSearch } from \"react-icons/io5\";\nimport defaultClasses from './styles/media-grid.module.scss';\nimport { MediaGridProps } from './props/media-grid-props';\nimport { cx } from '../utils/helpers';\n\nexport type { MediaGridProps, MediaGridClassNames } from './props/media-grid-props';\n\nexport function MediaGrid({\n images,\n selectedImageId = null,\n onImageClick,\n sortOptions = [\n { value: 'createdAt', label: 'By created date' },\n { value: 'updatedAt', label: 'By updated date' },\n { value: 'title', label: 'By title' },\n ],\n classNames,\n}: MediaGridProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [sortBy, setSortBy] = useState<string | null>('createdAt');\n\n const filteredAndSortedImages = () => {\n let result = [...images];\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n result = result.filter((image) =>\n image.title?.toLowerCase().includes(query)\n );\n }\n if (sortBy) {\n result.sort((a, b) => {\n switch (sortBy) {\n case 'createdAt':\n return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();\n case 'updatedAt':\n return new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime();\n case 'title':\n return (a.title ?? '').localeCompare(b.title ?? '');\n default:\n return 0;\n }\n });\n }\n return result;\n };\n\n return (\n <Stack \n gap=\"md\"\n classNames={{\n root: classNames?.rootStack?.root\n }}\n >\n <Group \n justify=\"space-between\" \n align=\"center\"\n classNames={{\n root: classNames?.filterGroup?.root\n }}\n >\n <Select\n placeholder=\"Sort by\"\n value={sortBy}\n onChange={setSortBy}\n data={sortOptions}\n w={200}\n clearable={false}\n classNames={classNames?.sortSelect}\n />\n <TextInput\n placeholder=\"Search by title...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.currentTarget.value)}\n leftSection={<IoSearch size={16} />}\n w={250}\n classNames={classNames?.searchInput}\n />\n </Group>\n\n <Grid \n gutter=\"md\"\n classNames={classNames?.grid}\n >\n {filteredAndSortedImages().map((image) => {\n const isSelected = selectedImageId === image.id;\n return (\n <GridCol key={image.id} span={{ base: 6, sm: 4, md: 3, lg: 2 }}>\n <Paper\n p=\"xs\"\n withBorder\n radius=\"md\"\n onClick={() => onImageClick(image.id)}\n classNames={{\n root: cx(\n defaultClasses.itemPaperRoot,\n classNames?.itemPaper?.root,\n isSelected ? defaultClasses.selectedPaper : undefined,\n isSelected ? classNames?.selectedPaper : undefined\n )\n }}\n >\n <Stack \n gap={6}\n classNames={{\n root: classNames?.itemStack?.root\n }}\n >\n <div className={cx(defaultClasses.imageContainer, classNames?.imageContainer)}>\n <Image\n src={image.url}\n alt={image.title || image.name}\n fit=\"cover\"\n classNames={{\n root: cx(defaultClasses.itemImageRoot, classNames?.itemImage?.root)\n }}\n />\n </div>\n <Text \n size=\"xs\" \n c=\"dimmed\" \n lineClamp={1}\n title={image.title ?? image.name}\n classNames={{\n root: cx(defaultClasses.itemTextRoot, classNames?.itemText?.root)\n }}\n >\n {image.title ?? image.name}\n </Text>\n </Stack>\n </Paper>\n </GridCol>\n );\n })}\n </Grid>\n </Stack>\n );\n}",".itemPaperRoot {\n cursor: pointer;\n transition: border-color 0.2s, background-color 0.2s;\n}\n\n.selectedPaper {\n border-color: var(--mantine-color-blue-6);\n border-width: 2px;\n background-color: var(--mantine-color-blue-0);\n}\n\n.imageContainer {\n position: relative;\n width: 100%;\n padding-bottom: 100%;\n}\n\n.itemImageRoot {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 4px;\n}\n\n.itemTextRoot {\n word-break: break-word;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL1VzZXJzL2RvYW52aW5ocGh1L0RvY3VtZW50cy9Xb3JrL1ZpbmFVcC9AdmluYXVwL21lZGlhLXVpL3NyYy9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsibWVkaWEtZ3JpZC5tb2R1bGUuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTs7O0FBSUY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUY7RUFDRSIsInNvdXJjZXNDb250ZW50IjpbIi8vIFBhcGVyIGNvbXBvbmVudCAoaXRlbSlcbi5pdGVtUGFwZXJSb290IHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4ycywgYmFja2dyb3VuZC1jb2xvciAwLjJzO1xufVxuXG4uc2VsZWN0ZWRQYXBlciB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLTYpO1xuICBib3JkZXItd2lkdGg6IDJweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLTApO1xufVxuXG4vLyBOYXRpdmUgZGl2IChpbWFnZSBjb250YWluZXIpXG4uaW1hZ2VDb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nLWJvdHRvbTogMTAwJTtcbn1cblxuLy8gSW1hZ2UgY29tcG9uZW50XG4uaXRlbUltYWdlUm9vdCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvYmplY3QtZml0OiBjb3ZlcjtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4vLyBUZXh0IGNvbXBvbmVudCAoZmlsZW5hbWUpXG4uaXRlbVRleHRSb290IHtcbiAgd29yZC1icmVhazogYnJlYWstd29yZDtcbn0iXX0= */","'use client';\nimport {\n ActionIcon,\n Group,\n Image,\n Paper,\n Stack,\n Text,\n Textarea,\n Title\n} from \"@mantine/core\";\nimport { useState } from \"react\";\nimport { MdOutlineFileCopy } from \"react-icons/md\";\nimport { GrTrash } from \"react-icons/gr\";\nimport { IoCheckmark } from \"react-icons/io5\";\nimport defaultClasses from './styles/media-detail.module.scss';\nimport { cx } from '../utils/helpers';\nimport { MediaDetailProps } from './props/media-detail-props';\n\nexport type { MediaDetailClassNames, MediaDetailProps } from './props/media-detail-props';\n\nexport function MediaDetail({\n image,\n onUpdate,\n onDelete,\n onCopyLink,\n onNotify,\n classNames,\n}: MediaDetailProps) {\n // Form state\n const [title, setTitle] = useState(image.title || '');\n const [description, setDescription] = useState(image.description || '');\n\n // Original values state (for dirty checking)\n const [originalTitle, setOriginalTitle] = useState(image.title || '');\n const [originalDescription, setOriginalDescription] = useState(image.description || '');\n\n // Dirty state - track if field has changed from original\n const isTitleDirty = title !== originalTitle;\n const isDescriptionDirty = description !== originalDescription;\n\n // Saving state for each field\n const [isSavingTitle, setIsSavingTitle] = useState(false);\n const [isSavingDescription, setIsSavingDescription] = useState(false);\n\n const handleSaveTitle = async () => {\n setIsSavingTitle(true);\n try {\n await onUpdate(image.id, { title: title || null });\n setOriginalTitle(title); // Update original to reset dirty state\n onNotify?.('success', 'Title saved');\n } catch (error) {\n onNotify?.('error', (error as Error).message);\n } finally {\n setIsSavingTitle(false);\n }\n };\n\n const handleSaveDescription = async () => {\n setIsSavingDescription(true);\n try {\n await onUpdate(image.id, { description: description || null });\n setOriginalDescription(description); // Update original to reset dirty state\n onNotify?.('success', 'Description saved');\n } catch (error) {\n onNotify?.('error', (error as Error).message);\n } finally {\n setIsSavingDescription(false);\n }\n };\n\n const handleCopyLink = async () => {\n if (onCopyLink) {\n onCopyLink(image.url);\n } else {\n try {\n await navigator.clipboard.writeText(image.url);\n onNotify?.('success', 'Link copied');\n } catch {\n onNotify?.('error', 'Failed to copy link');\n }\n }\n };\n\n return (\n <>\n <Paper\n p=\"md\"\n radius=\"md\"\n withBorder\n classNames={{\n root: cx(defaultClasses.paperRoot, classNames?.paper?.root)\n }}\n >\n <Stack gap=\"md\">\n <Title \n order={4}\n classNames={{\n root: cx(defaultClasses.titleRoot, classNames?.title?.root)\n }}\n >\n Image Details\n </Title>\n\n <div className={cx(defaultClasses.imageWrapper, classNames?.imageWrapper)}>\n <Image\n src={image.url}\n alt={image.title || image.name}\n fit=\"contain\"\n radius=\"md\"\n classNames={{\n root: cx(defaultClasses.imageRoot, classNames?.image?.root),\n }}\n />\n </div>\n\n <Stack \n gap=\"xs\"\n classNames={{\n root: cx(defaultClasses.fieldsStackRoot, classNames?.fieldsStack?.root)\n }}\n >\n {/* Name (readonly) */}\n <div className={cx(defaultClasses.fieldGroup, classNames?.fieldGroup)}>\n <Text \n size=\"sm\" \n fw={500} \n c=\"dimmed\"\n classNames={{\n root: cx(defaultClasses.fieldLabelRoot, classNames?.fieldLabel?.root)\n }}\n >\n Name\n </Text>\n <Text \n classNames={{\n root: cx(defaultClasses.fieldValueRoot, classNames?.fieldValue?.root)\n }}\n >\n {image.name}\n </Text>\n </div>\n\n {/* Title with inline save button */}\n <div className={cx(defaultClasses.fieldGroup, classNames?.fieldGroup)}>\n <Group gap={4} align=\"center\">\n <Text \n size=\"sm\" \n fw={500} \n c=\"dimmed\"\n classNames={{\n root: cx(defaultClasses.fieldLabelRoot, classNames?.fieldLabel?.root)\n }}\n >\n Title\n </Text>\n {isTitleDirty && (\n <ActionIcon\n size=\"xs\"\n variant=\"filled\"\n color=\"green\"\n onClick={handleSaveTitle}\n loading={isSavingTitle}\n title=\"Save title\"\n classNames={{\n root: cx(defaultClasses.saveButtonRoot, classNames?.saveButton?.root)\n }}\n >\n <IoCheckmark size={12} />\n </ActionIcon>\n )}\n </Group>\n <Textarea\n value={title}\n placeholder=\"Enter title\"\n onChange={(e) => setTitle(e.target.value)}\n minRows={2}\n autosize\n classNames={{\n root: cx(defaultClasses.textareaRoot, classNames?.textarea?.root),\n input: cx(defaultClasses.textareaInput, classNames?.textarea?.input),\n wrapper: cx(defaultClasses.textareaWrapper, classNames?.textarea?.wrapper),\n }}\n />\n </div>\n\n {/* Description with inline save button */}\n <div className={cx(defaultClasses.fieldGroup, classNames?.fieldGroup)}>\n <Group gap={4} align=\"center\">\n <Text \n size=\"sm\" \n fw={500} \n c=\"dimmed\"\n classNames={{\n root: cx(defaultClasses.fieldLabelRoot, classNames?.fieldLabel?.root)\n }}\n >\n Description\n </Text>\n {isDescriptionDirty && (\n <ActionIcon\n size=\"xs\"\n variant=\"filled\"\n color=\"green\"\n onClick={handleSaveDescription}\n loading={isSavingDescription}\n title=\"Save description\"\n classNames={{\n root: cx(defaultClasses.saveButtonRoot, classNames?.saveButton?.root)\n }}\n >\n <IoCheckmark size={12} />\n </ActionIcon>\n )}\n </Group>\n <Textarea\n value={description}\n placeholder=\"Enter description\"\n onChange={(e) => setDescription(e.target.value)}\n minRows={3}\n autosize\n classNames={{\n root: cx(defaultClasses.textareaRoot, classNames?.textarea?.root),\n input: cx(defaultClasses.textareaInput, classNames?.textarea?.input),\n wrapper: cx(defaultClasses.textareaWrapper, classNames?.textarea?.wrapper),\n }}\n />\n </div>\n\n {/* Type (readonly) */}\n <div className={cx(defaultClasses.fieldGroup, classNames?.fieldGroup)}>\n <Text \n size=\"sm\" \n fw={500} \n c=\"dimmed\"\n classNames={{\n root: cx(defaultClasses.fieldLabelRoot, classNames?.fieldLabel?.root)\n }}\n >\n Type\n </Text>\n <Text \n classNames={{\n root: cx(defaultClasses.fieldValueRoot, classNames?.fieldValue?.root)\n }}\n >\n {image.type}\n </Text>\n </div>\n\n {/* URL with copy button */}\n <div className={cx(defaultClasses.fieldGroup, classNames?.fieldGroup)}>\n <Text \n size=\"sm\" \n fw={500} \n c=\"dimmed\"\n classNames={{\n root: cx(defaultClasses.fieldLabelRoot, classNames?.fieldLabel?.root)\n }}\n >\n URL\n </Text>\n <Group gap=\"xs\" align=\"center\" wrap=\"nowrap\">\n <Text\n size=\"xs\"\n c=\"dimmed\"\n classNames={{\n root: cx(defaultClasses.urlText, classNames?.urlText)\n }}\n >\n {image.url}\n </Text>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n onClick={handleCopyLink}\n size=\"sm\"\n classNames={{\n root: cx(defaultClasses.copyButtonRoot, classNames?.copyButton?.root)\n }}\n >\n <MdOutlineFileCopy size={18} />\n </ActionIcon>\n </Group>\n </div>\n\n {/* Timestamps */}\n <div className={cx(defaultClasses.fieldGroup, classNames?.fieldGroup)}>\n <Text \n size=\"sm\" \n fw={500} \n c=\"dimmed\"\n classNames={{\n root: cx(defaultClasses.fieldLabelRoot, classNames?.fieldLabel?.root)\n }}\n >\n Created At\n </Text>\n <Text \n size=\"sm\"\n classNames={{\n root: cx(defaultClasses.fieldValueRoot, classNames?.fieldValue?.root)\n }}\n >\n {new Date(image.createdAt).toLocaleString()}\n </Text>\n </div>\n <div className={cx(defaultClasses.fieldGroup, classNames?.fieldGroup)}>\n <Text \n size=\"sm\" \n fw={500} \n c=\"dimmed\"\n classNames={{\n root: cx(defaultClasses.fieldLabelRoot, classNames?.fieldLabel?.root)\n }}\n >\n Updated At\n </Text>\n <Text \n size=\"sm\"\n classNames={{\n root: cx(defaultClasses.fieldValueRoot, classNames?.fieldValue?.root)\n }}\n >\n {new Date(image.updatedAt).toLocaleString()}\n </Text>\n </div>\n </Stack>\n </Stack>\n\n {/* Delete button */}\n {onDelete && (\n <ActionIcon\n variant=\"filled\"\n color=\"red\"\n size=\"lg\"\n onClick={() => onDelete(image.id)}\n classNames={{\n root: cx(defaultClasses.deleteButtonRoot, classNames?.deleteButton?.root)\n }}\n >\n <GrTrash size={20} />\n </ActionIcon>\n )}\n </Paper>\n </>\n );\n}",".paperRoot {\n position: relative;\n}\n\n.imageWrapper {\n width: 100%;\n}\n\n.urlText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n}\n\n.deleteButtonRoot {\n position: absolute;\n bottom: 8px;\n right: 8px;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL1VzZXJzL2RvYW52aW5ocGh1L0RvY3VtZW50cy9Xb3JrL1ZpbmFVcC9AdmluYXVwL21lZGlhLXVpL3NyYy9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsibWVkaWEtZGV0YWlsLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBO0VBQ0U7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUlGO0VBQ0U7RUFDQTtFQUNBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gUGFwZXIgY29tcG9uZW50XG4ucGFwZXJSb290IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uaW1hZ2VXcmFwcGVyIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi51cmxUZXh0IHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGZsZXg6IDE7XG59XG5cbi8vIERlbGV0ZSBidXR0b25cbi5kZWxldGVCdXR0b25Sb290IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDhweDtcbiAgcmlnaHQ6IDhweDtcbn0iXX0= */"],"mappings":"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","names":["Grid","GridCol","Group","Image","Paper","Stack","Text","useState","jsx","jsxs","useState","Stack","Group","Grid","GridCol","Paper","Image","Text","Group","Image","Paper","Stack","Text","useState","Fragment","jsx","jsxs","useState","Paper","Stack","Image","Text","Group"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vinaup/media-ui",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "A comprehensive React UI component kit for media management, built with Mantine.",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsup",
|
|
13
|
+
"storybook": "storybook dev -p 6006",
|
|
14
|
+
"build-storybook": "storybook build",
|
|
15
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"media",
|
|
19
|
+
"ui",
|
|
20
|
+
"vinaup"
|
|
21
|
+
],
|
|
22
|
+
"author": "Vinaup",
|
|
23
|
+
"license": "ISC",
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"@mantine/core": "^7.0.0 || ^8.0.0",
|
|
26
|
+
"@mantine/dropzone": "^7.0.0 || ^8.0.0",
|
|
27
|
+
"@mantine/notifications": "^7.0.0 || ^8.0.0",
|
|
28
|
+
"react": ">=18.0.0",
|
|
29
|
+
"react-dom": ">=18.0.0",
|
|
30
|
+
"react-icons": "^5.0.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@mantine/core": "^8.3.13",
|
|
34
|
+
"@mantine/dropzone": "^8.3.13",
|
|
35
|
+
"@mantine/notifications": "^8.3.13",
|
|
36
|
+
"@storybook/react-vite": "^10.2.0",
|
|
37
|
+
"@types/node": "^25.0.10",
|
|
38
|
+
"@types/react": "^19.2.9",
|
|
39
|
+
"@types/react-dom": "^19.2.3",
|
|
40
|
+
"esbuild-sass-plugin": "^3.6.0",
|
|
41
|
+
"react": "^19.2.3",
|
|
42
|
+
"react-dom": "^19.2.3",
|
|
43
|
+
"react-icons": "^5.5.0",
|
|
44
|
+
"sass": "^1.97.3",
|
|
45
|
+
"storybook": "^10.2.0",
|
|
46
|
+
"tsup": "^8.5.1",
|
|
47
|
+
"typescript": "^5.9.3"
|
|
48
|
+
}
|
|
49
|
+
}
|