Files
praxis/popup.js
2025-07-06 06:14:06 -04:00

198 lines
7.4 KiB
JavaScript

document.addEventListener('DOMContentLoaded', () => {
const onboardingFlow = document.getElementById('onboarding-flow');
const confirmationFlow = document.getElementById('confirmation-flow');
const onboardingIssuesContainer = document.getElementById('onboarding-issues-container');
let onboardingIssueButtons;
const saveOnboardingButton = document.getElementById('save-onboarding-issues');
const confirmationIssuesList = document.getElementById('confirmation-issues-list');
const confirmButton = document.getElementById('confirm-issues');
const reselectButton = document.getElementById('reselect-issues');
const statusParagraph = confirmationFlow.querySelector('.flow-header p:nth-of-type(1)');
const ISSUES = [
{ value: "gun-control", text: "Gun Control" },
{ value: "gun-rights", text: "Gun Rights" },
{ value: "privacy", text: "Electronic Privacy" },
{ value: "immigration", text: "Immigration" },
{ value: "climate-change", text: "Climate Change" },
{ value: "healthcare", text: "Healthcare" },
{ value: "racial-justice", text: "Racial Justice" },
{ value: "lgbtq-rights", text: "LGBTQ+ Rights" },
{ value: "economic-inequality", text: "Economic Inequality" },
{ value: "reproductive-rights", text: "Reproductive Rights" },
{ value: "education-reform", text: "Education Reform" },
{ value: "criminal-justice", text: "Criminal Justice" },
{ value: "voting-rights", text: "Voting Rights" },
{ value: "campaign-finance", text: "Campaign Finance" },
{ value: "foreign-policy", text: "Foreign Policy" },
{ value: "national-security", text: "National Security" },
{ value: "free-speech", text: "Free Speech" },
{ value: "net-neutrality", text: "Net Neutrality" },
{ value: "labor-rights", text: "Labor Rights" },
{ value: "affordable-housing", text: "Affordable Housing" },
{ value: "environmental-protection", text: "Environmental Protection" },
{ value: "space-exploration", text: "Space Exploration" },
{ value: "drug-policy-reform", text: "Drug Policy Reform" },
{ value: "veterans-affairs", text: "Veterans' Affairs" },
{ value: "senior-citizen-rights", text: "Senior Citizen Rights" },
];
const generateIssueButtons = () => {
ISSUES.forEach(issue => {
const button = document.createElement('button');
button.className = 'issue-button';
button.setAttribute('data-value', issue.value);
button.setAttribute('aria-pressed', 'false');
button.textContent = issue.text;
onboardingIssuesContainer.appendChild(button);
});
onboardingIssueButtons = onboardingIssuesContainer.querySelectorAll('.issue-button');
};
generateIssueButtons();
const getStorageApi = () => {
if (typeof browser !== 'undefined' && browser.storage) {
return browser.storage.local;
}
else if (typeof chrome !== 'undefined' && chrome.storage) {
return chrome.storage.sync;
}
return null;
};
const storageApi = getStorageApi();
const showFlow = (flow) => {
onboardingFlow.style.display = 'none';
confirmationFlow.style.display = 'none';
flow.style.display = 'block';
};
const populateConfirmationList = (issues) => {
confirmationIssuesList.innerHTML = '';
if (issues && issues.length > 0) {
issues.forEach(issueValue => {
const issueObj = ISSUES.find(issue => issue.value === issueValue);
const listItem = document.createElement('li');
listItem.textContent = issueObj.text;
confirmationIssuesList.appendChild(listItem);
});
} else {
const listItem = document.createElement('li');
listItem.textContent = 'No issues selected yet.';
confirmationIssuesList.appendChild(listItem);
}
};
const updateStatusDisplay = (isActive) => {
if (statusParagraph) {
statusParagraph.textContent = `Status: ${isActive ? 'Active' : 'Inactive'}`;
statusParagraph.style.color = isActive ? '#10B981' : '#EF4444';
statusParagraph.style.fontWeight = 'bold';
}
confirmButton.textContent = isActive ? 'Deactivate Praxis' : 'Activate Praxis';
confirmButton.style.backgroundColor = isActive ? '#EF4444' : '#10B981';
};
onboardingIssuesContainer.addEventListener('click', (event) => {
if (event.target.classList.contains('issue-button')) {
const button = event.target;
button.classList.toggle('selected');
const isSelected = button.classList.contains('selected');
button.setAttribute('aria-pressed', isSelected);
}
});
saveOnboardingButton.addEventListener('click', () => {
const selectedIssues = Array.from(onboardingIssuesContainer.querySelectorAll('.issue-button.selected'))
.map(button => button.dataset.value);
if (storageApi) {
storageApi.set({
selected_issues: selectedIssues,
onboarding_complete: true,
praxis_active: true
})
.then(() => {
populateConfirmationList(selectedIssues);
updateStatusDisplay(true);
showFlow(confirmationFlow);
})
.catch(error => {
alert('Error saving data. Please try again. See console for details.');
});
} else {
alert('Your browser does not support the necessary storage features.');
}
});
confirmButton.addEventListener('click', () => {
if (storageApi) {
storageApi.get('praxis_active')
.then(data => {
const newStatus = typeof data.praxis_active === 'boolean' ? !data.praxis_active : false;
storageApi.set({ praxis_active: newStatus })
.then(() => {
updateStatusDisplay(newStatus);
})
.catch(error => {});
})
.catch(error => {});
}
});
reselectButton.addEventListener('click', () => {
onboardingIssueButtons.forEach(button => {
button.classList.remove('selected');
button.setAttribute('aria-pressed', false);
});
if (storageApi) {
storageApi.get('selected_issues')
.then(data => {
if (data && data.selected_issues) {
data.selected_issues.forEach(savedIssue => {
const button = onboardingIssuesContainer.querySelector(`.issue-button[data-value="${savedIssue}"]`);
if (button) {
button.classList.add('selected');
button.setAttribute('aria-pressed', true);
}
});
}
})
.catch(error => {});
}
showFlow(onboardingFlow);
});
if (storageApi) {
storageApi.get(['selected_issues', 'onboarding_complete', 'praxis_active'])
.then(data => {
const isActive = typeof data.praxis_active === 'boolean' ? data.praxis_active : true;
if (data.onboarding_complete) {
populateConfirmationList(data.selected_issues || []);
updateStatusDisplay(isActive);
showFlow(confirmationFlow);
} else {
if (data.selected_issues) {
data.selected_issues.forEach(savedIssue => {
const button = onboardingIssuesContainer.querySelector(`.issue-button[data-value="${savedIssue}"]`);
if (button) {
button.classList.add('selected');
button.setAttribute('aria-pressed', true);
}
});
}
showFlow(onboardingFlow);
}
})
.catch(error => {
updateStatusDisplay(true);
showFlow(onboardingFlow);
});
} else {
updateStatusDisplay(true);
showFlow(onboardingFlow);
}
});