import React, { useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { SpaceSidebar } from './SpaceSidebar'; import { ChannelSidebar } from './ChannelSidebar'; import { MainContent } from './MainContent'; import { RightPanel } from './RightPanel'; import { MobileShell } from './MobileShell'; import { ImagePreview } from '../chat/ImagePreview'; import { CreateSpaceModal } from '../modals/CreateSpace'; import { JoinSpaceModal } from '../modals/JoinSpace'; import { CreateChannelModal } from '../modals/CreateChannel'; import { CreateCategoryModal } from '../modals/CreateCategory'; import { InviteModal } from '../modals/InviteModal'; import { UserSettingsModal } from '../modals/UserSettings'; import { SpaceSettingsModal } from '../modals/SpaceSettings'; import { ChannelSettingsModal } from '../modals/ChannelSettingsModal'; import { CategorySettingsModal } from '../modals/CategorySettingsModal'; import { NewDmModal } from '../modals/NewDmModal'; import { AddDmMemberModal } from '../modals/AddDmMemberModal'; import { GroupDmSettings } from '../modals/GroupDmSettings'; import { UserProfileModal } from '../modals/UserProfileModal'; import { IncomingCallModal } from '../voice/IncomingCallModal'; import { PictureInPicture } from '../voice/PictureInPicture'; import { SoundController } from '../voice/SoundController'; import { GlobalAudioRenderer } from '../voice/GlobalAudioRenderer'; import { NotificationController } from '../NotificationController'; import { UserProfilePopout } from '../ui/UserProfilePopout'; import { ToastContainer } from '../ui/ToastContainer'; import { UpdateToast } from '../ui/UpdateToast'; import { ContextMenuRenderer } from '../ui/ContextMenuRenderer'; import { useAuth } from '../../hooks/useAuth'; import { useDelayedLoading } from '../../hooks/useDelayedLoading'; import { useWebSocket } from '../../hooks/useWebSocket'; import { useFederationToasts } from '../../hooks/useFederationToasts'; import { useLiveKit } from '../../hooks/useLiveKit'; import { useKeybinds } from '../../hooks/useKeybinds'; import { useDeepLinkHandler } from '../../platform/deepLink'; import { initActivityBridge, teardownActivityBridge } from '../../platform/activityBridge'; import { useSpaceStore } from '../../stores/spaceStore'; import { useChatStore } from '../../stores/chatStore'; import { useUIStore } from '../../stores/uiStore'; import { useVoiceStore } from '../../stores/voiceStore'; import { AudioManager } from '../../audio/AudioManager'; export function AppLayout() { const { spaceId, channelId } = useParams<{ spaceId?: string; channelId?: string }>(); const navigate = useNavigate(); // Global interaction handler to resume AudioContext useEffect(() => { const resume = () => { AudioManager.getInstance().resumeContext().then(() => { window.removeEventListener('click', resume); window.removeEventListener('keydown', resume); window.removeEventListener('touchstart', resume); }); }; window.addEventListener('click', resume); window.addEventListener('keydown', resume); window.addEventListener('touchstart', resume); return () => { window.removeEventListener('click', resume); window.removeEventListener('keydown', resume); window.removeEventListener('touchstart', resume); }; }, []); // MutationObserver: neutralize rogue LiveKit