diff --git a/index.js b/index.js index dbc01b7..89b61f4 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,11 @@ +/** + * RPG Companion - Main Entry Point + * SillyTavern extension for RPG-style character tracking. + * + * This file is a thin orchestrator that delegates to sub-modules. + * See src/ directory for the actual implementation. + */ + import { getContext, renderExtensionTemplateAsync, extension_settings as st_extension_settings } from '../../../extensions.js'; import { eventSource, event_types, substituteParams, chat, saveSettingsDebounced, chat_metadata, saveChatDebounced, user_avatar, getThumbnailUrl, characters, this_chid, extension_prompt_types, extension_prompt_roles, setExtensionPrompt, reloadCurrentChat, Generate, getRequestHeaders } from '../../../../script.js'; import { selected_group, getGroupMembers } from '../../../group-chats.js'; @@ -46,6 +54,7 @@ import { } from './src/core/state.js'; import { loadSettings, saveSettings, saveChatData, loadChatData, updateMessageSwipeData, commitTrackerDataFromPriorMessage } from './src/core/persistence.js'; import { registerAllEvents } from './src/core/events.js'; +import { addExtensionSettings } from './src/core/settingsPanel.js'; // Generation & Parsing modules import { @@ -102,12 +111,8 @@ import { showWelcomeModalIfNeeded, showDeprecationModalIfNeeded } from './src/systems/ui/modals.js'; -import { - initTrackerEditor -} from './src/systems/ui/trackerEditor.js'; -import { - initPromptsEditor -} from './src/systems/ui/promptsEditor.js'; +import { initTrackerEditor } from './src/systems/ui/trackerEditor.js'; +import { initPromptsEditor } from './src/systems/ui/promptsEditor.js'; import { initChapterCheckpointUI, injectCheckpointButton, @@ -179,125 +184,42 @@ import { initHistoryInjection } from './src/systems/integration/sillytavern.js'; -// Old state variable declarations removed - now imported from core modules -// (extensionSettings, lastGeneratedData, committedTrackerData, etc. are now in src/core/state.js) +// Settings UI event listeners (extracted from initUI) +import { bindSettingsListeners, updateWeatherSubOptionsVisibility } from './src/systems/ui/settingsListeners.js'; +// Set up thought-based expressions refresh handler setThoughtBasedExpressionsRefreshHandler(() => { renderAlternatePresentCharacters({ useCommittedFallback: true }); }); -// Utility functions removed - now imported from src/utils/avatars.js -// (getSafeThumbnailUrl) - -// Persistence functions removed - now imported from src/core/persistence.js -// (loadSettings, saveSettings, saveChatData, loadChatData, updateMessageSwipeData) - -// Theme functions removed - now imported from src/systems/ui/theme.js -// (applyTheme, applyCustomTheme, toggleCustomColors, toggleAnimations, -// updateSettingsPopupTheme, applyCustomThemeToSettingsPopup) - -// Layout functions removed - now imported from src/systems/ui/layout.js -// (togglePlotButtons, updateCollapseToggleIcon, setupCollapseToggle, -// updatePanelVisibility, updateSectionVisibility, applyPanelPosition) -// Note: closeMobilePanelWithAnimation is only used internally by mobile.js - -// Mobile UI functions removed - now imported from src/systems/ui/mobile.js -// (setupMobileToggle, constrainFabToViewport, setupMobileTabs, removeMobileTabs, -// setupMobileKeyboardHandling, setupContentEditableScrolling) - /** * Updates UI elements that are dynamically generated and not covered by data-i18n-key. */ function updateDynamicLabels() { - // Update "Refresh RPG Info" button, but only if it's not disabled const refreshBtn = document.getElementById('rpg-manual-update'); if (refreshBtn && !refreshBtn.disabled) { const refreshText = i18n.getTranslation('template.mainPanel.refreshRpgInfo') || 'Refresh RPG Info'; refreshBtn.innerHTML = ` ${refreshText}`; } - - // Update "Last Roll" label updateDiceDisplay(); - - // Update mobile tab labels updateMobileTabLabels(); } -/** - * Adds the extension settings to the Extensions tab. - */ -async function addExtensionSettings() { - // Load the HTML template for the settings - const settingsHtml = await renderExtensionTemplateAsync(extensionName, 'settings'); - $('#extensions_settings2').append(settingsHtml); - - // Set up the 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) { - // Disabling extension - remove UI elements - clearExtensionPrompts(); - updateChatThoughts(); // Remove thought bubbles - cleanupCheckpointUI(); // Remove checkpoint buttons and indicators - clearThoughtBasedExpressionsCache(); - - // Disable dynamic weather effects - toggleDynamicWeather(false); - - // Remove panel and toggle buttons - $('#rpg-companion-panel').remove(); - $('#rpg-mobile-toggle').remove(); - $('#rpg-collapse-toggle').remove(); - $('#rpg-plot-buttons').remove(); // Remove plot buttons - removeAlternatePresentCharactersPanel(); - } else if (extensionSettings.enabled && !wasEnabled) { - // Enabling extension - initialize UI - await initUI(); - loadChatData(); // Load chat data for current chat - scheduleChatStateRehydration(); - initThoughtBasedExpressions(); - updateChatThoughts(); // Create thought bubbles if data exists - injectCheckpointButton(); // Re-add checkpoint buttons - updateAllCheckpointIndicators(); // Update button states - } - }); - - // Set up 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); - // We need to re-apply translations to the settings panel specifically - i18n.applyTranslations(document.getElementById('extensions_settings2')); - }); - } -} - /** * Initializes the UI for the extension. */ async function initUI() { - // Initialize i18n await i18n.init(); - // Only initialize UI if extension is enabled if (!extensionSettings.enabled) { - // console.log('[RPG Companion] Extension disabled - skipping UI initialization'); return; } - // Load the HTML template using SillyTavern's template system + // Load and inject the HTML template const templateHtml = await renderExtensionTemplateAsync(extensionName, 'template'); - - // Append panel to body - positioning handled by CSS $('body').append(templateHtml); - // Add mobile toggle button (FAB - Floating Action Button) + // Add mobile toggle button (FAB) const theme = extensionSettings.theme || 'default'; const mobileToggleHtml = `