merge: sync codex/fix/flash-no-catalog with master

This commit is contained in:
Tommaso Casaburi
2026-06-01 12:42:45 +07:00
8 changed files with 167 additions and 13 deletions
@@ -444,6 +444,7 @@ describe('PostForm', () => {
testState.directories = [
{ address: 'music-posting.eth', features: {}, title: '/mu/ - Music' },
{ 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: '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 () => {
testState.resolvedCommunityAddress = 'politically-incorrect.bso';
+1 -1
View File
@@ -391,7 +391,7 @@ const PostFormFields = ({
<tr>
<td>{t('tag')}</td>
<td>
<select name='flashTag' aria-label={t('tag')} ref={flashTagRef} defaultValue=''>
<select name='flashTag' aria-label={t('tag')} className={styles.flagSelector} ref={flashTagRef} defaultValue=''>
<option value=''>{t('choose_one')}</option>
{flashTagOptions.map((option) => (
<option key={option.value} value={option.value}>
@@ -340,6 +340,18 @@ describe('ReplyModal', () => {
features: { hasFlags: true },
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': {
address: 'random-nsfw.bso',
features: {},
@@ -494,8 +506,12 @@ describe('ReplyModal', () => {
});
});
it('publishes geographic location on /bant/ without showing a flag selector', async () => {
await renderReplyModal('/bant/thread/post-1', 'international-nsfw.bso');
it.each([
{ 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();
@@ -256,6 +256,73 @@ describe('P2PStatsSettings', () => {
expect(fetchMock).toHaveBeenCalledWith('https://free.freeipapi.com/api/json/91.234.199.189', expect.objectContaining({ signal: expect.any(AbortSignal) }));
});
it('shows peer country flags for DNS6 relay hostnames with embedded IPv6 addresses', async () => {
const fetchMock = vi.fn(async (url: string | URL | Request) => {
const requestUrl = String(url);
if (requestUrl === 'https://free.freeipapi.com/api/json/2a11%3A6100%3A0%3A5e9f%3A%3A0') {
return {
ok: true,
json: async () => ({
cityName: 'Reykjavik',
countryCode: 'IS',
ipAddress: '2a11:6100:0:5e9f::0',
latitude: 64.1466,
longitude: -21.9426,
}),
};
}
return {
ok: true,
json: async () => ({ country: 'US', ip: '147.75.84.175' }),
};
});
vi.stubGlobal('fetch', fetchMock);
testState.account = {
...testState.account,
pkcOptions: {
libp2pJsClientsOptions: [{ key: 'libp2pjs' }],
},
pkc: {
clients: {
libp2pJsClients: {
libp2pjs: {
key: 'libp2pjs',
_helia: {
libp2p: {
getConnections: () => [
{
remoteAddr: {
toString: () => '/dns6/2a11-6100-0-5e9f--0.k51qzi5uqu5djg5pdoi9a98.example/tcp/443/ws/p2p/relay-peer/p2p-circuit/p2p/12D3KooWIPv6Peer',
},
remotePeer: { toString: () => '12D3KooWIPv6Peer' },
},
],
getMultiaddrs: () => ['/ip4/147.75.84.175/tcp/4001/ws'],
getPeers: () => ['12D3KooWIPv6Peer'],
peerId: { toString: () => 'self-peer' },
},
},
},
},
},
},
};
await renderSettings(false);
await act(async () => {
await Promise.resolve();
await Promise.resolve();
});
const connectedPeers = container.querySelector('[data-testid="connected-peers"]');
expect(connectedPeers?.textContent).toContain('WebSocket through relay');
expect(connectedPeers?.querySelector('img[aria-label="Iceland"]')).not.toBeNull();
expect(fetchMock).toHaveBeenCalledWith(
'https://free.freeipapi.com/api/json/2a11%3A6100%3A0%3A5e9f%3A%3A0',
expect.objectContaining({ signal: expect.any(AbortSignal) }),
);
});
it('shows the own IP flag and a red precise map marker when leeching', async () => {
const fetchMock = vi.fn(async (url: string | URL | Request) => {
const requestUrl = String(url);