You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

uploaded-message-files.tsx 1.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { IDocumentInfo } from '@/interfaces/database/document';
  2. import { getExtension } from '@/utils/document-util';
  3. import { formatBytes } from '@/utils/file-util';
  4. import { memo } from 'react';
  5. import FileIcon from '../file-icon';
  6. import NewDocumentLink from '../new-document-link';
  7. import SvgIcon from '../svg-icon';
  8. interface IProps {
  9. files?: File[] | IDocumentInfo[];
  10. }
  11. type NameWidgetType = {
  12. name: string;
  13. size: number;
  14. id?: string;
  15. };
  16. function NameWidget({ name, size, id }: NameWidgetType) {
  17. return (
  18. <div className="text-xs max-w-20">
  19. {id ? (
  20. <NewDocumentLink documentId={id} documentName={name} prefix="document">
  21. {name}
  22. </NewDocumentLink>
  23. ) : (
  24. <div className="truncate">{name}</div>
  25. )}
  26. <p className="text-text-secondary pt-1">{formatBytes(size)}</p>
  27. </div>
  28. );
  29. }
  30. export function InnerUploadedMessageFiles({ files = [] }: IProps) {
  31. return (
  32. <section className="flex gap-2 pt-2">
  33. {files?.map((file, idx) => {
  34. const name = file.name;
  35. const isFile = file instanceof File;
  36. return (
  37. <div key={idx} className="flex gap-1 border rounded-md p-1.5">
  38. {!isFile ? (
  39. <FileIcon id={file.id} name={name}></FileIcon>
  40. ) : file.type.startsWith('image/') ? (
  41. <img
  42. src={URL.createObjectURL(file)}
  43. alt={name}
  44. className="size-10 object-cover"
  45. />
  46. ) : (
  47. <SvgIcon
  48. name={`file-icon/${getExtension(name)}`}
  49. width={24}
  50. ></SvgIcon>
  51. )}
  52. <NameWidget
  53. name={name}
  54. size={file.size}
  55. id={isFile ? undefined : file.id}
  56. ></NameWidget>
  57. </div>
  58. );
  59. })}
  60. </section>
  61. );
  62. }
  63. export const UploadedMessageFiles = memo(InnerUploadedMessageFiles);