Files
cwd/docs/widget/src/dev.js
anghunk 6555907156 feat(widget): 新增评论组件核心功能及开发环境配置
新增评论组件核心功能,包括评论列表、分页、回复、表单验证等功能
添加开发环境配置,包括Vite构建配置、样式变量和工具函数
实现管理员验证功能,支持本地存储加密
添加组件基础类及常用组件如加载状态、分页、模态框等
配置文档站点构建流程,支持widget独立构建和集成
2026-01-22 09:01:11 +08:00

167 lines
3.6 KiB
JavaScript

/**
* 开发调试脚本
*/
import { CWDComments } from './index.js';
// 本地存储的 key
const STORAGE_KEY = 'cwd-dev-config';
// 默认配置
const DEFAULT_CONFIG = {
el: '#comments',
apiBaseUrl: 'http://localhost:8788',
theme: 'light', // 默认 light / dark
};
let widgetInstance = null;
/**
* 从本地存储加载配置
*/
function loadConfigFromStorage() {
try {
const saved = localStorage.getItem(STORAGE_KEY);
if (saved) {
return { ...DEFAULT_CONFIG, ...JSON.parse(saved) };
}
} catch (e) {
}
return DEFAULT_CONFIG;
}
/**
* 保存配置到本地存储
*/
function saveConfigToStorage(config) {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify(config));
} catch (e) {
}
}
/**
* 将配置填充到输入框
*/
function populateInputs(config) {
const apiBaseUrlInput = document.getElementById('apiBaseUrl');
const themeSelect = document.getElementById('theme');
const avatarPrefixInput = document.getElementById('avatarPrefix');
if (apiBaseUrlInput) apiBaseUrlInput.value = config.apiBaseUrl || DEFAULT_CONFIG.apiBaseUrl;
if (themeSelect) themeSelect.value = config.theme || DEFAULT_CONFIG.theme;
if (avatarPrefixInput) avatarPrefixInput.value = config.avatarPrefix || DEFAULT_CONFIG.avatarPrefix;
}
/**
* 从输入框获取当前配置
*/
function getConfigFromInputs() {
const apiBaseUrl = document.getElementById('apiBaseUrl')?.value || DEFAULT_CONFIG.apiBaseUrl;
const theme = document.getElementById('theme')?.value || DEFAULT_CONFIG.theme;
return { apiBaseUrl, theme };
}
/**
* 初始化 widget
*/
async function initWidget() {
const config = getConfigFromInputs();
// 保存到本地存储
saveConfigToStorage(config);
// 如果已存在实例,先卸载
if (widgetInstance) {
widgetInstance.unmount();
widgetInstance = null;
}
// 清空容器
const container = document.getElementById('comments');
if (container) {
container.innerHTML = '';
}
// 创建新实例
try {
widgetInstance = new CWDComments({
el: '#comments',
apiBaseUrl: config.apiBaseUrl,
theme: config.theme,
pageSize: 20,
});
widgetInstance.mount();
} catch (error) {}
}
/**
* 切换主题
*/
function toggleTheme() {
if (!widgetInstance) {
return;
}
const currentConfig = widgetInstance.getConfig();
const newTheme = currentConfig.theme === 'light' ? 'dark' : 'light';
widgetInstance.updateConfig({ theme: newTheme });
// 更新下拉框
const themeSelect = document.getElementById('theme');
if (themeSelect) {
themeSelect.value = newTheme;
}
// 保存到本地存储
const config = getConfigFromInputs();
config.theme = newTheme;
saveConfigToStorage(config);
}
/**
* 清除本地存储的配置
*/
function clearConfig() {
try {
localStorage.removeItem(STORAGE_KEY);
populateInputs(DEFAULT_CONFIG);
} catch (e) {
}
}
// 将函数挂载到 window 对象,使其在 HTML 中可访问
window.initWidget = initWidget;
window.toggleTheme = toggleTheme;
window.clearConfig = clearConfig;
// 页面加载完成后自动初始化
document.addEventListener('DOMContentLoaded', () => {
// 从本地存储加载配置并填充到输入框
const savedConfig = loadConfigFromStorage();
populateInputs(savedConfig);
// 初始化 widget
initWidget();
});
// 监听输入框变化,实时保存
document.addEventListener('DOMContentLoaded', () => {
const inputs = ['apiBaseUrl', 'theme'];
inputs.forEach((id) => {
const element = document.getElementById(id);
if (element) {
element.addEventListener('change', () => {
const config = getConfigFromInputs();
saveConfigToStorage(config);
});
}
});
});
// 导出类型(用于调试)
window.CWDComments = CWDComments;