| 
									
										
										
										
											2022-06-09 12:51:19 +02:00
										 |  |  | /* | 
					
						
							|  |  |  | 	GoToSocial | 
					
						
							| 
									
										
										
										
											2023-03-12 18:49:06 +01:00
										 |  |  | 	Copyright (C) GoToSocial Authors admin@gotosocial.org | 
					
						
							|  |  |  | 	SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							| 
									
										
										
										
											2022-06-09 12:51:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | 	it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  | 	the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | 	(at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | 	but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | 	GNU Affero General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  | 	along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-07 17:58:01 +02:00
										 |  |  | const Photoswipe = require("photoswipe/dist/umd/photoswipe.umd.min.js"); | 
					
						
							|  |  |  | const PhotoswipeLightbox = require("photoswipe/dist/umd/photoswipe-lightbox.umd.min.js"); | 
					
						
							|  |  |  | const PhotoswipeCaptionPlugin = require("photoswipe-dynamic-caption-plugin").default; | 
					
						
							| 
									
										
										
										
											2023-05-11 17:46:32 +02:00
										 |  |  | const Plyr = require("plyr"); | 
					
						
							| 
									
										
										
										
											2022-08-07 17:58:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 20:35:43 +02:00
										 |  |  | let [_, _user, type, id] = window.location.pathname.split("/"); | 
					
						
							|  |  |  | if (type == "statuses") { | 
					
						
							|  |  |  | 	let firstStatus = document.getElementsByClassName("thread")[0].children[0]; | 
					
						
							|  |  |  | 	if (firstStatus.id != id) { | 
					
						
							|  |  |  | 		document.getElementById(id).scrollIntoView(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-07 17:58:01 +02:00
										 |  |  | const lightbox = new PhotoswipeLightbox({ | 
					
						
							|  |  |  | 	gallery: '.photoswipe-gallery', | 
					
						
							| 
									
										
										
										
											2023-05-11 17:46:32 +02:00
										 |  |  | 	children: '.photoswipe-slide', | 
					
						
							| 
									
										
										
										
											2022-08-07 17:58:01 +02:00
										 |  |  | 	pswpModule: Photoswipe, | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | new PhotoswipeCaptionPlugin(lightbox, { | 
					
						
							|  |  |  | 	type: 'auto', | 
					
						
							| 
									
										
										
										
											2023-05-11 17:46:32 +02:00
										 |  |  | 	captionContent(slide) { | 
					
						
							|  |  |  | 		return slide.data.alt; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | lightbox.addFilter('itemData', (item) => { | 
					
						
							|  |  |  | 	const el = item.element; | 
					
						
							|  |  |  | 	if (el && el.classList.contains("plyr-video")) { | 
					
						
							|  |  |  | 		const parentNode = el._plyrContainer.parentNode; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			alt: el.getAttribute("alt"), | 
					
						
							|  |  |  | 			_video: { | 
					
						
							|  |  |  | 				open(c) { | 
					
						
							|  |  |  | 					c.appendChild(el._plyrContainer); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				close() { | 
					
						
							|  |  |  | 					parentNode.appendChild(el._plyrContainer); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				pause() { | 
					
						
							|  |  |  | 					el._player.pause(); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			width: parseInt(el.dataset.pswpWidth), | 
					
						
							|  |  |  | 			height: parseInt(el.dataset.pswpHeight) | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return item; | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | lightbox.on("contentActivate", (e) => { | 
					
						
							|  |  |  | 	const { content } = e; | 
					
						
							|  |  |  | 	if (content.data._video != undefined) { | 
					
						
							|  |  |  | 		content.data._video.open(content.element); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | lightbox.on("contentDeactivate", (e) => { | 
					
						
							|  |  |  | 	const { content } = e; | 
					
						
							|  |  |  | 	if (content.data._video != undefined) { | 
					
						
							|  |  |  | 		content.data._video.pause(); | 
					
						
							|  |  |  | 		content.data._video.close(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | lightbox.on("close", function () { | 
					
						
							|  |  |  | 	if (lightbox.pswp.currSlide.data._video != undefined) { | 
					
						
							|  |  |  | 		lightbox.pswp.currSlide.data._video.close(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-08-07 17:58:01 +02:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | lightbox.init(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-11 17:46:32 +02:00
										 |  |  | function dynamicSpoiler(className, updateFunc) { | 
					
						
							|  |  |  | 	Array.from(document.getElementsByClassName(className)).forEach((spoiler) => { | 
					
						
							|  |  |  | 		const update = updateFunc(spoiler); | 
					
						
							|  |  |  | 		if (update) { | 
					
						
							|  |  |  | 			update(); | 
					
						
							|  |  |  | 			spoiler.addEventListener("toggle", update); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | dynamicSpoiler("text-spoiler", (spoiler) => { | 
					
						
							|  |  |  | 	const button = spoiler.querySelector("button"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (button != undefined) { | 
					
						
							|  |  |  | 		return () => { | 
					
						
							|  |  |  | 			button.textContent = spoiler.open | 
					
						
							|  |  |  | 				? "Show less" | 
					
						
							|  |  |  | 				: "Show more"; | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | dynamicSpoiler("video-spoiler", (spoiler) => { | 
					
						
							|  |  |  | 	const video = spoiler.querySelector(".plyr-video"); | 
					
						
							|  |  |  | 	const eye = spoiler.querySelector(".eye.button"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (video != undefined) { | 
					
						
							|  |  |  | 		return () => { | 
					
						
							|  |  |  | 			if (spoiler.open) { | 
					
						
							|  |  |  | 				eye.setAttribute("aria-label", "Hide media"); | 
					
						
							| 
									
										
										
										
											2022-06-09 12:51:19 +02:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2023-05-11 17:46:32 +02:00
										 |  |  | 				eye.setAttribute("aria-label", "Show media"); | 
					
						
							|  |  |  | 				video.pause(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Array.from(document.getElementsByClassName("plyr-video")).forEach((video) => { | 
					
						
							|  |  |  | 	let player = new Plyr(video, { | 
					
						
							|  |  |  | 		title: video.title, | 
					
						
							|  |  |  | 		settings: ["loop"], | 
					
						
							|  |  |  | 		disableContextMenu: false, | 
					
						
							|  |  |  | 		hideControls: false, | 
					
						
							|  |  |  | 		tooltips: { contrors: true, seek: true }, | 
					
						
							|  |  |  | 		iconUrl: "/assets/plyr.svg", | 
					
						
							|  |  |  | 		listeners: { | 
					
						
							|  |  |  | 			fullscreen: () => { | 
					
						
							|  |  |  | 				if (player.playing) { | 
					
						
							|  |  |  | 					setTimeout(() => { | 
					
						
							|  |  |  | 						player.play(); | 
					
						
							|  |  |  | 					}, 1); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				lightbox.loadAndOpen(parseInt(video.dataset.pswpIndex), { | 
					
						
							|  |  |  | 					gallery: video.closest(".photoswipe-gallery") | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				return false; | 
					
						
							| 
									
										
										
										
											2022-06-09 12:51:19 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-05-11 17:46:32 +02:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2022-12-17 05:38:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-11 17:46:32 +02:00
										 |  |  | 	player.elements.container.title = video.title; | 
					
						
							|  |  |  | 	video._player = player; | 
					
						
							|  |  |  | 	video._plyrContainer = player.elements.container; | 
					
						
							| 
									
										
										
										
											2022-06-09 12:51:19 +02:00
										 |  |  | }); |