Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: demo social not redirecting to account view #3809

Merged
merged 59 commits into from
Feb 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
61df3ef
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Nov 25, 2024
2cb1a1b
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Nov 26, 2024
d2bf2bc
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Nov 27, 2024
0bd4276
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Nov 28, 2024
a4c24da
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Nov 28, 2024
5eecce4
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Nov 29, 2024
b3d2efe
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Nov 29, 2024
0a0aeca
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 2, 2024
cf37108
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 5, 2024
34ee496
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 6, 2024
7df0378
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 10, 2024
9f1174d
wip
svenvoskamp Dec 10, 2024
c95f623
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 10, 2024
26c8ad4
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 11, 2024
ab675ab
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 12, 2024
67129c9
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 12, 2024
f33b34b
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 19, 2024
a7d921b
wip
svenvoskamp Dec 19, 2024
39b475f
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 20, 2024
c749e97
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 23, 2024
e2dacf5
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 23, 2024
38da726
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Dec 31, 2024
ca675a7
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 3, 2025
fec0681
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 6, 2025
feb309a
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 7, 2025
912ed0d
wip
svenvoskamp Jan 7, 2025
21994b1
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 9, 2025
045b5d9
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 13, 2025
1a55494
wip
svenvoskamp Jan 13, 2025
d894f7c
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 14, 2025
20c0417
wip
svenvoskamp Jan 14, 2025
aef71ea
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 14, 2025
3d1da87
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 14, 2025
2fb4235
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 15, 2025
9b81c31
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 15, 2025
02d2e7b
add test for w3m-connect-injected-widget
svenvoskamp Jan 15, 2025
64b6b19
wip
svenvoskamp Jan 15, 2025
f20577e
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 15, 2025
11c9819
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 15, 2025
11f8596
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 15, 2025
9f0288b
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 16, 2025
b5ae233
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 17, 2025
0b9049e
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 20, 2025
6214ccf
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 21, 2025
48ff9a3
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 21, 2025
d9db022
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 30, 2025
9548594
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 30, 2025
3d6664b
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Jan 31, 2025
30fa5e5
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Feb 3, 2025
e4babd0
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Feb 4, 2025
195751b
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Feb 5, 2025
cf6dd8b
Merge branch 'main' of github.com:reown-com/appkit
svenvoskamp Feb 6, 2025
c0d9f81
fix demo social issue
svenvoskamp Feb 6, 2025
deb2765
Merge branch 'main' into fix/demo-social
svenvoskamp Feb 6, 2025
58d8381
fix test
svenvoskamp Feb 6, 2025
6618e81
Merge branch 'fix/demo-social' of github.com:reown-com/appkit into fi…
svenvoskamp Feb 6, 2025
87758e8
fix test for mock implementation once
svenvoskamp Feb 6, 2025
1900255
fix test for mock implementation once
svenvoskamp Feb 6, 2025
6793065
fix test for mock implementation once
svenvoskamp Feb 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/appkit/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,9 @@ export class AppKit {

public setUser: (typeof AccountController)['setUser'] = user => {
AccountController.setUser(user)
if (OptionsController.state.enableEmbedded) {
ModalController.close()
}
}

public resetAccount: (typeof AccountController)['resetAccount'] = (chain: ChainNamespace) => {
Expand Down
5 changes: 4 additions & 1 deletion packages/scaffold-ui/src/partials/w3m-header/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,10 @@ export class W3mHeader extends LitElement {
this.onHistoryChange()
}),
ConnectionController.subscribeKey('buffering', val => (this.buffering = val)),
ChainController.subscribeKey('activeCaipNetwork', val => (this.network = val))
ChainController.subscribeKey('activeCaipNetwork', val => {
this.network = val
this.networkImage = AssetUtil.getNetworkImage(this.network)
})
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
ConnectorController,
EventsController,
ModalController,
OptionsController,
RouterController,
SnackController,
StorageUtil,
Expand Down Expand Up @@ -52,7 +53,7 @@ export class W3mConnectingSocialView extends LitElement {
this.socialWindow = val.socialWindow
}
if (val.address) {
if (ModalController.state.open) {
if (ModalController.state.open || OptionsController.state.enableEmbedded) {
ModalController.close()
}
}
Expand Down
233 changes: 233 additions & 0 deletions packages/scaffold-ui/test/partials/w3m-header.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,233 @@
import { elementUpdated, fixture } from '@open-wc/testing'
import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'

import { html } from 'lit'

import type { CaipNetwork } from '@reown/appkit-common'
import {
AssetController,
AssetUtil,
ChainController,
EventsController,
ModalController,
OptionsController,
RouterController,
SIWXUtil
} from '@reown/appkit-core'

import { W3mHeader } from '../../src/partials/w3m-header'
import { HelpersUtil } from '../utils/HelpersUtil'

describe('W3mHeader', () => {
let element: W3mHeader

beforeAll(() => {
Element.prototype.animate = vi.fn().mockReturnValue({ finished: Promise.resolve() })
})

beforeEach(async () => {
vi.clearAllMocks()
RouterController.reset('Connect')
element = await fixture(html`<w3m-header></w3m-header>`)
await element.updateComplete
})

describe('Network Selection', () => {
const mockNetwork = {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use networks from our exports instead of mocking? If we need extended one, we can use CaipNetworkUtil.extendCaipNetwork

id: '1',
name: 'Test Network',
chainNamespace: 'eip155',
caipNetworkId: 'eip155:1',
nativeCurrency: { name: 'Test', symbol: 'TEST', decimals: 18 },
rpcUrls: { default: { http: ['https://test.com'] } }
} as unknown as CaipNetwork

it('should render network select in Account view', async () => {
RouterController.state.view = 'Account'
element.requestUpdate()
await element.updateComplete
await elementUpdated(element)

const networkSelect = HelpersUtil.getByTestId(element, 'w3m-account-select-network')
expect(networkSelect).toBeTruthy()
})

it('should update network image when network changes', async () => {
RouterController.state.view = 'Account'
element.requestUpdate()
await element.updateComplete

const getNetworkImageSpy = vi.spyOn(AssetUtil, 'getNetworkImage')
ChainController.setActiveCaipNetwork(mockNetwork)
await elementUpdated(element)

const networkSelect = HelpersUtil.getByTestId(element, 'w3m-account-select-network')
expect(networkSelect?.getAttribute('active-network')).toBe('Test Network')
expect(getNetworkImageSpy).toHaveBeenCalledWith(mockNetwork)
})

it('should update network image when AssetController emits new images', async () => {
RouterController.state.view = 'Account'
element.requestUpdate()
await element.updateComplete

let subscriberCallback: Function | undefined
vi.spyOn(AssetController, 'subscribeNetworkImages').mockImplementation(callback => {
subscriberCallback = callback
return () => undefined
})

element = await fixture(html`<w3m-header></w3m-header>`)
await element.updateComplete

ChainController.setActiveCaipNetwork(mockNetwork)
await elementUpdated(element)

const getNetworkImageSpy = vi.spyOn(AssetUtil, 'getNetworkImage')

// Simulate AssetController emitting new network images
if (subscriberCallback) {
subscriberCallback()
}

expect(getNetworkImageSpy).toHaveBeenCalledWith(mockNetwork)
})
})

describe('Back Button', () => {
it('should show back button when history length > 1', async () => {
RouterController.push('Networks')
await element.updateComplete
await elementUpdated(element)

const backButton = HelpersUtil.getByTestId(element, 'header-back')
expect(backButton).toBeTruthy()
})

it('should not show back button in ApproveTransaction view', async () => {
RouterController.state.view = 'ApproveTransaction'
element.requestUpdate()
await element.updateComplete
await elementUpdated(element)

const backButton = HelpersUtil.getByTestId(element, 'header-back')
expect(backButton).toBeFalsy()
})

it('should call RouterController.goBack when back button is clicked', async () => {
const goBackSpy = vi.spyOn(RouterController, 'goBack')
RouterController.push('Networks')
await element.updateComplete
await elementUpdated(element)

const backButton = HelpersUtil.getByTestId(element, 'header-back')
backButton?.click()

expect(goBackSpy).toHaveBeenCalled()
})
})

describe('Close Button', () => {
it('should render close button', async () => {
const closeButton = HelpersUtil.getByTestId(element, 'w3m-header-close')
expect(closeButton).toBeTruthy()
})

it('should call ModalController.close when close button is clicked', async () => {
const closeSpy = vi.spyOn(ModalController, 'close')
vi.spyOn(SIWXUtil, 'isSIWXCloseDisabled').mockResolvedValue(false)

const closeButton = HelpersUtil.getByTestId(element, 'w3m-header-close')
await closeButton?.click()

expect(closeSpy).toHaveBeenCalled()
})

it('should shake modal when trying to close in UnsupportedChain view', async () => {
const shakeSpy = vi.spyOn(ModalController, 'shake')
RouterController.state.view = 'UnsupportedChain'
element.requestUpdate()
await element.updateComplete
await elementUpdated(element)

const closeButton = HelpersUtil.getByTestId(element, 'w3m-header-close')
await closeButton?.click()

expect(shakeSpy).toHaveBeenCalled()
})
})

describe('Smart Sessions', () => {
it('should show smart sessions button in Account view when enabled', async () => {
RouterController.state.view = 'Account'
OptionsController.state.features = { smartSessions: true }
element.requestUpdate()
await element.updateComplete
await elementUpdated(element)

const smartSessionsButton = HelpersUtil.getByTestId(element, 'w3m-header-smart-sessions')
expect(smartSessionsButton).toBeTruthy()
})

it('should not show smart sessions button when disabled', async () => {
RouterController.state.view = 'Account'
OptionsController.state.features = { smartSessions: false }
element.requestUpdate()
await element.updateComplete
await elementUpdated(element)

const smartSessionsButton = HelpersUtil.getByTestId(element, 'w3m-header-smart-sessions')
expect(smartSessionsButton).toBeFalsy()
})

it('should navigate to SmartSessionList when smart sessions button is clicked', async () => {
RouterController.state.view = 'Account'
OptionsController.state.features = { smartSessions: true }
element.requestUpdate()
await element.updateComplete
await elementUpdated(element)

const smartSessionsButton = HelpersUtil.getByTestId(element, 'w3m-header-smart-sessions')
smartSessionsButton?.dispatchEvent(new Event('click'))

expect(RouterController.state.view).toBe('SmartSessionList')
})
})

describe('Help Button', () => {
it('should show help button in Connect view', async () => {
RouterController.state.view = 'Connect'
element.requestUpdate()
await element.updateComplete
await elementUpdated(element)

const helpButton = element.shadowRoot?.querySelector('wui-icon-link[icon="helpCircle"]')
expect(helpButton).toBeTruthy()
})

it('should navigate to WhatIsAWallet when help button is clicked', async () => {
RouterController.state.view = 'Connect'
element.requestUpdate()
await element.updateComplete
await elementUpdated(element)

const helpButton = element.shadowRoot?.querySelector('wui-icon-link[icon="helpCircle"]')
helpButton?.dispatchEvent(new Event('click'))

expect(RouterController.state.view).toBe('WhatIsAWallet')
})

it('should track help button click event', async () => {
const trackSpy = vi.spyOn(EventsController, 'sendEvent')
RouterController.state.view = 'Connect'
element.requestUpdate()
await element.updateComplete
await elementUpdated(element)

const helpButton = element.shadowRoot?.querySelector('wui-icon-link[icon="helpCircle"]')
helpButton?.dispatchEvent(new Event('click'))

expect(trackSpy).toHaveBeenCalledWith({ type: 'track', event: 'CLICK_WALLET_HELP' })
})
})
})
74 changes: 74 additions & 0 deletions packages/scaffold-ui/test/views/w3m-connecting-social-view.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import {
ChainController,
ConnectionController,
ConnectorController,
ModalController,
OptionsController,
RouterController
} from '@reown/appkit-core'

Expand Down Expand Up @@ -54,3 +56,75 @@ describe('W3mConnectingSocialView - disconnectedCallback', () => {
expect(setSocialWindowSpy).toHaveBeenCalledWith(undefined, 'eip155')
})
})

