refactor(communities): remove gatewayDefault from community model and UI components for streamlined data handling
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m51s

This commit is contained in:
2026-02-24 12:18:44 +07:00
parent 5e6435e2e1
commit f48e30ab44
8 changed files with 151 additions and 86 deletions
-2
View File
@@ -23,7 +23,6 @@ async function getCommunities(req, res) {
name: c.name ? String(c.name) : '',
description: c.description ? String(c.description) : '',
tags: Array.isArray(c.tags) ? c.tags.map(String) : [],
gatewayDefault: c.gatewayDefault ? String(c.gatewayDefault) : '',
color: c.color ? String(c.color) : '',
icon: c.icon ? String(c.icon) : ''
}));
@@ -69,7 +68,6 @@ async function postCommunities(req, res) {
name: entry.name ? String(entry.name) : '',
description: entry.description ? String(entry.description) : '',
tags: Array.isArray(entry.tags) ? entry.tags.map(String) : [],
gatewayDefault: entry.gatewayDefault ? String(entry.gatewayDefault) : '',
color: entry.color ? String(entry.color) : '',
icon: entry.icon ? String(entry.icon) : '',
category: entry.category ? String(entry.category) : '',
+10
View File
@@ -20,6 +20,7 @@
"diff": "^8.0.3",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-icons": "^5.5.0",
"react-router-dom": "^6.30.1",
"recharts": "^3.7.0"
},
@@ -2798,6 +2799,15 @@
"react": "^19.1.0"
}
},
"node_modules/react-icons": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz",
"integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==",
"license": "MIT",
"peerDependencies": {
"react": "*"
}
},
"node_modules/react-is": {
"version": "19.2.4",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz",
+1
View File
@@ -24,6 +24,7 @@
"diff": "^8.0.3",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-icons": "^5.5.0",
"react-router-dom": "^6.30.1",
"recharts": "^3.7.0"
},
+11 -36
View File
@@ -54,9 +54,9 @@ function CommunitiesManager() {
// Состояние для переключения между списком и статистикой
const [activeTab, setActiveTab] = useState('list'); // 'list' | 'stats'
const [newItem, setNewItem] = useState({ value: '', name: '', description: '', tags: '', gatewayDefault: '', color: '', icon: '', category: '', priority: 0, enabled: true });
const [newItem, setNewItem] = useState({ value: '', name: '', description: '', tags: '', color: '', icon: '', category: '', priority: 0, enabled: true });
const [editingValue, setEditingValue] = useState(null);
const [editingDraft, setEditingDraft] = useState({ value: '', name: '', description: '', tags: '', gatewayDefault: '', color: '', icon: '', category: '', priority: 0, enabled: true });
const [editingDraft, setEditingDraft] = useState({ value: '', name: '', description: '', tags: '', color: '', icon: '', category: '', priority: 0, enabled: true });
const [filterUsage, setFilterUsage] = useState({});
const [filterUsageLoading, setFilterUsageLoading] = useState(false);
const [filterUsageError, setFilterUsageError] = useState('');
@@ -80,7 +80,7 @@ function CommunitiesManager() {
Object.keys(filterUsage).forEach((value) => {
if (!value) return;
if (!map.has(value)) {
map.set(value, { value, name: '', description: '', tags: [], gatewayDefault: '', color: '', icon: '', _external: true });
map.set(value, { value, name: '', description: '', tags: [], color: '', icon: '', _external: true });
}
});
return Array.from(map.values());
@@ -129,7 +129,6 @@ function CommunitiesManager() {
name: String(d.name || ''),
description: String(d.description || ''),
tags: Array.isArray(d.tags) ? d.tags : [],
gatewayDefault: String(d.gatewayDefault || ''),
color: String(d.color || ''),
icon: String(d.icon || ''),
_external: false,
@@ -138,7 +137,7 @@ function CommunitiesManager() {
// add unknown ones from usage
for (const v of usedCommunities) {
if (!map.has(v)) {
map.set(v, { value: v, name: '', description: '', tags: [], gatewayDefault: '', color: '', icon: '', _external: true });
map.set(v, { value: v, name: '', description: '', tags: [], color: '', icon: '', _external: true });
}
}
setItems(Array.from(map.values()));
@@ -217,11 +216,10 @@ function CommunitiesManager() {
name: String(newItem.name || ''),
description: String(newItem.description || ''),
tags: toTagsArray(newItem.tags),
gatewayDefault: String(newItem.gatewayDefault || ''),
color: String(newItem.color || ''),
icon: String(newItem.icon || ''),
}]);
setNewItem({ value: '', name: '', description: '', tags: '', gatewayDefault: '', color: '', icon: '' });
setNewItem({ value: '', name: '', description: '', tags: '', color: '', icon: '' });
setAddModalOpen(false);
setSuccess('Community успешно добавлен!');
setTimeout(() => setSuccess(''), 3000);
@@ -234,7 +232,6 @@ function CommunitiesManager() {
name: item.name || '',
description: item.description || '',
tags: fromTagsArray(item.tags),
gatewayDefault: item.gatewayDefault || '',
color: item.color || '',
icon: item.icon || '',
});
@@ -251,7 +248,6 @@ function CommunitiesManager() {
name: String(editingDraft.name || ''),
description: String(editingDraft.description || ''),
tags: toTagsArray(editingDraft.tags),
gatewayDefault: String(editingDraft.gatewayDefault || ''),
color: String(editingDraft.color || ''),
icon: String(editingDraft.icon || ''),
} : i);
@@ -283,7 +279,7 @@ function CommunitiesManager() {
};
const handleImport = () => {
const text = window.prompt('Вставьте JSON-массив community (value, name, description, tags, gatewayDefault, color, icon)');
const text = window.prompt('Вставьте JSON-массив community (value, name, description, tags, color, icon)');
if (!text) return;
try {
const arr = JSON.parse(text);
@@ -300,7 +296,6 @@ function CommunitiesManager() {
name: String(x.name || ''),
description: String(x.description || ''),
tags: Array.isArray(x.tags) ? x.tags : [],
gatewayDefault: String(x.gatewayDefault || ''),
color: String(x.color || ''),
icon: String(x.icon || ''),
});
@@ -584,16 +579,15 @@ function CommunitiesManager() {
</th>
<th>Описание</th>
<th>Теги</th>
<th>Gateway</th>
<th style={{ width: '10%' }}>Исп. в фильтрах</th>
<th className="text-end">Действия</th>
</tr>
</thead>
<tbody>
{loading ? (
<tr><td colSpan={8} className="text-center text-muted py-4">Загрузка...</td></tr>
<tr><td colSpan={7} className="text-center text-muted py-4">Загрузка...</td></tr>
) : paginated.length === 0 ? (
<tr><td colSpan={8} className="text-center text-muted py-4">
<tr><td colSpan={7} className="text-center text-muted py-4">
<EmptyState
title="Нет community"
description="Добавьте запись, чтобы начать."
@@ -612,8 +606,8 @@ function CommunitiesManager() {
<tr key={item.value}>
<td>
{iconInfo ? (
<span className="avatar avatar-xs bg-blue-lt text-blue border">
<iconInfo.Icon size={14} stroke={1.5} />
<span className="avatar avatar-sm bg-blue-lt text-blue border">
<iconInfo.Icon size={20} stroke={1.5} />
</span>
) : (
<span className="text-muted"></span>
@@ -634,9 +628,6 @@ function CommunitiesManager() {
<span key={t} className="badge bg-blue-lt text-blue me-1">{t}</span>
))}
</td>
<td>
<span className="text-muted">{item.gatewayDefault || '—'}</span>
</td>
<td>
{usageCount > 0 ? (
<span className="badge bg-blue-lt text-blue">{usageCount} в фильтрах</span>
@@ -691,7 +682,7 @@ function CommunitiesManager() {
show={addModalOpen}
onClose={() => {
setAddModalOpen(false);
setNewItem({ value: '', name: '', description: '', tags: '', gatewayDefault: '', color: '', icon: '' });
setNewItem({ value: '', name: '', description: '', tags: '', color: '', icon: '' });
setError('');
}}
onSubmit={addItem}
@@ -752,14 +743,6 @@ function CommunitiesManager() {
helpText="Разделяйте теги запятыми"
/>
<FormField
label="Gateway по умолчанию"
name="gatewayDefault"
value={newItem.gatewayDefault}
onChange={(val) => setNewItem({...newItem, gatewayDefault: val})}
placeholder="SWE-HIPHOST"
/>
<FormField
label="Цвет бейджа (опционально)"
name="color"
@@ -840,14 +823,6 @@ function CommunitiesManager() {
helpText="Разделяйте теги запятыми"
/>
<FormField
label="Gateway по умолчанию"
name="gatewayDefault"
value={editingDraft.gatewayDefault}
onChange={(val) => setEditingDraft({...editingDraft, gatewayDefault: val})}
placeholder="SWE-HIPHOST"
/>
<FormField
label="Цвет бейджа (опционально)"
name="color"
+7 -7
View File
@@ -53,19 +53,19 @@ export default function IconPicker({ value, onChange, disabled = false, label =
<div className="d-flex align-items-center gap-2 flex-wrap" ref={panelRef}>
<button
type="button"
className="btn btn-outline-secondary btn-sm d-flex align-items-center gap-2"
className="btn btn-outline-secondary d-flex align-items-center gap-2"
onClick={() => setOpen((v) => !v)}
disabled={disabled}
aria-expanded={open}
aria-haspopup="listbox"
>
<span className="avatar avatar-sm bg-primary-lt text-primary rounded d-flex align-items-center justify-content-center">
<selected.Icon size={18} stroke={1.5} />
<span className="avatar bg-primary-lt text-primary rounded d-flex align-items-center justify-content-center" style={{ width: 34, height: 34 }}>
<selected.Icon size={20} stroke={1.5} />
</span>
<span>{selected.label}</span>
</button>
{open && (
<div className="border rounded p-3 shadow-sm bg-body" style={{ minWidth: 360, maxWidth: 520 }}>
<div className="border rounded p-3 shadow-sm bg-body" style={{ minWidth: 560, maxWidth: 640 }}>
<div className="input-group input-group-sm mb-2">
<span className="input-group-text">
<IconSearch size={14} />
@@ -81,7 +81,7 @@ export default function IconPicker({ value, onChange, disabled = false, label =
</div>
<div
className="d-flex flex-wrap gap-1 overflow-auto"
style={{ maxHeight: 260 }}
style={{ maxHeight: 320 }}
role="listbox"
>
{filtered.map((item) => (
@@ -91,13 +91,13 @@ export default function IconPicker({ value, onChange, disabled = false, label =
className={`btn btn-sm d-flex align-items-center justify-content-center rounded ${
value === item.id ? 'btn-primary' : 'btn-outline-secondary'
}`}
style={{ width: 48, height: 48 }}
style={{ width: 56, height: 56 }}
onClick={() => handleSelect(item)}
title={item.label}
role="option"
aria-selected={value === item.id}
>
<item.Icon size={22} stroke={1.5} />
<item.Icon size={26} stroke={1.5} />
</button>
))}
</div>
@@ -42,10 +42,6 @@ function AddFilterModal({ show, newFilter, onNewFilterChange, onAddFilter, onClo
onChange={(e) => {
const v = e.target.value;
onNewFilterChange({ ...newFilter, community: v });
const found = communities.find(c => c.value === v);
if (found && found.gatewayDefault && !newFilter.gateway) {
onNewFilterChange({ ...newFilter, community: v, gateway: found.gatewayDefault });
}
}}
required
/>
+122 -36
View File
@@ -1,6 +1,6 @@
/**
* Реестр брендовых иконок (Tabler Icons) для выбора в настройках пинг-сервисов.
* id — имя компонента (например IconBrandGoogle), label — для поиска и отображения.
* Реестр брендовых иконок для выбора в UI.
* Используем Tabler + Font Awesome + Bootstrap Icons через react-icons.
*/
import {
IconBrandGoogle,
@@ -39,44 +39,130 @@ import {
IconWorld,
IconCloud,
} from '@tabler/icons-react';
import {
FaSteam,
FaSteamSymbol,
FaCloudflare,
FaDiscord,
FaGithub,
FaTelegram,
FaVk,
FaYoutube,
FaGoogle,
FaWhatsapp,
FaApple,
FaAmazon,
FaFacebook,
FaXTwitter,
FaTiktok,
FaLinkedin,
FaReddit,
FaPinterest,
FaChrome,
FaFirefox,
FaEdge,
FaSafari,
FaDocker,
FaSlack,
FaCcVisa,
FaCcMastercard,
FaCcPaypal,
FaStripe,
FaYandex,
} from 'react-icons/fa6';
import {
BsTelegram,
BsDiscord,
BsSteam,
BsCloud,
BsGlobe,
BsGithub,
BsGoogle,
BsYoutube,
BsTwitterX,
BsWhatsapp,
BsApple,
BsTiktok,
} from 'react-icons/bs';
const BRAND_ICONS = [
{ id: 'IconBrandGoogle', label: 'Google', Icon: IconBrandGoogle },
{ id: 'IconBrandCloudflare', label: 'Cloudflare', Icon: IconBrandCloudflare },
{ id: 'IconBrandGoogle', label: 'Google (Tabler)', Icon: IconBrandGoogle },
{ id: 'IconBrandCloudflare', label: 'Cloudflare (Tabler)', Icon: IconBrandCloudflare },
{ id: 'IconCdnBunny', label: 'Bunny CDN', Icon: IconCloud },
{ id: 'IconCdnFastly', label: 'Fastly CDN', Icon: IconCloud },
{ id: 'IconBrandYandex', label: 'Yandex', Icon: IconBrandYandex },
{ id: 'IconBrandInstagram', label: 'Instagram', Icon: IconBrandInstagram },
{ id: 'IconBrandGithub', label: 'GitHub', Icon: IconBrandGithub },
{ id: 'IconBrandTelegram', label: 'Telegram', Icon: IconBrandTelegram },
{ id: 'IconBrandWhatsapp', label: 'WhatsApp', Icon: IconBrandWhatsapp },
{ id: 'IconBrandFacebook', label: 'Facebook', Icon: IconBrandFacebook },
{ id: 'IconBrandX', label: 'X (Twitter)', Icon: IconBrandX },
{ id: 'IconBrandYoutube', label: 'YouTube', Icon: IconBrandYoutube },
{ id: 'IconBrandTiktok', label: 'TikTok', Icon: IconBrandTiktok },
{ id: 'IconBrandAmazon', label: 'Amazon', Icon: IconBrandAmazon },
{ id: 'IconBrandApple', label: 'Apple', Icon: IconBrandApple },
{ id: 'IconBrandDiscord', label: 'Discord', Icon: IconBrandDiscord },
{ id: 'IconBrandSpotify', label: 'Spotify', Icon: IconBrandSpotify },
{ id: 'IconBrandVk', label: 'VK', Icon: IconBrandVk },
{ id: 'IconBrandReddit', label: 'Reddit', Icon: IconBrandReddit },
{ id: 'IconBrandLinkedin', label: 'LinkedIn', Icon: IconBrandLinkedin },
{ id: 'IconBrandPinterest', label: 'Pinterest', Icon: IconBrandPinterest },
{ id: 'IconBrandTwitch', label: 'Twitch', Icon: IconBrandTwitch },
{ id: 'IconBrandSteam', label: 'Steam', Icon: IconBrandSteam },
{ id: 'IconBrandDocker', label: 'Docker', Icon: IconBrandDocker },
{ id: 'IconBrandChrome', label: 'Chrome', Icon: IconBrandChrome },
{ id: 'IconBrandFirefox', label: 'Firefox', Icon: IconBrandFirefox },
{ id: 'IconBrandSafari', label: 'Safari', Icon: IconBrandSafari },
{ id: 'IconBrandEdge', label: 'Edge', Icon: IconBrandEdge },
{ id: 'IconBrandSlack', label: 'Slack', Icon: IconBrandSlack },
{ id: 'IconBrandZoom', label: 'Zoom', Icon: IconBrandZoom },
{ id: 'IconBrandSkype', label: 'Skype', Icon: IconBrandSkype },
{ id: 'IconBrandPaypal', label: 'PayPal', Icon: IconBrandPaypal },
{ id: 'IconBrandStripe', label: 'Stripe', Icon: IconBrandStripe },
{ id: 'IconBrandVisa', label: 'Visa', Icon: IconBrandVisa },
{ id: 'IconBrandMastercard', label: 'Mastercard', Icon: IconBrandMastercard },
{ id: 'IconWorld', label: 'Сеть (World)', Icon: IconWorld },
{ id: 'IconBrandYandex', label: 'Yandex (Tabler)', Icon: IconBrandYandex },
{ id: 'IconBrandInstagram', label: 'Instagram (Tabler)', Icon: IconBrandInstagram },
{ id: 'IconBrandGithub', label: 'GitHub (Tabler)', Icon: IconBrandGithub },
{ id: 'IconBrandTelegram', label: 'Telegram (Tabler)', Icon: IconBrandTelegram },
{ id: 'IconBrandWhatsapp', label: 'WhatsApp (Tabler)', Icon: IconBrandWhatsapp },
{ id: 'IconBrandFacebook', label: 'Facebook (Tabler)', Icon: IconBrandFacebook },
{ id: 'IconBrandX', label: 'X / Twitter (Tabler)', Icon: IconBrandX },
{ id: 'IconBrandYoutube', label: 'YouTube (Tabler)', Icon: IconBrandYoutube },
{ id: 'IconBrandTiktok', label: 'TikTok (Tabler)', Icon: IconBrandTiktok },
{ id: 'IconBrandAmazon', label: 'Amazon (Tabler)', Icon: IconBrandAmazon },
{ id: 'IconBrandApple', label: 'Apple (Tabler)', Icon: IconBrandApple },
{ id: 'IconBrandDiscord', label: 'Discord (Tabler)', Icon: IconBrandDiscord },
{ id: 'IconBrandSpotify', label: 'Spotify (Tabler)', Icon: IconBrandSpotify },
{ id: 'IconBrandVk', label: 'VK (Tabler)', Icon: IconBrandVk },
{ id: 'IconBrandReddit', label: 'Reddit (Tabler)', Icon: IconBrandReddit },
{ id: 'IconBrandLinkedin', label: 'LinkedIn (Tabler)', Icon: IconBrandLinkedin },
{ id: 'IconBrandPinterest', label: 'Pinterest (Tabler)', Icon: IconBrandPinterest },
{ id: 'IconBrandTwitch', label: 'Twitch (Tabler)', Icon: IconBrandTwitch },
{ id: 'IconBrandSteam', label: 'Steam (Tabler)', Icon: IconBrandSteam },
{ id: 'IconBrandDocker', label: 'Docker (Tabler)', Icon: IconBrandDocker },
{ id: 'IconBrandChrome', label: 'Chrome (Tabler)', Icon: IconBrandChrome },
{ id: 'IconBrandFirefox', label: 'Firefox (Tabler)', Icon: IconBrandFirefox },
{ id: 'IconBrandSafari', label: 'Safari (Tabler)', Icon: IconBrandSafari },
{ id: 'IconBrandEdge', label: 'Edge (Tabler)', Icon: IconBrandEdge },
{ id: 'IconBrandSlack', label: 'Slack (Tabler)', Icon: IconBrandSlack },
{ id: 'IconBrandZoom', label: 'Zoom (Tabler)', Icon: IconBrandZoom },
{ id: 'IconBrandSkype', label: 'Skype (Tabler)', Icon: IconBrandSkype },
{ id: 'IconBrandPaypal', label: 'PayPal (Tabler)', Icon: IconBrandPaypal },
{ id: 'IconBrandStripe', label: 'Stripe (Tabler)', Icon: IconBrandStripe },
{ id: 'IconBrandVisa', label: 'Visa (Tabler)', Icon: IconBrandVisa },
{ id: 'IconBrandMastercard', label: 'Mastercard (Tabler)', Icon: IconBrandMastercard },
{ id: 'IconWorld', label: 'Сеть (Tabler)', Icon: IconWorld },
{ id: 'FaSteam', label: 'Steam (Font Awesome)', Icon: FaSteam },
{ id: 'FaSteamSymbol', label: 'Valve / Steam (Font Awesome)', Icon: FaSteamSymbol },
{ id: 'FaCloudflare', label: 'Cloudflare (Font Awesome)', Icon: FaCloudflare },
{ id: 'FaDiscord', label: 'Discord (Font Awesome)', Icon: FaDiscord },
{ id: 'FaGithub', label: 'GitHub (Font Awesome)', Icon: FaGithub },
{ id: 'FaTelegram', label: 'Telegram (Font Awesome)', Icon: FaTelegram },
{ id: 'FaVk', label: 'VK (Font Awesome)', Icon: FaVk },
{ id: 'FaYoutube', label: 'YouTube (Font Awesome)', Icon: FaYoutube },
{ id: 'FaGoogle', label: 'Google (Font Awesome)', Icon: FaGoogle },
{ id: 'FaWhatsapp', label: 'WhatsApp (Font Awesome)', Icon: FaWhatsapp },
{ id: 'FaApple', label: 'Apple (Font Awesome)', Icon: FaApple },
{ id: 'FaAmazon', label: 'Amazon (Font Awesome)', Icon: FaAmazon },
{ id: 'FaFacebook', label: 'Facebook (Font Awesome)', Icon: FaFacebook },
{ id: 'FaXTwitter', label: 'X / Twitter (Font Awesome)', Icon: FaXTwitter },
{ id: 'FaTiktok', label: 'TikTok (Font Awesome)', Icon: FaTiktok },
{ id: 'FaLinkedin', label: 'LinkedIn (Font Awesome)', Icon: FaLinkedin },
{ id: 'FaReddit', label: 'Reddit (Font Awesome)', Icon: FaReddit },
{ id: 'FaPinterest', label: 'Pinterest (Font Awesome)', Icon: FaPinterest },
{ id: 'FaChrome', label: 'Chrome (Font Awesome)', Icon: FaChrome },
{ id: 'FaFirefox', label: 'Firefox (Font Awesome)', Icon: FaFirefox },
{ id: 'FaEdge', label: 'Edge (Font Awesome)', Icon: FaEdge },
{ id: 'FaSafari', label: 'Safari (Font Awesome)', Icon: FaSafari },
{ id: 'FaDocker', label: 'Docker (Font Awesome)', Icon: FaDocker },
{ id: 'FaSlack', label: 'Slack (Font Awesome)', Icon: FaSlack },
{ id: 'FaCcVisa', label: 'Visa (Font Awesome)', Icon: FaCcVisa },
{ id: 'FaCcMastercard', label: 'Mastercard (Font Awesome)', Icon: FaCcMastercard },
{ id: 'FaCcPaypal', label: 'PayPal (Font Awesome)', Icon: FaCcPaypal },
{ id: 'FaStripe', label: 'Stripe (Font Awesome)', Icon: FaStripe },
{ id: 'FaYandex', label: 'Yandex (Font Awesome)', Icon: FaYandex },
{ id: 'BsTelegram', label: 'Telegram (Bootstrap Icons)', Icon: BsTelegram },
{ id: 'BsDiscord', label: 'Discord (Bootstrap Icons)', Icon: BsDiscord },
{ id: 'BsSteam', label: 'Steam (Bootstrap Icons)', Icon: BsSteam },
{ id: 'BsCloud', label: 'Cloud (Bootstrap Icons)', Icon: BsCloud },
{ id: 'BsGlobe', label: 'Globe (Bootstrap Icons)', Icon: BsGlobe },
{ id: 'BsGithub', label: 'GitHub (Bootstrap Icons)', Icon: BsGithub },
{ id: 'BsGoogle', label: 'Google (Bootstrap Icons)', Icon: BsGoogle },
{ id: 'BsYoutube', label: 'YouTube (Bootstrap Icons)', Icon: BsYoutube },
{ id: 'BsTwitterX', label: 'X / Twitter (Bootstrap Icons)', Icon: BsTwitterX },
{ id: 'BsWhatsapp', label: 'WhatsApp (Bootstrap Icons)', Icon: BsWhatsapp },
{ id: 'BsApple', label: 'Apple (Bootstrap Icons)', Icon: BsApple },
{ id: 'BsTiktok', label: 'TikTok (Bootstrap Icons)', Icon: BsTiktok },
];
const ICON_BY_ID = Object.fromEntries(BRAND_ICONS.map((item) => [item.id, item]));
-1
View File
@@ -57,7 +57,6 @@ export interface Community {
value: string;
name?: string;
description?: string;
gatewayDefault?: string;
icon?: string;
category?: string;
}