import { Component, createSignal, For, Show } from 'solid-js' import { query } from '../graphql' import type { EnvSection, EnvVariable, Query } from '../graphql/generated/schema' import { ADMIN_UPDATE_ENV_VARIABLE_MUTATION } from '../graphql/mutations' import { ADMIN_GET_ENV_VARIABLES_QUERY } from '../graphql/queries' import EnvVariableModal from '../modals/EnvVariableModal' import styles from '../styles/Admin.module.css' import Button from '../ui/Button' export interface EnvRouteProps { onError?: (error: string) => void onSuccess?: (message: string) => void } const EnvRoute: Component = (props) => { const [envSections, setEnvSections] = createSignal([]) const [loading, setLoading] = createSignal(true) const [editingVariable, setEditingVariable] = createSignal(null) const [showVariableModal, setShowVariableModal] = createSignal(false) // Состояние для показа/скрытия значений const [shownVars, setShownVars] = createSignal<{ [key: string]: boolean }>({}) /** * Загружает переменные окружения */ const loadEnvVariables = async () => { try { setLoading(true) const result = await query<{ getEnvVariables: Query['getEnvVariables'] }>( `${location.origin}/graphql`, ADMIN_GET_ENV_VARIABLES_QUERY ) // Важно: пустой массив [] тоже валидный результат! if (result && Array.isArray(result.getEnvVariables)) { setEnvSections(result.getEnvVariables) console.log('Загружено секций переменных:', result.getEnvVariables.length) } else { console.warn('Неожиданный результат от getEnvVariables:', result) setEnvSections([]) // Устанавливаем пустой массив если что-то пошло не так } } catch (error) { console.error('Failed to load env variables:', error) props.onError?.(error instanceof Error ? error.message : 'Failed to load environment variables') setEnvSections([]) // Устанавливаем пустой массив при ошибке } finally { setLoading(false) } } /** * Обновляет значение переменной окружения */ const updateEnvVariable = async (key: string, value: string) => { try { const result = await query(`${location.origin}/graphql`, ADMIN_UPDATE_ENV_VARIABLE_MUTATION, { key, value }) if (result && typeof result === 'object' && 'updateEnvVariable' in result) { props.onSuccess?.(`Переменная ${key} успешно обновлена`) await loadEnvVariables() } else { props.onError?.('Не удалось обновить переменную') } } catch (err) { console.error('Ошибка обновления переменной:', err) props.onError?.(err instanceof Error ? err.message : 'Ошибка при обновлении переменной') } } /** * Обработчик открытия модального окна редактирования переменной */ const openVariableModal = (variable: EnvVariable) => { setEditingVariable({ ...variable }) setShowVariableModal(true) } /** * Обработчик закрытия модального окна редактирования переменной */ const closeVariableModal = () => { setEditingVariable(null) setShowVariableModal(false) } /** * Обработчик сохранения переменной */ const saveVariable = async () => { const variable = editingVariable() if (!variable) return await updateEnvVariable(variable.key, variable.value) closeVariableModal() } /** * Обработчик изменения значения в модальном окне */ const handleVariableValueChange = (value: string) => { const variable = editingVariable() if (variable) { setEditingVariable({ ...variable, value }) } } /** * Переключает показ значения переменной */ const toggleShow = (key: string) => { setShownVars((prev) => ({ ...prev, [key]: !prev[key] })) } /** * Копирует значение в буфер обмена */ const CopyButton: Component<{ value: string }> = (props) => { const handleCopy = async (e: MouseEvent) => { e.preventDefault() try { await navigator.clipboard.writeText(props.value) // Можно добавить всплывающее уведомление } catch (err) { alert(`Ошибка копирования: ${(err as Error).message}`) } } return ( 📋 ) } /** * Кнопка показать/скрыть значение переменной */ const ShowHideButton: Component<{ shown: boolean; onToggle: () => void }> = (props) => { return ( {props.shown ? '🙈' : '👁️'} ) } // Load env variables on mount void loadEnvVariables() // ВРЕМЕННО: для тестирования пустого состояния // setTimeout(() => { // setLoading(false) // setEnvSections([]) // console.log('Тест: установлено пустое состояние') // }, 1000) return (
Загрузка переменных окружения...

Переменные окружения не найдены

Переменные окружения не настроены или не обнаружены в системе.
Вы можете добавить переменные через файл .env или системные переменные.

Как добавить переменные?

Способ 1: Через командную строку

                export DEBUG=true export DB_URL="postgresql://localhost:5432/db" export
                REDIS_URL="redis://localhost:6379"
              

Способ 2: Через файл .env

                DEBUG=true DB_URL=postgresql://localhost:5432/db REDIS_URL=redis://localhost:6379
              
0}>
{(section) => (

{section.name}

{section.description}

{(variable) => { const shown = () => shownVars()[variable.key] || false return ( ) }}
Ключ Значение Описание Действия
{variable.key} {variable.isSecret && !shown() ? '••••••••' : variable.value || не задано} {variable.isSecret && ( toggleShow(variable.key)} /> )} {variable.description || '-'}
)}
) } export default EnvRoute