create-near-app 6.0.0-beta.2 → 6.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.js +6 -11
- package/dist/make.js +44 -81
- package/dist/messages.js +31 -23
- package/dist/package-json.js +16 -16
- package/dist/tracking.js +1 -1
- package/dist/types.js +5 -4
- package/dist/user-input.js +81 -89
- package/package.json +1 -1
- package/templates/contracts/{rust → rs}/Cargo.toml +0 -3
- package/templates/contracts/{rust → rs}/README.md +14 -5
- package/templates/contracts/rs/build.sh +3 -0
- package/templates/contracts/rs/deploy.sh +2 -0
- package/templates/contracts/{rust → rs}/src/lib.rs +4 -6
- package/templates/contracts/rs/test-rs.sh +9 -0
- package/templates/contracts/rs/test-ts.sh +10 -0
- package/templates/contracts/{js → ts}/README.md +1 -0
- package/templates/contracts/ts/package.json +20 -0
- package/templates/frontend/next/.eslintrc.json +3 -0
- package/templates/frontend/next/README.md +36 -0
- package/templates/frontend/next/jsconfig.json +7 -0
- package/templates/frontend/next/next.config.js +6 -0
- package/templates/frontend/next/package.json +40 -0
- package/templates/frontend/next/public/near-logo.svg +43 -0
- package/templates/frontend/next/public/near.svg +1 -0
- package/templates/frontend/next/src/app/app.module.css +228 -0
- package/templates/frontend/next/src/app/globals.css +95 -0
- package/templates/frontend/next/src/app/hello-components/page.js +44 -0
- package/templates/frontend/next/src/app/hello-near/page.js +64 -0
- package/templates/frontend/next/src/app/layout.js +22 -0
- package/templates/frontend/next/src/app/page.js +37 -0
- package/templates/frontend/next/src/components/cards.js +46 -0
- package/templates/frontend/next/src/components/navigation.js +36 -0
- package/templates/frontend/next/src/components/vm-component.js +26 -0
- package/templates/frontend/next/src/config.js +21 -0
- package/templates/frontend/next/src/wallets/wallet-selector.js +128 -0
- package/templates/frontend/{gateway/src/data/web3.ts → next/src/wallets/web3-wallet.ts} +4 -7
- package/templates/frontend/vanilla/.babelrc +7 -0
- package/templates/frontend/vanilla/package.json +27 -13
- package/templates/frontend/vanilla/{assets → src/assets}/global.css +25 -56
- package/templates/frontend/vanilla/src/components.html +61 -0
- package/templates/frontend/vanilla/src/components.js +63 -0
- package/templates/frontend/vanilla/src/hello-near.html +80 -0
- package/templates/frontend/vanilla/src/hello.js +61 -0
- package/templates/frontend/vanilla/src/index.html +65 -0
- package/templates/frontend/vanilla/{near-wallet.js → src/near-wallet.js} +20 -18
- package/templates/frontend/vanilla/webpack.config.js +79 -0
- package/templates/{integration-tests/rust-tests → sandbox-tests/sandbox-rs}/Cargo.toml +5 -5
- package/templates/{integration-tests/js-tests → sandbox-tests/sandbox-ts}/package.json +6 -6
- package/templates/contracts/js/build.sh +0 -5
- package/templates/contracts/js/deploy.sh +0 -18
- package/templates/contracts/js/package.json +0 -19
- package/templates/contracts/rust/build.sh +0 -6
- package/templates/contracts/rust/deploy.sh +0 -18
- package/templates/frontend/gateway/.env +0 -1
- package/templates/frontend/gateway/.nvmrc +0 -1
- package/templates/frontend/gateway/.prettierrc +0 -6
- package/templates/frontend/gateway/next.config.js +0 -15
- package/templates/frontend/gateway/package.json +0 -74
- package/templates/frontend/gateway/public/apple-touch-icon.png +0 -0
- package/templates/frontend/gateway/public/bos-meta.png +0 -0
- package/templates/frontend/gateway/public/favicon.png +0 -0
- package/templates/frontend/gateway/public/fonts/FKGrotesk.woff2 +0 -0
- package/templates/frontend/gateway/public/fonts/Mona-Sans.woff2 +0 -0
- package/templates/frontend/gateway/public/logo192.png +0 -0
- package/templates/frontend/gateway/public/robots.txt +0 -3
- package/templates/frontend/gateway/public/site.webmanifest +0 -8
- package/templates/frontend/gateway/src/assets/images/near-icon.svg +0 -3
- package/templates/frontend/gateway/src/components/MetaTags.tsx +0 -22
- package/templates/frontend/gateway/src/components/component/ComponentWrapperPage.tsx +0 -27
- package/templates/frontend/gateway/src/components/layouts/DefaultLayout.tsx +0 -16
- package/templates/frontend/gateway/src/components/layouts/SimpleLayout.tsx +0 -9
- package/templates/frontend/gateway/src/components/lib/Button/Button.tsx +0 -379
- package/templates/frontend/gateway/src/components/lib/Button/index.tsx +0 -1
- package/templates/frontend/gateway/src/components/lib/Spinner/Spinner.tsx +0 -33
- package/templates/frontend/gateway/src/components/lib/Spinner/index.ts +0 -1
- package/templates/frontend/gateway/src/components/lib/Text/Text.tsx +0 -14
- package/templates/frontend/gateway/src/components/lib/Text/index.tsx +0 -1
- package/templates/frontend/gateway/src/components/lib/Toast/README.md +0 -83
- package/templates/frontend/gateway/src/components/lib/Toast/Toast.tsx +0 -25
- package/templates/frontend/gateway/src/components/lib/Toast/Toaster.tsx +0 -48
- package/templates/frontend/gateway/src/components/lib/Toast/api.ts +0 -6
- package/templates/frontend/gateway/src/components/lib/Toast/index.ts +0 -3
- package/templates/frontend/gateway/src/components/lib/Toast/store.ts +0 -83
- package/templates/frontend/gateway/src/components/lib/Toast/styles.ts +0 -126
- package/templates/frontend/gateway/src/components/navigation/Navigation.tsx +0 -23
- package/templates/frontend/gateway/src/components/navigation/UserDropdownMenu.tsx +0 -209
- package/templates/frontend/gateway/src/components/navigation/desktop/DesktopNavigation.tsx +0 -109
- package/templates/frontend/gateway/src/components/navigation/desktop/MainNavigationMenu.tsx +0 -170
- package/templates/frontend/gateway/src/components/navigation/icons/close.svg +0 -22
- package/templates/frontend/gateway/src/components/navigation/icons/near-icon.svg +0 -3
- package/templates/frontend/gateway/src/components/navigation/icons/near-logo.svg +0 -14
- package/templates/frontend/gateway/src/components/navigation/icons/return.svg +0 -29
- package/templates/frontend/gateway/src/components/navigation/icons/search.svg +0 -3
- package/templates/frontend/gateway/src/components/navigation/mobile/AccordionMenu.tsx +0 -141
- package/templates/frontend/gateway/src/components/navigation/mobile/Menu.tsx +0 -86
- package/templates/frontend/gateway/src/components/navigation/mobile/MobileNavigation.tsx +0 -131
- package/templates/frontend/gateway/src/components/navigation/navigation-categories.ts +0 -75
- package/templates/frontend/gateway/src/components/vm/VmCommitButton.tsx +0 -20
- package/templates/frontend/gateway/src/components/vm/VmComponent.tsx +0 -29
- package/templates/frontend/gateway/src/components/vm/VmInitializer.tsx +0 -124
- package/templates/frontend/gateway/src/data/components.ts +0 -50
- package/templates/frontend/gateway/src/hooks/useBosComponents.ts +0 -14
- package/templates/frontend/gateway/src/hooks/useBosLoaderInitializer.ts +0 -60
- package/templates/frontend/gateway/src/hooks/useFlags.ts +0 -40
- package/templates/frontend/gateway/src/hooks/useLayout.tsx +0 -12
- package/templates/frontend/gateway/src/index.d.ts +0 -9
- package/templates/frontend/gateway/src/pages/_app.tsx +0 -47
- package/templates/frontend/gateway/src/pages/_document.tsx +0 -27
- package/templates/frontend/gateway/src/pages/dig.tsx +0 -25
- package/templates/frontend/gateway/src/pages/flags.tsx +0 -83
- package/templates/frontend/gateway/src/pages/hello-api.tsx +0 -105
- package/templates/frontend/gateway/src/pages/hello-component.tsx +0 -23
- package/templates/frontend/gateway/src/pages/hello-ethereum.tsx +0 -23
- package/templates/frontend/gateway/src/pages/hello-social.tsx +0 -31
- package/templates/frontend/gateway/src/pages/index.tsx +0 -51
- package/templates/frontend/gateway/src/pages/nui.tsx +0 -25
- package/templates/frontend/gateway/src/stores/auth.ts +0 -29
- package/templates/frontend/gateway/src/stores/bos-loader.ts +0 -20
- package/templates/frontend/gateway/src/stores/current-component.ts +0 -11
- package/templates/frontend/gateway/src/stores/vm.ts +0 -24
- package/templates/frontend/gateway/src/styles/globals.css +0 -68
- package/templates/frontend/gateway/src/styles/theme.css +0 -129
- package/templates/frontend/gateway/src/utils/config.ts +0 -49
- package/templates/frontend/gateway/src/utils/form-validation.ts +0 -18
- package/templates/frontend/gateway/src/utils/keypom-options.ts +0 -59
- package/templates/frontend/gateway/src/utils/route/privateRoute.tsx +0 -20
- package/templates/frontend/gateway/src/utils/route/signedOutRoute.tsx +0 -21
- package/templates/frontend/gateway/src/utils/types.ts +0 -33
- package/templates/frontend/gateway/tsconfig.json +0 -24
- package/templates/frontend/vanilla/.env +0 -1
- package/templates/frontend/vanilla/index.html +0 -97
- package/templates/frontend/vanilla/index.js +0 -70
- package/templates/shared/template.gitignore +0 -31
- /package/templates/contracts/{rust → rs}/.cargo/config +0 -0
- /package/templates/contracts/{rust → rs}/rust-toolchain.toml +0 -0
- /package/templates/contracts/{js → ts}/package-lock.json +0 -0
- /package/templates/contracts/{js → ts}/src/contract.ts +0 -0
- /package/templates/contracts/{js → ts}/tsconfig.json +0 -0
- /package/templates/frontend/{gateway → next}/public/next.svg +0 -0
- /package/templates/frontend/{gateway → next}/public/vercel.svg +0 -0
- /package/templates/frontend/{gateway/public → next/src/app}/favicon.ico +0 -0
- /package/templates/{shared → frontend/vanilla}/.gitpod.yml +0 -0
- /package/templates/{shared → frontend/vanilla}/README.md +0 -0
- /package/templates/frontend/vanilla/{assets → src/assets}/favicon.ico +0 -0
- /package/templates/frontend/vanilla/{assets → src/assets}/logo-black.svg +0 -0
- /package/templates/frontend/vanilla/{assets → src/assets}/logo-white.svg +0 -0
- /package/templates/{integration-tests/rust-tests → sandbox-tests/sandbox-rs}/src/tests.rs +0 -0
- /package/templates/{integration-tests/js-tests → sandbox-tests/sandbox-ts}/ava.config.cjs +0 -0
- /package/templates/{integration-tests/js-tests → sandbox-tests/sandbox-ts}/package-lock.json +0 -0
- /package/templates/{integration-tests/js-tests → sandbox-tests/sandbox-ts}/src/main.ava.ts +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
import { DocsCard, HelloComponentsCard } from '@/components/cards';
|
|
3
|
+
import { useWallet } from '@/wallets/wallet-selector';
|
|
4
|
+
import { useState, useEffect } from 'react'
|
|
5
|
+
import { HelloNearContract, NetworkId } from '../../config';
|
|
6
|
+
import styles from '../app.module.css'
|
|
7
|
+
|
|
8
|
+
// Contract that the app will interact with
|
|
9
|
+
const CONTRACT = HelloNearContract[NetworkId];
|
|
10
|
+
|
|
11
|
+
export default function HelloNear({ }) {
|
|
12
|
+
const { signedAccountId, viewMethod, callMethod } = useWallet()
|
|
13
|
+
|
|
14
|
+
const [greeting, setGreeting] = useState('loading...')
|
|
15
|
+
const [loggedIn, setLoggedIn] = useState(false)
|
|
16
|
+
const [showSpinner, setShowSpinner] = useState(false)
|
|
17
|
+
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
viewMethod && viewMethod(CONTRACT, 'get_greeting', {}).then(
|
|
20
|
+
greeting => setGreeting(greeting)
|
|
21
|
+
)
|
|
22
|
+
}, [viewMethod])
|
|
23
|
+
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
setLoggedIn(!!signedAccountId)
|
|
26
|
+
}, [signedAccountId])
|
|
27
|
+
|
|
28
|
+
const saveGreeting = async () => {
|
|
29
|
+
setShowSpinner(true)
|
|
30
|
+
await callMethod(CONTRACT, 'set_greeting', { greeting });
|
|
31
|
+
setShowSpinner(false)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<main className={styles.main}>
|
|
36
|
+
<div className={styles.description}>
|
|
37
|
+
<p>
|
|
38
|
+
Interacting with the contract:
|
|
39
|
+
<code className={styles.code}>{CONTRACT}</code>
|
|
40
|
+
</p>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<div className={styles.center}>
|
|
44
|
+
<h1 className="w-100"> The contract says: <code>{greeting}</code> </h1>
|
|
45
|
+
<div className="input-group" hidden={!loggedIn}>
|
|
46
|
+
<input type="text" className="form-control w-20" placeholder="Store a new greeting" onChange={t => { setGreeting(t.target.value) }} />
|
|
47
|
+
<div className="input-group-append">
|
|
48
|
+
<button className="btn btn-secondary" onClick={saveGreeting}>
|
|
49
|
+
<span hidden={showSpinner}> Save </span>
|
|
50
|
+
<i className="spinner-border spinner-border-sm" hidden={!showSpinner}></i>
|
|
51
|
+
</button>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
<div className='w-100 text-end align-text-center' hidden={loggedIn}>
|
|
55
|
+
<p className='m-0'> Please login to change the greeting </p>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
<div className={styles.grid}>
|
|
59
|
+
<DocsCard />
|
|
60
|
+
<HelloComponentsCard />
|
|
61
|
+
</div>
|
|
62
|
+
</main>
|
|
63
|
+
)
|
|
64
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
import './globals.css'
|
|
3
|
+
import '@near-wallet-selector/modal-ui/styles.css';
|
|
4
|
+
|
|
5
|
+
import { ComponentMap, NetworkId } from '@/config';
|
|
6
|
+
import { Navigation } from '@/components/navigation';
|
|
7
|
+
import { initWallet } from '@/wallets/wallet-selector';
|
|
8
|
+
|
|
9
|
+
export default function RootLayout({ children }) {
|
|
10
|
+
|
|
11
|
+
const createAccessKeyFor = ComponentMap[NetworkId].socialDB;
|
|
12
|
+
initWallet({ createAccessKeyFor });
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<html lang="en">
|
|
16
|
+
<body>
|
|
17
|
+
<Navigation />
|
|
18
|
+
{children}
|
|
19
|
+
</body>
|
|
20
|
+
</html>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import Image from 'next/image'
|
|
2
|
+
import styles from './app.module.css'
|
|
3
|
+
import { DocsCard, HelloComponentsCard, HelloNearCard } from '@/components/cards'
|
|
4
|
+
|
|
5
|
+
export default function Home({ }) {
|
|
6
|
+
return (
|
|
7
|
+
<main className={styles.main}>
|
|
8
|
+
<div className={styles.description}> </div>
|
|
9
|
+
|
|
10
|
+
<div className={styles.center}>
|
|
11
|
+
<Image
|
|
12
|
+
className={styles.logo}
|
|
13
|
+
src="/near.svg"
|
|
14
|
+
alt="Next.js Logo"
|
|
15
|
+
width={110 * 1.5}
|
|
16
|
+
height={28 * 1.5}
|
|
17
|
+
priority
|
|
18
|
+
/>
|
|
19
|
+
<h3 className="ms-2 me-3 text-dark"> + </h3>
|
|
20
|
+
<Image
|
|
21
|
+
className={styles.logo}
|
|
22
|
+
src="/next.svg"
|
|
23
|
+
alt="Next.js Logo"
|
|
24
|
+
width={300 * .58}
|
|
25
|
+
height={61 * .58}
|
|
26
|
+
priority
|
|
27
|
+
/>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div className={styles.grid}>
|
|
31
|
+
<HelloComponentsCard />
|
|
32
|
+
<HelloNearCard />
|
|
33
|
+
<DocsCard />
|
|
34
|
+
</div>
|
|
35
|
+
</main>
|
|
36
|
+
)
|
|
37
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import styles from '../app/app.module.css';
|
|
2
|
+
|
|
3
|
+
export const DocsCard = () => {
|
|
4
|
+
return (
|
|
5
|
+
<a
|
|
6
|
+
href="https://docs.near.org/develop/integrate/quickstart-frontend"
|
|
7
|
+
className={styles.card}
|
|
8
|
+
target='_blank'
|
|
9
|
+
rel="noopener noreferrer"
|
|
10
|
+
>
|
|
11
|
+
<h2>
|
|
12
|
+
Near Docs <span>-></span>
|
|
13
|
+
</h2>
|
|
14
|
+
<p>Learn how this application works, and what you can build on Near.</p>
|
|
15
|
+
</a>);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const HelloNearCard = () => {
|
|
19
|
+
return (
|
|
20
|
+
<a
|
|
21
|
+
href="/hello-near"
|
|
22
|
+
className={styles.card}
|
|
23
|
+
rel="noopener noreferrer"
|
|
24
|
+
>
|
|
25
|
+
<h2>
|
|
26
|
+
Near Integration <span>-></span>
|
|
27
|
+
</h2>
|
|
28
|
+
<p>Discover how simple it is to interact with a Near smart contract.</p>
|
|
29
|
+
</a>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const HelloComponentsCard = () => {
|
|
34
|
+
return (
|
|
35
|
+
<a
|
|
36
|
+
href="/hello-components"
|
|
37
|
+
className={styles.card}
|
|
38
|
+
rel="noopener noreferrer"
|
|
39
|
+
>
|
|
40
|
+
<h2>
|
|
41
|
+
Web3 Components <span>-></span>
|
|
42
|
+
</h2>
|
|
43
|
+
<p>See how Web3 components can help you to create multi-chain apps.</p>
|
|
44
|
+
</a>
|
|
45
|
+
)
|
|
46
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import Image from 'next/image';
|
|
2
|
+
import Link from 'next/link';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
|
|
5
|
+
import NearLogo from 'public/near-logo.svg';
|
|
6
|
+
import { useWallet } from '@/wallets/wallet-selector';
|
|
7
|
+
|
|
8
|
+
export const Navigation = () => {
|
|
9
|
+
|
|
10
|
+
const { signedAccountId, logOut, logIn } = useWallet()
|
|
11
|
+
const [action, setAction] = useState(() => { })
|
|
12
|
+
const [label, setLabel] = useState('Loading...')
|
|
13
|
+
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (signedAccountId) {
|
|
16
|
+
setAction(() => logOut)
|
|
17
|
+
setLabel(`Logout ${signedAccountId}`)
|
|
18
|
+
} else {
|
|
19
|
+
setAction(() => logIn)
|
|
20
|
+
setLabel('Login')
|
|
21
|
+
}
|
|
22
|
+
}, [signedAccountId, logOut, logIn, setAction, setLabel]);
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<nav className="navbar navbar-expand-lg">
|
|
26
|
+
<div className="container-fluid">
|
|
27
|
+
<Link href="/" passHref legacyBehavior>
|
|
28
|
+
<Image priority src={NearLogo} alt="NEAR" width="30" height="24" className="d-inline-block align-text-top" />
|
|
29
|
+
</Link>
|
|
30
|
+
<div className='navbar-nav pt-1'>
|
|
31
|
+
<button className="btn btn-secondary" onClick={action} > {label} </button>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</nav>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { useInitNear, Widget, EthersProviderContext } from 'near-social-vm';
|
|
4
|
+
|
|
5
|
+
import { useWallet } from '@/wallets/wallet-selector';
|
|
6
|
+
import { useEthersProviderContext } from '@/wallets/web3-wallet';
|
|
7
|
+
import { NetworkId } from '@/config';
|
|
8
|
+
|
|
9
|
+
export default function Component({ src }) {
|
|
10
|
+
const ethersContext = useEthersProviderContext();
|
|
11
|
+
const { selector } = useWallet();
|
|
12
|
+
const { initNear } = useInitNear();
|
|
13
|
+
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
initNear && selector && initNear({ networkId: NetworkId, selector });
|
|
16
|
+
}, [initNear, selector]);
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<div>
|
|
20
|
+
<EthersProviderContext.Provider value={ethersContext}>
|
|
21
|
+
<Widget src={src} />
|
|
22
|
+
</EthersProviderContext.Provider>
|
|
23
|
+
<p className="mt-4 small"> <span className="text-secondary">Source:</span> <a href={`https://near.social/mob.near/widget/WidgetSource?src=${src}`}> {src} </a> </p>
|
|
24
|
+
</div>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const NetworkId = 'testnet';
|
|
2
|
+
|
|
3
|
+
export const HelloNearContract = {
|
|
4
|
+
mainnet: 'hello.near-examples.near',
|
|
5
|
+
testnet: 'hello.near-examples.testnet',
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const ComponentMap = {
|
|
9
|
+
mainnet: {
|
|
10
|
+
socialDB: 'social.near',
|
|
11
|
+
Lido: 'zavodil.near/widget/Lido',
|
|
12
|
+
HelloNear: 'gagdiez.near/widget/HelloNear',
|
|
13
|
+
LoveNear: 'gagdiez.near/widget/LoveNear',
|
|
14
|
+
},
|
|
15
|
+
testnet: {
|
|
16
|
+
socialDB: 'v1.social08.testnet',
|
|
17
|
+
Lido: 'influencer.testnet/widget/Lido',
|
|
18
|
+
HelloNear: 'influencer.testnet/widget/HelloNear',
|
|
19
|
+
LoveNear: 'influencer.testnet/widget/LoveNear',
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { create as createStore } from 'zustand';
|
|
2
|
+
import { distinctUntilChanged, map } from "rxjs";
|
|
3
|
+
import { providers } from 'near-api-js';
|
|
4
|
+
import { setupWalletSelector } from '@near-wallet-selector/core';
|
|
5
|
+
import { setupModal } from '@near-wallet-selector/modal-ui';
|
|
6
|
+
import { setupMyNearWallet } from '@near-wallet-selector/my-near-wallet';
|
|
7
|
+
import { setupHereWallet } from '@near-wallet-selector/here-wallet';
|
|
8
|
+
|
|
9
|
+
import { NetworkId } from '@/config';
|
|
10
|
+
import { useEffect, useState } from 'react';
|
|
11
|
+
|
|
12
|
+
export const useWallet = createStore(set => ({
|
|
13
|
+
signedAccountId: '',
|
|
14
|
+
logOut: undefined,
|
|
15
|
+
logIn: undefined,
|
|
16
|
+
selector: undefined,
|
|
17
|
+
viewMethod: undefined,
|
|
18
|
+
callMethod: undefined,
|
|
19
|
+
setLogActions: ({ logOut, logIn }) => set({ logOut, logIn }),
|
|
20
|
+
setAuth: ({ signedAccountId }) => set({ signedAccountId }),
|
|
21
|
+
setMethods: ({ viewMethod, callMethod }) => set({ viewMethod, callMethod }),
|
|
22
|
+
setStoreSelector: ({ selector }) => set({ selector }),
|
|
23
|
+
}));
|
|
24
|
+
|
|
25
|
+
export function initWallet({ createAccessKeyFor }) {
|
|
26
|
+
const setAuth = useWallet(store => store.setAuth);
|
|
27
|
+
const setLogActions = useWallet(store => store.setLogActions);
|
|
28
|
+
const setMethods = useWallet(store => store.setMethods);
|
|
29
|
+
const setStoreSelector = useWallet(store => store.setStoreSelector);
|
|
30
|
+
const [selector, setSelector] = useState(undefined);
|
|
31
|
+
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
console.log('initWallet')
|
|
34
|
+
const selector = setupWalletSelector({
|
|
35
|
+
network: NetworkId,
|
|
36
|
+
modules: [setupMyNearWallet(), setupHereWallet()]
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
setSelector(selector);
|
|
40
|
+
setStoreSelector({ selector });
|
|
41
|
+
}, []);
|
|
42
|
+
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
console.log('selector then')
|
|
45
|
+
if(!selector) return;
|
|
46
|
+
|
|
47
|
+
selector.then(walletSelector => {
|
|
48
|
+
const accounts = walletSelector.store.getState().accounts
|
|
49
|
+
const signedAccountId = accounts.find((account) => account.active)?.accountId || '';
|
|
50
|
+
setAuth({ signedAccountId });
|
|
51
|
+
|
|
52
|
+
walletSelector.store.observable
|
|
53
|
+
.pipe(
|
|
54
|
+
map((state) => state.accounts),
|
|
55
|
+
distinctUntilChanged()
|
|
56
|
+
)
|
|
57
|
+
.subscribe((accounts) => {
|
|
58
|
+
console.log("accounts", accounts)
|
|
59
|
+
const signedAccountId = accounts.find((account) => account.active)?.accountId || '';
|
|
60
|
+
setAuth({ signedAccountId });
|
|
61
|
+
});
|
|
62
|
+
})
|
|
63
|
+
}, [selector, setAuth]);
|
|
64
|
+
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
console.log('actions')
|
|
67
|
+
|
|
68
|
+
if(!selector) return;
|
|
69
|
+
|
|
70
|
+
// defined logOut and logIn actions
|
|
71
|
+
const logOut = async () => {
|
|
72
|
+
const wallet = await (await selector).wallet();
|
|
73
|
+
await wallet.signOut();
|
|
74
|
+
setAuth({ signedAccountId: '' });
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const logIn = async () => {
|
|
78
|
+
const modal = setupModal(await selector, { contractId: createAccessKeyFor });
|
|
79
|
+
modal.show();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
setLogActions({ logOut, logIn });
|
|
83
|
+
}, [selector, setAuth]);
|
|
84
|
+
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
console.log('methods')
|
|
87
|
+
|
|
88
|
+
if(!selector) return;
|
|
89
|
+
|
|
90
|
+
const viewMethod = async (contractId, method, args = {}) => {
|
|
91
|
+
const { network } = (await selector).options;
|
|
92
|
+
const provider = new providers.JsonRpcProvider({ url: network.nodeUrl });
|
|
93
|
+
|
|
94
|
+
let res = await provider.query({
|
|
95
|
+
request_type: 'call_function',
|
|
96
|
+
account_id: contractId,
|
|
97
|
+
method_name: method,
|
|
98
|
+
args_base64: Buffer.from(JSON.stringify(args)).toString('base64'),
|
|
99
|
+
finality: 'optimistic',
|
|
100
|
+
});
|
|
101
|
+
return JSON.parse(Buffer.from(res.result).toString());
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const callMethod = async (contractId, method, args = {}, gas = '30000000000000', deposit = 0) => {
|
|
105
|
+
const wallet = await (await selector).wallet();
|
|
106
|
+
|
|
107
|
+
const outcome = await wallet.signAndSendTransaction({
|
|
108
|
+
receiverId: contractId,
|
|
109
|
+
actions: [
|
|
110
|
+
{
|
|
111
|
+
type: 'FunctionCall',
|
|
112
|
+
params: {
|
|
113
|
+
methodName: method,
|
|
114
|
+
args,
|
|
115
|
+
gas,
|
|
116
|
+
deposit,
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
return providers.getTransactionLastResult(outcome)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
setMethods({ viewMethod, callMethod });
|
|
126
|
+
|
|
127
|
+
}, [selector]);
|
|
128
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
'use client';
|
|
1
2
|
import type { EIP1193Provider } from '@web3-onboard/core';
|
|
2
3
|
import injectedModule from '@web3-onboard/injected-wallets';
|
|
3
4
|
import ledgerModule from '@web3-onboard/ledger';
|
|
@@ -6,8 +7,6 @@ import walletConnectModule from '@web3-onboard/walletconnect';
|
|
|
6
7
|
import { useEffect, useState } from 'react';
|
|
7
8
|
import { singletonHook } from 'react-singleton-hook';
|
|
8
9
|
|
|
9
|
-
import icon from '@/assets/images/near-icon.svg';
|
|
10
|
-
|
|
11
10
|
const web3onboardKey = 'web3-onboard:connectedWallets';
|
|
12
11
|
|
|
13
12
|
const wcV2InitOptions: any = {
|
|
@@ -231,8 +230,8 @@ export const onboard = init({
|
|
|
231
230
|
],
|
|
232
231
|
appMetadata: {
|
|
233
232
|
name: 'NEAR',
|
|
234
|
-
icon:
|
|
235
|
-
description: 'NEAR
|
|
233
|
+
icon: '/next.svg',
|
|
234
|
+
description: 'NEAR',
|
|
236
235
|
},
|
|
237
236
|
theme: 'dark',
|
|
238
237
|
containerElements: {
|
|
@@ -258,8 +257,6 @@ export const useEthersProviderContext = singletonHook(defaultEthersProviderConte
|
|
|
258
257
|
|
|
259
258
|
const walletsSub = onboard.state.select('wallets');
|
|
260
259
|
|
|
261
|
-
// TODO: do we need to unsubscribe?
|
|
262
|
-
// const { unsubscribe } = walletsSub.subscribe((wallets) => {
|
|
263
260
|
walletsSub.subscribe((wallets) => {
|
|
264
261
|
const connectedWallets = wallets.map(({ label }) => label);
|
|
265
262
|
localStorage.setItem(web3onboardKey, JSON.stringify(connectedWallets));
|
|
@@ -289,4 +286,4 @@ export const useEthersProviderContext = singletonHook(defaultEthersProviderConte
|
|
|
289
286
|
}, [wallet]);
|
|
290
287
|
|
|
291
288
|
return ethersProvider;
|
|
292
|
-
});
|
|
289
|
+
});
|
|
@@ -3,27 +3,41 @@
|
|
|
3
3
|
"version": "1.0.0",
|
|
4
4
|
"license": "(MIT AND Apache-2.0)",
|
|
5
5
|
"scripts": {
|
|
6
|
-
"
|
|
7
|
-
"dev": "parcel index.html --open",
|
|
8
|
-
"build": "parcel build index.html --public-url ./"
|
|
6
|
+
"dev": "webpack serve --open"
|
|
9
7
|
},
|
|
10
8
|
"devDependencies": {
|
|
11
|
-
"
|
|
12
|
-
"
|
|
9
|
+
"@babel/core": "^7.23.2",
|
|
10
|
+
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
|
11
|
+
"@babel/plugin-transform-class-properties": "^7.18.6",
|
|
12
|
+
"@babel/preset-env": "^7.23.2",
|
|
13
|
+
"@babel/preset-react": "^7.22.15",
|
|
14
|
+
"babel-loader": "^9.1.3",
|
|
15
|
+
"buffer": "^6.0.3",
|
|
16
|
+
"copy-webpack-plugin": "^11.0.0",
|
|
17
|
+
"css-loader": "^6.8.1",
|
|
18
|
+
"html-webpack-plugin": "^5.5.3",
|
|
13
19
|
"https-browserify": "^1.0.0",
|
|
14
|
-
"nodemon": "^2.0.16",
|
|
15
|
-
"parcel": "^2.7.0",
|
|
16
20
|
"process": "^0.11.10",
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"url": "^0.11.
|
|
21
|
+
"stream-http": "^3.2.0",
|
|
22
|
+
"style-loader": "^3.3.3",
|
|
23
|
+
"url": "^0.11.3",
|
|
24
|
+
"webpack": "^5.89.0",
|
|
25
|
+
"webpack-cli": "^5.1.4",
|
|
26
|
+
"webpack-dev-server": "^4.15.1"
|
|
20
27
|
},
|
|
21
28
|
"dependencies": {
|
|
22
29
|
"@near-wallet-selector/core": "^8.7.0",
|
|
23
|
-
"@near-wallet-selector/
|
|
30
|
+
"@near-wallet-selector/here-wallet": "^8.7.0",
|
|
24
31
|
"@near-wallet-selector/modal-ui": "^8.7.0",
|
|
25
32
|
"@near-wallet-selector/my-near-wallet": "^8.7.0",
|
|
26
|
-
"
|
|
27
|
-
"near-api-js": "^2.1.4"
|
|
33
|
+
"crypto-browserify": "^3.12.0",
|
|
34
|
+
"near-api-js": "^2.1.4",
|
|
35
|
+
"near-social-vm": "github:NearSocial/VM#2.5.2",
|
|
36
|
+
"prop-types": "^15.8.1",
|
|
37
|
+
"react": "^18.2.0",
|
|
38
|
+
"react-dom": "^18.2.0",
|
|
39
|
+
"react-router-dom": "^6.18.0",
|
|
40
|
+
"semantic-ui-react": "^2.1.4",
|
|
41
|
+
"stream": "^0.0.2"
|
|
28
42
|
}
|
|
29
43
|
}
|
|
@@ -12,40 +12,47 @@ html {
|
|
|
12
12
|
--primary: #FF585D;
|
|
13
13
|
--secondary: #0072CE;
|
|
14
14
|
|
|
15
|
-
background-color: var(--bg);
|
|
16
15
|
color: var(--fg);
|
|
17
|
-
font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,
|
|
16
|
+
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Noto Sans, Ubuntu, Droid Sans, Helvetica Neue, sans-serif;
|
|
18
17
|
font-size: calc(0.9em + 0.5vw);
|
|
19
18
|
line-height: 1.3;
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
body {
|
|
23
22
|
margin: 0;
|
|
24
|
-
|
|
23
|
+
height: 100vh;
|
|
24
|
+
background: linear-gradient(to bottom, transparent, rgb(var(--shadow))) rgb(var(--light-gray));
|
|
25
|
+
background-color: var(--shadow) !important;
|
|
25
26
|
}
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
a {
|
|
29
|
+
color: var(--fg) !important;
|
|
30
|
+
text-decoration: none !important;
|
|
30
31
|
}
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
.container{
|
|
34
|
+
display: flex;
|
|
35
|
+
flex: 1;
|
|
36
|
+
flex-direction: column;
|
|
37
|
+
justify-content: space-between;
|
|
38
|
+
align-items: center;
|
|
39
|
+
padding: 2rem;
|
|
40
|
+
padding-top: 0;
|
|
41
|
+
}
|
|
33
42
|
|
|
34
43
|
h1 {
|
|
35
|
-
background-image: url(./logo-black.svg);
|
|
36
|
-
background-position: center 1em;
|
|
37
|
-
background-repeat: no-repeat;
|
|
38
|
-
background-size: auto 1.5em;
|
|
39
|
-
margin-top: 0;
|
|
40
|
-
padding: 3.5em 0 0;
|
|
41
44
|
text-align: center;
|
|
42
45
|
font-size: 1.5em;
|
|
43
46
|
}
|
|
47
|
+
|
|
44
48
|
.greeting {
|
|
45
49
|
color: var(--secondary);
|
|
46
50
|
text-decoration: underline;
|
|
47
51
|
}
|
|
48
|
-
|
|
52
|
+
|
|
53
|
+
.alert{
|
|
54
|
+
max-width: 410px;
|
|
55
|
+
font-size: 13px;
|
|
49
56
|
text-align: center;
|
|
50
57
|
}
|
|
51
58
|
|
|
@@ -53,22 +60,6 @@ h2 {
|
|
|
53
60
|
pointer-events: none;
|
|
54
61
|
}
|
|
55
62
|
|
|
56
|
-
ul.information {
|
|
57
|
-
margin: 2em 0 2em 0;
|
|
58
|
-
padding: 0;
|
|
59
|
-
text-align: left;
|
|
60
|
-
font-size: 0.8em;
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
.information li:first-child {
|
|
64
|
-
border-top: 1px solid var(--light-gray);
|
|
65
|
-
}
|
|
66
|
-
.information li {
|
|
67
|
-
padding: 0.5em 0;
|
|
68
|
-
border-bottom: 1px solid var(--light-gray);
|
|
69
|
-
list-style: none;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
63
|
.change {
|
|
73
64
|
display: flex;
|
|
74
65
|
flex-direction: column;
|
|
@@ -76,7 +67,6 @@ ul.information {
|
|
|
76
67
|
justify-content: space-evenly;
|
|
77
68
|
align-items: stretch;
|
|
78
69
|
font-size: 1em;
|
|
79
|
-
border: 2px solid var(--light-gray);
|
|
80
70
|
padding: 0.5em;
|
|
81
71
|
}
|
|
82
72
|
.change > div {
|
|
@@ -90,12 +80,6 @@ ul.information {
|
|
|
90
80
|
border-bottom-right-radius: 0;
|
|
91
81
|
border-top-right-radius: 0;
|
|
92
82
|
}
|
|
93
|
-
.change label {
|
|
94
|
-
display: block;
|
|
95
|
-
text-align: left;
|
|
96
|
-
margin-right: 10px;
|
|
97
|
-
padding-bottom: 0.5em;
|
|
98
|
-
}
|
|
99
83
|
.change button {
|
|
100
84
|
border-bottom-left-radius: 0;
|
|
101
85
|
border-top-left-radius: 0;
|
|
@@ -122,30 +106,15 @@ button, input {
|
|
|
122
106
|
outline: none;
|
|
123
107
|
}
|
|
124
108
|
|
|
125
|
-
|
|
109
|
+
.please-wait .change button {
|
|
126
110
|
position: relative;
|
|
127
111
|
pointer-events: none;
|
|
128
|
-
background-color: white;
|
|
129
112
|
}
|
|
130
|
-
|
|
113
|
+
.please-wait .change button span {
|
|
131
114
|
visibility: hidden;
|
|
132
115
|
}
|
|
133
116
|
|
|
134
|
-
button {
|
|
135
|
-
background-color: var(--secondary);
|
|
136
|
-
border-radius: 5px;
|
|
137
|
-
border: none;
|
|
138
|
-
color: #efefef;
|
|
139
|
-
cursor: pointer;
|
|
140
|
-
padding: 0.3em 0.75em;
|
|
141
|
-
transition: transform 30ms;
|
|
142
|
-
}
|
|
143
|
-
button:hover, button:focus {
|
|
144
|
-
box-shadow: 0 0 10em rgba(255, 255, 255, 0.2) inset;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
117
|
input {
|
|
148
|
-
background-color: var(--light-gray);
|
|
149
118
|
border: none;
|
|
150
119
|
border-radius: 5px 0 0 5px;
|
|
151
120
|
caret-color: var(--primary);
|
|
@@ -184,8 +153,8 @@ li {
|
|
|
184
153
|
}
|
|
185
154
|
}
|
|
186
155
|
|
|
187
|
-
|
|
188
|
-
|
|
156
|
+
.please-wait .loader,
|
|
157
|
+
.please-wait .loader:after{
|
|
189
158
|
display: inline-block;
|
|
190
159
|
}
|
|
191
160
|
.loader,
|