refactor: split CSS and JS into modular files (SRP)

This commit is contained in:
2025-12-26 13:55:02 +01:00
parent 94cf36bff3
commit 2e5731b5d6
47 changed files with 8882 additions and 2298 deletions

View File

@@ -0,0 +1,159 @@
/**
* AniWorld - Queue API Module
*
* Handles API requests for the download queue.
*
* Dependencies: constants.js, api-client.js
*/
var AniWorld = window.AniWorld || {};
AniWorld.QueueAPI = (function() {
'use strict';
const API = AniWorld.Constants.API;
/**
* Load queue data from server
* @returns {Promise<Object>} Queue data
*/
async function loadQueueData() {
try {
const response = await AniWorld.ApiClient.get(API.QUEUE_STATUS);
if (!response) {
return null;
}
const data = await response.json();
// API returns nested structure with 'status' and 'statistics'
// Transform it to the expected flat structure
return {
...data.status,
statistics: data.statistics
};
} catch (error) {
console.error('Error loading queue data:', error);
return null;
}
}
/**
* Start queue processing
* @returns {Promise<Object>} Response data
*/
async function startQueue() {
try {
const response = await AniWorld.ApiClient.post(API.QUEUE_START, {});
if (!response) return null;
return await response.json();
} catch (error) {
console.error('Error starting queue:', error);
throw error;
}
}
/**
* Stop queue processing
* @returns {Promise<Object>} Response data
*/
async function stopQueue() {
try {
const response = await AniWorld.ApiClient.post(API.QUEUE_STOP, {});
if (!response) return null;
return await response.json();
} catch (error) {
console.error('Error stopping queue:', error);
throw error;
}
}
/**
* Remove item from queue
* @param {string} downloadId - Download item ID
* @returns {Promise<boolean>} Success status
*/
async function removeFromQueue(downloadId) {
try {
const response = await AniWorld.ApiClient.delete(API.QUEUE_REMOVE + '/' + downloadId);
if (!response) return false;
return response.status === 204;
} catch (error) {
console.error('Error removing from queue:', error);
throw error;
}
}
/**
* Retry failed downloads
* @param {Array<string>} itemIds - Array of download item IDs
* @returns {Promise<Object>} Response data
*/
async function retryDownloads(itemIds) {
try {
const response = await AniWorld.ApiClient.post(API.QUEUE_RETRY, { item_ids: itemIds });
if (!response) return null;
return await response.json();
} catch (error) {
console.error('Error retrying downloads:', error);
throw error;
}
}
/**
* Clear completed downloads
* @returns {Promise<Object>} Response data
*/
async function clearCompleted() {
try {
const response = await AniWorld.ApiClient.delete(API.QUEUE_COMPLETED);
if (!response) return null;
return await response.json();
} catch (error) {
console.error('Error clearing completed:', error);
throw error;
}
}
/**
* Clear failed downloads
* @returns {Promise<Object>} Response data
*/
async function clearFailed() {
try {
const response = await AniWorld.ApiClient.delete(API.QUEUE_FAILED);
if (!response) return null;
return await response.json();
} catch (error) {
console.error('Error clearing failed:', error);
throw error;
}
}
/**
* Clear pending downloads
* @returns {Promise<Object>} Response data
*/
async function clearPending() {
try {
const response = await AniWorld.ApiClient.delete(API.QUEUE_PENDING);
if (!response) return null;
return await response.json();
} catch (error) {
console.error('Error clearing pending:', error);
throw error;
}
}
// Public API
return {
loadQueueData: loadQueueData,
startQueue: startQueue,
stopQueue: stopQueue,
removeFromQueue: removeFromQueue,
retryDownloads: retryDownloads,
clearCompleted: clearCompleted,
clearFailed: clearFailed,
clearPending: clearPending
};
})();