// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-or-later // @source: https://gitlab.com/soapbox-pub/ditto/-/tree/f0a3877c import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{Q as t,W as n,en as r,qi as i}from"./lucide-icons-BdRF0moN.js";import{t as a}from"./jsx-runtime-By8HlURe.js";import{t as o}from"./dist-DQ82bf9M.js";import{t as s}from"./useQuery-rCAlChE8.js";import{t as c}from"./useAppContext-Ughdk2-Z.js";import{o as l,r as u}from"./react-intl-eZirkCBg.js";import{s as d,t as f}from"./useCurrentUser-C6OJJlWo.js";import{t as p}from"./button-Cs26nq0r.js";import{t as m}from"./useNostrPublish-CrMjnYm4.js";import{a as h,c as g,d as _,i as v,l as y,n as b,r as x,s as S,t as C,u as w}from"./cards-DDSmTmb2.js";import{n as T,t as E}from"./TarotReadingSection-DRLtYoI5.js";import{t as D}from"./SubHeaderBar-BYwNp4Nc.js";import{i as O,n as k,r as A,t as j}from"./TarotStars-D-jATuHd.js";import{o as M,w as N}from"./index-CYEZWNq6.js";import{t as P}from"./PageHeader-CMi4aeE4.js";var F=e(i(),1);function I(e){let{nostr:t}=o(),{user:n}=f();return s({queryKey:[`user-fortune`,n?.pubkey,e],queryFn:async r=>{if(!n)return null;let i=AbortSignal.any([r.signal,AbortSignal.timeout(5e3)]),a=Math.floor((Date.now()-b[e])/1e3),o=(await t.query([{kinds:[v],authors:[n.pubkey],"#t":[e],since:a,limit:10}],{signal:i})).sort((e,t)=>t.created_at-e.created_at);for(let e of o){let t=y(e);if(t)return{...e,cards:t}}return null},enabled:!!n})}function L(e){let{user:t}=f(),n=t?.pubkey,r=n?_(e,n):null,{data:i,isLoading:a,refetch:o}=I(e),[s,c]=(0,F.useState)([]),[l,u]=(0,F.useState)([!1,!1,!1]),[d,p]=(0,F.useState)(!1),[m,h]=(0,F.useState)(null),v=(0,F.useCallback)(e=>{try{r&&localStorage.setItem(r,JSON.stringify(e))}catch{}h(e.timestamp)},[r]),y=(0,F.useCallback)(()=>{r&&localStorage.removeItem(r),h(null)},[r]),x=(0,F.useRef)(null);(0,F.useEffect)(()=>{if(!n){x.current=null,c([]),u([!1,!1,!1]),p(!1),h(null);return}if(a)return;let t=`${e}:${n}`;if(x.current===t)return;x.current=t;let o=Date.now(),s=b[e],l=r?w(r):null,d=i&&o-i.created_at*1e3{c(e),u([!0,!0,!0]),p(!0)};d?(f&&S(f.cards,d.cards)?h(f.timestamp):v({cards:d.cards,timestamp:d.created_at*1e3}),m(d.cards)):f?(h(f.timestamp),m(f.cards)):(y(),c(g(e)),u([!1,!1,!1]),p(!1))},[e,n,a,i,r,v,y]),(0,F.useEffect)(()=>{s.length===3&&l.every(Boolean)&&!d&&(p(!0),r&&!w(r)&&v({cards:s,timestamp:Date.now()}))},[s,l,d,r,v]);let C=(0,F.useCallback)(e=>{u(t=>{if(t[e])return t;let n=[...t];return n[e]=!0,n})},[]),T=(0,F.useCallback)(()=>{u([!0,!0,!0])},[]),E=(0,F.useCallback)(()=>{y(),c(g(e)),u([!1,!1,!1]),p(!1)},[e,y]),D=(0,F.useCallback)(()=>{o()},[o]),O=null;if(d){let e=i?i.created_at*1e3:null;O=e!==null&&m!==null?Math.min(e,m):e??m}return{cards:s,revealed:l,sealed:d,isLoading:!!t&&a,readingTimestamp:O,fortune:i,revealCard:C,revealAll:T,redraw:E,refetchFortune:D}}var R=a();function z(e,t){return`${t===`daily`?`Daily`:`Weekly`} tarot reading with three cards: ${e.map(e=>e.name+(e.isReversed?` (Reversed)`:``)).join(`, `)} (past/present/future)`}function B(e){let t=Math.floor(e/(1e3*60*60*24)),n=Math.floor(e%(1e3*60*60*24)/(1e3*60*60)),r=Math.floor(e%(1e3*60*60)/(1e3*60)),i=Math.floor(e%(1e3*60)/1e3),a=`${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}:${i.toString().padStart(2,`0`)}`;return t>0?`${t}d ${a}`:a}function V(){let e=l(),{user:i}=f(),{toast:a}=d(),{mutate:o}=m(),[s,c]=(0,F.useState)(`daily`),g=L(`daily`),_=L(`weekly`),y=s===`daily`?g:_,[S,w]=(0,F.useState)(!1),[N,P]=(0,F.useState)(!1),{highlightIndex:I,sectionRefs:V,jumpToSection:H}=O();(0,F.useEffect)(()=>{w(!1)},[s,i?.pubkey]);let[U,W]=(0,F.useState)(()=>Date.now()),G=y.sealed&&y.readingTimestamp!==null;(0,F.useEffect)(()=>{if(!G)return;let e=setInterval(()=>W(Date.now()),1e3);return()=>clearInterval(e)},[G]);let K=y.readingTimestamp===null?null:y.readingTimestamp+b[s]-U,q=!!y.fortune||S,J=y.sealed&&K!==null&&K<=0;return(0,R.jsxs)(`div`,{className:`flex flex-col flex-1`,children:[(0,R.jsxs)(D,{children:[(0,R.jsx)(M,{label:e.formatMessage({id:`tarot.tab.daily`,defaultMessage:`Daily`}),active:s===`daily`,onClick:()=>c(`daily`),children:(0,R.jsxs)(`span`,{className:`flex items-center justify-center gap-1`,children:[(0,R.jsx)(n,{className:`size-3.5`}),(0,R.jsx)(u,{id:`tarot.tab.daily`,defaultMessage:`Daily`})]})}),(0,R.jsx)(M,{label:e.formatMessage({id:`tarot.tab.weekly`,defaultMessage:`Weekly`}),active:s===`weekly`,onClick:()=>c(`weekly`),children:(0,R.jsxs)(`span`,{className:`flex items-center justify-center gap-1`,children:[(0,R.jsx)(r,{className:`size-3.5`}),(0,R.jsx)(u,{id:`tarot.tab.weekly`,defaultMessage:`Weekly`})]})})]}),(0,R.jsxs)(`div`,{className:`relative flex-1`,children:[(0,R.jsx)(j,{}),(0,R.jsx)(`div`,{className:`relative flex flex-col items-center px-4 pb-12`,style:{paddingTop:36},children:i?y.isLoading?(0,R.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-16`,children:[(0,R.jsx)(`div`,{className:`w-36`,children:(0,R.jsx)(A,{isSpinning:!0})}),(0,R.jsx)(`p`,{className:`text-muted-foreground mt-8`,children:(0,R.jsx)(u,{id:`tarot.loading`,defaultMessage:`Reading your cards…`})})]}):(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`div`,{className:`text-center mt-4 mb-8 space-y-2 max-w-md`,children:[(0,R.jsx)(`h2`,{className:`font-serif text-3xl sm:text-4xl font-bold tracking-tight`,children:y.sealed?(0,R.jsx)(u,{id:`tarot.heading.sealed`,defaultMessage:`Your fate is sealed`}):(0,R.jsx)(u,{id:`tarot.heading.await`,defaultMessage:`The cards await`})}),(0,R.jsx)(`p`,{className:`text-base sm:text-lg text-muted-foreground`,children:y.sealed?s===`daily`?(0,R.jsx)(u,{id:`tarot.subheading.sealed.daily`,defaultMessage:`Return tomorrow for a new reading.`}):(0,R.jsx)(u,{id:`tarot.subheading.sealed.weekly`,defaultMessage:`Return next week for a new reading.`}):s===`daily`?(0,R.jsx)(u,{id:`tarot.subheading.daily`,defaultMessage:`Past, present, future. Drawn once a day.`}):(0,R.jsx)(u,{id:`tarot.subheading.weekly`,defaultMessage:`Three major arcana for the week ahead.`})})]}),(0,R.jsxs)(`div`,{className:`w-full max-w-2xl`,children:[(0,R.jsx)(k,{cards:y.cards,revealed:y.revealed,onCardClick:e=>y.revealCard(e),onSettledClick:H}),(0,R.jsxs)(`div`,{className:`flex flex-col items-center gap-3 mt-8`,children:[y.cards.length===3&&!y.sealed&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`p`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,R.jsx)(t,{className:`size-4`,"aria-hidden":`true`}),(0,R.jsx)(u,{id:`tarot.hint.tapToReveal`,defaultMessage:`Tap each card to reveal your fate`})]}),(0,R.jsx)(p,{onClick:y.revealAll,variant:`outline`,size:`sm`,className:`rounded-full px-6`,children:(0,R.jsx)(u,{id:`tarot.action.revealAll`,defaultMessage:`Reveal all`})})]}),y.sealed&&!J&&K!==null&&(0,R.jsxs)(`div`,{className:`inline-flex items-baseline gap-2 rounded-full border border-border bg-card px-4 py-2 text-sm shadow-sm`,children:[(0,R.jsx)(`span`,{className:`leading-none text-muted-foreground`,children:(0,R.jsx)(u,{id:`tarot.countdown.next`,defaultMessage:`Next {type, select, daily {daily} other {weekly}} reading`,values:{type:s}})}),(0,R.jsx)(`span`,{className:`leading-none font-mono font-semibold tabular-nums text-primary`,children:B(K)})]}),J&&(0,R.jsx)(p,{onClick:y.redraw,className:`rounded-full px-8`,children:(0,R.jsx)(u,{id:`tarot.action.redraw`,defaultMessage:`Draw a new reading`})}),y.sealed&&!J&&(0,R.jsx)(p,{onClick:()=>{if(!i||N||y.cards.length!==3)return;P(!0);let t=z(y.cards,s);o({kind:v,content:``,tags:[...h(y.cards),[`s`,x],[`t`,s],[`alt`,t]]},{onSuccess:()=>{P(!1),w(!0),y.refetchFortune(),a({title:e.formatMessage({id:`tarot.share.toast.success`,defaultMessage:`Your fortune has been shared ✨`})})},onError:()=>{P(!1),a({title:e.formatMessage({id:`tarot.share.toast.failedTitle`,defaultMessage:`Failed to share`}),description:e.formatMessage({id:`tarot.share.toast.postFailed`,defaultMessage:`Your reading could not be posted. Try again.`}),variant:`destructive`})}})},size:`lg`,className:`rounded-full px-8`,disabled:q||N,children:N?(0,R.jsx)(u,{id:`tarot.action.sharing`,defaultMessage:`Sharing…`}):q?(0,R.jsx)(u,{id:`tarot.action.shared`,defaultMessage:`Shared ✓`}):(0,R.jsx)(u,{id:`tarot.action.share`,defaultMessage:`Share your fortune`})})]})]}),y.cards.length===3&&y.revealed.some(Boolean)&&(0,R.jsxs)(`div`,{className:`mt-10 w-full max-w-2xl space-y-4`,children:[(0,R.jsxs)(`h2`,{className:`font-serif text-2xl font-bold text-center reading-reveal`,children:[(0,R.jsx)(u,{id:`tarot.interpretation.heading`,defaultMessage:`The interpretation`}),(0,R.jsx)(`span`,{className:`reading-sheen`,"aria-hidden":`true`})]}),y.cards.map((e,t)=>y.revealed[t]?(0,R.jsxs)(`div`,{ref:e=>{V.current[t]=e},className:`reading-reveal`,children:[(0,R.jsx)(T,{title:E[t],index:t,card:e,highlighted:I===t}),(0,R.jsx)(`span`,{className:`reading-sheen`,"aria-hidden":`true`})]},C[t]):null)]})]}):(0,R.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-16 text-center`,children:[(0,R.jsx)(`div`,{className:`w-36`,children:(0,R.jsx)(A,{})}),(0,R.jsx)(`p`,{className:`text-muted-foreground mt-8 max-w-xs`,children:(0,R.jsx)(u,{id:`tarot.loginRequired`,defaultMessage:`Log in to draw your cards.`})})]})})]})]})}function H(){let{config:e}=c();return N({title:`Tarot | ${e.appName}`,description:`Draw your daily three-card tarot spread and share your fortune on Nostr`}),(0,R.jsxs)(`main`,{className:`flex min-h-[100dvh] flex-col`,children:[(0,R.jsx)(P,{title:`Tarot`,icon:(0,R.jsx)(r,{className:`size-5`})}),(0,R.jsx)(V,{})]})}export{H as TarotPage}; // @license-end