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

75 lines
2.3 KiB
TypeScript
Raw Normal View History

import { useState, useMemo, ChangeEvent } from "react";
import { useSelector } from "react-redux";
import { FormattedMessage } from "react-intl";
2023-04-07 11:05:58 +00:00
import { EventKind, HexKey, TaggedRawEvent } from "@snort/nostr";
import Note from "Element/Note";
import { RootState } from "State/Store";
2023-03-29 12:10:22 +00:00
import { UserCache } from "Cache/UserCache";
import messages from "./messages";
2023-04-07 11:05:58 +00:00
import NoteReaction from "./NoteReaction";
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");
const loginPubKey = useSelector((s: RootState) => s.login.publicKey);
const ps = useMemo(() => {
2023-03-28 14:34:01 +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:05:58 +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-07 11:05:58 +00:00
switch(n.kind){
case EventKind.TextNote:
return (
<Note
key={n.id}
data={n}
related={related}
options={{ showTime: false, showBookmarked: true, canUnbookmark: loginPubKey === pubkey }}
/>
);
case EventKind.Reaction:
case EventKind.Repost:
return <NoteReaction data={n} key={n.id} />;
}
return (
<Note
key={n.id}
data={n}
related={related}
options={{ showTime: false, showBookmarked: true, canUnbookmark: loginPubKey === pubkey }}
/>
);
})}
</div>
);
};
export default Bookmarks;