|  | @@ -2,10 +2,11 @@ import { foldersActions, IFolder } from '../../../stores/reducers/folders/slice'
 | 
											
												
													
														|  |  import { useEffect, useState } from 'react';
 |  |  import { useEffect, useState } from 'react';
 | 
											
												
													
														|  |  import { useAppDispatch, useAppSelector } from '../../../stores/store';
 |  |  import { useAppDispatch, useAppSelector } from '../../../stores/store';
 | 
											
												
													
														|  |  import { IPage, pagesActions } from '../../../stores/reducers/pages/slice';
 |  |  import { IPage, pagesActions } from '../../../stores/reducers/pages/slice';
 | 
											
												
													
														|  | -import { ViewLayoutTypePB } from '../../../../services/backend';
 |  | 
 | 
											
												
													
														|  | 
 |  | +import { AppPB, ViewLayoutTypePB } from '../../../../services/backend';
 | 
											
												
													
														|  |  import { AppBackendService } from '../../../stores/effects/folder/app/app_bd_svc';
 |  |  import { AppBackendService } from '../../../stores/effects/folder/app/app_bd_svc';
 | 
											
												
													
														|  |  import { WorkspaceBackendService } from '../../../stores/effects/folder/workspace/workspace_bd_svc';
 |  |  import { WorkspaceBackendService } from '../../../stores/effects/folder/workspace/workspace_bd_svc';
 | 
											
												
													
														|  |  import { useError } from '../../error/Error.hooks';
 |  |  import { useError } from '../../error/Error.hooks';
 | 
											
												
													
														|  | 
 |  | +import { AppObserver } from '../../../stores/effects/folder/app/app_observer';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  const initialFolderHeight = 40;
 |  |  const initialFolderHeight = 40;
 | 
											
												
													
														|  |  const initialPageHeight = 40;
 |  |  const initialPageHeight = 40;
 | 
											
										
											
												
													
														|  | @@ -13,19 +14,48 @@ const animationDuration = 500;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  export const useFolderEvents = (folder: IFolder, pages: IPage[]) => {
 |  |  export const useFolderEvents = (folder: IFolder, pages: IPage[]) => {
 | 
											
												
													
														|  |    const appDispatch = useAppDispatch();
 |  |    const appDispatch = useAppDispatch();
 | 
											
												
													
														|  | 
 |  | +  const workspace = useAppSelector((state) => state.workspace);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +  // Actions
 | 
											
												
													
														|  |    const [showPages, setShowPages] = useState(false);
 |  |    const [showPages, setShowPages] = useState(false);
 | 
											
												
													
														|  |    const [showFolderOptions, setShowFolderOptions] = useState(false);
 |  |    const [showFolderOptions, setShowFolderOptions] = useState(false);
 | 
											
												
													
														|  |    const [showNewPageOptions, setShowNewPageOptions] = useState(false);
 |  |    const [showNewPageOptions, setShowNewPageOptions] = useState(false);
 | 
											
												
													
														|  |    const [showRenamePopup, setShowRenamePopup] = useState(false);
 |  |    const [showRenamePopup, setShowRenamePopup] = useState(false);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +  // UI configurations
 | 
											
												
													
														|  |    const [folderHeight, setFolderHeight] = useState(`${initialFolderHeight}px`);
 |  |    const [folderHeight, setFolderHeight] = useState(`${initialFolderHeight}px`);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  const workspace = useAppSelector((state) => state.workspace);
 |  | 
 | 
											
												
													
														|  | 
 |  | +  // Observers
 | 
											
												
													
														|  | 
 |  | +  const appObserver = new AppObserver(folder.id);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +  // Backend services
 | 
											
												
													
														|  |    const appBackendService = new AppBackendService(folder.id);
 |  |    const appBackendService = new AppBackendService(folder.id);
 | 
											
												
													
														|  |    const workspaceBackendService = new WorkspaceBackendService(workspace.id || '');
 |  |    const workspaceBackendService = new WorkspaceBackendService(workspace.id || '');
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  // Error
 | 
											
												
													
														|  |    const error = useError();
 |  |    const error = useError();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  useEffect(() => {
 | 
											
												
													
														|  | 
 |  | +    void appObserver.subscribe({
 | 
											
												
													
														|  | 
 |  | +      onAppChanged: (change) => {
 | 
											
												
													
														|  | 
 |  | +        if (change.ok) {
 | 
											
												
													
														|  | 
 |  | +          const app: AppPB = change.val;
 | 
											
												
													
														|  | 
 |  | +          const updatedPages: IPage[] = app.belongings.items.map((view) => ({
 | 
											
												
													
														|  | 
 |  | +            id: view.id,
 | 
											
												
													
														|  | 
 |  | +            folderId: view.app_id,
 | 
											
												
													
														|  | 
 |  | +            pageType: view.layout,
 | 
											
												
													
														|  | 
 |  | +            title: view.name,
 | 
											
												
													
														|  | 
 |  | +          }));
 | 
											
												
													
														|  | 
 |  | +          appDispatch(pagesActions.didReceivePages(updatedPages));
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      },
 | 
											
												
													
														|  | 
 |  | +    });
 | 
											
												
													
														|  | 
 |  | +    return () => {
 | 
											
												
													
														|  | 
 |  | +      // Unsubscribe when the component is unmounted.
 | 
											
												
													
														|  | 
 |  | +      void appObserver.unsubscribe();
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +  }, []);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |    useEffect(() => {
 |  |    useEffect(() => {
 | 
											
												
													
														|  |      if (showPages) {
 |  |      if (showPages) {
 | 
											
												
													
														|  |        setFolderHeight(`${initialFolderHeight + pages.length * initialPageHeight}px`);
 |  |        setFolderHeight(`${initialFolderHeight + pages.length * initialPageHeight}px`);
 |