@liberfi.io/ui-media-track 0.1.146 → 0.1.148

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -14,7 +14,7 @@ declare global {
14
14
  };
15
15
  }
16
16
  }
17
- declare const _default: "0.1.146";
17
+ declare const _default: "0.1.148";
18
18
 
19
19
  type Props$c = {
20
20
  src: string;
package/dist/index.d.ts CHANGED
@@ -14,7 +14,7 @@ declare global {
14
14
  };
15
15
  }
16
16
  }
17
- declare const _default: "0.1.146";
17
+ declare const _default: "0.1.148";
18
18
 
19
19
  type Props$c = {
20
20
  src: string;
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';var hooks=require('@liberfi.io/hooks'),ui=require('@liberfi.io/ui'),jsxRuntime=require('react/jsx-runtime'),utils=require('@liberfi.io/utils'),react=require('react'),i18n=require('@liberfi.io/i18n'),reactQuery=require('@tanstack/react-query');typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/ui-media-track"]="0.1.146");var xe="0.1.146";function O({src:e}){let[t,{setTrue:r}]=hooks.useBoolean(false);return e?jsxRuntime.jsx(ui.Skeleton,{isLoaded:t,className:"w-full h-auto",children:jsxRuntime.jsx("img",{src:e,className:"w-full h-full object-cover aspect-video",onLoad:()=>{r();}})}):null}function H({src:e}){return e?jsxRuntime.jsx("div",{className:"w-full h-full overflow-hidden rounded-md mt-2",children:jsxRuntime.jsx("iframe",{className:"w-full h-full aspect-video",src:e,allowFullScreen:true})}):null}function W({medias:e,tweetHref:t}){let r=e.filter(s=>s.type==="image"),a=e.filter(s=>s.type==="video"),n=()=>a.length?jsxRuntime.jsx("div",{className:"grid grid-cols-1 gap-[1px] overflow-hidden rounded-md",children:a.map(s=>jsxRuntime.jsx(H,{src:s.url},s.url))}):null,i=()=>r.length?jsxRuntime.jsx("div",{className:"grid grid-cols-1 gap-[1px] overflow-hidden rounded-md",children:r.map(s=>jsxRuntime.jsx(ui.Link,{href:t,target:"_blank",children:jsxRuntime.jsx(O,{src:s.url})},s.url))}):null;return jsxRuntime.jsxs("div",{className:"flex flex-col gap-2",children:[n(),i()]})}function D({url:e,name:t="",size:r=36}){let a=react.useMemo(()=>t?t.slice(0,2):"N/A",[t]);return jsxRuntime.jsx(ui.Skeleton,{className:"flex rounded-full flex-shrink-0",style:{width:r,height:r},isLoaded:!!e,children:jsxRuntime.jsx(ui.Avatar,{size:"md",color:"primary",radius:"full",showFallback:true,name:a,src:e,style:{width:r,height:r}})})}function $({user:e,renderTimestamp:t,renderActions:r}){return jsxRuntime.jsxs("div",{className:"flex items-center justify-between gap-1",children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-1",children:[jsxRuntime.jsx(D,{url:e.avatar,name:e.username}),jsxRuntime.jsxs("div",{className:"flex flex-col gap-0.5",children:[jsxRuntime.jsxs("div",{className:"flex flex-row items-baseline gap-1",children:[jsxRuntime.jsx("span",{className:"text-foreground font-semibold truncate leading-none",children:e.username}),t]}),jsxRuntime.jsxs(ui.Link,{target:"_blank",underline:"hover",className:"text-default-500 text-sm leading-none",href:utils.twitterUserUrl(e.screenName??e.username),children:["@",e.screenName??e.username]})]})]}),r]})}var b=react.createContext({});function Q(){let e=react.useContext(b);if(!e)throw new Error("useMediaTrackContext must be used within a MediaTrackProvider");return e}function h(){let{client:e}=Q();return e}function no(e={}){let t=h();return reactQuery.useMutation({mutationFn:async r=>t.generateMeme(r),...e})}async function Ae(e,{media:t,targetLanguage:r,options:a}){return await e.translate(t,r,a)}function Z(e={}){let t=h();return reactQuery.useMutation({mutationFn:async r=>Ae(t,r),...e})}function R(e){let t=/(https?:\/\/[^\s]+|www\.[^\s]+)/gi,r=/#[\w]+/g,a=/\$[A-Za-z][A-Za-z0-9_]*/g,n=[],i;for(;(i=t.exec(e))!==null;)n.push({index:i.index,length:i[0].length,text:i[0],type:"url"});for(;(i=r.exec(e))!==null;){let o=i.index;n.some(d=>o>=d.index&&o<d.index+d.length)||n.push({index:o,length:i[0].length,text:i[0],type:"hashtag"});}for(;(i=a.exec(e))!==null;){let o=i.index;n.some(d=>o>=d.index&&o<d.index+d.length)||n.push({index:o,length:i[0].length,text:i[0],type:"symbol"});}n.sort((o,p)=>o.index-p.index);let s=[],m=0,l=0;return n.forEach(o=>{if(o.index>m&&s.push(e.slice(m,o.index)),o.type==="url"){let p=o.text.startsWith("http")?o.text:`https://${o.text}`;s.push(jsxRuntime.jsx("a",{href:p,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",onClick:d=>d.stopPropagation(),children:o.text},l++));}else if(o.type==="hashtag"){let d=`https://x.com/hashtag/${o.text.slice(1)}`;s.push(jsxRuntime.jsx("a",{href:d,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",onClick:x=>x.stopPropagation(),children:o.text},l++));}else o.type==="symbol"&&s.push(jsxRuntime.jsx("span",{className:"text-primary",children:o.text},l++));m=o.index+o.length;}),m<e.length&&s.push(e.slice(m)),s.length>0?s:[e]}function q({data:e,embed:t,renderActions:r}){let[a,{toggle:n}]=hooks.useBoolean(false),{t:i,i18n:s}=i18n.useTranslation(),{mutateAsync:m,isPending:l}=Z(),[o,p]=react.useState(null),d=react.useCallback(async x=>{if(x.stopPropagation(),n(),!o){let A=await m({media:e,targetLanguage:s.language,options:{sourceTweet:t}}),ue=R(A);p(ue);}},[n,m,e,s.language,o]);return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-1 text-xs",children:[jsxRuntime.jsxs("div",{onClick:d,className:"flex items-center gap-0.5 cursor-pointer text-primary hover:text-foreground",children:[jsxRuntime.jsx(ui.TranslateIcon,{width:"14",height:"14"}),i(a?"mediaTrack.tweets.translate.hide":"mediaTrack.tweets.translate.show")]}),r]}),jsxRuntime.jsx("div",{className:ui.cn(!a&&"hidden"),onClick:x=>{x.stopPropagation();},children:a&&jsxRuntime.jsxs("div",{className:"bg-content2 rounded-md p-2 text-default-900 text-sm leading-5",children:[o,l&&jsxRuntime.jsx(ui.Skeleton,{className:"w-full h-4 rounded-md"})]})})]})}function K({isExpanded:e,onToggleExpand:t}){let{t:r}=i18n.useTranslation(),a=()=>e?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(ui.ChevronUpIcon,{className:"border border-current",width:"12",height:"12"}),"\xA0",r("mediaTrack.tweets.collapse")]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(ui.ChevronDownIcon,{className:"border border-current",width:"12",height:"12"}),"\xA0",r("mediaTrack.tweets.expand")]});return e===void 0?null:jsxRuntime.jsxs("div",{className:"flex items-center gap-1",children:[jsxRuntime.jsx("div",{className:"w-px h-2.5 bg-line-300"}),jsxRuntime.jsx("button",{onClick:n=>{n.stopPropagation(),t?.(!e);},className:"flex items-center text-default-500 hover:text-foreground text-xs",children:a()})]})}function X({content:e,isExpanded:t=false,onLoad:r}){let a=react.useRef(null),n=react.useMemo(()=>R(e),[e]);return react.useEffect(()=>{let i=a.current;!r||!i||i.scrollHeight>i.clientHeight&&r?.();},[t]),jsxRuntime.jsx("div",{ref:a,className:["text-default-900 text-sm leading-5",t?"":"line-clamp-3"].join(" "),onClick:i=>{i.stopPropagation();},children:n})}function u({data:e,headerActions:t,footerActions:r,embed:a=false,indicator:n,children:i}){let[s,m]=react.useState(void 0),l=react.useMemo(()=>a?"bg-default-50 rounded-lg p-3 w-full mx-auto":"bg-default-100 hover:bg-default-200 rounded-lg p-3 w-full mx-auto",[a]),o=react.useMemo(()=>a?e.sourceTweet:e.tweet,[e,a]),p=hooks.useTickAge(o.timestamp);return jsxRuntime.jsxs("div",{className:ui.cn("flex flex-col gap-1.5 cursor-pointer",l),onClick:()=>{window.open(utils.twitterTweetUrl(o.tweetId),"_blank");},children:[jsxRuntime.jsx($,{user:o.user,renderTimestamp:a?void 0:jsxRuntime.jsx("div",{className:"text-xs text-primary",children:utils.formatAge(p)}),renderActions:t}),n,o.content.text&&jsxRuntime.jsx(X,{content:o.content.text,isExpanded:s,onLoad:()=>m(false)}),o.content.text&&jsxRuntime.jsx(q,{data:e,embed:a,text:o.content.text,renderActions:jsxRuntime.jsx(K,{isExpanded:s,onToggleExpand:m})}),jsxRuntime.jsx("div",{className:ui.cn((!o.content.medias||o.content.medias.length===0)&&"hidden"),children:o.content.medias&&o.content.medias.length>0&&jsxRuntime.jsx(W,{medias:o.content.medias,tweetHref:utils.twitterTweetUrl(o.tweetId)})}),i,r]})}function te({data:e,headerActions:t,footerActions:r}){return jsxRuntime.jsx(u,{data:e,headerActions:t,footerActions:r})}function re({data:e,headerActions:t,footerActions:r}){let n=!!e.sourceTweet;return jsxRuntime.jsx(u,{data:e,headerActions:t,footerActions:r,children:n?jsxRuntime.jsx(u,{data:e,embed:true}):null})}function ne({data:e,headerActions:t,footerActions:r}){let a=e.sourceTweet,n=!!a,i=react.useMemo(()=>jsxRuntime.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[jsxRuntime.jsx("span",{children:"Replying to"}),n&&jsxRuntime.jsxs(ui.Link,{className:"text-sm",underline:"hover",target:"_blank",href:utils.twitterUserUrl(a.user.screenName??a.user.username),children:["@",a.user.screenName??a.user.username]})]}),[n,a]);return jsxRuntime.jsx(u,{data:e,indicator:i,headerActions:t,footerActions:r,children:n?jsxRuntime.jsx(u,{data:e,embed:true}):null})}function ie({data:e,headerActions:t,footerActions:r}){let a=e.sourceTweet,n=!!a,i=react.useMemo(()=>jsxRuntime.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[jsxRuntime.jsx("span",{children:"Retweeted by"}),n&&jsxRuntime.jsxs(ui.Link,{className:"text-sm",underline:"hover",target:"_blank",href:utils.twitterUserUrl(a.user.screenName??a.user.username),children:["@",a.user.screenName??a.user.username]})]}),[n,a]);return jsxRuntime.jsx(u,{data:e,indicator:i,headerActions:t,footerActions:r,children:n?jsxRuntime.jsx(u,{data:e,embed:true}):null})}function le({data:e,headerActions:t,footerActions:r,embed:a=false,children:n,loading:i=false}){if(i||!e)return jsxRuntime.jsx(ot,{embed:a});let s=e.tweet.type;return jsxRuntime.jsx("div",{className:"w-full",children:(()=>{let l={data:e,headerActions:t,footerActions:r,embed:a,children:n};switch(s){case "reply":return jsxRuntime.jsx(ne,{...l});case "retweet":return jsxRuntime.jsx(ie,{...l});case "quote":return jsxRuntime.jsx(re,{...l});default:return jsxRuntime.jsx(te,{...l})}})()})}function ot({embed:e=false}){return jsxRuntime.jsxs("div",{className:["flex flex-col gap-2",e?"bg-default-50 rounded-lg p-3 w-full mx-auto":"bg-default-100 rounded-lg p-3 w-full mx-auto"].join(" "),children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-3",children:[jsxRuntime.jsx(ui.Skeleton,{className:"w-10 h-10 rounded-full"}),jsxRuntime.jsxs("div",{className:"flex flex-col gap-1 flex-1",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-24"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-3 w-16"})]}),jsxRuntime.jsx(ui.Skeleton,{className:"h-3 w-12"})]}),jsxRuntime.jsxs("div",{className:"flex flex-col gap-2",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-full"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-3/4"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-1/2"})]}),jsxRuntime.jsx(ui.Skeleton,{className:"h-48 w-full rounded-lg"}),jsxRuntime.jsxs("div",{className:"flex justify-between items-center pt-2",children:[jsxRuntime.jsxs("div",{className:"flex gap-4",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-6 w-16"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-6 w-16"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-6 w-16"})]}),jsxRuntime.jsx(ui.Skeleton,{className:"h-6 w-20"})]})]})}function ce({token:e}){let t=new utils.SafeBigNumber(e.priceChange??"0").isPositive()?"primary":"danger";return jsxRuntime.jsxs(ui.Button,{color:t,variant:"flat",size:"sm",radius:"full",startContent:jsxRuntime.jsx(dt,{token:e}),children:[jsxRuntime.jsx("span",{children:e.symbol}),jsxRuntime.jsx("span",{children:e.priceChange?utils.formatPercent(Number(e.priceChange)/100):"--"})]})}function dt({token:e}){let t=react.useMemo(()=>jsxRuntime.jsx(ui.Image,{className:"w-full h-full",src:e.image,alt:e.chain}),[e.chain]);return jsxRuntime.jsx(ui.Badge,{className:"w-2.5 h-2.5 p-0 border",size:"sm",content:t,shape:"circle",placement:"bottom-right",children:jsxRuntime.jsx(ui.Avatar,{className:"w-5 h-5",radius:"full",src:e.image})})}function de({data:e,loading:t,setIsPaused:r,customHeaderActions:a,customFooterActions:n}){let i=react.useCallback(s=>jsxRuntime.jsxs("div",{className:"flex gap-2.5 justify-between",children:[s.token&&jsxRuntime.jsx(ce,{token:s.token}),n?.(s)]}),[n]);return jsxRuntime.jsx("div",{className:"flex flex-col gap-2.5",onMouseEnter:()=>r(true),onMouseLeave:()=>r(false),children:e.map(s=>jsxRuntime.jsx(le,{data:s,headerActions:a?.(s),footerActions:i(s),loading:t},s.id))})}function ut(){return jsxRuntime.jsxs("div",{className:"flex flex-col gap-2 bg-default-100 rounded-lg p-3 w-full mx-auto",children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-3",children:[jsxRuntime.jsx(ui.Skeleton,{className:"w-10 h-10 rounded-full"}),jsxRuntime.jsxs("div",{className:"flex flex-col gap-1 flex-1",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-40 rounded-md"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-3 w-32 rounded-md"})]})]}),jsxRuntime.jsxs("div",{className:"flex flex-col gap-2",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-full rounded-md"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-3/4 rounded-md"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-1/2 rounded-md"})]}),jsxRuntime.jsx(ui.Skeleton,{className:"h-48 w-full rounded-lg"})]})}function me({count:e=3}){return jsxRuntime.jsx("div",{className:"flex flex-col gap-2",children:Array.from({length:e}).map((t,r)=>jsxRuntime.jsx(ut,{},r))})}var pe=()=>{let[e,t]=react.useState([]),[r,a]=react.useState(true),[n,i]=react.useState(false),s=h(),m=react.useCallback(l=>{t(o=>{let p=o.findIndex(x=>x.id===l.id),d;if(p>=0)d=o.map((x,A)=>A===p?l:x);else {if(n)return o;d=[l,...o];}return d.slice(0,30)}),a(false);},[n]);return react.useEffect(()=>{let l=s.subscribeTweetMedia({callback:m}),o=s.subscribeTweetMediaToken({callback:m});return ()=>{l.unsubscribe(),o.unsubscribe();}},[s,m]),{medias:e,loading:r,isPaused:n,setIsPaused:i}};function aa({onPauseChange:e,customHeaderActions:t,customFooterActions:r}){let{medias:a,loading:n,isPaused:i,setIsPaused:s}=pe();return react.useEffect(()=>{e?.(i);},[i,e]),n?jsxRuntime.jsx(me,{count:3}):jsxRuntime.jsx(de,{data:a,loading:n,setIsPaused:s,customHeaderActions:t,customFooterActions:r})}function wa({client:e,children:t}){return jsxRuntime.jsx(b.Provider,{value:{client:e},children:t})}
1
+ 'use strict';var hooks=require('@liberfi.io/hooks'),ui=require('@liberfi.io/ui'),jsxRuntime=require('react/jsx-runtime'),utils=require('@liberfi.io/utils'),react=require('react'),i18n=require('@liberfi.io/i18n'),reactQuery=require('@tanstack/react-query');typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/ui-media-track"]="0.1.148");var xe="0.1.148";function O({src:e}){let[t,{setTrue:r}]=hooks.useBoolean(false);return e?jsxRuntime.jsx(ui.Skeleton,{isLoaded:t,className:"w-full h-auto",children:jsxRuntime.jsx("img",{src:e,className:"w-full h-full object-cover aspect-video",onLoad:()=>{r();}})}):null}function H({src:e}){return e?jsxRuntime.jsx("div",{className:"w-full h-full overflow-hidden rounded-md mt-2",children:jsxRuntime.jsx("iframe",{className:"w-full h-full aspect-video",src:e,allowFullScreen:true})}):null}function W({medias:e,tweetHref:t}){let r=e.filter(s=>s.type==="image"),a=e.filter(s=>s.type==="video"),n=()=>a.length?jsxRuntime.jsx("div",{className:"grid grid-cols-1 gap-[1px] overflow-hidden rounded-md",children:a.map(s=>jsxRuntime.jsx(H,{src:s.url},s.url))}):null,i=()=>r.length?jsxRuntime.jsx("div",{className:"grid grid-cols-1 gap-[1px] overflow-hidden rounded-md",children:r.map(s=>jsxRuntime.jsx(ui.Link,{href:t,target:"_blank",children:jsxRuntime.jsx(O,{src:s.url})},s.url))}):null;return jsxRuntime.jsxs("div",{className:"flex flex-col gap-2",children:[n(),i()]})}function D({url:e,name:t="",size:r=36}){let a=react.useMemo(()=>t?t.slice(0,2):"N/A",[t]);return jsxRuntime.jsx(ui.Skeleton,{className:"flex rounded-full flex-shrink-0",style:{width:r,height:r},isLoaded:!!e,children:jsxRuntime.jsx(ui.Avatar,{size:"md",color:"primary",radius:"full",showFallback:true,name:a,src:e,style:{width:r,height:r}})})}function $({user:e,renderTimestamp:t,renderActions:r}){return jsxRuntime.jsxs("div",{className:"flex items-center justify-between gap-1",children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-1",children:[jsxRuntime.jsx(D,{url:e.avatar,name:e.username}),jsxRuntime.jsxs("div",{className:"flex flex-col gap-0.5",children:[jsxRuntime.jsxs("div",{className:"flex flex-row items-baseline gap-1",children:[jsxRuntime.jsx("span",{className:"text-foreground font-semibold truncate leading-none",children:e.username}),t]}),jsxRuntime.jsxs(ui.Link,{target:"_blank",underline:"hover",className:"text-default-500 text-sm leading-none",href:utils.twitterUserUrl(e.screenName??e.username),children:["@",e.screenName??e.username]})]})]}),r]})}var b=react.createContext({});function Q(){let e=react.useContext(b);if(!e)throw new Error("useMediaTrackContext must be used within a MediaTrackProvider");return e}function h(){let{client:e}=Q();return e}function no(e={}){let t=h();return reactQuery.useMutation({mutationFn:async r=>t.generateMeme(r),...e})}async function Ae(e,{media:t,targetLanguage:r,options:a}){return await e.translate(t,r,a)}function Z(e={}){let t=h();return reactQuery.useMutation({mutationFn:async r=>Ae(t,r),...e})}function R(e){let t=/(https?:\/\/[^\s]+|www\.[^\s]+)/gi,r=/#[\w]+/g,a=/\$[A-Za-z][A-Za-z0-9_]*/g,n=[],i;for(;(i=t.exec(e))!==null;)n.push({index:i.index,length:i[0].length,text:i[0],type:"url"});for(;(i=r.exec(e))!==null;){let o=i.index;n.some(d=>o>=d.index&&o<d.index+d.length)||n.push({index:o,length:i[0].length,text:i[0],type:"hashtag"});}for(;(i=a.exec(e))!==null;){let o=i.index;n.some(d=>o>=d.index&&o<d.index+d.length)||n.push({index:o,length:i[0].length,text:i[0],type:"symbol"});}n.sort((o,p)=>o.index-p.index);let s=[],m=0,l=0;return n.forEach(o=>{if(o.index>m&&s.push(e.slice(m,o.index)),o.type==="url"){let p=o.text.startsWith("http")?o.text:`https://${o.text}`;s.push(jsxRuntime.jsx("a",{href:p,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",onClick:d=>d.stopPropagation(),children:o.text},l++));}else if(o.type==="hashtag"){let d=`https://x.com/hashtag/${o.text.slice(1)}`;s.push(jsxRuntime.jsx("a",{href:d,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",onClick:x=>x.stopPropagation(),children:o.text},l++));}else o.type==="symbol"&&s.push(jsxRuntime.jsx("span",{className:"text-primary",children:o.text},l++));m=o.index+o.length;}),m<e.length&&s.push(e.slice(m)),s.length>0?s:[e]}function q({data:e,embed:t,renderActions:r}){let[a,{toggle:n}]=hooks.useBoolean(false),{t:i,i18n:s}=i18n.useTranslation(),{mutateAsync:m,isPending:l}=Z(),[o,p]=react.useState(null),d=react.useCallback(async x=>{if(x.stopPropagation(),n(),!o){let A=await m({media:e,targetLanguage:s.language,options:{sourceTweet:t}}),ue=R(A);p(ue);}},[n,m,e,s.language,o]);return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-1 text-xs",children:[jsxRuntime.jsxs("div",{onClick:d,className:"flex items-center gap-0.5 cursor-pointer text-primary hover:text-foreground",children:[jsxRuntime.jsx(ui.TranslateIcon,{width:"14",height:"14"}),i(a?"mediaTrack.tweets.translate.hide":"mediaTrack.tweets.translate.show")]}),r]}),jsxRuntime.jsx("div",{className:ui.cn(!a&&"hidden"),onClick:x=>{x.stopPropagation();},children:a&&jsxRuntime.jsxs("div",{className:"bg-content2 rounded-md p-2 text-default-900 text-sm leading-5",children:[o,l&&jsxRuntime.jsx(ui.Skeleton,{className:"w-full h-4 rounded-md"})]})})]})}function K({isExpanded:e,onToggleExpand:t}){let{t:r}=i18n.useTranslation(),a=()=>e?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(ui.ChevronUpIcon,{className:"border border-current",width:"12",height:"12"}),"\xA0",r("mediaTrack.tweets.collapse")]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(ui.ChevronDownIcon,{className:"border border-current",width:"12",height:"12"}),"\xA0",r("mediaTrack.tweets.expand")]});return e===void 0?null:jsxRuntime.jsxs("div",{className:"flex items-center gap-1",children:[jsxRuntime.jsx("div",{className:"w-px h-2.5 bg-line-300"}),jsxRuntime.jsx("button",{onClick:n=>{n.stopPropagation(),t?.(!e);},className:"flex items-center text-default-500 hover:text-foreground text-xs",children:a()})]})}function X({content:e,isExpanded:t=false,onLoad:r}){let a=react.useRef(null),n=react.useMemo(()=>R(e),[e]);return react.useEffect(()=>{let i=a.current;!r||!i||i.scrollHeight>i.clientHeight&&r?.();},[t]),jsxRuntime.jsx("div",{ref:a,className:["text-default-900 text-sm leading-5",t?"":"line-clamp-3"].join(" "),onClick:i=>{i.stopPropagation();},children:n})}function u({data:e,headerActions:t,footerActions:r,embed:a=false,indicator:n,children:i}){let[s,m]=react.useState(void 0),l=react.useMemo(()=>a?"bg-default-50 rounded-lg p-3 w-full mx-auto":"bg-default-100 hover:bg-default-200 rounded-lg p-3 w-full mx-auto",[a]),o=react.useMemo(()=>a?e.sourceTweet:e.tweet,[e,a]),p=hooks.useTickAge(o.timestamp);return jsxRuntime.jsxs("div",{className:ui.cn("flex flex-col gap-1.5 cursor-pointer",l),onClick:()=>{window.open(utils.twitterTweetUrl(o.tweetId),"_blank");},children:[jsxRuntime.jsx($,{user:o.user,renderTimestamp:a?void 0:jsxRuntime.jsx("div",{className:"text-xs text-primary",children:utils.formatAge(p)}),renderActions:t}),n,o.content.text&&jsxRuntime.jsx(X,{content:o.content.text,isExpanded:s,onLoad:()=>m(false)}),o.content.text&&jsxRuntime.jsx(q,{data:e,embed:a,text:o.content.text,renderActions:jsxRuntime.jsx(K,{isExpanded:s,onToggleExpand:m})}),jsxRuntime.jsx("div",{className:ui.cn((!o.content.medias||o.content.medias.length===0)&&"hidden"),children:o.content.medias&&o.content.medias.length>0&&jsxRuntime.jsx(W,{medias:o.content.medias,tweetHref:utils.twitterTweetUrl(o.tweetId)})}),i,r]})}function te({data:e,headerActions:t,footerActions:r}){return jsxRuntime.jsx(u,{data:e,headerActions:t,footerActions:r})}function re({data:e,headerActions:t,footerActions:r}){let n=!!e.sourceTweet;return jsxRuntime.jsx(u,{data:e,headerActions:t,footerActions:r,children:n?jsxRuntime.jsx(u,{data:e,embed:true}):null})}function ne({data:e,headerActions:t,footerActions:r}){let a=e.sourceTweet,n=!!a,i=react.useMemo(()=>jsxRuntime.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[jsxRuntime.jsx("span",{children:"Replying to"}),n&&jsxRuntime.jsxs(ui.Link,{className:"text-sm",underline:"hover",target:"_blank",href:utils.twitterUserUrl(a.user.screenName??a.user.username),children:["@",a.user.screenName??a.user.username]})]}),[n,a]);return jsxRuntime.jsx(u,{data:e,indicator:i,headerActions:t,footerActions:r,children:n?jsxRuntime.jsx(u,{data:e,embed:true}):null})}function ie({data:e,headerActions:t,footerActions:r}){let a=e.sourceTweet,n=!!a,i=react.useMemo(()=>jsxRuntime.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[jsxRuntime.jsx("span",{children:"Retweeted by"}),n&&jsxRuntime.jsxs(ui.Link,{className:"text-sm",underline:"hover",target:"_blank",href:utils.twitterUserUrl(a.user.screenName??a.user.username),children:["@",a.user.screenName??a.user.username]})]}),[n,a]);return jsxRuntime.jsx(u,{data:e,indicator:i,headerActions:t,footerActions:r,children:n?jsxRuntime.jsx(u,{data:e,embed:true}):null})}function le({data:e,headerActions:t,footerActions:r,embed:a=false,children:n,loading:i=false}){if(i||!e)return jsxRuntime.jsx(ot,{embed:a});let s=e.tweet.type;return jsxRuntime.jsx("div",{className:"w-full",children:(()=>{let l={data:e,headerActions:t,footerActions:r,embed:a,children:n};switch(s){case "reply":return jsxRuntime.jsx(ne,{...l});case "retweet":return jsxRuntime.jsx(ie,{...l});case "quote":return jsxRuntime.jsx(re,{...l});default:return jsxRuntime.jsx(te,{...l})}})()})}function ot({embed:e=false}){return jsxRuntime.jsxs("div",{className:["flex flex-col gap-2",e?"bg-default-50 rounded-lg p-3 w-full mx-auto":"bg-default-100 rounded-lg p-3 w-full mx-auto"].join(" "),children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-3",children:[jsxRuntime.jsx(ui.Skeleton,{className:"w-10 h-10 rounded-full"}),jsxRuntime.jsxs("div",{className:"flex flex-col gap-1 flex-1",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-24"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-3 w-16"})]}),jsxRuntime.jsx(ui.Skeleton,{className:"h-3 w-12"})]}),jsxRuntime.jsxs("div",{className:"flex flex-col gap-2",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-full"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-3/4"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-1/2"})]}),jsxRuntime.jsx(ui.Skeleton,{className:"h-48 w-full rounded-lg"}),jsxRuntime.jsxs("div",{className:"flex justify-between items-center pt-2",children:[jsxRuntime.jsxs("div",{className:"flex gap-4",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-6 w-16"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-6 w-16"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-6 w-16"})]}),jsxRuntime.jsx(ui.Skeleton,{className:"h-6 w-20"})]})]})}function ce({token:e}){let t=new utils.SafeBigNumber(e.priceChange??"0").isPositive()?"primary":"danger";return jsxRuntime.jsxs(ui.Button,{color:t,variant:"flat",size:"sm",radius:"full",startContent:jsxRuntime.jsx(dt,{token:e}),children:[jsxRuntime.jsx("span",{children:e.symbol}),jsxRuntime.jsx("span",{children:e.priceChange?utils.formatPercent(Number(e.priceChange)/100):"--"})]})}function dt({token:e}){let t=react.useMemo(()=>jsxRuntime.jsx(ui.Image,{className:"w-full h-full",src:e.image,alt:e.chain}),[e.chain]);return jsxRuntime.jsx(ui.Badge,{className:"w-2.5 h-2.5 p-0 border",size:"sm",content:t,shape:"circle",placement:"bottom-right",children:jsxRuntime.jsx(ui.Avatar,{className:"w-5 h-5",radius:"full",src:e.image})})}function de({data:e,loading:t,setIsPaused:r,customHeaderActions:a,customFooterActions:n}){let i=react.useCallback(s=>jsxRuntime.jsxs("div",{className:"flex gap-2.5 justify-between",children:[s.token&&jsxRuntime.jsx(ce,{token:s.token}),n?.(s)]}),[n]);return jsxRuntime.jsx("div",{className:"flex flex-col gap-2.5",onMouseEnter:()=>r(true),onMouseLeave:()=>r(false),children:e.map(s=>jsxRuntime.jsx(le,{data:s,headerActions:a?.(s),footerActions:i(s),loading:t},s.id))})}function ut(){return jsxRuntime.jsxs("div",{className:"flex flex-col gap-2 bg-default-100 rounded-lg p-3 w-full mx-auto",children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-3",children:[jsxRuntime.jsx(ui.Skeleton,{className:"w-10 h-10 rounded-full"}),jsxRuntime.jsxs("div",{className:"flex flex-col gap-1 flex-1",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-40 rounded-md"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-3 w-32 rounded-md"})]})]}),jsxRuntime.jsxs("div",{className:"flex flex-col gap-2",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-full rounded-md"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-3/4 rounded-md"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-1/2 rounded-md"})]}),jsxRuntime.jsx(ui.Skeleton,{className:"h-48 w-full rounded-lg"})]})}function me({count:e=3}){return jsxRuntime.jsx("div",{className:"flex flex-col gap-2",children:Array.from({length:e}).map((t,r)=>jsxRuntime.jsx(ut,{},r))})}var pe=()=>{let[e,t]=react.useState([]),[r,a]=react.useState(true),[n,i]=react.useState(false),s=h(),m=react.useCallback(l=>{t(o=>{let p=o.findIndex(x=>x.id===l.id),d;if(p>=0)d=o.map((x,A)=>A===p?l:x);else {if(n)return o;d=[l,...o];}return d.slice(0,30)}),a(false);},[n]);return react.useEffect(()=>{let l=s.subscribeTweetMedia({callback:m}),o=s.subscribeTweetMediaToken({callback:m});return ()=>{l.unsubscribe(),o.unsubscribe();}},[s,m]),{medias:e,loading:r,isPaused:n,setIsPaused:i}};function aa({onPauseChange:e,customHeaderActions:t,customFooterActions:r}){let{medias:a,loading:n,isPaused:i,setIsPaused:s}=pe();return react.useEffect(()=>{e?.(i);},[i,e]),n?jsxRuntime.jsx(me,{count:3}):jsxRuntime.jsx(de,{data:a,loading:n,setIsPaused:s,customHeaderActions:t,customFooterActions:r})}function wa({client:e,children:t}){return jsxRuntime.jsx(b.Provider,{value:{client:e},children:t})}
2
2
  exports.MediaImage=O;exports.MediaTrackContext=b;exports.MediaTrackProvider=wa;exports.MediaVideo=H;exports.Medias=W;exports.TextExpand=K;exports.Translate=q;exports.TweetItem=le;exports.TweetOriginal=te;exports.TweetQuote=re;exports.TweetReply=ne;exports.TweetRetweet=ie;exports.TweetSkeleton=ut;exports.TweetSkeletonList=me;exports.TweetSource=u;exports.Tweets=de;exports.TweetsWidget=aa;exports.UserAvatar=D;exports.UserInfo=$;exports.translateTweetMedia=Ae;exports.useGenerateTweetMediaMemeMutation=no;exports.useMediaTrackClient=h;exports.useMediaTrackContext=Q;exports.useTranslateTweetMediaMutation=Z;exports.useTweets=pe;exports.version=xe;//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/components/tweets/tweet/media/media-image.tsx","../src/components/tweets/tweet/media/media-video.tsx","../src/components/tweets/tweet/media/medias.tsx","../src/components/tweets/tweet/user/user-avatar.tsx","../src/components/tweets/tweet/user/user-info.tsx","../src/context/MediaTrackContext.ts","../src/hooks/useMediaTrackContext.ts","../src/hooks/useMediaTrackClient.ts","../src/hooks/useGenerateTweetMediaMemeMutation.ts","../src/hooks/useTranslateTweetMediaQuery.ts","../src/utils/parseText.tsx","../src/components/tweets/tweet/tools/translate.tsx","../src/components/tweets/tweet/tools/text-expand.tsx","../src/components/tweets/tweet/content/index.tsx","../src/components/tweets/tweet/tweet-source.tsx","../src/components/tweets/tweet/tweet-original.tsx","../src/components/tweets/tweet/tweet-quote.tsx","../src/components/tweets/tweet/tweet-reply.tsx","../src/components/tweets/tweet/tweet-retweet.tsx","../src/components/tweets/tweet/tweet-item.tsx","../src/components/tweets/tweet/tools/tweet-token-button.tsx","../src/components/tweets/tweets.ui.tsx","../src/components/tweets/tweet/tweet-skeleton.tsx","../src/components/tweets/tweets.script.ts","../src/components/tweets/tweets.widget.tsx","../src/providers/MediaTrackProvider.tsx"],"names":["version_default","MediaImage","src","isLoaded","setTrue","useBoolean","jsx","Skeleton","MediaVideo","Medias","medias","tweetHref","images","media","videos","renderVideos","video","renderImages","image","Link","jsxs","UserAvatar","url","name","size","fallbackName","useMemo","Avatar","UserInfo","user","renderTimestamp","renderActions","twitterUserUrl","MediaTrackContext","createContext","useMediaTrackContext","context","useContext","useMediaTrackClient","client","useGenerateTweetMediaMemeMutation","options","useMutation","params","translateTweetMedia","targetLanguage","useTranslateTweetMediaMutation","parseText","text","urlRegex","hashtagRegex","symbolRegex","matches","match","matchIndex","m","a","b","parts","lastIndex","key","item","e","hashtagUrl","Translate","data","embed","isTranslate","toggle","t","i18n","useTranslation","isTranslating","translatedText","setTranslatedText","useState","handleTranslate","useCallback","parsedText","Fragment","TranslateIcon","cn","TextExpand","isExpanded","onToggleExpand","renderExpand","ChevronUpIcon","ChevronDownIcon","Content","content","onLoad","ref","useRef","parsedContent","useEffect","current","TweetSource","headerActions","footerActions","indicator","children","setIsExpanded","containerClass","tweet","age","useTickAge","twitterTweetUrl","formatAge","TweetOriginal","TweetQuote","hasSource","TweetReply","sourceTweet","TweetRetweet","TweetItem","loading","TweetSkeleton","tweetType","commonProps","TweetTokenButton","token","color","SafeBigNumber","Button","TweetTokenIcon","formatPercent","ChainIcon","Image","Badge","Tweets","setIsPaused","customHeaderActions","customFooterActions","TweetSkeletonList","count","_","index","useTweets","setMedias","setLoading","isPaused","handleMedia","prevMedias","idx","it","newMedias","subTweet","subTweetToken","TweetsWidget","onPauseChange","MediaTrackProvider"],"mappings":"gQAOI,OAAO,MAAA,CAAW,GAAA,GACpB,MAAA,CAAO,mBAAA,CAAsB,OAAO,mBAAA,EAAuB,EAAC,CAC5D,MAAA,CAAO,oBAAoB,4BAA4B,CAAA,CAAI,SAAA,CAAA,CAG7D,IAAOA,GAAQ,UCJR,SAASC,EAAW,CAAE,GAAA,CAAAC,CAAI,CAAA,CAAU,CACzC,GAAM,CAACC,CAAAA,CAAU,CAAE,OAAA,CAAAC,CAAQ,CAAC,CAAA,CAAIC,iBAAW,KAAK,CAAA,CAChD,OAAKH,CAAAA,CAGHI,eAACC,WAAAA,CAAA,CAAS,QAAA,CAAUJ,CAAAA,CAAU,UAAU,eAAA,CACtC,QAAA,CAAAG,cAAAA,CAAC,KAAA,CAAA,CACC,IAAKJ,CAAAA,CACL,SAAA,CAAU,yCAAA,CACV,MAAA,CAAQ,IAAM,CACZE,CAAAA,GACF,CAAA,CACF,EACF,CAAA,CAXe,IAanB,CClBO,SAASI,CAAAA,CAAW,CAAE,GAAA,CAAAN,CAAI,CAAA,CAAU,CACzC,OAAKA,CAAAA,CAGHI,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDACb,QAAA,CAAAA,cAAAA,CAAC,QAAA,CAAA,CACC,SAAA,CAAU,6BACV,GAAA,CAAKJ,CAAAA,CACL,eAAA,CAAe,IAAA,CACjB,EACF,CAAA,CATe,IAWnB,CCPO,SAASO,CAAAA,CAAO,CAAE,MAAA,CAAAC,CAAAA,CAAQ,SAAA,CAAAC,CAAU,CAAA,CAAU,CACnD,IAAMC,CAAAA,CAASF,EAAO,MAAA,CAAQG,CAAAA,EAAUA,CAAAA,CAAM,IAAA,GAAS,OAAO,CAAA,CACxDC,CAAAA,CAASJ,CAAAA,CAAO,MAAA,CAAQG,GAAUA,CAAAA,CAAM,IAAA,GAAS,OAAO,CAAA,CAExDE,EAAe,IACdD,CAAAA,CAAO,MAAA,CAEVR,cAAAA,CAAC,OAAI,SAAA,CAAW,uDAAA,CACb,QAAA,CAAAQ,CAAAA,CAAO,IAAKE,CAAAA,EACXV,cAAAA,CAACE,CAAAA,CAAA,CAA2B,IAAKQ,CAAAA,CAAM,GAAA,CAAA,CAAtBA,CAAAA,CAAM,GAAqB,CAC7C,CAAA,CACH,CAAA,CANyB,IAAA,CAUvBC,EAAe,IACdL,CAAAA,CAAO,MAAA,CAEVN,cAAAA,CAAC,OAAI,SAAA,CAAW,uDAAA,CACb,QAAA,CAAAM,CAAAA,CAAO,IAAKM,CAAAA,EACXZ,cAAAA,CAACa,OAAAA,CAAA,CAAqB,IAAA,CAAMR,CAAAA,CAAW,MAAA,CAAO,QAAA,CAC5C,SAAAL,cAAAA,CAACL,CAAAA,CAAA,CAAW,GAAA,CAAKiB,EAAM,GAAA,CAAK,CAAA,CAAA,CADnBA,CAAAA,CAAM,GAEjB,CACD,CAAA,CACH,CAAA,CARyB,IAAA,CAY7B,OACEE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACZ,UAAAL,CAAAA,EAAa,CACbE,CAAAA,EAAa,CAAA,CAChB,CAEJ,CCnCO,SAASI,CAAAA,CAAW,CAAE,GAAA,CAAAC,CAAAA,CAAK,IAAA,CAAAC,CAAAA,CAAO,EAAA,CAAI,IAAA,CAAAC,CAAAA,CAAO,EAAG,EAAU,CAC/D,IAAMC,CAAAA,CAAeC,aAAAA,CAAQ,IAAOH,CAAAA,CAAOA,CAAAA,CAAK,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CAAI,KAAA,CAAQ,CAACA,CAAI,CAAC,CAAA,CAE5E,OACEjB,cAAAA,CAACC,WAAAA,CAAA,CACC,SAAA,CAAU,iCAAA,CACV,KAAA,CAAO,CAAE,MAAOiB,CAAAA,CAAM,MAAA,CAAQA,CAAK,CAAA,CACnC,SAAU,CAAC,CAACF,CAAAA,CAEZ,QAAA,CAAAhB,cAAAA,CAACqB,SAAAA,CAAA,CACC,IAAA,CAAK,KACL,KAAA,CAAM,SAAA,CACN,MAAA,CAAO,MAAA,CACP,aAAY,IAAA,CACZ,IAAA,CAAMF,CAAAA,CACN,GAAA,CAAKH,EACL,KAAA,CAAO,CAAE,KAAA,CAAOE,CAAAA,CAAM,OAAQA,CAAK,CAAA,CACrC,CAAA,CACF,CAEJ,CChBO,SAASI,CAAAA,CAAS,CAAE,IAAA,CAAAC,EAAM,eAAA,CAAAC,CAAAA,CAAiB,aAAA,CAAAC,CAAc,CAAA,CAAU,CACxE,OACEX,eAAAA,CAAC,OAAI,SAAA,CAAU,yCAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAd,cAAAA,CAACe,EAAA,CAAW,GAAA,CAAKQ,CAAAA,CAAK,MAAA,CAAQ,IAAA,CAAMA,CAAAA,CAAK,QAAA,CAAU,CAAA,CACnDT,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAA,CAAAA,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCAAA,CACb,QAAA,CAAA,CAAAd,eAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qDAAA,CACb,QAAA,CAAAuB,CAAAA,CAAK,QAAA,CACR,CAAA,CACCC,CAAAA,CAAAA,CACH,EACAV,eAAAA,CAACD,OAAAA,CAAA,CACC,MAAA,CAAO,SACP,SAAA,CAAU,OAAA,CACV,SAAA,CAAU,uCAAA,CACV,KAAMa,oBAAAA,CAAeH,CAAAA,CAAK,UAAA,EAAcA,CAAAA,CAAK,QAAQ,CAAA,CACtD,QAAA,CAAA,CAAA,GAAA,CACGA,CAAAA,CAAK,UAAA,EAAcA,EAAK,QAAA,CAAA,CAC5B,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACCE,GACH,CAEJ,CC/BO,IAAME,CAAAA,CAAoBC,oBAC/B,EACF,ECNO,SAASC,GAAuB,CACrC,IAAMC,CAAAA,CAAUC,gBAAAA,CAAWJ,CAAiB,CAAA,CAC5C,GAAI,CAACG,EACH,MAAM,IAAI,KAAA,CACR,+DACF,EAEF,OAAOA,CACT,CCTO,SAASE,GAAsB,CACpC,GAAM,CAAE,MAAA,CAAAC,CAAO,CAAA,CAAIJ,CAAAA,EAAqB,CACxC,OAAOI,CACT,CCDO,SAASC,EAAAA,CACdC,CAAAA,CAGI,EAAC,CACL,CACA,IAAMF,CAAAA,CAASD,GAAoB,CACnC,OAAOI,sBAAAA,CAAY,CACjB,UAAA,CAAY,MAAOC,CAAAA,EAAuBJ,CAAAA,CAAO,aAAaI,CAAM,CAAA,CACpE,GAAGF,CACL,CAAC,CACH,CCDA,eAAsBG,EAAAA,CACpBL,CAAAA,CACA,CAAE,KAAA,CAAA1B,CAAAA,CAAO,cAAA,CAAAgC,EAAgB,OAAA,CAAAJ,CAAQ,CAAA,CACjC,CACA,OAAO,MAAMF,CAAAA,CAAO,SAAA,CAAU1B,CAAAA,CAAOgC,EAAgBJ,CAAO,CAC9D,CAEO,SAASK,CAAAA,CACdL,CAAAA,CAGI,EAAC,CACL,CACA,IAAMF,CAAAA,CAASD,CAAAA,EAAoB,CACnC,OAAOI,sBAAAA,CAAY,CACjB,UAAA,CAAY,MAAOC,GACjBC,EAAAA,CAAoBL,CAAAA,CAAQI,CAAM,CAAA,CACpC,GAAGF,CACL,CAAC,CACH,CC1BO,SAASM,CAAAA,CAAUC,EAA+C,CACvE,IAAMC,CAAAA,CAAW,mCAAA,CACXC,EAAe,SAAA,CACfC,CAAAA,CAAc,0BAAA,CAEdC,CAAAA,CAAuB,EAAC,CAC1BC,CAAAA,CAEJ,KAAA,CAAQA,EAAQJ,CAAAA,CAAS,IAAA,CAAKD,CAAI,CAAA,IAAO,MACvCI,CAAAA,CAAQ,IAAA,CAAK,CACX,KAAA,CAAOC,EAAM,KAAA,CACb,MAAA,CAAQA,CAAAA,CAAM,CAAC,EAAE,MAAA,CACjB,IAAA,CAAMA,CAAAA,CAAM,CAAC,EACb,IAAA,CAAM,KACR,CAAC,CAAA,CAGH,MAAQA,CAAAA,CAAQH,CAAAA,CAAa,IAAA,CAAKF,CAAI,KAAO,IAAA,EAAM,CACjD,IAAMM,CAAAA,CAAaD,CAAAA,CAAM,KAAA,CACRD,CAAAA,CAAQ,IAAA,CACtBG,GAAMD,CAAAA,EAAcC,CAAAA,CAAE,KAAA,EAASD,CAAAA,CAAaC,EAAE,KAAA,CAAQA,CAAAA,CAAE,MAC3D,CAAA,EAEEH,EAAQ,IAAA,CAAK,CACX,KAAA,CAAOE,CAAAA,CACP,OAAQD,CAAAA,CAAM,CAAC,CAAA,CAAE,MAAA,CACjB,KAAMA,CAAAA,CAAM,CAAC,CAAA,CACb,IAAA,CAAM,SACR,CAAC,EAEL,CAEA,KAAA,CAAQA,EAAQF,CAAAA,CAAY,IAAA,CAAKH,CAAI,CAAA,IAAO,IAAA,EAAM,CAChD,IAAMM,CAAAA,CAAaD,EAAM,KAAA,CACRD,CAAAA,CAAQ,IAAA,CACtBG,CAAAA,EAAMD,GAAcC,CAAAA,CAAE,KAAA,EAASD,CAAAA,CAAaC,CAAAA,CAAE,MAAQA,CAAAA,CAAE,MAC3D,CAAA,EAEEH,CAAAA,CAAQ,IAAA,CAAK,CACX,KAAA,CAAOE,CAAAA,CACP,OAAQD,CAAAA,CAAM,CAAC,CAAA,CAAE,MAAA,CACjB,KAAMA,CAAAA,CAAM,CAAC,CAAA,CACb,IAAA,CAAM,QACR,CAAC,EAEL,CAEAD,CAAAA,CAAQ,IAAA,CAAK,CAACI,CAAAA,CAAGC,CAAAA,GAAMD,EAAE,KAAA,CAAQC,CAAAA,CAAE,KAAK,CAAA,CAExC,IAAMC,CAAAA,CAAyC,EAAC,CAC5CC,CAAAA,CAAY,EACZC,CAAAA,CAAM,CAAA,CAEV,OAAAR,CAAAA,CAAQ,QAASS,CAAAA,EAAS,CAKxB,GAJIA,CAAAA,CAAK,MAAQF,CAAAA,EACfD,CAAAA,CAAM,IAAA,CAAKV,CAAAA,CAAK,MAAMW,CAAAA,CAAWE,CAAAA,CAAK,KAAK,CAAC,EAG1CA,CAAAA,CAAK,IAAA,GAAS,KAAA,CAAO,CACvB,IAAMvC,CAAAA,CAAMuC,CAAAA,CAAK,IAAA,CAAK,WAAW,MAAM,CAAA,CACnCA,CAAAA,CAAK,IAAA,CACL,WAAWA,CAAAA,CAAK,IAAI,CAAA,CAAA,CACxBH,CAAAA,CAAM,KACJpD,cAAAA,CAAC,GAAA,CAAA,CAEC,IAAA,CAAMgB,CAAAA,CACN,OAAO,QAAA,CACP,GAAA,CAAI,qBAAA,CACJ,SAAA,CAAU,+BACV,OAAA,CAAUwC,CAAAA,EAAMA,CAAAA,CAAE,eAAA,GAEjB,QAAA,CAAAD,CAAAA,CAAK,IAAA,CAAA,CAPDD,CAAAA,EAQP,CACF,EACF,CAAA,KAAA,GAAWC,CAAAA,CAAK,IAAA,GAAS,SAAA,CAAW,CAElC,IAAME,CAAAA,CAAa,yBADHF,CAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CACkB,CAAA,CAAA,CACnDH,CAAAA,CAAM,IAAA,CACJpD,cAAAA,CAAC,KAEC,IAAA,CAAMyD,CAAAA,CACN,MAAA,CAAO,QAAA,CACP,IAAI,qBAAA,CACJ,SAAA,CAAU,8BAAA,CACV,OAAA,CAAUD,GAAMA,CAAAA,CAAE,eAAA,EAAgB,CAEjC,QAAA,CAAAD,EAAK,IAAA,CAAA,CAPDD,CAAAA,EAQP,CACF,EACF,MAAWC,CAAAA,CAAK,IAAA,GAAS,QAAA,EACvBH,CAAAA,CAAM,IAAA,CACJpD,cAAAA,CAAC,MAAA,CAAA,CAAiB,SAAA,CAAU,eACzB,QAAA,CAAAuD,CAAAA,CAAK,IAAA,CAAA,CADGD,CAAAA,EAEX,CACF,CAAA,CAGFD,CAAAA,CAAYE,CAAAA,CAAK,KAAA,CAAQA,EAAK,OAChC,CAAC,CAAA,CAEGF,CAAAA,CAAYX,CAAAA,CAAK,MAAA,EACnBU,CAAAA,CAAM,IAAA,CAAKV,EAAK,KAAA,CAAMW,CAAS,CAAC,CAAA,CAG3BD,EAAM,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAQ,CAACV,CAAI,CACzC,CChGO,SAASgB,CAAAA,CAAU,CAAE,IAAA,CAAAC,EAAM,KAAA,CAAAC,CAAAA,CAAO,aAAA,CAAAnC,CAAc,EAAU,CAC/D,GAAM,CAACoC,CAAAA,CAAa,CAAE,MAAA,CAAAC,CAAO,CAAC,CAAA,CAAI/D,iBAAW,KAAK,CAAA,CAE5C,CAAE,CAAA,CAAAgE,EAAG,IAAA,CAAAC,CAAK,CAAA,CAAIC,mBAAAA,GAEd,CAAE,WAAA,CAAa3B,CAAAA,CAAqB,SAAA,CAAW4B,CAAc,CAAA,CACjE1B,CAAAA,EAA+B,CAE3B,CAAC2B,CAAAA,CAAgBC,CAAiB,CAAA,CAAIC,cAAAA,CAE1C,IAAI,CAAA,CAEAC,CAAAA,CAAkBC,iBAAAA,CACtB,MAAOf,GAAkC,CAGvC,GAFAA,CAAAA,CAAE,eAAA,GACFM,CAAAA,EAAO,CACH,CAACK,CAAAA,CAAgB,CACnB,IAAMzB,CAAAA,CAAO,MAAMJ,CAAAA,CAAoB,CACrC,KAAA,CAAOqB,CAAAA,CACP,cAAA,CAAgBK,CAAAA,CAAK,SACrB,OAAA,CAAS,CACP,WAAA,CAAaJ,CACf,CACF,CAAC,CAAA,CACKY,EAAAA,CAAa/B,EAAUC,CAAI,CAAA,CACjC0B,CAAAA,CAAkBI,EAAU,EAC9B,CACF,CAAA,CACA,CAACV,CAAAA,CAAQxB,EAAqBqB,CAAAA,CAAMK,CAAAA,CAAK,QAAA,CAAUG,CAAc,CACnE,CAAA,CAEA,OACErD,eAAAA,CAAA2D,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAA3D,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAASwD,EACT,SAAA,CAAU,6EAAA,CAEV,QAAA,CAAA,CAAAtE,cAAAA,CAAC0E,gBAAAA,CAAA,CAAc,KAAA,CAAM,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,CAElCX,CAAAA,CADHF,CAAAA,CACK,mCACA,kCADkC,CAAA,CAAA,CAE1C,CAAA,CACCpC,CAAAA,CAAAA,CACH,EACAzB,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW2E,KAAAA,CAAG,CAACd,CAAAA,EAAe,QAAQ,CAAA,CACtC,QAAUL,CAAAA,EAAM,CACdA,CAAAA,CAAE,eAAA,GACJ,CAAA,CAEC,QAAA,CAAAK,CAAAA,EACC/C,eAAAA,CAAC,OAAI,SAAA,CAAU,+DAAA,CACZ,QAAA,CAAA,CAAAqD,CAAAA,CACAD,CAAAA,EAAiBlE,cAAAA,CAACC,WAAAA,CAAA,CAAS,UAAU,uBAAA,CAAwB,CAAA,CAAA,CAChE,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CCpEO,SAAS2E,EAAW,CAAE,UAAA,CAAAC,CAAAA,CAAY,cAAA,CAAAC,CAAe,CAAA,CAAU,CAChE,GAAM,CAAE,CAAA,CAAAf,CAAE,CAAA,CAAIE,mBAAAA,GACRc,CAAAA,CAAe,IACfF,CAAAA,CAEA/D,eAAAA,CAAA2D,oBAAA,CACE,QAAA,CAAA,CAAAzE,cAAAA,CAACgF,gBAAAA,CAAA,CACC,SAAA,CAAU,uBAAA,CACV,KAAA,CAAM,IAAA,CACN,OAAO,IAAA,CACT,CAAA,CAAE,MAAA,CACKjB,CAAAA,CAAE,4BAA4B,CAAA,CAAA,CACvC,CAAA,CAKFjD,eAAAA,CAAA2D,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAzE,cAAAA,CAACiF,kBAAAA,CAAA,CACC,UAAU,uBAAA,CACV,KAAA,CAAM,IAAA,CACN,MAAA,CAAO,IAAA,CACT,CAAA,CAAE,MAAA,CACKlB,CAAAA,CAAE,0BAA0B,CAAA,CAAA,CACrC,CAAA,CAIJ,OAAIc,CAAAA,GAAe,OAAkB,IAAA,CAGnC/D,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BACb,QAAA,CAAA,CAAAd,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAyB,CAAA,CACxCA,cAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAUwD,GAAM,CACdA,CAAAA,CAAE,eAAA,EAAgB,CAClBsB,IAAiB,CAACD,CAAU,EAC9B,CAAA,CACA,UAAU,kEAAA,CAET,QAAA,CAAAE,CAAAA,EAAa,CAChB,CAAA,CAAA,CACF,CAEJ,CC1CO,SAASG,CAAAA,CAAQ,CAAE,OAAA,CAAAC,CAAAA,CAAS,WAAAN,CAAAA,CAAa,KAAA,CAAO,MAAA,CAAAO,CAAO,EAAU,CACtE,IAAMC,CAAAA,CAAMC,YAAAA,CAAuB,IAAI,CAAA,CAEjCC,CAAAA,CAAgBnE,aAAAA,CAAQ,IAAMqB,EAAU0C,CAAO,CAAA,CAAG,CAACA,CAAO,CAAC,CAAA,CAEjE,OAAAK,eAAAA,CAAU,IAAM,CACd,IAAMC,CAAAA,CAAUJ,CAAAA,CAAI,OAAA,CAChB,CAACD,CAAAA,EAAU,CAACK,CAAAA,EACZA,CAAAA,CAAQ,YAAA,CAAeA,CAAAA,CAAQ,YAAA,EACjCL,CAAAA,KAEJ,CAAA,CAAG,CAACP,CAAU,CAAC,EAGb7E,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKqF,CAAAA,CACL,UAAW,CACT,oCAAA,CACCR,CAAAA,CAA8B,EAAA,CAAjB,cAChB,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CACV,QAAUrB,CAAAA,EAAM,CACdA,CAAAA,CAAE,eAAA,GACJ,CAAA,CAEC,QAAA,CAAA+B,CAAAA,CACH,CAEJ,CCjBO,SAASG,CAAAA,CAAY,CAC1B,IAAA,CAAA/B,CAAAA,CACA,aAAA,CAAAgC,CAAAA,CACA,cAAAC,CAAAA,CACA,KAAA,CAAAhC,CAAAA,CAAQ,KAAA,CACR,UAAAiC,CAAAA,CACA,QAAA,CAAAC,CACF,CAAA,CAAU,CACR,GAAM,CAACjB,CAAAA,CAAYkB,CAAa,EAAI1B,cAAAA,CAA8B,MAAS,CAAA,CAErE2B,CAAAA,CAAiB5E,cAAQ,IACtBwC,CAAAA,CACH,6CAAA,CACA,mEAAA,CACH,CAACA,CAAK,CAAC,CAAA,CAEJqC,CAAAA,CAAQ7E,aAAAA,CACZ,IAAOwC,CAAAA,CAAQD,CAAAA,CAAK,YAAeA,CAAAA,CAAK,KAAA,CACxC,CAACA,CAAAA,CAAMC,CAAK,CACd,CAAA,CAEMsC,CAAAA,CAAMC,gBAAAA,CAAYF,EAAgB,SAAS,CAAA,CAEjD,OACEnF,eAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW6D,KAAAA,CAAG,sCAAA,CAAwCqB,CAAc,CAAA,CACpE,OAAA,CAAS,IAAM,CACb,OAAO,IAAA,CAAKI,qBAAAA,CAAgBH,CAAAA,CAAM,OAAO,EAAG,QAAQ,EACtD,CAAA,CAGA,QAAA,CAAA,CAAAjG,cAAAA,CAACsB,CAAAA,CAAA,CACC,IAAA,CAAM2E,EAAM,IAAA,CACZ,eAAA,CACErC,CAAAA,CAAQ,MAAA,CACN5D,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CAAwB,QAAA,CAAAqG,gBAAUH,CAAG,CAAA,CAAE,CAAA,CAG1D,aAAA,CAAeP,EACjB,CAAA,CAGCE,CAAAA,CAGAI,CAAAA,CAAM,OAAA,CAAQ,MACbjG,cAAAA,CAACkF,CAAAA,CAAA,CACC,OAAA,CAASe,EAAM,OAAA,CAAQ,IAAA,CACvB,UAAA,CAAYpB,CAAAA,CACZ,OAAQ,IAAMkB,CAAAA,CAAc,KAAK,CAAA,CACnC,CAAA,CAIDE,CAAAA,CAAM,OAAA,CAAQ,IAAA,EACbjG,eAAC0D,CAAAA,CAAA,CACC,IAAA,CAAMC,CAAAA,CACN,MAAOC,CAAAA,CACP,IAAA,CAAMqC,CAAAA,CAAM,OAAA,CAAQ,KACpB,aAAA,CACEjG,cAAAA,CAAC4E,CAAAA,CAAA,CACC,WAAYC,CAAAA,CACZ,cAAA,CAAgBkB,CAAAA,CAClB,CAAA,CAEJ,EAIF/F,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW2E,KAAAA,CAAAA,CACR,CAACsB,CAAAA,CAAM,OAAA,CAAQ,MAAA,EAAUA,CAAAA,CAAM,QAAQ,MAAA,CAAO,MAAA,GAAW,CAAA,GACxD,QACJ,CAAA,CAEC,QAAA,CAAAA,CAAAA,CAAM,OAAA,CAAQ,QAAUA,CAAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAS,GACrDjG,cAAAA,CAACG,CAAAA,CAAA,CACC,MAAA,CAAQ8F,EAAM,OAAA,CAAQ,MAAA,CACtB,SAAA,CAAWG,qBAAAA,CAAgBH,EAAM,OAAO,CAAA,CAC1C,CAAA,CAEJ,CAAA,CAGCH,EAGAF,CAAAA,CAAAA,CACH,CAEJ,CCnGO,SAASU,EAAAA,CAAc,CAAE,KAAA3C,CAAAA,CAAM,aAAA,CAAAgC,CAAAA,CAAe,aAAA,CAAAC,CAAc,CAAA,CAAU,CAC3E,OACE5F,eAAC0F,CAAAA,CAAA,CACC,IAAA,CAAM/B,CAAAA,CACN,cAAegC,CAAAA,CACf,aAAA,CAAeC,CAAAA,CACjB,CAEJ,CCRO,SAASW,EAAAA,CAAW,CAAE,IAAA,CAAA5C,CAAAA,CAAM,cAAAgC,CAAAA,CAAe,aAAA,CAAAC,CAAc,CAAA,CAAU,CAExE,IAAMY,CAAAA,CAAY,CAAC,CADC7C,EAAK,WAAA,CAGzB,OACE3D,cAAAA,CAAC0F,CAAAA,CAAA,CACC,IAAA,CAAM/B,CAAAA,CACN,aAAA,CAAegC,EACf,aAAA,CAAeC,CAAAA,CAEd,QAAA,CAAAY,CAAAA,CAAYxG,eAAC0F,CAAAA,CAAA,CAAY,IAAA,CAAM/B,CAAAA,CAAM,MAAK,IAAA,CAAC,CAAA,CAAK,IAAA,CACnD,CAEJ,CCXO,SAAS8C,EAAAA,CAAW,CAAE,IAAA,CAAA9C,CAAAA,CAAM,aAAA,CAAAgC,EAAe,aAAA,CAAAC,CAAc,CAAA,CAAU,CACxE,IAAMc,CAAAA,CAAc/C,CAAAA,CAAK,WAAA,CACnB6C,CAAAA,CAAY,CAAC,CAACE,CAAAA,CAEdb,CAAAA,CAAYzE,aAAAA,CAChB,IACEN,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACb,UAAAd,cAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,aAAA,CAAW,CAAA,CAChBwG,GACC1F,eAAAA,CAACD,OAAAA,CAAA,CACC,SAAA,CAAU,UACV,SAAA,CAAU,OAAA,CACV,MAAA,CAAO,QAAA,CACP,IAAA,CAAMa,oBAAAA,CACJgF,CAAAA,CAAY,IAAA,CAAK,YAAcA,CAAAA,CAAY,IAAA,CAAK,QAClD,CAAA,CACD,cACGA,CAAAA,CAAY,IAAA,CAAK,UAAA,EAAcA,CAAAA,CAAY,KAAK,QAAA,CAAA,CACpD,CAAA,CAAA,CAEJ,CAAA,CAEF,CAACF,EAAWE,CAAW,CACzB,CAAA,CAEA,OACE1G,eAAC0F,CAAAA,CAAA,CACC,IAAA,CAAM/B,CAAAA,CACN,UAAWkC,CAAAA,CACX,aAAA,CAAeF,CAAAA,CACf,aAAA,CAAeC,EAEd,QAAA,CAAAY,CAAAA,CAAYxG,cAAAA,CAAC0F,CAAAA,CAAA,CAAY,IAAA,CAAM/B,CAAAA,CAAM,KAAA,CAAK,KAAC,CAAA,CAAK,IAAA,CACnD,CAEJ,CCnCO,SAASgD,EAAAA,CAAa,CAAE,IAAA,CAAAhD,CAAAA,CAAM,aAAA,CAAAgC,CAAAA,CAAe,cAAAC,CAAc,CAAA,CAAU,CAC1E,IAAMc,CAAAA,CAAc/C,CAAAA,CAAK,WAAA,CACnB6C,CAAAA,CAAY,CAAC,CAACE,CAAAA,CAEdb,CAAAA,CAAYzE,aAAAA,CAChB,IACEN,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACb,UAAAd,cAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,cAAA,CAAY,CAAA,CACjBwG,GACC1F,eAAAA,CAACD,OAAAA,CAAA,CACC,SAAA,CAAU,UACV,SAAA,CAAU,OAAA,CACV,MAAA,CAAO,QAAA,CACP,KAAMa,oBAAAA,CACJgF,CAAAA,CAAY,IAAA,CAAK,UAAA,EAAcA,EAAY,IAAA,CAAK,QAClD,CAAA,CACD,QAAA,CAAA,CAAA,GAAA,CACGA,CAAAA,CAAY,IAAA,CAAK,UAAA,EAAcA,CAAAA,CAAY,KAAK,QAAA,CAAA,CACpD,CAAA,CAAA,CAEJ,CAAA,CAEF,CAACF,EAAWE,CAAW,CACzB,CAAA,CAEA,OACE1G,eAAC0F,CAAAA,CAAA,CACC,IAAA,CAAM/B,CAAAA,CACN,UAAWkC,CAAAA,CACX,aAAA,CAAeF,CAAAA,CACf,aAAA,CAAeC,EAEd,QAAA,CAAAY,CAAAA,CAAYxG,cAAAA,CAAC0F,CAAAA,CAAA,CAAY,IAAA,CAAM/B,CAAAA,CAAM,KAAA,CAAK,IAAA,CAAC,EAAK,IAAA,CACnD,CAEJ,CC9BO,SAASiD,EAAAA,CAAU,CACxB,IAAA,CAAAjD,CAAAA,CACA,cAAAgC,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,KAAA,CAAAhC,EAAQ,KAAA,CACR,QAAA,CAAAkC,CAAAA,CACA,OAAA,CAAAe,EAAU,KACZ,CAAA,CAAU,CACR,GAAIA,GAAW,CAAClD,CAAAA,CACd,OAAO3D,cAAAA,CAAC8G,GAAA,CAAc,KAAA,CAAOlD,CAAAA,CAAO,CAAA,CAGtC,IAAMmD,CAAAA,CAAYpD,CAAAA,CAAK,KAAA,CAAM,IAAA,CAwB7B,OAAO3D,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAU,QAAA,CAAA,CArBH,IAAM,CACjC,IAAMgH,EAAc,CAClB,IAAA,CAAArD,CAAAA,CACA,aAAA,CAAAgC,EACA,aAAA,CAAAC,CAAAA,CACA,KAAA,CAAAhC,CAAAA,CACA,SAAAkC,CACF,CAAA,CAEA,OAAQiB,CAAAA,EACN,KAAK,OAAA,CACH,OAAO/G,cAAAA,CAACyG,GAAA,CAAY,GAAGO,CAAAA,CAAa,CAAA,CACtC,KAAK,SAAA,CACH,OAAOhH,cAAAA,CAAC2G,EAAAA,CAAA,CAAc,GAAGK,CAAAA,CAAa,CAAA,CACxC,KAAK,OAAA,CACH,OAAOhH,cAAAA,CAACuG,EAAAA,CAAA,CAAY,GAAGS,CAAAA,CAAa,CAAA,CACtC,QACE,OAAOhH,cAAAA,CAACsG,EAAAA,CAAA,CAAe,GAAGU,EAAa,CAC3C,CACF,CAAA,GAEqD,CAAE,CACzD,CAGA,SAASF,EAAAA,CAAc,CAAE,MAAAlD,CAAAA,CAAQ,KAAM,CAAA,CAAwB,CAK7D,OACE9C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW,CAAC,qBAAA,CALI8C,CAAAA,CACnB,6CAAA,CACA,8CAGoD,EAAE,IAAA,CAAK,GAAG,CAAA,CAE9D,QAAA,CAAA,CAAA9C,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAd,eAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,wBAAA,CAAyB,EAC7Ca,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CACb,UAAAd,cAAAA,CAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,WAAW,CAAA,CAC/BD,cAAAA,CAACC,WAAAA,CAAA,CAAS,UAAU,UAAA,CAAW,CAAA,CAAA,CACjC,CAAA,CACAD,cAAAA,CAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,UAAA,CAAW,GACjC,CAAA,CAGAa,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBACb,QAAA,CAAA,CAAAd,cAAAA,CAACC,WAAAA,CAAA,CAAS,UAAU,YAAA,CAAa,CAAA,CACjCD,cAAAA,CAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,WAAA,CAAY,CAAA,CAChCD,cAAAA,CAACC,YAAA,CAAS,SAAA,CAAU,WAAA,CAAY,CAAA,CAAA,CAClC,EAGAD,cAAAA,CAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,yBAAyB,CAAA,CAG7Ca,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wCAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,YAAA,CACb,QAAA,CAAA,CAAAd,cAAAA,CAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,UAAA,CAAW,CAAA,CAC/BD,cAAAA,CAACC,YAAA,CAAS,SAAA,CAAU,UAAA,CAAW,CAAA,CAC/BD,cAAAA,CAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,WAAW,CAAA,CAAA,CACjC,CAAA,CACAD,cAAAA,CAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,UAAA,CAAW,CAAA,CAAA,CACjC,CAAA,CAAA,CACF,CAEJ,CCvFO,SAASgH,EAAAA,CAAiB,CAAE,KAAA,CAAAC,CAAM,CAAA,CAAU,CACjD,IAAMC,CAAAA,CAAQ,IAAIC,mBAAAA,CAAcF,CAAAA,CAAM,WAAA,EAAe,GAAG,CAAA,CAAE,UAAA,GACtD,SAAA,CACA,QAAA,CAEJ,OACEpG,eAAAA,CAACuG,UAAA,CACC,KAAA,CAAOF,CAAAA,CACP,OAAA,CAAQ,OACR,IAAA,CAAK,IAAA,CACL,MAAA,CAAO,MAAA,CACP,aAAcnH,cAAAA,CAACsH,EAAAA,CAAA,CAAe,KAAA,CAAOJ,EAAO,CAAA,CAE5C,QAAA,CAAA,CAAAlH,cAAAA,CAAC,MAAA,CAAA,CAAM,SAAAkH,CAAAA,CAAM,MAAA,CAAO,CAAA,CACpBlH,cAAAA,CAAC,QACE,QAAA,CAAAkH,CAAAA,CAAM,WAAA,CACHK,mBAAAA,CAAc,MAAA,CAAOL,CAAAA,CAAM,WAAW,CAAA,CAAI,GAAG,CAAA,CAC7C,IAAA,CACN,CAAA,CAAA,CACF,CAEJ,CAEO,SAASI,EAAAA,CAAe,CAAE,KAAA,CAAAJ,CAAM,CAAA,CAAU,CAC/C,IAAMM,CAAAA,CAAYpG,cAAQ,IAEtBpB,cAAAA,CAACyH,QAAAA,CAAA,CAAM,UAAU,eAAA,CAAgB,GAAA,CAAKP,CAAAA,CAAM,KAAA,CAAO,IAAKA,CAAAA,CAAM,KAAA,CAAO,CAAA,CAEtE,CAACA,EAAM,KAAK,CAAC,CAAA,CAEhB,OACElH,cAAAA,CAAC0H,QAAAA,CAAA,CACC,SAAA,CAAU,yBACV,IAAA,CAAK,IAAA,CACL,OAAA,CAASF,CAAAA,CACT,MAAM,QAAA,CACN,SAAA,CAAU,cAAA,CAEV,QAAA,CAAAxH,eAACqB,SAAAA,CAAA,CAAO,SAAA,CAAU,SAAA,CAAU,MAAA,CAAO,MAAA,CAAO,GAAA,CAAK6F,CAAAA,CAAM,MAAO,CAAA,CAC9D,CAEJ,CCnCO,SAASS,EAAAA,CAAO,CACrB,IAAA,CAAAhE,CAAAA,CACA,OAAA,CAAAkD,CAAAA,CACA,WAAA,CAAAe,CAAAA,CACA,oBAAAC,CAAAA,CACA,mBAAA,CAAAC,CACF,CAAA,CAAgB,CACd,IAAMlC,CAAAA,CAAgBrB,iBAAAA,CACnBhB,CAAAA,EACCzC,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8BAAA,CACZ,QAAA,CAAA,CAAAyC,EAAK,KAAA,EAASvD,cAAAA,CAACiH,EAAAA,CAAA,CAAiB,MAAO1D,CAAAA,CAAK,KAAA,CAAO,CAAA,CACnDuE,CAAAA,GAAsBvE,CAAI,CAAA,CAAA,CAE7B,CAAA,CAEF,CAACuE,CAAmB,CACtB,CAAA,CAEA,OACE9H,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,uBAAA,CACV,YAAA,CAAc,IAAM4H,EAAY,IAAI,CAAA,CACpC,YAAA,CAAc,IAAMA,EAAY,KAAK,CAAA,CAEpC,QAAA,CAAAjE,CAAAA,CAAK,IAAKJ,CAAAA,EACTvD,cAAAA,CAAC4G,EAAAA,CAAA,CAEC,KAAMrD,CAAAA,CACN,aAAA,CAAesE,CAAAA,GAAsBtE,CAAI,EACzC,aAAA,CAAeqC,CAAAA,CAAcrC,CAAI,CAAA,CACjC,QAASsD,CAAAA,CAAAA,CAJJtD,CAAAA,CAAK,EAKZ,CACD,EACH,CAEJ,CC/CO,SAASuD,EAAAA,EAAgB,CAC9B,OACEhG,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kEAAA,CAEb,UAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,UAAAd,cAAAA,CAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,yBAAyB,CAAA,CAC7Ca,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BACb,QAAA,CAAA,CAAAd,cAAAA,CAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,qBAAA,CAAsB,CAAA,CAC1CD,cAAAA,CAACC,YAAA,CAAS,SAAA,CAAU,qBAAA,CAAsB,CAAA,CAAA,CAC5C,GACF,CAAA,CAGAa,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBACb,QAAA,CAAA,CAAAd,cAAAA,CAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,uBAAA,CAAwB,CAAA,CAC5CD,cAAAA,CAACC,YAAA,CAAS,SAAA,CAAU,sBAAA,CAAuB,CAAA,CAC3CD,eAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,sBAAA,CAAuB,GAC7C,CAAA,CAGAD,cAAAA,CAACC,WAAAA,CAAA,CAAS,SAAA,CAAU,wBAAA,CAAyB,CAAA,CAAA,CAC/C,CAEJ,CAEO,SAAS8H,EAAAA,CAAkB,CAAE,KAAA,CAAAC,EAAQ,CAAE,CAAA,CAAsB,CAClE,OACEhI,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACZ,QAAA,CAAA,KAAA,CAAM,KAAK,CAAE,MAAA,CAAQgI,CAAM,CAAC,EAAE,GAAA,CAAI,CAACC,CAAAA,CAAGC,CAAAA,GACrClI,eAAC8G,EAAAA,CAAA,EAAA,CAAmBoB,CAAO,CAC5B,EACH,CAEJ,CChCO,IAAMC,EAAAA,CAAY,IAAM,CAC7B,GAAM,CAAC/H,CAAAA,CAAQgI,CAAS,EAAI/D,cAAAA,CAA4B,EAAE,CAAA,CACpD,CAACwC,CAAAA,CAASwB,CAAU,CAAA,CAAIhE,cAAAA,CAAS,IAAI,CAAA,CACrC,CAACiE,CAAAA,CAAUV,CAAW,EAAIvD,cAAAA,CAAS,KAAK,CAAA,CAExCpC,CAAAA,CAASD,GAAoB,CAE7BuG,CAAAA,CAAchE,iBAAAA,CACjBhE,CAAAA,EAAsB,CACrB6H,CAAAA,CAAWI,CAAAA,EAAe,CACxB,IAAMC,CAAAA,CAAMD,CAAAA,CAAW,SAAA,CAAWE,CAAAA,EAAOA,EAAG,EAAA,GAAOnI,CAAAA,CAAM,EAAE,CAAA,CACvDoI,EAEJ,GAAIF,CAAAA,EAAO,CAAA,CACTE,CAAAA,CAAYH,EAAW,GAAA,CAAI,CAACjF,CAAAA,CAAM2E,CAAAA,GAChCA,IAAUO,CAAAA,CAAMlI,CAAAA,CAAQgD,CAC1B,CAAA,CAAA,KACK,CACL,GAAI+E,CAAAA,CACF,OAAOE,CAAAA,CAETG,EAAY,CAACpI,CAAAA,CAAO,GAAGiI,CAAU,EACnC,CAEA,OAAOG,CAAAA,CAAU,MAAM,CAAA,CAAG,EAAE,CAC9B,CAAC,EACDN,CAAAA,CAAW,KAAK,EAClB,CAAA,CACA,CAACC,CAAQ,CACX,CAAA,CAEA,OAAA9C,gBAAU,IAAM,CACd,IAAMoD,CAAAA,CAAW3G,EAAO,mBAAA,CAAoB,CAAE,QAAA,CAAUsG,CAAY,CAAC,CAAA,CAC/DM,CAAAA,CAAgB5G,CAAAA,CAAO,wBAAA,CAAyB,CACpD,QAAA,CAAUsG,CACZ,CAAC,CAAA,CACD,OAAO,IAAM,CACXK,CAAAA,CAAS,aAAY,CACrBC,CAAAA,CAAc,WAAA,GAChB,CACF,CAAA,CAAG,CAAC5G,CAAAA,CAAQsG,CAAW,CAAC,CAAA,CAEjB,CAAE,MAAA,CAAAnI,CAAAA,CAAQ,QAAAyG,CAAAA,CAAS,QAAA,CAAAyB,CAAAA,CAAU,WAAA,CAAAV,CAAY,CAClD,EClCO,SAASkB,EAAAA,CAAa,CAC3B,aAAA,CAAAC,EACA,mBAAA,CAAAlB,CAAAA,CACA,mBAAA,CAAAC,CACF,CAAA,CAAsB,CACpB,GAAM,CAAE,OAAA1H,CAAAA,CAAQ,OAAA,CAAAyG,CAAAA,CAAS,QAAA,CAAAyB,EAAU,WAAA,CAAAV,CAAY,CAAA,CAAIO,EAAAA,GAMnD,OAJA3C,eAAAA,CAAU,IAAM,CACduD,IAAgBT,CAAQ,EAC1B,CAAA,CAAG,CAACA,EAAUS,CAAa,CAAC,CAAA,CAExBlC,CAAAA,CACK7G,eAAC+H,EAAAA,CAAA,CAAkB,KAAA,CAAO,CAAA,CAAG,EAIpC/H,cAAAA,CAAC2H,EAAAA,CAAA,CACC,IAAA,CAAMvH,CAAAA,CACN,OAAA,CAASyG,CAAAA,CACT,WAAA,CAAae,EACb,mBAAA,CAAqBC,CAAAA,CACrB,mBAAA,CAAqBC,CAAAA,CACvB,CAEJ,CC7BO,SAASkB,EAAAA,CAAmB,CACjC,MAAA,CAAA/G,CAAAA,CACA,SAAA6D,CACF,CAAA,CAA4B,CAC1B,OACE9F,eAAC2B,CAAAA,CAAkB,QAAA,CAAlB,CAA2B,KAAA,CAAO,CAAE,MAAA,CAAAM,CAAO,CAAA,CACzC,QAAA,CAAA6D,EACH,CAEJ","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-media-track\"] = \"0.1.146\";\n}\n\nexport default \"0.1.146\";\n","import { useBoolean } from \"@liberfi.io/hooks\";\nimport { Skeleton } from \"@liberfi.io/ui\";\n\ntype Props = {\n src: string;\n};\n\n// ------------------------------------------------------------\nexport function MediaImage({ src }: Props) {\n const [isLoaded, { setTrue }] = useBoolean(false);\n if (!src) return null;\n\n return (\n <Skeleton isLoaded={isLoaded} className=\"w-full h-auto\">\n <img\n src={src}\n className=\"w-full h-full object-cover aspect-video\"\n onLoad={() => {\n setTrue();\n }}\n />\n </Skeleton>\n );\n}\n","type Props = {\n src: string;\n};\n\n// ------------------------------------------------------------\nexport function MediaVideo({ src }: Props) {\n if (!src) return null;\n\n return (\n <div className=\"w-full h-full overflow-hidden rounded-md mt-2\">\n <iframe\n className=\"w-full h-full aspect-video\"\n src={src}\n allowFullScreen\n />\n </div>\n );\n}\n","import { Link } from \"@liberfi.io/ui\";\nimport { TweetContentMedia } from \"../../../../types\";\nimport { MediaImage } from \"./media-image\";\nimport { MediaVideo } from \"./media-video\";\n\ntype Props = {\n medias: Array<TweetContentMedia>;\n tweetHref: string;\n};\n\nexport function Medias({ medias, tweetHref }: Props) {\n const images = medias.filter((media) => media.type === \"image\");\n const videos = medias.filter((media) => media.type === \"video\");\n\n const renderVideos = () => {\n if (!videos.length) return null;\n return (\n <div className={`grid grid-cols-1 gap-[1px] overflow-hidden rounded-md`}>\n {videos.map((video) => (\n <MediaVideo key={video.url} src={video.url} />\n ))}\n </div>\n );\n };\n\n const renderImages = () => {\n if (!images.length) return null;\n return (\n <div className={`grid grid-cols-1 gap-[1px] overflow-hidden rounded-md`}>\n {images.map((image) => (\n <Link key={image.url} href={tweetHref} target=\"_blank\">\n <MediaImage src={image.url} />\n </Link>\n ))}\n </div>\n );\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {renderVideos()}\n {renderImages()}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { Avatar, Skeleton } from \"@liberfi.io/ui\";\n\ntype Props = {\n url?: string;\n name?: string;\n size?: number;\n};\n\nexport function UserAvatar({ url, name = \"\", size = 36 }: Props) {\n const fallbackName = useMemo(() => (name ? name.slice(0, 2) : \"N/A\"), [name]);\n\n return (\n <Skeleton\n className=\"flex rounded-full flex-shrink-0\"\n style={{ width: size, height: size }}\n isLoaded={!!url}\n >\n <Avatar\n size=\"md\"\n color=\"primary\"\n radius=\"full\"\n showFallback\n name={fallbackName}\n src={url}\n style={{ width: size, height: size }}\n />\n </Skeleton>\n );\n}\n","import React from \"react\";\nimport { Link } from \"@liberfi.io/ui\";\nimport { twitterUserUrl } from \"@liberfi.io/utils\";\nimport { TweetUser } from \"../../../../types\";\nimport { UserAvatar } from \"./user-avatar\";\n\ntype Props = {\n user: TweetUser;\n renderTimestamp?: React.ReactNode;\n renderActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function UserInfo({ user, renderTimestamp, renderActions }: Props) {\n return (\n <div className=\"flex items-center justify-between gap-1\">\n <div className=\"flex items-center gap-1\">\n <UserAvatar url={user.avatar} name={user.username} />\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"flex flex-row items-baseline gap-1\">\n <span className=\"text-foreground font-semibold truncate leading-none\">\n {user.username}\n </span>\n {renderTimestamp}\n </div>\n <Link\n target=\"_blank\"\n underline=\"hover\"\n className=\"text-default-500 text-sm leading-none\"\n href={twitterUserUrl(user.screenName ?? user.username)}\n >\n @{user.screenName ?? user.username}\n </Link>\n </div>\n </div>\n {renderActions}\n </div>\n );\n}\n","import { createContext } from \"react\";\nimport { IMediaTrackClient } from \"../types\";\n\nexport interface MediaTrackContextValue {\n client: IMediaTrackClient;\n}\n\nexport const MediaTrackContext = createContext<MediaTrackContextValue>(\n {} as MediaTrackContextValue,\n);\n","import { useContext } from \"react\";\nimport { MediaTrackContext } from \"../context\";\n\nexport function useMediaTrackContext() {\n const context = useContext(MediaTrackContext);\n if (!context) {\n throw new Error(\n \"useMediaTrackContext must be used within a MediaTrackProvider\",\n );\n }\n return context;\n}\n","import { useMediaTrackContext } from \"./useMediaTrackContext\";\n\nexport function useMediaTrackClient() {\n const { client } = useMediaTrackContext();\n return client;\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport { GeneratedMemeInfo, TweetMedia } from \"../types\";\nimport { useMediaTrackClient } from \"./useMediaTrackClient\";\n\nexport function useGenerateTweetMediaMemeMutation(\n options: Omit<\n UseMutationOptions<GeneratedMemeInfo, Error, TweetMedia, string[]>,\n \"mutationFn\"\n > = {},\n) {\n const client = useMediaTrackClient();\n return useMutation({\n mutationFn: async (params: TweetMedia) => client.generateMeme(params),\n ...options,\n });\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport { LocaleCode } from \"@liberfi.io/i18n\";\nimport { IMediaTrackClient, TweetMedia } from \"../types\";\nimport { useMediaTrackClient } from \"./useMediaTrackClient\";\n\nexport interface UseTranslateTweetMediaParams {\n media: TweetMedia;\n targetLanguage: LocaleCode;\n options?: {\n sourceLanguage?: LocaleCode;\n sourceTweet?: boolean;\n };\n}\n\nexport async function translateTweetMedia(\n client: IMediaTrackClient,\n { media, targetLanguage, options }: UseTranslateTweetMediaParams,\n) {\n return await client.translate(media, targetLanguage, options);\n}\n\nexport function useTranslateTweetMediaMutation(\n options: Omit<\n UseMutationOptions<string, Error, UseTranslateTweetMediaParams>,\n \"mutationFn\"\n > = {},\n) {\n const client = useMediaTrackClient();\n return useMutation({\n mutationFn: async (params: UseTranslateTweetMediaParams) =>\n translateTweetMedia(client, params),\n ...options,\n });\n}\n","interface MatchItem {\n index: number;\n length: number;\n text: string;\n type: \"url\" | \"hashtag\" | \"symbol\";\n}\n\nexport function parseText(text: string): (string | React.ReactElement)[] {\n const urlRegex = /(https?:\\/\\/[^\\s]+|www\\.[^\\s]+)/gi;\n const hashtagRegex = /#[\\w]+/g;\n const symbolRegex = /\\$[A-Za-z][A-Za-z0-9_]*/g;\n\n const matches: MatchItem[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = urlRegex.exec(text)) !== null) {\n matches.push({\n index: match.index,\n length: match[0].length,\n text: match[0],\n type: \"url\",\n });\n }\n\n while ((match = hashtagRegex.exec(text)) !== null) {\n const matchIndex = match.index;\n const overlaps = matches.some(\n (m) => matchIndex >= m.index && matchIndex < m.index + m.length,\n );\n if (!overlaps) {\n matches.push({\n index: matchIndex,\n length: match[0].length,\n text: match[0],\n type: \"hashtag\",\n });\n }\n }\n\n while ((match = symbolRegex.exec(text)) !== null) {\n const matchIndex = match.index;\n const overlaps = matches.some(\n (m) => matchIndex >= m.index && matchIndex < m.index + m.length,\n );\n if (!overlaps) {\n matches.push({\n index: matchIndex,\n length: match[0].length,\n text: match[0],\n type: \"symbol\",\n });\n }\n }\n\n matches.sort((a, b) => a.index - b.index);\n\n const parts: (string | React.ReactElement)[] = [];\n let lastIndex = 0;\n let key = 0;\n\n matches.forEach((item) => {\n if (item.index > lastIndex) {\n parts.push(text.slice(lastIndex, item.index));\n }\n\n if (item.type === \"url\") {\n const url = item.text.startsWith(\"http\")\n ? item.text\n : `https://${item.text}`;\n parts.push(\n <a\n key={key++}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {item.text}\n </a>,\n );\n } else if (item.type === \"hashtag\") {\n const hashtag = item.text.slice(1); // 移除 #\n const hashtagUrl = `https://x.com/hashtag/${hashtag}`;\n parts.push(\n <a\n key={key++}\n href={hashtagUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {item.text}\n </a>,\n );\n } else if (item.type === \"symbol\") {\n parts.push(\n <span key={key++} className=\"text-primary\">\n {item.text}\n </span>,\n );\n }\n\n lastIndex = item.index + item.length;\n });\n\n if (lastIndex < text.length) {\n parts.push(text.slice(lastIndex));\n }\n\n return parts.length > 0 ? parts : [text];\n}\n","import React, { MouseEvent, useCallback, useState } from \"react\";\nimport { useBoolean } from \"@liberfi.io/hooks\";\nimport { LocaleCode, useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Skeleton, TranslateIcon } from \"@liberfi.io/ui\";\nimport { useTranslateTweetMediaMutation } from \"../../../../hooks\";\nimport { TweetMedia } from \"../../../../types\";\nimport { parseText } from \"../../../../utils\";\n\ntype Props = {\n data: TweetMedia;\n embed?: boolean;\n text: string;\n renderActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function Translate({ data, embed, renderActions }: Props) {\n const [isTranslate, { toggle }] = useBoolean(false);\n\n const { t, i18n } = useTranslation();\n\n const { mutateAsync: translateTweetMedia, isPending: isTranslating } =\n useTranslateTweetMediaMutation();\n\n const [translatedText, setTranslatedText] = useState<\n (string | React.ReactElement)[] | null\n >(null);\n\n const handleTranslate = useCallback(\n async (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n toggle();\n if (!translatedText) {\n const text = await translateTweetMedia({\n media: data,\n targetLanguage: i18n.language as LocaleCode,\n options: {\n sourceTweet: embed,\n },\n });\n const parsedText = parseText(text);\n setTranslatedText(parsedText);\n }\n },\n [toggle, translateTweetMedia, data, i18n.language, translatedText],\n );\n\n return (\n <>\n <div className=\"flex items-center gap-1 text-xs\">\n <div\n onClick={handleTranslate}\n className=\"flex items-center gap-0.5 cursor-pointer text-primary hover:text-foreground\"\n >\n <TranslateIcon width=\"14\" height=\"14\" />\n {isTranslate\n ? t(\"mediaTrack.tweets.translate.hide\")\n : t(\"mediaTrack.tweets.translate.show\")}\n </div>\n {renderActions}\n </div>\n <div\n className={cn(!isTranslate && \"hidden\")}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n {isTranslate && (\n <div className=\"bg-content2 rounded-md p-2 text-default-900 text-sm leading-5\">\n {translatedText}\n {isTranslating && <Skeleton className=\"w-full h-4 rounded-md\" />}\n </div>\n )}\n </div>\n </>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"@liberfi.io/ui\";\n\ntype Props = {\n isExpanded?: boolean;\n onToggleExpand?: (expanded: boolean) => void;\n};\n\nexport function TextExpand({ isExpanded, onToggleExpand }: Props) {\n const { t } = useTranslation();\n const renderExpand = () => {\n if (isExpanded) {\n return (\n <>\n <ChevronUpIcon\n className=\"border border-current\"\n width=\"12\"\n height=\"12\"\n />\n &nbsp;{t(\"mediaTrack.tweets.collapse\")}\n </>\n );\n }\n\n return (\n <>\n <ChevronDownIcon\n className=\"border border-current\"\n width=\"12\"\n height=\"12\"\n />\n &nbsp;{t(\"mediaTrack.tweets.expand\")}\n </>\n );\n };\n\n if (isExpanded === undefined) return null;\n\n return (\n <div className=\"flex items-center gap-1\">\n <div className=\"w-px h-2.5 bg-line-300\" />\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggleExpand?.(!isExpanded);\n }}\n className=\"flex items-center text-default-500 hover:text-foreground text-xs\"\n >\n {renderExpand()}\n </button>\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { parseText } from \"../../../../utils\";\n\ntype Props = {\n content: string;\n isExpanded?: boolean;\n onLoad?: () => void;\n};\n\n// ------------------------------------------------------------\nexport function Content({ content, isExpanded = false, onLoad }: Props) {\n const ref = useRef<HTMLDivElement>(null);\n\n const parsedContent = useMemo(() => parseText(content), [content]);\n\n useEffect(() => {\n const current = ref.current;\n if (!onLoad || !current) return;\n if (current.scrollHeight > current.clientHeight) {\n onLoad?.();\n }\n }, [isExpanded]);\n\n return (\n <div\n ref={ref}\n className={[\n \"text-default-900 text-sm leading-5\",\n !isExpanded ? \"line-clamp-3\" : \"\",\n ].join(\" \")}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n {parsedContent}\n </div>\n );\n}\n","import React, { useMemo, useState } from \"react\";\nimport { useTickAge } from \"@liberfi.io/hooks\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { formatAge, twitterTweetUrl } from \"@liberfi.io/utils\";\nimport { Tweet, TweetMedia } from \"../../../types\";\nimport { Content } from \"./content\";\nimport { Medias } from \"./media\";\nimport { Translate, TextExpand } from \"./tools\";\nimport { UserInfo } from \"./user\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n embed?: boolean;\n indicator?: React.ReactNode;\n children?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetSource({\n data,\n headerActions,\n footerActions,\n embed = false,\n indicator,\n children,\n}: Props) {\n const [isExpanded, setIsExpanded] = useState<boolean | undefined>(undefined);\n\n const containerClass = useMemo(() => {\n return embed\n ? \"bg-default-50 rounded-lg p-3 w-full mx-auto\"\n : \"bg-default-100 hover:bg-default-200 rounded-lg p-3 w-full mx-auto\";\n }, [embed]);\n\n const tweet = useMemo(\n () => (embed ? data.sourceTweet! : data.tweet),\n [data, embed],\n );\n\n const age = useTickAge((tweet as Tweet).timestamp);\n\n return (\n <div\n className={cn(\"flex flex-col gap-1.5 cursor-pointer\", containerClass)}\n onClick={() => {\n window.open(twitterTweetUrl(tweet.tweetId), \"_blank\");\n }}\n >\n {/* -------- USER INFO -------- */}\n <UserInfo\n user={tweet.user}\n renderTimestamp={\n embed ? undefined : (\n <div className=\"text-xs text-primary\">{formatAge(age)}</div>\n )\n }\n renderActions={headerActions}\n />\n\n {/* -------- MESSAGE TYPE INDICATOR -------- */}\n {indicator}\n\n {/* -------- CONTENT -------- */}\n {tweet.content.text && (\n <Content\n content={tweet.content.text}\n isExpanded={isExpanded}\n onLoad={() => setIsExpanded(false)}\n />\n )}\n\n {/* -------- TOOLS -------- */}\n {tweet.content.text && (\n <Translate\n data={data}\n embed={embed}\n text={tweet.content.text}\n renderActions={\n <TextExpand\n isExpanded={isExpanded}\n onToggleExpand={setIsExpanded}\n />\n }\n />\n )}\n\n {/* -------- MEDIA -------- */}\n <div\n className={cn(\n (!tweet.content.medias || tweet.content.medias.length === 0) &&\n \"hidden\",\n )}\n >\n {tweet.content.medias && tweet.content.medias.length > 0 && (\n <Medias\n medias={tweet.content.medias}\n tweetHref={twitterTweetUrl(tweet.tweetId)}\n />\n )}\n </div>\n\n {/* -------- CHILDREN -------- */}\n {children}\n\n {/* -------- Custom ACTIONS -------- */}\n {footerActions}\n </div>\n );\n}\n","import React from \"react\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetOriginal({ data, headerActions, footerActions }: Props) {\n return (\n <TweetSource\n data={data}\n headerActions={headerActions}\n footerActions={footerActions}\n />\n );\n}\n","import React from \"react\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetQuote({ data, headerActions, footerActions }: Props) {\n const sourceTweet = data.sourceTweet;\n const hasSource = !!sourceTweet;\n\n return (\n <TweetSource\n data={data}\n headerActions={headerActions}\n footerActions={footerActions}\n >\n {hasSource ? <TweetSource data={data} embed /> : null}\n </TweetSource>\n );\n}\n","import React, { useMemo } from \"react\";\nimport { Link } from \"@liberfi.io/ui\";\nimport { twitterUserUrl } from \"@liberfi.io/utils\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetReply({ data, headerActions, footerActions }: Props) {\n const sourceTweet = data.sourceTweet;\n const hasSource = !!sourceTweet;\n\n const indicator = useMemo(\n () => (\n <div className=\"flex items-center gap-2 text-sm\">\n <span>Replying to</span>\n {hasSource && (\n <Link\n className=\"text-sm\"\n underline=\"hover\"\n target=\"_blank\"\n href={twitterUserUrl(\n sourceTweet.user.screenName ?? sourceTweet.user.username,\n )}\n >\n @{sourceTweet.user.screenName ?? sourceTweet.user.username}\n </Link>\n )}\n </div>\n ),\n [hasSource, sourceTweet],\n );\n\n return (\n <TweetSource\n data={data}\n indicator={indicator}\n headerActions={headerActions}\n footerActions={footerActions}\n >\n {hasSource ? <TweetSource data={data} embed /> : null}\n </TweetSource>\n );\n}\n","import React, { useMemo } from \"react\";\nimport { Link } from \"@liberfi.io/ui\";\nimport { twitterUserUrl } from \"@liberfi.io/utils\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetRetweet({ data, headerActions, footerActions }: Props) {\n const sourceTweet = data.sourceTweet;\n const hasSource = !!sourceTweet;\n\n const indicator = useMemo(\n () => (\n <div className=\"flex items-center gap-2 text-sm\">\n <span>Retweeted by</span>\n {hasSource && (\n <Link\n className=\"text-sm\"\n underline=\"hover\"\n target=\"_blank\"\n href={twitterUserUrl(\n sourceTweet.user.screenName ?? sourceTweet.user.username,\n )}\n >\n @{sourceTweet.user.screenName ?? sourceTweet.user.username}\n </Link>\n )}\n </div>\n ),\n [hasSource, sourceTweet],\n );\n\n return (\n <TweetSource\n data={data}\n indicator={indicator}\n headerActions={headerActions}\n footerActions={footerActions}\n >\n {hasSource ? <TweetSource data={data} embed /> : null}\n </TweetSource>\n );\n}\n","import React from \"react\";\nimport { Skeleton } from \"@liberfi.io/ui\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetOriginal } from \"./tweet-original\";\nimport { TweetQuote } from \"./tweet-quote\";\nimport { TweetReply } from \"./tweet-reply\";\nimport { TweetRetweet } from \"./tweet-retweet\";\n\ntype Props = {\n data?: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n embed?: boolean;\n children?: React.ReactNode;\n loading?: boolean;\n};\n\n// ------------------------------------------------------------\nexport function TweetItem({\n data,\n headerActions,\n footerActions,\n embed = false,\n children,\n loading = false,\n}: Props) {\n if (loading || !data) {\n return <TweetSkeleton embed={embed} />;\n }\n\n const tweetType = data.tweet.type;\n\n // Render appropriate component based on tweet type\n const renderTweetComponent = () => {\n const commonProps = {\n data,\n headerActions,\n footerActions,\n embed,\n children,\n };\n\n switch (tweetType) {\n case \"reply\":\n return <TweetReply {...commonProps} />;\n case \"retweet\":\n return <TweetRetweet {...commonProps} />;\n case \"quote\":\n return <TweetQuote {...commonProps} />;\n default: // \"original\"\n return <TweetOriginal {...commonProps} />;\n }\n };\n\n return <div className=\"w-full\">{renderTweetComponent()}</div>;\n}\n\n// ------------------------------------------------------------\nfunction TweetSkeleton({ embed = false }: { embed?: boolean }) {\n const containerClass = embed\n ? \"bg-default-50 rounded-lg p-3 w-full mx-auto\"\n : \"bg-default-100 rounded-lg p-3 w-full mx-auto\";\n\n return (\n <div className={[\"flex flex-col gap-2\", containerClass].join(\" \")}>\n {/* User Info Skeleton */}\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"w-10 h-10 rounded-full\" />\n <div className=\"flex flex-col gap-1 flex-1\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-16\" />\n </div>\n <Skeleton className=\"h-3 w-12\" />\n </div>\n\n {/* Content Skeleton */}\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n\n {/* Media Skeleton */}\n <Skeleton className=\"h-48 w-full rounded-lg\" />\n\n {/* Actions Skeleton */}\n <div className=\"flex justify-between items-center pt-2\">\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-6 w-16\" />\n <Skeleton className=\"h-6 w-16\" />\n <Skeleton className=\"h-6 w-16\" />\n </div>\n <Skeleton className=\"h-6 w-20\" />\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { Avatar, Badge, Button, Image } from \"@liberfi.io/ui\";\nimport { formatPercent, SafeBigNumber } from \"@liberfi.io/utils\";\nimport { MediaToken } from \"../../../../types\";\n\ntype Props = {\n token: MediaToken;\n};\n\nexport function TweetTokenButton({ token }: Props) {\n const color = new SafeBigNumber(token.priceChange ?? \"0\").isPositive()\n ? \"primary\"\n : \"danger\";\n\n return (\n <Button\n color={color}\n variant=\"flat\"\n size=\"sm\"\n radius=\"full\"\n startContent={<TweetTokenIcon token={token} />}\n >\n <span>{token.symbol}</span>\n <span>\n {token.priceChange\n ? formatPercent(Number(token.priceChange) / 100)\n : \"--\"}\n </span>\n </Button>\n );\n}\n\nexport function TweetTokenIcon({ token }: Props) {\n const ChainIcon = useMemo(() => {\n return (\n <Image className=\"w-full h-full\" src={token.image} alt={token.chain} />\n );\n }, [token.chain]);\n\n return (\n <Badge\n className=\"w-2.5 h-2.5 p-0 border\"\n size=\"sm\"\n content={ChainIcon}\n shape=\"circle\"\n placement=\"bottom-right\"\n >\n <Avatar className=\"w-5 h-5\" radius=\"full\" src={token.image} />\n </Badge>\n );\n}\n","import { useCallback } from \"react\";\nimport { TweetMedia } from \"../../types\";\nimport { TweetTokenButton } from \"./tweet/tools/tweet-token-button\";\n// import { TweetTradeButton } from \"./tweet/tools/tweet-trade-button\";\nimport { TweetItem } from \"./tweet/tweet-item\";\n\ntype TweetsProps = {\n data: Array<TweetMedia>;\n loading: boolean;\n setIsPaused: (paused: boolean) => void;\n customHeaderActions?: (item: TweetMedia) => React.ReactNode;\n customFooterActions?: (item: TweetMedia) => React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function Tweets({\n data,\n loading,\n setIsPaused,\n customHeaderActions,\n customFooterActions,\n}: TweetsProps) {\n const footerActions = useCallback(\n (item: TweetMedia) => (\n <div className=\"flex gap-2.5 justify-between\">\n {item.token && <TweetTokenButton token={item.token} />}\n {customFooterActions?.(item)}\n {/* {item.token && <TweetTradeButton token={item.token} />} */}\n </div>\n ),\n [customFooterActions],\n );\n\n return (\n <div\n className=\"flex flex-col gap-2.5\"\n onMouseEnter={() => setIsPaused(true)}\n onMouseLeave={() => setIsPaused(false)}\n >\n {data.map((item: TweetMedia) => (\n <TweetItem\n key={item.id}\n data={item}\n headerActions={customHeaderActions?.(item)}\n footerActions={footerActions(item)}\n loading={loading}\n />\n ))}\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\n// ------------------------------------------------------------\nexport function TweetSkeleton() {\n return (\n <div className=\"flex flex-col gap-2 bg-default-100 rounded-lg p-3 w-full mx-auto\">\n {/* User Info Skeleton */}\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"w-10 h-10 rounded-full\" />\n <div className=\"flex flex-col gap-1 flex-1\">\n <Skeleton className=\"h-4 w-40 rounded-md\" />\n <Skeleton className=\"h-3 w-32 rounded-md\" />\n </div>\n </div>\n\n {/* Content Skeleton */}\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-full rounded-md\" />\n <Skeleton className=\"h-4 w-3/4 rounded-md\" />\n <Skeleton className=\"h-4 w-1/2 rounded-md\" />\n </div>\n\n {/* Media Skeleton */}\n <Skeleton className=\"h-48 w-full rounded-lg\" />\n </div>\n );\n}\n\nexport function TweetSkeletonList({ count = 3 }: { count: number }) {\n return (\n <div className=\"flex flex-col gap-2\">\n {Array.from({ length: count }).map((_, index) => (\n <TweetSkeleton key={index} />\n ))}\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useMediaTrackClient } from \"../../hooks\";\nimport { TweetMedia } from \"../../types\";\n\nexport const useTweets = () => {\n const [medias, setMedias] = useState<Array<TweetMedia>>([]);\n const [loading, setLoading] = useState(true);\n const [isPaused, setIsPaused] = useState(false);\n\n const client = useMediaTrackClient();\n\n const handleMedia = useCallback(\n (media: TweetMedia) => {\n setMedias((prevMedias) => {\n const idx = prevMedias.findIndex((it) => it.id === media.id);\n let newMedias: Array<TweetMedia>;\n\n if (idx >= 0) {\n newMedias = prevMedias.map((item, index) =>\n index === idx ? media : item,\n );\n } else {\n if (isPaused) {\n return prevMedias;\n }\n newMedias = [media, ...prevMedias];\n }\n\n return newMedias.slice(0, 30);\n });\n setLoading(false);\n },\n [isPaused],\n );\n\n useEffect(() => {\n const subTweet = client.subscribeTweetMedia({ callback: handleMedia });\n const subTweetToken = client.subscribeTweetMediaToken({\n callback: handleMedia,\n });\n return () => {\n subTweet.unsubscribe();\n subTweetToken.unsubscribe();\n };\n }, [client, handleMedia]);\n\n return { medias, loading, isPaused, setIsPaused };\n};\n","import { useEffect } from \"react\";\nimport { TweetMedia } from \"../../types\";\nimport { TweetSkeletonList } from \"./tweet/tweet-skeleton\";\nimport { useTweets } from \"./tweets.script\";\nimport { Tweets } from \"./tweets.ui\";\n\n// ------------------------------------------------------------\nexport type TweetsWidgetProps = {\n onPauseChange?: (paused: boolean) => void;\n customHeaderActions?: (item: TweetMedia) => React.ReactNode;\n customFooterActions?: (item: TweetMedia) => React.ReactNode;\n};\n\nexport function TweetsWidget({\n onPauseChange,\n customHeaderActions,\n customFooterActions,\n}: TweetsWidgetProps) {\n const { medias, loading, isPaused, setIsPaused } = useTweets();\n\n useEffect(() => {\n onPauseChange?.(isPaused);\n }, [isPaused, onPauseChange]);\n\n if (loading) {\n return <TweetSkeletonList count={3} />;\n }\n\n return (\n <Tweets\n data={medias}\n loading={loading}\n setIsPaused={setIsPaused}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { MediaTrackContext } from \"../context\";\nimport { IMediaTrackClient } from \"../types\";\n\nexport type MediaTrackProviderProps = PropsWithChildren<{\n client: IMediaTrackClient;\n}>;\n\nexport function MediaTrackProvider({\n client,\n children,\n}: MediaTrackProviderProps) {\n return (\n <MediaTrackContext.Provider value={{ client }}>\n {children}\n </MediaTrackContext.Provider>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/version.ts","../src/components/tweets/tweet/media/media-image.tsx","../src/components/tweets/tweet/media/media-video.tsx","../src/components/tweets/tweet/media/medias.tsx","../src/components/tweets/tweet/user/user-avatar.tsx","../src/components/tweets/tweet/user/user-info.tsx","../src/context/MediaTrackContext.ts","../src/hooks/useMediaTrackContext.ts","../src/hooks/useMediaTrackClient.ts","../src/hooks/useGenerateTweetMediaMemeMutation.ts","../src/hooks/useTranslateTweetMediaQuery.ts","../src/utils/parseText.tsx","../src/components/tweets/tweet/tools/translate.tsx","../src/components/tweets/tweet/tools/text-expand.tsx","../src/components/tweets/tweet/content/index.tsx","../src/components/tweets/tweet/tweet-source.tsx","../src/components/tweets/tweet/tweet-original.tsx","../src/components/tweets/tweet/tweet-quote.tsx","../src/components/tweets/tweet/tweet-reply.tsx","../src/components/tweets/tweet/tweet-retweet.tsx","../src/components/tweets/tweet/tweet-item.tsx","../src/components/tweets/tweet/tools/tweet-token-button.tsx","../src/components/tweets/tweets.ui.tsx","../src/components/tweets/tweet/tweet-skeleton.tsx","../src/components/tweets/tweets.script.ts","../src/components/tweets/tweets.widget.tsx","../src/providers/MediaTrackProvider.tsx"],"names":["version_default","MediaImage","src","isLoaded","setTrue","useBoolean","jsx","Skeleton","MediaVideo","Medias","medias","tweetHref","images","media","videos","renderVideos","video","renderImages","image","Link","jsxs","UserAvatar","url","name","size","fallbackName","useMemo","Avatar","UserInfo","user","renderTimestamp","renderActions","twitterUserUrl","MediaTrackContext","createContext","useMediaTrackContext","context","useContext","useMediaTrackClient","client","useGenerateTweetMediaMemeMutation","options","useMutation","params","translateTweetMedia","targetLanguage","useTranslateTweetMediaMutation","parseText","text","urlRegex","hashtagRegex","symbolRegex","matches","match","matchIndex","m","a","b","parts","lastIndex","key","item","e","hashtagUrl","Translate","data","embed","isTranslate","toggle","t","i18n","useTranslation","isTranslating","translatedText","setTranslatedText","useState","handleTranslate","useCallback","parsedText","Fragment","TranslateIcon","cn","TextExpand","isExpanded","onToggleExpand","renderExpand","ChevronUpIcon","ChevronDownIcon","Content","content","onLoad","ref","useRef","parsedContent","useEffect","current","TweetSource","headerActions","footerActions","indicator","children","setIsExpanded","containerClass","tweet","age","useTickAge","twitterTweetUrl","formatAge","TweetOriginal","TweetQuote","hasSource","TweetReply","sourceTweet","TweetRetweet","TweetItem","loading","TweetSkeleton","tweetType","commonProps","TweetTokenButton","token","color","SafeBigNumber","Button","TweetTokenIcon","formatPercent","ChainIcon","Image","Badge","Tweets","setIsPaused","customHeaderActions","customFooterActions","TweetSkeletonList","count","_","index","useTweets","setMedias","setLoading","isPaused","handleMedia","prevMedias","idx","it","newMedias","subTweet","subTweetToken","TweetsWidget","onPauseChange","MediaTrackProvider"],"mappings":"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","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-media-track\"] = \"0.1.148\";\n}\n\nexport default \"0.1.148\";\n","import { useBoolean } from \"@liberfi.io/hooks\";\nimport { Skeleton } from \"@liberfi.io/ui\";\n\ntype Props = {\n src: string;\n};\n\n// ------------------------------------------------------------\nexport function MediaImage({ src }: Props) {\n const [isLoaded, { setTrue }] = useBoolean(false);\n if (!src) return null;\n\n return (\n <Skeleton isLoaded={isLoaded} className=\"w-full h-auto\">\n <img\n src={src}\n className=\"w-full h-full object-cover aspect-video\"\n onLoad={() => {\n setTrue();\n }}\n />\n </Skeleton>\n );\n}\n","type Props = {\n src: string;\n};\n\n// ------------------------------------------------------------\nexport function MediaVideo({ src }: Props) {\n if (!src) return null;\n\n return (\n <div className=\"w-full h-full overflow-hidden rounded-md mt-2\">\n <iframe\n className=\"w-full h-full aspect-video\"\n src={src}\n allowFullScreen\n />\n </div>\n );\n}\n","import { Link } from \"@liberfi.io/ui\";\nimport { TweetContentMedia } from \"../../../../types\";\nimport { MediaImage } from \"./media-image\";\nimport { MediaVideo } from \"./media-video\";\n\ntype Props = {\n medias: Array<TweetContentMedia>;\n tweetHref: string;\n};\n\nexport function Medias({ medias, tweetHref }: Props) {\n const images = medias.filter((media) => media.type === \"image\");\n const videos = medias.filter((media) => media.type === \"video\");\n\n const renderVideos = () => {\n if (!videos.length) return null;\n return (\n <div className={`grid grid-cols-1 gap-[1px] overflow-hidden rounded-md`}>\n {videos.map((video) => (\n <MediaVideo key={video.url} src={video.url} />\n ))}\n </div>\n );\n };\n\n const renderImages = () => {\n if (!images.length) return null;\n return (\n <div className={`grid grid-cols-1 gap-[1px] overflow-hidden rounded-md`}>\n {images.map((image) => (\n <Link key={image.url} href={tweetHref} target=\"_blank\">\n <MediaImage src={image.url} />\n </Link>\n ))}\n </div>\n );\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {renderVideos()}\n {renderImages()}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { Avatar, Skeleton } from \"@liberfi.io/ui\";\n\ntype Props = {\n url?: string;\n name?: string;\n size?: number;\n};\n\nexport function UserAvatar({ url, name = \"\", size = 36 }: Props) {\n const fallbackName = useMemo(() => (name ? name.slice(0, 2) : \"N/A\"), [name]);\n\n return (\n <Skeleton\n className=\"flex rounded-full flex-shrink-0\"\n style={{ width: size, height: size }}\n isLoaded={!!url}\n >\n <Avatar\n size=\"md\"\n color=\"primary\"\n radius=\"full\"\n showFallback\n name={fallbackName}\n src={url}\n style={{ width: size, height: size }}\n />\n </Skeleton>\n );\n}\n","import React from \"react\";\nimport { Link } from \"@liberfi.io/ui\";\nimport { twitterUserUrl } from \"@liberfi.io/utils\";\nimport { TweetUser } from \"../../../../types\";\nimport { UserAvatar } from \"./user-avatar\";\n\ntype Props = {\n user: TweetUser;\n renderTimestamp?: React.ReactNode;\n renderActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function UserInfo({ user, renderTimestamp, renderActions }: Props) {\n return (\n <div className=\"flex items-center justify-between gap-1\">\n <div className=\"flex items-center gap-1\">\n <UserAvatar url={user.avatar} name={user.username} />\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"flex flex-row items-baseline gap-1\">\n <span className=\"text-foreground font-semibold truncate leading-none\">\n {user.username}\n </span>\n {renderTimestamp}\n </div>\n <Link\n target=\"_blank\"\n underline=\"hover\"\n className=\"text-default-500 text-sm leading-none\"\n href={twitterUserUrl(user.screenName ?? user.username)}\n >\n @{user.screenName ?? user.username}\n </Link>\n </div>\n </div>\n {renderActions}\n </div>\n );\n}\n","import { createContext } from \"react\";\nimport { IMediaTrackClient } from \"../types\";\n\nexport interface MediaTrackContextValue {\n client: IMediaTrackClient;\n}\n\nexport const MediaTrackContext = createContext<MediaTrackContextValue>(\n {} as MediaTrackContextValue,\n);\n","import { useContext } from \"react\";\nimport { MediaTrackContext } from \"../context\";\n\nexport function useMediaTrackContext() {\n const context = useContext(MediaTrackContext);\n if (!context) {\n throw new Error(\n \"useMediaTrackContext must be used within a MediaTrackProvider\",\n );\n }\n return context;\n}\n","import { useMediaTrackContext } from \"./useMediaTrackContext\";\n\nexport function useMediaTrackClient() {\n const { client } = useMediaTrackContext();\n return client;\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport { GeneratedMemeInfo, TweetMedia } from \"../types\";\nimport { useMediaTrackClient } from \"./useMediaTrackClient\";\n\nexport function useGenerateTweetMediaMemeMutation(\n options: Omit<\n UseMutationOptions<GeneratedMemeInfo, Error, TweetMedia, string[]>,\n \"mutationFn\"\n > = {},\n) {\n const client = useMediaTrackClient();\n return useMutation({\n mutationFn: async (params: TweetMedia) => client.generateMeme(params),\n ...options,\n });\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport { LocaleCode } from \"@liberfi.io/i18n\";\nimport { IMediaTrackClient, TweetMedia } from \"../types\";\nimport { useMediaTrackClient } from \"./useMediaTrackClient\";\n\nexport interface UseTranslateTweetMediaParams {\n media: TweetMedia;\n targetLanguage: LocaleCode;\n options?: {\n sourceLanguage?: LocaleCode;\n sourceTweet?: boolean;\n };\n}\n\nexport async function translateTweetMedia(\n client: IMediaTrackClient,\n { media, targetLanguage, options }: UseTranslateTweetMediaParams,\n) {\n return await client.translate(media, targetLanguage, options);\n}\n\nexport function useTranslateTweetMediaMutation(\n options: Omit<\n UseMutationOptions<string, Error, UseTranslateTweetMediaParams>,\n \"mutationFn\"\n > = {},\n) {\n const client = useMediaTrackClient();\n return useMutation({\n mutationFn: async (params: UseTranslateTweetMediaParams) =>\n translateTweetMedia(client, params),\n ...options,\n });\n}\n","interface MatchItem {\n index: number;\n length: number;\n text: string;\n type: \"url\" | \"hashtag\" | \"symbol\";\n}\n\nexport function parseText(text: string): (string | React.ReactElement)[] {\n const urlRegex = /(https?:\\/\\/[^\\s]+|www\\.[^\\s]+)/gi;\n const hashtagRegex = /#[\\w]+/g;\n const symbolRegex = /\\$[A-Za-z][A-Za-z0-9_]*/g;\n\n const matches: MatchItem[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = urlRegex.exec(text)) !== null) {\n matches.push({\n index: match.index,\n length: match[0].length,\n text: match[0],\n type: \"url\",\n });\n }\n\n while ((match = hashtagRegex.exec(text)) !== null) {\n const matchIndex = match.index;\n const overlaps = matches.some(\n (m) => matchIndex >= m.index && matchIndex < m.index + m.length,\n );\n if (!overlaps) {\n matches.push({\n index: matchIndex,\n length: match[0].length,\n text: match[0],\n type: \"hashtag\",\n });\n }\n }\n\n while ((match = symbolRegex.exec(text)) !== null) {\n const matchIndex = match.index;\n const overlaps = matches.some(\n (m) => matchIndex >= m.index && matchIndex < m.index + m.length,\n );\n if (!overlaps) {\n matches.push({\n index: matchIndex,\n length: match[0].length,\n text: match[0],\n type: \"symbol\",\n });\n }\n }\n\n matches.sort((a, b) => a.index - b.index);\n\n const parts: (string | React.ReactElement)[] = [];\n let lastIndex = 0;\n let key = 0;\n\n matches.forEach((item) => {\n if (item.index > lastIndex) {\n parts.push(text.slice(lastIndex, item.index));\n }\n\n if (item.type === \"url\") {\n const url = item.text.startsWith(\"http\")\n ? item.text\n : `https://${item.text}`;\n parts.push(\n <a\n key={key++}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {item.text}\n </a>,\n );\n } else if (item.type === \"hashtag\") {\n const hashtag = item.text.slice(1); // 移除 #\n const hashtagUrl = `https://x.com/hashtag/${hashtag}`;\n parts.push(\n <a\n key={key++}\n href={hashtagUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {item.text}\n </a>,\n );\n } else if (item.type === \"symbol\") {\n parts.push(\n <span key={key++} className=\"text-primary\">\n {item.text}\n </span>,\n );\n }\n\n lastIndex = item.index + item.length;\n });\n\n if (lastIndex < text.length) {\n parts.push(text.slice(lastIndex));\n }\n\n return parts.length > 0 ? parts : [text];\n}\n","import React, { MouseEvent, useCallback, useState } from \"react\";\nimport { useBoolean } from \"@liberfi.io/hooks\";\nimport { LocaleCode, useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Skeleton, TranslateIcon } from \"@liberfi.io/ui\";\nimport { useTranslateTweetMediaMutation } from \"../../../../hooks\";\nimport { TweetMedia } from \"../../../../types\";\nimport { parseText } from \"../../../../utils\";\n\ntype Props = {\n data: TweetMedia;\n embed?: boolean;\n text: string;\n renderActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function Translate({ data, embed, renderActions }: Props) {\n const [isTranslate, { toggle }] = useBoolean(false);\n\n const { t, i18n } = useTranslation();\n\n const { mutateAsync: translateTweetMedia, isPending: isTranslating } =\n useTranslateTweetMediaMutation();\n\n const [translatedText, setTranslatedText] = useState<\n (string | React.ReactElement)[] | null\n >(null);\n\n const handleTranslate = useCallback(\n async (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n toggle();\n if (!translatedText) {\n const text = await translateTweetMedia({\n media: data,\n targetLanguage: i18n.language as LocaleCode,\n options: {\n sourceTweet: embed,\n },\n });\n const parsedText = parseText(text);\n setTranslatedText(parsedText);\n }\n },\n [toggle, translateTweetMedia, data, i18n.language, translatedText],\n );\n\n return (\n <>\n <div className=\"flex items-center gap-1 text-xs\">\n <div\n onClick={handleTranslate}\n className=\"flex items-center gap-0.5 cursor-pointer text-primary hover:text-foreground\"\n >\n <TranslateIcon width=\"14\" height=\"14\" />\n {isTranslate\n ? t(\"mediaTrack.tweets.translate.hide\")\n : t(\"mediaTrack.tweets.translate.show\")}\n </div>\n {renderActions}\n </div>\n <div\n className={cn(!isTranslate && \"hidden\")}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n {isTranslate && (\n <div className=\"bg-content2 rounded-md p-2 text-default-900 text-sm leading-5\">\n {translatedText}\n {isTranslating && <Skeleton className=\"w-full h-4 rounded-md\" />}\n </div>\n )}\n </div>\n </>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"@liberfi.io/ui\";\n\ntype Props = {\n isExpanded?: boolean;\n onToggleExpand?: (expanded: boolean) => void;\n};\n\nexport function TextExpand({ isExpanded, onToggleExpand }: Props) {\n const { t } = useTranslation();\n const renderExpand = () => {\n if (isExpanded) {\n return (\n <>\n <ChevronUpIcon\n className=\"border border-current\"\n width=\"12\"\n height=\"12\"\n />\n &nbsp;{t(\"mediaTrack.tweets.collapse\")}\n </>\n );\n }\n\n return (\n <>\n <ChevronDownIcon\n className=\"border border-current\"\n width=\"12\"\n height=\"12\"\n />\n &nbsp;{t(\"mediaTrack.tweets.expand\")}\n </>\n );\n };\n\n if (isExpanded === undefined) return null;\n\n return (\n <div className=\"flex items-center gap-1\">\n <div className=\"w-px h-2.5 bg-line-300\" />\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggleExpand?.(!isExpanded);\n }}\n className=\"flex items-center text-default-500 hover:text-foreground text-xs\"\n >\n {renderExpand()}\n </button>\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { parseText } from \"../../../../utils\";\n\ntype Props = {\n content: string;\n isExpanded?: boolean;\n onLoad?: () => void;\n};\n\n// ------------------------------------------------------------\nexport function Content({ content, isExpanded = false, onLoad }: Props) {\n const ref = useRef<HTMLDivElement>(null);\n\n const parsedContent = useMemo(() => parseText(content), [content]);\n\n useEffect(() => {\n const current = ref.current;\n if (!onLoad || !current) return;\n if (current.scrollHeight > current.clientHeight) {\n onLoad?.();\n }\n }, [isExpanded]);\n\n return (\n <div\n ref={ref}\n className={[\n \"text-default-900 text-sm leading-5\",\n !isExpanded ? \"line-clamp-3\" : \"\",\n ].join(\" \")}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n {parsedContent}\n </div>\n );\n}\n","import React, { useMemo, useState } from \"react\";\nimport { useTickAge } from \"@liberfi.io/hooks\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { formatAge, twitterTweetUrl } from \"@liberfi.io/utils\";\nimport { Tweet, TweetMedia } from \"../../../types\";\nimport { Content } from \"./content\";\nimport { Medias } from \"./media\";\nimport { Translate, TextExpand } from \"./tools\";\nimport { UserInfo } from \"./user\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n embed?: boolean;\n indicator?: React.ReactNode;\n children?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetSource({\n data,\n headerActions,\n footerActions,\n embed = false,\n indicator,\n children,\n}: Props) {\n const [isExpanded, setIsExpanded] = useState<boolean | undefined>(undefined);\n\n const containerClass = useMemo(() => {\n return embed\n ? \"bg-default-50 rounded-lg p-3 w-full mx-auto\"\n : \"bg-default-100 hover:bg-default-200 rounded-lg p-3 w-full mx-auto\";\n }, [embed]);\n\n const tweet = useMemo(\n () => (embed ? data.sourceTweet! : data.tweet),\n [data, embed],\n );\n\n const age = useTickAge((tweet as Tweet).timestamp);\n\n return (\n <div\n className={cn(\"flex flex-col gap-1.5 cursor-pointer\", containerClass)}\n onClick={() => {\n window.open(twitterTweetUrl(tweet.tweetId), \"_blank\");\n }}\n >\n {/* -------- USER INFO -------- */}\n <UserInfo\n user={tweet.user}\n renderTimestamp={\n embed ? undefined : (\n <div className=\"text-xs text-primary\">{formatAge(age)}</div>\n )\n }\n renderActions={headerActions}\n />\n\n {/* -------- MESSAGE TYPE INDICATOR -------- */}\n {indicator}\n\n {/* -------- CONTENT -------- */}\n {tweet.content.text && (\n <Content\n content={tweet.content.text}\n isExpanded={isExpanded}\n onLoad={() => setIsExpanded(false)}\n />\n )}\n\n {/* -------- TOOLS -------- */}\n {tweet.content.text && (\n <Translate\n data={data}\n embed={embed}\n text={tweet.content.text}\n renderActions={\n <TextExpand\n isExpanded={isExpanded}\n onToggleExpand={setIsExpanded}\n />\n }\n />\n )}\n\n {/* -------- MEDIA -------- */}\n <div\n className={cn(\n (!tweet.content.medias || tweet.content.medias.length === 0) &&\n \"hidden\",\n )}\n >\n {tweet.content.medias && tweet.content.medias.length > 0 && (\n <Medias\n medias={tweet.content.medias}\n tweetHref={twitterTweetUrl(tweet.tweetId)}\n />\n )}\n </div>\n\n {/* -------- CHILDREN -------- */}\n {children}\n\n {/* -------- Custom ACTIONS -------- */}\n {footerActions}\n </div>\n );\n}\n","import React from \"react\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetOriginal({ data, headerActions, footerActions }: Props) {\n return (\n <TweetSource\n data={data}\n headerActions={headerActions}\n footerActions={footerActions}\n />\n );\n}\n","import React from \"react\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetQuote({ data, headerActions, footerActions }: Props) {\n const sourceTweet = data.sourceTweet;\n const hasSource = !!sourceTweet;\n\n return (\n <TweetSource\n data={data}\n headerActions={headerActions}\n footerActions={footerActions}\n >\n {hasSource ? <TweetSource data={data} embed /> : null}\n </TweetSource>\n );\n}\n","import React, { useMemo } from \"react\";\nimport { Link } from \"@liberfi.io/ui\";\nimport { twitterUserUrl } from \"@liberfi.io/utils\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetReply({ data, headerActions, footerActions }: Props) {\n const sourceTweet = data.sourceTweet;\n const hasSource = !!sourceTweet;\n\n const indicator = useMemo(\n () => (\n <div className=\"flex items-center gap-2 text-sm\">\n <span>Replying to</span>\n {hasSource && (\n <Link\n className=\"text-sm\"\n underline=\"hover\"\n target=\"_blank\"\n href={twitterUserUrl(\n sourceTweet.user.screenName ?? sourceTweet.user.username,\n )}\n >\n @{sourceTweet.user.screenName ?? sourceTweet.user.username}\n </Link>\n )}\n </div>\n ),\n [hasSource, sourceTweet],\n );\n\n return (\n <TweetSource\n data={data}\n indicator={indicator}\n headerActions={headerActions}\n footerActions={footerActions}\n >\n {hasSource ? <TweetSource data={data} embed /> : null}\n </TweetSource>\n );\n}\n","import React, { useMemo } from \"react\";\nimport { Link } from \"@liberfi.io/ui\";\nimport { twitterUserUrl } from \"@liberfi.io/utils\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetRetweet({ data, headerActions, footerActions }: Props) {\n const sourceTweet = data.sourceTweet;\n const hasSource = !!sourceTweet;\n\n const indicator = useMemo(\n () => (\n <div className=\"flex items-center gap-2 text-sm\">\n <span>Retweeted by</span>\n {hasSource && (\n <Link\n className=\"text-sm\"\n underline=\"hover\"\n target=\"_blank\"\n href={twitterUserUrl(\n sourceTweet.user.screenName ?? sourceTweet.user.username,\n )}\n >\n @{sourceTweet.user.screenName ?? sourceTweet.user.username}\n </Link>\n )}\n </div>\n ),\n [hasSource, sourceTweet],\n );\n\n return (\n <TweetSource\n data={data}\n indicator={indicator}\n headerActions={headerActions}\n footerActions={footerActions}\n >\n {hasSource ? <TweetSource data={data} embed /> : null}\n </TweetSource>\n );\n}\n","import React from \"react\";\nimport { Skeleton } from \"@liberfi.io/ui\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetOriginal } from \"./tweet-original\";\nimport { TweetQuote } from \"./tweet-quote\";\nimport { TweetReply } from \"./tweet-reply\";\nimport { TweetRetweet } from \"./tweet-retweet\";\n\ntype Props = {\n data?: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n embed?: boolean;\n children?: React.ReactNode;\n loading?: boolean;\n};\n\n// ------------------------------------------------------------\nexport function TweetItem({\n data,\n headerActions,\n footerActions,\n embed = false,\n children,\n loading = false,\n}: Props) {\n if (loading || !data) {\n return <TweetSkeleton embed={embed} />;\n }\n\n const tweetType = data.tweet.type;\n\n // Render appropriate component based on tweet type\n const renderTweetComponent = () => {\n const commonProps = {\n data,\n headerActions,\n footerActions,\n embed,\n children,\n };\n\n switch (tweetType) {\n case \"reply\":\n return <TweetReply {...commonProps} />;\n case \"retweet\":\n return <TweetRetweet {...commonProps} />;\n case \"quote\":\n return <TweetQuote {...commonProps} />;\n default: // \"original\"\n return <TweetOriginal {...commonProps} />;\n }\n };\n\n return <div className=\"w-full\">{renderTweetComponent()}</div>;\n}\n\n// ------------------------------------------------------------\nfunction TweetSkeleton({ embed = false }: { embed?: boolean }) {\n const containerClass = embed\n ? \"bg-default-50 rounded-lg p-3 w-full mx-auto\"\n : \"bg-default-100 rounded-lg p-3 w-full mx-auto\";\n\n return (\n <div className={[\"flex flex-col gap-2\", containerClass].join(\" \")}>\n {/* User Info Skeleton */}\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"w-10 h-10 rounded-full\" />\n <div className=\"flex flex-col gap-1 flex-1\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-16\" />\n </div>\n <Skeleton className=\"h-3 w-12\" />\n </div>\n\n {/* Content Skeleton */}\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n\n {/* Media Skeleton */}\n <Skeleton className=\"h-48 w-full rounded-lg\" />\n\n {/* Actions Skeleton */}\n <div className=\"flex justify-between items-center pt-2\">\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-6 w-16\" />\n <Skeleton className=\"h-6 w-16\" />\n <Skeleton className=\"h-6 w-16\" />\n </div>\n <Skeleton className=\"h-6 w-20\" />\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { Avatar, Badge, Button, Image } from \"@liberfi.io/ui\";\nimport { formatPercent, SafeBigNumber } from \"@liberfi.io/utils\";\nimport { MediaToken } from \"../../../../types\";\n\ntype Props = {\n token: MediaToken;\n};\n\nexport function TweetTokenButton({ token }: Props) {\n const color = new SafeBigNumber(token.priceChange ?? \"0\").isPositive()\n ? \"primary\"\n : \"danger\";\n\n return (\n <Button\n color={color}\n variant=\"flat\"\n size=\"sm\"\n radius=\"full\"\n startContent={<TweetTokenIcon token={token} />}\n >\n <span>{token.symbol}</span>\n <span>\n {token.priceChange\n ? formatPercent(Number(token.priceChange) / 100)\n : \"--\"}\n </span>\n </Button>\n );\n}\n\nexport function TweetTokenIcon({ token }: Props) {\n const ChainIcon = useMemo(() => {\n return (\n <Image className=\"w-full h-full\" src={token.image} alt={token.chain} />\n );\n }, [token.chain]);\n\n return (\n <Badge\n className=\"w-2.5 h-2.5 p-0 border\"\n size=\"sm\"\n content={ChainIcon}\n shape=\"circle\"\n placement=\"bottom-right\"\n >\n <Avatar className=\"w-5 h-5\" radius=\"full\" src={token.image} />\n </Badge>\n );\n}\n","import { useCallback } from \"react\";\nimport { TweetMedia } from \"../../types\";\nimport { TweetTokenButton } from \"./tweet/tools/tweet-token-button\";\n// import { TweetTradeButton } from \"./tweet/tools/tweet-trade-button\";\nimport { TweetItem } from \"./tweet/tweet-item\";\n\ntype TweetsProps = {\n data: Array<TweetMedia>;\n loading: boolean;\n setIsPaused: (paused: boolean) => void;\n customHeaderActions?: (item: TweetMedia) => React.ReactNode;\n customFooterActions?: (item: TweetMedia) => React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function Tweets({\n data,\n loading,\n setIsPaused,\n customHeaderActions,\n customFooterActions,\n}: TweetsProps) {\n const footerActions = useCallback(\n (item: TweetMedia) => (\n <div className=\"flex gap-2.5 justify-between\">\n {item.token && <TweetTokenButton token={item.token} />}\n {customFooterActions?.(item)}\n {/* {item.token && <TweetTradeButton token={item.token} />} */}\n </div>\n ),\n [customFooterActions],\n );\n\n return (\n <div\n className=\"flex flex-col gap-2.5\"\n onMouseEnter={() => setIsPaused(true)}\n onMouseLeave={() => setIsPaused(false)}\n >\n {data.map((item: TweetMedia) => (\n <TweetItem\n key={item.id}\n data={item}\n headerActions={customHeaderActions?.(item)}\n footerActions={footerActions(item)}\n loading={loading}\n />\n ))}\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\n// ------------------------------------------------------------\nexport function TweetSkeleton() {\n return (\n <div className=\"flex flex-col gap-2 bg-default-100 rounded-lg p-3 w-full mx-auto\">\n {/* User Info Skeleton */}\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"w-10 h-10 rounded-full\" />\n <div className=\"flex flex-col gap-1 flex-1\">\n <Skeleton className=\"h-4 w-40 rounded-md\" />\n <Skeleton className=\"h-3 w-32 rounded-md\" />\n </div>\n </div>\n\n {/* Content Skeleton */}\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-full rounded-md\" />\n <Skeleton className=\"h-4 w-3/4 rounded-md\" />\n <Skeleton className=\"h-4 w-1/2 rounded-md\" />\n </div>\n\n {/* Media Skeleton */}\n <Skeleton className=\"h-48 w-full rounded-lg\" />\n </div>\n );\n}\n\nexport function TweetSkeletonList({ count = 3 }: { count: number }) {\n return (\n <div className=\"flex flex-col gap-2\">\n {Array.from({ length: count }).map((_, index) => (\n <TweetSkeleton key={index} />\n ))}\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useMediaTrackClient } from \"../../hooks\";\nimport { TweetMedia } from \"../../types\";\n\nexport const useTweets = () => {\n const [medias, setMedias] = useState<Array<TweetMedia>>([]);\n const [loading, setLoading] = useState(true);\n const [isPaused, setIsPaused] = useState(false);\n\n const client = useMediaTrackClient();\n\n const handleMedia = useCallback(\n (media: TweetMedia) => {\n setMedias((prevMedias) => {\n const idx = prevMedias.findIndex((it) => it.id === media.id);\n let newMedias: Array<TweetMedia>;\n\n if (idx >= 0) {\n newMedias = prevMedias.map((item, index) =>\n index === idx ? media : item,\n );\n } else {\n if (isPaused) {\n return prevMedias;\n }\n newMedias = [media, ...prevMedias];\n }\n\n return newMedias.slice(0, 30);\n });\n setLoading(false);\n },\n [isPaused],\n );\n\n useEffect(() => {\n const subTweet = client.subscribeTweetMedia({ callback: handleMedia });\n const subTweetToken = client.subscribeTweetMediaToken({\n callback: handleMedia,\n });\n return () => {\n subTweet.unsubscribe();\n subTweetToken.unsubscribe();\n };\n }, [client, handleMedia]);\n\n return { medias, loading, isPaused, setIsPaused };\n};\n","import { useEffect } from \"react\";\nimport { TweetMedia } from \"../../types\";\nimport { TweetSkeletonList } from \"./tweet/tweet-skeleton\";\nimport { useTweets } from \"./tweets.script\";\nimport { Tweets } from \"./tweets.ui\";\n\n// ------------------------------------------------------------\nexport type TweetsWidgetProps = {\n onPauseChange?: (paused: boolean) => void;\n customHeaderActions?: (item: TweetMedia) => React.ReactNode;\n customFooterActions?: (item: TweetMedia) => React.ReactNode;\n};\n\nexport function TweetsWidget({\n onPauseChange,\n customHeaderActions,\n customFooterActions,\n}: TweetsWidgetProps) {\n const { medias, loading, isPaused, setIsPaused } = useTweets();\n\n useEffect(() => {\n onPauseChange?.(isPaused);\n }, [isPaused, onPauseChange]);\n\n if (loading) {\n return <TweetSkeletonList count={3} />;\n }\n\n return (\n <Tweets\n data={medias}\n loading={loading}\n setIsPaused={setIsPaused}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { MediaTrackContext } from \"../context\";\nimport { IMediaTrackClient } from \"../types\";\n\nexport type MediaTrackProviderProps = PropsWithChildren<{\n client: IMediaTrackClient;\n}>;\n\nexport function MediaTrackProvider({\n client,\n children,\n}: MediaTrackProviderProps) {\n return (\n <MediaTrackContext.Provider value={{ client }}>\n {children}\n </MediaTrackContext.Provider>\n );\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import {useBoolean,useTickAge}from'@liberfi.io/hooks';import {Skeleton,Avatar,Link,TranslateIcon,cn,ChevronUpIcon,ChevronDownIcon,Button,Image,Badge}from'@liberfi.io/ui';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {twitterUserUrl,formatAge,twitterTweetUrl,SafeBigNumber,formatPercent}from'@liberfi.io/utils';import {createContext,useMemo,useContext,useState,useCallback,useEffect,useRef}from'react';import {useTranslation}from'@liberfi.io/i18n';import {useMutation}from'@tanstack/react-query';typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/ui-media-track"]="0.1.146");var xe="0.1.146";function O({src:e}){let[t,{setTrue:r}]=useBoolean(false);return e?jsx(Skeleton,{isLoaded:t,className:"w-full h-auto",children:jsx("img",{src:e,className:"w-full h-full object-cover aspect-video",onLoad:()=>{r();}})}):null}function H({src:e}){return e?jsx("div",{className:"w-full h-full overflow-hidden rounded-md mt-2",children:jsx("iframe",{className:"w-full h-full aspect-video",src:e,allowFullScreen:true})}):null}function W({medias:e,tweetHref:t}){let r=e.filter(s=>s.type==="image"),a=e.filter(s=>s.type==="video"),n=()=>a.length?jsx("div",{className:"grid grid-cols-1 gap-[1px] overflow-hidden rounded-md",children:a.map(s=>jsx(H,{src:s.url},s.url))}):null,i=()=>r.length?jsx("div",{className:"grid grid-cols-1 gap-[1px] overflow-hidden rounded-md",children:r.map(s=>jsx(Link,{href:t,target:"_blank",children:jsx(O,{src:s.url})},s.url))}):null;return jsxs("div",{className:"flex flex-col gap-2",children:[n(),i()]})}function D({url:e,name:t="",size:r=36}){let a=useMemo(()=>t?t.slice(0,2):"N/A",[t]);return jsx(Skeleton,{className:"flex rounded-full flex-shrink-0",style:{width:r,height:r},isLoaded:!!e,children:jsx(Avatar,{size:"md",color:"primary",radius:"full",showFallback:true,name:a,src:e,style:{width:r,height:r}})})}function $({user:e,renderTimestamp:t,renderActions:r}){return jsxs("div",{className:"flex items-center justify-between gap-1",children:[jsxs("div",{className:"flex items-center gap-1",children:[jsx(D,{url:e.avatar,name:e.username}),jsxs("div",{className:"flex flex-col gap-0.5",children:[jsxs("div",{className:"flex flex-row items-baseline gap-1",children:[jsx("span",{className:"text-foreground font-semibold truncate leading-none",children:e.username}),t]}),jsxs(Link,{target:"_blank",underline:"hover",className:"text-default-500 text-sm leading-none",href:twitterUserUrl(e.screenName??e.username),children:["@",e.screenName??e.username]})]})]}),r]})}var b=createContext({});function Q(){let e=useContext(b);if(!e)throw new Error("useMediaTrackContext must be used within a MediaTrackProvider");return e}function h(){let{client:e}=Q();return e}function no(e={}){let t=h();return useMutation({mutationFn:async r=>t.generateMeme(r),...e})}async function Ae(e,{media:t,targetLanguage:r,options:a}){return await e.translate(t,r,a)}function Z(e={}){let t=h();return useMutation({mutationFn:async r=>Ae(t,r),...e})}function R(e){let t=/(https?:\/\/[^\s]+|www\.[^\s]+)/gi,r=/#[\w]+/g,a=/\$[A-Za-z][A-Za-z0-9_]*/g,n=[],i;for(;(i=t.exec(e))!==null;)n.push({index:i.index,length:i[0].length,text:i[0],type:"url"});for(;(i=r.exec(e))!==null;){let o=i.index;n.some(d=>o>=d.index&&o<d.index+d.length)||n.push({index:o,length:i[0].length,text:i[0],type:"hashtag"});}for(;(i=a.exec(e))!==null;){let o=i.index;n.some(d=>o>=d.index&&o<d.index+d.length)||n.push({index:o,length:i[0].length,text:i[0],type:"symbol"});}n.sort((o,p)=>o.index-p.index);let s=[],m=0,l=0;return n.forEach(o=>{if(o.index>m&&s.push(e.slice(m,o.index)),o.type==="url"){let p=o.text.startsWith("http")?o.text:`https://${o.text}`;s.push(jsx("a",{href:p,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",onClick:d=>d.stopPropagation(),children:o.text},l++));}else if(o.type==="hashtag"){let d=`https://x.com/hashtag/${o.text.slice(1)}`;s.push(jsx("a",{href:d,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",onClick:x=>x.stopPropagation(),children:o.text},l++));}else o.type==="symbol"&&s.push(jsx("span",{className:"text-primary",children:o.text},l++));m=o.index+o.length;}),m<e.length&&s.push(e.slice(m)),s.length>0?s:[e]}function q({data:e,embed:t,renderActions:r}){let[a,{toggle:n}]=useBoolean(false),{t:i,i18n:s}=useTranslation(),{mutateAsync:m,isPending:l}=Z(),[o,p]=useState(null),d=useCallback(async x=>{if(x.stopPropagation(),n(),!o){let A=await m({media:e,targetLanguage:s.language,options:{sourceTweet:t}}),ue=R(A);p(ue);}},[n,m,e,s.language,o]);return jsxs(Fragment,{children:[jsxs("div",{className:"flex items-center gap-1 text-xs",children:[jsxs("div",{onClick:d,className:"flex items-center gap-0.5 cursor-pointer text-primary hover:text-foreground",children:[jsx(TranslateIcon,{width:"14",height:"14"}),i(a?"mediaTrack.tweets.translate.hide":"mediaTrack.tweets.translate.show")]}),r]}),jsx("div",{className:cn(!a&&"hidden"),onClick:x=>{x.stopPropagation();},children:a&&jsxs("div",{className:"bg-content2 rounded-md p-2 text-default-900 text-sm leading-5",children:[o,l&&jsx(Skeleton,{className:"w-full h-4 rounded-md"})]})})]})}function K({isExpanded:e,onToggleExpand:t}){let{t:r}=useTranslation(),a=()=>e?jsxs(Fragment,{children:[jsx(ChevronUpIcon,{className:"border border-current",width:"12",height:"12"}),"\xA0",r("mediaTrack.tweets.collapse")]}):jsxs(Fragment,{children:[jsx(ChevronDownIcon,{className:"border border-current",width:"12",height:"12"}),"\xA0",r("mediaTrack.tweets.expand")]});return e===void 0?null:jsxs("div",{className:"flex items-center gap-1",children:[jsx("div",{className:"w-px h-2.5 bg-line-300"}),jsx("button",{onClick:n=>{n.stopPropagation(),t?.(!e);},className:"flex items-center text-default-500 hover:text-foreground text-xs",children:a()})]})}function X({content:e,isExpanded:t=false,onLoad:r}){let a=useRef(null),n=useMemo(()=>R(e),[e]);return useEffect(()=>{let i=a.current;!r||!i||i.scrollHeight>i.clientHeight&&r?.();},[t]),jsx("div",{ref:a,className:["text-default-900 text-sm leading-5",t?"":"line-clamp-3"].join(" "),onClick:i=>{i.stopPropagation();},children:n})}function u({data:e,headerActions:t,footerActions:r,embed:a=false,indicator:n,children:i}){let[s,m]=useState(void 0),l=useMemo(()=>a?"bg-default-50 rounded-lg p-3 w-full mx-auto":"bg-default-100 hover:bg-default-200 rounded-lg p-3 w-full mx-auto",[a]),o=useMemo(()=>a?e.sourceTweet:e.tweet,[e,a]),p=useTickAge(o.timestamp);return jsxs("div",{className:cn("flex flex-col gap-1.5 cursor-pointer",l),onClick:()=>{window.open(twitterTweetUrl(o.tweetId),"_blank");},children:[jsx($,{user:o.user,renderTimestamp:a?void 0:jsx("div",{className:"text-xs text-primary",children:formatAge(p)}),renderActions:t}),n,o.content.text&&jsx(X,{content:o.content.text,isExpanded:s,onLoad:()=>m(false)}),o.content.text&&jsx(q,{data:e,embed:a,text:o.content.text,renderActions:jsx(K,{isExpanded:s,onToggleExpand:m})}),jsx("div",{className:cn((!o.content.medias||o.content.medias.length===0)&&"hidden"),children:o.content.medias&&o.content.medias.length>0&&jsx(W,{medias:o.content.medias,tweetHref:twitterTweetUrl(o.tweetId)})}),i,r]})}function te({data:e,headerActions:t,footerActions:r}){return jsx(u,{data:e,headerActions:t,footerActions:r})}function re({data:e,headerActions:t,footerActions:r}){let n=!!e.sourceTweet;return jsx(u,{data:e,headerActions:t,footerActions:r,children:n?jsx(u,{data:e,embed:true}):null})}function ne({data:e,headerActions:t,footerActions:r}){let a=e.sourceTweet,n=!!a,i=useMemo(()=>jsxs("div",{className:"flex items-center gap-2 text-sm",children:[jsx("span",{children:"Replying to"}),n&&jsxs(Link,{className:"text-sm",underline:"hover",target:"_blank",href:twitterUserUrl(a.user.screenName??a.user.username),children:["@",a.user.screenName??a.user.username]})]}),[n,a]);return jsx(u,{data:e,indicator:i,headerActions:t,footerActions:r,children:n?jsx(u,{data:e,embed:true}):null})}function ie({data:e,headerActions:t,footerActions:r}){let a=e.sourceTweet,n=!!a,i=useMemo(()=>jsxs("div",{className:"flex items-center gap-2 text-sm",children:[jsx("span",{children:"Retweeted by"}),n&&jsxs(Link,{className:"text-sm",underline:"hover",target:"_blank",href:twitterUserUrl(a.user.screenName??a.user.username),children:["@",a.user.screenName??a.user.username]})]}),[n,a]);return jsx(u,{data:e,indicator:i,headerActions:t,footerActions:r,children:n?jsx(u,{data:e,embed:true}):null})}function le({data:e,headerActions:t,footerActions:r,embed:a=false,children:n,loading:i=false}){if(i||!e)return jsx(ot,{embed:a});let s=e.tweet.type;return jsx("div",{className:"w-full",children:(()=>{let l={data:e,headerActions:t,footerActions:r,embed:a,children:n};switch(s){case "reply":return jsx(ne,{...l});case "retweet":return jsx(ie,{...l});case "quote":return jsx(re,{...l});default:return jsx(te,{...l})}})()})}function ot({embed:e=false}){return jsxs("div",{className:["flex flex-col gap-2",e?"bg-default-50 rounded-lg p-3 w-full mx-auto":"bg-default-100 rounded-lg p-3 w-full mx-auto"].join(" "),children:[jsxs("div",{className:"flex items-center gap-3",children:[jsx(Skeleton,{className:"w-10 h-10 rounded-full"}),jsxs("div",{className:"flex flex-col gap-1 flex-1",children:[jsx(Skeleton,{className:"h-4 w-24"}),jsx(Skeleton,{className:"h-3 w-16"})]}),jsx(Skeleton,{className:"h-3 w-12"})]}),jsxs("div",{className:"flex flex-col gap-2",children:[jsx(Skeleton,{className:"h-4 w-full"}),jsx(Skeleton,{className:"h-4 w-3/4"}),jsx(Skeleton,{className:"h-4 w-1/2"})]}),jsx(Skeleton,{className:"h-48 w-full rounded-lg"}),jsxs("div",{className:"flex justify-between items-center pt-2",children:[jsxs("div",{className:"flex gap-4",children:[jsx(Skeleton,{className:"h-6 w-16"}),jsx(Skeleton,{className:"h-6 w-16"}),jsx(Skeleton,{className:"h-6 w-16"})]}),jsx(Skeleton,{className:"h-6 w-20"})]})]})}function ce({token:e}){let t=new SafeBigNumber(e.priceChange??"0").isPositive()?"primary":"danger";return jsxs(Button,{color:t,variant:"flat",size:"sm",radius:"full",startContent:jsx(dt,{token:e}),children:[jsx("span",{children:e.symbol}),jsx("span",{children:e.priceChange?formatPercent(Number(e.priceChange)/100):"--"})]})}function dt({token:e}){let t=useMemo(()=>jsx(Image,{className:"w-full h-full",src:e.image,alt:e.chain}),[e.chain]);return jsx(Badge,{className:"w-2.5 h-2.5 p-0 border",size:"sm",content:t,shape:"circle",placement:"bottom-right",children:jsx(Avatar,{className:"w-5 h-5",radius:"full",src:e.image})})}function de({data:e,loading:t,setIsPaused:r,customHeaderActions:a,customFooterActions:n}){let i=useCallback(s=>jsxs("div",{className:"flex gap-2.5 justify-between",children:[s.token&&jsx(ce,{token:s.token}),n?.(s)]}),[n]);return jsx("div",{className:"flex flex-col gap-2.5",onMouseEnter:()=>r(true),onMouseLeave:()=>r(false),children:e.map(s=>jsx(le,{data:s,headerActions:a?.(s),footerActions:i(s),loading:t},s.id))})}function ut(){return jsxs("div",{className:"flex flex-col gap-2 bg-default-100 rounded-lg p-3 w-full mx-auto",children:[jsxs("div",{className:"flex items-center gap-3",children:[jsx(Skeleton,{className:"w-10 h-10 rounded-full"}),jsxs("div",{className:"flex flex-col gap-1 flex-1",children:[jsx(Skeleton,{className:"h-4 w-40 rounded-md"}),jsx(Skeleton,{className:"h-3 w-32 rounded-md"})]})]}),jsxs("div",{className:"flex flex-col gap-2",children:[jsx(Skeleton,{className:"h-4 w-full rounded-md"}),jsx(Skeleton,{className:"h-4 w-3/4 rounded-md"}),jsx(Skeleton,{className:"h-4 w-1/2 rounded-md"})]}),jsx(Skeleton,{className:"h-48 w-full rounded-lg"})]})}function me({count:e=3}){return jsx("div",{className:"flex flex-col gap-2",children:Array.from({length:e}).map((t,r)=>jsx(ut,{},r))})}var pe=()=>{let[e,t]=useState([]),[r,a]=useState(true),[n,i]=useState(false),s=h(),m=useCallback(l=>{t(o=>{let p=o.findIndex(x=>x.id===l.id),d;if(p>=0)d=o.map((x,A)=>A===p?l:x);else {if(n)return o;d=[l,...o];}return d.slice(0,30)}),a(false);},[n]);return useEffect(()=>{let l=s.subscribeTweetMedia({callback:m}),o=s.subscribeTweetMediaToken({callback:m});return ()=>{l.unsubscribe(),o.unsubscribe();}},[s,m]),{medias:e,loading:r,isPaused:n,setIsPaused:i}};function aa({onPauseChange:e,customHeaderActions:t,customFooterActions:r}){let{medias:a,loading:n,isPaused:i,setIsPaused:s}=pe();return useEffect(()=>{e?.(i);},[i,e]),n?jsx(me,{count:3}):jsx(de,{data:a,loading:n,setIsPaused:s,customHeaderActions:t,customFooterActions:r})}function wa({client:e,children:t}){return jsx(b.Provider,{value:{client:e},children:t})}
1
+ import {useBoolean,useTickAge}from'@liberfi.io/hooks';import {Skeleton,Avatar,Link,TranslateIcon,cn,ChevronUpIcon,ChevronDownIcon,Button,Image,Badge}from'@liberfi.io/ui';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {twitterUserUrl,formatAge,twitterTweetUrl,SafeBigNumber,formatPercent}from'@liberfi.io/utils';import {createContext,useMemo,useContext,useState,useCallback,useEffect,useRef}from'react';import {useTranslation}from'@liberfi.io/i18n';import {useMutation}from'@tanstack/react-query';typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/ui-media-track"]="0.1.148");var xe="0.1.148";function O({src:e}){let[t,{setTrue:r}]=useBoolean(false);return e?jsx(Skeleton,{isLoaded:t,className:"w-full h-auto",children:jsx("img",{src:e,className:"w-full h-full object-cover aspect-video",onLoad:()=>{r();}})}):null}function H({src:e}){return e?jsx("div",{className:"w-full h-full overflow-hidden rounded-md mt-2",children:jsx("iframe",{className:"w-full h-full aspect-video",src:e,allowFullScreen:true})}):null}function W({medias:e,tweetHref:t}){let r=e.filter(s=>s.type==="image"),a=e.filter(s=>s.type==="video"),n=()=>a.length?jsx("div",{className:"grid grid-cols-1 gap-[1px] overflow-hidden rounded-md",children:a.map(s=>jsx(H,{src:s.url},s.url))}):null,i=()=>r.length?jsx("div",{className:"grid grid-cols-1 gap-[1px] overflow-hidden rounded-md",children:r.map(s=>jsx(Link,{href:t,target:"_blank",children:jsx(O,{src:s.url})},s.url))}):null;return jsxs("div",{className:"flex flex-col gap-2",children:[n(),i()]})}function D({url:e,name:t="",size:r=36}){let a=useMemo(()=>t?t.slice(0,2):"N/A",[t]);return jsx(Skeleton,{className:"flex rounded-full flex-shrink-0",style:{width:r,height:r},isLoaded:!!e,children:jsx(Avatar,{size:"md",color:"primary",radius:"full",showFallback:true,name:a,src:e,style:{width:r,height:r}})})}function $({user:e,renderTimestamp:t,renderActions:r}){return jsxs("div",{className:"flex items-center justify-between gap-1",children:[jsxs("div",{className:"flex items-center gap-1",children:[jsx(D,{url:e.avatar,name:e.username}),jsxs("div",{className:"flex flex-col gap-0.5",children:[jsxs("div",{className:"flex flex-row items-baseline gap-1",children:[jsx("span",{className:"text-foreground font-semibold truncate leading-none",children:e.username}),t]}),jsxs(Link,{target:"_blank",underline:"hover",className:"text-default-500 text-sm leading-none",href:twitterUserUrl(e.screenName??e.username),children:["@",e.screenName??e.username]})]})]}),r]})}var b=createContext({});function Q(){let e=useContext(b);if(!e)throw new Error("useMediaTrackContext must be used within a MediaTrackProvider");return e}function h(){let{client:e}=Q();return e}function no(e={}){let t=h();return useMutation({mutationFn:async r=>t.generateMeme(r),...e})}async function Ae(e,{media:t,targetLanguage:r,options:a}){return await e.translate(t,r,a)}function Z(e={}){let t=h();return useMutation({mutationFn:async r=>Ae(t,r),...e})}function R(e){let t=/(https?:\/\/[^\s]+|www\.[^\s]+)/gi,r=/#[\w]+/g,a=/\$[A-Za-z][A-Za-z0-9_]*/g,n=[],i;for(;(i=t.exec(e))!==null;)n.push({index:i.index,length:i[0].length,text:i[0],type:"url"});for(;(i=r.exec(e))!==null;){let o=i.index;n.some(d=>o>=d.index&&o<d.index+d.length)||n.push({index:o,length:i[0].length,text:i[0],type:"hashtag"});}for(;(i=a.exec(e))!==null;){let o=i.index;n.some(d=>o>=d.index&&o<d.index+d.length)||n.push({index:o,length:i[0].length,text:i[0],type:"symbol"});}n.sort((o,p)=>o.index-p.index);let s=[],m=0,l=0;return n.forEach(o=>{if(o.index>m&&s.push(e.slice(m,o.index)),o.type==="url"){let p=o.text.startsWith("http")?o.text:`https://${o.text}`;s.push(jsx("a",{href:p,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",onClick:d=>d.stopPropagation(),children:o.text},l++));}else if(o.type==="hashtag"){let d=`https://x.com/hashtag/${o.text.slice(1)}`;s.push(jsx("a",{href:d,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",onClick:x=>x.stopPropagation(),children:o.text},l++));}else o.type==="symbol"&&s.push(jsx("span",{className:"text-primary",children:o.text},l++));m=o.index+o.length;}),m<e.length&&s.push(e.slice(m)),s.length>0?s:[e]}function q({data:e,embed:t,renderActions:r}){let[a,{toggle:n}]=useBoolean(false),{t:i,i18n:s}=useTranslation(),{mutateAsync:m,isPending:l}=Z(),[o,p]=useState(null),d=useCallback(async x=>{if(x.stopPropagation(),n(),!o){let A=await m({media:e,targetLanguage:s.language,options:{sourceTweet:t}}),ue=R(A);p(ue);}},[n,m,e,s.language,o]);return jsxs(Fragment,{children:[jsxs("div",{className:"flex items-center gap-1 text-xs",children:[jsxs("div",{onClick:d,className:"flex items-center gap-0.5 cursor-pointer text-primary hover:text-foreground",children:[jsx(TranslateIcon,{width:"14",height:"14"}),i(a?"mediaTrack.tweets.translate.hide":"mediaTrack.tweets.translate.show")]}),r]}),jsx("div",{className:cn(!a&&"hidden"),onClick:x=>{x.stopPropagation();},children:a&&jsxs("div",{className:"bg-content2 rounded-md p-2 text-default-900 text-sm leading-5",children:[o,l&&jsx(Skeleton,{className:"w-full h-4 rounded-md"})]})})]})}function K({isExpanded:e,onToggleExpand:t}){let{t:r}=useTranslation(),a=()=>e?jsxs(Fragment,{children:[jsx(ChevronUpIcon,{className:"border border-current",width:"12",height:"12"}),"\xA0",r("mediaTrack.tweets.collapse")]}):jsxs(Fragment,{children:[jsx(ChevronDownIcon,{className:"border border-current",width:"12",height:"12"}),"\xA0",r("mediaTrack.tweets.expand")]});return e===void 0?null:jsxs("div",{className:"flex items-center gap-1",children:[jsx("div",{className:"w-px h-2.5 bg-line-300"}),jsx("button",{onClick:n=>{n.stopPropagation(),t?.(!e);},className:"flex items-center text-default-500 hover:text-foreground text-xs",children:a()})]})}function X({content:e,isExpanded:t=false,onLoad:r}){let a=useRef(null),n=useMemo(()=>R(e),[e]);return useEffect(()=>{let i=a.current;!r||!i||i.scrollHeight>i.clientHeight&&r?.();},[t]),jsx("div",{ref:a,className:["text-default-900 text-sm leading-5",t?"":"line-clamp-3"].join(" "),onClick:i=>{i.stopPropagation();},children:n})}function u({data:e,headerActions:t,footerActions:r,embed:a=false,indicator:n,children:i}){let[s,m]=useState(void 0),l=useMemo(()=>a?"bg-default-50 rounded-lg p-3 w-full mx-auto":"bg-default-100 hover:bg-default-200 rounded-lg p-3 w-full mx-auto",[a]),o=useMemo(()=>a?e.sourceTweet:e.tweet,[e,a]),p=useTickAge(o.timestamp);return jsxs("div",{className:cn("flex flex-col gap-1.5 cursor-pointer",l),onClick:()=>{window.open(twitterTweetUrl(o.tweetId),"_blank");},children:[jsx($,{user:o.user,renderTimestamp:a?void 0:jsx("div",{className:"text-xs text-primary",children:formatAge(p)}),renderActions:t}),n,o.content.text&&jsx(X,{content:o.content.text,isExpanded:s,onLoad:()=>m(false)}),o.content.text&&jsx(q,{data:e,embed:a,text:o.content.text,renderActions:jsx(K,{isExpanded:s,onToggleExpand:m})}),jsx("div",{className:cn((!o.content.medias||o.content.medias.length===0)&&"hidden"),children:o.content.medias&&o.content.medias.length>0&&jsx(W,{medias:o.content.medias,tweetHref:twitterTweetUrl(o.tweetId)})}),i,r]})}function te({data:e,headerActions:t,footerActions:r}){return jsx(u,{data:e,headerActions:t,footerActions:r})}function re({data:e,headerActions:t,footerActions:r}){let n=!!e.sourceTweet;return jsx(u,{data:e,headerActions:t,footerActions:r,children:n?jsx(u,{data:e,embed:true}):null})}function ne({data:e,headerActions:t,footerActions:r}){let a=e.sourceTweet,n=!!a,i=useMemo(()=>jsxs("div",{className:"flex items-center gap-2 text-sm",children:[jsx("span",{children:"Replying to"}),n&&jsxs(Link,{className:"text-sm",underline:"hover",target:"_blank",href:twitterUserUrl(a.user.screenName??a.user.username),children:["@",a.user.screenName??a.user.username]})]}),[n,a]);return jsx(u,{data:e,indicator:i,headerActions:t,footerActions:r,children:n?jsx(u,{data:e,embed:true}):null})}function ie({data:e,headerActions:t,footerActions:r}){let a=e.sourceTweet,n=!!a,i=useMemo(()=>jsxs("div",{className:"flex items-center gap-2 text-sm",children:[jsx("span",{children:"Retweeted by"}),n&&jsxs(Link,{className:"text-sm",underline:"hover",target:"_blank",href:twitterUserUrl(a.user.screenName??a.user.username),children:["@",a.user.screenName??a.user.username]})]}),[n,a]);return jsx(u,{data:e,indicator:i,headerActions:t,footerActions:r,children:n?jsx(u,{data:e,embed:true}):null})}function le({data:e,headerActions:t,footerActions:r,embed:a=false,children:n,loading:i=false}){if(i||!e)return jsx(ot,{embed:a});let s=e.tweet.type;return jsx("div",{className:"w-full",children:(()=>{let l={data:e,headerActions:t,footerActions:r,embed:a,children:n};switch(s){case "reply":return jsx(ne,{...l});case "retweet":return jsx(ie,{...l});case "quote":return jsx(re,{...l});default:return jsx(te,{...l})}})()})}function ot({embed:e=false}){return jsxs("div",{className:["flex flex-col gap-2",e?"bg-default-50 rounded-lg p-3 w-full mx-auto":"bg-default-100 rounded-lg p-3 w-full mx-auto"].join(" "),children:[jsxs("div",{className:"flex items-center gap-3",children:[jsx(Skeleton,{className:"w-10 h-10 rounded-full"}),jsxs("div",{className:"flex flex-col gap-1 flex-1",children:[jsx(Skeleton,{className:"h-4 w-24"}),jsx(Skeleton,{className:"h-3 w-16"})]}),jsx(Skeleton,{className:"h-3 w-12"})]}),jsxs("div",{className:"flex flex-col gap-2",children:[jsx(Skeleton,{className:"h-4 w-full"}),jsx(Skeleton,{className:"h-4 w-3/4"}),jsx(Skeleton,{className:"h-4 w-1/2"})]}),jsx(Skeleton,{className:"h-48 w-full rounded-lg"}),jsxs("div",{className:"flex justify-between items-center pt-2",children:[jsxs("div",{className:"flex gap-4",children:[jsx(Skeleton,{className:"h-6 w-16"}),jsx(Skeleton,{className:"h-6 w-16"}),jsx(Skeleton,{className:"h-6 w-16"})]}),jsx(Skeleton,{className:"h-6 w-20"})]})]})}function ce({token:e}){let t=new SafeBigNumber(e.priceChange??"0").isPositive()?"primary":"danger";return jsxs(Button,{color:t,variant:"flat",size:"sm",radius:"full",startContent:jsx(dt,{token:e}),children:[jsx("span",{children:e.symbol}),jsx("span",{children:e.priceChange?formatPercent(Number(e.priceChange)/100):"--"})]})}function dt({token:e}){let t=useMemo(()=>jsx(Image,{className:"w-full h-full",src:e.image,alt:e.chain}),[e.chain]);return jsx(Badge,{className:"w-2.5 h-2.5 p-0 border",size:"sm",content:t,shape:"circle",placement:"bottom-right",children:jsx(Avatar,{className:"w-5 h-5",radius:"full",src:e.image})})}function de({data:e,loading:t,setIsPaused:r,customHeaderActions:a,customFooterActions:n}){let i=useCallback(s=>jsxs("div",{className:"flex gap-2.5 justify-between",children:[s.token&&jsx(ce,{token:s.token}),n?.(s)]}),[n]);return jsx("div",{className:"flex flex-col gap-2.5",onMouseEnter:()=>r(true),onMouseLeave:()=>r(false),children:e.map(s=>jsx(le,{data:s,headerActions:a?.(s),footerActions:i(s),loading:t},s.id))})}function ut(){return jsxs("div",{className:"flex flex-col gap-2 bg-default-100 rounded-lg p-3 w-full mx-auto",children:[jsxs("div",{className:"flex items-center gap-3",children:[jsx(Skeleton,{className:"w-10 h-10 rounded-full"}),jsxs("div",{className:"flex flex-col gap-1 flex-1",children:[jsx(Skeleton,{className:"h-4 w-40 rounded-md"}),jsx(Skeleton,{className:"h-3 w-32 rounded-md"})]})]}),jsxs("div",{className:"flex flex-col gap-2",children:[jsx(Skeleton,{className:"h-4 w-full rounded-md"}),jsx(Skeleton,{className:"h-4 w-3/4 rounded-md"}),jsx(Skeleton,{className:"h-4 w-1/2 rounded-md"})]}),jsx(Skeleton,{className:"h-48 w-full rounded-lg"})]})}function me({count:e=3}){return jsx("div",{className:"flex flex-col gap-2",children:Array.from({length:e}).map((t,r)=>jsx(ut,{},r))})}var pe=()=>{let[e,t]=useState([]),[r,a]=useState(true),[n,i]=useState(false),s=h(),m=useCallback(l=>{t(o=>{let p=o.findIndex(x=>x.id===l.id),d;if(p>=0)d=o.map((x,A)=>A===p?l:x);else {if(n)return o;d=[l,...o];}return d.slice(0,30)}),a(false);},[n]);return useEffect(()=>{let l=s.subscribeTweetMedia({callback:m}),o=s.subscribeTweetMediaToken({callback:m});return ()=>{l.unsubscribe(),o.unsubscribe();}},[s,m]),{medias:e,loading:r,isPaused:n,setIsPaused:i}};function aa({onPauseChange:e,customHeaderActions:t,customFooterActions:r}){let{medias:a,loading:n,isPaused:i,setIsPaused:s}=pe();return useEffect(()=>{e?.(i);},[i,e]),n?jsx(me,{count:3}):jsx(de,{data:a,loading:n,setIsPaused:s,customHeaderActions:t,customFooterActions:r})}function wa({client:e,children:t}){return jsx(b.Provider,{value:{client:e},children:t})}
2
2
  export{O as MediaImage,b as MediaTrackContext,wa as MediaTrackProvider,H as MediaVideo,W as Medias,K as TextExpand,q as Translate,le as TweetItem,te as TweetOriginal,re as TweetQuote,ne as TweetReply,ie as TweetRetweet,ut as TweetSkeleton,me as TweetSkeletonList,u as TweetSource,de as Tweets,aa as TweetsWidget,D as UserAvatar,$ as UserInfo,Ae as translateTweetMedia,no as useGenerateTweetMediaMemeMutation,h as useMediaTrackClient,Q as useMediaTrackContext,Z as useTranslateTweetMediaMutation,pe as useTweets,xe as version};//# sourceMappingURL=index.mjs.map
3
3
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/components/tweets/tweet/media/media-image.tsx","../src/components/tweets/tweet/media/media-video.tsx","../src/components/tweets/tweet/media/medias.tsx","../src/components/tweets/tweet/user/user-avatar.tsx","../src/components/tweets/tweet/user/user-info.tsx","../src/context/MediaTrackContext.ts","../src/hooks/useMediaTrackContext.ts","../src/hooks/useMediaTrackClient.ts","../src/hooks/useGenerateTweetMediaMemeMutation.ts","../src/hooks/useTranslateTweetMediaQuery.ts","../src/utils/parseText.tsx","../src/components/tweets/tweet/tools/translate.tsx","../src/components/tweets/tweet/tools/text-expand.tsx","../src/components/tweets/tweet/content/index.tsx","../src/components/tweets/tweet/tweet-source.tsx","../src/components/tweets/tweet/tweet-original.tsx","../src/components/tweets/tweet/tweet-quote.tsx","../src/components/tweets/tweet/tweet-reply.tsx","../src/components/tweets/tweet/tweet-retweet.tsx","../src/components/tweets/tweet/tweet-item.tsx","../src/components/tweets/tweet/tools/tweet-token-button.tsx","../src/components/tweets/tweets.ui.tsx","../src/components/tweets/tweet/tweet-skeleton.tsx","../src/components/tweets/tweets.script.ts","../src/components/tweets/tweets.widget.tsx","../src/providers/MediaTrackProvider.tsx"],"names":["version_default","MediaImage","src","isLoaded","setTrue","useBoolean","jsx","Skeleton","MediaVideo","Medias","medias","tweetHref","images","media","videos","renderVideos","video","renderImages","image","Link","jsxs","UserAvatar","url","name","size","fallbackName","useMemo","Avatar","UserInfo","user","renderTimestamp","renderActions","twitterUserUrl","MediaTrackContext","createContext","useMediaTrackContext","context","useContext","useMediaTrackClient","client","useGenerateTweetMediaMemeMutation","options","useMutation","params","translateTweetMedia","targetLanguage","useTranslateTweetMediaMutation","parseText","text","urlRegex","hashtagRegex","symbolRegex","matches","match","matchIndex","m","a","b","parts","lastIndex","key","item","e","hashtagUrl","Translate","data","embed","isTranslate","toggle","t","i18n","useTranslation","isTranslating","translatedText","setTranslatedText","useState","handleTranslate","useCallback","parsedText","Fragment","TranslateIcon","cn","TextExpand","isExpanded","onToggleExpand","renderExpand","ChevronUpIcon","ChevronDownIcon","Content","content","onLoad","ref","useRef","parsedContent","useEffect","current","TweetSource","headerActions","footerActions","indicator","children","setIsExpanded","containerClass","tweet","age","useTickAge","twitterTweetUrl","formatAge","TweetOriginal","TweetQuote","hasSource","TweetReply","sourceTweet","TweetRetweet","TweetItem","loading","TweetSkeleton","tweetType","commonProps","TweetTokenButton","token","color","SafeBigNumber","Button","TweetTokenIcon","formatPercent","ChainIcon","Image","Badge","Tweets","setIsPaused","customHeaderActions","customFooterActions","TweetSkeletonList","count","_","index","useTweets","setMedias","setLoading","isPaused","handleMedia","prevMedias","idx","it","newMedias","subTweet","subTweetToken","TweetsWidget","onPauseChange","MediaTrackProvider"],"mappings":"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","file":"index.mjs","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-media-track\"] = \"0.1.146\";\n}\n\nexport default \"0.1.146\";\n","import { useBoolean } from \"@liberfi.io/hooks\";\nimport { Skeleton } from \"@liberfi.io/ui\";\n\ntype Props = {\n src: string;\n};\n\n// ------------------------------------------------------------\nexport function MediaImage({ src }: Props) {\n const [isLoaded, { setTrue }] = useBoolean(false);\n if (!src) return null;\n\n return (\n <Skeleton isLoaded={isLoaded} className=\"w-full h-auto\">\n <img\n src={src}\n className=\"w-full h-full object-cover aspect-video\"\n onLoad={() => {\n setTrue();\n }}\n />\n </Skeleton>\n );\n}\n","type Props = {\n src: string;\n};\n\n// ------------------------------------------------------------\nexport function MediaVideo({ src }: Props) {\n if (!src) return null;\n\n return (\n <div className=\"w-full h-full overflow-hidden rounded-md mt-2\">\n <iframe\n className=\"w-full h-full aspect-video\"\n src={src}\n allowFullScreen\n />\n </div>\n );\n}\n","import { Link } from \"@liberfi.io/ui\";\nimport { TweetContentMedia } from \"../../../../types\";\nimport { MediaImage } from \"./media-image\";\nimport { MediaVideo } from \"./media-video\";\n\ntype Props = {\n medias: Array<TweetContentMedia>;\n tweetHref: string;\n};\n\nexport function Medias({ medias, tweetHref }: Props) {\n const images = medias.filter((media) => media.type === \"image\");\n const videos = medias.filter((media) => media.type === \"video\");\n\n const renderVideos = () => {\n if (!videos.length) return null;\n return (\n <div className={`grid grid-cols-1 gap-[1px] overflow-hidden rounded-md`}>\n {videos.map((video) => (\n <MediaVideo key={video.url} src={video.url} />\n ))}\n </div>\n );\n };\n\n const renderImages = () => {\n if (!images.length) return null;\n return (\n <div className={`grid grid-cols-1 gap-[1px] overflow-hidden rounded-md`}>\n {images.map((image) => (\n <Link key={image.url} href={tweetHref} target=\"_blank\">\n <MediaImage src={image.url} />\n </Link>\n ))}\n </div>\n );\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {renderVideos()}\n {renderImages()}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { Avatar, Skeleton } from \"@liberfi.io/ui\";\n\ntype Props = {\n url?: string;\n name?: string;\n size?: number;\n};\n\nexport function UserAvatar({ url, name = \"\", size = 36 }: Props) {\n const fallbackName = useMemo(() => (name ? name.slice(0, 2) : \"N/A\"), [name]);\n\n return (\n <Skeleton\n className=\"flex rounded-full flex-shrink-0\"\n style={{ width: size, height: size }}\n isLoaded={!!url}\n >\n <Avatar\n size=\"md\"\n color=\"primary\"\n radius=\"full\"\n showFallback\n name={fallbackName}\n src={url}\n style={{ width: size, height: size }}\n />\n </Skeleton>\n );\n}\n","import React from \"react\";\nimport { Link } from \"@liberfi.io/ui\";\nimport { twitterUserUrl } from \"@liberfi.io/utils\";\nimport { TweetUser } from \"../../../../types\";\nimport { UserAvatar } from \"./user-avatar\";\n\ntype Props = {\n user: TweetUser;\n renderTimestamp?: React.ReactNode;\n renderActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function UserInfo({ user, renderTimestamp, renderActions }: Props) {\n return (\n <div className=\"flex items-center justify-between gap-1\">\n <div className=\"flex items-center gap-1\">\n <UserAvatar url={user.avatar} name={user.username} />\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"flex flex-row items-baseline gap-1\">\n <span className=\"text-foreground font-semibold truncate leading-none\">\n {user.username}\n </span>\n {renderTimestamp}\n </div>\n <Link\n target=\"_blank\"\n underline=\"hover\"\n className=\"text-default-500 text-sm leading-none\"\n href={twitterUserUrl(user.screenName ?? user.username)}\n >\n @{user.screenName ?? user.username}\n </Link>\n </div>\n </div>\n {renderActions}\n </div>\n );\n}\n","import { createContext } from \"react\";\nimport { IMediaTrackClient } from \"../types\";\n\nexport interface MediaTrackContextValue {\n client: IMediaTrackClient;\n}\n\nexport const MediaTrackContext = createContext<MediaTrackContextValue>(\n {} as MediaTrackContextValue,\n);\n","import { useContext } from \"react\";\nimport { MediaTrackContext } from \"../context\";\n\nexport function useMediaTrackContext() {\n const context = useContext(MediaTrackContext);\n if (!context) {\n throw new Error(\n \"useMediaTrackContext must be used within a MediaTrackProvider\",\n );\n }\n return context;\n}\n","import { useMediaTrackContext } from \"./useMediaTrackContext\";\n\nexport function useMediaTrackClient() {\n const { client } = useMediaTrackContext();\n return client;\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport { GeneratedMemeInfo, TweetMedia } from \"../types\";\nimport { useMediaTrackClient } from \"./useMediaTrackClient\";\n\nexport function useGenerateTweetMediaMemeMutation(\n options: Omit<\n UseMutationOptions<GeneratedMemeInfo, Error, TweetMedia, string[]>,\n \"mutationFn\"\n > = {},\n) {\n const client = useMediaTrackClient();\n return useMutation({\n mutationFn: async (params: TweetMedia) => client.generateMeme(params),\n ...options,\n });\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport { LocaleCode } from \"@liberfi.io/i18n\";\nimport { IMediaTrackClient, TweetMedia } from \"../types\";\nimport { useMediaTrackClient } from \"./useMediaTrackClient\";\n\nexport interface UseTranslateTweetMediaParams {\n media: TweetMedia;\n targetLanguage: LocaleCode;\n options?: {\n sourceLanguage?: LocaleCode;\n sourceTweet?: boolean;\n };\n}\n\nexport async function translateTweetMedia(\n client: IMediaTrackClient,\n { media, targetLanguage, options }: UseTranslateTweetMediaParams,\n) {\n return await client.translate(media, targetLanguage, options);\n}\n\nexport function useTranslateTweetMediaMutation(\n options: Omit<\n UseMutationOptions<string, Error, UseTranslateTweetMediaParams>,\n \"mutationFn\"\n > = {},\n) {\n const client = useMediaTrackClient();\n return useMutation({\n mutationFn: async (params: UseTranslateTweetMediaParams) =>\n translateTweetMedia(client, params),\n ...options,\n });\n}\n","interface MatchItem {\n index: number;\n length: number;\n text: string;\n type: \"url\" | \"hashtag\" | \"symbol\";\n}\n\nexport function parseText(text: string): (string | React.ReactElement)[] {\n const urlRegex = /(https?:\\/\\/[^\\s]+|www\\.[^\\s]+)/gi;\n const hashtagRegex = /#[\\w]+/g;\n const symbolRegex = /\\$[A-Za-z][A-Za-z0-9_]*/g;\n\n const matches: MatchItem[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = urlRegex.exec(text)) !== null) {\n matches.push({\n index: match.index,\n length: match[0].length,\n text: match[0],\n type: \"url\",\n });\n }\n\n while ((match = hashtagRegex.exec(text)) !== null) {\n const matchIndex = match.index;\n const overlaps = matches.some(\n (m) => matchIndex >= m.index && matchIndex < m.index + m.length,\n );\n if (!overlaps) {\n matches.push({\n index: matchIndex,\n length: match[0].length,\n text: match[0],\n type: \"hashtag\",\n });\n }\n }\n\n while ((match = symbolRegex.exec(text)) !== null) {\n const matchIndex = match.index;\n const overlaps = matches.some(\n (m) => matchIndex >= m.index && matchIndex < m.index + m.length,\n );\n if (!overlaps) {\n matches.push({\n index: matchIndex,\n length: match[0].length,\n text: match[0],\n type: \"symbol\",\n });\n }\n }\n\n matches.sort((a, b) => a.index - b.index);\n\n const parts: (string | React.ReactElement)[] = [];\n let lastIndex = 0;\n let key = 0;\n\n matches.forEach((item) => {\n if (item.index > lastIndex) {\n parts.push(text.slice(lastIndex, item.index));\n }\n\n if (item.type === \"url\") {\n const url = item.text.startsWith(\"http\")\n ? item.text\n : `https://${item.text}`;\n parts.push(\n <a\n key={key++}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {item.text}\n </a>,\n );\n } else if (item.type === \"hashtag\") {\n const hashtag = item.text.slice(1); // 移除 #\n const hashtagUrl = `https://x.com/hashtag/${hashtag}`;\n parts.push(\n <a\n key={key++}\n href={hashtagUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {item.text}\n </a>,\n );\n } else if (item.type === \"symbol\") {\n parts.push(\n <span key={key++} className=\"text-primary\">\n {item.text}\n </span>,\n );\n }\n\n lastIndex = item.index + item.length;\n });\n\n if (lastIndex < text.length) {\n parts.push(text.slice(lastIndex));\n }\n\n return parts.length > 0 ? parts : [text];\n}\n","import React, { MouseEvent, useCallback, useState } from \"react\";\nimport { useBoolean } from \"@liberfi.io/hooks\";\nimport { LocaleCode, useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Skeleton, TranslateIcon } from \"@liberfi.io/ui\";\nimport { useTranslateTweetMediaMutation } from \"../../../../hooks\";\nimport { TweetMedia } from \"../../../../types\";\nimport { parseText } from \"../../../../utils\";\n\ntype Props = {\n data: TweetMedia;\n embed?: boolean;\n text: string;\n renderActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function Translate({ data, embed, renderActions }: Props) {\n const [isTranslate, { toggle }] = useBoolean(false);\n\n const { t, i18n } = useTranslation();\n\n const { mutateAsync: translateTweetMedia, isPending: isTranslating } =\n useTranslateTweetMediaMutation();\n\n const [translatedText, setTranslatedText] = useState<\n (string | React.ReactElement)[] | null\n >(null);\n\n const handleTranslate = useCallback(\n async (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n toggle();\n if (!translatedText) {\n const text = await translateTweetMedia({\n media: data,\n targetLanguage: i18n.language as LocaleCode,\n options: {\n sourceTweet: embed,\n },\n });\n const parsedText = parseText(text);\n setTranslatedText(parsedText);\n }\n },\n [toggle, translateTweetMedia, data, i18n.language, translatedText],\n );\n\n return (\n <>\n <div className=\"flex items-center gap-1 text-xs\">\n <div\n onClick={handleTranslate}\n className=\"flex items-center gap-0.5 cursor-pointer text-primary hover:text-foreground\"\n >\n <TranslateIcon width=\"14\" height=\"14\" />\n {isTranslate\n ? t(\"mediaTrack.tweets.translate.hide\")\n : t(\"mediaTrack.tweets.translate.show\")}\n </div>\n {renderActions}\n </div>\n <div\n className={cn(!isTranslate && \"hidden\")}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n {isTranslate && (\n <div className=\"bg-content2 rounded-md p-2 text-default-900 text-sm leading-5\">\n {translatedText}\n {isTranslating && <Skeleton className=\"w-full h-4 rounded-md\" />}\n </div>\n )}\n </div>\n </>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"@liberfi.io/ui\";\n\ntype Props = {\n isExpanded?: boolean;\n onToggleExpand?: (expanded: boolean) => void;\n};\n\nexport function TextExpand({ isExpanded, onToggleExpand }: Props) {\n const { t } = useTranslation();\n const renderExpand = () => {\n if (isExpanded) {\n return (\n <>\n <ChevronUpIcon\n className=\"border border-current\"\n width=\"12\"\n height=\"12\"\n />\n &nbsp;{t(\"mediaTrack.tweets.collapse\")}\n </>\n );\n }\n\n return (\n <>\n <ChevronDownIcon\n className=\"border border-current\"\n width=\"12\"\n height=\"12\"\n />\n &nbsp;{t(\"mediaTrack.tweets.expand\")}\n </>\n );\n };\n\n if (isExpanded === undefined) return null;\n\n return (\n <div className=\"flex items-center gap-1\">\n <div className=\"w-px h-2.5 bg-line-300\" />\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggleExpand?.(!isExpanded);\n }}\n className=\"flex items-center text-default-500 hover:text-foreground text-xs\"\n >\n {renderExpand()}\n </button>\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { parseText } from \"../../../../utils\";\n\ntype Props = {\n content: string;\n isExpanded?: boolean;\n onLoad?: () => void;\n};\n\n// ------------------------------------------------------------\nexport function Content({ content, isExpanded = false, onLoad }: Props) {\n const ref = useRef<HTMLDivElement>(null);\n\n const parsedContent = useMemo(() => parseText(content), [content]);\n\n useEffect(() => {\n const current = ref.current;\n if (!onLoad || !current) return;\n if (current.scrollHeight > current.clientHeight) {\n onLoad?.();\n }\n }, [isExpanded]);\n\n return (\n <div\n ref={ref}\n className={[\n \"text-default-900 text-sm leading-5\",\n !isExpanded ? \"line-clamp-3\" : \"\",\n ].join(\" \")}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n {parsedContent}\n </div>\n );\n}\n","import React, { useMemo, useState } from \"react\";\nimport { useTickAge } from \"@liberfi.io/hooks\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { formatAge, twitterTweetUrl } from \"@liberfi.io/utils\";\nimport { Tweet, TweetMedia } from \"../../../types\";\nimport { Content } from \"./content\";\nimport { Medias } from \"./media\";\nimport { Translate, TextExpand } from \"./tools\";\nimport { UserInfo } from \"./user\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n embed?: boolean;\n indicator?: React.ReactNode;\n children?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetSource({\n data,\n headerActions,\n footerActions,\n embed = false,\n indicator,\n children,\n}: Props) {\n const [isExpanded, setIsExpanded] = useState<boolean | undefined>(undefined);\n\n const containerClass = useMemo(() => {\n return embed\n ? \"bg-default-50 rounded-lg p-3 w-full mx-auto\"\n : \"bg-default-100 hover:bg-default-200 rounded-lg p-3 w-full mx-auto\";\n }, [embed]);\n\n const tweet = useMemo(\n () => (embed ? data.sourceTweet! : data.tweet),\n [data, embed],\n );\n\n const age = useTickAge((tweet as Tweet).timestamp);\n\n return (\n <div\n className={cn(\"flex flex-col gap-1.5 cursor-pointer\", containerClass)}\n onClick={() => {\n window.open(twitterTweetUrl(tweet.tweetId), \"_blank\");\n }}\n >\n {/* -------- USER INFO -------- */}\n <UserInfo\n user={tweet.user}\n renderTimestamp={\n embed ? undefined : (\n <div className=\"text-xs text-primary\">{formatAge(age)}</div>\n )\n }\n renderActions={headerActions}\n />\n\n {/* -------- MESSAGE TYPE INDICATOR -------- */}\n {indicator}\n\n {/* -------- CONTENT -------- */}\n {tweet.content.text && (\n <Content\n content={tweet.content.text}\n isExpanded={isExpanded}\n onLoad={() => setIsExpanded(false)}\n />\n )}\n\n {/* -------- TOOLS -------- */}\n {tweet.content.text && (\n <Translate\n data={data}\n embed={embed}\n text={tweet.content.text}\n renderActions={\n <TextExpand\n isExpanded={isExpanded}\n onToggleExpand={setIsExpanded}\n />\n }\n />\n )}\n\n {/* -------- MEDIA -------- */}\n <div\n className={cn(\n (!tweet.content.medias || tweet.content.medias.length === 0) &&\n \"hidden\",\n )}\n >\n {tweet.content.medias && tweet.content.medias.length > 0 && (\n <Medias\n medias={tweet.content.medias}\n tweetHref={twitterTweetUrl(tweet.tweetId)}\n />\n )}\n </div>\n\n {/* -------- CHILDREN -------- */}\n {children}\n\n {/* -------- Custom ACTIONS -------- */}\n {footerActions}\n </div>\n );\n}\n","import React from \"react\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetOriginal({ data, headerActions, footerActions }: Props) {\n return (\n <TweetSource\n data={data}\n headerActions={headerActions}\n footerActions={footerActions}\n />\n );\n}\n","import React from \"react\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetQuote({ data, headerActions, footerActions }: Props) {\n const sourceTweet = data.sourceTweet;\n const hasSource = !!sourceTweet;\n\n return (\n <TweetSource\n data={data}\n headerActions={headerActions}\n footerActions={footerActions}\n >\n {hasSource ? <TweetSource data={data} embed /> : null}\n </TweetSource>\n );\n}\n","import React, { useMemo } from \"react\";\nimport { Link } from \"@liberfi.io/ui\";\nimport { twitterUserUrl } from \"@liberfi.io/utils\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetReply({ data, headerActions, footerActions }: Props) {\n const sourceTweet = data.sourceTweet;\n const hasSource = !!sourceTweet;\n\n const indicator = useMemo(\n () => (\n <div className=\"flex items-center gap-2 text-sm\">\n <span>Replying to</span>\n {hasSource && (\n <Link\n className=\"text-sm\"\n underline=\"hover\"\n target=\"_blank\"\n href={twitterUserUrl(\n sourceTweet.user.screenName ?? sourceTweet.user.username,\n )}\n >\n @{sourceTweet.user.screenName ?? sourceTweet.user.username}\n </Link>\n )}\n </div>\n ),\n [hasSource, sourceTweet],\n );\n\n return (\n <TweetSource\n data={data}\n indicator={indicator}\n headerActions={headerActions}\n footerActions={footerActions}\n >\n {hasSource ? <TweetSource data={data} embed /> : null}\n </TweetSource>\n );\n}\n","import React, { useMemo } from \"react\";\nimport { Link } from \"@liberfi.io/ui\";\nimport { twitterUserUrl } from \"@liberfi.io/utils\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetRetweet({ data, headerActions, footerActions }: Props) {\n const sourceTweet = data.sourceTweet;\n const hasSource = !!sourceTweet;\n\n const indicator = useMemo(\n () => (\n <div className=\"flex items-center gap-2 text-sm\">\n <span>Retweeted by</span>\n {hasSource && (\n <Link\n className=\"text-sm\"\n underline=\"hover\"\n target=\"_blank\"\n href={twitterUserUrl(\n sourceTweet.user.screenName ?? sourceTweet.user.username,\n )}\n >\n @{sourceTweet.user.screenName ?? sourceTweet.user.username}\n </Link>\n )}\n </div>\n ),\n [hasSource, sourceTweet],\n );\n\n return (\n <TweetSource\n data={data}\n indicator={indicator}\n headerActions={headerActions}\n footerActions={footerActions}\n >\n {hasSource ? <TweetSource data={data} embed /> : null}\n </TweetSource>\n );\n}\n","import React from \"react\";\nimport { Skeleton } from \"@liberfi.io/ui\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetOriginal } from \"./tweet-original\";\nimport { TweetQuote } from \"./tweet-quote\";\nimport { TweetReply } from \"./tweet-reply\";\nimport { TweetRetweet } from \"./tweet-retweet\";\n\ntype Props = {\n data?: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n embed?: boolean;\n children?: React.ReactNode;\n loading?: boolean;\n};\n\n// ------------------------------------------------------------\nexport function TweetItem({\n data,\n headerActions,\n footerActions,\n embed = false,\n children,\n loading = false,\n}: Props) {\n if (loading || !data) {\n return <TweetSkeleton embed={embed} />;\n }\n\n const tweetType = data.tweet.type;\n\n // Render appropriate component based on tweet type\n const renderTweetComponent = () => {\n const commonProps = {\n data,\n headerActions,\n footerActions,\n embed,\n children,\n };\n\n switch (tweetType) {\n case \"reply\":\n return <TweetReply {...commonProps} />;\n case \"retweet\":\n return <TweetRetweet {...commonProps} />;\n case \"quote\":\n return <TweetQuote {...commonProps} />;\n default: // \"original\"\n return <TweetOriginal {...commonProps} />;\n }\n };\n\n return <div className=\"w-full\">{renderTweetComponent()}</div>;\n}\n\n// ------------------------------------------------------------\nfunction TweetSkeleton({ embed = false }: { embed?: boolean }) {\n const containerClass = embed\n ? \"bg-default-50 rounded-lg p-3 w-full mx-auto\"\n : \"bg-default-100 rounded-lg p-3 w-full mx-auto\";\n\n return (\n <div className={[\"flex flex-col gap-2\", containerClass].join(\" \")}>\n {/* User Info Skeleton */}\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"w-10 h-10 rounded-full\" />\n <div className=\"flex flex-col gap-1 flex-1\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-16\" />\n </div>\n <Skeleton className=\"h-3 w-12\" />\n </div>\n\n {/* Content Skeleton */}\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n\n {/* Media Skeleton */}\n <Skeleton className=\"h-48 w-full rounded-lg\" />\n\n {/* Actions Skeleton */}\n <div className=\"flex justify-between items-center pt-2\">\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-6 w-16\" />\n <Skeleton className=\"h-6 w-16\" />\n <Skeleton className=\"h-6 w-16\" />\n </div>\n <Skeleton className=\"h-6 w-20\" />\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { Avatar, Badge, Button, Image } from \"@liberfi.io/ui\";\nimport { formatPercent, SafeBigNumber } from \"@liberfi.io/utils\";\nimport { MediaToken } from \"../../../../types\";\n\ntype Props = {\n token: MediaToken;\n};\n\nexport function TweetTokenButton({ token }: Props) {\n const color = new SafeBigNumber(token.priceChange ?? \"0\").isPositive()\n ? \"primary\"\n : \"danger\";\n\n return (\n <Button\n color={color}\n variant=\"flat\"\n size=\"sm\"\n radius=\"full\"\n startContent={<TweetTokenIcon token={token} />}\n >\n <span>{token.symbol}</span>\n <span>\n {token.priceChange\n ? formatPercent(Number(token.priceChange) / 100)\n : \"--\"}\n </span>\n </Button>\n );\n}\n\nexport function TweetTokenIcon({ token }: Props) {\n const ChainIcon = useMemo(() => {\n return (\n <Image className=\"w-full h-full\" src={token.image} alt={token.chain} />\n );\n }, [token.chain]);\n\n return (\n <Badge\n className=\"w-2.5 h-2.5 p-0 border\"\n size=\"sm\"\n content={ChainIcon}\n shape=\"circle\"\n placement=\"bottom-right\"\n >\n <Avatar className=\"w-5 h-5\" radius=\"full\" src={token.image} />\n </Badge>\n );\n}\n","import { useCallback } from \"react\";\nimport { TweetMedia } from \"../../types\";\nimport { TweetTokenButton } from \"./tweet/tools/tweet-token-button\";\n// import { TweetTradeButton } from \"./tweet/tools/tweet-trade-button\";\nimport { TweetItem } from \"./tweet/tweet-item\";\n\ntype TweetsProps = {\n data: Array<TweetMedia>;\n loading: boolean;\n setIsPaused: (paused: boolean) => void;\n customHeaderActions?: (item: TweetMedia) => React.ReactNode;\n customFooterActions?: (item: TweetMedia) => React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function Tweets({\n data,\n loading,\n setIsPaused,\n customHeaderActions,\n customFooterActions,\n}: TweetsProps) {\n const footerActions = useCallback(\n (item: TweetMedia) => (\n <div className=\"flex gap-2.5 justify-between\">\n {item.token && <TweetTokenButton token={item.token} />}\n {customFooterActions?.(item)}\n {/* {item.token && <TweetTradeButton token={item.token} />} */}\n </div>\n ),\n [customFooterActions],\n );\n\n return (\n <div\n className=\"flex flex-col gap-2.5\"\n onMouseEnter={() => setIsPaused(true)}\n onMouseLeave={() => setIsPaused(false)}\n >\n {data.map((item: TweetMedia) => (\n <TweetItem\n key={item.id}\n data={item}\n headerActions={customHeaderActions?.(item)}\n footerActions={footerActions(item)}\n loading={loading}\n />\n ))}\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\n// ------------------------------------------------------------\nexport function TweetSkeleton() {\n return (\n <div className=\"flex flex-col gap-2 bg-default-100 rounded-lg p-3 w-full mx-auto\">\n {/* User Info Skeleton */}\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"w-10 h-10 rounded-full\" />\n <div className=\"flex flex-col gap-1 flex-1\">\n <Skeleton className=\"h-4 w-40 rounded-md\" />\n <Skeleton className=\"h-3 w-32 rounded-md\" />\n </div>\n </div>\n\n {/* Content Skeleton */}\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-full rounded-md\" />\n <Skeleton className=\"h-4 w-3/4 rounded-md\" />\n <Skeleton className=\"h-4 w-1/2 rounded-md\" />\n </div>\n\n {/* Media Skeleton */}\n <Skeleton className=\"h-48 w-full rounded-lg\" />\n </div>\n );\n}\n\nexport function TweetSkeletonList({ count = 3 }: { count: number }) {\n return (\n <div className=\"flex flex-col gap-2\">\n {Array.from({ length: count }).map((_, index) => (\n <TweetSkeleton key={index} />\n ))}\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useMediaTrackClient } from \"../../hooks\";\nimport { TweetMedia } from \"../../types\";\n\nexport const useTweets = () => {\n const [medias, setMedias] = useState<Array<TweetMedia>>([]);\n const [loading, setLoading] = useState(true);\n const [isPaused, setIsPaused] = useState(false);\n\n const client = useMediaTrackClient();\n\n const handleMedia = useCallback(\n (media: TweetMedia) => {\n setMedias((prevMedias) => {\n const idx = prevMedias.findIndex((it) => it.id === media.id);\n let newMedias: Array<TweetMedia>;\n\n if (idx >= 0) {\n newMedias = prevMedias.map((item, index) =>\n index === idx ? media : item,\n );\n } else {\n if (isPaused) {\n return prevMedias;\n }\n newMedias = [media, ...prevMedias];\n }\n\n return newMedias.slice(0, 30);\n });\n setLoading(false);\n },\n [isPaused],\n );\n\n useEffect(() => {\n const subTweet = client.subscribeTweetMedia({ callback: handleMedia });\n const subTweetToken = client.subscribeTweetMediaToken({\n callback: handleMedia,\n });\n return () => {\n subTweet.unsubscribe();\n subTweetToken.unsubscribe();\n };\n }, [client, handleMedia]);\n\n return { medias, loading, isPaused, setIsPaused };\n};\n","import { useEffect } from \"react\";\nimport { TweetMedia } from \"../../types\";\nimport { TweetSkeletonList } from \"./tweet/tweet-skeleton\";\nimport { useTweets } from \"./tweets.script\";\nimport { Tweets } from \"./tweets.ui\";\n\n// ------------------------------------------------------------\nexport type TweetsWidgetProps = {\n onPauseChange?: (paused: boolean) => void;\n customHeaderActions?: (item: TweetMedia) => React.ReactNode;\n customFooterActions?: (item: TweetMedia) => React.ReactNode;\n};\n\nexport function TweetsWidget({\n onPauseChange,\n customHeaderActions,\n customFooterActions,\n}: TweetsWidgetProps) {\n const { medias, loading, isPaused, setIsPaused } = useTweets();\n\n useEffect(() => {\n onPauseChange?.(isPaused);\n }, [isPaused, onPauseChange]);\n\n if (loading) {\n return <TweetSkeletonList count={3} />;\n }\n\n return (\n <Tweets\n data={medias}\n loading={loading}\n setIsPaused={setIsPaused}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { MediaTrackContext } from \"../context\";\nimport { IMediaTrackClient } from \"../types\";\n\nexport type MediaTrackProviderProps = PropsWithChildren<{\n client: IMediaTrackClient;\n}>;\n\nexport function MediaTrackProvider({\n client,\n children,\n}: MediaTrackProviderProps) {\n return (\n <MediaTrackContext.Provider value={{ client }}>\n {children}\n </MediaTrackContext.Provider>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/version.ts","../src/components/tweets/tweet/media/media-image.tsx","../src/components/tweets/tweet/media/media-video.tsx","../src/components/tweets/tweet/media/medias.tsx","../src/components/tweets/tweet/user/user-avatar.tsx","../src/components/tweets/tweet/user/user-info.tsx","../src/context/MediaTrackContext.ts","../src/hooks/useMediaTrackContext.ts","../src/hooks/useMediaTrackClient.ts","../src/hooks/useGenerateTweetMediaMemeMutation.ts","../src/hooks/useTranslateTweetMediaQuery.ts","../src/utils/parseText.tsx","../src/components/tweets/tweet/tools/translate.tsx","../src/components/tweets/tweet/tools/text-expand.tsx","../src/components/tweets/tweet/content/index.tsx","../src/components/tweets/tweet/tweet-source.tsx","../src/components/tweets/tweet/tweet-original.tsx","../src/components/tweets/tweet/tweet-quote.tsx","../src/components/tweets/tweet/tweet-reply.tsx","../src/components/tweets/tweet/tweet-retweet.tsx","../src/components/tweets/tweet/tweet-item.tsx","../src/components/tweets/tweet/tools/tweet-token-button.tsx","../src/components/tweets/tweets.ui.tsx","../src/components/tweets/tweet/tweet-skeleton.tsx","../src/components/tweets/tweets.script.ts","../src/components/tweets/tweets.widget.tsx","../src/providers/MediaTrackProvider.tsx"],"names":["version_default","MediaImage","src","isLoaded","setTrue","useBoolean","jsx","Skeleton","MediaVideo","Medias","medias","tweetHref","images","media","videos","renderVideos","video","renderImages","image","Link","jsxs","UserAvatar","url","name","size","fallbackName","useMemo","Avatar","UserInfo","user","renderTimestamp","renderActions","twitterUserUrl","MediaTrackContext","createContext","useMediaTrackContext","context","useContext","useMediaTrackClient","client","useGenerateTweetMediaMemeMutation","options","useMutation","params","translateTweetMedia","targetLanguage","useTranslateTweetMediaMutation","parseText","text","urlRegex","hashtagRegex","symbolRegex","matches","match","matchIndex","m","a","b","parts","lastIndex","key","item","e","hashtagUrl","Translate","data","embed","isTranslate","toggle","t","i18n","useTranslation","isTranslating","translatedText","setTranslatedText","useState","handleTranslate","useCallback","parsedText","Fragment","TranslateIcon","cn","TextExpand","isExpanded","onToggleExpand","renderExpand","ChevronUpIcon","ChevronDownIcon","Content","content","onLoad","ref","useRef","parsedContent","useEffect","current","TweetSource","headerActions","footerActions","indicator","children","setIsExpanded","containerClass","tweet","age","useTickAge","twitterTweetUrl","formatAge","TweetOriginal","TweetQuote","hasSource","TweetReply","sourceTweet","TweetRetweet","TweetItem","loading","TweetSkeleton","tweetType","commonProps","TweetTokenButton","token","color","SafeBigNumber","Button","TweetTokenIcon","formatPercent","ChainIcon","Image","Badge","Tweets","setIsPaused","customHeaderActions","customFooterActions","TweetSkeletonList","count","_","index","useTweets","setMedias","setLoading","isPaused","handleMedia","prevMedias","idx","it","newMedias","subTweet","subTweetToken","TweetsWidget","onPauseChange","MediaTrackProvider"],"mappings":"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","file":"index.mjs","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-media-track\"] = \"0.1.148\";\n}\n\nexport default \"0.1.148\";\n","import { useBoolean } from \"@liberfi.io/hooks\";\nimport { Skeleton } from \"@liberfi.io/ui\";\n\ntype Props = {\n src: string;\n};\n\n// ------------------------------------------------------------\nexport function MediaImage({ src }: Props) {\n const [isLoaded, { setTrue }] = useBoolean(false);\n if (!src) return null;\n\n return (\n <Skeleton isLoaded={isLoaded} className=\"w-full h-auto\">\n <img\n src={src}\n className=\"w-full h-full object-cover aspect-video\"\n onLoad={() => {\n setTrue();\n }}\n />\n </Skeleton>\n );\n}\n","type Props = {\n src: string;\n};\n\n// ------------------------------------------------------------\nexport function MediaVideo({ src }: Props) {\n if (!src) return null;\n\n return (\n <div className=\"w-full h-full overflow-hidden rounded-md mt-2\">\n <iframe\n className=\"w-full h-full aspect-video\"\n src={src}\n allowFullScreen\n />\n </div>\n );\n}\n","import { Link } from \"@liberfi.io/ui\";\nimport { TweetContentMedia } from \"../../../../types\";\nimport { MediaImage } from \"./media-image\";\nimport { MediaVideo } from \"./media-video\";\n\ntype Props = {\n medias: Array<TweetContentMedia>;\n tweetHref: string;\n};\n\nexport function Medias({ medias, tweetHref }: Props) {\n const images = medias.filter((media) => media.type === \"image\");\n const videos = medias.filter((media) => media.type === \"video\");\n\n const renderVideos = () => {\n if (!videos.length) return null;\n return (\n <div className={`grid grid-cols-1 gap-[1px] overflow-hidden rounded-md`}>\n {videos.map((video) => (\n <MediaVideo key={video.url} src={video.url} />\n ))}\n </div>\n );\n };\n\n const renderImages = () => {\n if (!images.length) return null;\n return (\n <div className={`grid grid-cols-1 gap-[1px] overflow-hidden rounded-md`}>\n {images.map((image) => (\n <Link key={image.url} href={tweetHref} target=\"_blank\">\n <MediaImage src={image.url} />\n </Link>\n ))}\n </div>\n );\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {renderVideos()}\n {renderImages()}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { Avatar, Skeleton } from \"@liberfi.io/ui\";\n\ntype Props = {\n url?: string;\n name?: string;\n size?: number;\n};\n\nexport function UserAvatar({ url, name = \"\", size = 36 }: Props) {\n const fallbackName = useMemo(() => (name ? name.slice(0, 2) : \"N/A\"), [name]);\n\n return (\n <Skeleton\n className=\"flex rounded-full flex-shrink-0\"\n style={{ width: size, height: size }}\n isLoaded={!!url}\n >\n <Avatar\n size=\"md\"\n color=\"primary\"\n radius=\"full\"\n showFallback\n name={fallbackName}\n src={url}\n style={{ width: size, height: size }}\n />\n </Skeleton>\n );\n}\n","import React from \"react\";\nimport { Link } from \"@liberfi.io/ui\";\nimport { twitterUserUrl } from \"@liberfi.io/utils\";\nimport { TweetUser } from \"../../../../types\";\nimport { UserAvatar } from \"./user-avatar\";\n\ntype Props = {\n user: TweetUser;\n renderTimestamp?: React.ReactNode;\n renderActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function UserInfo({ user, renderTimestamp, renderActions }: Props) {\n return (\n <div className=\"flex items-center justify-between gap-1\">\n <div className=\"flex items-center gap-1\">\n <UserAvatar url={user.avatar} name={user.username} />\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"flex flex-row items-baseline gap-1\">\n <span className=\"text-foreground font-semibold truncate leading-none\">\n {user.username}\n </span>\n {renderTimestamp}\n </div>\n <Link\n target=\"_blank\"\n underline=\"hover\"\n className=\"text-default-500 text-sm leading-none\"\n href={twitterUserUrl(user.screenName ?? user.username)}\n >\n @{user.screenName ?? user.username}\n </Link>\n </div>\n </div>\n {renderActions}\n </div>\n );\n}\n","import { createContext } from \"react\";\nimport { IMediaTrackClient } from \"../types\";\n\nexport interface MediaTrackContextValue {\n client: IMediaTrackClient;\n}\n\nexport const MediaTrackContext = createContext<MediaTrackContextValue>(\n {} as MediaTrackContextValue,\n);\n","import { useContext } from \"react\";\nimport { MediaTrackContext } from \"../context\";\n\nexport function useMediaTrackContext() {\n const context = useContext(MediaTrackContext);\n if (!context) {\n throw new Error(\n \"useMediaTrackContext must be used within a MediaTrackProvider\",\n );\n }\n return context;\n}\n","import { useMediaTrackContext } from \"./useMediaTrackContext\";\n\nexport function useMediaTrackClient() {\n const { client } = useMediaTrackContext();\n return client;\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport { GeneratedMemeInfo, TweetMedia } from \"../types\";\nimport { useMediaTrackClient } from \"./useMediaTrackClient\";\n\nexport function useGenerateTweetMediaMemeMutation(\n options: Omit<\n UseMutationOptions<GeneratedMemeInfo, Error, TweetMedia, string[]>,\n \"mutationFn\"\n > = {},\n) {\n const client = useMediaTrackClient();\n return useMutation({\n mutationFn: async (params: TweetMedia) => client.generateMeme(params),\n ...options,\n });\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport { LocaleCode } from \"@liberfi.io/i18n\";\nimport { IMediaTrackClient, TweetMedia } from \"../types\";\nimport { useMediaTrackClient } from \"./useMediaTrackClient\";\n\nexport interface UseTranslateTweetMediaParams {\n media: TweetMedia;\n targetLanguage: LocaleCode;\n options?: {\n sourceLanguage?: LocaleCode;\n sourceTweet?: boolean;\n };\n}\n\nexport async function translateTweetMedia(\n client: IMediaTrackClient,\n { media, targetLanguage, options }: UseTranslateTweetMediaParams,\n) {\n return await client.translate(media, targetLanguage, options);\n}\n\nexport function useTranslateTweetMediaMutation(\n options: Omit<\n UseMutationOptions<string, Error, UseTranslateTweetMediaParams>,\n \"mutationFn\"\n > = {},\n) {\n const client = useMediaTrackClient();\n return useMutation({\n mutationFn: async (params: UseTranslateTweetMediaParams) =>\n translateTweetMedia(client, params),\n ...options,\n });\n}\n","interface MatchItem {\n index: number;\n length: number;\n text: string;\n type: \"url\" | \"hashtag\" | \"symbol\";\n}\n\nexport function parseText(text: string): (string | React.ReactElement)[] {\n const urlRegex = /(https?:\\/\\/[^\\s]+|www\\.[^\\s]+)/gi;\n const hashtagRegex = /#[\\w]+/g;\n const symbolRegex = /\\$[A-Za-z][A-Za-z0-9_]*/g;\n\n const matches: MatchItem[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = urlRegex.exec(text)) !== null) {\n matches.push({\n index: match.index,\n length: match[0].length,\n text: match[0],\n type: \"url\",\n });\n }\n\n while ((match = hashtagRegex.exec(text)) !== null) {\n const matchIndex = match.index;\n const overlaps = matches.some(\n (m) => matchIndex >= m.index && matchIndex < m.index + m.length,\n );\n if (!overlaps) {\n matches.push({\n index: matchIndex,\n length: match[0].length,\n text: match[0],\n type: \"hashtag\",\n });\n }\n }\n\n while ((match = symbolRegex.exec(text)) !== null) {\n const matchIndex = match.index;\n const overlaps = matches.some(\n (m) => matchIndex >= m.index && matchIndex < m.index + m.length,\n );\n if (!overlaps) {\n matches.push({\n index: matchIndex,\n length: match[0].length,\n text: match[0],\n type: \"symbol\",\n });\n }\n }\n\n matches.sort((a, b) => a.index - b.index);\n\n const parts: (string | React.ReactElement)[] = [];\n let lastIndex = 0;\n let key = 0;\n\n matches.forEach((item) => {\n if (item.index > lastIndex) {\n parts.push(text.slice(lastIndex, item.index));\n }\n\n if (item.type === \"url\") {\n const url = item.text.startsWith(\"http\")\n ? item.text\n : `https://${item.text}`;\n parts.push(\n <a\n key={key++}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {item.text}\n </a>,\n );\n } else if (item.type === \"hashtag\") {\n const hashtag = item.text.slice(1); // 移除 #\n const hashtagUrl = `https://x.com/hashtag/${hashtag}`;\n parts.push(\n <a\n key={key++}\n href={hashtagUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {item.text}\n </a>,\n );\n } else if (item.type === \"symbol\") {\n parts.push(\n <span key={key++} className=\"text-primary\">\n {item.text}\n </span>,\n );\n }\n\n lastIndex = item.index + item.length;\n });\n\n if (lastIndex < text.length) {\n parts.push(text.slice(lastIndex));\n }\n\n return parts.length > 0 ? parts : [text];\n}\n","import React, { MouseEvent, useCallback, useState } from \"react\";\nimport { useBoolean } from \"@liberfi.io/hooks\";\nimport { LocaleCode, useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Skeleton, TranslateIcon } from \"@liberfi.io/ui\";\nimport { useTranslateTweetMediaMutation } from \"../../../../hooks\";\nimport { TweetMedia } from \"../../../../types\";\nimport { parseText } from \"../../../../utils\";\n\ntype Props = {\n data: TweetMedia;\n embed?: boolean;\n text: string;\n renderActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function Translate({ data, embed, renderActions }: Props) {\n const [isTranslate, { toggle }] = useBoolean(false);\n\n const { t, i18n } = useTranslation();\n\n const { mutateAsync: translateTweetMedia, isPending: isTranslating } =\n useTranslateTweetMediaMutation();\n\n const [translatedText, setTranslatedText] = useState<\n (string | React.ReactElement)[] | null\n >(null);\n\n const handleTranslate = useCallback(\n async (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n toggle();\n if (!translatedText) {\n const text = await translateTweetMedia({\n media: data,\n targetLanguage: i18n.language as LocaleCode,\n options: {\n sourceTweet: embed,\n },\n });\n const parsedText = parseText(text);\n setTranslatedText(parsedText);\n }\n },\n [toggle, translateTweetMedia, data, i18n.language, translatedText],\n );\n\n return (\n <>\n <div className=\"flex items-center gap-1 text-xs\">\n <div\n onClick={handleTranslate}\n className=\"flex items-center gap-0.5 cursor-pointer text-primary hover:text-foreground\"\n >\n <TranslateIcon width=\"14\" height=\"14\" />\n {isTranslate\n ? t(\"mediaTrack.tweets.translate.hide\")\n : t(\"mediaTrack.tweets.translate.show\")}\n </div>\n {renderActions}\n </div>\n <div\n className={cn(!isTranslate && \"hidden\")}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n {isTranslate && (\n <div className=\"bg-content2 rounded-md p-2 text-default-900 text-sm leading-5\">\n {translatedText}\n {isTranslating && <Skeleton className=\"w-full h-4 rounded-md\" />}\n </div>\n )}\n </div>\n </>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"@liberfi.io/ui\";\n\ntype Props = {\n isExpanded?: boolean;\n onToggleExpand?: (expanded: boolean) => void;\n};\n\nexport function TextExpand({ isExpanded, onToggleExpand }: Props) {\n const { t } = useTranslation();\n const renderExpand = () => {\n if (isExpanded) {\n return (\n <>\n <ChevronUpIcon\n className=\"border border-current\"\n width=\"12\"\n height=\"12\"\n />\n &nbsp;{t(\"mediaTrack.tweets.collapse\")}\n </>\n );\n }\n\n return (\n <>\n <ChevronDownIcon\n className=\"border border-current\"\n width=\"12\"\n height=\"12\"\n />\n &nbsp;{t(\"mediaTrack.tweets.expand\")}\n </>\n );\n };\n\n if (isExpanded === undefined) return null;\n\n return (\n <div className=\"flex items-center gap-1\">\n <div className=\"w-px h-2.5 bg-line-300\" />\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggleExpand?.(!isExpanded);\n }}\n className=\"flex items-center text-default-500 hover:text-foreground text-xs\"\n >\n {renderExpand()}\n </button>\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { parseText } from \"../../../../utils\";\n\ntype Props = {\n content: string;\n isExpanded?: boolean;\n onLoad?: () => void;\n};\n\n// ------------------------------------------------------------\nexport function Content({ content, isExpanded = false, onLoad }: Props) {\n const ref = useRef<HTMLDivElement>(null);\n\n const parsedContent = useMemo(() => parseText(content), [content]);\n\n useEffect(() => {\n const current = ref.current;\n if (!onLoad || !current) return;\n if (current.scrollHeight > current.clientHeight) {\n onLoad?.();\n }\n }, [isExpanded]);\n\n return (\n <div\n ref={ref}\n className={[\n \"text-default-900 text-sm leading-5\",\n !isExpanded ? \"line-clamp-3\" : \"\",\n ].join(\" \")}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n {parsedContent}\n </div>\n );\n}\n","import React, { useMemo, useState } from \"react\";\nimport { useTickAge } from \"@liberfi.io/hooks\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { formatAge, twitterTweetUrl } from \"@liberfi.io/utils\";\nimport { Tweet, TweetMedia } from \"../../../types\";\nimport { Content } from \"./content\";\nimport { Medias } from \"./media\";\nimport { Translate, TextExpand } from \"./tools\";\nimport { UserInfo } from \"./user\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n embed?: boolean;\n indicator?: React.ReactNode;\n children?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetSource({\n data,\n headerActions,\n footerActions,\n embed = false,\n indicator,\n children,\n}: Props) {\n const [isExpanded, setIsExpanded] = useState<boolean | undefined>(undefined);\n\n const containerClass = useMemo(() => {\n return embed\n ? \"bg-default-50 rounded-lg p-3 w-full mx-auto\"\n : \"bg-default-100 hover:bg-default-200 rounded-lg p-3 w-full mx-auto\";\n }, [embed]);\n\n const tweet = useMemo(\n () => (embed ? data.sourceTweet! : data.tweet),\n [data, embed],\n );\n\n const age = useTickAge((tweet as Tweet).timestamp);\n\n return (\n <div\n className={cn(\"flex flex-col gap-1.5 cursor-pointer\", containerClass)}\n onClick={() => {\n window.open(twitterTweetUrl(tweet.tweetId), \"_blank\");\n }}\n >\n {/* -------- USER INFO -------- */}\n <UserInfo\n user={tweet.user}\n renderTimestamp={\n embed ? undefined : (\n <div className=\"text-xs text-primary\">{formatAge(age)}</div>\n )\n }\n renderActions={headerActions}\n />\n\n {/* -------- MESSAGE TYPE INDICATOR -------- */}\n {indicator}\n\n {/* -------- CONTENT -------- */}\n {tweet.content.text && (\n <Content\n content={tweet.content.text}\n isExpanded={isExpanded}\n onLoad={() => setIsExpanded(false)}\n />\n )}\n\n {/* -------- TOOLS -------- */}\n {tweet.content.text && (\n <Translate\n data={data}\n embed={embed}\n text={tweet.content.text}\n renderActions={\n <TextExpand\n isExpanded={isExpanded}\n onToggleExpand={setIsExpanded}\n />\n }\n />\n )}\n\n {/* -------- MEDIA -------- */}\n <div\n className={cn(\n (!tweet.content.medias || tweet.content.medias.length === 0) &&\n \"hidden\",\n )}\n >\n {tweet.content.medias && tweet.content.medias.length > 0 && (\n <Medias\n medias={tweet.content.medias}\n tweetHref={twitterTweetUrl(tweet.tweetId)}\n />\n )}\n </div>\n\n {/* -------- CHILDREN -------- */}\n {children}\n\n {/* -------- Custom ACTIONS -------- */}\n {footerActions}\n </div>\n );\n}\n","import React from \"react\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetOriginal({ data, headerActions, footerActions }: Props) {\n return (\n <TweetSource\n data={data}\n headerActions={headerActions}\n footerActions={footerActions}\n />\n );\n}\n","import React from \"react\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetQuote({ data, headerActions, footerActions }: Props) {\n const sourceTweet = data.sourceTweet;\n const hasSource = !!sourceTweet;\n\n return (\n <TweetSource\n data={data}\n headerActions={headerActions}\n footerActions={footerActions}\n >\n {hasSource ? <TweetSource data={data} embed /> : null}\n </TweetSource>\n );\n}\n","import React, { useMemo } from \"react\";\nimport { Link } from \"@liberfi.io/ui\";\nimport { twitterUserUrl } from \"@liberfi.io/utils\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetReply({ data, headerActions, footerActions }: Props) {\n const sourceTweet = data.sourceTweet;\n const hasSource = !!sourceTweet;\n\n const indicator = useMemo(\n () => (\n <div className=\"flex items-center gap-2 text-sm\">\n <span>Replying to</span>\n {hasSource && (\n <Link\n className=\"text-sm\"\n underline=\"hover\"\n target=\"_blank\"\n href={twitterUserUrl(\n sourceTweet.user.screenName ?? sourceTweet.user.username,\n )}\n >\n @{sourceTweet.user.screenName ?? sourceTweet.user.username}\n </Link>\n )}\n </div>\n ),\n [hasSource, sourceTweet],\n );\n\n return (\n <TweetSource\n data={data}\n indicator={indicator}\n headerActions={headerActions}\n footerActions={footerActions}\n >\n {hasSource ? <TweetSource data={data} embed /> : null}\n </TweetSource>\n );\n}\n","import React, { useMemo } from \"react\";\nimport { Link } from \"@liberfi.io/ui\";\nimport { twitterUserUrl } from \"@liberfi.io/utils\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetSource } from \"./tweet-source\";\n\ntype Props = {\n data: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function TweetRetweet({ data, headerActions, footerActions }: Props) {\n const sourceTweet = data.sourceTweet;\n const hasSource = !!sourceTweet;\n\n const indicator = useMemo(\n () => (\n <div className=\"flex items-center gap-2 text-sm\">\n <span>Retweeted by</span>\n {hasSource && (\n <Link\n className=\"text-sm\"\n underline=\"hover\"\n target=\"_blank\"\n href={twitterUserUrl(\n sourceTweet.user.screenName ?? sourceTweet.user.username,\n )}\n >\n @{sourceTweet.user.screenName ?? sourceTweet.user.username}\n </Link>\n )}\n </div>\n ),\n [hasSource, sourceTweet],\n );\n\n return (\n <TweetSource\n data={data}\n indicator={indicator}\n headerActions={headerActions}\n footerActions={footerActions}\n >\n {hasSource ? <TweetSource data={data} embed /> : null}\n </TweetSource>\n );\n}\n","import React from \"react\";\nimport { Skeleton } from \"@liberfi.io/ui\";\nimport { TweetMedia } from \"../../../types\";\nimport { TweetOriginal } from \"./tweet-original\";\nimport { TweetQuote } from \"./tweet-quote\";\nimport { TweetReply } from \"./tweet-reply\";\nimport { TweetRetweet } from \"./tweet-retweet\";\n\ntype Props = {\n data?: TweetMedia;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n embed?: boolean;\n children?: React.ReactNode;\n loading?: boolean;\n};\n\n// ------------------------------------------------------------\nexport function TweetItem({\n data,\n headerActions,\n footerActions,\n embed = false,\n children,\n loading = false,\n}: Props) {\n if (loading || !data) {\n return <TweetSkeleton embed={embed} />;\n }\n\n const tweetType = data.tweet.type;\n\n // Render appropriate component based on tweet type\n const renderTweetComponent = () => {\n const commonProps = {\n data,\n headerActions,\n footerActions,\n embed,\n children,\n };\n\n switch (tweetType) {\n case \"reply\":\n return <TweetReply {...commonProps} />;\n case \"retweet\":\n return <TweetRetweet {...commonProps} />;\n case \"quote\":\n return <TweetQuote {...commonProps} />;\n default: // \"original\"\n return <TweetOriginal {...commonProps} />;\n }\n };\n\n return <div className=\"w-full\">{renderTweetComponent()}</div>;\n}\n\n// ------------------------------------------------------------\nfunction TweetSkeleton({ embed = false }: { embed?: boolean }) {\n const containerClass = embed\n ? \"bg-default-50 rounded-lg p-3 w-full mx-auto\"\n : \"bg-default-100 rounded-lg p-3 w-full mx-auto\";\n\n return (\n <div className={[\"flex flex-col gap-2\", containerClass].join(\" \")}>\n {/* User Info Skeleton */}\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"w-10 h-10 rounded-full\" />\n <div className=\"flex flex-col gap-1 flex-1\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-16\" />\n </div>\n <Skeleton className=\"h-3 w-12\" />\n </div>\n\n {/* Content Skeleton */}\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n\n {/* Media Skeleton */}\n <Skeleton className=\"h-48 w-full rounded-lg\" />\n\n {/* Actions Skeleton */}\n <div className=\"flex justify-between items-center pt-2\">\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-6 w-16\" />\n <Skeleton className=\"h-6 w-16\" />\n <Skeleton className=\"h-6 w-16\" />\n </div>\n <Skeleton className=\"h-6 w-20\" />\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { Avatar, Badge, Button, Image } from \"@liberfi.io/ui\";\nimport { formatPercent, SafeBigNumber } from \"@liberfi.io/utils\";\nimport { MediaToken } from \"../../../../types\";\n\ntype Props = {\n token: MediaToken;\n};\n\nexport function TweetTokenButton({ token }: Props) {\n const color = new SafeBigNumber(token.priceChange ?? \"0\").isPositive()\n ? \"primary\"\n : \"danger\";\n\n return (\n <Button\n color={color}\n variant=\"flat\"\n size=\"sm\"\n radius=\"full\"\n startContent={<TweetTokenIcon token={token} />}\n >\n <span>{token.symbol}</span>\n <span>\n {token.priceChange\n ? formatPercent(Number(token.priceChange) / 100)\n : \"--\"}\n </span>\n </Button>\n );\n}\n\nexport function TweetTokenIcon({ token }: Props) {\n const ChainIcon = useMemo(() => {\n return (\n <Image className=\"w-full h-full\" src={token.image} alt={token.chain} />\n );\n }, [token.chain]);\n\n return (\n <Badge\n className=\"w-2.5 h-2.5 p-0 border\"\n size=\"sm\"\n content={ChainIcon}\n shape=\"circle\"\n placement=\"bottom-right\"\n >\n <Avatar className=\"w-5 h-5\" radius=\"full\" src={token.image} />\n </Badge>\n );\n}\n","import { useCallback } from \"react\";\nimport { TweetMedia } from \"../../types\";\nimport { TweetTokenButton } from \"./tweet/tools/tweet-token-button\";\n// import { TweetTradeButton } from \"./tweet/tools/tweet-trade-button\";\nimport { TweetItem } from \"./tweet/tweet-item\";\n\ntype TweetsProps = {\n data: Array<TweetMedia>;\n loading: boolean;\n setIsPaused: (paused: boolean) => void;\n customHeaderActions?: (item: TweetMedia) => React.ReactNode;\n customFooterActions?: (item: TweetMedia) => React.ReactNode;\n};\n\n// ------------------------------------------------------------\nexport function Tweets({\n data,\n loading,\n setIsPaused,\n customHeaderActions,\n customFooterActions,\n}: TweetsProps) {\n const footerActions = useCallback(\n (item: TweetMedia) => (\n <div className=\"flex gap-2.5 justify-between\">\n {item.token && <TweetTokenButton token={item.token} />}\n {customFooterActions?.(item)}\n {/* {item.token && <TweetTradeButton token={item.token} />} */}\n </div>\n ),\n [customFooterActions],\n );\n\n return (\n <div\n className=\"flex flex-col gap-2.5\"\n onMouseEnter={() => setIsPaused(true)}\n onMouseLeave={() => setIsPaused(false)}\n >\n {data.map((item: TweetMedia) => (\n <TweetItem\n key={item.id}\n data={item}\n headerActions={customHeaderActions?.(item)}\n footerActions={footerActions(item)}\n loading={loading}\n />\n ))}\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\n// ------------------------------------------------------------\nexport function TweetSkeleton() {\n return (\n <div className=\"flex flex-col gap-2 bg-default-100 rounded-lg p-3 w-full mx-auto\">\n {/* User Info Skeleton */}\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"w-10 h-10 rounded-full\" />\n <div className=\"flex flex-col gap-1 flex-1\">\n <Skeleton className=\"h-4 w-40 rounded-md\" />\n <Skeleton className=\"h-3 w-32 rounded-md\" />\n </div>\n </div>\n\n {/* Content Skeleton */}\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-full rounded-md\" />\n <Skeleton className=\"h-4 w-3/4 rounded-md\" />\n <Skeleton className=\"h-4 w-1/2 rounded-md\" />\n </div>\n\n {/* Media Skeleton */}\n <Skeleton className=\"h-48 w-full rounded-lg\" />\n </div>\n );\n}\n\nexport function TweetSkeletonList({ count = 3 }: { count: number }) {\n return (\n <div className=\"flex flex-col gap-2\">\n {Array.from({ length: count }).map((_, index) => (\n <TweetSkeleton key={index} />\n ))}\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useMediaTrackClient } from \"../../hooks\";\nimport { TweetMedia } from \"../../types\";\n\nexport const useTweets = () => {\n const [medias, setMedias] = useState<Array<TweetMedia>>([]);\n const [loading, setLoading] = useState(true);\n const [isPaused, setIsPaused] = useState(false);\n\n const client = useMediaTrackClient();\n\n const handleMedia = useCallback(\n (media: TweetMedia) => {\n setMedias((prevMedias) => {\n const idx = prevMedias.findIndex((it) => it.id === media.id);\n let newMedias: Array<TweetMedia>;\n\n if (idx >= 0) {\n newMedias = prevMedias.map((item, index) =>\n index === idx ? media : item,\n );\n } else {\n if (isPaused) {\n return prevMedias;\n }\n newMedias = [media, ...prevMedias];\n }\n\n return newMedias.slice(0, 30);\n });\n setLoading(false);\n },\n [isPaused],\n );\n\n useEffect(() => {\n const subTweet = client.subscribeTweetMedia({ callback: handleMedia });\n const subTweetToken = client.subscribeTweetMediaToken({\n callback: handleMedia,\n });\n return () => {\n subTweet.unsubscribe();\n subTweetToken.unsubscribe();\n };\n }, [client, handleMedia]);\n\n return { medias, loading, isPaused, setIsPaused };\n};\n","import { useEffect } from \"react\";\nimport { TweetMedia } from \"../../types\";\nimport { TweetSkeletonList } from \"./tweet/tweet-skeleton\";\nimport { useTweets } from \"./tweets.script\";\nimport { Tweets } from \"./tweets.ui\";\n\n// ------------------------------------------------------------\nexport type TweetsWidgetProps = {\n onPauseChange?: (paused: boolean) => void;\n customHeaderActions?: (item: TweetMedia) => React.ReactNode;\n customFooterActions?: (item: TweetMedia) => React.ReactNode;\n};\n\nexport function TweetsWidget({\n onPauseChange,\n customHeaderActions,\n customFooterActions,\n}: TweetsWidgetProps) {\n const { medias, loading, isPaused, setIsPaused } = useTweets();\n\n useEffect(() => {\n onPauseChange?.(isPaused);\n }, [isPaused, onPauseChange]);\n\n if (loading) {\n return <TweetSkeletonList count={3} />;\n }\n\n return (\n <Tweets\n data={medias}\n loading={loading}\n setIsPaused={setIsPaused}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { MediaTrackContext } from \"../context\";\nimport { IMediaTrackClient } from \"../types\";\n\nexport type MediaTrackProviderProps = PropsWithChildren<{\n client: IMediaTrackClient;\n}>;\n\nexport function MediaTrackProvider({\n client,\n children,\n}: MediaTrackProviderProps) {\n return (\n <MediaTrackContext.Provider value={{ client }}>\n {children}\n </MediaTrackContext.Provider>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liberfi.io/ui-media-track",
3
- "version": "0.1.146",
3
+ "version": "0.1.148",
4
4
  "description": "Media Track for Liberfi React SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -28,11 +28,11 @@
28
28
  "dependencies": {
29
29
  "@chainstream-io/centrifuge": "^1.0.0",
30
30
  "tailwind-variants": "^3.1.1",
31
- "@liberfi.io/hooks": "0.1.143",
32
- "@liberfi.io/i18n": "0.1.148",
33
- "@liberfi.io/types": "0.1.146",
34
- "@liberfi.io/ui": "0.1.146",
35
- "@liberfi.io/utils": "0.1.143"
31
+ "@liberfi.io/hooks": "0.1.145",
32
+ "@liberfi.io/i18n": "0.1.150",
33
+ "@liberfi.io/types": "0.1.148",
34
+ "@liberfi.io/ui": "0.1.148",
35
+ "@liberfi.io/utils": "0.1.145"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@tanstack/react-query": "^5.90.2",
@@ -43,7 +43,7 @@
43
43
  "react-dom": "^19.1.1",
44
44
  "tsup": "^8.5.0",
45
45
  "typescript": "^5.9.2",
46
- "tsconfig": "0.1.134"
46
+ "tsconfig": "0.1.136"
47
47
  },
48
48
  "peerDependencies": {
49
49
  "@tanstack/react-query": "^5.90.2",