fix(p2p): force browser mode on p2p subdomains

This commit is contained in:
Tommaso Casaburi
2026-05-11 17:18:16 +07:00
parent e38d888b74
commit a97b891c5f
6 changed files with 90 additions and 5 deletions
@@ -87,6 +87,17 @@ const getSaveAdvancedSettingsButton = () => {
return button as HTMLButtonElement;
};
const setTestHostname = (hostname: string) => {
Object.defineProperty(window, 'location', {
configurable: true,
value: {
...originalLocation,
hostname,
reload: reloadMock,
},
});
};
describe('AdvancedSettings', () => {
beforeEach(() => {
vi.clearAllMocks();
@@ -120,6 +131,7 @@ describe('AdvancedSettings', () => {
configurable: true,
value: {
...originalLocation,
hostname: '5chan.app',
reload: reloadMock,
},
});
@@ -227,6 +239,31 @@ describe('AdvancedSettings', () => {
expect(reloadMock).toHaveBeenCalledOnce();
});
it('forces the browser pure p2p toggle on p2p subdomains', async () => {
localStorage.setItem('5chan:pure-p2p-browser-enabled', 'false');
setTestHostname('p2p.5chan.app');
await renderSettings(false);
const checkbox = container.querySelector<HTMLInputElement>('input[type="checkbox"]');
expect(checkbox?.checked).toBe(true);
expect(checkbox?.disabled).toBe(true);
await clickButton('save_advanced_settings');
expect(testState.setAccountMock).toHaveBeenCalledWith(
expect.objectContaining({
pkcOptions: expect.objectContaining({
ipfsGatewayUrls: undefined,
libp2pJsClientsOptions: [{ key: 'libp2pjs' }],
pkcRpcClientsOptions: undefined,
pubsubKuboRpcClientsOptions: undefined,
}),
}),
);
expect(localStorage.getItem('5chan:pure-p2p-browser-enabled')).toBe('true');
});
it('saves gateway mode defaults when browser pure p2p is disabled', async () => {
testState.account = {
mediaIpfsGatewayUrl: 'https://media.old.example',
@@ -1,7 +1,7 @@
import { memo, RefObject, useRef, useState } from 'react';
import { setAccount, useAccount, usePkcRpcSettings } from '@bitsocial/bitsocial-react-hooks';
import { useTranslation } from 'react-i18next';
import { getBrowserGatewayPkcOptions, getBrowserPureP2PPkcOptions, setPureP2PBrowserPreference } from '../../../lib/p2p-browser-config';
import { getBrowserGatewayPkcOptions, getBrowserPureP2PPkcOptions, isPureP2PBrowserForced, setPureP2PBrowserPreference } from '../../../lib/p2p-browser-config';
import { canConfigureBrowserPureP2P, isBrowserPureP2PEnabled } from '../../../lib/p2p-runtime';
import styles from './advanced-settings.module.css';
@@ -205,11 +205,18 @@ const P2pDataPathSettings = ({ p2pDataPathRef }: SettingsProps) => {
const PureP2PBrowserSettings = ({ pureP2PBrowserRef }: SettingsProps) => {
const { t } = useTranslation();
const account = useAccount() as AccountShape | undefined;
const isForced = isPureP2PBrowserForced();
return (
<div className={styles.pureP2PSettings}>
<label>
<input className={styles.pureP2PCheckbox} type='checkbox' defaultChecked={isBrowserPureP2PEnabled(account)} ref={pureP2PBrowserRef} />
<input
className={styles.pureP2PCheckbox}
type='checkbox'
defaultChecked={isForced || isBrowserPureP2PEnabled(account)}
disabled={isForced}
ref={pureP2PBrowserRef}
/>
{t('enable_pure_p2p')}
</label>
<div className={styles.settingTip}>{t('enable_pure_p2p_tip')}</div>
@@ -254,7 +261,7 @@ const AdvancedSettings = () => {
const pkcRpcClientsOptions = p2pRpcRef.current?.value.trim() ? [p2pRpcRef.current.value.trim()] : undefined;
const dataPath = p2pDataPathRef.current?.value.trim() || undefined;
const pureP2PBrowserPreference = canConfigureBrowserPureP2P() ? pureP2PBrowserRef.current?.checked : undefined;
const pureP2PBrowserPreference = canConfigureBrowserPureP2P() ? isPureP2PBrowserForced() || pureP2PBrowserRef.current?.checked : undefined;
const chainProviders: Record<string, { urls: string[] | undefined; chainId: number }> = {};
if (ethRpcUrls && ethRpcUrls.length > 0) {