A rewrite of Poly+, my quality-of-life browser extension for Polytoria. Built entirely fresh using the WXT extension framework, Typescript, and with added better overall code quality.
extension
1import config from "@/utils/config.json"; 2import { _favoritedPlaces } from "@/utils/storage"; 3import { expireCache } from "@/utils/utilities"; 4const placeID = window.location.pathname.split('/')[2]; 5 6export async function favoritedPlaces() { 7 let placeIDs = await _favoritedPlaces.getValue(); 8 9 const button = document.createElement('button'); 10 button.classList.add('btn', 'btn-primary', 'btn-sm'); 11 button.style.position = 'absolute'; 12 button.style.top = '0'; 13 button.style.right = '0'; 14 button.style.margin = '4px'; 15 button.style.fontSize = '1.3em'; 16 button.innerHTML = ` 17 <i class="fa-regular fa-star"></i> 18 `; 19 20 const update = function() { 21 button.classList.value = 'btn btn-primary btn-sm'; 22 button.disabled = false; 23 if (placeIDs.indexOf(placeID) == -1) { 24 // Not Pinned 25 if (placeIDs.length >= config.limits.favoritedPlaces) { 26 button.disabled = true; 27 } 28 button.children[0].classList.value = 'fa-regular fa-star'; 29 } else { 30 // Pinned 31 button.children[0].classList.value = 'fa-duotone fa-star'; 32 } 33 }; 34 35 button.addEventListener('mouseenter', function() { 36 if (placeIDs.indexOf(placeID) != -1) { 37 button.classList.add('btn-danger'); 38 button.classList.remove('btn-primary'); 39 button.children[0].classList.add('fa-star-half-stroke'); 40 button.children[0].classList.remove('fa-star'); 41 }; 42 }); 43 44 button.addEventListener('mouseleave', function() { 45 if (placeIDs.indexOf(placeID) != -1) { 46 button.classList.add('btn-primary'); 47 button.classList.remove('btn-danger'); 48 button.children[0].classList.add('fa-star'); 49 button.children[0].classList.remove('fa-star-half-stroke'); 50 }; 51 }); 52 53 update(); 54 document.querySelector('h1.my-0')!.parentElement!.appendChild(button); 55 56 button.addEventListener('click', function() { 57 if (placeIDs.indexOf(placeID) == -1) { 58 placeIDs.push(placeID); 59 } else { 60 placeIDs.splice(placeIDs.indexOf(placeID), 1); 61 } 62 63 expireCache('favoritedPlaces'); 64 _favoritedPlaces.setValue(placeIDs); 65 update(); 66 }); 67 68 storage.watch<Array<string>>('sync:favoritedPlaces', (value, previous) => { 69 placeIDs = value!; 70 }); 71}