1import{e as ee,w as Ct,r as p,M as se,j as ae,a as oe,H as x,I as T,C as y,G as ne,E as re,q as l,z as C,K as $,y as o,x as a,t as v,F as b,D as k,B as O,A as ot,v as K,a1 as F,J as le,d as L,n as ie}from"./vendor-vue-CeXDcspz.js";import{s as Et,C as ue,V as ce,$ as de,aP as Nt,D as ve,F as nt,I as rt,c as P,l as pe,p as fe,d as ye,bN as bt,av as me,ai as ge,E as he,t as we,aN as ke,aQ as J,a as Se,b as Ce}from"./index-C5pvvFHI.js";import{s as be}from"./siteHeader-DMKxGEdh.js";import{_ as _e}from"./courseGate.vue_vue_type_script_setup_true_lang-C9OUh6Pc.js";import{e as $e}from"./useVocabLoader-CnCFJr9r.js";import{usePairSelection as Le}from"./usePairSelection-CwGG7p6h.js";const _t=de("story.php");async function V(n){if(ue.isNativePlatform()){const c=await ce.post({url:_t,headers:{"Content-Type":"application/json"},data:n});return typeof c.data=="string"?JSON.parse(c.data):c.data}return await(await fetch(_t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)})).json()}function Ie(){try{let n=window.localStorage.getItem("anonid")||"";return n||(n=globalThis.crypto?.randomUUID?.()||Math.random().toString(36).slice(2)+Date.now().toString(36),window.localStorage.setItem("anonid",n)),n}catch{return""}}function Y(){const n=Et.state.user,u={anonId:Ie()};return n?.loggedIn?{...u,email:n.email||"",sessionid:n.sessionid||""}:u}const Ot="storyStatusCache";function $t(){try{const n=window.localStorage.getItem(Ot),u=n?JSON.parse(n):null;return u&&typeof u.limit=="number"?u:null}catch{return null}}function lt(n){try{window.localStorage.setItem(Ot,JSON.stringify(n))}catch{}}async function Lt(){try{const n=await V({action:"status",...Y()});return n&&typeof n.limit=="number"?(lt(n),n):$t()}catch{return $t()}}function xe(n,u="",c=50){const i=Nt("vocab"),r=f=>{const g=String(f.meta?.to||"").toLowerCase(),_=String(f.meta?.from||"").toLowerCase();return!(!g||g!==n.toLowerCase()||u&&_!==u.toLowerCase())},m=[];for(const{card:f,state:g}of i.cards.value)if(r(f)&&!((g?.repetitions??0)<1)&&(f.back&&m.push(f.back),m.length>=c))break;if(!m.length){for(const{card:f}of i.cards.value)if(r(f)&&(f.back&&m.push(f.back),m.length>=c))break}return m}async function Te(n,u,c="a1"){try{const i=await V({action:"generate",...Y(),from:String(n||"").toLowerCase(),to:String(u||"").toLowerCase(),level:c,knownWords:xe(u,n)});if(i?.story)return lt({used:i.used,limit:i.limit,maxWords:i.maxWords,tier:i.tier}),i;if(i?.error){if(typeof i.limit=="number"){const r={used:i.used,limit:i.limit,maxWords:i.maxWords,tier:i.tier};return lt(r),{error:String(i.error),status:r}}return{error:String(i.error)}}return null}catch{return null}}const it="storyHistory",Pt=5;function ut(){try{const n=window.localStorage.getItem(it),u=n?JSON.parse(n):[];return Array.isArray(u)?u.filter(c=>c&&c.story):[]}catch{return[]}}function Ee(n){const u=ut().filter(i=>i.story!==n.story);u.unshift(n);const c=u.slice(0,Pt);try{window.localStorage.setItem(it,JSON.stringify(c))}catch{}return c}async function Ne(){const n=ut();if(!Et.state.user?.loggedIn)return n;try{const u=await V({action:"history",...Y()}),c=Array.isArray(u?.history)?u.history.filter(m=>m&&m.story):[];if(!c.length)return n;const i=[];for(const m of[...c,...n])i.some(f=>f.story===m.story)||i.push(m);i.sort((m,f)=>String(f.date||"").localeCompare(String(m.date||"")));const r=i.slice(0,Pt);try{window.localStorage.setItem(it,JSON.stringify(r))}catch{}return r}catch{return n}}const It=new Map;async function Oe(n,u,c){const i=String(u||"").toLowerCase(),r=String(c||"").toLowerCase(),m=`${r}|${i}|${n.toLowerCase()}`,f=It.get(m);if(f)return f;try{const g=await V({action:"explain",...Y(),word:n,from:i,to:r});return g?.explanation?(It.set(m,String(g.explanation)),String(g.explanation)):g?.error==="rate_limited"?{error:"rate_limited",scope:g.scope==="day"?"day":"minute"}:{error:"failed"}}catch{return{error:"failed"}}}const Pe={class:"stories-col"},De={class:"ds-head"},Ue={key:0,class:"error"},We={class:"quota-top"},Me={class:"quota-num"},Be={class:"quota-chars"},Ae={class:"quota-bar","aria-hidden":"true"},He={key:2,class:"limits-box"},Re={class:"level-row"},ze={class:"st-sec"},Ge={class:"st-levels"},qe=["onClick"],Ke=["disabled"],Fe={key:3,class:"gen-anim"},Je={class:"gen-sparkles"},Ve={class:"gen-typebox"},Ye={class:"gen-status"},je={key:4,class:"limit-box"},Qe={key:5,class:"error"},Xe=["src"],Ze=["aria-label"],ts={class:"st-time"},es=["max","value"],ss={class:"click-hint"},as={key:1,class:"known-hint"},os={class:"story-text"},ns=["onClick"],rs={key:1},ls={class:"explain-error"},is=["disabled"],us={key:0,class:"explain-deckfull"},cs={key:7,class:"history"},ds={key:0,class:"history-list"},vs=["onClick"],ps={class:"hist-flag"},fs={class:"hist-level"},ys={class:"hist-preview"},ms={class:"hist-date"},xt="storyLevel",Tt=100,gs=5,hs=ee({__name:"stories",setup(n){const u=ne(),c=re(
1),i=Le(),r=p(null),m=p(""),f=p(null),g=p(null),_=p(!1),A=p(0),H=p(0),E=p(1);function Dt(){const t=g.value;t&&(t.paused?t.play().catch(()=>{}):t.pause())}function Ut(t){g.value&&(g.value.currentTime=Number(t.target.value))}Ct(f,()=>{E.value=1,A.value=0,H.value=0,_.value=!1});function Wt(){E.value=E.value===1?.8:1,g.value&&(g.value.playbackRate=E.value)}function ct(t){const e=Math.floor(t||0);return`${Math.floor(e/60)}:${String(e%60).padStart(2,"0")}`}async function Mt(){const t=m.value;if(t)try{navigator.share?await navigator.share({text:t}):await navigator.clipboard?.writeText(t)}catch{}}const I=p(!1),j=p(!1);function Bt(){try{const t=window.localStorage.getItem(xt)||"";return["a1","a2","b1","b2","c1"].includes(t)?t:"a1"}catch{return"a1"}}const N=p(Bt());Ct(N,t=>{try{window.localStorage.setItem(xt,t)}catch{}});const S=p(""),D=p(""),Q=p(!1),X=p(!1),Z=p("srs.storyExplainError"),At=L(()=>Z.value.startsWith("srs.storyExplainLimit")),R=L(()=>r.value?Math.max(0,r.value.limit-r.value.used):0),U=p([]),W=p(!1),{t:Ht}=se();function Rt(t){const e=String(t||"").toUpperCase().replace(/-/g,"_")+"_flag",s=Ht(e);return s&&s!==e?s:"ð³ï¸"}function zt(t){const e=String(t||"").replace(/\s+/g," ").trim();return e.length>48?e.slice(0,48)+"â¦":e}function Gt(t){try{return new Date(t).toLocaleDateString()}catch{return""}}function qt(t){m.value=t.story,f.value=t.audioUrl,S.value="",D.value="",W.value=!1,document.querySelector("ion-content")?.scrollToTop?.(300)}const h=i.selected,Kt=L(()=>!c.state.offlinemode&&(!r.value||R.value>0)),M=Nt("vocab"),dt=L(()=>{const t=new Set,e=h.value;if(!e)return t;for(const{card:s,state:d}of M.cards.value)if(String(s.meta?.to||"").toLowerCase()===String(e.to).toLowerCase()&&!((d?.repetitions??0)<1))for(const w of String(s.back||"").toLowerCase().split(/\s+/)){const at=w.replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu,"");at.length>1&&t.add(at)}return t}),vt=L(()=>{const t=new Set;for(const e of pt.value)e.word&&dt.value.has(e.word.toLowerCase())&&t.add(e.word.toLowerCase());return t.size}),pt=L(()=>{const t=m.value;if(!t||!h.value)return[];const e=[];if(h.value.to.toLowerCase().startsWith("zh"))for(const s of t)/\p{Script=Han}/u.test(s)?e.push({text:s,word:s}):e.push({text:s});else for(const s of t.split(/(\s+)/)){if(!s)continue;const d=s.replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu,"");d?e.push({text:s,word:d}):e.push({text:s})}return e}),ft=p(null),yt=p({});function Ft(t){const e=ft.value,s=t?.target;if(!e||!s?.getBoundingClientRect)return;const d=e.getBoundingClientRect(),w=s.getBoundingClientRect(),te=Math.max(8,Math.min(w.left-d.left,d.width-280-8));yt.value={top:`${w.bottom-d.top+8}px`,left:`${te}px`}}function Jt(){S.value=""}async function Vt(t,e){if(!h.value)return;Ft(e),S.value=t,X.value=!1,Q.value=!0,D.value="";const s=await Oe(t,h.value.from,h.value.to);if(S.value===t){if(Q.value=!1,typeof s=="string"){D.value=s;return}X.value=!0,Z.value=s?.error==="rate_limited"?s.scope==="day"?"srs.storyExplainLimitDay":"srs.storyExplainLimitMinute":"srs.storyExplainError"}}const mt=["srs.storyGenStep1","srs.storyGenStep2","srs.storyGenStep3"],z=p(0),tt=p("");let gt=null,ht=null;const et={en:"Once upon a timeâ¦",de:"Es war einmalâ¦",es:"Ãrase una vezâ¦",fr:"Il était une foisâ¦",it:"C'era una voltaâ¦",pt:"Era uma vezâ¦",pl:"Dawno, dawno temuâ¦",ru:"Ðили-бÑлиâ¦",tr:"Bir varmıŠbir yokmuÅâ¦",ar:"ÙØ§Ù ÙØ§ Ù
ا ÙØ§Ùâ¦",uk:"Ðили-бÑлиâ¦",zh:"å¾ä¹
å¾ä¹
以åâ¦â¦",nl:"Er was eensâ¦",sv:"Det var en gÃ¥ngâ¦",da:"Der var engangâ¦",no:"Det var en gangâ¦",fi:"Olipa kerranâ¦",cs:"Bylo nebyloâ¦",sk:"Kde bolo, tam boloâ¦",hu:"Egyszer volt, hol nem voltâ¦",hr:"Bilo jednomâ¦",bg:"Ðмало едно вÑемеâ¦",ro:"A fost odatÄ ca niciodatÄâ¦",el:"Îια ÏοÏά κι Îναν καιÏÏâ¦",ja:"ããããããâ¦â¦",ko:"ìë ìì ìâ¦",vi:"Ngà y xá»a ngà y xưaâ¦",id:"Pada zaman dahuluâ¦",th:"à¸à¸²à¸¥à¸à¸£à¸±à¹à¸à¸«à¸à¸¶à¹à¸à¸à¸²à¸à¸¡à¸²à¹à¸¥à¹à¸§â¦",hi:"बहà¥à¤¤ समय पहलॠà¤à¥ बात हà¥â¦",fa:"ÛÚ©Û Ø¨ÙØ¯Ø ÛÚ©Û ÙØ¨Ùدâ¦",sw:"Hapo zamani za kaleâ¦",af:"Eendag, lank geledeâ¦"};function wt(t){const e=String(t||"").slice(0,2).toLowerCase();return et[e]||et.en}const Yt=L(()=>{const t=h.value;if(!t)return[et.en];const e=wt(t.from),s=wt(t.to);return e===s?[e]:[e,s]});function jt(){z.value=0,gt=setInterval(()=>{z.value=Math.min(z.value+1,mt.length-1)},6e3);let t=0,e=0;tt.value="",ht=setInterval(()=>{const s=Yt.value,d=s[t%s.length];tt.value=d.slice(0,e++),e>d.length+6&&(e=0,t++)},100)}function kt(){clearInterval(gt),clearInterval(ht)}ae(kt);async function Qt(){if(I.value||!h.value)return;I.value=!0,jt(),j.value=!1,S.value="",D.value="";const t=await Te(h.value.from,h.value.to,N.value);if(kt(),I.value=!1,we(t&&"story"in t?"story_generate":"story_error",{level:N.value,course:ke(h.value.from,h.value.to)}),t&&"story"in t)m.value=t.story,f.value=t.audioUrl,ie(()=>g.value?.play?.().catch(()=>{})),r.value={used:t.used,limit:t.limit,maxWords:t.maxWords,tier:t.tier},U.value=Ee({story:t.story,audioUrl:t.audioUrl,level:N.value,from:h.value.from,to:h.value.to,date:new Date().toISOString()});else if(t&&"error"in t&&t.error==="quota_exceeded")if(t.status)r.value=t.status;else{const e=await Lt();e&&(r.value=e)}else j.value=!0}const G=p(!1);function Xt(){r.value?.tier!=="premium"&&(G.value=!G.value)}const B=p(!1),q=L(()=>{const t=h.value,e=S.value.toLowerCase();return!t||!e?!1:M.cards.value.some(({card:s})=>String(s.meta?.type||"")==="mywords"&&J(s.meta?.from,t.from)&&J(s.meta?.to,t.to)&&String(s.back).toLowerCase()===e)}),St=p(!1);async function Zt(){const t=h.value,e=S.value;if(!t||!e||B.value||q.value)return;const s=!!c.state.user?.loggedIn;if(!c.getters.premiumActive){if(s){if(M.cards.value.filter(({card:w})=>String(w.meta?.type||"")==="mywords"&&J(w.meta?.from,t.from)&&J(w.meta?.to,t.to)).length>=Tt){St.value=!0;return}}else if(M.cards.value.filter(({card:w})=>String(w.meta?.type||"")==="mywords").length>=gs){u.push(`/${c.state.uiLanguage||"en"}/register`);return}}B.value=!0;try{const d=await Se.translateWord(c.state.user,e,t.from,t.to);if(d&&!d.error&&d.word_from&&d.word_to){const w=String(d.word_from).trim();M.addCards([{id:`my-${t.from}-${t.to}-${w.toLowerCase().replace(/\s+/g,"-")}`,front:w,back:String(d.word_to).trim(),meta:{from:t.from,to:t.to,type:"mywords",sentence:String(d.sentence_from||"").trim(),sentenceTranslation:String(d.sentence_to||"").trim(),explanation:String(d.explanation||"").trim(),image:"",added:Date.now()}}])}}catch{}finally{B.value=!1}}function st(){const t=c.state.uiLanguage||"en";r.value?.tier==="anon"?u.push(`/${t}/register`):u.push(`/${t}/membership?intent=stories`)}return oe(async()=>{U.value=ut(),Ne().then(e=>{e.length&&(U.value=e)});try{await $e()}catch{}const t=await Lt();t&&(r.value=t)}),(t,e)=>(l(),x(y(he),null,{default:T(()=>[C(be,null,{default:T(()=>[$(o(t.$t("stories")),1)]),_:1}),C(y(ve),{fullscreen:!0,class:"ion-padding"},{default:T(()=>[a("div",Pe,[y(h)?(l(),v(b,{key:1},[a("div",De,[a("h1",null,o(t.$t("stories")),1),a("p",null,o(t.$t("srs.storyIntro")),1
1)]),y(c).state.offlinemode?(l(),v("p",Ue,o(t.$t("srs.storyOffline")),1)):k("",!0),r.value?(l(),v("div",{key:1,class:O(["quota",{"quota-click":r.value.tier!=="premium"}]),onClick:Xt},[a("div",We,[a("div",Me,[a("b",null,o(R.value),1),a("i",null," / "+o(r.value.limit),1),a("span",null,o(r.value.tier==="anon"?t.$t("srs.storyLeftTotal"):t.$t("srs.storyLeft")),1)]),a("span",Be,o(r.value.maxWords)+" "+o(t.$t("srs.storyMaxWords")),1)]),a("div",Ae,[a("i",{style:ot({width:(r.value.limit?Math.max(0,R.value)/r.value.limit:0)*100+"%"})},null,4)])],2)):k("",!0),G.value?(l(),v("div",He,[a("h3",null,o(t.$t("srs.storyLimitsTitle")),1),a("p",null,o(t.$t("srs.storyLimitsAnon")),1),a("p",null,o(t.$t("srs.storyLimitsFree")),1),a("p",null,o(t.$t("srs.storyLimitsPremium")),1),C(y(nt),{expand:"block",onClick:st},{default:T(()=>[$(o(t.$t("srs.storyUpgrade")),1)]),_:1}),C(y(nt),{expand:"block",fill:"clear",onClick:e[0]||(e[0]=s=>G.value=!1)},{default:T(()=>[...e[11]||(e[11]=[$(" OK ",-1)])]),_:1})])):k("",!0),a("div",Re,[a("span",ze,o(t.$t("srs.storyLevelLabel")),1),a("div",Ge,[(l(),v(b,null,K(["a1","a2","b1","b2","c1"],s=>a("button",{key:s,type:"button",class:O(["ds-chip",{active:N.value===s}]),onClick:d=>N.value=s},o(s.toUpperCase()),11,qe)),64))])]),a("button",{type:"button",class:"ds-action gen",disabled:I.value||!Kt.value,onClick:Qt},[I.value?(l(),x(y(rt),{key:0,name:"crescent"})):(l(),x(y(P),{key:1,icon:y(pe),"aria-hidden":"true"},null,8,["icon"])),$(" "+o(I.value?t.$t("srs.storyGenerating"):t.$t("srs.storyGenerate")),1)],8,Ke),I.value?(l(),v("div",Fe,[a("div",Je,[(l(),v(b,null,K(5,s=>a("span",{key:s,style:ot({animationDelay:s*.4+"s",left:8+s*18+"%"})},"â¦",4)),64))]),a("div",Ve,[a("span",null,o(tt.value),1),e[12]||(e[12]=a("span",{class:"gen-caret"},"|",-1))]),a("p",Ye,o(t.$t(mt[z.value])),1),e[13]||(e[13]=a("div",{class:"gen-dots"},[a("span"),a("span"),a("span")],-1))])):k("",!0),r.value&&R.value<=0?(l(),v("div",je,[a("p",null,o(r.value.tier==="anon"?t.$t("srs.storyLimitReachedTotal"):t.$t("srs.storyLimitReached")),1),r.value.tier!=="premium"?(l(),x(y(nt),{key:0,fill:"outline",onClick:st},{default:T(()=>[$(o(r.value.tier==="anon"?t.$t("srs.registerBtn"):t.$t("srs.storyUpgrade")),1)]),_:1})):k("",!0)])):k("",!0),j.value?(l(),v("p",Qe,o(t.$t("srs.storyError")),1)):k("",!0),m.value?(l(),v("div",{key:6,class:"story-card",ref_key:"storyCardEl",ref:ft,onClick:Jt},[f.value?(l(),v("div",{key:0,class:"st-player",onClick:e[6]||(e[6]=F(()=>{},["stop"]))},[a("audio",{ref_key:"playerRef",ref:g,src:f.value,onPlay:e[1]||(e[1]=s=>_.value=!0),onPause:e[2]||(e[2]=s=>_.value=!1),onEnded:e[3]||(e[3]=s=>_.value=!1),onTimeupdate:e[4]||(e[4]=s=>A.value=g.value?.currentTime||0),onLoadedmetadata:e[5]||(e[5]=s=>H.value=g.value?.duration||0)},null,40,Xe),a("button",{type:"button",class:"st-play","aria-label":_.value?"Pause":"Play",onClick:Dt},[C(y(P),{icon:_.value?y(fe):y(ye),"aria-hidden":"true"},null,8,["icon"])],8,Ze),a("span",ts,o(ct(A.value))+" / "+o(ct(H.value)),1),a("input",{class:"st-seek",type:"range",min:"0",max:H.value||0,step:"0.1",value:A.value,"aria-label":"Position",onInput:Ut},null,40,es)])):k("",!0),a("p",ss,o(t.$t("srs.storyClickHint")),1),vt.value>0?(l(),v("p",as," â "+o(vt.value)+" "+o(t.$t("srs.storyKnownWords")),1)):k("",!0),a("p",os,[(l(!0),v(b,null,K(pt.value,(s,d)=>(l(),v(b,{key:d},[s.word?(l(),v("span",{key:0,class:O(["story-word",{"story-word-active":s.word===S.value,"story-word-known":dt.value.has(s.word.toLowerCase())}]),onClick:F(w=>Vt(s.word,w),["stop"])},o(s.text),11,ns)):(l(),v("span",rs,o(s.text),1))],64))),128))]),a("div",{class:"st-tools",onClick:e[7]||(e[7]=F(()=>{},["stop"]))},[f.value?(l(),v("button",{key:0,type:"button",class:O({an:E.value!==1}),onClick:Wt},[C(y(P),{icon:y(bt),"aria-hidden":"true"},null,8,["icon"]),$(" "+o(E.value.toLocaleString(y(c).state.uiLanguage,{minimumFractionDigits:1}))+"à ",1)],2)):k("",!0),a("button",{type:"button",onClick:Mt},[C(y(P),{icon:y(me),"aria-hidden":"true"},null,8,["icon"]),$(" "+o(t.$t("srs.shareBtn")),1)])]),S.value?(l(),v("div",{key:2,class:"explain-pop",style:ot(yt.value),onClick:e[9]||(e[9]=F(()=>{},["stop"]))},[a("button",{type:"button",class:"pop-close",onClick:e[8]||(e[8]=s=>S.value="")},"Ã"),a("b",null,o(S.value),1),Q.value?(l(),x(y(rt),{key:0,name:"dots",class:"explain-spinner"})):X.value?(l(),v(b,{key:1},[a("span",ls,o(t.$t(Z.value)),1),At.value&&r.value&&r.value.tier!=="premium"?(l(),v("a",{key:0,class:"explain-upgrade",onClick:st},o(r.value.tier==="anon"?t.$t("srs.registerBtn"):t.$t("srs.storyUpgrade")),1)):k("",!0)],64)):(l(),v(b,{key:2}
1,[a("span",null,o(D.value),1),a("button",{type:"button",class:O(["explain-add",{saved:q.value}]),disabled:B.value||q.value,onClick:Zt},[B.value?(l(),x(y(rt),{key:0,name:"dots",class:"explain-spinner"})):(l(),v(b,{key:1},[$(o(q.value?"â "+t.$t("mw.menu"):"+ "+t.$t("mw.addTo")),1)],64))],10,is),St.value?(l(),v("p",us,o(t.$t("mw.limitFull",{max:Tt})),1)):k("",!0)],64))],4)):k("",!0)],512)):k("",!0),U.value.length?(l(),v("div",cs,[a("button",{type:"button",class:"history-head",onClick:e[10]||(e[10]=s=>W.value=!W.value)},[C(y(P),{icon:y(bt),class:"hist-icon"},null,8,["icon"]),a("span",null,o(t.$t("srs.storyHistoryTitle")),1),C(y(P),{icon:y(ge),class:O(["chev",{open:W.value}])},null,8,["icon","class"])]),C(le,{name:"slide"},{default:T(()=>[W.value?(l(),v("div",ds,[(l(!0),v(b,null,K(U.value,(s,d)=>(l(),v("button",{key:s.date+d,type:"button",class:"history-item",onClick:w=>qt(s)},[a("span",ps,o(Rt(s.to)),1),a("span",fs,o((s.level||"a1").toUpperCase()),1),a("span",ys,o(zt(s.story)),1),a("span",ms,o(Gt(s.date)),1)],8,vs))),128))])):k("",!0)]),_:1})])):k("",!0)],64)):(l(),x(_e,{key:0}))])]),_:1})]),_:1}))}}),$s=Ce(hs,[["__scopeId","data-v-f9e6dcac"]]);export{$s as default}; 2//# sourceMappingURL=stories-DlN8sGog.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.