feat: export nsec
All checks were successful
Release to Staging / build_and_release (push) Successful in 41s
All checks were successful
Release to Staging / build_and_release (push) Successful in 41s
This commit is contained in:
parent
0c74bfbb58
commit
62a8207bcd
@ -185,7 +185,7 @@ export const ModForm = ({ existingModData }: ModFormProps) => {
|
|||||||
|
|
||||||
let hexPubkey: string
|
let hexPubkey: string
|
||||||
|
|
||||||
if (userState.isAuth && userState.user?.pubkey) {
|
if (userState.auth && userState.user?.pubkey) {
|
||||||
hexPubkey = userState.user.pubkey as string
|
hexPubkey = userState.user.pubkey as string
|
||||||
} else {
|
} else {
|
||||||
hexPubkey = (await window.nostr?.getPublicKey()) as string
|
hexPubkey = (await window.nostr?.getPublicKey()) as string
|
||||||
|
@ -11,7 +11,7 @@ import { ZapButtons, ZapPresets, ZapQR } from '../components/Zap'
|
|||||||
import { MetadataController, ZapController } from '../controllers'
|
import { MetadataController, ZapController } from '../controllers'
|
||||||
import { useAppDispatch, useAppSelector } from '../hooks'
|
import { useAppDispatch, useAppSelector } from '../hooks'
|
||||||
import { appRoutes } from '../routes'
|
import { appRoutes } from '../routes'
|
||||||
import { setIsAuth, setUser } from '../store/reducers/user'
|
import { setAuth, setUser } from '../store/reducers/user'
|
||||||
import mainStyles from '../styles//main.module.scss'
|
import mainStyles from '../styles//main.module.scss'
|
||||||
import navStyles from '../styles/nav.module.scss'
|
import navStyles from '../styles/nav.module.scss'
|
||||||
import '../styles/popup.css'
|
import '../styles/popup.css'
|
||||||
@ -29,10 +29,15 @@ export const Header = () => {
|
|||||||
noBanner: true,
|
noBanner: true,
|
||||||
onAuth: (npub, opts) => {
|
onAuth: (npub, opts) => {
|
||||||
if (opts.type === 'logout') {
|
if (opts.type === 'logout') {
|
||||||
dispatch(setIsAuth(false))
|
dispatch(setAuth(null))
|
||||||
dispatch(setUser(null))
|
dispatch(setUser(null))
|
||||||
} else {
|
} else {
|
||||||
dispatch(setIsAuth(true))
|
dispatch(
|
||||||
|
setAuth({
|
||||||
|
method: opts.method,
|
||||||
|
localNsec: opts.localNsec
|
||||||
|
})
|
||||||
|
)
|
||||||
dispatch(
|
dispatch(
|
||||||
setUser({
|
setUser({
|
||||||
npub,
|
npub,
|
||||||
@ -128,7 +133,7 @@ export const Header = () => {
|
|||||||
</svg>
|
</svg>
|
||||||
Settings
|
Settings
|
||||||
</Link>
|
</Link>
|
||||||
{!userState.isAuth && (
|
{!userState.auth && (
|
||||||
<a
|
<a
|
||||||
id='loginNav'
|
id='loginNav'
|
||||||
className={navStyles.NMTI_SecInside_Link}
|
className={navStyles.NMTI_SecInside_Link}
|
||||||
@ -141,7 +146,7 @@ export const Header = () => {
|
|||||||
Login
|
Login
|
||||||
</a>
|
</a>
|
||||||
)}
|
)}
|
||||||
{userState.isAuth && userState.user && (
|
{userState.auth && userState.user && (
|
||||||
<div className={navStyles.NMTI_SecInside_Link}>
|
<div className={navStyles.NMTI_SecInside_Link}>
|
||||||
{userState.user.image && (
|
{userState.user.image && (
|
||||||
<img
|
<img
|
||||||
@ -231,7 +236,7 @@ const TipButtonWithDialog = React.memo(() => {
|
|||||||
setIsLoading(true)
|
setIsLoading(true)
|
||||||
setLoadingSpinnerDesc('Getting user pubkey')
|
setLoadingSpinnerDesc('Getting user pubkey')
|
||||||
|
|
||||||
if (userState.isAuth && userState.user?.pubkey) {
|
if (userState.auth && userState.user?.pubkey) {
|
||||||
userHexKey = userState.user.pubkey as string
|
userHexKey = userState.user.pubkey as string
|
||||||
} else {
|
} else {
|
||||||
userHexKey = (await window.nostr?.getPublicKey()) as string
|
userHexKey = (await window.nostr?.getPublicKey()) as string
|
||||||
|
@ -230,7 +230,7 @@ const Game = ({ game, author }: GameProps) => {
|
|||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
<div className={`dropdown-menu dropdown-menu-end dropdownMainMenu`}>
|
<div className={`dropdown-menu dropdown-menu-end dropdownMainMenu`}>
|
||||||
{userState.isAuth && userState.user?.pubkey === author && (
|
{userState.auth && userState.user?.pubkey === author && (
|
||||||
<a
|
<a
|
||||||
className='dropdown-item dropdownMainMenuItem'
|
className='dropdown-item dropdownMainMenuItem'
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
@ -1110,7 +1110,7 @@ const ZapMod = ({ modDetails }: ZapModProps) => {
|
|||||||
setIsLoading(true)
|
setIsLoading(true)
|
||||||
setLoadingSpinnerDesc('Getting user pubkey')
|
setLoadingSpinnerDesc('Getting user pubkey')
|
||||||
|
|
||||||
if (userState.isAuth && userState.user?.pubkey) {
|
if (userState.auth && userState.user?.pubkey) {
|
||||||
userHexKey = userState.user.pubkey as string
|
userHexKey = userState.user.pubkey as string
|
||||||
} else {
|
} else {
|
||||||
userHexKey = (await window.nostr?.getPublicKey()) as string
|
userHexKey = (await window.nostr?.getPublicKey()) as string
|
||||||
@ -1275,7 +1275,7 @@ const ZapSite = () => {
|
|||||||
setIsLoading(true)
|
setIsLoading(true)
|
||||||
setLoadingSpinnerDesc('Getting user pubkey')
|
setLoadingSpinnerDesc('Getting user pubkey')
|
||||||
|
|
||||||
if (userState.isAuth && userState.user?.pubkey) {
|
if (userState.auth && userState.user?.pubkey) {
|
||||||
userHexKey = userState.user.pubkey as string
|
userHexKey = userState.user.pubkey as string
|
||||||
} else {
|
} else {
|
||||||
userHexKey = (await window.nostr?.getPublicKey()) as string
|
userHexKey = (await window.nostr?.getPublicKey()) as string
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
import { logout } from 'nostr-login'
|
import { logout } from 'nostr-login'
|
||||||
import { Link, useLocation } from 'react-router-dom'
|
import { Link, useLocation } from 'react-router-dom'
|
||||||
|
import { toast } from 'react-toastify'
|
||||||
import { InputField } from '../components/Inputs'
|
import { InputField } from '../components/Inputs'
|
||||||
import { ProfileSection } from '../components/ProfileSection'
|
import { ProfileSection } from '../components/ProfileSection'
|
||||||
|
import { useAppSelector } from '../hooks'
|
||||||
import { appRoutes } from '../routes'
|
import { appRoutes } from '../routes'
|
||||||
|
import { AuthMethod } from '../store/reducers/user'
|
||||||
import '../styles/feed.css'
|
import '../styles/feed.css'
|
||||||
import '../styles/innerPage.css'
|
import '../styles/innerPage.css'
|
||||||
import '../styles/popup.css'
|
import '../styles/popup.css'
|
||||||
@ -10,7 +13,7 @@ import '../styles/profile.css'
|
|||||||
import '../styles/settings.css'
|
import '../styles/settings.css'
|
||||||
import '../styles/styles.css'
|
import '../styles/styles.css'
|
||||||
import '../styles/write.css'
|
import '../styles/write.css'
|
||||||
import { useAppSelector } from '../hooks'
|
import { copyTextToClipboard } from '../utils'
|
||||||
|
|
||||||
export const SettingsPage = () => {
|
export const SettingsPage = () => {
|
||||||
const location = useLocation()
|
const location = useLocation()
|
||||||
@ -135,7 +138,52 @@ const SettingTabs = () => {
|
|||||||
Admin
|
Admin
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
{userState.isAuth && (
|
|
||||||
|
{userState.auth &&
|
||||||
|
userState.auth.method === AuthMethod.Local &&
|
||||||
|
userState.auth.localNsec && (
|
||||||
|
<div className='inputLabelWrapperMain'>
|
||||||
|
<label className='form-label labelMain'>Your Private Key</label>
|
||||||
|
<p className='labelDescriptionMain'>
|
||||||
|
NOTICE: Make sure you save your private key (nsec) somewhere
|
||||||
|
safe.
|
||||||
|
</p>
|
||||||
|
<div className='inputWrapperMain'>
|
||||||
|
<input
|
||||||
|
type='password'
|
||||||
|
className='inputMain inputMainWithBtn'
|
||||||
|
value={userState.auth.localNsec}
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
className='btn btnMain btnMainInsideField'
|
||||||
|
type='button'
|
||||||
|
onClick={() => {
|
||||||
|
copyTextToClipboard(
|
||||||
|
userState.auth?.localNsec as string
|
||||||
|
).then((isCopied) => {
|
||||||
|
if (isCopied) toast.success('Nsec copied to clipboard!')
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns='http://www.w3.org/2000/svg'
|
||||||
|
viewBox='0 0 512 512'
|
||||||
|
width='1em'
|
||||||
|
height='1em'
|
||||||
|
fill='currentColor'
|
||||||
|
>
|
||||||
|
<path d='M384 96L384 0h-112c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48H464c26.51 0 48-21.49 48-48V128h-95.1C398.4 128 384 113.6 384 96zM416 0v96h96L416 0zM192 352V128h-144c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48h192c26.51 0 48-21.49 48-48L288 416h-32C220.7 416 192 387.3 192 352z'></path>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<p className='labelDescriptionMain'>
|
||||||
|
WARNING: Do not sign-out without saving your nsec somewhere
|
||||||
|
safe. Otherwise, you'll lose access to your "account".
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{userState.auth && (
|
||||||
<button className='btn btnMain' type='button' onClick={handleSignOut}>
|
<button className='btn btnMain' type='button' onClick={handleSignOut}>
|
||||||
Sign out
|
Sign out
|
||||||
</button>
|
</button>
|
||||||
|
@ -1,13 +1,25 @@
|
|||||||
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
|
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
|
||||||
import { UserProfile } from '../../types/user'
|
import { UserProfile } from '../../types/user'
|
||||||
|
|
||||||
|
export enum AuthMethod {
|
||||||
|
Connect = 'connect',
|
||||||
|
ReadOnly = 'readOnly',
|
||||||
|
Extension = 'extension',
|
||||||
|
Local = 'local',
|
||||||
|
OTP = 'otp'
|
||||||
|
}
|
||||||
|
export interface IUserAuth {
|
||||||
|
method: AuthMethod
|
||||||
|
localNsec?: string
|
||||||
|
}
|
||||||
|
|
||||||
export interface IUserState {
|
export interface IUserState {
|
||||||
isAuth: boolean
|
auth: IUserAuth | null
|
||||||
user: UserProfile
|
user: UserProfile
|
||||||
}
|
}
|
||||||
|
|
||||||
const initialState: IUserState = {
|
const initialState: IUserState = {
|
||||||
isAuth: false,
|
auth: null,
|
||||||
user: {}
|
user: {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -15,8 +27,8 @@ export const userSlice = createSlice({
|
|||||||
name: 'user',
|
name: 'user',
|
||||||
initialState,
|
initialState,
|
||||||
reducers: {
|
reducers: {
|
||||||
setIsAuth(state, action: PayloadAction<boolean>) {
|
setAuth(state, action: PayloadAction<IUserAuth | null>) {
|
||||||
state = { ...state, isAuth: action.payload }
|
state = { ...state, auth: action.payload }
|
||||||
return state
|
return state
|
||||||
},
|
},
|
||||||
setUser(state, action: PayloadAction<UserProfile>) {
|
setUser(state, action: PayloadAction<UserProfile>) {
|
||||||
@ -26,6 +38,6 @@ export const userSlice = createSlice({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
export const { setIsAuth, setUser } = userSlice.actions
|
export const { setAuth, setUser } = userSlice.actions
|
||||||
|
|
||||||
export default userSlice.reducer
|
export default userSlice.reducer
|
||||||
|
Loading…
Reference in New Issue
Block a user