feat: Enhance model preview version management with localStorage support

This commit is contained in:
Will Miao
2025-04-15 10:35:50 +08:00
parent df8e02157a
commit 73d01da94e
5 changed files with 68 additions and 9 deletions

View File

@@ -2,7 +2,7 @@
import { state, getCurrentPageState } from '../state/index.js'; import { state, getCurrentPageState } from '../state/index.js';
import { showToast } from '../utils/uiHelpers.js'; import { showToast } from '../utils/uiHelpers.js';
import { showDeleteModal, confirmDelete } from '../utils/modalUtils.js'; import { showDeleteModal, confirmDelete } from '../utils/modalUtils.js';
import { getSessionItem } from '../utils/storageHelpers.js'; import { getSessionItem, saveMapToStorage } from '../utils/storageHelpers.js';
/** /**
* Shared functionality for handling models (loras and checkpoints) * Shared functionality for handling models (loras and checkpoints)
@@ -424,12 +424,20 @@ async function uploadPreview(filePath, file, modelType = 'lora') {
const previewContainer = card.querySelector('.card-preview'); const previewContainer = card.querySelector('.card-preview');
const oldPreview = previewContainer.querySelector('img, video'); const oldPreview = previewContainer.querySelector('img, video');
// For LoRA models, use timestamp to prevent caching // Get the current page's previewVersions Map based on model type
if (modelType === 'lora') { const pageType = modelType === 'checkpoint' ? 'checkpoints' : 'loras';
state.previewVersions?.set(filePath, Date.now()); const previewVersions = state.pages[pageType].previewVersions;
// Update the version timestamp
const timestamp = Date.now();
if (previewVersions) {
previewVersions.set(filePath, timestamp);
// Save the updated Map to localStorage
const storageKey = modelType === 'checkpoint' ? 'checkpoint_preview_versions' : 'lora_preview_versions';
saveMapToStorage(storageKey, previewVersions);
} }
const timestamp = Date.now();
const previewUrl = data.preview_url ? const previewUrl = data.preview_url ?
`${data.preview_url}?t=${timestamp}` : `${data.preview_url}?t=${timestamp}` :
`/api/model/preview_image?path=${encodeURIComponent(filePath)}&t=${timestamp}`; `/api/model/preview_image?path=${encodeURIComponent(filePath)}&t=${timestamp}`;

View File

@@ -44,7 +44,10 @@ export function createCheckpointCard(checkpoint) {
// Determine preview URL // Determine preview URL
const previewUrl = checkpoint.preview_url || '/loras_static/images/no-preview.png'; const previewUrl = checkpoint.preview_url || '/loras_static/images/no-preview.png';
const version = state.previewVersions ? state.previewVersions.get(checkpoint.file_path) : null;
// Get the page-specific previewVersions map
const previewVersions = state.pages.checkpoints.previewVersions || new Map();
const version = previewVersions.get(checkpoint.file_path);
const versionedPreviewUrl = version ? `${previewUrl}?t=${version}` : previewUrl; const versionedPreviewUrl = version ? `${previewUrl}?t=${version}` : previewUrl;
// Determine NSFW warning text based on level // Determine NSFW warning text based on level

View File

@@ -44,7 +44,9 @@ export function createLoraCard(lora) {
card.classList.add('selected'); card.classList.add('selected');
} }
const version = state.previewVersions.get(lora.file_path); // Get the page-specific previewVersions map
const previewVersions = state.pages.loras.previewVersions || new Map();
const version = previewVersions.get(lora.file_path);
const previewUrl = lora.preview_url || '/loras_static/images/no-preview.png'; const previewUrl = lora.preview_url || '/loras_static/images/no-preview.png';
const versionedPreviewUrl = version ? `${previewUrl}?t=${version}` : previewUrl; const versionedPreviewUrl = version ? `${previewUrl}?t=${version}` : previewUrl;

View File

@@ -1,5 +1,5 @@
// Create the new hierarchical state structure // Create the new hierarchical state structure
import { getStorageItem } from '../utils/storageHelpers.js'; import { getStorageItem, getMapFromStorage } from '../utils/storageHelpers.js';
// Load settings from localStorage or use defaults // Load settings from localStorage or use defaults
const savedSettings = getStorageItem('settings', { const savedSettings = getStorageItem('settings', {
@@ -7,6 +7,10 @@ const savedSettings = getStorageItem('settings', {
show_only_sfw: false show_only_sfw: false
}); });
// Load preview versions from localStorage
const loraPreviewVersions = getMapFromStorage('lora_preview_versions');
const checkpointPreviewVersions = getMapFromStorage('checkpoint_preview_versions');
export const state = { export const state = {
// Global state // Global state
global: { global: {
@@ -23,7 +27,7 @@ export const state = {
hasMore: true, hasMore: true,
sortBy: 'name', sortBy: 'name',
activeFolder: null, activeFolder: null,
previewVersions: new Map(), previewVersions: loraPreviewVersions,
searchManager: null, searchManager: null,
searchOptions: { searchOptions: {
filename: true, filename: true,
@@ -66,6 +70,7 @@ export const state = {
hasMore: true, hasMore: true,
sortBy: 'name', sortBy: 'name',
activeFolder: null, activeFolder: null,
previewVersions: checkpointPreviewVersions,
searchManager: null, searchManager: null,
searchOptions: { searchOptions: {
filename: true, filename: true,

View File

@@ -172,3 +172,44 @@ export function migrateStorageItems() {
console.log('Lora Manager: Storage migration completed'); console.log('Lora Manager: Storage migration completed');
} }
/**
* Save a Map to localStorage
* @param {string} key - The localStorage key
* @param {Map} map - The Map to save
*/
export function saveMapToStorage(key, map) {
if (!(map instanceof Map)) {
console.error('Cannot save non-Map object:', map);
return;
}
try {
const prefixedKey = STORAGE_PREFIX + key;
// Convert Map to array of entries and save as JSON
const entries = Array.from(map.entries());
localStorage.setItem(prefixedKey, JSON.stringify(entries));
} catch (error) {
console.error(`Error saving Map to localStorage (${key}):`, error);
}
}
/**
* Load a Map from localStorage
* @param {string} key - The localStorage key
* @returns {Map} - The loaded Map or a new empty Map
*/
export function getMapFromStorage(key) {
try {
const prefixedKey = STORAGE_PREFIX + key;
const data = localStorage.getItem(prefixedKey);
if (!data) return new Map();
// Parse JSON and convert back to Map
const entries = JSON.parse(data);
return new Map(entries);
} catch (error) {
console.error(`Error loading Map from localStorage (${key}):`, error);
return new Map();
}
}