Files
AIDC-AI-ComfyUI-Copilot/ui/src/components/debug/utils/historyUtils.ts
T
2025-05-15 19:38:20 +08:00

156 lines
4.3 KiB
TypeScript

// Copyright (C) 2025 AIDC-AI
// Licensed under the MIT License.
import { GeneratedImage } from '../types/parameterDebugTypes';
import { generateUUID } from '../../../utils/uuid';
// Constants
export const PARAM_DEBUG_HISTORY_KEY = 'parameter_debug_history';
export const MAX_HISTORY_ITEMS = 30;
// Interface for history item
export interface HistoryItem {
id: string;
timestamp: number;
title: string;
nodeName: string;
params: {[key: string]: any};
generatedImages: GeneratedImage[];
totalCount: number;
workflow?: any; // Optional workflow data
}
/**
* Save a new history item to localStorage
*/
export const saveHistoryItem = async (
nodeName: string,
params: {[key: string]: any},
generatedImages: GeneratedImage[],
totalCount: number,
workflow?: any
) => {
try {
// Get existing history
const history = loadHistoryItems();
// Create new history item
const newItem: HistoryItem = {
id: generateUUID(),
timestamp: Date.now(),
title: formatNodeNameWithParams(nodeName, params),
nodeName,
params: {
...params,
nodeNames: {
...(params.nodeNames || {}),
[nodeName.split('<')[0]]: nodeName.split('<')[0]
}
},
generatedImages,
totalCount,
workflow
};
// Add new item to the beginning of the array (newest first)
history.unshift(newItem);
// Keep only the most recent MAX_HISTORY_ITEMS
if (history.length > MAX_HISTORY_ITEMS) {
history.splice(MAX_HISTORY_ITEMS);
}
// Save back to localStorage
localStorage.setItem(PARAM_DEBUG_HISTORY_KEY, JSON.stringify(history));
return newItem;
} catch (error) {
console.error('Error saving parameter debug history:', error);
return null;
}
};
/**
* Load all history items from localStorage
*/
export const loadHistoryItems = (): HistoryItem[] => {
try {
const savedHistory = localStorage.getItem(PARAM_DEBUG_HISTORY_KEY);
if (savedHistory) {
return JSON.parse(savedHistory);
}
} catch (error) {
console.error('Error loading parameter debug history:', error);
}
return [];
};
/**
* Get a specific history item by ID
*/
export const getHistoryItemById = (id: string): HistoryItem | null => {
try {
const history = loadHistoryItems();
return history.find(item => item.id === id) || null;
} catch (error) {
console.error('Error getting history item:', error);
return null;
}
};
/**
* Clear all history items
*/
export const clearHistory = () => {
try {
localStorage.removeItem(PARAM_DEBUG_HISTORY_KEY);
} catch (error) {
console.error('Error clearing parameter debug history:', error);
}
};
/**
* Format date for display
*/
export const formatDate = (timestamp: number): string => {
const date = new Date(timestamp);
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`;
};
/**
* Format node name and parameters for display
*/
export const formatNodeNameWithParams = (
nodeName: string,
params: {[key: string]: any}
): string => {
// Check if we have nodeParams structure which contains node-to-params mapping
if (params.nodeParams) {
const nodeParamsEntries = Object.entries(params.nodeParams);
// Format each node with its parameters
const nodeStrings = nodeParamsEntries.map(([nodeId, nodeParams]) => {
// Get node name from selectedNodeInfoMap if available
let displayNodeName = nodeName;
if (params.selectedNodeInfoMap && params.selectedNodeInfoMap[nodeId]) {
displayNodeName = params.selectedNodeInfoMap[nodeId];
}
// Get parameter names for this node (up to 3)
const paramNames = Object.keys(nodeParams as object).slice(0, 3);
// Format as node_name<param1,param2,param3>
return `${displayNodeName}<${paramNames.join(',')}>`;
});
// Join all nodes with semicolons
return nodeStrings.join(';');
}
// Fallback to basic format if nodeParams not available
// Get up to 3 parameter names (not values)
const paramKeys = Object.keys(params).filter(key => key !== 'nodeParams' && key !== 'selectedNodeInfoMap').slice(0, 3);
// Format as node_name<param1,param2,param3>
return `${nodeName}<${paramKeys.join(',')}>`;
};