Skip to content

Commit

Permalink
Merge branch 'develop' into fix/BLO-812-ui
Browse files Browse the repository at this point in the history
  • Loading branch information
simonheys committed Mar 27, 2023
2 parents 251336d + 9522ba8 commit 0bb7a74
Show file tree
Hide file tree
Showing 24 changed files with 432 additions and 29 deletions.
10 changes: 10 additions & 0 deletions packages/extension/e2e/src/languages/ILanguage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ export interface ILanguage {
lockWallet: string
reset: string
confirmReset: string
save: string
cancel: string
}
account: {
noAccounts: string
Expand All @@ -26,6 +28,8 @@ export interface ILanguage {
accountRecovery: string
saveTheRecoveryPhrase: string
pendingTransactions: string
recipientAddress: string
saveAddress: string
}
wallet: {
//first screen
Expand Down Expand Up @@ -66,4 +70,10 @@ export interface ILanguage {
delete: string
copy: string
}
address: {
nameRequired: string
addressRequired: string
removeAddress: string
delete: string
}
}
10 changes: 10 additions & 0 deletions packages/extension/e2e/src/languages/en/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ const texts = {
lockWallet: "Lock wallet",
reset: "Reset",
confirmReset: "RESET",
save: "Save",
cancel: "Cancel",
},
account: {
noAccounts: "You have no accounts on ",
Expand All @@ -26,6 +28,8 @@ const texts = {
accountRecovery: "Set up account recovery",
saveTheRecoveryPhrase: "Save the recovery phrase",
pendingTransactions: "Pending transactions",
recipientAddress: "Recipient's address",
saveAddress: "Save address",
},
wallet: {
//first screen
Expand Down Expand Up @@ -69,6 +73,12 @@ const texts = {
delete: "Delete",
copy: "Copy",
},
address: {
nameRequired: "Contact Name is required",
addressRequired: "Address is required",
removeAddress: "Remove from address book",
delete: "Delete",
},
}

export default texts
14 changes: 14 additions & 0 deletions packages/extension/e2e/src/page-objects/Account.ts
Original file line number Diff line number Diff line change
Expand Up @@ -215,4 +215,18 @@ export default class Account extends Navigation {
`//a//*[text()="${lang.account.saveTheRecoveryPhrase}"]`,
)
}

get recipientAddress() {
return this.page.locator(
`//textarea[@placeholder="${lang.account.recipientAddress}"]/following::button[1]`,
)
}

get saveAddress() {
return this.page.locator(`button:text-is("${lang.account.saveAddress}")`)
}

get contact() {
return this.page.locator("div h5")
}
}
64 changes: 64 additions & 0 deletions packages/extension/e2e/src/page-objects/AddressBook.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import type { Page } from "@playwright/test"

import { lang } from "../languages"
import Navigation from "./Navigation"

