78 lines
2.6 KiB
TypeScript
78 lines
2.6 KiB
TypeScript
|
import { createEffect, For, Show } from 'solid-js'
|
|||
|
import { useData } from '../context/data'
|
|||
|
import styles from '../styles/Admin.module.css'
|
|||
|
|
|||
|
/**
|
|||
|
* Компонент выбора сообщества
|
|||
|
*
|
|||
|
* Особенности:
|
|||
|
* - Сохраняет выбранное сообщество в localStorage
|
|||
|
* - По умолчанию выбрано сообщество с ID 1 (Дискурс)
|
|||
|
* - При изменении автоматически загружает темы выбранного сообщества
|
|||
|
*/
|
|||
|
const CommunitySelector = () => {
|
|||
|
const { communities, selectedCommunity, setSelectedCommunity, loadTopicsByCommunity, isLoading } =
|
|||
|
useData()
|
|||
|
|
|||
|
// Отладочное логирование состояния
|
|||
|
createEffect(() => {
|
|||
|
const current = selectedCommunity()
|
|||
|
const allCommunities = communities()
|
|||
|
console.log('[CommunitySelector] Состояние:', {
|
|||
|
selectedId: current,
|
|||
|
selectedName: allCommunities.find((c) => c.id === current)?.name,
|
|||
|
totalCommunities: allCommunities.length
|
|||
|
})
|
|||
|
})
|
|||
|
|
|||
|
// Загружаем темы при изменении выбранного сообщества
|
|||
|
createEffect(() => {
|
|||
|
const communityId = selectedCommunity()
|
|||
|
if (communityId !== null) {
|
|||
|
console.log('[CommunitySelector] Загрузка тем для сообщества:', communityId)
|
|||
|
loadTopicsByCommunity(communityId)
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
// Обработчик изменения выбранного сообщества
|
|||
|
const handleCommunityChange = (event: Event) => {
|
|||
|
const select = event.target as HTMLSelectElement
|
|||
|
const value = select.value
|
|||
|
|
|||
|
if (value === '') {
|
|||
|
setSelectedCommunity(null)
|
|||
|
} else {
|
|||
|
const communityId = Number.parseInt(value, 10)
|
|||
|
if (!Number.isNaN(communityId)) {
|
|||
|
setSelectedCommunity(communityId)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return (
|
|||
|
<div class={styles['community-selector']}>
|
|||
|
<select
|
|||
|
id="community-select"
|
|||
|
value={selectedCommunity()?.toString() || ''}
|
|||
|
onChange={handleCommunityChange}
|
|||
|
disabled={isLoading()}
|
|||
|
class={selectedCommunity() !== null ? styles['community-selected'] : ''}
|
|||
|
>
|
|||
|
<option value="">Все сообщества</option>
|
|||
|
<For each={communities()}>
|
|||
|
{(community) => (
|
|||
|
<option value={community.id.toString()}>
|
|||
|
{community.name} {community.id === 1 ? '(По умолчанию)' : ''}
|
|||
|
</option>
|
|||
|
)}
|
|||
|
</For>
|
|||
|
</select>
|
|||
|
<Show when={isLoading()}>
|
|||
|
<span class={styles['loading-indicator']}>Загрузка...</span>
|
|||
|
</Show>
|
|||
|
</div>
|
|||
|
)
|
|||
|
}
|
|||
|
|
|||
|
export default CommunitySelector
|