diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 000000000..078574c42 --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,19 @@ +name: 'Dependency Review' +on: [pull_request] + +permissions: + contents: read + pull-requests: write + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: 'Checkout Repository' + uses: actions/checkout@v5 + - name: 'Dependency Review' + uses: actions/dependency-review-action@v4 + with: + comment-summary-in-pr: on-failure + fail-on-severity: moderate + license-check: false diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index f944a0ec8..e88d0b605 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -16,7 +16,7 @@ jobs: node-version: 16 - name: Use node_modules cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: '**/node_modules' key: ${{ runner.os }}-modules-${{ hashFiles('**/pnpm-lock.yaml') }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 47c0fe2a3..c8a4592a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,31 @@ +# 1.9.1 + +This update includes updates to the peer dependencies and improvements to the Family Accounts features. + +## Updated + +- `family` package updated to latest. + +## Improved + +- Improved support for `family` features. + +# 1.9.0 + +We're thrilled to announce a major upgrade to ConnectKit—designed to make onboarding and navigating Ethereum simpler and safer than ever. + +Introducing [Family Accounts](https://app.family.co), simplified onboarding for new users. + +Learn more by reading the announcement [here](https://family.co/blog/family-accounts). + +## New + +- Support for [Family Accounts](https://app.family.co). + +## Improved + +- Updates chain logos for `zora`, `base`, `optimism` and `lens`. + # 1.8.2 This update includes improvements to the `CoinbaseWalletSDK` connect popup and `MockConnector`. diff --git a/examples/testbench/src/components/Web3Provider.tsx b/examples/testbench/src/components/Web3Provider.tsx index 82622c1e6..18d42e94c 100644 --- a/examples/testbench/src/components/Web3Provider.tsx +++ b/examples/testbench/src/components/Web3Provider.tsx @@ -41,6 +41,7 @@ export const ckConfig = getDefaultConfig({ appName: 'ConnectKit testbench', appIcon: '/app.png', walletConnectProjectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID!, + //enableFamily: false, }); const customConfig = { ...ckConfig, diff --git a/packages/connectkit/package.json b/packages/connectkit/package.json index 1ca012997..9374bd108 100644 --- a/packages/connectkit/package.json +++ b/packages/connectkit/package.json @@ -1,6 +1,6 @@ { "name": "connectkit", - "version": "1.8.2", + "version": "1.9.1", "author": "Family", "homepage": "https://docs.family.co/connectkit", "license": "BSD-2-Clause license", @@ -41,6 +41,7 @@ "dependencies": { "buffer": "^6.0.3", "detect-browser": "^5.3.0", + "family": "^0.1.2", "framer-motion": "^6.3.11", "qrcode": "^1.5.0", "react-transition-state": "^1.1.4", diff --git a/packages/connectkit/src/assets/chains.tsx b/packages/connectkit/src/assets/chains.tsx index 9821efdc8..19b0d77ec 100644 --- a/packages/connectkit/src/assets/chains.tsx +++ b/packages/connectkit/src/assets/chains.tsx @@ -108,6 +108,27 @@ export const Ethereum = ({ testnet, ...props }: Logo) => { ); }; +export const LensChain = ({ testnet, ...props }: { testnet?: boolean }) => ( + + + +); + export const Polygon = ({ testnet, ...props }: Logo) => ( ( d="M22.8188 27.6815C22.6977 27.6815 22.6041 27.6429 22.5381 27.5659C22.483 27.4778 22.4665 27.3788 22.4885 27.2687L24.7672 16.5358C24.7892 16.4147 24.8498 16.3156 24.9489 16.2385C25.0479 16.1615 25.1525 16.1229 25.2626 16.1229H29.6548C30.8767 16.1229 31.8564 16.3761 32.5939 16.8825C33.3426 17.3889 33.7168 18.1209 33.7168 19.0786C33.7168 19.3538 33.6838 19.64 33.6177 19.9372C33.3426 21.2032 32.7867 22.1389 31.95 22.7443C31.1244 23.3498 29.9905 23.6525 28.5485 23.6525H26.3194L25.5598 27.2687C25.5377 27.3898 25.4772 27.4888 25.3782 27.5659C25.2791 27.6429 25.1745 27.6815 25.0645 27.6815H22.8188ZM28.6641 21.3738C29.1264 21.3738 29.5282 21.2472 29.8695 20.994C30.2217 20.7408 30.4529 20.3776 30.563 19.9042C30.596 19.717 30.6125 19.552 30.6125 19.4089C30.6125 19.0896 30.519 18.8474 30.3318 18.6823C30.1446 18.5062 29.8255 18.4182 29.3741 18.4182H27.3926L26.7652 21.3738H28.6641Z" fill="white" /> + + + ); @@ -850,6 +880,7 @@ const Zora = ({ testnet, ...props }: { testnet?: boolean }) => ( export default { UnknownChain, Base, + LensChain, Ethereum, Polygon, Optimism, diff --git a/packages/connectkit/src/assets/logos.tsx b/packages/connectkit/src/assets/logos.tsx index d556a5b31..e1c77a1d0 100644 --- a/packages/connectkit/src/assets/logos.tsx +++ b/packages/connectkit/src/assets/logos.tsx @@ -1,4 +1,4 @@ -import { isFamily, isRainbow, isZerion } from '../utils/wallets'; +import { isArgent, isPhantom, isSafe } from '../utils/wallets'; export const Mock = ({ ...props }) => ( ( style={ background ? { - background: - 'linear-gradient(0deg, var(--ck-brand-metamask-12), var(--ck-brand-metamask-11))', + background: 'var(--ck-brand-metamask-bg)', borderRadius: '27.5%', } : undefined } - width="32" - height="32" - viewBox="0 0 32 32" + width="88" + height="88" + viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg" > - {/** - - - - - - - - */} - - - - - - - - - - - - - - - - - - - - - - ); @@ -384,6 +163,23 @@ export const Coinbase = ({ background = false, ...props }) => ( ); +export const FamilyAccount = () => ( + + + +); + export const Family = ({ ...props }) => { const img = 'data:image/png;base64,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'; @@ -1262,12 +1058,12 @@ export const OtherWallets = ({ ...props }) => { position: 'relative', display: 'flex', flexDirection: 'column', - gap: 2, + gap: 3, }; const row: React.CSSProperties = { position: 'relative', display: 'flex', - gap: 2, + gap: 3, }; const cell: React.CSSProperties = { width: '50%', @@ -1280,11 +1076,13 @@ export const OtherWallets = ({ ...props }) => {
-
{!isZerion() ? : }
+
{!isArgent() ? : }
-
{!isFamily() ? : }
-
{!isRainbow() ? : }
+
+ {!isPhantom() ? : } +
+
{!isSafe() ? : }
); @@ -1329,6 +1127,7 @@ export default { MetaMask, Coinbase, Family, + FamilyAccount, Trust, Argent, ImToken, diff --git a/packages/connectkit/src/components/Common/Button/index.tsx b/packages/connectkit/src/components/Common/Button/index.tsx index 1e1ecc994..0d722b47c 100644 --- a/packages/connectkit/src/components/Common/Button/index.tsx +++ b/packages/connectkit/src/components/Common/Button/index.tsx @@ -42,7 +42,7 @@ const Button: React.FC = ({ : flattenChildren(children).join(''); // Need to generate a string for the key so we can automatically animate between content const hrefUrl = - typeof href === 'string' ? href : flattenChildren(href).join(''); // Need to have a flat string for the href + href && (typeof href === 'string' ? href : flattenChildren(href).join('')); // Need to have a flat string for the href return ( { const context = useContext(); @@ -29,17 +35,28 @@ const ConnectorList = () => { const wallets = useWallets(); const { lastConnectorId } = useLastConnector(); + const familyConnector = useFamilyConnector(); + const familyAccountsConnector = useFamilyAccountsConnector(); + + let filteredWallets = wallets.filter( + (wallet) => wallet.id !== familyAccountsConnector?.id + ); + if (familyConnector && isFamily()) { + filteredWallets = filteredWallets.filter( + (wallet) => wallet.id !== familyConnector?.id + ); + } const walletsToDisplay = context.options?.hideRecentBadge || lastConnectorId === 'walletConnect' // do not hoist walletconnect to top of list - ? wallets + ? filteredWallets : [ // move last used wallet to top of list // using .filter and spread to avoid mutating original array order with .sort - ...wallets.filter( + ...filteredWallets.filter( (wallet) => lastConnectorId === wallet.connector.id ), - ...wallets.filter( + ...filteredWallets.filter( (wallet) => lastConnectorId !== wallet.connector.id ), ]; @@ -105,7 +122,7 @@ const ConnectorItem = ({ // Safari requires opening popup on user gesture, so we connect immediately here const shouldConnectImmediately = (detectBrowser() === 'safari' || detectBrowser() === 'ios') && - isCoinbaseWalletConnector(wallet.connector.id); + (isCoinbaseWalletConnector(wallet.connector.id) || isPortoConnector(wallet.connector.id)); if (redirectToMoreWallets || shouldConnectImmediately) deeplink = undefined; // mobile redirects to more wallets page @@ -134,6 +151,7 @@ const ConnectorItem = ({ {wallet.iconConnector ?? wallet.icon} diff --git a/packages/connectkit/src/components/Common/ConnectorList/styles.ts b/packages/connectkit/src/components/Common/ConnectorList/styles.ts index 0557aedff..0c4fbdbd3 100644 --- a/packages/connectkit/src/components/Common/ConnectorList/styles.ts +++ b/packages/connectkit/src/components/Common/ConnectorList/styles.ts @@ -212,6 +212,12 @@ const styles = { &[data-shape='square'] { border-radius: 0; } + + &[data-background='true'] { + border-radius: 22.5%; + background: var(--ck-body-background-tertiary); + padding: 8%; + } `, }, }; diff --git a/packages/connectkit/src/components/Common/FamilyAccountsButton/index.tsx b/packages/connectkit/src/components/Common/FamilyAccountsButton/index.tsx new file mode 100644 index 000000000..7dbde54ed --- /dev/null +++ b/packages/connectkit/src/components/Common/FamilyAccountsButton/index.tsx @@ -0,0 +1,41 @@ +import { + ButtonContainer, + InnerContainer, + IconContainer, + ButtonContainerInner, +} from './styles'; +import FitText from '../FitText'; +import useLocales from '../../../hooks/useLocales'; + +const FamilyLogo = () => ( + + + +); + +export const FamilyAccountsButton = ({ onClick }: { onClick: () => void }) => { + const locales = useLocales(); + return ( + + + + + + + {locales.continueWithFamily} + + + + ); +}; diff --git a/packages/connectkit/src/components/Common/FamilyAccountsButton/styles.ts b/packages/connectkit/src/components/Common/FamilyAccountsButton/styles.ts new file mode 100644 index 000000000..85016e55f --- /dev/null +++ b/packages/connectkit/src/components/Common/FamilyAccountsButton/styles.ts @@ -0,0 +1,79 @@ +import { motion } from 'framer-motion'; +import styled from './../../../styles/styled'; + +export const ButtonContainerInner = styled(motion.div)` + display: flex; + align-items: center; + justify-content: center; + inset: 0; + height: 100%; +`; +export const ButtonContainer = styled.button` + --color: #ffffff; + --background: var(--ck-family-accounts-brand); + --box-shadow: var(--ck-primary-button-box-shadow); + --border-radius: var(--ck-primary-button-border-radius); + --font-weight: var(--ck-primary-button-font-weight, 500); + + --hover-color: var(--ck-button-primary-hover-color, var(--color)); + --hover-background: var( + --ck-primary-button-hover-background, + var(--background) + ); + --hover-box-shadow: var( + --ck-primary-button-hover-box-shadow, + var(--box-shadow) + ); + --hover-border-radius: var( + --ck-primary-button-hover-border-radius, + var(--border-radius) + ); + --hover-font-weight: var(--ck-primary-button-font-weight, var(--font-weight)); + + appearance: none; + cursor: pointer; + user-select: none; + min-width: fit-content; + width: 100%; + display: block; + text-align: center; + height: 48px; + margin: 18px 0 2px; + line-height: 48px; + padding: 0 4px; + font-size: 16px; + font-weight: var(--font-weight, 500); + text-decoration: none; + white-space: nowrap; + transition: 100ms ease; + transition-property: box-shadow, background-color; + color: var(--color); + background: var(--background); + border-radius: var(--border-radius); + box-shadow: var(--box-shadow); + will-change: transform, box-shadow, background-color, color; +`; + +export const InnerContainer = styled.div` + transform: translateZ(0); // Shifting fix + position: relative; + display: inline-block; + vertical-align: middle; + max-width: calc(100% - 42px); + transition: opacity 300ms ease; +`; + +export const IconContainer = styled.div` + position: relative; + display: inline-block; + vertical-align: middle; + max-width: 20px; + max-height: 20px; + margin: 0 12px 0 0; + svg { + display: block; + position: relative; + max-width: 100%; + height: auto; + } +`; diff --git a/packages/connectkit/src/components/Common/Modal/index.tsx b/packages/connectkit/src/components/Common/Modal/index.tsx index 29e90aecc..c80c429d3 100644 --- a/packages/connectkit/src/components/Common/Modal/index.tsx +++ b/packages/connectkit/src/components/Common/Modal/index.tsx @@ -697,10 +697,16 @@ const Page: React.FC = ({ ); }; -export const OrDivider = ({ children }: { children?: React.ReactNode }) => { +export const OrDivider = ({ + children, + hideHr, +}: { + children?: React.ReactNode; + hideHr?: boolean; +}) => { const locales = useLocales(); return ( - + {children ?? locales.or} ); diff --git a/packages/connectkit/src/components/Common/Modal/styles.ts b/packages/connectkit/src/components/Common/Modal/styles.ts index 4d90071ec..0c9dbd69b 100644 --- a/packages/connectkit/src/components/Common/Modal/styles.ts +++ b/packages/connectkit/src/components/Common/Modal/styles.ts @@ -71,7 +71,9 @@ export const PageContent = styled(motion.div)` padding-top: 48px; `; -export const TextWithHr = styled(motion.div)` +export const TextWithHr = styled(motion.div)<{ + $disableHr?: boolean; +}>` user-select: none; position: relative; display: block; @@ -90,6 +92,9 @@ export const TextWithHr = styled(motion.div)` background: var(--ck-body-background); transition: background-color 200ms ease; } + ${(props) => + !props.$disableHr && + ` &:before { z-index: 2; content: ''; @@ -102,6 +107,7 @@ export const TextWithHr = styled(motion.div)` background: var(--ck-body-divider); box-shadow: var(--ck-body-divider-box-shadow); } + `} `; export const ModalHeading = styled(motion.div)` z-index: 3; diff --git a/packages/connectkit/src/components/ConnectModal/ConnectUsing.tsx b/packages/connectkit/src/components/ConnectModal/ConnectUsing.tsx index 877e945c5..f41a416d1 100644 --- a/packages/connectkit/src/components/ConnectModal/ConnectUsing.tsx +++ b/packages/connectkit/src/components/ConnectModal/ConnectUsing.tsx @@ -54,6 +54,7 @@ const ConnectUsing = () => { switchConnectMethod={(id?: string) => { //if (id) setId(id); setStatus(states.INJECTOR); + setTimeout(context.triggerResize, 10); // delay required here for modal to resize }} /> @@ -70,6 +71,7 @@ const ConnectUsing = () => { switchConnectMethod={(id?: string) => { //if (id) setId(id); setStatus(states.QRCODE); + setTimeout(context.triggerResize, 10); // delay required here for modal to resize }} /> diff --git a/packages/connectkit/src/components/ConnectModal/ConnectWithInjector/index.tsx b/packages/connectkit/src/components/ConnectModal/ConnectWithInjector/index.tsx index abacab0ee..e8b934772 100644 --- a/packages/connectkit/src/components/ConnectModal/ConnectWithInjector/index.tsx +++ b/packages/connectkit/src/components/ConnectModal/ConnectWithInjector/index.tsx @@ -27,7 +27,11 @@ import SquircleSpinner from './SquircleSpinner'; import { RetryIconCircle, Scan } from '../../../assets/icons'; import BrowserIcon from '../../Common/BrowserIcon'; import { AlertIcon, TickIcon } from '../../../assets/icons'; -import { detectBrowser, isWalletConnectConnector } from '../../../utils'; +import { + detectBrowser, + isFamilyAccountsConnector, + isWalletConnectConnector, +} from '../../../utils'; import useLocales from '../../../hooks/useLocales'; import { useConnect } from '../../../hooks/useConnect'; import { useContext } from '../../ConnectKit'; @@ -340,6 +344,16 @@ const ConnectWithInjector: React.FC<{ {locales.injectionScreen_failed_p} + + {isFamilyAccountsConnector(wallet.id) && ( + <> + + + + )} + {/* Reason: Coinbase Wallet does not expose a QRURI when extension is installed */} {/* {wallet?.getWalletConnectDeeplink && @@ -365,11 +379,28 @@ const ConnectWithInjector: React.FC<{ exit={'exit'} variants={contentVariants} > - + {locales.injectionScreen_rejected_h1} {locales.injectionScreen_rejected_p} + {isFamilyAccountsConnector(wallet.id) && ( + <> + + + + )} + {/* Reason: Coinbase Wallet does not expose a QRURI when extension is installed */} {/* {wallet?.getWalletConnectDeeplink && @@ -395,7 +426,11 @@ const ConnectWithInjector: React.FC<{ exit={'exit'} variants={contentVariants} > - + {wallet.connector.id === 'injected' ? locales.injectionScreen_connecting_injected_h1 diff --git a/packages/connectkit/src/components/ConnectModal/ConnectWithQRCode.tsx b/packages/connectkit/src/components/ConnectModal/ConnectWithQRCode.tsx index 7bb7cae9d..cfa6b9ba7 100644 --- a/packages/connectkit/src/components/ConnectModal/ConnectWithQRCode.tsx +++ b/packages/connectkit/src/components/ConnectModal/ConnectWithQRCode.tsx @@ -5,7 +5,7 @@ import { useWalletConnectModal } from '../../hooks/useWalletConnectModal'; import { detectBrowser, - isCoinbaseWalletConnector, + isFamilyAccountsConnector, isWalletConnectConnector, } from '../../utils'; @@ -130,6 +130,14 @@ const ConnectWithQRCode: React.FC<{ )} + {isFamilyAccountsConnector(wallet.id) && ( + <> + + + + )} {/* {hasExtensionInstalled && ( // Run the extension - )} + + + {familyAccountsConnector && ( + <> + { + if (familyConnector && isFamily()) { + context.setConnector(familyConnector); + } else { + context.setConnector(familyAccountsConnector); + } + context.setRoute(routes.CONNECT); + }} + /> + {locales.orSelectWallet} + + )} +
+ + {isMobile ? ( + <> + + + {locales.connectorsScreen_h1} + {locales.connectorsScreen_p} + + + {!context.options?.hideQuestionMarkCTA && ( + + )} + {!context.options?.hideNoWalletCTA && ( + + )} + + + + ) : ( + <> {!context.options?.hideNoWalletCTA && ( - + + context.setRoute(routes.ONBOARDING)} + > + {locales.connectorsScreen_newcomer} + + )} - - - - ) : ( - <> - {!context.options?.hideNoWalletCTA && ( - - context.setRoute(routes.ONBOARDING)} - > - {locales.connectorsScreen_newcomer} - - + + )} + {context.options?.disclaimer && ( + +
{context.options?.disclaimer}
+
)} - - )} - {context.options?.disclaimer && ( - -
{context.options?.disclaimer}
-
- )} +
+
); }; diff --git a/packages/connectkit/src/components/Pages/Connectors/styles.ts b/packages/connectkit/src/components/Pages/Connectors/styles.ts index d439628e6..22d9dd8b6 100644 --- a/packages/connectkit/src/components/Pages/Connectors/styles.ts +++ b/packages/connectkit/src/components/Pages/Connectors/styles.ts @@ -9,6 +9,12 @@ const Shimmer = keyframes` 100%{ transform: translate(100%) rotate(-80deg); } `; +export const Container = styled(motion.div)` + display: flex; + flex-direction: column; + gap: 12px; +`; + export const InfoBox = styled.div` padding: 24px 24px 28px; border-radius: var(--ck-tertiary-border-radius, 24px); diff --git a/packages/connectkit/src/components/Pages/Profile/index.tsx b/packages/connectkit/src/components/Pages/Profile/index.tsx index b4c65f558..04f6cbdbc 100644 --- a/packages/connectkit/src/components/Pages/Profile/index.tsx +++ b/packages/connectkit/src/components/Pages/Profile/index.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from 'react'; import { useContext } from '../../ConnectKit'; import { + isFamilyAccountsConnector, isSafeConnector, nFormatter, truncateEthAddress, @@ -12,6 +13,7 @@ import { useAccount, useEnsName, useBalance, + useConnectorClient, } from 'wagmi'; import { @@ -50,6 +52,11 @@ const Profile: React.FC<{ closeModal?: () => void }> = ({ closeModal }) => { const { disconnect } = useDisconnect(); const { address, isConnected, connector, chain } = useAccount(); + const isFamilyConnector = isFamilyAccountsConnector(connector?.id); + const { data: connectorClient } = useConnectorClient({ + connector, + }); + const ensFallbackConfig = useEnsFallbackConfig(); const { data: ensName } = useEnsName({ chainId: 1, @@ -135,10 +142,36 @@ const Profile: React.FC<{ closeModal?: () => void }> = ({ closeModal }) => { )}
+ + {isFamilyConnector && ( + <> + + + )} {!isSafeConnector(connector?.id) && ( diff --git a/packages/connectkit/src/constants/chainConfigs.tsx b/packages/connectkit/src/constants/chainConfigs.tsx index 94254b634..f62d87f3e 100644 --- a/packages/connectkit/src/constants/chainConfigs.tsx +++ b/packages/connectkit/src/constants/chainConfigs.tsx @@ -37,6 +37,16 @@ export const chainConfigs: Chain[] = [ }, }, }, + { + id: 232, + name: 'Lens Chain', + logo: , + }, + { + id: 37111, + name: 'Lens Chain Testnet', + logo: , + }, { id: 3, name: 'Rinkeby', diff --git a/packages/connectkit/src/defaultConfig.ts b/packages/connectkit/src/defaultConfig.ts index 719a59ccd..de6850699 100644 --- a/packages/connectkit/src/defaultConfig.ts +++ b/packages/connectkit/src/defaultConfig.ts @@ -2,6 +2,7 @@ import { http } from 'wagmi'; import { type CreateConfigParameters } from '@wagmi/core'; import { mainnet, polygon, optimism, arbitrum } from 'wagmi/chains'; import { CoinbaseWalletParameters } from 'wagmi/connectors'; +import { EthereumProviderOptions as FamilyOptions } from 'family'; import defaultConnectors from './defaultConnectors'; @@ -21,6 +22,9 @@ type DefaultConfigProps = { walletConnectProjectId: string; // Coinbase Wallet preference coinbaseWalletPreference?: CoinbaseWalletParameters<'4'>['preference']; + // Family options (https://app.family.co) + enableFamily?: boolean; + familyOptions?: FamilyOptions; } & Partial; const defaultConfig = ({ @@ -32,6 +36,8 @@ const defaultConfig = ({ coinbaseWalletPreference, chains = [mainnet, polygon, optimism, arbitrum], client, + enableFamily = true, + familyOptions, ...props }: DefaultConfigProps): CreateConfigParameters => { globalAppName = appName; @@ -53,6 +59,8 @@ const defaultConfig = ({ }, walletConnectProjectId, coinbaseWalletPreference, + enableFamily, + familyOptions, }); const config: CreateConfigParameters = { diff --git a/packages/connectkit/src/defaultConnectors.ts b/packages/connectkit/src/defaultConnectors.ts index 514b2283d..fd049103b 100644 --- a/packages/connectkit/src/defaultConnectors.ts +++ b/packages/connectkit/src/defaultConnectors.ts @@ -7,6 +7,11 @@ import { safe, } from '@wagmi/connectors'; +import { + EthereumProviderOptions as FamilyOptions, + familyAccountsConnector, +} from 'family'; + type DefaultConnectorsProps = { app: { name: string; @@ -16,18 +21,24 @@ type DefaultConnectorsProps = { }; walletConnectProjectId?: string; coinbaseWalletPreference?: CoinbaseWalletParameters<'4'>['preference']; + enableFamily?: boolean; + familyOptions?: FamilyOptions; }; const defaultConnectors = ({ app, walletConnectProjectId, coinbaseWalletPreference, + enableFamily, + familyOptions, }: DefaultConnectorsProps): CreateConnectorFn[] => { const hasAllAppData = app.name && app.icon && app.description && app.url; const shouldUseSafeConnector = !(typeof window === 'undefined') && window?.parent !== window; - const connectors: CreateConnectorFn[] = []; + const connectors: CreateConnectorFn[] = enableFamily + ? [familyAccountsConnector(familyOptions)] + : []; // If we're in an iframe, include the SafeConnector if (shouldUseSafeConnector) { diff --git a/packages/connectkit/src/hooks/connectors/useWalletConnectUri.ts b/packages/connectkit/src/hooks/connectors/useWalletConnectUri.ts index b5b785637..b43db83ae 100644 --- a/packages/connectkit/src/hooks/connectors/useWalletConnectUri.ts +++ b/packages/connectkit/src/hooks/connectors/useWalletConnectUri.ts @@ -18,7 +18,7 @@ export function useWalletConnectUri( const [uri, setUri] = useState(undefined); - const connector: Connector = useWalletConnectConnector(); + const connector = useWalletConnectConnector(); const { isConnected } = useAccount(); const { connectAsync } = useConnect(); diff --git a/packages/connectkit/src/hooks/useConnectors.ts b/packages/connectkit/src/hooks/useConnectors.ts index 8f9a17660..2ab20dc8c 100644 --- a/packages/connectkit/src/hooks/useConnectors.ts +++ b/packages/connectkit/src/hooks/useConnectors.ts @@ -14,7 +14,14 @@ export function useConnector(id: string, uuid?: string) { (c) => c.id === id && c.name.includes('Injected') ) as Connector; } - return connectors.find((c) => c.id === id) as Connector; + return connectors.find((c) => c.id === id); +} + +export function useFamilyAccountsConnector() { + return useConnector('familyAccountsProvider'); +} +export function useFamilyConnector() { + return useConnector('co.family.wallet'); } export function useInjectedConnector(uuid?: string) { diff --git a/packages/connectkit/src/hooks/useLocales.tsx b/packages/connectkit/src/hooks/useLocales.tsx index 266f488a5..452da38ec 100644 --- a/packages/connectkit/src/hooks/useLocales.tsx +++ b/packages/connectkit/src/hooks/useLocales.tsx @@ -4,8 +4,9 @@ import Logos from '../assets/logos'; import { useContext } from '../components/ConnectKit'; import { getLocale } from './../localizations'; +import { LocaleProps } from '../localizations/locales'; -export default function useLocales(replacements?: any) { +export default function useLocales(replacements?: any): LocaleProps { const context = useContext(); const language = context.options?.language ?? 'en-US'; @@ -15,16 +16,16 @@ export default function useLocales(replacements?: any) { if (!translations) { console.error(`Missing translations for: ${language}`); - return `Missing translations for: ${language}`; + throw new Error(`Missing translations for: ${language}`); } - const translated: any = {}; + const translated = {}; Object.keys(translations).map((key) => { const string = translations[key]; return (translated[key] = localize(string, replacements)); }); - return translated; + return translated as LocaleProps; } const localize = (text: string, replacements?: any[string]) => { diff --git a/packages/connectkit/src/index.ts b/packages/connectkit/src/index.ts index a9a16a772..023b3f059 100644 --- a/packages/connectkit/src/index.ts +++ b/packages/connectkit/src/index.ts @@ -1,4 +1,4 @@ -export const CONNECTKIT_VERSION = '1.8.2'; +export const CONNECTKIT_VERSION = '1.9.1'; export * as Types from './types'; export { default as getDefaultConfig } from './defaultConfig'; diff --git a/packages/connectkit/src/localizations/locales/ar-AE.ts b/packages/connectkit/src/localizations/locales/ar-AE.ts index 1bc9667e4..8d7b9588d 100644 --- a/packages/connectkit/src/localizations/locales/ar-AE.ts +++ b/packages/connectkit/src/localizations/locales/ar-AE.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const arAE: LocaleProps = { + ...enUS, // fallback connectWallet: 'الاتصال بالمحفظة', disconnect: 'قطع الاتصال', connected: 'متصل', @@ -16,7 +18,7 @@ const arAE: LocaleProps = { more: 'المزيد', tryAgain: 'حاول مجددًا', tryAgainQuestion: 'هل نحاول مرة أخرى؟', - dontHaveTheApp: "ليس لديك التطبيق؟", + dontHaveTheApp: 'ليس لديك التطبيق؟', scanTheQRCode: 'مسح رمز الاستجابة السريعة', useWalletConnectModal: 'استخدم نموذج ولِيت‌كنيكت', useModal: 'استخدم النموذج', @@ -46,7 +48,7 @@ const arAE: LocaleProps = { onboardingScreen_ctaUrl: `https://ethereum.org/ar/wallets/find-wallet/`, aboutScreen_heading: `حول المحافظ`, - aboutScreen_a_h1: `حافظ على أصولك الرقمية`, + aboutScreen_a_h1: `حافظ على أصولك الرقمية`, aboutScreen_a_p: `تمكنك المحافظ من إرسال واستقبال وتخزين والتفاعل مع الأصول الرقمية مثل NFTs ورموز إيثريوم الأخرى.`, aboutScreen_b_h1: `وسيلة أفضل لتسجيل الدخول`, aboutScreen_b_p: `في تطبيقات العصر الحديث، يمكن استخدام محفظتك كوسيلة سهلة لتسجيل الدخول بدلاً من الحاجة إلى تذكر كلمة مرور.`, @@ -102,17 +104,17 @@ const arAE: LocaleProps = { switchNetworkScreen_heading: 'تبديل الشبكات', signInWithEthereumScreen_tooltip: -'أنت غير مسجل الدخول حاليًا إلى هذا التطبيق.\n**سجل الدخول باستخدام إثيريوم** للمتابعة.', + 'أنت غير مسجل الدخول حاليًا إلى هذا التطبيق.\n**سجل الدخول باستخدام إثيريوم** للمتابعة.', signInWithEthereumScreen_signedOut_heading: 'سجل الدخول باستخدام إثيريوم', signInWithEthereumScreen_signedOut_h1: -'يود هذا التطبيق التحقق منك \n كصاحب لهذه المحفظة.', + 'يود هذا التطبيق التحقق منك \n كصاحب لهذه المحفظة.', signInWithEthereumScreen_signedOut_p: `يرجى تأكيد طلب الرسالة في محفظتك للمتابعة.`, signInWithEthereumScreen_signedOut_button: 'سجل الدخول', signInWithEthereumScreen_signedIn_heading: 'تم تسجيل الدخول باستخدام إثيريوم', signInWithEthereumScreen_signedIn_h1: -'لقد قمت بتأكيد نفسك كصاحب لهذه المحفظة بنجاح.', + 'لقد قمت بتأكيد نفسك كصاحب لهذه المحفظة بنجاح.', signInWithEthereumScreen_signedIn_p: `سيتطلب تسجيل الخروج منك إعادة المصادقة مرة أخرى في المستقبل.`, signInWithEthereumScreen_signedIn_button: 'تسجيل الخروج', }; diff --git a/packages/connectkit/src/localizations/locales/ca-AD.ts b/packages/connectkit/src/localizations/locales/ca-AD.ts index 490e639b8..46b5c1d00 100644 --- a/packages/connectkit/src/localizations/locales/ca-AD.ts +++ b/packages/connectkit/src/localizations/locales/ca-AD.ts @@ -1,116 +1,121 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const caAD: LocaleProps = { + ...enUS, // fallback connectWallet: 'Connecta la cartera', - disconnect: 'Desconnectar', - connected: 'Connectat', - wrongNetwork: 'Xarxa incorrecta', - switchNetworks: 'Canvi de xarxa', - chainNetwork: 'Xarxa {{ CHAIN }}', - copyToClipboard: 'Copia al portapapers', - copyCode: 'Copia codi', - moreInformation: 'Més informació', - back: 'Enrere', - close: 'Tanca', - or: 'o', - more: 'Més', - tryAgain: 'Torna-ho a intentar', - tryAgainQuestion: 'Tornar a intentar-ho?', - dontHaveTheApp: "No tens l'aplicació?", - scanTheQRCode: 'Escaneja el codi QR', - useWalletConnectModal: 'Utilitza WalletConnect Modal', - useModal: 'Utilitza Modal', - installTheExtension: "Instal·la l'extensió", - getWalletName: 'Obté {{ CONNECTORNAME }}', - otherWallets: 'Altres carteres', - learnMore: 'Més informació', - getWallet: 'Obté una cartera', - approveInWallet: 'Aprova a la cartera', - confirmInWallet: 'Confirma a la cartera', - awaitingConfirmation: 'Esperant confirmació', - signIn: 'Inicia sessió', - signOut: 'Tanca sessió', - signedIn: 'Sessió iniciada', - signedOut: 'Sessió tancada', - walletNotConnected: 'Cartera no connectada', - - warnings_walletSwitchingUnsupported: `La teva cartera no permet canviar de xarxa des d'aquesta aplicació.`, - warnings_walletSwitchingUnsupportedResolve: `Prova a canviar de xarxa des de la teva cartera.`, - warnings_chainUnsupported: `Aquesta aplicació no és compatible amb la xarxa connectada actualment.`, - warnings_chainUnsupportedResolve: `Canvia o desconnecta per continuar.`, - - onboardingScreen_heading: `Obté una cartera`, - onboardingScreen_h1: `Comença a explorar la Web3`, - onboardingScreen_p: `La teva cartera és el portal d'accés a tot el relacionat amb Ethereum, la tecnologia màgica que permet explorar la Web3.`, - onboardingScreen_ctaText: `Tria la teva primera cartera`, - onboardingScreen_ctaUrl: `https://ethereum.org/es/wallets/find-wallet/`, - - aboutScreen_heading: `Sobre les carteres`, - aboutScreen_a_h1: `Per als teus actius digitals`, - aboutScreen_a_p: `Les carteres et permeten enviar, rebre, emmagatzemar i interactuar amb actius digitals com els NFT i altres tokens d'Ethereum.`, - aboutScreen_b_h1: `Una manera millor d'iniciar sessió`, - aboutScreen_b_p: `Amb les aplicacions modernes, pots utilitzar la teva cartera per iniciar sessió fàcilment, en lloc de haver de recordar una contrasenya.`, - aboutScreen_c_h1: `Explora el món de la Web3`, - aboutScreen_c_p: `La teva cartera és una eina essencial que et permet explorar i participar en el món en ràpida evolució de la Web3.`, - aboutScreen_ctaText: `Més informació`, - aboutScreen_ctaUrl: `https://ethereum.org/es/wallets/`, - - connectorsScreen_heading: `Connecta una cartera`, - connectorsScreen_newcomer: `No tinc una cartera`, - connectorsScreen_h1: `Què és una cartera?`, - connectorsScreen_p: `Les carteres s'utilitzen per enviar, rebre i emmagatzemar actius digitals. Si connectes una cartera, podràs interactuar amb les aplicacions.`, - - mobileConnectorsScreen_heading: `Tria una cartera`, - - scanScreen_heading: `Escaneja amb el telèfon`, - scanScreen_heading_withConnector: `Escaneja amb {{ CONNECTORNAME }}`, - scanScreen_tooltip_walletConnect: `Obre una cartera compatible amb WalletConnect [WALLETCONNECTLOGO] per escanejar`, - scanScreen_tooltip_default: `Obre {{ CONNECTORNAME }} en el teu telèfon mòbil per escanejar`, - - downloadAppScreen_heading: `Obté {{ CONNECTORNAME }}`, - downloadAppScreen_iosAndroid: `Escaneja amb la càmera del teu telèfon per descarregar-la en iOS o Android.`, - downloadAppScreen_ios: `Escaneja amb la càmera del teu telèfon per descarregar-la en iOS.`, - downloadAppScreen_android: `Escaneja amb la càmera del teu telèfon per descarregar-la en Android.`, - - injectionScreen_unavailable_h1: `Navegador no compatible`, - injectionScreen_unavailable_p: `Per connectar la teva cartera de {{ CONNECTORSHORTNAME }}, instal·la l'extensió en {{ SUGGESTEDEXTENSIONBROWSER }}.`, - - injectionScreen_install_h1: `Instal·la {{ CONNECTORNAME }}`, - injectionScreen_install_p: `Per connectar la teva cartera de {{ CONNECTORSHORTNAME }}, instal·la l'extensió del navegador.`, - - injectionScreen_connecting_h1: `Sol·licitud de connexió`, - injectionScreen_connecting_p: `Obre l'extensió del navegador de {{ CONNECTORSHORTNAME }} per connectar la teva cartera.`, - - injectionScreen_connecting_injected_h1: `Sol·licitud de connexió`, - injectionScreen_connecting_injected_p: `Accepta la sol·licitud a través de la teva cartera per connectar-te a aquesta aplicació.`, - - injectionScreen_connected_h1: `Ja connectada`, - injectionScreen_connected_p: `Ja pots tancar aquesta finestra emergent`, - - injectionScreen_rejected_h1: `Sol·licitud cancel·lada`, - injectionScreen_rejected_p: `Has cancel·lat la sol·licitud. Fes clic a dalt per tornar-ho a intentar.`, - - injectionScreen_failed_h1: `Error de connexió`, - injectionScreen_failed_p: `Ho sentim, hi ha hagut un problema. Intenta connectar-te de nou.`, - - injectionScreen_notconnected_h1: `Inicia sessió en {{ CONNECTORNAME }}`, - injectionScreen_notconnected_p: `Per continuar, inicia sessió en la teva extensió de {{ CONNECTORNAME }}.`, - - profileScreen_heading: 'Connectat', - - switchNetworkScreen_heading: 'Canvi de xarxa', - - signInWithEthereumScreen_tooltip: 'No has iniciat sessió en aquesta aplicació.\n**Inicia sessió amb Ethereum** per continuar.', - - signInWithEthereumScreen_signedOut_heading: 'Inicia sessió amb Ethereum', - signInWithEthereumScreen_signedOut_h1: "Aquesta aplicació vol verificar que ets el propietari d'aquesta cartera.", - signInWithEthereumScreen_signedOut_p: `Signa la sol·licitud de missatge en la teva cartera per continuar.`, - signInWithEthereumScreen_signedOut_button: 'Inicia sessió', - - signInWithEthereumScreen_signedIn_heading: 'Sessió iniciada amb Ethereum', - signInWithEthereumScreen_signedIn_h1: "T'has verificat correctament com a propietari d'aquesta cartera.", - signInWithEthereumScreen_signedIn_p: `Si tanques la sessió, hauràs de tornar a autenticar-te més endavant.`, - signInWithEthereumScreen_signedIn_button: 'Tanca sessió', + disconnect: 'Desconnectar', + connected: 'Connectat', + wrongNetwork: 'Xarxa incorrecta', + switchNetworks: 'Canvi de xarxa', + chainNetwork: 'Xarxa {{ CHAIN }}', + copyToClipboard: 'Copia al portapapers', + copyCode: 'Copia codi', + moreInformation: 'Més informació', + back: 'Enrere', + close: 'Tanca', + or: 'o', + more: 'Més', + tryAgain: 'Torna-ho a intentar', + tryAgainQuestion: 'Tornar a intentar-ho?', + dontHaveTheApp: "No tens l'aplicació?", + scanTheQRCode: 'Escaneja el codi QR', + useWalletConnectModal: 'Utilitza WalletConnect Modal', + useModal: 'Utilitza Modal', + installTheExtension: "Instal·la l'extensió", + getWalletName: 'Obté {{ CONNECTORNAME }}', + otherWallets: 'Altres carteres', + learnMore: 'Més informació', + getWallet: 'Obté una cartera', + approveInWallet: 'Aprova a la cartera', + confirmInWallet: 'Confirma a la cartera', + awaitingConfirmation: 'Esperant confirmació', + signIn: 'Inicia sessió', + signOut: 'Tanca sessió', + signedIn: 'Sessió iniciada', + signedOut: 'Sessió tancada', + walletNotConnected: 'Cartera no connectada', + + warnings_walletSwitchingUnsupported: `La teva cartera no permet canviar de xarxa des d'aquesta aplicació.`, + warnings_walletSwitchingUnsupportedResolve: `Prova a canviar de xarxa des de la teva cartera.`, + warnings_chainUnsupported: `Aquesta aplicació no és compatible amb la xarxa connectada actualment.`, + warnings_chainUnsupportedResolve: `Canvia o desconnecta per continuar.`, + + onboardingScreen_heading: `Obté una cartera`, + onboardingScreen_h1: `Comença a explorar la Web3`, + onboardingScreen_p: `La teva cartera és el portal d'accés a tot el relacionat amb Ethereum, la tecnologia màgica que permet explorar la Web3.`, + onboardingScreen_ctaText: `Tria la teva primera cartera`, + onboardingScreen_ctaUrl: `https://ethereum.org/es/wallets/find-wallet/`, + + aboutScreen_heading: `Sobre les carteres`, + aboutScreen_a_h1: `Per als teus actius digitals`, + aboutScreen_a_p: `Les carteres et permeten enviar, rebre, emmagatzemar i interactuar amb actius digitals com els NFT i altres tokens d'Ethereum.`, + aboutScreen_b_h1: `Una manera millor d'iniciar sessió`, + aboutScreen_b_p: `Amb les aplicacions modernes, pots utilitzar la teva cartera per iniciar sessió fàcilment, en lloc de haver de recordar una contrasenya.`, + aboutScreen_c_h1: `Explora el món de la Web3`, + aboutScreen_c_p: `La teva cartera és una eina essencial que et permet explorar i participar en el món en ràpida evolució de la Web3.`, + aboutScreen_ctaText: `Més informació`, + aboutScreen_ctaUrl: `https://ethereum.org/es/wallets/`, + + connectorsScreen_heading: `Connecta una cartera`, + connectorsScreen_newcomer: `No tinc una cartera`, + connectorsScreen_h1: `Què és una cartera?`, + connectorsScreen_p: `Les carteres s'utilitzen per enviar, rebre i emmagatzemar actius digitals. Si connectes una cartera, podràs interactuar amb les aplicacions.`, + + mobileConnectorsScreen_heading: `Tria una cartera`, + + scanScreen_heading: `Escaneja amb el telèfon`, + scanScreen_heading_withConnector: `Escaneja amb {{ CONNECTORNAME }}`, + scanScreen_tooltip_walletConnect: `Obre una cartera compatible amb WalletConnect [WALLETCONNECTLOGO] per escanejar`, + scanScreen_tooltip_default: `Obre {{ CONNECTORNAME }} en el teu telèfon mòbil per escanejar`, + + downloadAppScreen_heading: `Obté {{ CONNECTORNAME }}`, + downloadAppScreen_iosAndroid: `Escaneja amb la càmera del teu telèfon per descarregar-la en iOS o Android.`, + downloadAppScreen_ios: `Escaneja amb la càmera del teu telèfon per descarregar-la en iOS.`, + downloadAppScreen_android: `Escaneja amb la càmera del teu telèfon per descarregar-la en Android.`, + + injectionScreen_unavailable_h1: `Navegador no compatible`, + injectionScreen_unavailable_p: `Per connectar la teva cartera de {{ CONNECTORSHORTNAME }}, instal·la l'extensió en {{ SUGGESTEDEXTENSIONBROWSER }}.`, + + injectionScreen_install_h1: `Instal·la {{ CONNECTORNAME }}`, + injectionScreen_install_p: `Per connectar la teva cartera de {{ CONNECTORSHORTNAME }}, instal·la l'extensió del navegador.`, + + injectionScreen_connecting_h1: `Sol·licitud de connexió`, + injectionScreen_connecting_p: `Obre l'extensió del navegador de {{ CONNECTORSHORTNAME }} per connectar la teva cartera.`, + + injectionScreen_connecting_injected_h1: `Sol·licitud de connexió`, + injectionScreen_connecting_injected_p: `Accepta la sol·licitud a través de la teva cartera per connectar-te a aquesta aplicació.`, + + injectionScreen_connected_h1: `Ja connectada`, + injectionScreen_connected_p: `Ja pots tancar aquesta finestra emergent`, + + injectionScreen_rejected_h1: `Sol·licitud cancel·lada`, + injectionScreen_rejected_p: `Has cancel·lat la sol·licitud. Fes clic a dalt per tornar-ho a intentar.`, + + injectionScreen_failed_h1: `Error de connexió`, + injectionScreen_failed_p: `Ho sentim, hi ha hagut un problema. Intenta connectar-te de nou.`, + + injectionScreen_notconnected_h1: `Inicia sessió en {{ CONNECTORNAME }}`, + injectionScreen_notconnected_p: `Per continuar, inicia sessió en la teva extensió de {{ CONNECTORNAME }}.`, + + profileScreen_heading: 'Connectat', + + switchNetworkScreen_heading: 'Canvi de xarxa', + + signInWithEthereumScreen_tooltip: + 'No has iniciat sessió en aquesta aplicació.\n**Inicia sessió amb Ethereum** per continuar.', + + signInWithEthereumScreen_signedOut_heading: 'Inicia sessió amb Ethereum', + signInWithEthereumScreen_signedOut_h1: + "Aquesta aplicació vol verificar que ets el propietari d'aquesta cartera.", + signInWithEthereumScreen_signedOut_p: `Signa la sol·licitud de missatge en la teva cartera per continuar.`, + signInWithEthereumScreen_signedOut_button: 'Inicia sessió', + + signInWithEthereumScreen_signedIn_heading: 'Sessió iniciada amb Ethereum', + signInWithEthereumScreen_signedIn_h1: + "T'has verificat correctament com a propietari d'aquesta cartera.", + signInWithEthereumScreen_signedIn_p: `Si tanques la sessió, hauràs de tornar a autenticar-te més endavant.`, + signInWithEthereumScreen_signedIn_button: 'Tanca sessió', }; export default caAD; diff --git a/packages/connectkit/src/localizations/locales/ee-EE.ts b/packages/connectkit/src/localizations/locales/ee-EE.ts index ce408882f..b0607d043 100644 --- a/packages/connectkit/src/localizations/locales/ee-EE.ts +++ b/packages/connectkit/src/localizations/locales/ee-EE.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const eeEE: LocaleProps = { + ...enUS, // fallback connectWallet: 'Ühenda rahakott', disconnect: 'Katkesta ühendus', connected: 'Ühendatud', diff --git a/packages/connectkit/src/localizations/locales/en-US.ts b/packages/connectkit/src/localizations/locales/en-US.ts index 0fcbac9d6..c914bf0c2 100644 --- a/packages/connectkit/src/localizations/locales/en-US.ts +++ b/packages/connectkit/src/localizations/locales/en-US.ts @@ -1,9 +1,16 @@ const enUS = { + // Family Account + continueWithFamily: 'Continue with Family', + orSelectWallet: 'or select a wallet from the list below', + loginWithEmailOrPhone: 'Login with Email or Phone', + connectWithFamilyIOS: 'Connect with Family iOS', + // ConnectKit connectWallet: 'Connect Wallet', disconnect: 'Disconnect', connected: 'Connected', wrongNetwork: 'Wrong Network', switchNetworks: 'Switch Networks', + switchWallets: 'Switch Wallets', chainNetwork: '{{ CHAIN }} Network', copyToClipboard: 'Copy to Clipboard', copyCode: 'Copy Code', @@ -68,7 +75,7 @@ const enUS = { downloadAppScreen_heading: `Get {{ CONNECTORNAME }}`, downloadAppScreen_iosAndroid: `Scan with your phone camera to download on iOS or Android.`, downloadAppScreen_ios: `Scan with your phone camera to download on iOS.`, - downloadAppScreen_android: `Scan with your phone camera to download Android.`, + downloadAppScreen_android: `Scan with your phone camera to download on Android.`, injectionScreen_unavailable_h1: `Unsupported Browser`, injectionScreen_unavailable_p: `To connect your {{ CONNECTORSHORTNAME }} wallet,\ninstall the extension on {{ SUGGESTEDEXTENSIONBROWSER }}.`, diff --git a/packages/connectkit/src/localizations/locales/es-ES.ts b/packages/connectkit/src/localizations/locales/es-ES.ts index 56a44a8b8..c183e9ece 100644 --- a/packages/connectkit/src/localizations/locales/es-ES.ts +++ b/packages/connectkit/src/localizations/locales/es-ES.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const esES: LocaleProps = { + ...enUS, // fallback connectWallet: 'Conecta una cartera', disconnect: 'Desconectar', connected: 'Conectado', diff --git a/packages/connectkit/src/localizations/locales/fa-IR.ts b/packages/connectkit/src/localizations/locales/fa-IR.ts index 0da6ab35e..861f092fb 100644 --- a/packages/connectkit/src/localizations/locales/fa-IR.ts +++ b/packages/connectkit/src/localizations/locales/fa-IR.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const faIR: LocaleProps = { + ...enUS, // fallback connectWallet: 'اتصال به کیف پول', disconnect: 'قطع ارتباط', connected: 'متصل شد', diff --git a/packages/connectkit/src/localizations/locales/fr-FR.ts b/packages/connectkit/src/localizations/locales/fr-FR.ts index 4cf37cb9f..e8d152301 100644 --- a/packages/connectkit/src/localizations/locales/fr-FR.ts +++ b/packages/connectkit/src/localizations/locales/fr-FR.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const frFR: LocaleProps = { + ...enUS, // fallback connectWallet: 'Connecter le portefeuille', disconnect: 'Déconnecter', connected: 'Connecté', diff --git a/packages/connectkit/src/localizations/locales/ja-JP.ts b/packages/connectkit/src/localizations/locales/ja-JP.ts index 3d6ef9c34..ab7291bd2 100644 --- a/packages/connectkit/src/localizations/locales/ja-JP.ts +++ b/packages/connectkit/src/localizations/locales/ja-JP.ts @@ -1,4 +1,8 @@ -export default { +import { LocaleProps } from './'; +import enUS from './en-US'; + +const jaJP: LocaleProps = { + ...enUS, // fallback connectWallet: 'ウォレットの接続', disconnect: '切断', connected: '接続されました', @@ -111,3 +115,5 @@ export default { signInWithEthereumScreen_signedIn_p: `サインアウトすると、今後 再度認証する必要があります。`, signInWithEthereumScreen_signedIn_button: 'サインアウト', }; + +export default jaJP; diff --git a/packages/connectkit/src/localizations/locales/pt-BR.ts b/packages/connectkit/src/localizations/locales/pt-BR.ts index d623fa537..0f649ca19 100644 --- a/packages/connectkit/src/localizations/locales/pt-BR.ts +++ b/packages/connectkit/src/localizations/locales/pt-BR.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const ptBR: LocaleProps = { + ...enUS, // fallback connectWallet: 'Conectar carteira', disconnect: 'Desconectar', connected: 'Conectado', @@ -101,16 +103,19 @@ const ptBR: LocaleProps = { switchNetworkScreen_heading: 'Alternar rede', - signInWithEthereumScreen_tooltip: 'Você não está conectado a este aplicativo.\n**Entre com Ethereum** para continuar.', + signInWithEthereumScreen_tooltip: + 'Você não está conectado a este aplicativo.\n**Entre com Ethereum** para continuar.', signInWithEthereumScreen_signedOut_heading: 'Entrar com Ethereum', - signInWithEthereumScreen_signedOut_h1: 'Este aplicativo gostaria de verificar você \n como o proprietário desta carteira.', + signInWithEthereumScreen_signedOut_h1: + 'Este aplicativo gostaria de verificar você \n como o proprietário desta carteira.', signInWithEthereumScreen_signedOut_p: `Por favor, assine o pedido de mensagem \n em sua carteira para continuar.`, signInWithEthereumScreen_signedOut_button: 'Entrar', signInWithEthereumScreen_signedIn_heading: 'Conectado com Ethereum', - signInWithEthereumScreen_signedIn_h1: 'Você se verificou com sucesso \n como o proprietário desta carteira', + signInWithEthereumScreen_signedIn_h1: + 'Você se verificou com sucesso \n como o proprietário desta carteira', signInWithEthereumScreen_signedIn_p: `Se sair, será necessário que você \n autentique novamente no futuro.`, - signInWithEthereumScreen_signedIn_button: 'Sair' + signInWithEthereumScreen_signedIn_button: 'Sair', }; export default ptBR; diff --git a/packages/connectkit/src/localizations/locales/ru-RU.ts b/packages/connectkit/src/localizations/locales/ru-RU.ts index 87accce08..1ff69778f 100644 --- a/packages/connectkit/src/localizations/locales/ru-RU.ts +++ b/packages/connectkit/src/localizations/locales/ru-RU.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const ruRU: LocaleProps = { + ...enUS, // fallback connectWallet: 'Подключить кошелек', disconnect: 'Отключить', connected: 'Подключена', @@ -46,7 +48,7 @@ const ruRU: LocaleProps = { onboardingScreen_ctaUrl: `https://ethereum.org/en/wallets/find-wallet/`, aboutScreen_heading: `О кошельках`, - aboutScreen_a_h1: `Для ваших цифровых активов`, + aboutScreen_a_h1: `Для ваших цифровых активов`, aboutScreen_a_p: `Кошельки позволяют вам отправлять, получать, хранить и взаимодействовать с цифровыми активами, такими как NFT и другие токены Ethereum.`, aboutScreen_b_h1: `Лучший способ входа`, aboutScreen_b_p: `В современных приложениях ваш кошелек можно использовать как удобный способ входа без необходимости помнить пароль.`, @@ -115,4 +117,4 @@ const ruRU: LocaleProps = { signInWithEthereumScreen_signedIn_button: 'Выйти', }; -export default ruRU; \ No newline at end of file +export default ruRU; diff --git a/packages/connectkit/src/localizations/locales/tr-TR.ts b/packages/connectkit/src/localizations/locales/tr-TR.ts index ccc64fa5e..d2bc30d05 100644 --- a/packages/connectkit/src/localizations/locales/tr-TR.ts +++ b/packages/connectkit/src/localizations/locales/tr-TR.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const trTR: LocaleProps = { + ...enUS, // fallback connectWallet: 'Cüzdan Bağla', disconnect: 'Bağlantıyı Kes', connected: 'Bağlandı', @@ -16,7 +18,7 @@ const trTR: LocaleProps = { more: 'Daha Fazla', tryAgain: 'Tekrar Dene', tryAgainQuestion: 'Tekrar Dene?', - dontHaveTheApp: "Uygulaman yok mu?", + dontHaveTheApp: 'Uygulaman yok mu?', scanTheQRCode: 'Karekodu tarat', useWalletConnectModal: 'WalletConnect Modalini Kullan ', useModal: 'Modal Kullan', @@ -74,7 +76,6 @@ const trTR: LocaleProps = { injectionScreen_unavailable_h1: `Desteklenmeyen Tarayıcı`, injectionScreen_unavailable_p: `{{ CONNECTORSHORTNAME }} cüzdanına bağlanmak için\n{{ SUGGESTEDEXTENSIONBROWSER }} üzerinde indirmen gerekiyor.`, - injectionScreen_install_h1: `{{ CONNECTORNAME }} İndir`, injectionScreen_install_p: `{{ CONNECTORSHORTNAME }} cüzdanına bağlanmak için,\ntarayıcı eklentisini indir.`, diff --git a/packages/connectkit/src/localizations/locales/vi-VN.ts b/packages/connectkit/src/localizations/locales/vi-VN.ts index f53debd48..cf834c809 100644 --- a/packages/connectkit/src/localizations/locales/vi-VN.ts +++ b/packages/connectkit/src/localizations/locales/vi-VN.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const viVN: LocaleProps = { + ...enUS, // fallback connectWallet: 'Kết nối ví', disconnect: 'Ngắt kết nối', connected: 'Đã kết nối', diff --git a/packages/connectkit/src/localizations/locales/zh-CN.ts b/packages/connectkit/src/localizations/locales/zh-CN.ts index f390c1bd0..b16680ce6 100644 --- a/packages/connectkit/src/localizations/locales/zh-CN.ts +++ b/packages/connectkit/src/localizations/locales/zh-CN.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const zhCN: LocaleProps = { + ...enUS, // fallback connectWallet: '绑定钱包', disconnect: '解除绑定', connected: '已绑定', diff --git a/packages/connectkit/src/styles/index.ts b/packages/connectkit/src/styles/index.ts index af0b94613..2b89d1c9a 100644 --- a/packages/connectkit/src/styles/index.ts +++ b/packages/connectkit/src/styles/index.ts @@ -31,7 +31,7 @@ const themeGlobals = { '--ck-graphic-scaniconwithlogos-04': '#F6F7F9', '--ck-chain-ethereum-01': '#25292E', - '--ck-chain-ethereum-02': '#fff', + '--ck-chain-ethereum-02': '#ffffff', '--ck-chain-ethereum-03': '#DFE0E0', }, dark: { @@ -90,22 +90,18 @@ const themeGlobals = { }, }, brand: { + '--ck-family-accounts-brand': '#0090ff', '--ck-family-brand': '#1A88F8', '--ck-brand-walletConnect': '#3B99FC', '--ck-brand-coinbaseWallet': '#0052FF', - '--ck-brand-metamask': '#f6851b', - '--ck-brand-metamask-01': '#F6851B', - '--ck-brand-metamask-02': '#E2761B', - '--ck-brand-metamask-03': '#CD6116', - '--ck-brand-metamask-04': '#161616', - '--ck-brand-metamask-05': '#763D16', - '--ck-brand-metamask-06': '#D7C1B3', - '--ck-brand-metamask-07': '#C0AD9E', - '--ck-brand-metamask-08': '#E4761B', - '--ck-brand-metamask-09': '#233447', - '--ck-brand-metamask-10': '#E4751F', - '--ck-brand-metamask-11': '#FEF5E7', - '--ck-brand-metamask-12': '#E3C8AB', + '--ck-brand-metamask': '#FF5C16', + '--ck-brand-metamask-bg': '#FFF2EB', + '--ck-brand-metamask-01': '#FF5C16', + '--ck-brand-metamask-02': '#E34807', + '--ck-brand-metamask-03': '#FF8D5D', + '--ck-brand-metamask-04': '#661800', + '--ck-brand-metamask-05': '#C0C4CD', + '--ck-brand-metamask-06': '#E7EBF6', '--ck-brand-trust-01': '#3375BB', '--ck-brand-trust-02': '#ffffff', '--ck-brand-trust-01b': '#ffffff', // dark Theme @@ -170,11 +166,11 @@ const themes = { nouns: createCssColors(themeColors.nouns), }; const globals = { - brand: createCssVars(themeGlobals.brand), - ensLight: createCssVars(themeGlobals.ens.light), - ensDark: createCssVars(themeGlobals.ens.dark), - graphicsLight: createCssVars(themeGlobals.graphics.light), - graphicsDark: createCssVars(themeGlobals.graphics.dark), + brand: createCssColors(themeGlobals.brand), + ensLight: createCssColors(themeGlobals.ens.light), + ensDark: createCssColors(themeGlobals.ens.dark), + graphicsLight: createCssColors(themeGlobals.graphics.light), + graphicsDark: createCssColors(themeGlobals.graphics.dark), }; const globalsLight = css` @@ -262,7 +258,6 @@ export const ResetContainer = styled(motion.div)<{ } }} - ${(props) => { if ( props.$customTheme && diff --git a/packages/connectkit/src/utils/index.ts b/packages/connectkit/src/utils/index.ts index 66f22e8ac..58980508f 100644 --- a/packages/connectkit/src/utils/index.ts +++ b/packages/connectkit/src/utils/index.ts @@ -24,7 +24,7 @@ const nFormatter = (num: number, digits: number = 2) => { { value: 1, symbol: '' }, { value: 1e3, symbol: 'k' }, { value: 1e6, symbol: 'm' }, - { value: 1e9, symbol: 'g' }, + { value: 1e9, symbol: 'b' }, { value: 1e12, symbol: 't' }, { value: 1e15, symbol: 'p' }, { value: 1e18, symbol: 'e' }, @@ -80,6 +80,12 @@ function flattenChildren(children: React.ReactNode): ReactChildArray { export const isWalletConnectConnector = (connectorId?: string) => connectorId === 'walletConnect'; +export const isFamilyAccountsConnector = (connectorId?: string) => + connectorId === 'familyAccountsProvider'; + +export const isFamilyConnector = (connectorId?: string) => + connectorId === 'co.family.wallet'; + export const isMetaMaskConnector = (connectorId?: string) => connectorId === 'metaMaskSDK'; @@ -89,6 +95,9 @@ export const isCoinbaseWalletConnector = (connectorId?: string) => export const isLedgerConnector = (connectorId?: string) => connectorId === 'ledger'; +export const isPortoConnector = (connectorId?: string) => + connectorId === 'xyz.ithaca.porto'; + export const isSafeConnector = (connectorId?: string) => connectorId === 'safe'; export const isInjectedConnector = (connectorId?: string) => diff --git a/packages/connectkit/src/utils/wallets.ts b/packages/connectkit/src/utils/wallets.ts index 539139224..13c8383a4 100644 --- a/packages/connectkit/src/utils/wallets.ts +++ b/packages/connectkit/src/utils/wallets.ts @@ -25,6 +25,7 @@ export const isFrame = () => isWalletInstalled('Frame'); export const isPhantom = () => isWalletInstalled('Phantom'); export const isInfinityWallet = () => isWalletInstalled('InfinityWallet'); export const isRabby = () => isWalletInstalled('Rabby'); +export const isArgent = () => isWalletInstalled('Argent'); export const isFrontier = () => isWalletInstalled('Frontier'); export const isTrust = () => { if (typeof window === 'undefined') return false; @@ -39,3 +40,4 @@ export const isTalisman = () => isWalletInstalled('Talisman'); export const isFordefi = () => isWalletInstalled('Fordefi'); export const isRainbow = () => isWalletInstalled('Rainbow'); export const isZerion = () => isWalletInstalled('Zerion'); +export const isSafe = () => isWalletInstalled('Safe'); diff --git a/packages/connectkit/src/wallets/walletConfigs.tsx b/packages/connectkit/src/wallets/walletConfigs.tsx index 557fb0266..dadf9057b 100644 --- a/packages/connectkit/src/wallets/walletConfigs.tsx +++ b/packages/connectkit/src/wallets/walletConfigs.tsx @@ -129,6 +129,13 @@ export const walletConfigs: { : `familywallet://wc?uri=${encodeURIComponent(uri)}`; }, }, + familyAccountsProvider: { + name: 'Family', + shortName: 'Family', + icon: , + iconConnector: , + iconShape: 'squircle', + }, frame: { name: 'Frame', icon: , diff --git a/yarn.lock b/yarn.lock index d73eb2652..fe62dc4d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7218,6 +7218,7 @@ __metadata: "@types/styled-components": ^5.1.25 buffer: ^6.0.3 detect-browser: ^5.3.0 + family: ^0.1.2 framer-motion: ^6.3.11 qrcode: ^1.5.0 react-transition-state: ^1.1.4 @@ -9691,6 +9692,27 @@ __metadata: languageName: unknown linkType: soft +"family@npm:^0.1.2": + version: 0.1.2 + resolution: "family@npm:0.1.2" + peerDependencies: + react: 17.x || 18.x || 19.x + react-dom: 17.x || 18.x || 19.x + viem: 2.x + wagmi: 2.x + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + viem: + optional: true + wagmi: + optional: true + checksum: 2e2d43b773f7c8719fcb93331416ef7710151f961e6645ae3ff87a23584335b1fe36b29099b28d6d860bacc3722888cf5de0373ea976d620b43a8daf21422274 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3"