index.jsx 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { useState } from "react";
  2. import { Grid2, useMediaQuery, useTheme } from "@mui/material";
  3. import { OverlayScrollbarsComponent } from "overlayscrollbars-react";
  4. import { twMerge } from "tailwind-merge";
  5. import { PHOTO_COUNT } from "../../utils/constants";
  6. import { ImageFromByteArray } from "../image-from-byte-array";
  7. export const PhotoGallery = ({ fileData, paletteRGB }) => {
  8. const [currentPhotoIndex, setCurrentPhotoIndex] = useState(0);
  9. const theme = useTheme();
  10. const isSmallerPreview = useMediaQuery(theme.breakpoints.down("md"));
  11. const photoPreview = (
  12. <div
  13. className="
  14. flex -mt-3
  15. [&>canvas]:rounded-lg rounded-lg border-solid border-4 border-base-main
  16. outline outline-4 outline-primary-main
  17. shadow-[8px_8px_0_2px] shadow-primary-main
  18. max-sm:hidden
  19. "
  20. >
  21. <ImageFromByteArray
  22. byteArray={fileData}
  23. photoIndex={currentPhotoIndex}
  24. imageScale={isSmallerPreview ? 2 : 3}
  25. paletteRGB={paletteRGB}
  26. />
  27. </div>
  28. );
  29. const photoGrid = (
  30. <OverlayScrollbarsComponent
  31. id="bigOsScrollbar"
  32. className="w-[304px] h-[622px] max-md:h-[374px] !z-0
  33. [&>div[data-overlayscrollbars-viewport]]:snap-mandatory [&>div[data-overlayscrollbars-viewport]]:snap-y"
  34. options={{ overflow: { x: "hidden" } }}
  35. defer
  36. >
  37. <Grid2 className="p-1 pb-2" container columns={2} spacing={1}>
  38. {[...Array(PHOTO_COUNT)].map((_, index) => (
  39. <div
  40. key={`photo_${index}`}
  41. className={twMerge(
  42. `flex snap-center
  43. border-2 border-solid border-primary-main
  44. shadow-[2px_2px] shadow-primary-main
  45. transition-transform hover:scale-105`,
  46. index === currentPhotoIndex &&
  47. "border-secondary-main shadow-secondary-main"
  48. )}
  49. onClick={() => setCurrentPhotoIndex(index)}
  50. >
  51. <ImageFromByteArray
  52. byteArray={fileData}
  53. photoIndex={index}
  54. imageScale={1}
  55. paletteRGB={paletteRGB}
  56. />
  57. </div>
  58. ))}
  59. </Grid2>
  60. </OverlayScrollbarsComponent>
  61. );
  62. return (
  63. <div className="flex items-center justify-center gap-7">
  64. {photoPreview}
  65. {photoGrid}
  66. </div>
  67. );
  68. };