softbuilders-react-video-player 1.1.7 → 1.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +126 -126
  3. package/dist/components/BigPlayButton/index.tsx +31 -31
  4. package/dist/components/BufferTracker/index.tsx +19 -19
  5. package/dist/components/ChapterTooltip/index.tsx +65 -65
  6. package/dist/components/ChaptersPanal/index.tsx +40 -40
  7. package/dist/components/ControlBar/index.d.ts +2 -1
  8. package/dist/components/ControlBar/index.js +19 -5
  9. package/dist/components/ControlBar/index.js.map +1 -1
  10. package/dist/components/ControlBar/index.tsx +149 -127
  11. package/dist/components/CreateNoteMenu/index.tsx +61 -61
  12. package/dist/components/CurrentTimeLabel/index.tsx +13 -13
  13. package/dist/components/CurrentTimeTracker/index.tsx +18 -18
  14. package/dist/components/Menu/index.tsx +49 -49
  15. package/dist/components/MenuButton/index.js +1 -1
  16. package/dist/components/MenuButton/index.js.map +1 -1
  17. package/dist/components/MenuButton/index.tsx +67 -67
  18. package/dist/components/NoteTooltip/index.tsx +46 -46
  19. package/dist/components/NotesPanal/index.tsx +34 -34
  20. package/dist/components/QualityMenu/index.js +2 -2
  21. package/dist/components/QualityMenu/index.js.map +1 -1
  22. package/dist/components/QualityMenu/index.tsx +122 -122
  23. package/dist/components/Slider/index.d.ts +1 -1
  24. package/dist/components/Slider/index.js +3 -3
  25. package/dist/components/Slider/index.js.map +1 -1
  26. package/dist/components/Slider/index.tsx +36 -37
  27. package/dist/components/Slider/style.css +49 -15
  28. package/dist/components/SoftBuildersVideoPlayer/index.js +1 -1
  29. package/dist/components/SoftBuildersVideoPlayer/index.js.map +1 -1
  30. package/dist/components/SoftBuildersVideoPlayer/index.tsx +110 -109
  31. package/dist/components/SubtitleMenu/index.js +2 -2
  32. package/dist/components/SubtitleMenu/index.js.map +1 -1
  33. package/dist/components/SubtitleMenu/index.tsx +107 -108
  34. package/dist/components/TimeSlider/index.js +13 -13
  35. package/dist/components/TimeSlider/index.tsx +107 -107
  36. package/dist/components/TimeSliderContainer/index.tsx +35 -35
  37. package/dist/components/Tooltip/index.tsx +16 -16
  38. package/dist/components/VideoPlayerComponent/index.d.ts +2 -1
  39. package/dist/components/VideoPlayerComponent/index.js +37 -34
  40. package/dist/components/VideoPlayerComponent/index.js.map +1 -1
  41. package/dist/components/VideoPlayerComponent/index.tsx +260 -249
  42. package/dist/components/VideoPlayerComponent/provider.tsx +82 -82
  43. package/dist/components/VideoPlayerComponent/style/style.css +36 -36
  44. package/dist/components/VolumeSlider/index.d.ts +4 -2
  45. package/dist/components/VolumeSlider/index.js +12 -2
  46. package/dist/components/VolumeSlider/index.js.map +1 -1
  47. package/dist/components/VolumeSlider/index.tsx +91 -52
  48. package/dist/components/icons/SubIcon.d.ts +3 -0
  49. package/dist/components/icons/SubIcon.js +4 -0
  50. package/dist/components/icons/SubIcon.js.map +1 -0
  51. package/dist/components/icons/SubIcon.tsx +28 -0
  52. package/dist/components/icons/index.d.ts +1 -0
  53. package/dist/components/icons/index.js +1 -0
  54. package/dist/components/icons/index.js.map +1 -1
  55. package/dist/components/icons/index.ts +15 -14
  56. package/dist/images/index.d.ts +1 -0
  57. package/dist/images/index.js +1 -0
  58. package/dist/images/index.js.map +1 -1
  59. package/dist/index.css +75 -3
  60. package/dist/index.mjs +253 -166
  61. package/dist/styles/tailwind.css +137 -87
  62. package/package.json +45 -45
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/MenuButton/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAQxE,MAAM,UAAU,GAAG,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAS,EAAE,EAAE;IAClE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAEpD,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAEpD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAE,EAAE;YAC/C,IACE,SAAS,CAAC,OAAO;gBACjB,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;gBACjD,OAAO,CAAC,OAAO;gBACf,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EAC/C,CAAC;gBACD,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAC7E,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK;YAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IAEvB,OAAO,CACL,eAAK,SAAS,EAAC,aAAa,aAC1B,iBACE,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,UAAU,mBACL,MAAM,mBACL,MAAM,gBACV,WAAW,YAErB,aAAa,GACP,EAER,MAAM,IAAI,CACT,cACE,GAAG,EAAE,OAAO,EACZ,IAAI,EAAC,MAAM,sBACM,UAAU,qBACX,WAAW,EAC3B,SAAS,EAAC,kDAAkD,YAE3D,WAAW,GACR,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/MenuButton/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAQxE,MAAM,UAAU,GAAG,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAS,EAAE,EAAE;IAClE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAEpD,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAEpD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAE,EAAE;YAC/C,IACE,SAAS,CAAC,OAAO;gBACjB,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;gBACjD,OAAO,CAAC,OAAO;gBACf,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EAC/C,CAAC;gBACD,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAC7E,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK;YAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IAEvB,OAAO,CACL,eAAK,SAAS,EAAC,mCAAmC,aAChD,iBACE,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,UAAU,mBACL,MAAM,mBACL,MAAM,gBACV,WAAW,YAErB,aAAa,GACP,EAER,MAAM,IAAI,CACT,cACE,GAAG,EAAE,OAAO,EACZ,IAAI,EAAC,MAAM,sBACM,UAAU,qBACX,WAAW,EAC3B,SAAS,EAAC,kDAAkD,YAE3D,WAAW,GACR,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1,67 +1,67 @@
1
- import React, { useCallback, useEffect, useRef, useState } from "react";
2
-
3
- type Props = {
4
- buttonContent: React.ReactNode;
5
- menuContent: React.ReactNode;
6
- close?: (fun: Function) => void;
7
- };
8
-
9
- const MenuButton = ({ buttonContent, menuContent, close }: Props) => {
10
- const [isOpen, setIsOpen] = useState(false);
11
- const buttonRef = useRef<HTMLButtonElement | null>(null);
12
- const menuRef = useRef<HTMLDivElement | null>(null);
13
-
14
- const toggleMenu = () => setIsOpen((prev) => !prev);
15
-
16
- const closeMenu = useCallback(() => {
17
- setIsOpen(false);
18
- }, []);
19
-
20
- useEffect(() => {
21
- const handleClickOutside = (event: MouseEvent) => {
22
- if (
23
- buttonRef.current &&
24
- !buttonRef.current.contains(event.target as Node) &&
25
- menuRef.current &&
26
- !menuRef.current.contains(event.target as Node)
27
- ) {
28
- setIsOpen(false);
29
- }
30
- };
31
-
32
- document.addEventListener("mousedown", handleClickOutside);
33
- return () => document.removeEventListener("mousedown", handleClickOutside);
34
- }, []);
35
-
36
- useEffect(() => {
37
- if (close) close(closeMenu);
38
- }, [close, closeMenu]);
39
-
40
- return (
41
- <div className="sb-relative">
42
- <button
43
- ref={buttonRef}
44
- onClick={toggleMenu}
45
- aria-haspopup="true"
46
- aria-expanded={isOpen}
47
- aria-label="Open menu"
48
- >
49
- {buttonContent}
50
- </button>
51
-
52
- {isOpen && (
53
- <div
54
- ref={menuRef}
55
- role="menu"
56
- aria-orientation="vertical"
57
- aria-labelledby="Open menu"
58
- className="sb-absolute sb-shadow-lg sb-right-0 sb-bottom-10"
59
- >
60
- {menuContent}
61
- </div>
62
- )}
63
- </div>
64
- );
65
- };
66
-
67
- export default MenuButton;
1
+ import React, { useCallback, useEffect, useRef, useState } from "react";
2
+
3
+ type Props = {
4
+ buttonContent: React.ReactNode;
5
+ menuContent: React.ReactNode;
6
+ close?: (fun: Function) => void;
7
+ };
8
+
9
+ const MenuButton = ({ buttonContent, menuContent, close }: Props) => {
10
+ const [isOpen, setIsOpen] = useState(false);
11
+ const buttonRef = useRef<HTMLButtonElement | null>(null);
12
+ const menuRef = useRef<HTMLDivElement | null>(null);
13
+
14
+ const toggleMenu = () => setIsOpen((prev) => !prev);
15
+
16
+ const closeMenu = useCallback(() => {
17
+ setIsOpen(false);
18
+ }, []);
19
+
20
+ useEffect(() => {
21
+ const handleClickOutside = (event: MouseEvent) => {
22
+ if (
23
+ buttonRef.current &&
24
+ !buttonRef.current.contains(event.target as Node) &&
25
+ menuRef.current &&
26
+ !menuRef.current.contains(event.target as Node)
27
+ ) {
28
+ setIsOpen(false);
29
+ }
30
+ };
31
+
32
+ document.addEventListener("mousedown", handleClickOutside);
33
+ return () => document.removeEventListener("mousedown", handleClickOutside);
34
+ }, []);
35
+
36
+ useEffect(() => {
37
+ if (close) close(closeMenu);
38
+ }, [close, closeMenu]);
39
+
40
+ return (
41
+ <div className="sb-relative sb-flex sb-items-end">
42
+ <button
43
+ ref={buttonRef}
44
+ onClick={toggleMenu}
45
+ aria-haspopup="true"
46
+ aria-expanded={isOpen}
47
+ aria-label="Open menu"
48
+ >
49
+ {buttonContent}
50
+ </button>
51
+
52
+ {isOpen && (
53
+ <div
54
+ ref={menuRef}
55
+ role="menu"
56
+ aria-orientation="vertical"
57
+ aria-labelledby="Open menu"
58
+ className="sb-absolute sb-shadow-lg sb-right-0 sb-bottom-10"
59
+ >
60
+ {menuContent}
61
+ </div>
62
+ )}
63
+ </div>
64
+ );
65
+ };
66
+
67
+ export default MenuButton;
@@ -1,46 +1,46 @@
1
- import React, { useEffect, useState } from "react";
2
- import Tooltip from "../Tooltip";
3
- import { durationFormater } from "../../utils";
4
- import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
5
- import { SoftBuildersVideoPlayerNote } from "../../types";
6
- type Note = SoftBuildersVideoPlayerNote & { percentage: number };
7
-
8
- type Props = {
9
- note: Note;
10
- };
11
-
12
- const NoteTooltip = ({ note }: Props) => {
13
- const [open, setOpen] = useState(false);
14
- const { currentTime } = useSoftBuildersVideoPlayerContext();
15
-
16
- useEffect(() => {
17
- if (currentTime === Math.floor(note.time)) {
18
- setOpen(true);
19
-
20
- setTimeout(() => {
21
- setOpen(false);
22
- }, 5000);
23
- }
24
- }, [currentTime, note.time]);
25
- return (
26
- <div
27
- className="sb-w-1 sb-h-1 sb-rounded-full sb-bg-white sb-absolute sb-z-30"
28
- style={{ left: `${note.percentage}%` }}
29
- onMouseEnter={() => setOpen(true)}
30
- onMouseLeave={() => setOpen(false)}
31
- >
32
- <div className="sb-relative">
33
- <Tooltip open={open}>
34
- <div className="sb-flex sb-flex-col sb-gap-2 sb-items-center">
35
- <p>{note.label}</p>
36
- <p className="sb-p-2 sb-bg-[#303030] sb-bg-opacity-50 sb-rounded-md">
37
- {durationFormater(note.time)}
38
- </p>
39
- </div>
40
- </Tooltip>
41
- </div>
42
- </div>
43
- );
44
- };
45
-
46
- export default NoteTooltip;
1
+ import React, { useEffect, useState } from "react";
2
+ import Tooltip from "../Tooltip";
3
+ import { durationFormater } from "../../utils";
4
+ import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
5
+ import { SoftBuildersVideoPlayerNote } from "../../types";
6
+ type Note = SoftBuildersVideoPlayerNote & { percentage: number };
7
+
8
+ type Props = {
9
+ note: Note;
10
+ };
11
+
12
+ const NoteTooltip = ({ note }: Props) => {
13
+ const [open, setOpen] = useState(false);
14
+ const { currentTime } = useSoftBuildersVideoPlayerContext();
15
+
16
+ useEffect(() => {
17
+ if (currentTime === Math.floor(note.time)) {
18
+ setOpen(true);
19
+
20
+ setTimeout(() => {
21
+ setOpen(false);
22
+ }, 5000);
23
+ }
24
+ }, [currentTime, note.time]);
25
+ return (
26
+ <div
27
+ className="sb-w-1 sb-h-1 sb-rounded-full sb-bg-white sb-absolute sb-z-30"
28
+ style={{ left: `${note.percentage}%` }}
29
+ onMouseEnter={() => setOpen(true)}
30
+ onMouseLeave={() => setOpen(false)}
31
+ >
32
+ <div className="sb-relative">
33
+ <Tooltip open={open}>
34
+ <div className="sb-flex sb-flex-col sb-gap-2 sb-items-center">
35
+ <p>{note.label}</p>
36
+ <p className="sb-p-2 sb-bg-[#303030] sb-bg-opacity-50 sb-rounded-md">
37
+ {durationFormater(note.time)}
38
+ </p>
39
+ </div>
40
+ </Tooltip>
41
+ </div>
42
+ </div>
43
+ );
44
+ };
45
+
46
+ export default NoteTooltip;
@@ -1,34 +1,34 @@
1
- import React, { useEffect, useState } from "react";
2
- import NoteTooltip from "../NoteTooltip";
3
- import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
4
- import { SoftBuildersVideoPlayerNote } from "../../types";
5
-
6
- type Note = SoftBuildersVideoPlayerNote & { percentage: number };
7
- type Props = {
8
- notes: SoftBuildersVideoPlayerNote[];
9
- };
10
- const NotesPanal = ({ notes }: Props) => {
11
- const [ns, setNs] = useState<Note[]>([]);
12
-
13
- const { duration } = useSoftBuildersVideoPlayerContext();
14
-
15
- useEffect(() => {
16
- const newNs = notes.map((n) => {
17
- const percentage = Math.floor((n.time * 100) / duration);
18
- return {
19
- ...n,
20
- percentage,
21
- };
22
- });
23
- setNs(newNs);
24
- }, [notes, duration]);
25
- return (
26
- <div id="notes-panal" className="sb-w-full sb-h-full sb-relative ">
27
- {ns.map((n, i) => (
28
- <NoteTooltip key={`note-${i}-${n.time}`} note={n} />
29
- ))}
30
- </div>
31
- );
32
- };
33
-
34
- export default NotesPanal;
1
+ import React, { useEffect, useState } from "react";
2
+ import NoteTooltip from "../NoteTooltip";
3
+ import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
4
+ import { SoftBuildersVideoPlayerNote } from "../../types";
5
+
6
+ type Note = SoftBuildersVideoPlayerNote & { percentage: number };
7
+ type Props = {
8
+ notes: SoftBuildersVideoPlayerNote[];
9
+ };
10
+ const NotesPanal = ({ notes }: Props) => {
11
+ const [ns, setNs] = useState<Note[]>([]);
12
+
13
+ const { duration } = useSoftBuildersVideoPlayerContext();
14
+
15
+ useEffect(() => {
16
+ const newNs = notes.map((n) => {
17
+ const percentage = Math.floor((n.time * 100) / duration);
18
+ return {
19
+ ...n,
20
+ percentage,
21
+ };
22
+ });
23
+ setNs(newNs);
24
+ }, [notes, duration]);
25
+ return (
26
+ <div id="notes-panal" className="sb-w-full sb-h-full sb-relative ">
27
+ {ns.map((n, i) => (
28
+ <NoteTooltip key={`note-${i}-${n.time}`} note={n} />
29
+ ))}
30
+ </div>
31
+ );
32
+ };
33
+
34
+ export default NotesPanal;
@@ -21,11 +21,11 @@ const QualityMenu = ({}) => {
21
21
  setCurrentQualitySrc(quality.src);
22
22
  }
