feat: Refactor AppShell and Header components, enhance memory management UI, and align API endpoints

- Removed defaultCollapsed prop from AppShell and set sidebar to be collapsed by default.
- Updated Header component to remove mobile menu toggle and added a history entry button.
- Refactored ExplorationsSection to streamline data extraction and improve UI rendering.
- Added new messages for GitHub sync success and error handling in issues.
- Implemented View Memory Dialog for better memory content viewing and editing.
- Enhanced FlowToolbar to auto-create flows and improved save functionality.
- Conducted a frontend audit for API endpoint alignment with backend implementations.
This commit is contained in:
catlog22
2026-02-07 23:15:50 +08:00
parent 82ed5054f5
commit 80ae4baea8
13 changed files with 418 additions and 195 deletions

View File

@@ -72,25 +72,37 @@ export function FlowToolbar({ className, onOpenTemplateLibrary }: FlowToolbarPro
// Handle save
const handleSave = useCallback(async () => {
if (!currentFlow) {
toast.error(formatMessage({ id: 'orchestrator.notifications.noFlow' }), formatMessage({ id: 'orchestrator.notifications.createFlowFirst' }));
return;
}
setIsSaving(true);
try {
// Update flow name if changed
if (flowName && flowName !== currentFlow.name) {
const name = flowName.trim() || formatMessage({ id: 'orchestrator.toolbar.placeholder' });
// Auto-create a new flow if none exists
if (!currentFlow) {
const now = new Date().toISOString();
const newFlow: Flow = {
id: `flow-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
name,
version: 1,
created_at: now,
updated_at: now,
nodes: useFlowStore.getState().nodes,
edges: useFlowStore.getState().edges,
variables: {},
metadata: {},
};
useFlowStore.setState({ currentFlow: newFlow });
} else if (flowName && flowName !== currentFlow.name) {
// Update flow name if changed
useFlowStore.setState((state) => ({
currentFlow: state.currentFlow
? { ...state.currentFlow, name: flowName }
? { ...state.currentFlow, name }
: null,
}));
}
const saved = await saveFlow();
if (saved) {
toast.success(formatMessage({ id: 'orchestrator.notifications.flowSaved' }), formatMessage({ id: 'orchestrator.notifications.savedSuccessfully' }, { name: flowName || currentFlow.name }));
toast.success(formatMessage({ id: 'orchestrator.notifications.flowSaved' }), formatMessage({ id: 'orchestrator.notifications.savedSuccessfully' }, { name }));
} else {
toast.error(formatMessage({ id: 'orchestrator.notifications.saveFailed' }), formatMessage({ id: 'orchestrator.notifications.couldNotSave' }));
}
@@ -99,7 +111,7 @@ export function FlowToolbar({ className, onOpenTemplateLibrary }: FlowToolbarPro
} finally {
setIsSaving(false);
}
}, [currentFlow, flowName, saveFlow]);
}, [currentFlow, flowName, saveFlow, formatMessage]);
// Handle load
const handleLoad = useCallback(
@@ -217,7 +229,7 @@ export function FlowToolbar({ className, onOpenTemplateLibrary }: FlowToolbarPro
variant="outline"
size="sm"
onClick={handleSave}
disabled={isSaving || !currentFlow}
disabled={isSaving}
>
{isSaving ? (
<Loader2 className="w-4 h-4 mr-1 animate-spin" />