fix(anon mode): refreshing page could generate a new anon address for thread

This commit is contained in:
Tom (plebeius.eth)
2024-09-20 15:13:53 +02:00
parent 641db5defe
commit f247f0e995
2 changed files with 48 additions and 40 deletions
+10 -15
View File
@@ -1,23 +1,26 @@
import { useAccount } from '@plebbit/plebbit-react-hooks'; import { useAccount } from '@plebbit/plebbit-react-hooks';
import useAnonModeStore from '../stores/use-anon-mode-store'; import useAnonModeStore from '../stores/use-anon-mode-store';
import { useCallback, useMemo } from 'react'; import { useCallback } from 'react';
const useAnonMode = (postCid?: string) => { const useAnonMode = (postCid?: string) => {
const { anonMode, threadSigners, setThreadSigner, setAddressSigner, getAddressSigner } = useAnonModeStore((state) => ({ const { anonMode, getThreadSigner, setThreadSigner, setAddressSigner, getAddressSigner } = useAnonModeStore((state) => ({
anonMode: state.anonMode, anonMode: state.anonMode,
threadSigners: state.threadSigners, getThreadSigner: state.getThreadSigner,
setThreadSigner: state.setThreadSigner, setThreadSigner: state.setThreadSigner,
setAddressSigner: state.setAddressSigner, setAddressSigner: state.setAddressSigner,
getAddressSigner: state.getAddressSigner, getAddressSigner: state.getAddressSigner,
})); }));
const threadSigner = useMemo(() => (postCid ? threadSigners[postCid] : undefined), [postCid, threadSigners]);
const account = useAccount(); const account = useAccount();
const getNewSigner = useCallback(async () => { const getNewSigner = useCallback(async () => {
if (anonMode) { if (anonMode) {
if (!postCid || !threadSigner) { if (postCid) {
const existingSigner = getThreadSigner(postCid);
if (existingSigner) {
return existingSigner;
}
}
try { try {
const signer = await account?.plebbit.createSigner(); const signer = await account?.plebbit.createSigner();
if (signer) { if (signer) {
@@ -31,17 +34,9 @@ const useAnonMode = (postCid?: string) => {
} catch (error) { } catch (error) {
console.error('Failed to create anonymous signer:', error); console.error('Failed to create anonymous signer:', error);
} }
} else {
try {
const signer = await account?.plebbit.createSigner({ type: 'ed25519', privateKey: threadSigner?.privateKey });
return signer;
} catch (error) {
console.error('Failed to retrieve anonymous signer:', error);
}
}
} }
return null; return null;
}, [anonMode, postCid, threadSigner, account, setThreadSigner, setAddressSigner]); }, [anonMode, postCid, account, getThreadSigner, setThreadSigner, setAddressSigner]);
const getExistingSigner = useCallback( const getExistingSigner = useCallback(
(address: string) => { (address: string) => {
+28 -15
View File
@@ -29,40 +29,53 @@ const useAnonModeStore = create<AnonModeState>((set, get) => ({
set((state) => ({ set((state) => ({
threadSigners: { ...state.threadSigners, [postCid]: signer }, threadSigners: { ...state.threadSigners, [postCid]: signer },
})); }));
anonModeStore.setItem(postCid, signer); anonModeStore.setItem(`threadSigner_${postCid}`, signer);
},
getThreadSigner: (postCid: string) => {
const state = get();
if (state.threadSigners[postCid]) {
return state.threadSigners[postCid];
}
return null;
}, },
getThreadSigner: (postCid: string) => get().threadSigners[postCid],
setAddressSigner: (signer: any) => { setAddressSigner: (signer: any) => {
set((state) => ({ set((state) => ({
addressSigners: { ...state.addressSigners, [signer.address]: signer }, addressSigners: { ...state.addressSigners, [signer.address]: signer },
})); }));
anonModeStore.setItem(signer.address, signer); anonModeStore.setItem(`addressSigner_${signer.address}`, signer);
},
getAddressSigner: (address: string) => {
const state = get();
if (state.addressSigners[address]) {
return state.addressSigners[address];
}
return null;
}, },
getAddressSigner: (address: string) => get().addressSigners[address],
currentAnonSignerAddress: null,
})); }));
const initializeAnonModeStore = async () => { const initializeAnonModeStore = async () => {
const entries: [string, any][] = await anonModeStore.entries(); const entries: [string, any][] = await anonModeStore.entries();
const threadSigners: { [key: string]: any } = {}; const threadSigners: { [key: string]: any } = {};
const addressSigners: { [key: string]: any } = {}; const addressSigners: { [key: string]: any } = {};
let anonMode = true; // Default value let anonMode = true;
entries.forEach(([key, value]) => { entries.forEach(([key, value]) => {
if (key === 'anonMode') { if (key === 'anonMode') {
anonMode = value; anonMode = value;
} else if (value.address) { } else if (key.startsWith('threadSigner_')) {
addressSigners[value.address] = value; const postCid = key.replace('threadSigner_', '');
} else { threadSigners[postCid] = value;
threadSigners[key] = value; } else if (key.startsWith('addressSigner_')) {
const address = key.replace('addressSigner_', '');
addressSigners[address] = value;
} }
}); });
useAnonModeStore.setState((state) => ({ useAnonModeStore.setState({
anonMode, // Set the retrieved anonMode state anonMode,
threadSigners: { ...threadSigners, ...state.threadSigners }, threadSigners,
addressSigners: { ...addressSigners, ...state.addressSigners }, addressSigners,
})); });
}; };
initializeAnonModeStore(); initializeAnonModeStore();