PluginProbe
AI / trunk
AI vtrunk
1.3.0 1.2.0 1.1.0 1.0.2 1.0.1 1.0.0 0.9.0 trunk 0.1.1 0.2.0 0.2.1 0.3.0 0.3.1 0.4.0 0.4.1 0.5.0 0.6.0 0.7.0 0.8.0
ai / build-scripts / experiments / comment-moderation.js

comment-moderation.js in AI trunk, at build-scripts/experiments/comment-moderation.js

1 lines 4.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (()=>{"use strict";const e={n:t=>{const a=t&&t.__esModule?()=>t.default:()=>t;return e.d(a,{a}),a},d:(t,a)=>{if(Array.isArray(a))for(var i=0;i<a.length;){var n=a[i++],o=a[i++];e.o(t,n)?0===o&&i++:0===o?Object.defineProperty(t,n,{enumerable:!0,value:a[i++]}):Object.defineProperty(t,n,{enumerable:!0,get:o})}else for(var n in a)e.o(a,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:a[n]})},o:(e,t)=>Object.hasOwn(e,t)},t=window.wp.domReady;var a=e.n(t);const i=window.wp.element,n=window.wp.i18n,o=window.wp.apiFetch;var s=e.n(o);const c=window.wp.url;let r=!1;const l=()=>{r||(console.warn("[AI] Client ability execution is unavailable. Falling back to REST."),r=!0)},d=(e,t,a)=>{if("GET"===a||"DELETE"===a)return{path:null==t?`/wp-abilities/v1/abilities/${e}/run`:(0,c.addQueryArgs)(`/wp-abilities/v1/abilities/${e}/run`,{input:t}),method:a};const i={path:`/wp-abilities/v1/abilities/${e}/run`,method:"POST"};return void 0!==t&&(i.data={input:t}),i};function u(e){e.className="ai-badge ai-badge--failed",e.textContent=(0,n.__)("Failed","ai"),e.setAttribute("data-ai-status","failed")}function m(e){e.className="ai-badge ai-badge--processing",e.textContent=(0,n.__)("Analyzing…","ai"),e.setAttribute("data-ai-status","processing")}function b(){const e=new URL(window.location.href);e.searchParams.has("wpai_analysis_queued")&&(e.searchParams.delete("wpai_analysis_queued"),window.history.replaceState(null,"",`${e.pathname}${e.search}${e.hash}`))}function w(){const e=(0,i.useRef)(!1),t=(0,i.useCallback)(()=>{const e=document.querySelectorAll('[data-ai-status="pending"]'),t=new Map;return e.forEach(e=>{const a=parseInt(e.dataset.commentId||"0",10);if(!a)return;t.has(a)||t.set(a,{id:a});const i=t.get(a),n=e.closest("td");n?.classList.contains("column-wpai_sentiment")?i.sentimentBadge=e:n?.classList.contains("column-wpai_toxicity")&&(i.toxicityBadge=e)}),Array.from(t.values()).filter(e=>void 0!==e.sentimentBadge&&void 0!==e.toxicityBadge)},[]),a=(0,i.useCallback)(async e=>{m(e.sentimentBadge),m(e.toxicityBadge);try{!function(e,t){const a=function(e){const t=window.aiCommentModerationData?.labels?.sentiment||{},a=t[e]||t.neutral;return{label:a.label,className:a.class,icon:a.icon}}(t.sentiment),i=function(e){const t=window.aiCommentModerationData?.labels?.toxicity||{};for(const a of Object.values(t))if(e>=a.min&&(e<a.max||1===a.max))return{label:a.label,className:a.class,icon:a.icon};return{label:"Low",className:"ai-badge--low-toxicity",icon:""}}(t.toxicity_score);e.sentimentBadge.className=`ai-badge ${a.className}`,e.sentimentBadge.textContent=`${a.icon} ${a.label}`,e.sentimentBadge.title=a.label,e.sentimentBadge.removeAttribute("data-ai-status"),e.toxicityBadge.className=`ai-badge ${i.className}`,e.toxicityBadge.textContent=`${i.icon} ${i.label}`,e.toxicityBadge.title=`${i.label} (${Math.round(100*t.toxicity_score)}%)`}(e,await async function(e,t,a){try{const a=await(async()=>{try{const{ready:e}=await import("@wordpress/core-abilities");return await e,await import("@wordpress/abilities")}catch{return null}})();if("function"==typeof a?.executeAbility)return await a.executeAbility(e,t);l()}catch(e){if(console.error(e),!(e=>{if(!e||"object"!=typeof e)return!1;const t="message"in e&&"string"==typeof e.message?e.message:"",a="code"in e&&"string"==typeof e.code?e.code:"";return"ability_not_found"===a||t.includes("Ability not found")||t.includes("missing callback")||"ability_invalid_input"===a})(e))throw e;l()}const i=a?.method??"POST";return await s()({...d(e,t,i),...a?.signal?{signal:a.signal}:{}})}("ai/comment-analysis",{comment_id:e.id}))}catch(t){console.error(`Failed to analyze comment ${e.id}:`,t),u(e.sentimentBadge),u(e.toxicityBadge)}},[]),n=(0,i.useCallback)(async()=>{if(e.current)return;const i=t();if(0!==i.length){e.current=!0;try{for(const e of i)await a(e)}finally{e.current=!1,b()}}else b()},[t,a]);return(0,i.useEffect)(()=>{const e=setTimeout(()=>{n()},500);return()=>clearTimeout(e)},[]),null}const y=window.ReactJSXRuntime;a()(function(){const e=window.aiCommentModerationData;if(!e?.enabled)return;const t=document.createElement("div");t.id="ai-comment-moderation-root",document.body.appendChild(t),(0,i.createRoot)(t).render((0,y.jsx)(y.Fragment,{children:(0,y.jsx)(w,{})}))})})();