@sparkstudio/storage-ui 1.0.15 → 1.0.16

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.
Files changed (3) hide show
  1. package/dist/index.cjs +118 -20
  2. package/dist/index.js +128 -20
  3. package/package.json +4 -2
package/dist/index.cjs CHANGED
@@ -526,8 +526,81 @@ var UploadProgressList = ({
526
526
  };
527
527
 
528
528
  // src/components/DesktopFileIcon.tsx
529
+ var import_free_solid_svg_icons = require("@fortawesome/free-solid-svg-icons");
530
+ var import_react_fontawesome = require("@fortawesome/react-fontawesome");
529
531
  var import_react4 = require("react");
530
532
  var import_jsx_runtime3 = require("react/jsx-runtime");
533
+ function getFileExtension(name) {
534
+ if (!name) return null;
535
+ const lastDot = name.lastIndexOf(".");
536
+ if (lastDot === -1 || lastDot === name.length - 1) return null;
537
+ return name.substring(lastDot + 1).toLowerCase();
538
+ }
539
+ function getIconForExtension(ext) {
540
+ if (!ext) return import_free_solid_svg_icons.faFile;
541
+ switch (ext) {
542
+ // Images
543
+ case "jpg":
544
+ case "jpeg":
545
+ case "png":
546
+ case "gif":
547
+ case "webp":
548
+ case "bmp":
549
+ return import_free_solid_svg_icons.faFileImage;
550
+ // PDF
551
+ case "pdf":
552
+ return import_free_solid_svg_icons.faFilePdf;
553
+ // Word docs
554
+ case "doc":
555
+ case "docx":
556
+ return import_free_solid_svg_icons.faFileWord;
557
+ // Excel / spreadsheets
558
+ case "xls":
559
+ case "xlsx":
560
+ case "csv":
561
+ return import_free_solid_svg_icons.faFileExcel;
562
+ // Archives
563
+ case "zip":
564
+ case "rar":
565
+ case "7z":
566
+ case "tar":
567
+ case "gz":
568
+ return import_free_solid_svg_icons.faFileArchive;
569
+ // Video
570
+ case "mp4":
571
+ case "mov":
572
+ case "avi":
573
+ case "mkv":
574
+ case "webm":
575
+ return import_free_solid_svg_icons.faFileVideo;
576
+ // Audio
577
+ case "mp3":
578
+ case "wav":
579
+ case "ogg":
580
+ case "flac":
581
+ return import_free_solid_svg_icons.faFileAudio;
582
+ // Code files
583
+ case "js":
584
+ case "ts":
585
+ case "tsx":
586
+ case "jsx":
587
+ case "json":
588
+ case "html":
589
+ case "css":
590
+ case "cs":
591
+ case "java":
592
+ case "py":
593
+ case "rb":
594
+ case "php":
595
+ case "sql":
596
+ case "xml":
597
+ case "yml":
598
+ case "yaml":
599
+ return import_free_solid_svg_icons.faFileCode;
600
+ default:
601
+ return import_free_solid_svg_icons.faFile;
602
+ }
603
+ }
531
604
  var DesktopFileIcon = ({
532
605
  name,
533
606
  sizeBytes,
@@ -597,6 +670,8 @@ var DesktopFileIcon = ({
597
670
  }
598
671
  };
599
672
  const formattedSize = typeof sizeBytes === "number" ? `${(sizeBytes / 1024).toFixed(1)} KB` : void 0;
673
+ const ext = getFileExtension(name);
674
+ const iconToRender = getIconForExtension(ext);
600
675
  (0, import_react4.useEffect)(() => {
601
676
  if (!contextMenuPos) return;
602
677
  const handleGlobalClick = (e) => {
@@ -619,23 +694,19 @@ var DesktopFileIcon = ({
619
694
  "div",
620
695
  {
621
696
  ref: iconRef,
622
- className: "d-flex flex-column align-items-center rounded-3 p-1 " + (isHovered || contextMenuPos ? "bg-light border-primary" : "border-transparent"),
697
+ className: "d-flex flex-column align-items-center rounded-3 p-1 " + (isHovered || contextMenuPos ? "bg-primary-subtle" : ""),
623
698
  style: {
624
699
  width: 96,
625
700
  cursor: isDeleting ? "default" : "pointer",
626
701
  userSelect: "none",
627
- transition: "background-color 0.1s ease, border-color 0.1s ease, opacity 0.1s ease",
628
- opacity: isDeleting ? 0.6 : 1,
629
- borderWidth: 1,
630
- borderStyle: "solid"
702
+ transition: "background-color 0.1s ease, opacity 0.1s ease",
703
+ opacity: isDeleting ? 0.6 : 1
631
704
  },
632
705
  onDoubleClick: handleDoubleClick,
633
706
  onContextMenu: handleContextMenu,
634
707
  title: name ?? void 0,
635
708
  onClick: () => {
636
- if (contextMenuPos) {
637
- closeMenu();
638
- }
709
+ if (contextMenuPos) closeMenu();
639
710
  },
640
711
  onMouseEnter: () => setIsHovered(true),
641
712
  onMouseLeave: () => setIsHovered(false),
@@ -649,19 +720,12 @@ var DesktopFileIcon = ({
649
720
  height: 64
650
721
  },
651
722
  children: [
652
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("i", { className: "bi bi-file-earmark fs-2" }),
723
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_fontawesome.FontAwesomeIcon, { icon: iconToRender, className: "fs-2" }),
653
724
  isDeleting && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "position-absolute top-50 start-50 translate-middle", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "spinner-border spinner-border-sm text-danger" }) })
654
725
  ]
655
726
  }
656
727
  ),
657
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
658
- "div",
659
- {
660
- className: "small text-center text-truncate",
661
- style: { width: "100%" },
662
- children: name
663
- }
664
- ),
728
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "small text-center text-truncate", style: { width: "100%" }, children: name }),
665
729
  formattedSize && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("small", { className: "text-muted mt-1", children: formattedSize })
