configStorage.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import { STORAGE_KEYS, DEFAULT_CONFIG } from '../../utils/constants';
  2. const MESSAGES_STORAGE_KEY = 'playground_messages';
  3. /**
  4. * 保存配置到 localStorage
  5. * @param {Object} config - 要保存的配置对象
  6. */
  7. export const saveConfig = (config) => {
  8. try {
  9. const configToSave = {
  10. ...config,
  11. timestamp: new Date().toISOString(),
  12. };
  13. localStorage.setItem(STORAGE_KEYS.CONFIG, JSON.stringify(configToSave));
  14. console.log('配置已保存到本地存储');
  15. } catch (error) {
  16. console.error('保存配置失败:', error);
  17. }
  18. };
  19. /**
  20. * 保存消息到 localStorage
  21. * @param {Array} messages - 要保存的消息数组
  22. */
  23. export const saveMessages = (messages) => {
  24. try {
  25. const messagesToSave = {
  26. messages,
  27. timestamp: new Date().toISOString(),
  28. };
  29. localStorage.setItem(STORAGE_KEYS.MESSAGES, JSON.stringify(messagesToSave));
  30. console.log('消息已保存到本地存储');
  31. } catch (error) {
  32. console.error('保存消息失败:', error);
  33. }
  34. };
  35. /**
  36. * 从 localStorage 加载配置
  37. * @returns {Object} 配置对象,如果不存在则返回默认配置
  38. */
  39. export const loadConfig = () => {
  40. try {
  41. const savedConfig = localStorage.getItem(STORAGE_KEYS.CONFIG);
  42. if (savedConfig) {
  43. const parsedConfig = JSON.parse(savedConfig);
  44. const mergedConfig = {
  45. inputs: {
  46. ...DEFAULT_CONFIG.inputs,
  47. ...parsedConfig.inputs,
  48. },
  49. parameterEnabled: {
  50. ...DEFAULT_CONFIG.parameterEnabled,
  51. ...parsedConfig.parameterEnabled,
  52. },
  53. showDebugPanel: parsedConfig.showDebugPanel || DEFAULT_CONFIG.showDebugPanel,
  54. customRequestMode: parsedConfig.customRequestMode || DEFAULT_CONFIG.customRequestMode,
  55. customRequestBody: parsedConfig.customRequestBody || DEFAULT_CONFIG.customRequestBody,
  56. };
  57. console.log('配置已从本地存储加载');
  58. return mergedConfig;
  59. }
  60. } catch (error) {
  61. console.error('加载配置失败:', error);
  62. }
  63. console.log('使用默认配置');
  64. return DEFAULT_CONFIG;
  65. };
  66. /**
  67. * 从 localStorage 加载消息
  68. * @returns {Array} 消息数组,如果不存在则返回 null
  69. */
  70. export const loadMessages = () => {
  71. try {
  72. const savedMessages = localStorage.getItem(STORAGE_KEYS.MESSAGES);
  73. if (savedMessages) {
  74. const parsedMessages = JSON.parse(savedMessages);
  75. console.log('消息已从本地存储加载');
  76. return parsedMessages.messages || null;
  77. }
  78. } catch (error) {
  79. console.error('加载消息失败:', error);
  80. }
  81. console.log('没有找到保存的消息');
  82. return null;
  83. };
  84. /**
  85. * 清除保存的配置
  86. */
  87. export const clearConfig = () => {
  88. try {
  89. localStorage.removeItem(STORAGE_KEYS.CONFIG);
  90. localStorage.removeItem(STORAGE_KEYS.MESSAGES); // 同时清除消息
  91. console.log('配置和消息已清除');
  92. } catch (error) {
  93. console.error('清除配置失败:', error);
  94. }
  95. };
  96. /**
  97. * 清除保存的消息
  98. */
  99. export const clearMessages = () => {
  100. try {
  101. localStorage.removeItem(STORAGE_KEYS.MESSAGES);
  102. console.log('消息已清除');
  103. } catch (error) {
  104. console.error('清除消息失败:', error);
  105. }
  106. };
  107. /**
  108. * 检查是否有保存的配置
  109. * @returns {boolean} 是否存在保存的配置
  110. */
  111. export const hasStoredConfig = () => {
  112. try {
  113. return localStorage.getItem(STORAGE_KEYS.CONFIG) !== null;
  114. } catch (error) {
  115. console.error('检查配置失败:', error);
  116. return false;
  117. }
  118. };
  119. /**
  120. * 获取配置的最后保存时间
  121. * @returns {string|null} 最后保存时间的 ISO 字符串
  122. */
  123. export const getConfigTimestamp = () => {
  124. try {
  125. const savedConfig = localStorage.getItem(STORAGE_KEYS.CONFIG);
  126. if (savedConfig) {
  127. const parsedConfig = JSON.parse(savedConfig);
  128. return parsedConfig.timestamp || null;
  129. }
  130. } catch (error) {
  131. console.error('获取配置时间戳失败:', error);
  132. }
  133. return null;
  134. };
  135. /**
  136. * 导出配置为 JSON 文件(包含消息)
  137. * @param {Object} config - 要导出的配置
  138. * @param {Array} messages - 要导出的消息
  139. */
  140. export const exportConfig = (config, messages = null) => {
  141. try {
  142. const configToExport = {
  143. ...config,
  144. messages: messages || loadMessages(), // 包含消息数据
  145. exportTime: new Date().toISOString(),
  146. version: '1.0',
  147. };
  148. const dataStr = JSON.stringify(configToExport, null, 2);
  149. const dataBlob = new Blob([dataStr], { type: 'application/json' });
  150. const link = document.createElement('a');
  151. link.href = URL.createObjectURL(dataBlob);
  152. link.download = `playground-config-${new Date().toISOString().split('T')[0]}.json`;
  153. link.click();
  154. URL.revokeObjectURL(link.href);
  155. console.log('配置已导出');
  156. } catch (error) {
  157. console.error('导出配置失败:', error);
  158. }
  159. };
  160. /**
  161. * 从文件导入配置(包含消息)
  162. * @param {File} file - 包含配置的 JSON 文件
  163. * @returns {Promise<Object>} 导入的配置对象
  164. */
  165. export const importConfig = (file) => {
  166. return new Promise((resolve, reject) => {
  167. try {
  168. const reader = new FileReader();
  169. reader.onload = (e) => {
  170. try {
  171. const importedConfig = JSON.parse(e.target.result);
  172. if (importedConfig.inputs && importedConfig.parameterEnabled) {
  173. // 如果导入的配置包含消息,也一起导入
  174. if (importedConfig.messages && Array.isArray(importedConfig.messages)) {
  175. saveMessages(importedConfig.messages);
  176. }
  177. console.log('配置已从文件导入');
  178. resolve(importedConfig);
  179. } else {
  180. reject(new Error('配置文件格式无效'));
  181. }
  182. } catch (parseError) {
  183. reject(new Error('解析配置文件失败: ' + parseError.message));
  184. }
  185. };
  186. reader.onerror = () => reject(new Error('读取文件失败'));
  187. reader.readAsText(file);
  188. } catch (error) {
  189. reject(new Error('导入配置失败: ' + error.message));
  190. }
  191. });
  192. };