From ee0e7358050a933ff07a10f91c087aeb73eb9918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rui=20Sim=C3=A3o?= Date: Tue, 2 Jul 2024 14:06:16 +0100 Subject: [PATCH 01/17] feat: add quest leaderboard change --- apps/evm/src/pages/Fusion/Fusion.tsx | 3 + .../components/Leaderboard/Leaderboard.tsx | 68 +--- .../QuestOwnerAvatar/QuestOwnerAvatar.tsx | 25 ++ .../components/QuestOwnerAvatar/index.tsx | 1 + packages/icons/src/Galxe.tsx | 24 ++ packages/icons/src/Intract.tsx | 380 ++++++++++++++++++ packages/icons/src/index.ts | 2 + 7 files changed, 452 insertions(+), 51 deletions(-) create mode 100644 apps/evm/src/pages/Fusion/components/QuestOwnerAvatar/QuestOwnerAvatar.tsx create mode 100644 apps/evm/src/pages/Fusion/components/QuestOwnerAvatar/index.tsx create mode 100644 packages/icons/src/Galxe.tsx create mode 100644 packages/icons/src/Intract.tsx diff --git a/apps/evm/src/pages/Fusion/Fusion.tsx b/apps/evm/src/pages/Fusion/Fusion.tsx index ca39a3d4a..ee2ab6701 100644 --- a/apps/evm/src/pages/Fusion/Fusion.tsx +++ b/apps/evm/src/pages/Fusion/Fusion.tsx @@ -61,6 +61,9 @@ const Fusion = () => { + + + { const { address } = useAccount(); - const tableContainerRef = useRef(null); const id = useId(); const { locale } = useLocale(); @@ -40,6 +42,7 @@ const Leaderboard = (): JSX.Element => { { name: 'Rank', id: LeaderboardColumns.RANK }, { name: 'Name', id: LeaderboardColumns.NAME }, { name: 'Invited By', id: LeaderboardColumns.INVITED_BY }, + { name: 'Quests', id: LeaderboardColumns.QUESTS }, { name: 'Spice', id: LeaderboardColumns.SPICE } ]; @@ -54,6 +57,12 @@ const Leaderboard = (): JSX.Element => { [LeaderboardColumns.RANK]: {item.rank}, [LeaderboardColumns.INVITED_BY]: item.referred_by || '-', [LeaderboardColumns.NAME]: item.username, + [LeaderboardColumns.QUESTS]: ( + + + + + ), [LeaderboardColumns.SPICE]: Intl.NumberFormat(locale).format(Number(item.total_points)) }; }); @@ -62,28 +71,6 @@ const Leaderboard = (): JSX.Element => { refetchInterval: INTERVAL.MINUTE }); - // const { data, fetchNextPage, isFetching, isLoading } = useInfiniteQuery({ - // queryKey: ['leaderboard'], - // queryFn: async ({ pageParam = 0 }) => { - // const start = (pageParam as number) * fetchSize; - // const fetchedData = await apiClient.getLeaderboard(4, start); - - // const rows = fetchedData.leaderboard.map((item, idx) => { - // return { - // id: `${item.deposit_owner}${idx}`, - // [LeaderboardColumns.RANK]: {item.rank}, - // [LeaderboardColumns.INVITED_BY]: item.referred_by || '-', - // [LeaderboardColumns.NAME]: item.username, - // [LeaderboardColumns.POINTS]: Intl.NumberFormat(locale).format(Number(item.total_points)) - // }; - // }); - - // return { data: rows, total: fetchedData.total }; - // }, - // getNextPageParam: (_lastGroup, groups) => groups.length, - // refetchOnWindowFocus: false - // }); - const flatData: LeaderboardRow[] = useMemo(() => { const userData = address && user @@ -93,6 +80,12 @@ const Leaderboard = (): JSX.Element => { invitedBy: user.referred_by, name: user.username, spice: Intl.NumberFormat().format(user.leaderboardRank?.total_reward_points || 0), + quests: ( + + + + + ), rank: {user.leaderboardRank?.rank || '-'} } ] @@ -101,31 +94,6 @@ const Leaderboard = (): JSX.Element => { return [...userData, ...(data || [])]; }, [data, address, user]); - // const totalFetched = flatData.length; - - // const fetchMoreOnBottomReached = useCallback( - // (containerRefElement?: HTMLDivElement | null) => { - // if (containerRefElement) { - // const { scrollHeight, scrollTop, clientHeight } = containerRefElement; - - // //once the user has scrolled within 500px of the bottom of the table, fetch more data if we can - // if ( - // scrollHeight - scrollTop - clientHeight < 500 && - // !isFetching && - // totalFetched < (data?.pages[0].total || 0) - // ) { - // fetchNextPage(); - // } - // } - // }, - // [fetchNextPage, isFetching, totalFetched] - // ); - - // //a check on mount and after a fetch to see if the table is already scrolled to the bottom and immediately needs to fetch more data - // useEffect(() => { - // fetchMoreOnBottomReached(tableContainerRef.current); - // }, [fetchMoreOnBottomReached]); - return ( <> {isLoading ? ( @@ -142,8 +110,6 @@ const Leaderboard = (): JSX.Element => { selectionMode='single' wrapperProps={ { - ref: tableContainerRef as any, - // onScroll: (e: any) => fetchMoreOnBottomReached(e.target as HTMLDivElement), marginTop: '4xl' } as any } diff --git a/apps/evm/src/pages/Fusion/components/QuestOwnerAvatar/QuestOwnerAvatar.tsx b/apps/evm/src/pages/Fusion/components/QuestOwnerAvatar/QuestOwnerAvatar.tsx new file mode 100644 index 000000000..25684a63b --- /dev/null +++ b/apps/evm/src/pages/Fusion/components/QuestOwnerAvatar/QuestOwnerAvatar.tsx @@ -0,0 +1,25 @@ +import { Galxe, Intract } from '@gobob/icons'; +import { Icon, IconProps } from '@gobob/ui'; + +type QuestOwner = 'galxe' | 'intract'; + +const icons: Record = { + galxe: Galxe, + intract: Intract +}; + +type Props = { + name: QuestOwner; +}; + +type InheritAttrs = Omit; + +type QuestOwnerIconProps = Props & InheritAttrs; + +const QuestOwnerIcon = ({ name, ...props }: QuestOwnerIconProps): JSX.Element => { + const Component = icons[name]; + + return ; +}; + +export { QuestOwnerIcon }; diff --git a/apps/evm/src/pages/Fusion/components/QuestOwnerAvatar/index.tsx b/apps/evm/src/pages/Fusion/components/QuestOwnerAvatar/index.tsx new file mode 100644 index 000000000..9b3cd9b4a --- /dev/null +++ b/apps/evm/src/pages/Fusion/components/QuestOwnerAvatar/index.tsx @@ -0,0 +1 @@ +export { QuestOwnerIcon } from './QuestOwnerAvatar'; diff --git a/packages/icons/src/Galxe.tsx b/packages/icons/src/Galxe.tsx new file mode 100644 index 000000000..05115c217 --- /dev/null +++ b/packages/icons/src/Galxe.tsx @@ -0,0 +1,24 @@ +import { forwardRef } from 'react'; +import { Icon, IconProps } from '@gobob/ui'; + +const Galxe = forwardRef((props, ref) => ( + + + + +)); + +Galxe.displayName = 'Galxe'; + +export { Galxe }; diff --git a/packages/icons/src/Intract.tsx b/packages/icons/src/Intract.tsx new file mode 100644 index 000000000..e500b7c23 --- /dev/null +++ b/packages/icons/src/Intract.tsx @@ -0,0 +1,380 @@ +import { forwardRef } from 'react'; +import { Icon, IconProps } from '@gobob/ui'; + +const Intract = forwardRef((props, ref) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +)); + +Intract.displayName = 'Intract'; + +export { Intract }; diff --git a/packages/icons/src/index.ts b/packages/icons/src/index.ts index ca8e2634b..125936af2 100644 --- a/packages/icons/src/index.ts +++ b/packages/icons/src/index.ts @@ -21,3 +21,5 @@ export { BNB } from './BNB'; export { Optimism } from './Optimism'; export { Base } from './Base'; export { Moonbeam } from './Moonbeam'; +export { Galxe } from './Galxe'; +export { Intract } from './Intract'; From 2130b435ded6e07e22451d6ef9816d2be62b9784 Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Mon, 8 Jul 2024 15:52:22 +0100 Subject: [PATCH 02/17] feature: add quest leaderboard api call --- apps/evm/src/utils/api-client.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/evm/src/utils/api-client.ts b/apps/evm/src/utils/api-client.ts index 707bd5401..a77bbfede 100644 --- a/apps/evm/src/utils/api-client.ts +++ b/apps/evm/src/utils/api-client.ts @@ -165,6 +165,12 @@ class ApiClient { return await response.json(); } + async getQuestLeaderboard(limit: number, offset: number): Promise { + const response = await fetch(`${this.baseUrl}/quest-leaderboard?limit=${limit}&offset=${offset}`); + + return await response.json(); + } + async getTvlStats(): Promise { const response = await fetch(`${this.baseUrl}/tvlStats`); From 6b392bf8cdb66dcc223efb696d33bf9bc303b7d9 Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Mon, 8 Jul 2024 16:39:32 +0100 Subject: [PATCH 03/17] feature: wip: filter user/leaderboard quest badges --- .../Fusion/components/Leaderboard/Leaderboard.tsx | 12 ++++++------ apps/evm/src/utils/api-client.ts | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.tsx b/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.tsx index 4a4854926..444f165fc 100644 --- a/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.tsx +++ b/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.tsx @@ -57,10 +57,10 @@ const Leaderboard = (): JSX.Element => { [LeaderboardColumns.RANK]: {item.rank}, [LeaderboardColumns.INVITED_BY]: item.referred_by || '-', [LeaderboardColumns.NAME]: item.username, - [LeaderboardColumns.QUESTS]: ( + [LeaderboardColumns.QUESTS]: item.quests_breakdown && ( - - + {item.quests_breakdown['itxc9y'] && } + {/* */} ), [LeaderboardColumns.SPICE]: Intl.NumberFormat(locale).format(Number(item.total_points)) @@ -80,10 +80,10 @@ const Leaderboard = (): JSX.Element => { invitedBy: user.referred_by, name: user.username, spice: Intl.NumberFormat().format(user.leaderboardRank?.total_reward_points || 0), - quests: ( + quests: user.quests_breakdown && ( - - + {user.quests_breakdown['itxc9y'] && } + {/* */} ), rank: {user.leaderboardRank?.rank || '-'} diff --git a/apps/evm/src/utils/api-client.ts b/apps/evm/src/utils/api-client.ts index a77bbfede..90327499f 100644 --- a/apps/evm/src/utils/api-client.ts +++ b/apps/evm/src/utils/api-client.ts @@ -19,6 +19,7 @@ export type UserResponse = { totalUsdDeposited: number; withdrawStats: any[]; harvested: { partner_name: string; partner_refcode: string; total_points: 'string' }[]; + quests_breakdown: Record; }; type LeaderboardResponse = { @@ -53,6 +54,7 @@ type LeaderboardItem = { total_points: string; username: string; referred_by?: string; + quests_breakdown: Record; }; type TVLStats = { From 0c147b37acbbf2909ad67217d7d7bee01b65b535 Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Mon, 8 Jul 2024 17:00:51 +0100 Subject: [PATCH 04/17] refactor: check quest breakdown and show icon --- .../Fusion/components/Leaderboard/Leaderboard.tsx | 10 +++++----- apps/evm/src/utils/api-client.ts | 5 +++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.tsx b/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.tsx index 444f165fc..02c6811e3 100644 --- a/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.tsx +++ b/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.tsx @@ -4,7 +4,7 @@ import { Flex, Spinner } from '@gobob/ui'; import { useAccount } from '@gobob/wagmi'; import { useLocale } from '@gobob/ui'; -import { apiClient } from '../../../../utils'; +import { QuestRefCodes, apiClient } from '../../../../utils'; import { useGetUser } from '../../../../hooks'; import { QuestOwnerIcon } from '../QuestOwnerAvatar'; @@ -59,8 +59,8 @@ const Leaderboard = (): JSX.Element => { [LeaderboardColumns.NAME]: item.username, [LeaderboardColumns.QUESTS]: item.quests_breakdown && ( - {item.quests_breakdown['itxc9y'] && } - {/* */} + {item.quests_breakdown[QuestRefCodes.GALXE] && } + {item.quests_breakdown[QuestRefCodes.INTRACT] && } ), [LeaderboardColumns.SPICE]: Intl.NumberFormat(locale).format(Number(item.total_points)) @@ -82,8 +82,8 @@ const Leaderboard = (): JSX.Element => { spice: Intl.NumberFormat().format(user.leaderboardRank?.total_reward_points || 0), quests: user.quests_breakdown && ( - {user.quests_breakdown['itxc9y'] && } - {/* */} + {user.quests_breakdown[QuestRefCodes.GALXE] && } + {user.quests_breakdown[QuestRefCodes.INTRACT] && } ), rank: {user.leaderboardRank?.rank || '-'} diff --git a/apps/evm/src/utils/api-client.ts b/apps/evm/src/utils/api-client.ts index 90327499f..c52821f59 100644 --- a/apps/evm/src/utils/api-client.ts +++ b/apps/evm/src/utils/api-client.ts @@ -1,6 +1,11 @@ import { Address } from 'viem'; import { SiweMessage } from 'siwe'; +export enum QuestRefCodes { + GALXE = 'itxc9y', + INTRACT = 'tbc' +} + export type UserResponse = { id: number; username: string; From 8475d7070abc35b74a74d2d34adec546c7e70239 Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Tue, 9 Jul 2024 10:45:43 +0100 Subject: [PATCH 05/17] feature: wip separate leaderboards --- apps/evm/src/pages/Fusion/Fusion.tsx | 7 +- .../Leaderboard/AllUsersLeaderboard.tsx | 83 ++++++++++++ .../components/Leaderboard/Leaderboard.tsx | 125 +++++------------- .../Leaderboard/QuestUsersLeaderboard.tsx | 83 ++++++++++++ .../Fusion/components/Leaderboard/index.tsx | 3 +- apps/evm/src/utils/api-client.ts | 7 +- 6 files changed, 207 insertions(+), 101 deletions(-) create mode 100644 apps/evm/src/pages/Fusion/components/Leaderboard/AllUsersLeaderboard.tsx create mode 100644 apps/evm/src/pages/Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx diff --git a/apps/evm/src/pages/Fusion/Fusion.tsx b/apps/evm/src/pages/Fusion/Fusion.tsx index ee2ab6701..aaa2299d7 100644 --- a/apps/evm/src/pages/Fusion/Fusion.tsx +++ b/apps/evm/src/pages/Fusion/Fusion.tsx @@ -6,9 +6,10 @@ import { useLocalStorage } from '@uidotdev/usehooks'; import { Geoblock, Main } from '../../components'; import { LocalStorageKey } from '../../constants'; -import { Challenges, Dashboard, Info, Leaderboard, PartnersSection } from './components'; +import { Challenges, Dashboard, Info, PartnersSection } from './components'; import { StyledUpdateMark } from './Fusion.style'; import { FusionCarousel } from './components/FusionCarousel'; +import { AllUsersLeaderboard, QuestUsersLeaderboard } from './components/Leaderboard'; const Fusion = () => { const [searchParams, setSearchParams] = useSearchParams(new URLSearchParams('tab=dashboard')); @@ -59,10 +60,10 @@ const Fusion = () => { - + - + { + const { address } = useAccount(); + const id = useId(); + const { locale } = useLocale(); + + const { data: user } = useGetUser(); + + const { data, isLoading } = useQuery({ + queryKey: ['allUsersLeaderboard'], + queryFn: async () => { + const fetchedData = await apiClient.getLeaderboard(100, 0); + + return fetchedData.leaderboard.map((item, idx) => { + return { + id: `${item.deposit_owner}${idx}`, + [LeaderboardColumns.RANK]: {item.rank}, + [LeaderboardColumns.INVITED_BY]: item.referred_by || '-', + [LeaderboardColumns.NAME]: item.username, + [LeaderboardColumns.QUESTS]: item.quests_breakdown && ( + + {item.quests_breakdown[QuestRefCodes.GALXE] && } + {item.quests_breakdown[QuestRefCodes.INTRACT] && } + + ), + [LeaderboardColumns.SPICE]: Intl.NumberFormat(locale).format(Number(item.total_points)) + }; + }); + }, + refetchOnWindowFocus: false, + refetchInterval: INTERVAL.MINUTE + }); + + const flatData: LeaderboardRow[] = useMemo(() => { + const userData = + address && user + ? [ + { + id: userRankKey, + invitedBy: user.referred_by, + name: user.username, + spice: Intl.NumberFormat().format(user.leaderboardRank?.total_reward_points || 0), + quests: user.quests_breakdown && ( + + {user.quests_breakdown[QuestRefCodes.GALXE] && } + {user.quests_breakdown[QuestRefCodes.INTRACT] && } + + ), + rank: {user.leaderboardRank?.rank || '-'} + } + ] + : []; + + return [...userData, ...(data || [])]; + }, [data, address, user]); + + return ( + <> + {isLoading ? ( + + + + ) : ( + + )} + + ); +}; + +export { AllUsersLeaderboard }; diff --git a/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.tsx b/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.tsx index 02c6811e3..9baa4a594 100644 --- a/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.tsx +++ b/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.tsx @@ -1,16 +1,8 @@ -import { INTERVAL, useQuery } from '@gobob/react-query'; -import { ReactNode, useId, useMemo } from 'react'; -import { Flex, Spinner } from '@gobob/ui'; -import { useAccount } from '@gobob/wagmi'; -import { useLocale } from '@gobob/ui'; - -import { QuestRefCodes, apiClient } from '../../../../utils'; -import { useGetUser } from '../../../../hooks'; -import { QuestOwnerIcon } from '../QuestOwnerAvatar'; +import { ReactNode } from 'react'; import { StyledTable } from './Leaderboard.style'; -enum LeaderboardColumns { +export enum LeaderboardColumns { RANK = 'rank', NAME = 'name', INVITED_BY = 'invitedBy', @@ -18,7 +10,7 @@ enum LeaderboardColumns { SPICE = 'spice' } -type LeaderboardRow = { +export type LeaderboardRow = { id: string; [LeaderboardColumns.RANK]: ReactNode; [LeaderboardColumns.NAME]: ReactNode; @@ -27,95 +19,38 @@ type LeaderboardRow = { [LeaderboardColumns.SPICE]: ReactNode; }; -// const fetchSize = 50; - -const userRankKey = 'userRankKey'; - -const Leaderboard = (): JSX.Element => { - const { address } = useAccount(); - const id = useId(); - const { locale } = useLocale(); - - const { data: user } = useGetUser(); +const columns = [ + { name: 'Rank', id: LeaderboardColumns.RANK }, + { name: 'Name', id: LeaderboardColumns.NAME }, + { name: 'Invited By', id: LeaderboardColumns.INVITED_BY }, + { name: 'Quests', id: LeaderboardColumns.QUESTS }, + { name: 'Spice', id: LeaderboardColumns.SPICE } +]; - const columns = [ - { name: 'Rank', id: LeaderboardColumns.RANK }, - { name: 'Name', id: LeaderboardColumns.NAME }, - { name: 'Invited By', id: LeaderboardColumns.INVITED_BY }, - { name: 'Quests', id: LeaderboardColumns.QUESTS }, - { name: 'Spice', id: LeaderboardColumns.SPICE } - ]; - - const { data, isLoading } = useQuery({ - queryKey: ['leaderboard'], - queryFn: async () => { - const fetchedData = await apiClient.getLeaderboard(100, 0); - - return fetchedData.leaderboard.map((item, idx) => { - return { - id: `${item.deposit_owner}${idx}`, - [LeaderboardColumns.RANK]: {item.rank}, - [LeaderboardColumns.INVITED_BY]: item.referred_by || '-', - [LeaderboardColumns.NAME]: item.username, - [LeaderboardColumns.QUESTS]: item.quests_breakdown && ( - - {item.quests_breakdown[QuestRefCodes.GALXE] && } - {item.quests_breakdown[QuestRefCodes.INTRACT] && } - - ), - [LeaderboardColumns.SPICE]: Intl.NumberFormat(locale).format(Number(item.total_points)) - }; - }); - }, - refetchOnWindowFocus: false, - refetchInterval: INTERVAL.MINUTE - }); +type Props = { + id: string; + rows: LeaderboardRow[]; +}; - const flatData: LeaderboardRow[] = useMemo(() => { - const userData = - address && user - ? [ - { - id: userRankKey, - invitedBy: user.referred_by, - name: user.username, - spice: Intl.NumberFormat().format(user.leaderboardRank?.total_reward_points || 0), - quests: user.quests_breakdown && ( - - {user.quests_breakdown[QuestRefCodes.GALXE] && } - {user.quests_breakdown[QuestRefCodes.INTRACT] && } - - ), - rank: {user.leaderboardRank?.rank || '-'} - } - ] - : []; +type LeaderboardProps = Props; - return [...userData, ...(data || [])]; - }, [data, address, user]); +const userRankKey = 'userRankKey'; +const Leaderboard = ({ id, rows }: LeaderboardProps): JSX.Element => { return ( - <> - {isLoading ? ( - - - - ) : ( - - )} - + ); }; diff --git a/apps/evm/src/pages/Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx b/apps/evm/src/pages/Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx new file mode 100644 index 000000000..d4e429598 --- /dev/null +++ b/apps/evm/src/pages/Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx @@ -0,0 +1,83 @@ +import { INTERVAL, useQuery } from '@gobob/react-query'; +import { useId, useMemo } from 'react'; +import { Flex, Spinner } from '@gobob/ui'; +import { useAccount } from '@gobob/wagmi'; +import { useLocale } from '@gobob/ui'; + +import { QuestRefCodes, apiClient } from '../../../../utils'; +import { useGetUser } from '../../../../hooks'; +import { QuestOwnerIcon } from '../QuestOwnerAvatar'; + +import { Leaderboard, LeaderboardColumns, LeaderboardRow } from './Leaderboard'; + +const userRankKey = 'userRankKey'; + +const QuestUsersLeaderboard = (): JSX.Element => { + const { address } = useAccount(); + const id = useId(); + const { locale } = useLocale(); + + const { data: user } = useGetUser(); + + const { data, isLoading } = useQuery({ + queryKey: ['questUsersLeaderboard'], + queryFn: async () => { + const fetchedData = await apiClient.getQuestLeaderboard(100, 0); + + return fetchedData.leaderboard.map((item, idx) => { + return { + id: `${item.deposit_owner}${idx}`, + [LeaderboardColumns.RANK]: {item.rank}, + [LeaderboardColumns.INVITED_BY]: item.referred_by || '-', + [LeaderboardColumns.NAME]: item.username, + [LeaderboardColumns.QUESTS]: item.points_breakdown && ( + + {item.points_breakdown[QuestRefCodes.GALXE] && } + {item.points_breakdown[QuestRefCodes.INTRACT] && } + + ), + [LeaderboardColumns.SPICE]: Intl.NumberFormat(locale).format(Number(item.total_points)) + }; + }); + }, + refetchOnWindowFocus: false, + refetchInterval: INTERVAL.MINUTE + }); + + const flatData: LeaderboardRow[] = useMemo(() => { + const userData = + address && user + ? [ + { + id: userRankKey, + invitedBy: user.referred_by, + name: user.username, + spice: Intl.NumberFormat().format(user.leaderboardRank?.total_quest_points || 0), + quests: user.quests_breakdown && ( + + {user.quests_breakdown[QuestRefCodes.GALXE] && } + {user.quests_breakdown[QuestRefCodes.INTRACT] && } + + ), + rank: {user.leaderboardRank?.rank || '-'} + } + ] + : []; + + return [...userData, ...(data || [])]; + }, [data, address, user]); + + return ( + <> + {isLoading ? ( + + + + ) : ( + + )} + + ); +}; + +export { QuestUsersLeaderboard }; diff --git a/apps/evm/src/pages/Fusion/components/Leaderboard/index.tsx b/apps/evm/src/pages/Fusion/components/Leaderboard/index.tsx index 8ee8d43e0..e45c391f8 100644 --- a/apps/evm/src/pages/Fusion/components/Leaderboard/index.tsx +++ b/apps/evm/src/pages/Fusion/components/Leaderboard/index.tsx @@ -1 +1,2 @@ -export { Leaderboard } from './Leaderboard'; +export { AllUsersLeaderboard } from './AllUsersLeaderboard'; +export { QuestUsersLeaderboard } from './QuestUsersLeaderboard'; diff --git a/apps/evm/src/utils/api-client.ts b/apps/evm/src/utils/api-client.ts index c52821f59..bb5b5ac7f 100644 --- a/apps/evm/src/utils/api-client.ts +++ b/apps/evm/src/utils/api-client.ts @@ -19,12 +19,13 @@ export type UserResponse = { data: any; created_at: Date; updated_at: Date; - leaderboardRank: { user_address: string; total_reward_points: number; rank: number }; + leaderboardRank: { user_address: string; total_reward_points: number; total_quest_points: number; rank: number }; depositStats: any[]; totalUsdDeposited: number; withdrawStats: any[]; harvested: { partner_name: string; partner_refcode: string; total_points: 'string' }[]; quests_breakdown: Record; + total_quest_points: string; }; type LeaderboardResponse = { @@ -57,9 +58,11 @@ type LeaderboardItem = { rank: string; deposit_owner: Address; total_points: string; + total_quest_points: string; username: string; referred_by?: string; - quests_breakdown: Record; + quests_breakdown?: Record; + points_breakdown?: Record; }; type TVLStats = { From adf66da0c6c41bfe8ec56c99e91464f53e665742 Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Tue, 9 Jul 2024 11:26:45 +0100 Subject: [PATCH 06/17] refactor: component imports --- apps/evm/src/pages/Fusion/Fusion.tsx | 12 +++++++++--- apps/evm/src/pages/Fusion/components/index.tsx | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/evm/src/pages/Fusion/Fusion.tsx b/apps/evm/src/pages/Fusion/Fusion.tsx index aaa2299d7..7b8382bd5 100644 --- a/apps/evm/src/pages/Fusion/Fusion.tsx +++ b/apps/evm/src/pages/Fusion/Fusion.tsx @@ -6,10 +6,16 @@ import { useLocalStorage } from '@uidotdev/usehooks'; import { Geoblock, Main } from '../../components'; import { LocalStorageKey } from '../../constants'; -import { Challenges, Dashboard, Info, PartnersSection } from './components'; +import { + AllUsersLeaderboard, + Challenges, + Dashboard, + FusionCarousel, + Info, + PartnersSection, + QuestUsersLeaderboard +} from './components'; import { StyledUpdateMark } from './Fusion.style'; -import { FusionCarousel } from './components/FusionCarousel'; -import { AllUsersLeaderboard, QuestUsersLeaderboard } from './components/Leaderboard'; const Fusion = () => { const [searchParams, setSearchParams] = useSearchParams(new URLSearchParams('tab=dashboard')); diff --git a/apps/evm/src/pages/Fusion/components/index.tsx b/apps/evm/src/pages/Fusion/components/index.tsx index 5634fbc73..353913f55 100644 --- a/apps/evm/src/pages/Fusion/components/index.tsx +++ b/apps/evm/src/pages/Fusion/components/index.tsx @@ -2,6 +2,7 @@ export * from './Challenges'; export * from './Dashboard'; export * from './Info'; export * from './Leaderboard'; +export * from './FusionCarousel'; export * from './LoginSignUp'; export * from './PartnersSection'; export * from './ProjectStatus'; From 41612b3ca2193f944958a16311589890eddd8d87 Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Thu, 1 Aug 2024 10:31:18 +0100 Subject: [PATCH 07/17] chore: add Intract code --- apps/evm/src/utils/api-client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/evm/src/utils/api-client.ts b/apps/evm/src/utils/api-client.ts index bb5b5ac7f..96795c39a 100644 --- a/apps/evm/src/utils/api-client.ts +++ b/apps/evm/src/utils/api-client.ts @@ -3,7 +3,7 @@ import { SiweMessage } from 'siwe'; export enum QuestRefCodes { GALXE = 'itxc9y', - INTRACT = 'tbc' + INTRACT = '6y2pac' } export type UserResponse = { From a735341bc9a0248526adc841948e2b26852d15a5 Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Thu, 1 Aug 2024 11:49:52 +0100 Subject: [PATCH 08/17] refactor: add quest projects --- .../PartnersSection/PartnerSection.tsx | 55 +++++++++++++++---- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx b/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx index 236a5dec8..706d7a9bf 100644 --- a/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx +++ b/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx @@ -25,16 +25,11 @@ const PartnersSection = () => { queryFn: async () => { const partnerData = await apiClient.getPartners(); - return ( - partnerData.partners - // NOTE: Remove category check when adding quest project cards - .filter((result) => result.show_on_app_store && result.category.toLowerCase() !== 'quests') - .sort( - (a, b) => - // partner.live property is a boolean - Number(!!b.live) - Number(!!a.live) || - Number(b.points_distributed_per_hour) - Number(a.points_distributed_per_hour) - ) + return partnerData.partners.sort( + (a, b) => + // partner.live property is a boolean + Number(!!b.live) - Number(!!a.live) || + Number(b.points_distributed_per_hour) - Number(a.points_distributed_per_hour) ); }, refetchOnWindowFocus: false, @@ -42,11 +37,24 @@ const PartnersSection = () => { refetchOnMount: false }); + // Return quest projects + const questPartners = useMemo( + () => + partners?.filter((result) => result.show_on_app_store && result.category.toLowerCase() === 'quests').slice(0, 3), + [partners] + ); + + // Return all other projects + const otherPartners = useMemo( + () => partners?.filter((result) => result.show_on_app_store && result.category.toLowerCase() !== 'quests'), + [partners] + ); + // Return top 3 projects - const topHarvesters = useMemo(() => partners?.slice(0, 3), [partners]); + const topHarvesters = useMemo(() => otherPartners?.slice(0, 3), [otherPartners]); // Return remaining projects - const otherHavesters = useMemo(() => partners?.slice(3), [partners]); + const otherHavesters = useMemo(() => otherPartners?.slice(3), [otherPartners]); const getHarvest = useCallback( (refCode: string) => { @@ -85,6 +93,29 @@ const PartnersSection = () => { ) : ( <> +

+ Quest Projects +

+ + {questPartners?.map((item, idx) => ( + + ))} +

Top Harvesters

