snort/packages/app/src/Pages/settings/tools/sync-account.tsx

67 lines
2.0 KiB
TypeScript

import { unwrap } from "@snort/shared";
import { RangeSync, TaggedNostrEvent } from "@snort/system";
import { SnortContext } from "@snort/system-react";
import { useContext, useState } from "react";
import { FormattedMessage, FormattedNumber } from "react-intl";
import AsyncButton from "@/Components/Button/AsyncButton";
import useLogin from "@/Hooks/useLogin";
import useRelays from "@/Hooks/useRelays";
import { SearchRelays } from "@/Utils/Const";
export default function SyncAccountTool() {
const system = useContext(SnortContext);
const login = useLogin();
const [scan, setScan] = useState<number>();
const [results, setResults] = useState<Array<TaggedNostrEvent>>([]);
const myRelays = useRelays();
async function start() {
const relays = Object.entries(myRelays)
.filter(([, v]) => v.write)
.map(([k]) => k);
const sync = new RangeSync(system);
sync.on("event", evs => {
setResults(r => [...r, ...evs]);
});
sync.on("scan", t => setScan(t));
await sync.sync({
authors: [unwrap(login.publicKey)],
relays: [...relays, ...Object.keys(CONFIG.defaultRelays), ...SearchRelays],
});
}
return (
<>
<p>
<FormattedMessage defaultMessage="Sync all events for your profile into local cache" id="+QM0PJ" />
</p>
{results.length > 0 && (
<h3>
<FormattedMessage
defaultMessage="Found {n} events"
id="ufvXH1"
values={{
n: <FormattedNumber value={results.length} />,
}}
/>
</h3>
)}
{scan !== undefined && (
<h4>
<FormattedMessage
defaultMessage="Scanning {date}"
id="OxPdQ0"
values={{
date: new Date(scan * 1000).toLocaleDateString(),
}}
/>
</h4>
)}
<AsyncButton onClick={start}>
<FormattedMessage defaultMessage="Start" id="mOFG3K" />
</AsyncButton>
</>
);
}