export default class AddressBook extends Navigation {
constructor(page: Page) {
super(page)
}

get add() {
return this.page.locator('button[aria-label="add"]')
}

get name() {
return this.page.locator('input[name="name"]')
}

get address() {
return this.page.locator('textarea[name="address"]')
}

get network() {
return this.page.locator('[aria-label="network-selector"]')
}

get save() {
return this.page.locator(`button:text-is("${lang.common.save}")`)
}

get cancel() {
return this.page.locator(`button:text-is("${lang.common.cancel}")`)
}

networkOption(name: "Localhost 5050" | "Testnet" | "Testnet 2" | "Mainnet") {
return this.page.locator(`div[aria-disabled="false"]:text-is("${name}")`)
}

get nameRequired() {
return this.page.locator(
`//input[@name="name"]/following::p[contains(text(), '${lang.address.nameRequired}')]`,
)
}

get addressRequired() {
return this.page.locator(
`//textarea[@name="address"]/following::p[contains(text(), '${lang.address.addressRequired}')]`,
)
}

addressByname(name: string) {
return this.page.locator(
`//button/following::*[contains(text(),'${name}')]`,
)
}

get deleteAddress() {
return this.page.locator(`button:text-is("${lang.address.removeAddress}")`)
}

get delete() {
return this.page.locator(`button:text-is("${lang.address.delete}")`)
}
}
3 changes: 3 additions & 0 deletions packages/extension/e2e/src/page-objects/ExtensionPage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type { Page } from "@playwright/test"
import Messages from "../utils/Messages"
import Account from "./Account"
import Activity from "./Activity"
import AddressBook from "./AddressBook"
import Navigation from "./Navigation"
import Network from "./Network"
import Settings from "./Settings"
Expand All @@ -17,6 +18,7 @@ export default class ExtensionPage {
activity: Activity
settings: Settings
navigation: Navigation
addressBook: AddressBook
constructor(page: Page, private extensionUrl: string) {
this.page = page
this.wallet = new Wallet(page)
Expand All @@ -27,6 +29,7 @@ export default class ExtensionPage {
this.activity = new Activity(page)
this.settings = new Settings(page)
this.navigation = new Navigation(page)
this.addressBook = new AddressBook(page)
}

async open() {
Expand Down
86 changes: 86 additions & 0 deletions packages/extension/e2e/src/specs/addressBook.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import { expect } from "@playwright/test"

import config from "../config"
import test from "../test"

test.describe("Address Book", () => {
test("Add, update, use and delete address", async ({ extension }) => {
await extension.wallet.newWalletOnboarding()
await extension.open()
await expect(extension.network.networkSelector).toBeVisible()
await extension.network.selectNetwork("Localhost 5050")
await extension.account.addAccount({})
await extension.navigation.showSettings.click()
await extension.settings.addressBook.click()
//create
await extension.addressBook.add.click()
await extension.addressBook.save.click()
await expect(extension.addressBook.nameRequired).toBeVisible()
await expect(extension.addressBook.addressRequired).toBeVisible()
await extension.addressBook.name.fill("My first address")
await extension.addressBook.save.click()
await expect(extension.addressBook.nameRequired).not.toBeVisible()
await expect(extension.addressBook.addressRequired).toBeVisible()
await extension.addressBook.address.fill(config.wallets[0].accounts![0])
await expect(extension.addressBook.nameRequired).not.toBeVisible()
await expect(extension.addressBook.addressRequired).not.toBeVisible()
await extension.addressBook.network.click()
await extension.addressBook.networkOption("Localhost 5050").click()
await extension.addressBook.save.click()

// update
await extension.addressBook.addressByname("My first address").click()
await extension.addressBook.name.fill("New name")
await extension.addressBook.save.click()
await expect(extension.addressBook.addressByname("New name")).toBeVisible()
await extension.navigation.back.click()
await extension.navigation.close.click()

//transfer to address
await extension.account.token("Ethereum").click()
await extension.account.send.click()
await extension.account.recipientAddress.click()
await extension.addressBook.addressByname("New name").click()
await extension.account.sendMax.click()
await extension.navigation.next.click()
await extension.navigation.approve.click()
await extension.activity.checkActivity(1)

//delete address
await extension.navigation.menuTokens.click()
await extension.navigation.showSettings.click()
await extension.settings.addressBook.click()
await extension.addressBook.addressByname("New name").click()
await extension.addressBook.deleteAddress.click()
await extension.addressBook.delete.click()
await expect(
extension.addressBook.addressByname("New name"),
).not.toBeVisible()
})

test("Add address from send window", async ({ extension }) => {
await extension.wallet.newWalletOnboarding()
await extension.open()
await expect(extension.network.networkSelector).toBeVisible()
await extension.network.selectNetwork("Localhost 5050")
await extension.account.addAccount({})

await extension.account.token("Ethereum").click()
await extension.account.send.click()
await extension.account.recepientAddress.fill(
config.wallets[0].accounts![0],
)
await extension.account.saveAddress.click()
await expect(extension.addressBook.address).toHaveText(
config.wallets[0].accounts![0],
)
await extension.addressBook.name.fill("My address")
await extension.addressBook.save.click()
await expect(extension.account.contact).toHaveText("My address")

await extension.account.sendMax.click()
await extension.navigation.next.click()
await extension.navigation.approve.click()
await extension.activity.checkActivity(1)
})
})
21 changes: 0 additions & 21 deletions packages/extension/e2e/yarn.lock

This file was deleted.

2 changes: 1 addition & 1 deletion packages/extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"main": "index.js",
"license": "MIT",
"devDependencies": {
"@playwright/test": "^1.29.0",
"@playwright/test": "^1.31.2",
"@sentry/webpack-plugin": "^1.18.9",
"@svgr/webpack": "^6.0.0",
"@testing-library/jest-dom": "^5.16.5",
Expand Down
4 changes: 4 additions & 0 deletions packages/extension/src/declarations.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
declare module "*.svg"
declare module "*.gif"
declare module "*.png" {
const url: string
export default url
}
declare module "*.txt" {
const url: string
export default url
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { CellStack } from "@argent/ui"
import { CellStack, DapplandBanner } from "@argent/ui"
import dapplandBanner from "@argent/ui/assets/dapplandBannerBackground.png"
import { Flex, VStack } from "@chakra-ui/react"
import { AnimatePresence, motion } from "framer-motion"
import { FC, useCallback, useEffect, useRef } from "react"
import { useLocation, useNavigate } from "react-router-dom"
import useSWR from "swr"
Expand Down Expand Up @@ -27,6 +29,7 @@ import { useAccountGuardianIsSelf } from "../shield/useAccountGuardian"
import { StatusMessageBannerContainer } from "../statusMessage/StatusMessageBanner"
import { AccountTokensButtons } from "./AccountTokensButtons"
import { AccountTokensHeader } from "./AccountTokensHeader"
import { useDapplandBanner } from "./dappland/banner.state"
import { TokenList } from "./TokenList"
import { useCurrencyDisplayEnabled } from "./tokenPriceHooks"
import { useFeeTokenBalance } from "./tokens.service"
Expand All @@ -44,6 +47,7 @@ export const AccountTokens: FC<AccountTokensProps> = ({ account }) => {
const { pendingTransactions } = useAccountTransactions(account)
const { accountNames } = useAccountMetadata()
const { isBackupRequired } = useBackupRequired()
const { hasSeenBanner } = useDapplandBanner()
const currencyDisplayEnabled = useCurrencyDisplayEnabled()
const transactionsBeforeReview = useKeyValueStorage(
userReviewStore,
Expand Down Expand Up @@ -102,6 +106,13 @@ export const AccountTokens: FC<AccountTokensProps> = ({ account }) => {
const hasEscape = accountHasEscape(account)
const accountGuardianIsSelf = useAccountGuardianIsSelf(account)

const showDapplandBanner =
!hasSeenBanner &&
!showBackupBanner &&
!needsUpgrade &&
!hasPendingTransactions &&
!hasEscape

const hadPendingTransactions = useRef(false)
useEffect(() => {
if (hasPendingTransactions) {
Expand Down Expand Up @@ -149,6 +160,23 @@ export const AccountTokens: FC<AccountTokensProps> = ({ account }) => {
{showNoBalanceForUpgrade && (
<UpgradeBanner canNotPay to={routes.funding()} />
)}
<AnimatePresence initial={false}>
{showDapplandBanner && (
<motion.div
animate={{ opacity: 1, height: "auto" }}
exit={{ opacity: 0, height: 0 }}
transition={{ duration: 0.2 }}
>
<DapplandBanner
backgroundImageUrl={dapplandBanner}
href="https://www.dappland.com?utm_source=argent&utm_medium=extension&utm_content=banner"
onClose={() => {
useDapplandBanner.setState({ hasSeenBanner: true })
}}
/>
</motion.div>
)}
</AnimatePresence>
<TokenList variant={tokenListVariant} showNewTokenButton />
</CellStack>
</Flex>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import create from "zustand"
import { persist } from "zustand/middleware"

export interface DapplandBannerState {
hasSeenBanner: boolean
}

export const useDapplandBanner = create<DapplandBannerState>(
persist(
(_set, _get) => ({
hasSeenBanner: false,
}),
{ name: "hasSeenDapplandBanner" },
),
)
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ export const AddressbookAddOrEditScreen: FC<AddressbookAddOrEditProps> = ({
)}
</div>

<div>
<div aria-label="network-selector">
<StyledControlledSelect
name="networkId"
options={networksToOptions}
Expand Down
Loading

0 comments on commit 0bb7a74

Please sign in to comment.