describe('W3mConnectingSocialView - Embedded Modal Behavior', () => {
it('should close modal when address is set and enableEmbedded is true', async () => {
const mockSocialWindow = {
close: vi.fn(),
closed: false
} as unknown as Window

let subscriptionCallback: ((val: any) => void) | undefined

vi.spyOn(ModalController, 'close').mockImplementation(() => {})
vi.spyOn(OptionsController, 'state', 'get').mockReturnValueOnce({
...OptionsController.state,
enableEmbedded: true
})
vi.spyOn(AccountController, 'state', 'get').mockReturnValueOnce({
...AccountController.state,
socialWindow: mockSocialWindow
})
vi.spyOn(ModalController, 'state', 'get').mockReturnValueOnce({
...ModalController.state,
open: true
})
vi.spyOn(AccountController, 'subscribe').mockImplementationOnce(callback => {
subscriptionCallback = callback
return () => {}
})

await fixture(html`<w3m-connecting-social-view></w3m-connecting-social-view>`)

if (subscriptionCallback) {
subscriptionCallback({ address: '0x123' })
}

expect(ModalController.close).toHaveBeenCalled()
})

it('should not close modal when address is set but enableEmbedded is false', async () => {
const mockSocialWindow = {
close: vi.fn(),
closed: false
} as unknown as Window

let subscriptionCallback: ((val: any) => void) | undefined

vi.spyOn(ModalController, 'close').mockImplementationOnce(() => {})
vi.spyOn(OptionsController, 'state', 'get').mockReturnValueOnce({
...OptionsController.state,
enableEmbedded: false
})
vi.spyOn(AccountController, 'state', 'get').mockReturnValueOnce({
...AccountController.state,
socialWindow: mockSocialWindow
})
vi.spyOn(ModalController, 'state', 'get').mockReturnValueOnce({
...ModalController.state,
open: false
})
vi.spyOn(AccountController, 'subscribe').mockImplementationOnce(callback => {
subscriptionCallback = callback
return () => {}
})

await fixture(html`<w3m-connecting-social-view></w3m-connecting-social-view>`)

if (subscriptionCallback) {
subscriptionCallback({ address: '0x123' })
}

expect(ModalController.close).not.toHaveBeenCalled()
})
})
Loading