softbuilders-react-video-player 1.1.72 → 1.1.74

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.mjs CHANGED
@@ -31,7 +31,14 @@ var __objRest = (source, exclude) => {
31
31
  };
32
32
 
33
33
  // src/components/SoftBuildersVideoPlayer/index.tsx
34
- import { forwardRef as forwardRef2, memo, useEffect as useEffect15, useState as useState15 } from "react";
34
+ import {
35
+ forwardRef as forwardRef2,
36
+ memo,
37
+ useCallback as useCallback4,
38
+ useEffect as useEffect15,
39
+ useMemo,
40
+ useState as useState15
41
+ } from "react";
35
42
 
36
43
  // src/components/VideoPlayerComponent/index.tsx
37
44
  import { forwardRef, useEffect as useEffect14, useRef as useRef2, useState as useState14 } from "react";
@@ -521,7 +528,7 @@ var VolumeSlider = ({
521
528
  const [volume, setVolume] = useState2(0);
522
529
  useEffect2(() => {
523
530
  const updateVolumeState = () => {
524
- const currentVolume = (player == null ? void 0 : player.muted()) ? 0 : Number(player == null ? void 0 : player.volume()) * 100;
531
+ const currentVolume = (player == null ? void 0 : player.muted()) ? 0 : Number((player == null ? void 0 : player.volume()) || 0) * 100;
525
532
  setVolume(currentVolume);
526
533
  };
527
534
  updateVolumeState();
@@ -635,8 +642,8 @@ var MenuButton = ({
635
642
  setIsOpen(false);
636
643
  }, []);
637
644
  useEffect3(() => {
638
- const handleClickOutside = (event2) => {
639
- if (buttonRef.current && !buttonRef.current.contains(event2.target) && menuRef.current && !menuRef.current.contains(event2.target)) {
645
+ const handleClickOutside = (event) => {
646
+ if (buttonRef.current && !buttonRef.current.contains(event.target) && menuRef.current && !menuRef.current.contains(event.target)) {
640
647
  setIsOpen(false);
641
648
  }
642
649
  };
@@ -661,10 +668,10 @@ var MenuButton = ({
661
668
  {
662
669
  ref: buttonRef,
663
670
  onClick: (e) => {
664
- isOpen && e.stopPropagation();
671
+ e.stopPropagation();
665
672
  toggleMenu();
666
673
  onClick && onClick(e, !isOpen);
667
- noteButtonClick && noteButtonClick(!isOpen);
674
+ noteButtonClick && noteButtonClick(true);
668
675
  },
669
676
  "aria-haspopup": "true",
670
677
  "aria-expanded": isOpen,
@@ -808,7 +815,7 @@ var QualityMenu = ({ width, onClick }) => {
808
815
  var QualityMenu_default = QualityMenu;
809
816
 
810
817
  // src/components/CreateNoteMenu/index.tsx
811
- import { useState as useState5 } from "react";
818
+ import React5, { useState as useState5 } from "react";
812
819
  import { jsx as jsx22, jsxs as jsxs7 } from "react/jsx-runtime";
813
820
  var CreateNoteMenu = ({
814
821
  handleSaveNoteAction,
@@ -878,13 +885,13 @@ var CreateNoteMenu = ({
878
885
  }
879
886
  );
880
887
  };
881
- var CreateNoteMenu_default = CreateNoteMenu;
888
+ var CreateNoteMenu_default = React5.memo(CreateNoteMenu);
882
889
 
883
890
  // src/components/NotesPanal/index.tsx
884
891
  import { useEffect as useEffect6, useState as useState7 } from "react";
885
892
 
886
893
  // src/components/NoteTooltip/index.tsx
887
- import { useEffect as useEffect5, useState as useState6 } from "react";
894
+ import { useState as useState6 } from "react";
888
895
 
889
896
  // src/components/Tooltip/index.tsx
890
897
  import { jsx as jsx23 } from "react/jsx-runtime";
@@ -904,18 +911,14 @@ var Tooltip_default = Tooltip;
904
911
  import { jsx as jsx24, jsxs as jsxs8 } from "react/jsx-runtime";
905
912
  var NoteTooltip = ({ note }) => {
906
913
  const [open, setOpen] = useState6(false);
907
- const { currentTime } = useSoftBuildersVideoPlayerContext();
908
- useEffect5(() => {
909
- if (currentTime === Math.floor(note.time)) {
910
- setOpen(true);
911
- setTimeout(() => {
912
- setOpen(false);
913
- }, 5e3);
914
- }
915
- }, [currentTime, note.time]);
914
+ const { currentTime, player } = useSoftBuildersVideoPlayerContext();
915
+ const handleValueChange = () => {
916
+ player == null ? void 0 : player.currentTime(note.time);
917
+ };
916
918
  return /* @__PURE__ */ jsx24(
917
919
  "div",
918
920
  {
921
+ onClick: handleValueChange,
919
922
  className: "sb-w-1 sb-h-1 sb-rounded-full sb-bg-white sb-absolute sb-z-30",
920
923
  style: { left: `${note.percentage}%` },
921
924
  onMouseEnter: () => setOpen(true),
@@ -1472,6 +1475,7 @@ var ControlBar = ({
1472
1475
  time: Number((player == null ? void 0 : player.currentTime()) || 0),
1473
1476
  isOpen: e
1474
1477
  });
1478
+ player.pause();
1475
1479
  }
1476
1480
  }
1477
1481
  ) }),
@@ -1555,19 +1559,22 @@ var controlBarRoot = {};
1555
1559
  var renderControlBar = (id, player, isPaused, setIsPaused, duration, notes, chapters, seekStep = 5, handleSaveNoteAction, opacity = "0", handleControlDisplayTimer = () => {
1556
1560
  }, bgColor = "transparent", setIsQualityMenuOpen, setIsSubtitleMenuOpen, disableNote, setNoteOpen, noteButtonClick) => {
1557
1561
  const container = document.getElementById(`video-container-${id}`);
1562
+ console.log("container: ", container);
1558
1563
  if (container) {
1564
+ console.log("container1: ");
1559
1565
  container.style.height = "100%";
1560
1566
  container.style.aspectRatio = "16 / 9";
1561
1567
  const element = container.querySelector(".vjs-control-bar");
1562
1568
  if (element) {
1569
+ console.log("container2: ");
1563
1570
  if (!controlBarRoot[id]) {
1564
1571
  controlBarRoot[id] = ReactDOM.createRoot(element);
1572
+ element.style.display = "flex";
1573
+ element.style.height = "100%";
1574
+ element.style.alignItems = "flex-end";
1565
1575
  }
1566
- element.style.display = "flex";
1567
1576
  element.style.opacity = opacity;
1568
1577
  element.style.backgroundColor = `${bgColor} !important`;
1569
- element.style.height = "100%";
1570
- element.style.alignItems = "flex-end";
1571
1578
  controlBarRoot[id].render(
1572
1579
  /* @__PURE__ */ jsx36(SoftBuildersVideoPlayerProvider, { children: /* @__PURE__ */ jsx36(
1573
1580
  ControlBar_default,
@@ -1609,7 +1616,6 @@ var VideoPlayerComponent = forwardRef(
1609
1616
  bottomRedBar = true,
1610
1617
  noteButtonClick
1611
1618
  }, ref) => {
1612
- var _a;
1613
1619
  const videoRef = useRef2(void 0);
1614
1620
  const playerRef = useRef2(void 0);
1615
1621
  const [isReady, setIsReady] = useState14(false);
@@ -1620,9 +1626,9 @@ var VideoPlayerComponent = forwardRef(
1620
1626
  const [bgColor, setBgColor] = useState14("transparent");
1621
1627
  const [isQualityMenuOpen, setIsQualityMenuOpen] = useState14(false);
1622
1628
  const [isSubtitleMenuOpen, setIsSubtitleMenuOpen] = useState14(false);
1623
- const [isHovered, setIsHovered] = useState14(false);
1624
1629
  const [isNoteOpen, setNoteOpen] = useState14(false);
1625
1630
  const onReady = (player) => {
1631
+ console.log("onReady: ", onReady);
1626
1632
  if (playerRef) {
1627
1633
  playerRef.current = player;
1628
1634
  setIsReady(true);
@@ -1655,20 +1661,6 @@ var VideoPlayerComponent = forwardRef(
1655
1661
  onReady(playerRef.current);
1656
1662
  });
1657
1663
  }
1658
- return () => {
1659
- if (playerRef.current) {
1660
- setTimeout(() => {
1661
- if (bigPlayButtonRoot[id]) {
1662
- bigPlayButtonRoot[id].unmount();
1663
- bigPlayButtonRoot[id] = void 0;
1664
- }
1665
- if (controlBarRoot[id]) {
1666
- controlBarRoot[id].unmount();
1667
- controlBarRoot[id] = void 0;
1668
- }
1669
- }, 0);
1670
- }
1671
- };
1672
1664
  }, [options, poster]);
1673
1665
  useEffect14(() => {
1674
1666
  if (playerRef.current && isReady) {
@@ -1704,7 +1696,7 @@ var VideoPlayerComponent = forwardRef(
1704
1696
  setNoteOpen,
1705
1697
  noteButtonClick
1706
1698
  );
1707
- }, 500);
1699
+ }, 0);
1708
1700
  return () => clearTimeout(controlBarTimeout);
1709
1701
  }
1710
1702
  }, [
@@ -1741,19 +1733,30 @@ var VideoPlayerComponent = forwardRef(
1741
1733
  return () => clearInterval(intervalId);
1742
1734
  }
1743
1735
  }, []);
1736
+ useEffect14(() => {
1737
+ var _a, _b;
1738
+ if (playerRef.current) {
1739
+ (_a = playerRef.current) == null ? void 0 : _a.currentTime(startTime);
1740
+ console.log("startTimenotes: ", startTime);
1741
+ (_b = playerRef.current) == null ? void 0 : _b.play();
1742
+ }
1743
+ }, [startTime]);
1744
1744
  useEffect14(() => {
1745
1745
  return () => {
1746
1746
  if (playerRef.current) {
1747
- playerRef.current.dispose();
1748
- playerRef.current = void 0;
1749
- if (bigPlayButtonRoot[id]) {
1750
- bigPlayButtonRoot[id].unmount();
1751
- bigPlayButtonRoot[id] = void 0;
1752
- }
1753
- if (controlBarRoot[id]) {
1754
- controlBarRoot[id].unmount();
1755
- controlBarRoot[id] = void 0;
1756
- }
1747
+ setTimeout(() => {
1748
+ var _a;
1749
+ if (bigPlayButtonRoot[id]) {
1750
+ bigPlayButtonRoot[id].unmount();
1751
+ bigPlayButtonRoot[id] = void 0;
1752
+ }
1753
+ if (controlBarRoot[id]) {
1754
+ controlBarRoot[id].unmount();
1755
+ controlBarRoot[id] = void 0;
1756
+ }
1757
+ (_a = playerRef.current) == null ? void 0 : _a.dispose();
1758
+ playerRef.current = void 0;
1759
+ }, 0);
1757
1760
  }
1758
1761
  };
1759
1762
  }, []);
@@ -1775,22 +1778,12 @@ var VideoPlayerComponent = forwardRef(
1775
1778
  }
1776
1779
  }, [isQualityMenuOpen, isSubtitleMenuOpen]);
1777
1780
  useEffect14(() => {
1778
- console.log("isNoteOpen: ", isNoteOpen);
1779
- if (isNoteOpen) {
1780
- if (timeoutRef.current) {
1781
- clearTimeout(timeoutRef.current);
1782
- }
1783
- } else {
1784
- if (timeoutRef.current) {
1785
- clearTimeout(timeoutRef.current);
1786
- }
1787
- timeoutRef.current = setTimeout(() => {
1788
- setIsControlBarPresent(false);
1789
- }, 3e3);
1781
+ if (playerRef.current) {
1790
1782
  }
1791
- }, [isNoteOpen]);
1783
+ }, [notes]);
1792
1784
  const handlePlayerClick = async (e, isTimerOnly = false) => {
1793
1785
  e.preventDefault();
1786
+ console.log("handlePlayerClick: ", isTimerOnly);
1794
1787
  if (timeoutRef.current) {
1795
1788
  clearTimeout(timeoutRef.current);
1796
1789
  }
@@ -1828,9 +1821,9 @@ var VideoPlayerComponent = forwardRef(
1828
1821
  const observer = new IntersectionObserver(
1829
1822
  (entries) => {
1830
1823
  entries.forEach((entry) => {
1831
- var _a2, _b;
1824
+ var _a, _b;
1832
1825
  if (entry.isIntersecting === false) {
1833
- if (((_a2 = playerRef == null ? void 0 : playerRef.current) == null ? void 0 : _a2.paused()) === false) {
1826
+ if (((_a = playerRef == null ? void 0 : playerRef.current) == null ? void 0 : _a.paused()) === false) {
1834
1827
  try {
1835
1828
  (_b = playerRef == null ? void 0 : playerRef.current) == null ? void 0 : _b.pause();
1836
1829
  setIsPaused(true);
@@ -1858,31 +1851,28 @@ var VideoPlayerComponent = forwardRef(
1858
1851
  const [timeSeeker, setTimeSeeker] = useState14("0");
1859
1852
  useEffect14(() => {
1860
1853
  const updateTimeSeeker = () => {
1861
- var _a2, _b, _c, _d;
1862
- if (playerRef == null ? void 0 : playerRef.current) {
1863
- const currentTime = (_b = (_a2 = playerRef.current) == null ? void 0 : _a2.currentTime) == null ? void 0 : _b.call(_a2);
1864
- const duration2 = (_d = (_c = playerRef.current) == null ? void 0 : _c.duration) == null ? void 0 : _d.call(_c);
1854
+ if (playerRef.current) {
1855
+ const currentTime = playerRef.current.currentTime();
1856
+ const duration2 = playerRef.current.duration();
1865
1857
  if (duration2 && currentTime !== void 0) {
1866
- const value = `${currentTime / duration2 * 100}%`;
1867
- setTimeSeeker(value);
1858
+ setTimeSeeker(`${currentTime / duration2 * 100}%`);
1868
1859
  } else {
1869
1860
  setTimeSeeker("0");
1870
1861
  }
1871
1862
  }
1872
1863
  };
1873
- updateTimeSeeker();
1874
- }, [(_a = playerRef == null ? void 0 : playerRef.current) == null ? void 0 : _a.currentTime()]);
1864
+ const interval = setInterval(updateTimeSeeker, 500);
1865
+ return () => clearInterval(interval);
1866
+ }, [playerRef]);
1875
1867
  return /* @__PURE__ */ jsxs15(
1876
1868
  "div",
1877
1869
  {
1878
1870
  ref: videoRefs,
1879
1871
  id: `video-container-${id}`,
1880
- onMouseMove: () => {
1881
- !isNoteOpen ? handlePlayerClick(event, true) : "";
1872
+ onMouseMove: (e) => {
1873
+ handlePlayerClick(e, true);
1882
1874
  },
1883
1875
  className: "sb-relative sb-rounded-md sb-overflow-hidden sb-w-full sb-h-full sb-bottom-2 ",
1884
- onMouseEnter: () => setIsHovered(true),
1885
- onMouseLeave: () => setIsHovered(false),
1886
1876
  children: [
1887
1877
  bottomRedBar && /* @__PURE__ */ jsx36(
1888
1878
  "div",
@@ -1944,48 +1934,38 @@ var Component = forwardRef2(
1944
1934
  bottomRedBar,
1945
1935
  noteButtonClick
1946
1936
  }, ref) => {
1947
- options = __spreadProps(__spreadValues({}, options), {
1948
- responsive: true,
1949
- inactivityTimeout: 0,
1950
- fullscreen: {
1951
- navigationUI: "hide"
1952
- }
1953
- });
1954
- if (options.autoplay === void 0)
1955
- options.autoplay = DEFAULT_OPTIONS.autoplay;
1956
- if (options.controls === void 0)
1957
- options.controls = DEFAULT_OPTIONS.controls;
1958
- if (options.fluid === void 0) options.fluid = DEFAULT_OPTIONS.fluid;
1959
- if ((options == null ? void 0 : options.muted) === void 0) options.muted = DEFAULT_OPTIONS == null ? void 0 : DEFAULT_OPTIONS.muted;
1960
- if (options.height === void 0) options.height = DEFAULT_OPTIONS.height;
1961
- if (options.width === void 0) options.width = DEFAULT_OPTIONS.width;
1937
+ const mergedOptions = useMemo(
1938
+ () => __spreadProps(__spreadValues(__spreadValues({}, DEFAULT_OPTIONS), options), {
1939
+ responsive: true,
1940
+ inactivityTimeout: 0,
1941
+ fullscreen: { navigationUI: "hide" }
1942
+ }),
1943
+ [options]
1944
+ );
1962
1945
  const [tracks, setTracks] = useState15([]);
1963
- useEffect15(() => {
1964
- }, [isFocused]);
1965
- useEffect15(() => {
1966
- const getTracks = async () => {
1967
- const newTracks = [];
1968
- if (Array.isArray(options == null ? void 0 : options.tracks))
1969
- for (const [i, s] of options == null ? void 0 : options.tracks.entries()) {
1970
- let src = s.src;
1971
- if (s.memeType == "text/srt") {
1972
- src = await convertSRTtoVTT(s.src);
1973
- }
1974
- newTracks.push(__spreadProps(__spreadValues({}, s), {
1975
- src
1976
- }));
1946
+ const getTracks = useCallback4(async () => {
1947
+ const newTracks = [];
1948
+ if (Array.isArray(mergedOptions.tracks)) {
1949
+ for (const s of mergedOptions.tracks) {
1950
+ let src = s.src;
1951
+ if (s.memeType === "text/srt") {
1952
+ src = await convertSRTtoVTT(s.src);
1977
1953
  }
1978
- setTracks(newTracks);
1979
- };
1954
+ newTracks.push(__spreadProps(__spreadValues({}, s), { src }));
1955
+ }
1956
+ }
1957
+ setTracks(newTracks);
1958
+ }, [mergedOptions.tracks]);
1959
+ useEffect15(() => {
1980
1960
  getTracks();
1981
- }, [options == null ? void 0 : options.tracks]);
1982
- const id = (Date.now() + Math.random() * 100).toString();
1961
+ }, [getTracks]);
1962
+ const id = useMemo(() => (Date.now() + Math.random() * 100).toString(), []);
1983
1963
  return /* @__PURE__ */ jsx37(
1984
1964
  VideoPlayerComponent_default,
1985
1965
  {
1986
1966
  id,
1987
1967
  chapters,
1988
- options: __spreadProps(__spreadValues({}, options), { tracks }),
1968
+ options: __spreadProps(__spreadValues({}, mergedOptions), { tracks }),
1989
1969
  notes,
1990
1970
  poster: "",
1991
1971
  startTime,
@@ -2001,7 +1981,8 @@ var Component = forwardRef2(
2001
1981
  }
2002
1982
  );
2003
1983
  var SoftBuildersVideoPlayer = memo(Component, (prevProps, nextProps) => {
2004
- return prevProps.options === nextProps.options && prevProps.notes === nextProps.notes && prevProps.chapters === nextProps.chapters && prevProps.startTime === nextProps.startTime;
1984
+ return prevProps.options === nextProps.options && // prevProps.notes === nextProps.notes &&
1985
+ prevProps.chapters === nextProps.chapters && prevProps.startTime === nextProps.startTime;
2005
1986
  });
2006
1987
  var SoftBuildersVideoPlayer_default = SoftBuildersVideoPlayer;
2007
1988
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "softbuilders-react-video-player",
3
3
  "description": "Standalone video player component",
4
- "version": "1.1.72",
4
+ "version": "1.1.74",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "files": [
@@ -33,6 +33,7 @@
33
33
  "@swc/core": "^1.7.26",
34
34
  "@types/react": "^18.3.5",
35
35
  "@types/react-dom": "^18.3.0",
36
+ "@types/video.js": "^7.3.58",
36
37
  "autoprefixer": "^10.4.20",
37
38
  "concurrently": "^9.0.1",
38
39
  "copyfiles": "^2.4.1",