mirror of
https://github.com/mastodon/mastodon.git
synced 2025-11-27 10:00:50 +00:00
Some checks are pending
Check i18n / check-i18n (push) Waiting to run
Chromatic / Run Chromatic (push) Waiting to run
CodeQL / Analyze (actions) (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (ruby) (push) Waiting to run
Check formatting / lint (push) Waiting to run
JavaScript Linting / lint (push) Waiting to run
Ruby Linting / lint (push) Waiting to run
JavaScript Testing / test (push) Waiting to run
Historical data migration test / test (14-alpine) (push) Waiting to run
Historical data migration test / test (15-alpine) (push) Waiting to run
Historical data migration test / test (16-alpine) (push) Waiting to run
Historical data migration test / test (17-alpine) (push) Waiting to run
Ruby Testing / build (production) (push) Waiting to run
Ruby Testing / build (test) (push) Waiting to run
Ruby Testing / test (.ruby-version) (push) Blocked by required conditions
Ruby Testing / test (3.2) (push) Blocked by required conditions
Ruby Testing / test (3.3) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (.ruby-version) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.2) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.3) (push) Blocked by required conditions
Ruby Testing / End to End testing (.ruby-version) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.2) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.3) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.10.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.2, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.3, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
62 lines
1.6 KiB
TypeScript
62 lines
1.6 KiB
TypeScript
import { autoPlayGif } from '@/mastodon/initial_state';
|
|
|
|
const PARENT_MAX_DEPTH = 10;
|
|
|
|
export function handleAnimateGif(event: MouseEvent) {
|
|
// We already check this in ui/index.jsx, but just to be sure.
|
|
if (autoPlayGif) {
|
|
return;
|
|
}
|
|
|
|
const { target, type } = event;
|
|
const animate = type === 'mouseover'; // Mouse over = animate, mouse out = don't animate.
|
|
|
|
if (target instanceof HTMLImageElement) {
|
|
setAnimateGif(target, animate);
|
|
} else if (!(target instanceof HTMLElement) || target === document.body) {
|
|
return;
|
|
}
|
|
|
|
let parent: HTMLElement | null = null;
|
|
let iter = 0;
|
|
|
|
if (target.classList.contains('animate-parent')) {
|
|
parent = target;
|
|
} else {
|
|
// Iterate up to PARENT_MAX_DEPTH levels up the DOM tree to find a parent with the class 'animate-parent'.
|
|
let current: HTMLElement | null = target;
|
|
while (current) {
|
|
if (iter >= PARENT_MAX_DEPTH) {
|
|
return; // We can just exit right now.
|
|
}
|
|
current = current.parentElement;
|
|
if (current?.classList.contains('animate-parent')) {
|
|
parent = current;
|
|
break;
|
|
}
|
|
iter++;
|
|
}
|
|
}
|
|
|
|
// Affect all animated children within the parent.
|
|
if (parent) {
|
|
const animatedChildren =
|
|
parent.querySelectorAll<HTMLImageElement>('img.custom-emoji');
|
|
for (const child of animatedChildren) {
|
|
setAnimateGif(child, animate);
|
|
}
|
|
}
|
|
}
|
|
|
|
function setAnimateGif(image: HTMLImageElement, animate: boolean) {
|
|
const { classList, dataset } = image;
|
|
if (
|
|
!classList.contains('custom-emoji') ||
|
|
!dataset.static ||
|
|
!dataset.original
|
|
) {
|
|
return;
|
|
}
|
|
image.src = animate ? dataset.original : dataset.static;
|
|
}
|