Add sub link share

This commit is contained in:
problematicconsumer
2023-11-12 22:22:20 +03:30
parent 577bb3ded3
commit c1d3c5445f
6 changed files with 37 additions and 1 deletions

View File

@@ -69,6 +69,8 @@
}, },
"share": { "share": {
"buttonText": "Share", "buttonText": "Share",
"exportToClipboardSuccess": "Exported to clipboard",
"exportSubLinkToClipboard": "Export subscription link to clipboard",
"exportConfigToClipboard": "Export configuration to clipboard", "exportConfigToClipboard": "Export configuration to clipboard",
"exportConfigToClipboardSuccess": "Configuration copied to clipboard" "exportConfigToClipboardSuccess": "Configuration copied to clipboard"
}, },

View File

@@ -69,6 +69,8 @@
}, },
"share": { "share": {
"buttonText": "اشتراک گذاری", "buttonText": "اشتراک گذاری",
"exportToClipboardSuccess": "به کلیپ بورد اضافه شد",
"exportSubLinkToClipboard": "افزودن لینک اشتراک به کلیپ بورد",
"exportConfigToClipboard": "افزودن پیکربندی به کلیپ بورد", "exportConfigToClipboard": "افزودن پیکربندی به کلیپ بورد",
"exportConfigToClipboardSuccess": "پیکربندی در کلیپ بورد کپی شد" "exportConfigToClipboardSuccess": "پیکربندی در کلیپ بورد کپی شد"
}, },

View File

@@ -69,6 +69,8 @@
}, },
"share": { "share": {
"buttonText": "Делиться", "buttonText": "Делиться",
"exportToClipboardSuccess": "Экспортировано в буфер обмена",
"exportSubLinkToClipboard": "Экспортировать ссылку на подписку в буфер обмена",
"exportConfigToClipboard": "Экспортировать конфигурацию в буфер обмена", "exportConfigToClipboard": "Экспортировать конфигурацию в буфер обмена",
"exportConfigToClipboardSuccess": "Конфигурация скопирована в буфер обмена." "exportConfigToClipboardSuccess": "Конфигурация скопирована в буфер обмена."
}, },
@@ -280,4 +282,4 @@
"short_description": "Автовыбор, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks", "short_description": "Автовыбор, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks",
"full_description": "Основная цель HiddifyNext — предоставить безопасный, удобный и эффективный клиент туннелирования. Он позволяет направлять весь трафик или трафик выбранного приложения на выбранный вами удалённый сервер, используя разрешение VPNсервиса.\n\nПримечание: мы не предоставляем серверы, пользователи должны обеспечивать конфиденциальность своих действий в Интернете, используя собственный сервер или доверенные серверы.\n \nПоддерживаемые серверы:\n— Обычная ссылка на подписку V2ray/Xray\n— Ссылка на подписку Clash\n— Ссылка на подписку на SingBox\n\nВ чём уникальные особенности?\n — Удобство\n — Оптимизация и скорость\n — Автоматический выбор минимальной задержки\n — Отображение информации об использовании\n — Простой импорт ссылок одним щелчком мыши\n — Бесплатно и без рекламы\n — Простое переключение ссылок\n — …и много больше\n\nПоддержка:\n• Все протоколы, поддерживаемые Sing-Box\n• VLESS + xtls reality, vision\n• VMESS\n• Trojan\n• ShoadowSocks\n• Reality\n• V2ray\n• Hystria2\n• TUIC\n• SSH\n• ShadowTLS\n\n\nИсходный код доступен по адресу https://github.com/hiddify/Hiddify-Next.\nЯдро приложения основано на открытом исходном коде SingBox.\n\nОписание разрешений:\n— СЛУЖБА VPN: поскольку целью данного приложения является предоставление безопасного, удобного и эффективного клиента туннелирования, это разрешение необходимо, чтобы иметь возможность направлять трафик через туннель на удалённый сервер.\n— ЗАПРОС ВСЕХ ПАКЕТОВ: это разрешение позволяет включать или исключать определённые приложения для туннелирования.\n— ИНФОРМИРОВАНИЕ О ЗАВЕРШЕНИИ ЗАГРУЗКИ: это разрешение можно включить или отключить в настройках приложения, чтобы (де)активировать запуск приложения при загрузке устройства.\n— ПОСТОЯННОЕ УВЕДОМЛЕНИЕ: это разрешение необходимо, поскольку используется приоритетная служба для обеспечения непрерывной работы службы VPN.\n— Приложение не содержит рекламы. Сбор аналитики и данных о сбоях происходят только с явного согласия пользователя при первом использовании приложения." "full_description": "Основная цель HiddifyNext — предоставить безопасный, удобный и эффективный клиент туннелирования. Он позволяет направлять весь трафик или трафик выбранного приложения на выбранный вами удалённый сервер, используя разрешение VPNсервиса.\n\nПримечание: мы не предоставляем серверы, пользователи должны обеспечивать конфиденциальность своих действий в Интернете, используя собственный сервер или доверенные серверы.\n \nПоддерживаемые серверы:\n— Обычная ссылка на подписку V2ray/Xray\n— Ссылка на подписку Clash\n— Ссылка на подписку на SingBox\n\nВ чём уникальные особенности?\n — Удобство\n — Оптимизация и скорость\n — Автоматический выбор минимальной задержки\n — Отображение информации об использовании\n — Простой импорт ссылок одним щелчком мыши\n — Бесплатно и без рекламы\n — Простое переключение ссылок\n — …и много больше\n\nПоддержка:\n• Все протоколы, поддерживаемые Sing-Box\n• VLESS + xtls reality, vision\n• VMESS\n• Trojan\n• ShoadowSocks\n• Reality\n• V2ray\n• Hystria2\n• TUIC\n• SSH\n• ShadowTLS\n\n\nИсходный код доступен по адресу https://github.com/hiddify/Hiddify-Next.\nЯдро приложения основано на открытом исходном коде SingBox.\n\nОписание разрешений:\n— СЛУЖБА VPN: поскольку целью данного приложения является предоставление безопасного, удобного и эффективного клиента туннелирования, это разрешение необходимо, чтобы иметь возможность направлять трафик через туннель на удалённый сервер.\n— ЗАПРОС ВСЕХ ПАКЕТОВ: это разрешение позволяет включать или исключать определённые приложения для туннелирования.\n— ИНФОРМИРОВАНИЕ О ЗАВЕРШЕНИИ ЗАГРУЗКИ: это разрешение можно включить или отключить в настройках приложения, чтобы (де)активировать запуск приложения при загрузке устройства.\n— ПОСТОЯННОЕ УВЕДОМЛЕНИЕ: это разрешение необходимо, поскольку используется приоритетная служба для обеспечения непрерывной работы службы VPN.\n— Приложение не содержит рекламы. Сбор аналитики и данных о сбоях происходят только с явного согласия пользователя при первом использовании приложения."
} }
} }

