mirror of
https://github.com/0xPARC/zkmessage.xyz.git
synced 2026-01-10 14:57:55 -05:00
Merge branch 'main' of github.com:joeltg/zk-group-sigs-server into main
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -107,3 +107,5 @@ dist
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
.vercel
|
||||
|
||||
@@ -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: [],
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
13
utils/context.ts
Normal 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 },
|
||||
})
|
||||
@@ -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 }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user