softbuilders-react-video-player 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/LICENSE +21 -0
- package/README.md +126 -0
- package/dist/components/BigPlayButton/index.d.ts +9 -0
- package/dist/components/BigPlayButton/index.js +15 -0
- package/dist/components/BigPlayButton/index.js.map +1 -0
- package/dist/components/BufferTracker/index.d.ts +3 -0
- package/dist/components/BufferTracker/index.js +16 -0
- package/dist/components/BufferTracker/index.js.map +1 -0
- package/dist/components/ChapterTooltip/index.d.ts +11 -0
- package/dist/components/ChapterTooltip/index.js +36 -0
- package/dist/components/ChapterTooltip/index.js.map +1 -0
- package/dist/components/ChaptersPanal/index.d.ts +7 -0
- package/dist/components/ChaptersPanal/index.js +19 -0
- package/dist/components/ChaptersPanal/index.js.map +1 -0
- package/dist/components/ControlBar/index.d.ts +15 -0
- package/dist/components/ControlBar/index.js +64 -0
- package/dist/components/ControlBar/index.js.map +1 -0
- package/dist/components/CreateNoteMenu/index.d.ts +6 -0
- package/dist/components/CreateNoteMenu/index.js +29 -0
- package/dist/components/CreateNoteMenu/index.js.map +1 -0
- package/dist/components/CurrentTimeLabel/index.d.ts +4 -0
- package/dist/components/CurrentTimeLabel/index.js +10 -0
- package/dist/components/CurrentTimeLabel/index.js.map +1 -0
- package/dist/components/CurrentTimeTracker/index.d.ts +3 -0
- package/dist/components/CurrentTimeTracker/index.js +15 -0
- package/dist/components/CurrentTimeTracker/index.js.map +1 -0
- package/dist/components/Menu/index.d.ts +6 -0
- package/dist/components/Menu/index.js +11 -0
- package/dist/components/Menu/index.js.map +1 -0
- package/dist/components/MenuButton/index.d.ts +8 -0
- package/dist/components/MenuButton/index.js +31 -0
- package/dist/components/MenuButton/index.js.map +1 -0
- package/dist/components/NoteTooltip/index.d.ts +10 -0
- package/dist/components/NoteTooltip/index.js +24 -0
- package/dist/components/NoteTooltip/index.js.map +1 -0
- package/dist/components/NotesPanal/index.d.ts +7 -0
- package/dist/components/NotesPanal/index.js +17 -0
- package/dist/components/NotesPanal/index.js.map +1 -0
- package/dist/components/QualityMenu/index.d.ts +4 -0
- package/dist/components/QualityMenu/index.js +53 -0
- package/dist/components/QualityMenu/index.js.map +1 -0
- package/dist/components/Slider/index.d.ts +10 -0
- package/dist/components/Slider/index.js +22 -0
- package/dist/components/Slider/index.js.map +1 -0
- package/dist/components/Slider/style.css +15 -0
- package/dist/components/SoftBuildersVideoPlayer/index.d.ts +13 -0
- package/dist/components/SoftBuildersVideoPlayer/index.js +55 -0
- package/dist/components/SoftBuildersVideoPlayer/index.js.map +1 -0
- package/dist/components/SubtitleMenu/index.d.ts +4 -0
- package/dist/components/SubtitleMenu/index.js +54 -0
- package/dist/components/SubtitleMenu/index.js.map +1 -0
- package/dist/components/TimeSlider/index.d.ts +7 -0
- package/dist/components/TimeSlider/index.js +69 -0
- package/dist/components/TimeSlider/index.js.map +1 -0
- package/dist/components/TimeSliderContainer/index.d.ts +8 -0
- package/dist/components/TimeSliderContainer/index.js +14 -0
- package/dist/components/TimeSliderContainer/index.js.map +1 -0
- package/dist/components/Tooltip/index.d.ts +7 -0
- package/dist/components/Tooltip/index.js +8 -0
- package/dist/components/Tooltip/index.js.map +1 -0
- package/dist/components/VideoPlayerComponent/index.d.ts +17 -0
- package/dist/components/VideoPlayerComponent/index.js +140 -0
- package/dist/components/VideoPlayerComponent/index.js.map +1 -0
- package/dist/components/VideoPlayerComponent/provider.d.ts +18 -0
- package/dist/components/VideoPlayerComponent/provider.js +36 -0
- package/dist/components/VideoPlayerComponent/provider.js.map +1 -0
- package/dist/components/VideoPlayerComponent/style/style.css +36 -0
- package/dist/components/VolumeSlider/index.d.ts +4 -0
- package/dist/components/VolumeSlider/index.js +28 -0
- package/dist/components/VolumeSlider/index.js.map +1 -0
- package/dist/icons/index.d.ts +14 -0
- package/dist/icons/index.js +15 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/styles/tailwind.css +778 -0
- package/dist/types.d.ts +33 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +51 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +37 -0
package/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2024 masri-softbuilders
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
# Usage
|
2
|
+
|
3
|
+
## install the package
|
4
|
+
|
5
|
+
```bash
|
6
|
+
npm i soft-builders-video-player
|
7
|
+
```
|
8
|
+
|
9
|
+
## How to use
|
10
|
+
|
11
|
+
```typescript
|
12
|
+
import SoftBuildersVideoPlayer, {
|
13
|
+
SoftBuildersVideoPlayerOptions,
|
14
|
+
SoftBuildersVideoPlayerChapter,
|
15
|
+
SoftBuildersVideoPlayerNote,
|
16
|
+
} from "soft-builders-video-player";
|
17
|
+
|
18
|
+
const options: SoftBuildersVideoPlayerOptions = {
|
19
|
+
autoplay: false,
|
20
|
+
controls: true,
|
21
|
+
muted: true,
|
22
|
+
fluid: true,
|
23
|
+
poster: "http://example.com/thumbnail.png", // thumbnail preview image
|
24
|
+
height: 420,
|
25
|
+
width: 720,
|
26
|
+
sources: [
|
27
|
+
{
|
28
|
+
src: "https://upload.wikimedia.org/wikipedia/commons/transcoded/a/ab/Caminandes_3_-_Llamigos_-_Blender_Animated_Short.webm/Caminandes_3_-_Llamigos_-_Blender_Animated_Short.webm.360p.vp9.webm",
|
29
|
+
type: "video/webm",
|
30
|
+
label: "360p",
|
31
|
+
},
|
32
|
+
{
|
33
|
+
src: "https://upload.wikimedia.org/wikipedia/commons/transcoded/a/ab/Caminandes_3_-_Llamigos_-_Blender_Animated_Short.webm/Caminandes_3_-_Llamigos_-_Blender_Animated_Short.webm.1080p.vp9.webm",
|
34
|
+
type: "video/webm",
|
35
|
+
label: "1080P",
|
36
|
+
},
|
37
|
+
],
|
38
|
+
tracks: [
|
39
|
+
{
|
40
|
+
kind: "captions",
|
41
|
+
src: "https://raw.githubusercontent.com/brenopolanski/html5-video-webvtt-example/master/MIB2-subtitles-pt-BR.vtt",
|
42
|
+
srclang: "en",
|
43
|
+
label: "English",
|
44
|
+
memeType: "text/vtt", // text/vtt or text/srt
|
45
|
+
default: true,
|
46
|
+
},
|
47
|
+
{
|
48
|
+
kind: "captions",
|
49
|
+
src: "https://gist.githubusercontent.com/samdutton/ca37f3adaf4e23679957b8083e061177/raw/e19399fbccbc069a2af4266e5120ae6bad62699a/sample.vtt",
|
50
|
+
srclang: "es",
|
51
|
+
label: "Espaniol",
|
52
|
+
memeType: "text/vtt", // text/vtt or text/srt
|
53
|
+
},
|
54
|
+
], // only vtt suptitilers are supported for now
|
55
|
+
};
|
56
|
+
|
57
|
+
const initNotes: SoftBuildersVideoPlayerNote[] = [
|
58
|
+
{
|
59
|
+
time: 5,
|
60
|
+
label: "Start",
|
61
|
+
},
|
62
|
+
{
|
63
|
+
time: 30,
|
64
|
+
label: "Say Hello",
|
65
|
+
},
|
66
|
+
{
|
67
|
+
time: 69,
|
68
|
+
label: "Go deep",
|
69
|
+
},
|
70
|
+
{
|
71
|
+
time: 99,
|
72
|
+
label: "Details ...",
|
73
|
+
},
|
74
|
+
{
|
75
|
+
time: 140,
|
76
|
+
label: "End",
|
77
|
+
},
|
78
|
+
];
|
79
|
+
|
80
|
+
const initChapters: SoftBuildersVideoPlayerChapter[] = [
|
81
|
+
{
|
82
|
+
startTime: 25,
|
83
|
+
endTime: 50,
|
84
|
+
title: "01 Note: **** Important ****",
|
85
|
+
},
|
86
|
+
{
|
87
|
+
startTime: 70,
|
88
|
+
endTime: 100,
|
89
|
+
title: "02 Note: To Do",
|
90
|
+
},
|
91
|
+
{ startTime: 110, endTime: 120, title: "03 Note: DIY (Do it yourself)" },
|
92
|
+
{
|
93
|
+
startTime: 125,
|
94
|
+
endTime: 140,
|
95
|
+
title: "05 Note: Conclusion ",
|
96
|
+
},
|
97
|
+
];
|
98
|
+
|
99
|
+
const Component = () => {
|
100
|
+
const handleSaveNoteAction = (time: number, note: string) => {
|
101
|
+
return new Promise((resolve) => {
|
102
|
+
resolve(true);
|
103
|
+
});
|
104
|
+
};
|
105
|
+
|
106
|
+
const onPause = (time: number) => {
|
107
|
+
console.log(`Video has been Paused at time (${time} sec)`);
|
108
|
+
};
|
109
|
+
const onPlay = (time: number) => {
|
110
|
+
console.log(`Video has been Played at time (${time} sec)`);
|
111
|
+
};
|
112
|
+
|
113
|
+
return (
|
114
|
+
<SoftBuildersVideoPlayer
|
115
|
+
options={options}
|
116
|
+
chapters={initChapters}
|
117
|
+
notes={initNotes}
|
118
|
+
handleSaveNoteAction={handleSaveNoteAction}
|
119
|
+
onPause={onPause}
|
120
|
+
onPlay={onPlay}
|
121
|
+
/>
|
122
|
+
);
|
123
|
+
};
|
124
|
+
|
125
|
+
export default Component;
|
126
|
+
```
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import Player from "video.js/dist/types/player";
|
3
|
+
type Props = {
|
4
|
+
player: Player | undefined;
|
5
|
+
isPaused: boolean;
|
6
|
+
setIsPaused: React.Dispatch<React.SetStateAction<boolean>>;
|
7
|
+
};
|
8
|
+
declare const BigPlayButton: ({ player, isPaused, setIsPaused }: Props) => React.JSX.Element;
|
9
|
+
export default BigPlayButton;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import { PauseIcon, PlayIcon } from "../../icons";
|
3
|
+
const BigPlayButton = ({ player, isPaused, setIsPaused }) => {
|
4
|
+
const togglePlay = () => {
|
5
|
+
if (isPaused)
|
6
|
+
player === null || player === void 0 ? void 0 : player.play();
|
7
|
+
else
|
8
|
+
player === null || player === void 0 ? void 0 : player.pause();
|
9
|
+
setIsPaused(!isPaused);
|
10
|
+
};
|
11
|
+
return (React.createElement("button", { onClick: togglePlay },
|
12
|
+
React.createElement("div", { className: "sb-w-16 sb-h-16 sb-rounded-full sb-bg-white/30 sb-backdrop-blur-lg sb-flex sb-items-center sb-justify-center " }, isPaused ? (React.createElement(PlayIcon, { className: "sb-w-4 sb-h-4" })) : (React.createElement(PauseIcon, { className: "sb-w-4 sb-h-4" })))));
|
13
|
+
};
|
14
|
+
export default BigPlayButton;
|
15
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/BigPlayButton/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAOlD,MAAM,aAAa,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAS,EAAE,EAAE;IACjE,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,QAAQ;YAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,EAAE,CAAC;;YACxB,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,EAAE,CAAC;QAErB,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,OAAO,CACL,gCAAQ,OAAO,EAAE,UAAU;QACzB,6BAAK,SAAS,EAAC,+GAA+G,IAC3H,QAAQ,CAAC,CAAC,CAAC,CACV,oBAAC,QAAQ,IAAC,SAAS,EAAC,eAAe,GAAG,CACvC,CAAC,CAAC,CAAC,CACF,oBAAC,SAAS,IAAC,SAAS,EAAC,eAAe,GAAG,CACxC,CACG,CACC,CACV,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import React, { useEffect } from "react";
|
2
|
+
import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
|
3
|
+
const BufferTracker = () => {
|
4
|
+
const { player, setDownloadedBufferTimeufferTime } = useSoftBuildersVideoPlayerContext();
|
5
|
+
useEffect(() => {
|
6
|
+
const intervalId = setInterval(() => {
|
7
|
+
if (player)
|
8
|
+
setDownloadedBufferTimeufferTime(player.bufferedEnd());
|
9
|
+
}, 1000);
|
10
|
+
// Cleanup function to clear the interval
|
11
|
+
return () => clearInterval(intervalId);
|
12
|
+
}, [player]);
|
13
|
+
return React.createElement(React.Fragment, null);
|
14
|
+
};
|
15
|
+
export default BufferTracker;
|
16
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/BufferTracker/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AAErF,MAAM,aAAa,GAAG,GAAG,EAAE;IACzB,MAAM,EAAE,MAAM,EAAE,gCAAgC,EAAE,GAChD,iCAAiC,EAAE,CAAC;IAEtC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YAClC,IAAI,MAAM;gBAAE,gCAAgC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACrE,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,yCAAyC;QACzC,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACb,OAAO,yCAAK,CAAC;AACf,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import { SoftBuildersVideoPlayerChapter } from "../../types";
|
3
|
+
type Chapter = SoftBuildersVideoPlayerChapter & {
|
4
|
+
startPercentage: number;
|
5
|
+
endPercentage: number;
|
6
|
+
};
|
7
|
+
type Props = {
|
8
|
+
chapter: Chapter;
|
9
|
+
};
|
10
|
+
declare const ChapterTooltip: ({ chapter }: Props) => React.JSX.Element;
|
11
|
+
export default ChapterTooltip;
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
2
|
+
import Tooltip from "../Tooltip";
|
3
|
+
import { durationFormater } from "../../utils";
|
4
|
+
import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
|
5
|
+
const ChapterTooltip = ({ chapter }) => {
|
6
|
+
const { player } = useSoftBuildersVideoPlayerContext();
|
7
|
+
const [open, setOpen] = useState(false);
|
8
|
+
const { currentTime } = useSoftBuildersVideoPlayerContext();
|
9
|
+
useEffect(() => {
|
10
|
+
if (currentTime === Math.floor(chapter.startTime)) {
|
11
|
+
setOpen(true);
|
12
|
+
setTimeout(() => {
|
13
|
+
setOpen(false);
|
14
|
+
}, 5000);
|
15
|
+
}
|
16
|
+
}, [currentTime, chapter.startTime]);
|
17
|
+
const handleClickChapter = () => {
|
18
|
+
player === null || player === void 0 ? void 0 : player.currentTime(chapter.startTime);
|
19
|
+
};
|
20
|
+
return (React.createElement("div", { id: `ii-section-${chapter.title}`, className: "sb-flex sb-items-center sb-w-full sb-h-full sb-absolute sb-z-20", style: {
|
21
|
+
left: `${chapter.startPercentage}%`,
|
22
|
+
width: `${chapter.endPercentage - chapter.startPercentage}%`,
|
23
|
+
}, onMouseEnter: () => setOpen(true), onMouseLeave: () => setOpen(false) },
|
24
|
+
React.createElement("button", { id: `section-${chapter.title}`, className: "sb-h-full sb-w-full", onClick: handleClickChapter },
|
25
|
+
React.createElement("div", { className: "sb-relative sb-flex sb-h-full sb-w-full sb-justify-between sb-items-center" },
|
26
|
+
React.createElement(Tooltip, { open: open },
|
27
|
+
React.createElement("div", { className: "sb-flex sb-flex-col sb-gap-2 sb-items-center" },
|
28
|
+
React.createElement("p", null, chapter.title),
|
29
|
+
React.createElement("p", { className: "sb-p-2 sb-bg-[#303030] sb-bg-opacity-50 sb-rounded-md" },
|
30
|
+
durationFormater(chapter.startTime),
|
31
|
+
" -",
|
32
|
+
" ",
|
33
|
+
durationFormater(chapter.endTime))))))));
|
34
|
+
};
|
35
|
+
export default ChapterTooltip;
|
36
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ChapterTooltip/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AAQrF,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAAS,EAAE,EAAE;IAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,iCAAiC,EAAE,CAAC;IAEvD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,WAAW,EAAE,GAAG,iCAAiC,EAAE,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAW,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC;YAEd,UAAU,CAAC,GAAG,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAErC,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC9B,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,OAAO,CACL,6BACE,EAAE,EAAE,cAAc,OAAO,CAAC,KAAK,EAAE,EACjC,SAAS,EAAC,iEAAiE,EAC3E,KAAK,EAAE;YACL,IAAI,EAAE,GAAG,OAAO,CAAC,eAAe,GAAG;YACnC,KAAK,EAAE,GAAG,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,eAAe,GAAG;SAC7D,EACD,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EACjC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAElC,gCACE,EAAE,EAAE,WAAW,OAAO,CAAC,KAAK,EAAE,EAC9B,SAAS,EAAC,qBAAqB,EAC/B,OAAO,EAAE,kBAAkB;YAE3B,6BAAK,SAAS,EAAC,4EAA4E;gBACzF,oBAAC,OAAO,IAAC,IAAI,EAAE,IAAI;oBACjB,6BAAK,SAAS,EAAC,8CAA8C;wBAC3D,+BAAI,OAAO,CAAC,KAAK,CAAK;wBACtB,2BAAG,SAAS,EAAC,uDAAuD;4BACjE,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC;;4BAAI,GAAG;4BAC1C,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAChC,CACA,CACE,CACN,CACC,CACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
2
|
+
import ChapterTooltip from "../ChapterTooltip";
|
3
|
+
import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
|
4
|
+
const ChaptersPanal = ({ chapters }) => {
|
5
|
+
const [cs, setCs] = useState([]);
|
6
|
+
const { duration } = useSoftBuildersVideoPlayerContext();
|
7
|
+
useEffect(() => {
|
8
|
+
const newCs = chapters.map((c) => {
|
9
|
+
const startPercentage = Math.floor((c.startTime * 100) / duration);
|
10
|
+
const endPercentage = Math.floor((c.endTime * 100) / duration);
|
11
|
+
return Object.assign(Object.assign({}, c), { startPercentage,
|
12
|
+
endPercentage });
|
13
|
+
});
|
14
|
+
setCs(newCs);
|
15
|
+
}, [chapters, duration]);
|
16
|
+
return (React.createElement("div", { id: "chapters-panal", className: "sb-w-full sb-h-full sb-relative " }, cs.map((c, i) => (React.createElement(ChapterTooltip, { key: `chapter-${i}-${c.startTime}`, chapter: c })))));
|
17
|
+
};
|
18
|
+
export default ChaptersPanal;
|
19
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ChaptersPanal/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,cAAc,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AASrF,MAAM,aAAa,GAAG,CAAC,EAAE,QAAQ,EAAS,EAAE,EAAE;IAC5C,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAY,EAAE,CAAC,CAAC;IAC5C,MAAM,EAAE,QAAQ,EAAE,GAAG,iCAAiC,EAAE,CAAC;IAEzD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;YACnE,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC/D,uCACK,CAAC,KACJ,eAAe;gBACf,aAAa,IACb;QACJ,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEzB,OAAO,CACL,6BAAK,EAAE,EAAC,gBAAgB,EAAC,SAAS,EAAC,kCAAkC,IAClE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAChB,oBAAC,cAAc,IAAC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,GAAI,CACnE,CAAC,CACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import Player from "video.js/dist/types/player";
|
3
|
+
import { SoftBuildersVideoPlayerChapter, SoftBuildersVideoPlayerNote } from "../../types";
|
4
|
+
type Props<T> = {
|
5
|
+
player: Player | undefined;
|
6
|
+
isPaused: boolean;
|
7
|
+
setIsPaused: React.Dispatch<React.SetStateAction<boolean>>;
|
8
|
+
duration: number;
|
9
|
+
notes: SoftBuildersVideoPlayerNote[];
|
10
|
+
chapters: SoftBuildersVideoPlayerChapter[];
|
11
|
+
seekStep?: number;
|
12
|
+
handleSaveNoteAction?: (time: number, note: string) => Promise<T>;
|
13
|
+
};
|
14
|
+
declare const ControlBar: <T>({ player, isPaused, setIsPaused, duration, notes, chapters, seekStep, handleSaveNoteAction, }: Props<T>) => React.JSX.Element;
|
15
|
+
export default ControlBar;
|
@@ -0,0 +1,64 @@
|
|
1
|
+
import React, { useEffect } from "react";
|
2
|
+
import CurrentTimeLabel from "../CurrentTimeLabel";
|
3
|
+
import { durationFormater } from "../../utils";
|
4
|
+
import VolumeSlider from "../VolumeSlider";
|
5
|
+
import QualityMenu from "../QualityMenu";
|
6
|
+
import CreateNoteMenu from "../CreateNoteMenu";
|
7
|
+
import { BackwardIcon, PlayIcon, PauseIcon, ForwardIcon, FullScreenIcon, } from "../../icons";
|
8
|
+
import TimeSliderContainer from "../TimeSliderContainer";
|
9
|
+
import BufferTracker from "../BufferTracker";
|
10
|
+
import CurrentTimeTracker from "../CurrentTimeTracker";
|
11
|
+
import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
|
12
|
+
import SubtitleMenu from "../SubtitleMenu";
|
13
|
+
const ControlBar = ({ player, isPaused, setIsPaused, duration, notes, chapters, seekStep = 5, handleSaveNoteAction, }) => {
|
14
|
+
const { setPlayer, setDuration } = useSoftBuildersVideoPlayerContext();
|
15
|
+
const seek = (duration) => {
|
16
|
+
const currentTime = Number((player === null || player === void 0 ? void 0 : player.currentTime()) || 0);
|
17
|
+
player === null || player === void 0 ? void 0 : player.currentTime(currentTime + duration);
|
18
|
+
};
|
19
|
+
const togglePlay = () => {
|
20
|
+
if (isPaused)
|
21
|
+
player === null || player === void 0 ? void 0 : player.play();
|
22
|
+
else
|
23
|
+
player === null || player === void 0 ? void 0 : player.pause();
|
24
|
+
setIsPaused(!isPaused);
|
25
|
+
};
|
26
|
+
useEffect(() => {
|
27
|
+
setPlayer(player);
|
28
|
+
}, [player]);
|
29
|
+
useEffect(() => {
|
30
|
+
setDuration(duration);
|
31
|
+
}, [duration]);
|
32
|
+
return (React.createElement("div", { className: "sb-flex sb-items-center sb-justify-center sb-gap-3 sb-w-full" },
|
33
|
+
React.createElement(BufferTracker, null),
|
34
|
+
React.createElement(CurrentTimeTracker, null),
|
35
|
+
React.createElement("button", { onClick: () => {
|
36
|
+
seek(-seekStep);
|
37
|
+
} },
|
38
|
+
React.createElement(BackwardIcon, { className: "sb-w-3 sb-h-3" })),
|
39
|
+
React.createElement("button", { onClick: togglePlay }, isPaused ? (React.createElement(PlayIcon, { className: "sb-w-3 sb-h-3" })) : (React.createElement(PauseIcon, { className: "sb-w-3 sb-h-3" }))),
|
40
|
+
React.createElement("button", { onClick: () => {
|
41
|
+
seek(seekStep);
|
42
|
+
} },
|
43
|
+
React.createElement(ForwardIcon, { className: "sb-w-3 sb-h-3" })),
|
44
|
+
React.createElement(CurrentTimeLabel, null),
|
45
|
+
React.createElement("div", { className: "sb-w-[30%] hover:sb-w-[45%] sb-transition-all sb-ease-in-out sb-duration-500" },
|
46
|
+
React.createElement(TimeSliderContainer, { chapters: chapters, notes: notes })),
|
47
|
+
React.createElement("p", null, durationFormater(duration)),
|
48
|
+
React.createElement("div", { className: "sb-w-[10%]" },
|
49
|
+
React.createElement(VolumeSlider, null)),
|
50
|
+
React.createElement(QualityMenu, null),
|
51
|
+
React.createElement("button", { onClick: () => {
|
52
|
+
if (player === null || player === void 0 ? void 0 : player.isFullscreen()) {
|
53
|
+
player === null || player === void 0 ? void 0 : player.exitFullscreen();
|
54
|
+
}
|
55
|
+
else {
|
56
|
+
player === null || player === void 0 ? void 0 : player.requestFullscreen();
|
57
|
+
}
|
58
|
+
} },
|
59
|
+
React.createElement(FullScreenIcon, { className: "sb-w-3 sb-h-3" })),
|
60
|
+
handleSaveNoteAction && (React.createElement(CreateNoteMenu, { handleSaveNoteAction: handleSaveNoteAction })),
|
61
|
+
React.createElement(SubtitleMenu, null)));
|
62
|
+
};
|
63
|
+
export default ControlBar;
|
64
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ControlBar/index.tsx"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import React, { useState } from "react";
|
2
|
+
import MenuButton from "../MenuButton";
|
3
|
+
import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
|
4
|
+
import { ClosedNoteIcon } from "../../icons";
|
5
|
+
const CreateNoteMenu = ({ handleSaveNoteAction }) => {
|
6
|
+
const { player } = useSoftBuildersVideoPlayerContext();
|
7
|
+
const [note, setNote] = useState("");
|
8
|
+
const handleSaveNote = () => {
|
9
|
+
if (handleSaveNoteAction) {
|
10
|
+
const time = (player === null || player === void 0 ? void 0 : player.currentTime()) || 0;
|
11
|
+
handleSaveNoteAction(time, note).then((response) => {
|
12
|
+
setNote("");
|
13
|
+
});
|
14
|
+
}
|
15
|
+
else {
|
16
|
+
window.alert("Video Player, there is no implementation for the handleSaveNoteAction function");
|
17
|
+
}
|
18
|
+
};
|
19
|
+
return (React.createElement(MenuButton, { buttonContent: React.createElement(ClosedNoteIcon, { className: "sb-w-3 sb-h-3" }), menuContent: React.createElement("div", { className: "sb-rounded-md sb-bg-[#303030] sb-bg-opacity-50 sb-py-5 sb-w-[220px]" },
|
20
|
+
React.createElement("div", { className: "sb-flex sb-flex-col sb-gap-3" },
|
21
|
+
React.createElement("h3", { className: "sb-px-5" }, "Add Note"),
|
22
|
+
React.createElement("div", { className: "sb-w-full sb-h-[.1px] sb-bg-[#AAAAAA] sb-bg-opacity-70" }),
|
23
|
+
React.createElement("div", { className: "sb-px-5 sb-flex sb-flex-col sb-gap-4 sb-items-start" },
|
24
|
+
React.createElement("input", { name: "note", type: "text", placeholder: "Add a note", value: note, onChange: (e) => setNote(e.target.value), required: true, className: "sb-text-white placeholder:sb-text-white sb-w-full sb-bg-transparent sb-px-4 sb-py-3 sb-border sb-border-[#AAAAAA] sb-rounded-md" }),
|
25
|
+
React.createElement("button", { className: "sb-w-full", onClick: handleSaveNote },
|
26
|
+
React.createElement("div", { className: "sb-px-4 sb-py-3 sb-text-center sb-font-bold sb-bg-orange-500 sb-rounded-md" }, "Save"))))) }));
|
27
|
+
};
|
28
|
+
export default CreateNoteMenu;
|
29
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/CreateNoteMenu/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,UAAU,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AAErF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAK7C,MAAM,cAAc,GAAG,CAAK,EAAE,oBAAoB,EAAY,EAAE,EAAE;IAChE,MAAM,EAAE,MAAM,EAAE,GAAG,iCAAiC,EAAE,CAAC;IAEvD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAErC,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,EAAE,KAAI,CAAC,CAAC;YACxC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACjD,OAAO,CAAC,EAAE,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CACV,gFAAgF,CACjF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,oBAAC,UAAU,IACT,aAAa,EAAE,oBAAC,cAAc,IAAC,SAAS,EAAC,eAAe,GAAG,EAC3D,WAAW,EACT,6BAAK,SAAS,EAAC,qEAAqE;YAClF,6BAAK,SAAS,EAAC,8BAA8B;gBAC3C,4BAAI,SAAS,EAAC,SAAS,eAAc;gBAErC,6BAAK,SAAS,EAAC,wDAAwD,GAAG;gBAE1E,6BAAK,SAAS,EAAC,qDAAqD;oBAClE,+BACE,IAAI,EAAC,MAAM,EACX,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,YAAY,EACxB,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACxC,QAAQ,QACR,SAAS,EAAC,iIAAiI,GAC3I;oBAEF,gCAAQ,SAAS,EAAC,WAAW,EAAC,OAAO,EAAE,cAAc;wBACnD,6BAAK,SAAS,EAAC,4EAA4E,WAErF,CACC,CACL,CACF,CACF,GAER,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
"use client";
|
2
|
+
import React from "react";
|
3
|
+
import { durationFormater } from "../../utils";
|
4
|
+
import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
|
5
|
+
const CurrentTimeLabel = ({}) => {
|
6
|
+
const { currentTime } = useSoftBuildersVideoPlayerContext();
|
7
|
+
return React.createElement("p", null, durationFormater(currentTime));
|
8
|
+
};
|
9
|
+
export default CurrentTimeLabel;
|
10
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/CurrentTimeLabel/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,KAAoB,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AAGrF,MAAM,gBAAgB,GAAG,CAAC,EAAS,EAAE,EAAE;IACrC,MAAM,EAAE,WAAW,EAAE,GAAG,iCAAiC,EAAE,CAAC;IAE5D,OAAO,+BAAI,gBAAgB,CAAC,WAAW,CAAC,CAAK,CAAC;AAChD,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import React, { useEffect } from "react";
|
2
|
+
import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
|
3
|
+
const CurrentTimeTracker = () => {
|
4
|
+
const { setCurrentTime, player } = useSoftBuildersVideoPlayerContext();
|
5
|
+
useEffect(() => {
|
6
|
+
const intervalId = setInterval(() => {
|
7
|
+
setCurrentTime((player === null || player === void 0 ? void 0 : player.currentTime()) || 0);
|
8
|
+
}, 500);
|
9
|
+
// Cleanup function to clear the interval
|
10
|
+
return () => clearInterval(intervalId);
|
11
|
+
}, [player]);
|
12
|
+
return React.createElement(React.Fragment, null);
|
13
|
+
};
|
14
|
+
export default CurrentTimeTracker;
|
15
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/CurrentTimeTracker/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AAErF,MAAM,kBAAkB,GAAG,GAAG,EAAE;IAC9B,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,iCAAiC,EAAE,CAAC;IAEvE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YAClC,cAAc,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,EAAE,KAAI,CAAC,CAAC,CAAC;QAC7C,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,yCAAyC;QACzC,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACb,OAAO,yCAAK,CAAC;AACf,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import React from "react";
|
2
|
+
const Menu = ({ name }) => {
|
3
|
+
return (React.createElement("div", { className: "absolute right-0 z-10 w-48 mt-2 origin-top-right bg-white border border-gray-300 rounded-md shadow-lg focus:outline-none" },
|
4
|
+
React.createElement("div", { className: "py-1", role: "menu", "aria-orientation": "vertical", "aria-labelledby": `${name}-button` },
|
5
|
+
React.createElement("a", { href: "#", className: "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900", role: "menuitem" }, "Dashboard"),
|
6
|
+
React.createElement("a", { href: "#", className: "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900", role: "menuitem" }, "Settings"),
|
7
|
+
React.createElement("a", { href: "#", className: "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900", role: "menuitem" }, "Profile"),
|
8
|
+
React.createElement("a", { href: "#", className: "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900", role: "menuitem" }, "Logout"))));
|
9
|
+
};
|
10
|
+
export default Menu;
|
11
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Menu/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAS,EAAE,EAAE;IAC/B,OAAO,CACL,6BAAK,SAAS,EAAC,0HAA0H;QACvI,6BACE,SAAS,EAAC,MAAM,EAChB,IAAI,EAAC,MAAM,sBACM,UAAU,qBACV,GAAG,IAAI,SAAS;YAEjC,2BACE,IAAI,EAAC,GAAG,EACR,SAAS,EAAC,6EAA6E,EACvF,IAAI,EAAC,UAAU,gBAGb;YACJ,2BACE,IAAI,EAAC,GAAG,EACR,SAAS,EAAC,6EAA6E,EACvF,IAAI,EAAC,UAAU,eAGb;YACJ,2BACE,IAAI,EAAC,GAAG,EACR,SAAS,EAAC,6EAA6E,EACvF,IAAI,EAAC,UAAU,cAGb;YACJ,2BACE,IAAI,EAAC,GAAG,EACR,SAAS,EAAC,6EAA6E,EACvF,IAAI,EAAC,UAAU,aAGb,CACA,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import React from "react";
|
2
|
+
type Props = {
|
3
|
+
buttonContent: React.ReactNode;
|
4
|
+
menuContent: React.ReactNode;
|
5
|
+
close?: (fun: Function) => void;
|
6
|
+
};
|
7
|
+
declare const MenuButton: ({ buttonContent, menuContent, close }: Props) => React.JSX.Element;
|
8
|
+
export default MenuButton;
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import React, { useCallback, useEffect, useRef, useState } from "react";
|
2
|
+
const MenuButton = ({ buttonContent, menuContent, close }) => {
|
3
|
+
const [isOpen, setIsOpen] = useState(false);
|
4
|
+
const buttonRef = useRef(null);
|
5
|
+
const menuRef = useRef(null);
|
6
|
+
const toggleMenu = () => setIsOpen((prev) => !prev);
|
7
|
+
const closeMenu = useCallback(() => {
|
8
|
+
setIsOpen(false);
|
9
|
+
}, []);
|
10
|
+
useEffect(() => {
|
11
|
+
const handleClickOutside = (event) => {
|
12
|
+
if (buttonRef.current &&
|
13
|
+
!buttonRef.current.contains(event.target) &&
|
14
|
+
menuRef.current &&
|
15
|
+
!menuRef.current.contains(event.target)) {
|
16
|
+
setIsOpen(false);
|
17
|
+
}
|
18
|
+
};
|
19
|
+
document.addEventListener("mousedown", handleClickOutside);
|
20
|
+
return () => document.removeEventListener("mousedown", handleClickOutside);
|
21
|
+
}, []);
|
22
|
+
useEffect(() => {
|
23
|
+
if (close)
|
24
|
+
close(closeMenu);
|
25
|
+
}, [close, closeMenu]);
|
26
|
+
return (React.createElement("div", { className: "sb-relative" },
|
27
|
+
React.createElement("button", { ref: buttonRef, onClick: toggleMenu, "aria-haspopup": "true", "aria-expanded": isOpen, "aria-label": "Open menu" }, buttonContent),
|
28
|
+
isOpen && (React.createElement("div", { ref: menuRef, role: "menu", "aria-orientation": "vertical", "aria-labelledby": "Open menu", className: "sb-absolute sb-shadow-lg sb-right-0 sb-bottom-10" }, menuContent))));
|
29
|
+
};
|
30
|
+
export default MenuButton;
|
31
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/MenuButton/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,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,6BAAK,SAAS,EAAC,aAAa;QAC1B,gCACE,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,UAAU,mBACL,MAAM,mBACL,MAAM,gBACV,WAAW,IAErB,aAAa,CACP;QAER,MAAM,IAAI,CACT,6BACE,GAAG,EAAE,OAAO,EACZ,IAAI,EAAC,MAAM,sBACM,UAAU,qBACX,WAAW,EAC3B,SAAS,EAAC,kDAAkD,IAE3D,WAAW,CACR,CACP,CACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import { SoftBuildersVideoPlayerNote } from "../../types";
|
3
|
+
type Note = SoftBuildersVideoPlayerNote & {
|
4
|
+
percentage: number;
|
5
|
+
};
|
6
|
+
type Props = {
|
7
|
+
note: Note;
|
8
|
+
};
|
9
|
+
declare const NoteTooltip: ({ note }: Props) => React.JSX.Element;
|
10
|
+
export default NoteTooltip;
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
2
|
+
import Tooltip from "../Tooltip";
|
3
|
+
import { durationFormater } from "../../utils";
|
4
|
+
import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
|
5
|
+
const NoteTooltip = ({ note }) => {
|
6
|
+
const [open, setOpen] = useState(false);
|
7
|
+
const { currentTime } = useSoftBuildersVideoPlayerContext();
|
8
|
+
useEffect(() => {
|
9
|
+
if (currentTime === Math.floor(note.time)) {
|
10
|
+
setOpen(true);
|
11
|
+
setTimeout(() => {
|
12
|
+
setOpen(false);
|
13
|
+
}, 5000);
|
14
|
+
}
|
15
|
+
}, [currentTime, note.time]);
|
16
|
+
return (React.createElement("div", { className: "sb-w-1 sb-h-1 sb-rounded-full sb-bg-white sb-absolute sb-z-30", style: { left: `${note.percentage}%` }, onMouseEnter: () => setOpen(true), onMouseLeave: () => setOpen(false) },
|
17
|
+
React.createElement("div", { className: "sb-relative" },
|
18
|
+
React.createElement(Tooltip, { open: open },
|
19
|
+
React.createElement("div", { className: "sb-flex sb-flex-col sb-gap-2 sb-items-center" },
|
20
|
+
React.createElement("p", null, note.label),
|
21
|
+
React.createElement("p", { className: "sb-p-2 sb-bg-[#303030] sb-bg-opacity-50 sb-rounded-md" }, durationFormater(note.time)))))));
|
22
|
+
};
|
23
|
+
export default NoteTooltip;
|
24
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/NoteTooltip/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AAQrF,MAAM,WAAW,GAAG,CAAC,EAAE,IAAI,EAAS,EAAE,EAAE;IACtC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,WAAW,EAAE,GAAG,iCAAiC,EAAE,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAW,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC;YAEd,UAAU,CAAC,GAAG,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7B,OAAO,CACL,6BACE,SAAS,EAAC,+DAA+D,EACzE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,EAAE,EACtC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EACjC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAElC,6BAAK,SAAS,EAAC,aAAa;YAC1B,oBAAC,OAAO,IAAC,IAAI,EAAE,IAAI;gBACjB,6BAAK,SAAS,EAAC,8CAA8C;oBAC3D,+BAAI,IAAI,CAAC,KAAK,CAAK;oBACnB,2BAAG,SAAS,EAAC,uDAAuD,IACjE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1B,CACA,CACE,CACN,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
2
|
+
import NoteTooltip from "../NoteTooltip";
|
3
|
+
import { useSoftBuildersVideoPlayerContext } from "../VideoPlayerComponent/provider";
|
4
|
+
const NotesPanal = ({ notes }) => {
|
5
|
+
const [ns, setNs] = useState([]);
|
6
|
+
const { duration } = useSoftBuildersVideoPlayerContext();
|
7
|
+
useEffect(() => {
|
8
|
+
const newNs = notes.map((n) => {
|
9
|
+
const percentage = Math.floor((n.time * 100) / duration);
|
10
|
+
return Object.assign(Object.assign({}, n), { percentage });
|
11
|
+
});
|
12
|
+
setNs(newNs);
|
13
|
+
}, [notes, duration]);
|
14
|
+
return (React.createElement("div", { id: "notes-panal", className: "sb-w-full sb-h-full sb-relative " }, ns.map((n, i) => (React.createElement(NoteTooltip, { key: `note-${i}-${n.time}`, note: n })))));
|
15
|
+
};
|
16
|
+
export default NotesPanal;
|
17
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/NotesPanal/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,WAAW,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AAOrF,MAAM,UAAU,GAAG,CAAC,EAAE,KAAK,EAAS,EAAE,EAAE;IACtC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAEzC,MAAM,EAAE,QAAQ,EAAE,GAAG,iCAAiC,EAAE,CAAC;IAEzD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;YACzD,uCACK,CAAC,KACJ,UAAU,IACV;QACJ,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtB,OAAO,CACL,6BAAK,EAAE,EAAC,aAAa,EAAC,SAAS,EAAC,kCAAkC,IAC/D,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAChB,oBAAC,WAAW,IAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,GAAI,CACrD,CAAC,CACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|