Files
2026-04-28 15:13:50 +02:00

49 lines
17 KiB
JavaScript

import{h as A,r as $e,m as V}from"../js/utils.68c800e0.js";import{f as _,i as X,a0 as ge,v as k,j as d,U as Q,b as Ce,n as ne,e as ye,Y as Se,aj as Te,Q as M,R as W,T as Y,M as I,S as Ee,r as D,u as J,g as xe,an as re,h as le}from"../js/vendor-vue-ui.f00a1236.js";import{a as Ae}from"../js/icon.5572a14b.js";import{l as ce}from"../js/index.18357c0f.js";import{aX as be,a2 as ee,v as Me,u as Pe,aY as Le,c as Be,t as ae,L as Re,aZ as Ie,y as He,aq as ue,l as de}from"../js/app-core.b862f9c8.js";import{C as Oe}from"../js/CreditCounter.99aa2625.js";import{a as Fe,_ as e,W as Ne}from"../js/vendor-other.7b559694.js";import{g as De}from"../js/vendor-markdown.3b10d37a.js";import{_ as K}from"../js/Button.6c09d515.js";import{C as pe}from"../js/Index.3967c277.js";import{_ as ze}from"../js/_plugin-vue_export-helper.eefbdd86.js";import{_ as Ge}from"../js/Trash.c3e8db0b.js";import"../js/vendor-lodash.d3ad8b99.js";import"../js/Tooltip.cb3a78f6.js";import"../js/Close.de45e465.js";const qe="aioseo/ai-assistant",Ue="AIOSEO - AI Assistant",je="aioseo",Ve="Quickly generate content using Artificial Intelligence.",We={html:!1,multiple:!0,reusable:!1,customClassName:!1},Ye={content:{type:"string",default:""},userPrompt:{type:"string",default:""},messages:{type:"array",default:null},isFetching:{type:"boolean",default:!1},tone:{type:"string",default:""},audience:{type:"string",default:""}},Je={name:qe,title:Ue,category:je,description:Ve,supports:We,attributes:Ye},Ke={class:"aioseo-ai-assistant-sidebar"},Ze={class:"aioseo-ai-assistant-sidebar-cost"},Qe={__name:"Sidebar",setup(c){const o="all-in-one-seo-pack",s=be(),a={cost:Fe(e("Each AI Assistant request costs %1$s credits.",o),s.generationPrice.toLocaleString())};return(G,H)=>(_(),X("div",Ke,[ge(k(Oe),{"tooltip-placement":"bottom","tooltip-offset":"-90px,0","parent-component-context":"sidebar"}),d("div",Ze,Q(a.cost),1)]))}},Xe={},et={width:"16",height:"16",viewBox:"0 0 16 16",xmlns:"http://www.w3.org/2000/svg",class:"aioseo-renew"};function tt(c,o){return _(),X("svg",et,[...o[0]||(o[0]=[d("path",{d:"M3.39984 10.7C3.15539 10.2777 2.97206 9.8444 2.84984 9.39996C2.72762 8.95551 2.6665 8.49996 2.6665 8.03329C2.6665 6.5444 3.18317 5.27774 4.2165 4.23329C5.24984 3.18885 6.51095 2.66663 7.99984 2.66663H8.1165L7.04984 1.59996L7.98317 0.666626L10.6498 3.33329L7.98317 5.99996L7.04984 5.06663L8.1165 3.99996H7.99984C6.88873 3.99996 5.94428 4.39163 5.1665 5.17496C4.38873 5.95829 3.99984 6.91107 3.99984 8.03329C3.99984 8.32218 4.03317 8.60552 4.09984 8.88329C4.1665 9.16107 4.2665 9.43329 4.39984 9.69996L3.39984 10.7ZM8.0165 15.3333L5.34984 12.6666L8.0165 9.99996L8.94984 10.9333L7.88317 12H7.99984C9.11095 12 10.0554 11.6083 10.8332 10.825C11.6109 10.0416 11.9998 9.08885 11.9998 7.96663C11.9998 7.67774 11.9665 7.3944 11.8998 7.11663C11.8332 6.83885 11.7332 6.56663 11.5998 6.29996L12.5998 5.29996C12.8443 5.72218 13.0276 6.15552 13.1498 6.59996C13.2721 7.0444 13.3332 7.49996 13.3332 7.96663C13.3332 9.45551 12.8165 10.7222 11.7832 11.7666C10.7498 12.8111 9.48873 13.3333 7.99984 13.3333H7.88317L8.94984 14.4L8.0165 15.3333Z",fill:"currentColor"},null,-1)])])}const ot=ze(Xe,[["render",tt]]),nt={class:"aioseo-ai-assistant-block"},at={class:"aioseo-ai-assistant-block__head"},st=["innerHTML"],it={class:"aioseo-ai-assistant-block__body"},rt={class:"aioseo-ai-assistant-block__input-container"},lt={class:"aioseo-ai-assistant-block__input-row"},ct={class:"aioseo-ai-assistant-block__input-col aioseo-ai-assistant-block__input-col--grow"},ut=["placeholder","disabled","maxlength"],dt={class:"aioseo-ai-assistant-block__input-col"},pt={class:"aioseo-ai-assistant-block__controls"},mt={key:1},ht={class:"aioseo-ai-assistant-block__input-row aioseo-ai-assistant-block__input-row--gray"},gt={class:"aioseo-ai-assistant-block__input-col aioseo-ai-assistant-block__input-col--disclaimer"},bt=["innerHTML"],ft={class:"aioseo-ai-assistant-block__error-container"},_t={__name:"Block",setup(c){const o="all-in-one-seo-pack",{toneOptions:s,audienceOptions:a,hasEnoughCredits:G,strings:H}=ee(),$=be(),q=Me(),O=Pe(),b=D(null),v=D({}),S=D(null),B=D(""),F=D({api:null});let R=null,T=null;const u=xe(),f={aiTextGenerator:e("AI Text Generator",o),insert:e("Insert",o),placeholder:e("Write a blog about... Generate a table for...",o),requestUnsuccessful:e("The request was unsuccessful. Status code:",o),generate:e("Generate",o),stop:e("Stop",o),delete:e("Delete",o),regenerate:e("Regenerate",o),noPermission:e("You do not have permission to use the AI Assistant.",o),userPromptMaxlength:e("You have reached the maximum number of allowed characters.",o)},E=J(()=>S.value?.closest("[data-block]").dataset.block),h=J(()=>{const t=!!u.root.data.userPrompt?.trim().length,n=!!u.root.data.messages?.length&&u.root.data.messages.find(we=>we.role==="assistant"),i=!!u.root.data.isFetching,x=!!B.value.length;return{submit:{disabled:!t||!$.hasPermission||!G($.generationPrice),show:!0,loading:i,text:n?ot:f.generate,title:n?f.regenerate:"",type:n?"gray":"blue"},insert:{show:x&&!i},stop:{show:i},delete:{show:n&&!i}}}),U=J(()=>$.hasPermission?F.value.api?F.value.api:null:f.noPermission),j=J(()=>u.root.data.userPrompt.length>=$.options.input.userPrompt.maxlength?f.userPromptMaxlength:null),r=()=>{let t=window.wp.blocks.pasteHandler({HTML:B.value,plainText:u.root.data.content,mode:"AUTO"});typeof t=="string"&&(t=window.wp.blocks.createBlock("core/paragraph",{content:t}));const{dispatch:n}=window.wp.data;n("core/block-editor").replaceBlock(E.value,t)},g=()=>{oe(),ne(()=>{ve()})},w=()=>{v.value.abort()},fe=()=>{const{dispatch:t}=window.wp.data;t("core/block-editor").removeBlock(E.value)},se=()=>{const t=S.value;t.style.height="auto",t.style.height=t.scrollHeight+"px"},N=()=>{B.value=De.parse(u.root.data.content,{breaks:!0}),se()},ie=t=>{const n=u.root.data.messages||[];u.root.data.messages=[...n,t]},te=()=>window.wp.data.select("core/block-editor").getBlock(E.value),_e=t=>{if(!t)return!1;const n=t.getBoundingClientRect(),i=Ie(),x=i.innerHeight||i.document.documentElement.clientHeight;return 0<=n.top&&n.top<=x},ve=()=>{b.value&&(_e(b.value)||b.value.scrollIntoView({behavior:"smooth",block:"start",inline:"nearest"}))},ke=()=>{let t="";try{ae().querySelectorAll(".aioseo-ai-assistant-block").forEach(n=>{n.style.visibility="hidden"}),t=Re(!0),t=t.replace(new RegExp(`<!-- wp:${te().name}.*?/-->`,"gs"),""),t&&1e4<t.length&&(t=t.substring(0,1e4))}catch(n){console.warn("Could not retrieve post content for context:",n),t=""}finally{ae().querySelectorAll(".aioseo-ai-assistant-block").forEach(n=>{n.style.visibility="visible"})}return t.trim()},oe=(t={})=>{v.value=new AbortController,F.value.api=null,u.root.data.isFetching=!0,u.root.data.content="",N();const n={role:"user"};t?.translate?n.translate=t.translate:t?.improve?n.improve=t.improve:n.content=u.root.data.userPrompt,ie(n),Ne(Be.restUrl("ai/assistant"),{headers:{"Content-Type":"application/json","X-WP-Nonce":window.aioseo.nonce},method:"POST",body:JSON.stringify({postId:O.currentPost?.id||0,messages:u.root.data.messages,tone:s.find(i=>i.value===te().attributes.tone).label,audience:a.find(i=>i.value===te().attributes.audience).label,postContent:ke(),postTitle:(Le()||"").trim(),focusKeyword:(O.currentPost?.keyphrases?.focus?.keyphrase||"").trim()}),cache:"no-store",openWhenHidden:!0,onclose(){N()},onerror(i){throw i},onmessage(i){const x=JSON.parse(i.data);if(x?.error)throw new Error(`${x.error}`);u.root.data.content+=x?.content??"",N()},onopen(i){if(!i.ok)throw new Error(`${f.requestUnsuccessful.trim()} ${i.status}`)},signal:v.value.signal}).catch(i=>{console.error(i),F.value.api=i.message}).then(()=>{if(!u.root.data.content.trim().length){u.root.data.messages.pop();return}ie({role:"assistant",content:u.root.data.content})}).finally(async()=>{await q.getCredits(!0),u.root.data.isFetching=!1,await ne(),N()})};return Ce(()=>{N(),R=t=>{!t||t.clientId!==E.value||!t.translate||oe({translate:t.translate})},T=t=>{!t||t.clientId!==E.value||!t.improve||oe({improve:t.improve})},window.aioseoBus.$on("aiAssistantTranslateChange",R),window.aioseoBus.$on("aiAssistantImproveChange",T),ne(()=>{S.value?.focus()})}),ye(()=>{window.aioseoBus.$off("aiAssistantTranslateChange",R),window.aioseoBus.$off("aiAssistantImproveChange",T)}),(t,n)=>(_(),X("div",nt,[d("div",at,[d("div",{ref_key:"contentElement",ref:b,class:"aioseo-ai-assistant-block__content",innerHTML:B.value},null,8,st)]),d("div",it,[d("div",rt,[d("div",lt,[d("div",ct,[Se(d("textarea",{ref_key:"inputElement",ref:S,class:"aioseo-ai-assistant-block__input",placeholder:f.placeholder,disabled:t.$root.$data.isFetching,"onUpdate:modelValue":n[0]||(n[0]=i=>t.$root.$data.userPrompt=i),onInput:se,rows:"1",maxlength:k($).options.input.userPrompt.maxlength},null,40,ut),[[Te,t.$root.$data.userPrompt]])]),d("div",dt,[d("div",pt,[h.value.delete.show?(_(),M(k(K),{key:0,size:"small",type:"gray",class:"aioseo-ai-assistant-block__btn",onClick:Y(fe,["stop","exact"]),title:f.delete},{default:W(()=>[ge(k(Ge),{width:"18",height:"18"})]),_:1},8,["title"])):I("",!0),h.value.submit.show?(_(),M(k(K),{key:1,disabled:h.value.submit.disabled,loading:h.value.submit.loading,type:h.value.submit.type,title:h.value.submit.title,size:"small-table",class:"aioseo-ai-assistant-block__btn",onClick:Y(g,["stop","exact"])},{default:W(()=>[typeof h.value.submit.text=="object"?(_(),M(Ee(h.value.submit.text),{key:0,width:"18",height:"18"})):(_(),X("span",mt,Q(h.value.submit.text),1))]),_:1},8,["disabled","loading","type","title"])):I("",!0),h.value.insert.show?(_(),M(k(K),{key:2,size:"small-table",type:"blue",class:"aioseo-ai-assistant-block__btn",onClick:Y(r,["stop","exact"])},{default:W(()=>[d("span",null,Q(f.insert),1)]),_:1})):I("",!0),h.value.stop.show?(_(),M(k(K),{key:3,size:"small-table",type:"gray",class:"aioseo-ai-assistant-block__btn",onClick:Y(w,["stop","exact"])},{default:W(()=>[d("span",null,Q(f.stop),1)]),_:1})):I("",!0)])])]),d("div",ht,[d("div",gt,[d("span",{innerHTML:k(H).disclaimer},null,8,bt)])])]),d("div",ft,[U.value?(_(),M(k(pe),{key:0,innerHTML:U.value,type:"red",size:"small",style:{"margin-top":"10px"}},null,8,["innerHTML"])):I("",!0),j.value?(_(),M(k(pe),{key:1,innerHTML:j.value,type:"yellow",size:"small",style:{"margin-top":"10px"}},null,8,["innerHTML"])):I("",!0)])])]))}},p="all-in-one-seo-pack",m={selectLanguage:e("Select language",p),translate:e("Translate",p),arabic:e("Arabic",p),chinese:e("Chinese",p),dutch:e("Dutch",p),english:e("English",p),french:e("French",p),german:e("German",p),hindi:e("Hindi",p),italian:e("Italian",p),japanese:e("Japanese",p),korean:e("Korean",p),portuguese:e("Portuguese",p),spanish:e("Spanish",p),turkish:e("Turkish",p)},{Dropdown:vt,ToolbarButton:kt,ToolbarGroup:wt,MenuGroup:$t,MenuItem:Ct}=window.wp.components,yt=[m.arabic,m.chinese,m.dutch,m.english,m.french,m.german,m.hindi,m.italian,m.japanese,m.korean,m.portuguese,m.spanish,m.turkish],St=({attributes:c,onChange:o})=>React.createElement(wt,null,React.createElement(vt,{popoverProps:{placement:"bottom-start"},renderToggle:({isOpen:s,onToggle:a})=>React.createElement(kt,{disabled:!c.content||c.isFetching,icon:"admin-site-alt3",label:m.translate,onClick:a,"aria-expanded":s}),renderContent:({onClose:s})=>React.createElement($t,{label:m.selectLanguage},yt.map(a=>React.createElement(Ct,{onClick:()=>{o(a),s()}},a)))})),l="all-in-one-seo-pack",z={improve:e("Improve",l),contentLength:e("Content Length",l),contentStructure:e("Content Structure",l),contentType:e("Content Type",l),contentTone:e("Content Tone",l)},{Dropdown:Tt,ToolbarButton:Et,ToolbarGroup:me,MenuGroup:C,MenuItem:y}=window.wp?.components||{},Z={contentLength:[{value:"summarize",label:e("Summarize",l)},{value:"makeLonger",label:e("Make longer",l)},{value:"makeShorter",label:e("Make shorter",l)}],contentStructure:[{value:"expandOnKeyPoints",label:e("Expand on key points",l)},{value:"reorganizeForClarity",label:e("Reorganize for clarity / bullet points",l)},{value:"addExamples",label:e("Add examples / case studies",l)},{value:"removeFiller",label:e("Remove filler / make concise",l)}],contentType:[{value:"rewriteAsBlog",label:e("Rewrite as blog",l)},{value:"rewriteAsListicle",label:e("Rewrite as listicle",l)},{value:"rewriteAsStory",label:e("Rewrite as story / narrative",l)},{value:"rewriteForSeo",label:e("Rewrite for SEO (keyword-focused)",l)}],contentTone:[{value:"makeMoreFormal",label:e("Make more formal",l)},{value:"makeLessFormal",label:e("Make less formal",l)},{value:"makeMoreHumorous",label:e("Make more humorous",l)},{value:"makeMoreSerious",label:e("Make more serious",l)},{value:"makeMoreProfessional",label:e("Make more professional",l)},{value:"makeMoreCasual",label:e("Make more casual",l)}]},xt=({attributes:c,onChange:o})=>A`
<${me}>
<${Tt}
popoverProps=${{placement:"bottom-start"}}
renderToggle=${({isOpen:s,onToggle:a})=>A`
<${Et}
disabled=${!c.content||c.isFetching}
icon="admin-customizer"
label="${z.improve}"
onClick=${a}
aria-expanded=${s}
/>
`}
renderContent=${({onClose:s})=>A`
<${C} label="${z.contentLength}">
${Z.contentLength.map(a=>A`
<${y} onClick=${()=>{o(a.value),s()}}>
${a.label}
</${y}>
`)}
</${C}>
<${C} label="${z.contentStructure}">
${Z.contentStructure.map(a=>A`
<${y} onClick=${()=>{o(a.value),s()}}>
${a.label}
</${y}>
`)}
</${C}>
<${C} label="${z.contentType}">
${Z.contentType.map(a=>A`
<${y} onClick=${()=>{o(a.value),s()}}>
${a.label}
</${y}>
`)}
</${C}>
<${C} label="${z.contentTone}">
${Z.contentTone.map(a=>A`
<${y} onClick=${()=>{o(a.value),s()}}>
${a.label}
</${y}>
`)}
</${C}>
`}
/>
</${me}>`,At="all-in-one-seo-pack",Mt={tone:e("Tone",At)},{SelectControl:Pt}=window.wp.components,Lt=({value:c,onChange:o})=>{const{toneOptions:s}=ee();return React.createElement(Pt,{label:Mt.tone,value:c,options:s,onChange:o,__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0})},Bt="all-in-one-seo-pack",Rt={audience:e("Audience",Bt)},{SelectControl:It}=window.wp.components,Ht=({value:c,onChange:o})=>{const{audienceOptions:s}=ee();return React.createElement(It,{label:Rt.audience,value:c,options:s,onChange:o,__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0})},Ot="all-in-one-seo-pack",{name:Ft,title:Nt,description:Dt,category:zt,supports:Gt,attributes:qt}=Je,L=window.wp,{useEffect:Ut}=L.element,{InspectorControls:jt}=L.blockEditor||L.editor,{BlockControls:Vt}=L.blockEditor,he=L.components.PanelBody,P=[],Wt={notFanOfOptions:e("Not a fan of these options? You can set your own tone/audience directly in your prompt.",Ot)},Yt={title:Nt,description:Dt,category:zt,supports:Gt,attributes:qt,icon:Ae,edit:function({setAttributes:c,attributes:o,clientId:s,className:a,isSelected:G,toggleSelection:H}){const $=He(),{toneOptions:q,audienceOptions:O}=ee(),b=`aioseo-block-${s}`,v=`aioseo-sidebar-${s}`,S=ae().getElementById(b),B=document.querySelector(".block-editor");window.wp.data.useSelect(r=>r("core/edit-post").getActiveGeneralSidebarName())==="edit-post/block"&&(typeof H!="function"||H(!0)),(G||S)&&ue({id:b,parent:B,subtree:!0,loop:!1,done:r=>{if(r.firstChild)return;V(b,P);let g=re({name:"Blocks/AiAssistant",data:()=>o,watch:{"$data.userPrompt":{handler:function(w){c({userPrompt:w})}},"$data.isFetching":{handler:function(w){c({isFetching:w})}},"$data.content":{handler:function(w){c({content:w})}},"$data.messages":{handler:function(w){c({messages:w})}}},render:()=>le(_t)});g=ce(g),de(g),g.mount(r),P.push({id:b,app:g})}});const R=P.find(r=>v===r.id),T=document.querySelector(".interface-interface-skeleton__sidebar");S&&T&&(!R||!T.contains(R.app._container))&&ue({id:v,parent:T,subtree:!0,loop:!1,done:r=>{V(v,P);let g=re({name:"Blocks/AiAssistant/Sidebar",render:()=>le(Qe)});g=ce(g),de(g),g.mount(r),P.push({id:v,app:g})}}),Ut(()=>()=>{V(b,P),V(v,P)},[]);const u=r=>{c({tone:r.toLowerCase()})},f=r=>{c({audience:r.toLowerCase()})},E=r=>{window.aioseoBus.$emit("aiAssistantTranslateChange",{clientId:s,translate:r})},h=r=>{window.aioseoBus.$emit("aiAssistantImproveChange",{clientId:s,improve:r})},U=q.find(r=>r.value===$.options.aiContent.tone)||q[0];o.tone||(L.data.dispatch("core/block-editor").__unstableMarkNextChangeAsNotPersistent?.(),c({tone:U.value}));const j=O.find(r=>r.value===$.options.aiContent.audience)||O[0];return o.audience||(L.data.dispatch("core/block-editor").__unstableMarkNextChangeAsNotPersistent?.(),c({audience:j.value})),React.createElement(React.Fragment,null,React.createElement(Vt,null,React.createElement(St,{attributes:o,onChange:E}),React.createElement(xt,{attributes:o,onChange:h})),React.createElement(jt,null,React.createElement(he,{initialOpen:!0},React.createElement(Lt,{value:o.tone,onChange:u}),React.createElement(Ht,{value:o.audience,onChange:f}),React.createElement("div",null,Wt.notFanOfOptions)),React.createElement(he,{initialOpen:!0},React.createElement("div",{id:v,class:"aioseo-app"}))),React.createElement("div",{className:a},React.createElement("div",{id:b})))},save:function(){return null}};$e({name:Ft,settings:Yt});