@turtleclub/earn-widget 0.4.1-beta.0 → 0.5.0-beta.1

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.cjs CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';var clsx=require('clsx'),react=require('react'),jsxRuntime=require('react/jsx-runtime'),ui=require('@turtleclub/ui'),classVarianceAuthority=require('class-variance-authority'),hooks=require('@turtleclub/hooks'),jotai=require('jotai'),lucideReact=require('lucide-react'),utils=require('@turtleclub/utils'),viem=require('viem'),chains=require('viem/chains');function $(...e){return clsx.clsx(e)}var De=react.createContext(null);function _e({config:e,children:t}){return jsxRuntime.jsx(De.Provider,{value:e,children:t})}function B(){let e=react.useContext(De);if(!e)throw new Error("useWidgetConfig must be used within WidgetConfigProvider");return e}function Z(e){return `rgb(from ${e} calc(255 - r) calc(255 - g) calc(255 - b))`}function to(e,t=10){return `color-mix(in srgb, ${e} ${100-t}%, black)`}function Le(e,t){let o=t==="dark",r={"--color-brand-black":o?e.background_dark:Z(e.background_dark),"--color-brand-white":o?e.foreground_dark:Z(e.foreground_dark),"--color-brand-green":o?e.primary_dark:to(e.primary_dark)};return (e.card!==void 0||e.card_dark!==void 0)&&(r["--color-surface-primary"]=o?e.card_dark??e.card??e.background_dark:Z(e.card_dark??e.background_dark)),(e.muted_foreground!==void 0||e.muted_foreground_dark!==void 0)&&(r["--muted-foreground"]=o?e.muted_foreground_dark??e.muted_foreground??e.foreground_dark:Z(e.muted_foreground_dark??e.muted_foreground_dark??e.foreground_dark)),r}var Fe={background:"#F9F9F9",background_dark:"#141514",foreground:"#141514",foreground_dark:"#F9F9F9",primary:"#73F36C",primary_dark:"#73F36C",card:"#F9F9F9",card_dark:"#141514",muted_foreground:"#14151480",muted_foreground_dark:"#FFFFFF80"},Me="dark",Be="Montserrat, sans-serif",Ue="DM Sans, sans-serif";function W(){let e=B(),t=e?.theme??Me,o=e?.fontFamily??Be,r=e?.fontSecondary??Ue,s=e?.widgetWidth??"default",a=e?.customWidth??"100%",u=e?.showNavigation??true,i=e?.padding??"default",n=e?.rounding??"default",l=e?.styles??Fe,m=Le(l,t==="auto"?"dark":t);return {theme:t,coreTokenCSS:m,fontPrimary:o,fontSecondary:r,widgetWidth:s,customWidth:a,showNavigation:u,padding:i,rounding:n,config:e,widgetStyles:l}}var Qe={xxs:"h-4 text-xs",xs:"h-6 text-sm",sm:"h-8 text-2xl",md:"h-12 text-4xl",lg:"h-16 text-6xl"};function ze({light:e,dark:t,fallback:o="Turtle Club",className:r,size:s="lg"}){let[a,u]=react.useState(false),{theme:i}=W(),l=i==="dark"?t||e:e||t;return l&&!a?jsxRuntime.jsx("div",{className:ui.cn("flex justify-center items-center",r),children:jsxRuntime.jsx("img",{src:l,alt:o,className:ui.cn("object-contain",Qe[s]),onError:()=>u(true),onLoad:()=>u(false)})}):jsxRuntime.jsx("div",{className:ui.cn("flex justify-center items-center",r),children:jsxRuntime.jsx("span",{className:ui.cn("font-bold text-primary",Qe[s]),children:o})})}function He(){let e=B();return {light:e?.logo?.light,dark:e?.logo?.dark,fallback:e?.logo?.fallback||"Turtle Club"}}var so=classVarianceAuthority.cva("p-0",{variants:{padding:{none:"p-0",sm:"p-3",default:"p-4",md:"p-6",lg:"p-7"}},defaultVariants:{padding:"default"}});function le({children:e,className:t,variant:o,padding:r,rounding:s,showLogo:a=true,logoSize:u="xs",...i}){let{padding:n}=W(),{light:l,dark:p,fallback:m}=He(),d=so({padding:r??n});return jsxRuntime.jsxs(ui.Card,{className:$(t,d),...i,variant:o,gradient:"white",children:[a&&jsxRuntime.jsx("div",{className:"flex-shrink-0 py-2",children:jsxRuntime.jsx(ze,{light:l,dark:p,fallback:m,size:u})}),e]})}var Ve=react.createContext(null),Xe=react.createContext(""),Ze=({adapter:e,distributorId:t,children:o})=>jsxRuntime.jsx(Ve.Provider,{value:e,children:jsxRuntime.jsx(Xe.Provider,{value:t,children:o})}),I=()=>{let e=react.useContext(Ve);if(!e)throw new Error("useAdapter must be used within an AdapterProvider");return e},U=()=>react.useContext(Xe);function Ke({children:e}){let t=B(),{theme:o,coreTokenCSS:r,fontPrimary:s,fontSecondary:a,widgetWidth:u}=W();return jsxRuntime.jsx("div",{className:$("turtle-widget-root text-foreground","antialiased transition-all duration-700 ease-linear w-full overflow-hidden","h-full flex items-center justify-center",o==="dark"?"dark":""),style:{...r,"--font-primary":s,"--font-secondary":a,fontFamily:s,backgroundColor:"transparent",maxHeight:"90vh"},children:jsxRuntime.jsx("div",{className:$("flex flex-col gap-2 h-full overflow-hidden",u==="full"?"w-full items-center":u==="custom"?"items-stretch":"items-center"),style:{...u==="custom"&&t.customWidth?{width:t.customWidth}:u==="default"?{width:"620px"}:{}},children:jsxRuntime.jsx("div",{className:"w-full max-w-md h-full flex flex-col gap-2 overflow-hidden",children:e})})})}var R=()=>{let e=I(),t=react.useRef(void 0),o=react.useRef(false),{data:r,isLoading:s,refetch:a}=hooks.useCheckMembership({params:{address:e.user||"",walletEcosystem:"evm"},enabled:!!e.user}),{mutateAsync:u,isPending:i,error:n}=hooks.useCreateMembershipAgreement(),{mutateAsync:l,isPending:p,error:m}=hooks.useCreateMembership();react.useEffect(()=>{let b=e.user;if(!b){t.current!==void 0&&(t.current=void 0);return}b!==t.current&&(t.current=b,d(b));},[e.user]);let d=async b=>{if(!o.current){o.current=true;try{let{data:S}=await a();if(S?.isMember){console.log("[useWidgetAuth] User is already a member");return}console.log("[useWidgetAuth] User is not a member, starting membership flow..."),console.log("[useWidgetAuth] Creating membership agreement...");let N=await u({address:b,walletEcosystem:"evm",url:window.location.href,chainId:String(e.network||1)});console.log("[useWidgetAuth] Requesting signature from wallet...");let O=await e.signMessage(N.message);console.log("[useWidgetAuth] Creating membership with signature...");let E=await l({address:b,walletEcosystem:"evm",signature:O,nonce:N.nonce});E.isMember?console.log("[useWidgetAuth] Membership created successfully!"):console.error("[useWidgetAuth] Failed to create membership:",E.error);}catch(S){console.error("[useWidgetAuth] Membership flow error:",S);}finally{o.current=false;}}},c=s||i||p,h=n?.message||m?.message||null;return {address:e.user,isConnected:!!e.user,isMember:r?.isMember,currentChain:e.network,connect:e.openConnectionModal,disconnect:e.disconnect,changeNetwork:e.changeNetwork,isLoading:c,error:h}};function Je(e){let[t,o]=react.useState(e),r=react.useCallback(s=>{o(s);},[]);return {currentTab:t,setTab:r}}var ho=jotai.atom({id:"none"});function y(){let[e,t]=jotai.useAtom(ho),o=react.useCallback((s,a)=>{t({id:s,data:a});},[t]),r=react.useCallback(()=>{t({id:"none"});},[t]);return {currentOverlay:e.id,overlayData:e.data,isOverlayOpen:e.id!=="none",openOverlay:o,closeOverlay:r}}function me({tabs:e,overlays:t,defaultTab:o}){let {showNavigation:r}=W(),{currentTab:s}=Je(o),{currentOverlay:u,overlayData:i}=y();react.useMemo(()=>Object.entries(e).filter(([c,h])=>h.visible!==false).map(([c,h])=>({value:c,label:h.label})),[e]);let p=react.useMemo(()=>e[s].component,[s,e]),m=react.useMemo(()=>u==="none"?null:t[u].component,[u,t]);return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[r&&false,jsxRuntime.jsx("div",{className:"flex-1 min-h-0 overflow-hidden flex flex-col gap-2 bg-transparent",children:jsxRuntime.jsx(le,{variant:"border",className:"flex-1 min-h-0 w-full flex flex-col overflow-hidden",children:jsxRuntime.jsx("div",{className:"flex-1 min-h-0 overflow-hidden",children:m?jsxRuntime.jsx(m,{data:i}):jsxRuntime.jsx(p,{})})})})]})}function q({onBack:e,children:t,className:o}){let{closeOverlay:r}=y();return jsxRuntime.jsxs("div",{className:`flex flex-col h-full ${o||""}`,children:[jsxRuntime.jsx("div",{className:"flex items-center gap-2 pb-3",children:jsxRuntime.jsx(ui.Button,{variant:"green",border:"interactive",size:"icon",onClick:e??r,className:"h-8 w-8 shrink-0","aria-label":"Go back",children:jsxRuntime.jsx(lucideReact.ChevronLeft,{className:"h-5 w-5"})})}),jsxRuntime.jsx("div",{className:"flex-1 min-h-0 overflow-auto pt-4",children:t})]})}var ee=e=>e.filter(t=>t.rewardType!=="points").reduce((t,o)=>t+(o.yield??0),0),tt=e=>({totalYield:react.useMemo(()=>ee(e),[e])});function te({incentives:e,isPill:t,className:o}){let{totalYield:r}=tt(e),s=react.useMemo(()=>e.filter(a=>a.rewardType!=="points"&&a.yield!==null&&a.yield!==void 0).sort((a,u)=>u.yield-a.yield),[e]);return jsxRuntime.jsx(ui.TurtleTooltip,{trigger:jsxRuntime.jsxs("div",{className:ui.cn("group flex items-center gap-1",o,t&&"hover:bg-neutral-alpha-5 border-border bg-neutral-alpha-2 hover:border-gradient-white rounded-full border px-3 py-1.5 text-xs"),children:[utils.formatNumber(r,1,false,false),"%"," ",jsxRuntime.jsx(lucideReact.InfoIcon,{className:"text-primary/70 group-hover:text-primary size-2.5"})]}),content:jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{className:"text-sm",children:"APR Breakdown"}),jsxRuntime.jsx("div",{children:s.map(a=>jsxRuntime.jsxs("div",{className:"my-1 flex justify-between gap-2 text-xs",children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-1",children:[a.iconUrl&&jsxRuntime.jsx("img",{src:a.iconUrl,alt:a.name||a.id,className:"size-4 rounded-full",loading:"lazy"}),jsxRuntime.jsx("div",{children:a.name})]}),jsxRuntime.jsxs("div",{children:[utils.formatNumber(a.yield,1,false,false),"%"]})]},a.id))}),jsxRuntime.jsxs("div",{className:"text-primary flex justify-between gap-2 text-sm",children:[jsxRuntime.jsx("span",{children:"Total"}),jsxRuntime.jsxs("span",{children:[utils.formatNumber(r,1,false,false),"%"]})]})]}),side:"bottom",contentClassName:"p-5 backdrop-blur-xl"})}function rt({chain:e,triggerClassName:t}){let o=utils.getNetworkById(e.slug);return jsxRuntime.jsx("div",{className:ui.cn("bg-foreground -mr-1 flex size-5 items-center justify-center overflow-hidden rounded-full ring-1 ring-white last:mr-0 lg:-mr-4 lg:size-6",utils.getNetworkBackgroundColor(o),t),children:jsxRuntime.jsx("img",{src:e.logoUrl,className:"size-5 rounded-full object-contain lg:size-6",alt:e.name})})}var fe=jotai.atom(null),ge=jotai.atom(null),he=jotai.atom(.001),be=jotai.atom(null),st=jotai.atom(e=>{let t=e(fe),o=e(be),r=e(ge),s=e(he),a=!!(r&&Number.parseFloat(r)>0),u=!!t&&!!o&&a&&!!s,i=u?{chain:Number(t?.receiptToken?.chain.chainId)??1,token_in:o?.address??"",token_out:t?.receiptToken?.address??"",amount:viem.parseUnits(r??"0",o?.decimals??18).toString(),slippage:s}:void 0;return {opportunity:t,token:o,amount:r,options:i,isValid:u}});function C(){let[e,t]=jotai.useAtom(fe),[o,r]=jotai.useAtom(be),[s,a]=jotai.useAtom(ge),[u,i]=jotai.useAtom(he),n=jotai.useAtomValue(st),l=react.useCallback(()=>{r(null),a(""),i(.001);},[r,a,i]);return react.useEffect(()=>{o&&(a(""),i(.001));},[o,a,i]),{opportunity:e,token:o,amount:s,slippage:u,isValid:n.isValid,options:n.options,selectOpportunity:t,selectToken:r,setAmount:a,setSlippage:i,reset:l}}function re({opportunities:e}){let{changeNetwork:t,network:o}=I(),{selectOpportunity:r,selectToken:s}=C(),{closeOverlay:a}=y();return jsxRuntime.jsx(ui.DataTable,{columns:[{accessorKey:"name",header:()=>jsxRuntime.jsx("div",{children:"Opportunity"}),cell:({row:n})=>jsxRuntime.jsxs("div",{className:"flex items-center gap-2 px-1",children:[jsxRuntime.jsx(ui.APIStatus,{warning:false}),jsxRuntime.jsx("img",{src:n.original.receiptToken.logoUrl,className:"size-6 rounded-full",loading:"lazy"}),n.original.name||n.original.receiptToken.name]}),enableSorting:true},{accessorKey:"chain",header:()=>jsxRuntime.jsx("div",{className:"flex w-full justify-end",children:"Chain"}),cell:({row:n})=>jsxRuntime.jsx(rt,{chain:n.original.receiptToken.chain})},{id:"organization",accessorFn:n=>n.products.length?n.products[0].organization.name:"-",header:()=>jsxRuntime.jsx("div",{children:"Partner"}),cell:({row:n})=>n.original.products.length?jsxRuntime.jsxs("div",{className:"flex items-center gap-2",children:[jsxRuntime.jsx("img",{src:n.original.products[0].organization.iconUrl||"",className:"size-6 rounded-full",loading:"lazy"}),n.original.products[0].organization.name]}):"-",enableSorting:true},{accessorKey:"tvl",header:()=>jsxRuntime.jsx("div",{className:"flex w-full justify-end",children:"TVL"}),cell:({row:n})=>jsxRuntime.jsx("div",{className:"text-end",children:utils.formatCurrency(n.original.tvl,0,true)}),enableSorting:true},{accessorKey:"totalYield",header:()=>jsxRuntime.jsx("div",{className:"flex w-full justify-end",children:"Estimated APR"}),cell:({row:n})=>jsxRuntime.jsx("div",{className:"flex flex-row-reverse",children:jsxRuntime.jsx(te,{incentives:n.original.incentives})}),enableSorting:true,sortingFn:(n,l)=>{let p=ee(n.original.incentives),m=ee(l.original.incentives);return p-m}}],onRowClick:n=>{r(n);let l=Number(n.receiptToken.chain.chainId);l!==o&&(t(l),s(null)),a();},data:e,enableSearch:true,grid:{displayAsGrid:true,headerSlot:"name",rightSlot:"totalYield",excludeColumns:[],className:"grid-cols-1 gap-2.5"}})}function it(){let e=U(),{data:t,isLoading:o,error:r}=hooks.useWidgetOpportunities(e);return o?jsxRuntime.jsx("div",{children:"Loading..."}):r?jsxRuntime.jsxs("div",{children:["Error: ",r.message]}):t===void 0?jsxRuntime.jsx("div",{children:"No data"}):t.opportunities&&t.opportunities.length===0?jsxRuntime.jsx("div",{children:"No opportunities"}):jsxRuntime.jsx(q,{children:jsxRuntime.jsx(re,{opportunities:t.opportunities||[]})})}var lt=()=>{let{openOverlay:e}=y();return jsxRuntime.jsx("button",{onClick:()=>{e("balances"),console.log("Positions Content Click");},children:"Positions Content Click"})};var ct=()=>jsxRuntime.jsx("div",{children:"Discover Content"});function ye({steps:e,currentStep:t,allCompleted:o,cancelled:r,tokenSymbol:s,amount:a,resetQueue:u,resetForm:i,refetchBalances:n}){let l=e.filter(c=>c.status==="completed"&&c.txHash).pop(),p=t?.txHash?t:null,m=o?l?.txHash:p?.txHash||l?.txHash,d=react.useMemo(()=>({title:r?"Transaction Cancelled":o?"Transaction Completed!":"Processing Transaction",description:r?"Transaction was cancelled by user":o?"Your deposit has been successfully processed.":"Please wait while your transaction is being confirmed...",txHash:m,explorerUrl:"https://etherscan.io",estimatedTime:void 0,amount:`${a?utils.formatNumber(a,5,false,false):"0"}`,token:s,protocol:"Turtle Protocol",completed:o,cancelled:r,onViewDetails:void 0,onClose:()=>{u(),i(),n?.();},steps:e.map(c=>({label:c.label,completed:c.status==="completed",current:c.status==="executing",txHash:c.txHash}))}),[e,o,r,s,a,u,i,n,m]);return jsxRuntime.jsx("div",{className:"h-full overflow-hidden",children:jsxRuntime.jsx(ui.TxStatus,{...d,className:"bg-background border-border text-foreground h-full"})})}function mt(e){return e.kind==="approve"&&e.token?`Approve ${e.token.symbol}`:e.kind==="enso"?"Execute Deposit":`Execute ${e.kind}`}function pt(e,t){return e.kind==="approve"&&e.token?`Allow contract to spend ${e.token.symbol}`:`Transaction step ${t+1}`}function ft(e){let t=e instanceof Error?e.message:String(e);return ["user rejected","user denied","user cancelled","cancelled by user","transaction rejected","4001"].some(r=>t.toLowerCase().includes(r.toLowerCase()))}function gt(e){if(e.steps.length<=1||e.queueStatus!=="idle")return false;let t=e.steps[e.currentIndex-1],o=e.steps[e.currentIndex];return e.currentIndex>0&&e.currentIndex<e.steps.length&&t?.status==="completed"&&o?.status==="pending"}var Vo=1e3;function yt(e,t){return e.tx?{id:t,label:mt(e),description:pt(e,t),txData:e.tx,status:"pending"}:null}function Xo(e,t){switch(t.type){case "INITIALIZE_QUEUE":return {steps:t.steps,currentIndex:0,queueStatus:"idle",lastError:void 0};case "START_EXECUTION":return {...e,steps:e.steps.map((o,r)=>r===t.index?{...o,status:"executing"}:o),queueStatus:"executing",lastError:void 0};case "COMPLETE_STEP":{let o=e.steps.map((a,u)=>u===t.index?{...a,status:"completed",txHash:t.txHash}:a),r=t.index+1,s=r>=o.length;return {...e,steps:o,currentIndex:s?e.currentIndex:r,queueStatus:s?"completed":"idle"}}case "FAIL_STEP":return {...e,steps:e.steps.map((o,r)=>r===t.index?{...o,status:"failed",error:t.error}:o),queueStatus:t.isCancellation?"cancelled":"error",lastError:t.error};case "RESET_QUEUE":return {steps:t.steps,currentIndex:0,queueStatus:"idle",lastError:void 0};default:return e}}function ve({earnRoute:e,userAddress:t,chainId:o,sendTransaction:r,onError:s=()=>{},onSuccess:a=()=>{}}){let u={steps:[],currentIndex:0,queueStatus:"idle"},[i,n]=react.useReducer(Xo,u);react.useEffect(()=>{if(!e?.steps?.length){n({type:"INITIALIZE_QUEUE",steps:[]});return}let f=e.steps.map((x,g)=>yt(x,g)).filter(x=>x!==null);n({type:"INITIALIZE_QUEUE",steps:f});},[e]);let l=react.useCallback(async()=>{if(!t||!o||!r||i.queueStatus==="executing")return;let f=i.steps[i.currentIndex];if(!f||f.status!=="pending"&&f.status!=="failed")return;if(f.txData.from.toLowerCase()!==t.toLowerCase()){let g=new Error("Transaction 'from' address doesn't match connected wallet");n({type:"FAIL_STEP",index:i.currentIndex,error:g.message,isCancellation:false}),s&&s(g);return}n({type:"START_EXECUTION",index:i.currentIndex});try{let g=await r({...f.txData,chainId:o});n({type:"COMPLETE_STEP",index:i.currentIndex,txHash:g??""}),i.currentIndex+1>=i.steps.length&&a&&a();}catch(g){let _=g instanceof Error?g.message:"Transaction failed",M=ft(g);n({type:"FAIL_STEP",index:i.currentIndex,error:M?"Transaction cancelled by user":_,isCancellation:M}),!M&&s&&s(g instanceof Error?g:new Error(_));}},[t,o,r,i.queueStatus,i.steps,i.currentIndex,a,s]),p=react.useCallback(()=>{if(!e?.steps?.length)return;let f=e.steps.map((x,g)=>yt(x,g)).filter(x=>x!==null);n({type:"RESET_QUEUE",steps:f});},[e]),m=i.steps[i.currentIndex]||null,d=i.queueStatus==="executing",c=i.queueStatus==="completed",h=i.queueStatus==="error",b=i.queueStatus==="cancelled",S=i.steps.filter(f=>f.status==="completed").length,N=i.steps.length,O=N>0?S/N*100:0,E=react.useMemo(()=>m?!!(c||d&&m.id===0||m.id>0):false,[m,c,d]),se=!!(t&&o&&i.steps.length>0&&i.queueStatus!=="executing"&&i.queueStatus!=="completed");return react.useEffect(()=>{if(gt(i)){let f=setTimeout(()=>{l();},Vo);return ()=>clearTimeout(f)}},[i,l]),{steps:i.steps.map((f,x)=>({...f,completed:f.status==="completed",current:x===i.currentIndex})),currentIndex:i.currentIndex,isExecuting:d,allCompleted:c,hasError:h,cancelled:b,error:i.lastError,currentStep:m?{...m,completed:m.status==="completed",current:true}:null,canExecute:se,executeCurrentTransaction:l,resetQueue:p,totalSteps:N,completedSteps:S,progress:O,showTxStatus:E}}var jo=(e,t,o)=>({in:{icon:t.logos[0],symbol:t.symbol},out:{icon:o.logos[0],symbol:o.symbol},amount:void 0,type:e}),Jo=(e,t)=>({in:{icon:e.logos[0],symbol:e.symbol},out:null,amount:utils.formatToken(t,{decimals:e.decimals},true,false,4),type:"approve"});function vt(e){if(!e)return [];let t=[];return e.steps.forEach(o=>{if(o.kind==="approve"&&o.token){let r=Jo(o.token,o.amount);t.push(r);}o.kind==="enso"&&o.substeps&&o.substeps.forEach(r=>{let s=r.from[0],a=r.to[0],u=jo(r.kind,s,a);t.push(u);});}),t}function Tt(e){return {chainId:Number(e.receiptToken?.chain.chainId)??chains.mainnet.id,address:e.receiptToken?.address??"",symbol:e.receiptToken?.symbol??"",decimals:e.receiptToken?.decimals??18}}function xt(e,t,o,r,s){let a=react.useMemo(()=>{if(!(!r||!e))return {...r,user:t,distributor_id:o,referral_code:s}},[r,t,o,s]),u=react.useMemo(()=>!!(t&&a?.token_in&&a?.token_out&&a?.amount&&a?.chain&&a?.slippage&&a?.distributor_id),[r]),{data:i,isLoading:n,error:l}=hooks.useEarnRoute({params:a,enabled:u&&e}),p=react.useMemo(()=>vt(i??null),[i]);return {fetchedRoute:i??null,outputAmount:i?.amount_out??void 0,isReady:u&&i&&!n,hasRequiredParams:u,routeDetails:p,routeError:l,isLoadingRoute:n}}function St({children:e,className:t}){let{data:o,isLoading:r}=hooks.useGeocheck();return r?jsxRuntime.jsx(ui.Button,{disabled:true,className:t,size:"lg",fullWidth:true,children:"Checking availability..."}):o&&!o.canInteract?jsxRuntime.jsxs(ui.Tooltip,{children:[jsxRuntime.jsx(ui.TooltipTrigger,{className:"w-full cursor-default space-y-2",children:jsxRuntime.jsx(ui.Button,{disabled:true,variant:"default",className:t,size:"lg",fullWidth:true,children:"Geo Restricted"})}),jsxRuntime.jsx(ui.TooltipContent,{side:"top",sideOffset:6,className:"text-xs",children:"Due to geographical restrictions you can't use this vault."})]}):jsxRuntime.jsx(jsxRuntime.Fragment,{children:e})}function xe({fetchedRoute:e,routeError:t,isLoadingRoute:o,canExecute:r,isExecuting:s,hasError:a,cancelled:u,executeCurrentTransaction:i,totalSteps:n,completedSteps:l,showingTransactionStatus:p,hasInsufficientBalance:m}){let d=react.useCallback(async()=>{r&&await i();},[r,i]),c=react.useMemo(()=>p?null:o?{text:"Loading route...",disabled:true,className:"cursor-not-allowed"}:t?{text:"Route Error",disabled:true,className:"cursor-not-allowed"}:!e||!e.steps||e.steps.length===0?{text:"Enter amount to continue",disabled:true,className:"cursor-not-allowed"}:m?{text:"Insufficient Balance",disabled:true,className:"cursor-not-allowed"}:s?{text:"Executing...",disabled:true,className:"cursor-not-allowed"}:a?{text:"Retry Transaction",disabled:!r,onClick:d,className:"cursor-pointer"}:u?{text:"Try Again",disabled:!r,onClick:d,className:"cursor-pointer"}:{text:n>1&&l!==n?`Confirm Transaction (${l}/${n})`:"Confirm Transaction",disabled:false,onClick:d,className:"cursor-pointer"},[p,o,t,e,m,s,a,u,r,n,l,d]);return c?jsxRuntime.jsx(St,{children:jsxRuntime.jsx(ui.Button,{border:"plain",onClick:()=>c.onClick?.(),disabled:c.disabled,className:c.className+" w-full",children:c.text})}):null}function At({opportunity:e,address:t,distributorId:o,executeTransaction:r,refetchBalances:s,stickyButton:a=false}){let{openOverlay:u}=y(),{chainId:i,symbol:n,decimals:l}=react.useMemo(()=>Tt(e),[e]),{setAmount:p,setSlippage:m,token:d,amount:c,slippage:h,options:b,isValid:S,reset:N}=C(),{usdValue:O,hasInsufficientBalance:E,handleMaxClick:se}=hooks.useTokenBalance({token:d,amount:c??void 0,setAmount:A=>p(A??null)}),{routeDetails:f,isReady:x,outputAmount:g,fetchedRoute:_,routeError:M,isLoadingRoute:we}=xt(S,t,o,b),Yt=react.useCallback(async A=>{let ue={from:A.from,to:A.to,data:A.data,value:BigInt(A.value),chainId:i??1};return await r(ue)},[r,i]),{steps:Gt,currentStep:Oe,canExecute:Ae,isExecuting:X,allCompleted:Vt,hasError:We,cancelled:ae,executeCurrentTransaction:Ie,resetQueue:Xt,totalSteps:Re,completedSteps:Pe,showTxStatus:ie}=ve({earnRoute:_,userAddress:t,chainId:i,sendTransaction:Yt,onSuccess:()=>{s();}}),Zt=react.useMemo(()=>{let A=c?utils.formatNumber(c,6,true,false):"0",ue=g&&l?utils.formatToken(g,{decimals:l},true,false,6):"0";return {deposit:c?`${A} ${d?.symbol||"ETH"}`:"0 ETH",receive:g&&l?`${ue} ${n||"ETH"}`:"0 ETH",equivalentInUsd:c&&d?.price?(Number.parseFloat(c)*d.price).toFixed(2):"0.00",defaultOpen:true,slippage:h,setSlippage:m}},[c,g,l,n,d,h]);return jsxRuntime.jsxs("div",{className:ui.cn("grid gap-3 flex-1 min-h-0",a?"grid-rows-[auto_1fr_auto] pb-6":"grid-rows-[auto_1fr]"),children:[jsxRuntime.jsx(ui.SwapInput,{tokens:[],useCustomTokenSelector:true,selectedTokenData:d,onCustomTokenSelectorClick:()=>u("balances"),value:c??void 0,onChange:p,usdValue:E?void 0:O,balance:d?utils.formatToken(d.balance,d,true,false,5):"0",onMaxClick:se,className:ui.cn("p-5",E?"border-destructive/50 border":"border-border border")}),jsxRuntime.jsxs("div",{className:"overflow-auto min-h-0 space-y-3",children:[x&&f&&jsxRuntime.jsx(ui.SwapDetails,{details:Zt}),f&&f.length>0&&jsxRuntime.jsx(ui.RouteDetails,{value:{steps:f}}),Oe&&c&&ie&&jsxRuntime.jsx(ye,{steps:Gt,currentStep:Oe,allCompleted:Vt,cancelled:ae,tokenSymbol:d?.symbol||"",amount:c,resetQueue:Xt,resetForm:N,refetchBalances:s}),!a&&!ie&&jsxRuntime.jsx("div",{className:"pt-3",children:jsxRuntime.jsx(xe,{fetchedRoute:_,routeError:M,isLoadingRoute:we,canExecute:Ae,isExecuting:X,hasError:We,cancelled:ae,executeCurrentTransaction:Ie,totalSteps:Re,completedSteps:Pe,showingTransactionStatus:X,hasInsufficientBalance:E})})]}),a&&!ie&&jsxRuntime.jsx("div",{className:"w-full",children:jsxRuntime.jsx(xe,{fetchedRoute:_,routeError:M,isLoadingRoute:we,canExecute:Ae,isExecuting:X,hasError:We,cancelled:ae,executeCurrentTransaction:Ie,totalSteps:Re,completedSteps:Pe,showingTransactionStatus:X,hasInsufficientBalance:E})})]})}function Sr(e,t){let o={address:e.token.address,name:e.token.name,symbol:e.token.symbol,decimals:e.token.decimals,balance:e.amount,price:e.token.price??void 0,chainId:e.token.chain,logo:e.token.logos?.[0]},r=utils.getNetworkByChainId(Number(t));return {id:`${t}-${o.address}`,symbol:o.symbol,name:o.name,icon:o.logo?jsxRuntime.jsx("img",{src:o.logo,alt:o.symbol,className:"h-8 w-8 rounded-full"}):jsxRuntime.jsx("div",{className:"bg-muted flex h-8 w-8 items-center justify-center rounded-full text-xs",children:o.symbol?.charAt(0)||"?"}),balance:utils.formatToken(o.balance,o),balanceUSD:utils.formatCurrencyWithCommas(Number.parseFloat(utils.formatToken(o.balance,o))*(o.price||0),2),chainId:String(t),chainName:r?.name||"Unknown",address:o.address,decimals:o.decimals}}function ke(e){let t=[];return Object.entries(e).forEach(([o,r])=>{r.forEach(s=>{t.push(Sr(s,o));});}),t}function Se(e,t,o){let s=e[Number(t)]?.find(a=>a.token.address===o);return s?{address:s.token.address,name:s.token.name,symbol:s.token.symbol,decimals:s.token.decimals,logo:s.token.logos?.[0],icon:jsxRuntime.jsx("img",{src:s.token.logos?.[0],alt:s.token.symbol,className:"size-4 rounded-full"}),balance:s.amount,price:s.token.price??void 0,chainId:s.token.chain}:null}function It(){let{selectToken:e,opportunity:t}=C(),{closeOverlay:o}=y(),{user:r}=I(),{balances:s,isLoading:a,error:u}=hooks.useMultiChainBalances({chainIds:[Number(t?.receiptToken?.chain.chainId)??chains.mainnet.id],address:r||""}),i=react.useCallback(l=>{let p=Se(s,l.chainId,l.address);e(p),o();},[e,o,s]),n=react.useMemo(()=>ke(s),[s]);return a?jsxRuntime.jsx("div",{children:"Loading..."}):u?jsxRuntime.jsxs("div",{children:["Error: ",u.message]}):jsxRuntime.jsx(q,{children:jsxRuntime.jsx(ui.AssetList,{assets:n,onAssetClick:i,groupByChain:true,showChainIcon:true,filterVariant:"navigation",className:"h-full",itemClassName:"!rounded-full"})})}var Or=e=>{let o=ke(e)[0];return o?Se(e,o.chainId,o.address):null};function Dt(){let{user:e,network:t,sendTransaction:o}=I(),r=U(),{openOverlay:s}=y(),{token:a,selectOpportunity:u,selectToken:i,opportunity:n}=C(),{balances:l,isLoading:p,refetchAll:m}=hooks.useMultiChainBalances({chainIds:[Number(n?.receiptToken?.chain.chainId)??chains.mainnet.id],address:e}),{data:d,isLoading:c}=hooks.useWidgetOpportunities(r);react.useEffect(()=>{if(d&&d.opportunities&&d.opportunities.length>0&&!n){let b=d.opportunities[0];u(b);}},[d,n]),react.useEffect(()=>{let b=Number(n?.receiptToken?.chain.chainId)??chains.mainnet.id,S=a?.chainId;if((!a||S!==b)&&Object.keys(l).length>0){let O=Or(l);O&&i(O);}},[l,a,n]);let h=react.useMemo(()=>p||c,[p,c]);return {address:e,network:t,distributorId:r,openOverlay:s,sendTransaction:o,isLoading:h,refetchBalances:m}}function Rr(e,t=4){return e?`${e.slice(0,t+2)}...${e.slice(-t)}`:""}function _t(){let{isMember:e,isLoading:t,address:o,isConnected:r,disconnect:s}=R();if(t)return jsxRuntime.jsx("div",{className:"h-10 w-[133px] animate-pulse rounded-full bg-neutral-alpha-10"});if(!r)return null;if(r&&e)return jsxRuntime.jsx(ui.Button,{variant:"ghost",border:"bordered",onClick:s,className:"group min-w-[140px] transition-colors",children:jsxRuntime.jsxs("div",{className:"gap-2 flex text-md items-center justify-between",children:[jsxRuntime.jsx(lucideReact.Wallet2Icon,{className:"size-6 stroke-accent group-hover:hidden"}),jsxRuntime.jsx(lucideReact.LogOutIcon,{className:"hidden size-6 stroke-destructive group-hover:block"}),jsxRuntime.jsx("span",{className:"group-hover:hidden",children:Rr(o)}),jsxRuntime.jsx("span",{className:"hidden group-hover:block text-foreground",children:"Disconnect"})]})})}function Ft(){let e=U(),{data:t}=hooks.useWidgetOpportunities(e),o=t?.chains||[],{changeNetwork:r,currentChain:s,isConnected:a}=R(),u=react.useMemo(()=>o.find(n=>Number(n.chainId)===s)||o[0],[o,s]),i=async n=>{try{await r(n);}catch(l){console.error("Failed to change network:",l);}};return a?jsxRuntime.jsxs(ui.DropdownMenu,{children:[jsxRuntime.jsx(ui.DropdownMenuTrigger,{src:u?.logoUrl,children:u?.name}),jsxRuntime.jsx(ui.DropdownMenuContent,{children:o.map(n=>jsxRuntime.jsxs(ui.DropdownMenuItem,{onClick:()=>i(Number(n.chainId)),children:[jsxRuntime.jsx("img",{src:n.logoUrl,alt:n.name,className:"size-6 rounded-full"}),n.name]},n.id))})]}):null}function Ne(){return jsxRuntime.jsxs("div",{className:"flex justify-between items-center gap-2",children:[jsxRuntime.jsx(_t,{}),jsxRuntime.jsx(Ft,{})]})}var Ut=()=>jsxRuntime.jsx("div",{className:"mt-5 flex flex-col gap-4 h-full",children:jsxRuntime.jsxs("div",{className:"space-y-3",children:[jsxRuntime.jsxs("div",{className:"flex gap-3",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-12 flex-1 rounded-turtle"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-12 w-48 rounded-turtle"})]}),jsxRuntime.jsxs(ui.Card,{variant:"shadow",gradient:"white",className:"rounded-turtle space-y-2",children:[jsxRuntime.jsxs("div",{className:"flex justify-between p-4",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-8 w-24"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-8 w-56 rounded-full"})]}),jsxRuntime.jsxs("div",{className:"mx-4 mb-4 space-y-1",children:[jsxRuntime.jsxs("div",{className:"flex justify-between",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-16"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-40"})]}),jsxRuntime.jsxs("div",{className:"flex justify-between",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-16"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-40"})]})]})]}),jsxRuntime.jsxs(ui.Card,{variant:"shadow",className:"rounded-turtle p-4",children:[jsxRuntime.jsx("div",{className:"mb-4",children:jsxRuntime.jsx(ui.Skeleton,{className:"h-20 w-full rounded-turtle"})}),jsxRuntime.jsxs("div",{className:"flex justify-between items-center mb-4",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-10 w-40 rounded-full"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-5 w-32"})]})]}),jsxRuntime.jsx(ui.Skeleton,{className:"h-14 w-full rounded-turtle"})]})});var Qt=()=>{let{isConnected:e,connect:t}=R(),{address:o,distributorId:r,openOverlay:s,sendTransaction:a,isLoading:u,refetchBalances:i}=Dt(),{opportunity:n,amount:l,token:p}=C(),m=d=>d.filter(c=>c.rewardType!=="points").reduce((c,h)=>c+(h.yield??0),0);return u?jsxRuntime.jsx(Ut,{}):jsxRuntime.jsxs("div",{className:"mt-5 flex flex-col gap-4 h-full",children:[jsxRuntime.jsxs("div",{className:"text-foreground space-y-3",children:[jsxRuntime.jsx(Ne,{}),jsxRuntime.jsxs(ui.Card,{variant:"shadow",gradient:"white",className:ui.cn("rounded-turtle space-y-2"),children:[jsxRuntime.jsxs("div",{className:"flex justify-between p-4",children:[jsxRuntime.jsx(te,{incentives:n?.incentives||[],className:"text-xl text-primary"}),jsxRuntime.jsx(ui.BaseSelector,{icon:ui.iconUrlToImg(n?.receiptToken?.logoUrl||"",n?.receiptToken?.symbol||""),text:n?.name||"",onClick:()=>s("opportunities"),size:"sm"})]}),jsxRuntime.jsx(ui.OpportunityRateEstimator,{value:{symbol:n?.baseTokens?.symbol||"",price:n?.baseTokens?.priceUsd||0,depositedAmountUsd:Number(Number(l??0)*Number(p?.price??0))||0,apr:m(n?.incentives||[])}})]})]}),n&&o&&r&&jsxRuntime.jsx(At,{opportunity:n,address:o,distributorId:r,stickyButton:true,refetchBalances:i,executeTransaction:async d=>await a(d)}),!e&&jsxRuntime.jsx("div",{className:"mt-auto sticky bottom-0",children:jsxRuntime.jsx(ui.Button,{variant:"green",border:"interactive",size:"lg",onClick:t,className:"w-full",children:"Connect Wallet"})})]})};function $t(){let{isMember:e}=R(),t=react.useMemo(()=>({positions:{label:"Your Positions",component:lt,visible:e},earn:{label:"Earn",component:Qt},discover:{label:"Discover",component:ct}}),[e]),o=react.useMemo(()=>({opportunities:{component:it},balances:{component:It}}),[]);return jsxRuntime.jsx(Ke,{children:jsxRuntime.jsx(me,{tabs:t,overlays:o,defaultTab:"earn"})})}function qt({adapter:e,config:t,distributorId:o}){return jsxRuntime.jsx(_e,{config:t,children:jsxRuntime.jsx(Ze,{adapter:e,distributorId:o,children:jsxRuntime.jsx($t,{})})})}var Gr={theme:"dark",widgetWidth:"default",customWidth:"100%",padding:"default",rounding:"default",fontFamily:"Montserrat",fontSecondary:"DM Sans",deals:[],campaigns:[],styles:{background:"#141514",background_dark:"#F9F9F9",foreground:"#F9F9F9",foreground_dark:"#141514",card:"#141514",card_dark:"#F9F9F9",muted_foreground:"#FFFFFF80",muted_foreground_dark:"#14151480",primary:"#73F36C",primary_dark:"#73F36C"}};//! Will be deprecated when just use distributorId to fetch everything from the API
2
- exports.EarnWidget=qt;exports.defaultWidgetStyleConfig=Gr;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var clsx=require('clsx'),react=require('react'),jsxRuntime=require('react/jsx-runtime'),ui=require('@turtleclub/ui'),classVarianceAuthority=require('class-variance-authority'),hooks=require('@turtleclub/hooks'),jotai=require('jotai'),lucideReact=require('lucide-react'),opportunities=require('@turtleclub/opportunities'),viem=require('viem'),utils=require('@turtleclub/utils'),chains=require('viem/chains');function B(...e){return clsx.clsx(e)}var Ce=react.createContext(null);function Te({config:e,children:t}){return jsxRuntime.jsx(Ce.Provider,{value:e,children:t})}function F(){let e=react.useContext(Ce);if(!e)throw new Error("useWidgetConfig must be used within WidgetConfigProvider");return e}function H(e){return `rgb(from ${e} calc(255 - r) calc(255 - g) calc(255 - b))`}function Wt(e,t=10){return `color-mix(in srgb, ${e} ${100-t}%, black)`}function xe(e,t){let o=t==="dark",r={"--color-brand-black":o?e.background_dark:H(e.background_dark),"--color-brand-white":o?e.foreground_dark:H(e.foreground_dark),"--color-brand-green":o?e.primary_dark:Wt(e.primary_dark)};return (e.card!==void 0||e.card_dark!==void 0)&&(r["--color-surface-primary"]=o?e.card_dark??e.card??e.background_dark:H(e.card_dark??e.background_dark)),(e.muted_foreground!==void 0||e.muted_foreground_dark!==void 0)&&(r["--muted-foreground"]=o?e.muted_foreground_dark??e.muted_foreground??e.foreground_dark:H(e.muted_foreground_dark??e.muted_foreground_dark??e.foreground_dark)),r}var we={background:"#F9F9F9",background_dark:"#141514",foreground:"#141514",foreground_dark:"#F9F9F9",primary:"#73F36C",primary_dark:"#73F36C",card:"#F9F9F9",card_dark:"#141514",muted_foreground:"#14151480",muted_foreground_dark:"#FFFFFF80"},Ne="dark",We="Montserrat, sans-serif",Oe="DM Sans, sans-serif";function N(){let e=F(),t=e?.theme??Ne,o=e?.fontFamily??We,r=e?.fontSecondary??Oe,n=e?.widgetWidth??"default",a=e?.customWidth??"100%",i=e?.showNavigation??true,c=e?.padding??"default",s=e?.rounding??"default",d=e?.styles??we,p=xe(d,t==="auto"?"dark":t);return {theme:t,coreTokenCSS:p,fontPrimary:o,fontSecondary:r,widgetWidth:n,customWidth:a,showNavigation:i,padding:c,rounding:s,config:e,widgetStyles:d}}var Se={xxs:"h-4 text-xs",xs:"h-6 text-sm",sm:"h-8 text-2xl",md:"h-12 text-4xl",lg:"h-16 text-6xl"};function Ee({light:e,dark:t,fallback:o="Turtle Club",className:r,size:n="lg"}){let[a,i]=react.useState(false),{theme:c}=N(),d=c==="dark"?t||e:e||t;return d&&!a?jsxRuntime.jsx("div",{className:ui.cn("flex justify-center items-center",r),children:jsxRuntime.jsx("img",{src:d,alt:o,className:ui.cn("object-contain",Se[n]),onError:()=>i(true),onLoad:()=>i(false)})}):jsxRuntime.jsx("div",{className:ui.cn("flex justify-center items-center",r),children:jsxRuntime.jsx("span",{className:ui.cn("font-bold text-primary",Se[n]),children:o})})}function Ae(){let e=F();return {light:e?.logo?.light,dark:e?.logo?.dark,fallback:e?.logo?.fallback||"Turtle Club"}}var At=classVarianceAuthority.cva("p-0",{variants:{padding:{none:"p-0",sm:"p-3",default:"p-4",md:"p-6",lg:"p-7"}},defaultVariants:{padding:"default"}});function te({children:e,className:t,variant:o,padding:r,rounding:n,showLogo:a=true,logoSize:i="xs",...c}){let{padding:s}=N(),{light:d,dark:m,fallback:p}=Ae(),k=At({padding:r??s});return jsxRuntime.jsxs(ui.Card,{className:B(t,k),...c,variant:o,gradient:"white",children:[a&&jsxRuntime.jsx("div",{className:"flex-shrink-0 py-2",children:jsxRuntime.jsx(Ee,{light:d,dark:m,fallback:p,size:i})}),e]})}var Pe=react.createContext(null),Le=react.createContext(""),_e=({adapter:e,distributorId:t,children:o})=>jsxRuntime.jsx(Pe.Provider,{value:e,children:jsxRuntime.jsx(Le.Provider,{value:t,children:o})}),W=()=>{let e=react.useContext(Pe);if(!e)throw new Error("useAdapter must be used within an AdapterProvider");return e},P=()=>react.useContext(Le);function Be({children:e}){let t=F(),{theme:o,coreTokenCSS:r,fontPrimary:n,fontSecondary:a,widgetWidth:i}=N();return jsxRuntime.jsx("div",{className:B("turtle-widget-root text-foreground","antialiased transition-all duration-700 ease-linear w-full overflow-hidden","h-full flex items-center justify-center",o==="dark"?"dark":""),style:{...r,"--font-primary":n,"--font-secondary":a,fontFamily:n,backgroundColor:"transparent",maxHeight:"90vh"},children:jsxRuntime.jsx("div",{className:B("flex flex-col gap-2 h-full overflow-hidden",i==="full"?"w-full items-center":i==="custom"?"items-stretch":"items-center"),style:{...i==="custom"&&t.customWidth?{width:t.customWidth}:i==="default"?{width:"620px"}:{}},children:jsxRuntime.jsx("div",{className:"w-full max-w-md h-full flex flex-col gap-2 overflow-hidden",children:e})})})}var O=()=>{let e=W(),t=react.useRef(void 0),o=react.useRef(false),{data:r,isLoading:n,refetch:a}=hooks.useCheckMembership({params:{address:e.user||"",walletEcosystem:"evm"},enabled:!!e.user}),{mutateAsync:i,isPending:c,error:s}=hooks.useCreateMembershipAgreement(),{mutateAsync:d,isPending:m,error:p}=hooks.useCreateMembership();react.useEffect(()=>{let g=e.user;if(!g){t.current!==void 0&&(t.current=void 0);return}g!==t.current&&(t.current=g,k(g));},[e.user]);let k=async g=>{if(!o.current){o.current=true;try{let{data:A}=await a();if(A?.isMember){console.log("[useWidgetAuth] User is already a member");return}console.log("[useWidgetAuth] User is not a member, starting membership flow..."),console.log("[useWidgetAuth] Creating membership agreement...");let R=await i({address:g,walletEcosystem:"evm",url:window.location.href,chainId:String(e.network||1)});console.log("[useWidgetAuth] Requesting signature from wallet...");let f=await e.signMessage(R.message);console.log("[useWidgetAuth] Creating membership with signature...");let C=await d({address:g,walletEcosystem:"evm",signature:f,nonce:R.nonce});C.isMember?console.log("[useWidgetAuth] Membership created successfully!"):console.error("[useWidgetAuth] Failed to create membership:",C.error);}catch(A){console.error("[useWidgetAuth] Membership flow error:",A);}finally{o.current=false;}}},u=n||c||m,l=s?.message||p?.message||null;return {address:e.user,isConnected:!!e.user,isMember:r?.isMember,currentChain:e.network,connect:e.openConnectionModal,disconnect:e.disconnect,changeNetwork:e.changeNetwork,isLoading:u,error:l}};function Ue(e){let[t,o]=react.useState(e),r=react.useCallback(n=>{o(n);},[]);return {currentTab:t,setTab:r}}var Ut=jotai.atom({id:"none"});function h(){let[e,t]=jotai.useAtom(Ut),o=react.useCallback((n,a)=>{t({id:n,data:a});},[t]),r=react.useCallback(()=>{t({id:"none"});},[t]);return {currentOverlay:e.id,overlayData:e.data,isOverlayOpen:e.id!=="none",openOverlay:o,closeOverlay:r}}function ne({tabs:e,overlays:t,defaultTab:o}){let {showNavigation:r}=N(),{currentTab:n}=Ue(o),{currentOverlay:i,overlayData:c}=h();react.useMemo(()=>Object.entries(e).filter(([u,l])=>l.visible!==false).map(([u,l])=>({value:u,label:l.label})),[e]);let m=react.useMemo(()=>e[n].component,[n,e]),p=react.useMemo(()=>i==="none"?null:t[i].component,[i,t]);return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[r&&false,jsxRuntime.jsx("div",{className:"flex-1 min-h-0 overflow-hidden flex flex-col gap-2 bg-transparent",children:jsxRuntime.jsx(te,{variant:"border",className:"flex-1 min-h-0 w-full flex flex-col overflow-hidden",children:jsxRuntime.jsx("div",{className:"flex-1 min-h-0 overflow-hidden",children:p?jsxRuntime.jsx(p,{data:c}):jsxRuntime.jsx(m,{})})})})]})}function M({onBack:e,children:t,className:o}){let{closeOverlay:r}=h();return jsxRuntime.jsxs("div",{className:`flex flex-col h-full ${o||""}`,children:[jsxRuntime.jsx("div",{className:"flex items-center gap-2 pb-3",children:jsxRuntime.jsx(ui.Button,{variant:"green",border:"interactive",size:"icon",onClick:e??r,className:"h-8 w-8 shrink-0","aria-label":"Go back",children:jsxRuntime.jsx(lucideReact.ChevronLeft,{className:"h-5 w-5"})})}),jsxRuntime.jsx("div",{className:"flex-1 min-h-0 overflow-auto pt-4",children:t})]})}var ae=jotai.atom(null),ie=jotai.atom(null),se=jotai.atom(opportunities.SLIPPAGE_DEFAULT),de=jotai.atom(null),$e=jotai.atom(e=>{let t=e(ae),o=e(de),r=e(ie),n=e(se),a=!!(r&&Number.parseFloat(r)>0),i=!!t&&!!o&&a&&!!n,c=i?{chain:Number(t?.receiptToken?.chain.chainId)??1,token_in:o?.token.address??"",token_out:t?.receiptToken?.address??"",amount:viem.parseUnits(r??"0",o?.token.decimals??18).toString(),slippage:n}:void 0;return {opportunity:t,tokenBalance:o,amount:r,options:c,isValid:i}});function T(){let[e,t]=jotai.useAtom(ae),[o,r]=jotai.useAtom(de),[n,a]=jotai.useAtom(ie),[i,c]=jotai.useAtom(se),s=jotai.useAtomValue($e),d=react.useCallback(()=>{r(null),a(""),c(opportunities.SLIPPAGE_DEFAULT);},[r,a,c]);return react.useEffect(()=>{o&&(a(""),c(opportunities.SLIPPAGE_DEFAULT));},[o,a,c]),{opportunity:e,tokenBalance:o,amount:n,slippage:i,isValid:s.isValid,options:s.options,selectOpportunity:t,selectTokenBalance:r,setAmount:a,setSlippage:c,reset:d}}function He(){let e=P(),{data:t,isLoading:o,error:r}=hooks.useWidgetOpportunities(e),{changeNetwork:n,network:a}=W(),{selectOpportunity:i,selectTokenBalance:c}=T(),{closeOverlay:s}=h();return o?jsxRuntime.jsx("div",{children:"Loading..."}):r?jsxRuntime.jsxs("div",{children:["Error: ",r.message]}):t===void 0?jsxRuntime.jsx("div",{children:"No data"}):t.opportunities&&t.opportunities.length===0?jsxRuntime.jsx("div",{children:"No opportunities"}):jsxRuntime.jsx(M,{children:jsxRuntime.jsx(opportunities.OpportunitiesTable,{opportunities:t.opportunities||[],currentNetwork:a,onSelectOpportunity:i,onChangeNetwork:n,onResetToken:()=>c(null),onClose:s,isWidget:true})})}var Ye=()=>{let{openOverlay:e}=h();return jsxRuntime.jsx("button",{onClick:()=>{e("balances"),console.log("Positions Content Click");},children:"Positions Content Click"})};var Qe=()=>jsxRuntime.jsx("div",{children:"Discover Content"});function qe(e){return {chainId:Number(e.receiptToken?.chain.chainId)??chains.mainnet.id,address:e.receiptToken?.address??"",symbol:e.receiptToken?.symbol??"",decimals:e.receiptToken?.decimals??18}}function et({opportunity:e,address:t,distributorId:o,executeTransaction:r,refetchBalances:n,refreshSelectedToken:a,stickyButton:i=false}){let{openOverlay:c}=h(),{chainId:s,symbol:d,decimals:m}=react.useMemo(()=>qe(e),[e]),{setAmount:p,setSlippage:k,tokenBalance:u,amount:l,slippage:g,options:A,isValid:R,reset:f}=T(),{usdValue:C,hasInsufficientBalance:y,handleMaxClick:I}=hooks.useTokenBalance({tokenBalance:u,amount:l??void 0,setAmount:w=>p(w??null)}),{routeDetails:D,isReady:ht,outputAmount:$,fetchedRoute:Z,routeError:pe,isLoadingRoute:fe}=hooks.useSwapRoute(R,t,o,A),vt=react.useCallback(async w=>{let ee={from:w.from,to:w.to,data:w.data,value:BigInt(w.value),chainId:s??1};return await r(ee)},[r,s]),{steps:yt,currentStep:ge,canExecute:he,isExecuting:z,allCompleted:bt,hasError:ve,cancelled:K,executeCurrentTransaction:ye,resetQueue:kt,totalSteps:be,completedSteps:ke,showTxStatus:j}=opportunities.useTransactionQueue({earnRoute:Z,userAddress:t,chainId:s,sendTransaction:vt,onSuccess:()=>{n(),a();}}),Ct=react.useMemo(()=>{let w=l?utils.formatNumber(l,6,true,false):"0",ee=$&&m?utils.formatToken($,{decimals:m},true,false,6):"0";return {deposit:l?`${w} ${u?.token.symbol||"ETH"}`:"0 ETH",receive:$&&m?`${ee} ${d||"ETH"}`:"0 ETH",equivalentInUsd:l&&u?.token.priceUsd?(Number.parseFloat(l)*u.token.priceUsd).toFixed(2):"0.00",defaultOpen:true,slippage:g,setSlippage:k}},[l,$,m,d,u,g]);return jsxRuntime.jsxs("div",{className:ui.cn("grid gap-3 flex-1 min-h-0",i?"grid-rows-[auto_1fr_auto] pb-6":"grid-rows-[auto_1fr]"),children:[jsxRuntime.jsx(ui.SwapInput,{tokens:[],useCustomTokenSelector:true,selectedTokenData:u?.token,onCustomTokenSelectorClick:()=>c("balances"),value:l??void 0,onChange:p,usdValue:y?void 0:C,balance:u?utils.formatToken(u.amount,u.token,true,false,5):"0",onMaxClick:I,className:ui.cn("p-5",y?"border-destructive/50 border":"border-border border")}),jsxRuntime.jsxs("div",{className:"overflow-auto min-h-0 space-y-3",children:[ht&&D&&jsxRuntime.jsx(ui.SwapDetails,{details:Ct}),D&&D.length>0&&jsxRuntime.jsx(opportunities.RouteDetails,{value:{steps:D}}),ge&&l&&j&&jsxRuntime.jsx(opportunities.TransactionStatusSection,{steps:yt,currentStep:ge,allCompleted:bt,cancelled:K,tokenSymbol:u?.token.symbol||"",amount:l,resetQueue:kt,resetForm:f,refetchBalances:n}),!i&&!j&&jsxRuntime.jsx("div",{className:"pt-3",children:jsxRuntime.jsx(opportunities.ConfirmButton,{fetchedRoute:Z,routeError:pe,isLoadingRoute:fe,canExecute:he,isExecuting:z,hasError:ve,cancelled:K,executeCurrentTransaction:ye,totalSteps:be,completedSteps:ke,showingTransactionStatus:z,hasInsufficientBalance:y})})]}),i&&!j&&jsxRuntime.jsx("div",{className:"w-full",children:jsxRuntime.jsx(opportunities.ConfirmButton,{fetchedRoute:Z,routeError:pe,isLoadingRoute:fe,canExecute:he,isExecuting:z,hasError:ve,cancelled:K,executeCurrentTransaction:ye,totalSteps:be,completedSteps:ke,showingTransactionStatus:z,hasInsufficientBalance:y})})]})}var bo=(e,t)=>{let o=e.filter(n=>Number(n.token.chain.chainId)===t);return o.filter(n=>(typeof n.amount=="bigint"?n.amount:BigInt(n.amount))>0n)[0]??o[0]??null};function ot(){let{user:e,network:t,sendTransaction:o}=W(),r=P(),{openOverlay:n}=h(),{tokenBalance:a,selectOpportunity:i,selectTokenBalance:c,opportunity:s}=T(),d=react.useRef(null),m=react.useRef(null),{balances:p,isLoading:k,refetchAll:u}=hooks.useBalance({chainIds:[Number(s?.receiptToken?.chain.chainId)??chains.mainnet.id],address:e,depositOpportunity:s}),{data:l,isLoading:g}=hooks.useWidgetOpportunities(r);react.useEffect(()=>{if(l&&l.opportunities&&l.opportunities.length>0&&!s){let f=t??chains.mainnet.id,y=l.opportunities.find(I=>Number(I.receiptToken?.chain.chainId)===f)||l.opportunities[0];i(y);}},[l,s,t]),react.useEffect(()=>{let f=t??chains.mainnet.id;if(m.current!==null&&m.current!==f&&l?.opportunities&&l.opportunities.length>0){let y=l.opportunities.find(I=>Number(I.receiptToken?.chain.chainId)===f);y&&i(y);}m.current=f;},[t,l,i]),react.useEffect(()=>{let f=Number(s?.receiptToken?.chain.chainId)??chains.mainnet.id,C=a?.token.chain.chainId,y=d.current!==f,I=!a||Number(C)!==f;if(y&&I&&p.length>0){let D=bo(p,f);D&&(c(D),d.current=f);}else y||(d.current=f);},[s,a,p,c]);let A=react.useMemo(()=>k||g,[k,g]),R=react.useCallback(()=>{if(!a)return;let f=p.find(C=>C.token.address.toLowerCase()===a.token.address.toLowerCase()&&Number(C.token.chain.chainId)===Number(a.token.chain.chainId));f&&c(f);},[p,a,c]);return {address:e,network:t,distributorId:r,openOverlay:n,sendTransaction:o,isLoading:A,refetchBalances:u,refreshSelectedToken:R}}function xo(e,t=4){return e?`${e.slice(0,t+2)}...${e.slice(-t)}`:""}function rt(){let{isMember:e,isLoading:t,address:o,isConnected:r,disconnect:n}=O();if(t)return jsxRuntime.jsx("div",{className:"h-10 w-[133px] animate-pulse rounded-full bg-neutral-alpha-10"});if(!r)return null;if(r&&e)return jsxRuntime.jsx(ui.Button,{variant:"ghost",border:"bordered",onClick:n,className:"group min-w-[140px] transition-colors",children:jsxRuntime.jsxs("div",{className:"gap-2 flex text-md items-center justify-between",children:[jsxRuntime.jsx(lucideReact.Wallet2Icon,{className:"size-6 stroke-accent group-hover:hidden"}),jsxRuntime.jsx(lucideReact.LogOutIcon,{className:"hidden size-6 stroke-destructive group-hover:block"}),jsxRuntime.jsx("span",{className:"group-hover:hidden",children:xo(o)}),jsxRuntime.jsx("span",{className:"hidden group-hover:block text-foreground",children:"Disconnect"})]})})}function at(){let e=P(),{data:t}=hooks.useWidgetOpportunities(e),o=t?.chains||[],{changeNetwork:r,currentChain:n,isConnected:a}=O(),i=react.useMemo(()=>o.find(s=>Number(s.chainId)===n)||o[0],[o,n]),c=async s=>{try{await r(s);}catch(d){console.error("Failed to change network:",d);}};return a?jsxRuntime.jsxs(ui.DropdownMenu,{children:[jsxRuntime.jsx(ui.DropdownMenuTrigger,{src:i?.logoUrl,children:i?.name}),jsxRuntime.jsx(ui.DropdownMenuContent,{children:o.map(s=>jsxRuntime.jsxs(ui.DropdownMenuItem,{onClick:()=>c(Number(s.chainId)),children:[jsxRuntime.jsx("img",{src:s.logoUrl,alt:s.name,className:"size-6 rounded-full"}),s.name]},s.id))})]}):null}function ue(){return jsxRuntime.jsxs("div",{className:"flex justify-between items-center gap-2",children:[jsxRuntime.jsx(rt,{}),jsxRuntime.jsx(at,{})]})}var dt=()=>jsxRuntime.jsx("div",{className:"mt-5 flex flex-col gap-4 h-full",children:jsxRuntime.jsxs("div",{className:"space-y-3",children:[jsxRuntime.jsxs("div",{className:"flex gap-3",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-12 flex-1 rounded-turtle"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-12 w-48 rounded-turtle"})]}),jsxRuntime.jsxs(ui.Card,{variant:"shadow",gradient:"white",className:"rounded-turtle space-y-2",children:[jsxRuntime.jsxs("div",{className:"flex justify-between p-4",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-8 w-24"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-8 w-56 rounded-full"})]}),jsxRuntime.jsxs("div",{className:"mx-4 mb-4 space-y-1",children:[jsxRuntime.jsxs("div",{className:"flex justify-between",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-16"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-40"})]}),jsxRuntime.jsxs("div",{className:"flex justify-between",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-16"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-4 w-40"})]})]})]}),jsxRuntime.jsxs(ui.Card,{variant:"shadow",className:"rounded-turtle p-4",children:[jsxRuntime.jsx("div",{className:"mb-4",children:jsxRuntime.jsx(ui.Skeleton,{className:"h-20 w-full rounded-turtle"})}),jsxRuntime.jsxs("div",{className:"flex justify-between items-center mb-4",children:[jsxRuntime.jsx(ui.Skeleton,{className:"h-10 w-40 rounded-full"}),jsxRuntime.jsx(ui.Skeleton,{className:"h-5 w-32"})]})]}),jsxRuntime.jsx(ui.Skeleton,{className:"h-14 w-full rounded-turtle"})]})});var ct=()=>{let{isConnected:e,connect:t}=O(),{address:o,distributorId:r,openOverlay:n,sendTransaction:a,isLoading:i,refetchBalances:c,refreshSelectedToken:s}=ot(),{opportunity:d,amount:m,tokenBalance:p}=T(),k=u=>u.filter(l=>l.rewardType!=="points").reduce((l,g)=>l+(g.yield??0),0);return i?jsxRuntime.jsx(dt,{}):jsxRuntime.jsxs("div",{className:"mt-5 flex flex-col gap-4 h-full",children:[jsxRuntime.jsxs("div",{className:"text-foreground space-y-3",children:[jsxRuntime.jsx(ue,{}),jsxRuntime.jsxs(ui.Card,{variant:"shadow",gradient:"white",className:ui.cn("rounded-turtle space-y-2"),children:[jsxRuntime.jsxs("div",{className:"flex justify-between p-4",children:[jsxRuntime.jsx(opportunities.APRBreakdownTooltip,{vaultConfig:d?.vaultConfig??void 0,incentives:d?.incentives||[],isWidget:true,className:"text-xl text-primary"}),jsxRuntime.jsx(ui.BaseSelector,{icon:ui.iconUrlToImg(d?.receiptToken?.logoUrl||"",d?.receiptToken?.symbol||""),text:d?.name||"",onClick:()=>n("opportunities"),size:"sm"})]}),jsxRuntime.jsx(ui.OpportunityRateEstimator,{value:{symbol:d?.baseTokens?.symbol||"",price:d?.baseTokens?.priceUsd||0,depositedAmountUsd:Number(Number(m??0)*Number(p?.token.priceUsd??0))||0,apr:k(d?.incentives||[])}})]})]}),d&&o&&r&&jsxRuntime.jsx(et,{opportunity:d,address:o,distributorId:r,stickyButton:true,refetchBalances:c,refreshSelectedToken:s,executeTransaction:async u=>await a(u)}),!e&&jsxRuntime.jsx("div",{className:"mt-auto sticky bottom-0",children:jsxRuntime.jsx(ui.Button,{variant:"green",border:"interactive",size:"lg",onClick:t,className:"w-full",children:"Connect Wallet"})})]})};function ut(){let{selectTokenBalance:e,opportunity:t}=T(),{closeOverlay:o}=h(),{user:r}=W(),n=Number(t?.receiptToken?.chain.chainId)??chains.mainnet.id,{balances:a,isLoading:i,error:c}=hooks.useBalance({chainIds:[n],address:r||"",depositOpportunity:t}),s=react.useMemo(()=>a.filter(m=>Number(m.token.chain.chainId)===n),[a,n]),d=react.useCallback(m=>{e(m),o();},[e,o]);return c?jsxRuntime.jsxs("div",{children:["Error: ",c.message]}):jsxRuntime.jsx(M,{children:jsxRuntime.jsx(opportunities.BalancesDataTable,{balances:s,isLoading:i,onBalanceSelect:d,emptyStateMessage:"No balances found"})})}function ft(){let{isMember:e}=O(),t=react.useMemo(()=>({positions:{label:"Your Positions",component:Ye,visible:e},earn:{label:"Earn",component:ct},discover:{label:"Discover",component:Qe}}),[e]),o=react.useMemo(()=>({opportunities:{component:He},balances:{component:ut}}),[]);return jsxRuntime.jsx(Be,{children:jsxRuntime.jsx(ne,{tabs:t,overlays:o,defaultTab:"earn"})})}function gt({adapter:e,config:t,distributorId:o}){return jsxRuntime.jsx(Te,{config:t,children:jsxRuntime.jsx(_e,{adapter:e,distributorId:o,children:jsxRuntime.jsx(ft,{})})})}var Go={theme:"dark",widgetWidth:"default",customWidth:"100%",padding:"default",rounding:"default",fontFamily:"Montserrat",fontSecondary:"DM Sans",deals:[],campaigns:[],styles:{background:"#141514",background_dark:"#F9F9F9",foreground:"#F9F9F9",foreground_dark:"#141514",card:"#141514",card_dark:"#F9F9F9",muted_foreground:"#FFFFFF80",muted_foreground_dark:"#14151480",primary:"#73F36C",primary_dark:"#73F36C"}};//! Will be deprecated when just use distributorId to fetch everything from the API
2
+ exports.EarnWidget=gt;exports.defaultWidgetStyleConfig=Go;//# sourceMappingURL=index.cjs.map
3
3
  //# sourceMappingURL=index.cjs.map