diff --git a/components/bsx/Create/RoyaltyForm.vue b/components/bsx/Create/RoyaltyForm.vue index 16cfb7c299..7b41e390d4 100644 --- a/components/bsx/Create/RoyaltyForm.vue +++ b/components/bsx/Create/RoyaltyForm.vue @@ -2,6 +2,7 @@
- +
diff --git a/components/collectionDetailsPopover/CollectionDetailsPopover.vue b/components/collectionDetailsPopover/CollectionDetailsPopover.vue index f3303616e3..7630c7495d 100644 --- a/components/collectionDetailsPopover/CollectionDetailsPopover.vue +++ b/components/collectionDetailsPopover/CollectionDetailsPopover.vue @@ -3,22 +3,24 @@ :append-to="body" placement="bottom" :delay="[showDelay, hideDelay]" - data-testid="identity"> + data-testid="identity" + @show="triggered = true"> + + diff --git a/components/teleport/Teleport.vue b/components/teleport/Teleport.vue index 76cbea846c..9c614932f1 100644 --- a/components/teleport/Teleport.vue +++ b/components/teleport/Teleport.vue @@ -1,88 +1,124 @@ diff --git a/layouts/teleport-layout.vue b/layouts/teleport-layout.vue new file mode 100644 index 0000000000..f1f677eb6b --- /dev/null +++ b/layouts/teleport-layout.vue @@ -0,0 +1,33 @@ + + + diff --git a/libs/ui/src/components/NeoButton/NeoButton.vue b/libs/ui/src/components/NeoButton/NeoButton.vue index 9a8a698357..fe13d63b03 100644 --- a/libs/ui/src/components/NeoButton/NeoButton.vue +++ b/libs/ui/src/components/NeoButton/NeoButton.vue @@ -25,8 +25,8 @@ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dca62f2e31..27eaa7e22c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -225,6 +225,9 @@ importers: '@rollup/plugin-graphql': specifier: ^1.1.0 version: 1.1.0(graphql@16.8.1)(rollup@2.79.1) + '@sentry/vite-plugin': + specifier: ^2.9.0 + version: 2.9.0 '@types/jest': specifier: ^27.5.2 version: 27.5.2 @@ -6647,6 +6650,92 @@ packages: resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} dev: false + /@sentry-internal/tracing@7.78.0: + resolution: {integrity: sha512-53wf+HWyjiansZ0U+q7Q7U2kEjXfL/C8+XOwE4ntLVPGFyvxuYaRUb8OEYFNTsODf20ihnxOLZ+GsXXPlqPfFA==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.78.0 + '@sentry/types': 7.78.0 + '@sentry/utils': 7.78.0 + dev: true + + /@sentry/bundler-plugin-core@2.9.0: + resolution: {integrity: sha512-6x8o+fjSqciFC5m8ociBTb1bKNblKdmFPXI/aef6Uzr0vvxmWR14M+cqf+fOpB8nl/OEu3jqVV6rKILEel0X2w==} + engines: {node: '>= 14'} + dependencies: + '@sentry/cli': 2.21.2 + '@sentry/node': 7.78.0 + '@sentry/utils': 7.78.0 + dotenv: 16.3.1 + find-up: 5.0.0 + glob: 9.3.2 + magic-string: 0.27.0 + unplugin: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@sentry/cli@2.21.2: + resolution: {integrity: sha512-X1nye89zl+QV3FSuQDGItfM51tW9PQ7ce0TtV/12DgGgTVEgnVp5uvO3wX5XauHvulQzRPzwUL3ZK+yS5bAwCw==} + engines: {node: '>= 10'} + hasBin: true + requiresBuild: true + dependencies: + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + which: 2.0.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@sentry/core@7.78.0: + resolution: {integrity: sha512-cf8U+1cNkIK14KC5ySXtzu4RW5Veto3lqkS95Rbl4ExUsrVsfansFNH63j6Bvu7UbJlBRK67uf6Ug2GBbUBUIg==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.78.0 + '@sentry/utils': 7.78.0 + dev: true + + /@sentry/node@7.78.0: + resolution: {integrity: sha512-gCImN1McfAObOvwgHTef2RZaifcgKt8oqCmctk9MczLJOqjOSzuaigNiCwvyvioe5Eq9jqbZomO6Qx/sG+1gpQ==} + engines: {node: '>=8'} + dependencies: + '@sentry-internal/tracing': 7.78.0 + '@sentry/core': 7.78.0 + '@sentry/types': 7.78.0 + '@sentry/utils': 7.78.0 + https-proxy-agent: 5.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@sentry/types@7.78.0: + resolution: {integrity: sha512-XNyu6EFTrXmKlVgKHOxGdBJ6Aw7BnMBWtptr5TPOQJ4kh+rP+4DB3I6nafcSSUbIsO+hBVgBpj0J8R3Ps86CMQ==} + engines: {node: '>=8'} + dev: true + + /@sentry/utils@7.78.0: + resolution: {integrity: sha512-vxPZaMTthMgEgKvlkuqD9rQuQ4Q8fsWAuOuzeuwUbrVCBIeM/WpmyjUUx4ozy6axNGXSXGE4CzrEQUNv3+t9kQ==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.78.0 + dev: true + + /@sentry/vite-plugin@2.9.0: + resolution: {integrity: sha512-Hf4LcWlJy8VsH3Sw8SIB+lM+bBUJLmRUiZQPmnWZzyU33aOhREVoMdbYvTjs1aRqgD2eWXLQmtr01u0E3uYebg==} + engines: {node: '>= 14'} + dependencies: + '@sentry/bundler-plugin-core': 2.9.0 + unplugin: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@sideway/address@4.1.4: resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} dependencies: @@ -8087,12 +8176,12 @@ packages: acorn-walk: 8.2.0 dev: true - /acorn-jsx@5.3.2(acorn@8.10.0): + /acorn-jsx@5.3.2(acorn@8.11.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.10.0 + acorn: 8.11.2 /acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} @@ -8114,6 +8203,7 @@ packages: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /acorn@8.11.2: resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} @@ -10708,8 +10798,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.4.3 /esprima@4.0.1: @@ -11364,6 +11454,16 @@ packages: minimatch: 5.1.6 once: 1.4.0 + /glob@9.3.2: + resolution: {integrity: sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + fs.realpath: 1.0.0 + minimatch: 7.4.6 + minipass: 4.2.8 + path-scurry: 1.10.1 + dev: true + /global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} @@ -13821,6 +13921,13 @@ packages: dependencies: brace-expansion: 2.0.1 + /minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -13876,6 +13983,11 @@ packages: dependencies: yallist: 4.0.0 + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: true + /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} @@ -15407,6 +15519,11 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + /promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -15449,6 +15566,10 @@ packages: /protocols@2.0.1: resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} @@ -17518,6 +17639,15 @@ packages: - rollup - vue + /unplugin@1.0.1: + resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} + dependencies: + acorn: 8.11.2 + chokidar: 3.5.3 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + dev: true + /unplugin@1.4.0: resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==} dependencies: diff --git a/queries/subsquid/general/latestEvents.graphql b/queries/subsquid/general/latestEvents.graphql index 4c74f7c9b0..d16b0af15a 100644 --- a/queries/subsquid/general/latestEvents.graphql +++ b/queries/subsquid/general/latestEvents.graphql @@ -9,6 +9,7 @@ query latestEvents( name price currentOwner + issuer meta { id name diff --git a/queries/subsquid/ksm/latestEvents.graphql b/queries/subsquid/ksm/latestEvents.graphql index 8be2cc51cf..d3932830a1 100644 --- a/queries/subsquid/ksm/latestEvents.graphql +++ b/queries/subsquid/ksm/latestEvents.graphql @@ -9,6 +9,7 @@ query latestEvents( name price currentOwner + issuer meta { id name diff --git a/tests/e2e/createnft.spec.ts b/tests/e2e/createnft.spec.ts new file mode 100644 index 0000000000..0ca2992bac --- /dev/null +++ b/tests/e2e/createnft.spec.ts @@ -0,0 +1,93 @@ +import { expect, test } from './fixtures' + +test('Create NFT', async ({ page, Commands }) => { + await Commands.e2elogin() + //await page.goto('/ahk/create') + await page.goto('/ksm/create') + await page.getByTestId('create-landing-nft-button').click() + await expect(page).toHaveURL('/ksm/create?select=nft') + //Single NFT + await test.step('Single NFT', async () => { + await Commands.acceptCookies() + //select single nft creation + await page.getByTestId('create-landing-single-nft-button').click() + //upload NFT image + await page.setInputFiles( + 'input[type="file"]', + 'tests/e2e/unsplash-image.jpg', + ) + //set name + await page + .getByTestId('create-nft-input-name') + .fill('Parametric NFT divergencies') + //set description + await page + .getByTestId('create-nft-input-description') + .fill('Testing purpose NFT description using Playwright') + //select AHK chain on dropdown + await page + .getByTestId('create-nft-dropdown-select') + .selectOption('KusamaHub') + await expect(page.getByTestId('chain')).toHaveText('ahk') + //list for sale switch + await page.getByTestId('create-nft-sale-switch').click() + //set price + await page.getByTestId('create-nft-input-list-value').fill('5.5') + //set number of copies + await page.getByTestId('create-nft-input-copies').fill('5') + await expect( + page.getByTestId('create-nft-input-copies-switch'), + ).toBeVisible() + //activate hastag switch + await page.getByTestId('create-nft-input-copies-switch').click() + // - - NFT attributes interactions - - + //open NFT attribute section + await page.getByTestId('create-nft-properties').click() + //add new attribute + await page.getByTestId('button-add-attribute').click() + //fill section + await page.getByTestId('attr-0').getByPlaceholder('Section').fill('BG') + //fill value + await page.getByTestId('attr-0').getByPlaceholder('Value').fill('Red') + //add new attribute + await page.getByTestId('button-add-attribute').click() + await page.getByTestId('attr-1').getByPlaceholder('Section').fill('Dress') + await page.getByTestId('attr-1').getByPlaceholder('Value').fill('Blue') + //remove last attribute + await page.getByTestId('attribute-button-remove').last().click() + await expect(page.getByTestId('attr-1')).not.toBeVisible() + //royalty + const royaltyFields = page + .getByTestId('royalty-form-input-percentage') + .locator('input') + await royaltyFields.fill('5') + //royalty switch + await page.getByTestId('royalty-form-switch').click() + //get user address + const royaltyCustom = page + .getByTestId('royalty-form-custom-address') + .locator('input') + await expect(royaltyCustom).toBeVisible() + //NSFW switch + await page.getByTestId('create-nft-nsfw-switch').click() + //deposit check + await expect(page.getByTestId('create-nft-deposit-amount')).toHaveText( + '0.0077 KSM', + { timeout: 30000 }, + ) + //preview box + await expect(page.getByTestId('create-nft-preview-box')).toBeVisible() + expect( + (await page.getByTestId('nft-preview-name').innerText()).valueOf(), + ).toBe('Parametric NFT divergencies') + expect( + (await page.getByTestId('nft-preview-price').innerText()).valueOf(), + ).toContain('5.5') + //learn more link + await expect(page.getByTestId('create-nft-learn-more-link')).toBeVisible() + await Commands.checkNewTab( + 'https://hello.kodadot.xyz/multi-chain/fees', + page.getByTestId('create-nft-learn-more-link').click(), + ) + }) +}) diff --git a/tests/e2e/custom.ts b/tests/e2e/custom.ts index a99f19d7f2..86d5710191 100644 --- a/tests/e2e/custom.ts +++ b/tests/e2e/custom.ts @@ -45,4 +45,11 @@ export class Commands { async acceptCookies() { await this.page.getByTestId('cookie-banner-button-accept').click() } + async checkNewTab(url: string, clickAction) { + const newTabPromise = this.page.waitForEvent('popup') + await clickAction + const newTab = await newTabPromise + await expect(newTab).toHaveURL(url) + await newTab.close() + } } diff --git a/tsconfig.json b/tsconfig.json index 440bc81593..24b85a322c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,13 +14,14 @@ "experimentalDecorators": true, "noImplicitAny": false, "resolveJsonModule": true, + "verbatimModuleSyntax": false, // TODO: would be good if true "types": [ "@nuxt/types", "@nuxtjs/i18n", "@nuxtjs/color-mode", "@types/node", "vue-apollo", - "vitest/globals", + "vitest/globals" ] }, "exclude": ["node_modules", "dist", "**/*.spec.ts"] diff --git a/utils/chain.ts b/utils/chain.ts index 4a776501c8..6810163521 100644 --- a/utils/chain.ts +++ b/utils/chain.ts @@ -43,20 +43,21 @@ export const getAvailablePrefix = (prefix: string): string => { : '' } -export const availablePrefixWithIcon = () => { - const menus = { - ahk: '/token/kusama_asset_hub.svg', - ahp: '/token/polkadot_asset_hub.svg', - bsx: '/token/bsx.svg', - snek: '/token/bsx.svg', - ksm: '/token/ksm.svg', - rmrk: '/token/ksm.svg', - } +export const chainIcons = { + ahk: '/token/kusama_asset_hub.svg', + ahp: '/token/polkadot_asset_hub.svg', + bsx: '/token/bsx.svg', + snek: '/token/bsx.svg', + ksm: '/token/ksm.svg', + rmrk: '/token/ksm.svg', + dot: '/token/dot.svg', +} +export const availablePrefixWithIcon = () => { return availablePrefixes().map((chain) => { return { ...chain, - icon: menus[chain.value] || '', + icon: chainIcons[chain.value] || '', } }) }