fix(flags): hide geolocation-only selectors on /int/ and /sp/

Country-only boards auto-publish geographic location flags without
showing a flag dropdown, matching existing /bant/ behavior.
This commit is contained in:
Tommaso Casaburi
2026-06-01 10:57:13 +07:00
parent 3480dc0505
commit 1bd8d6dc34
4 changed files with 56 additions and 11 deletions
@@ -444,6 +444,7 @@ describe('PostForm', () => {
testState.directories = [ testState.directories = [
{ address: 'music-posting.eth', features: {}, title: '/mu/ - Music' }, { address: 'music-posting.eth', features: {}, title: '/mu/ - Music' },
{ address: 'politically-incorrect.bso', directoryCode: 'pol', features: { hasFlags: true }, title: '/pol/ - Politically Incorrect' }, { address: 'politically-incorrect.bso', directoryCode: 'pol', features: { hasFlags: true }, title: '/pol/ - Politically Incorrect' },
{ address: 'sports-posting.bso', directoryCode: 'sp', features: { hasFlags: true }, title: '/sp/ - Sports' },
{ address: 'random-nsfw.bso', features: {}, title: '/b/ - Random' }, { address: 'random-nsfw.bso', features: {}, title: '/b/ - Random' },
{ {
address: 'flash-posting.bso', address: 'flash-posting.bso',
@@ -699,6 +700,30 @@ describe('PostForm', () => {
}); });
}); });
it('publishes geographic location on /sp/ without showing a flag field', async () => {
testState.resolvedCommunityAddress = 'sports-posting.bso';
await renderPostForm('/sp');
await clickByText(container, 'start_new_thread');
const table = container.querySelector('table');
const flagSelect = table?.querySelector<HTMLSelectElement>('select[aria-label="flag"]');
const textarea = table?.querySelector<HTMLTextAreaElement>('textarea');
expect(flagSelect).toBeNull();
await dispatchInput(textarea as HTMLTextAreaElement, 'sports post');
await clickByText(table as HTMLTableElement, 'post');
expect(testState.publishPostMock).toHaveBeenCalledWith({
content: 'sports post',
challengeRequest: {
challengeAnswers: ['bitsocial-flags:5chan:flag:country:auto'],
},
flairs: [{ type: 'country', code: 'auto', text: 'flag:country:auto' }],
});
});
it('publishes selected political flags from the post form', async () => { it('publishes selected political flags from the post form', async () => {
testState.resolvedCommunityAddress = 'politically-incorrect.bso'; testState.resolvedCommunityAddress = 'politically-incorrect.bso';
@@ -340,6 +340,18 @@ describe('ReplyModal', () => {
features: { hasFlags: true }, features: { hasFlags: true },
title: '/bant/ - International/Random', title: '/bant/ - International/Random',
}, },
'international-sfw.bso': {
address: 'international-sfw.bso',
directoryCode: 'int',
features: { hasFlags: true },
title: '/int/ - International',
},
'sports-posting.bso': {
address: 'sports-posting.bso',
directoryCode: 'sp',
features: { hasFlags: true },
title: '/sp/ - Sports',
},
'random-nsfw.bso': { 'random-nsfw.bso': {
address: 'random-nsfw.bso', address: 'random-nsfw.bso',
features: {}, features: {},
@@ -494,8 +506,12 @@ describe('ReplyModal', () => {
}); });
}); });
it('publishes geographic location on /bant/ without showing a flag selector', async () => { it.each([
await renderReplyModal('/bant/thread/post-1', 'international-nsfw.bso'); { boardPath: '/bant/thread/post-1', communityAddress: 'international-nsfw.bso' },
{ boardPath: '/int/thread/post-1', communityAddress: 'international-sfw.bso' },
{ boardPath: '/sp/thread/post-1', communityAddress: 'sports-posting.bso' },
])('publishes geographic location on country-only boards without showing a flag selector', async ({ boardPath, communityAddress }) => {
await renderReplyModal(boardPath, communityAddress);
expect(container.querySelector<HTMLSelectElement>('select[aria-label="flag"]')).toBeNull(); expect(container.querySelector<HTMLSelectElement>('select[aria-label="flag"]')).toBeNull();
@@ -17,30 +17,34 @@ describe('comment-flag-selection', () => {
expect(hasCommentFlagsForDirectory({ features: { hasFlags: true }, title: '/pol/ - Politically Incorrect' })).toBe(true); expect(hasCommentFlagsForDirectory({ features: { hasFlags: true }, title: '/pol/ - Politically Incorrect' })).toBe(true);
}); });
it('uses geographic location as the default for country flag boards', () => { it('uses geographic location as the default for other flag boards', () => {
expect( expect(
getCommentFlagOptionsForDirectory({ getCommentFlagOptionsForDirectory({
directoryCode: 'int', directoryCode: 'fit',
features: { hasFlags: true }, features: { hasFlags: true },
title: '/int/ - International', title: '/fit/ - Fitness',
}), }),
).toEqual([{ label: 'Geographic Location', value: 'country:auto' }]); ).toEqual([{ label: 'Geographic Location', value: 'country:auto' }]);
}); });
it('does not expose a flag selector on /bant/ but still publishes geographic location', () => { it.each([
{ directoryCode: 'bant', title: '/bant/ - International/Random' },
{ directoryCode: 'int', title: '/int/ - International' },
{ directoryCode: 'sp', title: '/sp/ - Sports' },
])('does not expose a flag selector on /$directoryCode/ but still publishes geographic location', ({ directoryCode, title }) => {
expect( expect(
getCommentFlagOptionsForDirectory({ getCommentFlagOptionsForDirectory({
directoryCode: 'bant', directoryCode,
features: { hasFlags: true }, features: { hasFlags: true },
title: '/bant/ - International/Random', title,
}), }),
).toEqual([]); ).toEqual([]);
expect( expect(
getCommentFlagPublishOptionsForDirectory({ getCommentFlagPublishOptionsForDirectory({
directoryCode: 'bant', directoryCode,
features: { hasFlags: true }, features: { hasFlags: true },
title: '/bant/ - International/Random', title,
}), }),
).toEqual({ ).toEqual({
challengeRequest: { challengeRequest: {
+1 -1
View File
@@ -38,7 +38,7 @@ const NO_FLAG_OPTION: CommentFlagSelectOption = {
}; };
/** Boards that always publish geographic location without showing a flag selector. */ /** Boards that always publish geographic location without showing a flag selector. */
const AUTO_GEOGRAPHIC_FLAG_DIRECTORY_CODES = new Set(['bant']); const AUTO_GEOGRAPHIC_FLAG_DIRECTORY_CODES = new Set(['bant', 'int', 'sp']);
const getDirectoryCode = (directory: Pick<DirectoryCommunity, 'directoryCode' | 'title'> | undefined): string | undefined => { const getDirectoryCode = (directory: Pick<DirectoryCommunity, 'directoryCode' | 'title'> | undefined): string | undefined => {
const directoryCode = directory?.directoryCode?.trim().toLowerCase(); const directoryCode = directory?.directoryCode?.trim().toLowerCase();