Merge branch 'main' of github.com:joeltg/zk-group-sigs-server into main

This commit is contained in:
Uma Roy
2021-11-20 01:33:36 -05:00
6 changed files with 75 additions and 29 deletions

2
.gitignore vendored
View File

@@ -107,3 +107,5 @@ dist
# TernJS port file
.tern-port
.vercel

View File

@@ -6,8 +6,9 @@ import { UserIcon } from "components/UserIcon"
import type { Message } from "utils/types"
import { prove, revealOrDeny, verify } from "utils/prove"
import { User } from "utils/types"
function lookupTwitterProfileImage(publicKey: string, users: User) {
function lookupTwitterProfileImage(publicKey: string, users: User[]) {
return users.find((u) => u.publicKey === publicKey)?.twitterProfileImage
}
@@ -161,6 +162,7 @@ interface MessagesProps {
twitterHandle: string
verificationTweetId: string
}[]
users: User[]
}
export default function Messages({
@@ -170,9 +172,9 @@ export default function Messages({
selectedUsers,
users,
}: MessagesProps) {
const [newMessage, setNewMessage] = useState("")
const [newMessage, setNewMessage] = useState<string>("")
const [messages, setMessages] = useState([])
const [messages, setMessages] = useState<Message[]>([])
useEffect(() => {
setMessages(initialMessages)
}, [])
@@ -220,8 +222,8 @@ export default function Messages({
id: "",
group: hashes,
msgBody: newMessage,
serializedProof: proof,
serializedPublicSignals: publicSignals,
proof,
publicSignals,
msgAttestation: attestation,
reveal: null,
deny: [],

View File

@@ -13,6 +13,7 @@ import api from "next-rest/client"
export default function ConnectPage(props: {}) {
const secretKey = useRef<string | null>(null)
const publicKey = useRef<string | null>(null)
const [waiting, setWaiting] = useState<boolean>(false)
const [intent, setIntent] = useState<string | null>(null)
useEffect(() => {
secretKey.current = localStorage.getItem(
@@ -32,10 +33,14 @@ export default function ConnectPage(props: {}) {
const openTwitterIntent = useCallback((intent: string) => {
if (intent !== null) {
window.open(intent)
setWaiting(true)
setTimeout(() => setWaiting(false), 10000)
}
}, [])
const createUser = useCallback(() => {
setWaiting(true)
setTimeout(() => setWaiting(false), 5000)
if (secretKey.current !== null && publicKey.current !== null) {
const secret = secretKey.current
api
@@ -73,11 +78,14 @@ export default function ConnectPage(props: {}) {
</button>
)}
<button
className="block w-full cursor-pointer bg-pink hover:bg-midpink text-white rounded-xl px-4 py-2 mt-3"
className={`block w-full cursor-pointer bg-pink hover:bg-midpink text-white rounded-xl px-4 py-2 mt-3 ${
waiting ? "opacity-50" : ""
}`}
type="button"
disabled={!!waiting}
onClick={() => createUser()}
>
Check
{waiting ? "Wait 10 seconds..." : "Check"}
</button>
</div>
</div>

View File

@@ -10,10 +10,17 @@ import type { User, Message } from "utils/types"
import Messages from "components/Messages"
import { SelectUsers } from "components/SelectUsers"
import { getVKeys } from "utils/vkey"
import { AppContext } from "utils/context"
interface IndexPageProps {
users: User[]
initialMessages: Message[]
vkeys: {
sign: any
reveal: any
deny: any
}
}
export const getServerSideProps: GetServerSideProps<IndexPageProps, {}> =
@@ -55,8 +62,11 @@ export const getServerSideProps: GetServerSideProps<IndexPageProps, {}> =
},
})
const vkeys = getVKeys()
return {
props: {
vkeys,
users,
initialMessages: messages.map((message) => ({
group: message.group.map((user) => user.publicKey),
@@ -78,7 +88,11 @@ export const getServerSideProps: GetServerSideProps<IndexPageProps, {}> =
}
}
export default function IndexPage({ users, initialMessages }: IndexPageProps) {
export default function IndexPage({
vkeys,
users,
initialMessages,
}: IndexPageProps) {
const [secret, setSecret] = useState<null | string>(null)
const [publicKey, setPublicKey] = useState<null | string>(null)
@@ -102,26 +116,30 @@ export default function IndexPage({ users, initialMessages }: IndexPageProps) {
}, [])
return (
<div className="max-w-4xl m-auto font-mono">
<Header />
<div className="grid grid-cols-4 gap-6 pt-2">
<div className="col-span-3">
<Messages
publicKey={publicKey}
secret={secret}
initialMessages={initialMessages}
selectedUsers={selectedUsers.map((publicKey) => userMap[publicKey])}
users={users}
/>
</div>
<div className="col-span-1">
<SelectUsers
publicKey={publicKey}
users={users}
updateSelectedUsers={setSelectedUsers}
/>
<AppContext.Provider value={{ vkeys }}>
<div className="max-w-4xl m-auto font-mono">
<Header />
<div className="grid grid-cols-4 gap-6 pt-2">
<div className="col-span-3">
<Messages
publicKey={publicKey}
secret={secret}
initialMessages={initialMessages}
selectedUsers={selectedUsers.map(
(publicKey) => userMap[publicKey]
)}
users={users}
/>
</div>
<div className="col-span-1">
<SelectUsers
publicKey={publicKey}
users={users}
updateSelectedUsers={setSelectedUsers}
/>
</div>
</div>
</div>
</div>
</AppContext.Provider>
)
}

13
utils/context.ts Normal file
View File

@@ -0,0 +1,13 @@
import { createContext } from "react"
interface AppContextValue {
vkeys: {
sign: any
reveal: any
deny: any
}
}
export const AppContext = createContext<AppContextValue>({
vkeys: { sign: null, reveal: null, deny: null },
})

View File

@@ -2,6 +2,9 @@
import { readFileSync } from "fs"
export function getVKey(): any {
return JSON.parse(readFileSync("public/hash.vkey.json", "utf-8"))
export function getVKeys(): { sign: any; reveal: any; deny: any } {
const sign = JSON.parse(readFileSync("public/sign.vkey.json", "utf-8"))
const reveal = JSON.parse(readFileSync("public/reveal.vkey.json", "utf-8"))
const deny = JSON.parse(readFileSync("public/deny.vkey.json", "utf-8"))
return { sign, reveal, deny }
}