diff --git a/src/components/VideoPlayer.vue b/src/components/VideoPlayer.vue index f386025..6609b06 100644 --- a/src/components/VideoPlayer.vue +++ b/src/components/VideoPlayer.vue @@ -8,12 +8,12 @@ import videojs from 'video.js' import qualityLevels from 'videojs-contrib-quality-levels' import { createQualitySelector } from '@/assets/qualitySelector' +import { getTimeFromQuery } from '@/mixins' import 'video.js/dist/video-js.css' videojs.registerPlugin('qualityLevels', qualityLevels) export default { - name: 'VideoJsPlayer', props: { options: { type: Object, @@ -23,7 +23,7 @@ export default { } }, emits: ['PlayerTimeUpdate'], - data() { + setup() { let player: any return { player @@ -36,6 +36,12 @@ export default { this.player = videojs('video-player', this.options, () => { createQualitySelector(this.player) + if (this.$route.query['t']) { + const timeQuery = this.$route.query['t'].toString() || "" + const time = getTimeFromQuery(timeQuery) + this.player.currentTime(time) + } + this.player.on('timeupdate', () => { emit('PlayerTimeUpdate', this.player.currentTime()) }) diff --git a/src/components/popups/ShareButtonPopup.vue b/src/components/popups/ShareButtonPopup.vue new file mode 100644 index 0000000..95d7f06 --- /dev/null +++ b/src/components/popups/ShareButtonPopup.vue @@ -0,0 +1,107 @@ + + + \ No newline at end of file diff --git a/src/mixins.ts b/src/mixins.ts index 7d43667..f1a2c97 100644 --- a/src/mixins.ts +++ b/src/mixins.ts @@ -39,4 +39,16 @@ export async function getEndpoint(endpoint: string) { const data = rawData.data return data +} + +export function getTimeFromQuery(query: string) { + // H, M, S + const x = query.split(/[^0-9.]/g); + const times = x.map(Number) + + let time = 0 + time += times[0] * 3600 + time += times[1] * 60 + time += times[2] + return time } \ No newline at end of file diff --git a/src/settingsManager.ts b/src/settingsManager.ts index d03b0c4..c5c42b1 100644 --- a/src/settingsManager.ts +++ b/src/settingsManager.ts @@ -53,7 +53,7 @@ export function getDefaultSettings() { export function syncUserSettings() { const defaultSettings = getDefaultSettings() - let userSettings = localStorage.getItem('settings') + const userSettings = localStorage.getItem('settings') if (!userSettings) return const parsedUserSettings = JSON.parse(userSettings) diff --git a/src/views/ClipView.vue b/src/views/ClipView.vue index f1a8f66..e53daaa 100644 --- a/src/views/ClipView.vue +++ b/src/views/ClipView.vue @@ -7,15 +7,12 @@ import ErrorMessage from '@/components/ErrorMessage.vue' import FollowButton from '@/components/FollowButton.vue' import LoadingScreen from '@/components/LoadingScreen.vue' import AboutTab from '@/components/user/AboutTab.vue' +import ShareModal from '@/components/popups/ShareButtonPopup.vue' import type { Video } from '@/types' import { truncate, abbreviate, getEndpoint } from '@/mixins' import { chatVisible } from '@/settingsManager' -interface ChatComponent { - updateVodComments: (time: number) => void -} - export default { inject: ['rootBackendUrl'], async setup() { @@ -50,7 +47,9 @@ export default { return { data, status, - videoOptions + videoOptions, + time: ref(0), + shareModalVisible: ref(false) } }, async mounted() { @@ -70,22 +69,22 @@ export default { ErrorMessage, FollowButton, LoadingScreen, - AboutTab + AboutTab, + ShareModal }, methods: { truncate, abbreviate, - handlePlayerTimeUpdate(time: number) { - if (!chatVisible()) return - const chat = this.$refs.chat as ChatComponent - chat.updateVodComments(time) - }, - chatVisible + chatVisible, + toggleShareModal() { + this.shareModalVisible = !this.shareModalVisible + } } } diff --git a/src/views/UserView.vue b/src/views/UserView.vue index a2a0d5d..ed05526 100644 --- a/src/views/UserView.vue +++ b/src/views/UserView.vue @@ -10,6 +10,8 @@ import LoadingScreen from '@/components/LoadingScreen.vue' import VideoTab from '@/components/user/VideoTab.vue' import AudioPlayer from '@/components/AudioPlayer.vue' import AboutTab from '@/components/user/AboutTab.vue' +import ShareModal from '@/components/popups/ShareButtonPopup.vue' + import type { StreamerData } from '@/types' import { truncate, abbreviate, getEndpoint } from '@/mixins' @@ -40,7 +42,8 @@ export default { data, status, videoOptions, - audioOptions + audioOptions, + shareModalVisible: ref(false) } }, async mounted() { @@ -68,18 +71,23 @@ export default { LoadingScreen, VideoTab, AudioPlayer, - AboutTab + AboutTab, + ShareModal }, methods: { truncate, abbreviate, chatVisible, - getSetting + getSetting, + toggleShareModal() { + this.shareModalVisible = !this.shareModalVisible + } } }