'use client';
import { useStatus } from '@/context/status';
import { PageWrapper } from '../shared/page-wrapper';
import { useState, useEffect } from 'react';
import * as constants from '../../../../core/src/utils/constants';
import { useUserData } from '@/context/userData';
import { Switch } from '../ui/switch';
import { Select } from '../ui/select';
import { Combobox } from '../ui/combobox';
import { SettingsCard } from '../shared/settings-card';
import { TextInput } from '../ui/text-input';
import { toast } from 'sonner';
import { Button } from '../ui/button';
import MarkdownLite from '../shared/markdown-lite';
import { PageControls } from '../shared/page-controls';
import { PasswordInput } from '../ui/password-input';
type ProxyServiceId = keyof typeof constants.PROXY_SERVICE_DETAILS;
type ProxyConfig = {
enabled: boolean;
id: ProxyServiceId;
url: string;
credentials: string;
publicIp?: string;
proxiedAddons?: string[];
proxiedServices?: string[];
};
export function ProxyMenu() {
return (
<>
>
);
}
function Content() {
const { status } = useStatus();
const { userData, setUserData } = useUserData();
const details = constants.PROXY_SERVICE_DETAILS;
// Effect to initialize values from userData/defaults/forced
// Generate options for proxy service select
const proxyOptions = Object.entries(details).map(([id, detail]) => ({
label: detail.name,
value: id,
}));
// Generate options for services multi-select
const serviceOptions = [
...Object.values(constants.SERVICE_DETAILS).map((service) => ({
label: service.name,
value: service.id,
textValue: service.name,
})),
{
label: 'None',
value: 'none',
textValue: 'None',
},
];
const addonOptions = userData.presets.map((preset) => {
return {
label: preset.options.name || preset.type,
value: preset.instanceId,
textValue: preset.options.name,
};
});
// lues are forced
const isForced = status?.settings.forced.proxy;
const isProxyForced = isForced?.enabled !== null;
const isUrlForced = isForced?.url !== null;
const isIdForced = isForced?.id !== null;
const isPublicIpForced = isForced?.publicIp !== null;
const isCredentialsForced = isForced?.credentials !== null;
const isServicesForced = isForced?.proxiedServices !== null;
const isProxiedAddonsDisabled = isForced?.disableProxiedAddons;
const selectedProxyDetails = userData.proxy?.id
? details[userData.proxy.id]
: undefined;
return (
<>
Proxy
Configure a proxy for your streams to bypass IP restrictions or
improve compatibility
{
setUserData((prev) => ({
...prev,
proxy: { ...prev.proxy, enabled: v },
}));
}}
disabled={isProxyForced}
/>
{
setUserData((prev) => ({
...prev,
proxy: { ...prev.proxy, id: v as ProxyServiceId },
}));
}}
options={proxyOptions}
disabled={isIdForced || !userData.proxy?.enabled}
/>
{selectedProxyDetails && (
{selectedProxyDetails.description}
)}
{
setUserData((prev) => ({
...prev,
proxy: { ...prev.proxy, url: v },
}));
}}
placeholder="Enter proxy URL"
disabled={isUrlForced || !userData.proxy?.enabled}
/>
The URL of your hosted proxy service.
{
setUserData((prev) => ({
...prev,
proxy: { ...prev.proxy, credentials: v },
}));
}}
placeholder="Enter proxy credentials"
disabled={isCredentialsForced || !userData.proxy?.enabled}
/>
{selectedProxyDetails && (
{selectedProxyDetails.credentialDescription}
)}
{
setUserData((prev) => ({
...prev,
proxy: { ...prev.proxy, publicIp: v || undefined },
}));
}}
placeholder="Enter public IP"
disabled={isPublicIpForced || !userData.proxy?.enabled}
/>
Configure this only when running {selectedProxyDetails?.name}{' '}
locally with a proxy service. Leave empty if{' '}
{selectedProxyDetails?.name} is configured locally without a proxy
server or if it's hosted on a remote server.
{
setUserData((prev) => ({
...prev,
proxy: { ...prev.proxy, proxiedServices: v },
}));
}}
options={serviceOptions}
placeholder="Select services to proxy"
multiple={true}
disabled={isServicesForced || !userData.proxy?.enabled}
emptyMessage="No services available"
/>
Only streams (that are detected to be) from these services will be
proxied. Select None to enable proxying of streams that are not
detected to be from a service.
{
setUserData((prev) => ({
...prev,
proxy: { ...prev.proxy, proxiedAddons: v },
}));
}}
options={addonOptions}
placeholder="Select addons to proxy"
multiple={true}
disabled={isProxiedAddonsDisabled || !userData.proxy?.enabled}
emptyMessage="No addons available"
/>
Only streams from these addons will be proxied
>
);
}