Add NIP-07 login

This commit is contained in:
Kieran 2022-12-29 10:51:32 +00:00
parent 0b63f33f52
commit 987ef0ed7b
Signed by: Kieran
GPG Key ID: DE71CEB3925BE941
2 changed files with 36 additions and 10 deletions

View File

@ -1,6 +1,6 @@
import { useEffect, useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { setPrivateKey } from "../state/Login";
import { setPrivateKey, setPublicKey } from "../state/Login";
import * as secp from '@noble/secp256k1';
import { bech32 } from "bech32";
import { useNavigate } from "react-router-dom";
@ -8,7 +8,7 @@ import { useNavigate } from "react-router-dom";
export default function LoginPage() {
const dispatch = useDispatch();
const navigate = useNavigate();
const privateKey = useSelector(s => s.login.privateKey);
const publicKey = useSelector(s => s.login.publicKey);
const [key, setKey] = useState("");
function doLogin() {
@ -30,11 +30,34 @@ export default function LoginPage() {
}
}
async function doNip07Login() {
let pubKey = await window.nostr.getPublicKey();
dispatch(setPublicKey(pubKey));
}
function altLogins() {
let nip07 = 'nostr' in window;
if (!nip07) {
return null;
}
return (
<>
<h2>Other Login Methods</h2>
<div className="flex">
<div className="btn" onClick={(e) => doNip07Login()}>Login with Extension (NIP-07)</div>
</div>
</>
)
}
useEffect(() => {
if(privateKey) {
if (publicKey) {
navigate("/");
}
}, [privateKey]);
}, [publicKey]);
return (
<>
<h1>Login</h1>
@ -43,7 +66,7 @@ export default function LoginPage() {
<input type="text" placeholder="Private key" className="f-grow" onChange={e => setKey(e.target.value)} />
<div className="btn" onClick={(e) => doLogin()}>Login</div>
</div>
{altLogins()}
</>
);
}

View File

@ -44,6 +44,9 @@ const LoginSlice = createSlice({
window.localStorage.setItem(PrivateKeyItem, action.payload);
state.publicKey = secp.utils.bytesToHex(secp.schnorr.getPublicKey(action.payload, true));
},
setPublicKey: (state, action) => {
state.publicKey = action.payload;
},
setRelays: (state, action) => {
state.relays = action.payload;
},
@ -57,5 +60,5 @@ const LoginSlice = createSlice({
}
});
export const { init, setPrivateKey, setRelays, setFollows, logout } = LoginSlice.actions;
export const { init, setPrivateKey, setPublicKey, setRelays, setFollows, logout } = LoginSlice.actions;
export const reducer = LoginSlice.reducer;