/
index.js
80 lines (69 loc) 路 2.48 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { useState, useEffect } from "react";
import { useStore } from "@/layout";
import styles from "@/styles/app.module.css";
import { HelloNearContract } from "../../config";
import { DocsCard, HelloComponentsCard } from "@/components/cards";
// Contract that the app will interact with
const CONTRACT = HelloNearContract;
export default function HelloNear() {
const { signedAccountId, wallet } = useStore();
const [greeting, setGreeting] = useState("loading...");
const [newGreeting, setNewGreeting] = useState("loading...");
const [loggedIn, setLoggedIn] = useState(false);
const [showSpinner, setShowSpinner] = useState(false);
useEffect(() => {
if (!wallet) return;
wallet.viewMethod({ contractId: CONTRACT, method: "get_greeting" }).then(
greeting => setGreeting(greeting)
);
}, [wallet]);
useEffect(() => {
setLoggedIn(!!signedAccountId);
}, [signedAccountId]);
const saveGreeting = async () => {
setShowSpinner(true);
await wallet.callMethod({ contractId: CONTRACT, method: "set_greeting", args: { greeting: newGreeting } });
const greeting = await wallet.viewMethod({ contractId: CONTRACT, method: "get_greeting" })
setGreeting(greeting)
setShowSpinner(false);
};
return (
<main className={styles.main}>
<div className={styles.description}>
<p>
Interacting with the contract:
<code className={styles.code}>{CONTRACT}</code>
</p>
</div>
<div className={styles.center}>
<h1 className="w-100">
The contract says: <code>{greeting}</code>
</h1>
<div className="input-group" hidden={!loggedIn}>
<input
type="text"
className="form-control w-20"
placeholder="Store a new greeting"
onChange={t => setNewGreeting(t.target.value)}
/>
<div className="input-group-append">
<button className="btn btn-secondary" onClick={saveGreeting}>
<span hidden={showSpinner}> Save </span>
<i
className="spinner-border spinner-border-sm"
hidden={!showSpinner}
></i>
</button>
</div>
</div>
<div className="w-100 text-end align-text-center" hidden={loggedIn}>
<p className="m-0"> Please login to change the greeting </p>
</div>
</div>
<div className={styles.grid}>
<DocsCard />
<HelloComponentsCard />
</div>
</main>
);
}