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 { _favoritedPlaces, limits } from "@/utils/storage";
2import { expireCache } from "@/utils/utilities";
3const placeID = window.location.pathname.split('/')[2];
4
5export async function favoritedPlaces() {
6 let placeIDs = await _favoritedPlaces.getValue();
7 const titleCard = document.getElementById;
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 >= 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}