import { createCheckpointCard } from '../components/CheckpointCard.js'; import { loadMoreModels, fetchModelsPage, resetAndReload as baseResetAndReload, resetAndReloadWithVirtualScroll, loadMoreWithVirtualScroll, refreshModels as baseRefreshModels, deleteModel as baseDeleteModel, replaceModelPreview, fetchCivitaiMetadata, refreshSingleModelMetadata, excludeModel as baseExcludeModel } from './baseModelApi.js'; import { state } from '../state/index.js'; /** * Fetch checkpoints with pagination for virtual scrolling * @param {number} page - Page number to fetch * @param {number} pageSize - Number of items per page * @returns {Promise} Object containing items, total count, and pagination info */ export async function fetchCheckpointsPage(page = 1, pageSize = 100) { return fetchModelsPage({ modelType: 'checkpoint', page, pageSize, endpoint: '/api/checkpoints' }); } /** * Load more checkpoints with pagination - updated to work with VirtualScroller * @param {boolean} resetPage - Whether to reset to the first page * @param {boolean} updateFolders - Whether to update folder tags * @returns {Promise} */ export async function loadMoreCheckpoints(resetPage = false, updateFolders = false) { // Check if virtual scroller is available if (state.virtualScroller) { return loadMoreWithVirtualScroll({ modelType: 'checkpoint', resetPage, updateFolders, fetchPageFunction: fetchCheckpointsPage }); } else { // Fall back to the original implementation if virtual scroller isn't available return loadMoreModels({ resetPage, updateFolders, modelType: 'checkpoint', createCardFunction: createCheckpointCard, endpoint: '/api/checkpoints' }); } } // Reset and reload checkpoints export async function resetAndReload(updateFolders = false) { // Check if virtual scroller is available if (state.virtualScroller) { return resetAndReloadWithVirtualScroll({ modelType: 'checkpoint', updateFolders, fetchPageFunction: fetchCheckpointsPage }); } else { // Fall back to original implementation return baseResetAndReload({ updateFolders, modelType: 'checkpoint', loadMoreFunction: loadMoreCheckpoints }); } } // Refresh checkpoints export async function refreshCheckpoints() { return baseRefreshModels({ modelType: 'checkpoint', scanEndpoint: '/api/checkpoints/scan', resetAndReloadFunction: resetAndReload }); } // Delete a checkpoint export function deleteCheckpoint(filePath) { return baseDeleteModel(filePath, 'checkpoint'); } // Replace checkpoint preview export function replaceCheckpointPreview(filePath) { return replaceModelPreview(filePath, 'checkpoint'); } // Fetch metadata from Civitai for checkpoints export async function fetchCivitai() { return fetchCivitaiMetadata({ modelType: 'checkpoint', fetchEndpoint: '/api/checkpoints/fetch-all-civitai', resetAndReloadFunction: resetAndReload }); } // Refresh single checkpoint metadata export async function refreshSingleCheckpointMetadata(filePath) { const success = await refreshSingleModelMetadata(filePath, 'checkpoint'); if (success) { // Reload the current view to show updated data await resetAndReload(); } } /** * Save model metadata to the server * @param {string} filePath - Path to the model file * @param {Object} data - Metadata to save * @returns {Promise} - Promise that resolves with the server response */ export async function saveModelMetadata(filePath, data) { const response = await fetch('/api/checkpoints/save-metadata', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ file_path: filePath, ...data }) }); if (!response.ok) { throw new Error('Failed to save metadata'); } return response.json(); } /** * Exclude a checkpoint model from being shown in the UI * @param {string} filePath - File path of the checkpoint to exclude * @returns {Promise} Promise resolving to success status */ export function excludeCheckpoint(filePath) { return baseExcludeModel(filePath, 'checkpoint'); }