From 7fdeb401455eb6958e3ca6dec0fd4beabde21476 Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Thu, 1 Aug 2024 16:19:12 +0100 Subject: [PATCH 09/17] chore: fix id properties --- .../pages/Fusion/components/Leaderboard/AllUsersLeaderboard.tsx | 2 +- .../Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/evm/src/pages/Fusion/components/Leaderboard/AllUsersLeaderboard.tsx b/apps/evm/src/pages/Fusion/components/Leaderboard/AllUsersLeaderboard.tsx index 10211fa5d..7f9845fe7 100644 --- a/apps/evm/src/pages/Fusion/components/Leaderboard/AllUsersLeaderboard.tsx +++ b/apps/evm/src/pages/Fusion/components/Leaderboard/AllUsersLeaderboard.tsx @@ -26,7 +26,7 @@ const AllUsersLeaderboard = (): JSX.Element => { return fetchedData.leaderboard.map((item, idx) => { return { - id: `${item.deposit_owner}${idx}`, + id: `${item.username}${idx}`, [LeaderboardColumns.RANK]: {item.rank}, [LeaderboardColumns.INVITED_BY]: item.referred_by || '-', [LeaderboardColumns.NAME]: item.username, diff --git a/apps/evm/src/pages/Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx b/apps/evm/src/pages/Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx index d4e429598..15e994e3b 100644 --- a/apps/evm/src/pages/Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx +++ b/apps/evm/src/pages/Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx @@ -26,7 +26,7 @@ const QuestUsersLeaderboard = (): JSX.Element => { return fetchedData.leaderboard.map((item, idx) => { return { - id: `${item.deposit_owner}${idx}`, + id: `${item.username}${idx}`, [LeaderboardColumns.RANK]: {item.rank}, [LeaderboardColumns.INVITED_BY]: item.referred_by || '-', [LeaderboardColumns.NAME]: item.username, From 335456308f731be0dc4d5a335ecd1e4b6181c393 Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Thu, 1 Aug 2024 16:20:47 +0100 Subject: [PATCH 10/17] fix: typo --- .../Fusion/components/PartnersSection/PartnerSection.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx b/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx index 706d7a9bf..06efea39e 100644 --- a/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx +++ b/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx @@ -54,7 +54,7 @@ const PartnersSection = () => { const topHarvesters = useMemo(() => otherPartners?.slice(0, 3), [otherPartners]); // Return remaining projects - const otherHavesters = useMemo(() => otherPartners?.slice(3), [otherPartners]); + const otherHarvesters = useMemo(() => otherPartners?.slice(3), [otherPartners]); const getHarvest = useCallback( (refCode: string) => { @@ -144,7 +144,7 @@ const PartnersSection = () => { Other Harvesters - {otherHavesters?.map((item, idx) => ( + {otherHarvesters?.map((item, idx) => ( Date: Fri, 2 Aug 2024 11:59:15 +0100 Subject: [PATCH 11/17] refactor: fixed badge positions --- .../components/Leaderboard/Leaderboard.style.tsx | 10 ++++++++-- .../Leaderboard/QuestUsersLeaderboard.tsx | 13 +++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.style.tsx b/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.style.tsx index 849b681d6..9a651d168 100644 --- a/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.style.tsx +++ b/apps/evm/src/pages/Fusion/components/Leaderboard/Leaderboard.style.tsx @@ -1,8 +1,14 @@ -import { Table } from '@gobob/ui'; +import { Span, Table } from '@gobob/ui'; import styled from 'styled-components'; +const StyledGrid = styled(Span)` + display: grid; + grid-template-columns: 1fr 1fr; + width: 80px; +`; + const StyledTable = styled(Table)` max-height: calc(100dvh - 13rem); `; -export { StyledTable }; +export { StyledGrid, StyledTable }; diff --git a/apps/evm/src/pages/Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx b/apps/evm/src/pages/Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx index 15e994e3b..abc4632f1 100644 --- a/apps/evm/src/pages/Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx +++ b/apps/evm/src/pages/Fusion/components/Leaderboard/QuestUsersLeaderboard.tsx @@ -9,6 +9,7 @@ import { useGetUser } from '../../../../hooks'; import { QuestOwnerIcon } from '../QuestOwnerAvatar'; import { Leaderboard, LeaderboardColumns, LeaderboardRow } from './Leaderboard'; +import { StyledGrid } from './Leaderboard.style'; const userRankKey = 'userRankKey'; @@ -31,10 +32,14 @@ const QuestUsersLeaderboard = (): JSX.Element => { [LeaderboardColumns.INVITED_BY]: item.referred_by || '-', [LeaderboardColumns.NAME]: item.username, [LeaderboardColumns.QUESTS]: item.points_breakdown && ( - - {item.points_breakdown[QuestRefCodes.GALXE] && } - {item.points_breakdown[QuestRefCodes.INTRACT] && } - + + {item.points_breakdown[QuestRefCodes.GALXE] && ( + + )} + {item.points_breakdown[QuestRefCodes.INTRACT] && ( + + )} + ), [LeaderboardColumns.SPICE]: Intl.NumberFormat(locale).format(Number(item.total_points)) }; From 108c721daccedb4f2e86aedeb44a1557ac6fdfb1 Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Fri, 2 Aug 2024 12:00:34 +0100 Subject: [PATCH 12/17] refactor: fixed badge position on all users leaderboard --- .../components/Leaderboard/AllUsersLeaderboard.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/evm/src/pages/Fusion/components/Leaderboard/AllUsersLeaderboard.tsx b/apps/evm/src/pages/Fusion/components/Leaderboard/AllUsersLeaderboard.tsx index 7f9845fe7..6271010c3 100644 --- a/apps/evm/src/pages/Fusion/components/Leaderboard/AllUsersLeaderboard.tsx +++ b/apps/evm/src/pages/Fusion/components/Leaderboard/AllUsersLeaderboard.tsx @@ -9,6 +9,7 @@ import { useGetUser } from '../../../../hooks'; import { QuestOwnerIcon } from '../QuestOwnerAvatar'; import { Leaderboard, LeaderboardColumns, LeaderboardRow } from './Leaderboard'; +import { StyledGrid } from './Leaderboard.style'; const userRankKey = 'userRankKey'; @@ -31,10 +32,14 @@ const AllUsersLeaderboard = (): JSX.Element => { [LeaderboardColumns.INVITED_BY]: item.referred_by || '-', [LeaderboardColumns.NAME]: item.username, [LeaderboardColumns.QUESTS]: item.quests_breakdown && ( - - {item.quests_breakdown[QuestRefCodes.GALXE] && } - {item.quests_breakdown[QuestRefCodes.INTRACT] && } - + + {item.quests_breakdown[QuestRefCodes.GALXE] && ( + + )} + {item.quests_breakdown[QuestRefCodes.INTRACT] && ( + + )} + ), [LeaderboardColumns.SPICE]: Intl.NumberFormat(locale).format(Number(item.total_points)) }; From 2a2fb5f7ab019d6bf8b9302207e871b6e80ad60f Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Fri, 2 Aug 2024 12:54:38 +0100 Subject: [PATCH 13/17] refactor: update copy and move Intract banner to Bridge carousel --- .../src/assets/locales/en/translation.json | 4 +- .../BannerCarousel/BannerCarousel.style.tsx | 38 +++++++++++++++- .../BannerCarousel/BannerCarousel.tsx | 2 + .../BannerCarousel}/IntractBanner.tsx | 4 +- apps/evm/src/pages/Fusion/Fusion.tsx | 11 +---- .../components/IntractBanner/Banner.tsx | 9 ---- .../IntractBanner/IntractBanner.style.tsx | 43 ------------------- .../Fusion/components/IntractBanner/index.tsx | 1 - .../evm/src/pages/Fusion/components/index.tsx | 1 - 9 files changed, 44 insertions(+), 69 deletions(-) rename apps/evm/src/pages/{Fusion/components/IntractBanner => Bridge/components/BannerCarousel}/IntractBanner.tsx (82%) delete mode 100644 apps/evm/src/pages/Fusion/components/IntractBanner/Banner.tsx delete mode 100644 apps/evm/src/pages/Fusion/components/IntractBanner/IntractBanner.style.tsx delete mode 100644 apps/evm/src/pages/Fusion/components/IntractBanner/index.tsx diff --git a/apps/evm/src/assets/locales/en/translation.json b/apps/evm/src/assets/locales/en/translation.json index 91c1f519e..29579f5d1 100644 --- a/apps/evm/src/assets/locales/en/translation.json +++ b/apps/evm/src/assets/locales/en/translation.json @@ -52,12 +52,12 @@ }, "partners": { "title": "Ecosystem", - "content": "Explore and interact with BOB Fusion allies to embark on unique adventures and supercharge your Spice accrual.", + "content": "Explore and interact with BOB Fusion allies.", "alert": "Projects harvest Spice points every hour based on TVL and user activity. Projects are responsible for distributing Spice to their users. Distribution method and frequency may differ from project to project. DYOR." }, "challenges": { "title": "Challenges", - "content": "Participate in our educational quests to learn more about BOB, leverage your network to spread the word about BOB, get to know the projects. Any successful participation will help you climb the leaderboard even quicker. View challenges at Intract." + "content": "Participate in our educational quests and climb the leaderboard. View challenges at Intract." }, "ecosystem": { "title": "Ecosystem", diff --git a/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.style.tsx b/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.style.tsx index 704c1a3b4..a6be70078 100644 --- a/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.style.tsx +++ b/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.style.tsx @@ -102,6 +102,40 @@ const StyledOnrampBanner = styled(Banner)` }} `; +const StyledPressableBanner = styled(Banner)` + background-image: url(${getImageUrl('cubs-group.svg')}); + background-repeat: no-repeat; + background-size: cover; + + position: relative; + + ${({ theme }) => { + return css` + background-position: 70% 50%; + + @media ${theme.breakpoints.up('s')} { + background-position: 0% 50%; + } + `; + }} +`; + +const StyledIntractBannerImg = styled.img` + ${({ theme }) => { + return css` + height: 4rem; + + @media ${theme.breakpoints.down('s')} { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + opacity: 0.2; + } + `; + }} +`; + const StyledOnrampGraphic = styled(OnrampGraphic)` ${({ theme }) => { return css` @@ -130,5 +164,7 @@ export { StyledOnrampGraphic, StyledBannerContent, StyledBanner, - StyledBannerImg + StyledBannerImg, + StyledPressableBanner, + StyledIntractBannerImg }; diff --git a/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.tsx b/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.tsx index 5ce439bba..2fba64142 100644 --- a/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.tsx +++ b/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.tsx @@ -7,6 +7,7 @@ import { useTheme } from 'styled-components'; import { EcosystemBanner } from './EcosystemBanner'; import { StyledCarouselWrapper, StyledSlider } from './BannerCarousel.style'; import { OnrampBanner } from './OnrampBanner'; +import { IntractBanner } from './IntractBanner'; const settings: Settings = { dots: true, @@ -44,6 +45,7 @@ const BannerCarousel = ({ onPressOnrampBanner, onPressEcosystemBanner }: BannerC + ); diff --git a/apps/evm/src/pages/Fusion/components/IntractBanner/IntractBanner.tsx b/apps/evm/src/pages/Bridge/components/BannerCarousel/IntractBanner.tsx similarity index 82% rename from apps/evm/src/pages/Fusion/components/IntractBanner/IntractBanner.tsx rename to apps/evm/src/pages/Bridge/components/BannerCarousel/IntractBanner.tsx index b6a344a5a..0e272fbb1 100644 --- a/apps/evm/src/pages/Fusion/components/IntractBanner/IntractBanner.tsx +++ b/apps/evm/src/pages/Bridge/components/BannerCarousel/IntractBanner.tsx @@ -2,7 +2,7 @@ import { Flex, H1, P } from '@gobob/ui'; import bannerSrc from '../../../../assets/intract-logo.png'; -import { StyledBannerImg, StyledPressableBanner } from './IntractBanner.style'; +import { StyledIntractBannerImg, StyledPressableBanner } from './BannerCarousel.style'; const IntractBanner = () => ( (

Complete quests to boost your Spice earnings

- +
); diff --git a/apps/evm/src/pages/Fusion/Fusion.tsx b/apps/evm/src/pages/Fusion/Fusion.tsx index af9088dd4..a59aa0b6c 100644 --- a/apps/evm/src/pages/Fusion/Fusion.tsx +++ b/apps/evm/src/pages/Fusion/Fusion.tsx @@ -6,15 +6,7 @@ import { useLocalStorage } from '@uidotdev/usehooks'; import { Geoblock, Main } from '../../components'; import { LocalStorageKey } from '../../constants'; -import { - AllUsersLeaderboard, - Challenges, - Dashboard, - Info, - IntractBanner, - PartnersSection, - QuestUsersLeaderboard -} from './components'; +import { AllUsersLeaderboard, Challenges, Dashboard, Info, PartnersSection, QuestUsersLeaderboard } from './components'; import { StyledUpdateMark } from './Fusion.style'; const Fusion = () => { @@ -60,7 +52,6 @@ const Fusion = () => { - diff --git a/apps/evm/src/pages/Fusion/components/IntractBanner/Banner.tsx b/apps/evm/src/pages/Fusion/components/IntractBanner/Banner.tsx deleted file mode 100644 index ba0d39c4f..000000000 --- a/apps/evm/src/pages/Fusion/components/IntractBanner/Banner.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { Card, CardProps } from '@gobob/ui'; - -type BannerProps = CardProps; - -const Banner = (props: BannerProps) => { - return ; -}; - -export { Banner }; diff --git a/apps/evm/src/pages/Fusion/components/IntractBanner/IntractBanner.style.tsx b/apps/evm/src/pages/Fusion/components/IntractBanner/IntractBanner.style.tsx deleted file mode 100644 index 8bb0b8848..000000000 --- a/apps/evm/src/pages/Fusion/components/IntractBanner/IntractBanner.style.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import styled, { css } from 'styled-components'; - -import { Banner } from './Banner'; - -function getImageUrl(name: string) { - return new URL(`../../../../assets/${name}`, import.meta.url).href; -} - -const StyledBannerImg = styled.img` - ${({ theme }) => { - return css` - height: 4rem; - - @media ${theme.breakpoints.down('s')} { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - opacity: 0.2; - } - `; - }} -`; - -const StyledPressableBanner = styled(Banner)` - background-image: url(${getImageUrl('cubs-group.svg')}); - background-repeat: no-repeat; - background-size: cover; - - position: relative; - - ${({ theme }) => { - return css` - background-position: 70% 50%; - - @media ${theme.breakpoints.up('s')} { - background-position: 0% 50%; - } - `; - }} -`; - -export { StyledPressableBanner, StyledBannerImg }; diff --git a/apps/evm/src/pages/Fusion/components/IntractBanner/index.tsx b/apps/evm/src/pages/Fusion/components/IntractBanner/index.tsx deleted file mode 100644 index 69461356b..000000000 --- a/apps/evm/src/pages/Fusion/components/IntractBanner/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { IntractBanner } from './IntractBanner'; diff --git a/apps/evm/src/pages/Fusion/components/index.tsx b/apps/evm/src/pages/Fusion/components/index.tsx index 10b070247..5634fbc73 100644 --- a/apps/evm/src/pages/Fusion/components/index.tsx +++ b/apps/evm/src/pages/Fusion/components/index.tsx @@ -2,7 +2,6 @@ export * from './Challenges'; export * from './Dashboard'; export * from './Info'; export * from './Leaderboard'; -export * from './IntractBanner'; export * from './LoginSignUp'; export * from './PartnersSection'; export * from './ProjectStatus'; From a910335ee39f717d224bf101656fabf8ca1ac34a Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Fri, 2 Aug 2024 13:12:27 +0100 Subject: [PATCH 14/17] refactor: combine partner and challenges section --- apps/evm/src/pages/Fusion/Fusion.tsx | 5 +- .../components/Challenges/Challenges.tsx | 30 --- .../Fusion/components/Challenges/index.tsx | 1 - .../Fusion/components/Dashboard/Dashboard.tsx | 2 +- .../PartnerCard.style.tsx | 0 .../PartnerCard.tsx | 0 .../PartnersAndChallenges.tsx | 196 ++++++++++++++++++ .../PartnersAndChallenges/index.tsx | 1 + .../PartnersSection/PartnerSection.tsx | 178 ---------------- .../components/PartnersSection/index.tsx | 1 - .../evm/src/pages/Fusion/components/index.tsx | 3 +- 11 files changed, 201 insertions(+), 216 deletions(-) delete mode 100644 apps/evm/src/pages/Fusion/components/Challenges/Challenges.tsx delete mode 100644 apps/evm/src/pages/Fusion/components/Challenges/index.tsx rename apps/evm/src/pages/Fusion/components/{PartnersSection => PartnersAndChallenges}/PartnerCard.style.tsx (100%) rename apps/evm/src/pages/Fusion/components/{PartnersSection => PartnersAndChallenges}/PartnerCard.tsx (100%) create mode 100644 apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnersAndChallenges.tsx create mode 100644 apps/evm/src/pages/Fusion/components/PartnersAndChallenges/index.tsx delete mode 100644 apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx delete mode 100644 apps/evm/src/pages/Fusion/components/PartnersSection/index.tsx diff --git a/apps/evm/src/pages/Fusion/Fusion.tsx b/apps/evm/src/pages/Fusion/Fusion.tsx index a59aa0b6c..97bff3b5c 100644 --- a/apps/evm/src/pages/Fusion/Fusion.tsx +++ b/apps/evm/src/pages/Fusion/Fusion.tsx @@ -6,7 +6,7 @@ import { useLocalStorage } from '@uidotdev/usehooks'; import { Geoblock, Main } from '../../components'; import { LocalStorageKey } from '../../constants'; -import { AllUsersLeaderboard, Challenges, Dashboard, Info, PartnersSection, QuestUsersLeaderboard } from './components'; +import { AllUsersLeaderboard, Dashboard, Info, PartnersAndChallenges, QuestUsersLeaderboard } from './components'; import { StyledUpdateMark } from './Fusion.style'; const Fusion = () => { @@ -52,8 +52,7 @@ const Fusion = () => { - - + diff --git a/apps/evm/src/pages/Fusion/components/Challenges/Challenges.tsx b/apps/evm/src/pages/Fusion/components/Challenges/Challenges.tsx deleted file mode 100644 index 2ac20daa6..000000000 --- a/apps/evm/src/pages/Fusion/components/Challenges/Challenges.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { H2, P, Flex, TextLink } from '@gobob/ui'; -import { Trans, useTranslation } from 'react-i18next'; - -const Challenges = () => { - const { t } = useTranslation(); - - return ( - -

- {t('fusion.challenges.title')} -

-

- - ) - }} - i18nKey='fusion.challenges.content' - /> -

-
- ); -}; - -export { Challenges }; diff --git a/apps/evm/src/pages/Fusion/components/Challenges/index.tsx b/apps/evm/src/pages/Fusion/components/Challenges/index.tsx deleted file mode 100644 index d5353fa17..000000000 --- a/apps/evm/src/pages/Fusion/components/Challenges/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { Challenges } from './Challenges'; diff --git a/apps/evm/src/pages/Fusion/components/Dashboard/Dashboard.tsx b/apps/evm/src/pages/Fusion/components/Dashboard/Dashboard.tsx index 6604fbfc4..b1823962c 100644 --- a/apps/evm/src/pages/Fusion/components/Dashboard/Dashboard.tsx +++ b/apps/evm/src/pages/Fusion/components/Dashboard/Dashboard.tsx @@ -5,7 +5,7 @@ import { useMemo } from 'react'; import { useGetUser } from '../../../../hooks'; import { LoginSignUp } from '../LoginSignUp'; -import { StyledCard } from '../PartnersSection/PartnerCard.style'; +import { StyledCard } from '../PartnersAndChallenges/PartnerCard.style'; import { ProjectStatus } from '../ProjectStatus'; import { UserStats } from '../UserStats'; import { useHaltedLockedTokens } from '../../hooks'; diff --git a/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerCard.style.tsx b/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnerCard.style.tsx similarity index 100% rename from apps/evm/src/pages/Fusion/components/PartnersSection/PartnerCard.style.tsx rename to apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnerCard.style.tsx diff --git a/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerCard.tsx b/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnerCard.tsx similarity index 100% rename from apps/evm/src/pages/Fusion/components/PartnersSection/PartnerCard.tsx rename to apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnerCard.tsx diff --git a/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnersAndChallenges.tsx b/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnersAndChallenges.tsx new file mode 100644 index 000000000..985743cb6 --- /dev/null +++ b/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnersAndChallenges.tsx @@ -0,0 +1,196 @@ +import { INTERVAL, useQuery } from '@gobob/react-query'; +import { Flex, H2, H3, InformationCircle, P, Spinner, TextLink, useLocale } from '@gobob/ui'; +import { Trans, useTranslation } from 'react-i18next'; +import { useCallback, useMemo } from 'react'; + +import { useGetUser } from '../../../../hooks'; +import { apiClient } from '../../../../utils'; + +import { PartnerCard } from './PartnerCard'; +import { StyledCard, StyledGrid } from './PartnerCard.style'; + +function getImageUrl(name: string) { + return new URL(`../../../../assets/partners/${name.split(' ').join('').toLowerCase()}.png`, import.meta.url).href; +} + +const PartnersAndChallenges = () => { + const { locale } = useLocale(); + + const { data: user } = useGetUser(); + + const { t } = useTranslation(); + + const { data: partners, isLoading } = useQuery({ + queryKey: ['partners'], + queryFn: async () => { + const partnerData = await apiClient.getPartners(); + + return partnerData.partners.sort( + (a, b) => + // partner.live property is a boolean + Number(!!b.live) - Number(!!a.live) || + Number(b.points_distributed_per_hour) - Number(a.points_distributed_per_hour) + ); + }, + refetchOnWindowFocus: false, + gcTime: INTERVAL.HOUR, + refetchOnMount: false + }); + + // Return quest projects + const questPartners = useMemo( + () => + partners?.filter((result) => result.show_on_app_store && result.category.toLowerCase() === 'quests').slice(0, 3), + [partners] + ); + + // Return all other projects + const otherPartners = useMemo( + () => partners?.filter((result) => result.show_on_app_store && result.category.toLowerCase() !== 'quests'), + [partners] + ); + + // Return top 3 projects + const topHarvesters = useMemo(() => otherPartners?.slice(0, 3), [otherPartners]); + + // Return remaining projects + const otherHarvesters = useMemo(() => otherPartners?.slice(3), [otherPartners]); + + const getHarvest = useCallback( + (refCode: string) => { + const harvest = user?.harvested?.find((partner: any) => partner.partner_refcode === refCode); + + return harvest + ? Intl.NumberFormat(locale, { maximumFractionDigits: 2, notation: 'compact' }).format( + Number(harvest.total_points) + ) + : '-'; + }, + [locale, user] + ); + + const getMedal = (position: number) => { + // NOTE: Projects are sorted so this is a check against the index + switch (position) { + case 0: + return 'gold'; + case 1: + return 'silver'; + case 2: + return 'bronze'; + } + }; + + return ( + + {isLoading ? ( + + + + ) : ( + + +

+ {t('fusion.challenges.title')} +

+

+ + ) + }} + i18nKey='fusion.challenges.content' + /> +

+ + {questPartners?.map((item, idx) => ( + + ))} + +
+ +

+ {t('fusion.partners.title')} +

+

{t('fusion.partners.content')}

+

+ Top Harvesters +

+ + {topHarvesters?.map((item, idx) => ( + + ))} + +

+ Other Harvesters +

+ + {otherHarvesters?.map((item, idx) => ( + + ))} + +
+
+ )} + + +

+ {t('fusion.partners.alert')} +

+
+
+ ); +}; + +export { PartnersAndChallenges }; diff --git a/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/index.tsx b/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/index.tsx new file mode 100644 index 000000000..daa78d476 --- /dev/null +++ b/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/index.tsx @@ -0,0 +1 @@ +export { PartnersAndChallenges } from './PartnersAndChallenges'; diff --git a/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx b/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx deleted file mode 100644 index 06efea39e..000000000 --- a/apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx +++ /dev/null @@ -1,178 +0,0 @@ -import { INTERVAL, useQuery } from '@gobob/react-query'; -import { Flex, H2, H3, InformationCircle, P, Spinner, useLocale } from '@gobob/ui'; -import { useTranslation } from 'react-i18next'; -import { useCallback, useMemo } from 'react'; - -import { useGetUser } from '../../../../hooks'; -import { apiClient } from '../../../../utils'; - -import { PartnerCard } from './PartnerCard'; -import { StyledCard, StyledGrid } from './PartnerCard.style'; - -function getImageUrl(name: string) { - return new URL(`../../../../assets/partners/${name.split(' ').join('').toLowerCase()}.png`, import.meta.url).href; -} - -const PartnersSection = () => { - const { locale } = useLocale(); - - const { data: user } = useGetUser(); - - const { t } = useTranslation(); - - const { data: partners, isLoading } = useQuery({ - queryKey: ['partners'], - queryFn: async () => { - const partnerData = await apiClient.getPartners(); - - return partnerData.partners.sort( - (a, b) => - // partner.live property is a boolean - Number(!!b.live) - Number(!!a.live) || - Number(b.points_distributed_per_hour) - Number(a.points_distributed_per_hour) - ); - }, - refetchOnWindowFocus: false, - gcTime: INTERVAL.HOUR, - refetchOnMount: false - }); - - // Return quest projects - const questPartners = useMemo( - () => - partners?.filter((result) => result.show_on_app_store && result.category.toLowerCase() === 'quests').slice(0, 3), - [partners] - ); - - // Return all other projects - const otherPartners = useMemo( - () => partners?.filter((result) => result.show_on_app_store && result.category.toLowerCase() !== 'quests'), - [partners] - ); - - // Return top 3 projects - const topHarvesters = useMemo(() => otherPartners?.slice(0, 3), [otherPartners]); - - // Return remaining projects - const otherHarvesters = useMemo(() => otherPartners?.slice(3), [otherPartners]); - - const getHarvest = useCallback( - (refCode: string) => { - const harvest = user?.harvested?.find((partner: any) => partner.partner_refcode === refCode); - - return harvest - ? Intl.NumberFormat(locale, { maximumFractionDigits: 2, notation: 'compact' }).format( - Number(harvest.total_points) - ) - : '-'; - }, - [locale, user] - ); - - const getMedal = (position: number) => { - // NOTE: Projects are sorted so this is a check against the index - switch (position) { - case 0: - return 'gold'; - case 1: - return 'silver'; - case 2: - return 'bronze'; - } - }; - - return ( - -

- {t('fusion.partners.title')} -

-

{t('fusion.partners.content')}

- {isLoading ? ( - - - - ) : ( - <> -

- Quest Projects -

- - {questPartners?.map((item, idx) => ( - - ))} - -

- Top Harvesters -

- - {topHarvesters?.map((item, idx) => ( - - ))} - -

- Other Harvesters -

- - {otherHarvesters?.map((item, idx) => ( - - ))} - - - )} - - -

- {t('fusion.partners.alert')} -

-
-
- ); -}; - -export { PartnersSection }; diff --git a/apps/evm/src/pages/Fusion/components/PartnersSection/index.tsx b/apps/evm/src/pages/Fusion/components/PartnersSection/index.tsx deleted file mode 100644 index bcb29ee88..000000000 --- a/apps/evm/src/pages/Fusion/components/PartnersSection/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { PartnersSection } from './PartnerSection'; diff --git a/apps/evm/src/pages/Fusion/components/index.tsx b/apps/evm/src/pages/Fusion/components/index.tsx index 5634fbc73..b82ac8f55 100644 --- a/apps/evm/src/pages/Fusion/components/index.tsx +++ b/apps/evm/src/pages/Fusion/components/index.tsx @@ -1,9 +1,8 @@ -export * from './Challenges'; export * from './Dashboard'; export * from './Info'; export * from './Leaderboard'; export * from './LoginSignUp'; -export * from './PartnersSection'; +export * from './PartnersAndChallenges'; export * from './ProjectStatus'; export * from './UserStats'; export * from './WithdrawModal'; From 7df3137a8483c48c1dbbc0528aa587f9143a2faa Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Fri, 2 Aug 2024 13:30:16 +0100 Subject: [PATCH 15/17] refactor: reduce spacing --- apps/evm/src/pages/Fusion/Fusion.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/evm/src/pages/Fusion/Fusion.tsx b/apps/evm/src/pages/Fusion/Fusion.tsx index 97bff3b5c..0d5c1658b 100644 --- a/apps/evm/src/pages/Fusion/Fusion.tsx +++ b/apps/evm/src/pages/Fusion/Fusion.tsx @@ -50,7 +50,7 @@ const Fusion = () => {
- + From d253d073b917be3f05d91a88d907df06b6a46c5a Mon Sep 17 00:00:00 2001 From: Tom Jeatt Date: Mon, 12 Aug 2024 11:10:26 +0100 Subject: [PATCH 16/17] Merge branch 'main' into feat/leaderboard-update-quests * main: feat(evm): add merlin and bitlayer (#105) refactor(evm): replace ecosystem img (#104) feat(evm): fix minor ui issues (#102) feat(evm): add t token (#101) feat: add new bob-sepolia (#97) chore: stop indexing custom wseth bridge (#100) Feat/rebranding (#48) chore: add new testnet subgraph bridge configs (#96) refactor(evm): replace sign-up twitter follow link (#95) # Conflicts: # apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.style.tsx # apps/evm/src/pages/Bridge/components/BannerCarousel/IntractBanner.tsx # apps/evm/src/pages/Fusion/components/Challenges/Challenges.tsx # apps/evm/src/pages/Fusion/components/Dashboard/Dashboard.tsx # apps/evm/src/pages/Fusion/components/IntractBanner/Banner.tsx # apps/evm/src/pages/Fusion/components/IntractBanner/IntractBanner.style.tsx # apps/evm/src/pages/Fusion/components/PartnersSection/PartnerSection.tsx # packages/icons/src/index.ts --- .storybook/main.ts | 2 +- .storybook/vite.config.ts | 23 ++ apps/evm/index.html | 16 +- apps/evm/public/android-chrome-192x192.png | Bin 0 -> 18630 bytes apps/evm/public/android-chrome-512x512.png | Bin 0 -> 85996 bytes apps/evm/public/apple-touch-icon.png | Bin 0 -> 16962 bytes apps/evm/public/favicon-16x16.png | Bin 0 -> 625 bytes apps/evm/public/favicon-32x32.png | Bin 0 -> 1248 bytes apps/evm/public/favicon.ico | Bin 0 -> 15406 bytes apps/evm/public/site.webmanifest | 11 + apps/evm/src/App.tsx | 46 ++-- apps/evm/src/assets/ecosystem-banner.png | Bin 219678 -> 0 bytes apps/evm/src/components/Auditors/Auditors.tsx | 2 +- apps/evm/src/components/AuthCard/AuthCard.tsx | 3 - .../src/components/ChainLogo/ChainLogo.tsx | 7 +- apps/evm/src/components/Layout/Header.tsx | 2 +- .../src/components/Layout/Layout.style.tsx | 4 +- .../ReferralInput/ReferralInput.style.tsx | 19 +- .../ReferralInput/ReferralInput.tsx | 9 +- .../TransactionDetails.style.tsx | 4 +- .../TransactionDetails/TransactionDetails.tsx | 36 ++- apps/evm/src/constants/assets.ts | 105 ++++++-- apps/evm/src/constants/chain.ts | 28 +- apps/evm/src/index.css | 1 + apps/evm/src/indexer/bridge/README.md | 6 +- .../bridge/new_testnet_bridge_deposits.json | 24 ++ .../bridge/new_testnet_bridge_withdraws.json | 24 ++ apps/evm/src/main.tsx | 22 +- apps/evm/src/pages/Bridge/Bridge.style.tsx | 20 +- apps/evm/src/pages/Bridge/Bridge.tsx | 20 +- .../components/BannerCarousel/Banner.tsx | 2 +- .../BannerCarousel/BannerCarousel.style.tsx | 113 ++++---- .../BannerCarousel/BannerCarousel.tsx | 33 ++- .../BannerCarousel/EcosystemBanner.tsx | 8 +- .../BannerCarousel/EcosystemImg.tsx | 249 ++++++++++++++++++ .../BannerCarousel/IntractBanner.tsx | 9 +- .../BannerCarousel/OnrampBanner.tsx | 11 +- .../components/BridgeForm/BobBridgeForm.tsx | 31 +-- .../components/BridgeForm/BridgeAlert.tsx | 6 +- .../BridgeForm/BridgeForm.style.tsx | 35 ++- .../components/BridgeForm/BridgeForm.tsx | 42 ++- .../components/BridgeForm/BtcBridgeForm.tsx | 9 +- .../BridgeStatus/BridgeStatus.style.tsx | 8 +- .../ChainSelect/ChainSelect.style.tsx | 6 - .../components/ChainSelect/ChainSelect.tsx | 8 +- .../ExternalBridgeForm/ExternalBridgeCard.tsx | 36 +-- .../ExternalBridgeForm.style.tsx | 17 -- .../ExternalBridgeForm/ExternalBridgeForm.tsx | 49 +--- .../TransactionList/TransactionDetails.tsx | 8 +- .../TransactionList/TransactionList.style.tsx | 10 +- .../TransactionList/TransactionList.tsx | 14 +- .../BridgeTransactionModal.tsx | 2 +- .../OnRampTransactionModal.tsx | 2 +- .../Bridge/hooks/useCrossChainMessenger.ts | 43 ++- .../Bridge/hooks/useGetBridgeTransactions.ts | 21 +- apps/evm/src/pages/Fusion/Fusion.tsx | 2 +- .../Fusion/components/Dashboard/Dashboard.tsx | 12 +- .../Fusion/components/Info/Info.style.tsx | 2 +- .../src/pages/Fusion/components/Info/Info.tsx | 54 ++-- .../components/LoginSignUp/LoginSignUp.tsx | 2 +- .../PartnerCard.style.tsx | 8 +- .../PartnersAndChallenges/PartnerCard.tsx | 6 +- .../PartnersAndChallenges.tsx | 14 +- .../ProjectStatus/ProjectStatus.tsx | 13 +- .../components/UserStats/DepositedAssets.tsx | 4 +- .../components/UserStats/ReferralCode.tsx | 4 +- .../components/WithdrawForm/WithdrawForm.tsx | 8 +- .../WithdrawModal/WithdrawModal.tsx | 24 +- .../components/BackersCard/BackersCard.tsx | 1 - .../components/HeroSection/HeroSection.tsx | 5 +- .../components/InfoSection/InfoSection.tsx | 8 +- apps/evm/src/pages/SignUp/SignUp.tsx | 10 +- apps/evm/src/pages/Wallet/Wallet.tsx | 4 +- .../ReceiveTokenModal/ReceiveTokenModal.tsx | 4 +- .../SendTokenModal/SendTokenModal.tsx | 1 - .../components/TokenTable/ButtonGroup.tsx | 4 +- .../TokenTable/ButtonGroupMobile.tsx | 6 +- .../components/TokenTable/TokenTable.tsx | 2 +- knip.config.js | 7 +- packages/chains/src/chainId.ts | 9 +- packages/chains/src/chainNames.ts | 10 +- .../component/ConnectModal/ConnectModal.tsx | 12 +- .../ConnectModal/ConnectWalletCard.tsx | 3 +- .../ConnectModal/ConnectedWalletSection.tsx | 4 +- packages/icons/src/BOBLogo.tsx | 64 ++--- packages/icons/src/Bitlayer.tsx | 48 ++++ packages/icons/src/Merlin.tsx | 33 +++ packages/icons/src/index.ts | 24 +- packages/tokens/src/constants/bob.ts | 16 +- packages/tokens/src/constants/common.ts | 21 +- packages/tokens/src/constants/native.ts | 20 +- packages/tokens/src/constants/weth.ts | 9 + packages/tokens/src/tokens.ts | 9 +- packages/ui/package.json | 13 +- .../Accordion/Accordion.stories.tsx | 2 - .../components/Accordion/Accordion.style.tsx | 12 +- .../ui/src/components/Accordion/Accordion.tsx | 11 +- .../components/Accordion/AccordionItem.tsx | 9 +- .../src/components/Avatar/Avatar.stories.tsx | 26 ++ packages/ui/src/components/Avatar/Avatar.tsx | 1 + .../components/Breadcrumbs/BreadcrumbItem.tsx | 4 +- .../Breadcrumbs/Breadcrumbs.style.tsx | 4 +- .../ui/src/components/Button/Button.style.tsx | 15 +- packages/ui/src/components/Button/Button.tsx | 17 +- .../ui/src/components/Card/Card.stories.tsx | 33 ++- .../ui/src/components/Card/Card.style.tsx | 56 ++-- packages/ui/src/components/Card/Card.tsx | 28 +- packages/ui/src/components/Card/bob.png | Bin 0 -> 3959 bytes .../ui/src/components/Chip/Chip.stories.tsx | 40 +++ .../ui/src/components/Chip/Chip.style.tsx | 40 +++ packages/ui/src/components/Chip/Chip.tsx | 40 +++ packages/ui/src/components/Chip/index.tsx | 2 + .../ui/src/components/Dialog/Dialog.style.tsx | 10 +- .../ui/src/components/Dialog/DialogBody.tsx | 10 +- .../ui/src/components/Dialog/DialogHeader.tsx | 20 +- .../ui/src/components/Divider/Divider.tsx | 2 +- .../ui/src/components/Field/Field.style.tsx | 22 -- packages/ui/src/components/Field/Field.tsx | 128 --------- .../components/Field/__tests__/Field.test.tsx | 24 -- packages/ui/src/components/Field/index.tsx | 2 - .../HelperText/HelperText.style.tsx | 17 +- .../src/components/HelperText/HelperText.tsx | 16 +- .../ui/src/components/Icon/Icon.style.tsx | 9 +- packages/ui/src/components/Icon/Icon.tsx | 4 +- .../ui/src/components/Input/BaseInput.tsx | 123 +++++++-- .../ui/src/components/Input/Input.stories.tsx | 20 +- .../ui/src/components/Input/Input.style.tsx | 110 ++++---- .../ui/src/components/Label/Label.style.tsx | 20 +- packages/ui/src/components/Label/Label.tsx | 9 +- .../ui/src/components/Link/Link.stories.tsx | 52 ++++ .../ui/src/components/Link/Link.style.tsx | 50 ++++ packages/ui/src/components/Link/Link.tsx | 66 +++++ .../__tests__/Link.test.tsx} | 12 +- packages/ui/src/components/Link/index.tsx | 2 + .../ui/src/components/Modal/Modal.style.tsx | 9 +- .../ui/src/components/Modal/ModalBody.tsx | 8 +- .../NumberInput/NumberInput.stories.tsx | 8 - .../ui/src/components/Radio/Radio.stories.tsx | 6 - .../ui/src/components/Radio/Radio.style.tsx | 21 +- packages/ui/src/components/Radio/Radio.tsx | 38 ++- .../ui/src/components/Radio/RadioGroup.tsx | 69 +++-- .../src/components/Select/Select.stories.tsx | 136 +++++----- .../ui/src/components/Select/Select.style.tsx | 83 +++--- packages/ui/src/components/Select/Select.tsx | 76 ++++-- .../ui/src/components/Select/SelectModal.tsx | 65 +++-- .../components/Select/SelectModalContext.tsx | 18 -- .../src/components/Select/SelectTrigger.tsx | 45 +++- .../ui/src/components/Table/BaseTable.tsx | 6 + .../ui/src/components/Table/Table.stories.tsx | 12 +- .../ui/src/components/Table/Table.style.tsx | 11 +- packages/ui/src/components/Table/Table.tsx | 22 +- packages/ui/src/components/Tabs/Tab.tsx | 12 +- .../ui/src/components/Tabs/Tabs.style.tsx | 53 +--- packages/ui/src/components/Tabs/Tabs.tsx | 3 +- packages/ui/src/components/Text/Dl/Dt.tsx | 2 +- packages/ui/src/components/Text/style.tsx | 3 + packages/ui/src/components/Text/types.ts | 3 +- packages/ui/src/components/Text/utils.ts | 7 +- .../components/TextArea/TextArea.stories.tsx | 15 -- .../ui/src/components/TextArea/TextArea.tsx | 8 +- .../components/TextLink/TextLink.stories.tsx | 30 --- .../components/TextLink/TextLink.style.tsx | 35 --- .../ui/src/components/TextLink/TextLink.tsx | 67 ----- packages/ui/src/components/TextLink/index.tsx | 2 - .../TokenInput/BaseTokenInput.style.tsx | 122 --------- .../components/TokenInput/BaseTokenInput.tsx | 158 ++++++----- .../components/TokenInput/FixedTokenInput.tsx | 64 ++--- .../TokenInput/SelectableTokenInput.tsx | 57 ++-- .../ui/src/components/TokenInput/Token.tsx | 22 ++ .../components/TokenInput/TokenAdornment.tsx | 23 -- .../TokenInput/TokenInput.style.tsx | 149 +++++++---- .../src/components/TokenInput/TokenInput.tsx | 8 +- .../TokenInput/TokenInputBalance.tsx | 59 ----- .../components/TokenInput/TokenInputLabel.tsx | 25 -- .../components/TokenInput/TokenListItem.tsx | 27 +- .../src/components/TokenInput/TokenSelect.tsx | 34 +-- .../TokenInput/__tests__/TokenInput.test.tsx | 74 +++--- .../ui/src/components/TokenInput/index.tsx | 2 +- .../stories/FixedTokenInput.stories.tsx | 32 +-- .../stories/SelectableTokenInput.stories.tsx | 7 +- packages/ui/src/components/index.ts | 10 +- packages/ui/src/components/utils/input.ts | 9 - packages/ui/src/components/utils/scroll.ts | 21 ++ packages/ui/src/components/utils/types.ts | 4 +- .../use-form/__tests__/use-form.test.tsx | 4 +- packages/ui/src/icons/BankNotes.tsx | 25 ++ packages/ui/src/icons/index.ts | 1 + packages/ui/src/system/provider.tsx | 12 +- packages/ui/src/theme/components/accordion.ts | 14 +- packages/ui/src/theme/components/button.ts | 8 +- packages/ui/src/theme/components/card.ts | 3 +- packages/ui/src/theme/components/chip.ts | 10 + packages/ui/src/theme/components/dialog.ts | 6 +- packages/ui/src/theme/components/field.ts | 3 + .../ui/src/theme/components/helper-text.ts | 10 + packages/ui/src/theme/components/index.ts | 23 +- packages/ui/src/theme/components/input.ts | 14 +- packages/ui/src/theme/components/label.ts | 13 + packages/ui/src/theme/components/link.ts | 10 + packages/ui/src/theme/components/radio.ts | 2 + packages/ui/src/theme/components/scroll.ts | 10 + packages/ui/src/theme/components/select.ts | 7 + packages/ui/src/theme/components/table.ts | 10 +- packages/ui/src/theme/components/tabs.ts | 12 +- .../ui/src/theme/components/token-input.ts | 23 +- packages/ui/src/theme/core/colors.ts | 25 +- packages/ui/src/theme/core/font-size.ts | 3 +- packages/ui/src/theme/core/index.ts | 2 +- packages/ui/src/theme/define.ts | 52 ++-- packages/ui/src/theme/index.ts | 71 ++--- packages/ui/src/theme/themes/bob/accordion.ts | 24 +- packages/ui/src/theme/themes/bob/alert.ts | 64 ++--- packages/ui/src/theme/themes/bob/button.ts | 94 +++---- packages/ui/src/theme/themes/bob/card.ts | 11 +- packages/ui/src/theme/themes/bob/chip.ts | 29 ++ packages/ui/src/theme/themes/bob/colors.ts | 123 +++++---- packages/ui/src/theme/themes/bob/dialog.ts | 14 +- packages/ui/src/theme/themes/bob/drawer.ts | 4 +- .../ui/src/theme/themes/bob/helper-text.ts | 16 ++ packages/ui/src/theme/themes/bob/index.ts | 30 ++- packages/ui/src/theme/themes/bob/input.ts | 113 +++++--- packages/ui/src/theme/themes/bob/label.ts | 25 ++ packages/ui/src/theme/themes/bob/link.ts | 23 ++ packages/ui/src/theme/themes/bob/list.ts | 7 +- .../ui/src/theme/themes/bob/progress-bar.ts | 2 +- packages/ui/src/theme/themes/bob/radio.ts | 17 ++ packages/ui/src/theme/themes/bob/scroll.ts | 29 ++ packages/ui/src/theme/themes/bob/select.ts | 15 ++ packages/ui/src/theme/themes/bob/stepper.ts | 8 +- packages/ui/src/theme/themes/bob/table.ts | 41 +-- packages/ui/src/theme/themes/bob/tabs.ts | 83 ++---- .../ui/src/theme/themes/bob/token-input.ts | 129 ++++----- packages/ui/src/theme/themes/bob/tooltip.ts | 2 +- packages/wagmi/src/bob.ts | 50 +++- pnpm-lock.yaml | 3 + 235 files changed, 3311 insertions(+), 2572 deletions(-) create mode 100644 .storybook/vite.config.ts create mode 100644 apps/evm/public/android-chrome-192x192.png create mode 100644 apps/evm/public/android-chrome-512x512.png create mode 100644 apps/evm/public/apple-touch-icon.png create mode 100644 apps/evm/public/favicon-16x16.png create mode 100644 apps/evm/public/favicon-32x32.png create mode 100644 apps/evm/public/favicon.ico create mode 100644 apps/evm/public/site.webmanifest delete mode 100644 apps/evm/src/assets/ecosystem-banner.png create mode 100644 apps/evm/src/indexer/bridge/new_testnet_bridge_deposits.json create mode 100644 apps/evm/src/indexer/bridge/new_testnet_bridge_withdraws.json create mode 100644 apps/evm/src/pages/Bridge/components/BannerCarousel/EcosystemImg.tsx delete mode 100644 apps/evm/src/pages/Bridge/components/ExternalBridgeForm/ExternalBridgeForm.style.tsx create mode 100644 packages/icons/src/Bitlayer.tsx create mode 100644 packages/icons/src/Merlin.tsx create mode 100644 packages/ui/src/components/Avatar/Avatar.stories.tsx create mode 100644 packages/ui/src/components/Card/bob.png create mode 100644 packages/ui/src/components/Chip/Chip.stories.tsx create mode 100644 packages/ui/src/components/Chip/Chip.style.tsx create mode 100644 packages/ui/src/components/Chip/Chip.tsx create mode 100644 packages/ui/src/components/Chip/index.tsx delete mode 100644 packages/ui/src/components/Field/Field.style.tsx delete mode 100644 packages/ui/src/components/Field/Field.tsx delete mode 100644 packages/ui/src/components/Field/__tests__/Field.test.tsx delete mode 100644 packages/ui/src/components/Field/index.tsx create mode 100644 packages/ui/src/components/Link/Link.stories.tsx create mode 100644 packages/ui/src/components/Link/Link.style.tsx create mode 100644 packages/ui/src/components/Link/Link.tsx rename packages/ui/src/components/{TextLink/__tests__/TextLink.test.tsx => Link/__tests__/Link.test.tsx} (67%) create mode 100644 packages/ui/src/components/Link/index.tsx delete mode 100644 packages/ui/src/components/Select/SelectModalContext.tsx delete mode 100644 packages/ui/src/components/TextLink/TextLink.stories.tsx delete mode 100644 packages/ui/src/components/TextLink/TextLink.style.tsx delete mode 100644 packages/ui/src/components/TextLink/TextLink.tsx delete mode 100644 packages/ui/src/components/TextLink/index.tsx delete mode 100644 packages/ui/src/components/TokenInput/BaseTokenInput.style.tsx create mode 100644 packages/ui/src/components/TokenInput/Token.tsx delete mode 100644 packages/ui/src/components/TokenInput/TokenAdornment.tsx delete mode 100644 packages/ui/src/components/TokenInput/TokenInputBalance.tsx delete mode 100644 packages/ui/src/components/TokenInput/TokenInputLabel.tsx delete mode 100644 packages/ui/src/components/utils/input.ts create mode 100644 packages/ui/src/components/utils/scroll.ts create mode 100644 packages/ui/src/icons/BankNotes.tsx create mode 100644 packages/ui/src/theme/components/chip.ts create mode 100644 packages/ui/src/theme/components/field.ts create mode 100644 packages/ui/src/theme/components/helper-text.ts create mode 100644 packages/ui/src/theme/components/label.ts create mode 100644 packages/ui/src/theme/components/link.ts create mode 100644 packages/ui/src/theme/components/scroll.ts create mode 100644 packages/ui/src/theme/components/select.ts create mode 100644 packages/ui/src/theme/themes/bob/chip.ts create mode 100644 packages/ui/src/theme/themes/bob/helper-text.ts create mode 100644 packages/ui/src/theme/themes/bob/label.ts create mode 100644 packages/ui/src/theme/themes/bob/link.ts create mode 100644 packages/ui/src/theme/themes/bob/scroll.ts create mode 100644 packages/ui/src/theme/themes/bob/select.ts diff --git a/.storybook/main.ts b/.storybook/main.ts index 531829b69..2bfa044ad 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -21,7 +21,7 @@ const config: StorybookConfig = { name: getAbsolutePath('@storybook/react-vite'), options: { builder: { - viteConfigPath: './apps/evm/vite.config.ts' + viteConfigPath: './.storybook/vite.config.ts' } } }, diff --git a/.storybook/vite.config.ts b/.storybook/vite.config.ts new file mode 100644 index 000000000..18a256ded --- /dev/null +++ b/.storybook/vite.config.ts @@ -0,0 +1,23 @@ +// @ts-ignore +import react from '@vitejs/plugin-react'; +import { defineConfig, loadEnv } from 'vite'; +// @ts-ignore +import { nodePolyfills } from 'vite-plugin-node-polyfills'; + +// https://vitejs.dev/config/ +export default defineConfig(({ mode }) => { + // Load env file based on `mode` in the current working directory. + // Set the third parameter to '' to load all env regardless of the `VITE_` prefix. + const env = loadEnv(mode, process.cwd(), ''); + + return { + define: { + __APP_ENV__: JSON.stringify(env.APP_ENV) + }, + build: { + target: 'esnext', + sourcemap: true // Source map generation must be turned on + }, + plugins: [react(), nodePolyfills()] + }; +}); diff --git a/apps/evm/index.html b/apps/evm/index.html index a4a62eead..6fa4698f2 100644 --- a/apps/evm/index.html +++ b/apps/evm/index.html @@ -2,16 +2,12 @@ - - - + + + + + + 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ऍ=jGZ^<2kz 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 literal 0 HcmV?d00001 diff --git a/apps/evm/public/android-chrome-512x512.png b/apps/evm/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd37aacaecc1094256ed87c3b5f9fcc4860d8c9 GIT binary patch literal 85996 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

)_qoi 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 Z{|8>o$eBcC$iDyp002ovPDHLkV1oC034s6r literal 0 HcmV?d00001 diff --git a/apps/evm/public/favicon-16x16.png b/apps/evm/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..8930a723653d1b3b9574696ae406b7710482eea8 GIT binary patch literal 625 zcmV-%0*?KOP)Px%D@jB_R5(wKlg&$1VHC!H=ia$`XVe*J)iSfTHMGh_E(#>dMZ1L15uXV-Bb(X(vPV;Te}DCrK#vK031^#Q4NlYg)(qw#pT?l zTNHxx5RgAY(yg0kEt#ZBoc^ zRSc)1U)T=LfivL5(YYzSrz0TNstx1S*im6v7Q1+w^ zo5X)RhM9eb)7At23Z7CO300000 LNkvXXu0mjfQa&Y! literal 0 HcmV?d00001 diff --git a/apps/evm/public/favicon-32x32.png b/apps/evm/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..04eb56265ecd9785596878d09b80209ba0b99a2b GIT binary patch literal 1248 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 literal 0 HcmV?d00001 diff --git a/apps/evm/public/site.webmanifest b/apps/evm/public/site.webmanifest new file mode 100644 index 000000000..8f2a3c660 --- /dev/null +++ b/apps/evm/public/site.webmanifest @@ -0,0 +1,11 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, + { "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } + ], + "theme_color": "#F35D00", + "background_color": "#F35D00", + "display": "standalone" +} diff --git a/apps/evm/src/App.tsx b/apps/evm/src/App.tsx index f2dfc3bd1..fe94ce8c5 100644 --- a/apps/evm/src/App.tsx +++ b/apps/evm/src/App.tsx @@ -1,9 +1,10 @@ import { usePrices, useQuery } from '@gobob/react-query'; import { useAccount, useChainId, useConfig, useReconnect, useSwitchChain, watchAccount } from '@gobob/wagmi'; -import { ModalBody, ModalHeader, Modal, P, ModalFooter, Button, toast } from '@gobob/ui'; +import { ModalBody, ModalHeader, Modal, P, ModalFooter, Button, toast, BOBUIProvider } from '@gobob/ui'; import { Suspense, lazy, useEffect, useRef, useState } from 'react'; -import { BrowserRouter, Route, Routes, useLocation, useNavigate, useSearchParams } from 'react-router-dom'; +import { Route, Routes, useLocation, useNavigate, useSearchParams } from 'react-router-dom'; import { Chain } from 'viem'; +import { ConnectProvider } from '@gobob/connect-ui'; import { Header, Layout, Main, Sidebar } from './components'; import { L1_CHAIN, RoutesPath, isValidChain } from './constants'; @@ -169,6 +170,7 @@ const Fallback = () => { function App() { const chainId = useChainId(); + const navigate = useNavigate(); // Called here to make sure data exists usePrices({ baseUrl: import.meta.env.VITE_MARKET_DATA_API }); @@ -185,25 +187,27 @@ function App() { }, []); return ( - - - - - -

- }> - - } path={RoutesPath.HOME} /> - } path={RoutesPath.SIGN_UP} /> - } path={RoutesPath.FUSION} /> - } path={RoutesPath.BRIDGE} /> - } path={RoutesPath.WALLET} /> - } path={RoutesPath.GEOBLOCK} /> - } path='*' /> - - - - + + + + + + +
+ }> + + } path={RoutesPath.HOME} /> + } path={RoutesPath.SIGN_UP} /> + } path={RoutesPath.FUSION} /> + } path={RoutesPath.BRIDGE} /> + } path={RoutesPath.WALLET} /> + } path={RoutesPath.GEOBLOCK} /> + } path='*' /> + + + + + ); } diff --git a/apps/evm/src/assets/ecosystem-banner.png b/apps/evm/src/assets/ecosystem-banner.png deleted file mode 100644 index ace4b81137e9b3bff2f0f0f88a3b1116e0cae984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219678 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

  • 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 diff --git a/apps/evm/src/components/Auditors/Auditors.tsx b/apps/evm/src/components/Auditors/Auditors.tsx index ce797dae3..f2a3d5f0a 100644 --- a/apps/evm/src/components/Auditors/Auditors.tsx +++ b/apps/evm/src/components/Auditors/Auditors.tsx @@ -11,7 +11,7 @@ const Auditors = () => { return (
    -
    +
    {t('fusion.deposit.auditedBy')}
    diff --git a/apps/evm/src/components/AuthCard/AuthCard.tsx b/apps/evm/src/components/AuthCard/AuthCard.tsx index 039004de5..38090c315 100644 --- a/apps/evm/src/components/AuthCard/AuthCard.tsx +++ b/apps/evm/src/components/AuthCard/AuthCard.tsx @@ -72,12 +72,9 @@ const AuthCard = ({ return ( diff --git a/apps/evm/src/components/ChainLogo/ChainLogo.tsx b/apps/evm/src/components/ChainLogo/ChainLogo.tsx index b7cc7c1d5..e5d031d3c 100644 --- a/apps/evm/src/components/ChainLogo/ChainLogo.tsx +++ b/apps/evm/src/components/ChainLogo/ChainLogo.tsx @@ -1,10 +1,11 @@ import { ChainId } from '@gobob/chains'; -import { ArbitrumOne, BNB, BOBLogo, BTC, Base, ETH, Moonbeam, Optimism, Polygon } from '@gobob/icons'; +import { ArbitrumOne, BNB, BOBLogo, BTC, Base, Bitlayer, ETH, Merlin, Moonbeam, Optimism, Polygon } from '@gobob/icons'; import { IconProps } from '@gobob/ui'; // TODO: temp const chainLogo: Record = { [ChainId.BOB]: BOBLogo, + [ChainId.OLD_BOB_SEPOLIA]: BOBLogo, [ChainId.BOB_SEPOLIA]: BOBLogo, [ChainId.ETHEREUM]: ETH, [ChainId.SEPOLIA]: ETH, @@ -15,7 +16,9 @@ const chainLogo: Record = { [ChainId.OPBNB]: BNB, [ChainId.POLYGON_ZKEVM]: Polygon, [ChainId.POLYGON]: Polygon, - [ChainId.MOONBEAM]: Moonbeam + [ChainId.MOONBEAM]: Moonbeam, + [ChainId.BITLAYER]: Bitlayer, + [ChainId.MERLIN]: Merlin }; type Props = { diff --git a/apps/evm/src/components/Layout/Header.tsx b/apps/evm/src/components/Layout/Header.tsx index 32671fcca..45b5faca6 100644 --- a/apps/evm/src/components/Layout/Header.tsx +++ b/apps/evm/src/components/Layout/Header.tsx @@ -65,7 +65,7 @@ const Header = ({ isTestnet, isFusion, ...props }: HeaderProps): JSX.Element => diff --git a/apps/evm/src/components/Layout/Layout.style.tsx b/apps/evm/src/components/Layout/Layout.style.tsx index 6cc3f6e63..6b6b233b2 100644 --- a/apps/evm/src/components/Layout/Layout.style.tsx +++ b/apps/evm/src/components/Layout/Layout.style.tsx @@ -10,8 +10,7 @@ type StyledMainProps = { const StyledLayout = styled(Flex)` min-height: 100vh; - // TODO: figure this out - background-color: #0d1017; + background-color: ${({ theme }) => theme.color('grey-600')}; `; const StyledHeader = styled(Flex)` @@ -19,7 +18,6 @@ const StyledHeader = styled(Flex)` padding-right: ${({ theme }) => theme.spacing('3xl')}; overflow-x: hidden; z-index: 20; - max-width: ${({ theme }) => theme.maxWidth('7xl')}; margin: 0 auto; `; diff --git a/apps/evm/src/components/ReferralInput/ReferralInput.style.tsx b/apps/evm/src/components/ReferralInput/ReferralInput.style.tsx index eae761f3a..4674ba5f8 100644 --- a/apps/evm/src/components/ReferralInput/ReferralInput.style.tsx +++ b/apps/evm/src/components/ReferralInput/ReferralInput.style.tsx @@ -5,31 +5,20 @@ type BaseInputProps = { }; const StyledBaseInput = styled.input` - display: block; - width: 100%; - height: 100%; - - outline: none; - font: inherit; - letter-spacing: inherit; - background: none; - - text-overflow: ellipsis; - ${({ theme, $hasError }) => { return css` - padding: ${theme.spacing('md')}; - ${theme.input.base} + ${theme.input.wrapper} + padding: ${theme.spacing('md')}; ${$hasError && theme.input.error.base} &:hover:not(:disabled):not(:focus) { - ${$hasError ? theme.input.error.hover : theme.input.hover} + ${$hasError ? theme.input.error.hover.wapper : theme.input.hover.wapper} } &:focus:not(:disabled) { - ${$hasError ? theme.input.error.focus : theme.input.focus} + ${$hasError ? theme.input.error.focus.wrapper : theme.input.focus.wrapper} } &::placeholder { diff --git a/apps/evm/src/components/ReferralInput/ReferralInput.tsx b/apps/evm/src/components/ReferralInput/ReferralInput.tsx index 9f1620745..9fc66016d 100644 --- a/apps/evm/src/components/ReferralInput/ReferralInput.tsx +++ b/apps/evm/src/components/ReferralInput/ReferralInput.tsx @@ -1,7 +1,7 @@ import { useCallback, useEffect, useState } from 'react'; import OtpInput, { OTPInputProps } from 'react-otp-input'; import { useLabel } from '@react-aria/label'; -import { Field, Flex, P, TextLink } from '@gobob/ui'; +import { Flex, P, Link, Label } from '@gobob/ui'; import { mergeProps } from '@react-aria/utils'; import { useTheme } from 'styled-components'; import { Trans } from 'react-i18next'; @@ -43,7 +43,8 @@ const ReferralInput = ({ onChange, errorMessage, ...props }: ReferralInputProps) return ( - + + {labelText && } - +

    }} + components={{ discordLink: }} i18nKey='home.referralCodePrompt' />

    diff --git a/apps/evm/src/components/TransactionDetails/TransactionDetails.style.tsx b/apps/evm/src/components/TransactionDetails/TransactionDetails.style.tsx index 428edc5a5..879bd63c5 100644 --- a/apps/evm/src/components/TransactionDetails/TransactionDetails.style.tsx +++ b/apps/evm/src/components/TransactionDetails/TransactionDetails.style.tsx @@ -1,4 +1,4 @@ -import { DlGroup, Dt, Select, TokenData } from '@gobob/ui'; +import { DlGroup, Dt, Select, TokenSelectItemProps } from '@gobob/ui'; import styled from 'styled-components'; type StyledDtProps = { @@ -14,7 +14,7 @@ const StyledDt = styled(Dt)` line-height: ${({ $hasExtendedHeight = true }) => $hasExtendedHeight && '1.875rem'}; `; -const StyledSelect = styled(Select)` +const StyledSelect = styled(Select)` button { background-color: ${({ theme }) => theme.color('grey-600')}; } diff --git a/apps/evm/src/components/TransactionDetails/TransactionDetails.tsx b/apps/evm/src/components/TransactionDetails/TransactionDetails.tsx index 4eb44551a..43488a6d3 100644 --- a/apps/evm/src/components/TransactionDetails/TransactionDetails.tsx +++ b/apps/evm/src/components/TransactionDetails/TransactionDetails.tsx @@ -1,6 +1,18 @@ import { Currency, CurrencyAmount } from '@gobob/currency'; import { usePrices } from '@gobob/react-query'; -import { Card, Dd, Dl, DlProps, Flex, Item, SelectProps, Span, Spinner, TokenData, TokenListItem } from '@gobob/ui'; +import { + Card, + Dd, + Dl, + DlProps, + Flex, + Item, + SelectProps, + Span, + Spinner, + TokenSelectItemProps, + TokenListItem +} from '@gobob/ui'; import { ReactNode, useMemo } from 'react'; import { ChainId } from '@gobob/chains'; @@ -18,7 +30,7 @@ type Props = { amount?: CurrencyAmount | CurrencyAmount[]; amountPlaceholder?: CurrencyAmount | CurrencyAmount[]; onChangeGasTicker?: (ticker: string) => void; - selectProps?: Omit, 'children'>; + selectProps?: Omit, 'children'>; duration?: ReactNode; gasLabel?: ReactNode; }; @@ -44,9 +56,9 @@ const TransactionDetails = ({ const { getBalance } = useBalances(chainId); const { data: gasTokens } = useGasTokens(chainId); - const gasSelectItems: TokenData[] = useMemo( + const gasSelectItems: TokenSelectItemProps[] = useMemo( () => - gasTokens?.map((token): TokenData => { + gasTokens?.map((token): TokenSelectItemProps => { const balance = getBalance(token.currency.symbol); return { @@ -63,11 +75,11 @@ const TransactionDetails = ({ const gasEstimate = gasEstimateProp || gasEstimatePlaceholder; return ( - +
    {amount && ( - + You will receive
    @@ -89,13 +101,15 @@ const TransactionDetails = ({ )} {duration && ( - Transfer time + + Transfer time +
    {duration}
    )} {onChangeGasTicker && ( - + Gas Token onChangeGasTicker(ticker as string)} {...selectProps} > - {(data: TokenData) => ( + {(data: TokenSelectItemProps) => ( @@ -118,7 +132,9 @@ const TransactionDetails = ({ )} {gasEstimate && ( - {gasLabel} + + {gasLabel} +
    {isLoadingGasEstimate && } diff --git a/apps/evm/src/constants/assets.ts b/apps/evm/src/constants/assets.ts index 8a5564e4a..0aca8dfcf 100644 --- a/apps/evm/src/constants/assets.ts +++ b/apps/evm/src/constants/assets.ts @@ -13,7 +13,10 @@ export type RawToken = { bridgeDisabled?: boolean; }; -export const ETH: Record = { +export const ETH: Record< + ChainId.BOB | ChainId.ETHEREUM | ChainId.SEPOLIA | ChainId.BOB_SEPOLIA | ChainId.OLD_BOB_SEPOLIA, + RawToken +> = { [ChainId.ETHEREUM]: { chainId: ChainId.ETHEREUM, address: '0x0000000000000000000000000000000000000000', @@ -49,10 +52,19 @@ export const ETH: Record = { +export const wstETH: Record = { [ChainId.ETHEREUM]: { chainId: ChainId.ETHEREUM, address: '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0', @@ -80,8 +92,17 @@ export const wstETH: Record = { +const usdc: Record< + ChainId.BOB | ChainId.ETHEREUM | ChainId.SEPOLIA | ChainId.BOB_SEPOLIA | ChainId.OLD_BOB_SEPOLIA, + RawToken +> = { [ChainId.ETHEREUM]: { chainId: ChainId.ETHEREUM, address: USDC[ChainId.ETHEREUM].address, @@ -127,6 +151,15 @@ const usdc: Record chain?.id === L1_CHAIN; @@ -20,9 +26,9 @@ const isL2Chain = (chain: Chain) => chain?.id === L2_CHAIN; const isValidChain = (chainId: ChainId) => chainId === L1_CHAIN || chainId === L2_CHAIN; -const isProd = !isTestnetChainId(L1_CHAIN); +const isProd = !isL1Testnet; const chainL1: Chain = isProd ? mainnet : sepolia; -const chainL2: Chain = isProd ? bob : bobSepolia; +const chainL2: Chain = isProd ? bob : bobSepolia.id === L2_CHAIN ? bobSepolia : oldBobSepolia; export { L1_CHAIN, L2_CHAIN, chainL1, chainL2, isL1Chain, isL2Chain, isProd, isValidChain }; diff --git a/apps/evm/src/index.css b/apps/evm/src/index.css index d29b067cd..e11773368 100644 --- a/apps/evm/src/index.css +++ b/apps/evm/src/index.css @@ -7,6 +7,7 @@ font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; font-weight: 400; + color: #ffffff; color-scheme: light dark; diff --git a/apps/evm/src/indexer/bridge/README.md b/apps/evm/src/indexer/bridge/README.md index 3241f1c2a..89e8ff257 100644 --- a/apps/evm/src/indexer/bridge/README.md +++ b/apps/evm/src/indexer/bridge/README.md @@ -6,7 +6,8 @@ To access user deposit transactions from Layer 1 (L1) to Layer 2 (L2), utilize t ### GQL Endpoints: -- **Testnet:** `https://api.goldsky.com/api/public/project_clto8zgmd1jbw01xig1ge1u0h/subgraphs/bridge-deposits-sepolia/1.0/gn` +- **Old Testnet:** `https://api.goldsky.com/api/public/project_clto8zgmd1jbw01xig1ge1u0h/subgraphs/bridge-deposits-sepolia/1.0/gn` +- **New Testnet:** `https://api.goldsky.com/api/public/project_clto8zgmd1jbw01xig1ge1u0h/subgraphs/testnet-bridge-deposits-sepolia/test/gn` - **Mainnet:** `https://api.goldsky.com/api/public/project_clto8zgmd1jbw01xig1ge1u0h/subgraphs/bridge-deposits-mainnet/1.0/gn` ### Get All ERC20 Deposits by Address @@ -49,7 +50,8 @@ For accessing user withdrawal transactions from Layer 2 (L2) to Layer 1 (L1), us ### GQL Endpoints: -- **Testnet:** `https://api.goldsky.com/api/public/project_clto8zgmd1jbw01xig1ge1u0h/subgraphs/bridge-withdraws-bob-testnet/1.0/gn` +- **Old Testnet:** `https://api.goldsky.com/api/public/project_clto8zgmd1jbw01xig1ge1u0h/subgraphs/bridge-withdraws-bob-testnet/1.0/gn` +- **New Testnet:** `https://api.goldsky.com/api/public/project_clto8zgmd1jbw01xig1ge1u0h/subgraphs/testnet-bridge-withdraws-bob-sepolia/test/gn` - **Mainnet:** `https://api.goldsky.com/api/public/project_clto8zgmd1jbw01xig1ge1u0h/subgraphs/bridge-withdraws-bob/1.0/gn` ### Get All ERC20 Withdrawals by Address diff --git a/apps/evm/src/indexer/bridge/new_testnet_bridge_deposits.json b/apps/evm/src/indexer/bridge/new_testnet_bridge_deposits.json new file mode 100644 index 000000000..c8d099662 --- /dev/null +++ b/apps/evm/src/indexer/bridge/new_testnet_bridge_deposits.json @@ -0,0 +1,24 @@ +{ + "version": "1", + "name": "testnet-bridge-deposits", + "abis": { + "bridge": { + "path": "./L1BridgeABI.json" + } + }, + "chains": ["sepolia"], + "instances": [ + { + "abi": "bridge", + "address": "0x75f48FE4DeAB3F9043EE995c3C84D6a2303D9a2F", + "startBlock": 6404317, + "chain": "sepolia" + }, + { + "abi": "bridge", + "address": "0xA932eD4b73972c37DC4a691E8eC6f2C8a13951BE", + "startBlock": 6441278, + "chain": "sepolia" + } + ] +} diff --git a/apps/evm/src/indexer/bridge/new_testnet_bridge_withdraws.json b/apps/evm/src/indexer/bridge/new_testnet_bridge_withdraws.json new file mode 100644 index 000000000..6bd2b706b --- /dev/null +++ b/apps/evm/src/indexer/bridge/new_testnet_bridge_withdraws.json @@ -0,0 +1,24 @@ +{ + "version": "1", + "name": "testnet-bridge-withdraws", + "abis": { + "bridge": { + "path": "./L2BridgeABI.json" + } + }, + "chains": ["bob-sepolia"], + "instances": [ + { + "abi": "bridge", + "address": "0x4200000000000000000000000000000000000010", + "startBlock": 0, + "chain": "bob-sepolia" + }, + { + "abi": "bridge", + "address": "0x5C2A45A35ba99d8Ee58c4bB96e2Ce30dA86C530b", + "startBlock": 253101, + "chain": "bob-sepolia" + } + ] +} diff --git a/apps/evm/src/main.tsx b/apps/evm/src/main.tsx index 3fce3c7b8..b36d3c4b0 100644 --- a/apps/evm/src/main.tsx +++ b/apps/evm/src/main.tsx @@ -1,31 +1,29 @@ -import '../sentry'; -import { ConnectProvider } from '@gobob/connect-ui'; import { QueryClientProvider } from '@gobob/react-query'; import { SatsWagmiConfig } from '@gobob/sats-wagmi'; -import { BOBUIProvider, CSSReset } from '@gobob/ui'; +import { CSSReset } from '@gobob/ui'; import { WagmiProvider } from '@gobob/wagmi'; import React from 'react'; import ReactDOM from 'react-dom/client'; - -import './i18n'; -import './index.css'; +import { BrowserRouter } from 'react-router-dom'; import App from './App'; import { bitcoinNetwork, isProd } from './constants'; import { queryClient } from './lib/react-query'; +import '../sentry'; +import './i18n'; +import './index.css'; + ReactDOM.createRoot(document.getElementById('root')!).render( {/* */} - - - - - - + + + + diff --git a/apps/evm/src/pages/Bridge/Bridge.style.tsx b/apps/evm/src/pages/Bridge/Bridge.style.tsx index a605e16f4..39bfc282f 100644 --- a/apps/evm/src/pages/Bridge/Bridge.style.tsx +++ b/apps/evm/src/pages/Bridge/Bridge.style.tsx @@ -1,5 +1,5 @@ import { Button, Card, Flex } from '@gobob/ui'; -import styled, { css } from 'styled-components'; +import styled from 'styled-components'; const StyledFlex = styled(Flex)` width: 100%; @@ -19,22 +19,6 @@ const StyledBanner = styled(Card)` overflow: hidden; `; -const StyledBannerImg = styled.img` - position: absolute; - right: 0; - top: 0; - height: 100%; - opacity: 0.5; - ${({ theme }) => { - return css` - transform: scale(4); - @media ${theme.breakpoints.up('s')} { - transform: scale(6) translateX(-15%); - } - `; - }} -`; - const StyledBannerCloseBtn = styled(Button)` position: absolute; top: ${({ theme }) => theme.spacing('s')}; @@ -42,4 +26,4 @@ const StyledBannerCloseBtn = styled(Button)` z-index: 2; `; -export { StyledFlex, StyledCard, StyledBannerImg, StyledBannerContent, StyledBannerCloseBtn, StyledBanner }; +export { StyledFlex, StyledCard, StyledBannerContent, StyledBannerCloseBtn, StyledBanner }; diff --git a/apps/evm/src/pages/Bridge/Bridge.tsx b/apps/evm/src/pages/Bridge/Bridge.tsx index 70279c1a3..8b50f3d22 100644 --- a/apps/evm/src/pages/Bridge/Bridge.tsx +++ b/apps/evm/src/pages/Bridge/Bridge.tsx @@ -6,18 +6,11 @@ import { useLocalStorage } from '@uidotdev/usehooks'; import { Main } from '../../components'; import { L1_CHAIN, L2_CHAIN, LocalStorageKey, RoutesPath } from '../../constants'; -import bannerSrc from '../../assets/ecosystem-banner.png'; import { FeatureFlags, useFeatureFlag } from '../../hooks'; -import { - StyledBanner, - StyledBannerCloseBtn, - StyledBannerContent, - StyledBannerImg, - StyledCard, - StyledFlex -} from './Bridge.style'; +import { StyledBanner, StyledBannerCloseBtn, StyledBannerContent, StyledCard, StyledFlex } from './Bridge.style'; import { BannerCarousel, BridgeForm, TransactionList } from './components'; +import { StyledEcosystemImg } from './components/BannerCarousel/BannerCarousel.style'; enum BridgeOrigin { INTERNAL = 'INTERNAL', @@ -131,7 +124,6 @@ const Bridge = () => { ) : ( !isEcosystemBannerHidden && ( { BOB Ecosystem -

    Discover the most exciting projects on BOB.

    +

    Discover the most exciting projects on BOB.

    - + ) )} @@ -165,9 +157,9 @@ const Bridge = () => { NOTICE: Fault Proofs are coming to BOB. Withdrawals starting on July 4 will need to be proven again after July 10, requiring at least 7 days to be finalised. Consider waiting until the upgrade is complete or using 3rd Party bridge for withdrawals during this period.{' '} - + Click here for more info. - +

    )} */} diff --git a/apps/evm/src/pages/Bridge/components/BannerCarousel/Banner.tsx b/apps/evm/src/pages/Bridge/components/BannerCarousel/Banner.tsx index 46941de35..677c0a42d 100644 --- a/apps/evm/src/pages/Bridge/components/BannerCarousel/Banner.tsx +++ b/apps/evm/src/pages/Bridge/components/BannerCarousel/Banner.tsx @@ -6,7 +6,7 @@ type BannerProps = CardProps; const Banner = (props: BannerProps) => { return ( - + ); }; diff --git a/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.style.tsx b/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.style.tsx index a6be70078..f3804bfe0 100644 --- a/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.style.tsx +++ b/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.style.tsx @@ -2,12 +2,8 @@ import { Card, Flex } from '@gobob/ui'; import Slider from 'react-slick'; import styled, { css } from 'styled-components'; -import { Banner } from './Banner'; import { OnrampGraphic } from './OnrampGraphic'; - -function getImageUrl(name: string) { - return new URL(`../../../../assets/${name}`, import.meta.url).href; -} +import { EcosystemImg } from './EcosystemImg'; const StyledCarouselWrapper = styled(Card)` position: relative; @@ -19,24 +15,6 @@ const StyledBannerContent = styled(Flex)` z-index: 1; `; -const StyledBannerImg = styled.img` - position: absolute; - right: 0; - top: 0; - height: 100%; - opacity: 0.5; - - ${({ theme }) => { - return css` - transform: scale(4); - - @media ${theme.breakpoints.up('s')} { - transform: scale(6) translateX(-15%); - } - `; - }} -`; - const StyledSlider = styled(Slider)` .slick-prev { left: 10px; @@ -52,11 +30,23 @@ const StyledSlider = styled(Slider)` .slick-prev, .slick-next { - color: ${({ theme }) => theme.color('grey-300')}; - width: auto; - height: auto; + color: ${({ theme }) => theme.color('grey-200')}; + width: ${({ theme }) => theme.spacing('4xl')}; + height: ${({ theme }) => theme.spacing('4xl')}; z-index: 1; transition: ${({ theme }) => theme.transition('colors', 'fast')}; + border-radius: ${({ theme }) => theme.rounded('md')}; + + &, + &:hover, + &:focus, + &:active { + background-color: ${({ theme }) => theme.color('grey-600')}; + } + + &:hover { + opacity: 0.7; + } &::before { content: unset; @@ -70,7 +60,7 @@ const StyledSlider = styled(Slider)` .slick-dots li button:before { font-size: 10px; - color: ${({ theme }) => theme.color('grey-100')}; + color: ${({ theme }) => theme.color('grey-200')}; transition: ${({ theme }) => theme.transition('colors', 'fast')}; } @@ -86,38 +76,9 @@ const StyledSlider = styled(Slider)` } `; -const StyledOnrampBanner = styled(Banner)` - background-image: url(${getImageUrl('cubs-group.svg')}); - background-repeat: no-repeat; - background-size: cover; - - ${({ theme }) => { - return css` - background-position: 70% 50%; - - @media ${theme.breakpoints.up('s')} { - background-position: 0% 50%; - } - `; - }} -`; - -const StyledPressableBanner = styled(Banner)` - background-image: url(${getImageUrl('cubs-group.svg')}); - background-repeat: no-repeat; - background-size: cover; - +const StyledBanner = styled(Card)` position: relative; - - ${({ theme }) => { - return css` - background-position: 70% 50%; - - @media ${theme.breakpoints.up('s')} { - background-position: 0% 50%; - } - `; - }} + max-height: 8.5rem; `; const StyledIntractBannerImg = styled.img` @@ -137,12 +98,14 @@ const StyledIntractBannerImg = styled.img` `; const StyledOnrampGraphic = styled(OnrampGraphic)` + position: absolute; + ${({ theme }) => { return css` height: 4rem; + right: ${theme.spacing('7xl')}; - @media ${theme.breakpoints.down('s')} { - position: absolute; + @media ${theme.breakpoints.down('md')} { top: 50%; left: 50%; transform: translate(-50%, -50%); @@ -153,18 +116,32 @@ const StyledOnrampGraphic = styled(OnrampGraphic)` }} `; -const StyledBanner = styled(Card)` - position: relative; +const StyledEcosystemImg = styled(EcosystemImg)` + ${({ theme }) => { + return css` + position: absolute; + top: 50%; + right: 0.275rem; + width: 26rem; + height: 26rem; + transform: translateY(-50%); + + @media ${theme.breakpoints.down('md')} { + left: 50%; + right: unset; + transform: translate(-50%, -50%); + opacity: 0.2; + } + `; + }} `; export { StyledCarouselWrapper, StyledSlider, - StyledOnrampBanner, - StyledOnrampGraphic, - StyledBannerContent, StyledBanner, - StyledBannerImg, - StyledPressableBanner, - StyledIntractBannerImg + StyledIntractBannerImg, + StyledEcosystemImg, + StyledOnrampGraphic, + StyledBannerContent }; diff --git a/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.tsx b/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.tsx index 2fba64142..97c2d22f0 100644 --- a/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.tsx +++ b/apps/evm/src/pages/Bridge/components/BannerCarousel/BannerCarousel.tsx @@ -9,6 +9,26 @@ import { StyledCarouselWrapper, StyledSlider } from './BannerCarousel.style'; import { OnrampBanner } from './OnrampBanner'; import { IntractBanner } from './IntractBanner'; +function NextArrow(props: any) { + const { className, style, onClick } = props; + + return ( + + ); +} + +function PrevArrow(props: any) { + const { className, style, onClick } = props; + + return ( + + ); +} + const settings: Settings = { dots: true, infinite: true, @@ -19,16 +39,9 @@ const settings: Settings = { slidesToShow: 1, slidesToScroll: 1, pauseOnHover: true, - nextArrow: ( - - ), - prevArrow: ( - - ) + initialSlide: 1, + nextArrow: , + prevArrow: }; type BannerCarouselProps = { diff --git a/apps/evm/src/pages/Bridge/components/BannerCarousel/EcosystemBanner.tsx b/apps/evm/src/pages/Bridge/components/BannerCarousel/EcosystemBanner.tsx index 801898076..bc73f1530 100644 --- a/apps/evm/src/pages/Bridge/components/BannerCarousel/EcosystemBanner.tsx +++ b/apps/evm/src/pages/Bridge/components/BannerCarousel/EcosystemBanner.tsx @@ -1,9 +1,7 @@ import { Flex, H1, P } from '@gobob/ui'; -import bannerSrc from '../../../../assets/ecosystem-banner.png'; - -import { StyledBannerImg } from './BannerCarousel.style'; import { Banner } from './Banner'; +import { StyledEcosystemImg } from './BannerCarousel.style'; type EcosystemBannerProps = { onPress?: () => void; @@ -16,8 +14,8 @@ const EcosystemBanner = ({ onPress }: EcosystemBannerProps) => ( BOB Ecosystem -

    Discover the most exciting projects on BOB.

    - +

    Discover the most exciting projects on BOB.

    + ); diff --git a/apps/evm/src/pages/Bridge/components/BannerCarousel/EcosystemImg.tsx b/apps/evm/src/pages/Bridge/components/BannerCarousel/EcosystemImg.tsx new file mode 100644 index 000000000..cc7ab5f73 --- /dev/null +++ b/apps/evm/src/pages/Bridge/components/BannerCarousel/EcosystemImg.tsx @@ -0,0 +1,249 @@ +import { SVGAttributes } from 'react'; + +export const EcosystemImg = (props: SVGAttributes) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); diff --git a/apps/evm/src/pages/Bridge/components/BannerCarousel/IntractBanner.tsx b/apps/evm/src/pages/Bridge/components/BannerCarousel/IntractBanner.tsx index 0e272fbb1..6de8034f2 100644 --- a/apps/evm/src/pages/Bridge/components/BannerCarousel/IntractBanner.tsx +++ b/apps/evm/src/pages/Bridge/components/BannerCarousel/IntractBanner.tsx @@ -2,10 +2,11 @@ import { Flex, H1, P } from '@gobob/ui'; import bannerSrc from '../../../../assets/intract-logo.png'; -import { StyledIntractBannerImg, StyledPressableBanner } from './BannerCarousel.style'; +import { StyledIntractBannerImg } from './BannerCarousel.style'; +import { Banner } from './Banner'; const IntractBanner = () => ( - ( Intract: BOB Summer Fest -

    Complete quests to boost your Spice earnings

    +

    Complete quests to boost your Spice earnings

    -
    + ); export { IntractBanner }; diff --git a/apps/evm/src/pages/Bridge/components/BannerCarousel/OnrampBanner.tsx b/apps/evm/src/pages/Bridge/components/BannerCarousel/OnrampBanner.tsx index e3b000e66..65f8e5ab6 100644 --- a/apps/evm/src/pages/Bridge/components/BannerCarousel/OnrampBanner.tsx +++ b/apps/evm/src/pages/Bridge/components/BannerCarousel/OnrampBanner.tsx @@ -1,23 +1,24 @@ import { Flex, H1, P } from '@gobob/ui'; -import { StyledBannerContent, StyledOnrampBanner, StyledOnrampGraphic } from './BannerCarousel.style'; +import { StyledBannerContent, StyledOnrampGraphic } from './BannerCarousel.style'; +import { Banner } from './Banner'; type OnrampBannerProps = { onPress?: () => void; }; const OnrampBanner = ({ onPress }: OnrampBannerProps) => ( - - + +

    BOB Gateway is live!

    -

    The fastest and easiest way to bridge BTC to BOB

    +

    The fastest and easiest way to bridge BTC to BOB

    -
    + ); export { OnrampBanner }; diff --git a/apps/evm/src/pages/Bridge/components/BridgeForm/BobBridgeForm.tsx b/apps/evm/src/pages/Bridge/components/BridgeForm/BobBridgeForm.tsx index 5b76f3b21..1dc152e2c 100644 --- a/apps/evm/src/pages/Bridge/components/BridgeForm/BobBridgeForm.tsx +++ b/apps/evm/src/pages/Bridge/components/BridgeForm/BobBridgeForm.tsx @@ -3,8 +3,8 @@ import { Currency, CurrencyAmount, ERC20Token, Ether, Token } from '@gobob/curre import { UINT_256_MAX, useApproval } from '@gobob/hooks'; import { INTERVAL, useMutation, usePrices, useQuery } from '@gobob/react-query'; import { USDC } from '@gobob/tokens'; -import { Flex, Input, TokenData, TokenInput, toast, useForm } from '@gobob/ui'; -import { useAccount, useChainId, useEstimateFeesPerGas, useIsContract, usePublicClient } from '@gobob/wagmi'; +import { Flex, Input, TokenSelectItemProps, TokenInput, toast, useForm } from '@gobob/ui'; +import { useAccount, useChainId, useIsContract, usePublicClient } from '@gobob/wagmi'; import { mergeProps } from '@react-aria/utils'; import { useDebounce } from '@uidotdev/usehooks'; import Big from 'big.js'; @@ -12,7 +12,6 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { Address } from 'viem'; import { AuthButton } from '@gobob/connect-ui'; -import { TransactionDetails } from '../../../../components'; import { L1_CHAIN, L2_CHAIN } from '../../../../constants'; import { useBalances } from '../../../../hooks'; import { @@ -33,7 +32,6 @@ import { useGetTransactions } from '../../hooks'; import { L2BridgeData } from '../../types'; -import { getDuration } from '../../utils/transaction'; import { BridgeAlert } from './BridgeAlert'; @@ -60,7 +58,6 @@ const BobBridgeForm = ({ const publicClient = usePublicClient(); const chainId = useChainId(); const { address, chain } = useAccount(); - const { data: feeData } = useEstimateFeesPerGas(); const { getPrice } = usePrices({ baseUrl: import.meta.env.VITE_MARKET_DATA_API }); const { getBalance } = useBalances(bridgeChainId); @@ -283,7 +280,7 @@ const BobBridgeForm = ({ isApproving: isApprovingUSDC } = useApproval({ amount: isUSDCWithdraw ? (currencyAmount as CurrencyAmount) : undefined, - spender: (USDCCrossBridgeConfig as any)[L1_CHAIN].l2Bridge as Address + spender: USDCCrossBridgeConfig[L2_CHAIN].l2Bridge as Address }); const withdrawMutation = useMutation({ @@ -479,9 +476,9 @@ const BobBridgeForm = ({ const valueUSD = useMemo(() => getUsdValue(ticker, amount), [amount, getUsdValue, ticker]); - const tokenInputItems: TokenData[] = useMemo( + const tokenInputItems: TokenSelectItemProps[] = useMemo( () => - tokens?.map((token): TokenData => { + tokens?.map((token): TokenSelectItemProps => { const balance = getBalance(token.l1Currency.symbol); return { @@ -511,14 +508,6 @@ const BobBridgeForm = ({ const balance = tokenBalance?.toExact() || '0'; const humanBalance = tokenBalance?.toSignificant(); - const calculateGasEstimate = useMemo( - () => - feeData?.gasPrice - ? gasEstimateMutation.data?.multiply(feeData.gasPrice) - : selectedCurrency && CurrencyAmount.fromRawAmount(selectedCurrency, 0n), - [feeData?.gasPrice, gasEstimateMutation.data, selectedCurrency] - ); - return ( )} {isBridgeDisabled && selectedToken && } - setGasTicker(ticker)} - /> = { + announcement - + ) }} i18nKey='bridge.alert.alex' diff --git a/apps/evm/src/pages/Bridge/components/BridgeForm/BridgeForm.style.tsx b/apps/evm/src/pages/Bridge/components/BridgeForm/BridgeForm.style.tsx index 10faacfe1..ab4e08987 100644 --- a/apps/evm/src/pages/Bridge/components/BridgeForm/BridgeForm.style.tsx +++ b/apps/evm/src/pages/Bridge/components/BridgeForm/BridgeForm.style.tsx @@ -1,19 +1,29 @@ -import { Radio } from '@gobob/ui'; +import { Flex, Radio } from '@gobob/ui'; import styled from 'styled-components'; -type StyledRadioProps = { - $isSelected: boolean; -}; - -const StyledRadio = styled(Radio)` - border: ${({ theme, $isSelected }) => - `1px solid ${$isSelected ? theme.color('primary-500') : theme.color('grey-400')}`}; +const StyledRadio = styled(Radio)` + border-width: 1px; + border-style: solid; + border-color: ${({ theme }) => theme.color('grey-400')}; border-radius: ${({ theme }) => theme.rounded('md')}; - background-color: ${({ theme }) => theme.color('grey-800')}; + background-color: ${({ theme }) => theme.color('grey-600')}; padding: ${({ theme }) => `${theme.spacing('lg')} ${theme.spacing('lg')}`}; flex: 1; margin-right: ${({ theme }) => theme.spacing('lg')}; + &[data-selected] { + /* border-color: ${({ theme }) => theme.color('primary-500')}; */ + } + + &[data-hover] { + border-color: ${({ theme }) => theme.color('grey-300')}; + } + + &[data-focus] { + border-color: ${({ theme }) => theme.color('light')}; + box-shadow: 0 0 0 1px ${({ theme }) => theme.color('light')}; + } + &:first-of-type { margin-right: ${({ theme }) => theme.spacing('xl')}; } @@ -23,4 +33,9 @@ const StyledRadio = styled(Radio)` } `; -export { StyledRadio }; +const StyledChainsGrid = styled(Flex)` + display: grid; + grid-template-columns: 1fr ${({ theme }) => theme.spacing('xl')} 1fr; +`; + +export { StyledRadio, StyledChainsGrid }; diff --git a/apps/evm/src/pages/Bridge/components/BridgeForm/BridgeForm.tsx b/apps/evm/src/pages/Bridge/components/BridgeForm/BridgeForm.tsx index 2f2d7682a..20a141a60 100644 --- a/apps/evm/src/pages/Bridge/components/BridgeForm/BridgeForm.tsx +++ b/apps/evm/src/pages/Bridge/components/BridgeForm/BridgeForm.tsx @@ -1,12 +1,11 @@ import { ChainId } from '@gobob/chains'; import { TBTC, WBTC } from '@gobob/tokens'; -import { ArrowRight, Divider, Flex, InformationCircle, P, RadioGroup } from '@gobob/ui'; +import { Alert, ArrowRight, Divider, Flex, RadioGroup } from '@gobob/ui'; import { Key, useCallback, useMemo, useState } from 'react'; import { L1_CHAIN, L2_CHAIN } from '../../../../constants'; import { FeatureFlags, useFeatureFlag, useTokens } from '../../../../hooks'; import { BridgeOrigin } from '../../Bridge'; -import { StyledCard } from '../../Bridge.style'; import { useGetTransactions } from '../../hooks'; import { L2BridgeData, OnRampData } from '../../types'; import { ChainSelect } from '../ChainSelect'; @@ -14,7 +13,7 @@ import { ExternalBridgeForm } from '../ExternalBridgeForm'; import { BridgeTransactionModal, OnRampTransactionModal } from '../TransactionModal'; import { BobBridgeForm } from './BobBridgeForm'; -import { StyledRadio } from './BridgeForm.style'; +import { StyledChainsGrid, StyledRadio } from './BridgeForm.style'; import { BtcBridgeForm } from './BtcBridgeForm'; type TransactionModalState = { @@ -49,7 +48,9 @@ const allNetworks = [ ChainId.POLYGON_ZKEVM, ChainId.BSC, ChainId.OPBNB, - ChainId.MOONBEAM + ChainId.MOONBEAM, + ChainId.BITLAYER, + ChainId.MERLIN ] as const; const BridgeForm = ({ @@ -119,7 +120,9 @@ const BridgeForm = ({ const btcTokens = useMemo( () => tokens?.filter( - (token) => token.currency.symbol === TBTC[L2_CHAIN].symbol || token.currency.symbol === WBTC[L2_CHAIN].symbol + (token) => + token.currency.symbol === TBTC[L2_CHAIN as ChainId.OLD_BOB_SEPOLIA]?.symbol || + token.currency.symbol === WBTC[L2_CHAIN as ChainId.OLD_BOB_SEPOLIA]?.symbol ), [tokens] ); @@ -162,11 +165,11 @@ const BridgeForm = ({ return ( <> - + - + onChangeOrigin?.(value as BridgeOrigin)} > - + BOB Bridge - + 3rd Party {type === 'withdraw' && bridgeOrigin === BridgeOrigin.INTERNAL && ( - - -

    - Using the official bridge usually takes 7 days. For faster withdrawals we recommend using a 3rd Party - bridge. -

    -
    + + Using the official bridge usually takes 7 days. For faster withdrawals we recommend using a 3rd Party + bridge. + )} {bridgeOrigin === BridgeOrigin.INTERNAL ? ( chain === 'BTC' && btcTokens?.length ? ( @@ -220,7 +212,7 @@ const BridgeForm = ({ /> ) ) : ( - + )}
    - Available - - } + balanceHelper='Your available balance may differ from your wallet balance due to network fees and available liquidity' currency={BITCOIN} humanBalance={humanBalanceAmount?.toExact()} label='Amount' logoUrl='https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/bitcoin/info/logo.png' - size='lg' valueUSD={valueUSD} {...mergeProps(form.getTokenFieldProps(BRIDGE_AMOUNT), { onValueChange: (value: string) => setAmount(value) diff --git a/apps/evm/src/pages/Bridge/components/BridgeStatus/BridgeStatus.style.tsx b/apps/evm/src/pages/Bridge/components/BridgeStatus/BridgeStatus.style.tsx index 922720578..07b7a61d6 100644 --- a/apps/evm/src/pages/Bridge/components/BridgeStatus/BridgeStatus.style.tsx +++ b/apps/evm/src/pages/Bridge/components/BridgeStatus/BridgeStatus.style.tsx @@ -1,4 +1,4 @@ -import { Spinner, TextLink } from '@gobob/ui'; +import { Spinner, Link } from '@gobob/ui'; import { P } from '@gobob/ui'; import styled from 'styled-components'; import { AuthButton } from '@gobob/connect-ui'; @@ -9,7 +9,7 @@ type StyledPillProps = { $status: BridgeStepStatus; }; -const StyledPill = styled(TextLink)` +const StyledPill = styled(Link)` display: inline-flex; width: min-content; white-space: nowrap; @@ -19,12 +19,12 @@ const StyledPill = styled(TextLink)` border-radius: ${({ theme }) => theme.rounded('full')}; background-color: ${({ theme, $status }) => $status === 'complete' - ? theme.color('grey-400') + ? theme.color('grey-600') : $status === 'ongoing' ? theme.color('green-300') : $status === 'failed' ? theme.color('red-800') - : theme.color('grey-400')}; + : theme.color('grey-600')}; opacity: ${({ $status }) => ($status === 'idle' ? '.7' : '1')}; color: ${({ $status, theme }) => ($status === 'ongoing' ? theme.color('dark') : theme.color('light'))}; diff --git a/apps/evm/src/pages/Bridge/components/ChainSelect/ChainSelect.style.tsx b/apps/evm/src/pages/Bridge/components/ChainSelect/ChainSelect.style.tsx index bbcb101e7..eb10e5d23 100644 --- a/apps/evm/src/pages/Bridge/components/ChainSelect/ChainSelect.style.tsx +++ b/apps/evm/src/pages/Bridge/components/ChainSelect/ChainSelect.style.tsx @@ -3,13 +3,7 @@ import { Select } from '@gobob/ui'; import styled from 'styled-components'; const StyledSelect = styled(Select<{ id: ChainId | 'BTC' }>)` - flex: 1 1 45%; - max-width: 45%; width: 100%; - - button { - padding: ${({ theme }) => `${theme.spacing('lg')} ${theme.spacing('lg')}`}; - } `; export { StyledSelect }; diff --git a/apps/evm/src/pages/Bridge/components/ChainSelect/ChainSelect.tsx b/apps/evm/src/pages/Bridge/components/ChainSelect/ChainSelect.tsx index 7e9470bf8..4bc53321d 100644 --- a/apps/evm/src/pages/Bridge/components/ChainSelect/ChainSelect.tsx +++ b/apps/evm/src/pages/Bridge/components/ChainSelect/ChainSelect.tsx @@ -34,12 +34,12 @@ const ChainSelect = ({ chainId, selectProps }: ChainSelectProps): JSX.Element => return ( diff --git a/apps/evm/src/pages/Bridge/components/ExternalBridgeForm/ExternalBridgeCard.tsx b/apps/evm/src/pages/Bridge/components/ExternalBridgeForm/ExternalBridgeCard.tsx index 9048d15ec..64f9f960d 100644 --- a/apps/evm/src/pages/Bridge/components/ExternalBridgeForm/ExternalBridgeCard.tsx +++ b/apps/evm/src/pages/Bridge/components/ExternalBridgeForm/ExternalBridgeCard.tsx @@ -1,16 +1,15 @@ -import { ArrowTopRightOnSquare, Avatar, Card, Flex, P } from '@gobob/ui'; +import { ArrowTopRightOnSquare, Avatar, Card, Flex, Link, P } from '@gobob/ui'; -import { StyledAnchor, StyledExternalBridgeCard } from './ExternalBridgeForm.style'; import { Meson } from './Meson'; import { Owl } from './Owl'; import { Relay } from './Relay'; import { Stargate } from './Stargate'; -type Bridges = 'stargate' | 'relay' | 'meson' | 'orbiter-finance' | 'owlto-finance'; +type ExternalBridges = 'stargate' | 'relay' | 'meson' | 'orbiter-finance' | 'owlto-finance'; // TODO: add missing links const bridges: Record< - Bridges, + ExternalBridges, { icon: any | string; href: string | { deposit: string; withdraw: string }; name: string; disabled: boolean } > = { stargate: { @@ -48,20 +47,22 @@ const bridges: Record< } }; -type Props = { type: 'deposit' | 'withdraw'; bridge: Bridges }; +type Props = { type: 'deposit' | 'withdraw'; bridge: ExternalBridges }; type ExternalBridgeCardProps = Props; const ExternalBridgeCard = ({ type, bridge }: ExternalBridgeCardProps): JSX.Element => { const { href, name, icon: Icon, disabled } = bridges[bridge]; + const typeHref = typeof href === 'string' ? href : href[type]; - const card = ( - )} - - ); - - if (disabled) { - return card; - } - - const typeHref = typeof href === 'string' ? href : href[type]; - - return ( - - {card} - + ); }; export { ExternalBridgeCard }; +export type { ExternalBridges }; diff --git a/apps/evm/src/pages/Bridge/components/ExternalBridgeForm/ExternalBridgeForm.style.tsx b/apps/evm/src/pages/Bridge/components/ExternalBridgeForm/ExternalBridgeForm.style.tsx deleted file mode 100644 index 790564029..000000000 --- a/apps/evm/src/pages/Bridge/components/ExternalBridgeForm/ExternalBridgeForm.style.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Card } from '@gobob/ui'; -import styled from 'styled-components'; - -type StyledExternalBridgeCardProps = { - $isDisabled: boolean; -}; - -const StyledAnchor = styled.a` - flex: 1; - text-decoration: none; -`; - -const StyledExternalBridgeCard = styled(Card)` - opacity: ${({ $isDisabled }) => $isDisabled && '0.5'}; -`; - -export { StyledAnchor, StyledExternalBridgeCard }; diff --git a/apps/evm/src/pages/Bridge/components/ExternalBridgeForm/ExternalBridgeForm.tsx b/apps/evm/src/pages/Bridge/components/ExternalBridgeForm/ExternalBridgeForm.tsx index 1c76fa501..60599a715 100644 --- a/apps/evm/src/pages/Bridge/components/ExternalBridgeForm/ExternalBridgeForm.tsx +++ b/apps/evm/src/pages/Bridge/components/ExternalBridgeForm/ExternalBridgeForm.tsx @@ -1,52 +1,29 @@ import { Flex } from '@gobob/ui'; +import { ChainId } from '@gobob/chains'; -import { ExternalBridgeCard } from './ExternalBridgeCard'; +import { ExternalBridgeCard, ExternalBridges } from './ExternalBridgeCard'; type ExternalBridgeFormProps = { type: 'deposit' | 'withdraw'; + chain: ChainId | 'BTC'; }; -const ExternalBridgeForm = ({ type }: ExternalBridgeFormProps): JSX.Element => { - // const { data: tokens } = useTokens(chainId); +const defaultBridges: ExternalBridges[] = ['meson', 'orbiter-finance', 'owlto-finance', 'relay', 'stargate']; - // const [token, setToken] = useState(NATIVE[chainId].symbol); +const availableBridges: Partial> = { + [ChainId.MERLIN]: ['owlto-finance'], + [ChainId.BITLAYER]: ['owlto-finance'] +}; - // const items: Array<{ ticker: string; logoUrl: string }> = useMemo( - // () => - // tokens?.map((token) => { - // return { - // ticker: token.currency.symbol, - // logoUrl: token.raw.logoUrl - // }; - // }) || [], - // [tokens] - // ); +const ExternalBridgeForm = ({ type, chain }: ExternalBridgeFormProps): JSX.Element => { + const bridges = availableBridges[chain] || defaultBridges; return ( - {/* */} - - - - - + {bridges.map((bridge) => ( + + ))} ); diff --git a/apps/evm/src/pages/Bridge/components/TransactionList/TransactionDetails.tsx b/apps/evm/src/pages/Bridge/components/TransactionList/TransactionDetails.tsx index 49a995408..2bc6a0598 100644 --- a/apps/evm/src/pages/Bridge/components/TransactionList/TransactionDetails.tsx +++ b/apps/evm/src/pages/Bridge/components/TransactionList/TransactionDetails.tsx @@ -38,10 +38,10 @@ const TransactionDetails = ({ return ( -

    +

    {direactionLabel}

    -

    +

    {formatDistanceToNow(date)} ago

    @@ -49,14 +49,14 @@ const TransactionDetails = ({ - +

    {amount.toExact()} {amount.currency.symbol}

    - {isExpandable && } + {isExpandable && }
    diff --git a/apps/evm/src/pages/Bridge/components/TransactionList/TransactionList.style.tsx b/apps/evm/src/pages/Bridge/components/TransactionList/TransactionList.style.tsx index 69c699521..f1ce59026 100644 --- a/apps/evm/src/pages/Bridge/components/TransactionList/TransactionList.style.tsx +++ b/apps/evm/src/pages/Bridge/components/TransactionList/TransactionList.style.tsx @@ -38,13 +38,6 @@ const StyledTransactionListWrapper = styled(Flex)` overflow: hidden; `; -const StyledViewTransactions = styled.a` - display: flex; - justify-content: space-between; - text-decoration: none; - flex-shrink: 0; -`; - const StyledDetailsButton = styled(Flex)` font: inherit; display: flex; @@ -66,6 +59,5 @@ export { StyledSpan, StyledSpinnerWrapper, StyledTransactionList, - StyledTransactionListWrapper, - StyledViewTransactions + StyledTransactionListWrapper }; diff --git a/apps/evm/src/pages/Bridge/components/TransactionList/TransactionList.tsx b/apps/evm/src/pages/Bridge/components/TransactionList/TransactionList.tsx index cba37e541..7703e2774 100644 --- a/apps/evm/src/pages/Bridge/components/TransactionList/TransactionList.tsx +++ b/apps/evm/src/pages/Bridge/components/TransactionList/TransactionList.tsx @@ -1,4 +1,4 @@ -import { ArrowTopRightOnSquare, CardProps, Divider, Flex, H2, P, Span, Spinner } from '@gobob/ui'; +import { CardProps, Divider, Flex, H2, Link, P, Spinner } from '@gobob/ui'; import { useAccount } from '@gobob/wagmi'; import { Fragment, useMemo } from 'react'; @@ -12,8 +12,7 @@ import { StyledSpan, StyledSpinnerWrapper, StyledTransactionList, - StyledTransactionListWrapper, - StyledViewTransactions + StyledTransactionListWrapper } from './TransactionList.style'; type TransactionListProps = CardProps; @@ -90,12 +89,9 @@ const TransactionList = (props: TransactionListProps): JSX.Element => { - - - View All Transactions - - - + + View All Transactions + ); }; diff --git a/apps/evm/src/pages/Bridge/components/TransactionModal/BridgeTransactionModal.tsx b/apps/evm/src/pages/Bridge/components/TransactionModal/BridgeTransactionModal.tsx index 1bf95bee4..4adb3986d 100644 --- a/apps/evm/src/pages/Bridge/components/TransactionModal/BridgeTransactionModal.tsx +++ b/apps/evm/src/pages/Bridge/components/TransactionModal/BridgeTransactionModal.tsx @@ -56,7 +56,7 @@ const BridgeTransactionModal = ({ return ( {title} - + {!isSubmitted && } diff --git a/apps/evm/src/pages/Bridge/components/TransactionModal/OnRampTransactionModal.tsx b/apps/evm/src/pages/Bridge/components/TransactionModal/OnRampTransactionModal.tsx index f37c19445..44f638f8d 100644 --- a/apps/evm/src/pages/Bridge/components/TransactionModal/OnRampTransactionModal.tsx +++ b/apps/evm/src/pages/Bridge/components/TransactionModal/OnRampTransactionModal.tsx @@ -34,7 +34,7 @@ const OnRampTransactionModal = ({ amount, txid, fee, onClose, ...props }: OnRamp return ( {title} - + {!isSubmitted && } diff --git a/apps/evm/src/pages/Bridge/hooks/useCrossChainMessenger.ts b/apps/evm/src/pages/Bridge/hooks/useCrossChainMessenger.ts index 76dcaa694..b2f6af1ec 100644 --- a/apps/evm/src/pages/Bridge/hooks/useCrossChainMessenger.ts +++ b/apps/evm/src/pages/Bridge/hooks/useCrossChainMessenger.ts @@ -12,7 +12,7 @@ import { wstETH } from '../../../constants/assets'; class USDCBridgeAdapter extends StandardBridgeAdapter { async supportsTokenPair(l1Token: AddressLike, l2Token: AddressLike): Promise { return ( - isAddressEqual(l1Token as Address, USDC[L1_CHAIN as ChainId.ETHEREUM].address) && + isAddressEqual(l1Token as Address, USDC[L1_CHAIN].address) && isAddressEqual(l2Token as Address, USDC[L2_CHAIN].address) ); } @@ -21,14 +21,14 @@ class USDCBridgeAdapter extends StandardBridgeAdapter { class WSTETHBridgeAdapter extends StandardBridgeAdapter { async supportsTokenPair(l1Token: AddressLike, l2Token: AddressLike): Promise { return ( - isAddressEqual(l1Token as Address, wstETH[L1_CHAIN as ChainId.ETHEREUM].address) && - isAddressEqual(l2Token as Address, wstETH[L2_CHAIN].address) + isAddressEqual(l1Token as Address, wstETH[L1_CHAIN].address) && + isAddressEqual(l2Token as Address, wstETH[L2_CHAIN as ChainId.OLD_BOB_SEPOLIA].address) ); } } const configConduit = { - [ChainId.ETHEREUM]: { + [ChainId.BOB]: { AddressManager: '0xF2dc77c697e892542cC53336178a78Bb313DFDC7', BondManager: '0x0000000000000000000000000000000000000000', CanonicalTransactionChain: '0x0000000000000000000000000000000000000000', @@ -38,7 +38,7 @@ const configConduit = { OptimismPortal: '0x8AdeE124447435fE03e3CD24dF3f4cAE32E65a3E', StateCommitmentChain: '0x0000000000000000000000000000000000000000' }, - [ChainId.SEPOLIA]: { + [ChainId.OLD_BOB_SEPOLIA]: { AddressManager: '0x92B5c849AE767d2D64E9460dD15cC7d19D70084C', BondManager: '0x0000000000000000000000000000000000000000', CanonicalTransactionChain: '0x0000000000000000000000000000000000000000', @@ -47,37 +47,52 @@ const configConduit = { L2OutputOracle: '0x14D0069452b4AE2b250B395b8adAb771E4267d2f', OptimismPortal: '0x867B1Aa872b9C8cB5E9F7755feDC45BB24Ad0ae4', StateCommitmentChain: '0x0000000000000000000000000000000000000000' + }, + [ChainId.BOB_SEPOLIA]: { + AddressManager: '0x98Ba8b9cF38732db65c7E556617135A0E6669F57', + BondManager: '0x0000000000000000000000000000000000000000', + CanonicalTransactionChain: '0x0000000000000000000000000000000000000000', + L1CrossDomainMessenger: '0xB88164eE7669f1C736A55121160daB9c82b62d55', + L1StandardBridge: '0x75f48FE4DeAB3F9043EE995c3C84D6a2303D9a2F', + L2OutputOracle: '0xd1cBBC06213B7E14e99aDFfFeF1C249E6f9537e0', + OptimismPortal: '0xBAAf3BAfdbd660380938b27d21c31bB7D072a799', + StateCommitmentChain: '0x0000000000000000000000000000000000000000' } }; export const USDCCrossBridgeConfig = { - [ChainId.ETHEREUM]: { + [ChainId.BOB]: { Adapter: USDCBridgeAdapter, l1Bridge: '0x450D55a4B4136805B0e5A6BB59377c71FC4FaCBb', l2Bridge: '0xe497788F8Fcc30B773C9A181a0FFE2e60645cE90' }, - [ChainId.SEPOLIA]: { + [ChainId.BOB_SEPOLIA]: { + Adapter: USDCBridgeAdapter, + l1Bridge: '0xA932eD4b73972c37DC4a691E8eC6f2C8a13951BE', + l2Bridge: '0x5C2A45A35ba99d8Ee58c4bB96e2Ce30dA86C530b' + }, + [ChainId.OLD_BOB_SEPOLIA]: { Adapter: USDCBridgeAdapter, l1Bridge: '0x0032303Dd587d74f79BFa3070A6293cb7cD5a4E7', l2Bridge: '0xc10C96F93eE4AB710C97b7c058C3DAca6b665eF7' } -}; +} satisfies Record; const wstETHCrossBridgeConfig = { - [ChainId.ETHEREUM]: { + [ChainId.BOB]: { Adapter: WSTETHBridgeAdapter, l1Bridge: '0x091dF5E1284E49fA682407096aD34cfD42B95B72', l2Bridge: '0xd1559523374D93972E0F7fE1AA98642754f5c4d1' }, - [ChainId.SEPOLIA]: { + [ChainId.OLD_BOB_SEPOLIA]: { Adapter: WSTETHBridgeAdapter, l1Bridge: '0x633464fF59E3FC760728d268BD4747d08D343D27', l2Bridge: '0x91a55b1294e63347AbeA88011f3B80E8643E56B3' } -}; +} satisfies Record; const getCrossChainConfig = () => { - const config = (configConduit as any)[L1_CHAIN]; + const config = configConduit[L2_CHAIN]; return { l1ChainId: L1_CHAIN, @@ -97,8 +112,8 @@ const getCrossChainConfig = () => { l1Bridge: config.L1StandardBridge, l2Bridge: '0x4200000000000000000000000000000000000010' // Pre-deploy }, - USDC: (USDCCrossBridgeConfig as any)[L1_CHAIN], - wstETH: (wstETHCrossBridgeConfig as any)[L1_CHAIN] + USDC: USDCCrossBridgeConfig[L2_CHAIN], + ...(L2_CHAIN === ChainId.BOB_SEPOLIA ? undefined : { wstETH: wstETHCrossBridgeConfig[L2_CHAIN] }) }, bedrock: true } as const; diff --git a/apps/evm/src/pages/Bridge/hooks/useGetBridgeTransactions.ts b/apps/evm/src/pages/Bridge/hooks/useGetBridgeTransactions.ts index cea254117..b62faec59 100644 --- a/apps/evm/src/pages/Bridge/hooks/useGetBridgeTransactions.ts +++ b/apps/evm/src/pages/Bridge/hooks/useGetBridgeTransactions.ts @@ -7,7 +7,7 @@ import { TransactionReceipt, isAddressEqual } from 'viem'; import { GetWithdrawalStatusReturnType, getL2TransactionHashes, getWithdrawals } from 'viem/op-stack'; import { ChainId } from '@gobob/chains'; -import { L1_CHAIN, L2_CHAIN, isProd } from '../../../constants'; +import { L1_CHAIN, L2_CHAIN } from '../../../constants'; import { usePublicClientL1, usePublicClientL2 } from '../../../hooks'; import { bridgeKeys, queryClient } from '../../../lib/react-query'; import { MessageDirection, MessageStatus, TransactionType } from '../types'; @@ -118,12 +118,21 @@ const getWithdrawBridgeTransactions = gql` } `; -const indexerNetworkL1 = isProd ? 'mainnet' : 'sepolia'; -const indexerNetworkL2 = isProd ? 'bob' : 'bob-testnet'; +const { deposit: depositUrlPath, withdraw: withdrawUrlPath } = { + [ChainId.BOB]: { deposit: 'bridge-deposits-mainnet/1.0/gn', withdraw: 'bridge-withdraws-bob/1.0/gn' }, + [ChainId.OLD_BOB_SEPOLIA]: { + deposit: 'bridge-deposits-sepolia/1.0', + withdraw: 'bridge-withdraws-bob-testnet/1.0/gn' + }, + [ChainId.BOB_SEPOLIA]: { + deposit: 'testnet-bridge-deposits-sepolia/test/gn', + withdraw: 'testnet-bridge-withdraws-bob-sepolia/test/gn' + } +}[L2_CHAIN]; -const depositsUrl = `${import.meta.env.VITE_INDEXER_URL}/bridge-deposits-${indexerNetworkL1}/1.0/gn`; +const depositsUrl = `${import.meta.env.VITE_INDEXER_URL}/${depositUrlPath}`; -const withdrawUrl = `${import.meta.env.VITE_INDEXER_URL}/bridge-withdraws-${indexerNetworkL2}/1.0/gn`; +const withdrawUrl = `${import.meta.env.VITE_INDEXER_URL}/${withdrawUrlPath}`; const mapStatus = { 'waiting-to-prove': MessageStatus.STATE_ROOT_NOT_PUBLISHED, @@ -433,7 +442,7 @@ const useGetBridgeTransactions = () => { request(depositsUrl, getDepositBridgeTransactions, { address }), request(withdrawUrl, getWithdrawBridgeTransactions, { address, - westEthAddress: wstETH[L2_CHAIN].address.toLowerCase() + westEthAddress: L2_CHAIN === ChainId.BOB_SEPOLIA ? undefined : wstETH[L2_CHAIN].address.toLowerCase() }) ]); diff --git a/apps/evm/src/pages/Fusion/Fusion.tsx b/apps/evm/src/pages/Fusion/Fusion.tsx index 0d5c1658b..36abeb69e 100644 --- a/apps/evm/src/pages/Fusion/Fusion.tsx +++ b/apps/evm/src/pages/Fusion/Fusion.tsx @@ -47,7 +47,7 @@ const Fusion = () => { return ( -
    +
    diff --git a/apps/evm/src/pages/Fusion/components/Dashboard/Dashboard.tsx b/apps/evm/src/pages/Fusion/components/Dashboard/Dashboard.tsx index b1823962c..99f22c024 100644 --- a/apps/evm/src/pages/Fusion/components/Dashboard/Dashboard.tsx +++ b/apps/evm/src/pages/Fusion/components/Dashboard/Dashboard.tsx @@ -1,11 +1,10 @@ -import { Card, Flex, InformationCircle, P, TextLink } from '@gobob/ui'; +import { Card, Flex, P, Link, Alert } from '@gobob/ui'; import { useAccount } from '@gobob/wagmi'; import { useTranslation } from 'react-i18next'; import { useMemo } from 'react'; import { useGetUser } from '../../../../hooks'; import { LoginSignUp } from '../LoginSignUp'; -import { StyledCard } from '../PartnersAndChallenges/PartnerCard.style'; import { ProjectStatus } from '../ProjectStatus'; import { UserStats } from '../UserStats'; import { useHaltedLockedTokens } from '../../hooks'; @@ -23,15 +22,14 @@ const Dashboard = () => { return ( - - + {hasAlex ? (

    Due to an exploit involving the XLink bridge, Alex Lab has disabled bridging and withdrawing ALEX. You can migrate the ALEX tokens that you have in Fusion Season 1 to ALEX V2. For additional details see the{' '} - + announcement from ALEX Lab - + .

    ) : ( @@ -39,7 +37,7 @@ const Dashboard = () => { {t('fusion.spiceWaitTime')}

    )} -
    + diff --git a/apps/evm/src/pages/Fusion/components/Info/Info.style.tsx b/apps/evm/src/pages/Fusion/components/Info/Info.style.tsx index 2a3d26e83..f8e98d49b 100644 --- a/apps/evm/src/pages/Fusion/components/Info/Info.style.tsx +++ b/apps/evm/src/pages/Fusion/components/Info/Info.style.tsx @@ -8,7 +8,7 @@ const StyledTableP = styled(P)` const StyledList = styled.ul` list-style-type: disc; margin-left: ${({ theme }) => theme.spacing('3xl')}; - color: ${({ theme }) => theme.color('grey-200')}; + color: ${({ theme }) => theme.color('grey-50')}; `; export { StyledTableP, StyledList }; diff --git a/apps/evm/src/pages/Fusion/components/Info/Info.tsx b/apps/evm/src/pages/Fusion/components/Info/Info.tsx index b6c62dabf..63b97395c 100644 --- a/apps/evm/src/pages/Fusion/components/Info/Info.tsx +++ b/apps/evm/src/pages/Fusion/components/Info/Info.tsx @@ -1,4 +1,4 @@ -import { Accordion, AccordionItem, Alert, Card, Flex, H1, H2, P, Span, Table, TextLink } from '@gobob/ui'; +import { Accordion, AccordionItem, Alert, Card, Flex, H1, H2, P, Span, Table, Link } from '@gobob/ui'; import { ReactNode } from 'react'; import { Trans, useTranslation } from 'react-i18next'; @@ -78,7 +78,7 @@ type SpiceMeterProps = { const SpiceMeter = ({ isHigh, isLow, isMedium, label }: SpiceMeterProps) => ( {label && ( - + {label}: )} @@ -91,7 +91,7 @@ const SpiceMeter = ({ isHigh, isLow, isMedium, label }: SpiceMeterProps) => ( {isMedium && ( <> {isLow && ( - + / )} @@ -103,7 +103,7 @@ const SpiceMeter = ({ isHigh, isLow, isMedium, label }: SpiceMeterProps) => ( {isHigh && ( <> {isMedium && ( - + / )} @@ -134,7 +134,7 @@ const Info = () => {

    What is BOB Fusion Season 2?

    -

    +

    BOB Fusion is the official points program of BOB, where users can harvest Spice (points) based on:

    @@ -143,21 +143,21 @@ const Info = () => {
  • Referrals ({})
  • Quests and special events ({})
  • -

    +

    Intract XP converts into Spice in a 1:100 ratio. E.g. if you have 1000 XP from BOB campaigns, it will be converted to 100,000 Spice and added to your BOB Fusion Dashboard.

    -

    DApps can use the BOB Fusion system to bootstrap their launch on BOB.

    +

    DApps can use the BOB Fusion system to bootstrap their launch on BOB.

    -

    +

    Season 1 started on 27/03/2024 and ended with the BOB mainnet launch on 1st May 2024. During Season 1, users harvested Spice by locking in whitelisted assets with different multipliers. The on-chain TVL for Season 1 reached a whopping 300 Million USD in just 4 weeks.

    -

    +

    Season 2 started on 1st May 2024 with more ways to harvest Spice based on-chain activity. Below are different ways in which you can harvest Spice during Season 2.

    @@ -168,12 +168,12 @@ const Info = () => {

    Spice System

    -

    Spice represents a users or projects support to the growth of the BOB ecosystem.

    +

    Spice represents a users or projects support to the growth of the BOB ecosystem.

    }>

    Harvesting

    -

    +

    Supplying TVL into dApps generates the most Spice. Exact amount depends on the asset (see multipliers) and the dApp. Higher effort/risk and benefit for the ecosystem results in more Spice.

    @@ -187,7 +187,7 @@ const Info = () => {

    Distribution

    -

    +

    TVL Spice points are allocated to dApps that re-distribute them to users. Distribution may vary from project to project (e.g. special bonuses or requirements). DYOR.

    @@ -200,18 +200,18 @@ const Info = () => { >

    Harvesting

    -

    You also harvest Spice when you use dApps participating in BOB Fusion.

    +

    You also harvest Spice when you use dApps participating in BOB Fusion.

    Rate limits and anti-spam measures are in place. Extreme cases of spamming may lead to exclusion from BOB Fusion. -

    This Spice is split 50:50 between user and dApp.

    +

    This Spice is split 50:50 between user and dApp.

  • User points: directly distributed
  • dApp points: dApps redistribute to their LPs (DeFi), creators (NFTs) and or via special quests.
  • Distribution

    -

    +

    TVL Spice points are allocated to dApps that re-distribute them to users. Distribution may vary from project to project (e.g. special bonuses or requirements). DYOR.

    @@ -228,9 +228,9 @@ const Info = () => { >

    Harvesting

    -

    Users can harvest Spice by completing quests of the Galxe or Intract campaign.

    +

    Users can harvest Spice by completing quests of the Galxe or Intract campaign.

    Distribution

    -

    +

    Invite users to join BOB Fusion and get 15% Spice for direct invites and 7% for invites of your invitees. The referral bonus is calculated based on ALL Spice the referred users harvest until the end of the BOB Fusion campaign, across all of the apps they use (excluding points they collect from their @@ -252,9 +252,9 @@ const Info = () => { >

    Harvesting

    -

    Users can harvest Spice by completing quests of the Galxe or Intract campaign.

    +

    Users can harvest Spice by completing quests of the Galxe or Intract campaign.

    Distribution

    -

    +

    Users will earn points with the respective campaign website (Galxe or Intract) which will be manually added to their Spice balance by the BOB team at after the campaign ended.

    @@ -266,11 +266,11 @@ const Info = () => {

    {t('fusion.community.title')}

    -

    +

    , - discordLink: + xLink: , + discordLink: }} i18nKey='fusion.community.content' /> @@ -280,19 +280,19 @@ const Info = () => {

    For Projects

    -

    +

    Reach out to the team on{' '} { - + Telegram - + }{' '} to learn more about the opportunities for builders to grow their project with our BOB Fusion campaign or read our{' '} { - + project checklist - + }{' '} that includes information about how to whitelist your dApp or add custom assets to the BOB Fusion campaign.

    diff --git a/apps/evm/src/pages/Fusion/components/LoginSignUp/LoginSignUp.tsx b/apps/evm/src/pages/Fusion/components/LoginSignUp/LoginSignUp.tsx index 2f18c1a6e..d1830c7f8 100644 --- a/apps/evm/src/pages/Fusion/components/LoginSignUp/LoginSignUp.tsx +++ b/apps/evm/src/pages/Fusion/components/LoginSignUp/LoginSignUp.tsx @@ -13,7 +13,7 @@ const LoginSignUp = () => {

    {t('fusion.logIn.title')}

    -

    +

    {t('fusion.logIn.content')}

    diff --git a/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnerCard.style.tsx b/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnerCard.style.tsx index f136b9ddc..b77a0796a 100644 --- a/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnerCard.style.tsx +++ b/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnerCard.style.tsx @@ -10,12 +10,6 @@ const StyledCategoryTag = styled(P)` `} `; -const StyledCard = styled(Card)` - background: rgba(0, 0, 0, 0.2); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -`; - const StyledGrid = styled.div` width: 100%; display: grid; @@ -54,4 +48,4 @@ const StyledIconWrapper = styled('div')` left: 4px; `; -export { StyledCategoryTag, StyledGrid, StyledCard, StyledPartnerCard, StyledLiveTag, StyledIconWrapper }; +export { StyledCategoryTag, StyledGrid, StyledPartnerCard, StyledLiveTag, StyledIconWrapper }; diff --git a/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnerCard.tsx b/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnerCard.tsx index f9c05d92f..c96405fac 100644 --- a/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnerCard.tsx +++ b/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnerCard.tsx @@ -88,7 +88,7 @@ const PartnerCard = ({ > @@ -149,7 +149,7 @@ const PartnerCard = ({

    } > - + )}
    diff --git a/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnersAndChallenges.tsx b/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnersAndChallenges.tsx index 985743cb6..4e60e108a 100644 --- a/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnersAndChallenges.tsx +++ b/apps/evm/src/pages/Fusion/components/PartnersAndChallenges/PartnersAndChallenges.tsx @@ -1,5 +1,5 @@ import { INTERVAL, useQuery } from '@gobob/react-query'; -import { Flex, H2, H3, InformationCircle, P, Spinner, TextLink, useLocale } from '@gobob/ui'; +import { Flex, H2, H3, InformationCircle, P, Spinner, Link, useLocale } from '@gobob/ui'; import { Trans, useTranslation } from 'react-i18next'; import { useCallback, useMemo } from 'react'; @@ -7,7 +7,7 @@ import { useGetUser } from '../../../../hooks'; import { apiClient } from '../../../../utils'; import { PartnerCard } from './PartnerCard'; -import { StyledCard, StyledGrid } from './PartnerCard.style'; +import { StyledPartnerCard, StyledGrid } from './PartnerCard.style'; function getImageUrl(name: string) { return new URL(`../../../../assets/partners/${name.split(' ').join('').toLowerCase()}.png`, import.meta.url).href; @@ -93,11 +93,11 @@ const PartnersAndChallenges = () => {

    {t('fusion.challenges.title')}

    -

    +

    {

    {t('fusion.partners.title')}

    -

    {t('fusion.partners.content')}

    +

    {t('fusion.partners.content')}

    Top Harvesters

    @@ -183,12 +183,12 @@ const PartnersAndChallenges = () => {
    )} - +

    {t('fusion.partners.alert')}

    -
    +
    ); }; diff --git a/apps/evm/src/pages/Fusion/components/ProjectStatus/ProjectStatus.tsx b/apps/evm/src/pages/Fusion/components/ProjectStatus/ProjectStatus.tsx index 4e90f5a2c..2c3a54b07 100644 --- a/apps/evm/src/pages/Fusion/components/ProjectStatus/ProjectStatus.tsx +++ b/apps/evm/src/pages/Fusion/components/ProjectStatus/ProjectStatus.tsx @@ -13,15 +13,8 @@ const ProjectStatus = () => { - - + + {t('fusion.status')} @@ -34,7 +27,7 @@ const ProjectStatus = () => { -

    +

    {t('fusion.seasonDescription')}

    diff --git a/apps/evm/src/pages/Fusion/components/UserStats/DepositedAssets.tsx b/apps/evm/src/pages/Fusion/components/UserStats/DepositedAssets.tsx index fad124189..850e3cdb0 100644 --- a/apps/evm/src/pages/Fusion/components/UserStats/DepositedAssets.tsx +++ b/apps/evm/src/pages/Fusion/components/UserStats/DepositedAssets.tsx @@ -91,7 +91,7 @@ const DepositedAssets = () => { @@ -101,7 +101,7 @@ const DepositedAssets = () => { ) : ( - + ))} diff --git a/apps/evm/src/pages/Fusion/components/UserStats/ReferralCode.tsx b/apps/evm/src/pages/Fusion/components/UserStats/ReferralCode.tsx index a2e3f2efc..3f7e18b1d 100644 --- a/apps/evm/src/pages/Fusion/components/UserStats/ReferralCode.tsx +++ b/apps/evm/src/pages/Fusion/components/UserStats/ReferralCode.tsx @@ -30,7 +30,7 @@ const ReferralCode = () => { @@ -41,7 +41,7 @@ const ReferralCode = () => { ) : ( {t('fusion.userStats.revealCodeInfo')}

    }> - +
    )} diff --git a/apps/evm/src/pages/Fusion/components/WithdrawForm/WithdrawForm.tsx b/apps/evm/src/pages/Fusion/components/WithdrawForm/WithdrawForm.tsx index af90251b7..b97ed9c40 100644 --- a/apps/evm/src/pages/Fusion/components/WithdrawForm/WithdrawForm.tsx +++ b/apps/evm/src/pages/Fusion/components/WithdrawForm/WithdrawForm.tsx @@ -158,13 +158,13 @@ const WithdrawForm = ({ isSmartAccount, onWithdrawalMutationComplete }: Withdraw return ( <> {isOthersWithdrawNeeded && isUSDTWithdrawNeeded && ( -

    +

    USDT can only be withdrawn to Ethereum. When bridging to BOB, you will be prompted to sign twice: Once to bridge your assets (without USDT) to BOB and once to withdraw USDT to Ethereum

    )} {!isOthersWithdrawNeeded && isUSDTWithdrawNeeded && ( -

    +

    USDT can only be withdrawn to Ethereum.

    )} @@ -179,9 +179,9 @@ const WithdrawForm = ({ isSmartAccount, onWithdrawalMutationComplete }: Withdraw {t('fusion.withdrawModal.bridgeLabel')} )} -

    +

    }} + components={{ strong: }} i18nKey='fusion.withdrawModal.withdrawDescription' />

    diff --git a/apps/evm/src/pages/Fusion/components/WithdrawModal/WithdrawModal.tsx b/apps/evm/src/pages/Fusion/components/WithdrawModal/WithdrawModal.tsx index f065501af..f7707b09f 100644 --- a/apps/evm/src/pages/Fusion/components/WithdrawModal/WithdrawModal.tsx +++ b/apps/evm/src/pages/Fusion/components/WithdrawModal/WithdrawModal.tsx @@ -1,18 +1,4 @@ -import { - Dd, - Divider, - Dl, - DlGroup, - Dt, - Flex, - H2, - Modal, - ModalBody, - ModalHeader, - ModalProps, - P, - TextLink -} from '@gobob/ui'; +import { Dd, Divider, Dl, DlGroup, Dt, Flex, H2, Modal, ModalBody, ModalHeader, ModalProps, P, Link } from '@gobob/ui'; import { useLocale } from '@gobob/ui'; import { t } from 'i18next'; import { Trans } from 'react-i18next'; @@ -53,7 +39,7 @@ const WithdrawModal = ({ isSmartAccount, onClose, onWithdrawalMutationComplete,
    -

    +

    -

    +

    -

    +

    {t('fusion.withdrawModal.seasonTwoDescription')}

    diff --git a/apps/evm/src/pages/Home/components/BackersCard/BackersCard.tsx b/apps/evm/src/pages/Home/components/BackersCard/BackersCard.tsx index ec95f985b..21d62af38 100644 --- a/apps/evm/src/pages/Home/components/BackersCard/BackersCard.tsx +++ b/apps/evm/src/pages/Home/components/BackersCard/BackersCard.tsx @@ -17,7 +17,6 @@ const BackersCard = (): JSX.Element => ( { /> {!isMobile && displayTvl && ( - + {t('home.hero.season_one_tvl')}: @@ -67,14 +67,13 @@ const HeroSection = (): JSX.Element => { alignItems='center' alignSelf='normal' background='grey-700' - bordered={false} gap='2xl' marginTop='2xl' paddingX={{ base: '2xl', s: '2xl', md: '2xl' }} paddingY={{ base: '4xl', md: '6xl' }} rounded='s' > - + {t('home.hero.season_one_tvl')} diff --git a/apps/evm/src/pages/Home/components/InfoSection/InfoSection.tsx b/apps/evm/src/pages/Home/components/InfoSection/InfoSection.tsx index 547caeaad..682f6beae 100644 --- a/apps/evm/src/pages/Home/components/InfoSection/InfoSection.tsx +++ b/apps/evm/src/pages/Home/components/InfoSection/InfoSection.tsx @@ -15,7 +15,7 @@ const InfoSection = (): JSX.Element => { }} i18nKey='home.info.title' /> -

    +

    {t('home.info.content')}

    @@ -25,7 +25,7 @@ const InfoSection = (): JSX.Element => { {t('home.info.exploreLabel')} -

    +

    {t('home.info.exploreContent')}

    @@ -33,7 +33,7 @@ const InfoSection = (): JSX.Element => { {t('home.info.referLabel')} -

    +

    {t('home.info.referContent')}

    @@ -41,7 +41,7 @@ const InfoSection = (): JSX.Element => { {t('home.info.questsLabel')} -

    +

    {t('home.info.questsContent')}

    diff --git a/apps/evm/src/pages/SignUp/SignUp.tsx b/apps/evm/src/pages/SignUp/SignUp.tsx index 531a14383..f4b1044ad 100644 --- a/apps/evm/src/pages/SignUp/SignUp.tsx +++ b/apps/evm/src/pages/SignUp/SignUp.tsx @@ -108,7 +108,7 @@ const SignUp = (): JSX.Element | null => { if (!hasReferralCode) { return ( -
    +
    refectOnboarding()} /> @@ -147,15 +147,15 @@ const SignUp = (): JSX.Element | null => { return ( -
    +

    }} i18nKey='signUp.title' />

    -

    +

    {t('signUp.subtitle')}

    -

    +

    {t('signUp.content')}

    @@ -180,7 +180,7 @@ const SignUp = (): JSX.Element | null => { variant='solid' onPress={() => setTwitterVisited(true)} > - + {t('signUp.followBOB')} diff --git a/apps/evm/src/pages/Wallet/Wallet.tsx b/apps/evm/src/pages/Wallet/Wallet.tsx index d06a28319..e3876ebef 100644 --- a/apps/evm/src/pages/Wallet/Wallet.tsx +++ b/apps/evm/src/pages/Wallet/Wallet.tsx @@ -24,7 +24,7 @@ const Wallet = () => {

    {t('wallet.title')}

    -

    {t('wallet.summary')}

    +

    {t('wallet.summary')}

    {address ? ( isOnL2Chain ? ( @@ -62,7 +62,7 @@ const Wallet = () => { >

    {t('wallet.assets.noAssets')}

    -

    +

    {t('wallet.assets.connect')}

    diff --git a/apps/evm/src/pages/Wallet/components/ReceiveTokenModal/ReceiveTokenModal.tsx b/apps/evm/src/pages/Wallet/components/ReceiveTokenModal/ReceiveTokenModal.tsx index ef64cecf1..1efed85a7 100644 --- a/apps/evm/src/pages/Wallet/components/ReceiveTokenModal/ReceiveTokenModal.tsx +++ b/apps/evm/src/pages/Wallet/components/ReceiveTokenModal/ReceiveTokenModal.tsx @@ -37,13 +37,13 @@ const ReceiveTokenModal = ({ token, onClose, ...props }: ReceiveTokenModalProps) return ( - Send {currency.symbol} + Receive {currency.symbol} {token !== 'btc' && ( setAmount(value) diff --git a/apps/evm/src/pages/Wallet/components/TokenTable/ButtonGroup.tsx b/apps/evm/src/pages/Wallet/components/TokenTable/ButtonGroup.tsx index 299dcc664..368813a8d 100644 --- a/apps/evm/src/pages/Wallet/components/TokenTable/ButtonGroup.tsx +++ b/apps/evm/src/pages/Wallet/components/TokenTable/ButtonGroup.tsx @@ -44,7 +44,7 @@ const ButtonGroup = ({ {showOnlyConnect ? ( - ) : ( @@ -62,7 +62,7 @@ const ButtonGroup = ({ if (showOnlyConnect) { return ( - ); diff --git a/apps/evm/src/pages/Wallet/components/TokenTable/ButtonGroupMobile.tsx b/apps/evm/src/pages/Wallet/components/TokenTable/ButtonGroupMobile.tsx index 29dcfa217..633d8bd02 100644 --- a/apps/evm/src/pages/Wallet/components/TokenTable/ButtonGroupMobile.tsx +++ b/apps/evm/src/pages/Wallet/components/TokenTable/ButtonGroupMobile.tsx @@ -11,20 +11,20 @@ const ButtonGroupMobile = ({ onPressBridge, onPressReceive, onPressSend }: Butto return ( {onPressBridge && ( - )} - - diff --git a/packages/icons/src/BOBLogo.tsx b/packages/icons/src/BOBLogo.tsx index a6f4ad3ed..86739a8d2 100644 --- a/packages/icons/src/BOBLogo.tsx +++ b/packages/icons/src/BOBLogo.tsx @@ -1,41 +1,43 @@ -import { forwardRef, useMemo } from 'react'; +import { forwardRef } from 'react'; import { Icon, IconProps } from '@gobob/ui'; import { useTheme } from 'styled-components'; -type BOBColors = 'light' | 'dark' | 'primary'; - -type BobLogoProps = Omit & { color?: BOBColors }; - -const BOBLogo = forwardRef(({ color = 'primary', ...props }, ref) => { +const BOBLogo = forwardRef((props, ref) => { const theme = useTheme(); - const { bg, fill } = useMemo( - () => - ({ - primary: { - bg: theme.color('primary-500'), - fill: theme.color('light') - }, - dark: { - bg: theme.color('dark'), - fill: theme.color('light') - }, - light: { - bg: theme.color('light'), - fill: theme.color('dark') - } - })[color], - [theme, color] - ); - return ( - - - - - - + + + + + + + + + + + + + ); }); diff --git a/packages/icons/src/Bitlayer.tsx b/packages/icons/src/Bitlayer.tsx new file mode 100644 index 000000000..c53041d20 --- /dev/null +++ b/packages/icons/src/Bitlayer.tsx @@ -0,0 +1,48 @@ +import { forwardRef } from 'react'; +import { Icon, IconProps } from '@gobob/ui'; + +const Bitlayer = forwardRef((props, ref) => ( + + + + + + + + + + + + +)); + +Bitlayer.displayName = 'Bitlayer'; + +export { Bitlayer }; diff --git a/packages/icons/src/Merlin.tsx b/packages/icons/src/Merlin.tsx new file mode 100644 index 000000000..aeaba0eff --- /dev/null +++ b/packages/icons/src/Merlin.tsx @@ -0,0 +1,33 @@ +import { forwardRef } from 'react'; +import { Icon, IconProps } from '@gobob/ui'; + +const Merlin = forwardRef((props, ref) => ( + + + + + + + + + + + + + + +)); + +Merlin.displayName = 'Merlin'; + +export { Merlin }; diff --git a/packages/icons/src/index.ts b/packages/icons/src/index.ts index 51848d67b..6853ef3ea 100644 --- a/packages/icons/src/index.ts +++ b/packages/icons/src/index.ts @@ -1,13 +1,26 @@ +export { ArbitrumOne } from './ArbitrumOne'; +export { Base } from './Base'; +export { Bitlayer } from './Bitlayer'; export { BLogo } from './BLogo'; +export { BNB } from './BNB'; export { BOBLogo } from './BOBLogo'; export { BTC } from './BTC'; export { CoinbaseWallet } from './CoinbaseWallet'; export { Discord } from './Discord'; export { ETH } from './ETH'; +export { Galxe } from './Galxe'; +export { Intract } from './Intract'; export { LeatherWallet } from './LeatherWallet'; export { Ledger } from './Ledger'; +export { MedalBronze } from './MedalBronze'; +export { MedalGold } from './MedalGold'; +export { MedalSilver } from './MedalSilver'; +export { Merlin } from './Merlin'; export { Metamask } from './Metamask'; +export { Moonbeam } from './Moonbeam'; export { OKXWallet } from './OKXWallet'; +export { Optimism } from './Optimism'; +export { Polygon } from './Polygon'; export { RabbyWallet } from './RabbyWallet'; export { TalismanWallet } from './TalismanWallet'; export { TrustWallet } from './TrustWallet'; @@ -15,14 +28,3 @@ export { Twitter } from './Twitter'; export { UnisatWallet } from './UnisatWallet'; export { WalletConnect } from './WalletConnect'; export { Xverse } from './Xverse'; -export { Polygon } from './Polygon'; -export { ArbitrumOne } from './ArbitrumOne'; -export { BNB } from './BNB'; -export { Optimism } from './Optimism'; -export { Base } from './Base'; -export { Moonbeam } from './Moonbeam'; -export { Galxe } from './Galxe'; -export { Intract } from './Intract'; -export { MedalBronze } from './MedalBronze'; -export { MedalGold } from './MedalGold'; -export { MedalSilver } from './MedalSilver'; diff --git a/packages/tokens/src/constants/bob.ts b/packages/tokens/src/constants/bob.ts index 64de006c8..3c316ecbc 100644 --- a/packages/tokens/src/constants/bob.ts +++ b/packages/tokens/src/constants/bob.ts @@ -13,8 +13,16 @@ export const bobTokens = { export const bobSepoliaTokens = { weth: WETH9[ChainId.BOB_SEPOLIA], - wbtc: WBTC[ChainId.BOB_SEPOLIA], - tbtc: TBTC[ChainId.BOB_SEPOLIA], - usdc: USDC[ChainId.BOB_SEPOLIA], - usdt: USDT[ChainId.BOB_SEPOLIA] + // wbtc: WBTC[ChainId.BOB_SEPOLIA], + // tbtc: TBTC[ChainId.BOB_SEPOLIA], + usdc: USDC[ChainId.BOB_SEPOLIA] + // usdt: USDT[ChainId.BOB_SEPOLIA] +}; + +export const oldBobSepoliaTokens = { + weth: WETH9[ChainId.OLD_BOB_SEPOLIA], + wbtc: WBTC[ChainId.OLD_BOB_SEPOLIA], + tbtc: TBTC[ChainId.OLD_BOB_SEPOLIA], + usdc: USDC[ChainId.OLD_BOB_SEPOLIA], + usdt: USDT[ChainId.OLD_BOB_SEPOLIA] }; diff --git a/packages/tokens/src/constants/common.ts b/packages/tokens/src/constants/common.ts index 967985469..6183c4aac 100644 --- a/packages/tokens/src/constants/common.ts +++ b/packages/tokens/src/constants/common.ts @@ -19,9 +19,16 @@ export const USDC = { 'USD Coin' ), [ChainId.BOB]: new ERC20Token(ChainId.BOB, '0xe75D0fB2C24A55cA1e3F96781a2bCC7bdba058F0', 6, 'USDC', 'USD Coin'), + [ChainId.OLD_BOB_SEPOLIA]: new ERC20Token( + ChainId.OLD_BOB_SEPOLIA, + '0xdD796dbad8c4c6Ccd5C8cA9a6B1727CbEcc682AB', + 6, + 'USDC', + 'USD Coin' + ), [ChainId.BOB_SEPOLIA]: new ERC20Token( ChainId.BOB_SEPOLIA, - '0xdD796dbad8c4c6Ccd5C8cA9a6B1727CbEcc682AB', + '0x2c1f73d37e7cdba2792156139b0d35a765d595c5', 6, 'USDC', 'USD Coin' @@ -46,8 +53,8 @@ export const WBTC = { 'Wrapped BTC' ), [ChainId.BOB]: new ERC20Token(ChainId.BOB, '0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3', 8, 'WBTC', 'Wrapped BTC'), - [ChainId.BOB_SEPOLIA]: new ERC20Token( - ChainId.BOB_SEPOLIA, + [ChainId.OLD_BOB_SEPOLIA]: new ERC20Token( + ChainId.OLD_BOB_SEPOLIA, '0x2868d708e442A6a940670d26100036d426F1e16b', 8, 'WBTC', @@ -73,8 +80,8 @@ export const TBTC = { 'tBTC v2' ), [ChainId.BOB]: new ERC20Token(ChainId.BOB, '0xBBa2eF945D523C4e2608C9E1214C2Cc64D4fc2e2', 18, 'tBTC', 'tBTC v2'), - [ChainId.BOB_SEPOLIA]: new ERC20Token( - ChainId.BOB_SEPOLIA, + [ChainId.OLD_BOB_SEPOLIA]: new ERC20Token( + ChainId.OLD_BOB_SEPOLIA, '0x43a4e4E277aE3477c4E8A058640951FCb98CcC8B', 18, 'tBTC', @@ -101,8 +108,8 @@ export const USDT = { 'Tether USD' ), [ChainId.BOB]: new ERC20Token(ChainId.BOB, '0x05d032ac25d322df992303dca074ee7392c117b9', 6, 'USDT', 'Tether USD'), - [ChainId.BOB_SEPOLIA]: new ERC20Token( - ChainId.BOB_SEPOLIA, + [ChainId.OLD_BOB_SEPOLIA]: new ERC20Token( + ChainId.OLD_BOB_SEPOLIA, '0x38F715c449b0e24B21Fa15E6D34286fb19d15D03', 6, 'USDT', diff --git a/packages/tokens/src/constants/native.ts b/packages/tokens/src/constants/native.ts index 6cbf99761..72f0fa1d0 100644 --- a/packages/tokens/src/constants/native.ts +++ b/packages/tokens/src/constants/native.ts @@ -7,6 +7,7 @@ export const WNATIVE = { [ChainId.ETHEREUM]: WETH9[ChainId.ETHEREUM], [ChainId.SEPOLIA]: WETH9[ChainId.SEPOLIA], [ChainId.BOB]: '' as any, + [ChainId.OLD_BOB_SEPOLIA]: '' as any, [ChainId.BOB_SEPOLIA]: '' as any, [ChainId.ARBITRUM_ONE]: '' as any, [ChainId.BASE]: '' as any, @@ -15,7 +16,9 @@ export const WNATIVE = { [ChainId.OPBNB]: '' as any, [ChainId.POLYGON]: '' as any, [ChainId.POLYGON_ZKEVM]: '' as any, - [ChainId.MOONBEAM]: '' as any + [ChainId.MOONBEAM]: '' as any, + [ChainId.BITLAYER]: '' as any, + [ChainId.MERLIN]: '' as any } satisfies Record; const ETHER = { name: 'Ether', symbol: 'ETH', decimals: 18 } as const; @@ -37,6 +40,11 @@ export const NATIVE = { symbol: 'ETH', decimals: 18 }, + [ChainId.OLD_BOB_SEPOLIA]: { + name: 'BOB Ether', + symbol: 'ETH', + decimals: 18 + }, [ChainId.ARBITRUM_ONE]: { name: 'Ether', symbol: 'ETH', @@ -76,6 +84,16 @@ export const NATIVE = { name: 'Ether', symbol: 'ETH', decimals: 18 + }, + [ChainId.MERLIN]: { + name: 'Ether', + symbol: 'ETH', + decimals: 18 + }, + [ChainId.BITLAYER]: { + name: 'Ether', + symbol: 'ETH', + decimals: 18 } } satisfies Record< ChainId, diff --git a/packages/tokens/src/constants/weth.ts b/packages/tokens/src/constants/weth.ts index d8241f727..26b0522dd 100644 --- a/packages/tokens/src/constants/weth.ts +++ b/packages/tokens/src/constants/weth.ts @@ -35,5 +35,14 @@ export const WETH9 = { 'WETH', 'Wrapped Ether', 'https://weth.io' + ), + // TODO: add correct contract + [ChainId.OLD_BOB_SEPOLIA]: new ERC20Token( + ChainId.OLD_BOB_SEPOLIA, + '0x4200000000000000000000000000000000000006', + 18, + 'WETH', + 'Wrapped Ether', + 'https://weth.io' ) }; diff --git a/packages/tokens/src/tokens.ts b/packages/tokens/src/tokens.ts index c0e4d14b3..0a4e1bd97 100644 --- a/packages/tokens/src/tokens.ts +++ b/packages/tokens/src/tokens.ts @@ -1,14 +1,15 @@ import { ChainId } from '@gobob/chains'; -import { bobSepoliaTokens, bobTokens } from './constants/bob'; -import { sepoliaTokens } from './constants/sepolia'; +import { bobSepoliaTokens, bobTokens, oldBobSepoliaTokens } from './constants/bob'; import { ethereumTokens } from './constants/eth'; +import { sepoliaTokens } from './constants/sepolia'; export const tokens = { [ChainId.ETHEREUM]: ethereumTokens, [ChainId.SEPOLIA]: sepoliaTokens, [ChainId.BOB]: bobTokens, [ChainId.BOB_SEPOLIA]: bobSepoliaTokens, + [ChainId.OLD_BOB_SEPOLIA]: oldBobSepoliaTokens, [ChainId.ARBITRUM_ONE]: [], [ChainId.BASE]: [], [ChainId.OP]: [], @@ -16,5 +17,7 @@ export const tokens = { [ChainId.OPBNB]: [], [ChainId.POLYGON]: [], [ChainId.POLYGON_ZKEVM]: [], - [ChainId.MOONBEAM]: [] + [ChainId.MOONBEAM]: [], + [ChainId.BITLAYER]: [], + [ChainId.MERLIN]: [] }; diff --git a/packages/ui/package.json b/packages/ui/package.json index 8d5ff8e4d..ec9943155 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -38,6 +38,8 @@ "postpack": "clean-package restore" }, "dependencies": { + "@gobob/currency": "workspace:^", + "@internationalized/number": "^3.2.1", "@radix-ui/react-slot": "^1.0.2", "@react-aria/accordion": "3.0.0-alpha.20", "@react-aria/breadcrumbs": "^3.5.4", @@ -70,12 +72,11 @@ "@react-stately/toggle": "^3.6.1", "@react-stately/tooltip": "^3.4.3", "@react-stately/tree": "^3.7.1", - "react-transition-group": "^4.4.5", - "@internationalized/number": "^3.2.1", "decimal.js-light": "^2.5.1", "formik": "^2.4.5", - "react-use": "^17.4.0", - "react-toastify": "^10.0.5" + "react-toastify": "^10.0.5", + "react-transition-group": "^4.4.5", + "react-use": "^17.4.0" }, "peerDependencies": { "react": ">=18", @@ -83,6 +84,7 @@ "styled-components": ">=6.0.0" }, "devDependencies": { + "@gobob/test-utils": "workspace:^", "@react-types/grid": "^3.2.0", "@react-types/shared": "^3.19.0", "@react-types/tabs": "^3.3.2", @@ -91,7 +93,6 @@ "clean-package": "^2.2.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "styled-components": "^6.0.7", - "@gobob/test-utils": "workspace:^" + "styled-components": "^6.0.7" } } diff --git a/packages/ui/src/components/Accordion/Accordion.stories.tsx b/packages/ui/src/components/Accordion/Accordion.stories.tsx index 560d11ebc..e999260a3 100644 --- a/packages/ui/src/components/Accordion/Accordion.stories.tsx +++ b/packages/ui/src/components/Accordion/Accordion.stories.tsx @@ -29,8 +29,6 @@ export default { export const Default: StoryObj = {}; -export const Splitted: StoryObj = { args: { variant: 'splitted' } }; - export const DefaultExpanded: StoryObj = { args: { defaultExpandedKeys: ['1'] diff --git a/packages/ui/src/components/Accordion/Accordion.style.tsx b/packages/ui/src/components/Accordion/Accordion.style.tsx index 5cc700e58..8a4b9bd27 100644 --- a/packages/ui/src/components/Accordion/Accordion.style.tsx +++ b/packages/ui/src/components/Accordion/Accordion.style.tsx @@ -1,13 +1,8 @@ import styled, { css } from 'styled-components'; import { H3 } from '../Text'; -import { AccordionVariants } from '../../theme'; import { ChevronDown } from '../../icons'; -type StyledAccordionProps = { - $variant: AccordionVariants; -}; - type StyledChevronDownProps = { $isExpanded: boolean; }; @@ -27,20 +22,19 @@ type StyledAccordionItemContentProps = { type StyledAccordionItemWrapperProps = { $isDisabled: boolean; - $variant: AccordionVariants; }; -const StyledAccordion = styled.div` +const StyledAccordion = styled.div` display: flex; flex-direction: column; - ${({ theme, $variant }) => theme.accordion.variant[$variant].base} + ${({ theme }) => theme.accordion.base} `; const StyledAccordionItemWrapper = styled.div` z-index: inherit; position: relative; opacity: ${({ $isDisabled }) => $isDisabled && '0.5'}; - ${({ theme, $variant }) => theme.accordion.variant[$variant].item.base} + ${({ theme }) => theme.accordion.item.base} `; const StyledAccordionItemHeading = styled(H3)` diff --git a/packages/ui/src/components/Accordion/Accordion.tsx b/packages/ui/src/components/Accordion/Accordion.tsx index 64b5d071d..70624738f 100644 --- a/packages/ui/src/components/Accordion/Accordion.tsx +++ b/packages/ui/src/components/Accordion/Accordion.tsx @@ -4,14 +4,11 @@ import { useTreeState } from '@react-stately/tree'; import { forwardRef, HTMLAttributes, Ref } from 'react'; import { useDOMRef } from '../../hooks'; -import { AccordionVariants } from '../../theme'; import { AccordionItem } from './AccordionItem'; import { StyledAccordion } from './Accordion.style'; -type Props = { - variant?: AccordionVariants; -}; +type Props = {}; type InheritAttrs = Omit, keyof Props>; @@ -20,7 +17,7 @@ type NativeAttrs = Omit, (keyof InheritAttrs & Pro type AccordionProps = Props & InheritAttrs & NativeAttrs; const Accordion = >( - { variant = 'light', ...props }: AccordionProps, + props: AccordionProps, ref: Ref ): JSX.Element => { const state = useTreeState(props); @@ -28,9 +25,9 @@ const Accordion = >( const { accordionProps } = useAccordion(props, state, accordionRef); return ( - + {[...state.collection].map((item) => ( - key={item.key} item={item} state={state} variant={variant} /> + key={item.key} item={item} state={state} /> ))} ); diff --git a/packages/ui/src/components/Accordion/AccordionItem.tsx b/packages/ui/src/components/Accordion/AccordionItem.tsx index ffef18260..3957d88f6 100644 --- a/packages/ui/src/components/Accordion/AccordionItem.tsx +++ b/packages/ui/src/components/Accordion/AccordionItem.tsx @@ -5,7 +5,6 @@ import { TreeState } from '@react-stately/tree'; import { Node } from '@react-types/shared'; import { useRef } from 'react'; -import { AccordionVariants } from '../../theme'; import { Flex } from '../Flex'; import { @@ -19,12 +18,8 @@ import { AccordionItemRegion } from './AccordionItemRegion'; type AccordionItemProps = { item: Node; state: TreeState; - variant?: AccordionVariants; }; -const AccordionItem = >({ - variant = 'light', - ...props -}: AccordionItemProps): JSX.Element => { +const AccordionItem = >(props: AccordionItemProps): JSX.Element => { const ref = useRef(null); const { state, item } = props; const { buttonProps, regionProps } = useAccordionItem(props, state, ref); @@ -33,7 +28,7 @@ const AccordionItem = >({ const { isFocusVisible, focusProps } = useFocusRing(); return ( - + ; + +export const Default: StoryObj = {}; + +export const Sizes: StoryObj = { + render: (args) => ( + + + + + + ) +}; diff --git a/packages/ui/src/components/Avatar/Avatar.tsx b/packages/ui/src/components/Avatar/Avatar.tsx index 9e6f4471c..71dca81d5 100644 --- a/packages/ui/src/components/Avatar/Avatar.tsx +++ b/packages/ui/src/components/Avatar/Avatar.tsx @@ -14,6 +14,7 @@ type InheritAttrs = Omit, keyof Props>; type AvatarProps = Props & InheritAttrs; +// TODO: add fallback? const Avatar = ({ size = '4xl', background, rounded = 'full', ...props }: AvatarProps) => ( ); diff --git a/packages/ui/src/components/Breadcrumbs/BreadcrumbItem.tsx b/packages/ui/src/components/Breadcrumbs/BreadcrumbItem.tsx index 7f5054432..9daed0658 100644 --- a/packages/ui/src/components/Breadcrumbs/BreadcrumbItem.tsx +++ b/packages/ui/src/components/Breadcrumbs/BreadcrumbItem.tsx @@ -3,7 +3,7 @@ import { mergeProps } from '@react-aria/utils'; import { AnchorHTMLAttributes, Fragment, useRef } from 'react'; import { ChevronRight } from '../../icons'; -import { TextLinkProps } from '../TextLink'; +import { LinkProps } from '../Link'; import { StyledLinkBreadcrumb, StyledSpanBreadcrumb } from './Breadcrumbs.style'; @@ -30,7 +30,7 @@ const BreadcrumbItem = ({ children, isDisabled, isCurrent, href, ...props }: Bre ref ); - const commonProps: Pick = { + const commonProps: Pick = { size: 's', color: isCurrent ? 'light' : 'green-300' }; diff --git a/packages/ui/src/components/Breadcrumbs/Breadcrumbs.style.tsx b/packages/ui/src/components/Breadcrumbs/Breadcrumbs.style.tsx index 48bd1ff1b..4f3a20956 100644 --- a/packages/ui/src/components/Breadcrumbs/Breadcrumbs.style.tsx +++ b/packages/ui/src/components/Breadcrumbs/Breadcrumbs.style.tsx @@ -1,7 +1,7 @@ import styled from 'styled-components'; import { Span } from '../Text'; -import { TextLink } from '../TextLink'; +import { Link } from '../Link'; type StyledBreadcrumbProps = { $isDisabled?: boolean; @@ -31,7 +31,7 @@ const StyledSpanBreadcrumb = styled(Span)` cursor: default; `; -const StyledLinkBreadcrumb = styled(TextLink)` +const StyledLinkBreadcrumb = styled(Link)` padding: 0 ${({ theme }) => theme.spacing('s')}; text-decoration: none; `; diff --git a/packages/ui/src/components/Button/Button.style.tsx b/packages/ui/src/components/Button/Button.style.tsx index a6bd2c1fe..4c206b836 100644 --- a/packages/ui/src/components/Button/Button.style.tsx +++ b/packages/ui/src/components/Button/Button.style.tsx @@ -8,7 +8,6 @@ type StyledButtonProps = { $size: ButtonSizes; $color: ButtonColors; $variant: ButtonVariants; - $isFocusVisible?: boolean; $isIconOnly?: boolean; }; @@ -17,19 +16,17 @@ const StyledButton = styled(UnstyledButton)` align-items: center; justify-content: center; width: ${(props) => (props.$fullWidth ? '100%' : 'auto')}; - outline: transparent solid 2px; border: 0px solid; user-select: none; - ${({ theme, $size, $variant, $color, $isFocusVisible, $isIconOnly }) => { - const { active, disabled, hover, focus, focusVisible } = theme.button.variant[$variant].color[$color]; + ${({ theme, $size, $variant, $color, $isIconOnly }) => { + const { hover } = theme.button.variant[$variant].color[$color]; return css` ${theme.button.base} ${theme.button.size[$size]} ${theme.button.variant[$variant].color[$color].base} - ${$isFocusVisible && focusVisible} ${$isIconOnly && css` padding: 0; @@ -42,18 +39,14 @@ const StyledButton = styled(UnstyledButton)` } &:active:not([disabled]) { - ${active} - } - - &:focus:not([disabled]) { - ${focus} + ${theme.button.active} } &[aria-disabled='true'], &[disabled] { pointer-events: none; cursor: not-allowed; - ${disabled} + ${theme.button.disabled} } `; }} diff --git a/packages/ui/src/components/Button/Button.tsx b/packages/ui/src/components/Button/Button.tsx index dff8a23ff..37340b1e7 100644 --- a/packages/ui/src/components/Button/Button.tsx +++ b/packages/ui/src/components/Button/Button.tsx @@ -1,5 +1,3 @@ -import { useFocusRing } from '@react-aria/focus'; -import { mergeProps } from '@react-aria/utils'; import { PressEvent } from '@react-types/shared'; import { ButtonHTMLAttributes, forwardRef } from 'react'; import { Slottable } from '@radix-ui/react-slot'; @@ -8,6 +6,7 @@ import { useDOMRef } from '../../hooks'; import { ButtonVariants, ButtonSizes, ButtonColors, SpinnerSizes, SpinnerColors } from '../../theme'; import { Flex } from '../Flex'; import { Spinner } from '../Spinner'; +import { ElementTypeProp } from '../utils/types'; import { StyledButton } from './Button.style'; @@ -29,6 +28,11 @@ const spinnerColorMap: Record, keyof Props>; -type ButtonProps = Props & NativeAttrs; +type ButtonProps = Props & NativeAttrs & ElementTypeProp; const Button = forwardRef( ( @@ -59,6 +63,7 @@ const Button = forwardRef( fullWidth, isIconOnly, asChild, + elementType, ...props }, ref @@ -67,20 +72,18 @@ const Button = forwardRef( const isDisabled = disabled || loading; - const { focusProps, isFocusVisible } = useFocusRing(props); - return ( {loading && ( diff --git a/packages/ui/src/components/Card/Card.stories.tsx b/packages/ui/src/components/Card/Card.stories.tsx index a4e2e0ab4..e5c04f93e 100644 --- a/packages/ui/src/components/Card/Card.stories.tsx +++ b/packages/ui/src/components/Card/Card.stories.tsx @@ -2,6 +2,9 @@ import { Meta, StoryObj } from '@storybook/react'; import { H1, H2, P, Span, Flex } from '..'; +// @ts-ignore +import bob from './bob.png'; + import { Card, CardProps } from '.'; const children = ( @@ -23,17 +26,11 @@ export default { parameters: { layout: 'centered' }, - args: { style: { maxWidth: 300 }, gap: 'md', alignItems: 'center', children } + args: { style: { maxWidth: 400 }, gap: 'md', alignItems: 'center', children } } as Meta; export const Default: StoryObj = {}; -export const Hoverable: StoryObj = { - args: { - isHoverable: true - } -}; - export const Pressable: StoryObj = { args: { isPressable: true @@ -46,3 +43,25 @@ export const Disabled: StoryObj = { isDisabled: true } }; + +export const WithImage: StoryObj = { + args: { + padding: 'none', + children: ( + <> + example + +

    BTC Passive Income

    + + Earn up to +

    0.3% APY

    +
    +

    + Generate passive income by offering your BTC to lending markets and benefit from automatic compounding + rewards. +

    +
    + + ) + } +}; diff --git a/packages/ui/src/components/Card/Card.style.tsx b/packages/ui/src/components/Card/Card.style.tsx index 596cd8446..1aefdfa73 100644 --- a/packages/ui/src/components/Card/Card.style.tsx +++ b/packages/ui/src/components/Card/Card.style.tsx @@ -4,35 +4,49 @@ import { Color, Rounded } from '../../theme'; import { Flex } from '../Flex'; type StyledCardProps = { - $bordered: boolean | Color; - $rounded: Rounded; + $borderColor?: Color; + $rounded?: Rounded; $shadowed: boolean; $background?: Color; - $isHoverable?: boolean; + $isFocusVisible?: boolean; $isPressable?: boolean; + $isDisabled?: boolean; + $isHoverable?: boolean; + $disableAnimation?: boolean; }; const StyledCard = styled(Flex)` - border-radius: ${({ $rounded, theme }) => theme.rounded($rounded)}; - cursor: ${({ $isPressable }) => $isPressable && 'pointer'}; - outline: none; + ${({ + $borderColor, + $isPressable, + $isHoverable, + $isDisabled, + $shadowed, + $background, + $isFocusVisible, + $disableAnimation, + $rounded, + theme + }) => { + return css` + ${theme.card.base} - // TODO: add isHoverable - ${({ $bordered, $isPressable, $shadowed, $background, theme }) => { - const { border, boxShadow, backgroundColor, ...baseCss } = theme.card.base; + border-radius: ${$rounded && theme.rounded($rounded)}; + overflow: hidden; + border: ${$borderColor && `1px solid ${$borderColor}`}; + box-shadow: ${!$shadowed && 'none'}; + background-color: ${$background && theme.color($background)}; + outline: ${!$isFocusVisible && 'none'}; + cursor: ${$isPressable && !$isDisabled && 'pointer'}; - return css` - border: ${typeof $bordered === 'boolean' - ? $bordered - ? border - : undefined - : `1px solid ${theme.color($bordered)}`}; - box-shadow: ${$shadowed && boxShadow}; - background-color: ${$background ? theme.color($background) : backgroundColor}; - ${baseCss} - - &:focus { - ${$isPressable && $bordered && theme.card.focus} + ${$isDisabled && theme.card.disabled} + + &:hover:not([aria-disabled]) { + ${$isHoverable && !$disableAnimation && theme.card.active} + } + + &:active:not([aria-disabled]) { + ${$isPressable && !$disableAnimation && theme.card.active} } `; }} diff --git a/packages/ui/src/components/Card/Card.tsx b/packages/ui/src/components/Card/Card.tsx index 5b0a4faa8..83cd4a2e2 100644 --- a/packages/ui/src/components/Card/Card.tsx +++ b/packages/ui/src/components/Card/Card.tsx @@ -1,11 +1,13 @@ import { useButton } from '@react-aria/button'; import { mergeProps } from '@react-aria/utils'; import { PressEvent } from '@react-types/shared'; -import { forwardRef } from 'react'; +import { forwardRef, JSXElementConstructor } from 'react'; +import { useFocusRing } from '@react-aria/focus'; import { useDOMRef } from '../../hooks'; import { Color, Rounded } from '../../theme'; import { FlexProps } from '../Flex'; +import { ElementTypeProp } from '../utils/types'; import { StyledCard } from './Card.style'; @@ -14,15 +16,16 @@ type Props = { isPressable?: boolean; isDisabled?: boolean; background?: Color; - bordered?: boolean | Color; + borderColor?: Color; rounded?: Rounded; shadowed?: boolean; + disableAnimation?: boolean; onPress?: (e: PressEvent) => void; }; type InheritAttrs = Omit; -type CardProps = Props & InheritAttrs; +type CardProps = Props & InheritAttrs & ElementTypeProp; const Card = forwardRef( ( @@ -37,7 +40,8 @@ const Card = forwardRef( rounded = 'xl', padding = 'xl', shadowed = false, - bordered = true, + borderColor, + disableAnimation, onPress, ...props }, @@ -45,15 +49,25 @@ const Card = forwardRef( ): JSX.Element => { const cardRef = useDOMRef(ref); const { buttonProps } = useButton( - { elementType: elementType || 'div', isDisabled: !isPressable || isDisabled, onPress, ...props }, + { + elementType: (elementType as JSXElementConstructor) || 'div', + isDisabled: !isPressable || isDisabled, + onPress, + ...props + }, cardRef ); + const { isFocusVisible, focusProps } = useFocusRing(props); + return ( ( direction={direction} elementType={elementType} padding={padding} - {...mergeProps(props, isPressable ? buttonProps : {})} + {...mergeProps(props, isPressable ? mergeProps(buttonProps, focusProps) : {})} > {children} diff --git a/packages/ui/src/components/Card/bob.png b/packages/ui/src/components/Card/bob.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b9ea895318f04e95a33253bc4ed541338b3146 GIT binary patch literal 3959 zcmeHK|5MUu9Dm4?(8LxiD?!&6vo5SNYk`1Y${l%@tyYTZDa09WYlvc+N`5PKW$89| zdL*FEZtk{H*!2a|Kt;!#2(}qwqNKEssEJcjha~P}?Jw95-L>BDg21 zhd`YgI|^S`vVxBV10X4Je#KY?fa{vjkl<4n5flBA`q+3}^ORxz_j~qNUkZLaje z@k~v*#k$>_MOJV{WW!v#I+Js8^ce?$U*}r@_-cm%m5G1H_0AFHY7n1VO;DhjP z1ZYF~gB(II60G%Je)JB7z}%7R~ISG#YvT`3+ZA zY0>59FuZTg3J=JZ&mLo<6Nu73-p z9c}&m&3VXm?Rd)AU1nqsZn;X{383^(nT9~~+}Bl1lFa%UZI{GFj0skz>SY19y9X-r z&~$2E@dT}v(LgIdKDZgAZZql1ygWSg?h(U(q+Lfg`w|FEDI9|MK)o!`GF;)uQoCf{ z$JP(Z{kX;-ai8Qcx0-@_CdzTd9Om5fW-V$B80H;*YurI0ici;uYsi<(CbgZ%O@vw= zMdkaA6b~Y1$L&Hs)fGtyfc=ZwFcoR2Y~Y+w3BUC+v19l!Fv8m`^^`2+U?Vkx-AERlOe zLSJ>i65Ta@{gT;ndVpUc_JdO*xR-ESE6XdsFnye<<1f?lyP!-GT!{x7@H|oe_l@>) zg%d@ZmNH=^ewQUw9fNboB-y7Qiw`YIiJ3+m&D*$wgh@HC{F!7KB`L1q8_ylAQxD>Y z#3chkvPSpF>nQAH?>%x3C!N0AZhcT=vz8ZNQs*F5eVk$Pti3W@qi+b{j=fa%IV(_S zvgiv#<$l@oPe3E-Ux>2QT`^LEMa5N!DD$b%>`YA+DKxC7a&gL-Hq^(^$n43G_JCo3 ztM9rc!IxFPRq5B4Iz*?yzb{HulP!8Nt3)Pju(hiuG*Ac(BFI`)V#u#8pxEX+`J`SJ z%s|gBVzIIQ1g!3x$U#y1%tFl%#^?AVD{}8-_K83)8)C^RPX6KA8@s7)Vn1r#`ObC8 ziM*YVmX7){sxLVT)9Avo$*5f6YB-&IXN8lGvdX5bjuJ7v6NKuU72@5&NI_Gr#>E|~`~}AB zTcf#Ut^My>%OrVFun}W+p;hi@AD=PxzoFs&-oo`~&ayov_sB+b7bBmY{o(6wM}miJ zI@EBsWu)X>B0B~b0ZR%$y4O*6qly{5#Qq2djvdoCc~%y(Fnts*t|HGSaYsfxbF#yB$iYW+DinPlm4EyRdb3VF7_r6W3v z-r`Gq1K`uJ)Fdgh@Xl7bM;+@uw^`d<*Q1)b=E_sgXs=7au-u+6PbmNMA; + +export const Default: StoryObj = {}; + +export const Sizes: StoryObj = { + render: (args) => ( + + + + + + ) +}; + +export const StartAdornment: StoryObj = { + args: { + startAdornment: , + children: 'ETH' + } +}; + +export const EndAdornment: StoryObj = { + args: { + endAdornment: , + children: 'Loading...' + } +}; diff --git a/packages/ui/src/components/Chip/Chip.style.tsx b/packages/ui/src/components/Chip/Chip.style.tsx new file mode 100644 index 000000000..593625de0 --- /dev/null +++ b/packages/ui/src/components/Chip/Chip.style.tsx @@ -0,0 +1,40 @@ +import styled, { css } from 'styled-components'; + +import { ChipSize, Color, Rounded } from '../../theme'; +import { Span } from '../Text'; + +type StyledChipProps = { + $size: ChipSize; + $background?: Color; + $rounded?: Rounded; + $borderColor?: Color; +}; + +const StyledChip = styled.div` + display: inline-flex; + position: relative; + box-sizing: border-box; + min-width: -moz-min-content; + min-width: min-content; + max-width: -moz-fit-content; + max-width: fit-content; + white-space: nowrap; + justify-content: space-between; + align-items: center; + + ${({ theme, $size, $rounded, $background, $borderColor }) => css` + border-radius: ${$rounded && theme.rounded($rounded)}; + background-color: ${$background && theme.color($background)}; + border: ${$borderColor && `1px solid ${theme.color($borderColor)}`}; + + ${theme.chip.base} + ${theme.chip.size[$size].base} + `} +`; + +const StyledContent = styled(Span)>` + flex: 1 1 0%; + ${({ theme, $size }) => theme.chip.size[$size].content} +`; + +export { StyledChip, StyledContent }; diff --git a/packages/ui/src/components/Chip/Chip.tsx b/packages/ui/src/components/Chip/Chip.tsx new file mode 100644 index 000000000..94199d2cc --- /dev/null +++ b/packages/ui/src/components/Chip/Chip.tsx @@ -0,0 +1,40 @@ +import { ImgHTMLAttributes, ReactNode } from 'react'; + +import { ChipSize, Color, Rounded } from '../../theme'; + +import { StyledChip, StyledContent } from './Chip.style'; + +type Props = { + size?: ChipSize; + background?: Color; + rounded?: Rounded; + startAdornment?: ReactNode; + endAdornment?: ReactNode; + borderColor?: Color; +}; + +type InheritAttrs = Omit, keyof Props>; + +type ChipProps = Props & InheritAttrs; + +const Chip = ({ + size = 'md', + background, + rounded, + children, + startAdornment, + endAdornment, + borderColor, + ...props +}: ChipProps) => ( + + {startAdornment} + + {children} + + {endAdornment} + +); + +export { Chip }; +export type { ChipProps }; diff --git a/packages/ui/src/components/Chip/index.tsx b/packages/ui/src/components/Chip/index.tsx new file mode 100644 index 000000000..cbdcf0550 --- /dev/null +++ b/packages/ui/src/components/Chip/index.tsx @@ -0,0 +1,2 @@ +export { Chip } from './Chip'; +export type { ChipProps } from './Chip'; diff --git a/packages/ui/src/components/Dialog/Dialog.style.tsx b/packages/ui/src/components/Dialog/Dialog.style.tsx index 9c18584ec..f51855f8f 100644 --- a/packages/ui/src/components/Dialog/Dialog.style.tsx +++ b/packages/ui/src/components/Dialog/Dialog.style.tsx @@ -4,6 +4,7 @@ import { DialogSize, Spacing } from '../../theme'; import { Flex } from '../Flex'; import { H3 } from '../Text'; import { Button } from '../Button'; +import { Divider } from '../Divider'; type StyledDialogProps = { $size: DialogSize; @@ -11,6 +12,7 @@ type StyledDialogProps = { type StyledDialogBodyProps = { $maxHeight?: Spacing; + $padding: 'even' | 'uneven' | 'none'; }; const StyledDialog = styled.section` @@ -42,7 +44,7 @@ const StyledDialogHeader = styled(H3)` `; const StyledDialogBody = styled(Flex)` - ${({ theme }) => theme.dialog.body}; + ${({ theme, $padding }) => $padding !== 'none' && theme.dialog.body[$padding]}; max-height: ${({ theme, $maxHeight }) => $maxHeight && theme.spacing($maxHeight)}; flex: 1 1 auto; @@ -52,4 +54,8 @@ const StyledDialogFooter = styled(Flex)` ${({ theme }) => theme.dialog.footer}; `; -export { StyledCloseBtn, StyledDialog, StyledDialogBody, StyledDialogFooter, StyledDialogHeader }; +const StyledDivider = styled(Divider)` + ${({ theme }) => theme.dialog.divider}; +`; + +export { StyledCloseBtn, StyledDialog, StyledDialogBody, StyledDialogFooter, StyledDialogHeader, StyledDivider }; diff --git a/packages/ui/src/components/Dialog/DialogBody.tsx b/packages/ui/src/components/Dialog/DialogBody.tsx index 4118edc66..f8db98840 100644 --- a/packages/ui/src/components/Dialog/DialogBody.tsx +++ b/packages/ui/src/components/Dialog/DialogBody.tsx @@ -5,14 +5,20 @@ import { StyledDialogBody } from './Dialog.style'; type Props = { maxHeight?: Spacing; + padding?: 'even' | 'uneven' | 'none'; }; type InheritAttrs = Omit; type DialogBodyProps = Props & InheritAttrs; -const DialogBody = ({ direction = 'column', maxHeight, ...props }: DialogBodyProps): JSX.Element => { - return ; +const DialogBody = ({ + direction = 'column', + maxHeight, + padding = 'uneven', + ...props +}: DialogBodyProps): JSX.Element => { + return ; }; export { DialogBody }; diff --git a/packages/ui/src/components/Dialog/DialogHeader.tsx b/packages/ui/src/components/Dialog/DialogHeader.tsx index fc3a56c3f..f9eb869a7 100644 --- a/packages/ui/src/components/Dialog/DialogHeader.tsx +++ b/packages/ui/src/components/Dialog/DialogHeader.tsx @@ -3,24 +3,34 @@ import { ElementType } from 'react'; import { TextProps } from '../Text'; -import { StyledDialogHeader } from './Dialog.style'; +import { StyledDialogHeader, StyledDivider } from './Dialog.style'; import { useDialogContext } from './DialogContext'; type Props = { elementType?: ElementType; + showDivider?: boolean; }; type InheritAttrs = Omit; type DialogHeaderProps = Props & InheritAttrs; -const DialogHeader = ({ elementType, children, align = 'start', ...props }: DialogHeaderProps): JSX.Element => { +const DialogHeader = ({ + elementType, + children, + align = 'start', + showDivider = true, + ...props +}: DialogHeaderProps): JSX.Element => { const { titleProps } = useDialogContext(); return ( - - {children} - + <> + + {children} + + {showDivider && } + ); }; diff --git a/packages/ui/src/components/Divider/Divider.tsx b/packages/ui/src/components/Divider/Divider.tsx index 24af176a8..44588b6ca 100644 --- a/packages/ui/src/components/Divider/Divider.tsx +++ b/packages/ui/src/components/Divider/Divider.tsx @@ -21,7 +21,7 @@ type DividerProps = Props & NativeAttrs & ElementTypeProp & MarginProps; const Divider = forwardRef( ( - { elementType: elementTypeProp, orientation = 'horizontal', color = 'grey-400', size = 's', ...props }, + { elementType: elementTypeProp, orientation = 'horizontal', color = 'grey-300', size = 's', ...props }, ref ): JSX.Element => { const elementType = elementTypeProp || orientation === 'vertical' ? 'div' : 'hr'; diff --git a/packages/ui/src/components/Field/Field.style.tsx b/packages/ui/src/components/Field/Field.style.tsx deleted file mode 100644 index 1dbe228fa..000000000 --- a/packages/ui/src/components/Field/Field.style.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import styled, { CSSProperties } from 'styled-components'; - -import { Flex } from '../Flex'; - -type StyledFieldProps = { - $maxWidth?: CSSProperties['maxWidth']; - $fullWidth?: boolean; -}; - -const StyledFieldElWrapper = styled.div` - position: relative; - box-sizing: border-box; - display: inline-flex; - height: 100%; -`; - -const StyledField = styled(Flex)` - max-width: ${({ $maxWidth }) => $maxWidth}; - width: ${({ $fullWidth, $maxWidth }) => ($fullWidth || $maxWidth) && '100%'}; -`; - -export { StyledField, StyledFieldElWrapper }; diff --git a/packages/ui/src/components/Field/Field.tsx b/packages/ui/src/components/Field/Field.tsx deleted file mode 100644 index 0d50d6a80..000000000 --- a/packages/ui/src/components/Field/Field.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import { forwardRef, HTMLAttributes, ReactNode } from 'react'; -import { CSSProperties } from 'styled-components'; - -import { LabelPosition } from '../../theme'; -import { Flex, FlexProps } from '../Flex'; -import { HelperText, HelperTextProps } from '../HelperText'; -import { Label, LabelProps } from '../Label'; -import { hasError } from '../utils/input'; - -import { StyledField, StyledFieldElWrapper } from './Field.style'; - -type Props = { - label?: ReactNode; - labelPosition?: LabelPosition; - labelProps?: LabelProps; - maxWidth?: CSSProperties['maxWidth']; - fullWidth?: boolean; -}; - -type NativeAttrs = Omit, keyof Props>; - -type InheritAttrs = Omit; - -type FieldProps = Props & NativeAttrs & InheritAttrs; - -const Field = forwardRef( - ( - { - label, - labelPosition = 'top', - labelProps, - errorMessage, - errorMessageProps, - description, - descriptionProps, - children, - maxWidth, - fullWidth, - ...props - }, - ref - ): JSX.Element => { - const error = hasError({ errorMessage }); - const hasHelpText = !!description || error; - - const element = ( - <> - {children} - {hasHelpText && ( - - )} - - ); - - return ( - - {label && ( - - )} - {labelPosition === 'top' ? ( - element - ) : ( - - {element} - - )} - - ); - } -); - -Field.displayName = 'Field'; - -const useFieldProps = ({ - label, - labelPosition, - labelProps, - errorMessage, - errorMessageProps, - description, - descriptionProps, - className, - hidden, - style, - maxWidth, - alignItems, - justifyContent, - gap, - fullWidth, - ...props -}: FieldProps): { fieldProps: FieldProps; elementProps: any } => { - return { - fieldProps: { - label, - labelPosition, - labelProps, - errorMessage, - errorMessageProps, - description, - descriptionProps, - className, - hidden, - style, - maxWidth, - alignItems, - justifyContent, - gap, - fullWidth - }, - elementProps: props - }; -}; - -export { Field, useFieldProps }; -export type { FieldProps }; diff --git a/packages/ui/src/components/Field/__tests__/Field.test.tsx b/packages/ui/src/components/Field/__tests__/Field.test.tsx deleted file mode 100644 index 8a941cbc5..000000000 --- a/packages/ui/src/components/Field/__tests__/Field.test.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { render, testA11y } from '@gobob/test-utils'; -import { createRef } from 'react'; - -import { Field } from '..'; - -describe('Field', () => { - it('should render correctly', () => { - const { unmount } = render(); - - expect(() => unmount()).not.toThrow(); - }); - - it('ref should be forwarded', () => { - const ref = createRef(); - - render(); - - expect(ref.current).not.toBeNull(); - }); - - it('should pass a11y', async () => { - await testA11y(); - }); -}); diff --git a/packages/ui/src/components/Field/index.tsx b/packages/ui/src/components/Field/index.tsx deleted file mode 100644 index c875a5445..000000000 --- a/packages/ui/src/components/Field/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -export type { FieldProps } from './Field'; -export { Field, useFieldProps } from './Field'; diff --git a/packages/ui/src/components/HelperText/HelperText.style.tsx b/packages/ui/src/components/HelperText/HelperText.style.tsx index d9e733c6f..e215bec17 100644 --- a/packages/ui/src/components/HelperText/HelperText.style.tsx +++ b/packages/ui/src/components/HelperText/HelperText.style.tsx @@ -1,4 +1,4 @@ -import styled from 'styled-components'; +import styled, { css } from 'styled-components'; import { visuallyHidden } from '../utils/visually-hidden'; @@ -8,11 +8,16 @@ type StyledHelperTextProps = { }; const StyledHelperText = styled.div` - font-weight: ${({ theme }) => theme.fontWeight('medium')}; - ${({ theme }) => theme.typography('xs')} - color: ${({ $hasError, theme }) => ($hasError ? theme.color('red-500') : theme.color('grey-100'))}; - padding: ${({ theme }) => theme.spacing('xs')} 0; - ${({ $isHidden }) => $isHidden && visuallyHidden()} + ${({ theme, $hasError, $isHidden }) => css` + ${theme.label.base} + ${$hasError && theme.label.error.base} + + ${theme.typography('xs')} + ${$isHidden && visuallyHidden()} + + font-weight: ${theme.fontWeight('medium')}; + padding: ${theme.spacing('xs')} 0; + `} `; const StyledSubHelperText = styled.p` diff --git a/packages/ui/src/components/HelperText/HelperText.tsx b/packages/ui/src/components/HelperText/HelperText.tsx index d6ebf147a..c6191f8b6 100644 --- a/packages/ui/src/components/HelperText/HelperText.tsx +++ b/packages/ui/src/components/HelperText/HelperText.tsx @@ -1,14 +1,12 @@ -import { forwardRef, HTMLAttributes } from 'react'; - -import { hasError } from '../utils/input'; +import { forwardRef, HTMLAttributes, ReactNode } from 'react'; import { StyledHelperText, StyledSubHelperText } from './HelperText.style'; type Props = { - errorMessage?: string | string[]; + errorMessage?: ReactNode | ReactNode[]; // Used to pass accessiblity props errorMessageProps?: HTMLAttributes; - description?: string; + description?: ReactNode; // Used to pass accessiblity props descriptionProps?: HTMLAttributes; }; @@ -19,19 +17,17 @@ type HelperTextProps = Props & NativeAttrs; const HelperText = forwardRef( ({ errorMessage, errorMessageProps, description, descriptionProps, ...props }, ref): JSX.Element => { - const isErrorMessage = hasError({ errorMessage }); - const renderErrorMessage = () => { if (Array.isArray(errorMessage)) { - return errorMessage.map((message) => {message}); + return errorMessage.map((message, idx) => {message}); } return errorMessage; }; return ( - - {isErrorMessage ? ( + + {!!errorMessage ? (
    {renderErrorMessage()}
    ) : (
    {description}
    diff --git a/packages/ui/src/components/Icon/Icon.style.tsx b/packages/ui/src/components/Icon/Icon.style.tsx index 9ba3ee222..0d8926dbf 100644 --- a/packages/ui/src/components/Icon/Icon.style.tsx +++ b/packages/ui/src/components/Icon/Icon.style.tsx @@ -1,10 +1,13 @@ import styled from 'styled-components'; +import { css } from 'styled-components'; import { Color, IconsSizes } from '../../theme'; type StyledIconProps = { $size: IconsSizes; $color?: Color; + $width?: string | number; + $height?: string | number; }; const StyledIcon = styled.svg` @@ -12,7 +15,11 @@ const StyledIcon = styled.svg` user-select: none; flex-shrink: 0; overflow: hidden; - ${({ theme, $size, $color }) => theme.icon($size, $color)} + ${({ theme, $size, $color, $width, $height }) => css` + ${theme.icon($size, $color)} + width: ${$width}; + height: ${$height}; + `} `; export { StyledIcon }; diff --git a/packages/ui/src/components/Icon/Icon.tsx b/packages/ui/src/components/Icon/Icon.tsx index 5bb2efdff..e79bdba22 100644 --- a/packages/ui/src/components/Icon/Icon.tsx +++ b/packages/ui/src/components/Icon/Icon.tsx @@ -14,8 +14,8 @@ type NativeAttrs = Omit, keyof Props>; type IconProps = Props & NativeAttrs; const Icon = forwardRef( - ({ size = 'md', color, ...props }, ref): JSX.Element => ( - + ({ size = 'md', color, width, height, ...props }, ref): JSX.Element => ( + ) ); diff --git a/packages/ui/src/components/Input/BaseInput.tsx b/packages/ui/src/components/Input/BaseInput.tsx index 00d31a284..5140b640d 100644 --- a/packages/ui/src/components/Input/BaseInput.tsx +++ b/packages/ui/src/components/Input/BaseInput.tsx @@ -1,13 +1,23 @@ -import { FocusEvent, forwardRef, InputHTMLAttributes, ReactNode, TextareaHTMLAttributes } from 'react'; +import { + FocusEvent, + forwardRef, + InputHTMLAttributes, + MouseEventHandler, + ReactNode, + TextareaHTMLAttributes +} from 'react'; +import { useHover } from '@react-aria/interactions'; +import { useFocusRing } from '@react-aria/focus'; +import { mergeProps } from '@react-aria/utils'; +import { useDOMRef } from '../../hooks'; import { Spacing, InputSizes } from '../../theme'; -import { Field, FieldProps, useFieldProps } from '../Field'; -import { HelperTextProps } from '../HelperText'; -import { LabelProps } from '../Label'; -import { hasError } from '../utils/input'; +import { HelperText, HelperTextProps } from '../HelperText'; +import { Label, LabelProps } from '../Label'; import { ElementTypeProp } from '../utils/types'; +import { Flex } from '../Flex'; -import { StyledAdornmentLeft, StyledAdornmentRight, StyledBaseInput } from './Input.style'; +import { StyledAdornment, StyledBaseInput, StyledField, StyledWrapper } from './Input.style'; // TODO: might need to consolidate this later interface HTMLInputProps extends ElementTypeProp { @@ -32,43 +42,100 @@ type Props = { size?: InputSizes; isInvalid?: boolean; minHeight?: Spacing; + maxWidth?: Spacing; onFocus?: (e: FocusEvent) => void; onBlur?: (e: FocusEvent) => void; } & (HTMLInputProps | HTMLTextAreaProps); -type InheritAttrs = Omit< - HelperTextProps & - Pick, - keyof Props ->; +type InheritAttrs = Omit; type BaseInputProps = Props & InheritAttrs; const BaseInput = forwardRef( ( - { startAdornment, endAdornment, size = 'md', isInvalid, inputProps, minHeight, elementType = 'input', ...props }, + { + startAdornment, + endAdornment, + size = 'md', + isInvalid, + inputProps, + minHeight, + maxWidth, + elementType = 'input', + label, + labelProps, + description, + descriptionProps, + errorMessage, + errorMessageProps, + className, + hidden, + style + }, ref ): JSX.Element => { - // FIXME: move this into Field - const { fieldProps } = useFieldProps(props); + const domRef = useDOMRef(ref); - const error = hasError({ isInvalid, errorMessage: props.errorMessage }); + const error = isInvalid || !!errorMessage; + + const isDisabled = !!inputProps?.disabled; + + const { hoverProps, isHovered } = useHover({ isDisabled }); + + const { isFocused, focusProps } = useFocusRing({ + autoFocus: inputProps.autoFocus, + isTextInput: true + }); + + const hasHelpText = !!description || error; + + const handleClickWrapper: MouseEventHandler = (e) => { + if (domRef.current && e.currentTarget === e.target) { + domRef.current.focus(); + } + }; return ( - - {startAdornment && {startAdornment}} - + direction='column' + onClick={handleClickWrapper} + {...mergeProps(hoverProps, focusProps)} + > + {label && ( + + )} + + {startAdornment && {startAdornment}} + + {endAdornment && {endAdornment}} + + + {hasHelpText && ( + + )} + ); } ); diff --git a/packages/ui/src/components/Input/Input.stories.tsx b/packages/ui/src/components/Input/Input.stories.tsx index 426b71e73..01d8fa673 100644 --- a/packages/ui/src/components/Input/Input.stories.tsx +++ b/packages/ui/src/components/Input/Input.stories.tsx @@ -61,19 +61,19 @@ export const WithErrorMessage: StoryObj = { // }; export const Adornments: StoryFn = (args) => ( - - } /> - } label='End Adornment' /> + + } /> + } label='End Adornment' /> ); -// export const Sizes: StoryFn = (args) => ( -// -// -// -// -// -// ); +export const Sizes: StoryFn = (args) => ( + + + + + +); export const Placeholder: StoryObj = { args: { diff --git a/packages/ui/src/components/Input/Input.style.tsx b/packages/ui/src/components/Input/Input.style.tsx index ed4f5d338..fd712c1cd 100644 --- a/packages/ui/src/components/Input/Input.style.tsx +++ b/packages/ui/src/components/Input/Input.style.tsx @@ -1,68 +1,62 @@ import styled, { css } from 'styled-components'; import { InputSizes, Spacing } from '../../theme'; +import { Flex } from '../Flex'; type BaseInputProps = { - $size: InputSizes; - $adornments: { left: boolean; right: boolean }; - $isDisabled: boolean; - $hasError: boolean; $minHeight?: Spacing; + $error: boolean; + $hasStartAdornment: boolean; + $hasEndAdornment: boolean; }; -const StyledBaseInput = styled.input` - display: block; - width: 100%; - height: 100%; +type StyledAdornmentProps = { + $size: InputSizes; +}; - outline: none; - font: inherit; - letter-spacing: inherit; - background: none; +type StyledWrapperProps = { + $isHovered: boolean; + $isFocused: boolean; + $isDisabled: boolean; + $size: InputSizes; + $error: boolean; + $isTextArea: boolean; +}; - text-overflow: ellipsis; +type StyledFieldProps = { + $maxWidth?: Spacing; +}; + +const StyledWrapper = styled(Flex)` + ${({ theme, $size, $error, $isFocused, $isHovered, $isTextArea, $isDisabled }) => css` + height: ${$isTextArea && 'auto'}; + + ${theme.input.wrapper} + ${theme.input.sizes[$size].wrapper} + ${$error && theme.input.error.wrapper} + ${$isHovered ? ($error ? theme.input.error.hover.wapper : theme.input.hover.wapper) : undefined} + ${$isFocused ? ($error ? theme.input.error.focus.wrapper : theme.input.focus.wrapper) : undefined} + ${$isDisabled && theme.input.disabled.wrapper} + `} +`; +const StyledBaseInput = styled.input` // Properties for textarea min-height: ${({ $minHeight, theme, as }) => $minHeight ? theme.spacing($minHeight) : as === 'textarea' && theme.spacing('7xl')}; resize: ${({ as }) => as === 'textarea' && 'vertical'}; - ${({ theme, $size, $adornments, $hasError }) => { - const { paddingRight, paddingTop, paddingBottom, paddingLeft, ...sizeCss } = theme.input.size[$size]; - - // MEMO: adding `spacing6` is a hacky solution because - // the `endAdornmentWidth` does not update width correctly - // after fonts are loaded. Instead of falling back to a more - // complex solution, an extra offset does the job of not allowing - // the input overlap the adornment. - return css` - padding-top: ${paddingTop}; - padding-bottom: ${paddingBottom}; - padding-left: ${$adornments.left ? theme.spacing('5xl') : paddingLeft}; - padding-right: ${$adornments.right ? theme.spacing('5xl') : paddingRight}; - - ${sizeCss} - ${theme.input.base} - ${$hasError && theme.input.error.base} - - - &:hover:not(:disabled):not(:focus) { - ${$hasError ? theme.input.error.hover : theme.input.hover} - } - - &:focus:not(:disabled) { - ${$hasError ? theme.input.error.focus : theme.input.focus} - } + ${({ theme, $error, $hasEndAdornment, $hasStartAdornment }) => css` + ${theme.input.base} + ${$error && theme.input.error.base} - &::placeholder { - ${theme.input.placeholder} - } + padding-inline-start: ${$hasStartAdornment && '.375rem'}; + padding-inline-end: ${$hasEndAdornment && '.375rem'}; - &:disabled { - ${theme.input.disabled} - } - `; - }} + &::placeholder { + ${theme.input.placeholder} + } + `} /* MEMO: inspired by https://www.w3schools.com/howto/howto_css_hide_arrow_number.asp */ /* Chrome, Safari, Edge, Opera */ @@ -77,29 +71,17 @@ const StyledBaseInput = styled.input` } `; -type StyledAdornmentProps = { - $size: InputSizes; -}; - const StyledAdornment = styled.div` display: inline-flex; - align-items: center; - position: absolute; + align-items: flex-end; // to not allow adornment to take more than 50% of the input. We might want to reduce this in the future. max-width: 50%; + pointer-events: none; ${({ theme }) => theme.input.adornment}; `; -const StyledAdornmentRight = styled(StyledAdornment)` - top: 50%; - right: ${({ theme }) => theme.spacing('md')}; - transform: translateY(-50%); -`; - -const StyledAdornmentLeft = styled(StyledAdornment)` - top: 50%; - left: ${({ theme }) => theme.spacing('md')}; - transform: translateY(-50%); +const StyledField = styled(Flex)` + max-width: ${({ $maxWidth, theme }) => $maxWidth && theme.spacing($maxWidth)}; `; -export { StyledAdornmentLeft, StyledAdornmentRight, StyledBaseInput }; +export { StyledAdornment, StyledBaseInput, StyledWrapper, StyledField }; diff --git a/packages/ui/src/components/Label/Label.style.tsx b/packages/ui/src/components/Label/Label.style.tsx index dd1ad6c24..c4a1212b2 100644 --- a/packages/ui/src/components/Label/Label.style.tsx +++ b/packages/ui/src/components/Label/Label.style.tsx @@ -1,20 +1,18 @@ -import styled from 'styled-components'; +import styled, { css } from 'styled-components'; -import { LabelPosition } from '../../theme'; +import { LabelSizes } from '../../theme'; type StyledLabelProps = { - $position: LabelPosition; + $error?: boolean; + $size: LabelSizes; }; const StyledLabel = styled.label` - ${({ theme }) => theme.typography('xs')} - color: ${({ theme }) => theme.color('light')}; - font-weight: ${({ theme }) => theme.fontWeight('medium')}; - - // FIXME: padding bottom when position is on side - padding: ${({ theme, $position }) => - $position === 'top' ? `${theme.spacing('xs')} 0` : `${theme.spacing('s')} ${theme.spacing('xs')} 0.625rem 0`}; - align-self: flex-start; + ${({ theme, $error, $size }) => css` + ${theme.label.base} + ${theme.label.size[$size]} + ${$error && theme.label.error.base} + `} `; export { StyledLabel }; diff --git a/packages/ui/src/components/Label/Label.tsx b/packages/ui/src/components/Label/Label.tsx index 633bcc369..55c6f1930 100644 --- a/packages/ui/src/components/Label/Label.tsx +++ b/packages/ui/src/components/Label/Label.tsx @@ -1,11 +1,12 @@ import { forwardRef, LabelHTMLAttributes } from 'react'; -import { LabelPosition } from '../../theme'; +import { LabelSizes } from '../../theme'; import { StyledLabel } from './Label.style'; type Props = { - position?: LabelPosition; + size?: LabelSizes; + error?: boolean; }; type NativeAttrs = Omit, keyof Props>; @@ -13,8 +14,8 @@ type NativeAttrs = Omit, keyof Props>; type LabelProps = Props & NativeAttrs; const Label = forwardRef( - ({ children, position = 'top', ...props }, ref): JSX.Element => ( - + ({ children, size = 'md', error, ...props }, ref): JSX.Element => ( + {children} ) diff --git a/packages/ui/src/components/Link/Link.stories.tsx b/packages/ui/src/components/Link/Link.stories.tsx new file mode 100644 index 000000000..c801c4f15 --- /dev/null +++ b/packages/ui/src/components/Link/Link.stories.tsx @@ -0,0 +1,52 @@ +import { Meta, StoryObj } from '@storybook/react'; + +import { Button } from '../Button'; + +import { Link, LinkProps } from '.'; + +export default { + title: 'Navigation/Link', + component: Link, + parameters: { + layout: 'centered' + }, + args: { + children: 'Text Link', + href: '#' + } +} as Meta; + +export const Default: StoryObj = {}; + +export const External: StoryObj = { + args: { + external: true, + icon: true + } +}; + +export const HoverUnderlined: StoryObj = { + args: { + underlined: 'hover' + } +}; + +export const WithoutHref: StoryObj = { + args: { + href: undefined + } +}; + +export const Disabled: StoryObj = { + args: { + isDisabled: true + } +}; + +export const Polymorphic: StoryObj = { + render: () => ( + + ) +}; diff --git a/packages/ui/src/components/Link/Link.style.tsx b/packages/ui/src/components/Link/Link.style.tsx new file mode 100644 index 000000000..16a7df72e --- /dev/null +++ b/packages/ui/src/components/Link/Link.style.tsx @@ -0,0 +1,50 @@ +import styled, { css } from 'styled-components'; + +import { ArrowTopRightOnSquare } from '../../icons'; +import { Text } from '../Text/style'; + +type LinkProps = { + $underlined?: 'none' | 'hover' | 'always'; + $isFocusVisible?: boolean; +}; + +const StyledLink = styled(Text)` + ${({ theme }) => theme.link.base}; + outline: ${({ $isFocusVisible }) => !$isFocusVisible && 'none'}; + + &[aria-disabled] { + ${({ theme }) => theme.link.disabled}; + } + + &:hover:not([aria-disabled='true']) { + ${({ theme }) => theme.link.hover}; + } + + ${({ $underlined }) => { + switch ($underlined) { + case 'none': + default: + return css` + text-decoration: none; + `; + case 'always': + return css` + text-decoration: underline; + `; + case 'hover': + return css` + text-decoration: none; + + &:hover { + text-decoration: underline; + } + `; + } + }} +`; + +const StyledIcon = styled(ArrowTopRightOnSquare)` + ${({ theme }) => theme.link.icon}; +`; + +export { StyledIcon, StyledLink }; diff --git a/packages/ui/src/components/Link/Link.tsx b/packages/ui/src/components/Link/Link.tsx new file mode 100644 index 000000000..a2c582044 --- /dev/null +++ b/packages/ui/src/components/Link/Link.tsx @@ -0,0 +1,66 @@ +import { AriaLinkOptions, useLink } from '@react-aria/link'; +import { mergeProps } from '@react-aria/utils'; +import { AnchorHTMLAttributes, forwardRef } from 'react'; +import { useFocusRing } from '@react-aria/focus'; + +import { useDOMRef } from '../../hooks'; +import { Color } from '../../theme'; +import { TextProps } from '../Text'; +import { mapTextProps } from '../Text/utils'; + +import { StyledLink, StyledIcon } from './Link.style'; + +type Props = { + color?: Color; + external?: boolean; + underlined?: 'none' | 'hover' | 'always'; + icon?: boolean; +}; + +type AriaAttrs = Omit; + +type NativeAttrs = Omit, keyof Props & AriaAttrs>; + +type InheritAttrs = Omit; + +type LinkProps = Props & NativeAttrs & InheritAttrs & AriaAttrs; + +const Link = forwardRef( + ({ external, underlined = 'none', icon, children, href, className, ...props }, ref): JSX.Element => { + const linkRef = useDOMRef(ref); + + const elementType = href ? 'a' : 'span'; + + const externalProps = external ? { target: '_blank', rel: 'noreferrer' } : undefined; + + const ariaProps = { + ...props, + ...externalProps, + href, + elementType + }; + + const { linkProps } = useLink(ariaProps, linkRef); + + const { focusProps, isFocusVisible } = useFocusRing(props); + + return ( + + {children} + {icon && } + + ); + } +); + +Link.displayName = 'Link'; + +export { Link }; +export type { LinkProps }; diff --git a/packages/ui/src/components/TextLink/__tests__/TextLink.test.tsx b/packages/ui/src/components/Link/__tests__/Link.test.tsx similarity index 67% rename from packages/ui/src/components/TextLink/__tests__/TextLink.test.tsx rename to packages/ui/src/components/Link/__tests__/Link.test.tsx index 45c8a990b..fcad8369f 100644 --- a/packages/ui/src/components/TextLink/__tests__/TextLink.test.tsx +++ b/packages/ui/src/components/Link/__tests__/Link.test.tsx @@ -2,11 +2,11 @@ import { screen } from '@testing-library/react'; import { createRef } from 'react'; import { testA11y, render } from '@gobob/test-utils'; -import { TextLink } from '..'; +import { Link } from '..'; -describe('TextLink', () => { +describe('Link', () => { it('should render correctly', () => { - const { unmount } = render(link); + const { unmount } = render(link); expect(() => unmount()).not.toThrow(); }); @@ -14,19 +14,19 @@ describe('TextLink', () => { it('ref should be forwarded', () => { const ref = createRef(); - render(link); + render(link); expect(ref.current).not.toBeNull(); }); it('should pass a11y', async () => { - await testA11y(link); + await testA11y(link); }); it('should render pressable link as a span', async () => { const handlePress = jest.fn(); - render(link); + render(link); expect(screen.getByRole('link').tagName).toBe('SPAN'); }); diff --git a/packages/ui/src/components/Link/index.tsx b/packages/ui/src/components/Link/index.tsx new file mode 100644 index 000000000..b7c07a837 --- /dev/null +++ b/packages/ui/src/components/Link/index.tsx @@ -0,0 +1,2 @@ +export type { LinkProps } from './Link'; +export { Link } from './Link'; diff --git a/packages/ui/src/components/Modal/Modal.style.tsx b/packages/ui/src/components/Modal/Modal.style.tsx index 5c3ed4f57..7e56d7fab 100644 --- a/packages/ui/src/components/Modal/Modal.style.tsx +++ b/packages/ui/src/components/Modal/Modal.style.tsx @@ -2,6 +2,7 @@ import styled, { CSSProperties } from 'styled-components'; import { DialogSize } from '../../theme'; import { overlayCSS } from '../utils/overlay'; +import { customScrollbarCSS } from '../utils/scroll'; import { Dialog, DialogBody } from '../Dialog'; type StyledWrapperProps = { @@ -18,10 +19,6 @@ type StyledDialogProps = { $isOpen?: boolean; }; -type StyledModalBodyProps = { - $noPadding?: boolean; -}; - const StyledWrapper = styled.div` position: fixed; top: 0; @@ -64,10 +61,10 @@ const StyledDialog = styled(Dialog)` max-height: inherit; `; -const StyledDialogBody = styled(DialogBody)` +const StyledDialogBody = styled(DialogBody)` overflow-y: auto; position: relative; - padding: ${({ $noPadding }) => $noPadding && 0}; + ${customScrollbarCSS} `; export { StyledDialog, StyledDialogBody, StyledModal, StyledWrapper }; diff --git a/packages/ui/src/components/Modal/ModalBody.tsx b/packages/ui/src/components/Modal/ModalBody.tsx index 895539df5..9f6fe3e22 100644 --- a/packages/ui/src/components/Modal/ModalBody.tsx +++ b/packages/ui/src/components/Modal/ModalBody.tsx @@ -2,17 +2,13 @@ import { DialogBodyProps } from '../Dialog'; import { StyledDialogBody } from './Modal.style'; -type Props = { - noPadding?: boolean; -}; +type Props = {}; type InheritAttrs = Omit; type ModalBodyProps = Props & InheritAttrs; -const ModalBody = ({ noPadding, ...props }: ModalBodyProps): JSX.Element => ( - -); +const ModalBody = (props: ModalBodyProps): JSX.Element => ; export { ModalBody }; export type { ModalBodyProps }; diff --git a/packages/ui/src/components/NumberInput/NumberInput.stories.tsx b/packages/ui/src/components/NumberInput/NumberInput.stories.tsx index ff87a78e7..2cdf65ee2 100644 --- a/packages/ui/src/components/NumberInput/NumberInput.stories.tsx +++ b/packages/ui/src/components/NumberInput/NumberInput.stories.tsx @@ -55,12 +55,6 @@ export const WithMultipleErrorMessage: StoryObj = { } }; -export const SideLabel: StoryObj = { - args: { - labelPosition: 'side' - } -}; - export const Adornments: StoryFn = (args) => ( } /> @@ -88,8 +82,6 @@ export const Sizes: StoryFn = (args) => ( export const MaxWidth: StoryObj = { args: { maxWidth: 'xl', - labelPosition: 'side', - justifyContent: 'space-between', style: { width: 150 }, description: 'Please enter your amount' } diff --git a/packages/ui/src/components/Radio/Radio.stories.tsx b/packages/ui/src/components/Radio/Radio.stories.tsx index 2ceed6b3b..7eba3600b 100644 --- a/packages/ui/src/components/Radio/Radio.stories.tsx +++ b/packages/ui/src/components/Radio/Radio.stories.tsx @@ -43,12 +43,6 @@ export const Horizontal: StoryObj = { } }; -export const SideLabel: StoryObj = { - args: { - labelPosition: 'side' - } -}; - export const Disabled: StoryObj = { args: { isDisabled: true diff --git a/packages/ui/src/components/Radio/Radio.style.tsx b/packages/ui/src/components/Radio/Radio.style.tsx index ce701bc94..9642328b2 100644 --- a/packages/ui/src/components/Radio/Radio.style.tsx +++ b/packages/ui/src/components/Radio/Radio.style.tsx @@ -15,10 +15,15 @@ type StyledLabelProps = { $flex?: number | string | boolean; }; +type StyledFieldProps = { + $isDisabled?: boolean; +}; + type StyledButtonProps = { $size: RadioSize; $isSelected: boolean; $isHovered: boolean; + $isInvalid: boolean; }; const StyledRadioGroup = styled(Flex)` @@ -37,6 +42,10 @@ const StyledLabel = styled(Label)` align-items: center; opacity: ${({ $isDisabled }) => $isDisabled && 0.5}; flex: ${({ $flex }) => (typeof $flex === 'boolean' ? '1' : $flex)}; + ${({ theme, error }) => css` + ${theme.radio.base} + ${error && theme.radio.error.base} + `} `; const StyledInput = styled.input` @@ -51,14 +60,15 @@ const StyledButton = styled.span` border-radius: 50%; opacity: ${({ $isHovered }) => $isHovered && 0.9}; - ${({ theme, $size, $isSelected }) => { - const { button, selected, size } = theme.radio; + ${({ theme, $size, $isSelected, $isInvalid }) => { + const { button, selected, size, error } = theme.radio; const { button: buttonSize, selected: selectedSize } = size[$size]; return css` ${button.base} ${buttonSize.base} ${$isSelected && selected.button.base} + ${$isInvalid && error.button.base} &::after { content: ''; @@ -72,10 +82,15 @@ const StyledButton = styled.span` ${button.inside} ${$isSelected && selected.button.inside} + ${$isInvalid && error.button.inside} ${$isSelected && selectedSize.button.inside} } `; }} `; -export { StyledLabel, StyledRadioGroup, StyledButton, StyledInput }; +const StyledField = styled(Flex)` + opacity: ${({ $isDisabled }) => $isDisabled && '.5'}; +`; + +export { StyledLabel, StyledRadioGroup, StyledButton, StyledField, StyledInput }; diff --git a/packages/ui/src/components/Radio/Radio.tsx b/packages/ui/src/components/Radio/Radio.tsx index 2c28166c5..154ec2528 100644 --- a/packages/ui/src/components/Radio/Radio.tsx +++ b/packages/ui/src/components/Radio/Radio.tsx @@ -1,18 +1,19 @@ -import { useHover } from '@react-aria/interactions'; +import { useHover, usePress } from '@react-aria/interactions'; import { AriaRadioProps, useRadio } from '@react-aria/radio'; import { HTMLAttributes, forwardRef, useRef } from 'react'; import { useTheme } from 'styled-components'; +import { mergeProps } from '@react-aria/utils'; +import { useFocusRing } from '@react-aria/focus'; import { useDOMRef } from '../../hooks'; -import { Placement } from '../../theme'; -import { Span, TextProps } from '../Text'; +import { Span } from '../Text'; +import { LabelProps } from '../Label'; import { StyledButton, StyledInput, StyledLabel } from './Radio.style'; import { useRadioProvider } from './RadioContext'; type Props = { - labelProps?: TextProps; - labelPlacement?: Extract; + labelProps?: LabelProps; flex?: string | number | boolean; }; @@ -22,10 +23,12 @@ type InheritAttrs = Omit; type RadioProps = Props & NativeAttrs & InheritAttrs; -// TODO: determine if isInvalid is necessary const Radio = forwardRef( ({ labelProps, isDisabled: isDisabledProp, children, className, style, flex, ...props }, ref): JSX.Element => { - let { hoverProps, isHovered } = useHover({ isDisabled: isDisabledProp }); + const { hoverProps, isHovered } = useHover({ isDisabled: isDisabledProp }); + const { pressProps, isPressed } = usePress({ isDisabled: isDisabledProp, ...props }); + const { isFocusVisible, isFocused, focusProps } = useFocusRing(props); + const { radio } = useTheme(); const labelRef = useDOMRef(ref); @@ -45,17 +48,28 @@ const Radio = forwardRef( return ( - - - {children && {children}} + + + {children && ( + + {children} + + )} ); } diff --git a/packages/ui/src/components/Radio/RadioGroup.tsx b/packages/ui/src/components/Radio/RadioGroup.tsx index 987fab01f..83662854f 100644 --- a/packages/ui/src/components/Radio/RadioGroup.tsx +++ b/packages/ui/src/components/Radio/RadioGroup.tsx @@ -4,10 +4,11 @@ import { useRadioGroupState } from '@react-stately/radio'; import { useDOMRef } from '../../hooks'; import { Orientation, RadioSize, Spacing } from '../../theme'; -import { Field, FieldProps, useFieldProps } from '../Field'; +import { Label } from '../Label'; +import { HelperText, HelperTextProps } from '../HelperText'; import { RadioContext } from './RadioContext'; -import { StyledRadioGroup } from './Radio.style'; +import { StyledField, StyledRadioGroup } from './Radio.style'; type Props = { gap?: Spacing; @@ -17,29 +18,51 @@ type Props = { onValueChange?: (value: string) => void; }; -type InheritAttrs = Omit; +type AriaAttrs = Omit; -type FieldAttrs = Omit; +type InheritAttrs = Omit; -type RadioGroupProps = Props & FieldAttrs & InheritAttrs; +type RadioGroupProps = Props & InheritAttrs & AriaAttrs; const RadioGroup = forwardRef( - ({ orientation = 'vertical', children, onValueChange, onChange, gap, size = 'md', ...props }, ref): JSX.Element => { - const { fieldProps } = useFieldProps(props as Omit); - + ( + { + orientation = 'vertical', + children, + onValueChange, + onChange, + gap, + size = 'md', + label, + errorMessage, + description, + isInvalid, + isDisabled, + ...props + }, + ref + ): JSX.Element => { let domRef = useDOMRef(ref); - let state = useRadioGroupState({ onChange: onValueChange, ...props }); - let { radioGroupProps, labelProps, descriptionProps, errorMessageProps } = useRadioGroup(props, state); + let state = useRadioGroupState({ + onChange: onValueChange, + errorMessage, + description, + isInvalid: !!errorMessage || isInvalid, + isDisabled, + ...props + }); + let { radioGroupProps, labelProps, descriptionProps, errorMessageProps } = useRadioGroup( + { label, errorMessage, description, isDisabled, isInvalid, ...props }, + state + ); return ( - + + {label && ( + + )} ( > {children} - + {(description || errorMessage) && ( + + )} + ); } ); diff --git a/packages/ui/src/components/Select/Select.stories.tsx b/packages/ui/src/components/Select/Select.stories.tsx index 89123cffd..36f3b026b 100644 --- a/packages/ui/src/components/Select/Select.stories.tsx +++ b/packages/ui/src/components/Select/Select.stories.tsx @@ -8,68 +8,70 @@ import { Button } from '..'; import { Select, SelectProps } from './Select'; const Render = (args: SelectProps) => ( - {...args}> - - - BTC - - - - - ETH - - - - - USDT - - - - - USDC - - - - - TBTC - - - - - WBTC - - - - - WETH - - - - - DAI - - - - - BBTC - - - - - DBTC - - - - - PBTC - - - - - WWBTC - - - +
    + {...args}> + + + BTC + + + + + ETH + + + + + USDT + + + + + USDC + + + + + TBTC + + + + + WBTC + + + + + WETH + + + + + DAI + + + + + BBTC + + + + + DBTC + + + + + PBTC + + + + + WWBTC + + + +
    ); export default { @@ -79,6 +81,7 @@ export default { layout: 'centered' }, args: { + type: 'modal', label: 'Coin' }, render: Render @@ -166,15 +169,16 @@ export const WithMultipleErrorMessage: StoryObj = { } }; -export const SideLabel: StoryObj = { +export const MaxWidth: StoryObj = { args: { - labelPosition: 'side' + maxWidth: '11xl' } }; -export const MaxWidth: StoryObj = { +export const AsProp: StoryObj = { args: { - maxWidth: '11xl' + type: 'modal', + asSelectTrigger: (props: any) =>