This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { Component, createContext, createSignal, JSX, useContext } from 'solid-js'
|
||||
import { Component, createContext, createSignal, JSX, onMount, useContext } from 'solid-js'
|
||||
import { query } from '../graphql'
|
||||
import { ADMIN_LOGIN_MUTATION, ADMIN_LOGOUT_MUTATION } from '../graphql/mutations'
|
||||
import {
|
||||
@@ -45,12 +45,14 @@ export {
|
||||
|
||||
interface AuthContextType {
|
||||
isAuthenticated: () => boolean
|
||||
isReady: () => boolean
|
||||
login: (username: string, password: string) => Promise<void>
|
||||
logout: () => Promise<void>
|
||||
}
|
||||
|
||||
const AuthContext = createContext<AuthContextType>({
|
||||
isAuthenticated: () => false,
|
||||
isReady: () => false,
|
||||
login: async () => {},
|
||||
logout: async () => {}
|
||||
})
|
||||
@@ -64,10 +66,27 @@ interface AuthProviderProps {
|
||||
export const AuthProvider: Component<AuthProviderProps> = (props) => {
|
||||
console.log('[AuthProvider] Initializing...')
|
||||
const [isAuthenticated, setIsAuthenticated] = createSignal(checkAuthStatus())
|
||||
const [isReady, setIsReady] = createSignal(false)
|
||||
|
||||
console.log(
|
||||
`[AuthProvider] Initial auth state: ${isAuthenticated() ? 'authenticated' : 'not authenticated'}`
|
||||
)
|
||||
|
||||
// Инициализация авторизации при монтировании
|
||||
onMount(async () => {
|
||||
console.log('[AuthProvider] Performing auth initialization...')
|
||||
|
||||
// Небольшая задержка для завершения других инициализаций
|
||||
await new Promise((resolve) => setTimeout(resolve, 100))
|
||||
|
||||
// Проверяем текущее состояние авторизации
|
||||
const authStatus = checkAuthStatus()
|
||||
setIsAuthenticated(authStatus)
|
||||
|
||||
console.log('[AuthProvider] Auth initialization complete, ready for requests')
|
||||
setIsReady(true)
|
||||
})
|
||||
|
||||
const login = async (username: string, password: string) => {
|
||||
console.log('[AuthProvider] Attempting login...')
|
||||
try {
|
||||
@@ -127,6 +146,7 @@ export const AuthProvider: Component<AuthProviderProps> = (props) => {
|
||||
|
||||
const value: AuthContextType = {
|
||||
isAuthenticated,
|
||||
isReady,
|
||||
login,
|
||||
logout
|
||||
}
|
||||
|
@@ -6,6 +6,7 @@ import {
|
||||
GET_COMMUNITIES_QUERY,
|
||||
GET_TOPICS_QUERY
|
||||
} from '../graphql/queries'
|
||||
import { useAuth } from './auth'
|
||||
|
||||
export interface Community {
|
||||
id: number
|
||||
@@ -92,6 +93,7 @@ const DataContext = createContext<DataContextType>({
|
||||
const COMMUNITY_STORAGE_KEY = 'admin-selected-community'
|
||||
|
||||
export function DataProvider(props: { children: JSX.Element }) {
|
||||
const auth = useAuth()
|
||||
const [communities, setCommunities] = createSignal<Community[]>([])
|
||||
const [topics, setTopics] = createSignal<Topic[]>([])
|
||||
const [allTopics, setAllTopics] = createSignal<Topic[]>([])
|
||||
@@ -140,11 +142,16 @@ export function DataProvider(props: { children: JSX.Element }) {
|
||||
// Эффект для загрузки ролей при изменении сообщества
|
||||
createEffect(() => {
|
||||
const community = selectedCommunity()
|
||||
if (community !== null) {
|
||||
console.log('[DataProvider] Загрузка ролей для сообщества:', community)
|
||||
const isReady = auth.isReady()
|
||||
const isAuthenticated = auth.isAuthenticated()
|
||||
|
||||
if (community !== null && isReady && isAuthenticated) {
|
||||
console.log('[DataProvider] Auth ready, загрузка ролей для сообщества:', community)
|
||||
loadRoles(community).catch((err) => {
|
||||
console.warn('Не удалось загрузить роли для сообщества:', err)
|
||||
})
|
||||
} else if (!isReady) {
|
||||
console.log('[DataProvider] Ожидание готовности авторизации перед загрузкой ролей')
|
||||
}
|
||||
})
|
||||
|
||||
@@ -324,6 +331,26 @@ export function DataProvider(props: { children: JSX.Element }) {
|
||||
// biome-ignore lint/suspicious/noExplicitAny: grahphql
|
||||
queryGraphQL: async (queryStr: string, variables?: Record<string, any>) => {
|
||||
try {
|
||||
// Ждем готовности авторизации перед выполнением запроса
|
||||
const maxWaitTime = 5000 // 5 секунд максимум
|
||||
const startTime = Date.now()
|
||||
|
||||
while (!auth.isReady() && Date.now() - startTime < maxWaitTime) {
|
||||
console.log('[DataProvider] Ожидание готовности авторизации для GraphQL запроса...')
|
||||
await new Promise((resolve) => setTimeout(resolve, 50))
|
||||
}
|
||||
|
||||
if (!auth.isReady()) {
|
||||
console.warn('[DataProvider] Таймаут ожидания готовности авторизации')
|
||||
throw new Error('Auth not ready')
|
||||
}
|
||||
|
||||
if (!auth.isAuthenticated()) {
|
||||
console.warn('[DataProvider] Пользователь не авторизован')
|
||||
throw new Error('User not authenticated')
|
||||
}
|
||||
|
||||
console.log('[DataProvider] Выполнение GraphQL запроса после готовности авторизации')
|
||||
return await query(`${location.origin}/graphql`, queryStr, variables)
|
||||
} catch (error) {
|
||||
console.error('Ошибка выполнения GraphQL запроса:', error)
|
||||
|
Reference in New Issue
Block a user