mirror of
https://github.com/Anarios/return-youtube-dislike.git
synced 2026-09-12 10:22:10 +02:00
3657de9b2c
Harden Shorts controls, reaction state, and navigation; share voting logic with the extension; improve ratio-bar rendering; and add comprehensive Jest, Playwright, artifact, and live-browser regression coverage.
58 lines
1.9 KiB
JavaScript
58 lines
1.9 KiB
JavaScript
const LIKED_STATE = "LIKED_STATE";
|
|
const DISLIKED_STATE = "DISLIKED_STATE";
|
|
const NEUTRAL_STATE = "NEUTRAL_STATE";
|
|
|
|
const LIKE_ACTION = "like";
|
|
const DISLIKE_ACTION = "dislike";
|
|
|
|
const TRANSITIONS = {
|
|
[NEUTRAL_STATE]: {
|
|
[LIKE_ACTION]: { nextState: LIKED_STATE, value: 1, likesDelta: 1, dislikesDelta: 0 },
|
|
[DISLIKE_ACTION]: { nextState: DISLIKED_STATE, value: -1, likesDelta: 0, dislikesDelta: 1 },
|
|
},
|
|
[LIKED_STATE]: {
|
|
[LIKE_ACTION]: { nextState: NEUTRAL_STATE, value: 0, likesDelta: -1, dislikesDelta: 0 },
|
|
[DISLIKE_ACTION]: { nextState: DISLIKED_STATE, value: -1, likesDelta: -1, dislikesDelta: 1 },
|
|
},
|
|
[DISLIKED_STATE]: {
|
|
[LIKE_ACTION]: { nextState: LIKED_STATE, value: 1, likesDelta: 1, dislikesDelta: -1 },
|
|
[DISLIKE_ACTION]: { nextState: NEUTRAL_STATE, value: 0, likesDelta: 0, dislikesDelta: -1 },
|
|
},
|
|
};
|
|
|
|
function resolveVoteTransition(previousState, action) {
|
|
const transition = TRANSITIONS[previousState]?.[action];
|
|
if (!transition) {
|
|
throw new TypeError(`Unsupported vote transition: ${previousState} -> ${action}`);
|
|
}
|
|
return { ...transition };
|
|
}
|
|
|
|
function applyVoteTransitionCounts(likes, dislikes, transition) {
|
|
if (!transition || !Number.isFinite(transition.likesDelta) || !Number.isFinite(transition.dislikesDelta)) {
|
|
throw new TypeError("A valid vote transition is required");
|
|
}
|
|
|
|
const normalizedLikes = Number.isFinite(likes) ? likes : 0;
|
|
const normalizedDislikes = Number.isFinite(dislikes) ? dislikes : 0;
|
|
return {
|
|
likes: Math.max(0, normalizedLikes + transition.likesDelta),
|
|
dislikes: Math.max(0, normalizedDislikes + transition.dislikesDelta),
|
|
};
|
|
}
|
|
|
|
function shouldSubmitVote({ disableVoteSubmission = false, signedOut = false } = {}) {
|
|
return disableVoteSubmission !== true && signedOut !== true;
|
|
}
|
|
|
|
export {
|
|
LIKED_STATE,
|
|
DISLIKED_STATE,
|
|
NEUTRAL_STATE,
|
|
LIKE_ACTION,
|
|
DISLIKE_ACTION,
|
|
resolveVoteTransition,
|
|
applyVoteTransitionCounts,
|
|
shouldSubmitVote,
|
|
};
|