Files
flvx/vite-frontend/src/pages/forward/address.ts
T

134 lines
2.7 KiB
TypeScript

export interface ForwardAddressItem {
id: number;
address: string;
copying: boolean;
}
export type ForwardAddressAction =
| { type: "none" }
| { type: "copy"; text: string; label: string }
| { type: "modal"; title: string; items: ForwardAddressItem[] };
const splitAddressEntries = (value: string): string[] => {
return value
.split(",")
.map((item) => item.trim())
.filter((item) => item);
};
const formatAddressWithPort = (ip: string, port: number): string => {
if (ip.includes(":") && !ip.startsWith("[")) {
return `[${ip}]:${port}`;
}
return `${ip}:${port}`;
};
export const formatInAddress = (ipString: string, port: number): string => {
if (!ipString) {
return "";
}
const items = splitAddressEntries(ipString);
if (items.length === 0) {
return "";
}
const hasPort = /:\d+$/.test(items[0]);
if (hasPort) {
if (items.length === 1) {
return items[0];
}
return `${items[0]} (+${items.length - 1}个)`;
}
if (!port) {
return "";
}
if (items.length === 1) {
return formatAddressWithPort(items[0], port);
}
return `${formatAddressWithPort(items[0], port)} (+${items.length - 1}个)`;
};
export const formatRemoteAddress = (addressString: string): string => {
if (!addressString) {
return "";
}
const addresses = splitAddressEntries(addressString);
if (addresses.length === 0) {
return "";
}
if (addresses.length === 1) {
return addresses[0];
}
return `${addresses[0]} (+${addresses.length - 1})`;
};
export const hasMultipleAddresses = (addressString: string): boolean => {
if (!addressString) {
return false;
}
return splitAddressEntries(addressString).length > 1;
};
export const resolveForwardAddressAction = (
addressString: string,
port: number | null,
title: string,
): ForwardAddressAction => {
if (!addressString) {
return { type: "none" };
}
let addresses: string[];
if (port !== null) {
const items = splitAddressEntries(addressString);
if (items.length <= 1) {
return {
type: "copy",
text: formatInAddress(addressString, port),
label: title,
};
}
const hasPort = /:\d+$/.test(items[0]);
addresses = hasPort
? items
: items.map((ip) => formatAddressWithPort(ip, port));
} else {
addresses = splitAddressEntries(addressString);
if (addresses.length <= 1) {
return {
type: "copy",
text: addressString,
label: title,
};
}
}
return {
type: "modal",
title: `${title} (${addresses.length}个)`,
items: addresses.map((address, index) => ({
id: index,
address,
copying: false,
})),
};
};