snort/packages/app/src/Element/Bookmarks.tsx

59 lines
1.7 KiB
TypeScript
Raw Normal View History

import { useState, useMemo, ChangeEvent } from "react";
import { FormattedMessage } from "react-intl";
2023-04-08 09:37:54 +00:00
import { HexKey, TaggedRawEvent } from "@snort/nostr";
import Note from "Element/Note";
2023-04-14 11:33:19 +00:00
import useLogin from "Hooks/useLogin";
2023-03-29 12:10:22 +00:00
import { UserCache } from "Cache/UserCache";
import messages from "./messages";
2023-04-14 11:33:19 +00:00
interface BookmarksProps {
pubkey: HexKey;
2023-03-28 14:34:01 +00:00
bookmarks: readonly TaggedRawEvent[];
related: readonly TaggedRawEvent[];
}
const Bookmarks = ({ pubkey, bookmarks, related }: BookmarksProps) => {
const [onlyPubkey, setOnlyPubkey] = useState<HexKey | "all">("all");
2023-04-14 11:33:19 +00:00
const loginPubKey = useLogin().publicKey;
const ps = useMemo(() => {
2023-04-08 09:35:34 +00:00
return [...new Set(bookmarks.map(ev => ev.pubkey))];
}, [bookmarks]);
function renderOption(p: HexKey) {
2023-03-29 12:10:22 +00:00
const profile = UserCache.getFromCache(p);
return profile ? <option value={p}>{profile?.display_name || profile?.name}</option> : null;
2023-04-07 11:09:47 +00:00
}
return (
<div className="main-content">
2023-02-14 10:16:09 +00:00
<div className="mb10 flex-end">
<select
disabled={ps.length <= 1}
value={onlyPubkey}
onChange={(e: ChangeEvent<HTMLSelectElement>) => setOnlyPubkey(e.target.value)}>
<option value="all">
<FormattedMessage {...messages.All} />
</option>
{ps.map(renderOption)}
</select>
</div>
{bookmarks
.filter(b => (onlyPubkey === "all" ? true : b.pubkey === onlyPubkey))
.map(n => {
2023-04-08 09:35:34 +00:00
return (
<Note
key={n.id}
data={n}
related={related}
options={{ showTime: false, showBookmarked: true, canUnbookmark: loginPubKey === pubkey }}
/>
);
})}
</div>
);
};
export default Bookmarks;