Hash system and controls inside player
This commit is contained in:
parent
c8d991883a
commit
e9b194217a
8 changed files with 151 additions and 71 deletions
118
scripts/user.js
118
scripts/user.js
|
|
@ -3,38 +3,108 @@ const item_title = document.getElementById('item_title')
|
|||
const audio = document.getElementById('audio')
|
||||
const audio_title = document.getElementById('audio_title')
|
||||
const modal = document.getElementById('modal')
|
||||
const download = document.getElementById('download_button')
|
||||
const download_button = document.getElementById('download_button')
|
||||
|
||||
const showModal = (e) => {
|
||||
video.src = e.target.dataset.video_url
|
||||
video.width = e.target.dataset.video_width
|
||||
video.height = e.target.dataset.video_height
|
||||
item_title.innerText = e.target.dataset.desc
|
||||
download.href = e.target.dataset.video_download
|
||||
audio_title.innerText = e.target.dataset.music_title
|
||||
audio.src = e.target.dataset.music_url
|
||||
// -- HELPERS -- //
|
||||
const getHash = () => window.location.hash.substring(1)
|
||||
|
||||
const getVideoDataById = (id) => {
|
||||
const el = document.getElementById(id)
|
||||
if (el) {
|
||||
return el.dataset
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
const isModalActive = () => modal.classList.contains('is-active')
|
||||
|
||||
const toggleButton = (id, force) => document.getElementById(id) ? document.getElementById(id).toggleAttribute('disabled', force) : alert('That button does not exist')
|
||||
|
||||
// -- MODAL -- //
|
||||
const swapData = ({ video_url, video_width, video_height, desc, video_download, music_title, music_url }) => {
|
||||
video.src = video_url
|
||||
video.width = video_width
|
||||
video.height = video_height
|
||||
item_title.innerText = desc
|
||||
download_button.href = video_download
|
||||
audio_title.innerText = music_title
|
||||
audio.src = music_url
|
||||
}
|
||||
|
||||
const showModal = (id) => {
|
||||
const dataset = getVideoDataById(id)
|
||||
if (dataset) {
|
||||
swapData(dataset)
|
||||
modal.classList.toggle('is-active')
|
||||
video.play()
|
||||
}
|
||||
}
|
||||
|
||||
const hideModel = () => {
|
||||
video.pause()
|
||||
audio.pause()
|
||||
video.currentTime = 0
|
||||
modal.classList.toggle('is-active')
|
||||
video.width = ''
|
||||
video.height = ''
|
||||
video.pause()
|
||||
audio.pause()
|
||||
video.currentTime = 0
|
||||
modal.classList.toggle('is-active')
|
||||
toggleButton('back-button', false)
|
||||
toggleButton('next-button', false)
|
||||
history.pushState('', document.title, window.location.pathname + window.location.search)
|
||||
}
|
||||
|
||||
const getPrevOrNext = (forward) => {
|
||||
const hash = getHash()
|
||||
if (hash) {
|
||||
const el = document.getElementById(hash)
|
||||
if (el) {
|
||||
if (forward) {
|
||||
return el.parentElement.nextElementSibling ? el.parentElement.nextElementSibling.children[0] : null
|
||||
}
|
||||
return el.parentElement.previousElementSibling ? el.parentElement.previousElementSibling.children[0] : null
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
const moveVideo = (forward) => {
|
||||
// Re-enable buttons
|
||||
toggleButton('back-button', false)
|
||||
toggleButton('next-button', false)
|
||||
const new_el = getPrevOrNext(forward)
|
||||
if (new_el) {
|
||||
window.location.hash = new_el.id
|
||||
} else {
|
||||
// Max reached, disable buttons depending on direction
|
||||
if (forward) {
|
||||
toggleButton('next-button', true)
|
||||
} else {
|
||||
toggleButton('back-button', true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// EVENTS //
|
||||
|
||||
// Click to show modal
|
||||
const figures = document.getElementsByClassName("clickable-img")
|
||||
for (let i = 0; i < figures.length; i++) {
|
||||
const figure = figures[i]
|
||||
figure.addEventListener('click', showModal, true)
|
||||
const hashChange = () => {
|
||||
if (window.location.hash) {
|
||||
const hash = getHash()
|
||||
if (hash) {
|
||||
// Check first if the modal is already active
|
||||
if (isModalActive()) {
|
||||
// If it is, get hash video id and swap data
|
||||
const dataset = getVideoDataById(hash)
|
||||
if (dataset) {
|
||||
swapData(dataset)
|
||||
video.play()
|
||||
}
|
||||
} else {
|
||||
showModal(hash)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Click to hide modal
|
||||
document.getElementById('modal-background').addEventListener('click', hideModel, true)
|
||||
document.getElementById('modal-close').addEventListener('click', hideModel, true)
|
||||
document.getElementById('modal-background').addEventListener('click', hideModel, false)
|
||||
document.getElementById('modal-close').addEventListener('click', hideModel, false)
|
||||
document.getElementById('back-button').addEventListener('click', () => moveVideo(false))
|
||||
document.getElementById('next-button').addEventListener('click', () => moveVideo(true))
|
||||
window.addEventListener('hashchange', hashChange, false)
|
||||
|
||||
hashChange()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue