(() => {
const SUPABASE_URL = 'https://vhiweeypifbwacashxjz.supabase.co';
const SUPABASE_KEY = 'sb_publishable_EoB7MFJhCmb6PiAk-GPJ4w_PGhQ44Ru';
const DEFAULT_ICON = 'organ';
const FALLBACK_LABEL = 'Send your appreciation';
const DEFAULT_LABELS = {
organ: 'Offer up your heart.'
};
const BUILTIN_ICONS = {
organ: '',
};
const formatCount = (count) => ` ${count}`;
const getAccessibleLabel = (button, iconValue) => {
if (button.dataset.ariaLabel) {
return button.dataset.ariaLabel;
}
if (button.dataset.label) {
return button.dataset.label;
}
return DEFAULT_LABELS[iconValue] || FALLBACK_LABEL;
};
const toggleFill = (icon, filled) => {
const svg = icon.querySelector("svg");
if (svg) {
const iconType = icon.closest('.iine-button')?.dataset.icon || DEFAULT_ICON;
if (iconType === 'upvote') {
svg.setAttribute("stroke-width", filled ? "3" : "2");
} else {
const paths = svg.querySelectorAll("path, polygon, circle");
paths.forEach((path) => {
path.setAttribute("fill", filled ? "currentColor" : "none");
});
}
}
};
document.addEventListener("DOMContentLoaded", () => {
const iineButtons = document.querySelectorAll(".iine-button");
if (iineButtons.length === 0) {
return;
}
const slugs = Array.from(iineButtons).map(
(button) => button.dataset.slug || window.location.pathname
);
const uniqueSlugs = [...new Set(slugs)];
const counts = new Map();
const fetchCounts = async () => {
if (uniqueSlugs.length === 0) {
return;
}
try {
const response = await fetch(
`${SUPABASE_URL}/rest/v1/rpc/get_hits`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
apikey: SUPABASE_KEY,
Authorization: `Bearer ${SUPABASE_KEY}`,
},
body: JSON.stringify({
page_slugs: uniqueSlugs,
}),
}
);
if (!response.ok) throw new Error("Failed to fetch counts");
const countsData = await response.json();
if (countsData && typeof countsData === 'object' && !countsData.error) {
for (const slug in countsData) {
const count = countsData[slug];
counts.set(slug, typeof count === 'number' ? count : 0);
}
}
} catch (error) {
console.error("Error fetching iine counts:", error);
}
};
const initializeButtons = async () => {
await fetchCounts();
iineButtons.forEach((button) => {
const slug = button.dataset.slug || window.location.pathname;
const storageKey = `iine-clicked-${slug}`;
let icon = button.querySelector(".icon");
let counter = button.querySelector(".counter");
if (!icon) {
// Clear fallback content (e.g.