/** * Settings Panel Module * Manages the extension settings tab in SillyTavern's Extensions panel. * Extracted from index.js to reduce main entry point size. */ import { extensionSettings } from './state.js'; import { saveSettings } from './persistence.js'; import { extensionName } from './config.js'; import { i18n } from './i18n.js'; /** * Adds the extension settings to the Extensions tab. * @param {Function} $ - jQuery function * @param {Function} renderExtensionTemplateAsync - SillyTavern template renderer * @param {Function} clearExtensionPrompts - Clear extension prompts from SillyTavern * @param {Function} updateChatThoughts - Update thought bubbles in chat * @param {Function} cleanupCheckpointUI - Remove checkpoint UI elements * @param {Function} clearThoughtBasedExpressionsCache - Clear expression cache * @param {Function} toggleDynamicWeather - Toggle weather effects * @param {Function} initUI - Initialize the main UI panel * @param {Function} loadChatData - Load chat-specific data * @param {Function} scheduleChatStateRehydration - Schedule chat state rehydration * @param {Function} initThoughtBasedExpressions - Initialize thought-based expressions * @param {Function} injectCheckpointButton - Add checkpoint buttons * @param {Function} updateAllCheckpointIndicators - Update checkpoint button states * @param {Function} removeAlternatePresentCharactersPanel - Remove alt characters panel * @param {Function} registerExtensionEvents - (Re)register all SillyTavern event handlers * @param {Function} unregisterAllEvents - Unregister all tracked SillyTavern event handlers * @param {Function} initHistoryInjection - (Re)register history injection listeners */ export async function addExtensionSettings($, renderExtensionTemplateAsync, clearExtensionPrompts, updateChatThoughts, cleanupCheckpointUI, clearThoughtBasedExpressionsCache, toggleDynamicWeather, initUI, loadChatData, scheduleChatStateRehydration, initThoughtBasedExpressions, injectCheckpointButton, updateAllCheckpointIndicators, removeAlternatePresentCharactersPanel, registerExtensionEvents, unregisterAllEvents, initHistoryInjection) { const settingsHtml = await renderExtensionTemplateAsync(extensionName, 'settings'); $('#extensions_settings2').append(settingsHtml); // Enable/disable toggle $('#rpg-extension-enabled').prop('checked', extensionSettings.enabled).on('change', async function() { const wasEnabled = extensionSettings.enabled; extensionSettings.enabled = $(this).prop('checked'); saveSettings(); if (!extensionSettings.enabled && wasEnabled) { clearExtensionPrompts(); updateChatThoughts(); cleanupCheckpointUI(); clearThoughtBasedExpressionsCache(); toggleDynamicWeather(false); // Unregister all tracked event handlers to avoid leaks while disabled unregisterAllEvents(); $('#rpg-companion-panel').remove(); $('#rpg-mobile-toggle').remove(); $('#rpg-collapse-toggle').remove(); $('#rpg-plot-buttons').remove(); removeAlternatePresentCharactersPanel(); } else if (extensionSettings.enabled && !wasEnabled) { // Re-register event handlers that were unregistered on disable registerExtensionEvents(); initHistoryInjection(); await initUI(); loadChatData(); scheduleChatStateRehydration(); initThoughtBasedExpressions(); updateChatThoughts(); injectCheckpointButton(); updateAllCheckpointIndicators(); } }); // Language selector const langSelect = $('#rpg-companion-language-select'); if (langSelect.length) { langSelect.val(i18n.currentLanguage); langSelect.on('change', async function() { const selectedLanguage = $(this).val(); await i18n.setLanguage(selectedLanguage); i18n.applyTranslations(document.getElementById('extensions_settings2')); }); } }