@liberfi.io/ui-channels 0.1.9 → 0.1.21
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/client/index.d.mts +3 -1
- package/dist/client/index.d.ts +3 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +1 -1
- package/dist/client/index.mjs.map +1 -1
- package/dist/index.d.mts +967 -4
- package/dist/index.d.ts +967 -4
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/context/ChannelsContext.tsx","../src/hooks/useChannelsContext.ts","../src/hooks/useChannelsClient.ts","../src/hooks/useChannelEventsQuery.ts","../src/hooks/useChannelEventsInfiniteQuery.ts","../src/hooks/useChannelQuery.ts","../src/hooks/useChannelsListQuery.ts","../src/hooks/useChannelSourcesQuery.ts","../src/hooks/useCreateChannelMutation.ts","../src/hooks/useMyChannelsListQuery.ts","../src/hooks/useSubscribeChannelMutation.ts","../src/hooks/useSubscribedChannelsListQuery.ts","../src/hooks/useUnsubscribeChannelMutation.ts","../src/hooks/useUpdateChannelMutation.ts","../src/hooks/useUpdateChannelSourcesMutation.ts","../src/hooks/useUpload.ts","../src/types/form.ts","../src/components/channel-form/base-form.ui.tsx","../src/components/channel-form/create-channel.widget.tsx","../src/components/channel-form/update-base-form.script.tsx","../src/components/channel-form/socials/telegram-form.ui.tsx","../src/components/channel-form/socials-form.ui.tsx","../src/utils.ts","../src/components/channel-form/wallets-list.ui.tsx","../src/components/channel-form/wallets-form.ui.tsx","../src/components/channel-form/update-channel-form.ui.tsx","../src/components/channel-form/update-channel-form-skeletons.tsx","../src/components/channel-form/update-wallets-form.script.tsx","../src/components/channel-form/update-channel.widget.tsx","../src/components/channel/channel-attributes.tsx","../src/components/channel/channel-baseinfo.tsx","../src/components/channel/channel-edit-button.tsx","../src/components/channel/channel-stats.tsx","../src/components/channel/channel-subscribe-button.tsx","../src/components/channels/channels-item.ui.tsx","../src/components/channels/channels.ui.tsx","../src/components/channels/channels-skeleton.ui.tsx","../src/components/channels/channels-empty.ui.tsx","../src/components/channels/trending-channels.script.tsx","../src/components/channels/trending-channels.widget.tsx","../src/components/channels/channels-unauthenticated.ui.tsx","../src/components/channels/subscribed-channels.widget.tsx","../src/components/channels/subscribed-channels.script.tsx","../src/components/channels/my-channels.widget.tsx","../src/components/channels/my-channels.script.tsx","../src/components/channel-detail/channel-detail.ui.tsx","../src/components/events/wallet-trade.tsx","../src/components/events/channel-events.ui.tsx","../src/components/events/channel-events.script.tsx","../src/components/events/channel-events-tokens.script.tsx","../src/components/channel-detail/channel-detail-notfound.tsx","../src/components/channel-detail/channel-detail-skeletons.tsx","../src/components/channel-detail/channel-detail.script.tsx","../src/components/channel-detail/channel-wallets.script.tsx","../src/components/channel-detail/channel-detail.widget.tsx","../src/components/channels-home.page.tsx","../src/components/channels-detail.page.tsx","../src/providers/ChannelsProvider.tsx"],"names":["version_default","ChannelsContext","createContext","useChannelsContext","context","useContext","useChannelsClient","client","channelEventsQueryKey","channelId","params","fetchChannelEvents","useChannelEventsQuery","options","useQuery","channelEventsInfiniteQueryKey","useChannelEventsInfiniteQuery","useInfiniteQuery","pageParam","lastPage","_allPages","lastPageParam","channelQueryKey","id","fetchChannel","useChannelQuery","channelsListQueryKey","fetchChannelsList","chainSlug","useChannelsListQuery","channelSourcesQueryKey","fetchChannelSources","useChannelSourcesQuery","createChannel","chain","useCreateChannelMutation","useMutation","myChannelsListQueryKey","fetchMyChannelsList","useMyChannelsListQuery","subscribeChannel","useSubscribeChannelMutation","queryClient","useQueryClient","data","variables","onMutateResult","subscribedChannelsListQueryKey","fetchSubscribedChannelsList","useSubscribedChannelsListQuery","unsubscribeChannel","useUnsubscribeChannelMutation","updateChannel","useUpdateChannelMutation","updateChannelSources","useUpdateChannelSourcesMutation","useUpload","pinata","usePinata","useDexClient","useCallback","file","signedURL","fetchPresignedUploadUrl","res","baseFormSchema","z","walletSchema","walletsFormSchema","BaseFormUI","isSubmitting","onSubmit","defaultValues","submitLabel","t","useTranslation","formMethods","useForm","zodResolver","upload","jsxs","RHForm","jsx","RHInput","RHTextArea","RHUpload","Button","CreateChannelWidget","onSuccess","onError","createAsync","isPending","useAuthCallback","channel","Chain","toast","error","useUpdateBaseForm","isLoading","mutateAsync","useMemo","submit","TelegramFormUI","sink","onSaveToken","token","setToken","useState","useEffect","StyledInput","SocialsFormUI","socialType","setSocialType","StyledTabs","Tab","TelegramIcon","parseWalletsText","value","line","address","alias","WalletsListUI","wallets","copy","useCopyToClipboard","handleDelete","wallet","formValues","w","search","setSearch","debouncedSetSearch","debounce","filteredWallets","SearchIcon","StyledTable","TableHeader","TableColumn","TableBody","EmptyIcon","TableRow","TableCell","shortAddress","CopyIcon","TrashIcon","formSchema","WalletsFormUI","walletsFormValues","it","setError","reset","validateWallets","walletsText","parsedWallets","duplicatedCount","uniqBy","alreadyAddedCount","intersectionBy","invalidCount","isValidWalletAddress","handleSubmit","HorizontalScrollContainer","StyledTooltip","Chip","UpdateChannelFormUI","type","baseFormDefaultValues","isSubmittingBaseForm","onSubmitBaseForm","baseFormSubmitLabel","isSubmittingWalletsForm","onSubmitWalletsForm","className","activeTab","setActiveTab","isMobile","useScreen","clsx","UpdateChannelFormSkeletons","Skeletons","Skeleton","useUpdateWalletsForm","UpdateChannelWidget","isLoadingBaseForm","submitBaseForm","isLoadingWalletsForm","submitWalletsForm","ChannelAttributes","updatedAge","useTickAge","WalletIcon","PeopleIcon","TimerIcon","formatAge","Link","TwitterIcon","DiscordIcon","ChannelBaseInfo","customActions","chainIconUrl","chainIcon","Avatar","ChannelEditButton","onEdit","user","useAuth","handleEdit","Fragment","StyledButton","EditIcon","ChannelStats","ChannelSubscribeButton","onSubscribeSuccess","onUnsubscribeSuccess","onSubscribeError","onUnsubscribeError","subscribed","setSubscribed","isSubscribing","isUnsubscribing","handleSubscribe","CheckIcon","PlusIcon","ChannelsItemUI","onSelect","headerActions","footerActions","handleSelect","ChannelsUI","channels","customHeaderActions","customFooterActions","ChannelsSkeletonUI","count","_","index","ChannelsEmptyUI","message","useTrendingChannels","status","result","refetch","TrendingChannelsWidget","channelList","ChannelsUnauthenticatedUI","signIn","SubscribedChannelsWidget","useSubscribedChannels","MyChannelsWidget","useMyChannels","ChannelDetailUI","WalletTradeEvent","event","walletAliases","tokens","age","quoteAddress","quoteSymbol","COMMON_TOKEN_SYMBOLS_MAP","baseAddress","baseSymbol","formatAmount","SafeBigNumber","formatPriceUSD","ChannelEventsUI","hasMore","onFetchMore","ref","useRef","height","useResizeObserver","isItemLoaded","loadMoreItems","itemCount","onRowsLoaded","useInfiniteLoader","Empty","List","Row","style","RowContent","props","useChannelEvents","historyData","others","latestData","historyEvents","page","newEvents","a","b","useChannelEventsTokens","events","setTokens","queriedAddresses","addresses","COMMON_TOKEN_ADDRESSES","fetchTokens","prev","next","ChannelDetailNotFound","ChannelDetailSkeletons","useChannelDetail","useChannelWallets","source","aliases","mapValues","keyBy","ChannelDetailWidget","isLoadingEvents","hasMoreEvents","fetchMoreEvents","ChannelsHomePage","onCreateChannel","onSelectChannel","ChannelsDetailPage","ChannelsProvider","children"],"mappings":"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","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-channels\"] = \"0.1.9\";\n}\n\nexport default \"0.1.9\";\n","import { createContext } from \"react\";\nimport { API } from \"@liberfi.io/types\";\n\nexport interface ChannelsContextValue {\n client: API.IChannelsClient;\n}\n\nexport const ChannelsContext = createContext<ChannelsContextValue>(\n {} as ChannelsContextValue,\n);\n","import { useContext } from \"react\";\nimport { ChannelsContext } from \"../context\";\n\nexport function useChannelsContext() {\n const context = useContext(ChannelsContext);\n if (!context) {\n throw new Error(\n \"useChannelsContext must be used within a ChannelsProvider\",\n );\n }\n return context;\n}\n","import { useChannelsContext } from \"./useChannelsContext\";\n\nexport function useChannelsClient() {\n const { client } = useChannelsContext();\n return client;\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { API, IChannelsClient } from \"@liberfi.io/types\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport type UseChannelEventsQueryParams = API.ListChannelEventsOptions;\n\nexport function channelEventsQueryKey(\n channelId: string,\n params: UseChannelEventsQueryParams,\n): string[] {\n return [\n \"channelEvents\",\n channelId,\n params.limit ? `${params.limit}` : \"\",\n params.timestamp ? `${params.timestamp}` : \"\",\n params.next_page ? `${params.next_page}` : \"\",\n ];\n}\n\nexport async function fetchChannelEvents(\n client: IChannelsClient,\n channelId: string,\n params: UseChannelEventsQueryParams,\n): Promise<API.ChannelEventsList> {\n return await client.getChannelEvents(channelId, params);\n}\n\nexport function useChannelEventsQuery(\n channelId: string,\n params: UseChannelEventsQueryParams = {},\n options: Omit<\n UseQueryOptions<\n API.ChannelEventsList,\n Error,\n API.ChannelEventsList,\n string[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: channelEventsQueryKey(channelId, params),\n queryFn: async () => fetchChannelEvents(client, channelId, params),\n ...options,\n });\n}\n","import {\n InfiniteData,\n useInfiniteQuery,\n UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport { API } from \"@liberfi.io/types\";\nimport {\n fetchChannelEvents,\n UseChannelEventsQueryParams,\n} from \"./useChannelEventsQuery\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport function channelEventsInfiniteQueryKey(channelId: string): string[] {\n return [\"channelEvents\", \"infinite\", channelId];\n}\n\nexport function useChannelEventsInfiniteQuery(\n channelId: string,\n params: UseChannelEventsQueryParams = {},\n options: Omit<\n UseInfiniteQueryOptions<\n API.ChannelEventsList,\n Error,\n InfiniteData<API.ChannelEventsList>,\n string[],\n UseChannelEventsQueryParams\n >,\n \"queryKey\" | \"queryFn\" | \"getNextPageParam\" | \"initialPageParam\"\n > = {},\n): ReturnType<typeof useInfiniteQuery<API.ChannelEventsList, Error>> {\n const client = useChannelsClient();\n return useInfiniteQuery({\n queryKey: channelEventsInfiniteQueryKey(channelId),\n queryFn: async ({ pageParam }) =>\n fetchChannelEvents(client, channelId, pageParam),\n initialPageParam: params,\n getNextPageParam: (lastPage, _allPages, lastPageParam) => {\n return lastPage.has_more\n ? {\n timestamp: lastPage.next_timestamp,\n next_page: lastPageParam.next_page,\n limit: lastPageParam.limit,\n }\n : undefined;\n },\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { Channel, IChannelsClient } from \"@liberfi.io/types\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport function channelQueryKey(id: string): string[] {\n return [\"channel\", id];\n}\n\nexport async function fetchChannel(\n client: IChannelsClient,\n id: string,\n): Promise<Channel> {\n return await client.get(id);\n}\n\nexport function useChannelQuery(\n id: string,\n options: Omit<\n UseQueryOptions<Channel, Error, Channel, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: channelQueryKey(id),\n queryFn: async () => fetchChannel(client, id),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { API, Chain, IChannelsClient } from \"@liberfi.io/types\";\nimport { chainSlug } from \"@liberfi.io/utils\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport interface UseChannelsListQueryParams\n extends Omit<API.ListChannelsOptions, \"chain\"> {\n chain?: Chain;\n}\n\nexport function channelsListQueryKey(\n params: UseChannelsListQueryParams,\n): string[] {\n return [\n \"channels\",\n params.chain ?? \"\",\n params.page ? `${params.page}` : \"\",\n params.size ? `${params.size}` : \"\",\n params.search ?? \"\",\n params.sort ?? \"\",\n params.order ?? \"\",\n ];\n}\n\nexport async function fetchChannelsList(\n client: IChannelsClient,\n params: UseChannelsListQueryParams,\n): Promise<API.ChannelsList> {\n const options: API.ListChannelsOptions = {\n ...params,\n chain: params.chain ? chainSlug(params.chain) : undefined,\n };\n return await client.getChannels(options);\n}\n\nexport function useChannelsListQuery(\n params: UseChannelsListQueryParams = {},\n options: Omit<\n UseQueryOptions<API.ChannelsList, Error, API.ChannelsList, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: channelsListQueryKey(params),\n queryFn: async () => fetchChannelsList(client, params),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { ChannelSource, IChannelsClient } from \"@liberfi.io/types\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport function channelSourcesQueryKey(channelId: string): string[] {\n return [\"channelSources\", channelId];\n}\n\nexport async function fetchChannelSources(\n client: IChannelsClient,\n channelId: string,\n): Promise<Array<ChannelSource>> {\n return await client.getSources(channelId);\n}\n\nexport function useChannelSourcesQuery(\n channelId: string,\n options: Omit<\n UseQueryOptions<\n Array<ChannelSource>,\n Error,\n Array<ChannelSource>,\n string[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: channelSourcesQueryKey(channelId),\n queryFn: async () => fetchChannelSources(client, channelId),\n ...options,\n });\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport { API, Chain, Channel, IChannelsClient } from \"@liberfi.io/types\";\nimport { chainSlug } from \"@liberfi.io/utils\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport interface UseCreateChannelMutationParams\n extends Omit<API.CreateChannelOptions, \"chain\"> {\n chain: Chain;\n}\n\nexport async function createChannel(\n client: IChannelsClient,\n params: UseCreateChannelMutationParams,\n): Promise<Channel> {\n const chain = chainSlug(params.chain);\n if (!chain) {\n throw new Error(\"Invalid chain\");\n }\n return client.create({ ...params, chain });\n}\n\nexport function useCreateChannelMutation(\n options: Omit<\n UseMutationOptions<\n Channel,\n Error,\n UseCreateChannelMutationParams,\n string[]\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useMutation({\n mutationFn: async (params: UseCreateChannelMutationParams) =>\n createChannel(client, params),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { API, Chain, IChannelsClient } from \"@liberfi.io/types\";\nimport { chainSlug } from \"@liberfi.io/utils\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport interface UseMyChannelsListQueryParams\n extends Omit<API.ListChannelsOptions, \"chain\"> {\n chain?: Chain;\n}\n\nexport function myChannelsListQueryKey(\n params: UseMyChannelsListQueryParams,\n): string[] {\n return [\n \"myChannels\",\n params.chain ?? \"\",\n params.page ? `${params.page}` : \"\",\n params.size ? `${params.size}` : \"\",\n params.search ?? \"\",\n params.sort ?? \"\",\n params.order ?? \"\",\n ];\n}\n\nexport async function fetchMyChannelsList(\n client: IChannelsClient,\n params: UseMyChannelsListQueryParams,\n): Promise<API.ChannelsList> {\n const options: API.ListChannelsOptions = {\n ...params,\n chain: params.chain ? chainSlug(params.chain) : undefined,\n };\n return await client.getMyChannels(options);\n}\n\nexport function useMyChannelsListQuery(\n params: UseMyChannelsListQueryParams = {},\n options: Omit<\n UseQueryOptions<API.ChannelsList, Error, API.ChannelsList, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: myChannelsListQueryKey(params),\n queryFn: async () => fetchMyChannelsList(client, params),\n ...options,\n });\n}\n","import {\n useMutation,\n UseMutationOptions,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { IChannelsClient } from \"@liberfi.io/types\";\nimport { channelQueryKey } from \"./useChannelQuery\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport async function subscribeChannel(\n client: IChannelsClient,\n id: string,\n): Promise<void> {\n await client.subscribe(id);\n}\n\nexport function useSubscribeChannelMutation(\n options: Omit<\n UseMutationOptions<void, Error, string, string[]>,\n \"mutationFn\"\n > = {},\n) {\n const queryClient = useQueryClient();\n const client = useChannelsClient();\n return useMutation({\n mutationFn: async (id: string) => subscribeChannel(client, id),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n queryClient.invalidateQueries({ queryKey: [\"subscribedChannels\"] });\n queryClient.invalidateQueries({ queryKey: channelQueryKey(variables) });\n options?.onSuccess?.(data, variables, onMutateResult, context);\n },\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { API, Chain, IChannelsClient } from \"@liberfi.io/types\";\nimport { chainSlug } from \"@liberfi.io/utils\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport interface UseSubscribedChannelsListQueryParams\n extends Omit<API.ListChannelsOptions, \"chain\"> {\n chain?: Chain;\n}\n\nexport function subscribedChannelsListQueryKey(\n params: UseSubscribedChannelsListQueryParams,\n): string[] {\n return [\n \"subscribedChannels\",\n params.chain ?? \"\",\n params.page ? `${params.page}` : \"\",\n params.size ? `${params.size}` : \"\",\n params.search ?? \"\",\n params.sort ?? \"\",\n params.order ?? \"\",\n ];\n}\n\nexport async function fetchSubscribedChannelsList(\n client: IChannelsClient,\n params: UseSubscribedChannelsListQueryParams,\n): Promise<API.ChannelsList> {\n const options: API.ListChannelsOptions = {\n ...params,\n chain: params.chain ? chainSlug(params.chain) : undefined,\n };\n return await client.getSubscribedChannels(options);\n}\n\nexport function useSubscribedChannelsListQuery(\n params: UseSubscribedChannelsListQueryParams = {},\n options: Omit<\n UseQueryOptions<API.ChannelsList, Error, API.ChannelsList, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: subscribedChannelsListQueryKey(params),\n queryFn: async () => fetchSubscribedChannelsList(client, params),\n ...options,\n });\n}\n","import {\n useMutation,\n UseMutationOptions,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { IChannelsClient } from \"@liberfi.io/types\";\nimport { channelQueryKey } from \"./useChannelQuery\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport async function unsubscribeChannel(\n client: IChannelsClient,\n id: string,\n): Promise<void> {\n await client.unsubscribe(id);\n}\n\nexport function useUnsubscribeChannelMutation(\n options: Omit<\n UseMutationOptions<void, Error, string, string[]>,\n \"mutationFn\"\n > = {},\n) {\n const client = useChannelsClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => unsubscribeChannel(client, id),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n queryClient.invalidateQueries({ queryKey: [\"subscribedChannels\"] });\n queryClient.invalidateQueries({ queryKey: channelQueryKey(variables) });\n options?.onSuccess?.(data, variables, onMutateResult, context);\n },\n });\n}\n","import {\n useMutation,\n UseMutationOptions,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { API, Chain, Channel, IChannelsClient } from \"@liberfi.io/types\";\nimport { chainSlug } from \"@liberfi.io/utils\";\nimport { channelQueryKey } from \"./useChannelQuery\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport interface UseUpdateChannelMutationParams\n extends Omit<API.UpdateChannelOptions, \"chain\"> {\n chain?: Chain;\n}\n\nexport async function updateChannel(\n client: IChannelsClient,\n params: UseUpdateChannelMutationParams,\n): Promise<Channel> {\n const options: API.UpdateChannelOptions = { ...params };\n if (params.chain) {\n const chain = chainSlug(params.chain);\n if (!chain) {\n throw new Error(\"Invalid chain\");\n }\n options.chain = chain;\n }\n return client.update(options);\n}\n\nexport function useUpdateChannelMutation(\n options: Omit<\n UseMutationOptions<\n Channel,\n Error,\n UseUpdateChannelMutationParams,\n string[]\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = useChannelsClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (params: UseUpdateChannelMutationParams) =>\n updateChannel(client, params),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n queryClient.invalidateQueries({\n queryKey: channelQueryKey(variables.id),\n });\n options?.onSuccess?.(data, variables, onMutateResult, context);\n },\n });\n}\n","import {\n useMutation,\n UseMutationOptions,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { API, ChannelSource, IChannelsClient } from \"@liberfi.io/types\";\nimport { channelSourcesQueryKey } from \"./useChannelSourcesQuery\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport type UseUpdateChannelSourcesMutationParams =\n API.UpdateChannelSourcesOptions;\n\nexport async function updateChannelSources(\n client: IChannelsClient,\n params: UseUpdateChannelSourcesMutationParams,\n): Promise<Array<ChannelSource>> {\n return client.updateSources(params);\n}\n\nexport function useUpdateChannelSourcesMutation(\n options: Omit<\n UseMutationOptions<\n Array<ChannelSource>,\n Error,\n UseUpdateChannelSourcesMutationParams,\n string[]\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = useChannelsClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (params: UseUpdateChannelSourcesMutationParams) =>\n updateChannelSources(client, params),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n queryClient.invalidateQueries({\n queryKey: channelSourcesQueryKey(variables.channel_id),\n });\n options?.onSuccess?.(data, variables, onMutateResult, context);\n },\n });\n}\n","import { useCallback } from \"react\";\nimport { fetchPresignedUploadUrl, useDexClient } from \"@liberfi.io/client\";\nimport { usePinata } from \"@liberfi.io/ui\";\n\nexport const useUpload = () => {\n const pinata = usePinata();\n const { client } = useDexClient();\n\n const upload = useCallback(\n async (file: File) => {\n const signedURL = await fetchPresignedUploadUrl(client);\n const res = await pinata.upload.public.file(file).url(signedURL);\n return pinata.gateways.public.convert(res.cid);\n // return `https://ipfs.io/ipfs/${res.cid}`;\n },\n [pinata, client],\n );\n return upload;\n};\n","import { z } from \"@liberfi.io/ui\";\n\nexport const baseFormSchema = z.object({\n name: z\n .string({ error: \"channels.forms.base.name.required\" })\n .min(1, \"channels.forms.base.name.min\")\n .max(24, \"channels.forms.base.name.max\"),\n description: z.string().optional(),\n icon: z.url({ error: \"channels.forms.base.icon.required\" }),\n});\n\nexport type BaseFormValues = z.infer<typeof baseFormSchema>;\n\nexport const walletSchema = z.object({\n address: z.string({ error: \"channels.forms.wallets.address.required\" }),\n alias: z.string().optional(),\n});\n\nexport const walletsFormSchema = z\n .array(walletSchema)\n .min(1, \"channels.forms.wallets.required\")\n .max(500, \"channels.forms.wallets.maxCount\");\n\nexport type WalletValues = z.infer<typeof walletSchema>;\n\nexport type WalletsFormValues = z.infer<typeof walletsFormSchema>;\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n RHForm,\n RHInput,\n RHTextArea,\n RHUpload,\n useForm,\n zodResolver,\n} from \"@liberfi.io/ui\";\nimport { useUpload } from \"../../hooks\";\nimport { baseFormSchema, BaseFormValues } from \"../../types/form\";\n\nexport type BaseFormUIProps = {\n isSubmitting?: boolean;\n onSubmit?: (data: BaseFormValues) => Promise<void>;\n defaultValues?: BaseFormValues;\n submitLabel?: string;\n};\n\nexport function BaseFormUI({\n isSubmitting = false,\n onSubmit,\n defaultValues = {\n name: \"\",\n description: \"\",\n icon: \"\",\n },\n submitLabel,\n}: BaseFormUIProps) {\n const { t } = useTranslation();\n\n const formMethods = useForm<BaseFormValues>({\n mode: \"onChange\",\n reValidateMode: \"onBlur\",\n resolver: zodResolver(baseFormSchema),\n defaultValues,\n });\n\n const upload = useUpload();\n\n return (\n <RHForm<BaseFormValues> methods={formMethods} onSubmit={onSubmit}>\n <RHInput\n name=\"name\"\n label={t(\"channels.forms.base.name.label\")}\n aria-label={t(\"channels.forms.base.name.label\")}\n placeholder={t(\"channels.forms.base.name.placeholder\")}\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n fullWidth\n labelPlacement=\"outside-top\"\n />\n\n <RHTextArea\n name=\"description\"\n label={t(\"channels.forms.base.description.label\")}\n aria-label={t(\"channels.forms.base.description.label\")}\n placeholder={t(\"channels.forms.base.description.placeholder\")}\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n fullWidth\n labelPlacement=\"outside-top\"\n />\n\n <RHUpload\n name=\"icon\"\n upload={upload}\n label={t(\"channels.forms.base.icon.label\")}\n placeholder={t(\"channels.forms.base.icon.placeholder\")}\n hint={t(\"channels.forms.base.icon.hint\")}\n radius=\"lg\"\n classNames={{ upload: \"sm:max-w-80\" }}\n />\n\n <Button\n color=\"primary\"\n fullWidth\n type=\"submit\"\n radius=\"lg\"\n className=\"mt-8\"\n isLoading={isSubmitting}\n >\n {submitLabel ?? t(\"channels.forms.base.submit\")}\n </Button>\n </RHForm>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Chain, Channel } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport { useCreateChannelMutation } from \"../../hooks\";\nimport { BaseFormValues } from \"../../types/form\";\nimport { BaseFormUI } from \"./base-form.ui\";\n\nexport type CreateChannelWidgetProps = {\n onSuccess?: (channel: Channel) => void;\n onError?: (error: unknown) => void;\n};\n\nexport function CreateChannelWidget({\n onSuccess,\n onError,\n}: CreateChannelWidgetProps) {\n const { t } = useTranslation();\n\n const { mutateAsync: createAsync, isPending } = useCreateChannelMutation();\n\n const onSubmit = useAuthCallback(\n async (data: BaseFormValues) => {\n try {\n const channel = await createAsync({\n name: data.name,\n description: data.description,\n icon: data.icon,\n chain: Chain.SOLANA,\n privacy: \"public\",\n });\n toast.success(t(\"channels.create.success\"));\n onSuccess?.(channel);\n } catch (error) {\n toast.error(t(\"channels.create.error\"));\n onError?.(error);\n }\n },\n [t, createAsync, onSuccess, onError],\n );\n\n return <BaseFormUI onSubmit={onSubmit} isSubmitting={isPending} />;\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport { useChannelQuery, useUpdateChannelMutation } from \"../../hooks\";\nimport { BaseFormValues } from \"../../types/form\";\n\nexport function useUpdateBaseForm(id: string) {\n const { t } = useTranslation();\n\n // query channel base info\n const { data, isLoading } = useChannelQuery(id);\n\n // update channel base info\n const { mutateAsync, isPending } = useUpdateChannelMutation();\n\n // form default values\n const defaultValues = useMemo<BaseFormValues | undefined>(() => {\n if (!data) return undefined;\n return {\n name: data.name,\n description: data.description,\n icon: data.icon ?? \"\",\n };\n }, [data]);\n\n const submit = useAuthCallback(\n async (data: BaseFormValues) => {\n try {\n await mutateAsync({\n id,\n name: data.name,\n description: data.description,\n icon: data.icon,\n });\n toast.success(t(\"channels.update.success\"));\n } catch (error) {\n console.error(\"Update channel base info error\", error);\n toast.error(t(\"channels.update.error\"));\n }\n },\n [mutateAsync, id],\n );\n\n return {\n // channel\n channel: data,\n // initial loading\n isLoading,\n // updating\n isSubmitting: isPending,\n // default values\n defaultValues,\n // submit\n submit,\n };\n}\n","import { useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel, ChannelSink } from \"@liberfi.io/types\";\nimport { Button, StyledInput } from \"@liberfi.io/ui\";\n\nexport type TelegramFormUIProps = {\n channel: Channel;\n sink?: ChannelSink;\n onSaveToken?: (token: string) => void;\n};\n\nexport function TelegramFormUI({ sink, onSaveToken }: TelegramFormUIProps) {\n const { t } = useTranslation();\n\n const [token, setToken] = useState(\"\");\n\n useEffect(() => {}, [sink]);\n\n return (\n <div className=\"px-2 sm:px-4 space-y-4\">\n <p className=\"whitespace-pre-wrap text-sm p-2 sm:p-4 bg-content2 rounded-lg text-neutral leading-[2]\">\n {t(\"channels.forms.socials.telegram.guide\")}\n </p>\n\n <div className=\"flex gap-4 items-center\">\n <StyledInput\n fullWidth\n placeholder={t(\"channels.forms.socials.telegram.placeholder\")}\n radius=\"lg\"\n value={token}\n onValueChange={setToken}\n />\n <Button color=\"primary\" radius=\"lg\" size=\"sm\" className=\"h-10 min-h-10\">\n {t(\"common.save\")}\n </Button>\n </div>\n </div>\n );\n}\n","import { Key, useState } from \"react\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { Tab, TelegramIcon, StyledTabs } from \"@liberfi.io/ui\";\nimport { TelegramFormUI } from \"./socials/telegram-form.ui\";\n\nexport type SocialsFormUIProps = {\n channel: Channel;\n};\n\nexport function SocialsFormUI({ channel }: SocialsFormUIProps) {\n const [socialType, setSocialType] = useState(\"telegram\");\n\n return (\n <div className=\"w-full space-y-4\">\n <StyledTabs\n variant=\"underlined\"\n selectedKey={socialType}\n onSelectionChange={setSocialType as (key: Key) => void}\n disableAnimation={false}\n >\n <Tab\n key=\"telegram\"\n title={\n <div className=\"flex items-center gap-2\">\n <TelegramIcon width={16} height={16} />\n <h3>Telegram</h3>\n </div>\n }\n />\n </StyledTabs>\n\n {socialType === \"telegram\" && <TelegramFormUI channel={channel} />}\n </div>\n );\n}\n","import { WalletValues } from \"./types/form\";\n\nexport function parseWalletsText(value: string): Array<Partial<WalletValues>> {\n const lines = value\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => !!line);\n\n return lines.map((line) => {\n const [address, alias] = line.split(\",\");\n return {\n address: address ? address.trim() : undefined,\n alias: alias ? alias.trim() : undefined,\n };\n });\n}\n","import { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChannelSource } from \"@liberfi.io/types\";\nimport {\n Button,\n CopyIcon,\n EmptyIcon,\n SearchIcon,\n StyledInput,\n StyledTable,\n TableBody,\n TableCell,\n TableColumn,\n TableHeader,\n TableRow,\n TrashIcon,\n useCopyToClipboard,\n} from \"@liberfi.io/ui\";\nimport { debounce, shortAddress } from \"@liberfi.io/utils\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport { WalletsFormValues } from \"../../types/form\";\n\nexport type WalletsListUIProps = {\n // already added wallets\n wallets?: Array<ChannelSource>;\n // submit wallets (include both already added wallets & new added wallets)\n onSubmit?: (wallets: WalletsFormValues) => Promise<void>;\n // whether the form is submitting\n isSubmitting?: boolean;\n};\n\nexport function WalletsListUI({\n wallets = [],\n onSubmit,\n isSubmitting,\n}: WalletsListUIProps) {\n const { t } = useTranslation();\n\n const copy = useCopyToClipboard();\n\n const handleDelete = useAuthCallback(\n (wallet: ChannelSource) => {\n const newWallets = wallets.filter((w) => w.value !== wallet.value);\n const formValues = newWallets.map((w) => ({\n address: w.value ?? \"\",\n alias: w.alias,\n }));\n onSubmit?.(formValues);\n },\n [wallets, onSubmit],\n );\n\n const [search, setSearch] = useState(\"\");\n\n const debouncedSetSearch = debounce(setSearch, 200);\n\n const filteredWallets = useMemo(() => {\n return wallets.filter(\n (w) =>\n w.alias?.toLowerCase()?.includes(search.toLowerCase()) ||\n w.value?.toLowerCase()?.includes(search.toLowerCase()),\n );\n }, [search, wallets]);\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-sm font-medium\">\n {t(\"channels.forms.wallets.list.title\")}\n </h2>\n <StyledInput\n size=\"sm\"\n className=\"max-w-50\"\n radius=\"full\"\n startContent={\n <SearchIcon width={16} height={16} className=\"text-neutral\" />\n }\n placeholder={t(\"channels.forms.wallets.list.search.placeholder\")}\n onValueChange={debouncedSetSearch}\n />\n </div>\n\n <StyledTable\n isHeaderSticky\n isVirtualized={\n // TODO make empty list virtualized to show the empty content\n filteredWallets.length > 10 || filteredWallets.length === 0\n }\n radius=\"lg\"\n classNames={{ emptyWrapper: \"pt-10\" }}\n maxTableHeight={500}\n rowHeight={52}\n aria-label={t(\"channels.forms.wallets.list.title\")}\n >\n <TableHeader>\n <TableColumn\n key=\"address\"\n textValue={t(\"channels.forms.wallets.list.header.address\")}\n width={\"60%\"}\n >\n {t(\"channels.forms.wallets.list.header.address\")}\n </TableColumn>\n <TableColumn\n key=\"actions\"\n textValue={t(\"channels.forms.wallets.list.header.actions\")}\n width={\"40%\"}\n align=\"end\"\n >\n {t(\"channels.forms.wallets.list.header.actions\")}\n </TableColumn>\n </TableHeader>\n\n <TableBody\n items={filteredWallets}\n emptyContent={\n <div className=\"space-y-2\">\n <EmptyIcon className=\"w-10 h-10 mx-auto text-neutral\" />\n <p className=\"text-xs text-neutral text-center\">\n {t(\"channels.forms.wallets.list.empty\")}\n </p>\n </div>\n }\n >\n {(wallet) => (\n <TableRow key={wallet.value}>\n <TableCell key=\"address\">\n <div className=\"flex flex-col gap-1 text-xs\">\n <div>{wallet.alias}</div>\n <div\n className=\"text-neutral flex items-center gap-1\"\n onClick={() => copy(wallet.value ?? \"\")}\n aria-label={t(\"common.copy\")}\n >\n <div>{shortAddress(wallet.value ?? \"\")}</div>\n <div>\n <CopyIcon width={12} height={12} />\n </div>\n </div>\n </div>\n </TableCell>\n <TableCell key=\"actions\">\n <Button\n isIconOnly\n size=\"sm\"\n radius=\"full\"\n className=\"bg-transparent\"\n disabled={isSubmitting}\n onPress={() => handleDelete(wallet)}\n >\n <TrashIcon\n className=\"text-danger-500\"\n width={18}\n height={18}\n />\n </Button>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </StyledTable>\n </div>\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel, ChannelSource } from \"@liberfi.io/types\";\nimport {\n Button,\n Chip,\n HorizontalScrollContainer,\n RHForm,\n RHTextArea,\n StyledTooltip,\n useForm,\n z,\n zodResolver,\n} from \"@liberfi.io/ui\";\nimport {\n intersectionBy,\n isValidWalletAddress,\n uniqBy,\n} from \"@liberfi.io/utils\";\nimport { walletsFormSchema, WalletsFormValues } from \"../../types/form\";\nimport { parseWalletsText } from \"../../utils\";\nimport { WalletsListUI } from \"./wallets-list.ui\";\n\nexport type WalletsFormUIProps = {\n /** channel */\n channel: Channel;\n /** already added wallets */\n wallets?: Array<ChannelSource>;\n /** submit wallets (include both already added wallets & new added wallets) */\n onSubmit?: (wallets: WalletsFormValues) => Promise<void>;\n /** whether the form is submitting */\n isSubmitting?: boolean;\n};\n\nconst formSchema = z.object({\n walletsText: z\n .string({ error: \"channels.forms.wallets.required\" })\n .min(1, \"channels.forms.wallets.required\"),\n});\n\ntype FormValues = z.infer<typeof formSchema>;\n\nexport function WalletsFormUI({\n channel,\n wallets = [],\n onSubmit,\n isSubmitting = false,\n}: WalletsFormUIProps) {\n const { t } = useTranslation();\n\n const formMethods = useForm<FormValues>({\n mode: \"onChange\",\n reValidateMode: \"onBlur\",\n resolver: zodResolver(formSchema),\n defaultValues: {\n walletsText: \"\",\n },\n });\n\n const walletsFormValues = useMemo<WalletsFormValues>(\n () => wallets.map((it) => ({ address: it.value ?? \"\", alias: it.alias })),\n [wallets],\n );\n\n const { setError, reset } = formMethods;\n\n // wallets input text validation\n const validateWallets = useCallback(\n (walletsText: string) => {\n try {\n // validate against the schema\n const parsedWallets = walletsFormSchema.parse(\n parseWalletsText(walletsText),\n );\n\n // whether the new added wallets are duplicated\n const duplicatedCount =\n parsedWallets.length - uniqBy(parsedWallets, \"address\").length;\n if (duplicatedCount !== 0) {\n throw new Error(\n t(\"channels.forms.wallets.address.duplicated\", {\n count: duplicatedCount,\n }),\n );\n }\n\n // whether the new added wallets are already added\n const alreadyAddedCount = intersectionBy(\n parsedWallets,\n walletsFormValues,\n \"address\",\n ).length;\n\n if (alreadyAddedCount > 0) {\n throw new Error(\n t(\"channels.forms.wallets.address.alreadyAdded\", {\n count: alreadyAddedCount,\n }),\n );\n }\n\n // check total count\n if (parsedWallets.length + walletsFormValues.length > 500) {\n throw new Error(t(\"channels.forms.wallets.maxCount\"));\n }\n\n // check each wallet address is valid\n let invalidCount = 0;\n for (const wallet of parsedWallets) {\n if (!isValidWalletAddress(channel.chain, wallet.address)) {\n invalidCount++;\n }\n }\n\n if (invalidCount > 0) {\n throw new Error(\n t(\"channels.forms.wallets.address.invalid\", {\n count: invalidCount,\n }),\n );\n }\n\n return parsedWallets;\n } catch (error) {\n if (error instanceof z.ZodError) {\n setError(\"walletsText\", {\n message: error.issues[0].message,\n type: \"manual\",\n });\n } else if (error instanceof Error) {\n setError(\"walletsText\", { message: error.message, type: \"manual\" });\n } else {\n setError(\"walletsText\", {\n message: t(\"channels.forms.wallets.invalid\"),\n type: \"manual\",\n });\n }\n return undefined;\n }\n },\n [walletsFormValues, t, channel.chain],\n );\n\n // submit wallets, merge new added wallets with already added wallets\n const handleSubmit = useCallback(\n async (data: FormValues) => {\n const parsedWallets = validateWallets(data.walletsText);\n if (parsedWallets && parsedWallets.length > 0) {\n await onSubmit?.([...walletsFormValues, ...parsedWallets]);\n reset();\n }\n },\n [validateWallets, onSubmit, walletsFormValues],\n );\n\n return (\n <div className=\"flex flex-col gap-6\">\n <RHForm<FormValues>\n methods={formMethods}\n onSubmit={handleSubmit}\n className=\"relative\"\n >\n <RHTextArea\n name=\"walletsText\"\n label={t(\"channels.forms.wallets.label\")}\n aria-label={t(\"channels.forms.wallets.label\")}\n placeholder={t(\"channels.forms.wallets.placeholder\")}\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n fullWidth\n minRows={10}\n maxRows={10}\n labelPlacement=\"outside-top\"\n />\n {/* already added count */}\n <div className=\"absolute right-0 top-0 text-xs flex gap-1 text-neutral\">\n <span className=\"text-neutral\">\n {t(\"channels.forms.wallets.addedCount\")}:\n </span>\n <span>{walletsFormValues.length} / 500</span>\n </div>\n\n <div className=\"w-full flex items-center gap-4\">\n {/* supported formats */}\n <HorizontalScrollContainer className=\"flex-auto min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-neutral flex-none\">\n {t(\"channels.forms.wallets.supportedFormats\")}:\n </span>\n <StyledTooltip\n closeDelay={0}\n content={\n <div className=\"text-xs whitespace-pre-line\">\n {t(\"channels.forms.wallets.supportedFormats.text.hint\")}\n </div>\n }\n >\n <Chip size=\"sm\" variant=\"flat\">\n {t(\"channels.forms.wallets.supportedFormats.text\")}\n </Chip>\n </StyledTooltip>\n </div>\n </HorizontalScrollContainer>\n <div className=\"flex-none flex gap-4 items-center\">\n {/* submit action */}\n <Button\n color=\"primary\"\n type=\"submit\"\n radius=\"lg\"\n isLoading={isSubmitting}\n size=\"sm\"\n >\n {t(\"channels.forms.wallets.submit\")}\n </Button>\n </div>\n </div>\n </RHForm>\n\n <WalletsListUI\n wallets={wallets}\n onSubmit={onSubmit}\n isSubmitting={isSubmitting}\n />\n </div>\n );\n}\n","import { Key, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel, ChannelSource } from \"@liberfi.io/types\";\nimport { clsx, StyledTabs, Tab, useScreen } from \"@liberfi.io/ui\";\nimport { BaseFormValues, WalletsFormValues } from \"../../types/form\";\nimport { BaseFormUI } from \"./base-form.ui\";\nimport { SocialsFormUI } from \"./socials-form.ui\";\nimport { WalletsFormUI } from \"./wallets-form.ui\";\n\n/**\n * base - channel basic information\n * wallets - channel wallet management\n * social - channel social media settings\n */\nexport type UpdateChannelFormType = \"base\" | \"wallets\" | \"social\";\n\nexport interface UpdateChannelFormUIProps {\n /** channel */\n channel: Channel;\n /** default form type */\n type?: UpdateChannelFormType;\n /** base form default values */\n baseFormDefaultValues?: BaseFormValues;\n /** base form is submitting */\n isSubmittingBaseForm?: boolean;\n /** base form on submit */\n onSubmitBaseForm?: (data: BaseFormValues) => Promise<void>;\n /** base form submit label */\n baseFormSubmitLabel?: string;\n /** wallets */\n wallets?: Array<ChannelSource>;\n /** wallets is submitting */\n isSubmittingWalletsForm?: boolean;\n /** wallets on submit */\n onSubmitWalletsForm?: (data: WalletsFormValues) => Promise<void>;\n /** custom styles */\n className?: string;\n}\n\nexport function UpdateChannelFormUI({\n channel,\n type = \"base\",\n baseFormDefaultValues,\n isSubmittingBaseForm = false,\n onSubmitBaseForm,\n baseFormSubmitLabel,\n wallets,\n isSubmittingWalletsForm = false,\n onSubmitWalletsForm,\n className,\n}: UpdateChannelFormUIProps) {\n const { t } = useTranslation();\n\n const [activeTab, setActiveTab] = useState<UpdateChannelFormType>(type);\n\n const { isMobile } = useScreen();\n\n return (\n <div className={clsx(\"w-full flex flex-col gap-4\", className)}>\n <StyledTabs\n fullWidth\n variant=\"solid\"\n size={isMobile ? \"sm\" : undefined}\n selectedKey={activeTab}\n onSelectionChange={setActiveTab as (key: Key) => void}\n >\n <Tab key=\"base\" title={t(\"channels.forms.base.title\")} />\n <Tab key=\"wallets\" title={t(\"channels.forms.wallets.title\")} />\n <Tab key=\"social\" title={t(\"channels.forms.socials.title\")} />\n </StyledTabs>\n\n {activeTab === \"base\" && (\n <BaseFormUI\n defaultValues={baseFormDefaultValues}\n isSubmitting={isSubmittingBaseForm}\n onSubmit={onSubmitBaseForm}\n submitLabel={baseFormSubmitLabel}\n />\n )}\n {activeTab === \"wallets\" && (\n <WalletsFormUI\n channel={channel}\n wallets={wallets}\n isSubmitting={isSubmittingWalletsForm}\n onSubmit={onSubmitWalletsForm}\n />\n )}\n {activeTab === \"social\" && <SocialsFormUI channel={channel} />}\n </div>\n );\n}\n","import { Key, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { clsx, Skeleton, StyledTabs, Tab, useScreen } from \"@liberfi.io/ui\";\nimport { UpdateChannelFormType } from \"./update-channel-form.ui\";\n\nexport interface UpdateChannelFormSkeletonsProps {\n /** default form type */\n type?: UpdateChannelFormType;\n /** custom styles */\n className?: string;\n}\n\nexport function UpdateChannelFormSkeletons({\n type = \"base\",\n className,\n}: UpdateChannelFormSkeletonsProps) {\n const { t } = useTranslation();\n\n const [activeTab, setActiveTab] = useState<UpdateChannelFormType>(type);\n\n const { isMobile } = useScreen();\n\n return (\n <div className={clsx(\"w-full flex flex-col gap-4\", className)}>\n <StyledTabs\n fullWidth\n variant=\"solid\"\n size={isMobile ? \"sm\" : undefined}\n selectedKey={activeTab}\n onSelectionChange={setActiveTab as (key: Key) => void}\n >\n <Tab key=\"base\" title={t(\"channels.forms.base.title\")} />\n <Tab key=\"wallets\" title={t(\"channels.forms.wallets.title\")} />\n <Tab key=\"social\" title={t(\"channels.forms.socials.title\")} />\n </StyledTabs>\n\n {activeTab === \"base\" && <Skeletons />}\n {activeTab === \"wallets\" && <Skeletons />}\n {activeTab === \"social\" && <Skeletons />}\n </div>\n );\n}\n\nexport function Skeletons() {\n return (\n <div className=\"flex flex-col gap-4\">\n <Skeleton className=\"w-full h-10 rounded-md\" />\n <Skeleton className=\"w-full h-10 rounded-md\" />\n <Skeleton className=\"w-full h-40 rounded-md\" />\n </div>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { chainSlug } from \"@liberfi.io/utils\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport {\n useChannelSourcesQuery,\n useUpdateChannelSourcesMutation,\n} from \"../../hooks\";\nimport { WalletsFormValues } from \"../../types/form\";\n\nexport function useUpdateWalletsForm(id: string, channel?: Channel) {\n const { t } = useTranslation();\n\n // query channel sources\n const { data, isLoading } = useChannelSourcesQuery(id);\n\n // update channel sources\n const { mutateAsync, isPending } = useUpdateChannelSourcesMutation();\n\n const submit = useAuthCallback(\n async (data: WalletsFormValues) => {\n try {\n if (!channel?.chain) {\n throw new Error(\"Channel chain is not set\");\n }\n await mutateAsync({\n channel_id: id,\n type: \"wallet\",\n sources: data.map((it) => ({\n type: \"wallet\",\n value: it.address,\n alias: it.alias,\n configs: {\n chain: chainSlug(channel.chain),\n },\n })),\n });\n toast.success(t(\"channels.forms.wallets.update.success\"));\n } catch (error) {\n console.error(\"Update channel wallets error\", error);\n toast.error(t(\"channels.forms.wallets.update.error\"));\n }\n },\n [mutateAsync, id, channel?.chain],\n );\n\n return {\n // initial loading\n isLoading,\n // updating\n isSubmitting: isPending,\n // wallets\n wallets: data,\n // submit\n submit,\n };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { useUpdateBaseForm } from \"./update-base-form.script\";\nimport { UpdateChannelFormSkeletons } from \"./update-channel-form-skeletons\";\nimport {\n UpdateChannelFormType,\n UpdateChannelFormUI,\n} from \"./update-channel-form.ui\";\nimport { useUpdateWalletsForm } from \"./update-wallets-form.script\";\n\nexport type UpdateChannelWidgetProps = {\n id: string;\n type?: UpdateChannelFormType;\n};\n\nexport function UpdateChannelWidget({\n id,\n type = \"base\",\n}: UpdateChannelWidgetProps) {\n const { t } = useTranslation();\n\n const {\n channel,\n defaultValues: baseFormDefaultValues,\n isLoading: isLoadingBaseForm,\n isSubmitting: isSubmittingBaseForm,\n submit: submitBaseForm,\n } = useUpdateBaseForm(id);\n\n const {\n wallets,\n isLoading: isLoadingWalletsForm,\n isSubmitting: isSubmittingWalletsForm,\n submit: submitWalletsForm,\n } = useUpdateWalletsForm(id, channel);\n\n // initial loading\n if (isLoadingBaseForm || isLoadingWalletsForm || !channel) {\n return <UpdateChannelFormSkeletons type={type} />;\n }\n\n return (\n <UpdateChannelFormUI\n channel={channel}\n type={type}\n baseFormDefaultValues={baseFormDefaultValues}\n isSubmittingBaseForm={isSubmittingBaseForm}\n onSubmitBaseForm={submitBaseForm}\n baseFormSubmitLabel={t(\"channels.forms.base.update.submit\")}\n wallets={wallets}\n isSubmittingWalletsForm={isSubmittingWalletsForm}\n onSubmitWalletsForm={submitWalletsForm}\n />\n );\n}\n","import { useTickAge } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport {\n DiscordIcon,\n HorizontalScrollContainer,\n Link,\n PeopleIcon,\n StyledTooltip,\n TelegramIcon,\n TimerIcon,\n TwitterIcon,\n WalletIcon,\n} from \"@liberfi.io/ui\";\nimport { formatAge } from \"@liberfi.io/utils\";\n\nexport type ChannelAttributesProps = {\n channel: Channel;\n};\n\nexport function ChannelAttributes({ channel }: ChannelAttributesProps) {\n const { t } = useTranslation();\n\n const updatedAge = useTickAge(new Date(channel.updated_at));\n\n return (\n <HorizontalScrollContainer\n classNames={{\n leftArrow: \"from-content1/60 to-transparent\",\n rightArrow: \"from-content1/60 to-transparent\",\n }}\n >\n <div className=\"flex items-center gap-4\">\n {/* wallet count */}\n <StyledTooltip content={t(\"channels.info.walletCount\")} closeDelay={0}>\n <div className=\"flex items-center gap-1\">\n <WalletIcon width={16} height={16} />\n <p className=\"text-xs\">{channel.source_count || \"-\"}</p>\n </div>\n </StyledTooltip>\n\n {/* subscribe count */}\n <StyledTooltip\n content={t(\"channels.info.subscribeCount\")}\n closeDelay={0}\n >\n <div className=\"flex items-center gap-1\">\n <PeopleIcon width={16} height={16} />\n <p className=\"text-xs\">{channel.subscribe_count || \"-\"}</p>\n </div>\n </StyledTooltip>\n\n {/* last updated at */}\n <StyledTooltip content={t(\"channels.info.updatedAt\")} closeDelay={0}>\n <div className=\"flex items-center gap-1\">\n <TimerIcon width={16} height={16} />\n <p className=\"text-xs\">{formatAge(updatedAge)}</p>\n </div>\n </StyledTooltip>\n\n {channel.twitter && (\n <Link href={channel.twitter} target=\"_blank\" className=\"text-neutral\">\n <TwitterIcon width={16} height={16} />\n </Link>\n )}\n\n {channel.telegram && (\n <Link\n href={channel.telegram}\n target=\"_blank\"\n className=\"text-neutral\"\n >\n <TelegramIcon width={16} height={16} />\n </Link>\n )}\n {channel.discord && (\n <Link href={channel.discord} target=\"_blank\" className=\"text-neutral\">\n <DiscordIcon width={16} height={16} />\n </Link>\n )}\n </div>\n </HorizontalScrollContainer>\n );\n}\n","import { useMemo } from \"react\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { Avatar } from \"@liberfi.io/ui\";\nimport { chainIcon } from \"@liberfi.io/utils\";\nimport { ChannelAttributes } from \"./channel-attributes\";\n\nexport type ChannelBaseInfoProps = {\n channel: Channel;\n customActions?: React.ReactNode;\n};\n\nexport function ChannelBaseInfo({\n channel,\n customActions,\n}: ChannelBaseInfoProps) {\n const chainIconUrl = useMemo(\n () => (channel.chain ? chainIcon(channel.chain) : undefined),\n [channel.chain],\n );\n\n return (\n <div className=\"flex gap-4\">\n <div className=\"flex-none flex flex-col\">\n <div className=\"relative\">\n <Avatar\n src={channel.icon}\n alt={channel.name}\n className=\"w-18 h-18\"\n radius=\"md\"\n />\n {chainIconUrl && (\n <Avatar\n radius=\"full\"\n src={chainIconUrl}\n className=\"w-5 h-5 absolute -bottom-1 -right-1 border border-border shadow-sm\"\n />\n )}\n </div>\n </div>\n\n <div className=\"flex-auto min-w-0 flex flex-col gap-2 text-neutral\">\n <div className=\"h-6 flex items-center gap-2\">\n <p className=\"flex-auto min-w-0 text-sm font-medium text-foreground truncate\">\n {channel.name}\n </p>\n <div className=\"flex-none\">{customActions}</div>\n </div>\n\n <ChannelAttributes channel={channel} />\n\n <p className=\"text-xs whitespace-pre-wrap line-clamp-1 h-4 overflow-hidden\">\n {channel.description}\n </p>\n </div>\n </div>\n );\n}\n","import { Channel } from \"@liberfi.io/types\";\nimport { EditIcon, StyledButton } from \"@liberfi.io/ui\";\nimport { useAuth, useAuthCallback } from \"@liberfi.io/wallet-connector\";\n\nexport type ChannelEditButtonProps = {\n channel: Channel;\n onEdit?: (channel: Channel) => void;\n};\n\nexport function ChannelEditButton({ channel, onEdit }: ChannelEditButtonProps) {\n const { user } = useAuth();\n\n const handleEdit = useAuthCallback(() => {\n onEdit?.(channel);\n }, [channel, onEdit]);\n\n if (user?.id !== channel.owner_id) {\n return <></>;\n }\n\n return (\n <StyledButton\n className=\"bg-transparent\"\n isIconOnly\n size=\"sm\"\n onPress={handleEdit}\n >\n <EditIcon width={16} height={16} className=\"text-neutral\" />\n </StyledButton>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { HorizontalScrollContainer, StyledTooltip } from \"@liberfi.io/ui\";\n\nexport type ChannelStatsProps = {\n channel: Channel;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function ChannelStats({ channel }: ChannelStatsProps) {\n const { t } = useTranslation();\n\n return (\n <HorizontalScrollContainer\n classNames={{\n leftArrow: \"from-content1/60 to-transparent\",\n rightArrow: \"from-content1/60 to-transparent\",\n }}\n >\n <div className=\"flex items-center gap-4 text-xs\">\n {/* 7D txs */}\n <StyledTooltip content={t(\"channels.stats.7dTxs.hint\")} closeDelay={0}>\n <div className=\"flex-none flex flex-col gap-1 items-center\">\n <p className=\"text-neutral font-medium\">\n {t(\"channels.stats.7dTxs.title\")}\n </p>\n <p className=\"text-foreground font-semibold\">--</p>\n </div>\n </StyledTooltip>\n\n {/* 7d PnL */}\n <StyledTooltip content={t(\"channels.stats.7dPnl.hint\")} closeDelay={0}>\n <div className=\"flex-none flex flex-col gap-1 items-center\">\n <p className=\"text-neutral font-medium\">\n {t(\"channels.stats.7dPnl.title\")}\n </p>\n <p className=\"text-bullish font-semibold\">--</p>\n </div>\n </StyledTooltip>\n\n {/* 7d WR */}\n <StyledTooltip content={t(\"channels.stats.7dWr.hint\")} closeDelay={0}>\n <div className=\"flex-none flex flex-col gap-1 items-center\">\n <p className=\"text-neutral font-medium\">\n {t(\"channels.stats.7dWr.title\")}\n </p>\n <p className=\"text-bullish font-semibold\">--%</p>\n </div>\n </StyledTooltip>\n </div>\n </HorizontalScrollContainer>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { CheckIcon, clsx, PlusIcon, StyledButton, toast } from \"@liberfi.io/ui\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport {\n useSubscribeChannelMutation,\n useUnsubscribeChannelMutation,\n} from \"../../hooks\";\n\nexport type ChannelSubscribeButtonProps = {\n channel: Channel;\n onSubscribeSuccess?: (channel: Channel) => void;\n onUnsubscribeSuccess?: (channel: Channel) => void;\n onSubscribeError?: (channel: Channel, error: unknown) => void;\n onUnsubscribeError?: (channel: Channel, error: unknown) => void;\n};\n\nexport function ChannelSubscribeButton({\n channel,\n onSubscribeSuccess,\n onUnsubscribeSuccess,\n onSubscribeError,\n onUnsubscribeError,\n}: ChannelSubscribeButtonProps) {\n const { t } = useTranslation();\n\n const [subscribed, setSubscribed] = useState(channel.is_subscribed);\n\n useEffect(() => {\n setSubscribed(channel.is_subscribed);\n }, [channel.is_subscribed]);\n\n const { mutateAsync: subscribeChannel, isPending: isSubscribing } =\n useSubscribeChannelMutation();\n\n const { mutateAsync: unsubscribeChannel, isPending: isUnsubscribing } =\n useUnsubscribeChannelMutation();\n\n const handleSubscribe = useAuthCallback(async () => {\n try {\n if (subscribed) {\n await unsubscribeChannel(channel.id);\n setSubscribed(false);\n toast.success(t(\"channels.unsubscribe.success\"));\n onUnsubscribeSuccess?.(channel);\n } else {\n await subscribeChannel(channel.id);\n setSubscribed(true);\n toast.success(t(\"channels.subscribe.success\"));\n onSubscribeSuccess?.(channel);\n }\n } catch (error) {\n console.error(\"Subscribe / Unsubscribe channel error\", error);\n if (subscribed) {\n toast.error(t(\"channels.unsubscribe.error\"));\n onUnsubscribeError?.(channel, error);\n } else {\n toast.error(t(\"channels.subscribe.error\"));\n onSubscribeError?.(channel, error);\n }\n }\n }, [\n t,\n subscribed,\n channel,\n subscribeChannel,\n unsubscribeChannel,\n onSubscribeSuccess,\n onUnsubscribeSuccess,\n onSubscribeError,\n onUnsubscribeError,\n ]);\n\n return (\n <StyledButton\n color={subscribed ? \"default\" : \"primary\"}\n size=\"sm\"\n radius=\"lg\"\n onPress={handleSubscribe}\n isLoading={isSubscribing || isUnsubscribing}\n variant={subscribed ? \"bordered\" : \"flat\"}\n className={clsx(\"gap-1\", subscribed && \"text-neutral\")}\n startContent={\n subscribed ? (\n !isSubscribing && !isUnsubscribing ? (\n <CheckIcon width={16} height={16} />\n ) : undefined\n ) : !isSubscribing && !isUnsubscribing ? (\n <PlusIcon width={16} height={16} />\n ) : undefined\n }\n >\n {subscribed\n ? t(\"channels.unsubscribe.submit\")\n : t(\"channels.subscribe.submit\")}\n </StyledButton>\n );\n}\n","import { useCallback } from \"react\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { clsx, HorizontalScrollContainer } from \"@liberfi.io/ui\";\nimport { ChannelBaseInfo, ChannelStats } from \"../channel\";\n\nexport type ChannelsItemUIProps = {\n channel: Channel;\n onSelect?: (channel: Channel) => void;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\nexport function ChannelsItemUI({\n channel,\n onSelect,\n headerActions,\n footerActions,\n}: ChannelsItemUIProps) {\n const handleSelect = useCallback(() => {\n onSelect?.(channel);\n }, [channel, onSelect]);\n\n return (\n <div\n className={clsx(\n \"bg-content1 hover:bg-content2 border border-border rounded-lg w-full h-full p-2.5\",\n \"flex flex-col gap-2.5\",\n onSelect && \"cursor-pointer\",\n )}\n onClick={handleSelect}\n >\n <ChannelBaseInfo channel={channel} customActions={headerActions} />\n\n <div className=\"flex items-center gap-4\">\n <div className=\"flex-auto min-w-0\">\n <ChannelStats channel={channel} />\n </div>\n <div className=\"flex-none\">{footerActions}</div>\n </div>\n </div>\n );\n}\n","import { Channel } from \"@liberfi.io/types\";\nimport { ChannelsItemUI } from \"./channels-item.ui\";\n\nexport type ChannelsUIProps = {\n channels: Array<Channel>;\n onSelect?: (channel: Channel) => void;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function ChannelsUI({\n channels,\n onSelect,\n customHeaderActions,\n customFooterActions,\n}: ChannelsUIProps) {\n return (\n <div className=\"w-full grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {channels.map((channel) => (\n <ChannelsItemUI\n key={channel.id}\n channel={channel}\n onSelect={onSelect}\n headerActions={customHeaderActions?.(channel)}\n footerActions={customFooterActions?.(channel)}\n />\n ))}\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport type ChannelsSkeletonUIProps = {\n count: number;\n};\n\nexport function ChannelsSkeletonUI({ count }: ChannelsSkeletonUIProps) {\n return (\n <div className=\"w-full grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {Array.from({ length: count }).map((_, index) => (\n <div\n key={index}\n className=\"bg-content1 hover:bg-content2 border border-border rounded-lg w-full h-35 p-2.5 flex flex-col gap-2.5\"\n >\n <div className=\"flex gap-4\">\n <div className=\"flex-none flex flex-col\">\n <Skeleton className=\"w-18 h-18 flex-none rounded-md\" />\n </div>\n\n <div className=\"flex-auto min-w-0 flex flex-col gap-2 justify-center text-neutral\">\n <Skeleton className=\"w-24 h-4 rounded-md\" />\n <Skeleton className=\"w-48 h-4 rounded-md\" />\n <Skeleton className=\"w-48 h-4 rounded-md\" />\n </div>\n </div>\n <div className=\"w-full flex justify-between gap-4\">\n <Skeleton className=\"flex-auto min-w-0 h-6 rounded-md\" />\n <Skeleton className=\"w-24 h-6 rounded-md\" />\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { EmptyIcon } from \"@liberfi.io/ui\";\n\nexport type ChannelsEmptyUIProps = {\n message?: string;\n};\n\nexport function ChannelsEmptyUI({ message }: ChannelsEmptyUIProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"pt-24 mx-auto\">\n <EmptyIcon width={28} height={28} className=\"text-neutral mx-auto\" />\n <p className=\"pt-2 text-sm text-neutral text-center\">\n {message || t(\"common.empty\")}\n </p>\n </div>\n );\n}\n","import { useEffect } from \"react\";\nimport { useAuth } from \"@liberfi.io/wallet-connector\";\nimport { useChannelsListQuery } from \"../../hooks\";\n\nexport const useTrendingChannels = () => {\n const { status } = useAuth();\n\n const result = useChannelsListQuery();\n\n const { refetch } = result;\n\n // refetch to fix subscription status\n useEffect(() => {\n if (status === \"authenticated\") {\n refetch();\n }\n }, [status, refetch]);\n\n return result;\n};\n","import { Channel } from \"@liberfi.io/types\";\nimport { ChannelsEmptyUI } from \"./channels-empty.ui\";\nimport { ChannelsSkeletonUI } from \"./channels-skeleton.ui\";\nimport { ChannelsUI } from \"./channels.ui\";\nimport { useTrendingChannels } from \"./trending-channels.script\";\n\nexport type TrendingChannelsWidgetProps = {\n onSelect?: (channel: Channel) => void;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function TrendingChannelsWidget({\n onSelect,\n customHeaderActions,\n customFooterActions,\n}: TrendingChannelsWidgetProps) {\n const { data: channelList, isLoading } = useTrendingChannels();\n\n if (isLoading) {\n return <ChannelsSkeletonUI count={9} />;\n }\n\n if (!channelList || channelList.list.length === 0) {\n return <ChannelsEmptyUI />;\n }\n\n return (\n <ChannelsUI\n channels={channelList.list}\n onSelect={onSelect}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledButton } from \"@liberfi.io/ui\";\nimport { useAuth } from \"@liberfi.io/wallet-connector\";\n\nexport type ChannelsUnauthenticatedUIProps = {\n message?: string;\n};\n\nexport function ChannelsUnauthenticatedUI({\n message,\n}: ChannelsUnauthenticatedUIProps) {\n const { t } = useTranslation();\n\n const { signIn } = useAuth();\n\n return (\n <div className=\"pt-24 flex flex-col items-center justify-center gap-2\">\n <p className=\"text-neutral text-sm\">\n {message || t(\"common.unauthenticated\")}\n </p>\n <StyledButton color=\"primary\" size=\"sm\" onPress={signIn} radius=\"lg\">\n {t(\"common.signIn\")}\n </StyledButton>\n </div>\n );\n}\n","import { Channel } from \"@liberfi.io/types\";\nimport { useAuth } from \"@liberfi.io/wallet-connector\";\nimport { useSubscribedChannelsListQuery } from \"../../hooks\";\nimport { ChannelsEmptyUI } from \"./channels-empty.ui\";\nimport { ChannelsSkeletonUI } from \"./channels-skeleton.ui\";\nimport { ChannelsUnauthenticatedUI } from \"./channels-unauthenticated.ui\";\nimport { ChannelsUI } from \"./channels.ui\";\n\nexport type SubscribedChannelsWidgetProps = {\n onSelect?: (channel: Channel) => void;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function SubscribedChannelsWidget({\n onSelect,\n customHeaderActions,\n customFooterActions,\n}: SubscribedChannelsWidgetProps) {\n const { status } = useAuth();\n\n const { data: channelList, isLoading } = useSubscribedChannelsListQuery(\n {},\n { enabled: status === \"authenticated\" },\n );\n\n if (status === \"unauthenticated\") {\n return <ChannelsUnauthenticatedUI />;\n }\n\n if (status === \"authenticating\" || isLoading) {\n return <ChannelsSkeletonUI count={9} />;\n }\n\n if (!channelList || channelList.list.length === 0) {\n return <ChannelsEmptyUI />;\n }\n\n return (\n <ChannelsUI\n channels={channelList.list}\n onSelect={onSelect}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n );\n}\n","import { useSubscribedChannelsListQuery } from \"../../hooks\";\n\nexport const useSubscribedChannels = () => {\n return useSubscribedChannelsListQuery();\n};\n","import { Channel } from \"@liberfi.io/types\";\nimport { useAuth } from \"@liberfi.io/wallet-connector\";\nimport { useMyChannelsListQuery } from \"../../hooks\";\nimport { ChannelsEmptyUI } from \"./channels-empty.ui\";\nimport { ChannelsSkeletonUI } from \"./channels-skeleton.ui\";\nimport { ChannelsUnauthenticatedUI } from \"./channels-unauthenticated.ui\";\nimport { ChannelsUI } from \"./channels.ui\";\n\nexport type MyChannelsWidgetProps = {\n onSelect?: (channel: Channel) => void;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function MyChannelsWidget({\n onSelect,\n customHeaderActions,\n customFooterActions,\n}: MyChannelsWidgetProps) {\n const { status } = useAuth();\n\n const { data: channelList, isLoading } = useMyChannelsListQuery(\n {},\n { enabled: status === \"authenticated\" },\n );\n\n if (status === \"unauthenticated\") {\n return <ChannelsUnauthenticatedUI />;\n }\n\n if (status === \"authenticating\" || isLoading) {\n return <ChannelsSkeletonUI count={9} />;\n }\n\n if (!channelList || channelList.list.length === 0) {\n return <ChannelsEmptyUI />;\n }\n\n return (\n <ChannelsUI\n channels={channelList.list}\n onSelect={onSelect}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n );\n}\n","import { useMyChannelsListQuery } from \"../../hooks\";\n\nexport const useMyChannels = () => {\n return useMyChannelsListQuery();\n};\n","import { useMemo } from \"react\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { Avatar, clsx } from \"@liberfi.io/ui\";\nimport { chainIcon } from \"@liberfi.io/utils\";\nimport { ChannelAttributes, ChannelStats } from \"../channel\";\n\nexport type ChannelDetailUIProps = {\n channel: Channel;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n className?: string;\n};\n\nexport function ChannelDetailUI({\n channel,\n headerActions,\n footerActions,\n className,\n}: ChannelDetailUIProps) {\n const chainIconUrl = useMemo(\n () => (channel.chain ? chainIcon(channel.chain) : undefined),\n [channel.chain],\n );\n\n return (\n <div\n className={clsx(\n \"bg-content1 border border-border rounded-lg w-full h-fit p-2.5\",\n \"flex flex-col gap-2.5\",\n className,\n )}\n >\n <div className=\"flex gap-4\">\n <div className=\"flex-none flex flex-col\">\n <div className=\"relative\">\n <Avatar\n src={channel.icon}\n alt={channel.name}\n className=\"w-18 h-18\"\n radius=\"md\"\n />\n {chainIconUrl && (\n <Avatar\n radius=\"full\"\n src={chainIconUrl}\n className=\"w-5 h-5 absolute -bottom-1 -right-1 border border-border shadow-sm\"\n />\n )}\n </div>\n </div>\n\n <div className=\"flex-auto min-w-0 flex flex-col gap-2 text-neutral\">\n <div className=\"h-6 flex items-center gap-2\">\n <p className=\"flex-auto min-w-0 text-sm font-medium text-foreground truncate\">\n {channel.name}\n </p>\n <div className=\"flex-none\">{headerActions}</div>\n </div>\n\n <ChannelAttributes channel={channel} />\n </div>\n </div>\n\n <div className=\"flex gap-4\">\n <div className=\"flex-auto min-w-0\">\n <ChannelStats channel={channel} />\n </div>\n <div className=\"flex-none\">{footerActions}</div>\n </div>\n\n {channel.description && (\n <p className=\"text-xs whitespace-pre-wrap\">{channel.description}</p>\n )}\n </div>\n );\n}\n","import { useTickAge } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n COMMON_TOKEN_SYMBOLS_MAP,\n formatAge,\n formatAmount,\n formatPriceUSD,\n SafeBigNumber,\n shortAddress,\n} from \"@liberfi.io/utils\";\nimport { ChannelEventRowProps } from \"../../types\";\n\nexport function WalletTradeEvent({\n event,\n walletAliases,\n tokens,\n}: ChannelEventRowProps) {\n const { t } = useTranslation();\n\n const age = useTickAge(new Date(event.data.timestamp));\n\n const address = event.data.wallet_address;\n\n const alias = walletAliases?.[address];\n\n const quoteAddress = event.data.quote_address;\n\n const quoteSymbol =\n tokens?.[quoteAddress]?.symbol ?? COMMON_TOKEN_SYMBOLS_MAP[quoteAddress];\n\n const baseAddress = event.data.base_address;\n\n const baseSymbol =\n tokens?.[baseAddress]?.symbol ?? COMMON_TOKEN_SYMBOLS_MAP[baseAddress];\n\n const type = event.data.type;\n\n return (\n <div className=\"w-full h-full flex items-center gap-2.5 text-xs\">\n {/* wallet address */}\n <div className=\"flex-none w-24\">\n {alias ? (\n // with alias\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate\">{alias}</div>\n <div className=\"text-neutral\">({shortAddress(address)})</div>\n </div>\n ) : (\n // without alias\n <div>{shortAddress(address)}</div>\n )}\n </div>\n\n {/* buy details */}\n {type === \"buy\" && (\n <>\n {/* buy amount */}\n <div className=\"flex-none w-18\">\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"text-neutral\">\n {t(\"channels.events.walletTrade.buy\")}\n </div>\n <div className=\"text-bullish\">\n {formatAmount(new SafeBigNumber(event.data.base_amount).abs())}\n </div>\n </div>\n </div>\n\n {/* buy token */}\n <div className=\"flex-none w-24\">\n {baseSymbol ? (\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate\">{baseSymbol}</div>\n <div className=\"text-neutral\">\n ({shortAddress(baseAddress)})\n </div>\n </div>\n ) : (\n <div>{shortAddress(baseAddress)}</div>\n )}\n </div>\n\n {/* cost amount */}\n <div className=\"flex-none w-18\">\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"text-neutral\">\n {t(\"channels.events.walletTrade.cost\")}\n </div>\n <div className={\"text-bearish\"}>\n {formatAmount(new SafeBigNumber(event.data.quote_amount).abs())}\n </div>\n </div>\n </div>\n\n {/* cost token */}\n <div className=\"flex-none w-24\">\n {quoteSymbol ? (\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate\">{quoteSymbol}</div>\n <div className=\"text-neutral\">\n ({shortAddress(quoteAddress)})\n </div>\n </div>\n ) : (\n <div>{shortAddress(quoteAddress)}</div>\n )}\n </div>\n\n {/* price */}\n <div className=\"flex-none w-18\">\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate text-neutral\">\n {t(\"channels.events.walletTrade.price\")}\n </div>\n <div>{formatPriceUSD(event.data.quote_price_usd)}</div>\n </div>\n </div>\n </>\n )}\n\n {/* sell details */}\n {type === \"sell\" && (\n <>\n {/* sell amount */}\n <div className=\"flex-none w-18\">\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"text-neutral\">\n {t(\"channels.events.walletTrade.sell\")}\n </div>\n <div className=\"text-bearish\">\n {formatAmount(new SafeBigNumber(event.data.quote_amount).abs())}\n </div>\n </div>\n </div>\n\n {/* sell token */}\n <div className=\"flex-none w-24\">\n {quoteSymbol ? (\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate\">{quoteSymbol}</div>\n <div className=\"text-neutral\">\n ({shortAddress(quoteAddress)})\n </div>\n </div>\n ) : (\n <div>{shortAddress(quoteAddress)}</div>\n )}\n </div>\n\n {/* cost amount */}\n <div className=\"flex-none w-18\">\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"text-neutral\">\n {t(\"channels.events.walletTrade.got\")}\n </div>\n <div className={\"text-bullish\"}>\n {formatAmount(new SafeBigNumber(event.data.base_amount).abs())}\n </div>\n </div>\n </div>\n\n {/* got token */}\n <div className=\"flex-none w-24\">\n {baseSymbol ? (\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate\">{baseSymbol}</div>\n <div className=\"text-neutral\">\n ({shortAddress(baseAddress)})\n </div>\n </div>\n ) : (\n <div>{shortAddress(baseAddress)}</div>\n )}\n </div>\n\n {/* price */}\n <div className=\"flex-none w-18\">\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate text-neutral\">\n {t(\"channels.events.walletTrade.price\")}\n </div>\n <div>{formatPriceUSD(event.data.quote_price_usd)}</div>\n </div>\n </div>\n </>\n )}\n\n {/* timestamp */}\n <div className=\"flex-none w-18 text-end\">{formatAge(age)}</div>\n </div>\n );\n}\n","import { useCallback, useMemo, useRef } from \"react\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChannelEvent, Token } from \"@liberfi.io/types\";\nimport {\n clsx,\n EmptyIcon,\n List,\n RowComponentProps,\n Skeleton,\n useInfiniteLoader,\n} from \"@liberfi.io/ui\";\nimport { ChannelEventRowProps } from \"../../types\";\nimport { WalletTradeEvent } from \"./wallet-trade\";\n\nexport type ChannelEventsUIProps = {\n data?: Array<ChannelEvent>;\n isLoading?: boolean;\n hasMore?: boolean;\n onFetchMore?: () => void;\n className?: string;\n walletAliases?: Record<string, string | undefined>;\n tokens?: Record<string, Token>;\n};\n\nexport function ChannelEventsUI({\n data = [],\n isLoading = false,\n hasMore = false,\n onFetchMore,\n className,\n walletAliases,\n tokens,\n}: ChannelEventsUIProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n const { height } = useResizeObserver<HTMLDivElement>({ ref });\n\n const isItemLoaded = useCallback(\n (index: number) => {\n return index < data.length;\n },\n [data],\n );\n\n const loadMoreItems = useCallback(async () => {\n onFetchMore?.();\n }, [onFetchMore]);\n\n const itemCount = useMemo(\n () => (hasMore ? data.length + 1 : data.length),\n [data, hasMore],\n );\n\n const onRowsLoaded = useInfiniteLoader({\n isRowLoaded: isItemLoaded,\n loadMoreRows: loadMoreItems,\n rowCount: itemCount,\n threshold: 3,\n });\n\n if (isLoading) {\n return <Skeletons />;\n }\n\n if (!data || data.length === 0) {\n return <Empty />;\n }\n\n return (\n <div\n className={clsx(\n \"w-full h-full bg-content1 border border-border rounded-lg py-2.5 overflow-x-auto\",\n className,\n )}\n >\n {/* min width is the sum of all columns' widths + 20px for padding */}\n <div className=\"w-full min-w-164 h-full\" ref={ref}>\n <List\n style={{ height }}\n onRowsRendered={onRowsLoaded}\n rowComponent={Row}\n rowCount={itemCount}\n rowHeight={60}\n rowProps={{ data, walletAliases, tokens }}\n />\n </div>\n </div>\n );\n}\n\nfunction Empty() {\n const { t } = useTranslation();\n\n return (\n <div className=\"w-full bg-content1 border border-border rounded-lg p-2.5\">\n <EmptyIcon\n width={28}\n height={28}\n className=\"text-neutral mx-auto mt-20\"\n />\n <p className=\"pt-2 text-sm text-neutral text-center mb-20\">\n {t(\"channels.events.empty\")}\n </p>\n </div>\n );\n}\n\nfunction Skeletons() {\n return (\n <div className=\"w-full bg-content1 border border-border rounded-lg p-2.5\">\n {Array.from({ length: 6 }).map((_, index) => (\n <div key={index} className=\"w-full h-10 flex items-center\">\n <Skeleton className=\"w-full h-6 rounded-md\" />\n </div>\n ))}\n </div>\n );\n}\n\ntype RowProps = RowComponentProps<{\n data?: Array<ChannelEvent>;\n walletAliases?: Record<string, string | undefined>;\n tokens?: Record<string, Token>;\n}>;\n\nfunction Row({ index, style, data, walletAliases, tokens }: RowProps) {\n const { t } = useTranslation();\n\n if (!data) {\n return <div className=\"px-2.5\" style={style}></div>;\n }\n\n const event = data[index];\n if (!event) {\n return (\n <div style={style} className=\"px-2.5 text-xs text-neutral text-center\">\n {t(\"common.loadingMore\")}\n </div>\n );\n }\n\n return (\n <div style={style} className=\"px-2.5 hover:bg-content2\">\n <RowContent event={event} walletAliases={walletAliases} tokens={tokens} />\n </div>\n );\n}\n\nfunction RowContent(props: ChannelEventRowProps) {\n switch (props.event.type) {\n case \"wallet\":\n return <WalletTradeEvent {...props} />;\n default:\n return <></>;\n }\n}\n","import { useMemo } from \"react\";\nimport { ChannelEvent } from \"@liberfi.io/types\";\nimport { uniqBy } from \"@liberfi.io/utils\";\nimport {\n useChannelEventsInfiniteQuery,\n useChannelEventsQuery,\n} from \"../../hooks\";\n\nexport type UseChannelEventsReturnType = Omit<\n ReturnType<typeof useChannelEventsInfiniteQuery>,\n \"data\"\n> & {\n data: Array<ChannelEvent>;\n};\n\nexport function useChannelEvents(\n channelId: string,\n): UseChannelEventsReturnType {\n // infinite query older events\n const { data: historyData, ...others } = useChannelEventsInfiniteQuery(\n channelId,\n {\n next_page: true,\n limit: 50,\n },\n );\n\n // fetch latest events periodically\n const { data: latestData } = useChannelEventsQuery(\n channelId,\n {\n next_page: false,\n limit: 50,\n },\n { refetchInterval: 10000 },\n );\n\n // merge history & latest events\n const data = useMemo(() => {\n const historyEvents =\n historyData?.pages?.flatMap((page) => page.data) ?? [];\n const newEvents = latestData?.data ?? [];\n\n const combinedEvents = uniqBy(\n [...newEvents, ...historyEvents],\n (event) => event.data.tx_hash + \":\" + event.data.type,\n );\n return combinedEvents.sort((a, b) => b.timestamp - a.timestamp);\n }, [historyData, latestData]);\n\n return {\n ...others,\n data,\n };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { fetchTokens, useDexClient } from \"@liberfi.io/client\";\nimport { Chain, ChannelEvent, Token } from \"@liberfi.io/types\";\nimport { COMMON_TOKEN_ADDRESSES } from \"@liberfi.io/utils\";\n\nexport function useChannelEventsTokens(events: Array<ChannelEvent>) {\n const { client } = useDexClient();\n\n const [tokens, setTokens] = useState<Record<string, Token>>({});\n\n const queriedAddresses = useRef<Set<string>>(new Set());\n\n useEffect(() => {\n const addresses = new Set<string>();\n events.forEach((event) => {\n if (\n !COMMON_TOKEN_ADDRESSES.includes(event.data.quote_address) &&\n !queriedAddresses.current.has(event.data.quote_address)\n ) {\n addresses.add(event.data.quote_address);\n queriedAddresses.current.add(event.data.quote_address);\n }\n if (\n !COMMON_TOKEN_ADDRESSES.includes(event.data.base_address) &&\n !queriedAddresses.current.has(event.data.base_address)\n ) {\n addresses.add(event.data.base_address);\n queriedAddresses.current.add(event.data.base_address);\n }\n });\n if (addresses.size > 0) {\n fetchTokens(client, {\n chain: Chain.SOLANA,\n addresses: Array.from(addresses),\n })\n .then((tokens) => {\n setTokens((prev) => {\n const next: Record<string, Token> = { ...prev };\n tokens.forEach((token) => {\n next[token.address] = token;\n });\n return next;\n });\n })\n .catch((error) => {\n console.error(error);\n });\n }\n }, [events, client]);\n\n return { tokens };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { EmptyIcon } from \"@liberfi.io/ui\";\n\nexport function ChannelDetailNotFound() {\n const { t } = useTranslation();\n return (\n <div className=\"w-full\">\n <EmptyIcon\n width={40}\n height={40}\n className=\"mt-10 text-neutral mx-auto\"\n />\n <p className=\"text-sm text-neutral text-center mt-2\">\n {t(\"channels.detail.notfound\")}\n </p>\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport function ChannelDetailSkeletons() {\n return (\n <div className=\"w-full space-y-6\">\n <Skeleton className=\"w-full h-35 rounded-md\" />\n <Skeleton className=\"w-full h-40 rounded-md\" />\n </div>\n );\n}\n","import { useChannelQuery } from \"../../hooks\";\n\nexport const useChannelDetail = (id: string) => {\n return useChannelQuery(id);\n};\n","import { useMemo } from \"react\";\nimport { ChannelSource } from \"@liberfi.io/types\";\nimport { keyBy, mapValues } from \"@liberfi.io/utils\";\nimport { useChannelSourcesQuery } from \"../../hooks\";\n\nexport type UseChannelWalletsReturnType = {\n wallets: Array<ChannelSource>;\n aliases: Record<string, string | undefined>;\n};\n\nexport function useChannelWallets(id: string): UseChannelWalletsReturnType {\n const { data } = useChannelSourcesQuery(id);\n\n const wallets = useMemo(() => {\n return data?.filter((source) => source.type === \"wallet\") ?? [];\n }, [data]);\n\n const aliases = useMemo(() => {\n return mapValues(\n keyBy(\n wallets.filter((it) => !!it.alias),\n \"value\",\n ),\n (it) => it.alias,\n );\n }, [wallets]);\n\n return {\n wallets,\n aliases,\n };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { ChannelEventsUI, useChannelEvents } from \"../events\";\nimport { useChannelEventsTokens } from \"../events/channel-events-tokens.script\";\nimport { ChannelDetailNotFound } from \"./channel-detail-notfound\";\nimport { ChannelDetailSkeletons } from \"./channel-detail-skeletons\";\nimport { useChannelDetail } from \"./channel-detail.script\";\nimport { ChannelDetailUI } from \"./channel-detail.ui\";\nimport { useChannelWallets } from \"./channel-wallets.script\";\n\nexport type ChannelDetailWidgetProps = {\n id: string;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function ChannelDetailWidget({\n id,\n customHeaderActions,\n customFooterActions,\n}: ChannelDetailWidgetProps) {\n const { t } = useTranslation();\n\n const { data: channel, isLoading } = useChannelDetail(id);\n\n const {\n data: events,\n isLoading: isLoadingEvents,\n hasNextPage: hasMoreEvents,\n fetchNextPage: fetchMoreEvents,\n } = useChannelEvents(id);\n\n const { aliases } = useChannelWallets(id);\n\n const { tokens } = useChannelEventsTokens(events);\n\n if (isLoading) {\n return <ChannelDetailSkeletons />;\n }\n\n if (!channel) {\n return <ChannelDetailNotFound />;\n }\n\n return (\n <div className=\"w-full h-full flex flex-col gap-6\">\n <ChannelDetailUI\n channel={channel}\n headerActions={customHeaderActions?.(channel)}\n footerActions={customFooterActions?.(channel)}\n className=\"flex-none\"\n />\n <div className=\"flex-auto min-h-0 flex flex-col gap-2.5\">\n <h2 className=\"text-sm font-semibold flex-none\">\n {t(\"channels.events.title\")}\n </h2>\n <ChannelEventsUI\n data={events}\n isLoading={isLoadingEvents}\n hasMore={hasMoreEvents}\n onFetchMore={fetchMoreEvents}\n className=\"flex-auto min-h-0\"\n walletAliases={aliases}\n tokens={tokens}\n />\n </div>\n </div>\n );\n}\n","import { Key, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport {\n Button,\n HorizontalScrollContainer,\n PlusIcon,\n StyledTabs,\n Tab,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport {\n MyChannelsWidget,\n SubscribedChannelsWidget,\n TrendingChannelsWidget,\n} from \"./channels\";\n\nexport type ChannelHomePageProps = {\n onCreateChannel?: () => void;\n onSelectChannel?: (channel: Channel) => void;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function ChannelsHomePage({\n onCreateChannel,\n onSelectChannel,\n customHeaderActions,\n customFooterActions,\n}: ChannelHomePageProps) {\n const { t } = useTranslation();\n\n const { isMobile } = useScreen();\n\n const [activeTab, setActiveTab] = useState<\"trending\" | \"my\" | \"subscribed\">(\n \"trending\",\n );\n\n return (\n <div className=\"w-full max-w-7xl mx-auto py-2 px-2 sm:py-4 sm:px-4\">\n <div className=\"flex items-center justify-between gap-2 w-full overflow-x-auto\">\n <HorizontalScrollContainer className=\"flex-auto min-w-0\">\n <StyledTabs\n variant=\"primaryPlain\"\n radius=\"lg\"\n selectedKey={activeTab}\n onSelectionChange={setActiveTab as (key: Key) => void}\n aria-label={t(\"channels.list.title\")}\n size={isMobile ? \"sm\" : undefined}\n >\n <Tab\n key=\"trending\"\n title={t(\"channels.trending.title\")}\n aria-label={t(\"channels.trending.title\")}\n />\n <Tab\n key=\"my\"\n title={t(\"channels.my.title\")}\n aria-label={t(\"channels.my.title\")}\n />\n <Tab\n key=\"subscribed\"\n title={t(\"channels.subscribed.title\")}\n aria-label={t(\"channels.subscribed.title\")}\n />\n </StyledTabs>\n </HorizontalScrollContainer>\n <div className=\"flex-none flex items-center gap-2\">\n {onCreateChannel && (\n <>\n <Button\n radius=\"lg\"\n color=\"primary\"\n size=\"sm\"\n onPress={onCreateChannel}\n className=\"max-sm:hidden gap-1\"\n startContent={<PlusIcon width={18} height={18} />}\n aria-label={t(\"channels.create.title\")}\n >\n {t(\"channels.create.title\")}\n </Button>\n <Button\n isIconOnly\n radius=\"full\"\n color=\"primary\"\n size=\"sm\"\n onPress={onCreateChannel}\n className=\"sm:hidden w-7 min-w-7 h-7 min-h-7\"\n aria-label={t(\"channels.create.title\")}\n >\n <PlusIcon width={18} height={18} />\n </Button>\n </>\n )}\n </div>\n </div>\n\n <div className=\"mt-4 w-full\">\n {activeTab === \"trending\" && (\n <TrendingChannelsWidget\n onSelect={onSelectChannel}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n )}\n {activeTab === \"my\" && (\n <MyChannelsWidget\n onSelect={onSelectChannel}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n )}\n {activeTab === \"subscribed\" && (\n <SubscribedChannelsWidget\n onSelect={onSelectChannel}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n )}\n </div>\n </div>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { ChannelDetailWidget } from \"./channel-detail\";\n\nexport type ChannelDetailPageProps = {\n id: string;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function ChannelsDetailPage({\n id,\n customHeaderActions,\n customFooterActions,\n}: ChannelDetailPageProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"w-full h-full max-w-2xl mx-auto py-2 px-2 sm:py-4 sm:px-4 flex flex-col gap-2 sm:gap-4\">\n <h1 className=\"text-sm sm:text-lg font-semibold flex-none\">\n {t(\"channels.detail.title\")}\n </h1>\n <div className=\"w-full flex-auto min-h-0\">\n <ChannelDetailWidget\n id={id}\n customFooterActions={customFooterActions}\n customHeaderActions={customHeaderActions}\n />\n </div>\n </div>\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { API } from \"@liberfi.io/types\";\nimport { ChannelsContext } from \"../context\";\n\nexport type ChannelsProviderProps = PropsWithChildren<{\n client: API.IChannelsClient;\n}>;\n\nexport function ChannelsProvider({ client, children }: ChannelsProviderProps) {\n return (\n <ChannelsContext.Provider value={{ client }}>\n {children}\n </ChannelsContext.Provider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/context/ChannelsContext.tsx","../src/hooks/useChannelsContext.ts","../src/hooks/useChannelsClient.ts","../src/hooks/useChannelEventsQuery.ts","../src/hooks/useChannelEventsInfiniteQuery.ts","../src/hooks/useChannelQuery.ts","../src/hooks/useChannelsListQuery.ts","../src/hooks/useChannelSourcesQuery.ts","../src/hooks/useCreateChannelMutation.ts","../src/hooks/useMyChannelsListQuery.ts","../src/hooks/useSubscribeChannelMutation.ts","../src/hooks/useSubscribedChannelsListQuery.ts","../src/hooks/useUnsubscribeChannelMutation.ts","../src/hooks/useUpdateChannelMutation.ts","../src/hooks/useUpdateChannelSourcesMutation.ts","../src/hooks/useUpload.ts","../src/hooks/useXEligibilityQuery.ts","../src/hooks/useXAuthorizeUrlQuery.ts","../src/types/form.ts","../src/components/channel-form/base-form.ui.tsx","../src/components/channel-form/create-channel.widget.tsx","../src/components/channel-form/update-base-form.script.tsx","../src/components/channel-form/socials/telegram-form.ui.tsx","../src/components/channel-form/socials-form.ui.tsx","../src/utils.ts","../src/components/channel-form/wallets-list.ui.tsx","../src/components/channel-form/wallets-form.ui.tsx","../src/components/channel-form/update-channel-form.ui.tsx","../src/components/channel-form/update-channel-form-skeletons.tsx","../src/components/channel-form/update-wallets-form.script.tsx","../src/components/channel-form/update-channel.widget.tsx","../src/icons/status-icons.tsx","../src/icons/x-icon.tsx","../src/components/channel-form/check-eligibility.ui.tsx","../src/components/channel-form/check-eligibility.script.tsx","../src/components/channel-form/check-eligibility.widget.tsx","../src/components/channel-form/channel-basic-info.ui.tsx","../src/components/channel-form/channel-basic-info.script.tsx","../src/components/channel-form/channel-basic-info.widget.tsx","../src/components/channel-form/wallet-import.ui.tsx","../src/components/channel-form/wallet-import.script.tsx","../src/components/channel-form/wallet-import.widget.tsx","../src/components/channel-form/social-bots.ui.tsx","../src/components/channel-form/social-bots.script.tsx","../src/components/channel-form/social-bots.widget.tsx","../src/components/channel/channel-attributes.tsx","../src/components/channel/channel-baseinfo.tsx","../src/components/channel/channel-edit-button.tsx","../src/components/channel/channel-stats.tsx","../src/components/channel/channel-subscribe-button.tsx","../src/components/channels/channels-item.ui.tsx","../src/components/channels/channels.ui.tsx","../src/components/channels/channels-skeleton.ui.tsx","../src/components/channels/channels-empty.ui.tsx","../src/components/channels/trending-channels.script.tsx","../src/components/channels/trending-channels.widget.tsx","../src/components/channels/channels-unauthenticated.ui.tsx","../src/components/channels/subscribed-channels.widget.tsx","../src/components/channels/subscribed-channels.script.tsx","../src/components/channels/my-channels.widget.tsx","../src/components/channels/my-channels.script.tsx","../src/components/channel-detail/channel-detail.ui.tsx","../src/components/events/wallet-trade.tsx","../src/components/events/channel-events.ui.tsx","../src/components/events/channel-events.script.tsx","../src/components/events/channel-events-tokens.script.tsx","../src/components/channel-detail/channel-detail-notfound.tsx","../src/components/channel-detail/channel-detail-skeletons.tsx","../src/components/channel-detail/channel-detail.script.tsx","../src/components/channel-detail/channel-wallets.script.tsx","../src/components/channel-detail/channel-detail.widget.tsx","../src/components/channel-detail-new/activity-feed.script.tsx","../src/components/channel-detail-new/activity-feed.ui.tsx","../src/components/channel-detail-new/activity-feed.widget.tsx","../src/components/channel-detail-new/tab-container.script.tsx","../src/components/channel-detail-new/tokens-list.script.tsx","../src/components/channel-detail-new/tokens-list.ui.tsx","../src/components/channel-detail-new/tokens-list.widget.tsx","../src/components/channel-detail-new/traders-table.script.tsx","../src/components/channel-detail-new/traders-table.ui.tsx","../src/components/channel-detail-new/traders-table.widget.tsx","../src/components/channel-detail-new/tab-container.ui.tsx","../src/components/channel-detail-new/tab-container.widget.tsx","../src/components/channel-detail-new/channel-detail-new.ui.tsx","../src/components/channel-detail-new/channel-detail-new.script.tsx","../src/components/channel-detail-new/channel-detail-new.widget.tsx","../src/components/find-channel/find-channel.script.tsx","../src/components/find-channel/find-channel.ui.tsx","../src/components/find-channel/find-channel.widget.tsx","../src/components/my-subscribe/my-subscribe.script.tsx","../src/components/my-subscribe/my-subscribe.ui.tsx","../src/components/my-subscribe/my-subscribe.widget.tsx","../src/components/channels-home.page.tsx","../src/components/channels-detail.page.tsx","../src/components/stepper/stepper.ui.tsx","../src/providers/ChannelsProvider.tsx"],"names":["version_default","ChannelsContext","createContext","useChannelsContext","context","useContext","useChannelsClient","client","channelEventsQueryKey","channelId","params","fetchChannelEvents","useChannelEventsQuery","options","useQuery","channelEventsInfiniteQueryKey","useChannelEventsInfiniteQuery","useInfiniteQuery","pageParam","lastPage","_allPages","lastPageParam","channelQueryKey","id","fetchChannel","useChannelQuery","channelsListQueryKey","fetchChannelsList","chainSlug","useChannelsListQuery","channelSourcesQueryKey","fetchChannelSources","useChannelSourcesQuery","createChannel","chain","useCreateChannelMutation","useMutation","myChannelsListQueryKey","fetchMyChannelsList","useMyChannelsListQuery","subscribeChannel","useSubscribeChannelMutation","queryClient","useQueryClient","data","variables","onMutateResult","subscribedChannelsListQueryKey","fetchSubscribedChannelsList","useSubscribedChannelsListQuery","unsubscribeChannel","useUnsubscribeChannelMutation","updateChannel","useUpdateChannelMutation","updateChannelSources","useUpdateChannelSourcesMutation","useUpload","pinata","usePinata","useDexClient","useCallback","file","signedURL","fetchPresignedUploadUrl","res","xEligibilityQueryKey","fetchXEligibility","useXEligibilityQuery","xAuthorizeUrlQueryKey","returnUrl","fetchXAuthorizeUrl","useXAuthorizeUrlQuery","baseFormSchema","z","walletSchema","walletsFormSchema","BaseFormUI","isSubmitting","onSubmit","defaultValues","submitLabel","t","useTranslation","formMethods","useForm","zodResolver","upload","jsxs","RHForm","jsx","RHInput","RHTextArea","RHUpload","Button","CreateChannelWidget","onSuccess","onError","createAsync","isPending","useAuthCallback","channel","Chain","toast","error","useUpdateBaseForm","isLoading","mutateAsync","useMemo","submit","TelegramFormUI","sink","onSaveToken","token","setToken","useState","useEffect","StyledInput","SocialsFormUI","socialType","setSocialType","StyledTabs","Tab","TelegramIcon","parseWalletsText","value","line","address","alias","WalletsListUI","wallets","copy","useCopyToClipboard","handleDelete","wallet","formValues","w","search","setSearch","debouncedSetSearch","debounce","filteredWallets","SearchIcon","StyledTable","TableHeader","TableColumn","TableBody","EmptyIcon","TableRow","TableCell","shortAddress","CopyIcon","TrashIcon","formSchema","WalletsFormUI","walletsFormValues","it","setError","reset","validateWallets","walletsText","parsedWallets","duplicatedCount","uniqBy","alreadyAddedCount","intersectionBy","invalidCount","isValidWalletAddress","handleSubmit","HorizontalScrollContainer","StyledTooltip","Chip","UpdateChannelFormUI","type","baseFormDefaultValues","isSubmittingBaseForm","onSubmitBaseForm","baseFormSubmitLabel","isSubmittingWalletsForm","onSubmitWalletsForm","className","activeTab","setActiveTab","isMobile","useScreen","clsx","UpdateChannelFormSkeletons","Skeletons","Skeleton","useUpdateWalletsForm","UpdateChannelWidget","isLoadingBaseForm","submitBaseForm","isLoadingWalletsForm","submitWalletsForm","CheckCircleIcon","props","XCircleIcon","XIcon","CheckEligibilityUI","isConnected","isConnecting","xUsername","checkItems","allChecksPassed","onConnect","onContinue","onCancel","item","index","useCheckEligibilityScript","minFollowers","minAccountAge","eventEmitter","useEventEmitter","accountInfo","setAccountInfo","checkStatuses","setCheckStatuses","eligibilityInfo","refetchEligibility","isCheckingEligibility","authorizeUrl","handleAuthSuccess","info","verifyEligibility","connect","disconnect","resolve","followersPass","prev","accountAgePass","behaviorPass","verify","CheckEligibilityWidget","setIsSubmitting","handleConnect","handleContinue","handleCancel","ChannelBasicInfoUI","presetAvatars","selectedAvatar","isCustomAvatar","channelName","nameSuggestions","description","descriptionMaxLength","descriptionSuggestions","onAvatarSelect","onCustomAvatarUpload","isUploadingAvatar","isRefreshingAvatars","onRefreshAvatars","isRefreshingNameSuggestions","onRefreshNameSuggestions","isRefreshingDescriptionSuggestions","onRefreshDescriptionSuggestions","onChannelNameChange","onNameSuggestionClick","onDescriptionChange","onDescriptionSuggestionClick","onBack","isContinueDisabled","showAllPresets","setShowAllPresets","handleFileUpload","event","displayedPresets","avatarsToDisplay","i","originalAvatar","avatar","Input","suggestion","Textarea","MOCK_PRESET_AVATARS","_","shuffleArray","array","newArray","j","MOCK_NAME_SUGGESTIONS_POOL","MOCK_DESCRIPTION_SUGGESTIONS_POOL","useChannelBasicInfoScript","initialName","initialDescription","initialAvatar","setSelectedAvatar","setIsCustomAvatar","setChannelName","setDescription","setIsUploadingAvatar","avatarSeed","setAvatarSeed","setIsRefreshingAvatars","nameSuggestionsSeed","setNameSuggestionsSeed","descriptionSuggestionsSeed","setDescriptionSuggestionsSeed","setIsRefreshingNameSuggestions","setIsRefreshingDescriptionSuggestions","selectAvatar","avatarUrl","isCustom","uploadCustomAvatar","localUrl","refreshPresetAvatars","refreshNameSuggestions","refreshDescriptionSuggestions","applyNameSuggestion","applyDescriptionSuggestion","validate","errors","ChannelBasicInfoWidget","handleBack","validation","WalletImportUI","walletInput","monitoredCount","maxWallets","monitoredWallets","isImporting","onWalletInputChange","onAddWallets","onAddWhaleWallets","onAddSmartWallets","onRemoveWallet","onPublish","isPublishDisabled","searchQuery","setSearchQuery","isImportExpanded","setIsImportExpanded","sortField","setSortField","sortDirection","setSortDirection","handleSort","field","sortedWallets","a","b","aValue","bValue","SortIcon","Fragment","e","parseWalletInput","input","lines","parts","p","useWalletImportScript","initialWallets","setWalletInput","setMonitoredWallets","setIsImporting","addWallets","invalidAddresses","addresses","duplicates","addr","existingAddresses","alreadyAdded","now","newWallets","addWhaleWallets","mockWhaleWallets","addSmartWallets","mockSmartWallets","removeWallet","WalletImportWidget","handleAddWallets","result","handlePublish","SocialBotsUI","telegramStatus","discordStatus","onCreateTelegramBot","onAddDiscordWebhook","useSocialBotsScript","initialTelegramStatus","initialDiscordStatus","setTelegramStatus","setDiscordStatus","createTelegramBot","addDiscordWebhook","SocialBotsWidget","ChannelAttributes","updatedAge","useTickAge","WalletIcon","PeopleIcon","TimerIcon","formatAge","Link","TwitterIcon","DiscordIcon","ChannelBaseInfo","customActions","chainIconUrl","chainIcon","Avatar","ChannelEditButton","onEdit","user","useAuth","handleEdit","StyledButton","EditIcon","ChannelStats","ChannelSubscribeButton","onSubscribeSuccess","onUnsubscribeSuccess","onSubscribeError","onUnsubscribeError","subscribed","setSubscribed","isSubscribing","isUnsubscribing","handleSubscribe","CheckIcon","PlusIcon","ChannelsItemUI","onSelect","headerActions","footerActions","handleSelect","ChannelsUI","channels","customHeaderActions","customFooterActions","ChannelsSkeletonUI","count","ChannelsEmptyUI","message","useTrendingChannels","status","refetch","TrendingChannelsWidget","channelList","ChannelsUnauthenticatedUI","signIn","SubscribedChannelsWidget","useSubscribedChannels","MyChannelsWidget","useMyChannels","ChannelDetailUI","WalletTradeEvent","walletAliases","tokens","age","quoteAddress","quoteSymbol","COMMON_TOKEN_SYMBOLS_MAP","baseAddress","baseSymbol","formatAmount","SafeBigNumber","formatPriceUSD","ChannelEventsUI","hasMore","onFetchMore","ref","useRef","height","useResizeObserver","isItemLoaded","loadMoreItems","itemCount","onRowsLoaded","useInfiniteLoader","Empty","List","Row","style","RowContent","useChannelEvents","historyData","others","latestData","historyEvents","page","newEvents","useChannelEventsTokens","events","setTokens","queriedAddresses","COMMON_TOKEN_ADDRESSES","fetchTokens","next","ChannelDetailNotFound","ChannelDetailSkeletons","useChannelDetail","useChannelWallets","source","aliases","mapValues","keyBy","ChannelDetailWidget","isLoadingEvents","hasMoreEvents","fetchMoreEvents","useActivityFeedScript","initialEvents","dateFilter","setDateFilter","addressFilter","setAddressFilter","eventFilter","setEventFilter","tokenSearch","setTokenSearch","MOCK_TRADE_EVENTS","ActivityFeedUI","onTokenSearchChange","LightningIcon","SolanaIcon","ActivityFeedWidget","useTabSwitch","initialTab","switchTab","tab","MOCK_TOKENS","useTokensList","initialTokens","formatNumber","TokensListUI","TokensListWidget","customTokens","useTradersTableScript","initialTraders","initialTimeFilter","timeFilter","setTimeFilter","traders","setTraders","dir","sortedTraders","toggleListen","traderId","trader","MOCK_TRADERS","timeFilters","formatVolume","formatPnl","TradersTableUI","onTimeFilterChange","onSort","onToggleListen","filter","TradersTableWidget","TabContainerUI","onTabSwitch","tokensCount","tradersCount","TabContainerWidget","ChannelDetailNewUI","channelData","onSubscribe","onShare","onListen","useChannelDetailNewScript","ChannelDetailNewWidget","setIsSubscribing","handleShare","handleListen","useFindChannelScript","initialChannels","hasCreatedChannel","selectedChain","setSelectedChain","selectedSort","setSelectedSort","setChannels","chainOptions","sortOptions","filteredChannels","query","aPnl","aRate","handleChainChange","handleSortChange","sort","handleSearchChange","handleChannelClick","handleCreateChannel","handleChannelManagement","FindChannelUI","onChainChange","onSortChange","onSearchChange","onChannelClick","onCreateChannel","onChannelManagement","Select","keys","selected","option","SelectItem","items","selectedItem","opt","displayText","FindChannelWidget","externalOnChannelClick","externalOnCreateChannel","externalOnChannelManagement","hasChannel","useMySubscribeScript","isSidebarCollapsed","setIsSidebarCollapsed","selectedChannelId","setSelectedChannelId","handleSidebarToggle","handleChannelSelect","handleSwitchToDiscover","MySubscribeUI","subscribedChannels","onSidebarToggle","onChannelSelect","onSwitchToDiscover","MySubscribeWidget","externalOnSwitchToDiscover","ChannelsHomePage","onSelectChannel","ChannelsDetailPage","StepperUI","steps","step","isLast","isCompleted","isCurrent","ChannelsProvider","children"],"mappings":"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","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-channels\"] = \"0.1.21\";\n}\n\nexport default \"0.1.21\";\n","import { createContext } from \"react\";\nimport { API } from \"@liberfi.io/types\";\n\nexport interface ChannelsContextValue {\n client: API.IChannelsClient;\n}\n\nexport const ChannelsContext = createContext<ChannelsContextValue>(\n {} as ChannelsContextValue,\n);\n","import { useContext } from \"react\";\nimport { ChannelsContext } from \"../context\";\n\nexport function useChannelsContext() {\n const context = useContext(ChannelsContext);\n if (!context) {\n throw new Error(\n \"useChannelsContext must be used within a ChannelsProvider\",\n );\n }\n return context;\n}\n","import { useChannelsContext } from \"./useChannelsContext\";\n\nexport function useChannelsClient() {\n const { client } = useChannelsContext();\n return client;\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { API, IChannelsClient } from \"@liberfi.io/types\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport type UseChannelEventsQueryParams = API.ListChannelEventsOptions;\n\nexport function channelEventsQueryKey(\n channelId: string,\n params: UseChannelEventsQueryParams,\n): string[] {\n return [\n \"channelEvents\",\n channelId,\n params.limit ? `${params.limit}` : \"\",\n params.timestamp ? `${params.timestamp}` : \"\",\n params.next_page ? `${params.next_page}` : \"\",\n ];\n}\n\nexport async function fetchChannelEvents(\n client: IChannelsClient,\n channelId: string,\n params: UseChannelEventsQueryParams,\n): Promise<API.ChannelEventsList> {\n return await client.getChannelEvents(channelId, params);\n}\n\nexport function useChannelEventsQuery(\n channelId: string,\n params: UseChannelEventsQueryParams = {},\n options: Omit<\n UseQueryOptions<\n API.ChannelEventsList,\n Error,\n API.ChannelEventsList,\n string[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: channelEventsQueryKey(channelId, params),\n queryFn: async () => fetchChannelEvents(client, channelId, params),\n ...options,\n });\n}\n","import {\n InfiniteData,\n useInfiniteQuery,\n UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport { API } from \"@liberfi.io/types\";\nimport {\n fetchChannelEvents,\n UseChannelEventsQueryParams,\n} from \"./useChannelEventsQuery\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport function channelEventsInfiniteQueryKey(channelId: string): string[] {\n return [\"channelEvents\", \"infinite\", channelId];\n}\n\nexport function useChannelEventsInfiniteQuery(\n channelId: string,\n params: UseChannelEventsQueryParams = {},\n options: Omit<\n UseInfiniteQueryOptions<\n API.ChannelEventsList,\n Error,\n InfiniteData<API.ChannelEventsList>,\n string[],\n UseChannelEventsQueryParams\n >,\n \"queryKey\" | \"queryFn\" | \"getNextPageParam\" | \"initialPageParam\"\n > = {},\n): ReturnType<typeof useInfiniteQuery<API.ChannelEventsList, Error>> {\n const client = useChannelsClient();\n return useInfiniteQuery({\n queryKey: channelEventsInfiniteQueryKey(channelId),\n queryFn: async ({ pageParam }) =>\n fetchChannelEvents(client, channelId, pageParam),\n initialPageParam: params,\n getNextPageParam: (lastPage, _allPages, lastPageParam) => {\n return lastPage.has_more\n ? {\n timestamp: lastPage.next_timestamp,\n next_page: lastPageParam.next_page,\n limit: lastPageParam.limit,\n }\n : undefined;\n },\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { Channel, IChannelsClient } from \"@liberfi.io/types\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport function channelQueryKey(id: string): string[] {\n return [\"channel\", id];\n}\n\nexport async function fetchChannel(\n client: IChannelsClient,\n id: string,\n): Promise<Channel> {\n return await client.get(id);\n}\n\nexport function useChannelQuery(\n id: string,\n options: Omit<\n UseQueryOptions<Channel, Error, Channel, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: channelQueryKey(id),\n queryFn: async () => fetchChannel(client, id),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { API, Chain, IChannelsClient } from \"@liberfi.io/types\";\nimport { chainSlug } from \"@liberfi.io/utils\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport interface UseChannelsListQueryParams\n extends Omit<API.ListChannelsOptions, \"chain\"> {\n chain?: Chain;\n}\n\nexport function channelsListQueryKey(\n params: UseChannelsListQueryParams,\n): string[] {\n return [\n \"channels\",\n params.chain ?? \"\",\n params.page ? `${params.page}` : \"\",\n params.size ? `${params.size}` : \"\",\n params.search ?? \"\",\n params.sort ?? \"\",\n params.order ?? \"\",\n ];\n}\n\nexport async function fetchChannelsList(\n client: IChannelsClient,\n params: UseChannelsListQueryParams,\n): Promise<API.ChannelsList> {\n const options: API.ListChannelsOptions = {\n ...params,\n chain: params.chain ? chainSlug(params.chain) : undefined,\n };\n return await client.getChannels(options);\n}\n\nexport function useChannelsListQuery(\n params: UseChannelsListQueryParams = {},\n options: Omit<\n UseQueryOptions<API.ChannelsList, Error, API.ChannelsList, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: channelsListQueryKey(params),\n queryFn: async () => fetchChannelsList(client, params),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { ChannelSource, IChannelsClient } from \"@liberfi.io/types\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport function channelSourcesQueryKey(channelId: string): string[] {\n return [\"channelSources\", channelId];\n}\n\nexport async function fetchChannelSources(\n client: IChannelsClient,\n channelId: string,\n): Promise<Array<ChannelSource>> {\n return await client.getSources(channelId);\n}\n\nexport function useChannelSourcesQuery(\n channelId: string,\n options: Omit<\n UseQueryOptions<\n Array<ChannelSource>,\n Error,\n Array<ChannelSource>,\n string[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: channelSourcesQueryKey(channelId),\n queryFn: async () => fetchChannelSources(client, channelId),\n ...options,\n });\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport { API, Chain, Channel, IChannelsClient } from \"@liberfi.io/types\";\nimport { chainSlug } from \"@liberfi.io/utils\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport interface UseCreateChannelMutationParams\n extends Omit<API.CreateChannelOptions, \"chain\"> {\n chain: Chain;\n}\n\nexport async function createChannel(\n client: IChannelsClient,\n params: UseCreateChannelMutationParams,\n): Promise<Channel> {\n const chain = chainSlug(params.chain);\n if (!chain) {\n throw new Error(\"Invalid chain\");\n }\n return client.create({ ...params, chain });\n}\n\nexport function useCreateChannelMutation(\n options: Omit<\n UseMutationOptions<\n Channel,\n Error,\n UseCreateChannelMutationParams,\n string[]\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useMutation({\n mutationFn: async (params: UseCreateChannelMutationParams) =>\n createChannel(client, params),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { API, Chain, IChannelsClient } from \"@liberfi.io/types\";\nimport { chainSlug } from \"@liberfi.io/utils\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport interface UseMyChannelsListQueryParams\n extends Omit<API.ListChannelsOptions, \"chain\"> {\n chain?: Chain;\n}\n\nexport function myChannelsListQueryKey(\n params: UseMyChannelsListQueryParams,\n): string[] {\n return [\n \"myChannels\",\n params.chain ?? \"\",\n params.page ? `${params.page}` : \"\",\n params.size ? `${params.size}` : \"\",\n params.search ?? \"\",\n params.sort ?? \"\",\n params.order ?? \"\",\n ];\n}\n\nexport async function fetchMyChannelsList(\n client: IChannelsClient,\n params: UseMyChannelsListQueryParams,\n): Promise<API.ChannelsList> {\n const options: API.ListChannelsOptions = {\n ...params,\n chain: params.chain ? chainSlug(params.chain) : undefined,\n };\n return await client.getMyChannels(options);\n}\n\nexport function useMyChannelsListQuery(\n params: UseMyChannelsListQueryParams = {},\n options: Omit<\n UseQueryOptions<API.ChannelsList, Error, API.ChannelsList, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: myChannelsListQueryKey(params),\n queryFn: async () => fetchMyChannelsList(client, params),\n ...options,\n });\n}\n","import {\n useMutation,\n UseMutationOptions,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { IChannelsClient } from \"@liberfi.io/types\";\nimport { channelQueryKey } from \"./useChannelQuery\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport async function subscribeChannel(\n client: IChannelsClient,\n id: string,\n): Promise<void> {\n await client.subscribe(id);\n}\n\nexport function useSubscribeChannelMutation(\n options: Omit<\n UseMutationOptions<void, Error, string, string[]>,\n \"mutationFn\"\n > = {},\n) {\n const queryClient = useQueryClient();\n const client = useChannelsClient();\n return useMutation({\n mutationFn: async (id: string) => subscribeChannel(client, id),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n queryClient.invalidateQueries({ queryKey: [\"subscribedChannels\"] });\n queryClient.invalidateQueries({ queryKey: channelQueryKey(variables) });\n options?.onSuccess?.(data, variables, onMutateResult, context);\n },\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { API, Chain, IChannelsClient } from \"@liberfi.io/types\";\nimport { chainSlug } from \"@liberfi.io/utils\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport interface UseSubscribedChannelsListQueryParams\n extends Omit<API.ListChannelsOptions, \"chain\"> {\n chain?: Chain;\n}\n\nexport function subscribedChannelsListQueryKey(\n params: UseSubscribedChannelsListQueryParams,\n): string[] {\n return [\n \"subscribedChannels\",\n params.chain ?? \"\",\n params.page ? `${params.page}` : \"\",\n params.size ? `${params.size}` : \"\",\n params.search ?? \"\",\n params.sort ?? \"\",\n params.order ?? \"\",\n ];\n}\n\nexport async function fetchSubscribedChannelsList(\n client: IChannelsClient,\n params: UseSubscribedChannelsListQueryParams,\n): Promise<API.ChannelsList> {\n const options: API.ListChannelsOptions = {\n ...params,\n chain: params.chain ? chainSlug(params.chain) : undefined,\n };\n return await client.getSubscribedChannels(options);\n}\n\nexport function useSubscribedChannelsListQuery(\n params: UseSubscribedChannelsListQueryParams = {},\n options: Omit<\n UseQueryOptions<API.ChannelsList, Error, API.ChannelsList, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: subscribedChannelsListQueryKey(params),\n queryFn: async () => fetchSubscribedChannelsList(client, params),\n ...options,\n });\n}\n","import {\n useMutation,\n UseMutationOptions,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { IChannelsClient } from \"@liberfi.io/types\";\nimport { channelQueryKey } from \"./useChannelQuery\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport async function unsubscribeChannel(\n client: IChannelsClient,\n id: string,\n): Promise<void> {\n await client.unsubscribe(id);\n}\n\nexport function useUnsubscribeChannelMutation(\n options: Omit<\n UseMutationOptions<void, Error, string, string[]>,\n \"mutationFn\"\n > = {},\n) {\n const client = useChannelsClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => unsubscribeChannel(client, id),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n queryClient.invalidateQueries({ queryKey: [\"subscribedChannels\"] });\n queryClient.invalidateQueries({ queryKey: channelQueryKey(variables) });\n options?.onSuccess?.(data, variables, onMutateResult, context);\n },\n });\n}\n","import {\n useMutation,\n UseMutationOptions,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { API, Chain, Channel, IChannelsClient } from \"@liberfi.io/types\";\nimport { chainSlug } from \"@liberfi.io/utils\";\nimport { channelQueryKey } from \"./useChannelQuery\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport interface UseUpdateChannelMutationParams\n extends Omit<API.UpdateChannelOptions, \"chain\"> {\n chain?: Chain;\n}\n\nexport async function updateChannel(\n client: IChannelsClient,\n params: UseUpdateChannelMutationParams,\n): Promise<Channel> {\n const options: API.UpdateChannelOptions = { ...params };\n if (params.chain) {\n const chain = chainSlug(params.chain);\n if (!chain) {\n throw new Error(\"Invalid chain\");\n }\n options.chain = chain;\n }\n return client.update(options);\n}\n\nexport function useUpdateChannelMutation(\n options: Omit<\n UseMutationOptions<\n Channel,\n Error,\n UseUpdateChannelMutationParams,\n string[]\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = useChannelsClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (params: UseUpdateChannelMutationParams) =>\n updateChannel(client, params),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n queryClient.invalidateQueries({\n queryKey: channelQueryKey(variables.id),\n });\n options?.onSuccess?.(data, variables, onMutateResult, context);\n },\n });\n}\n","import {\n useMutation,\n UseMutationOptions,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { API, ChannelSource, IChannelsClient } from \"@liberfi.io/types\";\nimport { channelSourcesQueryKey } from \"./useChannelSourcesQuery\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport type UseUpdateChannelSourcesMutationParams =\n API.UpdateChannelSourcesOptions;\n\nexport async function updateChannelSources(\n client: IChannelsClient,\n params: UseUpdateChannelSourcesMutationParams,\n): Promise<Array<ChannelSource>> {\n return client.updateSources(params);\n}\n\nexport function useUpdateChannelSourcesMutation(\n options: Omit<\n UseMutationOptions<\n Array<ChannelSource>,\n Error,\n UseUpdateChannelSourcesMutationParams,\n string[]\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = useChannelsClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (params: UseUpdateChannelSourcesMutationParams) =>\n updateChannelSources(client, params),\n ...options,\n onSuccess: (data, variables, onMutateResult, context) => {\n queryClient.invalidateQueries({\n queryKey: channelSourcesQueryKey(variables.channel_id),\n });\n options?.onSuccess?.(data, variables, onMutateResult, context);\n },\n });\n}\n","import { useCallback } from \"react\";\nimport { fetchPresignedUploadUrl, useDexClient } from \"@liberfi.io/client\";\nimport { usePinata } from \"@liberfi.io/ui\";\n\nexport const useUpload = () => {\n const pinata = usePinata();\n const { client } = useDexClient();\n\n const upload = useCallback(\n async (file: File) => {\n const signedURL = await fetchPresignedUploadUrl(client);\n const res = await pinata.upload.public.file(file).url(signedURL);\n return pinata.gateways.public.convert(res.cid);\n // return `https://ipfs.io/ipfs/${res.cid}`;\n },\n [pinata, client],\n );\n return upload;\n};\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { IChannelsClient, XEligibilityInfo } from \"@liberfi.io/types\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport function xEligibilityQueryKey(): string[] {\n return [\"x-eligibility\"];\n}\n\nexport async function fetchXEligibility(\n client: IChannelsClient,\n): Promise<XEligibilityInfo> {\n return await client.checkXEligibility();\n}\n\nexport function useXEligibilityQuery(\n options: Omit<\n UseQueryOptions<XEligibilityInfo, Error, XEligibilityInfo, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: xEligibilityQueryKey(),\n queryFn: async () => fetchXEligibility(client),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { IChannelsClient } from \"@liberfi.io/types\";\nimport { useChannelsClient } from \"./useChannelsClient\";\n\nexport function xAuthorizeUrlQueryKey(returnUrl?: string): string[] {\n return [\"x-authorize-url\", returnUrl || \"\"];\n}\n\nexport async function fetchXAuthorizeUrl(\n client: IChannelsClient,\n returnUrl?: string,\n): Promise<string> {\n return await client.getXAuthorizeUrl(returnUrl);\n}\n\nexport function useXAuthorizeUrlQuery(\n params: { returnUrl?: string } = {},\n options: Omit<\n UseQueryOptions<string, Error, string, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = useChannelsClient();\n return useQuery({\n queryKey: xAuthorizeUrlQueryKey(params.returnUrl),\n queryFn: async () => fetchXAuthorizeUrl(client, params.returnUrl),\n ...options,\n });\n}\n","import { z } from \"@liberfi.io/ui\";\n\nexport const baseFormSchema = z.object({\n name: z\n .string({ error: \"channels.forms.base.name.required\" })\n .min(1, \"channels.forms.base.name.min\")\n .max(24, \"channels.forms.base.name.max\"),\n description: z.string().optional(),\n icon: z.url({ error: \"channels.forms.base.icon.required\" }),\n});\n\nexport type BaseFormValues = z.infer<typeof baseFormSchema>;\n\nexport const walletSchema = z.object({\n address: z.string({ error: \"channels.forms.wallets.address.required\" }),\n alias: z.string().optional(),\n});\n\nexport const walletsFormSchema = z\n .array(walletSchema)\n .min(1, \"channels.forms.wallets.required\")\n .max(500, \"channels.forms.wallets.maxCount\");\n\nexport type WalletValues = z.infer<typeof walletSchema>;\n\nexport type WalletsFormValues = z.infer<typeof walletsFormSchema>;\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n RHForm,\n RHInput,\n RHTextArea,\n RHUpload,\n useForm,\n zodResolver,\n} from \"@liberfi.io/ui\";\nimport { useUpload } from \"../../hooks\";\nimport { baseFormSchema, BaseFormValues } from \"../../types/form\";\n\nexport type BaseFormUIProps = {\n isSubmitting?: boolean;\n onSubmit?: (data: BaseFormValues) => Promise<void>;\n defaultValues?: BaseFormValues;\n submitLabel?: string;\n};\n\nexport function BaseFormUI({\n isSubmitting = false,\n onSubmit,\n defaultValues = {\n name: \"\",\n description: \"\",\n icon: \"\",\n },\n submitLabel,\n}: BaseFormUIProps) {\n const { t } = useTranslation();\n\n const formMethods = useForm<BaseFormValues>({\n mode: \"onChange\",\n reValidateMode: \"onBlur\",\n resolver: zodResolver(baseFormSchema),\n defaultValues,\n });\n\n const upload = useUpload();\n\n return (\n <RHForm<BaseFormValues> methods={formMethods} onSubmit={onSubmit}>\n <RHInput\n name=\"name\"\n label={t(\"channels.forms.base.name.label\")}\n aria-label={t(\"channels.forms.base.name.label\")}\n placeholder={t(\"channels.forms.base.name.placeholder\")}\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n fullWidth\n labelPlacement=\"outside-top\"\n />\n\n <RHTextArea\n name=\"description\"\n label={t(\"channels.forms.base.description.label\")}\n aria-label={t(\"channels.forms.base.description.label\")}\n placeholder={t(\"channels.forms.base.description.placeholder\")}\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n fullWidth\n labelPlacement=\"outside-top\"\n />\n\n <RHUpload\n name=\"icon\"\n upload={upload}\n label={t(\"channels.forms.base.icon.label\")}\n placeholder={t(\"channels.forms.base.icon.placeholder\")}\n hint={t(\"channels.forms.base.icon.hint\")}\n radius=\"lg\"\n classNames={{ upload: \"sm:max-w-80\" }}\n />\n\n <Button\n color=\"primary\"\n fullWidth\n type=\"submit\"\n radius=\"lg\"\n className=\"mt-8\"\n isLoading={isSubmitting}\n >\n {submitLabel ?? t(\"channels.forms.base.submit\")}\n </Button>\n </RHForm>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Chain, Channel } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport { useCreateChannelMutation } from \"../../hooks\";\nimport { BaseFormValues } from \"../../types/form\";\nimport { BaseFormUI } from \"./base-form.ui\";\n\nexport type CreateChannelWidgetProps = {\n onSuccess?: (channel: Channel) => void;\n onError?: (error: unknown) => void;\n};\n\nexport function CreateChannelWidget({\n onSuccess,\n onError,\n}: CreateChannelWidgetProps) {\n const { t } = useTranslation();\n\n const { mutateAsync: createAsync, isPending } = useCreateChannelMutation();\n\n const onSubmit = useAuthCallback(\n async (data: BaseFormValues) => {\n try {\n const channel = await createAsync({\n name: data.name,\n description: data.description,\n icon: data.icon,\n chain: Chain.SOLANA,\n privacy: \"public\",\n });\n toast.success(t(\"channels.create.success\"));\n onSuccess?.(channel);\n } catch (error) {\n toast.error(t(\"channels.create.error\"));\n onError?.(error);\n }\n },\n [t, createAsync, onSuccess, onError],\n );\n\n return <BaseFormUI onSubmit={onSubmit} isSubmitting={isPending} />;\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport { useChannelQuery, useUpdateChannelMutation } from \"../../hooks\";\nimport { BaseFormValues } from \"../../types/form\";\n\nexport function useUpdateBaseForm(id: string) {\n const { t } = useTranslation();\n\n // query channel base info\n const { data, isLoading } = useChannelQuery(id);\n\n // update channel base info\n const { mutateAsync, isPending } = useUpdateChannelMutation();\n\n // form default values\n const defaultValues = useMemo<BaseFormValues | undefined>(() => {\n if (!data) return undefined;\n return {\n name: data.name,\n description: data.description,\n icon: data.icon ?? \"\",\n };\n }, [data]);\n\n const submit = useAuthCallback(\n async (data: BaseFormValues) => {\n try {\n await mutateAsync({\n id,\n name: data.name,\n description: data.description,\n icon: data.icon,\n });\n toast.success(t(\"channels.update.success\"));\n } catch (error) {\n console.error(\"Update channel base info error\", error);\n toast.error(t(\"channels.update.error\"));\n }\n },\n [mutateAsync, id],\n );\n\n return {\n // channel\n channel: data,\n // initial loading\n isLoading,\n // updating\n isSubmitting: isPending,\n // default values\n defaultValues,\n // submit\n submit,\n };\n}\n","import { useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel, ChannelSink } from \"@liberfi.io/types\";\nimport { Button, StyledInput } from \"@liberfi.io/ui\";\n\nexport type TelegramFormUIProps = {\n channel: Channel;\n sink?: ChannelSink;\n onSaveToken?: (token: string) => void;\n};\n\nexport function TelegramFormUI({ sink, onSaveToken }: TelegramFormUIProps) {\n const { t } = useTranslation();\n\n const [token, setToken] = useState(\"\");\n\n useEffect(() => {}, [sink]);\n\n return (\n <div className=\"px-2 sm:px-4 space-y-4\">\n <p className=\"whitespace-pre-wrap text-sm p-2 sm:p-4 bg-content2 rounded-lg text-neutral leading-[2]\">\n {t(\"channels.forms.socials.telegram.guide\")}\n </p>\n\n <div className=\"flex gap-4 items-center\">\n <StyledInput\n fullWidth\n placeholder={t(\"channels.forms.socials.telegram.placeholder\")}\n radius=\"lg\"\n value={token}\n onValueChange={setToken}\n />\n <Button color=\"primary\" radius=\"lg\" size=\"sm\" className=\"h-10 min-h-10\">\n {t(\"common.save\")}\n </Button>\n </div>\n </div>\n );\n}\n","import { Key, useState } from \"react\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { Tab, TelegramIcon, StyledTabs } from \"@liberfi.io/ui\";\nimport { TelegramFormUI } from \"./socials/telegram-form.ui\";\n\nexport type SocialsFormUIProps = {\n channel: Channel;\n};\n\nexport function SocialsFormUI({ channel }: SocialsFormUIProps) {\n const [socialType, setSocialType] = useState(\"telegram\");\n\n return (\n <div className=\"w-full space-y-4\">\n <StyledTabs\n variant=\"underlined\"\n selectedKey={socialType}\n onSelectionChange={setSocialType as (key: Key) => void}\n disableAnimation={false}\n >\n <Tab\n key=\"telegram\"\n title={\n <div className=\"flex items-center gap-2\">\n <TelegramIcon width={16} height={16} />\n <h3>Telegram</h3>\n </div>\n }\n />\n </StyledTabs>\n\n {socialType === \"telegram\" && <TelegramFormUI channel={channel} />}\n </div>\n );\n}\n","import { WalletValues } from \"./types/form\";\n\nexport function parseWalletsText(value: string): Array<Partial<WalletValues>> {\n const lines = value\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => !!line);\n\n return lines.map((line) => {\n const [address, alias] = line.split(\",\");\n return {\n address: address ? address.trim() : undefined,\n alias: alias ? alias.trim() : undefined,\n };\n });\n}\n","import { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChannelSource } from \"@liberfi.io/types\";\nimport {\n Button,\n CopyIcon,\n EmptyIcon,\n SearchIcon,\n StyledInput,\n StyledTable,\n TableBody,\n TableCell,\n TableColumn,\n TableHeader,\n TableRow,\n TrashIcon,\n useCopyToClipboard,\n} from \"@liberfi.io/ui\";\nimport { debounce, shortAddress } from \"@liberfi.io/utils\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport { WalletsFormValues } from \"../../types/form\";\n\nexport type WalletsListUIProps = {\n // already added wallets\n wallets?: Array<ChannelSource>;\n // submit wallets (include both already added wallets & new added wallets)\n onSubmit?: (wallets: WalletsFormValues) => Promise<void>;\n // whether the form is submitting\n isSubmitting?: boolean;\n};\n\nexport function WalletsListUI({\n wallets = [],\n onSubmit,\n isSubmitting,\n}: WalletsListUIProps) {\n const { t } = useTranslation();\n\n const copy = useCopyToClipboard();\n\n const handleDelete = useAuthCallback(\n (wallet: ChannelSource) => {\n const newWallets = wallets.filter((w) => w.value !== wallet.value);\n const formValues = newWallets.map((w) => ({\n address: w.value ?? \"\",\n alias: w.alias,\n }));\n onSubmit?.(formValues);\n },\n [wallets, onSubmit],\n );\n\n const [search, setSearch] = useState(\"\");\n\n const debouncedSetSearch = debounce(setSearch, 200);\n\n const filteredWallets = useMemo(() => {\n return wallets.filter(\n (w) =>\n w.alias?.toLowerCase()?.includes(search.toLowerCase()) ||\n w.value?.toLowerCase()?.includes(search.toLowerCase()),\n );\n }, [search, wallets]);\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-sm font-medium\">\n {t(\"channels.forms.wallets.list.title\")}\n </h2>\n <StyledInput\n size=\"sm\"\n className=\"max-w-50\"\n radius=\"full\"\n startContent={\n <SearchIcon width={16} height={16} className=\"text-neutral\" />\n }\n placeholder={t(\"channels.forms.wallets.list.search.placeholder\")}\n onValueChange={debouncedSetSearch}\n />\n </div>\n\n <StyledTable\n isHeaderSticky\n isVirtualized={\n // TODO make empty list virtualized to show the empty content\n filteredWallets.length > 10 || filteredWallets.length === 0\n }\n radius=\"lg\"\n classNames={{ emptyWrapper: \"pt-10\" }}\n maxTableHeight={500}\n rowHeight={52}\n aria-label={t(\"channels.forms.wallets.list.title\")}\n >\n <TableHeader>\n <TableColumn\n key=\"address\"\n textValue={t(\"channels.forms.wallets.list.header.address\")}\n width={\"60%\"}\n >\n {t(\"channels.forms.wallets.list.header.address\")}\n </TableColumn>\n <TableColumn\n key=\"actions\"\n textValue={t(\"channels.forms.wallets.list.header.actions\")}\n width={\"40%\"}\n align=\"end\"\n >\n {t(\"channels.forms.wallets.list.header.actions\")}\n </TableColumn>\n </TableHeader>\n\n <TableBody\n items={filteredWallets}\n emptyContent={\n <div className=\"space-y-2\">\n <EmptyIcon className=\"w-10 h-10 mx-auto text-neutral\" />\n <p className=\"text-xs text-neutral text-center\">\n {t(\"channels.forms.wallets.list.empty\")}\n </p>\n </div>\n }\n >\n {(wallet) => (\n <TableRow key={wallet.value}>\n <TableCell key=\"address\">\n <div className=\"flex flex-col gap-1 text-xs\">\n <div>{wallet.alias}</div>\n <div\n className=\"text-neutral flex items-center gap-1\"\n onClick={() => copy(wallet.value ?? \"\")}\n aria-label={t(\"common.copy\")}\n >\n <div>{shortAddress(wallet.value ?? \"\")}</div>\n <div>\n <CopyIcon width={12} height={12} />\n </div>\n </div>\n </div>\n </TableCell>\n <TableCell key=\"actions\">\n <Button\n isIconOnly\n size=\"sm\"\n radius=\"full\"\n className=\"bg-transparent\"\n disabled={isSubmitting}\n onPress={() => handleDelete(wallet)}\n >\n <TrashIcon\n className=\"text-danger-500\"\n width={18}\n height={18}\n />\n </Button>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </StyledTable>\n </div>\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel, ChannelSource } from \"@liberfi.io/types\";\nimport {\n Button,\n Chip,\n HorizontalScrollContainer,\n RHForm,\n RHTextArea,\n StyledTooltip,\n useForm,\n z,\n zodResolver,\n} from \"@liberfi.io/ui\";\nimport {\n intersectionBy,\n isValidWalletAddress,\n uniqBy,\n} from \"@liberfi.io/utils\";\nimport { walletsFormSchema, WalletsFormValues } from \"../../types/form\";\nimport { parseWalletsText } from \"../../utils\";\nimport { WalletsListUI } from \"./wallets-list.ui\";\n\nexport type WalletsFormUIProps = {\n /** channel */\n channel: Channel;\n /** already added wallets */\n wallets?: Array<ChannelSource>;\n /** submit wallets (include both already added wallets & new added wallets) */\n onSubmit?: (wallets: WalletsFormValues) => Promise<void>;\n /** whether the form is submitting */\n isSubmitting?: boolean;\n};\n\nconst formSchema = z.object({\n walletsText: z\n .string({ error: \"channels.forms.wallets.required\" })\n .min(1, \"channels.forms.wallets.required\"),\n});\n\ntype FormValues = z.infer<typeof formSchema>;\n\nexport function WalletsFormUI({\n channel,\n wallets = [],\n onSubmit,\n isSubmitting = false,\n}: WalletsFormUIProps) {\n const { t } = useTranslation();\n\n const formMethods = useForm<FormValues>({\n mode: \"onChange\",\n reValidateMode: \"onBlur\",\n resolver: zodResolver(formSchema),\n defaultValues: {\n walletsText: \"\",\n },\n });\n\n const walletsFormValues = useMemo<WalletsFormValues>(\n () => wallets.map((it) => ({ address: it.value ?? \"\", alias: it.alias })),\n [wallets],\n );\n\n const { setError, reset } = formMethods;\n\n // wallets input text validation\n const validateWallets = useCallback(\n (walletsText: string) => {\n try {\n // validate against the schema\n const parsedWallets = walletsFormSchema.parse(\n parseWalletsText(walletsText),\n );\n\n // whether the new added wallets are duplicated\n const duplicatedCount =\n parsedWallets.length - uniqBy(parsedWallets, \"address\").length;\n if (duplicatedCount !== 0) {\n throw new Error(\n t(\"channels.forms.wallets.address.duplicated\", {\n count: duplicatedCount,\n }),\n );\n }\n\n // whether the new added wallets are already added\n const alreadyAddedCount = intersectionBy(\n parsedWallets,\n walletsFormValues,\n \"address\",\n ).length;\n\n if (alreadyAddedCount > 0) {\n throw new Error(\n t(\"channels.forms.wallets.address.alreadyAdded\", {\n count: alreadyAddedCount,\n }),\n );\n }\n\n // check total count\n if (parsedWallets.length + walletsFormValues.length > 500) {\n throw new Error(t(\"channels.forms.wallets.maxCount\"));\n }\n\n // check each wallet address is valid\n let invalidCount = 0;\n for (const wallet of parsedWallets) {\n if (!isValidWalletAddress(channel.chain, wallet.address)) {\n invalidCount++;\n }\n }\n\n if (invalidCount > 0) {\n throw new Error(\n t(\"channels.forms.wallets.address.invalid\", {\n count: invalidCount,\n }),\n );\n }\n\n return parsedWallets;\n } catch (error) {\n if (error instanceof z.ZodError) {\n setError(\"walletsText\", {\n message: error.issues[0].message,\n type: \"manual\",\n });\n } else if (error instanceof Error) {\n setError(\"walletsText\", { message: error.message, type: \"manual\" });\n } else {\n setError(\"walletsText\", {\n message: t(\"channels.forms.wallets.invalid\"),\n type: \"manual\",\n });\n }\n return undefined;\n }\n },\n [walletsFormValues, t, channel.chain],\n );\n\n // submit wallets, merge new added wallets with already added wallets\n const handleSubmit = useCallback(\n async (data: FormValues) => {\n const parsedWallets = validateWallets(data.walletsText);\n if (parsedWallets && parsedWallets.length > 0) {\n await onSubmit?.([...walletsFormValues, ...parsedWallets]);\n reset();\n }\n },\n [validateWallets, onSubmit, walletsFormValues],\n );\n\n return (\n <div className=\"flex flex-col gap-6\">\n <RHForm<FormValues>\n methods={formMethods}\n onSubmit={handleSubmit}\n className=\"relative\"\n >\n <RHTextArea\n name=\"walletsText\"\n label={t(\"channels.forms.wallets.label\")}\n aria-label={t(\"channels.forms.wallets.label\")}\n placeholder={t(\"channels.forms.wallets.placeholder\")}\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n fullWidth\n minRows={10}\n maxRows={10}\n labelPlacement=\"outside-top\"\n />\n {/* already added count */}\n <div className=\"absolute right-0 top-0 text-xs flex gap-1 text-neutral\">\n <span className=\"text-neutral\">\n {t(\"channels.forms.wallets.addedCount\")}:\n </span>\n <span>{walletsFormValues.length} / 500</span>\n </div>\n\n <div className=\"w-full flex items-center gap-4\">\n {/* supported formats */}\n <HorizontalScrollContainer className=\"flex-auto min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-neutral flex-none\">\n {t(\"channels.forms.wallets.supportedFormats\")}:\n </span>\n <StyledTooltip\n closeDelay={0}\n content={\n <div className=\"text-xs whitespace-pre-line\">\n {t(\"channels.forms.wallets.supportedFormats.text.hint\")}\n </div>\n }\n >\n <Chip size=\"sm\" variant=\"flat\">\n {t(\"channels.forms.wallets.supportedFormats.text\")}\n </Chip>\n </StyledTooltip>\n </div>\n </HorizontalScrollContainer>\n <div className=\"flex-none flex gap-4 items-center\">\n {/* submit action */}\n <Button\n color=\"primary\"\n type=\"submit\"\n radius=\"lg\"\n isLoading={isSubmitting}\n size=\"sm\"\n >\n {t(\"channels.forms.wallets.submit\")}\n </Button>\n </div>\n </div>\n </RHForm>\n\n <WalletsListUI\n wallets={wallets}\n onSubmit={onSubmit}\n isSubmitting={isSubmitting}\n />\n </div>\n );\n}\n","import { Key, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel, ChannelSource } from \"@liberfi.io/types\";\nimport { clsx, StyledTabs, Tab, useScreen } from \"@liberfi.io/ui\";\nimport { BaseFormValues, WalletsFormValues } from \"../../types/form\";\nimport { BaseFormUI } from \"./base-form.ui\";\nimport { SocialsFormUI } from \"./socials-form.ui\";\nimport { WalletsFormUI } from \"./wallets-form.ui\";\n\n/**\n * base - channel basic information\n * wallets - channel wallet management\n * social - channel social media settings\n */\nexport type UpdateChannelFormType = \"base\" | \"wallets\" | \"social\";\n\nexport interface UpdateChannelFormUIProps {\n /** channel */\n channel: Channel;\n /** default form type */\n type?: UpdateChannelFormType;\n /** base form default values */\n baseFormDefaultValues?: BaseFormValues;\n /** base form is submitting */\n isSubmittingBaseForm?: boolean;\n /** base form on submit */\n onSubmitBaseForm?: (data: BaseFormValues) => Promise<void>;\n /** base form submit label */\n baseFormSubmitLabel?: string;\n /** wallets */\n wallets?: Array<ChannelSource>;\n /** wallets is submitting */\n isSubmittingWalletsForm?: boolean;\n /** wallets on submit */\n onSubmitWalletsForm?: (data: WalletsFormValues) => Promise<void>;\n /** custom styles */\n className?: string;\n}\n\nexport function UpdateChannelFormUI({\n channel,\n type = \"base\",\n baseFormDefaultValues,\n isSubmittingBaseForm = false,\n onSubmitBaseForm,\n baseFormSubmitLabel,\n wallets,\n isSubmittingWalletsForm = false,\n onSubmitWalletsForm,\n className,\n}: UpdateChannelFormUIProps) {\n const { t } = useTranslation();\n\n const [activeTab, setActiveTab] = useState<UpdateChannelFormType>(type);\n\n const { isMobile } = useScreen();\n\n return (\n <div className={clsx(\"w-full flex flex-col gap-4\", className)}>\n <StyledTabs\n fullWidth\n variant=\"solid\"\n size={isMobile ? \"sm\" : undefined}\n selectedKey={activeTab}\n onSelectionChange={setActiveTab as (key: Key) => void}\n >\n <Tab key=\"base\" title={t(\"channels.forms.base.title\")} />\n <Tab key=\"wallets\" title={t(\"channels.forms.wallets.title\")} />\n <Tab key=\"social\" title={t(\"channels.forms.socials.title\")} />\n </StyledTabs>\n\n {activeTab === \"base\" && (\n <BaseFormUI\n defaultValues={baseFormDefaultValues}\n isSubmitting={isSubmittingBaseForm}\n onSubmit={onSubmitBaseForm}\n submitLabel={baseFormSubmitLabel}\n />\n )}\n {activeTab === \"wallets\" && (\n <WalletsFormUI\n channel={channel}\n wallets={wallets}\n isSubmitting={isSubmittingWalletsForm}\n onSubmit={onSubmitWalletsForm}\n />\n )}\n {activeTab === \"social\" && <SocialsFormUI channel={channel} />}\n </div>\n );\n}\n","import { Key, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { clsx, Skeleton, StyledTabs, Tab, useScreen } from \"@liberfi.io/ui\";\nimport { UpdateChannelFormType } from \"./update-channel-form.ui\";\n\nexport interface UpdateChannelFormSkeletonsProps {\n /** default form type */\n type?: UpdateChannelFormType;\n /** custom styles */\n className?: string;\n}\n\nexport function UpdateChannelFormSkeletons({\n type = \"base\",\n className,\n}: UpdateChannelFormSkeletonsProps) {\n const { t } = useTranslation();\n\n const [activeTab, setActiveTab] = useState<UpdateChannelFormType>(type);\n\n const { isMobile } = useScreen();\n\n return (\n <div className={clsx(\"w-full flex flex-col gap-4\", className)}>\n <StyledTabs\n fullWidth\n variant=\"solid\"\n size={isMobile ? \"sm\" : undefined}\n selectedKey={activeTab}\n onSelectionChange={setActiveTab as (key: Key) => void}\n >\n <Tab key=\"base\" title={t(\"channels.forms.base.title\")} />\n <Tab key=\"wallets\" title={t(\"channels.forms.wallets.title\")} />\n <Tab key=\"social\" title={t(\"channels.forms.socials.title\")} />\n </StyledTabs>\n\n {activeTab === \"base\" && <Skeletons />}\n {activeTab === \"wallets\" && <Skeletons />}\n {activeTab === \"social\" && <Skeletons />}\n </div>\n );\n}\n\nexport function Skeletons() {\n return (\n <div className=\"flex flex-col gap-4\">\n <Skeleton className=\"w-full h-10 rounded-md\" />\n <Skeleton className=\"w-full h-10 rounded-md\" />\n <Skeleton className=\"w-full h-40 rounded-md\" />\n </div>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { chainSlug } from \"@liberfi.io/utils\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport {\n useChannelSourcesQuery,\n useUpdateChannelSourcesMutation,\n} from \"../../hooks\";\nimport { WalletsFormValues } from \"../../types/form\";\n\nexport function useUpdateWalletsForm(id: string, channel?: Channel) {\n const { t } = useTranslation();\n\n // query channel sources\n const { data, isLoading } = useChannelSourcesQuery(id);\n\n // update channel sources\n const { mutateAsync, isPending } = useUpdateChannelSourcesMutation();\n\n const submit = useAuthCallback(\n async (data: WalletsFormValues) => {\n try {\n if (!channel?.chain) {\n throw new Error(\"Channel chain is not set\");\n }\n await mutateAsync({\n channel_id: id,\n type: \"wallet\",\n sources: data.map((it) => ({\n type: \"wallet\",\n value: it.address,\n alias: it.alias,\n configs: {\n chain: chainSlug(channel.chain),\n },\n })),\n });\n toast.success(t(\"channels.forms.wallets.update.success\"));\n } catch (error) {\n console.error(\"Update channel wallets error\", error);\n toast.error(t(\"channels.forms.wallets.update.error\"));\n }\n },\n [mutateAsync, id, channel?.chain],\n );\n\n return {\n // initial loading\n isLoading,\n // updating\n isSubmitting: isPending,\n // wallets\n wallets: data,\n // submit\n submit,\n };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { useUpdateBaseForm } from \"./update-base-form.script\";\nimport { UpdateChannelFormSkeletons } from \"./update-channel-form-skeletons\";\nimport {\n UpdateChannelFormType,\n UpdateChannelFormUI,\n} from \"./update-channel-form.ui\";\nimport { useUpdateWalletsForm } from \"./update-wallets-form.script\";\n\nexport type UpdateChannelWidgetProps = {\n id: string;\n type?: UpdateChannelFormType;\n};\n\nexport function UpdateChannelWidget({\n id,\n type = \"base\",\n}: UpdateChannelWidgetProps) {\n const { t } = useTranslation();\n\n const {\n channel,\n defaultValues: baseFormDefaultValues,\n isLoading: isLoadingBaseForm,\n isSubmitting: isSubmittingBaseForm,\n submit: submitBaseForm,\n } = useUpdateBaseForm(id);\n\n const {\n wallets,\n isLoading: isLoadingWalletsForm,\n isSubmitting: isSubmittingWalletsForm,\n submit: submitWalletsForm,\n } = useUpdateWalletsForm(id, channel);\n\n // initial loading\n if (isLoadingBaseForm || isLoadingWalletsForm || !channel) {\n return <UpdateChannelFormSkeletons type={type} />;\n }\n\n return (\n <UpdateChannelFormUI\n channel={channel}\n type={type}\n baseFormDefaultValues={baseFormDefaultValues}\n isSubmittingBaseForm={isSubmittingBaseForm}\n onSubmitBaseForm={submitBaseForm}\n baseFormSubmitLabel={t(\"channels.forms.base.update.submit\")}\n wallets={wallets}\n isSubmittingWalletsForm={isSubmittingWalletsForm}\n onSubmitWalletsForm={submitWalletsForm}\n />\n );\n}\n","import { SVGProps } from \"react\";\n\nexport function CheckCircleIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n );\n}\n\nexport function XCircleIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n}\n","import { SVGProps } from \"react\";\n\nexport function XIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, clsx } from \"@liberfi.io/ui\";\nimport { CheckCircleIcon, XCircleIcon } from \"../../icons/status-icons\";\nimport { XIcon } from \"../../icons/x-icon\";\n\nexport type EligibilityCheckItem = {\n label: string;\n value: string;\n status: \"pending\" | \"checking\" | \"passed\" | \"failed\";\n};\n\nexport type CheckEligibilityUIProps = {\n /** X account connection status */\n isConnected: boolean;\n /** Whether currently connecting to X */\n isConnecting: boolean;\n /** X account username (e.g., @trader_joe) */\n xUsername?: string;\n /** Eligibility check items */\n checkItems: Array<EligibilityCheckItem>;\n /** Whether all checks passed */\n allChecksPassed: boolean;\n /** Connect to X handler */\n onConnect: () => void | Promise<void>;\n /** Continue to next step handler */\n onContinue: () => void | Promise<void>;\n /** Cancel handler */\n onCancel: () => void | Promise<void>;\n /** Whether the form is submitting */\n isSubmitting?: boolean;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Check Eligibility UI Component\n * Full screen page to verify X account eligibility\n */\nexport function CheckEligibilityUI({\n isConnected,\n isConnecting,\n xUsername,\n checkItems,\n allChecksPassed,\n onConnect,\n onContinue,\n onCancel,\n isSubmitting = false,\n className,\n}: CheckEligibilityUIProps) {\n const { t } = useTranslation();\n\n return (\n <div\n className={clsx(\n \"w-full h-full flex flex-col items-center justify-center\",\n \"px-4 sm:px-6 py-8\",\n className,\n )}\n >\n <div className=\"w-full max-w-2xl flex flex-col gap-6\">\n {/* Title and Description */}\n <div className=\"text-center space-y-3\">\n <h1 className=\"text-2xl sm:text-3xl font-bold text-foreground\">\n {t(\"channels.create.eligibility.title\")}\n </h1>\n <p className=\"text-sm sm:text-base text-default-500 px-4 max-w-xl mx-auto\">\n {t(\"channels.create.eligibility.description\")}\n </p>\n </div>\n\n {/* Card Container */}\n <div className=\"bg-content1 rounded-2xl border border-divider p-6 sm:p-8 space-y-6\">\n {/* X Connection Section */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 pb-6 border-b border-divider\">\n <div className=\"flex items-center gap-3 min-w-0 flex-1\">\n <div className=\"w-10 h-10 flex-shrink-0 rounded-full bg-success/10 flex items-center justify-center\">\n {isConnected ? (\n <CheckCircleIcon className=\"w-6 h-6 text-success\" />\n ) : (\n <XIcon className=\"w-5 h-5 text-foreground\" />\n )}\n </div>\n <div className=\"flex flex-col min-w-0 flex-1\">\n <span className=\"text-base font-semibold text-foreground truncate\">\n {t(\"channels.create.eligibility.xConnection\")}\n </span>\n <span className=\"text-sm text-default-400 truncate\">\n {isConnected && xUsername\n ? `${t(\"channels.create.eligibility.connected\")}: ${xUsername}`\n : t(\"channels.create.eligibility.notConnected\")}\n </span>\n </div>\n </div>\n {!isConnected && (\n <Button\n size=\"sm\"\n radius=\"lg\"\n onPress={onConnect}\n isLoading={isConnecting}\n className=\"flex-shrink-0 bg-white text-black hover:bg-white/90\"\n >\n Connect\n </Button>\n )}\n </div>\n\n {/* Eligibility Check Items */}\n <div className=\"space-y-4\">\n {checkItems.map((item, index) => (\n <div\n key={index}\n className=\"flex items-center justify-between gap-4 py-3\"\n >\n <span className=\"text-sm text-default-600 flex-shrink-0\">\n {item.label}\n </span>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <span\n className={clsx(\n \"text-sm font-medium whitespace-nowrap\",\n item.status === \"passed\"\n ? \"text-foreground\"\n : \"text-default-400\",\n )}\n >\n {item.value}\n </span>\n {item.status === \"passed\" && (\n <CheckCircleIcon className=\"w-4 h-4 text-success flex-shrink-0\" />\n )}\n {item.status === \"failed\" && (\n <XCircleIcon className=\"w-4 h-4 text-danger flex-shrink-0\" />\n )}\n {item.status === \"pending\" && (\n <div className=\"w-4 h-4 flex-shrink-0 rounded-full border-2 border-default-300\" />\n )}\n {item.status === \"checking\" && (\n <div className=\"w-4 h-4 flex-shrink-0 rounded-full border-2 border-primary border-t-transparent animate-spin\" />\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Action Buttons */}\n <div className=\"flex gap-3\">\n <Button\n color=\"default\"\n variant=\"flat\"\n radius=\"lg\"\n fullWidth\n onPress={onCancel}\n isDisabled={isSubmitting}\n >\n {t(\"common.cancel\")}\n </Button>\n <Button\n color=\"primary\"\n radius=\"lg\"\n fullWidth\n onPress={onContinue}\n isDisabled={!allChecksPassed}\n isLoading={isSubmitting}\n >\n {t(\"common.continue\")}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useEventEmitter } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { useXEligibilityQuery, useXAuthorizeUrlQuery } from \"../../hooks\";\n\nexport type XAccountInfo = {\n username: string;\n displayName: string;\n avatar: string;\n bio: string;\n followersCount: number;\n accountAge: number; // days\n behaviorScore: \"clean\" | \"suspicious\";\n};\n\nexport type EligibilityCheckStatus =\n | \"pending\"\n | \"checking\"\n | \"passed\"\n | \"failed\";\n\nexport type UseCheckEligibilityScriptParams = {\n /** Minimum followers required */\n minFollowers?: number;\n /** Minimum account age in days */\n minAccountAge?: number;\n /** Optional return URL for OAuth callback */\n returnUrl?: string;\n};\n\nexport type UseCheckEligibilityScriptResult = {\n /** Whether connected to X */\n isConnected: boolean;\n /** Whether currently connecting */\n isConnecting: boolean;\n /** X account information */\n accountInfo: XAccountInfo | null;\n /** Check items with status */\n checkItems: Array<{\n label: string;\n value: string;\n status: EligibilityCheckStatus;\n }>;\n /** Whether all checks passed */\n allChecksPassed: boolean;\n /** Authorization URL */\n authorizeUrl: string | null;\n /** Connect to X account */\n connect: () => Promise<void>;\n /** Disconnect X account */\n disconnect: () => Promise<void>;\n /** Verify eligibility */\n verify: () => Promise<boolean>;\n};\n\n/**\n * Check Eligibility Script Hook\n * Handles X account connection and eligibility verification\n */\nexport function useCheckEligibilityScript({\n minFollowers = 1000,\n minAccountAge = 90,\n returnUrl,\n}: UseCheckEligibilityScriptParams = {}): UseCheckEligibilityScriptResult {\n const { t } = useTranslation();\n const eventEmitter = useEventEmitter();\n\n const [accountInfo, setAccountInfo] = useState<XAccountInfo | null>(null);\n const [checkStatuses, setCheckStatuses] = useState<{\n followers: EligibilityCheckStatus;\n accountAge: EligibilityCheckStatus;\n behavior: EligibilityCheckStatus;\n }>({\n followers: \"pending\",\n accountAge: \"pending\",\n behavior: \"pending\",\n });\n\n // Query X eligibility status\n const {\n data: eligibilityInfo,\n refetch: refetchEligibility,\n isLoading: isCheckingEligibility,\n } = useXEligibilityQuery({\n retry: false,\n refetchOnWindowFocus: false,\n });\n\n // Query authorization URL\n const { data: authorizeUrl } = useXAuthorizeUrlQuery(\n { returnUrl },\n {\n enabled: !!returnUrl,\n retry: false,\n refetchOnWindowFocus: false,\n },\n );\n\n // Listen for authorization success event\n useEffect(() => {\n const handleAuthSuccess = () => {\n // Refetch eligibility info after successful authorization\n refetchEligibility();\n };\n\n eventEmitter.on(\"channels.x_eligibility.success\", handleAuthSuccess);\n\n return () => {\n eventEmitter.off(\"channels.x_eligibility.success\", handleAuthSuccess);\n };\n }, [eventEmitter, refetchEligibility]);\n\n // Convert API eligibility info to account info\n useEffect(() => {\n if (eligibilityInfo && eligibilityInfo.status === \"authorized\") {\n const info: XAccountInfo = {\n username: `@${eligibilityInfo.twitter_name || \"unknown\"}`,\n displayName: eligibilityInfo.twitter_name || \"Unknown\",\n avatar: \"\", // API doesn't provide avatar URL\n bio: \"\",\n followersCount: parseInt(eligibilityInfo.follower_count || \"0\"),\n accountAge: parseInt(eligibilityInfo.account_age_days || \"0\"),\n behaviorScore: eligibilityInfo.has_violations ? \"suspicious\" : \"clean\",\n };\n setAccountInfo(info);\n\n // Automatically verify eligibility after getting account info\n setTimeout(() => {\n verifyEligibility(info);\n }, 500);\n } else if (eligibilityInfo && eligibilityInfo.status === \"not_authorized\") {\n setAccountInfo(null);\n setCheckStatuses({\n followers: \"pending\",\n accountAge: \"pending\",\n behavior: \"pending\",\n });\n }\n }, [eligibilityInfo]);\n\n // Connect to X account (open OAuth window)\n const connect = useCallback(async () => {\n if (!authorizeUrl) {\n console.error(\"Authorization URL not available\");\n return;\n }\n\n // Open authorization URL in new window\n // The actual OAuth flow will be handled by the backend\n // and should redirect to returnUrl after success\n window.open(authorizeUrl, \"_blank\", \"width=600,height=700\");\n }, [authorizeUrl]);\n\n // Disconnect X account\n const disconnect = useCallback(async () => {\n setAccountInfo(null);\n setCheckStatuses({\n followers: \"pending\",\n accountAge: \"pending\",\n behavior: \"pending\",\n });\n }, []);\n\n // Verify eligibility based on account info\n const verifyEligibility = useCallback(\n async (info: XAccountInfo) => {\n // Set all to checking\n setCheckStatuses({\n followers: \"checking\",\n accountAge: \"checking\",\n behavior: \"checking\",\n });\n\n // Simulate API verification delay\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Check followers count\n const followersPass = info.followersCount >= minFollowers;\n await new Promise((resolve) => setTimeout(resolve, 500));\n setCheckStatuses((prev) => ({\n ...prev,\n followers: followersPass ? \"passed\" : \"failed\",\n }));\n\n // Check account age\n const accountAgePass = info.accountAge >= minAccountAge;\n await new Promise((resolve) => setTimeout(resolve, 500));\n setCheckStatuses((prev) => ({\n ...prev,\n accountAge: accountAgePass ? \"passed\" : \"failed\",\n }));\n\n // Check behavior score\n const behaviorPass = info.behaviorScore === \"clean\";\n await new Promise((resolve) => setTimeout(resolve, 500));\n setCheckStatuses((prev) => ({\n ...prev,\n behavior: behaviorPass ? \"passed\" : \"failed\",\n }));\n },\n [minFollowers, minAccountAge],\n );\n\n // Public verify method\n const verify = useCallback(async (): Promise<boolean> => {\n if (!accountInfo) {\n return false;\n }\n await verifyEligibility(accountInfo);\n return (\n checkStatuses.followers === \"passed\" &&\n checkStatuses.accountAge === \"passed\" &&\n checkStatuses.behavior === \"passed\"\n );\n }, [accountInfo, checkStatuses, verifyEligibility]);\n\n // Format check items for display\n const checkItems = useMemo(() => {\n return [\n {\n label: t(\"channels.create.eligibility.followersCount\"),\n value: accountInfo\n ? `${accountInfo.followersCount.toLocaleString()}+`\n : `${minFollowers}+`,\n status: checkStatuses.followers,\n },\n {\n label: t(\"channels.create.eligibility.accountAge\"),\n value: accountInfo\n ? `${accountInfo.accountAge}+ ${t(\"common.days\")}`\n : `${minAccountAge}+ days`,\n status: checkStatuses.accountAge,\n },\n {\n label: t(\"channels.create.eligibility.behaviorScore\"),\n value: t(\"channels.create.eligibility.clean\"),\n status: checkStatuses.behavior,\n },\n ];\n }, [t, accountInfo, checkStatuses, minFollowers, minAccountAge]);\n\n // Determine if connected\n const isConnected = useMemo(() => {\n return !!accountInfo;\n }, [accountInfo]);\n\n // Check if all checks passed\n const allChecksPassed = useMemo(() => {\n return (\n isConnected &&\n checkStatuses.followers === \"passed\" &&\n checkStatuses.accountAge === \"passed\" &&\n checkStatuses.behavior === \"passed\"\n );\n }, [isConnected, checkStatuses]);\n\n return {\n isConnected,\n isConnecting: isCheckingEligibility,\n accountInfo,\n checkItems,\n allChecksPassed,\n authorizeUrl: authorizeUrl || null,\n connect,\n disconnect,\n verify,\n };\n}\n","import { useCallback, useState } from \"react\";\nimport { useCheckEligibilityScript } from \"./check-eligibility.script\";\nimport { CheckEligibilityUI } from \"./check-eligibility.ui\";\n\nexport type CheckEligibilityWidgetProps = {\n /** Callback when eligibility check passed and continue */\n onContinue?: () => void | Promise<void>;\n /** Callback when cancelled */\n onCancel?: () => void | Promise<void>;\n /** Minimum followers required */\n minFollowers?: number;\n /** Minimum account age in days */\n minAccountAge?: number;\n /** Optional return URL for OAuth callback */\n returnUrl?: string;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Check Eligibility Widget\n * Combines UI and Script for X account eligibility verification\n */\nexport function CheckEligibilityWidget({\n onContinue,\n onCancel,\n minFollowers,\n minAccountAge,\n returnUrl,\n className,\n}: CheckEligibilityWidgetProps) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const {\n isConnected,\n isConnecting,\n accountInfo,\n checkItems,\n allChecksPassed,\n connect,\n } = useCheckEligibilityScript({\n minFollowers,\n minAccountAge,\n returnUrl,\n });\n\n const handleConnect = useCallback(async () => {\n try {\n await connect();\n } catch (error) {\n console.error(\"Failed to connect:\", error);\n }\n }, [connect]);\n\n const handleContinue = useCallback(async () => {\n if (!allChecksPassed) return;\n\n setIsSubmitting(true);\n try {\n await onContinue?.();\n } catch (error) {\n console.error(\"Failed to continue:\", error);\n } finally {\n setIsSubmitting(false);\n }\n }, [allChecksPassed, onContinue]);\n\n const handleCancel = useCallback(async () => {\n try {\n await onCancel?.();\n } catch (error) {\n console.error(\"Failed to cancel:\", error);\n }\n }, [onCancel]);\n\n return (\n <CheckEligibilityUI\n isConnected={isConnected}\n isConnecting={isConnecting}\n xUsername={accountInfo?.username}\n checkItems={checkItems}\n allChecksPassed={allChecksPassed}\n onConnect={handleConnect}\n onContinue={handleContinue}\n onCancel={handleCancel}\n isSubmitting={isSubmitting}\n className={className}\n />\n );\n}\n","import { useState } from \"react\";\nimport { Button, clsx, Input, Textarea } from \"@liberfi.io/ui\";\nimport type { PresetAvatar } from \"./channel-basic-info.script\";\n\n// PresetAvatar type is imported from script file to avoid duplicate exports\n\nexport type ChannelBasicInfoUIProps = {\n /** Available preset avatars */\n presetAvatars: PresetAvatar[];\n /** Selected avatar URL (preset or custom) */\n selectedAvatar?: string;\n /** Whether a custom avatar is selected */\n isCustomAvatar?: boolean;\n /** Channel name value */\n channelName: string;\n /** Channel name suggestions */\n nameSuggestions: string[];\n /** Channel description value */\n description: string;\n /** Description character limit */\n descriptionMaxLength?: number;\n /** Description suggestions */\n descriptionSuggestions: string[];\n /** Avatar selection handler */\n onAvatarSelect: (avatarUrl: string, isCustom: boolean) => void;\n /** Custom avatar upload handler */\n onCustomAvatarUpload: (file: File) => Promise<void>;\n /** Whether uploading custom avatar */\n isUploadingAvatar?: boolean;\n /** Whether refreshing avatars */\n isRefreshingAvatars?: boolean;\n /** Refresh avatars handler */\n onRefreshAvatars?: () => void;\n /** Whether refreshing name suggestions */\n isRefreshingNameSuggestions?: boolean;\n /** Refresh name suggestions handler */\n onRefreshNameSuggestions?: () => void;\n /** Whether refreshing description suggestions */\n isRefreshingDescriptionSuggestions?: boolean;\n /** Refresh description suggestions handler */\n onRefreshDescriptionSuggestions?: () => void;\n /** Channel name change handler */\n onChannelNameChange: (value: string) => void;\n /** Name suggestion click handler */\n onNameSuggestionClick: (suggestion: string) => void;\n /** Description change handler */\n onDescriptionChange: (value: string) => void;\n /** Description suggestion click handler */\n onDescriptionSuggestionClick: (suggestion: string) => void;\n /** Back button handler */\n onBack: () => void | Promise<void>;\n /** Continue to next step handler */\n onContinue: () => void | Promise<void>;\n /** Whether the form is submitting */\n isSubmitting?: boolean;\n /** Whether continue button is disabled */\n isContinueDisabled?: boolean;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Channel Basic Info UI Component\n * Full screen page for setting up channel avatar, name, and description\n */\nexport function ChannelBasicInfoUI({\n presetAvatars,\n selectedAvatar,\n isCustomAvatar = false,\n channelName,\n nameSuggestions,\n description,\n descriptionMaxLength = 200,\n descriptionSuggestions,\n onAvatarSelect,\n onCustomAvatarUpload,\n isUploadingAvatar = false,\n isRefreshingAvatars = false,\n onRefreshAvatars,\n isRefreshingNameSuggestions = false,\n onRefreshNameSuggestions,\n isRefreshingDescriptionSuggestions = false,\n onRefreshDescriptionSuggestions,\n onChannelNameChange,\n onNameSuggestionClick,\n onDescriptionChange,\n onDescriptionSuggestionClick,\n onBack,\n onContinue,\n isSubmitting = false,\n isContinueDisabled = false,\n className,\n}: ChannelBasicInfoUIProps) {\n // TODO: Add show more/less functionality for preset avatars\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [showAllPresets, setShowAllPresets] = useState(false);\n\n const handleFileUpload = async (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n const file = event.target.files?.[0];\n if (file) {\n await onCustomAvatarUpload(file);\n }\n };\n\n const displayedPresets = showAllPresets\n ? presetAvatars\n : presetAvatars.slice(0, 12);\n\n // Ensure we have exactly 20 avatars by repeating if necessary\n // Add unique index to each avatar to handle duplicates\n const avatarsToDisplay = [];\n for (let i = 0; i < 20; i++) {\n const originalAvatar = displayedPresets[i % displayedPresets.length];\n avatarsToDisplay.push({\n ...originalAvatar,\n uniqueId: `${originalAvatar.id}-${i}`,\n uniqueUrl: `${originalAvatar.url}#${i}`, // Add fragment to make URL unique\n originalUrl: originalAvatar.url,\n });\n }\n\n return (\n <div\n className={clsx(\n \"w-full h-full flex flex-col items-center justify-start\",\n \"px-4 sm:px-6 py-8\",\n className,\n )}\n >\n <div className=\"w-full max-w-4xl flex flex-col gap-6\">\n {/* Title and Description */}\n <div className=\"space-y-3\">\n <h1 className=\"text-2xl sm:text-3xl font-bold text-foreground\">\n Channel Basic Information\n </h1>\n <p className=\"text-sm sm:text-base text-default-500\">\n Set up your public profile. This is what subscribers will see.\n </p>\n </div>\n\n {/* Form Container */}\n <div className=\"bg-content1 rounded-2xl border border-divider p-6 sm:p-8 space-y-6\">\n {/* Channel Avatar */}\n <div className=\"space-y-4\">\n <label className=\"text-sm font-medium text-foreground block mb-2\">\n Channel Avatar\n </label>\n\n <div className=\"flex flex-col lg:flex-row gap-8\">\n {/* Left: Selected Avatar Preview */}\n <div className=\"flex-shrink-0 mt-4\">\n <div className=\"w-32 h-32 rounded-2xl overflow-hidden bg-default-100 border-2 border-divider\">\n {selectedAvatar ? (\n <img\n src={selectedAvatar}\n alt=\"Channel avatar\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-default-400 text-4xl\">\n ?\n </div>\n )}\n </div>\n </div>\n\n {/* Right: Preset Avatars and Upload */}\n <div className=\"flex-1 space-y-4 pl-4\">\n {/* Preset Avatars Section */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-default-500 uppercase tracking-wide\">\n Choose Preset\n </span>\n {onRefreshAvatars && (\n <button\n onClick={onRefreshAvatars}\n disabled={isRefreshingAvatars}\n className=\"p-1 rounded-full hover:bg-default-100 transition-colors disabled:opacity-50 cursor-pointer disabled:cursor-not-allowed\"\n title=\"Refresh Avatars\"\n >\n <svg\n className={clsx(\n \"w-4 h-4 text-default-500\",\n isRefreshingAvatars && \"animate-spin\",\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n </button>\n )}\n </div>\n\n <div className=\"grid grid-cols-10 gap-1.5\">\n {avatarsToDisplay.map((avatar, index) => (\n <button\n key={avatar.uniqueId}\n onClick={() => onAvatarSelect(avatar.uniqueUrl, false)}\n className={clsx(\n \"w-14 h-14 rounded-xl overflow-hidden\",\n \"border-2 transition-all hover:scale-105\",\n selectedAvatar === avatar.uniqueUrl && !isCustomAvatar\n ? \"border-primary\"\n : \"border-transparent hover:border-default-300\",\n )}\n >\n <img\n src={avatar.originalUrl}\n alt={`Preset ${index + 1}`}\n className=\"w-full h-full object-cover\"\n />\n </button>\n ))}\n </div>\n </div>\n\n {/* Upload Custom Section */}\n <div className=\"space-y-3\">\n <span className=\"text-xs font-medium text-default-500 uppercase tracking-wide\">\n Upload Custom\n </span>\n <div className=\"flex items-center gap-3\">\n <input\n type=\"file\"\n id=\"avatar-upload\"\n accept=\"image/*\"\n onChange={handleFileUpload}\n className=\"hidden\"\n />\n <Button\n as=\"label\"\n htmlFor=\"avatar-upload\"\n color=\"default\"\n variant=\"flat\"\n size=\"sm\"\n radius=\"lg\"\n isLoading={isUploadingAvatar}\n startContent={\n !isUploadingAvatar ? (\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n ) : undefined\n }\n >\n Upload Image\n </Button>\n {isCustomAvatar && selectedAvatar && (\n <span className=\"text-xs text-success flex items-center gap-1\">\n <svg\n className=\"w-3 h-3\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n Custom avatar uploaded\n </span>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Channel Name */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-medium text-foreground\">\n Channel Name\n </label>\n </div>\n <Input\n placeholder=\"Please enter the channel name\"\n value={channelName}\n onValueChange={onChannelNameChange}\n maxLength={24}\n />\n\n {/* Name Suggestions */}\n {nameSuggestions.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-default-500 uppercase tracking-wide\">\n Suggestions\n </span>\n {onRefreshNameSuggestions && (\n <button\n onClick={onRefreshNameSuggestions}\n disabled={isRefreshingNameSuggestions}\n className=\"p-1 rounded-full hover:bg-default-100 transition-colors disabled:opacity-50 cursor-pointer disabled:cursor-not-allowed\"\n title=\"Refresh Suggestions\"\n >\n <svg\n className={clsx(\n \"w-4 h-4 text-default-500\",\n isRefreshingNameSuggestions && \"animate-spin\",\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n </button>\n )}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {nameSuggestions.map((suggestion, index) => (\n <button\n key={index}\n onClick={() => onNameSuggestionClick(suggestion)}\n className=\"px-3 py-1.5 text-sm rounded-lg bg-default-100 text-foreground hover:bg-default-200 transition-colors\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Description */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-medium text-foreground\">\n Description\n </label>\n <span className=\"text-xs text-default-400\">\n {description.length}/{descriptionMaxLength}\n </span>\n </div>\n <Textarea\n placeholder=\"Describe your trading strategy and what subscribers can expect...\"\n value={description}\n onValueChange={onDescriptionChange}\n maxLength={descriptionMaxLength}\n minRows={4}\n />\n\n {/* Description Suggestions */}\n {descriptionSuggestions.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-default-500 uppercase tracking-wide\">\n Suggestions\n </span>\n {onRefreshDescriptionSuggestions && (\n <button\n onClick={onRefreshDescriptionSuggestions}\n disabled={isRefreshingDescriptionSuggestions}\n className=\"p-1 rounded-full hover:bg-default-100 transition-colors disabled:opacity-50 cursor-pointer disabled:cursor-not-allowed\"\n title=\"Refresh Suggestions\"\n >\n <svg\n className={clsx(\n \"w-4 h-4 text-default-500\",\n isRefreshingDescriptionSuggestions && \"animate-spin\",\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n </button>\n )}\n </div>\n <div className=\"space-y-2\">\n {descriptionSuggestions.map((suggestion, index) => (\n <button\n key={index}\n onClick={() => onDescriptionSuggestionClick(suggestion)}\n className=\"w-full text-left px-3 py-2 text-sm text-foreground bg-default-100 hover:bg-default-200 rounded-lg transition-colors\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Action Buttons */}\n <div className=\"flex gap-3 justify-between\">\n <Button\n color=\"default\"\n variant=\"flat\"\n radius=\"lg\"\n onPress={onBack}\n isDisabled={isSubmitting}\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n }\n >\n Back\n </Button>\n <Button\n color=\"primary\"\n radius=\"lg\"\n onPress={onContinue}\n isDisabled={isContinueDisabled}\n isLoading={isSubmitting}\n >\n Next Step\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport type PresetAvatar = {\n id: string;\n url: string;\n};\n\nexport type UseChannelBasicInfoScriptParams = {\n /** Initial channel name */\n initialName?: string;\n /** Initial description */\n initialDescription?: string;\n /** Initial avatar URL */\n initialAvatar?: string;\n};\n\nexport type UseChannelBasicInfoScriptResult = {\n /** Available preset avatars */\n presetAvatars: PresetAvatar[];\n /** Selected avatar URL */\n selectedAvatar?: string;\n /** Whether selected avatar is custom */\n isCustomAvatar: boolean;\n /** Channel name */\n channelName: string;\n /** Channel name suggestions */\n nameSuggestions: string[];\n /** Description */\n description: string;\n /** Description suggestions */\n descriptionSuggestions: string[];\n /** Whether uploading custom avatar */\n isUploadingAvatar: boolean;\n /** Whether refreshing avatars */\n isRefreshingAvatars: boolean;\n /** Whether refreshing name suggestions */\n isRefreshingNameSuggestions: boolean;\n /** Whether refreshing description suggestions */\n isRefreshingDescriptionSuggestions: boolean;\n /** Select preset or custom avatar */\n selectAvatar: (avatarUrl: string, isCustom: boolean) => void;\n /** Upload custom avatar */\n uploadCustomAvatar: (file: File) => Promise<void>;\n /** Refresh preset avatars (shuffle) */\n refreshPresetAvatars: () => void;\n /** Refresh name suggestions (shuffle) */\n refreshNameSuggestions: () => void;\n /** Refresh description suggestions (shuffle) */\n refreshDescriptionSuggestions: () => void;\n /** Update channel name */\n setChannelName: (name: string) => void;\n /** Apply name suggestion */\n applyNameSuggestion: (suggestion: string) => void;\n /** Update description */\n setDescription: (desc: string) => void;\n /** Apply description suggestion */\n applyDescriptionSuggestion: (suggestion: string) => void;\n /** Validate form */\n validate: () => { isValid: boolean; errors: string[] };\n};\n\n// Mock preset avatars\nconst MOCK_PRESET_AVATARS: PresetAvatar[] = Array.from(\n { length: 24 },\n (_, i) => ({\n id: `preset-${i + 1}`,\n url: `https://i.pravatar.cc/150?img=${i + 1}`,\n }),\n);\n\n/**\n * Channel Basic Info Script Hook\n * Handles channel basic information form state and logic\n *\n * NOTE: This is a placeholder implementation.\n * In production, replace with actual API calls for:\n * - Fetching preset avatars\n * - Uploading custom avatars\n * - Generating AI suggestions\n */\n// Utility function to shuffle array\nfunction shuffleArray<T>(array: T[]): T[] {\n const newArray = [...array];\n for (let i = newArray.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [newArray[i], newArray[j]] = [newArray[j], newArray[i]];\n }\n return newArray;\n}\n\n// Mock name suggestions pool\nconst MOCK_NAME_SUGGESTIONS_POOL = [\n \"CryptoWhale Alpha\",\n \"Whale Signals\",\n \"CryptoWhale VIP\",\n \"Diamond Hands Pro\",\n \"Moon Mission Alpha\",\n \"Degen Traders\",\n \"Smart Money Moves\",\n \"Crypto Elite Club\",\n \"Trading Wizards\",\n];\n\n// Mock description suggestions pool\nconst MOCK_DESCRIPTION_SUGGESTIONS_POOL = [\n \"High-frequency trading signals for ETH/BTC pairs.\",\n \"Degenerate meme coin calls and gem hunting.\",\n \"Safe entry/exit points for long-term holders.\",\n \"Follow whale wallets for alpha opportunities.\",\n \"Expert analysis and real-time market insights.\",\n \"Low-risk DeFi yield farming strategies.\",\n \"NFT flips and blue-chip collection tracking.\",\n \"Altcoin gems before they moon.\",\n \"Technical analysis with proven track record.\",\n];\n\nexport function useChannelBasicInfoScript({\n initialName = \"\",\n initialDescription = \"\",\n initialAvatar,\n}: UseChannelBasicInfoScriptParams = {}): UseChannelBasicInfoScriptResult {\n const [selectedAvatar, setSelectedAvatar] = useState<string | undefined>(\n initialAvatar || MOCK_PRESET_AVATARS[0]?.url,\n );\n const [isCustomAvatar, setIsCustomAvatar] = useState(false);\n const [channelName, setChannelName] = useState(initialName);\n const [description, setDescription] = useState(initialDescription);\n const [isUploadingAvatar, setIsUploadingAvatar] = useState(false);\n const [avatarSeed, setAvatarSeed] = useState(0);\n const [isRefreshingAvatars, setIsRefreshingAvatars] = useState(false);\n const [nameSuggestionsSeed, setNameSuggestionsSeed] = useState(0);\n const [descriptionSuggestionsSeed, setDescriptionSuggestionsSeed] =\n useState(0);\n const [isRefreshingNameSuggestions, setIsRefreshingNameSuggestions] =\n useState(false);\n const [\n isRefreshingDescriptionSuggestions,\n setIsRefreshingDescriptionSuggestions,\n ] = useState(false);\n\n // Shuffled preset avatars based on seed\n const presetAvatars = useMemo(() => {\n return shuffleArray(MOCK_PRESET_AVATARS);\n }, [avatarSeed]);\n\n // Shuffled name suggestions based on seed\n const nameSuggestions = useMemo(() => {\n return shuffleArray(MOCK_NAME_SUGGESTIONS_POOL).slice(0, 3);\n }, [nameSuggestionsSeed]);\n\n // Shuffled description suggestions based on seed\n const descriptionSuggestions = useMemo(() => {\n return shuffleArray(MOCK_DESCRIPTION_SUGGESTIONS_POOL).slice(0, 3);\n }, [descriptionSuggestionsSeed]);\n\n const selectAvatar = useCallback((avatarUrl: string, isCustom: boolean) => {\n setSelectedAvatar(avatarUrl);\n setIsCustomAvatar(isCustom);\n }, []);\n\n const uploadCustomAvatar = useCallback(async (file: File) => {\n setIsUploadingAvatar(true);\n try {\n // TODO: Replace with actual upload logic\n // Simulate upload delay\n await new Promise((resolve) => setTimeout(resolve, 1500));\n\n // For now, create a local URL for preview\n const localUrl = URL.createObjectURL(file);\n setSelectedAvatar(localUrl);\n setIsCustomAvatar(true);\n } catch (error) {\n console.error(\"Failed to upload custom avatar:\", error);\n throw error;\n } finally {\n setIsUploadingAvatar(false);\n }\n }, []);\n\n const refreshPresetAvatars = useCallback(() => {\n setIsRefreshingAvatars(true);\n // Increment seed to trigger re-shuffle\n setAvatarSeed((prev) => prev + 1);\n // Reset refreshing state after animation\n setTimeout(() => {\n setIsRefreshingAvatars(false);\n }, 600);\n }, []);\n\n const refreshNameSuggestions = useCallback(() => {\n setIsRefreshingNameSuggestions(true);\n // Increment seed to trigger re-shuffle\n setNameSuggestionsSeed((prev) => prev + 1);\n // Reset refreshing state after animation\n setTimeout(() => {\n setIsRefreshingNameSuggestions(false);\n }, 600);\n }, []);\n\n const refreshDescriptionSuggestions = useCallback(() => {\n setIsRefreshingDescriptionSuggestions(true);\n // Increment seed to trigger re-shuffle\n setDescriptionSuggestionsSeed((prev) => prev + 1);\n // Reset refreshing state after animation\n setTimeout(() => {\n setIsRefreshingDescriptionSuggestions(false);\n }, 600);\n }, []);\n\n const applyNameSuggestion = useCallback((suggestion: string) => {\n setChannelName(suggestion);\n }, []);\n\n const applyDescriptionSuggestion = useCallback((suggestion: string) => {\n setDescription(suggestion);\n }, []);\n\n const validate = useCallback(() => {\n const errors: string[] = [];\n\n if (!selectedAvatar) {\n errors.push(\"Please select or upload a channel avatar\");\n }\n\n if (!channelName.trim()) {\n errors.push(\"Channel name is required\");\n } else if (channelName.length < 1) {\n errors.push(\"Channel name must be at least 1 character\");\n } else if (channelName.length > 24) {\n errors.push(\"Channel name must be less than 24 characters\");\n }\n\n // Description is optional but has max length\n if (description.length > 200) {\n errors.push(\"Description must be less than 200 characters\");\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n }, [selectedAvatar, channelName, description]);\n\n return {\n presetAvatars,\n selectedAvatar,\n isCustomAvatar,\n channelName,\n nameSuggestions,\n description,\n descriptionSuggestions,\n isUploadingAvatar,\n isRefreshingAvatars,\n isRefreshingNameSuggestions,\n isRefreshingDescriptionSuggestions,\n selectAvatar,\n uploadCustomAvatar,\n refreshPresetAvatars,\n refreshNameSuggestions,\n refreshDescriptionSuggestions,\n setChannelName,\n applyNameSuggestion,\n setDescription,\n applyDescriptionSuggestion,\n validate,\n };\n}\n","import { useCallback, useState } from \"react\";\nimport { useChannelBasicInfoScript } from \"./channel-basic-info.script\";\nimport { ChannelBasicInfoUI } from \"./channel-basic-info.ui\";\n\nexport type ChannelBasicInfoWidgetProps = {\n /** Initial channel name */\n initialName?: string;\n /** Initial description */\n initialDescription?: string;\n /** Initial avatar URL */\n initialAvatar?: string;\n /** Callback when back button clicked */\n onBack?: () => void | Promise<void>;\n /** Callback when continue to next step */\n onContinue?: (data: {\n avatar: string;\n isCustomAvatar: boolean;\n name: string;\n description: string;\n }) => void | Promise<void>;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Channel Basic Info Widget\n * Combines UI and Script for channel basic information setup\n */\nexport function ChannelBasicInfoWidget({\n initialName,\n initialDescription,\n initialAvatar,\n onBack,\n onContinue,\n className,\n}: ChannelBasicInfoWidgetProps) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const {\n presetAvatars,\n selectedAvatar,\n isCustomAvatar,\n channelName,\n nameSuggestions,\n description,\n descriptionSuggestions,\n isUploadingAvatar,\n isRefreshingAvatars,\n isRefreshingNameSuggestions,\n isRefreshingDescriptionSuggestions,\n selectAvatar,\n uploadCustomAvatar,\n refreshPresetAvatars,\n refreshNameSuggestions,\n refreshDescriptionSuggestions,\n setChannelName,\n applyNameSuggestion,\n setDescription,\n applyDescriptionSuggestion,\n validate,\n } = useChannelBasicInfoScript({\n initialName,\n initialDescription,\n initialAvatar,\n });\n\n const handleBack = useCallback(async () => {\n try {\n await onBack?.();\n } catch (error) {\n console.error(\"Failed to go back:\", error);\n }\n }, [onBack]);\n\n const handleContinue = useCallback(async () => {\n const validation = validate();\n if (!validation.isValid) {\n console.error(\"Validation errors:\", validation.errors);\n // TODO: Show validation errors to user\n return;\n }\n\n if (!selectedAvatar) {\n return;\n }\n\n setIsSubmitting(true);\n try {\n await onContinue?.({\n avatar: selectedAvatar,\n isCustomAvatar,\n name: channelName,\n description,\n });\n } catch (error) {\n console.error(\"Failed to continue:\", error);\n } finally {\n setIsSubmitting(false);\n }\n }, [\n validate,\n selectedAvatar,\n isCustomAvatar,\n channelName,\n description,\n onContinue,\n ]);\n\n const isContinueDisabled = !selectedAvatar || !channelName.trim();\n\n return (\n <ChannelBasicInfoUI\n presetAvatars={presetAvatars}\n selectedAvatar={selectedAvatar}\n isCustomAvatar={isCustomAvatar}\n channelName={channelName}\n nameSuggestions={nameSuggestions}\n description={description}\n descriptionSuggestions={descriptionSuggestions}\n onAvatarSelect={selectAvatar}\n onCustomAvatarUpload={uploadCustomAvatar}\n isUploadingAvatar={isUploadingAvatar}\n isRefreshingAvatars={isRefreshingAvatars}\n onRefreshAvatars={refreshPresetAvatars}\n isRefreshingNameSuggestions={isRefreshingNameSuggestions}\n onRefreshNameSuggestions={refreshNameSuggestions}\n isRefreshingDescriptionSuggestions={isRefreshingDescriptionSuggestions}\n onRefreshDescriptionSuggestions={refreshDescriptionSuggestions}\n onChannelNameChange={setChannelName}\n onNameSuggestionClick={applyNameSuggestion}\n onDescriptionChange={setDescription}\n onDescriptionSuggestionClick={applyDescriptionSuggestion}\n onBack={handleBack}\n onContinue={handleContinue}\n isSubmitting={isSubmitting}\n isContinueDisabled={isContinueDisabled}\n className={className}\n />\n );\n}\n","import { useState } from \"react\";\nimport { Button, clsx, Textarea } from \"@liberfi.io/ui\";\nimport type { MonitoredWallet } from \"./wallet-import.script\";\n\n// MonitoredWallet type is imported from script file to avoid duplicate exports\n\ntype SortField = \"balance\" | \"pnl\" | \"txns\" | \"volume\";\ntype SortDirection = \"asc\" | \"desc\";\n\nexport type WalletImportUIProps = {\n /** Wallet addresses input value */\n walletInput: string;\n /** Number of wallets currently being monitored */\n monitoredCount: number;\n /** Maximum wallets allowed */\n maxWallets?: number;\n /** List of monitored wallets */\n monitoredWallets: MonitoredWallet[];\n /** Whether currently importing wallets */\n isImporting?: boolean;\n /** Wallet input change handler */\n onWalletInputChange: (value: string) => void;\n /** Add wallets handler */\n onAddWallets: () => void | Promise<void>;\n /** Quick action: Add Whale Top 100 MEV Wallets */\n onAddWhaleWallets: () => void | Promise<void>;\n /** Quick action: Add Smart Top 50 SOL Wallets */\n onAddSmartWallets: () => void | Promise<void>;\n /** Remove wallet handler */\n onRemoveWallet: (address: string) => void | Promise<void>;\n /** Back button handler */\n onBack: () => void | Promise<void>;\n /** Publish channel handler */\n onPublish: () => void | Promise<void>;\n /** Whether the form is submitting */\n isSubmitting?: boolean;\n /** Whether publish button is disabled */\n isPublishDisabled?: boolean;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Wallet Import UI Component\n * Full screen page for importing and managing monitored wallets\n */\nexport function WalletImportUI({\n walletInput,\n monitoredCount,\n maxWallets = 500,\n monitoredWallets,\n isImporting = false,\n onWalletInputChange,\n onAddWallets,\n onAddWhaleWallets,\n onAddSmartWallets,\n onRemoveWallet,\n onBack,\n onPublish,\n isSubmitting = false,\n isPublishDisabled = false,\n className,\n}: WalletImportUIProps) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isImportExpanded, setIsImportExpanded] = useState(true);\n const [sortField, setSortField] = useState<SortField | null>(null);\n const [sortDirection, setSortDirection] = useState<SortDirection>(\"desc\");\n\n const handleSort = (field: SortField) => {\n if (sortField === field) {\n // Toggle direction\n setSortDirection(sortDirection === \"asc\" ? \"desc\" : \"asc\");\n } else {\n setSortField(field);\n setSortDirection(\"desc\");\n }\n };\n\n const filteredWallets = monitoredWallets.filter(\n (wallet) =>\n wallet.address.toLowerCase().includes(searchQuery.toLowerCase()) ||\n wallet.alias?.toLowerCase().includes(searchQuery.toLowerCase()),\n );\n\n // Sort wallets if sort field is set\n const sortedWallets = sortField\n ? [...filteredWallets].sort((a, b) => {\n let aValue = 0;\n let bValue = 0;\n\n switch (sortField) {\n case \"balance\":\n // Parse balance (e.g., \"$1.2K\" -> 1200)\n aValue =\n parseFloat((a.balance || \"0\").replace(/[$K]/g, \"\")) *\n (a.balance?.includes(\"K\") ? 1000 : 1);\n bValue =\n parseFloat((b.balance || \"0\").replace(/[$K]/g, \"\")) *\n (b.balance?.includes(\"K\") ? 1000 : 1);\n break;\n case \"pnl\":\n // Use mock P&L value\n aValue = 11900;\n bValue = 11900;\n break;\n case \"txns\":\n aValue = a.sevenDayBuys ?? 0;\n bValue = b.sevenDayBuys ?? 0;\n break;\n case \"volume\":\n // Use mock volume value\n aValue = 33200;\n bValue = 33200;\n break;\n }\n\n return sortDirection === \"asc\" ? aValue - bValue : bValue - aValue;\n })\n : filteredWallets;\n\n const SortIcon = ({ field }: { field: SortField }) => {\n if (sortField !== field) {\n return (\n <svg\n className=\"w-3 h-3 text-default-300\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\"\n />\n </svg>\n );\n }\n return sortDirection === \"asc\" ? (\n <svg\n className=\"w-3 h-3 text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n ) : (\n <svg\n className=\"w-3 h-3 text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n );\n };\n\n return (\n <div\n className={clsx(\n \"w-full h-full flex flex-col items-center justify-start\",\n \"px-4 sm:px-6 py-8\",\n className,\n )}\n >\n <div className=\"w-full max-w-4xl flex flex-col gap-6\">\n {/* Title and Description */}\n <div className=\"space-y-3\">\n <h1 className=\"text-2xl sm:text-3xl font-bold text-foreground\">\n Wallets to Monitor\n </h1>\n <p className=\"text-sm sm:text-base text-default-500\">\n Add wallet addresses to generate real-time trading signals.\n </p>\n </div>\n\n {/* Main Content Container */}\n <div className=\"bg-content1 rounded-2xl border border-divider p-6 sm:p-8 space-y-6\">\n {/* Import Wallets Section */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-lg font-semibold text-foreground\">\n Import Wallets\n </h2>\n <span className=\"text-sm text-default-400\">\n {monitoredCount}/{maxWallets} Shared Wallets\n </span>\n </div>\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n onPress={() => setIsImportExpanded(!isImportExpanded)}\n endContent={\n <svg\n className={clsx(\n \"w-4 h-4 transition-transform\",\n !isImportExpanded && \"-rotate-90\",\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n }\n >\n {isImportExpanded ? \"Collapse\" : \"Expand\"}\n </Button>\n </div>\n\n {isImportExpanded && (\n <>\n {/* Quick Action Buttons and Import Wallet Button */}\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex flex-wrap gap-2\">\n <Button\n size=\"sm\"\n variant=\"flat\"\n color=\"default\"\n radius=\"lg\"\n onPress={onAddWhaleWallets}\n >\n Auto Import Top 100 KOL's Wallets\n </Button>\n <Button\n size=\"sm\"\n variant=\"flat\"\n color=\"default\"\n radius=\"lg\"\n onPress={onAddSmartWallets}\n >\n Auto Import Top 100 KOL's Wallets\n </Button>\n </div>\n\n {/* Import Wallet Button */}\n <Button\n variant=\"flat\"\n color=\"default\"\n radius=\"lg\"\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\"\n />\n </svg>\n }\n >\n Import Wallet\n </Button>\n </div>\n\n {/* Wallet Input Textarea */}\n <Textarea\n placeholder=\"Enter wallet address (e.g...)\"\n value={walletInput}\n onValueChange={onWalletInputChange}\n minRows={6}\n classNames={{\n input: \"font-mono text-sm\",\n }}\n />\n\n {/* Format Info and Add Button - Two Lines */}\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3\">\n <div className=\"text-xs text-default-400 space-y-1\">\n <p>\n <span className=\"font-semibold\">Support:</span> CSV/TXT\n </p>\n <p>\n <span className=\"font-semibold\">Format:</span> alias,\n address * Supports multiple separators * Auto-detect\n format\n </p>\n </div>\n\n <div className=\"flex gap-2\">\n <Button\n color=\"default\"\n variant=\"flat\"\n size=\"sm\"\n radius=\"lg\"\n onPress={() => onWalletInputChange(\"\")}\n isDisabled={!walletInput}\n >\n Cancel\n </Button>\n <Button\n color=\"default\"\n variant=\"flat\"\n size=\"sm\"\n radius=\"lg\"\n onPress={onAddWallets}\n isLoading={isImporting}\n isDisabled={!walletInput.trim()}\n startContent={\n !isImporting ? (\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\"\n />\n </svg>\n ) : undefined\n }\n >\n Add Wallet\n </Button>\n </div>\n </div>\n </>\n )}\n </div>\n\n {/* Monitored Wallets Section */}\n <div className=\"space-y-4 pt-6 border-t border-divider\">\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3\">\n <div className=\"space-y-1\">\n <h2 className=\"text-lg font-semibold text-foreground\">\n Monitored Wallets ({monitoredCount})\n </h2>\n <div className=\"flex items-center gap-2 text-xs text-default-400\">\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>Some wallet data may update with delay.</span>\n </div>\n </div>\n\n {/* Search */}\n {monitoredWallets.length > 0 && (\n <div className=\"relative\">\n <svg\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-default-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n type=\"text\"\n placeholder=\"Search by address or alias\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full sm:w-80 pl-10 pr-3 py-2 text-sm rounded-lg bg-default-100 border border-transparent focus:border-primary focus:outline-none\"\n />\n </div>\n )}\n </div>\n\n {/* Wallets List */}\n {sortedWallets.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <svg\n className=\"w-16 h-16 text-default-300 mb-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <p className=\"text-default-400\">No wallets added yet</p>\n </div>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-divider\">\n <th className=\"text-left py-3 px-4 font-medium text-default-500 text-xs\">\n Alias / Address\n </th>\n <th\n className=\"text-left py-3 px-4 font-medium text-default-500 text-xs cursor-pointer hover:text-foreground transition-colors\"\n onClick={() => handleSort(\"balance\")}\n >\n <div className=\"flex items-center gap-1\">\n <span>Balance($)</span>\n <SortIcon field=\"balance\" />\n </div>\n </th>\n <th\n className=\"text-left py-3 px-4 font-medium text-default-500 text-xs cursor-pointer hover:text-foreground transition-colors\"\n onClick={() => handleSort(\"pnl\")}\n >\n <div className=\"flex items-center gap-1\">\n <span>7D P&L $ / %</span>\n <SortIcon field=\"pnl\" />\n </div>\n </th>\n <th\n className=\"text-left py-3 px-4 font-medium text-default-500 text-xs cursor-pointer hover:text-foreground transition-colors\"\n onClick={() => handleSort(\"txns\")}\n >\n <div className=\"flex items-center gap-1\">\n <span>7D TXNS</span>\n <SortIcon field=\"txns\" />\n </div>\n </th>\n <th\n className=\"text-left py-3 px-4 font-medium text-default-500 text-xs cursor-pointer hover:text-foreground transition-colors\"\n onClick={() => handleSort(\"volume\")}\n >\n <div className=\"flex items-center gap-1\">\n <span>7D Volume</span>\n <SortIcon field=\"volume\" />\n </div>\n </th>\n <th className=\"text-left py-3 px-4 font-medium text-default-500 text-xs\">\n Imported\n </th>\n <th className=\"text-left py-3 px-4 font-medium text-default-500 text-xs\">\n Last Active\n </th>\n <th className=\"text-right py-3 px-4 font-medium text-default-500 text-xs\">\n Action\n </th>\n </tr>\n </thead>\n <tbody>\n {sortedWallets.map((wallet) => (\n <tr\n key={wallet.address}\n className=\"border-b border-divider hover:bg-default-50/50 transition-colors\"\n >\n <td className=\"py-4 px-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"w-5 h-5 rounded-full bg-primary/20 flex items-center justify-center flex-shrink-0\">\n <span className=\"text-xs\">≡</span>\n </div>\n <div className=\"flex flex-col min-w-0\">\n <div className=\"flex items-center gap-1\">\n {wallet.alias && (\n <span className=\"font-medium text-foreground\">\n {wallet.alias}\n </span>\n )}\n <button className=\"text-default-400 hover:text-foreground\">\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\"\n />\n </svg>\n </button>\n </div>\n <div className=\"flex items-center gap-1\">\n <span className=\"text-xs text-default-400 font-mono truncate max-w-[150px]\">\n {wallet.address}\n </span>\n <button className=\"text-default-400 hover:text-foreground\">\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </td>\n <td className=\"py-4 px-4\">\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-foreground\">\n {wallet.balance || \"$0\"}\n </span>\n <span className=\"text-xs text-default-400\">\n 106.2 sol\n </span>\n </div>\n </td>\n <td className=\"py-4 px-4\">\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-foreground\">\n $11.9K\n </span>\n <span className=\"text-xs text-success flex items-center gap-0.5\">\n <span>↗</span> 23.10%\n </span>\n </div>\n </td>\n <td className=\"py-4 px-4\">\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-foreground\">\n {wallet.sevenDayBuys ?? 0}\n </span>\n <span className=\"text-xs text-default-400\">\n <span className=\"text-success\">4</span> /{\" \"}\n <span className=\"text-danger\">4</span>\n </span>\n </div>\n </td>\n <td className=\"py-4 px-4\">\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-foreground\">\n $33.2K\n </span>\n <span className=\"text-xs text-default-400\">\n <span className=\"text-success\">$14.2k</span> /{\" \"}\n <span className=\"text-danger\">$19k</span>\n </span>\n </div>\n </td>\n <td className=\"py-4 px-4 text-default-400\">\n {wallet.importedAt || \"1D ago\"}\n </td>\n <td className=\"py-4 px-4 text-default-400\">\n {wallet.lastActiveAt || \"1min ago\"}\n </td>\n <td className=\"py-4 px-4 text-right\">\n <button\n onClick={() => onRemoveWallet(wallet.address)}\n className=\"text-danger hover:text-danger/80 p-1\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n </div>\n\n {/* Action Buttons */}\n <div className=\"flex gap-3 justify-between\">\n <Button\n color=\"default\"\n variant=\"flat\"\n radius=\"lg\"\n onPress={onBack}\n isDisabled={isSubmitting}\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n }\n >\n Back\n </Button>\n <Button\n color=\"primary\"\n radius=\"lg\"\n onPress={onPublish}\n isDisabled={isPublishDisabled || monitoredCount === 0}\n isLoading={isSubmitting}\n >\n Publish Channel\n </Button>\n </div>\n\n {/* Wallet Count Info */}\n <div className=\"flex items-center justify-center gap-2 text-xs text-default-400\">\n <span>\n {monitoredCount}/{maxWallets} Wallets\n </span>\n </div>\n </div>\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\n\nexport type MonitoredWallet = {\n address: string;\n alias?: string;\n balance?: string;\n importedAt: string;\n lastActiveAt?: string;\n sevenDayBuys?: number;\n sevenDaySells?: number;\n};\n\nexport type UseWalletImportScriptParams = {\n /** Maximum wallets allowed */\n maxWallets?: number;\n /** Initial monitored wallets */\n initialWallets?: MonitoredWallet[];\n};\n\nexport type UseWalletImportScriptResult = {\n /** Wallet input value */\n walletInput: string;\n /** List of monitored wallets */\n monitoredWallets: MonitoredWallet[];\n /** Number of monitored wallets */\n monitoredCount: number;\n /** Whether currently importing */\n isImporting: boolean;\n /** Update wallet input */\n setWalletInput: (value: string) => void;\n /** Add wallets from input */\n addWallets: () => Promise<{ success: boolean; errors?: string[] }>;\n /** Add whale wallets */\n addWhaleWallets: () => Promise<void>;\n /** Add smart wallets */\n addSmartWallets: () => Promise<void>;\n /** Remove a wallet */\n removeWallet: (address: string) => Promise<void>;\n /** Validate wallet addresses */\n validate: () => { isValid: boolean; errors: string[] };\n};\n\n/**\n * Parse wallet input string to extract addresses and aliases\n * Format: \"address,alias\" or just \"address\"\n */\nfunction parseWalletInput(\n input: string,\n): Array<{ address: string; alias?: string }> {\n const lines = input.split(\"\\n\").filter((line) => line.trim());\n const wallets: Array<{ address: string; alias?: string }> = [];\n\n for (const line of lines) {\n const parts = line.split(\",\").map((p) => p.trim());\n const address = parts[0];\n const alias = parts[1];\n\n if (address) {\n wallets.push({ address, alias });\n }\n }\n\n return wallets;\n}\n\n/**\n * Validate wallet address format\n * This is a simple validation - in production, use proper validation for each chain\n */\nfunction isValidWalletAddress(address: string): boolean {\n // SOL addresses are typically 32-44 characters\n // ETH addresses start with 0x and are 42 characters\n if (address.startsWith(\"0x\") && address.length === 42) {\n return true;\n }\n if (address.length >= 32 && address.length <= 44) {\n return true;\n }\n return false;\n}\n\n/**\n * Wallet Import Script Hook\n * Handles wallet import and monitoring logic\n *\n * NOTE: This is a placeholder implementation.\n * In production, replace with actual API calls for:\n * - Adding wallets\n * - Fetching wallet balances\n * - Fetching whale/smart wallet lists\n */\nexport function useWalletImportScript({\n maxWallets = 500,\n initialWallets = [],\n}: UseWalletImportScriptParams = {}): UseWalletImportScriptResult {\n const [walletInput, setWalletInput] = useState(\"\");\n const [monitoredWallets, setMonitoredWallets] =\n useState<MonitoredWallet[]>(initialWallets);\n const [isImporting, setIsImporting] = useState(false);\n\n const addWallets = useCallback(async () => {\n setIsImporting(true);\n try {\n const parsedWallets = parseWalletInput(walletInput);\n const errors: string[] = [];\n\n // Validate addresses\n const invalidAddresses = parsedWallets.filter(\n (w) => !isValidWalletAddress(w.address),\n );\n if (invalidAddresses.length > 0) {\n errors.push(`${invalidAddresses.length} invalid wallet addresses`);\n }\n\n // Check for duplicates in input\n const addresses = parsedWallets.map((w) => w.address);\n const duplicates = addresses.filter(\n (addr, index) => addresses.indexOf(addr) !== index,\n );\n if (duplicates.length > 0) {\n errors.push(\n `${duplicates.length} duplicated wallet addresses in the input`,\n );\n }\n\n // Check for already added wallets\n const existingAddresses = monitoredWallets.map((w) => w.address);\n const alreadyAdded = parsedWallets.filter((w) =>\n existingAddresses.includes(w.address),\n );\n if (alreadyAdded.length > 0) {\n errors.push(`${alreadyAdded.length} wallet addresses already added`);\n }\n\n // Check max limit\n const newCount =\n monitoredWallets.length + parsedWallets.length - alreadyAdded.length;\n if (newCount > maxWallets) {\n errors.push(`Wallet count cannot exceed ${maxWallets}`);\n }\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n // Simulate API call\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Add new wallets\n const now = new Date().toISOString();\n const newWallets: MonitoredWallet[] = parsedWallets\n .filter((w) => !existingAddresses.includes(w.address))\n .map((w) => ({\n address: w.address,\n alias: w.alias,\n importedAt: now,\n }));\n\n setMonitoredWallets((prev) => [...prev, ...newWallets]);\n setWalletInput(\"\");\n\n return { success: true };\n } catch (error) {\n console.error(\"Failed to add wallets:\", error);\n return { success: false, errors: [\"Failed to add wallets\"] };\n } finally {\n setIsImporting(false);\n }\n }, [walletInput, monitoredWallets, maxWallets]);\n\n const addWhaleWallets = useCallback(async () => {\n setIsImporting(true);\n try {\n // TODO: Replace with actual API call to fetch whale wallets\n await new Promise((resolve) => setTimeout(resolve, 1500));\n\n // Mock adding whale wallets\n const now = new Date().toISOString();\n const mockWhaleWallets: MonitoredWallet[] = [\n {\n address: \"WhaleAddress1234567890abcdefghijklmnopqr\",\n alias: \"Whale #1\",\n importedAt: now,\n },\n ];\n\n setMonitoredWallets((prev) => [...prev, ...mockWhaleWallets]);\n } catch (error) {\n console.error(\"Failed to add whale wallets:\", error);\n } finally {\n setIsImporting(false);\n }\n }, []);\n\n const addSmartWallets = useCallback(async () => {\n setIsImporting(true);\n try {\n // TODO: Replace with actual API call to fetch smart wallets\n await new Promise((resolve) => setTimeout(resolve, 1500));\n\n // Mock adding smart wallets\n const now = new Date().toISOString();\n const mockSmartWallets: MonitoredWallet[] = [\n {\n address: \"SmartAddress1234567890abcdefghijklmnopqr\",\n alias: \"Smart Trader #1\",\n importedAt: now,\n },\n ];\n\n setMonitoredWallets((prev) => [...prev, ...mockSmartWallets]);\n } catch (error) {\n console.error(\"Failed to add smart wallets:\", error);\n } finally {\n setIsImporting(false);\n }\n }, []);\n\n const removeWallet = useCallback(async (address: string) => {\n try {\n // TODO: Replace with actual API call\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n setMonitoredWallets((prev) => prev.filter((w) => w.address !== address));\n } catch (error) {\n console.error(\"Failed to remove wallet:\", error);\n throw error;\n }\n }, []);\n\n const validate = useCallback(() => {\n const errors: string[] = [];\n\n if (monitoredWallets.length === 0) {\n errors.push(\"At least one wallet is required\");\n }\n\n if (monitoredWallets.length > maxWallets) {\n errors.push(`Wallet count cannot exceed ${maxWallets}`);\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n }, [monitoredWallets, maxWallets]);\n\n return {\n walletInput,\n monitoredWallets,\n monitoredCount: monitoredWallets.length,\n isImporting,\n setWalletInput,\n addWallets,\n addWhaleWallets,\n addSmartWallets,\n removeWallet,\n validate,\n };\n}\n","import { useCallback, useState } from \"react\";\nimport { useWalletImportScript } from \"./wallet-import.script\";\nimport type { MonitoredWallet } from \"./wallet-import.script\";\nimport { WalletImportUI } from \"./wallet-import.ui\";\n\nexport type WalletImportWidgetProps = {\n /** Maximum wallets allowed */\n maxWallets?: number;\n /** Initial monitored wallets */\n initialWallets?: MonitoredWallet[];\n /** Callback when back button clicked */\n onBack?: () => void | Promise<void>;\n /** Callback when publish channel */\n onPublish?: (wallets: MonitoredWallet[]) => void | Promise<void>;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Wallet Import Widget\n * Combines UI and Script for wallet import and monitoring\n */\nexport function WalletImportWidget({\n maxWallets,\n initialWallets,\n onBack,\n onPublish,\n className,\n}: WalletImportWidgetProps) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const {\n walletInput,\n monitoredWallets,\n monitoredCount,\n isImporting,\n setWalletInput,\n addWallets,\n addWhaleWallets,\n addSmartWallets,\n removeWallet,\n validate,\n } = useWalletImportScript({\n maxWallets,\n initialWallets,\n });\n\n const handleAddWallets = useCallback(async () => {\n const result = await addWallets();\n if (!result.success && result.errors) {\n console.error(\"Validation errors:\", result.errors);\n // TODO: Show validation errors to user\n }\n }, [addWallets]);\n\n const handleBack = useCallback(async () => {\n try {\n await onBack?.();\n } catch (error) {\n console.error(\"Failed to go back:\", error);\n }\n }, [onBack]);\n\n const handlePublish = useCallback(async () => {\n const validation = validate();\n if (!validation.isValid) {\n console.error(\"Validation errors:\", validation.errors);\n // TODO: Show validation errors to user\n return;\n }\n\n setIsSubmitting(true);\n try {\n await onPublish?.(monitoredWallets);\n } catch (error) {\n console.error(\"Failed to publish:\", error);\n } finally {\n setIsSubmitting(false);\n }\n }, [validate, monitoredWallets, onPublish]);\n\n return (\n <WalletImportUI\n walletInput={walletInput}\n monitoredCount={monitoredCount}\n maxWallets={maxWallets}\n monitoredWallets={monitoredWallets}\n isImporting={isImporting}\n onWalletInputChange={setWalletInput}\n onAddWallets={handleAddWallets}\n onAddWhaleWallets={addWhaleWallets}\n onAddSmartWallets={addSmartWallets}\n onRemoveWallet={removeWallet}\n onBack={handleBack}\n onPublish={handlePublish}\n isSubmitting={isSubmitting}\n isPublishDisabled={monitoredCount === 0}\n className={className}\n />\n );\n}\n","import { Button, clsx } from \"@liberfi.io/ui\";\n// Import type from script to avoid duplicate exports\nimport type { BotConnectionStatus } from \"./social-bots.script\";\n\nexport type SocialBotsUIProps = {\n /** Telegram bot connection status */\n telegramStatus: BotConnectionStatus;\n /** Discord webhook connection status */\n discordStatus: BotConnectionStatus;\n /** Create Telegram bot handler */\n onCreateTelegramBot: () => void | Promise<void>;\n /** Add Discord webhook handler */\n onAddDiscordWebhook: () => void | Promise<void>;\n /** Back button handler */\n onBack: () => void | Promise<void>;\n /** Continue to next step handler */\n onContinue: () => void | Promise<void>;\n /** Whether the form is submitting */\n isSubmitting?: boolean;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Social Bots UI Component\n * Configuration page for connecting Telegram and Discord bots\n */\nexport function SocialBotsUI({\n telegramStatus,\n discordStatus,\n onCreateTelegramBot,\n onAddDiscordWebhook,\n onBack,\n onContinue,\n isSubmitting = false,\n className,\n}: SocialBotsUIProps) {\n return (\n <div\n className={clsx(\n \"w-full h-full flex flex-col items-center justify-start\",\n \"px-4 sm:px-6 py-8\",\n className,\n )}\n >\n <div className=\"w-full max-w-4xl flex flex-col gap-6\">\n {/* Title and Description */}\n <div className=\"space-y-3\">\n <h1 className=\"text-2xl sm:text-3xl font-bold text-foreground\">\n Distribute Signals to Your Community\n </h1>\n <p className=\"text-sm sm:text-base text-default-500\">\n Connect Telegram or Discord to automatically push trading signals.\n </p>\n </div>\n\n {/* Bots Container */}\n <div className=\"space-y-4\">\n {/* Telegram Bot */}\n <div className=\"bg-content1 rounded-2xl border border-divider p-6 sm:p-8\">\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div className=\"flex items-start gap-4\">\n {/* Telegram Icon */}\n <div className=\"w-12 h-12 rounded-xl bg-[#0088cc] flex items-center justify-center flex-shrink-0\">\n <svg\n className=\"w-7 h-7 text-white\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4.64 6.8c-.15 1.58-.8 5.42-1.13 7.19-.14.75-.42 1-.68 1.03-.58.05-1.02-.38-1.58-.75-.88-.58-1.38-.94-2.23-1.5-.99-.65-.35-1.01.22-1.59.15-.15 2.71-2.48 2.76-2.69a.2.2 0 00-.05-.18c-.06-.05-.14-.03-.21-.02-.09.02-1.49.95-4.22 2.79-.4.27-.76.41-1.08.4-.36-.01-1.04-.2-1.55-.37-.63-.2-1.12-.31-1.08-.66.02-.18.27-.36.74-.55 2.92-1.27 4.86-2.11 5.83-2.51 2.78-1.16 3.35-1.36 3.73-1.36.08 0 .27.02.39.12.1.08.13.19.14.27-.01.06.01.24 0 .38z\" />\n </svg>\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-base font-semibold text-foreground\">\n Telegram Bot\n </h3>\n <p className=\"text-sm text-default-500\">\n Auto-post signals to channels or groups\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <span\n className={clsx(\n \"px-3 py-1 rounded-full text-xs font-medium\",\n telegramStatus === \"connected\"\n ? \"bg-success/10 text-success\"\n : \"bg-default-200 text-default-600\",\n )}\n >\n {telegramStatus === \"connected\"\n ? \"Connected\"\n : \"Not Connected\"}\n </span>\n </div>\n </div>\n\n <div className=\"mt-6 flex flex-col gap-3\">\n <Button\n color=\"primary\"\n radius=\"lg\"\n onPress={onCreateTelegramBot}\n className=\"w-fit\"\n >\n Create Telegram Bot\n </Button>\n <p className=\"text-xs text-default-400\">\n You will be redirected to @BotFather to create a new bot token.\n </p>\n </div>\n </div>\n\n {/* Discord Webhook */}\n <div className=\"bg-content1 rounded-2xl border border-divider p-6 sm:p-8\">\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div className=\"flex items-start gap-4\">\n {/* Discord Icon */}\n <div className=\"w-12 h-12 rounded-xl bg-[#5865F2] flex items-center justify-center flex-shrink-0\">\n <svg\n className=\"w-7 h-7 text-white\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M20.317 4.492c-1.53-.69-3.17-1.2-4.885-1.49a.075.075 0 0 0-.079.036c-.21.369-.444.85-.608 1.23a18.566 18.566 0 0 0-5.487 0 12.36 12.36 0 0 0-.617-1.23A.077.077 0 0 0 8.562 3c-1.714.29-3.354.8-4.885 1.491a.07.07 0 0 0-.032.027C.533 9.093-.32 13.555.099 17.961a.08.08 0 0 0 .031.055 20.03 20.03 0 0 0 5.993 2.98.078.078 0 0 0 .084-.026 13.83 13.83 0 0 0 1.226-1.963.074.074 0 0 0-.041-.104 13.201 13.201 0 0 1-1.872-.878.075.075 0 0 1-.008-.125c.126-.093.252-.19.372-.287a.075.075 0 0 1 .078-.01c3.927 1.764 8.18 1.764 12.061 0a.075.075 0 0 1 .079.009c.12.098.245.195.372.288a.075.075 0 0 1-.006.125c-.598.344-1.22.635-1.873.877a.075.075 0 0 0-.041.105c.36.687.772 1.341 1.225 1.962a.077.077 0 0 0 .084.028 19.963 19.963 0 0 0 6.002-2.981.076.076 0 0 0 .032-.054c.5-5.094-.838-9.52-3.549-13.442a.06.06 0 0 0-.031-.028zM8.02 15.278c-1.182 0-2.157-1.069-2.157-2.38 0-1.312.956-2.38 2.157-2.38 1.21 0 2.176 1.077 2.157 2.38 0 1.312-.956 2.38-2.157 2.38zm7.975 0c-1.183 0-2.157-1.069-2.157-2.38 0-1.312.955-2.38 2.157-2.38 1.21 0 2.176 1.077 2.157 2.38 0 1.312-.946 2.38-2.157 2.38z\" />\n </svg>\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-base font-semibold text-foreground\">\n Discord Webhook\n </h3>\n <p className=\"text-sm text-default-500\">\n Post updates to your server channels\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <span\n className={clsx(\n \"px-3 py-1 rounded-full text-xs font-medium\",\n discordStatus === \"connected\"\n ? \"bg-success/10 text-success\"\n : \"bg-default-200 text-default-600\",\n )}\n >\n {discordStatus === \"connected\"\n ? \"Connected\"\n : \"Not Connected\"}\n </span>\n </div>\n </div>\n\n <div className=\"mt-6\">\n <Button\n color=\"primary\"\n radius=\"lg\"\n onPress={onAddDiscordWebhook}\n className=\"w-fit\"\n >\n Add Discord Bot to Server\n </Button>\n </div>\n </div>\n </div>\n\n {/* Action Buttons */}\n <div className=\"flex gap-3 justify-between\">\n <Button\n color=\"default\"\n variant=\"flat\"\n radius=\"lg\"\n onPress={onBack}\n isDisabled={isSubmitting}\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n }\n >\n Back\n </Button>\n <Button\n color=\"primary\"\n radius=\"lg\"\n onPress={onContinue}\n isLoading={isSubmitting}\n >\n Next Step\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\n\nexport type BotConnectionStatus = \"connected\" | \"not_connected\";\n\nexport type UseSocialBotsScriptParams = {\n /** Initial Telegram bot status */\n initialTelegramStatus?: BotConnectionStatus;\n /** Initial Discord webhook status */\n initialDiscordStatus?: BotConnectionStatus;\n};\n\nexport type UseSocialBotsScriptResult = {\n /** Telegram bot connection status */\n telegramStatus: BotConnectionStatus;\n /** Discord webhook connection status */\n discordStatus: BotConnectionStatus;\n /** Create Telegram bot */\n createTelegramBot: () => Promise<void>;\n /** Add Discord webhook */\n addDiscordWebhook: () => Promise<void>;\n /** Validate configuration */\n validate: () => { isValid: boolean; errors: string[] };\n};\n\n/**\n * Social Bots Script Hook\n * Handles bot connection state and configuration logic\n *\n * NOTE: This is a placeholder implementation.\n * In production, replace with actual bot integration APIs.\n */\nexport function useSocialBotsScript({\n initialTelegramStatus = \"not_connected\",\n initialDiscordStatus = \"not_connected\",\n}: UseSocialBotsScriptParams = {}): UseSocialBotsScriptResult {\n const [telegramStatus, setTelegramStatus] = useState<BotConnectionStatus>(\n initialTelegramStatus,\n );\n const [discordStatus, setDiscordStatus] =\n useState<BotConnectionStatus>(initialDiscordStatus);\n\n const createTelegramBot = useCallback(async () => {\n try {\n // TODO: Replace with actual Telegram bot creation flow\n // This should redirect to @BotFather or open a modal\n\n // Simulate API call\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Mock success - in reality, this would be set after successful OAuth\n setTelegramStatus(\"connected\");\n } catch (error) {\n console.error(\"Failed to create Telegram bot:\", error);\n throw error;\n }\n }, []);\n\n const addDiscordWebhook = useCallback(async () => {\n try {\n // TODO: Replace with actual Discord webhook integration\n // This should open Discord OAuth or webhook configuration\n\n // Simulate API call\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Mock success\n setDiscordStatus(\"connected\");\n } catch (error) {\n console.error(\"Failed to add Discord webhook:\", error);\n throw error;\n }\n }, []);\n\n const validate = useCallback(() => {\n const errors: string[] = [];\n\n // Bots are optional, so validation always passes\n // In production, you might want to enforce at least one bot connection\n\n return {\n isValid: true,\n errors,\n };\n }, []);\n\n return {\n telegramStatus,\n discordStatus,\n createTelegramBot,\n addDiscordWebhook,\n validate,\n };\n}\n","import { useCallback, useState } from \"react\";\nimport { useSocialBotsScript } from \"./social-bots.script\";\nimport { SocialBotsUI } from \"./social-bots.ui\";\n\nexport type SocialBotsWidgetProps = {\n /** Initial Telegram bot status */\n initialTelegramStatus?: \"connected\" | \"not_connected\";\n /** Initial Discord webhook status */\n initialDiscordStatus?: \"connected\" | \"not_connected\";\n /** Callback when back button clicked */\n onBack?: () => void | Promise<void>;\n /** Callback when continue to next step */\n onContinue?: () => void | Promise<void>;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Social Bots Widget\n * Combines UI and Script for social bots configuration\n */\nexport function SocialBotsWidget({\n initialTelegramStatus,\n initialDiscordStatus,\n onBack,\n onContinue,\n className,\n}: SocialBotsWidgetProps) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const {\n telegramStatus,\n discordStatus,\n createTelegramBot,\n addDiscordWebhook,\n validate,\n } = useSocialBotsScript({\n initialTelegramStatus,\n initialDiscordStatus,\n });\n\n const handleBack = useCallback(async () => {\n try {\n await onBack?.();\n } catch (error) {\n console.error(\"Failed to go back:\", error);\n }\n }, [onBack]);\n\n const handleContinue = useCallback(async () => {\n const validation = validate();\n if (!validation.isValid) {\n console.error(\"Validation errors:\", validation.errors);\n return;\n }\n\n setIsSubmitting(true);\n try {\n await onContinue?.();\n } catch (error) {\n console.error(\"Failed to continue:\", error);\n } finally {\n setIsSubmitting(false);\n }\n }, [validate, onContinue]);\n\n return (\n <SocialBotsUI\n telegramStatus={telegramStatus}\n discordStatus={discordStatus}\n onCreateTelegramBot={createTelegramBot}\n onAddDiscordWebhook={addDiscordWebhook}\n onBack={handleBack}\n onContinue={handleContinue}\n isSubmitting={isSubmitting}\n className={className}\n />\n );\n}\n","import { useTickAge } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport {\n DiscordIcon,\n HorizontalScrollContainer,\n Link,\n PeopleIcon,\n StyledTooltip,\n TelegramIcon,\n TimerIcon,\n TwitterIcon,\n WalletIcon,\n} from \"@liberfi.io/ui\";\nimport { formatAge } from \"@liberfi.io/utils\";\n\nexport type ChannelAttributesProps = {\n channel: Channel;\n};\n\nexport function ChannelAttributes({ channel }: ChannelAttributesProps) {\n const { t } = useTranslation();\n\n const updatedAge = useTickAge(new Date(channel.updated_at));\n\n return (\n <HorizontalScrollContainer\n classNames={{\n leftArrow: \"from-content1/60 to-transparent\",\n rightArrow: \"from-content1/60 to-transparent\",\n }}\n >\n <div className=\"flex items-center gap-4\">\n {/* wallet count */}\n <StyledTooltip content={t(\"channels.info.walletCount\")} closeDelay={0}>\n <div className=\"flex items-center gap-1\">\n <WalletIcon width={16} height={16} />\n <p className=\"text-xs\">{channel.source_count || \"-\"}</p>\n </div>\n </StyledTooltip>\n\n {/* subscribe count */}\n <StyledTooltip\n content={t(\"channels.info.subscribeCount\")}\n closeDelay={0}\n >\n <div className=\"flex items-center gap-1\">\n <PeopleIcon width={16} height={16} />\n <p className=\"text-xs\">{channel.subscribe_count || \"-\"}</p>\n </div>\n </StyledTooltip>\n\n {/* last updated at */}\n <StyledTooltip content={t(\"channels.info.updatedAt\")} closeDelay={0}>\n <div className=\"flex items-center gap-1\">\n <TimerIcon width={16} height={16} />\n <p className=\"text-xs\">{formatAge(updatedAge)}</p>\n </div>\n </StyledTooltip>\n\n {channel.twitter && (\n <Link href={channel.twitter} target=\"_blank\" className=\"text-neutral\">\n <TwitterIcon width={16} height={16} />\n </Link>\n )}\n\n {channel.telegram && (\n <Link\n href={channel.telegram}\n target=\"_blank\"\n className=\"text-neutral\"\n >\n <TelegramIcon width={16} height={16} />\n </Link>\n )}\n {channel.discord && (\n <Link href={channel.discord} target=\"_blank\" className=\"text-neutral\">\n <DiscordIcon width={16} height={16} />\n </Link>\n )}\n </div>\n </HorizontalScrollContainer>\n );\n}\n","import { useMemo } from \"react\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { Avatar } from \"@liberfi.io/ui\";\nimport { chainIcon } from \"@liberfi.io/utils\";\nimport { ChannelAttributes } from \"./channel-attributes\";\n\nexport type ChannelBaseInfoProps = {\n channel: Channel;\n customActions?: React.ReactNode;\n};\n\nexport function ChannelBaseInfo({\n channel,\n customActions,\n}: ChannelBaseInfoProps) {\n const chainIconUrl = useMemo(\n () => (channel.chain ? chainIcon(channel.chain) : undefined),\n [channel.chain],\n );\n\n return (\n <div className=\"flex gap-4\">\n <div className=\"flex-none flex flex-col\">\n <div className=\"relative\">\n <Avatar\n src={channel.icon}\n alt={channel.name}\n className=\"w-18 h-18\"\n radius=\"md\"\n />\n {chainIconUrl && (\n <Avatar\n radius=\"full\"\n src={chainIconUrl}\n className=\"w-5 h-5 absolute -bottom-1 -right-1 border border-border shadow-sm\"\n />\n )}\n </div>\n </div>\n\n <div className=\"flex-auto min-w-0 flex flex-col gap-2 text-neutral\">\n <div className=\"h-6 flex items-center gap-2\">\n <p className=\"flex-auto min-w-0 text-sm font-medium text-foreground truncate\">\n {channel.name}\n </p>\n <div className=\"flex-none\">{customActions}</div>\n </div>\n\n <ChannelAttributes channel={channel} />\n\n <p className=\"text-xs whitespace-pre-wrap line-clamp-1 h-4 overflow-hidden\">\n {channel.description}\n </p>\n </div>\n </div>\n );\n}\n","import { Channel } from \"@liberfi.io/types\";\nimport { EditIcon, StyledButton } from \"@liberfi.io/ui\";\nimport { useAuth, useAuthCallback } from \"@liberfi.io/wallet-connector\";\n\nexport type ChannelEditButtonProps = {\n channel: Channel;\n onEdit?: (channel: Channel) => void;\n};\n\nexport function ChannelEditButton({ channel, onEdit }: ChannelEditButtonProps) {\n const { user } = useAuth();\n\n const handleEdit = useAuthCallback(() => {\n onEdit?.(channel);\n }, [channel, onEdit]);\n\n if (user?.id !== channel.owner_id) {\n return <></>;\n }\n\n return (\n <StyledButton\n className=\"bg-transparent\"\n isIconOnly\n size=\"sm\"\n onPress={handleEdit}\n >\n <EditIcon width={16} height={16} className=\"text-neutral\" />\n </StyledButton>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { HorizontalScrollContainer, StyledTooltip } from \"@liberfi.io/ui\";\n\nexport type ChannelStatsProps = {\n channel: Channel;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function ChannelStats({ channel }: ChannelStatsProps) {\n const { t } = useTranslation();\n\n return (\n <HorizontalScrollContainer\n classNames={{\n leftArrow: \"from-content1/60 to-transparent\",\n rightArrow: \"from-content1/60 to-transparent\",\n }}\n >\n <div className=\"flex items-center gap-4 text-xs\">\n {/* 7D txs */}\n <StyledTooltip content={t(\"channels.stats.7dTxs.hint\")} closeDelay={0}>\n <div className=\"flex-none flex flex-col gap-1 items-center\">\n <p className=\"text-neutral font-medium\">\n {t(\"channels.stats.7dTxs.title\")}\n </p>\n <p className=\"text-foreground font-semibold\">--</p>\n </div>\n </StyledTooltip>\n\n {/* 7d PnL */}\n <StyledTooltip content={t(\"channels.stats.7dPnl.hint\")} closeDelay={0}>\n <div className=\"flex-none flex flex-col gap-1 items-center\">\n <p className=\"text-neutral font-medium\">\n {t(\"channels.stats.7dPnl.title\")}\n </p>\n <p className=\"text-bullish font-semibold\">--</p>\n </div>\n </StyledTooltip>\n\n {/* 7d WR */}\n <StyledTooltip content={t(\"channels.stats.7dWr.hint\")} closeDelay={0}>\n <div className=\"flex-none flex flex-col gap-1 items-center\">\n <p className=\"text-neutral font-medium\">\n {t(\"channels.stats.7dWr.title\")}\n </p>\n <p className=\"text-bullish font-semibold\">--%</p>\n </div>\n </StyledTooltip>\n </div>\n </HorizontalScrollContainer>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { CheckIcon, clsx, PlusIcon, StyledButton, toast } from \"@liberfi.io/ui\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport {\n useSubscribeChannelMutation,\n useUnsubscribeChannelMutation,\n} from \"../../hooks\";\n\nexport type ChannelSubscribeButtonProps = {\n channel: Channel;\n onSubscribeSuccess?: (channel: Channel) => void;\n onUnsubscribeSuccess?: (channel: Channel) => void;\n onSubscribeError?: (channel: Channel, error: unknown) => void;\n onUnsubscribeError?: (channel: Channel, error: unknown) => void;\n};\n\nexport function ChannelSubscribeButton({\n channel,\n onSubscribeSuccess,\n onUnsubscribeSuccess,\n onSubscribeError,\n onUnsubscribeError,\n}: ChannelSubscribeButtonProps) {\n const { t } = useTranslation();\n\n const [subscribed, setSubscribed] = useState(channel.is_subscribed);\n\n useEffect(() => {\n setSubscribed(channel.is_subscribed);\n }, [channel.is_subscribed]);\n\n const { mutateAsync: subscribeChannel, isPending: isSubscribing } =\n useSubscribeChannelMutation();\n\n const { mutateAsync: unsubscribeChannel, isPending: isUnsubscribing } =\n useUnsubscribeChannelMutation();\n\n const handleSubscribe = useAuthCallback(async () => {\n try {\n if (subscribed) {\n await unsubscribeChannel(channel.id);\n setSubscribed(false);\n toast.success(t(\"channels.unsubscribe.success\"));\n onUnsubscribeSuccess?.(channel);\n } else {\n await subscribeChannel(channel.id);\n setSubscribed(true);\n toast.success(t(\"channels.subscribe.success\"));\n onSubscribeSuccess?.(channel);\n }\n } catch (error) {\n console.error(\"Subscribe / Unsubscribe channel error\", error);\n if (subscribed) {\n toast.error(t(\"channels.unsubscribe.error\"));\n onUnsubscribeError?.(channel, error);\n } else {\n toast.error(t(\"channels.subscribe.error\"));\n onSubscribeError?.(channel, error);\n }\n }\n }, [\n t,\n subscribed,\n channel,\n subscribeChannel,\n unsubscribeChannel,\n onSubscribeSuccess,\n onUnsubscribeSuccess,\n onSubscribeError,\n onUnsubscribeError,\n ]);\n\n return (\n <StyledButton\n color={subscribed ? \"default\" : \"primary\"}\n size=\"sm\"\n radius=\"lg\"\n onPress={handleSubscribe}\n isLoading={isSubscribing || isUnsubscribing}\n variant={subscribed ? \"bordered\" : \"flat\"}\n className={clsx(\"gap-1\", subscribed && \"text-neutral\")}\n startContent={\n subscribed ? (\n !isSubscribing && !isUnsubscribing ? (\n <CheckIcon width={16} height={16} />\n ) : undefined\n ) : !isSubscribing && !isUnsubscribing ? (\n <PlusIcon width={16} height={16} />\n ) : undefined\n }\n >\n {subscribed\n ? t(\"channels.unsubscribe.submit\")\n : t(\"channels.subscribe.submit\")}\n </StyledButton>\n );\n}\n","import { useCallback } from \"react\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { clsx, HorizontalScrollContainer } from \"@liberfi.io/ui\";\nimport { ChannelBaseInfo, ChannelStats } from \"../channel\";\n\nexport type ChannelsItemUIProps = {\n channel: Channel;\n onSelect?: (channel: Channel) => void;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n};\n\nexport function ChannelsItemUI({\n channel,\n onSelect,\n headerActions,\n footerActions,\n}: ChannelsItemUIProps) {\n const handleSelect = useCallback(() => {\n onSelect?.(channel);\n }, [channel, onSelect]);\n\n return (\n <div\n className={clsx(\n \"bg-content1 hover:bg-content2 border border-border rounded-lg w-full h-full p-2.5\",\n \"flex flex-col gap-2.5\",\n onSelect && \"cursor-pointer\",\n )}\n onClick={handleSelect}\n >\n <ChannelBaseInfo channel={channel} customActions={headerActions} />\n\n <div className=\"flex items-center gap-4\">\n <div className=\"flex-auto min-w-0\">\n <ChannelStats channel={channel} />\n </div>\n <div className=\"flex-none\">{footerActions}</div>\n </div>\n </div>\n );\n}\n","import { Channel } from \"@liberfi.io/types\";\nimport { ChannelsItemUI } from \"./channels-item.ui\";\n\nexport type ChannelsUIProps = {\n channels: Array<Channel>;\n onSelect?: (channel: Channel) => void;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function ChannelsUI({\n channels,\n onSelect,\n customHeaderActions,\n customFooterActions,\n}: ChannelsUIProps) {\n return (\n <div className=\"w-full grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {channels.map((channel) => (\n <ChannelsItemUI\n key={channel.id}\n channel={channel}\n onSelect={onSelect}\n headerActions={customHeaderActions?.(channel)}\n footerActions={customFooterActions?.(channel)}\n />\n ))}\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport type ChannelsSkeletonUIProps = {\n count: number;\n};\n\nexport function ChannelsSkeletonUI({ count }: ChannelsSkeletonUIProps) {\n return (\n <div className=\"w-full grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {Array.from({ length: count }).map((_, index) => (\n <div\n key={index}\n className=\"bg-content1 hover:bg-content2 border border-border rounded-lg w-full h-35 p-2.5 flex flex-col gap-2.5\"\n >\n <div className=\"flex gap-4\">\n <div className=\"flex-none flex flex-col\">\n <Skeleton className=\"w-18 h-18 flex-none rounded-md\" />\n </div>\n\n <div className=\"flex-auto min-w-0 flex flex-col gap-2 justify-center text-neutral\">\n <Skeleton className=\"w-24 h-4 rounded-md\" />\n <Skeleton className=\"w-48 h-4 rounded-md\" />\n <Skeleton className=\"w-48 h-4 rounded-md\" />\n </div>\n </div>\n <div className=\"w-full flex justify-between gap-4\">\n <Skeleton className=\"flex-auto min-w-0 h-6 rounded-md\" />\n <Skeleton className=\"w-24 h-6 rounded-md\" />\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { EmptyIcon } from \"@liberfi.io/ui\";\n\nexport type ChannelsEmptyUIProps = {\n message?: string;\n};\n\nexport function ChannelsEmptyUI({ message }: ChannelsEmptyUIProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"pt-24 mx-auto\">\n <EmptyIcon width={28} height={28} className=\"text-neutral mx-auto\" />\n <p className=\"pt-2 text-sm text-neutral text-center\">\n {message || t(\"common.empty\")}\n </p>\n </div>\n );\n}\n","import { useEffect } from \"react\";\nimport { useAuth } from \"@liberfi.io/wallet-connector\";\nimport { useChannelsListQuery } from \"../../hooks\";\n\nexport const useTrendingChannels = () => {\n const { status } = useAuth();\n\n const result = useChannelsListQuery();\n\n const { refetch } = result;\n\n // refetch to fix subscription status\n useEffect(() => {\n if (status === \"authenticated\") {\n refetch();\n }\n }, [status, refetch]);\n\n return result;\n};\n","import { Channel } from \"@liberfi.io/types\";\nimport { ChannelsEmptyUI } from \"./channels-empty.ui\";\nimport { ChannelsSkeletonUI } from \"./channels-skeleton.ui\";\nimport { ChannelsUI } from \"./channels.ui\";\nimport { useTrendingChannels } from \"./trending-channels.script\";\n\nexport type TrendingChannelsWidgetProps = {\n onSelect?: (channel: Channel) => void;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function TrendingChannelsWidget({\n onSelect,\n customHeaderActions,\n customFooterActions,\n}: TrendingChannelsWidgetProps) {\n const { data: channelList, isLoading } = useTrendingChannels();\n\n if (isLoading) {\n return <ChannelsSkeletonUI count={9} />;\n }\n\n if (!channelList || channelList.list.length === 0) {\n return <ChannelsEmptyUI />;\n }\n\n return (\n <ChannelsUI\n channels={channelList.list}\n onSelect={onSelect}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledButton } from \"@liberfi.io/ui\";\nimport { useAuth } from \"@liberfi.io/wallet-connector\";\n\nexport type ChannelsUnauthenticatedUIProps = {\n message?: string;\n};\n\nexport function ChannelsUnauthenticatedUI({\n message,\n}: ChannelsUnauthenticatedUIProps) {\n const { t } = useTranslation();\n\n const { signIn } = useAuth();\n\n return (\n <div className=\"pt-24 flex flex-col items-center justify-center gap-2\">\n <p className=\"text-neutral text-sm\">\n {message || t(\"common.unauthenticated\")}\n </p>\n <StyledButton color=\"primary\" size=\"sm\" onPress={signIn} radius=\"lg\">\n {t(\"common.signIn\")}\n </StyledButton>\n </div>\n );\n}\n","import { Channel } from \"@liberfi.io/types\";\nimport { useAuth } from \"@liberfi.io/wallet-connector\";\nimport { useSubscribedChannelsListQuery } from \"../../hooks\";\nimport { ChannelsEmptyUI } from \"./channels-empty.ui\";\nimport { ChannelsSkeletonUI } from \"./channels-skeleton.ui\";\nimport { ChannelsUnauthenticatedUI } from \"./channels-unauthenticated.ui\";\nimport { ChannelsUI } from \"./channels.ui\";\n\nexport type SubscribedChannelsWidgetProps = {\n onSelect?: (channel: Channel) => void;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function SubscribedChannelsWidget({\n onSelect,\n customHeaderActions,\n customFooterActions,\n}: SubscribedChannelsWidgetProps) {\n const { status } = useAuth();\n\n const { data: channelList, isLoading } = useSubscribedChannelsListQuery(\n {},\n { enabled: status === \"authenticated\" },\n );\n\n if (status === \"unauthenticated\") {\n return <ChannelsUnauthenticatedUI />;\n }\n\n if (status === \"authenticating\" || isLoading) {\n return <ChannelsSkeletonUI count={9} />;\n }\n\n if (!channelList || channelList.list.length === 0) {\n return <ChannelsEmptyUI />;\n }\n\n return (\n <ChannelsUI\n channels={channelList.list}\n onSelect={onSelect}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n );\n}\n","import { useSubscribedChannelsListQuery } from \"../../hooks\";\n\nexport const useSubscribedChannels = () => {\n return useSubscribedChannelsListQuery();\n};\n","import { Channel } from \"@liberfi.io/types\";\nimport { useAuth } from \"@liberfi.io/wallet-connector\";\nimport { useMyChannelsListQuery } from \"../../hooks\";\nimport { ChannelsEmptyUI } from \"./channels-empty.ui\";\nimport { ChannelsSkeletonUI } from \"./channels-skeleton.ui\";\nimport { ChannelsUnauthenticatedUI } from \"./channels-unauthenticated.ui\";\nimport { ChannelsUI } from \"./channels.ui\";\n\nexport type MyChannelsWidgetProps = {\n onSelect?: (channel: Channel) => void;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function MyChannelsWidget({\n onSelect,\n customHeaderActions,\n customFooterActions,\n}: MyChannelsWidgetProps) {\n const { status } = useAuth();\n\n const { data: channelList, isLoading } = useMyChannelsListQuery(\n {},\n { enabled: status === \"authenticated\" },\n );\n\n if (status === \"unauthenticated\") {\n return <ChannelsUnauthenticatedUI />;\n }\n\n if (status === \"authenticating\" || isLoading) {\n return <ChannelsSkeletonUI count={9} />;\n }\n\n if (!channelList || channelList.list.length === 0) {\n return <ChannelsEmptyUI />;\n }\n\n return (\n <ChannelsUI\n channels={channelList.list}\n onSelect={onSelect}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n );\n}\n","import { useMyChannelsListQuery } from \"../../hooks\";\n\nexport const useMyChannels = () => {\n return useMyChannelsListQuery();\n};\n","import { useMemo } from \"react\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { Avatar, clsx } from \"@liberfi.io/ui\";\nimport { chainIcon } from \"@liberfi.io/utils\";\nimport { ChannelAttributes, ChannelStats } from \"../channel\";\n\nexport type ChannelDetailUIProps = {\n channel: Channel;\n headerActions?: React.ReactNode;\n footerActions?: React.ReactNode;\n className?: string;\n};\n\nexport function ChannelDetailUI({\n channel,\n headerActions,\n footerActions,\n className,\n}: ChannelDetailUIProps) {\n const chainIconUrl = useMemo(\n () => (channel.chain ? chainIcon(channel.chain) : undefined),\n [channel.chain],\n );\n\n return (\n <div\n className={clsx(\n \"bg-content1 border border-border rounded-lg w-full h-fit p-2.5\",\n \"flex flex-col gap-2.5\",\n className,\n )}\n >\n <div className=\"flex gap-4\">\n <div className=\"flex-none flex flex-col\">\n <div className=\"relative\">\n <Avatar\n src={channel.icon}\n alt={channel.name}\n className=\"w-18 h-18\"\n radius=\"md\"\n />\n {chainIconUrl && (\n <Avatar\n radius=\"full\"\n src={chainIconUrl}\n className=\"w-5 h-5 absolute -bottom-1 -right-1 border border-border shadow-sm\"\n />\n )}\n </div>\n </div>\n\n <div className=\"flex-auto min-w-0 flex flex-col gap-2 text-neutral\">\n <div className=\"h-6 flex items-center gap-2\">\n <p className=\"flex-auto min-w-0 text-sm font-medium text-foreground truncate\">\n {channel.name}\n </p>\n <div className=\"flex-none\">{headerActions}</div>\n </div>\n\n <ChannelAttributes channel={channel} />\n </div>\n </div>\n\n <div className=\"flex gap-4\">\n <div className=\"flex-auto min-w-0\">\n <ChannelStats channel={channel} />\n </div>\n <div className=\"flex-none\">{footerActions}</div>\n </div>\n\n {channel.description && (\n <p className=\"text-xs whitespace-pre-wrap\">{channel.description}</p>\n )}\n </div>\n );\n}\n","import { useTickAge } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n COMMON_TOKEN_SYMBOLS_MAP,\n formatAge,\n formatAmount,\n formatPriceUSD,\n SafeBigNumber,\n shortAddress,\n} from \"@liberfi.io/utils\";\nimport { ChannelEventRowProps } from \"../../types\";\n\nexport function WalletTradeEvent({\n event,\n walletAliases,\n tokens,\n}: ChannelEventRowProps) {\n const { t } = useTranslation();\n\n const age = useTickAge(new Date(event.data.timestamp));\n\n const address = event.data.wallet_address;\n\n const alias = walletAliases?.[address];\n\n const quoteAddress = event.data.quote_address;\n\n const quoteSymbol =\n tokens?.[quoteAddress]?.symbol ?? COMMON_TOKEN_SYMBOLS_MAP[quoteAddress];\n\n const baseAddress = event.data.base_address;\n\n const baseSymbol =\n tokens?.[baseAddress]?.symbol ?? COMMON_TOKEN_SYMBOLS_MAP[baseAddress];\n\n const type = event.data.type;\n\n return (\n <div className=\"w-full h-full flex items-center gap-2.5 text-xs\">\n {/* wallet address */}\n <div className=\"flex-none w-24\">\n {alias ? (\n // with alias\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate\">{alias}</div>\n <div className=\"text-neutral\">({shortAddress(address)})</div>\n </div>\n ) : (\n // without alias\n <div>{shortAddress(address)}</div>\n )}\n </div>\n\n {/* buy details */}\n {type === \"buy\" && (\n <>\n {/* buy amount */}\n <div className=\"flex-none w-18\">\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"text-neutral\">\n {t(\"channels.events.walletTrade.buy\")}\n </div>\n <div className=\"text-bullish\">\n {formatAmount(new SafeBigNumber(event.data.base_amount).abs())}\n </div>\n </div>\n </div>\n\n {/* buy token */}\n <div className=\"flex-none w-24\">\n {baseSymbol ? (\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate\">{baseSymbol}</div>\n <div className=\"text-neutral\">\n ({shortAddress(baseAddress)})\n </div>\n </div>\n ) : (\n <div>{shortAddress(baseAddress)}</div>\n )}\n </div>\n\n {/* cost amount */}\n <div className=\"flex-none w-18\">\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"text-neutral\">\n {t(\"channels.events.walletTrade.cost\")}\n </div>\n <div className={\"text-bearish\"}>\n {formatAmount(new SafeBigNumber(event.data.quote_amount).abs())}\n </div>\n </div>\n </div>\n\n {/* cost token */}\n <div className=\"flex-none w-24\">\n {quoteSymbol ? (\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate\">{quoteSymbol}</div>\n <div className=\"text-neutral\">\n ({shortAddress(quoteAddress)})\n </div>\n </div>\n ) : (\n <div>{shortAddress(quoteAddress)}</div>\n )}\n </div>\n\n {/* price */}\n <div className=\"flex-none w-18\">\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate text-neutral\">\n {t(\"channels.events.walletTrade.price\")}\n </div>\n <div>{formatPriceUSD(event.data.quote_price_usd)}</div>\n </div>\n </div>\n </>\n )}\n\n {/* sell details */}\n {type === \"sell\" && (\n <>\n {/* sell amount */}\n <div className=\"flex-none w-18\">\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"text-neutral\">\n {t(\"channels.events.walletTrade.sell\")}\n </div>\n <div className=\"text-bearish\">\n {formatAmount(new SafeBigNumber(event.data.quote_amount).abs())}\n </div>\n </div>\n </div>\n\n {/* sell token */}\n <div className=\"flex-none w-24\">\n {quoteSymbol ? (\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate\">{quoteSymbol}</div>\n <div className=\"text-neutral\">\n ({shortAddress(quoteAddress)})\n </div>\n </div>\n ) : (\n <div>{shortAddress(quoteAddress)}</div>\n )}\n </div>\n\n {/* cost amount */}\n <div className=\"flex-none w-18\">\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"text-neutral\">\n {t(\"channels.events.walletTrade.got\")}\n </div>\n <div className={\"text-bullish\"}>\n {formatAmount(new SafeBigNumber(event.data.base_amount).abs())}\n </div>\n </div>\n </div>\n\n {/* got token */}\n <div className=\"flex-none w-24\">\n {baseSymbol ? (\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate\">{baseSymbol}</div>\n <div className=\"text-neutral\">\n ({shortAddress(baseAddress)})\n </div>\n </div>\n ) : (\n <div>{shortAddress(baseAddress)}</div>\n )}\n </div>\n\n {/* price */}\n <div className=\"flex-none w-18\">\n <div className=\"flex flex-col justify-center gap-0.5\">\n <div className=\"truncate text-neutral\">\n {t(\"channels.events.walletTrade.price\")}\n </div>\n <div>{formatPriceUSD(event.data.quote_price_usd)}</div>\n </div>\n </div>\n </>\n )}\n\n {/* timestamp */}\n <div className=\"flex-none w-18 text-end\">{formatAge(age)}</div>\n </div>\n );\n}\n","import { useCallback, useMemo, useRef } from \"react\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChannelEvent, Token } from \"@liberfi.io/types\";\nimport {\n clsx,\n EmptyIcon,\n List,\n RowComponentProps,\n Skeleton,\n useInfiniteLoader,\n} from \"@liberfi.io/ui\";\nimport { ChannelEventRowProps } from \"../../types\";\nimport { WalletTradeEvent } from \"./wallet-trade\";\n\nexport type ChannelEventsUIProps = {\n data?: Array<ChannelEvent>;\n isLoading?: boolean;\n hasMore?: boolean;\n onFetchMore?: () => void;\n className?: string;\n walletAliases?: Record<string, string | undefined>;\n tokens?: Record<string, Token>;\n};\n\nexport function ChannelEventsUI({\n data = [],\n isLoading = false,\n hasMore = false,\n onFetchMore,\n className,\n walletAliases,\n tokens,\n}: ChannelEventsUIProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n const { height } = useResizeObserver<HTMLDivElement>({ ref });\n\n const isItemLoaded = useCallback(\n (index: number) => {\n return index < data.length;\n },\n [data],\n );\n\n const loadMoreItems = useCallback(async () => {\n onFetchMore?.();\n }, [onFetchMore]);\n\n const itemCount = useMemo(\n () => (hasMore ? data.length + 1 : data.length),\n [data, hasMore],\n );\n\n const onRowsLoaded = useInfiniteLoader({\n isRowLoaded: isItemLoaded,\n loadMoreRows: loadMoreItems,\n rowCount: itemCount,\n threshold: 3,\n });\n\n if (isLoading) {\n return <Skeletons />;\n }\n\n if (!data || data.length === 0) {\n return <Empty />;\n }\n\n return (\n <div\n className={clsx(\n \"w-full h-full bg-content1 border border-border rounded-lg py-2.5 overflow-x-auto\",\n className,\n )}\n >\n {/* min width is the sum of all columns' widths + 20px for padding */}\n <div className=\"w-full min-w-164 h-full\" ref={ref}>\n <List\n style={{ height }}\n onRowsRendered={onRowsLoaded}\n rowComponent={Row}\n rowCount={itemCount}\n rowHeight={60}\n rowProps={{ data, walletAliases, tokens }}\n />\n </div>\n </div>\n );\n}\n\nfunction Empty() {\n const { t } = useTranslation();\n\n return (\n <div className=\"w-full bg-content1 border border-border rounded-lg p-2.5\">\n <EmptyIcon\n width={28}\n height={28}\n className=\"text-neutral mx-auto mt-20\"\n />\n <p className=\"pt-2 text-sm text-neutral text-center mb-20\">\n {t(\"channels.events.empty\")}\n </p>\n </div>\n );\n}\n\nfunction Skeletons() {\n return (\n <div className=\"w-full bg-content1 border border-border rounded-lg p-2.5\">\n {Array.from({ length: 6 }).map((_, index) => (\n <div key={index} className=\"w-full h-10 flex items-center\">\n <Skeleton className=\"w-full h-6 rounded-md\" />\n </div>\n ))}\n </div>\n );\n}\n\ntype RowProps = RowComponentProps<{\n data?: Array<ChannelEvent>;\n walletAliases?: Record<string, string | undefined>;\n tokens?: Record<string, Token>;\n}>;\n\nfunction Row({ index, style, data, walletAliases, tokens }: RowProps) {\n const { t } = useTranslation();\n\n if (!data) {\n return <div className=\"px-2.5\" style={style}></div>;\n }\n\n const event = data[index];\n if (!event) {\n return (\n <div style={style} className=\"px-2.5 text-xs text-neutral text-center\">\n {t(\"common.loadingMore\")}\n </div>\n );\n }\n\n return (\n <div style={style} className=\"px-2.5 hover:bg-content2\">\n <RowContent event={event} walletAliases={walletAliases} tokens={tokens} />\n </div>\n );\n}\n\nfunction RowContent(props: ChannelEventRowProps) {\n switch (props.event.type) {\n case \"wallet\":\n return <WalletTradeEvent {...props} />;\n default:\n return <></>;\n }\n}\n","import { useMemo } from \"react\";\nimport { ChannelEvent } from \"@liberfi.io/types\";\nimport { uniqBy } from \"@liberfi.io/utils\";\nimport {\n useChannelEventsInfiniteQuery,\n useChannelEventsQuery,\n} from \"../../hooks\";\n\nexport type UseChannelEventsReturnType = Omit<\n ReturnType<typeof useChannelEventsInfiniteQuery>,\n \"data\"\n> & {\n data: Array<ChannelEvent>;\n};\n\nexport function useChannelEvents(\n channelId: string,\n): UseChannelEventsReturnType {\n // infinite query older events\n const { data: historyData, ...others } = useChannelEventsInfiniteQuery(\n channelId,\n {\n next_page: true,\n limit: 50,\n },\n );\n\n // fetch latest events periodically\n const { data: latestData } = useChannelEventsQuery(\n channelId,\n {\n next_page: false,\n limit: 50,\n },\n { refetchInterval: 10000 },\n );\n\n // merge history & latest events\n const data = useMemo(() => {\n const historyEvents =\n historyData?.pages?.flatMap((page) => page.data) ?? [];\n const newEvents = latestData?.data ?? [];\n\n const combinedEvents = uniqBy(\n [...newEvents, ...historyEvents],\n (event) => event.data.tx_hash + \":\" + event.data.type,\n );\n return combinedEvents.sort((a, b) => b.timestamp - a.timestamp);\n }, [historyData, latestData]);\n\n return {\n ...others,\n data,\n };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { fetchTokens, useDexClient } from \"@liberfi.io/client\";\nimport { Chain, ChannelEvent, Token } from \"@liberfi.io/types\";\nimport { COMMON_TOKEN_ADDRESSES } from \"@liberfi.io/utils\";\n\nexport function useChannelEventsTokens(events: Array<ChannelEvent>) {\n const { client } = useDexClient();\n\n const [tokens, setTokens] = useState<Record<string, Token>>({});\n\n const queriedAddresses = useRef<Set<string>>(new Set());\n\n useEffect(() => {\n const addresses = new Set<string>();\n events.forEach((event) => {\n if (\n !COMMON_TOKEN_ADDRESSES.includes(event.data.quote_address) &&\n !queriedAddresses.current.has(event.data.quote_address)\n ) {\n addresses.add(event.data.quote_address);\n queriedAddresses.current.add(event.data.quote_address);\n }\n if (\n !COMMON_TOKEN_ADDRESSES.includes(event.data.base_address) &&\n !queriedAddresses.current.has(event.data.base_address)\n ) {\n addresses.add(event.data.base_address);\n queriedAddresses.current.add(event.data.base_address);\n }\n });\n if (addresses.size > 0) {\n fetchTokens(client, {\n chain: Chain.SOLANA,\n addresses: Array.from(addresses),\n })\n .then((tokens) => {\n setTokens((prev) => {\n const next: Record<string, Token> = { ...prev };\n tokens.forEach((token) => {\n next[token.address] = token;\n });\n return next;\n });\n })\n .catch((error) => {\n console.error(error);\n });\n }\n }, [events, client]);\n\n return { tokens };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { EmptyIcon } from \"@liberfi.io/ui\";\n\nexport function ChannelDetailNotFound() {\n const { t } = useTranslation();\n return (\n <div className=\"w-full\">\n <EmptyIcon\n width={40}\n height={40}\n className=\"mt-10 text-neutral mx-auto\"\n />\n <p className=\"text-sm text-neutral text-center mt-2\">\n {t(\"channels.detail.notfound\")}\n </p>\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport function ChannelDetailSkeletons() {\n return (\n <div className=\"w-full space-y-6\">\n <Skeleton className=\"w-full h-35 rounded-md\" />\n <Skeleton className=\"w-full h-40 rounded-md\" />\n </div>\n );\n}\n","import { useChannelQuery } from \"../../hooks\";\n\nexport const useChannelDetail = (id: string) => {\n return useChannelQuery(id);\n};\n","import { useMemo } from \"react\";\nimport { ChannelSource } from \"@liberfi.io/types\";\nimport { keyBy, mapValues } from \"@liberfi.io/utils\";\nimport { useChannelSourcesQuery } from \"../../hooks\";\n\nexport type UseChannelWalletsReturnType = {\n wallets: Array<ChannelSource>;\n aliases: Record<string, string | undefined>;\n};\n\nexport function useChannelWallets(id: string): UseChannelWalletsReturnType {\n const { data } = useChannelSourcesQuery(id);\n\n const wallets = useMemo(() => {\n return data?.filter((source) => source.type === \"wallet\") ?? [];\n }, [data]);\n\n const aliases = useMemo(() => {\n return mapValues(\n keyBy(\n wallets.filter((it) => !!it.alias),\n \"value\",\n ),\n (it) => it.alias,\n );\n }, [wallets]);\n\n return {\n wallets,\n aliases,\n };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { ChannelEventsUI, useChannelEvents } from \"../events\";\nimport { useChannelEventsTokens } from \"../events/channel-events-tokens.script\";\nimport { ChannelDetailNotFound } from \"./channel-detail-notfound\";\nimport { ChannelDetailSkeletons } from \"./channel-detail-skeletons\";\nimport { useChannelDetail } from \"./channel-detail.script\";\nimport { ChannelDetailUI } from \"./channel-detail.ui\";\nimport { useChannelWallets } from \"./channel-wallets.script\";\n\nexport type ChannelDetailWidgetProps = {\n id: string;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function ChannelDetailWidget({\n id,\n customHeaderActions,\n customFooterActions,\n}: ChannelDetailWidgetProps) {\n const { t } = useTranslation();\n\n const { data: channel, isLoading } = useChannelDetail(id);\n\n const {\n data: events,\n isLoading: isLoadingEvents,\n hasNextPage: hasMoreEvents,\n fetchNextPage: fetchMoreEvents,\n } = useChannelEvents(id);\n\n const { aliases } = useChannelWallets(id);\n\n const { tokens } = useChannelEventsTokens(events);\n\n if (isLoading) {\n return <ChannelDetailSkeletons />;\n }\n\n if (!channel) {\n return <ChannelDetailNotFound />;\n }\n\n return (\n <div className=\"w-full h-full flex flex-col gap-6\">\n <ChannelDetailUI\n channel={channel}\n headerActions={customHeaderActions?.(channel)}\n footerActions={customFooterActions?.(channel)}\n className=\"flex-none\"\n />\n <div className=\"flex-auto min-h-0 flex flex-col gap-2.5\">\n <h2 className=\"text-sm font-semibold flex-none\">\n {t(\"channels.events.title\")}\n </h2>\n <ChannelEventsUI\n data={events}\n isLoading={isLoadingEvents}\n hasMore={hasMoreEvents}\n onFetchMore={fetchMoreEvents}\n className=\"flex-auto min-h-0\"\n walletAliases={aliases}\n tokens={tokens}\n />\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\n\nexport type TradeEvent = {\n id: string;\n walletAddress: string;\n walletAlias?: string;\n type: \"buy\" | \"sell\";\n amount: number;\n tokenSymbol: string;\n tokenAddress: string;\n price: number;\n cost: number;\n costSymbol: string;\n timestamp: string;\n marketCap: string;\n profitLoss?: number;\n};\n\nexport type UseActivityFeedScriptParams = {\n /** Initial trade events */\n initialEvents?: TradeEvent[];\n};\n\nexport type UseActivityFeedScriptResult = {\n /** Trade events */\n events: TradeEvent[];\n /** Filter by date */\n dateFilter: string | null;\n /** Set date filter */\n setDateFilter: (filter: string | null) => void;\n /** Filter by address */\n addressFilter: string | null;\n /** Set address filter */\n setAddressFilter: (filter: string | null) => void;\n /** Filter by event type */\n eventFilter: \"all\" | \"buy\" | \"sell\";\n /** Set event filter */\n setEventFilter: (filter: \"all\" | \"buy\" | \"sell\") => void;\n /** Token search query */\n tokenSearch: string;\n /** Set token search */\n setTokenSearch: (query: string) => void;\n};\n\n/**\n * Activity Feed Script Hook\n * Handles trade events list logic\n */\nexport function useActivityFeedScript({\n initialEvents = [],\n}: UseActivityFeedScriptParams = {}): UseActivityFeedScriptResult {\n const [events] = useState<TradeEvent[]>(initialEvents);\n const [dateFilter, setDateFilter] = useState<string | null>(null);\n const [addressFilter, setAddressFilter] = useState<string | null>(null);\n const [eventFilter, setEventFilter] = useState<\"all\" | \"buy\" | \"sell\">(\"all\");\n const [tokenSearch, setTokenSearch] = useState(\"\");\n\n return {\n events,\n dateFilter,\n setDateFilter,\n addressFilter,\n setAddressFilter,\n eventFilter,\n setEventFilter,\n tokenSearch,\n setTokenSearch,\n };\n}\n\n// Mock data for development\nexport const MOCK_TRADE_EVENTS: TradeEvent[] = [\n {\n id: \"1\",\n walletAddress: \"DNF...3BL\",\n type: \"buy\",\n amount: 3.4,\n tokenSymbol: \"BLAST\",\n tokenAddress: \"9iE...\",\n price: 0.0526,\n cost: 72,\n costSymbol: \"SOL\",\n timestamp: \"3 min. ago\",\n marketCap: \"$269.6k\",\n profitLoss: 0.5,\n },\n {\n id: \"2\",\n walletAddress: \"DNF...3BL\",\n type: \"sell\",\n amount: 2.3,\n tokenSymbol: \"BLAST\",\n tokenAddress: \"9iE...\",\n price: 0.0533,\n cost: 5.9,\n costSymbol: \"SOL\",\n timestamp: \"9 min. ago\",\n marketCap: \"$334.9k\",\n profitLoss: -0.5,\n },\n {\n id: \"3\",\n walletAddress: \"Cooker 5b7\",\n type: \"sell\",\n amount: 2.3,\n tokenSymbol: \"DOWZA\",\n tokenAddress: \"GGC\",\n price: 0.053,\n cost: 5.9,\n costSymbol: \"SOL\",\n timestamp: \"21 min. ago\",\n marketCap: \"$304.7k\",\n profitLoss: 0.5,\n },\n {\n id: \"4\",\n walletAddress: \"DNF...3BL\",\n type: \"buy\",\n amount: 12.1,\n tokenSymbol: \"BLAST\",\n tokenAddress: \"\",\n price: 0.0515,\n cost: 72,\n costSymbol: \"SOL\",\n timestamp: \"23 min. ago\",\n marketCap: \"$158.7k\",\n profitLoss: 0.5,\n },\n {\n id: \"5\",\n walletAddress: \"Alpha i57\",\n type: \"sell\",\n amount: 6.8,\n tokenSymbol: \"REFISH\",\n tokenAddress: \"J1n\",\n price: 0.0526,\n cost: 5.9,\n costSymbol: \"SOL\",\n timestamp: \"1 hr. ago\",\n marketCap: \"$262.2k\",\n profitLoss: 0.5,\n },\n {\n id: \"6\",\n walletAddress: \"ChenPepe 8xy\",\n type: \"sell\",\n amount: 5.4,\n tokenSymbol: \"HEY\",\n tokenAddress: \"H5Z\",\n price: 0.0518,\n cost: 5.9,\n costSymbol: \"SOL\",\n timestamp: \"2 hr. ago\",\n marketCap: \"$183.3k\",\n profitLoss: 0.5,\n },\n {\n id: \"7\",\n walletAddress: \"聪聪钱包002 ans\",\n type: \"sell\",\n amount: 2.8,\n tokenSymbol: \"SuperCycle\",\n tokenAddress: \"i0i\",\n price: 0.0535,\n cost: 5.9,\n costSymbol: \"SOL\",\n timestamp: \"3 hr. ago\",\n marketCap: \"$351.3k\",\n profitLoss: 0.5,\n },\n];\n","import { Button, clsx, LightningIcon, SolanaIcon } from \"@liberfi.io/ui\";\nimport type { TradeEvent } from \"./activity-feed.script\";\n\nexport type ActivityFeedUIProps = {\n /** Trade events */\n events: TradeEvent[];\n /** Date filter */\n dateFilter: string | null;\n /** Address filter */\n addressFilter: string | null;\n /** Event filter */\n eventFilter: \"all\" | \"buy\" | \"sell\";\n /** Token search query */\n tokenSearch: string;\n /** Set date filter */\n onDateFilterChange: (filter: string | null) => void;\n /** Set address filter */\n onAddressFilterChange: (filter: string | null) => void;\n /** Set event filter */\n onEventFilterChange: (filter: \"all\" | \"buy\" | \"sell\") => void;\n /** Set token search */\n onTokenSearchChange: (query: string) => void;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Activity Feed UI Component\n * Displays trade events list with filters\n */\nexport function ActivityFeedUI({\n events,\n tokenSearch,\n onTokenSearchChange,\n className,\n}: ActivityFeedUIProps) {\n return (\n <div className={clsx(\"flex flex-col gap-4\", className)}>\n {/* Filters Row */}\n <div className=\"flex items-center gap-3\">\n <Button\n size=\"sm\"\n variant=\"flat\"\n radius=\"lg\"\n className=\"bg-content2 text-xs text-default-500\"\n startContent={\n <svg\n className=\"w-3.5 h-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n }\n endContent={\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n }\n >\n Date\n </Button>\n <Button\n size=\"sm\"\n variant=\"flat\"\n radius=\"lg\"\n className=\"bg-content2 text-xs text-default-500\"\n startContent={\n <svg\n className=\"w-3.5 h-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n }\n endContent={\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n }\n >\n Address\n </Button>\n <Button\n size=\"sm\"\n variant=\"flat\"\n radius=\"lg\"\n className=\"bg-content2 text-xs text-default-500\"\n startContent={\n <svg\n className=\"w-3.5 h-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 12l3-3 3 3 4-4M8 21l4-4 4 4M3 4h18M4 4h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V4z\"\n />\n </svg>\n }\n endContent={\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n }\n >\n Event\n </Button>\n\n {/* Token Search */}\n <div className=\"flex-1 relative\">\n <input\n type=\"text\"\n placeholder=\"Token symbol or address...\"\n value={tokenSearch}\n onChange={(e) => onTokenSearchChange(e.target.value)}\n className=\"w-full pl-3 pr-3 py-1.5 text-xs rounded-lg bg-default-100 border border-transparent focus:border-primary focus:outline-none text-foreground placeholder:text-default-400\"\n />\n </div>\n\n {/* Quick Actions */}\n <div className=\"flex items-center gap-2 px-3 py-1 border border-divider rounded-3xl bg-content2\">\n <LightningIcon className=\"w-4 h-4 text-[#c7ff2e]\" />\n <span className=\"text-xs text-foreground\">0.002</span>\n <SolanaIcon className=\"w-4 h-4\" />\n <div className=\"flex gap-1\">\n <button className=\"min-w-[32px] h-6 px-2 text-[10px] text-foreground hover:bg-default-100 rounded transition-colors\">\n P1\n </button>\n <button className=\"min-w-[32px] h-6 px-2 text-[10px] bg-[#c7ff2e] text-black rounded\">\n P2\n </button>\n <button className=\"min-w-[32px] h-6 px-2 text-[10px] text-foreground hover:bg-default-100 rounded transition-colors\">\n P3\n </button>\n </div>\n </div>\n </div>\n\n {/* Events List */}\n <div className=\"space-y-1 overflow-x-auto\">\n {events.map((event) => (\n <div\n key={event.id}\n className=\"flex items-center gap-3 px-3 py-2.5 rounded-lg hover:bg-content2/30 transition-colors text-xs w-full\"\n >\n {/* Wallet */}\n <div className=\"flex-none w-16\">\n <span className=\"text-[11px] font-medium truncate block\">\n <span className=\"text-[#c7ff2e]\">\n {(event.walletAlias || event.walletAddress).split(\"...\")[0]}\n </span>\n {(event.walletAlias || event.walletAddress).includes(\"...\") && (\n <>\n <span className=\"text-[#c7ff2e]\">...</span>\n <span className=\"text-default-500\">\n {\n (event.walletAlias || event.walletAddress).split(\n \"...\",\n )[1]\n }\n </span>\n </>\n )}\n {!(event.walletAlias || event.walletAddress).includes(\n \"...\",\n ) && (\n <span className=\"text-[#c7ff2e]\">\n {event.walletAlias || event.walletAddress}\n </span>\n )}\n </span>\n </div>\n\n {/* Type Badge */}\n <div className=\"flex-none w-11\">\n <span\n className={clsx(\n \"inline-block px-2 py-0.5 rounded text-[10px] font-medium\",\n event.type === \"buy\"\n ? \"bg-[#c7ff2e]/20 text-[#c7ff2e]\"\n : \"bg-[#f76816]/20 text-[#f76816]\",\n )}\n >\n {event.type === \"buy\" ? \"Buy\" : \"Sell\"}\n </span>\n </div>\n\n {/* Amount */}\n <div className=\"flex-none w-12 text-right\">\n <span className=\"text-foreground font-medium text-[11px]\">\n {event.amount.toFixed(1)}K\n </span>\n </div>\n\n {/* Token with icon - BLAST and 9iE on same line */}\n <div className=\"flex-none w-28\">\n <div className=\"flex items-center gap-1\">\n <div className=\"w-4 h-4 rounded-md bg-default-200 flex-shrink-0\">\n {/* Empty icon */}\n </div>\n <div className=\"flex items-center gap-1 min-w-0\">\n <span\n className={clsx(\n \"font-medium text-[11px] truncate\",\n event.type === \"buy\"\n ? \"text-[#c7ff2e]\"\n : \"text-[#f76816]\",\n )}\n >\n {event.tokenSymbol}\n </span>\n {event.tokenAddress && (\n <span className=\"text-[9px] text-default-500 truncate\">\n {event.tokenAddress}\n </span>\n )}\n </div>\n </div>\n </div>\n\n {/* Market Cap - MC and value on same line */}\n <div className=\"flex-none w-20\">\n <span className=\"text-[10px] text-default-500\">\n MC{\" \"}\n <span className=\"text-foreground text-[11px]\">\n {event.marketCap}\n </span>\n </span>\n </div>\n\n {/* Price - P and value on same line */}\n <div className=\"flex-none w-20\">\n <span className=\"text-[10px] text-default-500\">\n P{\" \"}\n <span className=\"text-foreground text-[11px]\">\n ${event.price.toFixed(4)}\n </span>\n </span>\n </div>\n\n {/* Cost - with/for and SOL with dollar value on same line */}\n <div className=\"flex-1 min-w-[144px]\">\n <span className=\"text-[10px] text-default-500\">\n {event.type === \"buy\" ? \"with\" : \"for\"}{\" \"}\n <span className=\"text-white text-[11px] font-medium\">\n {event.cost}{\" \"}\n </span>\n <span\n className={clsx(\n \"text-[11px] font-medium\",\n event.type === \"buy\" ? \"text-[#c7ff2e]\" : \"text-[#f76816]\",\n )}\n >\n {event.costSymbol}\n </span>{\" \"}\n ($\n {(event.cost * event.price * event.amount * 1000).toFixed(1)})\n </span>\n </div>\n\n {/* Time */}\n <div className=\"flex-none w-24 text-right text-default-500 text-[11px]\">\n <span className=\"truncate block\">{event.timestamp}</span>\n </div>\n\n {/* Right side button - oval shape with lightning icon */}\n <div className=\"flex-none w-20\">\n <button className=\"h-6 px-3 rounded-full bg-[#c7ff2e] text-black font-medium text-[10px] flex items-center gap-1 hover:opacity-90 transition-opacity whitespace-nowrap\">\n <LightningIcon className=\"w-3 h-3\" />0 SOL\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import {\n MOCK_TRADE_EVENTS,\n useActivityFeedScript,\n type UseActivityFeedScriptParams,\n} from \"./activity-feed.script\";\nimport { ActivityFeedUI } from \"./activity-feed.ui\";\n\nexport type ActivityFeedWidgetProps = UseActivityFeedScriptParams & {\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Activity Feed Widget\n * Combines UI and business logic for activity feed\n */\nexport function ActivityFeedWidget({\n initialEvents = MOCK_TRADE_EVENTS,\n className,\n}: ActivityFeedWidgetProps) {\n const {\n events,\n dateFilter,\n setDateFilter,\n addressFilter,\n setAddressFilter,\n eventFilter,\n setEventFilter,\n tokenSearch,\n setTokenSearch,\n } = useActivityFeedScript({\n initialEvents,\n });\n\n return (\n <ActivityFeedUI\n events={events}\n dateFilter={dateFilter}\n onDateFilterChange={setDateFilter}\n addressFilter={addressFilter}\n onAddressFilterChange={setAddressFilter}\n eventFilter={eventFilter}\n onEventFilterChange={setEventFilter}\n tokenSearch={tokenSearch}\n onTokenSearchChange={setTokenSearch}\n className={className}\n />\n );\n}\n","import { useState, useCallback } from \"react\";\n\nexport type TabType = \"tokens\" | \"traders\";\n\nexport function useTabSwitch(initialTab: TabType = \"traders\") {\n const [activeTab, setActiveTab] = useState<TabType>(initialTab);\n\n const switchTab = useCallback((tab: TabType) => {\n setActiveTab(tab);\n }, []);\n\n return {\n activeTab,\n switchTab,\n };\n}\n","import { useState, useMemo, useCallback } from \"react\";\n\nexport type Token = {\n id: string;\n name: string;\n symbol: string;\n avatar: string;\n createdTime: string;\n timeLabel: string; // \"1mo\", \"2mo\", etc.\n price: number;\n liquidity: number;\n volume: number;\n buyVolume: number;\n sellVolume: number;\n buyCount: number;\n sellCount: number;\n marketCap: string;\n pnlPercentage: number;\n solAmount: number;\n};\n\nexport const MOCK_TOKENS: Token[] = [\n {\n id: \"1\",\n name: \"Quakerjak\",\n symbol: \"QJAK\",\n avatar: \"\",\n createdTime: \"3J9r\",\n timeLabel: \"1mo\",\n price: 0.00529,\n liquidity: 2960,\n volume: 8950,\n buyVolume: 14200,\n sellVolume: 19000,\n buyCount: 4,\n sellCount: 4,\n marketCap: \"$39M MC\",\n pnlPercentage: 23.1,\n solAmount: 0,\n },\n {\n id: \"2\",\n name: \"WOJAK\",\n symbol: \"WOJAK\",\n avatar: \"\",\n createdTime: \"3J9r\",\n timeLabel: \"2mo\",\n price: 0.00529,\n liquidity: 2960,\n volume: 8950,\n buyVolume: 14200,\n sellVolume: 19000,\n buyCount: 4,\n sellCount: 4,\n marketCap: \"$39M MC\",\n pnlPercentage: -15.7,\n solAmount: 0,\n },\n {\n id: \"3\",\n name: \"Quakerjak\",\n symbol: \"QJAK\",\n avatar: \"\",\n createdTime: \"3J9r\",\n timeLabel: \"1mo\",\n price: 0.00529,\n liquidity: 2960,\n volume: 8950,\n buyVolume: 14200,\n sellVolume: 0,\n buyCount: 4,\n sellCount: 0,\n marketCap: \"$39M MC\",\n pnlPercentage: 23.1,\n solAmount: 0,\n },\n {\n id: \"4\",\n name: \"Quakerjak\",\n symbol: \"QJAK\",\n avatar: \"\",\n createdTime: \"3J9r\",\n timeLabel: \"1mo\",\n price: 0.00529,\n liquidity: 2960,\n volume: 8950,\n buyVolume: 14200,\n sellVolume: 19000,\n buyCount: 4,\n sellCount: 4,\n marketCap: \"$39M MC\",\n pnlPercentage: 23.1,\n solAmount: 0,\n },\n {\n id: \"5\",\n name: \"Quakerjak\",\n symbol: \"QJAK\",\n avatar: \"\",\n createdTime: \"3J9r\",\n timeLabel: \"1mo\",\n price: 0.00529,\n liquidity: 2960,\n volume: 8950,\n buyVolume: 14200,\n sellVolume: 19000,\n buyCount: 4,\n sellCount: 4,\n marketCap: \"$39M MC\",\n pnlPercentage: 23.1,\n solAmount: 0,\n },\n {\n id: \"6\",\n name: \"Quakerjak\",\n symbol: \"QJAK\",\n avatar: \"\",\n createdTime: \"3J9r\",\n timeLabel: \"1mo\",\n price: 0.00529,\n liquidity: 2960,\n volume: 8950,\n buyVolume: 14200,\n sellVolume: 19000,\n buyCount: 4,\n sellCount: 4,\n marketCap: \"$39M MC\",\n pnlPercentage: 23.1,\n solAmount: 0,\n },\n];\n\nexport function useTokensList(initialTokens: Token[] = MOCK_TOKENS) {\n const [tokens] = useState<Token[]>(initialTokens);\n\n return {\n tokens,\n };\n}\n","import { Button, clsx, LightningIcon, SolanaIcon } from \"@liberfi.io/ui\";\nimport type { Token } from \"./tokens-list.script\";\n\nexport type TokensListUIProps = {\n /** List of tokens */\n tokens: Token[];\n /** Custom class name */\n className?: string;\n};\n\nfunction formatNumber(value: number): string {\n if (value >= 1000) {\n return `$${(value / 1000).toFixed(1)}k`;\n }\n return `$${value}`;\n}\n\n/**\n * Tokens List UI Component\n * Displays tokens list with trading information\n */\nexport function TokensListUI({ tokens, className }: TokensListUIProps) {\n return (\n <div className={clsx(\"flex flex-col gap-4\", className)}>\n {/* Filters Row */}\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"sm\"\n variant=\"flat\"\n radius=\"full\"\n className=\"bg-content2 text-[11px] text-foreground h-7 px-2.5 min-w-0\"\n startContent={\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12\"\n />\n </svg>\n }\n >\n Trending\n </Button>\n <Button\n size=\"sm\"\n variant=\"flat\"\n radius=\"full\"\n className=\"bg-content2 text-[11px] text-foreground h-7 px-2.5 min-w-0\"\n endContent={\n <svg\n className=\"w-2.5 h-2.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n }\n >\n All Chains\n </Button>\n <Button\n size=\"sm\"\n variant=\"flat\"\n radius=\"full\"\n className=\"bg-content2 text-[11px] text-foreground h-7 px-2.5 min-w-0\"\n endContent={\n <svg\n className=\"w-2.5 h-2.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n }\n >\n 24h\n </Button>\n </div>\n\n {/* Quick Actions - same as Activity Feed */}\n <div className=\"flex items-center gap-2 px-2.5 py-0.5 border border-divider rounded-3xl bg-content2\">\n <LightningIcon className=\"w-3.5 h-3.5 text-[#c7ff2e]\" />\n <span className=\"text-[11px] text-foreground\">0.002</span>\n <SolanaIcon className=\"w-3.5 h-3.5\" />\n <div className=\"flex gap-0.5\">\n <button className=\"min-w-[28px] h-5 px-1.5 text-[9px] text-foreground hover:bg-default-100 rounded transition-colors\">\n P1\n </button>\n <button className=\"min-w-[28px] h-5 px-1.5 text-[9px] bg-[#c7ff2e] text-black rounded\">\n P2\n </button>\n <button className=\"min-w-[28px] h-5 px-1.5 text-[9px] text-foreground hover:bg-default-100 rounded transition-colors\">\n P3\n </button>\n </div>\n </div>\n </div>\n\n {/* Tokens List */}\n <div className=\"space-y-1 overflow-x-auto\">\n {tokens.map((token) => (\n <div\n key={token.id}\n className=\"flex items-center gap-3 px-3 py-2.5 rounded-lg hover:bg-content2/30 transition-colors w-full\"\n >\n {/* Token Avatar and Info */}\n <div className=\"flex-1 min-w-[200px]\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-8 h-8 rounded-lg bg-default-200 flex-shrink-0\" />\n <div className=\"flex flex-col min-w-0 flex-1\">\n {/* Name, Time, Address on first line */}\n <div className=\"flex items-center gap-1.5 overflow-hidden\">\n <span className=\"text-xs font-bold text-foreground truncate\">\n {token.name}\n </span>\n <span className=\"px-1.5 py-0.5 rounded text-[9px] font-medium bg-success/20 text-[#c7ff2e] flex-shrink-0\">\n {token.timeLabel}\n </span>\n <span className=\"text-[10px] text-default-500 truncate\">\n {token.createdTime}\n </span>\n </div>\n {/* P, L, V on same line with colons */}\n <div className=\"flex items-center gap-2 text-[10px] overflow-hidden\">\n <span className=\"text-default-500 flex-shrink-0\">\n P:\n <span className=\"text-foreground ml-0.5\">\n ${token.price.toFixed(5)}\n </span>\n </span>\n <span className=\"text-default-500 flex-shrink-0\">\n L:\n <span className=\"text-white ml-0.5\">\n {formatNumber(token.liquidity)}\n </span>\n </span>\n <span className=\"text-default-500 flex-shrink-0\">\n V:\n <span className=\"text-white ml-0.5\">\n ${token.volume.toFixed(2)}\n </span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Buy/Sell Volumes */}\n <div className=\"flex-none w-20 flex-shrink-0\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-xs font-medium text-foreground\">\n <span className=\"text-[#c7ff2e]\">\n {formatNumber(token.buyVolume)}\n </span>\n {\" / \"}\n <span className=\"text-[#f76816]\">\n {token.sellVolume > 0\n ? formatNumber(token.sellVolume)\n : \"$0\"}\n </span>\n </span>\n <span className=\"text-[10px]\">\n <span className=\"text-[#c7ff2e]\">{token.buyCount}</span>\n <span className=\"mx-0.5 text-default-500\">/</span>\n <span className=\"text-[#f76816]\">{token.sellCount}</span>\n </span>\n </div>\n </div>\n\n {/* Market Cap and Percentage */}\n <div className=\"flex-none w-20 flex-shrink-0\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-xs font-medium text-foreground\">\n {token.marketCap}\n </span>\n <span\n className={clsx(\n \"inline-flex items-center gap-0.5 text-[10px] font-medium\",\n token.pnlPercentage >= 0\n ? \"text-[#c7ff2e]\"\n : \"text-[#f76816]\",\n )}\n >\n <span>{token.pnlPercentage >= 0 ? \"↗\" : \"↘\"}</span>\n {Math.abs(token.pnlPercentage).toFixed(1)}%\n </span>\n </div>\n </div>\n\n {/* Right side button - oval shape */}\n <div className=\"flex-none flex-shrink-0\">\n <button className=\"h-6 px-3 rounded-full bg-[#c7ff2e] text-black font-medium text-[10px] flex items-center gap-1 hover:opacity-90 transition-opacity whitespace-nowrap\">\n <LightningIcon className=\"w-3 h-3\" />\n {token.solAmount} SOL\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useTokensList } from \"./tokens-list.script\";\nimport type { Token } from \"./tokens-list.script\";\nimport { TokensListUI } from \"./tokens-list.ui\";\n\nexport type TokensListWidgetProps = {\n /** Optional custom tokens data */\n tokens?: Token[];\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Tokens List Widget\n * Combines business logic and UI for tokens list\n */\nexport function TokensListWidget({\n tokens: customTokens,\n className,\n}: TokensListWidgetProps) {\n const { tokens } = useTokensList(customTokens);\n\n return <TokensListUI tokens={tokens} className={className} />;\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport type TimeFilter = \"4H\" | \"1D\" | \"1W\" | \"1M\";\nexport type SortField = \"listeners\" | \"txns\" | \"volume\" | \"pnl\";\nexport type SortDirection = \"asc\" | \"desc\";\n\nexport type Trader = {\n id: string;\n name: string;\n listeners: number;\n isListening: boolean;\n buyCount: number;\n sellCount: number;\n volume: number;\n buyVolume: number;\n sellVolume: number;\n pnlAmount: number;\n pnlPercentage: number;\n};\n\nexport type UseTradersTableScriptParams = {\n /** Initial traders data */\n initialTraders?: Trader[];\n /** Initial time filter */\n initialTimeFilter?: TimeFilter;\n};\n\nexport type UseTradersTableScriptResult = {\n /** Current time filter */\n timeFilter: TimeFilter;\n /** Set time filter */\n setTimeFilter: (filter: TimeFilter) => void;\n /** Current sort field */\n sortField: SortField | null;\n /** Current sort direction */\n sortDirection: SortDirection;\n /** Handle sort */\n handleSort: (field: SortField) => void;\n /** Sorted traders */\n sortedTraders: Trader[];\n /** Toggle listen to a trader */\n toggleListen: (traderId: string) => void;\n};\n\n/**\n * Traders Table Script Hook\n * Handles traders list sorting and filtering logic\n */\nexport function useTradersTableScript({\n initialTraders = [],\n initialTimeFilter = \"1W\",\n}: UseTradersTableScriptParams = {}): UseTradersTableScriptResult {\n const [timeFilter, setTimeFilter] = useState<TimeFilter>(initialTimeFilter);\n const [sortField, setSortField] = useState<SortField | null>(\"listeners\");\n const [sortDirection, setSortDirection] = useState<SortDirection>(\"desc\");\n const [traders, setTraders] = useState<Trader[]>(initialTraders);\n\n const handleSort = useCallback((field: SortField) => {\n setSortField((prev) => {\n if (prev === field) {\n setSortDirection((dir) => (dir === \"asc\" ? \"desc\" : \"asc\"));\n return field;\n } else {\n setSortDirection(\"desc\");\n return field;\n }\n });\n }, []);\n\n const sortedTraders = useMemo(() => {\n if (!sortField) return traders;\n\n return [...traders].sort((a, b) => {\n let aValue = 0;\n let bValue = 0;\n\n switch (sortField) {\n case \"listeners\":\n aValue = a.listeners;\n bValue = b.listeners;\n break;\n case \"txns\":\n aValue = a.buyCount + a.sellCount;\n bValue = b.buyCount + b.sellCount;\n break;\n case \"volume\":\n aValue = a.volume;\n bValue = b.volume;\n break;\n case \"pnl\":\n aValue = a.pnlAmount;\n bValue = b.pnlAmount;\n break;\n }\n\n return sortDirection === \"asc\" ? aValue - bValue : bValue - aValue;\n });\n }, [traders, sortField, sortDirection]);\n\n const toggleListen = useCallback((traderId: string) => {\n setTraders((prev) =>\n prev.map((trader) =>\n trader.id === traderId\n ? { ...trader, isListening: !trader.isListening }\n : trader,\n ),\n );\n }, []);\n\n return {\n timeFilter,\n setTimeFilter,\n sortField,\n sortDirection,\n handleSort,\n sortedTraders,\n toggleListen,\n };\n}\n\n// Mock data for development\nexport const MOCK_TRADERS: Trader[] = [\n {\n id: \"1\",\n name: \"Quakerjak\",\n listeners: 3,\n isListening: true,\n buyCount: 4,\n sellCount: 4,\n volume: 33200,\n buyVolume: 14200,\n sellVolume: 19000,\n pnlAmount: 11900,\n pnlPercentage: 23.1,\n },\n {\n id: \"2\",\n name: \"Quakerjak\",\n listeners: 3,\n isListening: false,\n buyCount: 4,\n sellCount: 4,\n volume: 33200,\n buyVolume: 14200,\n sellVolume: 19000,\n pnlAmount: 11900,\n pnlPercentage: 23.1,\n },\n {\n id: \"3\",\n name: \"Quakerjak\",\n listeners: 3,\n isListening: false,\n buyCount: 4,\n sellCount: 4,\n volume: 33200,\n buyVolume: 14200,\n sellVolume: 19000,\n pnlAmount: 11900,\n pnlPercentage: 15.7,\n },\n {\n id: \"4\",\n name: \"Quakerjak\",\n listeners: 3,\n isListening: false,\n buyCount: 4,\n sellCount: 4,\n volume: 33200,\n buyVolume: 14200,\n sellVolume: 19000,\n pnlAmount: 11900,\n pnlPercentage: 23.1,\n },\n {\n id: \"5\",\n name: \"Quakerjak\",\n listeners: 3,\n isListening: false,\n buyCount: 4,\n sellCount: 4,\n volume: 33200,\n buyVolume: 14200,\n sellVolume: 19000,\n pnlAmount: 11900,\n pnlPercentage: 23.1,\n },\n {\n id: \"6\",\n name: \"Quakerjak\",\n listeners: 3,\n isListening: false,\n buyCount: 4,\n sellCount: 4,\n volume: 33200,\n buyVolume: 14200,\n sellVolume: 19000,\n pnlAmount: 11900,\n pnlPercentage: 23.1,\n },\n];\n","import { Button, clsx } from \"@liberfi.io/ui\";\nimport type {\n Trader,\n TimeFilter,\n SortField,\n SortDirection,\n} from \"./traders-table.script\";\n\nexport type TradersTableUIProps = {\n /** List of traders */\n traders: Trader[];\n /** Current time filter */\n timeFilter: TimeFilter;\n /** Time filter change handler */\n onTimeFilterChange: (filter: TimeFilter) => void;\n /** Current sort field */\n sortField: SortField | null;\n /** Current sort direction */\n sortDirection: SortDirection;\n /** Sort handler */\n onSort: (field: SortField) => void;\n /** Toggle listen handler */\n onToggleListen: (traderId: string) => void;\n /** Custom class name */\n className?: string;\n};\n\nconst timeFilters: TimeFilter[] = [\"4H\", \"1D\", \"1W\", \"1M\"];\n\nfunction formatVolume(value: number): string {\n if (value >= 1000) {\n return `$${(value / 1000).toFixed(1)}K`;\n }\n return `$${value}`;\n}\n\nfunction formatPnl(value: number): string {\n if (value >= 1000) {\n return `$${(value / 1000).toFixed(1)}K`;\n }\n return `$${value}`;\n}\n\n/**\n * Traders Table UI Component\n * Displays traders list with sorting and filtering\n */\nexport function TradersTableUI({\n traders,\n timeFilter,\n onTimeFilterChange,\n sortField,\n sortDirection,\n onSort,\n onToggleListen,\n className,\n}: TradersTableUIProps) {\n const SortIcon = ({ field }: { field: SortField }) => {\n if (sortField !== field) {\n return (\n <svg\n className=\"w-3 h-3 text-default-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\"\n />\n </svg>\n );\n }\n return sortDirection === \"asc\" ? (\n <svg\n className=\"w-3 h-3 text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n ) : (\n <svg\n className=\"w-3 h-3 text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n );\n };\n\n return (\n <div className={clsx(\"flex flex-col gap-3\", className)}>\n {/* Time Filter Buttons */}\n <div className=\"flex gap-1.5\">\n {timeFilters.map((filter) => (\n <Button\n key={filter}\n size=\"sm\"\n variant=\"flat\"\n radius=\"lg\"\n onPress={() => onTimeFilterChange(filter)}\n className={clsx(\n \"min-w-[44px] h-8 px-3 text-xs font-medium\",\n timeFilter === filter\n ? \"bg-[#c7ff2e] text-black\"\n : \"bg-content2 text-default-500 hover:text-foreground\",\n )}\n >\n {filter}\n </Button>\n ))}\n </div>\n\n {/* Table */}\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-divider\">\n <th\n className=\"text-left py-3 px-3 font-medium text-default-500 text-[10px] uppercase cursor-pointer hover:text-foreground transition-colors\"\n onClick={() => onSort(\"listeners\")}\n >\n <div className=\"flex items-center gap-1\">\n <span>Listeners</span>\n <SortIcon field=\"listeners\" />\n </div>\n </th>\n <th\n className=\"text-left py-3 px-3 font-medium text-default-500 text-[10px] uppercase cursor-pointer hover:text-foreground transition-colors\"\n onClick={() => onSort(\"txns\")}\n >\n <div className=\"flex items-center gap-1\">\n <span>TXNS</span>\n <SortIcon field=\"txns\" />\n </div>\n </th>\n <th\n className=\"text-left py-3 px-3 font-medium text-default-500 text-[10px] uppercase cursor-pointer hover:text-foreground transition-colors\"\n onClick={() => onSort(\"volume\")}\n >\n <div className=\"flex items-center gap-1\">\n <span>Volume</span>\n <SortIcon field=\"volume\" />\n </div>\n </th>\n <th\n className=\"text-left py-3 px-3 font-medium text-default-500 text-[10px] uppercase cursor-pointer hover:text-foreground transition-colors\"\n onClick={() => onSort(\"pnl\")}\n >\n <div className=\"flex items-center gap-1\">\n <span>P&L/%</span>\n <SortIcon field=\"pnl\" />\n </div>\n </th>\n </tr>\n </thead>\n <tbody>\n {traders.map((trader) => (\n <tr\n key={trader.id}\n className=\"border-b border-divider hover:bg-default-50/50 transition-colors\"\n >\n <td className=\"py-3 px-3\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <div className=\"w-6 h-6 rounded-full bg-[#c7ff2e]/20 flex items-center justify-center flex-shrink-0\">\n <span className=\"text-[11px] font-semibold text-[#c7ff2e]\">\n ≡\n </span>\n </div>\n <div className=\"flex flex-col min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-foreground truncate\">\n {trader.name}\n </span>\n <span className=\"text-[10px] text-default-500 flex-shrink-0\">\n 3J9\n </span>\n <button className=\"text-default-400 hover:text-foreground flex-shrink-0\">\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n </button>\n </div>\n <button\n onClick={() => onToggleListen(trader.id)}\n className={clsx(\n \"flex items-center gap-1 text-[10px] transition-colors text-left\",\n trader.isListening\n ? \"text-[#c7ff2e]\"\n : \"text-default-500 hover:text-foreground\",\n )}\n >\n {trader.isListening ? (\n <>\n <svg\n className=\"w-2.5 h-2.5\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span>listened</span>\n </>\n ) : (\n <>\n <svg\n className=\"w-2.5 h-2.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\"\n />\n </svg>\n <span>{trader.listeners} listened</span>\n </>\n )}\n </button>\n </div>\n </div>\n </td>\n <td className=\"py-3 px-3\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-xs font-medium text-foreground\">\n {trader.buyCount + trader.sellCount}\n </span>\n <span className=\"text-[10px]\">\n <span className=\"text-[#c7ff2e]\">{trader.buyCount}</span>\n <span className=\"mx-0.5 text-default-500\">/</span>\n <span className=\"text-[#f76816]\">{trader.sellCount}</span>\n </span>\n </div>\n </td>\n <td className=\"py-3 px-3\">\n <div className=\"flex flex-col gap-0.5 min-w-[120px]\">\n <span className=\"text-xs font-medium text-foreground whitespace-nowrap\">\n {formatVolume(trader.volume)}\n </span>\n <span className=\"text-[10px] whitespace-nowrap\">\n <span className=\"text-[#c7ff2e]\">\n {formatVolume(trader.buyVolume)}\n </span>\n <span className=\"mx-0.5 text-default-500\">/</span>\n <span className=\"text-[#f76816]\">\n {formatVolume(trader.sellVolume)}\n </span>\n </span>\n </div>\n </td>\n <td className=\"py-3 px-3\">\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n <span className=\"text-xs font-medium text-foreground truncate\">\n {formatPnl(trader.pnlAmount)}\n </span>\n <span\n className={clsx(\n \"text-[10px] flex items-center gap-0.5 truncate\",\n trader.pnlPercentage >= 0\n ? \"text-[#c7ff2e]\"\n : \"text-[#f76816]\",\n )}\n >\n <span>{trader.pnlPercentage >= 0 ? \"↗\" : \"↘\"}</span>\n {Math.abs(trader.pnlPercentage).toFixed(2)}%\n </span>\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n","import {\n MOCK_TRADERS,\n useTradersTableScript,\n type UseTradersTableScriptParams,\n} from \"./traders-table.script\";\nimport { TradersTableUI } from \"./traders-table.ui\";\n\nexport type TradersTableWidgetProps = UseTradersTableScriptParams & {\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Traders Table Widget\n * Combines UI and business logic for traders table\n */\nexport function TradersTableWidget({\n initialTraders = MOCK_TRADERS,\n initialTimeFilter = \"1W\",\n className,\n}: TradersTableWidgetProps) {\n const {\n timeFilter,\n setTimeFilter,\n sortField,\n sortDirection,\n handleSort,\n sortedTraders,\n toggleListen,\n } = useTradersTableScript({\n initialTraders,\n initialTimeFilter,\n });\n\n return (\n <TradersTableUI\n traders={sortedTraders}\n timeFilter={timeFilter}\n onTimeFilterChange={setTimeFilter}\n sortField={sortField}\n sortDirection={sortDirection}\n onSort={handleSort}\n onToggleListen={toggleListen}\n className={className}\n />\n );\n}\n","import { Button, clsx } from \"@liberfi.io/ui\";\nimport type { TabType } from \"./tab-container.script\";\nimport { TokensListWidget } from \"./tokens-list.widget\";\nimport { TradersTableWidget } from \"./traders-table.widget\";\n\nexport type TabContainerUIProps = {\n /** Active tab */\n activeTab: TabType;\n /** Tab switch handler */\n onTabSwitch: (tab: TabType) => void;\n /** Tokens count */\n tokensCount?: number;\n /** Traders count */\n tradersCount?: number;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Tab Container UI Component\n * Displays tabs for switching between Tokens and Traders\n */\nexport function TabContainerUI({\n activeTab,\n onTabSwitch,\n tokensCount = 999,\n tradersCount = 146,\n className,\n}: TabContainerUIProps) {\n return (\n <div className={clsx(\"flex flex-col gap-4\", className)}>\n {/* Tab Header */}\n <div className=\"flex items-center justify-between\">\n {/* Tabs */}\n <div className=\"flex items-center gap-4\">\n <button\n onClick={() => onTabSwitch(\"tokens\")}\n className={clsx(\n \"flex items-center gap-1.5 text-sm font-semibold transition-colors\",\n activeTab === \"tokens\"\n ? \"text-foreground\"\n : \"text-default-400 hover:text-default-500\",\n )}\n >\n <svg\n className=\"w-4 h-4 text-warning\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path d=\"M11 3a1 1 0 10-2 0v1a1 1 0 102 0V3zM15.657 5.757a1 1 0 00-1.414-1.414l-.707.707a1 1 0 001.414 1.414l.707-.707zM18 10a1 1 0 01-1 1h-1a1 1 0 110-2h1a1 1 0 011 1zM5.05 6.464A1 1 0 106.464 5.05l-.707-.707a1 1 0 00-1.414 1.414l.707.707zM5 10a1 1 0 01-1 1H3a1 1 0 110-2h1a1 1 0 011 1zM8 16v-1h4v1a2 2 0 11-4 0zM12 14c.015-.34.208-.646.477-.859a4 4 0 10-4.954 0c.27.213.462.519.476.859h4.002z\" />\n </svg>\n <span>Tokens</span>\n <span className=\"text-default-400 text-xs\">({tokensCount}+)</span>\n </button>\n\n <button\n onClick={() => onTabSwitch(\"traders\")}\n className={clsx(\n \"flex items-center gap-1.5 text-sm font-semibold transition-colors\",\n activeTab === \"traders\"\n ? \"text-foreground\"\n : \"text-default-400 hover:text-default-500\",\n )}\n >\n <span>Traders</span>\n <span className=\"text-default-400 text-xs\">({tradersCount})</span>\n </button>\n </div>\n\n {/* Action Buttons */}\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n className=\"text-default-500\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n </Button>\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n className=\"text-default-500\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n </Button>\n </div>\n </div>\n\n {/* Tab Content */}\n <div>\n {activeTab === \"tokens\" && <TokensListWidget />}\n {activeTab === \"traders\" && <TradersTableWidget />}\n </div>\n </div>\n );\n}\n","import { useTabSwitch } from \"./tab-container.script\";\nimport type { TabType } from \"./tab-container.script\";\nimport { TabContainerUI } from \"./tab-container.ui\";\n\nexport type TabContainerWidgetProps = {\n /** Initial active tab */\n initialTab?: TabType;\n /** Tokens count */\n tokensCount?: number;\n /** Traders count */\n tradersCount?: number;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Tab Container Widget\n * Combines tab switching logic and UI\n */\nexport function TabContainerWidget({\n initialTab,\n tokensCount,\n tradersCount,\n className,\n}: TabContainerWidgetProps) {\n const { activeTab, switchTab } = useTabSwitch(initialTab);\n\n return (\n <TabContainerUI\n activeTab={activeTab}\n onTabSwitch={switchTab}\n tokensCount={tokensCount}\n tradersCount={tradersCount}\n className={className}\n />\n );\n}\n","import { Button, clsx } from \"@liberfi.io/ui\";\nimport { ActivityFeedWidget } from \"./activity-feed.widget\";\nimport type { ChannelDetailData } from \"./channel-detail-new.script\";\nimport { TabContainerWidget } from \"./tab-container.widget\";\n\nexport type ChannelDetailNewUIProps = {\n /** Channel detail data */\n channelData: ChannelDetailData;\n /** Subscribe handler */\n onSubscribe: () => void | Promise<void>;\n /** Share handler */\n onShare: () => void;\n /** Listen handler */\n onListen: () => void;\n /** Back button handler */\n onBack?: () => void;\n /** Whether subscribing */\n isSubscribing?: boolean;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Channel Detail New UI Component\n * Full screen channel detail page with traders table\n */\nexport function ChannelDetailNewUI({\n channelData,\n onSubscribe,\n onShare,\n onListen,\n onBack,\n isSubscribing = false,\n className,\n}: ChannelDetailNewUIProps) {\n return (\n <div\n className={clsx(\n \"w-full min-h-screen bg-background\",\n \"px-4 sm:px-6 py-6\",\n className,\n )}\n >\n <div className=\"w-full max-w-7xl mx-auto flex flex-col gap-6\">\n {/* Back Button */}\n {onBack && (\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n onPress={onBack}\n className=\"text-foreground self-start -mb-2\"\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n }\n >\n 返回\n </Button>\n )}\n\n {/* Top Section: Channel Info */}\n <div className=\"bg-content1 rounded-2xl border border-divider p-6\">\n {/* First Row: Avatar, Title, Stats and Action Buttons */}\n <div className=\"flex items-start justify-between gap-4 mb-4\">\n {/* Left: Avatar and Basic Info */}\n <div className=\"flex gap-3 items-start\">\n <div className=\"w-20 h-20 rounded-2xl bg-gradient-to-br from-pink-400 to-pink-600 flex-shrink-0\"></div>\n\n <div className=\"flex flex-col gap-1.5\">\n <h1 className=\"text-lg font-bold text-foreground\">\n {channelData.name}\n </h1>\n\n {/* Stats Row */}\n <div className=\"flex items-center gap-2.5 text-xs text-default-400\">\n <div className=\"flex items-center gap-1\">\n <svg\n className=\"w-3.5 h-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <span>{channelData.stats.signalCount}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <svg\n className=\"w-3.5 h-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z\"\n />\n </svg>\n <span>{channelData.stats.subscribers}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <svg\n className=\"w-3.5 h-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 10V3L4 14h7v7l9-11h-7z\"\n />\n </svg>\n <span>{channelData.stats.someMetric.toLocaleString()}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <svg\n className=\"w-3.5 h-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{channelData.stats.activeTime}</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Right: Action Buttons and Social Icons */}\n <div className=\"flex flex-col gap-2 items-end\">\n {/* Top row: Share, Comment, Subscribe */}\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n onPress={onShare}\n className=\"text-default-500\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z\"\n />\n </svg>\n </Button>\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n className=\"text-default-500\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"\n />\n </svg>\n </Button>\n <Button\n color=\"success\"\n radius=\"lg\"\n size=\"sm\"\n onPress={onSubscribe}\n isLoading={isSubscribing}\n className=\"bg-[#c7ff2e] text-black font-semibold px-8 h-8\"\n startContent={\n !isSubscribing ? (\n <span className=\"text-lg\">+</span>\n ) : undefined\n }\n >\n Subscribe\n </Button>\n </div>\n\n {/* Bottom row: Twitter, Discord, Listen */}\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n className=\"text-[#c7ff2e]\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n </Button>\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n className=\"text-[#c7ff2e]\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z\" />\n </svg>\n </Button>\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n onPress={onListen}\n className=\"text-[#c7ff2e]\"\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n }\n >\n Listen\n </Button>\n </div>\n </div>\n </div>\n\n {/* Second Row: Links and Creator */}\n <div className=\"mb-4 space-y-1\">\n {/* Links */}\n <div className=\"text-xs text-default-500\">\n {channelData.links.twitter && (\n <div>推推: {channelData.links.twitter}</div>\n )}\n {channelData.links.axiom && (\n <div>axiom 立减10%手续费: {channelData.links.axiom}</div>\n )}\n </div>\n\n {/* Creator Info */}\n <div className=\"flex items-center gap-2 text-xs text-default-400\">\n <span>Created by</span>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-4 h-4 rounded-full bg-default-200\" />\n <span className=\"font-medium text-foreground\">\n {channelData.creator.name}\n </span>\n <svg\n className=\"w-3 h-3\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M6.267 3.455a3.066 3.066 0 001.745-.723 3.066 3.066 0 013.976 0 3.066 3.066 0 001.745.723 3.066 3.066 0 012.812 2.812c.051.643.304 1.254.723 1.745a3.066 3.066 0 010 3.976 3.066 3.066 0 00-.723 1.745 3.066 3.066 0 01-2.812 2.812 3.066 3.066 0 00-1.745.723 3.066 3.066 0 01-3.976 0 3.066 3.066 0 00-1.745-.723 3.066 3.066 0 01-2.812-2.812 3.066 3.066 0 00-.723-1.745 3.066 3.066 0 010-3.976 3.066 3.066 0 00.723-1.745 3.066 3.066 0 012.812-2.812zm7.44 5.252a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n <span>{channelData.creator.time}</span>\n </div>\n </div>\n\n {/* Key Metrics Cards */}\n <div className=\"border border-divider rounded-lg p-4\">\n <div className=\"grid grid-cols-3 gap-6\">\n {/* 7D PNL */}\n <div className=\"flex flex-col items-center\">\n <div className=\"text-[10px] text-default-500 mb-1.5 uppercase tracking-wider text-center\">\n {channelData.metrics.pnl.label}\n </div>\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-xl font-bold text-[#c7ff2e]\">\n {channelData.metrics.pnl.value}\n </span>\n <span className=\"text-sm font-medium text-white\">\n {channelData.metrics.pnl.subValue}\n </span>\n </div>\n </div>\n\n {/* 7D WIN RATE */}\n <div className=\"flex flex-col items-center\">\n <div className=\"text-[10px] text-default-500 mb-1.5 uppercase tracking-wider text-center\">\n {channelData.metrics.winRate.label}\n </div>\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-xl font-bold text-[#c7ff2e]\">\n {channelData.metrics.winRate.value}\n </span>\n <span className=\"text-sm text-white\">\n {channelData.metrics.winRate.subValue.split(\"/\")[0]}\n <span className=\"text-[#c7ff2e]\">/</span>\n <span className=\"text-[#f76816]\">\n {channelData.metrics.winRate.subValue.split(\"/\")[1]}\n </span>\n </span>\n </div>\n </div>\n\n {/* 7D TXS */}\n <div className=\"flex flex-col items-center\">\n <div className=\"text-[10px] text-default-500 mb-1.5 uppercase tracking-wider text-center\">\n {channelData.metrics.txs.label}\n </div>\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-xl font-bold text-[#c7ff2e]\">\n {channelData.metrics.txs.value}\n </span>\n <span className=\"text-sm text-white\">\n <span className=\"text-[#c7ff2e]\">\n {channelData.metrics.txs.subValue.split(\"/\")[0]}\n </span>\n <span>/</span>\n <span className=\"text-[#f76816]\">\n {channelData.metrics.txs.subValue.split(\"/\")[1]}\n </span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Bottom Section: Content Area */}\n <div className=\"grid grid-cols-1 xl:grid-cols-12 gap-6\">\n {/* Left: Activity Feed */}\n <div className=\"xl:col-span-7 bg-content1 rounded-2xl border border-divider p-6 overflow-hidden\">\n <ActivityFeedWidget />\n </div>\n\n {/* Right: Traders Table */}\n <div className=\"xl:col-span-5 bg-content1 rounded-2xl border border-divider p-6 overflow-hidden\">\n <TabContainerWidget />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","export type ChannelDetailStats = {\n signalCount: number;\n subscribers: number;\n someMetric: number;\n activeTime: string;\n};\n\nexport type KeyMetric = {\n label: string;\n value: string;\n subValue: string;\n trend: \"up\" | \"down\" | \"neutral\";\n percentage?: string;\n};\n\nexport type ChannelDetailData = {\n id: string;\n name: string;\n avatar: string;\n stats: ChannelDetailStats;\n links: {\n twitter?: string;\n axiom?: string;\n };\n creator: {\n name: string;\n time: string;\n };\n metrics: {\n pnl: KeyMetric;\n winRate: KeyMetric;\n txs: KeyMetric;\n };\n};\n\nexport type UseChannelDetailNewScriptParams = {\n /** Channel ID */\n channelId: string;\n};\n\nexport type UseChannelDetailNewScriptResult = {\n /** Channel detail data */\n channelData: ChannelDetailData | null;\n /** Loading state */\n isLoading: boolean;\n /** Subscribe handler */\n handleSubscribe: () => Promise<void>;\n /** Share handler */\n handleShare: () => void;\n /** Listen handler */\n handleListen: () => void;\n};\n\n/**\n * Channel Detail New Script Hook\n * Handles channel detail page logic\n */\nexport function useChannelDetailNewScript({\n channelId,\n}: UseChannelDetailNewScriptParams): UseChannelDetailNewScriptResult {\n // TODO: Replace with actual API call\n const channelData: ChannelDetailData = {\n id: channelId,\n name: \"Money Never Sleeps\",\n avatar: \"https://via.placeholder.com/150/FF69B4/FFFFFF?text=MNS\",\n stats: {\n signalCount: 92,\n subscribers: 22,\n someMetric: 1109,\n activeTime: \"8 h\",\n },\n links: {\n twitter: \"https://x.com/waiting027\",\n axiom: \"https://axiom.trade/@waiting\",\n },\n creator: {\n name: \"@wanwan\",\n time: \"7 mo. ago\",\n },\n metrics: {\n pnl: {\n label: \"7D PNL\",\n value: \"+$4,200\",\n subValue: \"+72.1%\",\n trend: \"up\",\n percentage: \"+72.1%\",\n },\n winRate: {\n label: \"7D WIN RATE\",\n value: \"68%\",\n subValue: \"54/39\",\n trend: \"neutral\",\n },\n txs: {\n label: \"7D TXS\",\n value: \"140\",\n subValue: \"85/55\",\n trend: \"neutral\",\n },\n },\n };\n\n const handleSubscribe = async () => {\n // TODO: Implement subscribe logic\n await new Promise((resolve) => setTimeout(resolve, 1000));\n };\n\n const handleShare = () => {\n // TODO: Implement share logic\n };\n\n const handleListen = () => {\n // TODO: Implement listen logic\n };\n\n return {\n channelData,\n isLoading: false,\n handleSubscribe,\n handleShare,\n handleListen,\n };\n}\n","import { useState } from \"react\";\nimport {\n useChannelDetailNewScript,\n type UseChannelDetailNewScriptParams,\n} from \"./channel-detail-new.script\";\nimport { ChannelDetailNewUI } from \"./channel-detail-new.ui\";\n\nexport type ChannelDetailNewWidgetProps = UseChannelDetailNewScriptParams & {\n /** Back button handler */\n onBack?: () => void;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Channel Detail New Widget\n * Combines UI and business logic for channel detail page\n */\nexport function ChannelDetailNewWidget({\n channelId,\n onBack,\n className,\n}: ChannelDetailNewWidgetProps) {\n const [isSubscribing, setIsSubscribing] = useState(false);\n\n const { channelData, handleSubscribe, handleShare, handleListen } =\n useChannelDetailNewScript({\n channelId,\n });\n\n const onSubscribe = async () => {\n setIsSubscribing(true);\n try {\n await handleSubscribe();\n } finally {\n setIsSubscribing(false);\n }\n };\n\n if (!channelData) {\n return (\n <div className=\"w-full h-screen flex items-center justify-center\">\n <div className=\"text-default-400\">Loading...</div>\n </div>\n );\n }\n\n return (\n <ChannelDetailNewUI\n channelData={channelData}\n onSubscribe={onSubscribe}\n onShare={handleShare}\n onListen={handleListen}\n onBack={onBack}\n isSubscribing={isSubscribing}\n className={className}\n />\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport type { ChannelCardData } from \"./find-channel.ui\";\n\nexport type UseFindChannelScriptParams = {\n /** Initial channels data */\n channels?: ChannelCardData[];\n /** Whether user has created a channel */\n hasCreatedChannel?: boolean;\n};\n\n/**\n * Business logic for Find Channel page\n */\nexport function useFindChannelScript({\n channels: initialChannels = [],\n hasCreatedChannel = false,\n}: UseFindChannelScriptParams = {}) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [selectedChain, setSelectedChain] = useState(\"all\");\n const [selectedSort, setSelectedSort] = useState(\"7d_pnl\");\n const [channels, setChannels] = useState<ChannelCardData[]>(initialChannels);\n\n const chainOptions = useMemo(\n () => [\n { value: \"all\", label: \"All Chains\" },\n { value: \"sol\", label: \"SOL\" },\n { value: \"eth\", label: \"ETH\" },\n { value: \"bsc\", label: \"BSC\" },\n ],\n [],\n );\n\n const sortOptions = useMemo(\n () => [\n { value: \"latest\", label: \"最近更新 (新→旧)\" },\n { value: \"7d_pnl\", label: \"7D PNL (高→低)\" },\n { value: \"subscribers\", label: \"订阅人数 (高→低)\" },\n { value: \"win_rate\", label: \"胜率 (高→低)\" },\n ],\n [],\n );\n\n // Filter and sort channels\n const filteredChannels = useMemo(() => {\n let result = [...channels];\n\n // Apply search filter\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n result = result.filter(\n (channel) =>\n channel.name.toLowerCase().includes(query) ||\n channel.creator.name.toLowerCase().includes(query) ||\n channel.description.toLowerCase().includes(query),\n );\n }\n\n // Apply chain filter\n if (selectedChain !== \"all\") {\n // In real implementation, filter by chain\n // For now, we'll keep all channels\n }\n\n // Apply sorting\n result.sort((a, b) => {\n switch (selectedSort) {\n case \"latest\":\n // In real implementation, sort by timestamp\n return 0;\n case \"7d_pnl\": {\n const aPnl = parseFloat(a.metrics.pnl.value.replace(/[^0-9.-]/g, \"\"));\n const bPnl = parseFloat(b.metrics.pnl.value.replace(/[^0-9.-]/g, \"\"));\n return bPnl - aPnl;\n }\n case \"subscribers\":\n return b.stats.subscribers - a.stats.subscribers;\n case \"win_rate\": {\n const aRate = parseFloat(a.metrics.winRate.value.replace(\"%\", \"\"));\n const bRate = parseFloat(b.metrics.winRate.value.replace(\"%\", \"\"));\n return bRate - aRate;\n }\n default:\n return 0;\n }\n });\n\n return result;\n }, [channels, searchQuery, selectedChain, selectedSort]);\n\n const handleChainChange = useCallback((chain: string) => {\n setSelectedChain(chain);\n }, []);\n\n const handleSortChange = useCallback((sort: string) => {\n setSelectedSort(sort);\n }, []);\n\n const handleSearchChange = useCallback((query: string) => {\n setSearchQuery(query);\n }, []);\n\n const handleSubscribe = useCallback((channelId: string) => {\n setChannels((prev) =>\n prev.map((channel) =>\n channel.id === channelId\n ? { ...channel, isSubscribed: !channel.isSubscribed }\n : channel,\n ),\n );\n console.log(\"Subscribe to channel:\", channelId);\n }, []);\n\n const handleChannelClick = useCallback((channelId: string) => {\n console.log(\"Channel clicked:\", channelId);\n }, []);\n\n const handleCreateChannel = useCallback(() => {\n console.log(\"Create channel\");\n }, []);\n\n const handleChannelManagement = useCallback(() => {\n console.log(\"Channel management\");\n }, []);\n\n return {\n channels: filteredChannels,\n selectedChain,\n chainOptions,\n selectedSort,\n sortOptions,\n searchQuery,\n hasCreatedChannel,\n handleChainChange,\n handleSortChange,\n handleSearchChange,\n handleSubscribe,\n handleChannelClick,\n handleCreateChannel,\n handleChannelManagement,\n };\n}\n","import { Button, clsx, Input, Select, SelectItem } from \"@liberfi.io/ui\";\n\nexport type ChannelCardData = {\n id: string;\n name: string;\n avatar: string;\n chain: \"sol\" | \"eth\" | \"bsc\" | \"all\"; // 链类型\n stats: {\n signals: number;\n subscribers: number;\n activeTime: string;\n };\n creator: {\n name: string;\n verified: boolean;\n };\n description: string;\n metrics: {\n pnl: {\n label: string;\n value: string;\n percentage: string;\n isPositive: boolean;\n };\n winRate: {\n label: string;\n value: string;\n wins: number;\n losses: number;\n };\n txs: {\n label: string;\n value: number;\n wins: number;\n losses: number;\n };\n };\n isSubscribed: boolean;\n};\n\nexport type FindChannelUIProps = {\n /** List of channels */\n channels: ChannelCardData[];\n /** Selected chain filter */\n selectedChain: string;\n /** Chain filter options */\n chainOptions: { value: string; label: string }[];\n /** Selected sort option */\n selectedSort: string;\n /** Sort options */\n sortOptions: { value: string; label: string }[];\n /** Search query */\n searchQuery: string;\n /** Whether user has created channel */\n hasCreatedChannel: boolean;\n /** Chain filter change handler */\n onChainChange: (chain: string) => void;\n /** Sort change handler */\n onSortChange: (sort: string) => void;\n /** Search change handler */\n onSearchChange: (query: string) => void;\n /** Subscribe handler */\n onSubscribe: (channelId: string) => void | Promise<void>;\n /** Channel click handler */\n onChannelClick: (channelId: string) => void;\n /** Create channel handler */\n onCreateChannel?: () => void;\n /** Channel management handler */\n onChannelManagement?: () => void;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Find Channel UI Component\n * Displays a list of channels with filtering and search\n */\nexport function FindChannelUI({\n channels,\n selectedChain,\n chainOptions,\n selectedSort,\n sortOptions,\n searchQuery,\n hasCreatedChannel,\n onChainChange,\n onSortChange,\n onSearchChange,\n onSubscribe,\n onChannelClick,\n onCreateChannel,\n onChannelManagement,\n className,\n}: FindChannelUIProps) {\n return (\n <div\n className={clsx(\n \"w-full min-h-screen bg-background\",\n \"px-4 sm:px-6 py-6\",\n className,\n )}\n >\n <div className=\"w-full max-w-7xl mx-auto\">\n {/* Header with tabs and create button */}\n <div className=\"flex items-center justify-between mb-6\">\n {/* Tabs */}\n <div className=\"flex items-center gap-3\">\n <Button\n size=\"md\"\n variant=\"bordered\"\n radius=\"lg\"\n className=\"border-[#c7ff2e] text-[#c7ff2e] font-medium\"\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\"\n />\n </svg>\n }\n >\n 发现频道\n </Button>\n <Button\n size=\"md\"\n variant=\"light\"\n radius=\"lg\"\n className=\"text-foreground font-medium\"\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\"\n />\n </svg>\n }\n >\n 我的订阅\n <span className=\"ml-1 px-2 py-0.5 rounded-full bg-[#c7ff2e] text-black text-xs font-semibold\">\n 3\n </span>\n </Button>\n </div>\n\n {/* Create/Management Button */}\n {hasCreatedChannel ? (\n <Button\n size=\"md\"\n radius=\"lg\"\n onPress={onChannelManagement}\n className=\"bg-[#c7ff2e] text-black font-semibold px-6\"\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n }\n >\n 频道管理\n </Button>\n ) : (\n <Button\n size=\"md\"\n radius=\"lg\"\n onPress={onCreateChannel}\n className=\"bg-[#c7ff2e] text-black font-semibold px-6\"\n startContent={<span className=\"text-xl\">+</span>}\n >\n 创建频道\n </Button>\n )}\n </div>\n\n {/* Filters and Search */}\n <div className=\"flex items-center gap-3 mb-6 bg-content1 rounded-2xl border border-divider p-4\">\n {/* Chain Filter */}\n <Select\n size=\"md\"\n radius=\"lg\"\n variant=\"bordered\"\n selectedKeys={[selectedChain]}\n onSelectionChange={(keys) => {\n const selected = Array.from(keys)[0] as string;\n onChainChange(selected);\n }}\n className=\"w-36\"\n classNames={{\n trigger: \"border-divider bg-background\",\n value: \"text-foreground\",\n }}\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n }\n >\n {chainOptions.map((option) => (\n <SelectItem key={option.value}>{option.label}</SelectItem>\n ))}\n </Select>\n\n {/* Sort Filter */}\n <Select\n size=\"md\"\n radius=\"lg\"\n variant=\"bordered\"\n selectedKeys={[selectedSort]}\n onSelectionChange={(keys) => {\n const selected = Array.from(keys)[0] as string;\n onSortChange(selected);\n }}\n className=\"w-44\"\n classNames={{\n trigger: \"border-divider bg-background\",\n value: \"text-foreground whitespace-nowrap\",\n }}\n renderValue={(items) => {\n const selectedItem = sortOptions.find(\n (opt) => opt.value === selectedSort,\n );\n if (!selectedItem) return null;\n // 只显示括号前的内容\n const displayText = selectedItem.label\n .split(\"(\")[0]\n .split(\"(\")[0]\n .trim();\n return (\n <span className=\"whitespace-nowrap\">排序: {displayText}</span>\n );\n }}\n >\n {sortOptions.map((option) => (\n <SelectItem key={option.value}>{option.label}</SelectItem>\n ))}\n </Select>\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Search Input */}\n <Input\n size=\"md\"\n radius=\"lg\"\n variant=\"bordered\"\n placeholder=\"搜索频道名称、创建者...\"\n value={searchQuery}\n onValueChange={onSearchChange}\n className=\"w-80\"\n classNames={{\n inputWrapper: \"border-divider bg-background\",\n input: \"text-foreground\",\n }}\n startContent={\n <svg\n className=\"w-4 h-4 text-default-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n }\n />\n </div>\n\n {/* Channel Cards Grid */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {channels.map((channel) => (\n <div\n key={channel.id}\n className=\"bg-content1 rounded-2xl border border-divider p-6 hover:border-[#c7ff2e]/50 transition-colors\"\n >\n <div\n className=\"cursor-pointer\"\n onClick={() => onChannelClick(channel.id)}\n >\n {/* Header: Avatar, Name, Subscribe Button */}\n <div className=\"flex items-start gap-3 mb-3\">\n {/* Avatar with chain badge */}\n <div className=\"relative w-16 h-16 flex-shrink-0\">\n <div\n className=\"w-full h-full rounded-2xl bg-gradient-to-br\"\n style={{\n backgroundImage: `url(${channel.avatar})`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n }}\n />\n {/* Chain Badge */}\n <div className=\"absolute -bottom-1 -right-1 w-6 h-6 rounded-full bg-content1 flex items-center justify-center border-2 border-content1\">\n {channel.chain === \"sol\" && (\n <div className=\"w-5 h-5 rounded-full bg-gradient-to-br from-purple-400 to-pink-400 flex items-center justify-center text-[8px] font-bold text-white\">\n SOL\n </div>\n )}\n {channel.chain === \"eth\" && (\n <div className=\"w-5 h-5 rounded-full bg-gradient-to-br from-blue-400 to-purple-400 flex items-center justify-center text-[8px] font-bold text-white\">\n ETH\n </div>\n )}\n {channel.chain === \"bsc\" && (\n <div className=\"w-5 h-5 rounded-full bg-gradient-to-br from-yellow-400 to-yellow-600 flex items-center justify-center text-[8px] font-bold text-white\">\n BSC\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-base font-bold text-foreground mb-1 truncate\">\n {channel.name}\n </h3>\n\n {/* Stats */}\n <div className=\"flex items-center gap-2 text-xs text-default-400 mb-2\">\n <div className=\"flex items-center gap-1\">\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <span>{channel.stats.signals}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z\"\n />\n </svg>\n <span>{channel.stats.subscribers}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{channel.stats.activeTime}</span>\n </div>\n </div>\n\n {/* Creator */}\n <div className=\"flex items-center gap-1.5 text-xs\">\n <div className=\"w-3 h-3 rounded-full bg-default-200\" />\n <span className=\"text-default-500\">\n @{channel.creator.name}\n </span>\n {channel.creator.verified && (\n <svg\n className=\"w-3 h-3 text-[#c7ff2e]\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M6.267 3.455a3.066 3.066 0 001.745-.723 3.066 3.066 0 013.976 0 3.066 3.066 0 001.745.723 3.066 3.066 0 012.812 2.812c.051.643.304 1.254.723 1.745a3.066 3.066 0 010 3.976 3.066 3.066 0 00-.723 1.745 3.066 3.066 0 01-2.812 2.812 3.066 3.066 0 00-1.745.723 3.066 3.066 0 01-3.976 0 3.066 3.066 0 00-1.745-.723 3.066 3.066 0 01-2.812-2.812 3.066 3.066 0 00-.723-1.745 3.066 3.066 0 010-3.976 3.066 3.066 0 00.723-1.745 3.066 3.066 0 012.812-2.812zm7.44 5.252a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )}\n </div>\n </div>\n\n {/* Subscribe Button */}\n <Button\n size=\"sm\"\n radius=\"lg\"\n onPress={() => onSubscribe(channel.id)}\n className={clsx(\n \"px-4 font-semibold\",\n channel.isSubscribed\n ? \"bg-content2 text-[#c7ff2e] border border-[#c7ff2e]\"\n : \"bg-[#c7ff2e] text-black\",\n )}\n onClick={(e) => e.stopPropagation()}\n startContent={\n channel.isSubscribed ? (\n <svg\n className=\"w-3 h-3\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ) : (\n <span className=\"text-base\">+</span>\n )\n }\n >\n {channel.isSubscribed ? \"已订阅\" : \"订阅\"}\n </Button>\n </div>\n\n {/* Description */}\n <p className=\"text-xs text-default-500 mb-4 line-clamp-2\">\n {channel.description}\n </p>\n\n {/* Metrics */}\n <div className=\"border border-divider rounded-lg p-3\">\n <div className=\"grid grid-cols-3 gap-4\">\n {/* PNL */}\n <div className=\"flex flex-col items-center\">\n <div className=\"text-[10px] text-default-500 mb-1 uppercase tracking-wider\">\n {channel.metrics.pnl.label}\n </div>\n <div className=\"flex items-baseline gap-1.5\">\n <span\n className={clsx(\n \"text-base font-bold\",\n channel.metrics.pnl.isPositive\n ? \"text-[#c7ff2e]\"\n : \"text-[#f76816]\",\n )}\n >\n {channel.metrics.pnl.value}\n </span>\n <span className=\"text-xs text-white\">\n {channel.metrics.pnl.percentage}\n </span>\n </div>\n </div>\n\n {/* Win Rate */}\n <div className=\"flex flex-col items-center\">\n <div className=\"text-[10px] text-default-500 mb-1 uppercase tracking-wider\">\n {channel.metrics.winRate.label}\n </div>\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"text-base font-bold text-[#c7ff2e]\">\n {channel.metrics.winRate.value}\n </span>\n <span className=\"text-xs text-white\">\n <span className=\"text-[#c7ff2e]\">\n {channel.metrics.winRate.wins}\n </span>\n <span>/</span>\n <span className=\"text-[#f76816]\">\n {channel.metrics.winRate.losses}\n </span>\n </span>\n </div>\n </div>\n\n {/* TXS */}\n <div className=\"flex flex-col items-center\">\n <div className=\"text-[10px] text-default-500 mb-1 uppercase tracking-wider\">\n {channel.metrics.txs.label}\n </div>\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"text-base font-bold text-[#c7ff2e]\">\n {channel.metrics.txs.value}\n </span>\n <span className=\"text-xs text-white\">\n <span className=\"text-[#c7ff2e]\">\n {channel.metrics.txs.wins}\n </span>\n <span>/</span>\n <span className=\"text-[#f76816]\">\n {channel.metrics.txs.losses}\n </span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","import {\n useFindChannelScript,\n type UseFindChannelScriptParams,\n} from \"./find-channel.script\";\nimport { FindChannelUI } from \"./find-channel.ui\";\n\nexport type FindChannelWidgetProps = UseFindChannelScriptParams & {\n /** Channel click handler */\n onChannelClick?: (channelId: string) => void;\n /** Create channel handler */\n onCreateChannel?: () => void;\n /** Channel management handler */\n onChannelManagement?: () => void;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Find Channel Widget\n * Combines UI and business logic for channel discovery\n */\nexport function FindChannelWidget({\n channels,\n hasCreatedChannel,\n onChannelClick: externalOnChannelClick,\n onCreateChannel: externalOnCreateChannel,\n onChannelManagement: externalOnChannelManagement,\n className,\n}: FindChannelWidgetProps) {\n const {\n channels: filteredChannels,\n selectedChain,\n chainOptions,\n selectedSort,\n sortOptions,\n searchQuery,\n hasCreatedChannel: hasChannel,\n handleChainChange,\n handleSortChange,\n handleSearchChange,\n handleSubscribe,\n handleChannelClick,\n handleCreateChannel,\n handleChannelManagement,\n } = useFindChannelScript({\n channels,\n hasCreatedChannel,\n });\n\n return (\n <FindChannelUI\n channels={filteredChannels}\n selectedChain={selectedChain}\n chainOptions={chainOptions}\n selectedSort={selectedSort}\n sortOptions={sortOptions}\n searchQuery={searchQuery}\n hasCreatedChannel={hasChannel}\n onChainChange={handleChainChange}\n onSortChange={handleSortChange}\n onSearchChange={handleSearchChange}\n onSubscribe={handleSubscribe}\n onChannelClick={externalOnChannelClick || handleChannelClick}\n onCreateChannel={externalOnCreateChannel || handleCreateChannel}\n onChannelManagement={\n externalOnChannelManagement || handleChannelManagement\n }\n className={className}\n />\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport type { SubscribedChannelData } from \"./my-subscribe.ui\";\n\nexport type UseMySubscribeScriptParams = {\n /** Initial subscribed channels data */\n subscribedChannels?: SubscribedChannelData[];\n /** Whether user has created a channel */\n hasCreatedChannel?: boolean;\n};\n\n/**\n * Business logic for My Subscribe page\n */\nexport function useMySubscribeScript({\n subscribedChannels: initialChannels = [],\n hasCreatedChannel = false,\n}: UseMySubscribeScriptParams = {}) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [selectedChain, setSelectedChain] = useState(\"all\");\n const [selectedSort, setSelectedSort] = useState(\"7d_pnl\");\n const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(false);\n const [selectedChannelId, setSelectedChannelId] = useState<string | null>(\n initialChannels.length > 0 ? initialChannels[0].id : null,\n );\n\n const chainOptions = useMemo(\n () => [\n { value: \"all\", label: \"All Chains\" },\n { value: \"sol\", label: \"SOL\" },\n { value: \"eth\", label: \"ETH\" },\n { value: \"bsc\", label: \"BSC\" },\n ],\n [],\n );\n\n const sortOptions = useMemo(\n () => [\n { value: \"latest\", label: \"最近更新 (新→旧)\" },\n { value: \"7d_pnl\", label: \"7D PNL (高→低)\" },\n { value: \"subscribers\", label: \"订阅人数 (高→低)\" },\n { value: \"win_rate\", label: \"胜率 (高→低)\" },\n ],\n [],\n );\n\n // Filter and sort subscribed channels\n const filteredChannels = useMemo(() => {\n let result = [...initialChannels];\n\n // Apply search filter\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n result = result.filter((channel) =>\n channel.name.toLowerCase().includes(query),\n );\n }\n\n // Apply chain filter\n if (selectedChain !== \"all\") {\n // In real implementation, filter by chain\n // For now, we'll keep all channels\n }\n\n // Apply sorting\n result.sort((a, b) => {\n switch (selectedSort) {\n case \"latest\":\n // In real implementation, sort by timestamp\n return 0;\n case \"7d_pnl\": {\n const aPnl = parseFloat(a.pnlPercentage.replace(/[^0-9.-]/g, \"\"));\n const bPnl = parseFloat(b.pnlPercentage.replace(/[^0-9.-]/g, \"\"));\n return bPnl - aPnl;\n }\n default:\n return 0;\n }\n });\n\n return result;\n }, [initialChannels, searchQuery, selectedChain, selectedSort]);\n\n const handleSidebarToggle = useCallback(() => {\n setIsSidebarCollapsed((prev) => !prev);\n }, []);\n\n const handleChannelSelect = useCallback((channelId: string) => {\n setSelectedChannelId(channelId);\n }, []);\n\n const handleChainChange = useCallback((chain: string) => {\n setSelectedChain(chain);\n }, []);\n\n const handleSortChange = useCallback((sort: string) => {\n setSelectedSort(sort);\n }, []);\n\n const handleSearchChange = useCallback((query: string) => {\n setSearchQuery(query);\n }, []);\n\n const handleSwitchToDiscover = useCallback(() => {\n console.log(\"Switch to discover\");\n }, []);\n\n const handleCreateChannel = useCallback(() => {\n console.log(\"Create channel\");\n }, []);\n\n const handleChannelManagement = useCallback(() => {\n console.log(\"Channel management\");\n }, []);\n\n return {\n subscribedChannels: filteredChannels,\n selectedChannelId,\n isSidebarCollapsed,\n selectedChain,\n chainOptions,\n selectedSort,\n sortOptions,\n searchQuery,\n hasCreatedChannel,\n handleSidebarToggle,\n handleChannelSelect,\n handleChainChange,\n handleSortChange,\n handleSearchChange,\n handleSwitchToDiscover,\n handleCreateChannel,\n handleChannelManagement,\n };\n}\n","import { Button, clsx, Input, Select, SelectItem } from \"@liberfi.io/ui\";\nimport { ChannelDetailNewWidget } from \"../channel-detail-new/channel-detail-new.widget\";\n\nexport type SubscribedChannelData = {\n id: string;\n name: string;\n avatar: string;\n chain: \"sol\" | \"eth\" | \"bsc\" | \"all\";\n activeTime: string;\n pnlPercentage: string;\n isPositive: boolean;\n};\n\nexport type MySubscribeUIProps = {\n /** List of subscribed channels */\n subscribedChannels: SubscribedChannelData[];\n /** Selected channel ID */\n selectedChannelId: string | null;\n /** Whether sidebar is collapsed */\n isSidebarCollapsed: boolean;\n /** Selected chain filter */\n selectedChain: string;\n /** Chain filter options */\n chainOptions: { value: string; label: string }[];\n /** Selected sort option */\n selectedSort: string;\n /** Sort options */\n sortOptions: { value: string; label: string }[];\n /** Search query */\n searchQuery: string;\n /** Whether user has created channel */\n hasCreatedChannel: boolean;\n /** Sidebar toggle handler */\n onSidebarToggle: () => void;\n /** Channel select handler */\n onChannelSelect: (channelId: string) => void;\n /** Chain filter change handler */\n onChainChange: (chain: string) => void;\n /** Sort change handler */\n onSortChange: (sort: string) => void;\n /** Search change handler */\n onSearchChange: (query: string) => void;\n /** Switch to discover tab */\n onSwitchToDiscover: () => void;\n /** Create channel handler */\n onCreateChannel?: () => void;\n /** Channel management handler */\n onChannelManagement?: () => void;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * My Subscribe UI Component\n * Displays subscribed channels with expandable sidebar and channel detail\n */\nexport function MySubscribeUI({\n subscribedChannels,\n selectedChannelId,\n isSidebarCollapsed,\n selectedChain,\n chainOptions,\n selectedSort,\n sortOptions,\n searchQuery,\n hasCreatedChannel,\n onSidebarToggle,\n onChannelSelect,\n onChainChange,\n onSortChange,\n onSearchChange,\n onSwitchToDiscover,\n onCreateChannel,\n onChannelManagement,\n className,\n}: MySubscribeUIProps) {\n return (\n <div\n className={clsx(\n \"w-full min-h-screen bg-background\",\n \"px-4 sm:px-6 py-6\",\n className,\n )}\n >\n <div className=\"w-full max-w-7xl mx-auto\">\n {/* Header with tabs and create button */}\n <div className=\"flex items-center justify-between mb-6\">\n {/* Tabs */}\n <div className=\"flex items-center gap-3\">\n <Button\n size=\"md\"\n variant=\"light\"\n radius=\"lg\"\n onPress={onSwitchToDiscover}\n className=\"text-foreground font-medium\"\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\"\n />\n </svg>\n }\n >\n 发现频道\n </Button>\n <Button\n size=\"md\"\n variant=\"bordered\"\n radius=\"lg\"\n className=\"border-[#c7ff2e] text-[#c7ff2e] font-medium\"\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\"\n />\n </svg>\n }\n >\n 我的订阅\n <span className=\"ml-1 px-2 py-0.5 rounded-full bg-[#c7ff2e] text-black text-xs font-semibold\">\n {subscribedChannels.length}\n </span>\n </Button>\n </div>\n\n {/* Create/Management Button */}\n {hasCreatedChannel ? (\n <Button\n size=\"md\"\n radius=\"lg\"\n onPress={onChannelManagement}\n className=\"bg-[#c7ff2e] text-black font-semibold px-6\"\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n }\n >\n 频道管理\n </Button>\n ) : (\n <Button\n size=\"md\"\n radius=\"lg\"\n onPress={onCreateChannel}\n className=\"bg-[#c7ff2e] text-black font-semibold px-6\"\n startContent={<span className=\"text-xl\">+</span>}\n >\n 创建频道\n </Button>\n )}\n </div>\n\n {/* Filters and Search - Same as FindChannel */}\n <div className=\"flex items-center gap-3 mb-6 bg-content1 rounded-2xl border border-divider p-4\">\n {/* Chain Filter */}\n <Select\n size=\"md\"\n radius=\"lg\"\n variant=\"bordered\"\n selectedKeys={[selectedChain]}\n onSelectionChange={(keys) => {\n const selected = Array.from(keys)[0] as string;\n onChainChange(selected);\n }}\n className=\"w-36\"\n classNames={{\n trigger: \"border-divider bg-background\",\n value: \"text-foreground\",\n }}\n startContent={\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n }\n >\n {chainOptions.map((option) => (\n <SelectItem key={option.value}>{option.label}</SelectItem>\n ))}\n </Select>\n\n {/* Sort Filter */}\n <Select\n size=\"md\"\n radius=\"lg\"\n variant=\"bordered\"\n selectedKeys={[selectedSort]}\n onSelectionChange={(keys) => {\n const selected = Array.from(keys)[0] as string;\n onSortChange(selected);\n }}\n className=\"w-44\"\n classNames={{\n trigger: \"border-divider bg-background\",\n value: \"text-foreground whitespace-nowrap\",\n }}\n renderValue={(items) => {\n const selectedItem = sortOptions.find(\n (opt) => opt.value === selectedSort,\n );\n if (!selectedItem) return null;\n // 只显示括号前的内容\n const displayText = selectedItem.label\n .split(\"(\")[0]\n .split(\"(\")[0]\n .trim();\n return (\n <span className=\"whitespace-nowrap\">排序: {displayText}</span>\n );\n }}\n >\n {sortOptions.map((option) => (\n <SelectItem key={option.value}>{option.label}</SelectItem>\n ))}\n </Select>\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Search Input */}\n <Input\n size=\"md\"\n radius=\"lg\"\n variant=\"bordered\"\n placeholder=\"搜索频道名称、创建者...\"\n value={searchQuery}\n onValueChange={onSearchChange}\n className=\"w-80\"\n classNames={{\n inputWrapper: \"border-divider bg-background\",\n input: \"text-foreground\",\n }}\n startContent={\n <svg\n className=\"w-4 h-4 text-default-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n }\n />\n </div>\n\n {/* Main Content Area */}\n <div className=\"flex gap-6 h-[calc(100vh-240px)]\">\n {/* Left Sidebar - Full Height */}\n <div\n className={clsx(\n \"flex-shrink-0 transition-all duration-300\",\n isSidebarCollapsed ? \"w-20\" : \"w-80\",\n )}\n >\n <div className=\"bg-content1 rounded-2xl border border-divider h-full flex flex-col overflow-hidden\">\n {/* Header with title and toggle */}\n <div className=\"flex items-center justify-between p-4 border-b border-divider flex-shrink-0\">\n {!isSidebarCollapsed && (\n <h3 className=\"text-base font-bold text-foreground\">\n 已订阅\n </h3>\n )}\n <Button\n size=\"sm\"\n variant=\"light\"\n isIconOnly\n onPress={onSidebarToggle}\n className=\"text-default-400\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d={\n isSidebarCollapsed ? \"M9 5l7 7-7 7\" : \"M15 19l-7-7 7-7\"\n }\n />\n </svg>\n </Button>\n </div>\n\n {/* Subscribed Channels List - Scrollable */}\n <div className=\"flex-1 overflow-y-auto p-3 overflow-x-hidden\">\n <div className=\"space-y-2\">\n {subscribedChannels.map((channel) => (\n <button\n key={channel.id}\n onClick={() => onChannelSelect(channel.id)}\n className={clsx(\n \"w-full flex items-center transition-colors\",\n isSidebarCollapsed\n ? \"justify-center p-2 rounded-xl\"\n : \"gap-3 p-3 rounded-xl\",\n selectedChannelId === channel.id\n ? \"bg-content2\"\n : \"hover:bg-content2\",\n )}\n >\n {/* Avatar with chain badge */}\n <div className=\"relative w-12 h-12 flex-shrink-0\">\n <div\n className=\"w-full h-full rounded-xl bg-gradient-to-br\"\n style={{\n backgroundImage: `url(${channel.avatar})`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n }}\n />\n {/* Chain Badge */}\n <div className=\"absolute -bottom-1 -right-1 w-5 h-5 rounded-full bg-content1 flex items-center justify-center border-2 border-content1\">\n {channel.chain === \"sol\" && (\n <div className=\"w-4 h-4 rounded-full bg-gradient-to-br from-purple-400 to-pink-400\" />\n )}\n {channel.chain === \"eth\" && (\n <div className=\"w-4 h-4 rounded-full bg-gradient-to-br from-blue-400 to-purple-400\" />\n )}\n {channel.chain === \"bsc\" && (\n <div className=\"w-4 h-4 rounded-full bg-gradient-to-br from-yellow-400 to-yellow-600\" />\n )}\n </div>\n </div>\n\n {/* Channel Info - Only show when expanded */}\n {!isSidebarCollapsed && (\n <div className=\"flex-1 min-w-0 text-left\">\n <div className=\"flex items-center justify-between mb-1\">\n <h4 className=\"text-sm font-semibold text-foreground truncate\">\n {channel.name}\n </h4>\n <span className=\"text-[10px] text-default-400 ml-2 flex-shrink-0\">\n 7D\n </span>\n </div>\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-default-400\">\n {channel.activeTime}\n </span>\n <span\n className={clsx(\n \"font-semibold\",\n channel.isPositive\n ? \"text-[#c7ff2e]\"\n : \"text-[#f76816]\",\n )}\n >\n {channel.pnlPercentage}\n </span>\n </div>\n </div>\n )}\n </button>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {/* Right Content Area - Channel Detail */}\n <div className=\"flex-1 min-w-0 -mt-6\">\n {selectedChannelId ? (\n <div className=\"h-full\">\n <ChannelDetailNewWidget channelId={selectedChannelId} />\n </div>\n ) : (\n <div className=\"bg-content1 rounded-2xl border border-divider h-full flex items-center justify-center\">\n <div className=\"text-center\">\n <svg\n className=\"w-16 h-16 mx-auto mb-4 text-default-300\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\"\n />\n </svg>\n <h3 className=\"text-lg font-semibold text-foreground mb-2\">\n 选择一个频道查看详情\n </h3>\n <p className=\"text-sm text-default-400\">\n 从左侧列表中选择您订阅的频道\n </p>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import {\n useMySubscribeScript,\n type UseMySubscribeScriptParams,\n} from \"./my-subscribe.script\";\nimport { MySubscribeUI } from \"./my-subscribe.ui\";\n\nexport type MySubscribeWidgetProps = UseMySubscribeScriptParams & {\n /** Switch to discover handler */\n onSwitchToDiscover?: () => void;\n /** Create channel handler */\n onCreateChannel?: () => void;\n /** Channel management handler */\n onChannelManagement?: () => void;\n /** Custom class name */\n className?: string;\n};\n\n/**\n * My Subscribe Widget\n * Combines UI and business logic for subscribed channels page\n */\nexport function MySubscribeWidget({\n subscribedChannels,\n hasCreatedChannel,\n onSwitchToDiscover: externalOnSwitchToDiscover,\n onCreateChannel: externalOnCreateChannel,\n onChannelManagement: externalOnChannelManagement,\n className,\n}: MySubscribeWidgetProps) {\n const {\n subscribedChannels: filteredChannels,\n selectedChannelId,\n isSidebarCollapsed,\n selectedChain,\n chainOptions,\n selectedSort,\n sortOptions,\n searchQuery,\n hasCreatedChannel: hasChannel,\n handleSidebarToggle,\n handleChannelSelect,\n handleChainChange,\n handleSortChange,\n handleSearchChange,\n handleSwitchToDiscover,\n handleCreateChannel,\n handleChannelManagement,\n } = useMySubscribeScript({\n subscribedChannels,\n hasCreatedChannel,\n });\n\n return (\n <MySubscribeUI\n subscribedChannels={filteredChannels}\n selectedChannelId={selectedChannelId}\n isSidebarCollapsed={isSidebarCollapsed}\n selectedChain={selectedChain}\n chainOptions={chainOptions}\n selectedSort={selectedSort}\n sortOptions={sortOptions}\n searchQuery={searchQuery}\n hasCreatedChannel={hasChannel}\n onSidebarToggle={handleSidebarToggle}\n onChannelSelect={handleChannelSelect}\n onChainChange={handleChainChange}\n onSortChange={handleSortChange}\n onSearchChange={handleSearchChange}\n onSwitchToDiscover={externalOnSwitchToDiscover || handleSwitchToDiscover}\n onCreateChannel={externalOnCreateChannel || handleCreateChannel}\n onChannelManagement={\n externalOnChannelManagement || handleChannelManagement\n }\n className={className}\n />\n );\n}\n","import { Key, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport {\n Button,\n HorizontalScrollContainer,\n PlusIcon,\n StyledTabs,\n Tab,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport {\n MyChannelsWidget,\n SubscribedChannelsWidget,\n TrendingChannelsWidget,\n} from \"./channels\";\n\nexport type ChannelHomePageProps = {\n onCreateChannel?: () => void;\n onSelectChannel?: (channel: Channel) => void;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function ChannelsHomePage({\n onCreateChannel,\n onSelectChannel,\n customHeaderActions,\n customFooterActions,\n}: ChannelHomePageProps) {\n const { t } = useTranslation();\n\n const { isMobile } = useScreen();\n\n const [activeTab, setActiveTab] = useState<\"trending\" | \"my\" | \"subscribed\">(\n \"trending\",\n );\n\n return (\n <div className=\"w-full max-w-7xl mx-auto py-2 px-2 sm:py-4 sm:px-4\">\n <div className=\"flex items-center justify-between gap-2 w-full overflow-x-auto\">\n <HorizontalScrollContainer className=\"flex-auto min-w-0\">\n <StyledTabs\n variant=\"primaryPlain\"\n radius=\"lg\"\n selectedKey={activeTab}\n onSelectionChange={setActiveTab as (key: Key) => void}\n aria-label={t(\"channels.list.title\")}\n size={isMobile ? \"sm\" : undefined}\n >\n <Tab\n key=\"trending\"\n title={t(\"channels.trending.title\")}\n aria-label={t(\"channels.trending.title\")}\n />\n <Tab\n key=\"my\"\n title={t(\"channels.my.title\")}\n aria-label={t(\"channels.my.title\")}\n />\n <Tab\n key=\"subscribed\"\n title={t(\"channels.subscribed.title\")}\n aria-label={t(\"channels.subscribed.title\")}\n />\n </StyledTabs>\n </HorizontalScrollContainer>\n <div className=\"flex-none flex items-center gap-2\">\n {onCreateChannel && (\n <>\n <Button\n radius=\"lg\"\n color=\"primary\"\n size=\"sm\"\n onPress={onCreateChannel}\n className=\"max-sm:hidden gap-1\"\n startContent={<PlusIcon width={18} height={18} />}\n aria-label={t(\"channels.create.title\")}\n >\n {t(\"channels.create.title\")}\n </Button>\n <Button\n isIconOnly\n radius=\"full\"\n color=\"primary\"\n size=\"sm\"\n onPress={onCreateChannel}\n className=\"sm:hidden w-7 min-w-7 h-7 min-h-7\"\n aria-label={t(\"channels.create.title\")}\n >\n <PlusIcon width={18} height={18} />\n </Button>\n </>\n )}\n </div>\n </div>\n\n <div className=\"mt-4 w-full\">\n {activeTab === \"trending\" && (\n <TrendingChannelsWidget\n onSelect={onSelectChannel}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n )}\n {activeTab === \"my\" && (\n <MyChannelsWidget\n onSelect={onSelectChannel}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n )}\n {activeTab === \"subscribed\" && (\n <SubscribedChannelsWidget\n onSelect={onSelectChannel}\n customHeaderActions={customHeaderActions}\n customFooterActions={customFooterActions}\n />\n )}\n </div>\n </div>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { ChannelDetailWidget } from \"./channel-detail\";\n\nexport type ChannelDetailPageProps = {\n id: string;\n customHeaderActions?: (channel: Channel) => React.ReactNode;\n customFooterActions?: (channel: Channel) => React.ReactNode;\n};\n\nexport function ChannelsDetailPage({\n id,\n customHeaderActions,\n customFooterActions,\n}: ChannelDetailPageProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"w-full h-full max-w-2xl mx-auto py-2 px-2 sm:py-4 sm:px-4 flex flex-col gap-2 sm:gap-4\">\n <h1 className=\"text-sm sm:text-lg font-semibold flex-none\">\n {t(\"channels.detail.title\")}\n </h1>\n <div className=\"w-full flex-auto min-h-0\">\n <ChannelDetailWidget\n id={id}\n customFooterActions={customFooterActions}\n customHeaderActions={customHeaderActions}\n />\n </div>\n </div>\n );\n}\n","import { clsx } from \"@liberfi.io/ui\";\n\nexport type StepStatus = \"completed\" | \"current\" | \"pending\";\n\nexport type Step = {\n id: string;\n label: string;\n status: StepStatus;\n};\n\nexport type StepperUIProps = {\n /** Array of steps */\n steps: Step[];\n /** Custom class name */\n className?: string;\n};\n\n/**\n * Stepper UI Component\n * Vertical step indicator showing progress through a multi-step process\n */\nexport function StepperUI({ steps, className }: StepperUIProps) {\n return (\n <div className={clsx(\"flex flex-col gap-1\", className)}>\n {steps.map((step, index) => {\n const isLast = index === steps.length - 1;\n const isCompleted = step.status === \"completed\";\n const isCurrent = step.status === \"current\";\n\n return (\n <div key={step.id} className=\"flex items-start gap-3\">\n {/* Step Indicator */}\n <div className=\"flex flex-col items-center\">\n <div\n className={clsx(\n \"w-6 h-6 rounded-full flex items-center justify-center flex-shrink-0 transition-colors\",\n isCompleted && \"bg-success text-white\",\n isCurrent && \"bg-primary text-white\",\n !isCompleted &&\n !isCurrent &&\n \"bg-default-200 text-default-500\",\n )}\n >\n {isCompleted ? (\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n ) : (\n <span className=\"text-xs font-medium\">{index + 1}</span>\n )}\n </div>\n {!isLast && (\n <div\n className={clsx(\n \"w-0.5 h-8 transition-colors\",\n isCompleted ? \"bg-success\" : \"bg-default-200\",\n )}\n />\n )}\n </div>\n\n {/* Step Label */}\n <div className=\"flex-1 pt-0.5\">\n <span\n className={clsx(\n \"text-sm font-medium transition-colors\",\n isCurrent && \"text-foreground\",\n isCompleted && \"text-default-600\",\n !isCompleted && !isCurrent && \"text-default-400\",\n )}\n >\n {step.label}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { API } from \"@liberfi.io/types\";\nimport { ChannelsContext } from \"../context\";\n\nexport type ChannelsProviderProps = PropsWithChildren<{\n client: API.IChannelsClient;\n}>;\n\nexport function ChannelsProvider({ client, children }: ChannelsProviderProps) {\n return (\n <ChannelsContext.Provider value={{ client }}>\n {children}\n </ChannelsContext.Provider>\n );\n}\n"]}
|