Debug: added a debug route to let people easily inspect their journals.
Useful when people are helping with debugging.master
parent
8567dd70b7
commit
d0ec686592
@ -0,0 +1,89 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import * as EteSync from 'etesync';
|
||||||
|
import Button from '@material-ui/core/Button';
|
||||||
|
import TextField from '@material-ui/core/TextField';
|
||||||
|
|
||||||
|
import Container from './widgets/Container';
|
||||||
|
import { useSelector } from 'react-redux';
|
||||||
|
import { StoreState, CredentialsData, UserInfoData } from './store';
|
||||||
|
|
||||||
|
interface PropsType {
|
||||||
|
etesync: CredentialsData;
|
||||||
|
userInfo: UserInfoData;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Debug(props: PropsType) {
|
||||||
|
const [stateJournalUid, setJournalUid] = React.useState('');
|
||||||
|
const [entriesUids, setEntriesUids] = React.useState('');
|
||||||
|
const [result, setResult] = React.useState('');
|
||||||
|
const journals = useSelector((state: StoreState) => state.cache.journals.value)!;
|
||||||
|
const journalEntries = useSelector((state: StoreState) => state.cache.entries);
|
||||||
|
|
||||||
|
function handleInputChange(func: (value: string) => void) {
|
||||||
|
return (event: React.ChangeEvent<any>) => {
|
||||||
|
func(event.target.value);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container>
|
||||||
|
<div>
|
||||||
|
<TextField
|
||||||
|
style={{ width: '100%' }}
|
||||||
|
type="text"
|
||||||
|
label="Journal UID"
|
||||||
|
value={stateJournalUid}
|
||||||
|
onChange={handleInputChange(setJournalUid)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<TextField
|
||||||
|
style={{ width: '100%' }}
|
||||||
|
type="text"
|
||||||
|
multiline
|
||||||
|
label="Entry UIDs"
|
||||||
|
value={entriesUids}
|
||||||
|
onChange={handleInputChange(setEntriesUids)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<Button
|
||||||
|
variant="contained"
|
||||||
|
color="secondary"
|
||||||
|
onClick={() => {
|
||||||
|
const { etesync, userInfo } = props;
|
||||||
|
const derived = etesync.encryptionKey;
|
||||||
|
const userInfoCryptoManager = userInfo.getCryptoManager(etesync.encryptionKey);
|
||||||
|
const keyPair = userInfo.getKeyPair(userInfoCryptoManager);
|
||||||
|
const journalUid = stateJournalUid.trim();
|
||||||
|
const journal = journals.get(journalUid);
|
||||||
|
if (!journal) {
|
||||||
|
setResult('Error: journal uid not found.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const wantedEntries = {};
|
||||||
|
entriesUids.split('\n').forEach((ent) => wantedEntries[ent.trim()] = true);
|
||||||
|
|
||||||
|
const cryptoManager = journal.getCryptoManager(derived, keyPair);
|
||||||
|
let prevUid: string | null = null;
|
||||||
|
|
||||||
|
const entries = journalEntries.get(journalUid)!;
|
||||||
|
const syncEntries = entries.value!.map((entry: EteSync.Entry) => {
|
||||||
|
const syncEntry = entry.getSyncEntry(cryptoManager, prevUid);
|
||||||
|
prevUid = entry.uid;
|
||||||
|
|
||||||
|
return (wantedEntries[entry.uid]) ? syncEntry : undefined;
|
||||||
|
}).filter((x) => x !== undefined);
|
||||||
|
|
||||||
|
setResult(syncEntries.map((ent) => ent?.content).join('\n\n'));
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Decrypt
|
||||||
|
</Button>
|
||||||
|
<div>
|
||||||
|
<p>Result:</p>
|
||||||
|
<pre>{result}</pre>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in New Issue