@liberfi.io/ui-channels 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +1 -1
- package/dist/client/index.mjs.map +1 -1
- package/dist/index.d.mts +56 -112
- package/dist/index.d.ts +56 -112
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
package/dist/index.mjs.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/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/channel-events.ui.tsx","../src/components/channel-detail/channel-detail-notfound.tsx","../src/components/channel-detail/channel-detail-skeletons.tsx","../src/components/channel-detail/channel-detail.scripts.tsx","../src/components/channel-detail/channel-detail.widget.tsx","../src/components/channels-home.page.tsx","../src/components/channels-detail.page.tsx","../src/icons/FilterIcon.tsx","../src/icons/PlayIcon.tsx","../src/components/trading/trading-table/table-filter-bar.tsx","../src/components/trading/trading-table/table-base.tsx","../src/components/trading/tading.ui.tsx","../src/components/trading/tading.scripts.tsx","../src/components/trading/tading.widget.tsx","../src/providers/ChannelsProvider.tsx"],"names":["version_default","ChannelsContext","createContext","useChannelsContext","context","useContext","useChannelsClient","client","channelEventsQueryKey","channelId","params","fetchChannelEvents","useChannelEventsQuery","options","useQuery","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","ChannelEventsUI","ChannelDetailNotFound","ChannelDetailSkeletons","useChannelDetail","ChannelDetailWidget","ChannelsHomePage","onCreateChannel","onSelectChannel","ChannelsDetailPage","FilterIcon","props","PlayIcon","TableFilterBar","onFilterChange","sort","setSort","timeRange","setTimeRange","tradeType","setTradeType","plan","setPlan","Tabs","key","ButtonGroup","Input","e","TableBase","trading","onBuy","Table","item","Image","formatAmountUSD2","formatAmount","TradingUI","_mockTrading","timeOffsets","types","i","useTrading","TradingWidget","ChannelsProvider","children"],"mappings":"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","file":"index.mjs","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-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.timestamp ? `${params.timestamp}` : \"\",\n params.next_page ? `${params.next_page}` : \"\",\n params.limit ? `${params.limit}` : \"\",\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 { 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};\n\nexport function ChannelDetailUI({\n channel,\n headerActions,\n footerActions,\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-full p-2.5\",\n \"flex flex-col gap-2.5\",\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 { useTranslation } from \"@liberfi.io/i18n\";\nimport { EmptyIcon } from \"@liberfi.io/ui\";\n\nexport function ChannelEventsUI() {\n const { t } = useTranslation();\n\n return (\n <div className=\"w-ful 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(\"common.empty\")}\n </p>\n </div>\n );\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 { useTranslation } from \"@liberfi.io/i18n\";\nimport { Channel } from \"@liberfi.io/types\";\nimport { ChannelEventsUI } from \"../events\";\nimport { ChannelDetailNotFound } from \"./channel-detail-notfound\";\nimport { ChannelDetailSkeletons } from \"./channel-detail-skeletons\";\nimport { useChannelDetail } from \"./channel-detail.scripts\";\nimport { ChannelDetailUI } from \"./channel-detail.ui\";\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 if (isLoading) {\n return <ChannelDetailSkeletons />;\n }\n\n if (!channel) {\n return <ChannelDetailNotFound />;\n }\n\n return (\n <div className=\"space-y-6\">\n <ChannelDetailUI\n channel={channel}\n headerActions={customHeaderActions?.(channel)}\n footerActions={customFooterActions?.(channel)}\n />\n <div className=\"space-y-2.5\">\n <h2 className=\"text-sm font-semibold\">\n {t(\"channels.detail.events.title\")}\n </h2>\n <ChannelEventsUI />\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\";\nimport { ChannelEventsWidget } from \"./events\";\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 max-w-2xl mx-auto py-2 px-2 sm:py-4 sm:px-4 space-y-2 sm:space-y-4\">\n <h1 className=\"text-sm sm:text-lg font-semibold\">\n {t(\"channels.detail.title\")}\n </h1>\n <ChannelDetailWidget\n id={id}\n customFooterActions={customFooterActions}\n customHeaderActions={customHeaderActions}\n />\n </div>\n );\n}\n","import { SVGProps } from \"react\";\n\nexport function FilterIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"8\"\n height=\"16\"\n viewBox=\"0 0 5 9\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 5.72727L2.5 9L0 5.72727H5ZM2.5 0L5 3.27273H0L2.5 0Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import { SVGProps } from \"react\";\n\nexport function PlayIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M6 0C2.6856 0 0 2.68698 0 6C0 9.3144 2.68698 12 6 12C9.3144 12 12 9.31302 12 6C12.0014 2.68698 9.3144 0 6 0ZM8.53878 6.2036L5.21191 8.88089C5.04155 9.01801 4.78947 8.89612 4.78947 8.67867V3.32271C4.78947 3.10526 5.04155 2.98338 5.21191 3.1205L8.53878 5.79917C8.66897 5.90305 8.66897 6.09972 8.53878 6.2036Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport { Button, Tabs, Tab, ButtonGroup, Input } from \"@liberfi.io/ui\";\nimport { FilterIcon } from \"../../../icons/FilterIcon\";\nimport { PlayIcon } from \"../../../icons/PlayIcon\";\n\ninterface TableFilterBarProps {\n onFilterChange?: (filters: {\n sort: \"newest\" | \"amount\";\n timeRange: \"1D\" | \"7D\" | \"30D\";\n tradeType: \"buy\" | \"sell\";\n search: string;\n plan: \"P1\" | \"P2\" | \"P3\";\n }) => void;\n}\n\nexport function TableFilterBar({ onFilterChange }: TableFilterBarProps) {\n const [sort, setSort] = useState<\"newest\" | \"amount\">(\"newest\");\n const [timeRange, setTimeRange] = useState<\"1D\" | \"7D\" | \"30D\">(\"1D\");\n const [tradeType, setTradeType] = useState<\"buy\" | \"sell\">(\"buy\");\n const [search, setSearch] = useState(\"\");\n const [plan, setPlan] = useState<\"P1\" | \"P2\" | \"P3\">(\"P1\");\n\n useEffect(() => {\n onFilterChange?.({ sort, timeRange, tradeType, search, plan });\n }, [sort, timeRange, tradeType, search, plan, onFilterChange]);\n\n return (\n <div className=\"flex items-center justify-between w-full\">\n <div className=\"flex items-center gap-3\">\n <Button\n variant={\"bordered\"}\n className=\"flex items-center gap-1\"\n onPress={() => setSort(\"newest\")}\n >\n <FilterIcon className=\"w-4 h-4\" />\n <p className=\"text-sm font-medium\">Newest</p>\n </Button>\n <Button\n variant={\"bordered\"}\n className=\"flex items-center gap-1\"\n onPress={() => setSort(\"amount\")}\n >\n <FilterIcon className=\"w-4 h-4\" />\n <p className=\"text-sm font-medium\">Amount</p>\n </Button>\n <Tabs\n variant=\"solid\"\n size=\"sm\"\n selectedKey={timeRange}\n onSelectionChange={(key) => setTimeRange(key as \"1D\" | \"7D\" | \"30D\")}\n >\n <Tab key=\"1D\" title=\"1D\" />\n <Tab key=\"7D\" title=\"7D\" />\n <Tab key=\"30D\" title=\"30D\" />\n </Tabs>\n <ButtonGroup size=\"sm\">\n <Button variant=\"flat\" onPress={() => setTradeType(\"buy\")}>\n <span className=\"text-primary font-semibold\">Buy</span>\n </Button>\n <Button variant=\"flat\" onPress={() => setTradeType(\"sell\")}>\n <span className=\"text-danger font-semibold\">Sell</span>\n </Button>\n </ButtonGroup>\n </div>\n\n <Input\n placeholder=\"Token symbol or address…\"\n variant=\"faded\"\n className=\"max-w-80\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n\n <div className=\"flex items-center gap-3\">\n <Button size=\"sm\" variant=\"light\" className=\"flex items-center gap-1\">\n <PlayIcon className=\"w-4 h-4\" />\n <p className=\"text-sm font-medium\">Listen</p>\n </Button>\n <Tabs\n variant=\"bordered\"\n size=\"sm\"\n selectedKey={plan}\n onSelectionChange={(key) => setPlan(key as \"P1\" | \"P2\" | \"P3\")}\n color=\"primary\"\n >\n <Tab key=\"P1\" title=\"P1\" />\n <Tab key=\"P2\" title=\"P2\" />\n <Tab key=\"P3\" title=\"P3\" />\n </Tabs>\n </div>\n </div>\n );\n}\n","import { clsx } from \"@liberfi.io/ui\";\nimport {\n Button,\n Table,\n TableBody,\n TableCell,\n TableColumn,\n TableHeader,\n TableRow,\n Image,\n} from \"@liberfi.io/ui\";\nimport {\n formatAge,\n formatAmount,\n formatAmountUSD2,\n shortAddress,\n} from \"@liberfi.io/utils\";\nimport { Trading } from \"../../../types\";\n\ntype Props = {\n trading: Trading[];\n onBuy: (item: Trading) => void;\n};\n\nexport function TableBase({ trading, onBuy }: Props) {\n return (\n <Table\n classNames={{ wrapper: \"bg-transparent p-0\" }}\n className=\"text-default-800\"\n >\n <TableHeader>\n <TableColumn key=\"date\">Date</TableColumn>\n <TableColumn key=\"channel\">Channel</TableColumn>\n <TableColumn key=\"address\">Address</TableColumn>\n <TableColumn key=\"token\">Token</TableColumn>\n <TableColumn key=\"mc\">$ MC</TableColumn>\n <TableColumn key=\"amount\">\n Amount <span className=\"text-primary\">$</span>\n </TableColumn>\n <TableColumn key=\"actions\">Actions</TableColumn>\n </TableHeader>\n <TableBody items={trading} isLoading={false}>\n {(item) => (\n <TableRow key={item.id}>\n <TableCell>{formatAge(Date.now() - item.date)}</TableCell>\n <TableCell>\n <div className=\"flex items-center gap-2\">\n <Image\n radius=\"md\"\n src={item.channel.imageUrl}\n alt={item.channel.name}\n width={20}\n height={20}\n />\n {item.channel.name}\n </div>\n </TableCell>\n <TableCell>\n <p\n className={clsx(\n item.type === \"buy\" ? \"text-primary\" : \"text-secondary\",\n )}\n >\n {shortAddress(item.address)}\n </p>\n </TableCell>\n <TableCell>\n <div className=\"flex items-center gap-1\">\n <Image\n radius=\"md\"\n src={item.token.image}\n alt={item.token.symbol}\n width={16}\n height={16}\n />{\" \"}\n <div className=\"flex items-end gap-0.5\">\n <p>{item.token.symbol}</p>\n <p className=\"text-xs text-default-500\">\n {shortAddress(item.token.address)}\n </p>\n </div>\n </div>\n </TableCell>\n <TableCell>{formatAmountUSD2(item.mc)}</TableCell>\n <TableCell>\n <div className=\"flex gap-1 items-center\">\n <Image\n src={item.token.chainIcon}\n alt={item.token.symbol}\n width={16}\n height={16}\n />\n <p\n className={clsx(\n item.type === \"buy\" ? \"text-primary\" : \"text-secondary\",\n )}\n >\n {formatAmount(item.amount)}\n </p>\n </div>\n </TableCell>\n <TableCell>\n <Button\n radius=\"full\"\n className={clsx(\"text-white bg-[#B1FF3770]\")}\n size=\"sm\"\n onPress={() => onBuy(item)}\n >\n Buy 0.002 {item.token.symbol}\n </Button>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n );\n}\n","import { Trading } from \"../../types\";\nimport { TableBase, TableFilterBar } from \"./trading-table\";\n\ntype Props = {\n trading: Trading[];\n onBuy: (item: Trading) => void;\n};\n\nexport function TradingUI({ trading, onBuy }: Props) {\n return (\n <div className=\"flex flex-col gap-3\">\n <TableFilterBar />\n <TableBase trading={trading} onBuy={onBuy} />\n </div>\n );\n}\n","import { Trading } from \"../../types\";\n\nconst _mockTrading: Trading[] = [\n {\n id: \"1\",\n date: Date.now() - 32 * 1000,\n type: \"buy\",\n channel: {\n id: \"1\",\n imageUrl:\n \"https://pbs.twimg.com/profile_images/1821642506800353280/xIpx4wIO_normal.jpg\",\n name: \"Zoro - Channel 1\",\n description: \"Sol-Daily Update-Golden Dog Smart Money\",\n createdAt: \"8h\",\n people: 1109,\n volume: 94,\n followers: 105,\n createdBy: \"Zoro\",\n timeAgo: 300,\n socials: {\n telegram: \"https://t.me/Zoro\",\n discord: \"https://discord.com/Zoro\",\n },\n dex: {\n fromToken: {\n name: \"BNB\",\n image:\n \"https://assets.coingecko.com/coins/images/825/standard/bnb-icon2_2x.png?1696501970\",\n },\n toToken: {\n name: \"SOL\",\n image:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n txs7d: {\n total: 140,\n bullish: 70,\n bearish: 70,\n },\n pnl7d: {\n total: 21876,\n },\n wr7d: {\n total: 60.9,\n },\n },\n },\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n token: {\n symbol: \"PINK\",\n image:\n \"https://s1.chainstream.io/tokens/images/4ab7c44fa49cc29bda25878622e5c3f1.webp\",\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n chainIcon:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n mc: 26900,\n amount: 1.3579,\n },\n {\n id: \"2\",\n date: Date.now() - 1 * 60 * 1000,\n type: \"sell\",\n channel: {\n id: \"1\",\n imageUrl:\n \"https://pbs.twimg.com/profile_images/1821642506800353280/xIpx4wIO_normal.jpg\",\n name: \"Zoro - Channel 1\",\n description: \"Sol-Daily Update-Golden Dog Smart Money\",\n createdAt: \"8h\",\n people: 1109,\n volume: 94,\n followers: 105,\n createdBy: \"Zoro\",\n timeAgo: 300,\n socials: {\n telegram: \"https://t.me/Zoro\",\n discord: \"https://discord.com/Zoro\",\n },\n dex: {\n fromToken: {\n name: \"BNB\",\n image:\n \"https://assets.coingecko.com/coins/images/825/standard/bnb-icon2_2x.png?1696501970\",\n },\n toToken: {\n name: \"SOL\",\n image:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n txs7d: {\n total: 140,\n bullish: 70,\n bearish: 70,\n },\n pnl7d: {\n total: 21876,\n },\n wr7d: {\n total: 60.9,\n },\n },\n },\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n token: {\n symbol: \"PINK\",\n image:\n \"https://s1.chainstream.io/tokens/images/4ab7c44fa49cc29bda25878622e5c3f1.webp\",\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n chainIcon:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n mc: 26900,\n amount: 1.3579,\n },\n {\n id: \"3\",\n date: Date.now() - 13 * 60 * 1000,\n type: \"buy\",\n channel: {\n id: \"1\",\n imageUrl:\n \"https://pbs.twimg.com/profile_images/1821642506800353280/xIpx4wIO_normal.jpg\",\n name: \"Zoro - Channel 1\",\n description: \"Sol-Daily Update-Golden Dog Smart Money\",\n createdAt: \"8h\",\n people: 1109,\n volume: 94,\n followers: 105,\n createdBy: \"Zoro\",\n timeAgo: 300,\n socials: {\n telegram: \"https://t.me/Zoro\",\n discord: \"https://discord.com/Zoro\",\n },\n dex: {\n fromToken: {\n name: \"BNB\",\n image:\n \"https://assets.coingecko.com/coins/images/825/standard/bnb-icon2_2x.png?1696501970\",\n },\n toToken: {\n name: \"SOL\",\n image:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n txs7d: {\n total: 140,\n bullish: 70,\n bearish: 70,\n },\n pnl7d: {\n total: 21876,\n },\n wr7d: {\n total: 60.9,\n },\n },\n },\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n token: {\n symbol: \"PINK\",\n image:\n \"https://s1.chainstream.io/tokens/images/4ab7c44fa49cc29bda25878622e5c3f1.webp\",\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n chainIcon:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n mc: 26900,\n amount: 1.3579,\n },\n {\n id: \"4\",\n date: Date.now() - 1 * 60 * 60 * 1000,\n type: \"sell\",\n channel: {\n id: \"1\",\n imageUrl:\n \"https://pbs.twimg.com/profile_images/1821642506800353280/xIpx4wIO_normal.jpg\",\n name: \"Zoro - Channel 1\",\n description: \"Sol-Daily Update-Golden Dog Smart Money\",\n createdAt: \"8h\",\n people: 1109,\n volume: 94,\n followers: 105,\n createdBy: \"Zoro\",\n timeAgo: 300,\n socials: {\n telegram: \"https://t.me/Zoro\",\n discord: \"https://discord.com/Zoro\",\n },\n dex: {\n fromToken: {\n name: \"BNB\",\n image:\n \"https://assets.coingecko.com/coins/images/825/standard/bnb-icon2_2x.png?1696501970\",\n },\n toToken: {\n name: \"SOL\",\n image:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n txs7d: {\n total: 140,\n bullish: 70,\n bearish: 70,\n },\n pnl7d: {\n total: 21876,\n },\n wr7d: {\n total: 60.9,\n },\n },\n },\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n token: {\n symbol: \"PINK\",\n image:\n \"https://s1.chainstream.io/tokens/images/4ab7c44fa49cc29bda25878622e5c3f1.webp\",\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n chainIcon:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n mc: 26900,\n amount: 1.3579,\n },\n {\n id: \"5\",\n date: Date.now() - 1.5 * 60 * 60 * 1000,\n type: \"buy\",\n channel: {\n id: \"1\",\n imageUrl:\n \"https://pbs.twimg.com/profile_images/1821642506800353280/xIpx4wIO_normal.jpg\",\n name: \"Zoro - Channel 1\",\n description: \"Sol-Daily Update-Golden Dog Smart Money\",\n createdAt: \"8h\",\n people: 1109,\n volume: 94,\n followers: 105,\n createdBy: \"Zoro\",\n timeAgo: 300,\n socials: {\n telegram: \"https://t.me/Zoro\",\n discord: \"https://discord.com/Zoro\",\n },\n dex: {\n fromToken: {\n name: \"BNB\",\n image:\n \"https://assets.coingecko.com/coins/images/825/standard/bnb-icon2_2x.png?1696501970\",\n },\n toToken: {\n name: \"SOL\",\n image:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n txs7d: {\n total: 140,\n bullish: 70,\n bearish: 70,\n },\n pnl7d: {\n total: 21876,\n },\n wr7d: {\n total: 60.9,\n },\n },\n },\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n token: {\n symbol: \"PINK\",\n image:\n \"https://s1.chainstream.io/tokens/images/4ab7c44fa49cc29bda25878622e5c3f1.webp\",\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n chainIcon:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n mc: 26900,\n amount: 1.3579,\n },\n {\n id: \"6\",\n date: Date.now() - 3 * 60 * 60 * 1000,\n type: \"sell\",\n channel: {\n id: \"1\",\n imageUrl:\n \"https://pbs.twimg.com/profile_images/1821642506800353280/xIpx4wIO_normal.jpg\",\n name: \"Zoro - Channel 1\",\n description: \"Sol-Daily Update-Golden Dog Smart Money\",\n createdAt: \"8h\",\n people: 1109,\n volume: 94,\n followers: 105,\n createdBy: \"Zoro\",\n timeAgo: 300,\n socials: {\n telegram: \"https://t.me/Zoro\",\n discord: \"https://discord.com/Zoro\",\n },\n dex: {\n fromToken: {\n name: \"BNB\",\n image:\n \"https://assets.coingecko.com/coins/images/825/standard/bnb-icon2_2x.png?1696501970\",\n },\n toToken: {\n name: \"SOL\",\n image:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n txs7d: {\n total: 140,\n bullish: 70,\n bearish: 70,\n },\n pnl7d: {\n total: 21876,\n },\n wr7d: {\n total: 60.9,\n },\n },\n },\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n token: {\n symbol: \"PINK\",\n image:\n \"https://s1.chainstream.io/tokens/images/4ab7c44fa49cc29bda25878622e5c3f1.webp\",\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n chainIcon:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n mc: 26900,\n amount: 1.3579,\n },\n {\n id: \"7\",\n date: Date.now() - 12 * 60 * 60 * 1000,\n type: \"buy\",\n channel: {\n id: \"1\",\n imageUrl:\n \"https://pbs.twimg.com/profile_images/1821642506800353280/xIpx4wIO_normal.jpg\",\n name: \"Zoro - Channel 1\",\n description: \"Sol-Daily Update-Golden Dog Smart Money\",\n createdAt: \"8h\",\n people: 1109,\n volume: 94,\n followers: 105,\n createdBy: \"Zoro\",\n timeAgo: 300,\n socials: {\n telegram: \"https://t.me/Zoro\",\n discord: \"https://discord.com/Zoro\",\n },\n dex: {\n fromToken: {\n name: \"BNB\",\n image:\n \"https://assets.coingecko.com/coins/images/825/standard/bnb-icon2_2x.png?1696501970\",\n },\n toToken: {\n name: \"SOL\",\n image:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n txs7d: {\n total: 140,\n bullish: 70,\n bearish: 70,\n },\n pnl7d: {\n total: 21876,\n },\n wr7d: {\n total: 60.9,\n },\n },\n },\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n token: {\n symbol: \"PINK\",\n image:\n \"https://s1.chainstream.io/tokens/images/4ab7c44fa49cc29bda25878622e5c3f1.webp\",\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n chainIcon:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n mc: 26900,\n amount: 1.3579,\n },\n {\n id: \"8\",\n date: Date.now() - 24 * 60 * 60 * 1000,\n type: \"sell\",\n channel: {\n id: \"1\",\n imageUrl:\n \"https://pbs.twimg.com/profile_images/1821642506800353280/xIpx4wIO_normal.jpg\",\n name: \"Zoro - Channel 1\",\n description: \"Sol-Daily Update-Golden Dog Smart Money\",\n createdAt: \"8h\",\n people: 1109,\n volume: 94,\n followers: 105,\n createdBy: \"Zoro\",\n timeAgo: 300,\n socials: {\n telegram: \"https://t.me/Zoro\",\n discord: \"https://discord.com/Zoro\",\n },\n dex: {\n fromToken: {\n name: \"BNB\",\n image:\n \"https://assets.coingecko.com/coins/images/825/standard/bnb-icon2_2x.png?1696501970\",\n },\n toToken: {\n name: \"SOL\",\n image:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n txs7d: {\n total: 140,\n bullish: 70,\n bearish: 70,\n },\n pnl7d: {\n total: 21876,\n },\n wr7d: {\n total: 60.9,\n },\n },\n },\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n token: {\n symbol: \"PINK\",\n image:\n \"https://s1.chainstream.io/tokens/images/4ab7c44fa49cc29bda25878622e5c3f1.webp\",\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n chainIcon:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n mc: 26900,\n amount: 1.3579,\n },\n {\n id: \"9\",\n date: Date.now() - 5 * 24 * 60 * 60 * 1000,\n type: \"buy\",\n channel: {\n id: \"1\",\n imageUrl:\n \"https://pbs.twimg.com/profile_images/1821642506800353280/xIpx4wIO_normal.jpg\",\n name: \"Zoro - Channel 1\",\n description: \"Sol-Daily Update-Golden Dog Smart Money\",\n createdAt: \"8h\",\n people: 1109,\n volume: 94,\n followers: 105,\n createdBy: \"Zoro\",\n timeAgo: 300,\n socials: {\n telegram: \"https://t.me/Zoro\",\n discord: \"https://discord.com/Zoro\",\n },\n dex: {\n fromToken: {\n name: \"BNB\",\n image:\n \"https://assets.coingecko.com/coins/images/825/standard/bnb-icon2_2x.png?1696501970\",\n },\n toToken: {\n name: \"SOL\",\n image:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n txs7d: {\n total: 140,\n bullish: 70,\n bearish: 70,\n },\n pnl7d: {\n total: 21876,\n },\n wr7d: {\n total: 60.9,\n },\n },\n },\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n token: {\n symbol: \"PINK\",\n image:\n \"https://s1.chainstream.io/tokens/images/4ab7c44fa49cc29bda25878622e5c3f1.webp\",\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n chainIcon:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n mc: 26900,\n amount: 1.3579,\n },\n {\n id: \"10\",\n date: Date.now() - 10 * 24 * 60 * 60 * 1000,\n type: \"sell\",\n channel: {\n id: \"1\",\n imageUrl:\n \"https://pbs.twimg.com/profile_images/1821642506800353280/xIpx4wIO_normal.jpg\",\n name: \"Zoro - Channel 1\",\n description: \"Sol-Daily Update-Golden Dog Smart Money\",\n createdAt: \"8h\",\n people: 1109,\n volume: 94,\n followers: 105,\n createdBy: \"Zoro\",\n timeAgo: 300,\n socials: {\n telegram: \"https://t.me/Zoro\",\n discord: \"https://discord.com/Zoro\",\n },\n dex: {\n fromToken: {\n name: \"BNB\",\n image:\n \"https://assets.coingecko.com/coins/images/825/standard/bnb-icon2_2x.png?1696501970\",\n },\n toToken: {\n name: \"SOL\",\n image:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n txs7d: {\n total: 140,\n bullish: 70,\n bearish: 70,\n },\n pnl7d: {\n total: 21876,\n },\n wr7d: {\n total: 60.9,\n },\n },\n },\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n token: {\n symbol: \"PINK\",\n image:\n \"https://s1.chainstream.io/tokens/images/4ab7c44fa49cc29bda25878622e5c3f1.webp\",\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n chainIcon:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n mc: 26900,\n amount: 1.3579,\n },\n];\n\nconst timeOffsets = [\n 32 * 1000,\n 1 * 60 * 1000,\n 13 * 60 * 1000,\n 1 * 60 * 60 * 1000,\n 1.5 * 60 * 60 * 1000,\n 3 * 60 * 60 * 1000,\n 12 * 60 * 60 * 1000,\n 24 * 60 * 60 * 1000,\n 5 * 24 * 60 * 60 * 1000,\n 10 * 24 * 60 * 60 * 1000,\n];\nconst types: (\"buy\" | \"sell\")[] = [\"buy\", \"sell\"];\n\nfor (let i = 11; i <= 20; i++) {\n _mockTrading.push({\n id: `${i}`,\n date: Date.now() - timeOffsets[(i - 1) % timeOffsets.length],\n type: types[(i - 1) % types.length],\n channel: {\n id: \"1\",\n imageUrl:\n \"https://pbs.twimg.com/profile_images/1821642506800353280/xIpx4wIO_normal.jpg\",\n name: \"Zoro - Channel 1\",\n description: \"Sol-Daily Update-Golden Dog Smart Money\",\n createdAt: \"8h\",\n people: 1109,\n volume: 94,\n followers: 105,\n createdBy: \"Zoro\",\n timeAgo: 300,\n socials: {\n telegram: \"https://t.me/Zoro\",\n discord: \"https://discord.com/Zoro\",\n },\n dex: {\n fromToken: {\n name: \"BNB\",\n image:\n \"https://assets.coingecko.com/coins/images/825/standard/bnb-icon2_2x.png?1696501970\",\n },\n toToken: {\n name: \"SOL\",\n image:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n txs7d: {\n total: 140,\n bullish: 70,\n bearish: 70,\n },\n pnl7d: {\n total: 21876,\n },\n wr7d: {\n total: 60.9,\n },\n },\n },\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n token: {\n symbol: \"PINK\",\n image:\n \"https://s1.chainstream.io/tokens/images/4ab7c44fa49cc29bda25878622e5c3f1.webp\",\n address: \"BwqpHv4s2wZoxf1ktVjFSfz8LkX4Wyjrf7QGrbPSDMqe\",\n chainIcon:\n \"https://assets.coingecko.com/coins/images/4128/standard/solana.png?1718769756\",\n },\n mc: 26900,\n amount: 1.3579,\n });\n}\n\nexport const useTrading = () => {\n return _mockTrading;\n};\n","import { Trading } from \"../../types\";\nimport { useTrading } from \"./tading.scripts\";\nimport { TradingUI } from \"./tading.ui\";\n\n// ------------------------------------------------------------\nexport function TradingWidget() {\n const trading = useTrading();\n const handleBuy = (item: Trading) => {\n console.log(\"buy\", item);\n };\n return <TradingUI trading={trading} onBuy={handleBuy} />;\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.mjs","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-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"]}
|