Skip to content

Commit

Permalink
* updates URL when connecting to a network so it can be easily
Browse files Browse the repository at this point in the history
  bookmarked
* make same optional path param from root (Provider Login)
  • Loading branch information
shannonwells committed Nov 7, 2024
1 parent 426af77 commit 089fcc3
Show file tree
Hide file tree
Showing 10 changed files with 58 additions and 22 deletions.
2 changes: 1 addition & 1 deletion src/components/BecomeAProvider.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<SelectNetworkAndAccount
bind:newUser={$user}
accounts={$nonProviderAccountsStore}
accountSelectorTitle="Account Id"
accountSelectorTitle="Select an Account Id"
accountSelectorPlaceholder="Select an Account Id"
noAccountsFoundErrorMsg="No accounts found. Add an Account Id to your wallet."
/>
Expand Down
2 changes: 1 addition & 1 deletion src/components/ConnectProvider.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
export let isOpen: boolean = false;
</script>

<Modal id="conntect-provider" {close} {isOpen}>
<Modal id="connect-provider" {close} {isOpen}>
<span slot="title">Connect Provider</span>
<LoginForm slot="body" onConnect={close} onCancel={close} />
</Modal>
2 changes: 1 addition & 1 deletion src/components/ConnectionStatus.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
{:else}
<div class="w-1 bg-red-error h-1 rounded-full p-1"></div>
{/if}
<p id="connected-network" class="text-md uppercase">{$user.network?.displayName}</p>
<p id="connected-network" class="text-md uppercase">{$user.network?.name}</p>
</div>
<p class="text-md">
{#if $user?.network}{$user.network.endpoint?.toString().replace(/\/$/, '')}{/if}
Expand Down
2 changes: 1 addition & 1 deletion src/components/DropDownMenu.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<option class="text-disabled" value={null} disabled selected>{placeholder}</option>
{/if}
{#each options as option}
<option value={formatter(option)} class="bg-white">{formatter(option)}</option>
<option value={option} class="bg-white">{formatter(option)}</option>
{/each}
</select>
</div>
6 changes: 3 additions & 3 deletions src/components/LoginForm.svelte
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<script lang="ts">
import { preventDefault } from 'svelte/legacy';
import { providerAccountsStore, type Account } from '$lib/stores/accountsStore';
import { providerAccountsStore, type Account} from '$lib/stores/accountsStore';
import { clearLog } from '$lib/stores/activityLogStore';
import { user } from '$lib/stores/userStore';
import Button from './Button.svelte';
Expand Down Expand Up @@ -32,12 +32,12 @@
<SelectNetworkAndAccount
bind:newUser
accounts={$providerAccountsStore}
accountSelectorTitle="Select an Account Id"
accountSelectorTitle="Select a Provider Account Id"
accountSelectorPlaceholder="Select a Provider Account Id"
noAccountsFoundErrorMsg="No Provider Account Ids found. To become a Provider, see below."
/>
<div class="flex justify-between align-bottom">
<Button id="connect-button" title="Connect" disabled={!canConnect} action={connect} />
<Button id="connect-button" title="Connect To Account" disabled={!canConnect} action={connect} />
{#if onCancel}
<button class="btn-no-fill" onclick={preventDefault(onCancel)}>Cancel</button>
{/if}
Expand Down
17 changes: 15 additions & 2 deletions src/components/SelectNetworkAndAccount.svelte
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<script lang="ts">
import { onMount } from 'svelte';
import { page} from '\$app/stores';
import { goto } from '\$app/navigation';
import { allNetworks, NetworkType, type NetworkInfo, networkNameToNetworkInfo } from '$lib/stores/networksStore';
Expand Down Expand Up @@ -96,6 +97,18 @@
isLoading = false;
}
const onSelectNetworkChanged = () => {
isCustomNetwork = selectedNetwork?.id === NetworkType.CUSTOM;
if (!isCustomNetwork) {
if (selectedNetwork?.endpoint && isValidURL(selectedNetwork!.endpoint.toString())) {
console.log("pathname: ", $page.url.pathname);
const join = $page.url.pathname === "/become-a-provider" ? '/' : ''
goto([$page.url.toString(),selectedNetwork.pathName].join(join));
networkChanged()
}
}
}
function customNetworkChanged(event: KeyboardEvent) {
console.debug('HERE');
if (event.key === 'Enter') {
Expand Down Expand Up @@ -123,12 +136,12 @@
bind:value={selectedNetwork}
placeholder="Select a network"
options={$allNetworks}
onChange={networkChanged}
onChange={onSelectNetworkChanged}
formatter={formatNetwork}
/>
{:else }
<p class="flex justify-between">
<span class="text-teal">Connected to {selectedNetwork?.displayName || "Custom"}</span>
<span class="text-teal">Connected to {selectedNetwork?.name || "Custom"}</span>
<span onclick={resetState} class="btn-no-fill cursor-pointer">
Change networks
</span>
Expand Down
10 changes: 5 additions & 5 deletions src/lib/stores/networksStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export enum NetworkType {
*/
export interface NetworkInfo {
id: NetworkType;
displayName: string;
name: string;
pathName: string;
endpoint?: string;
genesisHash?: string;
Expand All @@ -21,23 +21,23 @@ export interface NetworkInfo {
export const defaultNetworks: NetworkInfo[] = [
{
id: NetworkType.MAINNET,
displayName: 'Mainnet',
name: 'Mainnet',
pathName: 'mainnet',
endpoint: 'wss://1.rpc.frequency.xyz',
genesisHash: '0x4a587bf17a404e3572747add7aab7bbe56e805a5479c6c436f07f36fcc8d3ae1',
},
{
id: NetworkType.TESTNET_PASEO,
displayName: 'Testnet on Paseo',
name: 'Testnet on Paseo',
pathName: 'testnet',
endpoint: 'wss://0.rpc.testnet.amplica.io',
genesisHash: '0x203c6838fc78ea3660a2f298a58d859519c72a5efdc0f194abd6f0d5ce1838e0',
},
{ id: NetworkType.LOCALHOST, displayName: 'Localhost', pathName: 'localhost', endpoint: 'ws://127.0.0.1:9944' },
{ id: NetworkType.LOCALHOST, name: 'Localhost', pathName: 'localhost', endpoint: 'ws://127.0.0.1:9944' },
];

export const allNetworks =
writable<NetworkInfo[]>(defaultNetworks.concat( [{ id: NetworkType.CUSTOM, displayName: 'Custom', pathName: 'custom' }]));
writable<NetworkInfo[]>(defaultNetworks.concat( [{ id: NetworkType.CUSTOM, name: 'Custom', pathName: 'custom' }]));

export const networkNameToNetworkInfo = (name: string|undefined): NetworkInfo|undefined => {
if (name ===undefined) return undefined;
Expand Down
6 changes: 3 additions & 3 deletions src/lib/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ export function isValidURL(url: string): boolean {

export function formatNetwork(network: NetworkInfo): string {
if (network.id === NetworkType.CUSTOM) {
return network.displayName;
return network.name;
}
return `${network?.displayName ?? ''}: ${network?.endpoint?.toString().replace(/\/$/, '') ?? ''}`;
return `${network?.name ?? ''}: ${network?.endpoint?.toString().replace(/\/$/, '') ?? ''}`;
}

export function formatAccount(account: Account): string {
Expand All @@ -76,7 +76,7 @@ export function formatAccount(account: Account): string {
// create a URL-encoded mailto URL string using the provided parameters.
export function createMailto(to: string, subject?: string, body?: string): string {
// this regex is not at all rigourous, it's just for preventing blatant errors
const emailRegex = /^[\w\-\.]+@([\w-]+\.)+[\w-]{2,}$/; // eslint-disable-line no-useless-escape
const emailRegex = /^[\w\-.]+@([\w-]+\.)+[\w-]{2,}$/; // eslint-disable-line no-useless-escape
const matches = to.match(emailRegex);
if (matches === null) {
throw `to is not an email address: ${to}`;
Expand Down
File renamed without changes.
33 changes: 28 additions & 5 deletions test/playwright/navigation.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
import { test, expect } from '@playwright/test';
import Page from '$routes/+page.svelte';

// Mainnet: 1, testnet: 2, localhost: 3
// selects the option and then it must fire a change event.
const selectNetwork = async (page: Page, index: number) => {
await page.locator('select#network').selectOption({index});
await page.locator('select#network').dispatchEvent('change');

}

test('Navigation from home page', async ({ page }) => {
await page.goto('/');
Expand Down Expand Up @@ -57,12 +66,26 @@ test('On provider login page, can change networks', async ({page}) => {
await page.waitForURL('**/');
await expect(page.getByText('Provider Login')).toBeVisible();

await page.locator('select#network').selectOption({index: 1});
await page.locator('select#network').dispatchEvent('change');

await selectNetwork(page, 2);

await expect(page.getByText(/Connected to Mainnet/i)).toBeVisible();
await expect(page.getByText(/Connected to Testnet on Paseo/i)).toBeVisible();
await page.getByText(/Change networks/).click({ force: true});
await expect(page.getByText(/Connected to Mainnet/i)).not.toBeVisible();
await expect(page.getByText(/Connected to Testnet on Paseo/i)).not.toBeVisible();
await expect(page.getByLabel(/Select a Network/i)).toBeVisible();
})

test('When selecting a network from Provider Login, updates URL', async ({page}) => {
await page.goto('/');
await page.waitForURL('**/');
await selectNetwork(page, 1);
await expect(page.getByText(/Connected to Mainnet/i)).toBeVisible();
expect(page.url().endsWith('mainnet'))
});

test('When selecting a network from Become A Provider, updates URL', async ({page}) => {
await page.goto('/become-a-provider');
await page.waitForURL('**/become-a-provider');
await selectNetwork(page, 1);
await expect(page.getByText(/Connected to Mainnet/i)).toBeVisible();
expect(page.url().endsWith('/become-a-provider/mainnet'))
});

0 comments on commit 089fcc3

Please sign in to comment.