23
23
  }, [player]);
24
- return (_jsx(MenuButton, { buttonContent: _jsx(SettingsIcon, { className: "sb-w-3 sb-h-3" }), menuContent: _jsx("div", { className: "sb-rounded-md sb-bg-[#303030] sb-bg-opacity-50 sb-py-5 sb-w-[150px]", children: _jsxs("div", { className: "sb-flex sb-flex-col sb-gap-3", children: [_jsxs("div", { className: "sb-px-5 sb-flex sb-flex-row sb-gap-3 sb-items-start", children: [_jsx("button", { onClick: () => {
24
+ return (_jsx(MenuButton, { buttonContent: _jsx(SettingsIcon, { className: "sb-w-3 sb-h-3" }), menuContent: _jsx("div", { className: "sb-rounded-md sb-bg-[#303030] sb-bg-opacity-50 sb-py-5 sb-w-[150px]", children: _jsxs("div", { className: "sb-flex sb-flex-col sb-gap-3", children: [_jsxs("div", { className: "sb-px-5 sb-flex sb-flex-row sb-gap-3 sb-items-start sb-relative sb-top-2", children: [_jsx("button", { onClick: () => {
25
25
  if (closeMenuFunction) {
26
26
  closeMenuFunction();
27
27
  }
28
- }, className: "hover:sb-scale-150", children: _jsx(LeftArrowIcon, { className: "sb-w-3 sb-h-3" }) }), _jsx("h3", { children: "Quality" })] }), _jsx("div", { className: "sb-w-full sb-h-[.1px] sb-bg-[#AAAAAA] sb-bg-opacity-70" }), _jsx("div", { className: "sb-px-5 sb-flex sb-flex-col sb-gap-3 sb-items-start", children: qualities.map((q, i) => {
28
+ }, className: "hover:sb-scale-150", children: _jsx(LeftArrowIcon, { className: "sb-w-3 sb-h-3" }) }), _jsx("h3", { children: "Quality" })] }), _jsx("div", { className: "sb-w-full sb-h-[.1px] sb-bg-[#AAAAAA] sb-bg-opacity-70" }), _jsx("div", { className: "sb-px-5 sb-flex sb-flex-col sb-gap-3 sb-items-start ", children: qualities.map((q, i) => {
29
29
  return (_jsx(QualityOption, { isSelected: currentQualitySrc === q.src, quality: q, onClick: () => {
30
30
  const source = qualities.find((_q) => q.label == _q.label);
31
31
  if (source && source.src != currentQualitySrc) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/QualityMenu/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/QualityMenu/index.tsx"],"names":[],"mappings":"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"}
@@ -1,122 +1,122 @@
1
- import React, { useCallback, useEffect, useState } from "react";
2
- import MenuButton from "../MenuButton";
3
- import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
4
-
5
- import { SoftBuildersVideoPlayerSource } from "../../types";
6
- import { CheckedIcon, LeftArrowIcon, SettingsIcon } from "../../images";
7
-
8
- type QualityOptionProps = {
9
- isSelected: boolean;
10
- quality: SoftBuildersVideoPlayerSource;
11
- onClick: () => void;
12
- };
13
- const QualityOption = ({
14
- isSelected,
15
- quality,
16
- onClick,
17
- }: QualityOptionProps) => {
18
- return (
19
- <button className="hover:sb-text-orange-500 sb-p-2" onClick={onClick}>
20
- <div className="sb-grid sb-grid-cols-12 sb-items-center sb-gap-2">
21
- <div className="sb-col-span-3">
22
- {isSelected ? <CheckedIcon className="sb-w-5 sb-h-5" /> : <div></div>}
23
- </div>
24
-
25
- <p className="sb-text-left sb-col-span-9">{quality.label}</p>
26
- </div>
27
- </button>
28
- );
29
- };
30
-
31
- type QualityMenuProps = {};
32
-
33
- const QualityMenu = ({}: QualityMenuProps) => {
34
- const { player } = useSoftBuildersVideoPlayerContext();
35
-
36
- const [closeMenuFunction, setCloseMenuFunction] = useState<
37
- Function | undefined
38
- >(undefined);
39
-
40
- const [qualities, setQualities] = useState<SoftBuildersVideoPlayerSource[]>(
41
- []
42
- );
43
-
44
- const [currentQualitySrc, setCurrentQualitySrc] = useState<
45
- string | undefined
46
- >(undefined);
47
-
48
- useEffect(() => {
49
- if (player) {
50
- const sources = player.currentSources();
51
-
52
- const qs: SoftBuildersVideoPlayerSource[] = JSON.parse(
53
- JSON.stringify(sources)
54
- );
55
-
56
- setQualities(qs);
57
-
58
- const source = player.currentSource();
59
- const quality: SoftBuildersVideoPlayerSource = JSON.parse(
60
- JSON.stringify(source)
61
- );
62
-
63
- setCurrentQualitySrc(quality.src);
64
- }
65
- }, [player]);
66
-
67
- return (
68
- <MenuButton
69
- buttonContent={<SettingsIcon className="sb-w-3 sb-h-3" />}
70
- menuContent={
71
- <div className="sb-rounded-md sb-bg-[#303030] sb-bg-opacity-50 sb-py-5 sb-w-[150px]">
72
- <div className="sb-flex sb-flex-col sb-gap-3">
73
- <div className="sb-px-5 sb-flex sb-flex-row sb-gap-3 sb-items-start">
74
- <button
75
- onClick={() => {
76
- if (closeMenuFunction) {
77
- closeMenuFunction();
78
- }
79
- }}
80
- className="hover:sb-scale-150"
81
- >
82
- <LeftArrowIcon className="sb-w-3 sb-h-3" />
83
- </button>
84
- <h3>Quality</h3>
85
- </div>
86
-
87
- <div className="sb-w-full sb-h-[.1px] sb-bg-[#AAAAAA] sb-bg-opacity-70" />
88
-
89
- <div className="sb-px-5 sb-flex sb-flex-col sb-gap-3 sb-items-start">
90
- {qualities.map((q, i) => {
91
- return (
92
- <QualityOption
93
- key={`quality-${q.label}-${i}`}
94
- isSelected={currentQualitySrc === q.src}
95
- quality={q}
96
- onClick={() => {
97
- const source = qualities.find(
98
- (_q) => q.label == _q.label
99
- );
100
- if (source && source.src != currentQualitySrc) {
101
- player?.src(source.src);
102
- const currentTime = player?.currentTime();
103
- setCurrentQualitySrc(source.src);
104
- player?.currentTime(currentTime);
105
- player?.play();
106
- }
107
- }}
108
- />
109
- );
110
- })}
111
- </div>
112
- </div>
113
- </div>
114
- }
115
- close={(fn: Function) => {
116
- setCloseMenuFunction(() => fn);
117
- }}
118
- />
119
- );
120
- };
121
-
122
- export default QualityMenu;
1
+ import React, { useCallback, useEffect, useState } from "react";
2
+ import MenuButton from "../MenuButton";
3
+ import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
4
+
5
+ import { SoftBuildersVideoPlayerSource } from "../../types";
6
+ import { CheckedIcon, LeftArrowIcon, SettingsIcon } from "../../images";
7
+
8
+ type QualityOptionProps = {
9
+ isSelected: boolean;
10
+ quality: SoftBuildersVideoPlayerSource;
11
+ onClick: () => void;
12
+ };
13
+ const QualityOption = ({
14
+ isSelected,
15
+ quality,
16
+ onClick,
17
+ }: QualityOptionProps) => {
18
+ return (
19
+ <button className="hover:sb-text-orange-500 sb-p-2" onClick={onClick}>
20
+ <div className="sb-grid sb-grid-cols-12 sb-items-center sb-gap-2">
21
+ <div className="sb-col-span-3">
22
+ {isSelected ? <CheckedIcon className="sb-w-5 sb-h-5" /> : <div></div>}
23
+ </div>
24
+
25
+ <p className="sb-text-left sb-col-span-9">{quality.label}</p>
26
+ </div>
27
+ </button>
28
+ );
29
+ };
30
+
31
+ type QualityMenuProps = {};
32
+
33
+ const QualityMenu = ({}: QualityMenuProps) => {
34
+ const { player } = useSoftBuildersVideoPlayerContext();
35
+
36
+ const [closeMenuFunction, setCloseMenuFunction] = useState<
37
+ Function | undefined
38
+ >(undefined);
39
+
40
+ const [qualities, setQualities] = useState<SoftBuildersVideoPlayerSource[]>(
41
+ []
42
+ );
43
+
44
+ const [currentQualitySrc, setCurrentQualitySrc] = useState<
45
+ string | undefined
46
+ >(undefined);
47
+
48
+ useEffect(() => {
49
+ if (player) {
50
+ const sources = player.currentSources();
51
+
52
+ const qs: SoftBuildersVideoPlayerSource[] = JSON.parse(
53
+ JSON.stringify(sources)
54
+ );
55
+
56
+ setQualities(qs);
57
+
58
+ const source = player.currentSource();
59
+ const quality: SoftBuildersVideoPlayerSource = JSON.parse(
60
+ JSON.stringify(source)
61
+ );
62
+
63
+ setCurrentQualitySrc(quality.src);
64
+ }
65
+ }, [player]);
66
+
67
+ return (
68
+ <MenuButton
69
+ buttonContent={<SettingsIcon className="sb-w-3 sb-h-3" />}
70
+ menuContent={
71
+ <div className="sb-rounded-md sb-bg-[#303030] sb-bg-opacity-50 sb-py-5 sb-w-[150px]">
72
+ <div className="sb-flex sb-flex-col sb-gap-3">
73
+ <div className="sb-px-5 sb-flex sb-flex-row sb-gap-3 sb-items-start sb-relative sb-top-2">
74
+ <button
75
+ onClick={() => {
76
+ if (closeMenuFunction) {
77
+ closeMenuFunction();
78
+ }
79
+ }}
80
+ className="hover:sb-scale-150"
81
+ >
82
+ <LeftArrowIcon className="sb-w-3 sb-h-3" />
83
+ </button>
84
+ <h3>Quality</h3>
85
+ </div>
86
+
87
+ <div className="sb-w-full sb-h-[.1px] sb-bg-[#AAAAAA] sb-bg-opacity-70" />
88
+
89
+ <div className="sb-px-5 sb-flex sb-flex-col sb-gap-3 sb-items-start ">
90
+ {qualities.map((q, i) => {
91
+ return (
92
+ <QualityOption
93
+ key={`quality-${q.label}-${i}`}
94
+ isSelected={currentQualitySrc === q.src}
95
+ quality={q}
96
+ onClick={() => {
97
+ const source = qualities.find(
98
+ (_q) => q.label == _q.label
99
+ );
100
+ if (source && source.src != currentQualitySrc) {
101
+ player?.src(source.src);
102
+ const currentTime = player?.currentTime();
103
+ setCurrentQualitySrc(source.src);
104
+ player?.currentTime(currentTime);
105
+ player?.play();
106
+ }
107
+ }}
108
+ />
109
+ );
110
+ })}
111
+ </div>
112
+ </div>
113
+ </div>
114
+ }
115
+ close={(fn: Function) => {
116
+ setCloseMenuFunction(() => fn);
117
+ }}
118
+ />
119
+ );
120
+ };
121
+
122
+ export default QualityMenu;
@@ -6,5 +6,5 @@ type Props = {
6
6
  min?: number;
7
7
  max?: number;
8
8
  } & InputHTMLAttributes<HTMLInputElement>;
9
- declare const Slider: ({ value, handleValueChange, min, max, ...rest }: Props) => import("react/jsx-runtime").JSX.Element;
9
+ declare const Slider: ({ value, handleValueChange, min, max, className, ...rest }: Props) => import("react/jsx-runtime").JSX.Element;
10
10
  export default Slider;
@@ -12,9 +12,9 @@ var __rest = (this && this.__rest) || function (s, e) {
12
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
13
  import "./style.css";
14
14
  const Slider = (_a) => {
15
- var { value, handleValueChange, min = 0, max = 100 } = _a, rest = __rest(_a, ["value", "handleValueChange", "min", "max"]);
16
- return (_jsx("input", Object.assign({ type: "range", min: min, max: max, value: value, onChange: handleValueChange, className: "sb-w-full sb-h-2 sb-bg-transparent sb-bg-opacity-50 sb-rounded-lg sb-appearance-none sb-cursor-pointer sb-range-slider sb-slider-thumb " +
17
- rest.className, style: {
15
+ var { value, handleValueChange, min = 0, max = 100, className } = _a, rest = __rest(_a, ["value", "handleValueChange", "min", "max", "className"]);
16
+ return (_jsx("input", Object.assign({ type: "range", min: min, max: max, value: value, onChange: handleValueChange, className: `sb-w-full sb-h-2 sb-bg-transparent sb-bg-opacity-50 sb-rounded-lg sb-appearance-none sb-cursor-pointer sb-range-slider sb-slider-thumb
17
+ ${className}`, style: {
18
18
  background: `linear-gradient(to right, #f97316 ${value}%, #30303070 ${value}%)`,
19
19
  } }, rest)));
20
20
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Slider/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,aAAa,CAAC;AASrB,MAAM,MAAM,GAAG,CAAC,EAMR,EAAE,EAAE;QANI,EACd,KAAK,EACL,iBAAiB,EACjB,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,GAAG,OAEH,EADH,IAAI,cALO,4CAMf,CADQ;IAEP,OAAO,CACL,8BACE,IAAI,EAAC,OAAO,EACZ,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EACP,yIAAyI;YACzI,IAAI,CAAC,SAAS,EAEhB,KAAK,EAAE;YACL,UAAU,EAAE,qCAAqC,KAAK,gBAAgB,KAAK,IAAI;SAChF,IACG,IAAI,EACR,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Slider/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,aAAa,CAAC;AASrB,MAAM,MAAM,GAAG,CAAC,EAOR,EAAE,EAAE;QAPI,EACd,KAAK,EACL,iBAAiB,EACjB,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,GAAG,EACT,SAAS,OAEH,EADH,IAAI,cANO,yDAOf,CADQ;IAEP,OAAO,CACL,8BACE,IAAI,EAAC,OAAO,EACZ,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE;UACP,SAAS,EAAE,EACf,KAAK,EAAE;YACL,UAAU,EAAE,qCAAqC,KAAK,gBAAgB,KAAK,IAAI;SAChF,IACG,IAAI,EACR,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,MAAM,CAAC"}