666
730
  ]
667
731
  }
@@ -781,7 +845,41 @@ var UploadContainer = ({
781
845
  {
782
846
  className: "w-100 d-flex flex-wrap gap-4 align-content-start",
783
847
  style: { minHeight: "140px" },
784
- children: existingFilesLoading ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "w-100 d-flex justify-content-center align-items-center", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "spinner-border text-secondary", role: "status", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "visually-hidden", children: "Loading containers..." }) }) }) : existingFiles.map((file) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
848
+ children: existingFilesLoading ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "w-100 d-flex justify-content-center align-items-center", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "spinner-border text-secondary", role: "status", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "visually-hidden", children: "Loading containers..." }) }) }) : existingFiles.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
849
+ "div",
850
+ {
851
+ className: "w-100 d-flex flex-column align-items-center justify-content-center text-muted",
852
+ style: {
853
+ minHeight: "160px",
854
+ border: "2px dashed #ccc",
855
+ borderRadius: "10px",
856
+ padding: "20px",
857
+ cursor: "pointer",
858
+ transition: "background 0.12s, border-color 0.12s"
859
+ },
860
+ onClick: () => document.getElementById("filePicker")?.click(),
861
+ onMouseEnter: (e) => e.currentTarget.style.borderColor = "#888",
862
+ onMouseLeave: (e) => e.currentTarget.style.borderColor = "#ccc",
863
+ children: [
864
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
865
+ "input",
866
+ {
867
+ id: "filePicker",
868
+ type: "file",
869
+ multiple: true,
870
+ hidden: true,
871
+ onChange: (e) => {
872
+ if (!e.target.files) return;
873
+ onFilesSelected?.(e.target.files);
874
+ startUploadsIfNeeded(e.target.files);
875
+ }
876
+ }
877
+ ),
878
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { children: "Drag & drop files here" }),
879
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("small", { className: "mt-1", children: "\u2026or click to browse" })
880
+ ]
881
+ }
882
+ ) : existingFiles.map((file) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
785
883
  DesktopFileIcon,
786
884
  {
787
885
  name: file.Name,
@@ -928,8 +1026,8 @@ function HomeContent() {
928
1026
  user && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
929
1027
  ContainerUploadPanel,
930
1028
  {
931
- containerApiBaseUrl: "https://localhost:5001",
932
- storageApiBaseUrl: "https://localhost:5001"
1029
+ containerApiBaseUrl: "https://lf9zyufpuk.execute-api.us-east-2.amazonaws.com/Prod",
1030
+ storageApiBaseUrl: "https://iq0gmcn0pd.execute-api.us-east-2.amazonaws.com/Prod"
933
1031
  }
934
1032
  )
935
1033
  ] });
