DnsPresetsModal.vue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <script setup>
  2. import { computed } from 'vue';
  3. import { useI18n } from 'vue-i18n';
  4. const { t } = useI18n();
  5. defineProps({
  6. open: { type: Boolean, default: false },
  7. });
  8. const emit = defineEmits(['update:open', 'install']);
  9. const PRESETS = [
  10. {
  11. name: 'Google DNS',
  12. family: false,
  13. data: [
  14. '8.8.8.8',
  15. '8.8.4.4',
  16. '2001:4860:4860::8888',
  17. '2001:4860:4860::8844',
  18. ],
  19. },
  20. {
  21. name: 'Cloudflare DNS',
  22. family: false,
  23. data: [
  24. '1.1.1.1',
  25. '1.0.0.1',
  26. '2606:4700:4700::1111',
  27. '2606:4700:4700::1001',
  28. ],
  29. },
  30. {
  31. name: 'AdGuard DNS',
  32. family: false,
  33. data: [
  34. '94.140.14.14',
  35. '94.140.15.15',
  36. '2a10:50c0::ad1:ff',
  37. '2a10:50c0::ad2:ff',
  38. ],
  39. },
  40. {
  41. name: 'AdGuard Family DNS',
  42. family: true,
  43. data: [
  44. '94.140.14.15',
  45. '94.140.15.16',
  46. '2a10:50c0::bad1:ff',
  47. '2a10:50c0::bad2:ff',
  48. ],
  49. },
  50. {
  51. name: 'Cloudflare Family DNS',
  52. family: true,
  53. data: [
  54. '1.1.1.3',
  55. '1.0.0.3',
  56. '2606:4700:4700::1113',
  57. '2606:4700:4700::1003',
  58. ],
  59. },
  60. ];
  61. const title = computed(() => t('pages.xray.dns.dnsPresetTitle'));
  62. function close() { emit('update:open', false); }
  63. function install(preset) {
  64. emit('install', [...preset.data]);
  65. }
  66. </script>
  67. <template>
  68. <a-modal :open="open" :title="title" :footer="null" :mask-closable="false" @cancel="close">
  69. <a-list bordered>
  70. <a-list-item v-for="preset in PRESETS" :key="preset.name" class="preset-row">
  71. <a-space size="small" align="center">
  72. <a-tag :color="preset.family ? 'purple' : 'green'">
  73. {{ preset.family ? t('pages.xray.dns.dnsPresetFamily') : 'DNS' }}
  74. </a-tag>
  75. <span class="preset-name">{{ preset.name }}</span>
  76. </a-space>
  77. <a-button type="primary" size="small" @click="install(preset)">
  78. {{ t('install') }}
  79. </a-button>
  80. </a-list-item>
  81. </a-list>
  82. </a-modal>
  83. </template>
  84. <style scoped>
  85. .preset-row {
  86. display: flex;
  87. align-items: center;
  88. justify-content: space-between;
  89. gap: 8px;
  90. }
  91. .preset-name {
  92. font-weight: 500;
  93. }
  94. </style>