Skip to content

Commit fccbef5

Browse files
committed
wip
1 parent 59c9fde commit fccbef5

File tree

8 files changed

+217
-278
lines changed

8 files changed

+217
-278
lines changed

webapp/Solution

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
npm run start
2+
npm run build
3+
npm run test
4+
npm run eject
5+
npm run lint
6+
npm run type-check
7+
npm run typecheck

webapp/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@
8585
"eject": "react-scripts eject",
8686
"lint": "eslint \"src/**/*.{ts,tsx,js,jsx}\" --fix --max-warnings=0",
8787
"type-check": "tsc --noEmit",
88-
"typecheck": "tsc --noEmit"
88+
"typecheck": "tsc --noEmit",
89+
"validate": "concurrently \"npm run lint\" \"npm run type-check\""
8990
},
9091
"version": "0.1.0"
9192
}

webapp/public/index.html

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,38 @@
3232
<script>
3333
// Increase timeout and add more detailed error handling
3434
window.addEventListener('load', function() {
35+
// Check if we're in archive mode
36+
function isArchiveMode() {
37+
return window.location.search.includes('archive=true') ||
38+
localStorage.getItem('archive_mode') === 'true' ||
39+
document.documentElement.outerHTML.length > 60000;
40+
}
41+
42+
// Check if the app is already rendering
43+
function isAppRendering() {
44+
var root = document.getElementById('root');
45+
return root && root.children && root.children.length > 0 &&
46+
root.innerHTML.includes('App');
47+
}
48+
// Skip the check if we're in archive mode
49+
if (isArchiveMode()) {
50+
console.log('Archive mode detected, skipping React render check');
51+
return;
52+
}
53+
54+
// Initial check - app might already be rendered
55+
if (isAppRendering()) {
56+
console.log('React app already rendered successfully');
57+
return;
58+
}
59+
3560
setTimeout(function() {
3661
var root = document.getElementById('root');
37-
if (root && (!root.children || root.children.length === 0)) {
62+
if (!isAppRendering()) {
3863
console.error('React app failed to render after timeout');
39-
root.innerHTML = '<div style="padding: 20px; text-align: center;"><h2>Application Error</h2><p>The application failed to load properly. Please try refreshing the page or check the console for errors.</p></div>';
64+
if (root) {
65+
root.innerHTML = '<div style="padding: 20px; text-align: center;"><h2>Application Error</h2><p>The application failed to load properly. Please try refreshing the page or check the console for errors.</p><p><button onclick="window.location.reload()">Refresh Page</button></p></div>';
66+
}
4067
}
4168
}, 10000); // Increased timeout to 10 seconds
4269
});

webapp/src/App.tsx

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import React from 'react';
22
import Prism from 'prismjs';
33
import { Provider, useDispatch, useSelector } from 'react-redux';
44
import { RootState, store } from './store';
5-
import { isArchive } from './services/appConfig';
65
import { setConnectionStatus } from './store/slices/connectionSlice';
76
import ErrorBoundary from './components/ErrorBoundary/ErrorBoundary';
87
import ErrorFallback from './components/ErrorBoundary/ErrorFallback';
@@ -47,8 +46,8 @@ Prism.manual = true;
4746

4847

4948
// Add function to extract archived messages
50-
const getArchivedMessages = () => {
51-
if (!isArchive) return null;
49+
const getArchivedMessages = (isArchiveMode: boolean) => {
50+
if (!isArchiveMode) return null;
5251
try {
5352
const messagesEl = document.getElementById('archived-messages');
5453
if (!messagesEl || !messagesEl.textContent) {
@@ -61,12 +60,17 @@ const getArchivedMessages = () => {
6160
return [];
6261
}
6362
};
63+
// Interface for App props
64+
interface AppProps {
65+
isArchive?: boolean;
66+
}
6467

6568

6669

6770
// Create a separate component for the app content
68-
const AppContent: React.FC = () => {
69-
if (!isArchive) {
71+
const AppContent: React.FC<AppProps> = ({ isArchive }) => {
72+
const isArchiveMode = isArchive || false;
73+
if (!isArchiveMode) {
7074
console.info(`${LOG_PREFIX} Initializing application v${APP_VERSION}`);
7175
} else {
7276
console.info(`${LOG_PREFIX} Initializing application v${APP_VERSION} in archive mode`);
@@ -79,6 +83,8 @@ const AppContent: React.FC = () => {
7983
const { isConnected, error } = useSelector((state: RootState) => state.connection);
8084
// Update connection status in Redux store when websocket status changes
8185
React.useEffect(() => {
86+
if (isArchiveMode) return; // Skip websocket setup in archive mode
87+
8288
const handleConnectionChange = (connected: boolean) => {
8389
dispatch(setConnectionStatus(connected));
8490
};
@@ -108,44 +114,44 @@ const AppContent: React.FC = () => {
108114
websocket.removeConnectionHandler(handleConnectionChange);
109115
websocket.removeErrorHandler(handleError);
110116
};
111-
}, [dispatch]);
117+
}, [dispatch, isArchiveMode]);
112118

113119
// Load archived messages on mount if in archive mode
114120
React.useEffect(() => {
115-
if (isArchive && !archivedMessagesLoaded) {
116-
const archivedMessages = getArchivedMessages();
121+
if (isArchiveMode && !archivedMessagesLoaded) {
122+
const archivedMessages = getArchivedMessages(isArchiveMode);
117123
if (archivedMessages) {
118124
archivedMessages.forEach((msg: Message) => dispatch(addMessage(msg)));
119125
setArchivedMessagesLoaded(true);
120126
}
121127
}
122-
}, [dispatch, archivedMessagesLoaded]);
128+
}, [dispatch, archivedMessagesLoaded, isArchiveMode]);
123129

124130

125131

126132
// Only get sessionId if not in archive mode
127133
const sessionId = React.useMemo(() => {
128-
if (isArchive) return '';
134+
if (isArchiveMode) return '';
129135
return websocket.getSessionId();
130-
}, [isArchive]);
136+
}, [isArchiveMode]);
131137

132138
React.useEffect(() => {
133139
// Skip websocket setup if loading from archive
134-
if (isArchive) {
140+
if (isArchiveMode) {
135141
return;
136142
}
137143

138144
if (appConfig.applicationName) {
139145
document.title = appConfig.applicationName;
140146
}
141-
}, [appConfig.applicationName]);
147+
}, [appConfig.applicationName, isArchiveMode]);
142148

143149
// Only log websocket disconnected if not in archive mode
144150
React.useEffect(() => {
145-
if (!isArchive && !isConnected) {
151+
if (!isArchiveMode && !isConnected) {
146152
console.warn(`${LOG_PREFIX} WebSocket disconnected - sessionId: ${sessionId}`);
147153
}
148-
}, [isConnected, sessionId]);
154+
}, [isConnected, sessionId, isArchiveMode]);
149155
// Log WebSocket errors for debugging
150156
React.useEffect(() => {
151157
if (error) {
@@ -168,21 +174,18 @@ const AppContent: React.FC = () => {
168174
}, []);
169175
// Add debug information to help diagnose rendering issues
170176
React.useEffect(() => {
171-
console.log(`${LOG_PREFIX} Rendering AppContent component. isArchive:`, isArchive);
177+
console.log(`${LOG_PREFIX} Rendering AppContent component. isArchive:`, isArchiveMode);
172178
console.log(`${LOG_PREFIX} Connection status:`, isConnected ? 'Connected' : 'Disconnected');
173179
// Check if the DOM is properly rendering
174180
const rootElement = document.getElementById('root');
175181
console.log(`${LOG_PREFIX} Root element:`, rootElement);
176182
console.log(`${LOG_PREFIX} Root element children:`, rootElement?.childNodes?.length);
177-
}, [isArchive, isConnected]);
183+
}, [isArchiveMode, isConnected]);
178184

179185

180186
return (
181187
<ThemeProvider>
182188
<div className="App">
183-
<div style={{ padding: '20px', display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
184-
<h1>SimiaCryptus AI Assistant</h1>
185-
</div>
186189
<Menu/>
187190
<ChatInterface
188191
sessionId={sessionId}
@@ -195,13 +198,13 @@ const AppContent: React.FC = () => {
195198
);
196199
};
197200
// Create the main App component that provides the Redux store
198-
const App: React.FC = () => {
201+
const App: React.FC<AppProps> = ({ isArchive }) => {
199202
// Add console log to verify App component is rendering
200203
console.log(`${LOG_PREFIX} Rendering App component`);
201204
return (
202205
<ErrorBoundary FallbackComponent={ErrorFallback}>
203206
<Provider store={store}>
204-
<AppContent/>
207+
<AppContent isArchive={isArchive}/>
205208
</Provider>
206209
</ErrorBoundary>
207210
);

webapp/src/components/MessageList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ export const expandMessageReferences = (
135135
const MessageList: React.FC<MessageListProps> = ({ messages: propMessages }) => {
136136
// Add archive mode class to container in archive mode
137137
const currentTheme = useSelector((state: RootState) => state.ui.theme);
138-
const containerClassName = `message-list-container${isArchive ? ' archive-mode' : ''} theme-${currentTheme}`;
138+
const containerClassName = `message-list-container${isArchive() ? ' archive-mode' : ''} theme-${currentTheme}`;
139139
// Apply theme class to container
140140
React.useEffect(() => {
141141
if (messageListRef.current) {

0 commit comments

Comments
 (0)