diff --git a/src/alpine-data/post-upvote.ts b/src/alpine-data/post-upvote.ts new file mode 100644 index 0000000..ee93129 --- /dev/null +++ b/src/alpine-data/post-upvote.ts @@ -0,0 +1,50 @@ +interface PostUpvote { + upvotedNames: string[]; + init(): void; + upvoted(id: string): boolean; + handleUpvote(name: string): void; +} + +export default (): PostUpvote => ({ + upvotedNames: [], + init() { + this.upvotedNames = JSON.parse(localStorage.getItem("halo.upvoted.post.names") || "[]"); + }, + upvoted(id: string) { + return this.upvotedNames.includes(id); + }, + async handleUpvote(name) { + if (this.upvoted(name)) { + return; + } + + const xhr = new XMLHttpRequest(); + + xhr.open("POST", "/apis/api.halo.run/v1alpha1/trackers/upvote"); + xhr.setRequestHeader("Content-Type", "application/json"); + + xhr.onload = () => { + this.upvotedNames = [...this.upvotedNames, name]; + localStorage.setItem("halo.upvoted.post.names", JSON.stringify(this.upvotedNames)); + + const upvoteNode = document.querySelector('[data-upvote-post-name="' + name + '"]'); + + if (!upvoteNode) { + return; + } + + const upvoteCount = parseInt(upvoteNode.textContent || "0"); + upvoteNode.textContent = upvoteCount + 1 + " 点赞"; + }; + xhr.onerror = function () { + alert("网络请求失败,请稍后再试"); + }; + xhr.send( + JSON.stringify({ + group: "content.halo.run", + plural: "posts", + name: name, + }) + ); + }, +}); diff --git a/src/main.ts b/src/main.ts index f202c3a..4f89a98 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,11 +4,13 @@ import Alpine from "alpinejs"; import * as tocbot from "tocbot"; import dropdown from "./alpine-data/dropdown"; import colorSchemeSwitcher from "./alpine-data/color-scheme-switcher"; +import postUpvote from "./alpine-data/post-upvote"; window.Alpine = Alpine; Alpine.data("dropdown", dropdown); Alpine.data("colorSchemeSwitcher", colorSchemeSwitcher); +Alpine.data("postUpvote", postUpvote); Alpine.start(); diff --git a/templates/assets/dist/main.iife.js b/templates/assets/dist/main.iife.js index 75c2445..3febbee 100644 --- a/templates/assets/dist/main.iife.js +++ b/templates/assets/dist/main.iife.js @@ -1,5 +1,5 @@ -var main=function(k){"use strict";const ea="",ta="";var Te=!1,Le=!1,$=[];function Wr(e){Ur(e)}function Ur(e){$.includes(e)||$.push(e),Vr()}function vt(e){let t=$.indexOf(e);t!==-1&&$.splice(t,1)}function Vr(){!Le&&!Te&&(Te=!0,queueMicrotask(Gr))}function Gr(){Te=!1,Le=!0;for(let e=0;e<$.length;e++)$[e]();$.length=0,Le=!1}var K,Y,se,yt,Me=!0;function Yr(e){Me=!1,e(),Me=!0}function Jr(e){K=e.reactive,se=e.release,Y=t=>e.effect(t,{scheduler:r=>{Me?Wr(r):r()}}),yt=e.raw}function bt(e){Y=e}function Qr(e){let t=()=>{};return[i=>{let n=Y(i);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(a=>a())}),e._x_effects.add(n),t=()=>{n!==void 0&&(e._x_effects.delete(n),se(n))},n},()=>{t()}]}var xt=[],St=[],wt=[];function Zr(e){wt.push(e)}function Ct(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,St.push(t))}function Xr(e){xt.push(e)}function en(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function Et(e,t){!e._x_attributeCleanups||Object.entries(e._x_attributeCleanups).forEach(([r,i])=>{(t===void 0||t.includes(r))&&(i.forEach(n=>n()),delete e._x_attributeCleanups[r])})}var ke=new MutationObserver(je),Ne=!1;function At(){ke.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),Ne=!0}function tn(){rn(),ke.disconnect(),Ne=!1}var J=[],Ie=!1;function rn(){J=J.concat(ke.takeRecords()),J.length&&!Ie&&(Ie=!0,queueMicrotask(()=>{nn(),Ie=!1}))}function nn(){je(J),J.length=0}function C(e){if(!Ne)return e();tn();let t=e();return At(),t}var Pe=!1,oe=[];function an(){Pe=!0}function sn(){Pe=!1,je(oe),oe=[]}function je(e){if(Pe){oe=oe.concat(e);return}let t=[],r=[],i=new Map,n=new Map;for(let a=0;as.nodeType===1&&t.push(s)),e[a].removedNodes.forEach(s=>s.nodeType===1&&r.push(s))),e[a].type==="attributes")){let s=e[a].target,o=e[a].attributeName,c=e[a].oldValue,l=()=>{i.has(s)||i.set(s,[]),i.get(s).push({name:o,value:s.getAttribute(o)})},u=()=>{n.has(s)||n.set(s,[]),n.get(s).push(o)};s.hasAttribute(o)&&c===null?l():s.hasAttribute(o)?(u(),l()):u()}n.forEach((a,s)=>{Et(s,a)}),i.forEach((a,s)=>{xt.forEach(o=>o(s,a))});for(let a of r)if(!t.includes(a)&&(St.forEach(s=>s(a)),a._x_cleanups))for(;a._x_cleanups.length;)a._x_cleanups.pop()();t.forEach(a=>{a._x_ignoreSelf=!0,a._x_ignore=!0});for(let a of t)r.includes(a)||!a.isConnected||(delete a._x_ignoreSelf,delete a._x_ignore,wt.forEach(s=>s(a)),a._x_ignore=!0,a._x_ignoreSelf=!0);t.forEach(a=>{delete a._x_ignoreSelf,delete a._x_ignore}),t=null,r=null,i=null,n=null}function Ot(e){return Z(B(e))}function Q(e,t,r){return e._x_dataStack=[t,...B(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(i=>i!==t)}}function Tt(e,t){let r=e._x_dataStack[0];Object.entries(t).forEach(([i,n])=>{r[i]=n})}function B(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?B(e.host):e.parentNode?B(e.parentNode):[]}function Z(e){let t=new Proxy({},{ownKeys:()=>Array.from(new Set(e.flatMap(r=>Object.keys(r)))),has:(r,i)=>e.some(n=>n.hasOwnProperty(i)),get:(r,i)=>(e.find(n=>{if(n.hasOwnProperty(i)){let a=Object.getOwnPropertyDescriptor(n,i);if(a.get&&a.get._x_alreadyBound||a.set&&a.set._x_alreadyBound)return!0;if((a.get||a.set)&&a.enumerable){let s=a.get,o=a.set,c=a;s=s&&s.bind(t),o=o&&o.bind(t),s&&(s._x_alreadyBound=!0),o&&(o._x_alreadyBound=!0),Object.defineProperty(n,i,{...c,get:s,set:o})}return!0}return!1})||{})[i],set:(r,i,n)=>{let a=e.find(s=>s.hasOwnProperty(i));return a?a[i]=n:e[e.length-1][i]=n,!0}});return t}function Lt(e){let t=i=>typeof i=="object"&&!Array.isArray(i)&&i!==null,r=(i,n="")=>{Object.entries(Object.getOwnPropertyDescriptors(i)).forEach(([a,{value:s,enumerable:o}])=>{if(o===!1||s===void 0)return;let c=n===""?a:`${n}.${a}`;typeof s=="object"&&s!==null&&s._x_interceptor?i[a]=s.initialize(e,c,a):t(s)&&s!==i&&!(s instanceof Element)&&r(s,c)})};return r(e)}function Mt(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(i,n,a){return e(this.initialValue,()=>on(i,n),s=>Re(i,n,s),n,a)}};return t(r),i=>{if(typeof i=="object"&&i!==null&&i._x_interceptor){let n=r.initialize.bind(r);r.initialize=(a,s,o)=>{let c=i.initialize(a,s,o);return r.initialValue=c,n(a,s,o)}}else r.initialValue=i;return r}}function on(e,t){return t.split(".").reduce((r,i)=>r[i],e)}function Re(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),Re(e[t[0]],t.slice(1),r)}}var kt={};function T(e,t){kt[e]=t}function $e(e,t){return Object.entries(kt).forEach(([r,i])=>{Object.defineProperty(e,`$${r}`,{get(){let[n,a]=$t(t);return n={interceptor:Mt,...n},Ct(t,a),i(t,n)},enumerable:!1})}),e}function ln(e,t,r,...i){try{return r(...i)}catch(n){X(n,e,t)}}function X(e,t,r=void 0){Object.assign(e,{el:t,expression:r}),console.warn(`Alpine Expression Error: ${e.message} +var main=function(M){"use strict";const ts="",rs="";var Te=!1,Le=!1,$=[];function Ur(e){Wr(e)}function Wr(e){$.includes(e)||$.push(e),Vr()}function vt(e){let t=$.indexOf(e);t!==-1&&$.splice(t,1)}function Vr(){!Le&&!Te&&(Te=!0,queueMicrotask(Gr))}function Gr(){Te=!1,Le=!0;for(let e=0;e<$.length;e++)$[e]();$.length=0,Le=!1}var K,J,ae,yt,Ne=!0;function Jr(e){Ne=!1,e(),Ne=!0}function Yr(e){K=e.reactive,ae=e.release,J=t=>e.effect(t,{scheduler:r=>{Ne?Ur(r):r()}}),yt=e.raw}function bt(e){J=e}function Qr(e){let t=()=>{};return[i=>{let n=J(i);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(s=>s())}),e._x_effects.add(n),t=()=>{n!==void 0&&(e._x_effects.delete(n),ae(n))},n},()=>{t()}]}var xt=[],St=[],wt=[];function Zr(e){wt.push(e)}function Ct(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,St.push(t))}function Xr(e){xt.push(e)}function en(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function Et(e,t){!e._x_attributeCleanups||Object.entries(e._x_attributeCleanups).forEach(([r,i])=>{(t===void 0||t.includes(r))&&(i.forEach(n=>n()),delete e._x_attributeCleanups[r])})}var Me=new MutationObserver(je),Ie=!1;function At(){Me.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),Ie=!0}function tn(){rn(),Me.disconnect(),Ie=!1}var Y=[],ke=!1;function rn(){Y=Y.concat(Me.takeRecords()),Y.length&&!ke&&(ke=!0,queueMicrotask(()=>{nn(),ke=!1}))}function nn(){je(Y),Y.length=0}function C(e){if(!Ie)return e();tn();let t=e();return At(),t}var Pe=!1,le=[];function sn(){Pe=!0}function on(){Pe=!1,je(le),le=[]}function je(e){if(Pe){le=le.concat(e);return}let t=[],r=[],i=new Map,n=new Map;for(let s=0;so.nodeType===1&&t.push(o)),e[s].removedNodes.forEach(o=>o.nodeType===1&&r.push(o))),e[s].type==="attributes")){let o=e[s].target,a=e[s].attributeName,c=e[s].oldValue,l=()=>{i.has(o)||i.set(o,[]),i.get(o).push({name:a,value:o.getAttribute(a)})},u=()=>{n.has(o)||n.set(o,[]),n.get(o).push(a)};o.hasAttribute(a)&&c===null?l():o.hasAttribute(a)?(u(),l()):u()}n.forEach((s,o)=>{Et(o,s)}),i.forEach((s,o)=>{xt.forEach(a=>a(o,s))});for(let s of r)if(!t.includes(s)&&(St.forEach(o=>o(s)),s._x_cleanups))for(;s._x_cleanups.length;)s._x_cleanups.pop()();t.forEach(s=>{s._x_ignoreSelf=!0,s._x_ignore=!0});for(let s of t)r.includes(s)||!s.isConnected||(delete s._x_ignoreSelf,delete s._x_ignore,wt.forEach(o=>o(s)),s._x_ignore=!0,s._x_ignoreSelf=!0);t.forEach(s=>{delete s._x_ignoreSelf,delete s._x_ignore}),t=null,r=null,i=null,n=null}function Ot(e){return Z(B(e))}function Q(e,t,r){return e._x_dataStack=[t,...B(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(i=>i!==t)}}function Tt(e,t){let r=e._x_dataStack[0];Object.entries(t).forEach(([i,n])=>{r[i]=n})}function B(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?B(e.host):e.parentNode?B(e.parentNode):[]}function Z(e){let t=new Proxy({},{ownKeys:()=>Array.from(new Set(e.flatMap(r=>Object.keys(r)))),has:(r,i)=>e.some(n=>n.hasOwnProperty(i)),get:(r,i)=>(e.find(n=>{if(n.hasOwnProperty(i)){let s=Object.getOwnPropertyDescriptor(n,i);if(s.get&&s.get._x_alreadyBound||s.set&&s.set._x_alreadyBound)return!0;if((s.get||s.set)&&s.enumerable){let o=s.get,a=s.set,c=s;o=o&&o.bind(t),a=a&&a.bind(t),o&&(o._x_alreadyBound=!0),a&&(a._x_alreadyBound=!0),Object.defineProperty(n,i,{...c,get:o,set:a})}return!0}return!1})||{})[i],set:(r,i,n)=>{let s=e.find(o=>o.hasOwnProperty(i));return s?s[i]=n:e[e.length-1][i]=n,!0}});return t}function Lt(e){let t=i=>typeof i=="object"&&!Array.isArray(i)&&i!==null,r=(i,n="")=>{Object.entries(Object.getOwnPropertyDescriptors(i)).forEach(([s,{value:o,enumerable:a}])=>{if(a===!1||o===void 0)return;let c=n===""?s:`${n}.${s}`;typeof o=="object"&&o!==null&&o._x_interceptor?i[s]=o.initialize(e,c,s):t(o)&&o!==i&&!(o instanceof Element)&&r(o,c)})};return r(e)}function Nt(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(i,n,s){return e(this.initialValue,()=>an(i,n),o=>Re(i,n,o),n,s)}};return t(r),i=>{if(typeof i=="object"&&i!==null&&i._x_interceptor){let n=r.initialize.bind(r);r.initialize=(s,o,a)=>{let c=i.initialize(s,o,a);return r.initialValue=c,n(s,o,a)}}else r.initialValue=i;return r}}function an(e,t){return t.split(".").reduce((r,i)=>r[i],e)}function Re(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),Re(e[t[0]],t.slice(1),r)}}var Mt={};function T(e,t){Mt[e]=t}function $e(e,t){return Object.entries(Mt).forEach(([r,i])=>{Object.defineProperty(e,`$${r}`,{get(){let[n,s]=$t(t);return n={interceptor:Nt,...n},Ct(t,s),i(t,n)},enumerable:!1})}),e}function ln(e,t,r,...i){try{return r(...i)}catch(n){X(n,e,t)}}function X(e,t,r=void 0){Object.assign(e,{el:t,expression:r}),console.warn(`Alpine Expression Error: ${e.message} ${r?'Expression: "'+r+`" -`:""}`,t),setTimeout(()=>{throw e},0)}var le=!0;function cn(e){let t=le;le=!1,e(),le=t}function z(e,t,r={}){let i;return A(e,t)(n=>i=n,r),i}function A(...e){return Nt(...e)}var Nt=It;function un(e){Nt=e}function It(e,t){let r={};$e(r,e);let i=[r,...B(e)];if(typeof t=="function")return fn(i,t);let n=hn(i,t,e);return ln.bind(null,e,t,n)}function fn(e,t){return(r=()=>{},{scope:i={},params:n=[]}={})=>{let a=t.apply(Z([i,...e]),n);ce(r,a)}}var Fe={};function dn(e,t){if(Fe[e])return Fe[e];let r=Object.getPrototypeOf(async function(){}).constructor,i=/^[\n\s]*if.*\(.*\)/.test(e)||/^(let|const)\s/.test(e)?`(() => { ${e} })()`:e,a=(()=>{try{return new r(["__self","scope"],`with (scope) { __self.result = ${i} }; __self.finished = true; return __self.result;`)}catch(s){return X(s,t,e),Promise.resolve()}})();return Fe[e]=a,a}function hn(e,t,r){let i=dn(t,r);return(n=()=>{},{scope:a={},params:s=[]}={})=>{i.result=void 0,i.finished=!1;let o=Z([a,...e]);if(typeof i=="function"){let c=i(i,o).catch(l=>X(l,r,t));i.finished?(ce(n,i.result,o,s,r),i.result=void 0):c.then(l=>{ce(n,l,o,s,r)}).catch(l=>X(l,r,t)).finally(()=>i.result=void 0)}}}function ce(e,t,r,i,n){if(le&&typeof t=="function"){let a=t.apply(r,i);a instanceof Promise?a.then(s=>ce(e,s,r,i)).catch(s=>X(s,n,t)):e(a)}else e(t)}var qe="x-";function W(e=""){return qe+e}function pn(e){qe=e}var Pt={};function S(e,t){Pt[e]=t}function He(e,t,r){if(t=Array.from(t),e._x_virtualDirectives){let a=Object.entries(e._x_virtualDirectives).map(([o,c])=>({name:o,value:c})),s=jt(a);a=a.map(o=>s.find(c=>c.name===o.name)?{name:`x-bind:${o.name}`,value:`"${o.value}"`}:o),t=t.concat(a)}let i={};return t.map(Ht((a,s)=>i[a]=s)).filter(Kt).map(gn(i,r)).sort(vn).map(a=>mn(e,a))}function jt(e){return Array.from(e).map(Ht()).filter(t=>!Kt(t))}var De=!1,ee=new Map,Rt=Symbol();function _n(e){De=!0;let t=Symbol();Rt=t,ee.set(t,[]);let r=()=>{for(;ee.get(t).length;)ee.get(t).shift()();ee.delete(t)},i=()=>{De=!1,r()};e(r),i()}function $t(e){let t=[],r=o=>t.push(o),[i,n]=Qr(e);return t.push(n),[{Alpine:ne,effect:i,cleanup:r,evaluateLater:A.bind(A,e),evaluate:z.bind(z,e)},()=>t.forEach(o=>o())]}function mn(e,t){let r=()=>{},i=Pt[t.type]||r,[n,a]=$t(e);en(e,t.original,a);let s=()=>{e._x_ignore||e._x_ignoreSelf||(i.inline&&i.inline(e,t,n),i=i.bind(i,e,t,n),De?ee.get(Rt).push(i):i())};return s.runCleanups=a,s}var Ft=(e,t)=>({name:r,value:i})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:i}),qt=e=>e;function Ht(e=()=>{}){return({name:t,value:r})=>{let{name:i,value:n}=Dt.reduce((a,s)=>s(a),{name:t,value:r});return i!==t&&e(i,t),{name:i,value:n}}}var Dt=[];function Ke(e){Dt.push(e)}function Kt({name:e}){return Bt().test(e)}var Bt=()=>new RegExp(`^${qe}([^:^.]+)\\b`);function gn(e,t){return({name:r,value:i})=>{let n=r.match(Bt()),a=r.match(/:([a-zA-Z0-9\-:]+)/),s=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],o=t||e[r]||r;return{type:n?n[1]:null,value:a?a[1]:null,modifiers:s.map(c=>c.replace(".","")),expression:i,original:o}}}var Be="DEFAULT",ue=["ignore","ref","data","id","radio","tabs","switch","disclosure","menu","listbox","list","item","combobox","bind","init","for","mask","model","modelable","transition","show","if",Be,"teleport"];function vn(e,t){let r=ue.indexOf(e.type)===-1?Be:e.type,i=ue.indexOf(t.type)===-1?Be:t.type;return ue.indexOf(r)-ue.indexOf(i)}function te(e,t,r={}){e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0}))}var ze=[],We=!1;function zt(e=()=>{}){return queueMicrotask(()=>{We||setTimeout(()=>{Ue()})}),new Promise(t=>{ze.push(()=>{e(),t()})})}function Ue(){for(We=!1;ze.length;)ze.shift()()}function yn(){We=!0}function F(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(n=>F(n,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let i=e.firstElementChild;for(;i;)F(i,t),i=i.nextElementSibling}function U(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}function bn(){document.body||U("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's `