@orderly.network/trading-leaderboard 2.1.3 → 2.2.0

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
@@ -109,7 +109,7 @@ type TradingData = {
109
109
  };
110
110
  type TradingListScriptReturn = ReturnType<typeof useTradingListScript>;
111
111
  declare const FilterDays: readonly [7, 14, 30, 90];
112
- type TFilterDays = typeof FilterDays[number];
112
+ type TFilterDays = (typeof FilterDays)[number];
113
113
  type DateRange = {
114
114
  from?: Date;
115
115
  to?: Date;
@@ -157,7 +157,6 @@ declare function useLeaderboardScript(options: LeaderboardScriptOptions): {
157
157
  isVideo: boolean;
158
158
  showCampaigns: boolean;
159
159
  isMobile: boolean;
160
- canTrading: boolean;
161
160
  };
162
161
 
163
162
  type LeaderboardProps = {
package/dist/index.d.ts CHANGED
@@ -109,7 +109,7 @@ type TradingData = {
109
109
  };
110
110
  type TradingListScriptReturn = ReturnType<typeof useTradingListScript>;
111
111
  declare const FilterDays: readonly [7, 14, 30, 90];
112
- type TFilterDays = typeof FilterDays[number];
112
+ type TFilterDays = (typeof FilterDays)[number];
113
113
  type DateRange = {
114
114
  from?: Date;
115
115
  to?: Date;
@@ -157,7 +157,6 @@ declare function useLeaderboardScript(options: LeaderboardScriptOptions): {
157
157
  isVideo: boolean;
158
158
  showCampaigns: boolean;
159
159
  isMobile: boolean;
160
- canTrading: boolean;
161
160
  };
162
161
 
163
162
  type LeaderboardProps = {
package/dist/index.js CHANGED
@@ -4,30 +4,28 @@ var ui = require('@orderly.network/ui');
4
4
  var i18n = require('@orderly.network/i18n');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var react = require('react');
7
- var bt = require('embla-carousel-react');
7
+ var pt = require('embla-carousel-react');
8
8
  var hooks = require('@orderly.network/hooks');
9
9
  var types = require('@orderly.network/types');
10
10
  var dateFns = require('date-fns');
11
- var reactApp = require('@orderly.network/react-app');
12
- var trading = require('@orderly.network/trading');
13
11
 
14
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
13
 
16
- var bt__default = /*#__PURE__*/_interopDefault(bt);
14
+ var pt__default = /*#__PURE__*/_interopDefault(pt);
17
15
 
18
- var J=25,ue=6,Pe=e=>e.currentCampaigns.length===0?null:jsxRuntime.jsxs(ui.Box,{width:"100%",intensity:900,p:3,className:ui.cn("oui-mobile-trading-leaderboard-campaigns oui-rounded-[20px]",e.className),style:e.style,children:[jsxRuntime.jsx(lt,{...e}),jsxRuntime.jsx(ui.Box,{r:"xl",mt:3,ref:e.enableScroll?e.emblaRef:void 0,className:ui.cn("oui-w-full oui-min-w-0 oui-overflow-hidden","oui-select-none oui-cursor-pointer"),children:jsxRuntime.jsx(ui.Flex,{children:e.currentCampaigns.map(t=>jsxRuntime.jsx(dt,{campaign:t},t.title))})}),e.enableScroll&&jsxRuntime.jsx(ut,{style:{width:J*e.currentCampaigns.length},list:e.currentCampaigns,scrollIndex:e.scrollIndex,scrollTo:e.emblaApi?.scrollTo})]}),lt=e=>{let{t}=i18n.useTranslation();return jsxRuntime.jsxs(ui.Flex,{justify:"between",itemAlign:"center",children:[jsxRuntime.jsx(ui.Text,{size:"base",intensity:80,children:t("tradingLeaderboard.campaigns")}),jsxRuntime.jsx(ui.Select.options,{size:"xs",value:e.category,onValueChange:e.onCategoryChange,options:e.options,classNames:{trigger:"oui-w-[--radix-select-content-available-width]"}})]})},dt=({campaign:e})=>{let{title:t,description:r,image:a,displayTime:s,learnMoreUrl:o,tradingUrl:l}=e,{t:n}=i18n.useTranslation();return jsxRuntime.jsxs(ui.Box,{intensity:800,r:"xl",className:"oui-flex-[0_0_100%]",children:[jsxRuntime.jsx("img",{className:"oui-w-full oui-h-[calc((100vw-48px)/2)] oui-rounded-t-xl oui-object-fill",src:a,alt:t}),jsxRuntime.jsxs(ui.Flex,{itemAlign:"start",justify:"between",direction:"column",height:"100%",p:4,gapY:3,className:"oui-font-semibold",children:[jsxRuntime.jsxs(ui.Flex,{direction:"column",itemAlign:"start",gapY:1,children:[jsxRuntime.jsx(ui.Text,{size:"sm",children:t}),jsxRuntime.jsx(ui.Text,{size:"2xs",intensity:54,children:s}),jsxRuntime.jsx(ui.Text,{size:"2xs",intensity:36,children:r})]}),jsxRuntime.jsxs(ui.Flex,{justify:"between",width:"100%",gapX:3,children:[jsxRuntime.jsx(ui.Button,{variant:"outlined",color:"secondary",fullWidth:true,size:"md",onClick:()=>{window.open(o,"_blank");},children:n("tradingLeaderboard.learnMore")}),jsxRuntime.jsx(ui.Button,{size:"md",fullWidth:true,onClick:()=>{window.open(l,"_self");},children:n("tradingLeaderboard.tradeNow")})]})]})]})},ut=e=>{let{style:t,scrollIndex:r,list:a}=e;return jsxRuntime.jsxs(ui.Flex,{mt:3,r:"full",height:ue,className:ui.cn("oui-bg-line oui-mx-auto oui-relative"),style:e.style,children:[a.map((s,o)=>jsxRuntime.jsx(ui.Box,{width:J,height:ue,onClick:()=>{e.scrollTo?.(o);},r:"full",className:"oui-cursor-pointer"},o)),jsxRuntime.jsx(ui.Box,{width:J,height:ue,r:"full",className:ui.cn("oui-absolute oui-left-0 oui-top-0","oui-transition-all oui-duration-300","oui-bg-primary"),style:{transform:`translateX(${r*J}px)`}})]})};var X=e=>({from:dateFns.subDays(new Date,e-1),to:new Date}),F=e=>dateFns.format(e,"yyyy-MM-dd");function ce(e){let t=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];typeof e=="string"&&(e=new Date(e));let r=e.getUTCFullYear(),a=t[e.getUTCMonth()],s=e.getUTCDate(),o=String(e.getUTCHours()).padStart(2,"0"),l=String(e.getUTCMinutes()).padStart(2,"0");return `${a} ${s}, ${r} ${o}:${l}`}var Re=react.createContext({}),De=e=>jsxRuntime.jsx(Re.Provider,{value:{campaigns:e.campaigns,href:e.href,backgroundSrc:e.backgroundSrc},children:e.children}),Ie=()=>react.useContext(Re);function me(){let{t:e}=i18n.useTranslation(),{campaigns:t=[],href:r}=Ie(),[a,s]=react.useState("ongoing"),{track:o,tracking:l}=hooks.useTrack(),n=react.useMemo(()=>{let c=new Date;return t.reduce((u,p)=>{let L=new Date(p.startTime),h=new Date(p.endTime);return c>=L&&c<=h?u.ongoing.push(p):c>h?u.past.push(p):u.future.push(p),u},{ongoing:[],past:[],future:[]})},[t]),g=react.useMemo(()=>[{label:e("tradingLeaderboard.ongoing"),value:"ongoing"},{label:e("tradingLeaderboard.future"),value:"future"},{label:e("tradingLeaderboard.past"),value:"past"}].filter(u=>n[u.value].length>0),[n,e]),m=react.useMemo(()=>n[a].map(u=>{let{startTime:p,endTime:L}=u,h,O=r?.trading;return typeof u.href=="object"?(h=u.href.learnMore,O=u.href.trading):h=u.href,{...u,displayTime:`${ce(p)} - ${ce(L)} UTC`,learnMoreUrl:h,tradingUrl:O}}),[n,a,r]);react.useEffect(()=>{let u=["ongoing","future","past"].find(p=>n[p].length>0);u&&s(u);},[n]);let D=c=>{s(c);},[ne,se]=react.useState(0),[le,C]=bt__default.default({loop:false,slidesToScroll:"auto"});react.useEffect(()=>{C?.on("select",()=>{se(C?.selectedScrollSnap());});},[C]);let v=c=>{o(types.TrackerEventName.leaderboardCampaignClickLearnMore,{campaign_title:c.title}),window.open(c.learnMoreUrl,"_blank");},_=c=>{l(types.TrackerEventName.leaderboardCampaignClickTradeNow,{campaign_title:c.title}),window.open(c.tradingUrl,"_self");};return {options:g,currentCampaigns:m,category:a,onCategoryChange:D,tradingUrl:r?.trading,emblaRef:le,emblaApi:C,scrollIndex:ne,enableScroll:m?.length>1,onLearnMore:v,onTradeNow:_}}var pe=e=>e.currentCampaigns.length===0?null:jsxRuntime.jsxs(ui.Box,{width:"100%",intensity:900,p:5,pr:2,height:288,className:ui.cn("oui-trading-leaderboard-campaigns oui-rounded-[20px]",e.className),style:e.style,children:[jsxRuntime.jsx(ht,{...e}),jsxRuntime.jsx(ui.Box,{mt:5,r:"xl",className:ui.cn("oui-overflow-y-auto","oui-custom-scrollbar"),children:jsxRuntime.jsx(ui.Flex,{gapY:5,height:200,direction:"column",r:"xl",className:"oui-pr-1.5",children:e.currentCampaigns.map(t=>jsxRuntime.jsx(St,{campaign:t,onLearnMore:e.onLearnMore,onTradeNow:e.onTradeNow},t.title))})})]}),ht=e=>{let{t}=i18n.useTranslation();return jsxRuntime.jsxs(ui.Flex,{justify:"between",itemAlign:"center",pr:3,children:[jsxRuntime.jsx(ui.Text,{size:"xl",children:t("tradingLeaderboard.campaigns")}),jsxRuntime.jsx(ui.Select.options,{size:"xs",value:e.category,onValueChange:e.onCategoryChange,options:e.options,classNames:{trigger:"oui-w-[--radix-select-content-available-width]"}})]})},St=({campaign:e,onLearnMore:t,onTradeNow:r})=>{let{title:a,description:s,image:o,displayTime:l}=e,{t:n}=i18n.useTranslation();return jsxRuntime.jsxs(ui.Flex,{intensity:800,r:"xl",width:"100%",children:[jsxRuntime.jsx("img",{className:"oui-h-[200px] oui-w-[400px] oui-rounded-l-xl oui-object-fill",src:o,alt:a}),jsxRuntime.jsxs(ui.Flex,{itemAlign:"start",justify:"between",direction:"column",height:"100%",p:5,className:"oui-flex-1 oui-font-semibold",children:[jsxRuntime.jsxs(ui.Flex,{gap:1,direction:"column",itemAlign:"start",children:[jsxRuntime.jsx(ui.Text,{size:"xl",children:a}),jsxRuntime.jsx(ui.Text,{size:"sm",intensity:36,children:s})]}),jsxRuntime.jsxs(ui.Flex,{justify:"between",width:"100%",children:[jsxRuntime.jsx(ui.Text,{size:"xs",intensity:54,children:l}),jsxRuntime.jsxs(ui.Flex,{gap:3,children:[jsxRuntime.jsx(ui.Button,{variant:"outlined",color:"secondary",size:"md",onClick:()=>{t(e);},children:n("tradingLeaderboard.learnMore")}),jsxRuntime.jsx(ui.Button,{size:"md",onClick:()=>{r(e);},children:n("tradingLeaderboard.tradeNow")})]})]})]})]})};var B=e=>{let t=me(),{isMobile:r}=ui.useScreen();return r?jsxRuntime.jsx(Pe,{...t,className:e.className,style:e.style}):jsxRuntime.jsx(pe,{...t,className:e.className,style:e.style})};function Oe(e,t){let r=react.useRef(),a=react.useRef(t);a.current=t,react.useEffect(()=>{let s={root:null,rootMargin:"0px",threshold:0},o=l=>{l.forEach(n=>{n.isIntersecting&&a.current?.();});};return r.current=new IntersectionObserver(o,s),()=>{r.current?.disconnect();}},[]),react.useEffect(()=>{e.current&&r.current?.observe(e.current);},[e.current]);}var He=[7,14,30,90];function be(){let[e,t]=react.useState(""),[r]=react.useState({sortKey:"perp_volume",sort:"desc"}),[a,s]=react.useState(r),{state:o}=hooks.useAccount(),l=hooks.useConfig("brokerId"),{isMobile:n}=ui.useScreen(),g=o.address&&(o.status>=types.AccountStatusEnum.EnableTrading||o.status===types.AccountStatusEnum.EnableTradingWithoutConnected),{dateRange:m,filterDay:D,updateFilterDay:ne,filterItems:se,onFilter:le}=Dt(),{page:C,pageSize:v,setPage:_,parsePagination:c}=ui.usePagination({pageSize:100}),u=i=>{let d=new URLSearchParams;if(d.set("page",i.page.toString()),d.set("size",i.pageSize.toString()),d.set("aggregateBy","ACCOUNT"),l&&d.set("broker_id",l),i.sort)d.set("sort",i.sort);else if(i.sort!==null&&a){let b=a.sort==="asc"?"ascending":"descending";d.set("sort",`${b}_${a.sortKey}`);}return m.from&&d.set("start_date",F(m.from)),m.to&&d.set("end_date",F(m.to)),i.address&&d.set("address",i.address),i.address?`/v1/volume/broker/daily?${d.toString()}`:`/v1/broker/leaderboard/daily?${d.toString()}`},{data:p,isLoading:L}=Rt(u({page:C,pageSize:v,address:e}),e),{data:h,size:O,setSize:et,isValidating:Le}=hooks.useInfiniteQuery((i,d)=>d&&!d.rows?.length||!n?null:u({page:i+1,pageSize:v,address:e}),{initialSize:1,formatter:i=>i,revalidateOnFocus:false}),{data:we}=hooks.useQuery(o.address?u({page:1,pageSize:100,sort:`descending_${a?.sortKey||"perp_volume"}`}):null,{formatter:i=>i,revalidateOnFocus:false}),{data:de=[]}=hooks.usePrivateQuery(g?u({page:1,pageSize:1,address:o.address,sort:null}):null,{revalidateOnFocus:false}),K=react.useCallback(i=>{let d=we?.rows.findIndex(b=>It(b.address,i));return d!==-1?d+1:"100+"},[we]),G=react.useMemo(()=>!g||L?[]:de.length?de?.map(i=>({...i,rank:K(i.address),key:M(i.address)})):[{key:M(o.address),address:o.address,rank:"-"}],[g,o.address,de,L,K]),Y=react.useCallback((i,d)=>i?.map((b,A)=>{let H=A+1;return e?H=K(b.address):a?.sort==="asc"?H=d-(C-1)*v-A:a?.sort==="desc"&&(H=(C-1)*v+A+1),{...b,rank:H}}),[C,v,a,e,K]),tt=react.useMemo(()=>{let i=p?.rows||[],d=p?.meta.total||0,b=Y(i,d);return C===1&&!e?[...G,...b]:b},[p,C,G,e,Y]),rt=react.useMemo(()=>{if(!h?.length)return [];let i=h[0]?.meta.total||0,d=h?.map(A=>A.rows)?.flat(),b=Y(d,i);return e?b:[...G,...b]},[h,G,e,Y]),Fe=react.useRef(null),at=react.useMemo(()=>c(p?.meta),[c,p]);Oe(Fe,()=>{!Le&&n&&et(O+1);});let ot=i=>{t(i);},it=react.useCallback(()=>{t("");},[]),nt=react.useCallback(i=>{s(i||r);},[r]);return react.useEffect(()=>{e&&_(1);},[e]),react.useEffect(()=>{_(1);},[o.address]),react.useEffect(()=>{m.to&&m.from&&_(1);},[m]),{pagination:at,dateRange:m,filterDay:D,updateFilterDay:ne,filterItems:se,onFilter:le,initialSort:r,onSort:nt,dataSource:tt,isLoading:L||Le,searchValue:e,onSearchValueChange:ot,clearSearchValue:it,isMobile:n,sentinelRef:Fe,dataList:rt,address:o.address,canTrade:g}}function Rt(e,t){let{data:r,isLoading:a}=hooks.useQuery(t?null:e,{formatter:l=>l,revalidateOnFocus:false}),{data:s,isLoading:o}=hooks.usePrivateQuery(t?e:null,{formatter:l=>l,revalidateOnFocus:false});return {data:s||r,isLoading:o||a}}var Dt=()=>{let[e,t]=react.useState(90),[r,a]=react.useState(X(90)),s=n=>{t(n),a(X(n));},o=n=>{if(n.name==="dateRange"){let g=n.value;if(a(g),g.from&&g.to){let m=Math.abs(dateFns.differenceInDays(g.from,g.to))+1,D=X(m);F(D.from)===F(g.from)&&F(D.to)===F(g.to)?t(m):t(null);}}};return {filterItems:react.useMemo(()=>[{type:"range",name:"dateRange",value:r,max:90}],[r]),onFilter:o,dateRange:r,filterDay:e,updateFilterDay:s}};function It(e,t){return e.toLowerCase()===t.toLowerCase()}function M(e){return `current-address-${e?.toLowerCase()}`}var te=()=>{let{t:e}=i18n.useTranslation(),{isMobile:t}=ui.useScreen();return [{title:e("tradingLeaderboard.rank"),dataIndex:"rank",width:40,render:r=>jsxRuntime.jsx(ui.Box,{width:20,className:"oui-text-center",children:r})},{title:e("common.address"),dataIndex:"address",render:r=>jsxRuntime.jsx(ui.Text.formatted,{rule:"address",children:r}),width:90},{title:e("tradingLeaderboard.tradingVolume"),dataIndex:"perp_volume",onSort:true,render:r=>r?jsxRuntime.jsx(ui.Text.numeral,{prefix:"$",rule:"price",dp:2,children:r}):"-",width:105},{title:e("common.realizedPnl"),dataIndex:"realized_pnl",onSort:true,align:t?"right":"left",render:r=>r?jsxRuntime.jsx(ui.Text.numeral,{prefix:"$",rule:"price",dp:2,coloring:true,children:r}):"-",width:90}]};var Ce=e=>{let t=te(),{t:r}=i18n.useTranslation();return jsxRuntime.jsxs(ui.Flex,{direction:"column",width:"100%",itemAlign:"start",intensity:900,r:"2xl",px:4,style:e.style,className:ui.cn("oui-trading-leaderboard-trading-list",e.className),children:[jsxRuntime.jsxs(ui.Flex,{width:"100%",justify:"between",itemAlign:"center",mt:2,className:ui.cn("oui-trading-leaderboard-trading-filter","oui-border-b oui-border-line"),children:[jsxRuntime.jsxs(ui.Flex,{gap:3,children:[e.filterItems.length>0&&jsxRuntime.jsx(ui.DataFilter,{items:e.filterItems,onFilter:a=>{e.onFilter(a);},className:"oui-h-[53px] oui-border-none"}),He.map(a=>jsxRuntime.jsxs("button",{className:"oui-relative oui-px-2 oui-py-[2px] oui-text-sm",children:[jsxRuntime.jsx("div",{className:"oui-z-10",children:jsxRuntime.jsx(ui.Text.gradient,{color:e.filterDay===a?"brand":void 0,className:e.filterDay!==a?"oui-text-base-contrast-54":"",children:`${a}D`})}),jsxRuntime.jsx("div",{className:"oui-gradient-primary oui-opacity-[.12] oui-absolute oui-left-0 oui-right-0 oui-top-0 oui-bottom-0 oui-rounded",onClick:()=>{e.updateFilterDay(a);}})]},a))]}),e.canTrade&&jsxRuntime.jsx(ui.Input,{value:e.searchValue,onValueChange:e.onSearchValueChange,placeholder:r("common.address.search.placeholder"),className:ui.cn("oui-trading-leaderboard-trading-search-input","oui-w-[240px]"),size:"sm",prefix:jsxRuntime.jsx(ui.Box,{pl:3,pr:1,children:jsxRuntime.jsx(Ut,{className:"oui-text-base-contrast-36"})}),suffix:e.searchValue&&jsxRuntime.jsx(ui.Box,{mr:2,children:jsxRuntime.jsx(ui.CloseCircleFillIcon,{size:14,className:"oui-text-base-contrast-36 oui-cursor-pointer =",onClick:e.clearSearchValue})}),autoComplete:"off"})]}),jsxRuntime.jsx(ui.DataTable,{loading:e.isLoading,id:"oui-trading-leaderboard-trading-table",columns:t,initialSort:e.initialSort,onSort:e.onSort,bordered:true,dataSource:e.dataSource,generatedRowKey:a=>a.key||a.address,manualPagination:true,manualSorting:true,pagination:e.pagination,classNames:{root:"!oui-h-[calc(100%_-_53px_-_8px)]"},onRow:(a,s)=>({className:ui.cn("oui-h-[48px]")}),onCell:(a,s,o)=>{if(s.key===M(e.address)){let l=a.getIsFirstColumn(),n=a.getIsLastColumn();return {className:ui.cn("after:oui-absolute after:oui-w-full after:oui-h-[48px]","after:oui-border-[rgb(var(--oui-gradient-brand-start))]","after:oui-top-0 after:oui-left-0 after:oui-z-[-1]","after:oui-border-b after:oui-border-t",l&&"after:oui-border-l after:oui-rounded-l-lg",n&&"after:oui-border-r after:oui-rounded-r-lg")}}return {}}})]})},Ut=e=>jsxRuntime.jsx("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"currentColor",xmlns:"http://www.w3.org/2000/svg",...e,children:jsxRuntime.jsx("path",{d:"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7"})});var Je=e=>{let t=te();return jsxRuntime.jsxs(ui.Flex,{direction:"column",width:"100%",itemAlign:"start",intensity:900,r:"2xl",px:4,style:e.style,className:ui.cn("oui-mobile-trading-leaderboard-trading-list",e.className),children:[jsxRuntime.jsx(ui.Flex,{width:"100%",justify:"between",itemAlign:"center",className:ui.cn("oui-mobile-trading-leaderboard-trading-filter"),children:e.filterItems.length>0&&jsxRuntime.jsx(ui.DataFilter,{items:e.filterItems,onFilter:r=>{e.onFilter(r);},className:"oui-h-[40px] oui-border-none"})}),jsxRuntime.jsx(ui.DataTable,{classNames:{root:"oui-pb-4",body:"oui-text-2xs",scroll:"oui-overflow-y-hidden oui-h-full"},loading:e.isLoading,id:"oui-trading-leaderboard-trading-table",columns:t,initialSort:e.initialSort,onSort:e.onSort,dataSource:e.dataList,generatedRowKey:r=>r.key||r.address,manualPagination:true,manualSorting:true,onRow:(r,a)=>({className:ui.cn("oui-h-[30px]")}),onCell:(r,a,s)=>{if(a.key===M(e.address)){let o=r.getIsFirstColumn(),l=r.getIsLastColumn();return {className:ui.cn("after:oui-absolute after:oui-w-full after:oui-h-[30px]","after:oui-border-[rgb(var(--oui-gradient-brand-start))]"," after:oui-top-0 after:oui-left-0 after:oui-z-[-1]","after:oui-border-b after:oui-border-t",o&&"after:oui-border-l after:oui-rounded-l-lg",l&&"after:oui-border-r after:oui-rounded-r-lg")}}return {}}}),jsxRuntime.jsx("div",{ref:e.sentinelRef,className:"oui-relative oui-invisible oui-h-[1px] oui-top-[-300px]"}),e.isLoading&&e.dataList.length>0&&jsxRuntime.jsx(ui.Flex,{itemAlign:"center",justify:"center",width:"100%",height:40,children:jsxRuntime.jsx(ui.Spinner,{size:"sm"})})]})};var U=e=>{let t=be();return t.isMobile?jsxRuntime.jsx(Je,{...t,...e}):jsxRuntime.jsx(Ce,{...t,...e})};function Qt(e){let t=e?.split(".").pop();return ["mp4","webm","avi","ogg"].includes(t??"")}function Se(e){let{backgroundSrc:t,campaigns:r=[]}=e,{isMobile:a}=ui.useScreen(),{state:s}=hooks.useAccount(),{wrongNetwork:o,disabledConnect:l}=reactApp.useAppContext(),n=react.useMemo(()=>r?.length>0,[r]),g=!o&&!l&&(s.status>=types.AccountStatusEnum.EnableTrading||s.status===types.AccountStatusEnum.EnableTradingWithoutConnected),m=react.useMemo(()=>Qt(t),[t]);return {backgroundSrc:t,isVideo:m,showCampaigns:n,isMobile:a,canTrading:g}}var Te=e=>{let t=()=>{let r="linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)";if(e.isVideo)return jsxRuntime.jsxs("div",{className:ui.cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full"),children:[jsxRuntime.jsx("div",{style:{backgroundImage:r,backgroundSize:"cover",backgroundRepeat:"no-repeat"},className:ui.cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full")}),jsxRuntime.jsxs("video",{autoPlay:true,loop:true,muted:true,className:ui.cn("oui-border-none oui-outline-none oui-bg-transparent","oui-w-full oui-h-full","oui-object-cover","oui-opacity-50"),children:[jsxRuntime.jsx("source",{src:e.backgroundSrc,type:"video/mp4"}),jsxRuntime.jsx("source",{src:e.backgroundSrc,type:"video/webm"}),jsxRuntime.jsx("source",{src:e.backgroundSrc,type:"video/ogg"}),jsxRuntime.jsx("source",{src:e.backgroundSrc,type:"video/avi"}),"Your browser does not support the video tag."]})]});if(e.backgroundSrc)return jsxRuntime.jsx("div",{style:{backgroundImage:`${r}, url(${e.backgroundSrc}) `,backgroundSize:"cover",backgroundRepeat:"no-repeat"},className:ui.cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full","oui-opacity-50")})};return jsxRuntime.jsxs("div",{style:e.style,className:ui.cn("oui-h-full oui-mix-blend-screen",e.className),children:[t(),jsxRuntime.jsxs(ui.Flex,{direction:"column",gapY:5,height:"100%",className:ui.cn("oui-trading-leaderboard oui-relative","oui-max-w-[1040px] oui-px-3 oui-mx-auto "),children:[e.showCampaigns&&jsxRuntime.jsx(B,{}),jsxRuntime.jsx(U,{className:ui.cn(e.showCampaigns?"oui-h-[calc(100%_-_288px_-_20px)]":"oui-h-full")})]})]})};var Ze=e=>{let t=()=>{let r="linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)";if(e.isVideo)return jsxRuntime.jsxs("div",{className:ui.cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full"),children:[jsxRuntime.jsx("div",{style:{backgroundImage:r,backgroundSize:"cover",backgroundRepeat:"no-repeat"},className:ui.cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full")}),jsxRuntime.jsxs("video",{playsInline:true,"webkit-playsinline":true,autoPlay:true,loop:true,muted:true,className:ui.cn("oui-border-none oui-outline-none oui-bg-transparent oui-pointer-events-none","oui-w-full oui-h-full","oui-object-cover","oui-opacity-50"),children:[jsxRuntime.jsx("source",{src:e.backgroundSrc,type:"video/mp4"}),jsxRuntime.jsx("source",{src:e.backgroundSrc,type:"video/webm"}),jsxRuntime.jsx("source",{src:e.backgroundSrc,type:"video/ogg"}),jsxRuntime.jsx("source",{src:e.backgroundSrc,type:"video/avi"}),"Your browser does not support the video tag."]})]});if(e.backgroundSrc)return jsxRuntime.jsx("div",{style:{backgroundImage:`${r}, url(${e.backgroundSrc}) `,backgroundSize:"cover",backgroundRepeat:"no-repeat"},className:ui.cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full","oui-opacity-50")})};return jsxRuntime.jsxs("div",{style:{paddingBottom:"calc(64px + env(safe-area-inset-bottom))"},className:ui.cn("oui-grid oui-grid-rows-[auto,1fr,auto] oui-h-screen oui-gap-1 oui-relative oui-bg-base-10","oui-relative oui-h-full oui-mix-blend-screen",e.className),children:[t(),jsxRuntime.jsxs(ui.Flex,{direction:"column",gapY:3,height:"100%",px:3,pt:3,pb:3,className:ui.cn("oui-trading-leaderboard-mobile oui-overflow-y-auto oui-custom-scrollbar","oui-relative oui-h-[calc(100vh_-_64px)]"),children:[e.showCampaigns&&jsxRuntime.jsx(B,{}),jsxRuntime.jsx(U,{className:ui.cn(!e.canTrading&&"oui-h-full")}),jsxRuntime.jsx("div",{className:"oui-fixed oui-left-0 oui-right-0 oui-bottom-0 oui-z-10",children:jsxRuntime.jsx(trading.BottomNavBarWidget,{})})]})]})};var er=e=>{let t=Se({backgroundSrc:e.backgroundSrc,campaigns:e.campaigns});return jsxRuntime.jsx(De,{campaigns:e.campaigns,href:e.href,children:t.isMobile?jsxRuntime.jsx(Ze,{...t}):jsxRuntime.jsx(Te,{...t,className:e.className,style:e.style})})};
16
+ var H=25,se=6,Ne=e=>e.currentCampaigns.length===0?null:jsxRuntime.jsxs(ui.Box,{width:"100%",intensity:900,p:3,className:ui.cn("oui-mobile-trading-leaderboard-campaigns oui-rounded-[20px]",e.className),style:e.style,children:[jsxRuntime.jsx(nt,{...e}),jsxRuntime.jsx(ui.Box,{r:"xl",mt:3,ref:e.enableScroll?e.emblaRef:void 0,className:ui.cn("oui-w-full oui-min-w-0 oui-overflow-hidden","oui-select-none oui-cursor-pointer"),children:jsxRuntime.jsx(ui.Flex,{children:e.currentCampaigns.map(t=>jsxRuntime.jsx(st,{campaign:t},t.title))})}),e.enableScroll&&jsxRuntime.jsx(lt,{style:{width:H*e.currentCampaigns.length},list:e.currentCampaigns,scrollIndex:e.scrollIndex,scrollTo:e.emblaApi?.scrollTo})]}),nt=e=>{let{t}=i18n.useTranslation();return jsxRuntime.jsxs(ui.Flex,{justify:"between",itemAlign:"center",children:[jsxRuntime.jsx(ui.Text,{size:"base",intensity:80,children:t("tradingLeaderboard.campaigns")}),jsxRuntime.jsx(ui.Select.options,{size:"xs",value:e.category,onValueChange:e.onCategoryChange,options:e.options,classNames:{trigger:"oui-w-[--radix-select-content-available-width]"}})]})},st=({campaign:e})=>{let{title:t,description:r,image:a,displayTime:s,learnMoreUrl:o,tradingUrl:d}=e,{t:n}=i18n.useTranslation();return jsxRuntime.jsxs(ui.Box,{intensity:800,r:"xl",className:"oui-flex-[0_0_100%]",children:[jsxRuntime.jsx("img",{className:"oui-w-full oui-h-[calc((100vw-48px)/2)] oui-rounded-t-xl oui-object-fill",src:a,alt:t}),jsxRuntime.jsxs(ui.Flex,{itemAlign:"start",justify:"between",direction:"column",height:"100%",p:4,gapY:3,className:"oui-font-semibold",children:[jsxRuntime.jsxs(ui.Flex,{direction:"column",itemAlign:"start",gapY:1,children:[jsxRuntime.jsx(ui.Text,{size:"sm",children:t}),jsxRuntime.jsx(ui.Text,{size:"2xs",intensity:54,children:s}),jsxRuntime.jsx(ui.Text,{size:"2xs",intensity:36,children:r})]}),jsxRuntime.jsxs(ui.Flex,{justify:"between",width:"100%",gapX:3,children:[jsxRuntime.jsx(ui.Button,{variant:"outlined",color:"secondary",fullWidth:true,size:"md",onClick:()=>{window.open(o,"_blank");},children:n("tradingLeaderboard.learnMore")}),jsxRuntime.jsx(ui.Button,{size:"md",fullWidth:true,onClick:()=>{window.open(d,"_self");},children:n("tradingLeaderboard.tradeNow")})]})]})]})},lt=e=>{let{style:t,scrollIndex:r,list:a}=e;return jsxRuntime.jsxs(ui.Flex,{mt:3,r:"full",height:se,className:ui.cn("oui-bg-line oui-mx-auto oui-relative"),style:e.style,children:[a.map((s,o)=>jsxRuntime.jsx(ui.Box,{width:H,height:se,onClick:()=>{e.scrollTo?.(o);},r:"full",className:"oui-cursor-pointer"},o)),jsxRuntime.jsx(ui.Box,{width:H,height:se,r:"full",className:ui.cn("oui-absolute oui-left-0 oui-top-0","oui-transition-all oui-duration-300","oui-bg-primary"),style:{transform:`translateX(${r*H}px)`}})]})};var J=e=>({from:dateFns.subDays(new Date,e-1),to:new Date}),v=e=>dateFns.format(e,"yyyy-MM-dd");function le(e){let t=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];typeof e=="string"&&(e=new Date(e));let r=e.getUTCFullYear(),a=t[e.getUTCMonth()],s=e.getUTCDate(),o=String(e.getUTCHours()).padStart(2,"0"),d=String(e.getUTCMinutes()).padStart(2,"0");return `${a} ${s}, ${r} ${o}:${d}`}var Pe=react.createContext({}),Re=e=>jsxRuntime.jsx(Pe.Provider,{value:{campaigns:e.campaigns,href:e.href,backgroundSrc:e.backgroundSrc},children:e.children}),ke=()=>react.useContext(Pe);function ue(){let{t:e}=i18n.useTranslation(),{campaigns:t=[],href:r}=ke(),[a,s]=react.useState("ongoing"),{track:o,tracking:d}=hooks.useTrack(),n=react.useMemo(()=>{let c=new Date;return t.reduce((u,g)=>{let L=new Date(g.startTime),h=new Date(g.endTime);return c>=L&&c<=h?u.ongoing.push(g):c>h?u.past.push(g):u.future.push(g),u},{ongoing:[],past:[],future:[]})},[t]),p=react.useMemo(()=>[{label:e("tradingLeaderboard.ongoing"),value:"ongoing"},{label:e("tradingLeaderboard.future"),value:"future"},{label:e("tradingLeaderboard.past"),value:"past"}].filter(u=>n[u.value].length>0),[n,e]),f=react.useMemo(()=>n[a].map(u=>{let{startTime:g,endTime:L}=u,h,U=r?.trading;return typeof u.href=="object"?(h=u.href.learnMore,U=u.href.trading):h=u.href,{...u,displayTime:`${le(g)} - ${le(L)} UTC`,learnMoreUrl:h,tradingUrl:U}}),[n,a,r]);react.useEffect(()=>{let u=["ongoing","future","past"].find(g=>n[g].length>0);u&&s(u);},[n]);let R=c=>{s(c);},[ae,oe]=react.useState(0),[ie,C]=pt__default.default({loop:false,slidesToScroll:"auto"});react.useEffect(()=>{C?.on("select",()=>{oe(C?.selectedScrollSnap());});},[C]);let T=c=>{o(types.TrackerEventName.leaderboardCampaignClickLearnMore,{campaign_title:c.title}),window.open(c.learnMoreUrl,"_blank");},M=c=>{d(types.TrackerEventName.leaderboardCampaignClickTradeNow,{campaign_title:c.title}),window.open(c.tradingUrl,"_self");};return {options:p,currentCampaigns:f,category:a,onCategoryChange:R,tradingUrl:r?.trading,emblaRef:ie,emblaApi:C,scrollIndex:ae,enableScroll:f?.length>1,onLearnMore:T,onTradeNow:M}}var ce=e=>e.currentCampaigns.length===0?null:jsxRuntime.jsxs(ui.Box,{width:"100%",intensity:900,p:5,pr:2,height:288,className:ui.cn("oui-trading-leaderboard-campaigns oui-rounded-[20px]",e.className),style:e.style,children:[jsxRuntime.jsx(yt,{...e}),jsxRuntime.jsx(ui.Box,{mt:5,r:"xl",className:ui.cn("oui-overflow-y-auto","oui-custom-scrollbar"),children:jsxRuntime.jsx(ui.Flex,{gapY:5,height:200,direction:"column",r:"xl",className:"oui-pr-1.5",children:e.currentCampaigns.map(t=>jsxRuntime.jsx(Ct,{campaign:t,onLearnMore:e.onLearnMore,onTradeNow:e.onTradeNow},t.title))})})]}),yt=e=>{let{t}=i18n.useTranslation();return jsxRuntime.jsxs(ui.Flex,{justify:"between",itemAlign:"center",pr:3,children:[jsxRuntime.jsx(ui.Text,{size:"xl",children:t("tradingLeaderboard.campaigns")}),jsxRuntime.jsx(ui.Select.options,{size:"xs",value:e.category,onValueChange:e.onCategoryChange,options:e.options,classNames:{trigger:"oui-w-[--radix-select-content-available-width]"}})]})},Ct=({campaign:e,onLearnMore:t,onTradeNow:r})=>{let{title:a,description:s,image:o,displayTime:d}=e,{t:n}=i18n.useTranslation();return jsxRuntime.jsxs(ui.Flex,{intensity:800,r:"xl",width:"100%",children:[jsxRuntime.jsx("img",{className:"oui-h-[200px] oui-w-[400px] oui-rounded-l-xl oui-object-fill",src:o,alt:a}),jsxRuntime.jsxs(ui.Flex,{itemAlign:"start",justify:"between",direction:"column",height:"100%",p:5,className:"oui-flex-1 oui-font-semibold",children:[jsxRuntime.jsxs(ui.Flex,{gap:1,direction:"column",itemAlign:"start",children:[jsxRuntime.jsx(ui.Text,{size:"xl",children:a}),jsxRuntime.jsx(ui.Text,{size:"sm",intensity:36,children:s})]}),jsxRuntime.jsxs(ui.Flex,{justify:"between",width:"100%",children:[jsxRuntime.jsx(ui.Text,{size:"xs",intensity:54,children:d}),jsxRuntime.jsxs(ui.Flex,{gap:3,children:[jsxRuntime.jsx(ui.Button,{variant:"outlined",color:"secondary",size:"md",onClick:()=>{t(e);},children:n("tradingLeaderboard.learnMore")}),jsxRuntime.jsx(ui.Button,{size:"md",onClick:()=>{r(e);},children:n("tradingLeaderboard.tradeNow")})]})]})]})]})};var A=e=>{let t=ue(),{isMobile:r}=ui.useScreen();return r?jsxRuntime.jsx(Ne,{...t,className:e.className,style:e.style}):jsxRuntime.jsx(ce,{...t,className:e.className,style:e.style})};function Ue(e,t){let r=react.useRef(),a=react.useRef(t);a.current=t,react.useEffect(()=>{let s={root:null,rootMargin:"0px",threshold:0},o=d=>{d.forEach(n=>{n.isIntersecting&&a.current?.();});};return r.current=new IntersectionObserver(o,s),()=>{r.current?.disconnect();}},[]),react.useEffect(()=>{e.current&&r.current?.observe(e.current);},[e.current]);}var Ge=[7,14,30,90];function me(){let[e,t]=react.useState(""),[r]=react.useState({sortKey:"perp_volume",sort:"desc"}),[a,s]=react.useState(r),{state:o}=hooks.useAccount(),d=hooks.useConfig("brokerId"),{isMobile:n}=ui.useScreen(),p=o.address&&(o.status>=types.AccountStatusEnum.EnableTrading||o.status===types.AccountStatusEnum.EnableTradingWithoutConnected),{dateRange:f,filterDay:R,updateFilterDay:ae,filterItems:oe,onFilter:ie}=Rt(),{page:C,pageSize:T,setPage:M,parsePagination:c}=ui.usePagination({pageSize:100}),u=i=>{let l=new URLSearchParams;if(l.set("page",i.page.toString()),l.set("size",i.pageSize.toString()),l.set("aggregateBy","ACCOUNT"),d&&l.set("broker_id",d),i.sort)l.set("sort",i.sort);else if(i.sort!==null&&a){let b=a.sort==="asc"?"ascending":"descending";l.set("sort",`${b}_${a.sortKey}`);}return f.from&&l.set("start_date",v(f.from)),f.to&&l.set("end_date",v(f.to)),i.address&&l.set("address",i.address),i.address?`/v1/volume/broker/daily?${l.toString()}`:`/v1/broker/leaderboard/daily?${l.toString()}`},{data:g,isLoading:L}=Pt(u({page:C,pageSize:T,address:e}),e),{data:h,size:U,setSize:qe,isValidating:Te}=hooks.useInfiniteQuery((i,l)=>l&&!l.rows?.length||!n?null:u({page:i+1,pageSize:T,address:e}),{initialSize:1,formatter:i=>i,revalidateOnFocus:false}),{data:Le}=hooks.useQuery(o.address?u({page:1,pageSize:100,sort:`descending_${a?.sortKey||"perp_volume"}`}):null,{formatter:i=>i,revalidateOnFocus:false}),{data:ne=[]}=hooks.usePrivateQuery(p?u({page:1,pageSize:1,address:o.address,sort:null}):null,{revalidateOnFocus:false}),E=react.useCallback(i=>{let l=Le?.rows.findIndex(b=>kt(b.address,i));return l!==-1?l+1:"100+"},[Le]),O=react.useMemo(()=>!p||L?[]:ne.length?ne?.map(i=>({...i,rank:E(i.address),key:D(i.address)})):[{key:D(o.address),address:o.address,rank:"-"}],[p,o.address,ne,L,E]),K=react.useCallback((i,l)=>i?.map((b,z)=>{let G=z+1;return e?G=E(b.address):a?.sort==="asc"?G=l-(C-1)*T-z:a?.sort==="desc"&&(G=(C-1)*T+z+1),{...b,rank:G}}),[C,T,a,e,E]),Ze=react.useMemo(()=>{let i=g?.rows||[],l=g?.meta.total||0,b=K(i,l);return C===1&&!e?[...O,...b]:b},[g,C,O,e,K]),et=react.useMemo(()=>{if(!h?.length)return [];let i=h[0]?.meta.total||0,l=h?.map(z=>z.rows)?.flat(),b=K(l,i);return e?b:[...O,...b]},[h,O,e,K]),we=react.useRef(null),tt=react.useMemo(()=>c(g?.meta),[c,g]);Ue(we,()=>{!Te&&n&&qe(U+1);});let rt=i=>{t(i);},at=react.useCallback(()=>{t("");},[]),ot=react.useCallback(i=>{s(i||r);},[r]);return react.useEffect(()=>{e&&M(1);},[e]),react.useEffect(()=>{M(1);},[o.address]),react.useEffect(()=>{f.to&&f.from&&M(1);},[f]),{pagination:tt,dateRange:f,filterDay:R,updateFilterDay:ae,filterItems:oe,onFilter:ie,initialSort:r,onSort:ot,dataSource:Ze,isLoading:L||Te,searchValue:e,onSearchValueChange:rt,clearSearchValue:at,isMobile:n,sentinelRef:we,dataList:et,address:o.address,canTrade:p}}function Pt(e,t){let{data:r,isLoading:a}=hooks.useQuery(t?null:e,{formatter:d=>d,revalidateOnFocus:false}),{data:s,isLoading:o}=hooks.usePrivateQuery(t?e:null,{formatter:d=>d,revalidateOnFocus:false});return {data:s||r,isLoading:o||a}}var Rt=()=>{let[e,t]=react.useState(90),[r,a]=react.useState(J(90)),s=n=>{t(n),a(J(n));},o=n=>{if(n.name==="dateRange"){let p=n.value;if(a(p),p.from&&p.to){let f=Math.abs(dateFns.differenceInDays(p.from,p.to))+1,R=J(f);v(R.from)===v(p.from)&&v(R.to)===v(p.to)?t(f):t(null);}}};return {filterItems:react.useMemo(()=>[{type:"range",name:"dateRange",value:r,max:90}],[r]),onFilter:o,dateRange:r,filterDay:e,updateFilterDay:s}};function kt(e,t){return e.toLowerCase()===t.toLowerCase()}function D(e){return `current-address-${e?.toLowerCase()}`}var Z=()=>{let{t:e}=i18n.useTranslation(),{isMobile:t}=ui.useScreen();return [{title:e("tradingLeaderboard.rank"),dataIndex:"rank",width:40,render:r=>jsxRuntime.jsx(ui.Box,{width:20,className:"oui-text-center",children:r})},{title:e("common.address"),dataIndex:"address",render:r=>jsxRuntime.jsx(ui.Text.formatted,{rule:"address",children:r}),width:90},{title:e("tradingLeaderboard.tradingVolume"),dataIndex:"perp_volume",onSort:true,render:r=>r?jsxRuntime.jsx(ui.Text.numeral,{prefix:"$",rule:"price",dp:2,children:r}):"-",width:105},{title:e("common.realizedPnl"),dataIndex:"realized_pnl",onSort:true,align:t?"right":"left",render:r=>r?jsxRuntime.jsx(ui.Text.numeral,{prefix:"$",rule:"price",dp:2,coloring:true,children:r}):"-",width:90}]};var be=e=>{let t=Z(),{t:r}=i18n.useTranslation();return jsxRuntime.jsxs(ui.Flex,{direction:"column",width:"100%",itemAlign:"start",intensity:900,r:"2xl",px:4,style:e.style,className:ui.cn("oui-trading-leaderboard-trading-list",e.className),children:[jsxRuntime.jsxs(ui.Flex,{width:"100%",justify:"between",itemAlign:"center",mt:2,className:ui.cn("oui-trading-leaderboard-trading-filter","oui-border-b oui-border-line"),children:[jsxRuntime.jsxs(ui.Flex,{gap:3,children:[e.filterItems.length>0&&jsxRuntime.jsx(ui.DataFilter,{items:e.filterItems,onFilter:a=>{e.onFilter(a);},className:"oui-h-[53px] oui-border-none"}),Ge.map(a=>jsxRuntime.jsxs("button",{className:"oui-relative oui-px-2 oui-py-[2px] oui-text-sm",children:[jsxRuntime.jsx("div",{className:"oui-z-10",children:jsxRuntime.jsx(ui.Text.gradient,{color:e.filterDay===a?"brand":void 0,className:e.filterDay!==a?"oui-text-base-contrast-54":"",children:`${a}D`})}),jsxRuntime.jsx("div",{className:"oui-gradient-primary oui-opacity-[.12] oui-absolute oui-left-0 oui-right-0 oui-top-0 oui-bottom-0 oui-rounded",onClick:()=>{e.updateFilterDay(a);}})]},a))]}),e.canTrade&&jsxRuntime.jsx(ui.Input,{value:e.searchValue,onValueChange:e.onSearchValueChange,placeholder:r("common.address.search.placeholder"),className:ui.cn("oui-trading-leaderboard-trading-search-input","oui-w-[240px]"),size:"sm",prefix:jsxRuntime.jsx(ui.Box,{pl:3,pr:1,children:jsxRuntime.jsx($t,{className:"oui-text-base-contrast-36"})}),suffix:e.searchValue&&jsxRuntime.jsx(ui.Box,{mr:2,children:jsxRuntime.jsx(ui.CloseCircleFillIcon,{size:14,className:"oui-text-base-contrast-36 oui-cursor-pointer =",onClick:e.clearSearchValue})}),autoComplete:"off"})]}),jsxRuntime.jsx(ui.DataTable,{loading:e.isLoading,id:"oui-trading-leaderboard-trading-table",columns:t,initialSort:e.initialSort,onSort:e.onSort,bordered:true,dataSource:e.dataSource,generatedRowKey:a=>a.key||a.address,manualPagination:true,manualSorting:true,pagination:e.pagination,classNames:{root:"!oui-h-[calc(100%_-_53px_-_8px)]"},onRow:(a,s)=>({className:ui.cn("oui-h-[48px]")}),onCell:(a,s,o)=>{if(s.key===D(e.address)){let d=a.getIsFirstColumn(),n=a.getIsLastColumn();return {className:ui.cn("after:oui-absolute after:oui-w-full after:oui-h-[48px]","after:oui-border-[rgb(var(--oui-gradient-brand-start))]","after:oui-top-0 after:oui-left-0 after:oui-z-[-1]","after:oui-border-b after:oui-border-t",d&&"after:oui-border-l after:oui-rounded-l-lg",n&&"after:oui-border-r after:oui-rounded-r-lg")}}return {}}})]})},$t=e=>jsxRuntime.jsx("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"currentColor",xmlns:"http://www.w3.org/2000/svg",...e,children:jsxRuntime.jsx("path",{d:"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7"})});var He=e=>{let t=Z();return jsxRuntime.jsxs(ui.Flex,{direction:"column",width:"100%",itemAlign:"start",intensity:900,r:"2xl",px:4,style:e.style,className:ui.cn("oui-mobile-trading-leaderboard-trading-list",e.className),children:[jsxRuntime.jsx(ui.Flex,{width:"100%",justify:"between",itemAlign:"center",className:ui.cn("oui-mobile-trading-leaderboard-trading-filter"),children:e.filterItems.length>0&&jsxRuntime.jsx(ui.DataFilter,{items:e.filterItems,onFilter:r=>{e.onFilter(r);},className:"oui-h-[40px] oui-border-none"})}),jsxRuntime.jsx(ui.DataTable,{classNames:{root:"oui-pb-4",body:"oui-text-2xs",scroll:"oui-overflow-y-hidden oui-h-full"},loading:e.isLoading,id:"oui-trading-leaderboard-trading-table",columns:t,initialSort:e.initialSort,onSort:e.onSort,dataSource:e.dataList,generatedRowKey:r=>r.key||r.address,manualPagination:true,manualSorting:true,onRow:(r,a)=>({className:ui.cn("oui-h-[30px]")}),onCell:(r,a,s)=>{if(a.key===D(e.address)){let o=r.getIsFirstColumn(),d=r.getIsLastColumn();return {className:ui.cn("after:oui-absolute after:oui-w-full after:oui-h-[30px]","after:oui-border-[rgb(var(--oui-gradient-brand-start))]"," after:oui-top-0 after:oui-left-0 after:oui-z-[-1]","after:oui-border-b after:oui-border-t",o&&"after:oui-border-l after:oui-rounded-l-lg",d&&"after:oui-border-r after:oui-rounded-r-lg")}}return {}}}),jsxRuntime.jsx("div",{ref:e.sentinelRef,className:"oui-relative oui-invisible oui-h-[1px] oui-top-[-300px]"}),e.isLoading&&e.dataList.length>0&&jsxRuntime.jsx(ui.Flex,{itemAlign:"center",justify:"center",width:"100%",height:40,children:jsxRuntime.jsx(ui.Spinner,{size:"sm"})})]})};var $=e=>{let t=me();return t.isMobile?jsxRuntime.jsx(He,{...t,...e}):jsxRuntime.jsx(be,{...t,...e})};function Yt(e){let t=e?.split(".").pop();return ["mp4","webm","avi","ogg"].includes(t??"")}function ye(e){let{backgroundSrc:t,campaigns:r=[]}=e,{isMobile:a}=ui.useScreen(),s=react.useMemo(()=>r?.length>0,[r]),o=react.useMemo(()=>Yt(t),[t]);return {backgroundSrc:t,isVideo:o,showCampaigns:s,isMobile:a}}var Ce=e=>{let t=()=>{let r="linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)";if(e.isVideo)return jsxRuntime.jsxs("div",{className:ui.cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full"),children:[jsxRuntime.jsx("div",{style:{backgroundImage:r,backgroundSize:"cover",backgroundRepeat:"no-repeat"},className:ui.cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full")}),jsxRuntime.jsxs("video",{autoPlay:true,loop:true,muted:true,className:ui.cn("oui-border-none oui-outline-none oui-bg-transparent","oui-w-full oui-h-full","oui-object-cover","oui-opacity-50"),children:[jsxRuntime.jsx("source",{src:e.backgroundSrc,type:"video/mp4"}),jsxRuntime.jsx("source",{src:e.backgroundSrc,type:"video/webm"}),jsxRuntime.jsx("source",{src:e.backgroundSrc,type:"video/ogg"}),jsxRuntime.jsx("source",{src:e.backgroundSrc,type:"video/avi"}),"Your browser does not support the video tag."]})]});if(e.backgroundSrc)return jsxRuntime.jsx("div",{style:{backgroundImage:`${r}, url(${e.backgroundSrc}) `,backgroundSize:"cover",backgroundRepeat:"no-repeat"},className:ui.cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full","oui-opacity-50")})};return jsxRuntime.jsxs("div",{style:e.style,className:ui.cn("oui-h-full oui-mix-blend-screen",e.className),children:[t(),jsxRuntime.jsxs(ui.Flex,{direction:"column",gapY:5,height:"100%",className:ui.cn("oui-trading-leaderboard oui-relative","oui-max-w-[1040px] oui-px-3 oui-mx-auto "),children:[e.showCampaigns&&jsxRuntime.jsx(A,{}),jsxRuntime.jsx($,{className:ui.cn(e.showCampaigns?"oui-h-[calc(100%_-_288px_-_20px)]":"oui-h-full")})]})]})};var Xe=e=>jsxRuntime.jsx("div",{style:{paddingBottom:"calc(64px + env(safe-area-inset-bottom))"},className:ui.cn("oui-relative oui-grid oui-h-[calc(100vh-44px)] oui-gap-1 oui-bg-base-10","oui-mix-blend-screen",e.className),children:jsxRuntime.jsxs(ui.Flex,{direction:"column",gapY:3,height:"100%",px:3,pt:3,pb:3,className:ui.cn("oui-trading-leaderboard-mobile oui-custom-scrollbar oui-overflow-y-auto","oui-relative oui-h-[calc(100vh_-_64px)]"),children:[e.showCampaigns&&jsxRuntime.jsx(A,{}),jsxRuntime.jsx($,{})]})});var Qt=e=>{let t=ye({backgroundSrc:e.backgroundSrc,campaigns:e.campaigns});return jsxRuntime.jsx(Re,{campaigns:e.campaigns,href:e.href,children:t.isMobile?jsxRuntime.jsx(Xe,{...t}):jsxRuntime.jsx(Ce,{...t,className:e.className,style:e.style})})};
19
17
 
20
- exports.Campaigns = pe;
21
- exports.CampaignsWidget = B;
22
- exports.Leaderboard = Te;
23
- exports.LeaderboardWidget = er;
24
- exports.TradingLeaderboardContext = Re;
25
- exports.TradingLeaderboardProvider = De;
26
- exports.TradingList = Ce;
27
- exports.TradingListWidget = U;
28
- exports.useCampaignsScript = me;
29
- exports.useLeaderboardScript = Se;
30
- exports.useTradingLeaderboardContext = Ie;
31
- exports.useTradingListScript = be;
18
+ exports.Campaigns = ce;
19
+ exports.CampaignsWidget = A;
20
+ exports.Leaderboard = Ce;
21
+ exports.LeaderboardWidget = Qt;
22
+ exports.TradingLeaderboardContext = Pe;
23
+ exports.TradingLeaderboardProvider = Re;
24
+ exports.TradingList = be;
25
+ exports.TradingListWidget = $;
26
+ exports.useCampaignsScript = ue;
27
+ exports.useLeaderboardScript = ye;
28
+ exports.useTradingLeaderboardContext = ke;
29
+ exports.useTradingListScript = me;
32
30
  //# sourceMappingURL=out.js.map
33
31
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/campaigns/widget.tsx","../src/components/campaigns/campaigns.mobile.ui.tsx","../src/components/campaigns/campaigns.script.ts","../src/utils.ts","../src/components/provider/index.tsx","../src/components/campaigns/campaigns.ui.tsx","../src/components/tradingList/tradingList.script.ts","../src/hooks/useEndReached.ts","../src/components/tradingList/tradingList.ui.tsx","../src/components/tradingList/column.tsx","../src/components/tradingList/tradingList.mobile.ui.tsx","../src/components/tradingList/widget.tsx","../src/page/leaderboard/leaderboard.script.ts","../src/page/leaderboard/leaderboard.ui.tsx","../src/page/leaderboard/leaderboard.mobile.ui.tsx","../src/page/leaderboard/widget.tsx"],"names":["useScreen","cn","Box","Text","Flex","Button","Select","useTranslation","jsx","jsxs","scrollIndicatorWidth","scrollIndicatorHeight","MobileCampaigns","props","Header","campaign","CampaignItem","ScrollIndicator","title","description","image","displayTime","learnMoreUrl","tradingUrl","t","style","scrollIndex","list","item","index","useEffect","useMemo","useState","useEmblaCarousel","useTrack","TrackerEventName","format","subDays","getDateRange","offsetDay","formatDateRange","date","formatCampaignDate","monthNames","year","month","day","hours","minutes","createContext","useContext","TradingLeaderboardContext","TradingLeaderboardProvider","useTradingLeaderboardContext","useCampaignsScript","campaigns","href","category","setCategory","track","tracking","filterCampaigns","now","acc","startTime","endTime","options","currentCampaigns","firstAvailableCategory","onCategoryChange","value","setScrollIndex","emblaRef","emblaApi","onLearnMore","onTradeNow","Campaigns","CampaignsWidget","state","isMobile","useCallback","useRef","useAccount","useConfig","useInfiniteQuery","useQuery","usePrivateQuery","usePagination","differenceInDays","AccountStatusEnum","useEndReached","sentinelRef","onEndReached","observer","cb","handleObserver","entries","entry","FilterDays","useTradingListScript","searchValue","setSearchValue","initialSort","sort","setSort","brokerId","canTrade","dateRange","filterDay","updateFilterDay","filterItems","onFilter","useFilter","page","pageSize","setPage","parsePagination","getUrl","args","searchParams","prefix","data","isLoading","useDataSource","infiniteData","size","setSize","isValidating","pageIndex","previousPageData","res","top100Data","userDataRes","getAddressRank","address","isSameAddress","userDataList","getRowKey","addRankForList","total","rank","dataSource","rankList","dataList","flatList","pagination","onSearchValueChange","clearSearchValue","onSort","url","_data","_isLoading","setFilterDay","setDateRange","filter","newDateRange","address1","address2","CloseCircleFillIcon","DataFilter","DataTable","Input","useTradingListColumns","TradingList","column","SearchIcon","record","isFirst","isLast","Spinner","MobileTradingList","TradingListWidget","useAppContext","isVideoSrc","src","extension","useLeaderboardScript","backgroundSrc","wrongNetwork","disabledConnect","showCampaigns","canTrading","isVideo","Leaderboard","renderBackground","linearGradient","BottomNavBarWidget","MobileLeaderboardWidget","LeaderboardWidget"],"mappings":"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","sourcesContent":["import { FC } from \"react\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { MobileCampaigns } from \"./campaigns.mobile.ui\";\nimport { useCampaignsScript } from \"./campaigns.script\";\nimport { Campaigns } from \"./campaigns.ui\";\n\nexport type CampaignsWidgetProps = {\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport const CampaignsWidget: FC<CampaignsWidgetProps> = (props) => {\n const state = useCampaignsScript();\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return (\n <MobileCampaigns\n {...state}\n className={props.className}\n style={props.style}\n />\n );\n }\n return (\n <Campaigns {...state} className={props.className} style={props.style} />\n );\n};\n","import { FC } from \"react\";\nimport { cn, Box, Text, Flex, Button, Select } from \"@orderly.network/ui\";\nimport { CampaignsScriptReturn, CurrentCampaigns } from \"./campaigns.script\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport type CampaignsProps = {\n className?: string;\n style?: React.CSSProperties;\n} & CampaignsScriptReturn;\n\nconst scrollIndicatorWidth = 25;\nconst scrollIndicatorHeight = 6;\n\nexport const MobileCampaigns: FC<CampaignsProps> = (props) => {\n if (props.currentCampaigns.length === 0) {\n return null;\n }\n\n return (\n <Box\n width=\"100%\"\n intensity={900}\n p={3}\n className={cn(\n \"oui-mobile-trading-leaderboard-campaigns oui-rounded-[20px]\",\n props.className\n )}\n style={props.style}\n >\n <Header {...props} />\n <Box\n r=\"xl\"\n mt={3}\n ref={props.enableScroll ? props.emblaRef : undefined}\n className={cn(\n \"oui-w-full oui-min-w-0 oui-overflow-hidden\",\n \"oui-select-none oui-cursor-pointer\"\n )}\n >\n <Flex>\n {props.currentCampaigns.map((campaign) => {\n return <CampaignItem key={campaign.title} campaign={campaign} />;\n })}\n </Flex>\n </Box>\n {props.enableScroll && (\n <ScrollIndicator\n style={{\n width: scrollIndicatorWidth * props.currentCampaigns.length,\n }}\n list={props.currentCampaigns}\n scrollIndex={props.scrollIndex}\n scrollTo={props.emblaApi?.scrollTo}\n />\n )}\n </Box>\n );\n};\n\nconst Header: FC<CampaignsScriptReturn> = (props) => {\n const { t } = useTranslation();\n\n return (\n <Flex justify=\"between\" itemAlign=\"center\">\n <Text size=\"base\" intensity={80}>\n {t(\"tradingLeaderboard.campaigns\")}\n </Text>\n <Select.options\n size={\"xs\"}\n value={props.category}\n onValueChange={props.onCategoryChange}\n options={props.options}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n />\n </Flex>\n );\n};\n\nconst CampaignItem: FC<{ campaign: CurrentCampaigns }> = ({ campaign }) => {\n const { title, description, image, displayTime, learnMoreUrl, tradingUrl } =\n campaign;\n const { t } = useTranslation();\n\n return (\n <Box intensity={800} r=\"xl\" className=\"oui-flex-[0_0_100%]\">\n <img\n className=\"oui-w-full oui-h-[calc((100vw-48px)/2)] oui-rounded-t-xl oui-object-fill\"\n src={image}\n alt={title}\n />\n\n <Flex\n itemAlign=\"start\"\n justify=\"between\"\n direction=\"column\"\n height=\"100%\"\n p={4}\n gapY={3}\n className=\"oui-font-semibold\"\n >\n <Flex direction=\"column\" itemAlign=\"start\" gapY={1}>\n <Text size=\"sm\">{title}</Text>\n <Text size=\"2xs\" intensity={54}>\n {displayTime}\n </Text>\n <Text size=\"2xs\" intensity={36}>\n {description}\n </Text>\n </Flex>\n <Flex justify=\"between\" width=\"100%\" gapX={3}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n fullWidth\n size=\"md\"\n onClick={() => {\n window.open(learnMoreUrl, \"_blank\");\n }}\n >\n {t(\"tradingLeaderboard.learnMore\")}\n </Button>\n <Button\n size=\"md\"\n fullWidth\n onClick={() => {\n window.open(tradingUrl, \"_self\");\n }}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n </Flex>\n </Flex>\n </Box>\n );\n};\n\ninterface ScrollIndicatorProps {\n style?: React.CSSProperties;\n list: CurrentCampaigns[];\n scrollIndex: number;\n scrollTo?: (index: number) => void;\n}\n\nconst ScrollIndicator: React.FC<ScrollIndicatorProps> = (props) => {\n const { style, scrollIndex, list } = props;\n\n return (\n <Flex\n mt={3}\n r=\"full\"\n height={scrollIndicatorHeight}\n className={cn(\"oui-bg-line oui-mx-auto oui-relative\")}\n style={props.style}\n >\n {list.map((item, index) => {\n return (\n <Box\n key={index}\n width={scrollIndicatorWidth}\n height={scrollIndicatorHeight}\n onClick={() => {\n props.scrollTo?.(index);\n }}\n r=\"full\"\n className=\"oui-cursor-pointer\"\n />\n );\n })}\n <Box\n width={scrollIndicatorWidth}\n height={scrollIndicatorHeight}\n r=\"full\"\n className={cn(\n \"oui-absolute oui-left-0 oui-top-0\",\n \"oui-transition-all oui-duration-300\",\n \"oui-bg-primary\"\n )}\n style={{\n transform: `translateX(${scrollIndex * scrollIndicatorWidth}px)`,\n }}\n />\n </Flex>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport useEmblaCarousel from \"embla-carousel-react\";\nimport { useTrack } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { TrackerEventName } from \"@orderly.network/types\";\nimport { formatCampaignDate } from \"../../utils\";\nimport { useTradingLeaderboardContext, Campaign } from \"../provider\";\n\nexport type CampaignsScriptReturn = ReturnType<typeof useCampaignsScript>;\n\n// Define the type for our categorized campaigns\ntype CategorizedCampaigns = {\n ongoing: Campaign[];\n past: Campaign[];\n future: Campaign[];\n};\n\nexport type CurrentCampaigns = Campaign & {\n displayTime: string;\n learnMoreUrl: string;\n tradingUrl: string;\n};\n\nexport type TEmblaApi = {\n scrollTo?: (index: number) => void;\n};\n\ntype CategoryKey = keyof CategorizedCampaigns;\n\nexport function useCampaignsScript() {\n const { t } = useTranslation();\n const { campaigns = [], href } = useTradingLeaderboardContext();\n const [category, setCategory] = useState<CategoryKey>(\"ongoing\");\n\n const { track, tracking } = useTrack();\n\n const filterCampaigns = useMemo(() => {\n const now = new Date();\n\n return campaigns.reduce<CategorizedCampaigns>(\n (acc, campaign) => {\n const startTime = new Date(campaign.startTime);\n const endTime = new Date(campaign.endTime);\n\n if (now >= startTime && now <= endTime) {\n acc.ongoing.push(campaign);\n } else if (now > endTime) {\n acc.past.push(campaign);\n } else {\n acc.future.push(campaign);\n }\n\n return acc;\n },\n { ongoing: [], past: [], future: [] },\n );\n }, [campaigns]);\n\n const options = useMemo(() => {\n const opts: { label: string; value: CategoryKey }[] = [\n { label: t(\"tradingLeaderboard.ongoing\"), value: \"ongoing\" },\n { label: t(\"tradingLeaderboard.future\"), value: \"future\" },\n { label: t(\"tradingLeaderboard.past\"), value: \"past\" },\n ];\n\n // Filter out categories with no campaigns and map to the required format\n return opts.filter((item) => filterCampaigns[item.value].length > 0);\n }, [filterCampaigns, t]);\n\n const currentCampaigns = useMemo(() => {\n const list = filterCampaigns[category];\n return list.map((campaign) => {\n const { startTime, endTime } = campaign;\n\n let learnMoreUrl: string;\n let tradingUrl = href?.trading!;\n\n if (typeof campaign.href === \"object\") {\n learnMoreUrl = campaign.href.learnMore;\n tradingUrl = campaign.href.trading;\n } else {\n learnMoreUrl = campaign.href;\n }\n\n return {\n ...campaign,\n displayTime: `${formatCampaignDate(startTime)} - ${formatCampaignDate(\n endTime,\n )} UTC`,\n learnMoreUrl,\n tradingUrl,\n };\n });\n }, [filterCampaigns, category, href]);\n\n useEffect(() => {\n // Find the first non-empty category\n const categoryKeys: CategoryKey[] = [\"ongoing\", \"future\", \"past\"];\n\n const firstAvailableCategory = categoryKeys.find(\n (item) => filterCampaigns[item].length > 0,\n );\n\n if (firstAvailableCategory) {\n setCategory(firstAvailableCategory);\n }\n }, [filterCampaigns]);\n\n const onCategoryChange = (value: string) => {\n setCategory(value as CategoryKey);\n };\n const [scrollIndex, setScrollIndex] = useState(0);\n\n const [emblaRef, emblaApi] = useEmblaCarousel({\n loop: false,\n slidesToScroll: \"auto\",\n });\n\n useEffect(() => {\n emblaApi?.on(\"select\", () => {\n setScrollIndex(emblaApi?.selectedScrollSnap());\n });\n }, [emblaApi]);\n\n const onLearnMore = (campaign: CurrentCampaigns) => {\n track(TrackerEventName.leaderboardCampaignClickLearnMore, {\n campaign_title: campaign.title,\n });\n window.open(campaign.learnMoreUrl, \"_blank\");\n };\n\n const onTradeNow = (campaign: CurrentCampaigns) => {\n tracking(TrackerEventName.leaderboardCampaignClickTradeNow, {\n campaign_title: campaign.title,\n });\n window.open(campaign.tradingUrl, \"_self\");\n };\n\n return {\n options,\n currentCampaigns,\n category,\n onCategoryChange,\n tradingUrl: href?.trading,\n emblaRef,\n emblaApi: emblaApi as TEmblaApi,\n scrollIndex,\n enableScroll: currentCampaigns?.length > 1,\n onLearnMore,\n onTradeNow,\n };\n}\n","import { format, subDays } from \"date-fns\";\n\nexport const getDateRange = (offsetDay: number) => {\n return {\n from: subDays(new Date(), offsetDay - 1)!,\n to: new Date()!,\n };\n};\n\n/**\n * Format a date to \"yyyy-MM-dd\" format (e.g., \"2025-03-10\")\n * @param date The date to format\n * @returns Formatted date string\n */\nexport const formatDateRange = (date: Date): string => {\n return format(date, \"yyyy-MM-dd\");\n};\n\nexport function formatCampaignDate(date: Date | string): string {\n const monthNames = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ];\n if (typeof date === \"string\") {\n date = new Date(date);\n }\n const year = date.getUTCFullYear();\n const month = monthNames[date.getUTCMonth()];\n const day = date.getUTCDate();\n const hours = String(date.getUTCHours()).padStart(2, \"0\");\n const minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n return `${month} ${day}, ${year} ${hours}:${minutes}`;\n}\n","import { createContext, PropsWithChildren, useContext } from \"react\";\n\nexport type Campaign = {\n title: string;\n description: string;\n image: string;\n startTime: Date | string;\n endTime: Date | string;\n href:\n | string\n | {\n /** learn more url */\n learnMore: string;\n /** trading url, if provided, will override default trading now button url */\n trading: string;\n };\n};\n\n/**\n * Trading leaderboard provider state\n */\nexport type TradingLeaderboardState = {\n /** campaigns config, if not provided, will not show campaigns section */\n campaigns?: Campaign[];\n /** background src, it can be a image resource or video resource */\n backgroundSrc?: string;\n href?: {\n /** default trading now button url */\n trading: string;\n };\n};\n\n/**\n * Trading leaderboard context\n */\nexport const TradingLeaderboardContext = createContext<TradingLeaderboardState>(\n {} as TradingLeaderboardState\n);\n\nexport type TradingLeaderboardProviderProps =\n PropsWithChildren<TradingLeaderboardState>;\n\nexport const TradingLeaderboardProvider = (\n props: TradingLeaderboardProviderProps\n) => {\n return (\n <TradingLeaderboardContext.Provider\n value={{\n campaigns: props.campaigns,\n href: props.href,\n backgroundSrc: props.backgroundSrc,\n }}\n >\n {props.children}\n </TradingLeaderboardContext.Provider>\n );\n};\n\nexport const useTradingLeaderboardContext = () => {\n return useContext(TradingLeaderboardContext);\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { cn, Box, Text, Flex, Button, Select } from \"@orderly.network/ui\";\nimport { CampaignsScriptReturn, CurrentCampaigns } from \"./campaigns.script\";\n\nexport type CampaignsProps = {\n className?: string;\n style?: React.CSSProperties;\n} & CampaignsScriptReturn;\n\nexport const Campaigns: FC<CampaignsProps> = (props) => {\n if (props.currentCampaigns.length === 0) {\n return null;\n }\n\n return (\n <Box\n width=\"100%\"\n intensity={900}\n p={5}\n pr={2}\n height={288}\n className={cn(\n \"oui-trading-leaderboard-campaigns oui-rounded-[20px]\",\n props.className,\n )}\n style={props.style}\n >\n <Header {...props} />\n <Box\n mt={5}\n r=\"xl\"\n className={cn(\"oui-overflow-y-auto\", \"oui-custom-scrollbar\")}\n >\n <Flex\n gapY={5}\n height={200}\n direction=\"column\"\n r=\"xl\"\n className=\"oui-pr-1.5\"\n >\n {props.currentCampaigns.map((campaign) => {\n return (\n <CampaignItem\n key={campaign.title}\n campaign={campaign}\n onLearnMore={props.onLearnMore}\n onTradeNow={props.onTradeNow}\n />\n );\n })}\n </Flex>\n </Box>\n </Box>\n );\n};\n\nconst Header: FC<CampaignsScriptReturn> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex justify=\"between\" itemAlign=\"center\" pr={3}>\n <Text size=\"xl\">{t(\"tradingLeaderboard.campaigns\")}</Text>\n <Select.options\n size={\"xs\"}\n value={props.category}\n onValueChange={props.onCategoryChange}\n options={props.options}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n />\n </Flex>\n );\n};\n\ntype CampaignItemProps = {\n campaign: CurrentCampaigns;\n onLearnMore: (campaign: CurrentCampaigns) => void;\n onTradeNow: (campaign: CurrentCampaigns) => void;\n};\n\nconst CampaignItem: FC<CampaignItemProps> = ({\n campaign,\n onLearnMore,\n onTradeNow,\n}) => {\n const { title, description, image, displayTime } = campaign;\n const { t } = useTranslation();\n\n return (\n <Flex intensity={800} r=\"xl\" width=\"100%\">\n <img\n className=\"oui-h-[200px] oui-w-[400px] oui-rounded-l-xl oui-object-fill\"\n src={image}\n alt={title}\n />\n\n <Flex\n itemAlign=\"start\"\n justify=\"between\"\n direction=\"column\"\n height=\"100%\"\n p={5}\n className=\"oui-flex-1 oui-font-semibold\"\n >\n <Flex gap={1} direction=\"column\" itemAlign=\"start\">\n <Text size=\"xl\">{title}</Text>\n <Text size=\"sm\" intensity={36}>\n {description}\n </Text>\n </Flex>\n <Flex justify=\"between\" width=\"100%\">\n <Text size=\"xs\" intensity={54}>\n {displayTime}\n </Text>\n <Flex gap={3}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"md\"\n onClick={() => {\n onLearnMore(campaign);\n }}\n >\n {t(\"tradingLeaderboard.learnMore\")}\n </Button>\n <Button\n size=\"md\"\n onClick={() => {\n onTradeNow(campaign);\n }}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useAccount,\n useConfig,\n useInfiniteQuery,\n useQuery,\n usePrivateQuery,\n} from \"@orderly.network/hooks\";\nimport { TableSort, usePagination, useScreen } from \"@orderly.network/ui\";\nimport { differenceInDays } from \"date-fns\";\nimport { getDateRange, formatDateRange } from \"../../utils\";\nimport { AccountStatusEnum, API } from \"@orderly.network/types\";\nimport { useEndReached } from \"../../hooks/useEndReached\";\n\nexport type TradingListScriptOptioins = {};\n\nexport type TradingData = {\n account_id: string;\n address: string;\n broker_fee: number;\n date: string;\n perp_maker_volume: number;\n perp_taker_volume: number;\n perp_volume: number;\n total_fee: number;\n // custom field\n key?: string;\n};\n\nexport type TradingResponse = {\n meta: API.RecordsMeta;\n rows: TradingData[];\n};\nexport type TradingListScriptReturn = ReturnType<typeof useTradingListScript>;\n\nexport const FilterDays = [7, 14, 30, 90] as const;\nexport type TFilterDays = typeof FilterDays[number];\nexport type DateRange = {\n from?: Date;\n to?: Date;\n};\n\nexport function useTradingListScript() {\n const [searchValue, setSearchValue] = useState(\"\");\n const [initialSort] = useState<TableSort>({\n sortKey: \"perp_volume\",\n sort: \"desc\",\n });\n const [sort, setSort] = useState<TableSort | undefined>(initialSort);\n\n const { state } = useAccount();\n const brokerId = useConfig(\"brokerId\");\n\n const { isMobile } = useScreen();\n\n const canTrade =\n state.address &&\n (state.status >= AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected);\n\n const { dateRange, filterDay, updateFilterDay, filterItems, onFilter } =\n useFilter();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: 100,\n });\n\n const getUrl = (args: {\n page: number;\n pageSize: number;\n address?: string;\n sort?: string | null;\n }) => {\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"page\", args.page.toString());\n searchParams.set(\"size\", args.pageSize.toString());\n\n searchParams.set(\"aggregateBy\", \"ACCOUNT\");\n\n if (brokerId) {\n searchParams.set(\"broker_id\", brokerId);\n }\n\n if (args.sort) {\n searchParams.set(\"sort\", args.sort);\n } else if (args.sort !== null && sort) {\n const prefix = sort.sort === \"asc\" ? \"ascending\" : \"descending\";\n searchParams.set(\"sort\", `${prefix}_${sort.sortKey}`);\n }\n\n if (dateRange.from) {\n searchParams.set(\"start_date\", formatDateRange(dateRange.from!));\n }\n\n if (dateRange.to) {\n searchParams.set(\"end_date\", formatDateRange(dateRange.to!));\n }\n\n if (args.address) {\n searchParams.set(\"address\", args.address);\n }\n\n if (args.address) {\n return `/v1/volume/broker/daily?${searchParams.toString()}`;\n }\n\n return `/v1/broker/leaderboard/daily?${searchParams.toString()}`;\n };\n\n const { data, isLoading } = useDataSource(\n getUrl({ page, pageSize, address: searchValue }),\n searchValue\n );\n\n const {\n data: infiniteData,\n size,\n setSize,\n isValidating,\n } = useInfiniteQuery<TradingResponse>(\n (pageIndex: number, previousPageData: any): string | null => {\n // reached the end\n if (previousPageData && !previousPageData.rows?.length) return null;\n\n if (!isMobile) {\n return null;\n }\n\n return getUrl({\n page: pageIndex + 1,\n pageSize,\n address: searchValue,\n });\n },\n {\n initialSize: 1,\n formatter: (res) => res,\n revalidateOnFocus: false,\n }\n );\n\n // it will use first page data cache\n const { data: top100Data } = useQuery<TradingResponse>(\n state.address\n ? getUrl({\n page: 1,\n pageSize: 100,\n sort: `descending_${sort?.sortKey || \"perp_volume\"}`,\n })\n : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n }\n );\n\n const { data: userDataRes = [] } = usePrivateQuery<TradingData[]>(\n canTrade\n ? getUrl({ page: 1, pageSize: 1, address: state.address, sort: null })\n : null,\n {\n revalidateOnFocus: false,\n }\n );\n\n const getAddressRank = useCallback(\n (address: string) => {\n const index = top100Data?.rows.findIndex((item) =>\n isSameAddress(item.address, address!)\n );\n return index !== -1 ? index! + 1 : \"100+\";\n },\n [top100Data]\n );\n\n const userDataList = useMemo(() => {\n if (!canTrade || isLoading) {\n return [];\n }\n\n if (!userDataRes.length) {\n return [\n {\n key: getRowKey(state.address!),\n address: state.address,\n rank: \"-\",\n } as unknown as TradingData,\n ];\n }\n\n return userDataRes?.map((item) => ({\n ...item,\n rank: getAddressRank(item.address!),\n key: getRowKey(item.address!),\n }));\n }, [canTrade, state.address, userDataRes, isLoading, getAddressRank]);\n\n const addRankForList = useCallback(\n (list: TradingData[], total: number) => {\n return list?.map((item, index) => {\n let rank: string | number = index + 1;\n\n if (searchValue) {\n rank = getAddressRank(item.address);\n } else {\n if (sort?.sort === \"asc\") {\n rank = total - (page - 1) * pageSize - index;\n } else if (sort?.sort === \"desc\") {\n rank = (page - 1) * pageSize + index + 1;\n }\n }\n\n return {\n ...item,\n rank,\n };\n });\n },\n [page, pageSize, sort, searchValue, getAddressRank]\n );\n\n const dataSource = useMemo(() => {\n const list = data?.rows || [];\n const total = data?.meta.total || 0;\n const rankList = addRankForList(list, total);\n if (page === 1 && !searchValue) {\n return [...userDataList, ...rankList];\n }\n return rankList;\n }, [data, page, userDataList, searchValue, addRankForList]);\n\n const dataList = useMemo(() => {\n if (!infiniteData?.length) {\n return [];\n }\n\n const total = infiniteData[0]?.meta.total || 0;\n const flatList = infiniteData?.map((item) => item.rows)?.flat();\n const rankList = addRankForList(flatList, total);\n\n if (!searchValue) {\n return [...userDataList, ...rankList];\n }\n\n return rankList;\n }, [infiniteData, userDataList, searchValue, addRankForList]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () => parsePagination(data?.meta),\n [parsePagination, data]\n );\n\n useEndReached(sentinelRef, () => {\n if (!isValidating && isMobile) {\n setSize(size + 1);\n }\n });\n\n const onSearchValueChange = (value: string) => {\n setSearchValue(value);\n };\n\n const clearSearchValue = useCallback(() => {\n setSearchValue(\"\");\n }, []);\n\n const onSort = useCallback(\n (sort?: TableSort) => {\n setSort(sort || initialSort);\n },\n [initialSort]\n );\n\n useEffect(() => {\n if (searchValue) {\n setPage(1);\n }\n }, [searchValue]);\n\n useEffect(() => {\n setPage(1);\n }, [state.address]);\n\n useEffect(() => {\n if (dateRange.to && dateRange.from) {\n setPage(1);\n }\n }, [dateRange]);\n\n return {\n pagination,\n dateRange,\n filterDay,\n updateFilterDay,\n filterItems,\n onFilter,\n initialSort,\n onSort,\n dataSource,\n isLoading: isLoading || isValidating,\n searchValue,\n onSearchValueChange,\n clearSearchValue,\n isMobile,\n sentinelRef,\n dataList,\n address: state.address,\n canTrade,\n };\n}\n\nexport function useDataSource(url: string, searchValue: string) {\n const { data, isLoading } = useQuery<TradingResponse>(\n !searchValue ? url : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n }\n );\n\n // TODO: use public api when api is ready\n const { data: _data, isLoading: _isLoading } =\n usePrivateQuery<TradingResponse>(searchValue ? url : null, {\n formatter: (res) => res,\n revalidateOnFocus: false,\n });\n\n return {\n data: _data || data,\n isLoading: _isLoading || isLoading,\n };\n}\n\nconst useFilter = () => {\n /// default is 90d\n const [filterDay, setFilterDay] = useState<TFilterDays | null>(90);\n\n const [dateRange, setDateRange] = useState<DateRange>(getDateRange(90));\n\n const updateFilterDay = (day: TFilterDays) => {\n setFilterDay(day);\n setDateRange(getDateRange(day));\n };\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n const newDateRange = filter.value;\n setDateRange(newDateRange);\n\n if (newDateRange.from && newDateRange.to) {\n const offsetDay =\n Math.abs(differenceInDays(newDateRange.from, newDateRange.to)) + 1;\n\n const dateRange = getDateRange(offsetDay);\n if (\n formatDateRange(dateRange.from) ===\n formatDateRange(newDateRange.from) &&\n formatDateRange(dateRange.to) === formatDateRange(newDateRange.to)\n ) {\n setFilterDay(offsetDay as any);\n } else {\n setFilterDay(null);\n }\n }\n }\n };\n\n const filterItems = useMemo(() => {\n const dateRangeFilter = {\n type: \"range\",\n name: \"dateRange\",\n value: dateRange,\n max: 90,\n };\n\n return [dateRangeFilter] as any;\n }, [dateRange]);\n\n return {\n filterItems,\n onFilter,\n dateRange,\n filterDay,\n updateFilterDay,\n };\n};\n\nfunction isSameAddress(address1: string, address2: string) {\n return address1.toLowerCase() === address2.toLowerCase();\n}\n\nexport function getRowKey(address: string) {\n return `current-address-${address?.toLowerCase()}`;\n}\n","import { useEffect, useRef, MutableRefObject } from \"react\";\n\n/**\n * Listen for the specified element to scroll to the bottom\n */\nexport function useEndReached(\n sentinelRef: MutableRefObject<HTMLDivElement | null>,\n onEndReached?: () => void\n) {\n const observer = useRef<IntersectionObserver>();\n const cb = useRef(onEndReached);\n\n cb.current = onEndReached;\n\n useEffect(() => {\n const options: IntersectionObserverInit = {\n root: null,\n rootMargin: \"0px\",\n threshold: 0,\n };\n\n const handleObserver = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n cb.current?.();\n }\n });\n };\n\n observer.current = new IntersectionObserver(handleObserver, options);\n\n return () => {\n observer.current?.disconnect();\n };\n }, []);\n\n useEffect(() => {\n if (sentinelRef.current) {\n observer.current?.observe(sentinelRef.current);\n }\n }, [sentinelRef.current]);\n}\n","import { FC, SVGProps } from \"react\";\nimport {\n Box,\n CloseCircleFillIcon,\n cn,\n DataFilter,\n DataTable,\n Flex,\n Input,\n Text,\n} from \"@orderly.network/ui\";\nimport {\n FilterDays,\n getRowKey,\n TradingData,\n TradingListScriptReturn,\n} from \"./tradingList.script\";\nimport { useTradingListColumns } from \"./column\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport type TradingListProps = {\n style?: React.CSSProperties;\n className?: string;\n} & TradingListScriptReturn;\n\nexport const TradingList: FC<TradingListProps> = (props) => {\n const column = useTradingListColumns();\n const { t } = useTranslation();\n\n return (\n <Flex\n direction=\"column\"\n width=\"100%\"\n itemAlign=\"start\"\n intensity={900}\n r=\"2xl\"\n px={4}\n style={props.style}\n className={cn(\"oui-trading-leaderboard-trading-list\", props.className)}\n >\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n mt={2}\n className={cn(\n \"oui-trading-leaderboard-trading-filter\",\n \"oui-border-b oui-border-line\"\n )}\n >\n <Flex gap={3}>\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[53px] oui-border-none\"\n />\n )}\n {FilterDays.map((value) => {\n return (\n <button\n className=\"oui-relative oui-px-2 oui-py-[2px] oui-text-sm\"\n key={value}\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={props.filterDay === value ? \"brand\" : undefined}\n className={\n props.filterDay !== value\n ? \"oui-text-base-contrast-54\"\n : \"\"\n }\n >\n {`${value}D`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-gradient-primary oui-opacity-[.12] oui-absolute oui-left-0 oui-right-0 oui-top-0 oui-bottom-0 oui-rounded\"\n onClick={() => {\n props.updateFilterDay(value as any);\n }}\n ></div>\n </button>\n );\n })}\n </Flex>\n {props.canTrade && (\n <Input\n value={props.searchValue}\n onValueChange={props.onSearchValueChange}\n placeholder={t(\"common.address.search.placeholder\")}\n className={cn(\n \"oui-trading-leaderboard-trading-search-input\",\n \"oui-w-[240px]\"\n )}\n size=\"sm\"\n prefix={\n <Box pl={3} pr={1}>\n <SearchIcon className=\"oui-text-base-contrast-36\" />\n </Box>\n }\n suffix={\n props.searchValue && (\n <Box mr={2}>\n <CloseCircleFillIcon\n size={14}\n className=\"oui-text-base-contrast-36 oui-cursor-pointer =\"\n onClick={props.clearSearchValue}\n />\n </Box>\n )\n }\n autoComplete=\"off\"\n />\n )}\n </Flex>\n\n <DataTable\n loading={props.isLoading}\n id=\"oui-trading-leaderboard-trading-table\"\n columns={column}\n initialSort={props.initialSort}\n onSort={props.onSort}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record: TradingData) => record.key || record.address}\n manualPagination\n manualSorting\n pagination={props.pagination}\n classNames={{\n root: \"!oui-h-[calc(100%_-_53px_-_8px)]\",\n }}\n onRow={(record, index) => {\n return {\n className: cn(\"oui-h-[48px]\"),\n };\n }}\n onCell={(column, record, index) => {\n if (record.key === getRowKey(props.address!)) {\n const isFirst = column.getIsFirstColumn();\n const isLast = column.getIsLastColumn();\n\n return {\n className: cn(\n \"after:oui-absolute after:oui-w-full after:oui-h-[48px]\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \"after:oui-top-0 after:oui-left-0 after:oui-z-[-1]\",\n \"after:oui-border-b after:oui-border-t\",\n isFirst && \"after:oui-border-l after:oui-rounded-l-lg\",\n isLast && \"after:oui-border-r after:oui-rounded-r-lg\"\n ),\n };\n }\n return {};\n }}\n />\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { Text, Column, Box, useScreen } from \"@orderly.network/ui\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport const useTradingListColumns = () => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n return [\n {\n title: t(\"tradingLeaderboard.rank\"),\n dataIndex: \"rank\",\n width: 40,\n render: (value: number) => {\n return (\n <Box width={20} className=\"oui-text-center\">\n {value}\n </Box>\n );\n },\n },\n {\n title: t(\"common.address\"),\n dataIndex: \"address\",\n render: (value: string) => {\n return <Text.formatted rule=\"address\">{value}</Text.formatted>;\n },\n width: 90,\n },\n {\n title: t(\"tradingLeaderboard.tradingVolume\"),\n dataIndex: \"perp_volume\",\n onSort: true,\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2}>\n {value}\n </Text.numeral>\n );\n },\n width: 105,\n },\n {\n title: t(\"common.realizedPnl\"),\n dataIndex: \"realized_pnl\",\n onSort: true,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2} coloring>\n {value}\n </Text.numeral>\n );\n },\n width: 90,\n },\n ] as Column[];\n};\n","import { FC, SVGProps } from \"react\";\nimport {\n Box,\n CloseCircleFillIcon,\n cn,\n DataFilter,\n DataTable,\n Flex,\n Input,\n Spinner,\n Text,\n} from \"@orderly.network/ui\";\nimport {\n FilterDays,\n getRowKey,\n TradingData,\n TradingListScriptReturn,\n} from \"./tradingList.script\";\nimport { useTradingListColumns } from \"./column\";\n\nexport type TradingListProps = {\n style?: React.CSSProperties;\n className?: string;\n} & TradingListScriptReturn;\n\nexport const MobileTradingList: FC<TradingListProps> = (props) => {\n const column = useTradingListColumns();\n\n return (\n <Flex\n direction=\"column\"\n width=\"100%\"\n itemAlign=\"start\"\n intensity={900}\n r=\"2xl\"\n px={4}\n style={props.style}\n className={cn(\n \"oui-mobile-trading-leaderboard-trading-list\",\n props.className\n )}\n >\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n className={cn(\"oui-mobile-trading-leaderboard-trading-filter\")}\n >\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[40px] oui-border-none\"\n />\n )}\n </Flex>\n\n <DataTable\n classNames={{\n root: \"oui-pb-4\",\n body: \"oui-text-2xs\",\n scroll: \"oui-overflow-y-hidden oui-h-full\",\n }}\n loading={props.isLoading}\n id=\"oui-trading-leaderboard-trading-table\"\n columns={column}\n initialSort={props.initialSort}\n onSort={props.onSort}\n dataSource={props.dataList}\n generatedRowKey={(record: TradingData) => record.key || record.address}\n manualPagination\n manualSorting\n onRow={(record, index) => {\n return {\n className: cn(\"oui-h-[30px]\"),\n };\n }}\n onCell={(column, record, index) => {\n if (record.key === getRowKey(props.address!)) {\n const isFirst = column.getIsFirstColumn();\n const isLast = column.getIsLastColumn();\n\n return {\n className: cn(\n \"after:oui-absolute after:oui-w-full after:oui-h-[30px]\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \" after:oui-top-0 after:oui-left-0 after:oui-z-[-1]\",\n \"after:oui-border-b after:oui-border-t\",\n isFirst && \"after:oui-border-l after:oui-rounded-l-lg\",\n isLast && \"after:oui-border-r after:oui-rounded-r-lg\"\n ),\n };\n }\n return {};\n }}\n />\n <div\n ref={props.sentinelRef}\n className=\"oui-relative oui-invisible oui-h-[1px] oui-top-[-300px]\"\n />\n {props.isLoading && props.dataList.length > 0 && (\n <Flex itemAlign=\"center\" justify=\"center\" width=\"100%\" height={40}>\n <Spinner size=\"sm\" />\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { FC } from \"react\";\nimport { useTradingListScript } from \"./tradingList.script\";\nimport { TradingList, TradingListProps } from \"./tradingList.ui\";\nimport { MobileTradingList } from \"./tradingList.mobile.ui\";\n\nexport type TradingListWidgetProps = Pick<\n TradingListProps,\n \"style\" | \"className\"\n>;\n\nexport const TradingListWidget: FC<TradingListWidgetProps> = (props) => {\n const state = useTradingListScript();\n if (state.isMobile) {\n return <MobileTradingList {...state} {...props} />;\n }\n return <TradingList {...state} {...props} />;\n};\n","import { useMemo } from \"react\";\nimport { Campaign } from \"../../components/provider\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { useAccount } from \"@orderly.network/hooks\";\nimport { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"@orderly.network/react-app\";\n\nexport type LeaderboardScriptReturn = ReturnType<typeof useLeaderboardScript>;\n\nexport type LeaderboardScriptOptions = {\n backgroundSrc?: string;\n campaigns?: Campaign[];\n};\n\nfunction isVideoSrc(src?: string) {\n const extension = src?.split(\".\").pop();\n return [\"mp4\", \"webm\", \"avi\", \"ogg\"].includes(extension ?? \"\");\n}\n\nexport function useLeaderboardScript(options: LeaderboardScriptOptions) {\n const { backgroundSrc, campaigns = [] } = options;\n const { isMobile } = useScreen();\n const { state } = useAccount();\n const { wrongNetwork, disabledConnect } = useAppContext();\n\n const showCampaigns = useMemo(() => campaigns?.length > 0, [campaigns]);\n\n const canTrading =\n !wrongNetwork &&\n !disabledConnect &&\n (state.status >= AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected);\n\n const isVideo = useMemo(() => {\n return isVideoSrc(backgroundSrc);\n }, [backgroundSrc]);\n\n return {\n backgroundSrc,\n isVideo,\n showCampaigns,\n isMobile,\n canTrading,\n };\n}\n","import { FC } from \"react\";\nimport { cn, Flex } from \"@orderly.network/ui\";\nimport { TradingListWidget } from \"../../components/tradingList/widget\";\nimport { CampaignsWidget } from \"../../components/campaigns\";\nimport { LeaderboardScriptReturn } from \"./leaderboard.script\";\n\nexport type LeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n} & LeaderboardScriptReturn;\n\nexport const Leaderboard: FC<LeaderboardProps> = (props) => {\n const renderBackground = () => {\n const linearGradient =\n \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n if (props.isVideo) {\n return (\n <div\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\"\n )}\n >\n <div\n style={{\n backgroundImage: linearGradient,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\"\n )}\n />\n <video\n autoPlay\n loop\n muted\n className={cn(\n // rest style\n \"oui-border-none oui-outline-none oui-bg-transparent\",\n \"oui-w-full oui-h-full\",\n // \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-object-cover\",\n \"oui-opacity-50\"\n )}\n >\n <source src={props.backgroundSrc} type=\"video/mp4\" />\n <source src={props.backgroundSrc} type=\"video/webm\" />\n <source src={props.backgroundSrc} type=\"video/ogg\" />\n <source src={props.backgroundSrc} type=\"video/avi\" />\n Your browser does not support the video tag.\n </video>\n </div>\n );\n }\n\n if (props.backgroundSrc) {\n return (\n <div\n style={{\n backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\",\n \"oui-opacity-50\"\n )}\n />\n );\n }\n };\n\n return (\n <div\n style={props.style}\n className={cn(\"oui-h-full oui-mix-blend-screen\", props.className)}\n >\n {renderBackground()}\n <Flex\n direction=\"column\"\n gapY={5}\n height=\"100%\"\n className={cn(\n \"oui-trading-leaderboard oui-relative\",\n \"oui-max-w-[1040px] oui-px-3 oui-mx-auto \"\n )}\n >\n {props.showCampaigns && <CampaignsWidget />}\n <TradingListWidget\n className={cn(\n props.showCampaigns\n ? \"oui-h-[calc(100%_-_288px_-_20px)]\"\n : \"oui-h-full\"\n )}\n />\n </Flex>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { cn, Flex } from \"@orderly.network/ui\";\nimport { TradingListWidget } from \"../../components/tradingList/widget\";\nimport { CampaignsWidget } from \"../../components/campaigns\";\nimport { LeaderboardScriptReturn } from \"./leaderboard.script\";\nimport { BottomNavBarWidget } from \"@orderly.network/trading\";\n\nexport type LeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n} & LeaderboardScriptReturn;\n\nexport const MobileLeaderboardWidget: FC<LeaderboardProps> = (props) => {\n const renderBackground = () => {\n const linearGradient =\n \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n if (props.isVideo) {\n return (\n <div\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\"\n )}\n >\n <div\n style={{\n backgroundImage: linearGradient,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\"\n )}\n />\n <video\n playsInline\n webkit-playsinline\n autoPlay\n loop\n muted\n className={cn(\n // rest style\n \"oui-border-none oui-outline-none oui-bg-transparent oui-pointer-events-none\",\n \"oui-w-full oui-h-full\",\n // \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-object-cover\",\n \"oui-opacity-50\"\n )}\n >\n <source src={props.backgroundSrc} type=\"video/mp4\" />\n <source src={props.backgroundSrc} type=\"video/webm\" />\n <source src={props.backgroundSrc} type=\"video/ogg\" />\n <source src={props.backgroundSrc} type=\"video/avi\" />\n Your browser does not support the video tag.\n </video>\n </div>\n );\n }\n\n if (props.backgroundSrc) {\n return (\n <div\n style={{\n backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\",\n \"oui-opacity-50\"\n )}\n />\n );\n }\n };\n return (\n <div\n style={{\n paddingBottom: \"calc(64px + env(safe-area-inset-bottom))\",\n }}\n className={cn(\n \"oui-grid oui-grid-rows-[auto,1fr,auto] oui-h-screen oui-gap-1 oui-relative oui-bg-base-10\",\n \"oui-relative oui-h-full oui-mix-blend-screen\",\n props.className\n )}\n >\n {renderBackground()}\n <Flex\n direction=\"column\"\n gapY={3}\n height=\"100%\"\n px={3}\n pt={3}\n pb={3}\n className={cn(\n \"oui-trading-leaderboard-mobile oui-overflow-y-auto oui-custom-scrollbar\",\n \"oui-relative oui-h-[calc(100vh_-_64px)]\"\n )}\n >\n {props.showCampaigns && <CampaignsWidget />}\n <TradingListWidget className={cn(!props.canTrading && \"oui-h-full\")} />\n <div className=\"oui-fixed oui-left-0 oui-right-0 oui-bottom-0 oui-z-10\">\n <BottomNavBarWidget />\n </div>\n </Flex>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { useLeaderboardScript } from \"./leaderboard.script\";\nimport { Leaderboard, LeaderboardProps } from \"./leaderboard.ui\";\nimport {\n TradingLeaderboardProvider,\n TradingLeaderboardProviderProps,\n} from \"../../components/provider\";\nimport { MobileLeaderboardWidget } from \"./leaderboard.mobile.ui\";\n\nexport type LeaderboardWidgetProps = TradingLeaderboardProviderProps &\n Pick<LeaderboardProps, \"style\" | \"className\">;\n\nexport const LeaderboardWidget: FC<LeaderboardWidgetProps> = (props) => {\n const state = useLeaderboardScript({\n backgroundSrc: props.backgroundSrc,\n campaigns: props.campaigns,\n });\n\n return (\n <TradingLeaderboardProvider campaigns={props.campaigns} href={props.href}>\n {state.isMobile ? (\n <MobileLeaderboardWidget {...state} />\n ) : (\n <Leaderboard\n {...state}\n className={props.className}\n style={props.style}\n />\n )}\n </TradingLeaderboardProvider>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/campaigns/widget.tsx","../src/components/campaigns/campaigns.mobile.ui.tsx","../src/components/campaigns/campaigns.script.ts","../src/utils.ts","../src/components/provider/index.tsx","../src/components/campaigns/campaigns.ui.tsx","../src/components/tradingList/tradingList.script.ts","../src/hooks/useEndReached.ts","../src/components/tradingList/tradingList.ui.tsx","../src/components/tradingList/column.tsx","../src/components/tradingList/tradingList.mobile.ui.tsx","../src/components/tradingList/widget.tsx","../src/page/leaderboard/leaderboard.script.ts","../src/page/leaderboard/leaderboard.ui.tsx","../src/page/leaderboard/leaderboard.mobile.ui.tsx","../src/page/leaderboard/widget.tsx"],"names":["useScreen","cn","Box","Text","Flex","Button","Select","useTranslation","jsx","jsxs","scrollIndicatorWidth","scrollIndicatorHeight","MobileCampaigns","props","Header","campaign","CampaignItem","ScrollIndicator","title","description","image","displayTime","learnMoreUrl","tradingUrl","t","style","scrollIndex","list","item","index","useEffect","useMemo","useState","useEmblaCarousel","useTrack","TrackerEventName","format","subDays","getDateRange","offsetDay","formatDateRange","date","formatCampaignDate","monthNames","year","month","day","hours","minutes","createContext","useContext","TradingLeaderboardContext","TradingLeaderboardProvider","useTradingLeaderboardContext","useCampaignsScript","campaigns","href","category","setCategory","track","tracking","filterCampaigns","now","acc","startTime","endTime","options","currentCampaigns","firstAvailableCategory","onCategoryChange","value","setScrollIndex","emblaRef","emblaApi","onLearnMore","onTradeNow","Campaigns","CampaignsWidget","state","isMobile","useCallback","useRef","differenceInDays","useAccount","useConfig","useInfiniteQuery","useQuery","usePrivateQuery","AccountStatusEnum","usePagination","useEndReached","sentinelRef","onEndReached","observer","cb","handleObserver","entries","entry","FilterDays","useTradingListScript","searchValue","setSearchValue","initialSort","sort","setSort","brokerId","canTrade","dateRange","filterDay","updateFilterDay","filterItems","onFilter","useFilter","page","pageSize","setPage","parsePagination","getUrl","args","searchParams","prefix","data","isLoading","useDataSource","infiniteData","size","setSize","isValidating","pageIndex","previousPageData","res","top100Data","userDataRes","getAddressRank","address","isSameAddress","userDataList","getRowKey","addRankForList","total","rank","dataSource","rankList","dataList","flatList","pagination","onSearchValueChange","clearSearchValue","onSort","url","_data","_isLoading","setFilterDay","setDateRange","filter","newDateRange","address1","address2","CloseCircleFillIcon","DataFilter","DataTable","Input","useTradingListColumns","TradingList","column","SearchIcon","record","isFirst","isLast","Spinner","MobileTradingList","TradingListWidget","isVideoSrc","src","extension","useLeaderboardScript","backgroundSrc","showCampaigns","isVideo","Leaderboard","renderBackground","linearGradient","MobileLeaderboardWidget","LeaderboardWidget"],"mappings":"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","sourcesContent":["import { FC } from \"react\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { MobileCampaigns } from \"./campaigns.mobile.ui\";\nimport { useCampaignsScript } from \"./campaigns.script\";\nimport { Campaigns } from \"./campaigns.ui\";\n\nexport type CampaignsWidgetProps = {\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport const CampaignsWidget: FC<CampaignsWidgetProps> = (props) => {\n const state = useCampaignsScript();\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return (\n <MobileCampaigns\n {...state}\n className={props.className}\n style={props.style}\n />\n );\n }\n return (\n <Campaigns {...state} className={props.className} style={props.style} />\n );\n};\n","import { FC } from \"react\";\nimport { cn, Box, Text, Flex, Button, Select } from \"@orderly.network/ui\";\nimport { CampaignsScriptReturn, CurrentCampaigns } from \"./campaigns.script\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport type CampaignsProps = {\n className?: string;\n style?: React.CSSProperties;\n} & CampaignsScriptReturn;\n\nconst scrollIndicatorWidth = 25;\nconst scrollIndicatorHeight = 6;\n\nexport const MobileCampaigns: FC<CampaignsProps> = (props) => {\n if (props.currentCampaigns.length === 0) {\n return null;\n }\n\n return (\n <Box\n width=\"100%\"\n intensity={900}\n p={3}\n className={cn(\n \"oui-mobile-trading-leaderboard-campaigns oui-rounded-[20px]\",\n props.className\n )}\n style={props.style}\n >\n <Header {...props} />\n <Box\n r=\"xl\"\n mt={3}\n ref={props.enableScroll ? props.emblaRef : undefined}\n className={cn(\n \"oui-w-full oui-min-w-0 oui-overflow-hidden\",\n \"oui-select-none oui-cursor-pointer\"\n )}\n >\n <Flex>\n {props.currentCampaigns.map((campaign) => {\n return <CampaignItem key={campaign.title} campaign={campaign} />;\n })}\n </Flex>\n </Box>\n {props.enableScroll && (\n <ScrollIndicator\n style={{\n width: scrollIndicatorWidth * props.currentCampaigns.length,\n }}\n list={props.currentCampaigns}\n scrollIndex={props.scrollIndex}\n scrollTo={props.emblaApi?.scrollTo}\n />\n )}\n </Box>\n );\n};\n\nconst Header: FC<CampaignsScriptReturn> = (props) => {\n const { t } = useTranslation();\n\n return (\n <Flex justify=\"between\" itemAlign=\"center\">\n <Text size=\"base\" intensity={80}>\n {t(\"tradingLeaderboard.campaigns\")}\n </Text>\n <Select.options\n size={\"xs\"}\n value={props.category}\n onValueChange={props.onCategoryChange}\n options={props.options}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n />\n </Flex>\n );\n};\n\nconst CampaignItem: FC<{ campaign: CurrentCampaigns }> = ({ campaign }) => {\n const { title, description, image, displayTime, learnMoreUrl, tradingUrl } =\n campaign;\n const { t } = useTranslation();\n\n return (\n <Box intensity={800} r=\"xl\" className=\"oui-flex-[0_0_100%]\">\n <img\n className=\"oui-w-full oui-h-[calc((100vw-48px)/2)] oui-rounded-t-xl oui-object-fill\"\n src={image}\n alt={title}\n />\n\n <Flex\n itemAlign=\"start\"\n justify=\"between\"\n direction=\"column\"\n height=\"100%\"\n p={4}\n gapY={3}\n className=\"oui-font-semibold\"\n >\n <Flex direction=\"column\" itemAlign=\"start\" gapY={1}>\n <Text size=\"sm\">{title}</Text>\n <Text size=\"2xs\" intensity={54}>\n {displayTime}\n </Text>\n <Text size=\"2xs\" intensity={36}>\n {description}\n </Text>\n </Flex>\n <Flex justify=\"between\" width=\"100%\" gapX={3}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n fullWidth\n size=\"md\"\n onClick={() => {\n window.open(learnMoreUrl, \"_blank\");\n }}\n >\n {t(\"tradingLeaderboard.learnMore\")}\n </Button>\n <Button\n size=\"md\"\n fullWidth\n onClick={() => {\n window.open(tradingUrl, \"_self\");\n }}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n </Flex>\n </Flex>\n </Box>\n );\n};\n\ninterface ScrollIndicatorProps {\n style?: React.CSSProperties;\n list: CurrentCampaigns[];\n scrollIndex: number;\n scrollTo?: (index: number) => void;\n}\n\nconst ScrollIndicator: React.FC<ScrollIndicatorProps> = (props) => {\n const { style, scrollIndex, list } = props;\n\n return (\n <Flex\n mt={3}\n r=\"full\"\n height={scrollIndicatorHeight}\n className={cn(\"oui-bg-line oui-mx-auto oui-relative\")}\n style={props.style}\n >\n {list.map((item, index) => {\n return (\n <Box\n key={index}\n width={scrollIndicatorWidth}\n height={scrollIndicatorHeight}\n onClick={() => {\n props.scrollTo?.(index);\n }}\n r=\"full\"\n className=\"oui-cursor-pointer\"\n />\n );\n })}\n <Box\n width={scrollIndicatorWidth}\n height={scrollIndicatorHeight}\n r=\"full\"\n className={cn(\n \"oui-absolute oui-left-0 oui-top-0\",\n \"oui-transition-all oui-duration-300\",\n \"oui-bg-primary\"\n )}\n style={{\n transform: `translateX(${scrollIndex * scrollIndicatorWidth}px)`,\n }}\n />\n </Flex>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport useEmblaCarousel from \"embla-carousel-react\";\nimport { useTrack } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { TrackerEventName } from \"@orderly.network/types\";\nimport { formatCampaignDate } from \"../../utils\";\nimport { useTradingLeaderboardContext, Campaign } from \"../provider\";\n\nexport type CampaignsScriptReturn = ReturnType<typeof useCampaignsScript>;\n\n// Define the type for our categorized campaigns\ntype CategorizedCampaigns = {\n ongoing: Campaign[];\n past: Campaign[];\n future: Campaign[];\n};\n\nexport type CurrentCampaigns = Campaign & {\n displayTime: string;\n learnMoreUrl: string;\n tradingUrl: string;\n};\n\nexport type TEmblaApi = {\n scrollTo?: (index: number) => void;\n};\n\ntype CategoryKey = keyof CategorizedCampaigns;\n\nexport function useCampaignsScript() {\n const { t } = useTranslation();\n const { campaigns = [], href } = useTradingLeaderboardContext();\n const [category, setCategory] = useState<CategoryKey>(\"ongoing\");\n\n const { track, tracking } = useTrack();\n\n const filterCampaigns = useMemo(() => {\n const now = new Date();\n\n return campaigns.reduce<CategorizedCampaigns>(\n (acc, campaign) => {\n const startTime = new Date(campaign.startTime);\n const endTime = new Date(campaign.endTime);\n\n if (now >= startTime && now <= endTime) {\n acc.ongoing.push(campaign);\n } else if (now > endTime) {\n acc.past.push(campaign);\n } else {\n acc.future.push(campaign);\n }\n\n return acc;\n },\n { ongoing: [], past: [], future: [] },\n );\n }, [campaigns]);\n\n const options = useMemo(() => {\n const opts: { label: string; value: CategoryKey }[] = [\n { label: t(\"tradingLeaderboard.ongoing\"), value: \"ongoing\" },\n { label: t(\"tradingLeaderboard.future\"), value: \"future\" },\n { label: t(\"tradingLeaderboard.past\"), value: \"past\" },\n ];\n\n // Filter out categories with no campaigns and map to the required format\n return opts.filter((item) => filterCampaigns[item.value].length > 0);\n }, [filterCampaigns, t]);\n\n const currentCampaigns = useMemo(() => {\n const list = filterCampaigns[category];\n return list.map((campaign) => {\n const { startTime, endTime } = campaign;\n\n let learnMoreUrl: string;\n let tradingUrl = href?.trading!;\n\n if (typeof campaign.href === \"object\") {\n learnMoreUrl = campaign.href.learnMore;\n tradingUrl = campaign.href.trading;\n } else {\n learnMoreUrl = campaign.href;\n }\n\n return {\n ...campaign,\n displayTime: `${formatCampaignDate(startTime)} - ${formatCampaignDate(\n endTime,\n )} UTC`,\n learnMoreUrl,\n tradingUrl,\n };\n });\n }, [filterCampaigns, category, href]);\n\n useEffect(() => {\n // Find the first non-empty category\n const categoryKeys: CategoryKey[] = [\"ongoing\", \"future\", \"past\"];\n\n const firstAvailableCategory = categoryKeys.find(\n (item) => filterCampaigns[item].length > 0,\n );\n\n if (firstAvailableCategory) {\n setCategory(firstAvailableCategory);\n }\n }, [filterCampaigns]);\n\n const onCategoryChange = (value: string) => {\n setCategory(value as CategoryKey);\n };\n const [scrollIndex, setScrollIndex] = useState(0);\n\n const [emblaRef, emblaApi] = useEmblaCarousel({\n loop: false,\n slidesToScroll: \"auto\",\n });\n\n useEffect(() => {\n emblaApi?.on(\"select\", () => {\n setScrollIndex(emblaApi?.selectedScrollSnap());\n });\n }, [emblaApi]);\n\n const onLearnMore = (campaign: CurrentCampaigns) => {\n track(TrackerEventName.leaderboardCampaignClickLearnMore, {\n campaign_title: campaign.title,\n });\n window.open(campaign.learnMoreUrl, \"_blank\");\n };\n\n const onTradeNow = (campaign: CurrentCampaigns) => {\n tracking(TrackerEventName.leaderboardCampaignClickTradeNow, {\n campaign_title: campaign.title,\n });\n window.open(campaign.tradingUrl, \"_self\");\n };\n\n return {\n options,\n currentCampaigns,\n category,\n onCategoryChange,\n tradingUrl: href?.trading,\n emblaRef,\n emblaApi: emblaApi as TEmblaApi,\n scrollIndex,\n enableScroll: currentCampaigns?.length > 1,\n onLearnMore,\n onTradeNow,\n };\n}\n","import { format, subDays } from \"date-fns\";\n\nexport const getDateRange = (offsetDay: number) => {\n return {\n from: subDays(new Date(), offsetDay - 1)!,\n to: new Date()!,\n };\n};\n\n/**\n * Format a date to \"yyyy-MM-dd\" format (e.g., \"2025-03-10\")\n * @param date The date to format\n * @returns Formatted date string\n */\nexport const formatDateRange = (date: Date): string => {\n return format(date, \"yyyy-MM-dd\");\n};\n\nexport function formatCampaignDate(date: Date | string): string {\n const monthNames = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ];\n if (typeof date === \"string\") {\n date = new Date(date);\n }\n const year = date.getUTCFullYear();\n const month = monthNames[date.getUTCMonth()];\n const day = date.getUTCDate();\n const hours = String(date.getUTCHours()).padStart(2, \"0\");\n const minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n return `${month} ${day}, ${year} ${hours}:${minutes}`;\n}\n","import { createContext, PropsWithChildren, useContext } from \"react\";\n\nexport type Campaign = {\n title: string;\n description: string;\n image: string;\n startTime: Date | string;\n endTime: Date | string;\n href:\n | string\n | {\n /** learn more url */\n learnMore: string;\n /** trading url, if provided, will override default trading now button url */\n trading: string;\n };\n};\n\n/**\n * Trading leaderboard provider state\n */\nexport type TradingLeaderboardState = {\n /** campaigns config, if not provided, will not show campaigns section */\n campaigns?: Campaign[];\n /** background src, it can be a image resource or video resource */\n backgroundSrc?: string;\n href?: {\n /** default trading now button url */\n trading: string;\n };\n};\n\n/**\n * Trading leaderboard context\n */\nexport const TradingLeaderboardContext = createContext<TradingLeaderboardState>(\n {} as TradingLeaderboardState\n);\n\nexport type TradingLeaderboardProviderProps =\n PropsWithChildren<TradingLeaderboardState>;\n\nexport const TradingLeaderboardProvider = (\n props: TradingLeaderboardProviderProps\n) => {\n return (\n <TradingLeaderboardContext.Provider\n value={{\n campaigns: props.campaigns,\n href: props.href,\n backgroundSrc: props.backgroundSrc,\n }}\n >\n {props.children}\n </TradingLeaderboardContext.Provider>\n );\n};\n\nexport const useTradingLeaderboardContext = () => {\n return useContext(TradingLeaderboardContext);\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { cn, Box, Text, Flex, Button, Select } from \"@orderly.network/ui\";\nimport { CampaignsScriptReturn, CurrentCampaigns } from \"./campaigns.script\";\n\nexport type CampaignsProps = {\n className?: string;\n style?: React.CSSProperties;\n} & CampaignsScriptReturn;\n\nexport const Campaigns: FC<CampaignsProps> = (props) => {\n if (props.currentCampaigns.length === 0) {\n return null;\n }\n\n return (\n <Box\n width=\"100%\"\n intensity={900}\n p={5}\n pr={2}\n height={288}\n className={cn(\n \"oui-trading-leaderboard-campaigns oui-rounded-[20px]\",\n props.className,\n )}\n style={props.style}\n >\n <Header {...props} />\n <Box\n mt={5}\n r=\"xl\"\n className={cn(\"oui-overflow-y-auto\", \"oui-custom-scrollbar\")}\n >\n <Flex\n gapY={5}\n height={200}\n direction=\"column\"\n r=\"xl\"\n className=\"oui-pr-1.5\"\n >\n {props.currentCampaigns.map((campaign) => {\n return (\n <CampaignItem\n key={campaign.title}\n campaign={campaign}\n onLearnMore={props.onLearnMore}\n onTradeNow={props.onTradeNow}\n />\n );\n })}\n </Flex>\n </Box>\n </Box>\n );\n};\n\nconst Header: FC<CampaignsScriptReturn> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex justify=\"between\" itemAlign=\"center\" pr={3}>\n <Text size=\"xl\">{t(\"tradingLeaderboard.campaigns\")}</Text>\n <Select.options\n size={\"xs\"}\n value={props.category}\n onValueChange={props.onCategoryChange}\n options={props.options}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n />\n </Flex>\n );\n};\n\ntype CampaignItemProps = {\n campaign: CurrentCampaigns;\n onLearnMore: (campaign: CurrentCampaigns) => void;\n onTradeNow: (campaign: CurrentCampaigns) => void;\n};\n\nconst CampaignItem: FC<CampaignItemProps> = ({\n campaign,\n onLearnMore,\n onTradeNow,\n}) => {\n const { title, description, image, displayTime } = campaign;\n const { t } = useTranslation();\n\n return (\n <Flex intensity={800} r=\"xl\" width=\"100%\">\n <img\n className=\"oui-h-[200px] oui-w-[400px] oui-rounded-l-xl oui-object-fill\"\n src={image}\n alt={title}\n />\n\n <Flex\n itemAlign=\"start\"\n justify=\"between\"\n direction=\"column\"\n height=\"100%\"\n p={5}\n className=\"oui-flex-1 oui-font-semibold\"\n >\n <Flex gap={1} direction=\"column\" itemAlign=\"start\">\n <Text size=\"xl\">{title}</Text>\n <Text size=\"sm\" intensity={36}>\n {description}\n </Text>\n </Flex>\n <Flex justify=\"between\" width=\"100%\">\n <Text size=\"xs\" intensity={54}>\n {displayTime}\n </Text>\n <Flex gap={3}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"md\"\n onClick={() => {\n onLearnMore(campaign);\n }}\n >\n {t(\"tradingLeaderboard.learnMore\")}\n </Button>\n <Button\n size=\"md\"\n onClick={() => {\n onTradeNow(campaign);\n }}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { differenceInDays } from \"date-fns\";\nimport {\n useAccount,\n useConfig,\n useInfiniteQuery,\n useQuery,\n usePrivateQuery,\n} from \"@orderly.network/hooks\";\nimport { AccountStatusEnum, API } from \"@orderly.network/types\";\nimport { TableSort, usePagination, useScreen } from \"@orderly.network/ui\";\nimport { useEndReached } from \"../../hooks/useEndReached\";\nimport { getDateRange, formatDateRange } from \"../../utils\";\n\nexport type TradingListScriptOptioins = {};\n\nexport type TradingData = {\n account_id: string;\n address: string;\n broker_fee: number;\n date: string;\n perp_maker_volume: number;\n perp_taker_volume: number;\n perp_volume: number;\n total_fee: number;\n // custom field\n key?: string;\n};\n\nexport type TradingResponse = {\n meta: API.RecordsMeta;\n rows: TradingData[];\n};\nexport type TradingListScriptReturn = ReturnType<typeof useTradingListScript>;\n\nexport const FilterDays = [7, 14, 30, 90] as const;\nexport type TFilterDays = (typeof FilterDays)[number];\nexport type DateRange = {\n from?: Date;\n to?: Date;\n};\n\nexport function useTradingListScript() {\n const [searchValue, setSearchValue] = useState(\"\");\n const [initialSort] = useState<TableSort>({\n sortKey: \"perp_volume\",\n sort: \"desc\",\n });\n const [sort, setSort] = useState<TableSort | undefined>(initialSort);\n\n const { state } = useAccount();\n const brokerId = useConfig(\"brokerId\");\n\n const { isMobile } = useScreen();\n\n const canTrade =\n state.address &&\n (state.status >= AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected);\n\n const { dateRange, filterDay, updateFilterDay, filterItems, onFilter } =\n useFilter();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: 100,\n });\n\n const getUrl = (args: {\n page: number;\n pageSize: number;\n address?: string;\n sort?: string | null;\n }) => {\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"page\", args.page.toString());\n searchParams.set(\"size\", args.pageSize.toString());\n\n searchParams.set(\"aggregateBy\", \"ACCOUNT\");\n\n if (brokerId) {\n searchParams.set(\"broker_id\", brokerId);\n }\n\n if (args.sort) {\n searchParams.set(\"sort\", args.sort);\n } else if (args.sort !== null && sort) {\n const prefix = sort.sort === \"asc\" ? \"ascending\" : \"descending\";\n searchParams.set(\"sort\", `${prefix}_${sort.sortKey}`);\n }\n\n if (dateRange.from) {\n searchParams.set(\"start_date\", formatDateRange(dateRange.from!));\n }\n\n if (dateRange.to) {\n searchParams.set(\"end_date\", formatDateRange(dateRange.to!));\n }\n\n if (args.address) {\n searchParams.set(\"address\", args.address);\n }\n\n if (args.address) {\n return `/v1/volume/broker/daily?${searchParams.toString()}`;\n }\n\n return `/v1/broker/leaderboard/daily?${searchParams.toString()}`;\n };\n\n const { data, isLoading } = useDataSource(\n getUrl({ page, pageSize, address: searchValue }),\n searchValue,\n );\n\n const {\n data: infiniteData,\n size,\n setSize,\n isValidating,\n } = useInfiniteQuery<TradingResponse>(\n (pageIndex: number, previousPageData: any): string | null => {\n // reached the end\n if (previousPageData && !previousPageData.rows?.length) return null;\n\n if (!isMobile) {\n return null;\n }\n\n return getUrl({\n page: pageIndex + 1,\n pageSize,\n address: searchValue,\n });\n },\n {\n initialSize: 1,\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n // it will use first page data cache\n const { data: top100Data } = useQuery<TradingResponse>(\n state.address\n ? getUrl({\n page: 1,\n pageSize: 100,\n sort: `descending_${sort?.sortKey || \"perp_volume\"}`,\n })\n : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const { data: userDataRes = [] } = usePrivateQuery<TradingData[]>(\n canTrade\n ? getUrl({ page: 1, pageSize: 1, address: state.address, sort: null })\n : null,\n {\n revalidateOnFocus: false,\n },\n );\n\n const getAddressRank = useCallback(\n (address: string) => {\n const index = top100Data?.rows.findIndex((item) =>\n isSameAddress(item.address, address!),\n );\n return index !== -1 ? index! + 1 : \"100+\";\n },\n [top100Data],\n );\n\n const userDataList = useMemo(() => {\n if (!canTrade || isLoading) {\n return [];\n }\n\n if (!userDataRes.length) {\n return [\n {\n key: getRowKey(state.address!),\n address: state.address,\n rank: \"-\",\n } as unknown as TradingData,\n ];\n }\n\n return userDataRes?.map((item) => ({\n ...item,\n rank: getAddressRank(item.address!),\n key: getRowKey(item.address!),\n }));\n }, [canTrade, state.address, userDataRes, isLoading, getAddressRank]);\n\n const addRankForList = useCallback(\n (list: TradingData[], total: number) => {\n return list?.map((item, index) => {\n let rank: string | number = index + 1;\n\n if (searchValue) {\n rank = getAddressRank(item.address);\n } else {\n if (sort?.sort === \"asc\") {\n rank = total - (page - 1) * pageSize - index;\n } else if (sort?.sort === \"desc\") {\n rank = (page - 1) * pageSize + index + 1;\n }\n }\n\n return {\n ...item,\n rank,\n };\n });\n },\n [page, pageSize, sort, searchValue, getAddressRank],\n );\n\n const dataSource = useMemo(() => {\n const list = data?.rows || [];\n const total = data?.meta.total || 0;\n const rankList = addRankForList(list, total);\n if (page === 1 && !searchValue) {\n return [...userDataList, ...rankList];\n }\n return rankList;\n }, [data, page, userDataList, searchValue, addRankForList]);\n\n const dataList = useMemo(() => {\n if (!infiniteData?.length) {\n return [];\n }\n\n const total = infiniteData[0]?.meta.total || 0;\n const flatList = infiniteData?.map((item) => item.rows)?.flat();\n const rankList = addRankForList(flatList, total);\n\n if (!searchValue) {\n return [...userDataList, ...rankList];\n }\n\n return rankList;\n }, [infiniteData, userDataList, searchValue, addRankForList]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () => parsePagination(data?.meta),\n [parsePagination, data],\n );\n\n useEndReached(sentinelRef, () => {\n if (!isValidating && isMobile) {\n setSize(size + 1);\n }\n });\n\n const onSearchValueChange = (value: string) => {\n setSearchValue(value);\n };\n\n const clearSearchValue = useCallback(() => {\n setSearchValue(\"\");\n }, []);\n\n const onSort = useCallback(\n (sort?: TableSort) => {\n setSort(sort || initialSort);\n },\n [initialSort],\n );\n\n useEffect(() => {\n if (searchValue) {\n setPage(1);\n }\n }, [searchValue]);\n\n useEffect(() => {\n setPage(1);\n }, [state.address]);\n\n useEffect(() => {\n if (dateRange.to && dateRange.from) {\n setPage(1);\n }\n }, [dateRange]);\n\n return {\n pagination,\n dateRange,\n filterDay,\n updateFilterDay,\n filterItems,\n onFilter,\n initialSort,\n onSort,\n dataSource,\n isLoading: isLoading || isValidating,\n searchValue,\n onSearchValueChange,\n clearSearchValue,\n isMobile,\n sentinelRef,\n dataList,\n address: state.address,\n canTrade,\n };\n}\n\nexport function useDataSource(url: string, searchValue: string) {\n const { data, isLoading } = useQuery<TradingResponse>(\n !searchValue ? url : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n // TODO: use public api when api is ready\n const { data: _data, isLoading: _isLoading } =\n usePrivateQuery<TradingResponse>(searchValue ? url : null, {\n formatter: (res) => res,\n revalidateOnFocus: false,\n });\n\n return {\n data: _data || data,\n isLoading: _isLoading || isLoading,\n };\n}\n\nconst useFilter = () => {\n /// default is 90d\n const [filterDay, setFilterDay] = useState<TFilterDays | null>(90);\n\n const [dateRange, setDateRange] = useState<DateRange>(getDateRange(90));\n\n const updateFilterDay = (day: TFilterDays) => {\n setFilterDay(day);\n setDateRange(getDateRange(day));\n };\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n const newDateRange = filter.value;\n setDateRange(newDateRange);\n\n if (newDateRange.from && newDateRange.to) {\n const offsetDay =\n Math.abs(differenceInDays(newDateRange.from, newDateRange.to)) + 1;\n\n const dateRange = getDateRange(offsetDay);\n if (\n formatDateRange(dateRange.from) ===\n formatDateRange(newDateRange.from) &&\n formatDateRange(dateRange.to) === formatDateRange(newDateRange.to)\n ) {\n setFilterDay(offsetDay as any);\n } else {\n setFilterDay(null);\n }\n }\n }\n };\n\n const filterItems = useMemo(() => {\n const dateRangeFilter = {\n type: \"range\",\n name: \"dateRange\",\n value: dateRange,\n max: 90,\n };\n\n return [dateRangeFilter] as any;\n }, [dateRange]);\n\n return {\n filterItems,\n onFilter,\n dateRange,\n filterDay,\n updateFilterDay,\n };\n};\n\nfunction isSameAddress(address1: string, address2: string) {\n return address1.toLowerCase() === address2.toLowerCase();\n}\n\nexport function getRowKey(address: string) {\n return `current-address-${address?.toLowerCase()}`;\n}\n","import { useEffect, useRef, MutableRefObject } from \"react\";\n\n/**\n * Listen for the specified element to scroll to the bottom\n */\nexport function useEndReached(\n sentinelRef: MutableRefObject<HTMLDivElement | null>,\n onEndReached?: () => void\n) {\n const observer = useRef<IntersectionObserver>();\n const cb = useRef(onEndReached);\n\n cb.current = onEndReached;\n\n useEffect(() => {\n const options: IntersectionObserverInit = {\n root: null,\n rootMargin: \"0px\",\n threshold: 0,\n };\n\n const handleObserver = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n cb.current?.();\n }\n });\n };\n\n observer.current = new IntersectionObserver(handleObserver, options);\n\n return () => {\n observer.current?.disconnect();\n };\n }, []);\n\n useEffect(() => {\n if (sentinelRef.current) {\n observer.current?.observe(sentinelRef.current);\n }\n }, [sentinelRef.current]);\n}\n","import { FC, SVGProps } from \"react\";\nimport {\n Box,\n CloseCircleFillIcon,\n cn,\n DataFilter,\n DataTable,\n Flex,\n Input,\n Text,\n} from \"@orderly.network/ui\";\nimport {\n FilterDays,\n getRowKey,\n TradingData,\n TradingListScriptReturn,\n} from \"./tradingList.script\";\nimport { useTradingListColumns } from \"./column\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport type TradingListProps = {\n style?: React.CSSProperties;\n className?: string;\n} & TradingListScriptReturn;\n\nexport const TradingList: FC<TradingListProps> = (props) => {\n const column = useTradingListColumns();\n const { t } = useTranslation();\n\n return (\n <Flex\n direction=\"column\"\n width=\"100%\"\n itemAlign=\"start\"\n intensity={900}\n r=\"2xl\"\n px={4}\n style={props.style}\n className={cn(\"oui-trading-leaderboard-trading-list\", props.className)}\n >\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n mt={2}\n className={cn(\n \"oui-trading-leaderboard-trading-filter\",\n \"oui-border-b oui-border-line\"\n )}\n >\n <Flex gap={3}>\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[53px] oui-border-none\"\n />\n )}\n {FilterDays.map((value) => {\n return (\n <button\n className=\"oui-relative oui-px-2 oui-py-[2px] oui-text-sm\"\n key={value}\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={props.filterDay === value ? \"brand\" : undefined}\n className={\n props.filterDay !== value\n ? \"oui-text-base-contrast-54\"\n : \"\"\n }\n >\n {`${value}D`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-gradient-primary oui-opacity-[.12] oui-absolute oui-left-0 oui-right-0 oui-top-0 oui-bottom-0 oui-rounded\"\n onClick={() => {\n props.updateFilterDay(value as any);\n }}\n ></div>\n </button>\n );\n })}\n </Flex>\n {props.canTrade && (\n <Input\n value={props.searchValue}\n onValueChange={props.onSearchValueChange}\n placeholder={t(\"common.address.search.placeholder\")}\n className={cn(\n \"oui-trading-leaderboard-trading-search-input\",\n \"oui-w-[240px]\"\n )}\n size=\"sm\"\n prefix={\n <Box pl={3} pr={1}>\n <SearchIcon className=\"oui-text-base-contrast-36\" />\n </Box>\n }\n suffix={\n props.searchValue && (\n <Box mr={2}>\n <CloseCircleFillIcon\n size={14}\n className=\"oui-text-base-contrast-36 oui-cursor-pointer =\"\n onClick={props.clearSearchValue}\n />\n </Box>\n )\n }\n autoComplete=\"off\"\n />\n )}\n </Flex>\n\n <DataTable\n loading={props.isLoading}\n id=\"oui-trading-leaderboard-trading-table\"\n columns={column}\n initialSort={props.initialSort}\n onSort={props.onSort}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record: TradingData) => record.key || record.address}\n manualPagination\n manualSorting\n pagination={props.pagination}\n classNames={{\n root: \"!oui-h-[calc(100%_-_53px_-_8px)]\",\n }}\n onRow={(record, index) => {\n return {\n className: cn(\"oui-h-[48px]\"),\n };\n }}\n onCell={(column, record, index) => {\n if (record.key === getRowKey(props.address!)) {\n const isFirst = column.getIsFirstColumn();\n const isLast = column.getIsLastColumn();\n\n return {\n className: cn(\n \"after:oui-absolute after:oui-w-full after:oui-h-[48px]\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \"after:oui-top-0 after:oui-left-0 after:oui-z-[-1]\",\n \"after:oui-border-b after:oui-border-t\",\n isFirst && \"after:oui-border-l after:oui-rounded-l-lg\",\n isLast && \"after:oui-border-r after:oui-rounded-r-lg\"\n ),\n };\n }\n return {};\n }}\n />\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { Text, Column, Box, useScreen } from \"@orderly.network/ui\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport const useTradingListColumns = () => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n return [\n {\n title: t(\"tradingLeaderboard.rank\"),\n dataIndex: \"rank\",\n width: 40,\n render: (value: number) => {\n return (\n <Box width={20} className=\"oui-text-center\">\n {value}\n </Box>\n );\n },\n },\n {\n title: t(\"common.address\"),\n dataIndex: \"address\",\n render: (value: string) => {\n return <Text.formatted rule=\"address\">{value}</Text.formatted>;\n },\n width: 90,\n },\n {\n title: t(\"tradingLeaderboard.tradingVolume\"),\n dataIndex: \"perp_volume\",\n onSort: true,\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2}>\n {value}\n </Text.numeral>\n );\n },\n width: 105,\n },\n {\n title: t(\"common.realizedPnl\"),\n dataIndex: \"realized_pnl\",\n onSort: true,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2} coloring>\n {value}\n </Text.numeral>\n );\n },\n width: 90,\n },\n ] as Column[];\n};\n","import { FC, SVGProps } from \"react\";\nimport { cn, DataFilter, DataTable, Flex, Spinner } from \"@orderly.network/ui\";\nimport { useTradingListColumns } from \"./column\";\nimport {\n getRowKey,\n TradingData,\n TradingListScriptReturn,\n} from \"./tradingList.script\";\n\nexport type TradingListProps = {\n style?: React.CSSProperties;\n className?: string;\n} & TradingListScriptReturn;\n\nexport const MobileTradingList: FC<TradingListProps> = (props) => {\n const column = useTradingListColumns();\n\n return (\n <Flex\n direction=\"column\"\n width=\"100%\"\n itemAlign=\"start\"\n intensity={900}\n r=\"2xl\"\n px={4}\n style={props.style}\n className={cn(\n \"oui-mobile-trading-leaderboard-trading-list\",\n props.className,\n )}\n >\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n className={cn(\"oui-mobile-trading-leaderboard-trading-filter\")}\n >\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[40px] oui-border-none\"\n />\n )}\n </Flex>\n\n <DataTable\n classNames={{\n root: \"oui-pb-4\",\n body: \"oui-text-2xs\",\n scroll: \"oui-overflow-y-hidden oui-h-full\",\n }}\n loading={props.isLoading}\n id=\"oui-trading-leaderboard-trading-table\"\n columns={column}\n initialSort={props.initialSort}\n onSort={props.onSort}\n dataSource={props.dataList}\n generatedRowKey={(record: TradingData) => record.key || record.address}\n manualPagination\n manualSorting\n onRow={(record, index) => {\n return {\n className: cn(\"oui-h-[30px]\"),\n };\n }}\n onCell={(column, record, index) => {\n if (record.key === getRowKey(props.address!)) {\n const isFirst = column.getIsFirstColumn();\n const isLast = column.getIsLastColumn();\n\n return {\n className: cn(\n \"after:oui-absolute after:oui-w-full after:oui-h-[30px]\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \" after:oui-top-0 after:oui-left-0 after:oui-z-[-1]\",\n \"after:oui-border-b after:oui-border-t\",\n isFirst && \"after:oui-border-l after:oui-rounded-l-lg\",\n isLast && \"after:oui-border-r after:oui-rounded-r-lg\",\n ),\n };\n }\n return {};\n }}\n />\n <div\n ref={props.sentinelRef}\n className=\"oui-relative oui-invisible oui-h-[1px] oui-top-[-300px]\"\n />\n {props.isLoading && props.dataList.length > 0 && (\n <Flex itemAlign=\"center\" justify=\"center\" width=\"100%\" height={40}>\n <Spinner size=\"sm\" />\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { FC } from \"react\";\nimport { useTradingListScript } from \"./tradingList.script\";\nimport { TradingList, TradingListProps } from \"./tradingList.ui\";\nimport { MobileTradingList } from \"./tradingList.mobile.ui\";\n\nexport type TradingListWidgetProps = Pick<\n TradingListProps,\n \"style\" | \"className\"\n>;\n\nexport const TradingListWidget: FC<TradingListWidgetProps> = (props) => {\n const state = useTradingListScript();\n if (state.isMobile) {\n return <MobileTradingList {...state} {...props} />;\n }\n return <TradingList {...state} {...props} />;\n};\n","import { useMemo } from \"react\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { Campaign } from \"../../components/provider\";\n\nexport type LeaderboardScriptReturn = ReturnType<typeof useLeaderboardScript>;\n\nexport type LeaderboardScriptOptions = {\n backgroundSrc?: string;\n campaigns?: Campaign[];\n};\n\nfunction isVideoSrc(src?: string) {\n const extension = src?.split(\".\").pop();\n return [\"mp4\", \"webm\", \"avi\", \"ogg\"].includes(extension ?? \"\");\n}\n\nexport function useLeaderboardScript(options: LeaderboardScriptOptions) {\n const { backgroundSrc, campaigns = [] } = options;\n const { isMobile } = useScreen();\n\n const showCampaigns = useMemo(() => campaigns?.length > 0, [campaigns]);\n\n const isVideo = useMemo(() => {\n return isVideoSrc(backgroundSrc);\n }, [backgroundSrc]);\n\n return {\n backgroundSrc,\n isVideo,\n showCampaigns,\n isMobile,\n };\n}\n","import { FC } from \"react\";\nimport { cn, Flex } from \"@orderly.network/ui\";\nimport { TradingListWidget } from \"../../components/tradingList/widget\";\nimport { CampaignsWidget } from \"../../components/campaigns\";\nimport { LeaderboardScriptReturn } from \"./leaderboard.script\";\n\nexport type LeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n} & LeaderboardScriptReturn;\n\nexport const Leaderboard: FC<LeaderboardProps> = (props) => {\n const renderBackground = () => {\n const linearGradient =\n \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n if (props.isVideo) {\n return (\n <div\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\"\n )}\n >\n <div\n style={{\n backgroundImage: linearGradient,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\"\n )}\n />\n <video\n autoPlay\n loop\n muted\n className={cn(\n // rest style\n \"oui-border-none oui-outline-none oui-bg-transparent\",\n \"oui-w-full oui-h-full\",\n // \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-object-cover\",\n \"oui-opacity-50\"\n )}\n >\n <source src={props.backgroundSrc} type=\"video/mp4\" />\n <source src={props.backgroundSrc} type=\"video/webm\" />\n <source src={props.backgroundSrc} type=\"video/ogg\" />\n <source src={props.backgroundSrc} type=\"video/avi\" />\n Your browser does not support the video tag.\n </video>\n </div>\n );\n }\n\n if (props.backgroundSrc) {\n return (\n <div\n style={{\n backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\",\n \"oui-opacity-50\"\n )}\n />\n );\n }\n };\n\n return (\n <div\n style={props.style}\n className={cn(\"oui-h-full oui-mix-blend-screen\", props.className)}\n >\n {renderBackground()}\n <Flex\n direction=\"column\"\n gapY={5}\n height=\"100%\"\n className={cn(\n \"oui-trading-leaderboard oui-relative\",\n \"oui-max-w-[1040px] oui-px-3 oui-mx-auto \"\n )}\n >\n {props.showCampaigns && <CampaignsWidget />}\n <TradingListWidget\n className={cn(\n props.showCampaigns\n ? \"oui-h-[calc(100%_-_288px_-_20px)]\"\n : \"oui-h-full\"\n )}\n />\n </Flex>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { cn, Flex } from \"@orderly.network/ui\";\nimport { CampaignsWidget } from \"../../components/campaigns\";\nimport { TradingListWidget } from \"../../components/tradingList/widget\";\nimport { LeaderboardScriptReturn } from \"./leaderboard.script\";\n\nexport type LeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n} & LeaderboardScriptReturn;\n\nexport const MobileLeaderboardWidget: FC<LeaderboardProps> = (props) => {\n // const renderBackground = () => {\n // const linearGradient =\n // \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n // if (props.isVideo) {\n // return (\n // <div\n // className={cn(\"oui-absolute oui-left-0 oui-top-0\", \"oui-size-full\")}\n // >\n // <div\n // style={{\n // backgroundImage: linearGradient,\n // backgroundSize: \"cover\",\n // backgroundRepeat: \"no-repeat\",\n // }}\n // className={cn(\"oui-absolute oui-left-0 oui-top-0\", \"oui-size-full\")}\n // />\n // <video\n // playsInline\n // // eslint-disable-next-line react/no-unknown-property\n // webkit-playsinline // need to use this prop to ban full screen in iphone\n // autoPlay\n // loop\n // muted\n // className={cn(\n // // rest style\n // \"oui-pointer-events-none oui-border-none oui-bg-transparent oui-outline-none\",\n // \"oui-size-full\",\n // // \"oui-absolute oui-top-0 oui-left-0\",\n // \"oui-object-cover\",\n // \"oui-opacity-50\",\n // )}\n // // ref={(video) => {\n // // if (video) {\n // // video.setAttribute(\"playsinline\", \"true\");\n // // video.setAttribute(\"webkit-playsinline\", \"true\");\n // // }\n // // }}\n // >\n // <source src={props.backgroundSrc} type=\"video/mp4\" />\n // <source src={props.backgroundSrc} type=\"video/webm\" />\n // <source src={props.backgroundSrc} type=\"video/ogg\" />\n // <source src={props.backgroundSrc} type=\"video/avi\" />\n // Your browser does not support the video tag.\n // </video>\n // </div>\n // );\n // }\n\n // if (props.backgroundSrc) {\n // return (\n // <div\n // style={{\n // backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n // backgroundSize: \"cover\",\n // backgroundRepeat: \"no-repeat\",\n // }}\n // className={cn(\n // \"oui-absolute oui-left-0 oui-top-0\",\n // \"oui-size-full\",\n // \"oui-opacity-50\",\n // )}\n // />\n // );\n // }\n // };\n return (\n <div\n style={{\n paddingBottom: \"calc(64px + env(safe-area-inset-bottom))\",\n }}\n className={cn(\n \"oui-relative oui-grid oui-h-[calc(100vh-44px)] oui-gap-1 oui-bg-base-10\",\n \"oui-mix-blend-screen\",\n props.className,\n )}\n >\n {/* {renderBackground()} */}\n <Flex\n direction=\"column\"\n gapY={3}\n height=\"100%\"\n px={3}\n pt={3}\n pb={3}\n className={cn(\n \"oui-trading-leaderboard-mobile oui-custom-scrollbar oui-overflow-y-auto\",\n \"oui-relative oui-h-[calc(100vh_-_64px)]\",\n )}\n >\n {props.showCampaigns && <CampaignsWidget />}\n <TradingListWidget />\n </Flex>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { useLeaderboardScript } from \"./leaderboard.script\";\nimport { Leaderboard, LeaderboardProps } from \"./leaderboard.ui\";\nimport {\n TradingLeaderboardProvider,\n TradingLeaderboardProviderProps,\n} from \"../../components/provider\";\nimport { MobileLeaderboardWidget } from \"./leaderboard.mobile.ui\";\n\nexport type LeaderboardWidgetProps = TradingLeaderboardProviderProps &\n Pick<LeaderboardProps, \"style\" | \"className\">;\n\nexport const LeaderboardWidget: FC<LeaderboardWidgetProps> = (props) => {\n const state = useLeaderboardScript({\n backgroundSrc: props.backgroundSrc,\n campaigns: props.campaigns,\n });\n\n return (\n <TradingLeaderboardProvider campaigns={props.campaigns} href={props.href}>\n {state.isMobile ? (\n <MobileLeaderboardWidget {...state} />\n ) : (\n <Leaderboard\n {...state}\n className={props.className}\n style={props.style}\n />\n )}\n </TradingLeaderboardProvider>\n );\n};\n"]}
package/dist/index.mjs CHANGED
@@ -2,15 +2,13 @@ import { Box, cn, Flex, Text, Select, Button, useScreen, usePagination, DataFilt
2
2
  import { useTranslation } from '@orderly.network/i18n';
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
  import { createContext, useContext, useState, useMemo, useEffect, useCallback, useRef } from 'react';
5
- import bt from 'embla-carousel-react';
5
+ import pt from 'embla-carousel-react';
6
6
  import { useTrack, useAccount, useConfig, useInfiniteQuery, useQuery, usePrivateQuery } from '@orderly.network/hooks';
7
7
  import { AccountStatusEnum, TrackerEventName } from '@orderly.network/types';
8
8
  import { subDays, format, differenceInDays } from 'date-fns';
9
- import { useAppContext } from '@orderly.network/react-app';
10
- import { BottomNavBarWidget } from '@orderly.network/trading';
11
9
 
12
- var J=25,ue=6,Pe=e=>e.currentCampaigns.length===0?null:jsxs(Box,{width:"100%",intensity:900,p:3,className:cn("oui-mobile-trading-leaderboard-campaigns oui-rounded-[20px]",e.className),style:e.style,children:[jsx(lt,{...e}),jsx(Box,{r:"xl",mt:3,ref:e.enableScroll?e.emblaRef:void 0,className:cn("oui-w-full oui-min-w-0 oui-overflow-hidden","oui-select-none oui-cursor-pointer"),children:jsx(Flex,{children:e.currentCampaigns.map(t=>jsx(dt,{campaign:t},t.title))})}),e.enableScroll&&jsx(ut,{style:{width:J*e.currentCampaigns.length},list:e.currentCampaigns,scrollIndex:e.scrollIndex,scrollTo:e.emblaApi?.scrollTo})]}),lt=e=>{let{t}=useTranslation();return jsxs(Flex,{justify:"between",itemAlign:"center",children:[jsx(Text,{size:"base",intensity:80,children:t("tradingLeaderboard.campaigns")}),jsx(Select.options,{size:"xs",value:e.category,onValueChange:e.onCategoryChange,options:e.options,classNames:{trigger:"oui-w-[--radix-select-content-available-width]"}})]})},dt=({campaign:e})=>{let{title:t,description:r,image:a,displayTime:s,learnMoreUrl:o,tradingUrl:l}=e,{t:n}=useTranslation();return jsxs(Box,{intensity:800,r:"xl",className:"oui-flex-[0_0_100%]",children:[jsx("img",{className:"oui-w-full oui-h-[calc((100vw-48px)/2)] oui-rounded-t-xl oui-object-fill",src:a,alt:t}),jsxs(Flex,{itemAlign:"start",justify:"between",direction:"column",height:"100%",p:4,gapY:3,className:"oui-font-semibold",children:[jsxs(Flex,{direction:"column",itemAlign:"start",gapY:1,children:[jsx(Text,{size:"sm",children:t}),jsx(Text,{size:"2xs",intensity:54,children:s}),jsx(Text,{size:"2xs",intensity:36,children:r})]}),jsxs(Flex,{justify:"between",width:"100%",gapX:3,children:[jsx(Button,{variant:"outlined",color:"secondary",fullWidth:true,size:"md",onClick:()=>{window.open(o,"_blank");},children:n("tradingLeaderboard.learnMore")}),jsx(Button,{size:"md",fullWidth:true,onClick:()=>{window.open(l,"_self");},children:n("tradingLeaderboard.tradeNow")})]})]})]})},ut=e=>{let{style:t,scrollIndex:r,list:a}=e;return jsxs(Flex,{mt:3,r:"full",height:ue,className:cn("oui-bg-line oui-mx-auto oui-relative"),style:e.style,children:[a.map((s,o)=>jsx(Box,{width:J,height:ue,onClick:()=>{e.scrollTo?.(o);},r:"full",className:"oui-cursor-pointer"},o)),jsx(Box,{width:J,height:ue,r:"full",className:cn("oui-absolute oui-left-0 oui-top-0","oui-transition-all oui-duration-300","oui-bg-primary"),style:{transform:`translateX(${r*J}px)`}})]})};var X=e=>({from:subDays(new Date,e-1),to:new Date}),F=e=>format(e,"yyyy-MM-dd");function ce(e){let t=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];typeof e=="string"&&(e=new Date(e));let r=e.getUTCFullYear(),a=t[e.getUTCMonth()],s=e.getUTCDate(),o=String(e.getUTCHours()).padStart(2,"0"),l=String(e.getUTCMinutes()).padStart(2,"0");return `${a} ${s}, ${r} ${o}:${l}`}var Re=createContext({}),De=e=>jsx(Re.Provider,{value:{campaigns:e.campaigns,href:e.href,backgroundSrc:e.backgroundSrc},children:e.children}),Ie=()=>useContext(Re);function me(){let{t:e}=useTranslation(),{campaigns:t=[],href:r}=Ie(),[a,s]=useState("ongoing"),{track:o,tracking:l}=useTrack(),n=useMemo(()=>{let c=new Date;return t.reduce((u,p)=>{let L=new Date(p.startTime),h=new Date(p.endTime);return c>=L&&c<=h?u.ongoing.push(p):c>h?u.past.push(p):u.future.push(p),u},{ongoing:[],past:[],future:[]})},[t]),g=useMemo(()=>[{label:e("tradingLeaderboard.ongoing"),value:"ongoing"},{label:e("tradingLeaderboard.future"),value:"future"},{label:e("tradingLeaderboard.past"),value:"past"}].filter(u=>n[u.value].length>0),[n,e]),m=useMemo(()=>n[a].map(u=>{let{startTime:p,endTime:L}=u,h,O=r?.trading;return typeof u.href=="object"?(h=u.href.learnMore,O=u.href.trading):h=u.href,{...u,displayTime:`${ce(p)} - ${ce(L)} UTC`,learnMoreUrl:h,tradingUrl:O}}),[n,a,r]);useEffect(()=>{let u=["ongoing","future","past"].find(p=>n[p].length>0);u&&s(u);},[n]);let D=c=>{s(c);},[ne,se]=useState(0),[le,C]=bt({loop:false,slidesToScroll:"auto"});useEffect(()=>{C?.on("select",()=>{se(C?.selectedScrollSnap());});},[C]);let v=c=>{o(TrackerEventName.leaderboardCampaignClickLearnMore,{campaign_title:c.title}),window.open(c.learnMoreUrl,"_blank");},_=c=>{l(TrackerEventName.leaderboardCampaignClickTradeNow,{campaign_title:c.title}),window.open(c.tradingUrl,"_self");};return {options:g,currentCampaigns:m,category:a,onCategoryChange:D,tradingUrl:r?.trading,emblaRef:le,emblaApi:C,scrollIndex:ne,enableScroll:m?.length>1,onLearnMore:v,onTradeNow:_}}var pe=e=>e.currentCampaigns.length===0?null:jsxs(Box,{width:"100%",intensity:900,p:5,pr:2,height:288,className:cn("oui-trading-leaderboard-campaigns oui-rounded-[20px]",e.className),style:e.style,children:[jsx(ht,{...e}),jsx(Box,{mt:5,r:"xl",className:cn("oui-overflow-y-auto","oui-custom-scrollbar"),children:jsx(Flex,{gapY:5,height:200,direction:"column",r:"xl",className:"oui-pr-1.5",children:e.currentCampaigns.map(t=>jsx(St,{campaign:t,onLearnMore:e.onLearnMore,onTradeNow:e.onTradeNow},t.title))})})]}),ht=e=>{let{t}=useTranslation();return jsxs(Flex,{justify:"between",itemAlign:"center",pr:3,children:[jsx(Text,{size:"xl",children:t("tradingLeaderboard.campaigns")}),jsx(Select.options,{size:"xs",value:e.category,onValueChange:e.onCategoryChange,options:e.options,classNames:{trigger:"oui-w-[--radix-select-content-available-width]"}})]})},St=({campaign:e,onLearnMore:t,onTradeNow:r})=>{let{title:a,description:s,image:o,displayTime:l}=e,{t:n}=useTranslation();return jsxs(Flex,{intensity:800,r:"xl",width:"100%",children:[jsx("img",{className:"oui-h-[200px] oui-w-[400px] oui-rounded-l-xl oui-object-fill",src:o,alt:a}),jsxs(Flex,{itemAlign:"start",justify:"between",direction:"column",height:"100%",p:5,className:"oui-flex-1 oui-font-semibold",children:[jsxs(Flex,{gap:1,direction:"column",itemAlign:"start",children:[jsx(Text,{size:"xl",children:a}),jsx(Text,{size:"sm",intensity:36,children:s})]}),jsxs(Flex,{justify:"between",width:"100%",children:[jsx(Text,{size:"xs",intensity:54,children:l}),jsxs(Flex,{gap:3,children:[jsx(Button,{variant:"outlined",color:"secondary",size:"md",onClick:()=>{t(e);},children:n("tradingLeaderboard.learnMore")}),jsx(Button,{size:"md",onClick:()=>{r(e);},children:n("tradingLeaderboard.tradeNow")})]})]})]})]})};var B=e=>{let t=me(),{isMobile:r}=useScreen();return r?jsx(Pe,{...t,className:e.className,style:e.style}):jsx(pe,{...t,className:e.className,style:e.style})};function Oe(e,t){let r=useRef(),a=useRef(t);a.current=t,useEffect(()=>{let s={root:null,rootMargin:"0px",threshold:0},o=l=>{l.forEach(n=>{n.isIntersecting&&a.current?.();});};return r.current=new IntersectionObserver(o,s),()=>{r.current?.disconnect();}},[]),useEffect(()=>{e.current&&r.current?.observe(e.current);},[e.current]);}var He=[7,14,30,90];function be(){let[e,t]=useState(""),[r]=useState({sortKey:"perp_volume",sort:"desc"}),[a,s]=useState(r),{state:o}=useAccount(),l=useConfig("brokerId"),{isMobile:n}=useScreen(),g=o.address&&(o.status>=AccountStatusEnum.EnableTrading||o.status===AccountStatusEnum.EnableTradingWithoutConnected),{dateRange:m,filterDay:D,updateFilterDay:ne,filterItems:se,onFilter:le}=Dt(),{page:C,pageSize:v,setPage:_,parsePagination:c}=usePagination({pageSize:100}),u=i=>{let d=new URLSearchParams;if(d.set("page",i.page.toString()),d.set("size",i.pageSize.toString()),d.set("aggregateBy","ACCOUNT"),l&&d.set("broker_id",l),i.sort)d.set("sort",i.sort);else if(i.sort!==null&&a){let b=a.sort==="asc"?"ascending":"descending";d.set("sort",`${b}_${a.sortKey}`);}return m.from&&d.set("start_date",F(m.from)),m.to&&d.set("end_date",F(m.to)),i.address&&d.set("address",i.address),i.address?`/v1/volume/broker/daily?${d.toString()}`:`/v1/broker/leaderboard/daily?${d.toString()}`},{data:p,isLoading:L}=Rt(u({page:C,pageSize:v,address:e}),e),{data:h,size:O,setSize:et,isValidating:Le}=useInfiniteQuery((i,d)=>d&&!d.rows?.length||!n?null:u({page:i+1,pageSize:v,address:e}),{initialSize:1,formatter:i=>i,revalidateOnFocus:false}),{data:we}=useQuery(o.address?u({page:1,pageSize:100,sort:`descending_${a?.sortKey||"perp_volume"}`}):null,{formatter:i=>i,revalidateOnFocus:false}),{data:de=[]}=usePrivateQuery(g?u({page:1,pageSize:1,address:o.address,sort:null}):null,{revalidateOnFocus:false}),K=useCallback(i=>{let d=we?.rows.findIndex(b=>It(b.address,i));return d!==-1?d+1:"100+"},[we]),G=useMemo(()=>!g||L?[]:de.length?de?.map(i=>({...i,rank:K(i.address),key:M(i.address)})):[{key:M(o.address),address:o.address,rank:"-"}],[g,o.address,de,L,K]),Y=useCallback((i,d)=>i?.map((b,A)=>{let H=A+1;return e?H=K(b.address):a?.sort==="asc"?H=d-(C-1)*v-A:a?.sort==="desc"&&(H=(C-1)*v+A+1),{...b,rank:H}}),[C,v,a,e,K]),tt=useMemo(()=>{let i=p?.rows||[],d=p?.meta.total||0,b=Y(i,d);return C===1&&!e?[...G,...b]:b},[p,C,G,e,Y]),rt=useMemo(()=>{if(!h?.length)return [];let i=h[0]?.meta.total||0,d=h?.map(A=>A.rows)?.flat(),b=Y(d,i);return e?b:[...G,...b]},[h,G,e,Y]),Fe=useRef(null),at=useMemo(()=>c(p?.meta),[c,p]);Oe(Fe,()=>{!Le&&n&&et(O+1);});let ot=i=>{t(i);},it=useCallback(()=>{t("");},[]),nt=useCallback(i=>{s(i||r);},[r]);return useEffect(()=>{e&&_(1);},[e]),useEffect(()=>{_(1);},[o.address]),useEffect(()=>{m.to&&m.from&&_(1);},[m]),{pagination:at,dateRange:m,filterDay:D,updateFilterDay:ne,filterItems:se,onFilter:le,initialSort:r,onSort:nt,dataSource:tt,isLoading:L||Le,searchValue:e,onSearchValueChange:ot,clearSearchValue:it,isMobile:n,sentinelRef:Fe,dataList:rt,address:o.address,canTrade:g}}function Rt(e,t){let{data:r,isLoading:a}=useQuery(t?null:e,{formatter:l=>l,revalidateOnFocus:false}),{data:s,isLoading:o}=usePrivateQuery(t?e:null,{formatter:l=>l,revalidateOnFocus:false});return {data:s||r,isLoading:o||a}}var Dt=()=>{let[e,t]=useState(90),[r,a]=useState(X(90)),s=n=>{t(n),a(X(n));},o=n=>{if(n.name==="dateRange"){let g=n.value;if(a(g),g.from&&g.to){let m=Math.abs(differenceInDays(g.from,g.to))+1,D=X(m);F(D.from)===F(g.from)&&F(D.to)===F(g.to)?t(m):t(null);}}};return {filterItems:useMemo(()=>[{type:"range",name:"dateRange",value:r,max:90}],[r]),onFilter:o,dateRange:r,filterDay:e,updateFilterDay:s}};function It(e,t){return e.toLowerCase()===t.toLowerCase()}function M(e){return `current-address-${e?.toLowerCase()}`}var te=()=>{let{t:e}=useTranslation(),{isMobile:t}=useScreen();return [{title:e("tradingLeaderboard.rank"),dataIndex:"rank",width:40,render:r=>jsx(Box,{width:20,className:"oui-text-center",children:r})},{title:e("common.address"),dataIndex:"address",render:r=>jsx(Text.formatted,{rule:"address",children:r}),width:90},{title:e("tradingLeaderboard.tradingVolume"),dataIndex:"perp_volume",onSort:true,render:r=>r?jsx(Text.numeral,{prefix:"$",rule:"price",dp:2,children:r}):"-",width:105},{title:e("common.realizedPnl"),dataIndex:"realized_pnl",onSort:true,align:t?"right":"left",render:r=>r?jsx(Text.numeral,{prefix:"$",rule:"price",dp:2,coloring:true,children:r}):"-",width:90}]};var Ce=e=>{let t=te(),{t:r}=useTranslation();return jsxs(Flex,{direction:"column",width:"100%",itemAlign:"start",intensity:900,r:"2xl",px:4,style:e.style,className:cn("oui-trading-leaderboard-trading-list",e.className),children:[jsxs(Flex,{width:"100%",justify:"between",itemAlign:"center",mt:2,className:cn("oui-trading-leaderboard-trading-filter","oui-border-b oui-border-line"),children:[jsxs(Flex,{gap:3,children:[e.filterItems.length>0&&jsx(DataFilter,{items:e.filterItems,onFilter:a=>{e.onFilter(a);},className:"oui-h-[53px] oui-border-none"}),He.map(a=>jsxs("button",{className:"oui-relative oui-px-2 oui-py-[2px] oui-text-sm",children:[jsx("div",{className:"oui-z-10",children:jsx(Text.gradient,{color:e.filterDay===a?"brand":void 0,className:e.filterDay!==a?"oui-text-base-contrast-54":"",children:`${a}D`})}),jsx("div",{className:"oui-gradient-primary oui-opacity-[.12] oui-absolute oui-left-0 oui-right-0 oui-top-0 oui-bottom-0 oui-rounded",onClick:()=>{e.updateFilterDay(a);}})]},a))]}),e.canTrade&&jsx(Input,{value:e.searchValue,onValueChange:e.onSearchValueChange,placeholder:r("common.address.search.placeholder"),className:cn("oui-trading-leaderboard-trading-search-input","oui-w-[240px]"),size:"sm",prefix:jsx(Box,{pl:3,pr:1,children:jsx(Ut,{className:"oui-text-base-contrast-36"})}),suffix:e.searchValue&&jsx(Box,{mr:2,children:jsx(CloseCircleFillIcon,{size:14,className:"oui-text-base-contrast-36 oui-cursor-pointer =",onClick:e.clearSearchValue})}),autoComplete:"off"})]}),jsx(DataTable,{loading:e.isLoading,id:"oui-trading-leaderboard-trading-table",columns:t,initialSort:e.initialSort,onSort:e.onSort,bordered:true,dataSource:e.dataSource,generatedRowKey:a=>a.key||a.address,manualPagination:true,manualSorting:true,pagination:e.pagination,classNames:{root:"!oui-h-[calc(100%_-_53px_-_8px)]"},onRow:(a,s)=>({className:cn("oui-h-[48px]")}),onCell:(a,s,o)=>{if(s.key===M(e.address)){let l=a.getIsFirstColumn(),n=a.getIsLastColumn();return {className:cn("after:oui-absolute after:oui-w-full after:oui-h-[48px]","after:oui-border-[rgb(var(--oui-gradient-brand-start))]","after:oui-top-0 after:oui-left-0 after:oui-z-[-1]","after:oui-border-b after:oui-border-t",l&&"after:oui-border-l after:oui-rounded-l-lg",n&&"after:oui-border-r after:oui-rounded-r-lg")}}return {}}})]})},Ut=e=>jsx("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"currentColor",xmlns:"http://www.w3.org/2000/svg",...e,children:jsx("path",{d:"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7"})});var Je=e=>{let t=te();return jsxs(Flex,{direction:"column",width:"100%",itemAlign:"start",intensity:900,r:"2xl",px:4,style:e.style,className:cn("oui-mobile-trading-leaderboard-trading-list",e.className),children:[jsx(Flex,{width:"100%",justify:"between",itemAlign:"center",className:cn("oui-mobile-trading-leaderboard-trading-filter"),children:e.filterItems.length>0&&jsx(DataFilter,{items:e.filterItems,onFilter:r=>{e.onFilter(r);},className:"oui-h-[40px] oui-border-none"})}),jsx(DataTable,{classNames:{root:"oui-pb-4",body:"oui-text-2xs",scroll:"oui-overflow-y-hidden oui-h-full"},loading:e.isLoading,id:"oui-trading-leaderboard-trading-table",columns:t,initialSort:e.initialSort,onSort:e.onSort,dataSource:e.dataList,generatedRowKey:r=>r.key||r.address,manualPagination:true,manualSorting:true,onRow:(r,a)=>({className:cn("oui-h-[30px]")}),onCell:(r,a,s)=>{if(a.key===M(e.address)){let o=r.getIsFirstColumn(),l=r.getIsLastColumn();return {className:cn("after:oui-absolute after:oui-w-full after:oui-h-[30px]","after:oui-border-[rgb(var(--oui-gradient-brand-start))]"," after:oui-top-0 after:oui-left-0 after:oui-z-[-1]","after:oui-border-b after:oui-border-t",o&&"after:oui-border-l after:oui-rounded-l-lg",l&&"after:oui-border-r after:oui-rounded-r-lg")}}return {}}}),jsx("div",{ref:e.sentinelRef,className:"oui-relative oui-invisible oui-h-[1px] oui-top-[-300px]"}),e.isLoading&&e.dataList.length>0&&jsx(Flex,{itemAlign:"center",justify:"center",width:"100%",height:40,children:jsx(Spinner,{size:"sm"})})]})};var U=e=>{let t=be();return t.isMobile?jsx(Je,{...t,...e}):jsx(Ce,{...t,...e})};function Qt(e){let t=e?.split(".").pop();return ["mp4","webm","avi","ogg"].includes(t??"")}function Se(e){let{backgroundSrc:t,campaigns:r=[]}=e,{isMobile:a}=useScreen(),{state:s}=useAccount(),{wrongNetwork:o,disabledConnect:l}=useAppContext(),n=useMemo(()=>r?.length>0,[r]),g=!o&&!l&&(s.status>=AccountStatusEnum.EnableTrading||s.status===AccountStatusEnum.EnableTradingWithoutConnected),m=useMemo(()=>Qt(t),[t]);return {backgroundSrc:t,isVideo:m,showCampaigns:n,isMobile:a,canTrading:g}}var Te=e=>{let t=()=>{let r="linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)";if(e.isVideo)return jsxs("div",{className:cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full"),children:[jsx("div",{style:{backgroundImage:r,backgroundSize:"cover",backgroundRepeat:"no-repeat"},className:cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full")}),jsxs("video",{autoPlay:true,loop:true,muted:true,className:cn("oui-border-none oui-outline-none oui-bg-transparent","oui-w-full oui-h-full","oui-object-cover","oui-opacity-50"),children:[jsx("source",{src:e.backgroundSrc,type:"video/mp4"}),jsx("source",{src:e.backgroundSrc,type:"video/webm"}),jsx("source",{src:e.backgroundSrc,type:"video/ogg"}),jsx("source",{src:e.backgroundSrc,type:"video/avi"}),"Your browser does not support the video tag."]})]});if(e.backgroundSrc)return jsx("div",{style:{backgroundImage:`${r}, url(${e.backgroundSrc}) `,backgroundSize:"cover",backgroundRepeat:"no-repeat"},className:cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full","oui-opacity-50")})};return jsxs("div",{style:e.style,className:cn("oui-h-full oui-mix-blend-screen",e.className),children:[t(),jsxs(Flex,{direction:"column",gapY:5,height:"100%",className:cn("oui-trading-leaderboard oui-relative","oui-max-w-[1040px] oui-px-3 oui-mx-auto "),children:[e.showCampaigns&&jsx(B,{}),jsx(U,{className:cn(e.showCampaigns?"oui-h-[calc(100%_-_288px_-_20px)]":"oui-h-full")})]})]})};var Ze=e=>{let t=()=>{let r="linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)";if(e.isVideo)return jsxs("div",{className:cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full"),children:[jsx("div",{style:{backgroundImage:r,backgroundSize:"cover",backgroundRepeat:"no-repeat"},className:cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full")}),jsxs("video",{playsInline:true,"webkit-playsinline":true,autoPlay:true,loop:true,muted:true,className:cn("oui-border-none oui-outline-none oui-bg-transparent oui-pointer-events-none","oui-w-full oui-h-full","oui-object-cover","oui-opacity-50"),children:[jsx("source",{src:e.backgroundSrc,type:"video/mp4"}),jsx("source",{src:e.backgroundSrc,type:"video/webm"}),jsx("source",{src:e.backgroundSrc,type:"video/ogg"}),jsx("source",{src:e.backgroundSrc,type:"video/avi"}),"Your browser does not support the video tag."]})]});if(e.backgroundSrc)return jsx("div",{style:{backgroundImage:`${r}, url(${e.backgroundSrc}) `,backgroundSize:"cover",backgroundRepeat:"no-repeat"},className:cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full","oui-opacity-50")})};return jsxs("div",{style:{paddingBottom:"calc(64px + env(safe-area-inset-bottom))"},className:cn("oui-grid oui-grid-rows-[auto,1fr,auto] oui-h-screen oui-gap-1 oui-relative oui-bg-base-10","oui-relative oui-h-full oui-mix-blend-screen",e.className),children:[t(),jsxs(Flex,{direction:"column",gapY:3,height:"100%",px:3,pt:3,pb:3,className:cn("oui-trading-leaderboard-mobile oui-overflow-y-auto oui-custom-scrollbar","oui-relative oui-h-[calc(100vh_-_64px)]"),children:[e.showCampaigns&&jsx(B,{}),jsx(U,{className:cn(!e.canTrading&&"oui-h-full")}),jsx("div",{className:"oui-fixed oui-left-0 oui-right-0 oui-bottom-0 oui-z-10",children:jsx(BottomNavBarWidget,{})})]})]})};var er=e=>{let t=Se({backgroundSrc:e.backgroundSrc,campaigns:e.campaigns});return jsx(De,{campaigns:e.campaigns,href:e.href,children:t.isMobile?jsx(Ze,{...t}):jsx(Te,{...t,className:e.className,style:e.style})})};
10
+ var H=25,se=6,Ne=e=>e.currentCampaigns.length===0?null:jsxs(Box,{width:"100%",intensity:900,p:3,className:cn("oui-mobile-trading-leaderboard-campaigns oui-rounded-[20px]",e.className),style:e.style,children:[jsx(nt,{...e}),jsx(Box,{r:"xl",mt:3,ref:e.enableScroll?e.emblaRef:void 0,className:cn("oui-w-full oui-min-w-0 oui-overflow-hidden","oui-select-none oui-cursor-pointer"),children:jsx(Flex,{children:e.currentCampaigns.map(t=>jsx(st,{campaign:t},t.title))})}),e.enableScroll&&jsx(lt,{style:{width:H*e.currentCampaigns.length},list:e.currentCampaigns,scrollIndex:e.scrollIndex,scrollTo:e.emblaApi?.scrollTo})]}),nt=e=>{let{t}=useTranslation();return jsxs(Flex,{justify:"between",itemAlign:"center",children:[jsx(Text,{size:"base",intensity:80,children:t("tradingLeaderboard.campaigns")}),jsx(Select.options,{size:"xs",value:e.category,onValueChange:e.onCategoryChange,options:e.options,classNames:{trigger:"oui-w-[--radix-select-content-available-width]"}})]})},st=({campaign:e})=>{let{title:t,description:r,image:a,displayTime:s,learnMoreUrl:o,tradingUrl:d}=e,{t:n}=useTranslation();return jsxs(Box,{intensity:800,r:"xl",className:"oui-flex-[0_0_100%]",children:[jsx("img",{className:"oui-w-full oui-h-[calc((100vw-48px)/2)] oui-rounded-t-xl oui-object-fill",src:a,alt:t}),jsxs(Flex,{itemAlign:"start",justify:"between",direction:"column",height:"100%",p:4,gapY:3,className:"oui-font-semibold",children:[jsxs(Flex,{direction:"column",itemAlign:"start",gapY:1,children:[jsx(Text,{size:"sm",children:t}),jsx(Text,{size:"2xs",intensity:54,children:s}),jsx(Text,{size:"2xs",intensity:36,children:r})]}),jsxs(Flex,{justify:"between",width:"100%",gapX:3,children:[jsx(Button,{variant:"outlined",color:"secondary",fullWidth:true,size:"md",onClick:()=>{window.open(o,"_blank");},children:n("tradingLeaderboard.learnMore")}),jsx(Button,{size:"md",fullWidth:true,onClick:()=>{window.open(d,"_self");},children:n("tradingLeaderboard.tradeNow")})]})]})]})},lt=e=>{let{style:t,scrollIndex:r,list:a}=e;return jsxs(Flex,{mt:3,r:"full",height:se,className:cn("oui-bg-line oui-mx-auto oui-relative"),style:e.style,children:[a.map((s,o)=>jsx(Box,{width:H,height:se,onClick:()=>{e.scrollTo?.(o);},r:"full",className:"oui-cursor-pointer"},o)),jsx(Box,{width:H,height:se,r:"full",className:cn("oui-absolute oui-left-0 oui-top-0","oui-transition-all oui-duration-300","oui-bg-primary"),style:{transform:`translateX(${r*H}px)`}})]})};var J=e=>({from:subDays(new Date,e-1),to:new Date}),v=e=>format(e,"yyyy-MM-dd");function le(e){let t=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];typeof e=="string"&&(e=new Date(e));let r=e.getUTCFullYear(),a=t[e.getUTCMonth()],s=e.getUTCDate(),o=String(e.getUTCHours()).padStart(2,"0"),d=String(e.getUTCMinutes()).padStart(2,"0");return `${a} ${s}, ${r} ${o}:${d}`}var Pe=createContext({}),Re=e=>jsx(Pe.Provider,{value:{campaigns:e.campaigns,href:e.href,backgroundSrc:e.backgroundSrc},children:e.children}),ke=()=>useContext(Pe);function ue(){let{t:e}=useTranslation(),{campaigns:t=[],href:r}=ke(),[a,s]=useState("ongoing"),{track:o,tracking:d}=useTrack(),n=useMemo(()=>{let c=new Date;return t.reduce((u,g)=>{let L=new Date(g.startTime),h=new Date(g.endTime);return c>=L&&c<=h?u.ongoing.push(g):c>h?u.past.push(g):u.future.push(g),u},{ongoing:[],past:[],future:[]})},[t]),p=useMemo(()=>[{label:e("tradingLeaderboard.ongoing"),value:"ongoing"},{label:e("tradingLeaderboard.future"),value:"future"},{label:e("tradingLeaderboard.past"),value:"past"}].filter(u=>n[u.value].length>0),[n,e]),f=useMemo(()=>n[a].map(u=>{let{startTime:g,endTime:L}=u,h,U=r?.trading;return typeof u.href=="object"?(h=u.href.learnMore,U=u.href.trading):h=u.href,{...u,displayTime:`${le(g)} - ${le(L)} UTC`,learnMoreUrl:h,tradingUrl:U}}),[n,a,r]);useEffect(()=>{let u=["ongoing","future","past"].find(g=>n[g].length>0);u&&s(u);},[n]);let R=c=>{s(c);},[ae,oe]=useState(0),[ie,C]=pt({loop:false,slidesToScroll:"auto"});useEffect(()=>{C?.on("select",()=>{oe(C?.selectedScrollSnap());});},[C]);let T=c=>{o(TrackerEventName.leaderboardCampaignClickLearnMore,{campaign_title:c.title}),window.open(c.learnMoreUrl,"_blank");},M=c=>{d(TrackerEventName.leaderboardCampaignClickTradeNow,{campaign_title:c.title}),window.open(c.tradingUrl,"_self");};return {options:p,currentCampaigns:f,category:a,onCategoryChange:R,tradingUrl:r?.trading,emblaRef:ie,emblaApi:C,scrollIndex:ae,enableScroll:f?.length>1,onLearnMore:T,onTradeNow:M}}var ce=e=>e.currentCampaigns.length===0?null:jsxs(Box,{width:"100%",intensity:900,p:5,pr:2,height:288,className:cn("oui-trading-leaderboard-campaigns oui-rounded-[20px]",e.className),style:e.style,children:[jsx(yt,{...e}),jsx(Box,{mt:5,r:"xl",className:cn("oui-overflow-y-auto","oui-custom-scrollbar"),children:jsx(Flex,{gapY:5,height:200,direction:"column",r:"xl",className:"oui-pr-1.5",children:e.currentCampaigns.map(t=>jsx(Ct,{campaign:t,onLearnMore:e.onLearnMore,onTradeNow:e.onTradeNow},t.title))})})]}),yt=e=>{let{t}=useTranslation();return jsxs(Flex,{justify:"between",itemAlign:"center",pr:3,children:[jsx(Text,{size:"xl",children:t("tradingLeaderboard.campaigns")}),jsx(Select.options,{size:"xs",value:e.category,onValueChange:e.onCategoryChange,options:e.options,classNames:{trigger:"oui-w-[--radix-select-content-available-width]"}})]})},Ct=({campaign:e,onLearnMore:t,onTradeNow:r})=>{let{title:a,description:s,image:o,displayTime:d}=e,{t:n}=useTranslation();return jsxs(Flex,{intensity:800,r:"xl",width:"100%",children:[jsx("img",{className:"oui-h-[200px] oui-w-[400px] oui-rounded-l-xl oui-object-fill",src:o,alt:a}),jsxs(Flex,{itemAlign:"start",justify:"between",direction:"column",height:"100%",p:5,className:"oui-flex-1 oui-font-semibold",children:[jsxs(Flex,{gap:1,direction:"column",itemAlign:"start",children:[jsx(Text,{size:"xl",children:a}),jsx(Text,{size:"sm",intensity:36,children:s})]}),jsxs(Flex,{justify:"between",width:"100%",children:[jsx(Text,{size:"xs",intensity:54,children:d}),jsxs(Flex,{gap:3,children:[jsx(Button,{variant:"outlined",color:"secondary",size:"md",onClick:()=>{t(e);},children:n("tradingLeaderboard.learnMore")}),jsx(Button,{size:"md",onClick:()=>{r(e);},children:n("tradingLeaderboard.tradeNow")})]})]})]})]})};var A=e=>{let t=ue(),{isMobile:r}=useScreen();return r?jsx(Ne,{...t,className:e.className,style:e.style}):jsx(ce,{...t,className:e.className,style:e.style})};function Ue(e,t){let r=useRef(),a=useRef(t);a.current=t,useEffect(()=>{let s={root:null,rootMargin:"0px",threshold:0},o=d=>{d.forEach(n=>{n.isIntersecting&&a.current?.();});};return r.current=new IntersectionObserver(o,s),()=>{r.current?.disconnect();}},[]),useEffect(()=>{e.current&&r.current?.observe(e.current);},[e.current]);}var Ge=[7,14,30,90];function me(){let[e,t]=useState(""),[r]=useState({sortKey:"perp_volume",sort:"desc"}),[a,s]=useState(r),{state:o}=useAccount(),d=useConfig("brokerId"),{isMobile:n}=useScreen(),p=o.address&&(o.status>=AccountStatusEnum.EnableTrading||o.status===AccountStatusEnum.EnableTradingWithoutConnected),{dateRange:f,filterDay:R,updateFilterDay:ae,filterItems:oe,onFilter:ie}=Rt(),{page:C,pageSize:T,setPage:M,parsePagination:c}=usePagination({pageSize:100}),u=i=>{let l=new URLSearchParams;if(l.set("page",i.page.toString()),l.set("size",i.pageSize.toString()),l.set("aggregateBy","ACCOUNT"),d&&l.set("broker_id",d),i.sort)l.set("sort",i.sort);else if(i.sort!==null&&a){let b=a.sort==="asc"?"ascending":"descending";l.set("sort",`${b}_${a.sortKey}`);}return f.from&&l.set("start_date",v(f.from)),f.to&&l.set("end_date",v(f.to)),i.address&&l.set("address",i.address),i.address?`/v1/volume/broker/daily?${l.toString()}`:`/v1/broker/leaderboard/daily?${l.toString()}`},{data:g,isLoading:L}=Pt(u({page:C,pageSize:T,address:e}),e),{data:h,size:U,setSize:qe,isValidating:Te}=useInfiniteQuery((i,l)=>l&&!l.rows?.length||!n?null:u({page:i+1,pageSize:T,address:e}),{initialSize:1,formatter:i=>i,revalidateOnFocus:false}),{data:Le}=useQuery(o.address?u({page:1,pageSize:100,sort:`descending_${a?.sortKey||"perp_volume"}`}):null,{formatter:i=>i,revalidateOnFocus:false}),{data:ne=[]}=usePrivateQuery(p?u({page:1,pageSize:1,address:o.address,sort:null}):null,{revalidateOnFocus:false}),E=useCallback(i=>{let l=Le?.rows.findIndex(b=>kt(b.address,i));return l!==-1?l+1:"100+"},[Le]),O=useMemo(()=>!p||L?[]:ne.length?ne?.map(i=>({...i,rank:E(i.address),key:D(i.address)})):[{key:D(o.address),address:o.address,rank:"-"}],[p,o.address,ne,L,E]),K=useCallback((i,l)=>i?.map((b,z)=>{let G=z+1;return e?G=E(b.address):a?.sort==="asc"?G=l-(C-1)*T-z:a?.sort==="desc"&&(G=(C-1)*T+z+1),{...b,rank:G}}),[C,T,a,e,E]),Ze=useMemo(()=>{let i=g?.rows||[],l=g?.meta.total||0,b=K(i,l);return C===1&&!e?[...O,...b]:b},[g,C,O,e,K]),et=useMemo(()=>{if(!h?.length)return [];let i=h[0]?.meta.total||0,l=h?.map(z=>z.rows)?.flat(),b=K(l,i);return e?b:[...O,...b]},[h,O,e,K]),we=useRef(null),tt=useMemo(()=>c(g?.meta),[c,g]);Ue(we,()=>{!Te&&n&&qe(U+1);});let rt=i=>{t(i);},at=useCallback(()=>{t("");},[]),ot=useCallback(i=>{s(i||r);},[r]);return useEffect(()=>{e&&M(1);},[e]),useEffect(()=>{M(1);},[o.address]),useEffect(()=>{f.to&&f.from&&M(1);},[f]),{pagination:tt,dateRange:f,filterDay:R,updateFilterDay:ae,filterItems:oe,onFilter:ie,initialSort:r,onSort:ot,dataSource:Ze,isLoading:L||Te,searchValue:e,onSearchValueChange:rt,clearSearchValue:at,isMobile:n,sentinelRef:we,dataList:et,address:o.address,canTrade:p}}function Pt(e,t){let{data:r,isLoading:a}=useQuery(t?null:e,{formatter:d=>d,revalidateOnFocus:false}),{data:s,isLoading:o}=usePrivateQuery(t?e:null,{formatter:d=>d,revalidateOnFocus:false});return {data:s||r,isLoading:o||a}}var Rt=()=>{let[e,t]=useState(90),[r,a]=useState(J(90)),s=n=>{t(n),a(J(n));},o=n=>{if(n.name==="dateRange"){let p=n.value;if(a(p),p.from&&p.to){let f=Math.abs(differenceInDays(p.from,p.to))+1,R=J(f);v(R.from)===v(p.from)&&v(R.to)===v(p.to)?t(f):t(null);}}};return {filterItems:useMemo(()=>[{type:"range",name:"dateRange",value:r,max:90}],[r]),onFilter:o,dateRange:r,filterDay:e,updateFilterDay:s}};function kt(e,t){return e.toLowerCase()===t.toLowerCase()}function D(e){return `current-address-${e?.toLowerCase()}`}var Z=()=>{let{t:e}=useTranslation(),{isMobile:t}=useScreen();return [{title:e("tradingLeaderboard.rank"),dataIndex:"rank",width:40,render:r=>jsx(Box,{width:20,className:"oui-text-center",children:r})},{title:e("common.address"),dataIndex:"address",render:r=>jsx(Text.formatted,{rule:"address",children:r}),width:90},{title:e("tradingLeaderboard.tradingVolume"),dataIndex:"perp_volume",onSort:true,render:r=>r?jsx(Text.numeral,{prefix:"$",rule:"price",dp:2,children:r}):"-",width:105},{title:e("common.realizedPnl"),dataIndex:"realized_pnl",onSort:true,align:t?"right":"left",render:r=>r?jsx(Text.numeral,{prefix:"$",rule:"price",dp:2,coloring:true,children:r}):"-",width:90}]};var be=e=>{let t=Z(),{t:r}=useTranslation();return jsxs(Flex,{direction:"column",width:"100%",itemAlign:"start",intensity:900,r:"2xl",px:4,style:e.style,className:cn("oui-trading-leaderboard-trading-list",e.className),children:[jsxs(Flex,{width:"100%",justify:"between",itemAlign:"center",mt:2,className:cn("oui-trading-leaderboard-trading-filter","oui-border-b oui-border-line"),children:[jsxs(Flex,{gap:3,children:[e.filterItems.length>0&&jsx(DataFilter,{items:e.filterItems,onFilter:a=>{e.onFilter(a);},className:"oui-h-[53px] oui-border-none"}),Ge.map(a=>jsxs("button",{className:"oui-relative oui-px-2 oui-py-[2px] oui-text-sm",children:[jsx("div",{className:"oui-z-10",children:jsx(Text.gradient,{color:e.filterDay===a?"brand":void 0,className:e.filterDay!==a?"oui-text-base-contrast-54":"",children:`${a}D`})}),jsx("div",{className:"oui-gradient-primary oui-opacity-[.12] oui-absolute oui-left-0 oui-right-0 oui-top-0 oui-bottom-0 oui-rounded",onClick:()=>{e.updateFilterDay(a);}})]},a))]}),e.canTrade&&jsx(Input,{value:e.searchValue,onValueChange:e.onSearchValueChange,placeholder:r("common.address.search.placeholder"),className:cn("oui-trading-leaderboard-trading-search-input","oui-w-[240px]"),size:"sm",prefix:jsx(Box,{pl:3,pr:1,children:jsx($t,{className:"oui-text-base-contrast-36"})}),suffix:e.searchValue&&jsx(Box,{mr:2,children:jsx(CloseCircleFillIcon,{size:14,className:"oui-text-base-contrast-36 oui-cursor-pointer =",onClick:e.clearSearchValue})}),autoComplete:"off"})]}),jsx(DataTable,{loading:e.isLoading,id:"oui-trading-leaderboard-trading-table",columns:t,initialSort:e.initialSort,onSort:e.onSort,bordered:true,dataSource:e.dataSource,generatedRowKey:a=>a.key||a.address,manualPagination:true,manualSorting:true,pagination:e.pagination,classNames:{root:"!oui-h-[calc(100%_-_53px_-_8px)]"},onRow:(a,s)=>({className:cn("oui-h-[48px]")}),onCell:(a,s,o)=>{if(s.key===D(e.address)){let d=a.getIsFirstColumn(),n=a.getIsLastColumn();return {className:cn("after:oui-absolute after:oui-w-full after:oui-h-[48px]","after:oui-border-[rgb(var(--oui-gradient-brand-start))]","after:oui-top-0 after:oui-left-0 after:oui-z-[-1]","after:oui-border-b after:oui-border-t",d&&"after:oui-border-l after:oui-rounded-l-lg",n&&"after:oui-border-r after:oui-rounded-r-lg")}}return {}}})]})},$t=e=>jsx("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"currentColor",xmlns:"http://www.w3.org/2000/svg",...e,children:jsx("path",{d:"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7"})});var He=e=>{let t=Z();return jsxs(Flex,{direction:"column",width:"100%",itemAlign:"start",intensity:900,r:"2xl",px:4,style:e.style,className:cn("oui-mobile-trading-leaderboard-trading-list",e.className),children:[jsx(Flex,{width:"100%",justify:"between",itemAlign:"center",className:cn("oui-mobile-trading-leaderboard-trading-filter"),children:e.filterItems.length>0&&jsx(DataFilter,{items:e.filterItems,onFilter:r=>{e.onFilter(r);},className:"oui-h-[40px] oui-border-none"})}),jsx(DataTable,{classNames:{root:"oui-pb-4",body:"oui-text-2xs",scroll:"oui-overflow-y-hidden oui-h-full"},loading:e.isLoading,id:"oui-trading-leaderboard-trading-table",columns:t,initialSort:e.initialSort,onSort:e.onSort,dataSource:e.dataList,generatedRowKey:r=>r.key||r.address,manualPagination:true,manualSorting:true,onRow:(r,a)=>({className:cn("oui-h-[30px]")}),onCell:(r,a,s)=>{if(a.key===D(e.address)){let o=r.getIsFirstColumn(),d=r.getIsLastColumn();return {className:cn("after:oui-absolute after:oui-w-full after:oui-h-[30px]","after:oui-border-[rgb(var(--oui-gradient-brand-start))]"," after:oui-top-0 after:oui-left-0 after:oui-z-[-1]","after:oui-border-b after:oui-border-t",o&&"after:oui-border-l after:oui-rounded-l-lg",d&&"after:oui-border-r after:oui-rounded-r-lg")}}return {}}}),jsx("div",{ref:e.sentinelRef,className:"oui-relative oui-invisible oui-h-[1px] oui-top-[-300px]"}),e.isLoading&&e.dataList.length>0&&jsx(Flex,{itemAlign:"center",justify:"center",width:"100%",height:40,children:jsx(Spinner,{size:"sm"})})]})};var $=e=>{let t=me();return t.isMobile?jsx(He,{...t,...e}):jsx(be,{...t,...e})};function Yt(e){let t=e?.split(".").pop();return ["mp4","webm","avi","ogg"].includes(t??"")}function ye(e){let{backgroundSrc:t,campaigns:r=[]}=e,{isMobile:a}=useScreen(),s=useMemo(()=>r?.length>0,[r]),o=useMemo(()=>Yt(t),[t]);return {backgroundSrc:t,isVideo:o,showCampaigns:s,isMobile:a}}var Ce=e=>{let t=()=>{let r="linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)";if(e.isVideo)return jsxs("div",{className:cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full"),children:[jsx("div",{style:{backgroundImage:r,backgroundSize:"cover",backgroundRepeat:"no-repeat"},className:cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full")}),jsxs("video",{autoPlay:true,loop:true,muted:true,className:cn("oui-border-none oui-outline-none oui-bg-transparent","oui-w-full oui-h-full","oui-object-cover","oui-opacity-50"),children:[jsx("source",{src:e.backgroundSrc,type:"video/mp4"}),jsx("source",{src:e.backgroundSrc,type:"video/webm"}),jsx("source",{src:e.backgroundSrc,type:"video/ogg"}),jsx("source",{src:e.backgroundSrc,type:"video/avi"}),"Your browser does not support the video tag."]})]});if(e.backgroundSrc)return jsx("div",{style:{backgroundImage:`${r}, url(${e.backgroundSrc}) `,backgroundSize:"cover",backgroundRepeat:"no-repeat"},className:cn("oui-absolute oui-top-0 oui-left-0","oui-w-full oui-h-full","oui-opacity-50")})};return jsxs("div",{style:e.style,className:cn("oui-h-full oui-mix-blend-screen",e.className),children:[t(),jsxs(Flex,{direction:"column",gapY:5,height:"100%",className:cn("oui-trading-leaderboard oui-relative","oui-max-w-[1040px] oui-px-3 oui-mx-auto "),children:[e.showCampaigns&&jsx(A,{}),jsx($,{className:cn(e.showCampaigns?"oui-h-[calc(100%_-_288px_-_20px)]":"oui-h-full")})]})]})};var Xe=e=>jsx("div",{style:{paddingBottom:"calc(64px + env(safe-area-inset-bottom))"},className:cn("oui-relative oui-grid oui-h-[calc(100vh-44px)] oui-gap-1 oui-bg-base-10","oui-mix-blend-screen",e.className),children:jsxs(Flex,{direction:"column",gapY:3,height:"100%",px:3,pt:3,pb:3,className:cn("oui-trading-leaderboard-mobile oui-custom-scrollbar oui-overflow-y-auto","oui-relative oui-h-[calc(100vh_-_64px)]"),children:[e.showCampaigns&&jsx(A,{}),jsx($,{})]})});var Qt=e=>{let t=ye({backgroundSrc:e.backgroundSrc,campaigns:e.campaigns});return jsx(Re,{campaigns:e.campaigns,href:e.href,children:t.isMobile?jsx(Xe,{...t}):jsx(Ce,{...t,className:e.className,style:e.style})})};
13
11
 
14
- export { pe as Campaigns, B as CampaignsWidget, Te as Leaderboard, er as LeaderboardWidget, Re as TradingLeaderboardContext, De as TradingLeaderboardProvider, Ce as TradingList, U as TradingListWidget, me as useCampaignsScript, Se as useLeaderboardScript, Ie as useTradingLeaderboardContext, be as useTradingListScript };
12
+ export { ce as Campaigns, A as CampaignsWidget, Ce as Leaderboard, Qt as LeaderboardWidget, Pe as TradingLeaderboardContext, Re as TradingLeaderboardProvider, be as TradingList, $ as TradingListWidget, ue as useCampaignsScript, ye as useLeaderboardScript, ke as useTradingLeaderboardContext, me as useTradingListScript };
15
13
  //# sourceMappingURL=out.js.map
16
14
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/campaigns/widget.tsx","../src/components/campaigns/campaigns.mobile.ui.tsx","../src/components/campaigns/campaigns.script.ts","../src/utils.ts","../src/components/provider/index.tsx","../src/components/campaigns/campaigns.ui.tsx","../src/components/tradingList/tradingList.script.ts","../src/hooks/useEndReached.ts","../src/components/tradingList/tradingList.ui.tsx","../src/components/tradingList/column.tsx","../src/components/tradingList/tradingList.mobile.ui.tsx","../src/components/tradingList/widget.tsx","../src/page/leaderboard/leaderboard.script.ts","../src/page/leaderboard/leaderboard.ui.tsx","../src/page/leaderboard/leaderboard.mobile.ui.tsx","../src/page/leaderboard/widget.tsx"],"names":["useScreen","cn","Box","Text","Flex","Button","Select","useTranslation","jsx","jsxs","scrollIndicatorWidth","scrollIndicatorHeight","MobileCampaigns","props","Header","campaign","CampaignItem","ScrollIndicator","title","description","image","displayTime","learnMoreUrl","tradingUrl","t","style","scrollIndex","list","item","index","useEffect","useMemo","useState","useEmblaCarousel","useTrack","TrackerEventName","format","subDays","getDateRange","offsetDay","formatDateRange","date","formatCampaignDate","monthNames","year","month","day","hours","minutes","createContext","useContext","TradingLeaderboardContext","TradingLeaderboardProvider","useTradingLeaderboardContext","useCampaignsScript","campaigns","href","category","setCategory","track","tracking","filterCampaigns","now","acc","startTime","endTime","options","currentCampaigns","firstAvailableCategory","onCategoryChange","value","setScrollIndex","emblaRef","emblaApi","onLearnMore","onTradeNow","Campaigns","CampaignsWidget","state","isMobile","useCallback","useRef","useAccount","useConfig","useInfiniteQuery","useQuery","usePrivateQuery","usePagination","differenceInDays","AccountStatusEnum","useEndReached","sentinelRef","onEndReached","observer","cb","handleObserver","entries","entry","FilterDays","useTradingListScript","searchValue","setSearchValue","initialSort","sort","setSort","brokerId","canTrade","dateRange","filterDay","updateFilterDay","filterItems","onFilter","useFilter","page","pageSize","setPage","parsePagination","getUrl","args","searchParams","prefix","data","isLoading","useDataSource","infiniteData","size","setSize","isValidating","pageIndex","previousPageData","res","top100Data","userDataRes","getAddressRank","address","isSameAddress","userDataList","getRowKey","addRankForList","total","rank","dataSource","rankList","dataList","flatList","pagination","onSearchValueChange","clearSearchValue","onSort","url","_data","_isLoading","setFilterDay","setDateRange","filter","newDateRange","address1","address2","CloseCircleFillIcon","DataFilter","DataTable","Input","useTradingListColumns","TradingList","column","SearchIcon","record","isFirst","isLast","Spinner","MobileTradingList","TradingListWidget","useAppContext","isVideoSrc","src","extension","useLeaderboardScript","backgroundSrc","wrongNetwork","disabledConnect","showCampaigns","canTrading","isVideo","Leaderboard","renderBackground","linearGradient","BottomNavBarWidget","MobileLeaderboardWidget","LeaderboardWidget"],"mappings":"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","sourcesContent":["import { FC } from \"react\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { MobileCampaigns } from \"./campaigns.mobile.ui\";\nimport { useCampaignsScript } from \"./campaigns.script\";\nimport { Campaigns } from \"./campaigns.ui\";\n\nexport type CampaignsWidgetProps = {\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport const CampaignsWidget: FC<CampaignsWidgetProps> = (props) => {\n const state = useCampaignsScript();\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return (\n <MobileCampaigns\n {...state}\n className={props.className}\n style={props.style}\n />\n );\n }\n return (\n <Campaigns {...state} className={props.className} style={props.style} />\n );\n};\n","import { FC } from \"react\";\nimport { cn, Box, Text, Flex, Button, Select } from \"@orderly.network/ui\";\nimport { CampaignsScriptReturn, CurrentCampaigns } from \"./campaigns.script\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport type CampaignsProps = {\n className?: string;\n style?: React.CSSProperties;\n} & CampaignsScriptReturn;\n\nconst scrollIndicatorWidth = 25;\nconst scrollIndicatorHeight = 6;\n\nexport const MobileCampaigns: FC<CampaignsProps> = (props) => {\n if (props.currentCampaigns.length === 0) {\n return null;\n }\n\n return (\n <Box\n width=\"100%\"\n intensity={900}\n p={3}\n className={cn(\n \"oui-mobile-trading-leaderboard-campaigns oui-rounded-[20px]\",\n props.className\n )}\n style={props.style}\n >\n <Header {...props} />\n <Box\n r=\"xl\"\n mt={3}\n ref={props.enableScroll ? props.emblaRef : undefined}\n className={cn(\n \"oui-w-full oui-min-w-0 oui-overflow-hidden\",\n \"oui-select-none oui-cursor-pointer\"\n )}\n >\n <Flex>\n {props.currentCampaigns.map((campaign) => {\n return <CampaignItem key={campaign.title} campaign={campaign} />;\n })}\n </Flex>\n </Box>\n {props.enableScroll && (\n <ScrollIndicator\n style={{\n width: scrollIndicatorWidth * props.currentCampaigns.length,\n }}\n list={props.currentCampaigns}\n scrollIndex={props.scrollIndex}\n scrollTo={props.emblaApi?.scrollTo}\n />\n )}\n </Box>\n );\n};\n\nconst Header: FC<CampaignsScriptReturn> = (props) => {\n const { t } = useTranslation();\n\n return (\n <Flex justify=\"between\" itemAlign=\"center\">\n <Text size=\"base\" intensity={80}>\n {t(\"tradingLeaderboard.campaigns\")}\n </Text>\n <Select.options\n size={\"xs\"}\n value={props.category}\n onValueChange={props.onCategoryChange}\n options={props.options}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n />\n </Flex>\n );\n};\n\nconst CampaignItem: FC<{ campaign: CurrentCampaigns }> = ({ campaign }) => {\n const { title, description, image, displayTime, learnMoreUrl, tradingUrl } =\n campaign;\n const { t } = useTranslation();\n\n return (\n <Box intensity={800} r=\"xl\" className=\"oui-flex-[0_0_100%]\">\n <img\n className=\"oui-w-full oui-h-[calc((100vw-48px)/2)] oui-rounded-t-xl oui-object-fill\"\n src={image}\n alt={title}\n />\n\n <Flex\n itemAlign=\"start\"\n justify=\"between\"\n direction=\"column\"\n height=\"100%\"\n p={4}\n gapY={3}\n className=\"oui-font-semibold\"\n >\n <Flex direction=\"column\" itemAlign=\"start\" gapY={1}>\n <Text size=\"sm\">{title}</Text>\n <Text size=\"2xs\" intensity={54}>\n {displayTime}\n </Text>\n <Text size=\"2xs\" intensity={36}>\n {description}\n </Text>\n </Flex>\n <Flex justify=\"between\" width=\"100%\" gapX={3}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n fullWidth\n size=\"md\"\n onClick={() => {\n window.open(learnMoreUrl, \"_blank\");\n }}\n >\n {t(\"tradingLeaderboard.learnMore\")}\n </Button>\n <Button\n size=\"md\"\n fullWidth\n onClick={() => {\n window.open(tradingUrl, \"_self\");\n }}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n </Flex>\n </Flex>\n </Box>\n );\n};\n\ninterface ScrollIndicatorProps {\n style?: React.CSSProperties;\n list: CurrentCampaigns[];\n scrollIndex: number;\n scrollTo?: (index: number) => void;\n}\n\nconst ScrollIndicator: React.FC<ScrollIndicatorProps> = (props) => {\n const { style, scrollIndex, list } = props;\n\n return (\n <Flex\n mt={3}\n r=\"full\"\n height={scrollIndicatorHeight}\n className={cn(\"oui-bg-line oui-mx-auto oui-relative\")}\n style={props.style}\n >\n {list.map((item, index) => {\n return (\n <Box\n key={index}\n width={scrollIndicatorWidth}\n height={scrollIndicatorHeight}\n onClick={() => {\n props.scrollTo?.(index);\n }}\n r=\"full\"\n className=\"oui-cursor-pointer\"\n />\n );\n })}\n <Box\n width={scrollIndicatorWidth}\n height={scrollIndicatorHeight}\n r=\"full\"\n className={cn(\n \"oui-absolute oui-left-0 oui-top-0\",\n \"oui-transition-all oui-duration-300\",\n \"oui-bg-primary\"\n )}\n style={{\n transform: `translateX(${scrollIndex * scrollIndicatorWidth}px)`,\n }}\n />\n </Flex>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport useEmblaCarousel from \"embla-carousel-react\";\nimport { useTrack } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { TrackerEventName } from \"@orderly.network/types\";\nimport { formatCampaignDate } from \"../../utils\";\nimport { useTradingLeaderboardContext, Campaign } from \"../provider\";\n\nexport type CampaignsScriptReturn = ReturnType<typeof useCampaignsScript>;\n\n// Define the type for our categorized campaigns\ntype CategorizedCampaigns = {\n ongoing: Campaign[];\n past: Campaign[];\n future: Campaign[];\n};\n\nexport type CurrentCampaigns = Campaign & {\n displayTime: string;\n learnMoreUrl: string;\n tradingUrl: string;\n};\n\nexport type TEmblaApi = {\n scrollTo?: (index: number) => void;\n};\n\ntype CategoryKey = keyof CategorizedCampaigns;\n\nexport function useCampaignsScript() {\n const { t } = useTranslation();\n const { campaigns = [], href } = useTradingLeaderboardContext();\n const [category, setCategory] = useState<CategoryKey>(\"ongoing\");\n\n const { track, tracking } = useTrack();\n\n const filterCampaigns = useMemo(() => {\n const now = new Date();\n\n return campaigns.reduce<CategorizedCampaigns>(\n (acc, campaign) => {\n const startTime = new Date(campaign.startTime);\n const endTime = new Date(campaign.endTime);\n\n if (now >= startTime && now <= endTime) {\n acc.ongoing.push(campaign);\n } else if (now > endTime) {\n acc.past.push(campaign);\n } else {\n acc.future.push(campaign);\n }\n\n return acc;\n },\n { ongoing: [], past: [], future: [] },\n );\n }, [campaigns]);\n\n const options = useMemo(() => {\n const opts: { label: string; value: CategoryKey }[] = [\n { label: t(\"tradingLeaderboard.ongoing\"), value: \"ongoing\" },\n { label: t(\"tradingLeaderboard.future\"), value: \"future\" },\n { label: t(\"tradingLeaderboard.past\"), value: \"past\" },\n ];\n\n // Filter out categories with no campaigns and map to the required format\n return opts.filter((item) => filterCampaigns[item.value].length > 0);\n }, [filterCampaigns, t]);\n\n const currentCampaigns = useMemo(() => {\n const list = filterCampaigns[category];\n return list.map((campaign) => {\n const { startTime, endTime } = campaign;\n\n let learnMoreUrl: string;\n let tradingUrl = href?.trading!;\n\n if (typeof campaign.href === \"object\") {\n learnMoreUrl = campaign.href.learnMore;\n tradingUrl = campaign.href.trading;\n } else {\n learnMoreUrl = campaign.href;\n }\n\n return {\n ...campaign,\n displayTime: `${formatCampaignDate(startTime)} - ${formatCampaignDate(\n endTime,\n )} UTC`,\n learnMoreUrl,\n tradingUrl,\n };\n });\n }, [filterCampaigns, category, href]);\n\n useEffect(() => {\n // Find the first non-empty category\n const categoryKeys: CategoryKey[] = [\"ongoing\", \"future\", \"past\"];\n\n const firstAvailableCategory = categoryKeys.find(\n (item) => filterCampaigns[item].length > 0,\n );\n\n if (firstAvailableCategory) {\n setCategory(firstAvailableCategory);\n }\n }, [filterCampaigns]);\n\n const onCategoryChange = (value: string) => {\n setCategory(value as CategoryKey);\n };\n const [scrollIndex, setScrollIndex] = useState(0);\n\n const [emblaRef, emblaApi] = useEmblaCarousel({\n loop: false,\n slidesToScroll: \"auto\",\n });\n\n useEffect(() => {\n emblaApi?.on(\"select\", () => {\n setScrollIndex(emblaApi?.selectedScrollSnap());\n });\n }, [emblaApi]);\n\n const onLearnMore = (campaign: CurrentCampaigns) => {\n track(TrackerEventName.leaderboardCampaignClickLearnMore, {\n campaign_title: campaign.title,\n });\n window.open(campaign.learnMoreUrl, \"_blank\");\n };\n\n const onTradeNow = (campaign: CurrentCampaigns) => {\n tracking(TrackerEventName.leaderboardCampaignClickTradeNow, {\n campaign_title: campaign.title,\n });\n window.open(campaign.tradingUrl, \"_self\");\n };\n\n return {\n options,\n currentCampaigns,\n category,\n onCategoryChange,\n tradingUrl: href?.trading,\n emblaRef,\n emblaApi: emblaApi as TEmblaApi,\n scrollIndex,\n enableScroll: currentCampaigns?.length > 1,\n onLearnMore,\n onTradeNow,\n };\n}\n","import { format, subDays } from \"date-fns\";\n\nexport const getDateRange = (offsetDay: number) => {\n return {\n from: subDays(new Date(), offsetDay - 1)!,\n to: new Date()!,\n };\n};\n\n/**\n * Format a date to \"yyyy-MM-dd\" format (e.g., \"2025-03-10\")\n * @param date The date to format\n * @returns Formatted date string\n */\nexport const formatDateRange = (date: Date): string => {\n return format(date, \"yyyy-MM-dd\");\n};\n\nexport function formatCampaignDate(date: Date | string): string {\n const monthNames = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ];\n if (typeof date === \"string\") {\n date = new Date(date);\n }\n const year = date.getUTCFullYear();\n const month = monthNames[date.getUTCMonth()];\n const day = date.getUTCDate();\n const hours = String(date.getUTCHours()).padStart(2, \"0\");\n const minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n return `${month} ${day}, ${year} ${hours}:${minutes}`;\n}\n","import { createContext, PropsWithChildren, useContext } from \"react\";\n\nexport type Campaign = {\n title: string;\n description: string;\n image: string;\n startTime: Date | string;\n endTime: Date | string;\n href:\n | string\n | {\n /** learn more url */\n learnMore: string;\n /** trading url, if provided, will override default trading now button url */\n trading: string;\n };\n};\n\n/**\n * Trading leaderboard provider state\n */\nexport type TradingLeaderboardState = {\n /** campaigns config, if not provided, will not show campaigns section */\n campaigns?: Campaign[];\n /** background src, it can be a image resource or video resource */\n backgroundSrc?: string;\n href?: {\n /** default trading now button url */\n trading: string;\n };\n};\n\n/**\n * Trading leaderboard context\n */\nexport const TradingLeaderboardContext = createContext<TradingLeaderboardState>(\n {} as TradingLeaderboardState\n);\n\nexport type TradingLeaderboardProviderProps =\n PropsWithChildren<TradingLeaderboardState>;\n\nexport const TradingLeaderboardProvider = (\n props: TradingLeaderboardProviderProps\n) => {\n return (\n <TradingLeaderboardContext.Provider\n value={{\n campaigns: props.campaigns,\n href: props.href,\n backgroundSrc: props.backgroundSrc,\n }}\n >\n {props.children}\n </TradingLeaderboardContext.Provider>\n );\n};\n\nexport const useTradingLeaderboardContext = () => {\n return useContext(TradingLeaderboardContext);\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { cn, Box, Text, Flex, Button, Select } from \"@orderly.network/ui\";\nimport { CampaignsScriptReturn, CurrentCampaigns } from \"./campaigns.script\";\n\nexport type CampaignsProps = {\n className?: string;\n style?: React.CSSProperties;\n} & CampaignsScriptReturn;\n\nexport const Campaigns: FC<CampaignsProps> = (props) => {\n if (props.currentCampaigns.length === 0) {\n return null;\n }\n\n return (\n <Box\n width=\"100%\"\n intensity={900}\n p={5}\n pr={2}\n height={288}\n className={cn(\n \"oui-trading-leaderboard-campaigns oui-rounded-[20px]\",\n props.className,\n )}\n style={props.style}\n >\n <Header {...props} />\n <Box\n mt={5}\n r=\"xl\"\n className={cn(\"oui-overflow-y-auto\", \"oui-custom-scrollbar\")}\n >\n <Flex\n gapY={5}\n height={200}\n direction=\"column\"\n r=\"xl\"\n className=\"oui-pr-1.5\"\n >\n {props.currentCampaigns.map((campaign) => {\n return (\n <CampaignItem\n key={campaign.title}\n campaign={campaign}\n onLearnMore={props.onLearnMore}\n onTradeNow={props.onTradeNow}\n />\n );\n })}\n </Flex>\n </Box>\n </Box>\n );\n};\n\nconst Header: FC<CampaignsScriptReturn> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex justify=\"between\" itemAlign=\"center\" pr={3}>\n <Text size=\"xl\">{t(\"tradingLeaderboard.campaigns\")}</Text>\n <Select.options\n size={\"xs\"}\n value={props.category}\n onValueChange={props.onCategoryChange}\n options={props.options}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n />\n </Flex>\n );\n};\n\ntype CampaignItemProps = {\n campaign: CurrentCampaigns;\n onLearnMore: (campaign: CurrentCampaigns) => void;\n onTradeNow: (campaign: CurrentCampaigns) => void;\n};\n\nconst CampaignItem: FC<CampaignItemProps> = ({\n campaign,\n onLearnMore,\n onTradeNow,\n}) => {\n const { title, description, image, displayTime } = campaign;\n const { t } = useTranslation();\n\n return (\n <Flex intensity={800} r=\"xl\" width=\"100%\">\n <img\n className=\"oui-h-[200px] oui-w-[400px] oui-rounded-l-xl oui-object-fill\"\n src={image}\n alt={title}\n />\n\n <Flex\n itemAlign=\"start\"\n justify=\"between\"\n direction=\"column\"\n height=\"100%\"\n p={5}\n className=\"oui-flex-1 oui-font-semibold\"\n >\n <Flex gap={1} direction=\"column\" itemAlign=\"start\">\n <Text size=\"xl\">{title}</Text>\n <Text size=\"sm\" intensity={36}>\n {description}\n </Text>\n </Flex>\n <Flex justify=\"between\" width=\"100%\">\n <Text size=\"xs\" intensity={54}>\n {displayTime}\n </Text>\n <Flex gap={3}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"md\"\n onClick={() => {\n onLearnMore(campaign);\n }}\n >\n {t(\"tradingLeaderboard.learnMore\")}\n </Button>\n <Button\n size=\"md\"\n onClick={() => {\n onTradeNow(campaign);\n }}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useAccount,\n useConfig,\n useInfiniteQuery,\n useQuery,\n usePrivateQuery,\n} from \"@orderly.network/hooks\";\nimport { TableSort, usePagination, useScreen } from \"@orderly.network/ui\";\nimport { differenceInDays } from \"date-fns\";\nimport { getDateRange, formatDateRange } from \"../../utils\";\nimport { AccountStatusEnum, API } from \"@orderly.network/types\";\nimport { useEndReached } from \"../../hooks/useEndReached\";\n\nexport type TradingListScriptOptioins = {};\n\nexport type TradingData = {\n account_id: string;\n address: string;\n broker_fee: number;\n date: string;\n perp_maker_volume: number;\n perp_taker_volume: number;\n perp_volume: number;\n total_fee: number;\n // custom field\n key?: string;\n};\n\nexport type TradingResponse = {\n meta: API.RecordsMeta;\n rows: TradingData[];\n};\nexport type TradingListScriptReturn = ReturnType<typeof useTradingListScript>;\n\nexport const FilterDays = [7, 14, 30, 90] as const;\nexport type TFilterDays = typeof FilterDays[number];\nexport type DateRange = {\n from?: Date;\n to?: Date;\n};\n\nexport function useTradingListScript() {\n const [searchValue, setSearchValue] = useState(\"\");\n const [initialSort] = useState<TableSort>({\n sortKey: \"perp_volume\",\n sort: \"desc\",\n });\n const [sort, setSort] = useState<TableSort | undefined>(initialSort);\n\n const { state } = useAccount();\n const brokerId = useConfig(\"brokerId\");\n\n const { isMobile } = useScreen();\n\n const canTrade =\n state.address &&\n (state.status >= AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected);\n\n const { dateRange, filterDay, updateFilterDay, filterItems, onFilter } =\n useFilter();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: 100,\n });\n\n const getUrl = (args: {\n page: number;\n pageSize: number;\n address?: string;\n sort?: string | null;\n }) => {\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"page\", args.page.toString());\n searchParams.set(\"size\", args.pageSize.toString());\n\n searchParams.set(\"aggregateBy\", \"ACCOUNT\");\n\n if (brokerId) {\n searchParams.set(\"broker_id\", brokerId);\n }\n\n if (args.sort) {\n searchParams.set(\"sort\", args.sort);\n } else if (args.sort !== null && sort) {\n const prefix = sort.sort === \"asc\" ? \"ascending\" : \"descending\";\n searchParams.set(\"sort\", `${prefix}_${sort.sortKey}`);\n }\n\n if (dateRange.from) {\n searchParams.set(\"start_date\", formatDateRange(dateRange.from!));\n }\n\n if (dateRange.to) {\n searchParams.set(\"end_date\", formatDateRange(dateRange.to!));\n }\n\n if (args.address) {\n searchParams.set(\"address\", args.address);\n }\n\n if (args.address) {\n return `/v1/volume/broker/daily?${searchParams.toString()}`;\n }\n\n return `/v1/broker/leaderboard/daily?${searchParams.toString()}`;\n };\n\n const { data, isLoading } = useDataSource(\n getUrl({ page, pageSize, address: searchValue }),\n searchValue\n );\n\n const {\n data: infiniteData,\n size,\n setSize,\n isValidating,\n } = useInfiniteQuery<TradingResponse>(\n (pageIndex: number, previousPageData: any): string | null => {\n // reached the end\n if (previousPageData && !previousPageData.rows?.length) return null;\n\n if (!isMobile) {\n return null;\n }\n\n return getUrl({\n page: pageIndex + 1,\n pageSize,\n address: searchValue,\n });\n },\n {\n initialSize: 1,\n formatter: (res) => res,\n revalidateOnFocus: false,\n }\n );\n\n // it will use first page data cache\n const { data: top100Data } = useQuery<TradingResponse>(\n state.address\n ? getUrl({\n page: 1,\n pageSize: 100,\n sort: `descending_${sort?.sortKey || \"perp_volume\"}`,\n })\n : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n }\n );\n\n const { data: userDataRes = [] } = usePrivateQuery<TradingData[]>(\n canTrade\n ? getUrl({ page: 1, pageSize: 1, address: state.address, sort: null })\n : null,\n {\n revalidateOnFocus: false,\n }\n );\n\n const getAddressRank = useCallback(\n (address: string) => {\n const index = top100Data?.rows.findIndex((item) =>\n isSameAddress(item.address, address!)\n );\n return index !== -1 ? index! + 1 : \"100+\";\n },\n [top100Data]\n );\n\n const userDataList = useMemo(() => {\n if (!canTrade || isLoading) {\n return [];\n }\n\n if (!userDataRes.length) {\n return [\n {\n key: getRowKey(state.address!),\n address: state.address,\n rank: \"-\",\n } as unknown as TradingData,\n ];\n }\n\n return userDataRes?.map((item) => ({\n ...item,\n rank: getAddressRank(item.address!),\n key: getRowKey(item.address!),\n }));\n }, [canTrade, state.address, userDataRes, isLoading, getAddressRank]);\n\n const addRankForList = useCallback(\n (list: TradingData[], total: number) => {\n return list?.map((item, index) => {\n let rank: string | number = index + 1;\n\n if (searchValue) {\n rank = getAddressRank(item.address);\n } else {\n if (sort?.sort === \"asc\") {\n rank = total - (page - 1) * pageSize - index;\n } else if (sort?.sort === \"desc\") {\n rank = (page - 1) * pageSize + index + 1;\n }\n }\n\n return {\n ...item,\n rank,\n };\n });\n },\n [page, pageSize, sort, searchValue, getAddressRank]\n );\n\n const dataSource = useMemo(() => {\n const list = data?.rows || [];\n const total = data?.meta.total || 0;\n const rankList = addRankForList(list, total);\n if (page === 1 && !searchValue) {\n return [...userDataList, ...rankList];\n }\n return rankList;\n }, [data, page, userDataList, searchValue, addRankForList]);\n\n const dataList = useMemo(() => {\n if (!infiniteData?.length) {\n return [];\n }\n\n const total = infiniteData[0]?.meta.total || 0;\n const flatList = infiniteData?.map((item) => item.rows)?.flat();\n const rankList = addRankForList(flatList, total);\n\n if (!searchValue) {\n return [...userDataList, ...rankList];\n }\n\n return rankList;\n }, [infiniteData, userDataList, searchValue, addRankForList]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () => parsePagination(data?.meta),\n [parsePagination, data]\n );\n\n useEndReached(sentinelRef, () => {\n if (!isValidating && isMobile) {\n setSize(size + 1);\n }\n });\n\n const onSearchValueChange = (value: string) => {\n setSearchValue(value);\n };\n\n const clearSearchValue = useCallback(() => {\n setSearchValue(\"\");\n }, []);\n\n const onSort = useCallback(\n (sort?: TableSort) => {\n setSort(sort || initialSort);\n },\n [initialSort]\n );\n\n useEffect(() => {\n if (searchValue) {\n setPage(1);\n }\n }, [searchValue]);\n\n useEffect(() => {\n setPage(1);\n }, [state.address]);\n\n useEffect(() => {\n if (dateRange.to && dateRange.from) {\n setPage(1);\n }\n }, [dateRange]);\n\n return {\n pagination,\n dateRange,\n filterDay,\n updateFilterDay,\n filterItems,\n onFilter,\n initialSort,\n onSort,\n dataSource,\n isLoading: isLoading || isValidating,\n searchValue,\n onSearchValueChange,\n clearSearchValue,\n isMobile,\n sentinelRef,\n dataList,\n address: state.address,\n canTrade,\n };\n}\n\nexport function useDataSource(url: string, searchValue: string) {\n const { data, isLoading } = useQuery<TradingResponse>(\n !searchValue ? url : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n }\n );\n\n // TODO: use public api when api is ready\n const { data: _data, isLoading: _isLoading } =\n usePrivateQuery<TradingResponse>(searchValue ? url : null, {\n formatter: (res) => res,\n revalidateOnFocus: false,\n });\n\n return {\n data: _data || data,\n isLoading: _isLoading || isLoading,\n };\n}\n\nconst useFilter = () => {\n /// default is 90d\n const [filterDay, setFilterDay] = useState<TFilterDays | null>(90);\n\n const [dateRange, setDateRange] = useState<DateRange>(getDateRange(90));\n\n const updateFilterDay = (day: TFilterDays) => {\n setFilterDay(day);\n setDateRange(getDateRange(day));\n };\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n const newDateRange = filter.value;\n setDateRange(newDateRange);\n\n if (newDateRange.from && newDateRange.to) {\n const offsetDay =\n Math.abs(differenceInDays(newDateRange.from, newDateRange.to)) + 1;\n\n const dateRange = getDateRange(offsetDay);\n if (\n formatDateRange(dateRange.from) ===\n formatDateRange(newDateRange.from) &&\n formatDateRange(dateRange.to) === formatDateRange(newDateRange.to)\n ) {\n setFilterDay(offsetDay as any);\n } else {\n setFilterDay(null);\n }\n }\n }\n };\n\n const filterItems = useMemo(() => {\n const dateRangeFilter = {\n type: \"range\",\n name: \"dateRange\",\n value: dateRange,\n max: 90,\n };\n\n return [dateRangeFilter] as any;\n }, [dateRange]);\n\n return {\n filterItems,\n onFilter,\n dateRange,\n filterDay,\n updateFilterDay,\n };\n};\n\nfunction isSameAddress(address1: string, address2: string) {\n return address1.toLowerCase() === address2.toLowerCase();\n}\n\nexport function getRowKey(address: string) {\n return `current-address-${address?.toLowerCase()}`;\n}\n","import { useEffect, useRef, MutableRefObject } from \"react\";\n\n/**\n * Listen for the specified element to scroll to the bottom\n */\nexport function useEndReached(\n sentinelRef: MutableRefObject<HTMLDivElement | null>,\n onEndReached?: () => void\n) {\n const observer = useRef<IntersectionObserver>();\n const cb = useRef(onEndReached);\n\n cb.current = onEndReached;\n\n useEffect(() => {\n const options: IntersectionObserverInit = {\n root: null,\n rootMargin: \"0px\",\n threshold: 0,\n };\n\n const handleObserver = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n cb.current?.();\n }\n });\n };\n\n observer.current = new IntersectionObserver(handleObserver, options);\n\n return () => {\n observer.current?.disconnect();\n };\n }, []);\n\n useEffect(() => {\n if (sentinelRef.current) {\n observer.current?.observe(sentinelRef.current);\n }\n }, [sentinelRef.current]);\n}\n","import { FC, SVGProps } from \"react\";\nimport {\n Box,\n CloseCircleFillIcon,\n cn,\n DataFilter,\n DataTable,\n Flex,\n Input,\n Text,\n} from \"@orderly.network/ui\";\nimport {\n FilterDays,\n getRowKey,\n TradingData,\n TradingListScriptReturn,\n} from \"./tradingList.script\";\nimport { useTradingListColumns } from \"./column\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport type TradingListProps = {\n style?: React.CSSProperties;\n className?: string;\n} & TradingListScriptReturn;\n\nexport const TradingList: FC<TradingListProps> = (props) => {\n const column = useTradingListColumns();\n const { t } = useTranslation();\n\n return (\n <Flex\n direction=\"column\"\n width=\"100%\"\n itemAlign=\"start\"\n intensity={900}\n r=\"2xl\"\n px={4}\n style={props.style}\n className={cn(\"oui-trading-leaderboard-trading-list\", props.className)}\n >\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n mt={2}\n className={cn(\n \"oui-trading-leaderboard-trading-filter\",\n \"oui-border-b oui-border-line\"\n )}\n >\n <Flex gap={3}>\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[53px] oui-border-none\"\n />\n )}\n {FilterDays.map((value) => {\n return (\n <button\n className=\"oui-relative oui-px-2 oui-py-[2px] oui-text-sm\"\n key={value}\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={props.filterDay === value ? \"brand\" : undefined}\n className={\n props.filterDay !== value\n ? \"oui-text-base-contrast-54\"\n : \"\"\n }\n >\n {`${value}D`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-gradient-primary oui-opacity-[.12] oui-absolute oui-left-0 oui-right-0 oui-top-0 oui-bottom-0 oui-rounded\"\n onClick={() => {\n props.updateFilterDay(value as any);\n }}\n ></div>\n </button>\n );\n })}\n </Flex>\n {props.canTrade && (\n <Input\n value={props.searchValue}\n onValueChange={props.onSearchValueChange}\n placeholder={t(\"common.address.search.placeholder\")}\n className={cn(\n \"oui-trading-leaderboard-trading-search-input\",\n \"oui-w-[240px]\"\n )}\n size=\"sm\"\n prefix={\n <Box pl={3} pr={1}>\n <SearchIcon className=\"oui-text-base-contrast-36\" />\n </Box>\n }\n suffix={\n props.searchValue && (\n <Box mr={2}>\n <CloseCircleFillIcon\n size={14}\n className=\"oui-text-base-contrast-36 oui-cursor-pointer =\"\n onClick={props.clearSearchValue}\n />\n </Box>\n )\n }\n autoComplete=\"off\"\n />\n )}\n </Flex>\n\n <DataTable\n loading={props.isLoading}\n id=\"oui-trading-leaderboard-trading-table\"\n columns={column}\n initialSort={props.initialSort}\n onSort={props.onSort}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record: TradingData) => record.key || record.address}\n manualPagination\n manualSorting\n pagination={props.pagination}\n classNames={{\n root: \"!oui-h-[calc(100%_-_53px_-_8px)]\",\n }}\n onRow={(record, index) => {\n return {\n className: cn(\"oui-h-[48px]\"),\n };\n }}\n onCell={(column, record, index) => {\n if (record.key === getRowKey(props.address!)) {\n const isFirst = column.getIsFirstColumn();\n const isLast = column.getIsLastColumn();\n\n return {\n className: cn(\n \"after:oui-absolute after:oui-w-full after:oui-h-[48px]\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \"after:oui-top-0 after:oui-left-0 after:oui-z-[-1]\",\n \"after:oui-border-b after:oui-border-t\",\n isFirst && \"after:oui-border-l after:oui-rounded-l-lg\",\n isLast && \"after:oui-border-r after:oui-rounded-r-lg\"\n ),\n };\n }\n return {};\n }}\n />\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { Text, Column, Box, useScreen } from \"@orderly.network/ui\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport const useTradingListColumns = () => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n return [\n {\n title: t(\"tradingLeaderboard.rank\"),\n dataIndex: \"rank\",\n width: 40,\n render: (value: number) => {\n return (\n <Box width={20} className=\"oui-text-center\">\n {value}\n </Box>\n );\n },\n },\n {\n title: t(\"common.address\"),\n dataIndex: \"address\",\n render: (value: string) => {\n return <Text.formatted rule=\"address\">{value}</Text.formatted>;\n },\n width: 90,\n },\n {\n title: t(\"tradingLeaderboard.tradingVolume\"),\n dataIndex: \"perp_volume\",\n onSort: true,\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2}>\n {value}\n </Text.numeral>\n );\n },\n width: 105,\n },\n {\n title: t(\"common.realizedPnl\"),\n dataIndex: \"realized_pnl\",\n onSort: true,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2} coloring>\n {value}\n </Text.numeral>\n );\n },\n width: 90,\n },\n ] as Column[];\n};\n","import { FC, SVGProps } from \"react\";\nimport {\n Box,\n CloseCircleFillIcon,\n cn,\n DataFilter,\n DataTable,\n Flex,\n Input,\n Spinner,\n Text,\n} from \"@orderly.network/ui\";\nimport {\n FilterDays,\n getRowKey,\n TradingData,\n TradingListScriptReturn,\n} from \"./tradingList.script\";\nimport { useTradingListColumns } from \"./column\";\n\nexport type TradingListProps = {\n style?: React.CSSProperties;\n className?: string;\n} & TradingListScriptReturn;\n\nexport const MobileTradingList: FC<TradingListProps> = (props) => {\n const column = useTradingListColumns();\n\n return (\n <Flex\n direction=\"column\"\n width=\"100%\"\n itemAlign=\"start\"\n intensity={900}\n r=\"2xl\"\n px={4}\n style={props.style}\n className={cn(\n \"oui-mobile-trading-leaderboard-trading-list\",\n props.className\n )}\n >\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n className={cn(\"oui-mobile-trading-leaderboard-trading-filter\")}\n >\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[40px] oui-border-none\"\n />\n )}\n </Flex>\n\n <DataTable\n classNames={{\n root: \"oui-pb-4\",\n body: \"oui-text-2xs\",\n scroll: \"oui-overflow-y-hidden oui-h-full\",\n }}\n loading={props.isLoading}\n id=\"oui-trading-leaderboard-trading-table\"\n columns={column}\n initialSort={props.initialSort}\n onSort={props.onSort}\n dataSource={props.dataList}\n generatedRowKey={(record: TradingData) => record.key || record.address}\n manualPagination\n manualSorting\n onRow={(record, index) => {\n return {\n className: cn(\"oui-h-[30px]\"),\n };\n }}\n onCell={(column, record, index) => {\n if (record.key === getRowKey(props.address!)) {\n const isFirst = column.getIsFirstColumn();\n const isLast = column.getIsLastColumn();\n\n return {\n className: cn(\n \"after:oui-absolute after:oui-w-full after:oui-h-[30px]\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \" after:oui-top-0 after:oui-left-0 after:oui-z-[-1]\",\n \"after:oui-border-b after:oui-border-t\",\n isFirst && \"after:oui-border-l after:oui-rounded-l-lg\",\n isLast && \"after:oui-border-r after:oui-rounded-r-lg\"\n ),\n };\n }\n return {};\n }}\n />\n <div\n ref={props.sentinelRef}\n className=\"oui-relative oui-invisible oui-h-[1px] oui-top-[-300px]\"\n />\n {props.isLoading && props.dataList.length > 0 && (\n <Flex itemAlign=\"center\" justify=\"center\" width=\"100%\" height={40}>\n <Spinner size=\"sm\" />\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { FC } from \"react\";\nimport { useTradingListScript } from \"./tradingList.script\";\nimport { TradingList, TradingListProps } from \"./tradingList.ui\";\nimport { MobileTradingList } from \"./tradingList.mobile.ui\";\n\nexport type TradingListWidgetProps = Pick<\n TradingListProps,\n \"style\" | \"className\"\n>;\n\nexport const TradingListWidget: FC<TradingListWidgetProps> = (props) => {\n const state = useTradingListScript();\n if (state.isMobile) {\n return <MobileTradingList {...state} {...props} />;\n }\n return <TradingList {...state} {...props} />;\n};\n","import { useMemo } from \"react\";\nimport { Campaign } from \"../../components/provider\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { useAccount } from \"@orderly.network/hooks\";\nimport { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"@orderly.network/react-app\";\n\nexport type LeaderboardScriptReturn = ReturnType<typeof useLeaderboardScript>;\n\nexport type LeaderboardScriptOptions = {\n backgroundSrc?: string;\n campaigns?: Campaign[];\n};\n\nfunction isVideoSrc(src?: string) {\n const extension = src?.split(\".\").pop();\n return [\"mp4\", \"webm\", \"avi\", \"ogg\"].includes(extension ?? \"\");\n}\n\nexport function useLeaderboardScript(options: LeaderboardScriptOptions) {\n const { backgroundSrc, campaigns = [] } = options;\n const { isMobile } = useScreen();\n const { state } = useAccount();\n const { wrongNetwork, disabledConnect } = useAppContext();\n\n const showCampaigns = useMemo(() => campaigns?.length > 0, [campaigns]);\n\n const canTrading =\n !wrongNetwork &&\n !disabledConnect &&\n (state.status >= AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected);\n\n const isVideo = useMemo(() => {\n return isVideoSrc(backgroundSrc);\n }, [backgroundSrc]);\n\n return {\n backgroundSrc,\n isVideo,\n showCampaigns,\n isMobile,\n canTrading,\n };\n}\n","import { FC } from \"react\";\nimport { cn, Flex } from \"@orderly.network/ui\";\nimport { TradingListWidget } from \"../../components/tradingList/widget\";\nimport { CampaignsWidget } from \"../../components/campaigns\";\nimport { LeaderboardScriptReturn } from \"./leaderboard.script\";\n\nexport type LeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n} & LeaderboardScriptReturn;\n\nexport const Leaderboard: FC<LeaderboardProps> = (props) => {\n const renderBackground = () => {\n const linearGradient =\n \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n if (props.isVideo) {\n return (\n <div\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\"\n )}\n >\n <div\n style={{\n backgroundImage: linearGradient,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\"\n )}\n />\n <video\n autoPlay\n loop\n muted\n className={cn(\n // rest style\n \"oui-border-none oui-outline-none oui-bg-transparent\",\n \"oui-w-full oui-h-full\",\n // \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-object-cover\",\n \"oui-opacity-50\"\n )}\n >\n <source src={props.backgroundSrc} type=\"video/mp4\" />\n <source src={props.backgroundSrc} type=\"video/webm\" />\n <source src={props.backgroundSrc} type=\"video/ogg\" />\n <source src={props.backgroundSrc} type=\"video/avi\" />\n Your browser does not support the video tag.\n </video>\n </div>\n );\n }\n\n if (props.backgroundSrc) {\n return (\n <div\n style={{\n backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\",\n \"oui-opacity-50\"\n )}\n />\n );\n }\n };\n\n return (\n <div\n style={props.style}\n className={cn(\"oui-h-full oui-mix-blend-screen\", props.className)}\n >\n {renderBackground()}\n <Flex\n direction=\"column\"\n gapY={5}\n height=\"100%\"\n className={cn(\n \"oui-trading-leaderboard oui-relative\",\n \"oui-max-w-[1040px] oui-px-3 oui-mx-auto \"\n )}\n >\n {props.showCampaigns && <CampaignsWidget />}\n <TradingListWidget\n className={cn(\n props.showCampaigns\n ? \"oui-h-[calc(100%_-_288px_-_20px)]\"\n : \"oui-h-full\"\n )}\n />\n </Flex>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { cn, Flex } from \"@orderly.network/ui\";\nimport { TradingListWidget } from \"../../components/tradingList/widget\";\nimport { CampaignsWidget } from \"../../components/campaigns\";\nimport { LeaderboardScriptReturn } from \"./leaderboard.script\";\nimport { BottomNavBarWidget } from \"@orderly.network/trading\";\n\nexport type LeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n} & LeaderboardScriptReturn;\n\nexport const MobileLeaderboardWidget: FC<LeaderboardProps> = (props) => {\n const renderBackground = () => {\n const linearGradient =\n \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n if (props.isVideo) {\n return (\n <div\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\"\n )}\n >\n <div\n style={{\n backgroundImage: linearGradient,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\"\n )}\n />\n <video\n playsInline\n webkit-playsinline\n autoPlay\n loop\n muted\n className={cn(\n // rest style\n \"oui-border-none oui-outline-none oui-bg-transparent oui-pointer-events-none\",\n \"oui-w-full oui-h-full\",\n // \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-object-cover\",\n \"oui-opacity-50\"\n )}\n >\n <source src={props.backgroundSrc} type=\"video/mp4\" />\n <source src={props.backgroundSrc} type=\"video/webm\" />\n <source src={props.backgroundSrc} type=\"video/ogg\" />\n <source src={props.backgroundSrc} type=\"video/avi\" />\n Your browser does not support the video tag.\n </video>\n </div>\n );\n }\n\n if (props.backgroundSrc) {\n return (\n <div\n style={{\n backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\",\n \"oui-opacity-50\"\n )}\n />\n );\n }\n };\n return (\n <div\n style={{\n paddingBottom: \"calc(64px + env(safe-area-inset-bottom))\",\n }}\n className={cn(\n \"oui-grid oui-grid-rows-[auto,1fr,auto] oui-h-screen oui-gap-1 oui-relative oui-bg-base-10\",\n \"oui-relative oui-h-full oui-mix-blend-screen\",\n props.className\n )}\n >\n {renderBackground()}\n <Flex\n direction=\"column\"\n gapY={3}\n height=\"100%\"\n px={3}\n pt={3}\n pb={3}\n className={cn(\n \"oui-trading-leaderboard-mobile oui-overflow-y-auto oui-custom-scrollbar\",\n \"oui-relative oui-h-[calc(100vh_-_64px)]\"\n )}\n >\n {props.showCampaigns && <CampaignsWidget />}\n <TradingListWidget className={cn(!props.canTrading && \"oui-h-full\")} />\n <div className=\"oui-fixed oui-left-0 oui-right-0 oui-bottom-0 oui-z-10\">\n <BottomNavBarWidget />\n </div>\n </Flex>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { useLeaderboardScript } from \"./leaderboard.script\";\nimport { Leaderboard, LeaderboardProps } from \"./leaderboard.ui\";\nimport {\n TradingLeaderboardProvider,\n TradingLeaderboardProviderProps,\n} from \"../../components/provider\";\nimport { MobileLeaderboardWidget } from \"./leaderboard.mobile.ui\";\n\nexport type LeaderboardWidgetProps = TradingLeaderboardProviderProps &\n Pick<LeaderboardProps, \"style\" | \"className\">;\n\nexport const LeaderboardWidget: FC<LeaderboardWidgetProps> = (props) => {\n const state = useLeaderboardScript({\n backgroundSrc: props.backgroundSrc,\n campaigns: props.campaigns,\n });\n\n return (\n <TradingLeaderboardProvider campaigns={props.campaigns} href={props.href}>\n {state.isMobile ? (\n <MobileLeaderboardWidget {...state} />\n ) : (\n <Leaderboard\n {...state}\n className={props.className}\n style={props.style}\n />\n )}\n </TradingLeaderboardProvider>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/campaigns/widget.tsx","../src/components/campaigns/campaigns.mobile.ui.tsx","../src/components/campaigns/campaigns.script.ts","../src/utils.ts","../src/components/provider/index.tsx","../src/components/campaigns/campaigns.ui.tsx","../src/components/tradingList/tradingList.script.ts","../src/hooks/useEndReached.ts","../src/components/tradingList/tradingList.ui.tsx","../src/components/tradingList/column.tsx","../src/components/tradingList/tradingList.mobile.ui.tsx","../src/components/tradingList/widget.tsx","../src/page/leaderboard/leaderboard.script.ts","../src/page/leaderboard/leaderboard.ui.tsx","../src/page/leaderboard/leaderboard.mobile.ui.tsx","../src/page/leaderboard/widget.tsx"],"names":["useScreen","cn","Box","Text","Flex","Button","Select","useTranslation","jsx","jsxs","scrollIndicatorWidth","scrollIndicatorHeight","MobileCampaigns","props","Header","campaign","CampaignItem","ScrollIndicator","title","description","image","displayTime","learnMoreUrl","tradingUrl","t","style","scrollIndex","list","item","index","useEffect","useMemo","useState","useEmblaCarousel","useTrack","TrackerEventName","format","subDays","getDateRange","offsetDay","formatDateRange","date","formatCampaignDate","monthNames","year","month","day","hours","minutes","createContext","useContext","TradingLeaderboardContext","TradingLeaderboardProvider","useTradingLeaderboardContext","useCampaignsScript","campaigns","href","category","setCategory","track","tracking","filterCampaigns","now","acc","startTime","endTime","options","currentCampaigns","firstAvailableCategory","onCategoryChange","value","setScrollIndex","emblaRef","emblaApi","onLearnMore","onTradeNow","Campaigns","CampaignsWidget","state","isMobile","useCallback","useRef","differenceInDays","useAccount","useConfig","useInfiniteQuery","useQuery","usePrivateQuery","AccountStatusEnum","usePagination","useEndReached","sentinelRef","onEndReached","observer","cb","handleObserver","entries","entry","FilterDays","useTradingListScript","searchValue","setSearchValue","initialSort","sort","setSort","brokerId","canTrade","dateRange","filterDay","updateFilterDay","filterItems","onFilter","useFilter","page","pageSize","setPage","parsePagination","getUrl","args","searchParams","prefix","data","isLoading","useDataSource","infiniteData","size","setSize","isValidating","pageIndex","previousPageData","res","top100Data","userDataRes","getAddressRank","address","isSameAddress","userDataList","getRowKey","addRankForList","total","rank","dataSource","rankList","dataList","flatList","pagination","onSearchValueChange","clearSearchValue","onSort","url","_data","_isLoading","setFilterDay","setDateRange","filter","newDateRange","address1","address2","CloseCircleFillIcon","DataFilter","DataTable","Input","useTradingListColumns","TradingList","column","SearchIcon","record","isFirst","isLast","Spinner","MobileTradingList","TradingListWidget","isVideoSrc","src","extension","useLeaderboardScript","backgroundSrc","showCampaigns","isVideo","Leaderboard","renderBackground","linearGradient","MobileLeaderboardWidget","LeaderboardWidget"],"mappings":"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","sourcesContent":["import { FC } from \"react\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { MobileCampaigns } from \"./campaigns.mobile.ui\";\nimport { useCampaignsScript } from \"./campaigns.script\";\nimport { Campaigns } from \"./campaigns.ui\";\n\nexport type CampaignsWidgetProps = {\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport const CampaignsWidget: FC<CampaignsWidgetProps> = (props) => {\n const state = useCampaignsScript();\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return (\n <MobileCampaigns\n {...state}\n className={props.className}\n style={props.style}\n />\n );\n }\n return (\n <Campaigns {...state} className={props.className} style={props.style} />\n );\n};\n","import { FC } from \"react\";\nimport { cn, Box, Text, Flex, Button, Select } from \"@orderly.network/ui\";\nimport { CampaignsScriptReturn, CurrentCampaigns } from \"./campaigns.script\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport type CampaignsProps = {\n className?: string;\n style?: React.CSSProperties;\n} & CampaignsScriptReturn;\n\nconst scrollIndicatorWidth = 25;\nconst scrollIndicatorHeight = 6;\n\nexport const MobileCampaigns: FC<CampaignsProps> = (props) => {\n if (props.currentCampaigns.length === 0) {\n return null;\n }\n\n return (\n <Box\n width=\"100%\"\n intensity={900}\n p={3}\n className={cn(\n \"oui-mobile-trading-leaderboard-campaigns oui-rounded-[20px]\",\n props.className\n )}\n style={props.style}\n >\n <Header {...props} />\n <Box\n r=\"xl\"\n mt={3}\n ref={props.enableScroll ? props.emblaRef : undefined}\n className={cn(\n \"oui-w-full oui-min-w-0 oui-overflow-hidden\",\n \"oui-select-none oui-cursor-pointer\"\n )}\n >\n <Flex>\n {props.currentCampaigns.map((campaign) => {\n return <CampaignItem key={campaign.title} campaign={campaign} />;\n })}\n </Flex>\n </Box>\n {props.enableScroll && (\n <ScrollIndicator\n style={{\n width: scrollIndicatorWidth * props.currentCampaigns.length,\n }}\n list={props.currentCampaigns}\n scrollIndex={props.scrollIndex}\n scrollTo={props.emblaApi?.scrollTo}\n />\n )}\n </Box>\n );\n};\n\nconst Header: FC<CampaignsScriptReturn> = (props) => {\n const { t } = useTranslation();\n\n return (\n <Flex justify=\"between\" itemAlign=\"center\">\n <Text size=\"base\" intensity={80}>\n {t(\"tradingLeaderboard.campaigns\")}\n </Text>\n <Select.options\n size={\"xs\"}\n value={props.category}\n onValueChange={props.onCategoryChange}\n options={props.options}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n />\n </Flex>\n );\n};\n\nconst CampaignItem: FC<{ campaign: CurrentCampaigns }> = ({ campaign }) => {\n const { title, description, image, displayTime, learnMoreUrl, tradingUrl } =\n campaign;\n const { t } = useTranslation();\n\n return (\n <Box intensity={800} r=\"xl\" className=\"oui-flex-[0_0_100%]\">\n <img\n className=\"oui-w-full oui-h-[calc((100vw-48px)/2)] oui-rounded-t-xl oui-object-fill\"\n src={image}\n alt={title}\n />\n\n <Flex\n itemAlign=\"start\"\n justify=\"between\"\n direction=\"column\"\n height=\"100%\"\n p={4}\n gapY={3}\n className=\"oui-font-semibold\"\n >\n <Flex direction=\"column\" itemAlign=\"start\" gapY={1}>\n <Text size=\"sm\">{title}</Text>\n <Text size=\"2xs\" intensity={54}>\n {displayTime}\n </Text>\n <Text size=\"2xs\" intensity={36}>\n {description}\n </Text>\n </Flex>\n <Flex justify=\"between\" width=\"100%\" gapX={3}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n fullWidth\n size=\"md\"\n onClick={() => {\n window.open(learnMoreUrl, \"_blank\");\n }}\n >\n {t(\"tradingLeaderboard.learnMore\")}\n </Button>\n <Button\n size=\"md\"\n fullWidth\n onClick={() => {\n window.open(tradingUrl, \"_self\");\n }}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n </Flex>\n </Flex>\n </Box>\n );\n};\n\ninterface ScrollIndicatorProps {\n style?: React.CSSProperties;\n list: CurrentCampaigns[];\n scrollIndex: number;\n scrollTo?: (index: number) => void;\n}\n\nconst ScrollIndicator: React.FC<ScrollIndicatorProps> = (props) => {\n const { style, scrollIndex, list } = props;\n\n return (\n <Flex\n mt={3}\n r=\"full\"\n height={scrollIndicatorHeight}\n className={cn(\"oui-bg-line oui-mx-auto oui-relative\")}\n style={props.style}\n >\n {list.map((item, index) => {\n return (\n <Box\n key={index}\n width={scrollIndicatorWidth}\n height={scrollIndicatorHeight}\n onClick={() => {\n props.scrollTo?.(index);\n }}\n r=\"full\"\n className=\"oui-cursor-pointer\"\n />\n );\n })}\n <Box\n width={scrollIndicatorWidth}\n height={scrollIndicatorHeight}\n r=\"full\"\n className={cn(\n \"oui-absolute oui-left-0 oui-top-0\",\n \"oui-transition-all oui-duration-300\",\n \"oui-bg-primary\"\n )}\n style={{\n transform: `translateX(${scrollIndex * scrollIndicatorWidth}px)`,\n }}\n />\n </Flex>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport useEmblaCarousel from \"embla-carousel-react\";\nimport { useTrack } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { TrackerEventName } from \"@orderly.network/types\";\nimport { formatCampaignDate } from \"../../utils\";\nimport { useTradingLeaderboardContext, Campaign } from \"../provider\";\n\nexport type CampaignsScriptReturn = ReturnType<typeof useCampaignsScript>;\n\n// Define the type for our categorized campaigns\ntype CategorizedCampaigns = {\n ongoing: Campaign[];\n past: Campaign[];\n future: Campaign[];\n};\n\nexport type CurrentCampaigns = Campaign & {\n displayTime: string;\n learnMoreUrl: string;\n tradingUrl: string;\n};\n\nexport type TEmblaApi = {\n scrollTo?: (index: number) => void;\n};\n\ntype CategoryKey = keyof CategorizedCampaigns;\n\nexport function useCampaignsScript() {\n const { t } = useTranslation();\n const { campaigns = [], href } = useTradingLeaderboardContext();\n const [category, setCategory] = useState<CategoryKey>(\"ongoing\");\n\n const { track, tracking } = useTrack();\n\n const filterCampaigns = useMemo(() => {\n const now = new Date();\n\n return campaigns.reduce<CategorizedCampaigns>(\n (acc, campaign) => {\n const startTime = new Date(campaign.startTime);\n const endTime = new Date(campaign.endTime);\n\n if (now >= startTime && now <= endTime) {\n acc.ongoing.push(campaign);\n } else if (now > endTime) {\n acc.past.push(campaign);\n } else {\n acc.future.push(campaign);\n }\n\n return acc;\n },\n { ongoing: [], past: [], future: [] },\n );\n }, [campaigns]);\n\n const options = useMemo(() => {\n const opts: { label: string; value: CategoryKey }[] = [\n { label: t(\"tradingLeaderboard.ongoing\"), value: \"ongoing\" },\n { label: t(\"tradingLeaderboard.future\"), value: \"future\" },\n { label: t(\"tradingLeaderboard.past\"), value: \"past\" },\n ];\n\n // Filter out categories with no campaigns and map to the required format\n return opts.filter((item) => filterCampaigns[item.value].length > 0);\n }, [filterCampaigns, t]);\n\n const currentCampaigns = useMemo(() => {\n const list = filterCampaigns[category];\n return list.map((campaign) => {\n const { startTime, endTime } = campaign;\n\n let learnMoreUrl: string;\n let tradingUrl = href?.trading!;\n\n if (typeof campaign.href === \"object\") {\n learnMoreUrl = campaign.href.learnMore;\n tradingUrl = campaign.href.trading;\n } else {\n learnMoreUrl = campaign.href;\n }\n\n return {\n ...campaign,\n displayTime: `${formatCampaignDate(startTime)} - ${formatCampaignDate(\n endTime,\n )} UTC`,\n learnMoreUrl,\n tradingUrl,\n };\n });\n }, [filterCampaigns, category, href]);\n\n useEffect(() => {\n // Find the first non-empty category\n const categoryKeys: CategoryKey[] = [\"ongoing\", \"future\", \"past\"];\n\n const firstAvailableCategory = categoryKeys.find(\n (item) => filterCampaigns[item].length > 0,\n );\n\n if (firstAvailableCategory) {\n setCategory(firstAvailableCategory);\n }\n }, [filterCampaigns]);\n\n const onCategoryChange = (value: string) => {\n setCategory(value as CategoryKey);\n };\n const [scrollIndex, setScrollIndex] = useState(0);\n\n const [emblaRef, emblaApi] = useEmblaCarousel({\n loop: false,\n slidesToScroll: \"auto\",\n });\n\n useEffect(() => {\n emblaApi?.on(\"select\", () => {\n setScrollIndex(emblaApi?.selectedScrollSnap());\n });\n }, [emblaApi]);\n\n const onLearnMore = (campaign: CurrentCampaigns) => {\n track(TrackerEventName.leaderboardCampaignClickLearnMore, {\n campaign_title: campaign.title,\n });\n window.open(campaign.learnMoreUrl, \"_blank\");\n };\n\n const onTradeNow = (campaign: CurrentCampaigns) => {\n tracking(TrackerEventName.leaderboardCampaignClickTradeNow, {\n campaign_title: campaign.title,\n });\n window.open(campaign.tradingUrl, \"_self\");\n };\n\n return {\n options,\n currentCampaigns,\n category,\n onCategoryChange,\n tradingUrl: href?.trading,\n emblaRef,\n emblaApi: emblaApi as TEmblaApi,\n scrollIndex,\n enableScroll: currentCampaigns?.length > 1,\n onLearnMore,\n onTradeNow,\n };\n}\n","import { format, subDays } from \"date-fns\";\n\nexport const getDateRange = (offsetDay: number) => {\n return {\n from: subDays(new Date(), offsetDay - 1)!,\n to: new Date()!,\n };\n};\n\n/**\n * Format a date to \"yyyy-MM-dd\" format (e.g., \"2025-03-10\")\n * @param date The date to format\n * @returns Formatted date string\n */\nexport const formatDateRange = (date: Date): string => {\n return format(date, \"yyyy-MM-dd\");\n};\n\nexport function formatCampaignDate(date: Date | string): string {\n const monthNames = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ];\n if (typeof date === \"string\") {\n date = new Date(date);\n }\n const year = date.getUTCFullYear();\n const month = monthNames[date.getUTCMonth()];\n const day = date.getUTCDate();\n const hours = String(date.getUTCHours()).padStart(2, \"0\");\n const minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n return `${month} ${day}, ${year} ${hours}:${minutes}`;\n}\n","import { createContext, PropsWithChildren, useContext } from \"react\";\n\nexport type Campaign = {\n title: string;\n description: string;\n image: string;\n startTime: Date | string;\n endTime: Date | string;\n href:\n | string\n | {\n /** learn more url */\n learnMore: string;\n /** trading url, if provided, will override default trading now button url */\n trading: string;\n };\n};\n\n/**\n * Trading leaderboard provider state\n */\nexport type TradingLeaderboardState = {\n /** campaigns config, if not provided, will not show campaigns section */\n campaigns?: Campaign[];\n /** background src, it can be a image resource or video resource */\n backgroundSrc?: string;\n href?: {\n /** default trading now button url */\n trading: string;\n };\n};\n\n/**\n * Trading leaderboard context\n */\nexport const TradingLeaderboardContext = createContext<TradingLeaderboardState>(\n {} as TradingLeaderboardState\n);\n\nexport type TradingLeaderboardProviderProps =\n PropsWithChildren<TradingLeaderboardState>;\n\nexport const TradingLeaderboardProvider = (\n props: TradingLeaderboardProviderProps\n) => {\n return (\n <TradingLeaderboardContext.Provider\n value={{\n campaigns: props.campaigns,\n href: props.href,\n backgroundSrc: props.backgroundSrc,\n }}\n >\n {props.children}\n </TradingLeaderboardContext.Provider>\n );\n};\n\nexport const useTradingLeaderboardContext = () => {\n return useContext(TradingLeaderboardContext);\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { cn, Box, Text, Flex, Button, Select } from \"@orderly.network/ui\";\nimport { CampaignsScriptReturn, CurrentCampaigns } from \"./campaigns.script\";\n\nexport type CampaignsProps = {\n className?: string;\n style?: React.CSSProperties;\n} & CampaignsScriptReturn;\n\nexport const Campaigns: FC<CampaignsProps> = (props) => {\n if (props.currentCampaigns.length === 0) {\n return null;\n }\n\n return (\n <Box\n width=\"100%\"\n intensity={900}\n p={5}\n pr={2}\n height={288}\n className={cn(\n \"oui-trading-leaderboard-campaigns oui-rounded-[20px]\",\n props.className,\n )}\n style={props.style}\n >\n <Header {...props} />\n <Box\n mt={5}\n r=\"xl\"\n className={cn(\"oui-overflow-y-auto\", \"oui-custom-scrollbar\")}\n >\n <Flex\n gapY={5}\n height={200}\n direction=\"column\"\n r=\"xl\"\n className=\"oui-pr-1.5\"\n >\n {props.currentCampaigns.map((campaign) => {\n return (\n <CampaignItem\n key={campaign.title}\n campaign={campaign}\n onLearnMore={props.onLearnMore}\n onTradeNow={props.onTradeNow}\n />\n );\n })}\n </Flex>\n </Box>\n </Box>\n );\n};\n\nconst Header: FC<CampaignsScriptReturn> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex justify=\"between\" itemAlign=\"center\" pr={3}>\n <Text size=\"xl\">{t(\"tradingLeaderboard.campaigns\")}</Text>\n <Select.options\n size={\"xs\"}\n value={props.category}\n onValueChange={props.onCategoryChange}\n options={props.options}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n />\n </Flex>\n );\n};\n\ntype CampaignItemProps = {\n campaign: CurrentCampaigns;\n onLearnMore: (campaign: CurrentCampaigns) => void;\n onTradeNow: (campaign: CurrentCampaigns) => void;\n};\n\nconst CampaignItem: FC<CampaignItemProps> = ({\n campaign,\n onLearnMore,\n onTradeNow,\n}) => {\n const { title, description, image, displayTime } = campaign;\n const { t } = useTranslation();\n\n return (\n <Flex intensity={800} r=\"xl\" width=\"100%\">\n <img\n className=\"oui-h-[200px] oui-w-[400px] oui-rounded-l-xl oui-object-fill\"\n src={image}\n alt={title}\n />\n\n <Flex\n itemAlign=\"start\"\n justify=\"between\"\n direction=\"column\"\n height=\"100%\"\n p={5}\n className=\"oui-flex-1 oui-font-semibold\"\n >\n <Flex gap={1} direction=\"column\" itemAlign=\"start\">\n <Text size=\"xl\">{title}</Text>\n <Text size=\"sm\" intensity={36}>\n {description}\n </Text>\n </Flex>\n <Flex justify=\"between\" width=\"100%\">\n <Text size=\"xs\" intensity={54}>\n {displayTime}\n </Text>\n <Flex gap={3}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"md\"\n onClick={() => {\n onLearnMore(campaign);\n }}\n >\n {t(\"tradingLeaderboard.learnMore\")}\n </Button>\n <Button\n size=\"md\"\n onClick={() => {\n onTradeNow(campaign);\n }}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { differenceInDays } from \"date-fns\";\nimport {\n useAccount,\n useConfig,\n useInfiniteQuery,\n useQuery,\n usePrivateQuery,\n} from \"@orderly.network/hooks\";\nimport { AccountStatusEnum, API } from \"@orderly.network/types\";\nimport { TableSort, usePagination, useScreen } from \"@orderly.network/ui\";\nimport { useEndReached } from \"../../hooks/useEndReached\";\nimport { getDateRange, formatDateRange } from \"../../utils\";\n\nexport type TradingListScriptOptioins = {};\n\nexport type TradingData = {\n account_id: string;\n address: string;\n broker_fee: number;\n date: string;\n perp_maker_volume: number;\n perp_taker_volume: number;\n perp_volume: number;\n total_fee: number;\n // custom field\n key?: string;\n};\n\nexport type TradingResponse = {\n meta: API.RecordsMeta;\n rows: TradingData[];\n};\nexport type TradingListScriptReturn = ReturnType<typeof useTradingListScript>;\n\nexport const FilterDays = [7, 14, 30, 90] as const;\nexport type TFilterDays = (typeof FilterDays)[number];\nexport type DateRange = {\n from?: Date;\n to?: Date;\n};\n\nexport function useTradingListScript() {\n const [searchValue, setSearchValue] = useState(\"\");\n const [initialSort] = useState<TableSort>({\n sortKey: \"perp_volume\",\n sort: \"desc\",\n });\n const [sort, setSort] = useState<TableSort | undefined>(initialSort);\n\n const { state } = useAccount();\n const brokerId = useConfig(\"brokerId\");\n\n const { isMobile } = useScreen();\n\n const canTrade =\n state.address &&\n (state.status >= AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected);\n\n const { dateRange, filterDay, updateFilterDay, filterItems, onFilter } =\n useFilter();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: 100,\n });\n\n const getUrl = (args: {\n page: number;\n pageSize: number;\n address?: string;\n sort?: string | null;\n }) => {\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"page\", args.page.toString());\n searchParams.set(\"size\", args.pageSize.toString());\n\n searchParams.set(\"aggregateBy\", \"ACCOUNT\");\n\n if (brokerId) {\n searchParams.set(\"broker_id\", brokerId);\n }\n\n if (args.sort) {\n searchParams.set(\"sort\", args.sort);\n } else if (args.sort !== null && sort) {\n const prefix = sort.sort === \"asc\" ? \"ascending\" : \"descending\";\n searchParams.set(\"sort\", `${prefix}_${sort.sortKey}`);\n }\n\n if (dateRange.from) {\n searchParams.set(\"start_date\", formatDateRange(dateRange.from!));\n }\n\n if (dateRange.to) {\n searchParams.set(\"end_date\", formatDateRange(dateRange.to!));\n }\n\n if (args.address) {\n searchParams.set(\"address\", args.address);\n }\n\n if (args.address) {\n return `/v1/volume/broker/daily?${searchParams.toString()}`;\n }\n\n return `/v1/broker/leaderboard/daily?${searchParams.toString()}`;\n };\n\n const { data, isLoading } = useDataSource(\n getUrl({ page, pageSize, address: searchValue }),\n searchValue,\n );\n\n const {\n data: infiniteData,\n size,\n setSize,\n isValidating,\n } = useInfiniteQuery<TradingResponse>(\n (pageIndex: number, previousPageData: any): string | null => {\n // reached the end\n if (previousPageData && !previousPageData.rows?.length) return null;\n\n if (!isMobile) {\n return null;\n }\n\n return getUrl({\n page: pageIndex + 1,\n pageSize,\n address: searchValue,\n });\n },\n {\n initialSize: 1,\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n // it will use first page data cache\n const { data: top100Data } = useQuery<TradingResponse>(\n state.address\n ? getUrl({\n page: 1,\n pageSize: 100,\n sort: `descending_${sort?.sortKey || \"perp_volume\"}`,\n })\n : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const { data: userDataRes = [] } = usePrivateQuery<TradingData[]>(\n canTrade\n ? getUrl({ page: 1, pageSize: 1, address: state.address, sort: null })\n : null,\n {\n revalidateOnFocus: false,\n },\n );\n\n const getAddressRank = useCallback(\n (address: string) => {\n const index = top100Data?.rows.findIndex((item) =>\n isSameAddress(item.address, address!),\n );\n return index !== -1 ? index! + 1 : \"100+\";\n },\n [top100Data],\n );\n\n const userDataList = useMemo(() => {\n if (!canTrade || isLoading) {\n return [];\n }\n\n if (!userDataRes.length) {\n return [\n {\n key: getRowKey(state.address!),\n address: state.address,\n rank: \"-\",\n } as unknown as TradingData,\n ];\n }\n\n return userDataRes?.map((item) => ({\n ...item,\n rank: getAddressRank(item.address!),\n key: getRowKey(item.address!),\n }));\n }, [canTrade, state.address, userDataRes, isLoading, getAddressRank]);\n\n const addRankForList = useCallback(\n (list: TradingData[], total: number) => {\n return list?.map((item, index) => {\n let rank: string | number = index + 1;\n\n if (searchValue) {\n rank = getAddressRank(item.address);\n } else {\n if (sort?.sort === \"asc\") {\n rank = total - (page - 1) * pageSize - index;\n } else if (sort?.sort === \"desc\") {\n rank = (page - 1) * pageSize + index + 1;\n }\n }\n\n return {\n ...item,\n rank,\n };\n });\n },\n [page, pageSize, sort, searchValue, getAddressRank],\n );\n\n const dataSource = useMemo(() => {\n const list = data?.rows || [];\n const total = data?.meta.total || 0;\n const rankList = addRankForList(list, total);\n if (page === 1 && !searchValue) {\n return [...userDataList, ...rankList];\n }\n return rankList;\n }, [data, page, userDataList, searchValue, addRankForList]);\n\n const dataList = useMemo(() => {\n if (!infiniteData?.length) {\n return [];\n }\n\n const total = infiniteData[0]?.meta.total || 0;\n const flatList = infiniteData?.map((item) => item.rows)?.flat();\n const rankList = addRankForList(flatList, total);\n\n if (!searchValue) {\n return [...userDataList, ...rankList];\n }\n\n return rankList;\n }, [infiniteData, userDataList, searchValue, addRankForList]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () => parsePagination(data?.meta),\n [parsePagination, data],\n );\n\n useEndReached(sentinelRef, () => {\n if (!isValidating && isMobile) {\n setSize(size + 1);\n }\n });\n\n const onSearchValueChange = (value: string) => {\n setSearchValue(value);\n };\n\n const clearSearchValue = useCallback(() => {\n setSearchValue(\"\");\n }, []);\n\n const onSort = useCallback(\n (sort?: TableSort) => {\n setSort(sort || initialSort);\n },\n [initialSort],\n );\n\n useEffect(() => {\n if (searchValue) {\n setPage(1);\n }\n }, [searchValue]);\n\n useEffect(() => {\n setPage(1);\n }, [state.address]);\n\n useEffect(() => {\n if (dateRange.to && dateRange.from) {\n setPage(1);\n }\n }, [dateRange]);\n\n return {\n pagination,\n dateRange,\n filterDay,\n updateFilterDay,\n filterItems,\n onFilter,\n initialSort,\n onSort,\n dataSource,\n isLoading: isLoading || isValidating,\n searchValue,\n onSearchValueChange,\n clearSearchValue,\n isMobile,\n sentinelRef,\n dataList,\n address: state.address,\n canTrade,\n };\n}\n\nexport function useDataSource(url: string, searchValue: string) {\n const { data, isLoading } = useQuery<TradingResponse>(\n !searchValue ? url : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n // TODO: use public api when api is ready\n const { data: _data, isLoading: _isLoading } =\n usePrivateQuery<TradingResponse>(searchValue ? url : null, {\n formatter: (res) => res,\n revalidateOnFocus: false,\n });\n\n return {\n data: _data || data,\n isLoading: _isLoading || isLoading,\n };\n}\n\nconst useFilter = () => {\n /// default is 90d\n const [filterDay, setFilterDay] = useState<TFilterDays | null>(90);\n\n const [dateRange, setDateRange] = useState<DateRange>(getDateRange(90));\n\n const updateFilterDay = (day: TFilterDays) => {\n setFilterDay(day);\n setDateRange(getDateRange(day));\n };\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n const newDateRange = filter.value;\n setDateRange(newDateRange);\n\n if (newDateRange.from && newDateRange.to) {\n const offsetDay =\n Math.abs(differenceInDays(newDateRange.from, newDateRange.to)) + 1;\n\n const dateRange = getDateRange(offsetDay);\n if (\n formatDateRange(dateRange.from) ===\n formatDateRange(newDateRange.from) &&\n formatDateRange(dateRange.to) === formatDateRange(newDateRange.to)\n ) {\n setFilterDay(offsetDay as any);\n } else {\n setFilterDay(null);\n }\n }\n }\n };\n\n const filterItems = useMemo(() => {\n const dateRangeFilter = {\n type: \"range\",\n name: \"dateRange\",\n value: dateRange,\n max: 90,\n };\n\n return [dateRangeFilter] as any;\n }, [dateRange]);\n\n return {\n filterItems,\n onFilter,\n dateRange,\n filterDay,\n updateFilterDay,\n };\n};\n\nfunction isSameAddress(address1: string, address2: string) {\n return address1.toLowerCase() === address2.toLowerCase();\n}\n\nexport function getRowKey(address: string) {\n return `current-address-${address?.toLowerCase()}`;\n}\n","import { useEffect, useRef, MutableRefObject } from \"react\";\n\n/**\n * Listen for the specified element to scroll to the bottom\n */\nexport function useEndReached(\n sentinelRef: MutableRefObject<HTMLDivElement | null>,\n onEndReached?: () => void\n) {\n const observer = useRef<IntersectionObserver>();\n const cb = useRef(onEndReached);\n\n cb.current = onEndReached;\n\n useEffect(() => {\n const options: IntersectionObserverInit = {\n root: null,\n rootMargin: \"0px\",\n threshold: 0,\n };\n\n const handleObserver = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n cb.current?.();\n }\n });\n };\n\n observer.current = new IntersectionObserver(handleObserver, options);\n\n return () => {\n observer.current?.disconnect();\n };\n }, []);\n\n useEffect(() => {\n if (sentinelRef.current) {\n observer.current?.observe(sentinelRef.current);\n }\n }, [sentinelRef.current]);\n}\n","import { FC, SVGProps } from \"react\";\nimport {\n Box,\n CloseCircleFillIcon,\n cn,\n DataFilter,\n DataTable,\n Flex,\n Input,\n Text,\n} from \"@orderly.network/ui\";\nimport {\n FilterDays,\n getRowKey,\n TradingData,\n TradingListScriptReturn,\n} from \"./tradingList.script\";\nimport { useTradingListColumns } from \"./column\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport type TradingListProps = {\n style?: React.CSSProperties;\n className?: string;\n} & TradingListScriptReturn;\n\nexport const TradingList: FC<TradingListProps> = (props) => {\n const column = useTradingListColumns();\n const { t } = useTranslation();\n\n return (\n <Flex\n direction=\"column\"\n width=\"100%\"\n itemAlign=\"start\"\n intensity={900}\n r=\"2xl\"\n px={4}\n style={props.style}\n className={cn(\"oui-trading-leaderboard-trading-list\", props.className)}\n >\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n mt={2}\n className={cn(\n \"oui-trading-leaderboard-trading-filter\",\n \"oui-border-b oui-border-line\"\n )}\n >\n <Flex gap={3}>\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[53px] oui-border-none\"\n />\n )}\n {FilterDays.map((value) => {\n return (\n <button\n className=\"oui-relative oui-px-2 oui-py-[2px] oui-text-sm\"\n key={value}\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={props.filterDay === value ? \"brand\" : undefined}\n className={\n props.filterDay !== value\n ? \"oui-text-base-contrast-54\"\n : \"\"\n }\n >\n {`${value}D`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-gradient-primary oui-opacity-[.12] oui-absolute oui-left-0 oui-right-0 oui-top-0 oui-bottom-0 oui-rounded\"\n onClick={() => {\n props.updateFilterDay(value as any);\n }}\n ></div>\n </button>\n );\n })}\n </Flex>\n {props.canTrade && (\n <Input\n value={props.searchValue}\n onValueChange={props.onSearchValueChange}\n placeholder={t(\"common.address.search.placeholder\")}\n className={cn(\n \"oui-trading-leaderboard-trading-search-input\",\n \"oui-w-[240px]\"\n )}\n size=\"sm\"\n prefix={\n <Box pl={3} pr={1}>\n <SearchIcon className=\"oui-text-base-contrast-36\" />\n </Box>\n }\n suffix={\n props.searchValue && (\n <Box mr={2}>\n <CloseCircleFillIcon\n size={14}\n className=\"oui-text-base-contrast-36 oui-cursor-pointer =\"\n onClick={props.clearSearchValue}\n />\n </Box>\n )\n }\n autoComplete=\"off\"\n />\n )}\n </Flex>\n\n <DataTable\n loading={props.isLoading}\n id=\"oui-trading-leaderboard-trading-table\"\n columns={column}\n initialSort={props.initialSort}\n onSort={props.onSort}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record: TradingData) => record.key || record.address}\n manualPagination\n manualSorting\n pagination={props.pagination}\n classNames={{\n root: \"!oui-h-[calc(100%_-_53px_-_8px)]\",\n }}\n onRow={(record, index) => {\n return {\n className: cn(\"oui-h-[48px]\"),\n };\n }}\n onCell={(column, record, index) => {\n if (record.key === getRowKey(props.address!)) {\n const isFirst = column.getIsFirstColumn();\n const isLast = column.getIsLastColumn();\n\n return {\n className: cn(\n \"after:oui-absolute after:oui-w-full after:oui-h-[48px]\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \"after:oui-top-0 after:oui-left-0 after:oui-z-[-1]\",\n \"after:oui-border-b after:oui-border-t\",\n isFirst && \"after:oui-border-l after:oui-rounded-l-lg\",\n isLast && \"after:oui-border-r after:oui-rounded-r-lg\"\n ),\n };\n }\n return {};\n }}\n />\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { Text, Column, Box, useScreen } from \"@orderly.network/ui\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport const useTradingListColumns = () => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n return [\n {\n title: t(\"tradingLeaderboard.rank\"),\n dataIndex: \"rank\",\n width: 40,\n render: (value: number) => {\n return (\n <Box width={20} className=\"oui-text-center\">\n {value}\n </Box>\n );\n },\n },\n {\n title: t(\"common.address\"),\n dataIndex: \"address\",\n render: (value: string) => {\n return <Text.formatted rule=\"address\">{value}</Text.formatted>;\n },\n width: 90,\n },\n {\n title: t(\"tradingLeaderboard.tradingVolume\"),\n dataIndex: \"perp_volume\",\n onSort: true,\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2}>\n {value}\n </Text.numeral>\n );\n },\n width: 105,\n },\n {\n title: t(\"common.realizedPnl\"),\n dataIndex: \"realized_pnl\",\n onSort: true,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2} coloring>\n {value}\n </Text.numeral>\n );\n },\n width: 90,\n },\n ] as Column[];\n};\n","import { FC, SVGProps } from \"react\";\nimport { cn, DataFilter, DataTable, Flex, Spinner } from \"@orderly.network/ui\";\nimport { useTradingListColumns } from \"./column\";\nimport {\n getRowKey,\n TradingData,\n TradingListScriptReturn,\n} from \"./tradingList.script\";\n\nexport type TradingListProps = {\n style?: React.CSSProperties;\n className?: string;\n} & TradingListScriptReturn;\n\nexport const MobileTradingList: FC<TradingListProps> = (props) => {\n const column = useTradingListColumns();\n\n return (\n <Flex\n direction=\"column\"\n width=\"100%\"\n itemAlign=\"start\"\n intensity={900}\n r=\"2xl\"\n px={4}\n style={props.style}\n className={cn(\n \"oui-mobile-trading-leaderboard-trading-list\",\n props.className,\n )}\n >\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n className={cn(\"oui-mobile-trading-leaderboard-trading-filter\")}\n >\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[40px] oui-border-none\"\n />\n )}\n </Flex>\n\n <DataTable\n classNames={{\n root: \"oui-pb-4\",\n body: \"oui-text-2xs\",\n scroll: \"oui-overflow-y-hidden oui-h-full\",\n }}\n loading={props.isLoading}\n id=\"oui-trading-leaderboard-trading-table\"\n columns={column}\n initialSort={props.initialSort}\n onSort={props.onSort}\n dataSource={props.dataList}\n generatedRowKey={(record: TradingData) => record.key || record.address}\n manualPagination\n manualSorting\n onRow={(record, index) => {\n return {\n className: cn(\"oui-h-[30px]\"),\n };\n }}\n onCell={(column, record, index) => {\n if (record.key === getRowKey(props.address!)) {\n const isFirst = column.getIsFirstColumn();\n const isLast = column.getIsLastColumn();\n\n return {\n className: cn(\n \"after:oui-absolute after:oui-w-full after:oui-h-[30px]\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \" after:oui-top-0 after:oui-left-0 after:oui-z-[-1]\",\n \"after:oui-border-b after:oui-border-t\",\n isFirst && \"after:oui-border-l after:oui-rounded-l-lg\",\n isLast && \"after:oui-border-r after:oui-rounded-r-lg\",\n ),\n };\n }\n return {};\n }}\n />\n <div\n ref={props.sentinelRef}\n className=\"oui-relative oui-invisible oui-h-[1px] oui-top-[-300px]\"\n />\n {props.isLoading && props.dataList.length > 0 && (\n <Flex itemAlign=\"center\" justify=\"center\" width=\"100%\" height={40}>\n <Spinner size=\"sm\" />\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { FC } from \"react\";\nimport { useTradingListScript } from \"./tradingList.script\";\nimport { TradingList, TradingListProps } from \"./tradingList.ui\";\nimport { MobileTradingList } from \"./tradingList.mobile.ui\";\n\nexport type TradingListWidgetProps = Pick<\n TradingListProps,\n \"style\" | \"className\"\n>;\n\nexport const TradingListWidget: FC<TradingListWidgetProps> = (props) => {\n const state = useTradingListScript();\n if (state.isMobile) {\n return <MobileTradingList {...state} {...props} />;\n }\n return <TradingList {...state} {...props} />;\n};\n","import { useMemo } from \"react\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { Campaign } from \"../../components/provider\";\n\nexport type LeaderboardScriptReturn = ReturnType<typeof useLeaderboardScript>;\n\nexport type LeaderboardScriptOptions = {\n backgroundSrc?: string;\n campaigns?: Campaign[];\n};\n\nfunction isVideoSrc(src?: string) {\n const extension = src?.split(\".\").pop();\n return [\"mp4\", \"webm\", \"avi\", \"ogg\"].includes(extension ?? \"\");\n}\n\nexport function useLeaderboardScript(options: LeaderboardScriptOptions) {\n const { backgroundSrc, campaigns = [] } = options;\n const { isMobile } = useScreen();\n\n const showCampaigns = useMemo(() => campaigns?.length > 0, [campaigns]);\n\n const isVideo = useMemo(() => {\n return isVideoSrc(backgroundSrc);\n }, [backgroundSrc]);\n\n return {\n backgroundSrc,\n isVideo,\n showCampaigns,\n isMobile,\n };\n}\n","import { FC } from \"react\";\nimport { cn, Flex } from \"@orderly.network/ui\";\nimport { TradingListWidget } from \"../../components/tradingList/widget\";\nimport { CampaignsWidget } from \"../../components/campaigns\";\nimport { LeaderboardScriptReturn } from \"./leaderboard.script\";\n\nexport type LeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n} & LeaderboardScriptReturn;\n\nexport const Leaderboard: FC<LeaderboardProps> = (props) => {\n const renderBackground = () => {\n const linearGradient =\n \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n if (props.isVideo) {\n return (\n <div\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\"\n )}\n >\n <div\n style={{\n backgroundImage: linearGradient,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\"\n )}\n />\n <video\n autoPlay\n loop\n muted\n className={cn(\n // rest style\n \"oui-border-none oui-outline-none oui-bg-transparent\",\n \"oui-w-full oui-h-full\",\n // \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-object-cover\",\n \"oui-opacity-50\"\n )}\n >\n <source src={props.backgroundSrc} type=\"video/mp4\" />\n <source src={props.backgroundSrc} type=\"video/webm\" />\n <source src={props.backgroundSrc} type=\"video/ogg\" />\n <source src={props.backgroundSrc} type=\"video/avi\" />\n Your browser does not support the video tag.\n </video>\n </div>\n );\n }\n\n if (props.backgroundSrc) {\n return (\n <div\n style={{\n backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\",\n \"oui-opacity-50\"\n )}\n />\n );\n }\n };\n\n return (\n <div\n style={props.style}\n className={cn(\"oui-h-full oui-mix-blend-screen\", props.className)}\n >\n {renderBackground()}\n <Flex\n direction=\"column\"\n gapY={5}\n height=\"100%\"\n className={cn(\n \"oui-trading-leaderboard oui-relative\",\n \"oui-max-w-[1040px] oui-px-3 oui-mx-auto \"\n )}\n >\n {props.showCampaigns && <CampaignsWidget />}\n <TradingListWidget\n className={cn(\n props.showCampaigns\n ? \"oui-h-[calc(100%_-_288px_-_20px)]\"\n : \"oui-h-full\"\n )}\n />\n </Flex>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { cn, Flex } from \"@orderly.network/ui\";\nimport { CampaignsWidget } from \"../../components/campaigns\";\nimport { TradingListWidget } from \"../../components/tradingList/widget\";\nimport { LeaderboardScriptReturn } from \"./leaderboard.script\";\n\nexport type LeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n} & LeaderboardScriptReturn;\n\nexport const MobileLeaderboardWidget: FC<LeaderboardProps> = (props) => {\n // const renderBackground = () => {\n // const linearGradient =\n // \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n // if (props.isVideo) {\n // return (\n // <div\n // className={cn(\"oui-absolute oui-left-0 oui-top-0\", \"oui-size-full\")}\n // >\n // <div\n // style={{\n // backgroundImage: linearGradient,\n // backgroundSize: \"cover\",\n // backgroundRepeat: \"no-repeat\",\n // }}\n // className={cn(\"oui-absolute oui-left-0 oui-top-0\", \"oui-size-full\")}\n // />\n // <video\n // playsInline\n // // eslint-disable-next-line react/no-unknown-property\n // webkit-playsinline // need to use this prop to ban full screen in iphone\n // autoPlay\n // loop\n // muted\n // className={cn(\n // // rest style\n // \"oui-pointer-events-none oui-border-none oui-bg-transparent oui-outline-none\",\n // \"oui-size-full\",\n // // \"oui-absolute oui-top-0 oui-left-0\",\n // \"oui-object-cover\",\n // \"oui-opacity-50\",\n // )}\n // // ref={(video) => {\n // // if (video) {\n // // video.setAttribute(\"playsinline\", \"true\");\n // // video.setAttribute(\"webkit-playsinline\", \"true\");\n // // }\n // // }}\n // >\n // <source src={props.backgroundSrc} type=\"video/mp4\" />\n // <source src={props.backgroundSrc} type=\"video/webm\" />\n // <source src={props.backgroundSrc} type=\"video/ogg\" />\n // <source src={props.backgroundSrc} type=\"video/avi\" />\n // Your browser does not support the video tag.\n // </video>\n // </div>\n // );\n // }\n\n // if (props.backgroundSrc) {\n // return (\n // <div\n // style={{\n // backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n // backgroundSize: \"cover\",\n // backgroundRepeat: \"no-repeat\",\n // }}\n // className={cn(\n // \"oui-absolute oui-left-0 oui-top-0\",\n // \"oui-size-full\",\n // \"oui-opacity-50\",\n // )}\n // />\n // );\n // }\n // };\n return (\n <div\n style={{\n paddingBottom: \"calc(64px + env(safe-area-inset-bottom))\",\n }}\n className={cn(\n \"oui-relative oui-grid oui-h-[calc(100vh-44px)] oui-gap-1 oui-bg-base-10\",\n \"oui-mix-blend-screen\",\n props.className,\n )}\n >\n {/* {renderBackground()} */}\n <Flex\n direction=\"column\"\n gapY={3}\n height=\"100%\"\n px={3}\n pt={3}\n pb={3}\n className={cn(\n \"oui-trading-leaderboard-mobile oui-custom-scrollbar oui-overflow-y-auto\",\n \"oui-relative oui-h-[calc(100vh_-_64px)]\",\n )}\n >\n {props.showCampaigns && <CampaignsWidget />}\n <TradingListWidget />\n </Flex>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { useLeaderboardScript } from \"./leaderboard.script\";\nimport { Leaderboard, LeaderboardProps } from \"./leaderboard.ui\";\nimport {\n TradingLeaderboardProvider,\n TradingLeaderboardProviderProps,\n} from \"../../components/provider\";\nimport { MobileLeaderboardWidget } from \"./leaderboard.mobile.ui\";\n\nexport type LeaderboardWidgetProps = TradingLeaderboardProviderProps &\n Pick<LeaderboardProps, \"style\" | \"className\">;\n\nexport const LeaderboardWidget: FC<LeaderboardWidgetProps> = (props) => {\n const state = useLeaderboardScript({\n backgroundSrc: props.backgroundSrc,\n campaigns: props.campaigns,\n });\n\n return (\n <TradingLeaderboardProvider campaigns={props.campaigns} href={props.href}>\n {state.isMobile ? (\n <MobileLeaderboardWidget {...state} />\n ) : (\n <Leaderboard\n {...state}\n className={props.className}\n style={props.style}\n />\n )}\n </TradingLeaderboardProvider>\n );\n};\n"]}
package/dist/styles.css CHANGED
@@ -1 +1 @@
1
- .oui-custom-scrollbar::-webkit-scrollbar{height:6px;width:6px}.oui-custom-scrollbar::-webkit-scrollbar-track{background-color:transparent;border-radius:4px;padding-top:20px}.oui-custom-scrollbar::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:rgb(var(--oui-color-base-7));border:1px dashed transparent;border-radius:3px}.oui-custom-scrollbar::-webkit-scrollbar-thumb:hover{background:rgb(var(--oui-color-base-5));border-radius:3px}.oui-custom-scrollbar::-webkit-scrollbar-corner{background-color:transparent}.oui-pointer-events-none{pointer-events:none}.oui-invisible{visibility:hidden}.oui-fixed{position:fixed}.oui-absolute{position:absolute}.oui-relative{position:relative}.oui-bottom-0{bottom:0}.oui-left-0{left:0}.oui-right-0{right:0}.oui-top-0{top:0}.oui-top-\[-300px\]{top:-300px}.oui-z-10{z-index:10}.oui-mx-auto{margin-left:auto;margin-right:auto}.oui-grid{display:grid}.\!oui-h-\[calc\(100\%_-_53px_-_8px\)\]{height:calc(100% - 61px)!important}.oui-h-\[1px\]{height:1px}.oui-h-\[200px\]{height:200px}.oui-h-\[30px\]{height:30px}.oui-h-\[40px\]{height:40px}.oui-h-\[48px\]{height:48px}.oui-h-\[53px\]{height:53px}.oui-h-\[calc\(\(100vw-48px\)\/2\)\]{height:calc(50vw - 24px)}.oui-h-\[calc\(100\%_-_288px_-_20px\)\]{height:calc(100% - 308px)}.oui-h-\[calc\(100vh_-_64px\)\]{height:calc(100vh - 64px)}.oui-h-full{height:100%}.oui-h-screen{height:100vh}.oui-w-\[--radix-select-content-available-width\]{width:var(--radix-select-content-available-width)}.oui-w-\[240px\]{width:240px}.oui-w-\[400px\]{width:400px}.oui-w-full{width:100%}.oui-min-w-0{min-width:0}.oui-max-w-\[1040px\]{max-width:1040px}.oui-flex-1{flex:1 1 0%}.oui-flex-\[0_0_100\%\]{flex:0 0 100%}.oui-cursor-pointer{cursor:pointer}.oui-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.oui-grid-rows-\[auto\,1fr\,auto\]{grid-template-rows:auto 1fr auto}.oui-gap-1{gap:.25rem}.oui-overflow-hidden{overflow:hidden}.oui-overflow-y-auto{overflow-y:auto}.oui-overflow-y-hidden{overflow-y:hidden}.oui-rounded{border-radius:var(--oui-rounded,.25rem)}.oui-rounded-\[20px\]{border-radius:20px}.oui-rounded-l-xl{border-bottom-left-radius:var(--oui-rounded-xl,.75rem)}.oui-rounded-l-xl,.oui-rounded-t-xl{border-top-left-radius:var(--oui-rounded-xl,.75rem)}.oui-rounded-t-xl{border-top-right-radius:var(--oui-rounded-xl,.75rem)}.oui-border-b{border-bottom-width:1px}.oui-border-none{border-style:none}.oui-border-line{border-color:rgb(var(--oui-color-line,255 255 255)/.08)}.oui-bg-base-10{--tw-bg-opacity:1;background-color:rgb(var(--oui-color-base-10)/var(--tw-bg-opacity))}.oui-bg-line{background-color:rgb(var(--oui-color-line,255 255 255)/.08)}.oui-bg-primary{--tw-bg-opacity:1;background-color:rgb(var(--oui-color-primary)/var(--tw-bg-opacity))}.oui-bg-transparent{background-color:transparent}.oui-object-cover{-o-object-fit:cover;object-fit:cover}.oui-object-fill{-o-object-fit:fill;object-fit:fill}.oui-px-2{padding-left:.5rem;padding-right:.5rem}.oui-px-3{padding-left:.75rem;padding-right:.75rem}.oui-py-\[2px\]{padding-bottom:2px;padding-top:2px}.oui-pb-4{padding-bottom:1rem}.oui-pr-1{padding-right:.25rem}.oui-pr-1\.5{padding-right:.375rem}.oui-text-center{text-align:center}.oui-text-2xs{font-size:var(--oui-font-size-2xs,.75rem);line-height:1.125rem}.oui-text-sm{font-size:var(--oui-font-size-sm,.875rem);line-height:1.25rem}.oui-font-semibold{font-weight:600}.oui-text-base-contrast-36{color:rgb(var(--oui-color-base-foreground)/.36)}.oui-text-base-contrast-54{color:rgb(var(--oui-color-base-foreground)/.54)}.oui-opacity-50{opacity:.5}.oui-opacity-\[\.12\]{opacity:.12}.oui-mix-blend-screen{mix-blend-mode:screen}.oui-outline-none{outline:2px solid transparent;outline-offset:2px}.oui-transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.oui-duration-300{transition-duration:.3s}.oui-gradient-primary{background-image:linear-gradient(var(--oui-gradient-primary-angle,28.29deg),rgb(var(--oui-gradient-primary-start)) var(--oui-gradient-primary-stop-start,0),rgb(var(--oui-gradient-primary-end)) var(--oui-gradient-primary-stop-end,100%))}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.oui-duration-300{animation-duration:.3s}.after\:oui-absolute:after{content:var(--tw-content);position:absolute}.after\:oui-left-0:after{content:var(--tw-content);left:0}.after\:oui-top-0:after{content:var(--tw-content);top:0}.after\:oui-z-\[-1\]:after{content:var(--tw-content);z-index:-1}.after\:oui-h-\[30px\]:after{content:var(--tw-content);height:30px}.after\:oui-h-\[48px\]:after{content:var(--tw-content);height:48px}.after\:oui-w-full:after{content:var(--tw-content);width:100%}.after\:oui-rounded-l-lg:after{border-bottom-left-radius:var(--oui-rounded-lg,.5rem);border-top-left-radius:var(--oui-rounded-lg,.5rem);content:var(--tw-content)}.after\:oui-rounded-r-lg:after{border-bottom-right-radius:var(--oui-rounded-lg,.5rem);border-top-right-radius:var(--oui-rounded-lg,.5rem);content:var(--tw-content)}.after\:oui-border-b:after{border-bottom-width:1px;content:var(--tw-content)}.after\:oui-border-l:after{border-left-width:1px;content:var(--tw-content)}.after\:oui-border-r:after{border-right-width:1px;content:var(--tw-content)}.after\:oui-border-t:after{border-top-width:1px;content:var(--tw-content)}.after\:oui-border-\[rgb\(var\(--oui-gradient-brand-start\)\)\]:after{border-color:rgb(var(--oui-gradient-brand-start));content:var(--tw-content)}
1
+ .oui-custom-scrollbar::-webkit-scrollbar{height:6px;width:6px}.oui-custom-scrollbar::-webkit-scrollbar-track{background-color:transparent;border-radius:4px;padding-top:20px}.oui-custom-scrollbar::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:rgb(var(--oui-color-base-7));border:1px dashed transparent;border-radius:3px}.oui-custom-scrollbar::-webkit-scrollbar-thumb:hover{background:rgb(var(--oui-color-base-5));border-radius:3px}.oui-custom-scrollbar::-webkit-scrollbar-corner{background-color:transparent}.oui-pointer-events-none{pointer-events:none}.oui-invisible{visibility:hidden}.oui-absolute{position:absolute}.oui-relative{position:relative}.oui-bottom-0{bottom:0}.oui-left-0{left:0}.oui-right-0{right:0}.oui-top-0{top:0}.oui-top-\[-300px\]{top:-300px}.oui-z-10{z-index:10}.oui-mx-auto{margin-left:auto;margin-right:auto}.oui-grid{display:grid}.oui-size-full{height:100%;width:100%}.\!oui-h-\[calc\(100\%_-_53px_-_8px\)\]{height:calc(100% - 61px)!important}.oui-h-\[1px\]{height:1px}.oui-h-\[200px\]{height:200px}.oui-h-\[30px\]{height:30px}.oui-h-\[40px\]{height:40px}.oui-h-\[48px\]{height:48px}.oui-h-\[53px\]{height:53px}.oui-h-\[calc\(\(100vw-48px\)\/2\)\]{height:calc(50vw - 24px)}.oui-h-\[calc\(100\%_-_288px_-_20px\)\]{height:calc(100% - 308px)}.oui-h-\[calc\(100vh-44px\)\]{height:calc(100vh - 44px)}.oui-h-\[calc\(100vh_-_64px\)\]{height:calc(100vh - 64px)}.oui-h-full{height:100%}.oui-w-\[--radix-select-content-available-width\]{width:var(--radix-select-content-available-width)}.oui-w-\[240px\]{width:240px}.oui-w-\[400px\]{width:400px}.oui-w-full{width:100%}.oui-min-w-0{min-width:0}.oui-max-w-\[1040px\]{max-width:1040px}.oui-flex-1{flex:1 1 0%}.oui-flex-\[0_0_100\%\]{flex:0 0 100%}.oui-cursor-pointer{cursor:pointer}.oui-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.oui-gap-1{gap:.25rem}.oui-overflow-hidden{overflow:hidden}.oui-overflow-y-auto{overflow-y:auto}.oui-overflow-y-hidden{overflow-y:hidden}.oui-rounded{border-radius:var(--oui-rounded,.25rem)}.oui-rounded-\[20px\]{border-radius:20px}.oui-rounded-l-xl{border-bottom-left-radius:var(--oui-rounded-xl,.75rem)}.oui-rounded-l-xl,.oui-rounded-t-xl{border-top-left-radius:var(--oui-rounded-xl,.75rem)}.oui-rounded-t-xl{border-top-right-radius:var(--oui-rounded-xl,.75rem)}.oui-border-b{border-bottom-width:1px}.oui-border-none{border-style:none}.oui-border-line{border-color:rgb(var(--oui-color-line,255 255 255)/.08)}.oui-bg-base-10{--tw-bg-opacity:1;background-color:rgb(var(--oui-color-base-10)/var(--tw-bg-opacity,1))}.oui-bg-line{background-color:rgb(var(--oui-color-line,255 255 255)/.08)}.oui-bg-primary{--tw-bg-opacity:1;background-color:rgb(var(--oui-color-primary)/var(--tw-bg-opacity,1))}.oui-bg-transparent{background-color:transparent}.oui-object-cover{-o-object-fit:cover;object-fit:cover}.oui-object-fill{-o-object-fit:fill;object-fit:fill}.oui-px-2{padding-left:.5rem;padding-right:.5rem}.oui-px-3{padding-left:.75rem;padding-right:.75rem}.oui-py-\[2px\]{padding-bottom:2px;padding-top:2px}.oui-pb-4{padding-bottom:1rem}.oui-pr-1\.5{padding-right:.375rem}.oui-text-center{text-align:center}.oui-text-2xs{font-size:var(--oui-font-size-2xs,.75rem);line-height:1.125rem}.oui-text-sm{font-size:var(--oui-font-size-sm,.875rem);line-height:1.25rem}.oui-font-semibold{font-weight:600}.oui-text-base-contrast-36{color:rgb(var(--oui-color-base-foreground)/.36)}.oui-text-base-contrast-54{color:rgb(var(--oui-color-base-foreground)/.54)}.oui-opacity-50{opacity:.5}.oui-opacity-\[\.12\]{opacity:.12}.oui-mix-blend-screen{mix-blend-mode:screen}.oui-outline-none{outline:2px solid transparent;outline-offset:2px}.oui-transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.oui-duration-300{transition-duration:.3s}.oui-gradient-primary{background-image:linear-gradient(var(--oui-gradient-primary-angle,28.29deg),rgb(var(--oui-gradient-primary-start)) var(--oui-gradient-primary-stop-start,0),rgb(var(--oui-gradient-primary-end)) var(--oui-gradient-primary-stop-end,100%))}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.oui-duration-300{animation-duration:.3s}.after\:oui-absolute:after{content:var(--tw-content);position:absolute}.after\:oui-left-0:after{content:var(--tw-content);left:0}.after\:oui-top-0:after{content:var(--tw-content);top:0}.after\:oui-z-\[-1\]:after{content:var(--tw-content);z-index:-1}.after\:oui-h-\[30px\]:after{content:var(--tw-content);height:30px}.after\:oui-h-\[48px\]:after{content:var(--tw-content);height:48px}.after\:oui-w-full:after{content:var(--tw-content);width:100%}.after\:oui-rounded-l-lg:after{border-bottom-left-radius:var(--oui-rounded-lg,.5rem);border-top-left-radius:var(--oui-rounded-lg,.5rem);content:var(--tw-content)}.after\:oui-rounded-r-lg:after{border-bottom-right-radius:var(--oui-rounded-lg,.5rem);border-top-right-radius:var(--oui-rounded-lg,.5rem);content:var(--tw-content)}.after\:oui-border-b:after{border-bottom-width:1px;content:var(--tw-content)}.after\:oui-border-l:after{border-left-width:1px;content:var(--tw-content)}.after\:oui-border-r:after{border-right-width:1px;content:var(--tw-content)}.after\:oui-border-t:after{border-top-width:1px;content:var(--tw-content)}.after\:oui-border-\[rgb\(var\(--oui-gradient-brand-start\)\)\]:after{border-color:rgb(var(--oui-gradient-brand-start));content:var(--tw-content)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderly.network/trading-leaderboard",
3
- "version": "2.1.3",
3
+ "version": "2.2.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -15,14 +15,14 @@
15
15
  "dependencies": {
16
16
  "embla-carousel-react": "^8.2.0",
17
17
  "date-fns": "^3.6.0",
18
- "@orderly.network/ui": "2.1.3",
19
- "@orderly.network/hooks": "2.1.3",
20
- "@orderly.network/utils": "2.1.3",
21
- "@orderly.network/types": "2.1.3",
22
- "@orderly.network/ui-connector": "2.1.3",
23
- "@orderly.network/i18n": "2.1.3",
24
- "@orderly.network/react-app": "2.1.3",
25
- "@orderly.network/trading": "2.1.3"
18
+ "@orderly.network/ui": "2.2.0",
19
+ "@orderly.network/utils": "2.2.0",
20
+ "@orderly.network/hooks": "2.2.0",
21
+ "@orderly.network/types": "2.2.0",
22
+ "@orderly.network/ui-connector": "2.2.0",
23
+ "@orderly.network/react-app": "2.2.0",
24
+ "@orderly.network/trading": "2.2.0",
25
+ "@orderly.network/i18n": "2.2.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@babel/core": "^7.22.9",
@@ -35,7 +35,7 @@
35
35
  "tailwindcss": "^3.4.4",
36
36
  "tsup": "^7.1.0",
37
37
  "typescript": "^5.1.6",
38
- "tsconfig": "0.4.3"
38
+ "tsconfig": "0.5.0"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "react": ">=18",