mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-02-17 08:07:46 +01:00
209 lines
8.4 KiB
TypeScript
209 lines
8.4 KiB
TypeScript
import { patchModel, settingsAtom } from '@yaakapp-internal/models';
|
|
import { useAtomValue } from 'jotai';
|
|
|
|
import { Checkbox } from '../core/Checkbox';
|
|
import { Heading } from '../core/Heading';
|
|
import { InlineCode } from '../core/InlineCode';
|
|
import { PlainInput } from '../core/PlainInput';
|
|
import { Select } from '../core/Select';
|
|
import { Separator } from '../core/Separator';
|
|
import { HStack, VStack } from '../core/Stacks';
|
|
|
|
export function SettingsProxy() {
|
|
const settings = useAtomValue(settingsAtom);
|
|
|
|
return (
|
|
<VStack space={1.5} className="mb-4">
|
|
<div className="mb-3">
|
|
<Heading>Proxy</Heading>
|
|
<p className="text-text-subtle">
|
|
Configure a proxy server for HTTP requests. Useful for corporate firewalls, debugging
|
|
traffic, or routing through specific infrastructure.
|
|
</p>
|
|
</div>
|
|
<Select
|
|
name="proxy"
|
|
label="Proxy"
|
|
hideLabel
|
|
size="sm"
|
|
value={settings.proxy?.type ?? 'automatic'}
|
|
onChange={async (v) => {
|
|
if (v === 'automatic') {
|
|
await patchModel(settings, { proxy: undefined });
|
|
} else if (v === 'enabled') {
|
|
await patchModel(settings, {
|
|
proxy: {
|
|
disabled: false,
|
|
type: 'enabled',
|
|
http: '',
|
|
https: '',
|
|
auth: { user: '', password: '' },
|
|
bypass: '',
|
|
},
|
|
});
|
|
} else {
|
|
await patchModel(settings, { proxy: { type: 'disabled' } });
|
|
}
|
|
}}
|
|
options={[
|
|
{ label: 'Automatic proxy detection', value: 'automatic' },
|
|
{ label: 'Custom proxy configuration', value: 'enabled' },
|
|
{ label: 'No proxy', value: 'disabled' },
|
|
]}
|
|
/>
|
|
{settings.proxy?.type === 'enabled' && (
|
|
<VStack space={1.5}>
|
|
<Checkbox
|
|
className="my-3"
|
|
checked={!settings.proxy.disabled}
|
|
title="Enable proxy"
|
|
help="Use this to temporarily disable the proxy without losing the configuration"
|
|
onChange={async (enabled) => {
|
|
const { proxy } = settings;
|
|
const http = proxy?.type === 'enabled' ? proxy.http : '';
|
|
const https = proxy?.type === 'enabled' ? proxy.https : '';
|
|
const bypass = proxy?.type === 'enabled' ? proxy.bypass : '';
|
|
const auth = proxy?.type === 'enabled' ? proxy.auth : null;
|
|
const disabled = !enabled;
|
|
await patchModel(settings, {
|
|
proxy: { type: 'enabled', http, https, auth, disabled, bypass },
|
|
});
|
|
}}
|
|
/>
|
|
<HStack space={1.5}>
|
|
<PlainInput
|
|
size="sm"
|
|
label={
|
|
<>
|
|
Proxy for <InlineCode>http://</InlineCode> traffic
|
|
</>
|
|
}
|
|
placeholder="localhost:9090"
|
|
defaultValue={settings.proxy?.http}
|
|
onChange={async (http) => {
|
|
const { proxy } = settings;
|
|
const https = proxy?.type === 'enabled' ? proxy.https : '';
|
|
const bypass = proxy?.type === 'enabled' ? proxy.bypass : '';
|
|
const auth = proxy?.type === 'enabled' ? proxy.auth : null;
|
|
const disabled = proxy?.type === 'enabled' ? proxy.disabled : false;
|
|
await patchModel(settings, {
|
|
proxy: {
|
|
type: 'enabled',
|
|
http,
|
|
https,
|
|
auth,
|
|
disabled,
|
|
bypass,
|
|
},
|
|
});
|
|
}}
|
|
/>
|
|
<PlainInput
|
|
size="sm"
|
|
label={
|
|
<>
|
|
Proxy for <InlineCode>https://</InlineCode> traffic
|
|
</>
|
|
}
|
|
placeholder="localhost:9090"
|
|
defaultValue={settings.proxy?.https}
|
|
onChange={async (https) => {
|
|
const { proxy } = settings;
|
|
const http = proxy?.type === 'enabled' ? proxy.http : '';
|
|
const bypass = proxy?.type === 'enabled' ? proxy.bypass : '';
|
|
const auth = proxy?.type === 'enabled' ? proxy.auth : null;
|
|
const disabled = proxy?.type === 'enabled' ? proxy.disabled : false;
|
|
await patchModel(settings, {
|
|
proxy: { type: 'enabled', http, https, auth, disabled, bypass },
|
|
});
|
|
}}
|
|
/>
|
|
</HStack>
|
|
<Separator className="my-6" />
|
|
<Checkbox
|
|
checked={settings.proxy.auth != null}
|
|
title="Enable authentication"
|
|
onChange={async (enabled) => {
|
|
const { proxy } = settings;
|
|
const http = proxy?.type === 'enabled' ? proxy.http : '';
|
|
const https = proxy?.type === 'enabled' ? proxy.https : '';
|
|
const disabled = proxy?.type === 'enabled' ? proxy.disabled : false;
|
|
const bypass = proxy?.type === 'enabled' ? proxy.bypass : '';
|
|
const auth = enabled ? { user: '', password: '' } : null;
|
|
await patchModel(settings, {
|
|
proxy: { type: 'enabled', http, https, auth, disabled, bypass },
|
|
});
|
|
}}
|
|
/>
|
|
|
|
{settings.proxy.auth != null && (
|
|
<HStack space={1.5}>
|
|
<PlainInput
|
|
required
|
|
size="sm"
|
|
label="User"
|
|
placeholder="myUser"
|
|
defaultValue={settings.proxy.auth.user}
|
|
onChange={async (user) => {
|
|
const { proxy } = settings;
|
|
const http = proxy?.type === 'enabled' ? proxy.http : '';
|
|
const https = proxy?.type === 'enabled' ? proxy.https : '';
|
|
const disabled = proxy?.type === 'enabled' ? proxy.disabled : false;
|
|
const bypass = proxy?.type === 'enabled' ? proxy.bypass : '';
|
|
const password = proxy?.type === 'enabled' ? (proxy.auth?.password ?? '') : '';
|
|
const auth = { user, password };
|
|
await patchModel(settings, {
|
|
proxy: { type: 'enabled', http, https, auth, disabled, bypass },
|
|
});
|
|
}}
|
|
/>
|
|
<PlainInput
|
|
size="sm"
|
|
label="Password"
|
|
type="password"
|
|
placeholder="s3cretPassw0rd"
|
|
defaultValue={settings.proxy.auth.password}
|
|
onChange={async (password) => {
|
|
const { proxy } = settings;
|
|
const http = proxy?.type === 'enabled' ? proxy.http : '';
|
|
const https = proxy?.type === 'enabled' ? proxy.https : '';
|
|
const disabled = proxy?.type === 'enabled' ? proxy.disabled : false;
|
|
const bypass = proxy?.type === 'enabled' ? proxy.bypass : '';
|
|
const user = proxy?.type === 'enabled' ? (proxy.auth?.user ?? '') : '';
|
|
const auth = { user, password };
|
|
await patchModel(settings, {
|
|
proxy: { type: 'enabled', http, https, auth, disabled, bypass },
|
|
});
|
|
}}
|
|
/>
|
|
</HStack>
|
|
)}
|
|
{settings.proxy.type === 'enabled' && (
|
|
<>
|
|
<Separator className="my-6" />
|
|
<PlainInput
|
|
label="Proxy Bypass"
|
|
help="Comma-separated list to bypass the proxy."
|
|
defaultValue={settings.proxy.bypass}
|
|
placeholder="127.0.0.1, *.example.com, localhost:3000"
|
|
onChange={async (bypass) => {
|
|
const { proxy } = settings;
|
|
const http = proxy?.type === 'enabled' ? proxy.http : '';
|
|
const https = proxy?.type === 'enabled' ? proxy.https : '';
|
|
const disabled = proxy?.type === 'enabled' ? proxy.disabled : false;
|
|
const user = proxy?.type === 'enabled' ? (proxy.auth?.user ?? '') : '';
|
|
const password = proxy?.type === 'enabled' ? (proxy.auth?.password ?? '') : '';
|
|
const auth = { user, password };
|
|
await patchModel(settings, {
|
|
proxy: { type: 'enabled', http, https, auth, disabled, bypass },
|
|
});
|
|
}}
|
|
/>
|
|
</>
|
|
)}
|
|
</VStack>
|
|
)}
|
|
</VStack>
|
|
);
|
|
}
|