import { Component, createSignal, For, onMount, Show } from 'solid-js' import { DELETE_COMMUNITY_MUTATION, UPDATE_COMMUNITY_MUTATION } from '../graphql/mutations' import { GET_COMMUNITIES_QUERY } from '../graphql/queries' import styles from '../styles/Table.module.css' import Button from '../ui/Button' import Modal from '../ui/Modal' /** * Интерфейс для сообщества (используем локальный интерфейс для совместимости) */ interface Community { id: number slug: string name: string desc?: string pic: string created_at: number created_by: { id: number name: string email: string } stat: { shouts: number followers: number authors: number } } interface CommunitiesRouteProps { onError: (error: string) => void onSuccess: (message: string) => void } /** * Компонент для управления сообществами */ const CommunitiesRoute: Component = (props) => { const [communities, setCommunities] = createSignal([]) const [loading, setLoading] = createSignal(false) const [editModal, setEditModal] = createSignal<{ show: boolean; community: Community | null }>({ show: false, community: null }) const [deleteModal, setDeleteModal] = createSignal<{ show: boolean; community: Community | null }>({ show: false, community: null }) // Форма для редактирования const [formData, setFormData] = createSignal({ slug: '', name: '', desc: '', pic: '' }) /** * Загружает список всех сообществ */ const loadCommunities = async () => { setLoading(true) try { const response = await fetch('/graphql', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ query: GET_COMMUNITIES_QUERY }) }) const result = await response.json() if (result.errors) { throw new Error(result.errors[0].message) } setCommunities(result.data.get_communities_all || []) } catch (error) { props.onError(`Ошибка загрузки сообществ: ${(error as Error).message}`) } finally { setLoading(false) } } /** * Форматирует дату */ const formatDate = (timestamp: number): string => { return new Date(timestamp * 1000).toLocaleDateString('ru-RU') } /** * Открывает модалку редактирования */ const openEditModal = (community: Community) => { setFormData({ slug: community.slug, name: community.name, desc: community.desc || '', pic: community.pic }) setEditModal({ show: true, community }) } /** * Обновляет сообщество */ const updateCommunity = async () => { try { const response = await fetch('/graphql', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ query: UPDATE_COMMUNITY_MUTATION, variables: { community_input: formData() } }) }) const result = await response.json() if (result.errors) { throw new Error(result.errors[0].message) } if (result.data.update_community.error) { throw new Error(result.data.update_community.error) } props.onSuccess('Сообщество успешно обновлено') setEditModal({ show: false, community: null }) await loadCommunities() } catch (error) { props.onError(`Ошибка обновления сообщества: ${(error as Error).message}`) } } /** * Удаляет сообщество */ const deleteCommunity = async (slug: string) => { try { const response = await fetch('/graphql', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ query: DELETE_COMMUNITY_MUTATION, variables: { slug } }) }) const result = await response.json() if (result.errors) { throw new Error(result.errors[0].message) } if (result.data.delete_community.error) { throw new Error(result.data.delete_community.error) } props.onSuccess('Сообщество успешно удалено') setDeleteModal({ show: false, community: null }) await loadCommunities() } catch (error) { props.onError(`Ошибка удаления сообщества: ${(error as Error).message}`) } } // Загружаем сообщества при монтировании компонента onMount(() => { void loadCommunities() }) return (

Управление сообществами

Загрузка сообществ...
} > {(community) => ( openEditModal(community)} style={{ cursor: 'pointer' }} class={styles['clickable-row']} > )}
ID Название Slug Описание Создатель Публикации Подписчики Авторы Создано Действия
{community.id} {community.name} {community.slug}
{community.desc || '—'}
{community.created_by.name || community.created_by.email} {community.stat.shouts} {community.stat.followers} {community.stat.authors} {formatDate(community.created_at)} e.stopPropagation()}>
{/* Модальное окно редактирования */} setEditModal({ show: false, community: null })} title={`Редактирование сообщества: ${editModal().community?.name || ''}`} >
setFormData((prev) => ({ ...prev, slug: e.target.value }))} style={{ width: '100%', padding: '8px', border: '1px solid #ddd', 'border-radius': '4px' }} required />
setFormData((prev) => ({ ...prev, name: e.target.value }))} style={{ width: '100%', padding: '8px', border: '1px solid #ddd', 'border-radius': '4px' }} />