fix(edit-menu): allow pseudonymous reply deletion (#1076)

* fix(edit-menu): allow pseudonymous reply deletion

* fix(edit-menu): ignore non-pseudonymous mode
This commit is contained in:
Tommaso Casaburi
2026-03-13 16:37:44 +08:00
committed by GitHub
parent aedee9fb83
commit 726522586c
4 changed files with 127 additions and 17 deletions
@@ -14,6 +14,7 @@ const testState = vi.hoisted(() => ({
hidden: false,
hideMock: vi.fn(),
mediaInfo: undefined as { thumbnail?: string; type?: string; url?: string } | undefined,
pseudonymityMode: undefined as string | undefined,
privileges: {
isAccountCommentAuthor: false,
isAccountMod: false,
@@ -90,6 +91,10 @@ vi.mock('../../../../hooks/use-author-privileges', () => ({
default: () => testState.privileges,
}));
vi.mock('../../../../hooks/use-board-pseudonymity-mode', () => ({
useBoardPseudonymityMode: () => testState.pseudonymityMode,
}));
vi.mock('../../../../hooks/use-hide', () => ({
default: () => ({
hidden: testState.hidden,
@@ -151,6 +156,7 @@ describe('PostMenuMobile', () => {
vi.clearAllMocks();
testState.hidden = false;
testState.mediaInfo = undefined;
testState.pseudonymityMode = undefined;
testState.privileges = {
isAccountCommentAuthor: false,
isAccountMod: false,
@@ -197,6 +203,22 @@ describe('PostMenuMobile', () => {
expect(testState.hideMock).toHaveBeenCalled();
});
it('shows edit controls on pseudonymous boards even without a local author-address match', async () => {
testState.pseudonymityMode = 'per-post';
await renderMenu('/mu');
expect(document.body.querySelector('[data-testid="edit-menu"]')?.textContent).toBe('cid-1');
});
it("does not show edit controls when pseudonymity mode is 'none' and the user lacks privileges", async () => {
testState.pseudonymityMode = 'none';
await renderMenu('/mu');
expect(document.body.querySelector('[data-testid="edit-menu"]')).toBeNull();
});
it('omits thread hiding on the root thread route and suppresses the menu for deleted posts', async () => {
await renderMenu('/mu/thread/cid-1');
await openMenu();
@@ -10,6 +10,7 @@ import { copyToClipboard } from '../../../lib/utils/clipboard-utils';
import { getBoardPath } from '../../../lib/utils/route-utils';
import { useDirectories } from '../../../hooks/use-directories';
import useEditCommentPrivileges from '../../../hooks/use-author-privileges';
import { useBoardPseudonymityMode } from '../../../hooks/use-board-pseudonymity-mode';
import useHide from '../../../hooks/use-hide';
import EditMenu from '../../edit-menu/edit-menu';
import { isBoardView, isPostPageView } from '../../../lib/utils/view-utils';
@@ -198,6 +199,8 @@ const PostMenuMobile = ({ postMenu, editMenuPost }: PostMenuMobileProps) => {
commentAuthorAddress: authorAddress || '',
subplebbitAddress: resolvedCommunityAddress || '',
});
const pseudonymityMode = useBoardPseudonymityMode(resolvedCommunityAddress);
const canAttemptAuthorDelete = pseudonymityMode !== undefined && pseudonymityMode !== 'none';
const commentMediaInfo = getCommentMediaInfo(link || '', thumbnailUrl || '', linkWidth || 0, linkHeight || 0);
const { thumbnail, type, url } = commentMediaInfo || {};
const [isMenuOpen, setIsMenuOpen] = useState(false);
@@ -261,7 +264,7 @@ const PostMenuMobile = ({ postMenu, editMenuPost }: PostMenuMobileProps) => {
)}
</>
)}
{(isAccountMod || isAccountCommentAuthor) && cid && (
{(isAccountMod || isAccountCommentAuthor || canAttemptAuthorDelete) && cid && (
<span className={styles.checkbox}>
<EditMenu post={editMenuPost} />
</span>