Files
return-youtube-dislike/Extensions/combined/src/patreon.js
T
Dmitrii Selivanov 40fda6dd32 Advanced stats for patreon supporters (#1222)
* auth works

* Works after review.

* switched to auth flow

* all works well in chrome

* all works well in chrome and firefox

* translations harmonized

* translations harmonized

* website translations

* Translations harmonized.

* Everything kinda works

* Almost works

* all works

* all works

* all works #2

* Streamline premium analytics range handling

* Restore premium analytics selection flow

* Fix analytics zoom interactions

* Add per-section expansion controls to premium analytics

* Adjust map legend visibility for premium analytics

* Add missing country synonyms for premium map

* Remove legacy premium badge overlay

* Polish premium analytics controls for light theme

* Refresh map legend when toggling sections

* Improve light-mode styling for range selectors

* Fix map mode switching regression

* Fix for panel expand

* Typo fix

* webpack fix

* before next steps.

* split, zero-buckets

* bucket size indicated on UI

* all works

* first/last toggle

* breadcrumbs

* release
2025-10-20 18:43:06 +02:00

79 lines
2.5 KiB
JavaScript

import { initPremiumAnalytics, teardownPremiumAnalytics, updatePremiumSession } from "./premiumAnalytics";
import {
initPremiumTeaser,
setTeaserSuppressed,
TEASER_SUPPRESSION_REASON_PREMIUM,
} from "./premiumAnalytics/teaser";
let patreonState = {
authenticated: false,
user: null,
sessionToken: null,
};
function initPatreonFeatures() {
initPremiumTeaser();
chrome.storage.sync.get(["patreonAuthenticated", "patreonUser", "patreonSessionToken"], (data) => {
if (data.patreonAuthenticated && data.patreonUser) {
patreonState.authenticated = true;
patreonState.user = data.patreonUser;
patreonState.sessionToken = data.patreonSessionToken;
updatePremiumSession({
token: patreonState.sessionToken,
active: patreonState.user?.hasActiveMembership,
membershipTier: patreonState.user?.membershipTier,
});
enablePremiumFeatures();
}
});
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.message === "patreon_status_changed") {
patreonState.authenticated = request.authenticated;
patreonState.user = request.user || null;
if (request.authenticated) {
patreonState.sessionToken = request.sessionToken ?? patreonState.sessionToken;
updatePremiumSession({
token: patreonState.sessionToken,
active: patreonState.user?.hasActiveMembership,
membershipTier: patreonState.user?.membershipTier,
});
enablePremiumFeatures();
} else {
patreonState.sessionToken = null;
updatePremiumSession({ token: null, active: false });
disablePremiumFeatures();
}
}
});
}
function enablePremiumFeatures() {
const tier = patreonState.user?.membershipTier;
const hasActiveMembership = patreonState.user?.hasActiveMembership;
if (hasActiveMembership && tier === "premium") {
setTeaserSuppressed(true, TEASER_SUPPRESSION_REASON_PREMIUM);
initPremiumAnalytics();
}
}
function disablePremiumFeatures() {
const premiumElements = document.querySelectorAll(".ryd-premium-feature");
premiumElements.forEach((el) => el.remove());
teardownPremiumAnalytics();
setTeaserSuppressed(false, TEASER_SUPPRESSION_REASON_PREMIUM);
}
function isPatreonUser() {
return patreonState.authenticated && patreonState.user?.hasActiveMembership;
}
function getPatreonTier() {
return patreonState.user?.membershipTier || "none";
}
export { initPatreonFeatures, isPatreonUser, getPatreonTier, patreonState };