View File

@@ -69,6 +69,8 @@
}, },
"share": { "share": {
"buttonText": "分享", "buttonText": "分享",
"exportToClipboardSuccess": "导出到剪贴板",
"exportSubLinkToClipboard": "将订阅链接导出到剪贴板",
"exportConfigToClipboard": "将配置导出到剪贴板", "exportConfigToClipboard": "将配置导出到剪贴板",
"exportConfigToClipboardSuccess": "配置已复制到剪贴板" "exportConfigToClipboardSuccess": "配置已复制到剪贴板"
}, },

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:hiddify/core/core_providers.dart'; import 'package:hiddify/core/core_providers.dart';
@@ -288,6 +289,20 @@ class ProfileActionsMenu extends HookConsumerWidget {
), ),
SubmenuButton( SubmenuButton(
menuChildren: [ menuChildren: [
if (profile case RemoteProfile(:final url, :final name))
MenuItemButton(
child: Text(t.profile.share.exportSubLinkToClipboard),
onPressed: () async {
final link = LinkParser.generateSubShareLink(url, name);
if (link.isNotEmpty) {
await Clipboard.setData(ClipboardData(text: link));
if (context.mounted) {
CustomToast(t.profile.share.exportToClipboardSuccess)
.show(context);
}
}
},
),
MenuItemButton( MenuItemButton(
child: Text(t.profile.share.exportConfigToClipboard), child: Text(t.profile.share.exportConfigToClipboard),
onPressed: () async { onPressed: () async {

View File

@@ -7,6 +7,19 @@ typedef ProfileLink = ({String url, String name});
// TODO: test and improve // TODO: test and improve
abstract class LinkParser { abstract class LinkParser {
static String generateSubShareLink(String url, [String? name]) {
final uri = Uri.tryParse(url);
if (uri == null) return '';
return Uri(
scheme: 'hiddify',
host: 'install-sub',
queryParameters: {
"url": uri.toString(),
if (name != null) "name": name,
},
).toString();
}
// protocols schemas // protocols schemas
static const protocols = {'clash', 'clashmeta', 'sing-box', 'hiddify'}; static const protocols = {'clash', 'clashmeta', 'sing-box', 'hiddify'};
static const rawProtocols = { static const rawProtocols = {