|
@@ -111,6 +111,13 @@ export default function SubPage() {
|
|
|
if (ok) messageApi.success(t('copied'));
|
|
if (ok) messageApi.success(t('copied'));
|
|
|
}, [t, messageApi]);
|
|
}, [t, messageApi]);
|
|
|
|
|
|
|
|
|
|
+ const copyAll = useCallback(async () => {
|
|
|
|
|
+ if (links.length === 0) return;
|
|
|
|
|
+ const allLinks = links.join('\n');
|
|
|
|
|
+ const ok = await ClipboardManager.copyText(allLinks);
|
|
|
|
|
+ if (ok) messageApi.success(t('subscription.copyAllConfigsCopied'));
|
|
|
|
|
+ }, [t, messageApi]);
|
|
|
|
|
+
|
|
|
const open = useCallback((url: string) => {
|
|
const open = useCallback((url: string) => {
|
|
|
if (!url) return;
|
|
if (!url) return;
|
|
|
window.open(url, '_blank');
|
|
window.open(url, '_blank');
|
|
@@ -393,6 +400,18 @@ export default function SubPage() {
|
|
|
<>
|
|
<>
|
|
|
<Divider>{t('pages.inbounds.copyLink')}</Divider>
|
|
<Divider>{t('pages.inbounds.copyLink')}</Divider>
|
|
|
<div className="links-section">
|
|
<div className="links-section">
|
|
|
|
|
+ <div className="sub-link-row">
|
|
|
|
|
+ <span className="sub-link-title">{t('subscription.copyAllConfigs')}</span>
|
|
|
|
|
+ <div className="sub-link-actions">
|
|
|
|
|
+ <Button
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ icon={<CopyOutlined />}
|
|
|
|
|
+ onClick={copyAll}
|
|
|
|
|
+ aria-label={t('subscription.copyAllConfigs')}
|
|
|
|
|
+ title={t('subscription.copyAllConfigs')}
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
{links.map((link, idx) => {
|
|
{links.map((link, idx) => {
|
|
|
const parts = parseLinkParts(link, linkEmails[idx] || '');
|
|
const parts = parseLinkParts(link, linkEmails[idx] || '');
|
|
|
const fallback = `Link ${idx + 1}`;
|
|
const fallback = `Link ${idx + 1}`;
|