@liberfi.io/ui-channels 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -11
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.0\";\n}\n\nexport default \"0.1.0\";\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/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.5\";\n}\n\nexport default \"0.1.5\";\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"]}
|