import { useState, useEffect } from 'react'; import { Modal } from '../ui/Modal'; import { useUIStore } from '../../stores/uiStore'; import { useSpaceStore } from '../../stores/spaceStore'; import { useSettingsStore } from '../../stores/settingsStore'; import { Avatar } from '../ui/Avatar'; import { api } from '../../api/client'; import { hasPermissionBit, PermissionBits } from '../../utils/permissions'; import { OverviewPanel } from './spaceSettingsPanels/OverviewPanel'; import { MembersPanel } from './spaceSettingsPanels/MembersPanel'; import { RolesPanel } from './spaceSettingsPanels/RolesPanel'; import { BansPanel } from './spaceSettingsPanels/BansPanel'; import type { SpaceVisibility, JoinRequest } from '@backspace/shared'; function DiscoveryPanel({ spaceId }: { spaceId: string }) { const spaces = useSpaceStore((s) => s.spaces); const updateSpace = useSpaceStore((s) => s.updateSpace); const discoveryEnabled = useSettingsStore((s) => s.streamingLimits?.discoveryEnabled ?? true); const space = spaces.find(s => s.id === spaceId); const [visibility, setVisibility] = useState( (space?.visibility as SpaceVisibility) ?? 'private' ); const [description, setDescription] = useState(space?.description ?? ''); const [saving, setSaving] = useState(false); const [saveError, setSaveError] = useState(''); const [saveSuccess, setSaveSuccess] = useState(false); useEffect(() => { if (space) { setVisibility((space.visibility as SpaceVisibility) ?? 'private'); setDescription(space.description ?? ''); } }, [space]); if (!space) return null; const hasChanges = visibility !== ((space.visibility as SpaceVisibility) ?? 'private') || description !== (space.description ?? ''); const handleSave = async () => { setSaving(true); setSaveError(''); setSaveSuccess(false); try { await api.spaces.update(spaceId, { visibility, description: description.trim() }); setSaveSuccess(true); setTimeout(() => setSaveSuccess(false), 2000); } catch (err) { setSaveError(err instanceof Error ? err.message : 'Failed to save'); } finally { setSaving(false); } }; const handleReset = () => { setVisibility((space.visibility as SpaceVisibility) ?? 'private'); setDescription(space.description ?? ''); setSaveError(''); }; const visibilityOptions: { value: SpaceVisibility; label: string; desc: string }[] = [ { value: 'private', label: 'Private', desc: 'Only people with an invite link can join' }, { value: 'request', label: 'Request to Join', desc: 'Visible in Explore — people can request to join' }, { value: 'public', label: 'Public', desc: 'Visible in Explore — anyone can join instantly' }, ]; return (
{!discoveryEnabled && (
Space discovery is disabled by the instance administrator. Changing visibility will have no effect until discovery is re-enabled.
)}
Visibility

Control who can discover and join this space.

{visibilityOptions.map((opt) => ( ))}
Description

A short summary shown on the Explore page.