import React, { useEffect, useRef, useState } from 'react'; import { AppsDevModeHome } from './AppsDevModeHome'; import { Spacer } from '../../common/Spacer'; import { executeEvent, subscribeToEvent, unsubscribeFromEvent, } from '../../utils/events'; import { AppsParent } from './Apps-styles'; import AppViewerContainer from './AppViewerContainer'; import ShortUniqueId from 'short-unique-id'; import { Box, ButtonBase, useTheme } from '@mui/material'; import { HomeIcon } from '../../assets/Icons/HomeIcon'; import { Save } from '../Save/Save'; import { AppsDevModeNavBar } from './AppsDevModeNavBar'; import { AppsIcon } from '../../assets/Icons/AppsIcon'; import { IconWrapper } from '../Desktop/DesktopFooter'; import { CoreSyncStatus } from '../CoreSyncStatus'; import { MessagingIconFilled } from '../../assets/Icons/MessagingIconFilled'; import { useTranslation } from 'react-i18next'; const uid = new ShortUniqueId({ length: 8 }); export const AppsDevMode = ({ mode, setMode, show, myName, goToHome, setDesktopSideView, hasUnreadDirects, isDirects, isGroups, hasUnreadGroups, toggleSideViewGroups, toggleSideViewDirects, setDesktopViewMode, desktopViewMode, isApps, }) => { const [availableQapps, setAvailableQapps] = useState([]); const [selectedAppInfo, setSelectedAppInfo] = useState(null); const [selectedCategory, setSelectedCategory] = useState(null); const [tabs, setTabs] = useState([]); const [selectedTab, setSelectedTab] = useState(null); const [isNewTabWindow, setIsNewTabWindow] = useState(false); const [categories, setCategories] = useState([]); const iframeRefs = useRef({}); const theme = useTheme(); const { t } = useTranslation([ 'auth', 'core', 'group', 'question', 'tutorial', ]); useEffect(() => { setTimeout(() => { executeEvent('appsDevModeSetTabsToNav', { data: { tabs: tabs, selectedTab: selectedTab, isNewTabWindow: isNewTabWindow, }, }); }, 100); }, [show, tabs, selectedTab, isNewTabWindow]); const navigateBackFunc = (e) => { if ( [ 'category', 'appInfo-from-category', 'appInfo', 'library', 'publish', ].includes(mode) ) { // Handle the various modes as needed if (mode === 'category') { setMode('library'); setSelectedCategory(null); } else if (mode === 'appInfo-from-category') { setMode('category'); } else if (mode === 'appInfo') { setMode('library'); } else if (mode === 'library') { if (isNewTabWindow) { setMode('viewer'); } else { setMode('home'); } } else if (mode === 'publish') { setMode('library'); } } else if (selectedTab?.tabId) { executeEvent(`navigateBackApp-${selectedTab?.tabId}`, {}); } }; useEffect(() => { subscribeToEvent('devModeNavigateBack', navigateBackFunc); return () => { unsubscribeFromEvent('devModeNavigateBack', navigateBackFunc); }; }, [mode, selectedTab]); const addTabFunc = (e) => { const data = e.detail?.data; const newTab = { ...data, tabId: uid.rnd(), }; setTabs((prev) => [...prev, newTab]); setSelectedTab(newTab); setMode('viewer'); setIsNewTabWindow(false); }; useEffect(() => { subscribeToEvent('appsDevModeAddTab', addTabFunc); return () => { unsubscribeFromEvent('appsDevModeAddTab', addTabFunc); }; }, [tabs]); const updateTabFunc = (e) => { const data = e.detail?.data; if (!data.tabId) return; const findIndexTab = tabs.findIndex((tab) => tab?.tabId === data?.tabId); if (findIndexTab === -1) return; const copyTabs = [...tabs]; const newTab = { ...copyTabs[findIndexTab], url: data.url, }; copyTabs[findIndexTab] = newTab; setTabs(copyTabs); setSelectedTab(newTab); setMode('viewer'); setIsNewTabWindow(false); }; useEffect(() => { subscribeToEvent('appsDevModeUpdateTab', updateTabFunc); return () => { unsubscribeFromEvent('appsDevModeUpdateTab', updateTabFunc); }; }, [tabs]); const setSelectedTabFunc = (e) => { const data = e.detail?.data; if (!e.detail?.isDevMode) return; setSelectedTab(data); setTimeout(() => { executeEvent('appsDevModeSetTabsToNav', { data: { tabs: tabs, selectedTab: data, isNewTabWindow: isNewTabWindow, }, }); }, 100); setIsNewTabWindow(false); }; useEffect(() => { subscribeToEvent('setSelectedTabDevMode', setSelectedTabFunc); return () => { unsubscribeFromEvent('setSelectedTabDevMode', setSelectedTabFunc); }; }, [tabs, isNewTabWindow]); const removeTabFunc = (e) => { const data = e.detail?.data; const copyTabs = [...tabs].filter((tab) => tab?.tabId !== data?.tabId); if (copyTabs?.length === 0) { setMode('home'); } else { setSelectedTab(copyTabs[0]); } setTabs(copyTabs); setSelectedTab(copyTabs[0]); setTimeout(() => { executeEvent('appsDevModeSetTabsToNav', { data: { tabs: copyTabs, selectedTab: copyTabs[0], }, }); }, 400); }; useEffect(() => { subscribeToEvent('removeTabDevMode', removeTabFunc); return () => { unsubscribeFromEvent('removeTabDevMode', removeTabFunc); }; }, [tabs]); const setNewTabWindowFunc = (e) => { setIsNewTabWindow(true); setSelectedTab(null); }; useEffect(() => { subscribeToEvent('devModeNewTabWindow', setNewTabWindowFunc); return () => { unsubscribeFromEvent('devModeNewTabWindow', setNewTabWindowFunc); }; }, [tabs]); return ( { goToHome(); }} > { setDesktopViewMode('apps'); }} > { setDesktopViewMode('chat'); }} > { setDesktopViewMode('dev'); }} > {mode !== 'home' && } {mode === 'home' && ( )} {tabs.map((tab) => { if (!iframeRefs.current[tab.tabId]) { iframeRefs.current[tab.tabId] = React.createRef(); } return ( ); })} {isNewTabWindow && mode === 'viewer' && ( <> )} ); };