package/dist/index.js CHANGED
@@ -485,8 +485,91 @@ var UploadProgressList = ({
485
485
  };
486
486
 
487
487
  // src/components/DesktopFileIcon.tsx
488
+ import {
489
+ faFile,
490
+ faFilePdf,
491
+ faFileImage,
492
+ faFileWord,
493
+ faFileExcel,
494
+ faFileVideo,
495
+ faFileAudio,
496
+ faFileArchive,
497
+ faFileCode
498
+ } from "@fortawesome/free-solid-svg-icons";
499
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
488
500
  import { useEffect, useRef, useState as useState2 } from "react";
489
501
  import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
502
+ function getFileExtension(name) {
503
+ if (!name) return null;
504
+ const lastDot = name.lastIndexOf(".");
505
+ if (lastDot === -1 || lastDot === name.length - 1) return null;
506
+ return name.substring(lastDot + 1).toLowerCase();
507
+ }
508
+ function getIconForExtension(ext) {
509
+ if (!ext) return faFile;
510
+ switch (ext) {
511
+ // Images
512
+ case "jpg":
513
+ case "jpeg":
514
+ case "png":
515
+ case "gif":
516
+ case "webp":
517
+ case "bmp":
518
+ return faFileImage;
519
+ // PDF
520
+ case "pdf":
521
+ return faFilePdf;
522
+ // Word docs
523
+ case "doc":
524
+ case "docx":
525
+ return faFileWord;
526
+ // Excel / spreadsheets
527
+ case "xls":
528
+ case "xlsx":
529
+ case "csv":
530
+ return faFileExcel;
531
+ // Archives
532
+ case "zip":
533
+ case "rar":
534
+ case "7z":
535
+ case "tar":
536
+ case "gz":
537
+ return faFileArchive;
538
+ // Video
539
+ case "mp4":
540
+ case "mov":
541
+ case "avi":
542
+ case "mkv":
543
+ case "webm":
544
+ return faFileVideo;
545
+ // Audio
546
+ case "mp3":
547
+ case "wav":
548
+ case "ogg":
549
+ case "flac":
550
+ return faFileAudio;
551
+ // Code files
552
+ case "js":
553
+ case "ts":
554
+ case "tsx":
555
+ case "jsx":
556
+ case "json":
557
+ case "html":
558
+ case "css":
559
+ case "cs":
560
+ case "java":
561
+ case "py":
562
+ case "rb":
563
+ case "php":
564
+ case "sql":
565
+ case "xml":
566
+ case "yml":
567
+ case "yaml":
568
+ return faFileCode;
569
+ default:
570
+ return faFile;
571
+ }
572
+ }
490
573
  var DesktopFileIcon = ({
491
574
  name,
492
575
  sizeBytes,
@@ -556,6 +639,8 @@ var DesktopFileIcon = ({
556
639
  }
557
640
  };
558
641
  const formattedSize = typeof sizeBytes === "number" ? `${(sizeBytes / 1024).toFixed(1)} KB` : void 0;
642
+ const ext = getFileExtension(name);
643
+ const iconToRender = getIconForExtension(ext);
559
644
  useEffect(() => {
560
645
  if (!contextMenuPos) return;
561
646
  const handleGlobalClick = (e) => {
@@ -578,23 +663,19 @@ var DesktopFileIcon = ({
578
663
  "div",
579
664
  {
580
665
  ref: iconRef,
581
- className: "d-flex flex-column align-items-center rounded-3 p-1 " + (isHovered || contextMenuPos ? "bg-light border-primary" : "border-transparent"),
666
+ className: "d-flex flex-column align-items-center rounded-3 p-1 " + (isHovered || contextMenuPos ? "bg-primary-subtle" : ""),
582
667
  style: {
583
668
  width: 96,
584
669
  cursor: isDeleting ? "default" : "pointer",
585
670
  userSelect: "none",
586
- transition: "background-color 0.1s ease, border-color 0.1s ease, opacity 0.1s ease",
587
- opacity: isDeleting ? 0.6 : 1,
588
- borderWidth: 1,
589
- borderStyle: "solid"
671
+ transition: "background-color 0.1s ease, opacity 0.1s ease",
672
+ opacity: isDeleting ? 0.6 : 1
590
673
  },
591
674
  onDoubleClick: handleDoubleClick,
592
675
  onContextMenu: handleContextMenu,
593
676
  title: name ?? void 0,
594
677
  onClick: () => {
595
- if (contextMenuPos) {
596
- closeMenu();
597
- }
678
+ if (contextMenuPos) closeMenu();
598
679
  },
599
680
  onMouseEnter: () => setIsHovered(true),
600
681
  onMouseLeave: () => setIsHovered(false),
@@ -608,19 +689,12 @@ var DesktopFileIcon = ({
608
689
  height: 64
609
690
  },
610
691
  children: [
611
- /* @__PURE__ */ jsx3("i", { className: "bi bi-file-earmark fs-2" }),
692
+ /* @__PURE__ */ jsx3(FontAwesomeIcon, { icon: iconToRender, className: "fs-2" }),
612
693
  isDeleting && /* @__PURE__ */ jsx3("div", { className: "position-absolute top-50 start-50 translate-middle", children: /* @__PURE__ */ jsx3("div", { className: "spinner-border spinner-border-sm text-danger" }) })
613
694
  ]
614
695
  }
615
696
  ),
616
- /* @__PURE__ */ jsx3(
617
- "div",
618
- {
619
- className: "small text-center text-truncate",
620
- style: { width: "100%" },
621
- children: name
622
- }
623
- ),
697
+ /* @__PURE__ */ jsx3("div", { className: "small text-center text-truncate", style: { width: "100%" }, children: name }),
624
698
  formattedSize && /* @__PURE__ */ jsx3("small", { className: "text-muted mt-1", children: formattedSize })
625
699
  ]
626
700
  }
@@ -740,7 +814,41 @@ var UploadContainer = ({
740
814
  {
741
815
  className: "w-100 d-flex flex-wrap gap-4 align-content-start",
742
816
  style: { minHeight: "140px" },
743
- children: existingFilesLoading ? /* @__PURE__ */ jsx4("div", { className: "w-100 d-flex justify-content-center align-items-center", children: /* @__PURE__ */ jsx4("div", { className: "spinner-border text-secondary", role: "status", children: /* @__PURE__ */ jsx4("span", { className: "visually-hidden", children: "Loading containers..." }) }) }) : existingFiles.map((file) => /* @__PURE__ */ jsx4(
817
+ children: existingFilesLoading ? /* @__PURE__ */ jsx4("div", { className: "w-100 d-flex justify-content-center align-items-center", children: /* @__PURE__ */ jsx4("div", { className: "spinner-border text-secondary", role: "status", children: /* @__PURE__ */ jsx4("span", { className: "visually-hidden", children: "Loading containers..." }) }) }) : existingFiles.length === 0 ? /* @__PURE__ */ jsxs3(
818
+ "div",
819
+ {
820
+ className: "w-100 d-flex flex-column align-items-center justify-content-center text-muted",
821
+ style: {
822
+ minHeight: "160px",
823
+ border: "2px dashed #ccc",
824
+ borderRadius: "10px",
825
+ padding: "20px",
826
+ cursor: "pointer",
827
+ transition: "background 0.12s, border-color 0.12s"
828
+ },
829
+ onClick: () => document.getElementById("filePicker")?.click(),
830
+ onMouseEnter: (e) => e.currentTarget.style.borderColor = "#888",
831
+ onMouseLeave: (e) => e.currentTarget.style.borderColor = "#ccc",
832
+ children: [
833
+ /* @__PURE__ */ jsx4(
834
+ "input",
835
+ {
836
+ id: "filePicker",
837
+ type: "file",
838
+ multiple: true,
839
+ hidden: true,
840
+ onChange: (e) => {
841
+ if (!e.target.files) return;
842
+ onFilesSelected?.(e.target.files);
843
+ startUploadsIfNeeded(e.target.files);
844
+ }
845
+ }
846
+ ),
847
+ /* @__PURE__ */ jsx4("strong", { children: "Drag & drop files here" }),
848
+ /* @__PURE__ */ jsx4("small", { className: "mt-1", children: "\u2026or click to browse" })
849
+ ]
850
+ }
851
+ ) : existingFiles.map((file) => /* @__PURE__ */ jsx4(
744
852
  DesktopFileIcon,
745
853
  {
746
854
  name: file.Name,
@@ -892,8 +1000,8 @@ function HomeContent() {
892
1000
  user && /* @__PURE__ */ jsx6(
893
1001
  ContainerUploadPanel,
894
1002
  {
895
- containerApiBaseUrl: "https://localhost:5001",
896
- storageApiBaseUrl: "https://localhost:5001"
1003
+ containerApiBaseUrl: "https://lf9zyufpuk.execute-api.us-east-2.amazonaws.com/Prod",
1004
+ storageApiBaseUrl: "https://iq0gmcn0pd.execute-api.us-east-2.amazonaws.com/Prod"
897
1005
  }
898
1006
  )
899
1007
  ] });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sparkstudio/storage-ui",
3
- "version": "1.0.15",
3
+ "version": "1.0.16",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
@@ -37,8 +37,10 @@
37
37
  "dependencies": {
38
38
  "@aws-sdk/client-s3": "^3.958.0",
39
39
  "@aws-sdk/s3-request-presigner": "^3.958.0",
40
+ "@fortawesome/free-solid-svg-icons": "^7.1.0",
41
+ "@fortawesome/react-fontawesome": "^3.1.1",
40
42
  "@sparkstudio/authentication-ui": "^1.0.29",
41
- "@sparkstudio/common-ui": "^1.0.5",
43
+ "@sparkstudio/common-ui": "^1.0.11",
42
44
  "barrelsby": "^2.8.1"
43
45
  },
44
46
  "devDependencies": {