Skip to content

Commit 90efc4b

Browse files
authored
Merge pull request #346 from polkadot-ui/nik-beautify-connect
Make wallet connect work in popup
2 parents f205251 + ab2d71d commit 90efc4b

File tree

9 files changed

+154
-80
lines changed

9 files changed

+154
-80
lines changed

Diff for: packages/ui-react/lib/components/Connect/Connect.tsx

+4-14
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,11 @@
1-
import { Dispatch, SetStateAction, useState } from "react"
1+
import { useState } from "react"
22
import { ConnectAccounts } from "./ConnectAccounts"
33
import { ConnectExtensions } from "./ConnectExtensions"
4-
import { ConnectConfiguration } from "./types"
5-
import {
6-
InjectedExtension,
7-
InjectedPolkadotAccount,
8-
} from "polkadot-api/pjs-signer"
4+
import { ConnectIF } from "./types"
5+
import { InjectedExtension } from "polkadot-api/pjs-signer"
96
import { ConnectAccountsProvider } from "."
107

11-
export const Connect: React.FC<{
12-
selected?: InjectedPolkadotAccount
13-
setSelected: Dispatch<SetStateAction<InjectedPolkadotAccount>>
14-
config?: ConnectConfiguration
15-
type?: "onepage" | "extensions" | "split"
16-
onSelectExtensions?: (ext: Map<string, InjectedExtension>) => void
17-
getConnectedAccounts?: (acc: InjectedPolkadotAccount[]) => void
18-
}> = ({
8+
export const Connect: React.FC<ConnectIF> = ({
199
setSelected,
2010
selected,
2111
config,

Diff for: packages/ui-react/lib/components/Connect/ConnectAccounts.tsx

+2-6
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@ import type {
1010
InjectedExtension,
1111
InjectedPolkadotAccount,
1212
} from "polkadot-api/pjs-signer"
13-
import { useConnectLocalStorage, useSelectedExtensions } from "./hooks"
13+
import { useAccountLocalStorage, useSelectedExtensions } from "./hooks"
1414
import { SignerCtx } from "./signerCtx"
1515

1616
import { getExtensionIcon } from "@polkadot-ui/assets/extensions"
1717
import type { CommonConfigType, ConnectConfiguration } from "./types"
18-
import { localStorageKeyAccount } from "./utils"
1918

2019
const AccountsList: React.FC<{
2120
extension: InjectedExtension
@@ -30,10 +29,7 @@ const AccountsList: React.FC<{
3029
extension.getAccounts
3130
)
3231

33-
const [accountLocalStorage, setAccountLocalStorage] = useConnectLocalStorage(
34-
localStorageKeyAccount,
35-
""
36-
)
32+
const [accountLocalStorage, setAccountLocalStorage] = useAccountLocalStorage()
3733

3834
useEffect(() => {
3935
const accounts = extension.getAccounts()

Diff for: packages/ui-react/lib/components/Connect/ConnectExtensions.tsx

+3-4
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import type { Dispatch, PropsWithChildren, SetStateAction } from "react"
33
import { useEffect, useState, useSyncExternalStore } from "react"
44
import { extensionCtx } from "./extensionCtx"
55
import { getExtensionIcon } from "@polkadot-ui/assets/extensions"
6-
import { useAvailableExtensions, useConnectLocalStorage } from "./hooks"
6+
import { useAvailableExtensions, useExtLocalStorage } from "./hooks"
77
import type { ConnectConfiguration, NameUrlType } from "./types"
88
import { Any } from "../../utils"
9-
import { getExtensionsStore, localStorageKeyExtensions } from "./utils"
9+
import { getExtensionsStore } from "./utils"
1010
import {
1111
InjectedExtension,
1212
InjectedPolkadotAccount,
@@ -55,8 +55,7 @@ export const ConnectExtensions: FC<
5555
onSelectExtensions,
5656
getConnectedAccounts,
5757
}) => {
58-
const [extensionLocalStorage, setExtensionLocalStorage] =
59-
useConnectLocalStorage(localStorageKeyExtensions, "")
58+
const [extensionLocalStorage, setExtensionLocalStorage] = useExtLocalStorage()
6059

6160
const [nonInstalledXts, setNonInstalledXts] = useState<NameUrlType[]>([])
6261
const availXts = useAvailableExtensions()
+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import { FC } from "react"
2+
3+
import { PropsWithChildren, useEffect, useState } from "react"
4+
import { ConnectIF } from "./types"
5+
import { Connect } from "./Connect"
6+
7+
export const ConnectModal: FC<
8+
PropsWithChildren &
9+
ConnectIF & {
10+
title: string
11+
show: boolean
12+
onClose: (a: boolean) => void
13+
}
14+
> = ({
15+
title,
16+
show,
17+
onClose,
18+
selected,
19+
setSelected,
20+
config,
21+
type = "onepage",
22+
onSelectExtensions,
23+
getConnectedAccounts,
24+
}) => {
25+
const [sh, setSh] = useState(false)
26+
27+
const closeHandler = () => {
28+
setSh(false)
29+
onClose(false)
30+
}
31+
32+
useEffect(() => {
33+
setSh(show)
34+
}, [show])
35+
36+
return (
37+
<div
38+
style={{
39+
visibility: sh ? "visible" : "hidden",
40+
opacity: sh ? "1" : "0",
41+
position: "fixed",
42+
top: 0,
43+
bottom: 0,
44+
left: 0,
45+
right: 0,
46+
background: "#ccc",
47+
transition: "opacity 500ms",
48+
}}
49+
>
50+
<div
51+
style={{
52+
margin: "70px auto",
53+
padding: "20px",
54+
background: "#fff",
55+
borderRadius: "5px",
56+
position: "relative",
57+
transition: "all 5s ease-in-out",
58+
}}
59+
>
60+
<h2 style={{ marginTop: 0 }}>{title}</h2>
61+
<span
62+
style={{
63+
position: "absolute",
64+
top: "20px",
65+
right: "30px",
66+
transition: "all 200ms",
67+
fontSize: "30px",
68+
fontWeight: "bold",
69+
textDecoration: "none",
70+
color: "#333",
71+
cursor: "pointer",
72+
}}
73+
onClick={closeHandler}
74+
>
75+
&times;
76+
</span>
77+
<Connect
78+
type={type}
79+
selected={selected}
80+
setSelected={setSelected}
81+
config={config}
82+
getConnectedAccounts={getConnectedAccounts}
83+
onSelectExtensions={onSelectExtensions}
84+
/>
85+
</div>
86+
</div>
87+
)
88+
}

Diff for: packages/ui-react/lib/components/Connect/hooks.tsx

+31-15
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,33 @@ export const useAvailableExtensions = (): string[] => {
4343
return useMemo(() => extensions?.split(",") ?? [], [extensions])
4444
}
4545

46-
export const useConnectLocalStorage = (key: string, defaultValue: string) => {
46+
export const useAccountLocalStorage = () => {
47+
const [value, setValue] = useState(() => {
48+
const getStorageValue = () => {
49+
const saved = localStorage.getItem(localStorageKeyAccount)
50+
const initial = saved ? JSON.parse(saved) : ""
51+
return initial || ""
52+
}
53+
54+
return getStorageValue()
55+
})
56+
57+
useEffect(() => {
58+
localStorage.setItem(localStorageKeyAccount, JSON.stringify(value))
59+
}, [value])
60+
61+
return [value, setValue]
62+
}
63+
64+
export const useExtLocalStorage = () => {
4765
const [value, setLocal] = useState(() => {
48-
const getStorageValue = (key: string, defaultValue: string) => {
49-
const saved = localStorage.getItem(key)
66+
const getStorageValue = () => {
67+
const saved = localStorage.getItem(localStorageKeyExtensions)
5068
const initial = JSON.parse(saved)
51-
return initial || defaultValue
69+
return initial || ""
5270
}
5371

54-
return getStorageValue(key, defaultValue)
72+
return getStorageValue()
5573
})
5674

5775
const setValue = (name: string) => {
@@ -60,19 +78,20 @@ export const useConnectLocalStorage = (key: string, defaultValue: string) => {
6078
if (a.includes(name)) {
6179
const index = a.indexOf(name)
6280
if (index > -1) a.splice(index, 1)
63-
b = a
81+
b = a.filter((c) => c)
6482
} else {
65-
b = [...a, name]
83+
b = [...a, name].filter((c) => c)
6684
}
85+
6786
setLocal(b.join(","))
6887
}
6988

7089
useEffect(() => {
71-
localStorage.setItem(key, JSON.stringify(value))
72-
}, [key, value])
90+
localStorage.setItem(localStorageKeyExtensions, JSON.stringify(value))
91+
}, [value])
7392

7493
const removeItem = () => {
75-
localStorage.removeItem(key)
94+
localStorage.removeItem(localStorageKeyExtensions)
7695
}
7796

7897
return [value, setValue, removeItem]
@@ -89,13 +108,10 @@ export const useExtensionAccounts = () => {
89108
const extensionsStore = getExtensionsStore()
90109

91110
export const useConnect = () => {
92-
const [extensionLocalStorage, , removeExtItem] = useConnectLocalStorage(
93-
localStorageKeyExtensions,
94-
""
95-
)
111+
const [extensionLocalStorage, , removeExtItem] = useExtLocalStorage()
96112

97113
const [accountLocalStorage, setAccountLocalStorage, remAccItem] =
98-
useConnectLocalStorage(localStorageKeyAccount, "")
114+
useAccountLocalStorage()
99115

100116
const [connectedAccounts, setConnectedAccounts] = useState<
101117
InjectedPolkadotAccount[]

Diff for: packages/ui-react/lib/components/Connect/index.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
export { ConnectAccounts } from "./ConnectAccounts"
22
export { ConnectExtensions } from "./ConnectExtensions"
3+
export { ConnectModal } from "./ConnectModal"
34
export { Connect } from "./Connect"
45
export {
56
useSelectedAccount,
67
useSelectedExtensions,
78
useAvailableExtensions,
89
useConnect,
9-
useConnectLocalStorage,
10+
useAccountLocalStorage,
11+
useExtLocalStorage,
1012
} from "./hooks"
1113
export { Provider as ConnectAccountsProvider } from "./extensionCtx"
1214
export type {

Diff for: packages/ui-react/lib/components/Connect/types.tsx

+14
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
import {
2+
InjectedPolkadotAccount,
3+
InjectedExtension,
4+
} from "polkadot-api/dist/reexports/pjs-signer"
5+
import { Dispatch, SetStateAction } from "react"
16
import { Any } from "../../utils"
27

38
export type ConnectConfiguration = ConfigType & CommonConfigType
@@ -43,3 +48,12 @@ export type NameUrlType = {
4348
name: string
4449
url: string
4550
}
51+
52+
export interface ConnectIF {
53+
selected?: InjectedPolkadotAccount
54+
setSelected: Dispatch<SetStateAction<InjectedPolkadotAccount>>
55+
config?: ConnectConfiguration
56+
type?: "onepage" | "extensions" | "split"
57+
onSelectExtensions?: (ext: Map<string, InjectedExtension>) => void
58+
getConnectedAccounts?: (acc: InjectedPolkadotAccount[]) => void
59+
}

Diff for: packages/ui-react/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@polkadot-ui/react",
33
"license": "MIT",
4-
"version": "0.0.1-alpha.31",
4+
"version": "0.0.1-alpha.33",
55
"author": "Nikolaos Kontakis<[email protected]>",
66
"type": "module",
77
"description": "Functional React components for Polkadot dApps.",

Diff for: sandbox/src/pages/ConnectPage.tsx

+8-39
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {
2-
Connect,
2+
ConnectModal,
33
ConnectConfiguration,
44
} from "@packages/ui-react/lib/components"
55
import { useState } from "react"
@@ -15,22 +15,12 @@ export const ConnectPage = () => {
1515
},
1616
}
1717

18+
console.log(selectedAccount)
19+
1820
return (
1921
<div className="page">
2022
<h1>Connect</h1>
2123
<p>Testing Polkadot Library Connect.</p>
22-
23-
{/* <div style={{ width: "100%", paddingTop: "10rem" }}>
24-
<h1 style={{ margin: "5rem 0" }}>Split</h1>
25-
<div style={{ border: "1px solid #ccc", padding: "1rem" }}>
26-
<Connect
27-
type="split"
28-
selected={selectedAccount}
29-
setSelected={setSelectedAccount}
30-
config={connectConfig}
31-
/>
32-
</div>
33-
</div> */}
3424
<div
3525
style={{
3626
width: "100%",
@@ -42,28 +32,11 @@ export const ConnectPage = () => {
4232
justifyContent: "space-between",
4333
}}
4434
>
45-
{/*
46-
<div
47-
style={{ width: "45%", border: "1px solid #ccc", padding: "1rem" }}
48-
>
49-
{selectedExtensions && (
50-
<ConnectAccountsProvider value={[...selectedExtensions.values()]}>
51-
<ConnectAccounts
52-
selected={selectedAccount}
53-
setSelected={setSelectedAccount}
54-
config={connectConfig}
55-
></ConnectAccounts>
56-
</ConnectAccountsProvider>
57-
)}
58-
</div>
59-
</div>
60-
</div> */}
61-
6235
<div style={{ width: "100%", paddingTop: "1rem" }}>
6336
<h1 style={{ margin: "5rem 0" }}>In a modal</h1>
6437
<div style={{ border: "1px solid #ccc", padding: "1rem" }}>
6538
<button onClick={() => setIsOpen(!isOpen)}>
66-
{!isOpen ? "Nothing" : "Open"}
39+
{!isOpen ? "Connect" : "Open"}
6740
</button>
6841
</div>
6942
</div>
@@ -77,14 +50,10 @@ export const ConnectPage = () => {
7750
height: "400px",
7851
}}
7952
>
80-
{/* <ConnectExtensions
81-
setSelected={setSelectedAccount}
82-
config={connectConfig}
83-
onSelectExtensions={(ext) => {
84-
setSelectedExtensions(ext)
85-
}}
86-
/> */}
87-
<Connect
53+
<ConnectModal
54+
title={"title"}
55+
onClose={() => setIsOpen(false)}
56+
show={isOpen}
8857
type="split"
8958
selected={selectedAccount}
9059
setSelected={setSelectedAccount}

0 commit comments

Comments
 (0)