feat: mention all users in the thread by default

This commit is contained in:
codytseng
2025-02-27 22:01:17 +08:00
parent d4fa40900b
commit 979d5e9ecc

View File

@@ -24,8 +24,8 @@ export default function Mentions({
const { pubkey } = useNostr() const { pubkey } = useNostr()
const [pubkeys, setPubkeys] = useState<string[]>([]) const [pubkeys, setPubkeys] = useState<string[]>([])
const [relatedPubkeys, setRelatedPubkeys] = useState<string[]>([]) const [relatedPubkeys, setRelatedPubkeys] = useState<string[]>([])
const [potentialMentions, setPotentialMentions] = useState<string[]>([])
const [parentEventPubkey, setParentEventPubkey] = useState<string | undefined>() const [parentEventPubkey, setParentEventPubkey] = useState<string | undefined>()
const [addedPubkeys, setAddedPubkeys] = useState<string[]>([])
const [removedPubkeys, setRemovedPubkeys] = useState<string[]>([]) const [removedPubkeys, setRemovedPubkeys] = useState<string[]>([])
useEffect(() => { useEffect(() => {
@@ -34,9 +34,10 @@ export default function Mentions({
setRelatedPubkeys(relatedPubkeys.filter((p) => p !== pubkey)) setRelatedPubkeys(relatedPubkeys.filter((p) => p !== pubkey))
setParentEventPubkey(parentEventPubkey !== pubkey ? parentEventPubkey : undefined) setParentEventPubkey(parentEventPubkey !== pubkey ? parentEventPubkey : undefined)
const potentialMentions = [...pubkeys, ...relatedPubkeys] const potentialMentions = [...pubkeys, ...relatedPubkeys]
setAddedPubkeys((pubkeys) => { if (parentEventPubkey) {
return pubkeys.filter((p) => potentialMentions.includes(p)) potentialMentions.push(parentEventPubkey)
}) }
setPotentialMentions(potentialMentions)
setRemovedPubkeys((pubkeys) => { setRemovedPubkeys((pubkeys) => {
return pubkeys.filter((p) => potentialMentions.includes(p)) return pubkeys.filter((p) => potentialMentions.includes(p))
}) })
@@ -44,23 +45,9 @@ export default function Mentions({
}, [content, parentEvent, pubkey]) }, [content, parentEvent, pubkey])
useEffect(() => { useEffect(() => {
const newMentions = [...pubkeys] const newMentions = potentialMentions.filter((pubkey) => !removedPubkeys.includes(pubkey))
addedPubkeys.forEach((pubkey) => {
if (!newMentions.includes(pubkey) && pubkey !== parentEventPubkey) {
newMentions.push(pubkey)
}
})
removedPubkeys.forEach((pubkey) => {
const index = newMentions.indexOf(pubkey)
if (index !== -1) {
newMentions.splice(index, 1)
}
})
if (parentEventPubkey) {
newMentions.push(parentEventPubkey)
}
setMentions(newMentions) setMentions(newMentions)
}, [pubkeys, relatedPubkeys, parentEventPubkey, addedPubkeys, removedPubkeys]) }, [potentialMentions, removedPubkeys])
return ( return (
<Popover> <Popover>
@@ -71,43 +58,40 @@ export default function Mentions({
disabled={pubkeys.length === 0 && relatedPubkeys.length === 0 && !parentEventPubkey} disabled={pubkeys.length === 0 && relatedPubkeys.length === 0 && !parentEventPubkey}
onClick={(e) => e.stopPropagation()} onClick={(e) => e.stopPropagation()}
> >
{t('Mentions')} {mentions.length > 0 && `(${mentions.length})`} {t('Mentions')}{' '}
{potentialMentions.length > 0 && `(${mentions.length}/${potentialMentions.length})`}
</Button> </Button>
</PopoverTrigger> </PopoverTrigger>
<PopoverContent className="w-52 p-0 py-1"> <PopoverContent className="w-52 p-0 py-1">
<div className="space-y-1"> <div className="space-y-1">
{parentEventPubkey && ( {potentialMentions.map((_, index) => {
<PopoverCheckboxItem checked disabled> const pubkey = potentialMentions[potentialMentions.length - 1 - index]
<SimpleUserAvatar userId={parentEventPubkey} size="small" /> const isParentPubkey = pubkey === parentEventPubkey
<SimpleUsername return (
userId={parentEventPubkey} <PopoverCheckboxItem
className="font-semibold text-sm truncate" key={`${pubkey}-${index}`}
skeletonClassName="h-3" checked={isParentPubkey ? true : mentions.includes(pubkey)}
/> onCheckedChange={(checked) => {
</PopoverCheckboxItem> if (isParentPubkey) {
)} return
{pubkeys.concat(relatedPubkeys).map((pubkey, index) => ( }
<PopoverCheckboxItem if (checked) {
key={`${pubkey}-${index}`} setRemovedPubkeys((pubkeys) => pubkeys.filter((p) => p !== pubkey))
checked={mentions.includes(pubkey)} } else {
onCheckedChange={(checked) => { setRemovedPubkeys((pubkeys) => [...pubkeys, pubkey])
if (checked) { }
setAddedPubkeys((pubkeys) => [...pubkeys, pubkey]) }}
setRemovedPubkeys((pubkeys) => pubkeys.filter((p) => p !== pubkey)) disabled={isParentPubkey}
} else { >
setRemovedPubkeys((pubkeys) => [...pubkeys, pubkey]) <SimpleUserAvatar userId={pubkey} size="small" />
setAddedPubkeys((pubkeys) => pubkeys.filter((p) => p !== pubkey)) <SimpleUsername
} userId={pubkey}
}} className="font-semibold text-sm truncate"
> skeletonClassName="h-3"
<SimpleUserAvatar userId={pubkey} size="small" /> />
<SimpleUsername </PopoverCheckboxItem>
userId={pubkey} )
className="font-semibold text-sm truncate" })}
skeletonClassName="h-3"
/>
</PopoverCheckboxItem>
))}
</div> </div>
</PopoverContent> </PopoverContent>
</Popover> </Popover>