Files
zap.stream/src/element/follow-button.tsx
2023-08-27 16:25:27 +01:00

70 lines
2.1 KiB
TypeScript

import { EventKind } from "@snort/system";
import { useLogin } from "hooks/login";
import AsyncButton from "element/async-button";
import { Login, System } from "index";
import { FormattedMessage } from "react-intl";
export function LoggedInFollowButton({ tag, value }: { tag: "p" | "t"; value: string }) {
const login = useLogin();
if (!login) return;
const { tags, content, timestamp } = login.follows;
const follows = tags.filter(t => t.at(0) === tag);
const isFollowing = follows.find(t => t.at(1) === value);
async function unfollow() {
const pub = login?.publisher();
if (pub) {
const newFollows = tags.filter(t => t.at(1) !== value);
const ev = await pub.generic(eb => {
eb.kind(EventKind.ContactList).content(content ?? "");
for (const t of newFollows) {
eb.tag(t);
}
return eb;
});
console.debug(ev);
System.BroadcastEvent(ev);
Login.setFollows(newFollows, content ?? "", ev.created_at);
}
}
async function follow() {
const pub = login?.publisher();
if (pub) {
const newFollows = [...tags, [tag, value]];
const ev = await pub.generic(eb => {
eb.kind(EventKind.ContactList).content(content ?? "");
for (const tag of newFollows) {
eb.tag(tag);
}
return eb;
});
console.debug(ev);
System.BroadcastEvent(ev);
Login.setFollows(newFollows, content ?? "", ev.created_at);
}
}
return (
<AsyncButton
disabled={timestamp ? timestamp === 0 : true}
type="button"
className="btn btn-primary"
onClick={isFollowing ? unfollow : follow}>
<FormattedMessage defaultMessage={isFollowing ? "Unfollow" : "Follow"} />
</AsyncButton>
);
}
export function FollowTagButton({ tag }: { tag: string }) {
const login = useLogin();
return login?.pubkey ? <LoggedInFollowButton tag={"t"} value={tag} /> : null;
}
export function FollowButton({ pubkey }: { pubkey: string }) {
const login = useLogin();
return login?.pubkey ? <LoggedInFollowButton tag={"p"} value={pubkey} /> : null;
}