pixivflow 2.0.38 → 2.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/dist/cli/ArgumentParser.d.ts +2 -20
  2. package/dist/cli/ArgumentParser.d.ts.map +1 -1
  3. package/dist/cli/ArgumentParser.js +16 -29
  4. package/dist/cli/ArgumentParser.js.map +1 -1
  5. package/dist/commands/BackupCommand.d.ts +6 -0
  6. package/dist/commands/BackupCommand.d.ts.map +1 -1
  7. package/dist/commands/BackupCommand.js +6 -0
  8. package/dist/commands/BackupCommand.js.map +1 -1
  9. package/dist/commands/Command.d.ts +16 -0
  10. package/dist/commands/Command.d.ts.map +1 -1
  11. package/dist/commands/Command.js +9 -0
  12. package/dist/commands/Command.js.map +1 -1
  13. package/dist/commands/CommandRegistry.d.ts +24 -0
  14. package/dist/commands/CommandRegistry.d.ts.map +1 -1
  15. package/dist/commands/CommandRegistry.js +48 -0
  16. package/dist/commands/CommandRegistry.js.map +1 -1
  17. package/dist/commands/ConfigCommand.d.ts +6 -0
  18. package/dist/commands/ConfigCommand.d.ts.map +1 -1
  19. package/dist/commands/ConfigCommand.js +6 -0
  20. package/dist/commands/ConfigCommand.js.map +1 -1
  21. package/dist/commands/DirsCommand.d.ts +6 -0
  22. package/dist/commands/DirsCommand.d.ts.map +1 -1
  23. package/dist/commands/DirsCommand.js +6 -0
  24. package/dist/commands/DirsCommand.js.map +1 -1
  25. package/dist/commands/DownloadCommand.d.ts +6 -0
  26. package/dist/commands/DownloadCommand.d.ts.map +1 -1
  27. package/dist/commands/DownloadCommand.js +57 -3
  28. package/dist/commands/DownloadCommand.js.map +1 -1
  29. package/dist/commands/HealthCommand.d.ts +7 -0
  30. package/dist/commands/HealthCommand.d.ts.map +1 -1
  31. package/dist/commands/HealthCommand.js +7 -0
  32. package/dist/commands/HealthCommand.js.map +1 -1
  33. package/dist/commands/HelpCommand.d.ts +7 -0
  34. package/dist/commands/HelpCommand.d.ts.map +1 -1
  35. package/dist/commands/HelpCommand.js +22 -29
  36. package/dist/commands/HelpCommand.js.map +1 -1
  37. package/dist/commands/LoginCommand.d.ts +7 -0
  38. package/dist/commands/LoginCommand.d.ts.map +1 -1
  39. package/dist/commands/LoginCommand.js +7 -0
  40. package/dist/commands/LoginCommand.js.map +1 -1
  41. package/dist/commands/LoginHeadlessCommand.d.ts +7 -0
  42. package/dist/commands/LoginHeadlessCommand.d.ts.map +1 -1
  43. package/dist/commands/LoginHeadlessCommand.js +7 -0
  44. package/dist/commands/LoginHeadlessCommand.js.map +1 -1
  45. package/dist/commands/LogsCommand.d.ts +6 -0
  46. package/dist/commands/LogsCommand.d.ts.map +1 -1
  47. package/dist/commands/LogsCommand.js +6 -0
  48. package/dist/commands/LogsCommand.js.map +1 -1
  49. package/dist/commands/MaintainCommand.d.ts +6 -0
  50. package/dist/commands/MaintainCommand.d.ts.map +1 -1
  51. package/dist/commands/MaintainCommand.js +6 -0
  52. package/dist/commands/MaintainCommand.js.map +1 -1
  53. package/dist/commands/MigrateConfigCommand.d.ts +6 -0
  54. package/dist/commands/MigrateConfigCommand.d.ts.map +1 -1
  55. package/dist/commands/MigrateConfigCommand.js +6 -0
  56. package/dist/commands/MigrateConfigCommand.js.map +1 -1
  57. package/dist/commands/MonitorCommand.d.ts +6 -0
  58. package/dist/commands/MonitorCommand.d.ts.map +1 -1
  59. package/dist/commands/MonitorCommand.js +6 -0
  60. package/dist/commands/MonitorCommand.js.map +1 -1
  61. package/dist/commands/NormalizeCommand.d.ts +6 -0
  62. package/dist/commands/NormalizeCommand.d.ts.map +1 -1
  63. package/dist/commands/NormalizeCommand.js +6 -0
  64. package/dist/commands/NormalizeCommand.js.map +1 -1
  65. package/dist/commands/RandomDownloadCommand.d.ts +7 -1
  66. package/dist/commands/RandomDownloadCommand.d.ts.map +1 -1
  67. package/dist/commands/RandomDownloadCommand.js +7 -1
  68. package/dist/commands/RandomDownloadCommand.js.map +1 -1
  69. package/dist/commands/RefreshCommand.d.ts +12 -0
  70. package/dist/commands/RefreshCommand.d.ts.map +1 -1
  71. package/dist/commands/RefreshCommand.js +82 -0
  72. package/dist/commands/RefreshCommand.js.map +1 -1
  73. package/dist/commands/SchedulerCommand.d.ts +6 -0
  74. package/dist/commands/SchedulerCommand.d.ts.map +1 -1
  75. package/dist/commands/SchedulerCommand.js +7 -1
  76. package/dist/commands/SchedulerCommand.js.map +1 -1
  77. package/dist/commands/SetupCommand.d.ts +6 -0
  78. package/dist/commands/SetupCommand.d.ts.map +1 -1
  79. package/dist/commands/SetupCommand.js +6 -0
  80. package/dist/commands/SetupCommand.js.map +1 -1
  81. package/dist/commands/StatusCommand.d.ts +6 -0
  82. package/dist/commands/StatusCommand.d.ts.map +1 -1
  83. package/dist/commands/StatusCommand.js +6 -0
  84. package/dist/commands/StatusCommand.js.map +1 -1
  85. package/dist/commands/VersionCommand.d.ts +21 -0
  86. package/dist/commands/VersionCommand.d.ts.map +1 -0
  87. package/dist/commands/VersionCommand.js +81 -0
  88. package/dist/commands/VersionCommand.js.map +1 -0
  89. package/dist/commands/WebUICommand.d.ts +6 -0
  90. package/dist/commands/WebUICommand.d.ts.map +1 -1
  91. package/dist/commands/WebUICommand.js +6 -0
  92. package/dist/commands/WebUICommand.js.map +1 -1
  93. package/dist/commands/index.d.ts +2 -1
  94. package/dist/commands/index.d.ts.map +1 -1
  95. package/dist/commands/index.js +4 -1
  96. package/dist/commands/index.js.map +1 -1
  97. package/dist/commands/metadata.d.ts +38 -0
  98. package/dist/commands/metadata.d.ts.map +1 -0
  99. package/dist/commands/metadata.js +42 -0
  100. package/dist/commands/metadata.js.map +1 -0
  101. package/dist/commands/suggestions.d.ts +22 -0
  102. package/dist/commands/suggestions.d.ts.map +1 -0
  103. package/dist/commands/suggestions.js +85 -0
  104. package/dist/commands/suggestions.js.map +1 -0
  105. package/dist/config/validation.d.ts.map +1 -1
  106. package/dist/config/validation.js +11 -3
  107. package/dist/config/validation.js.map +1 -1
  108. package/dist/index.js +126 -320
  109. package/dist/index.js.map +1 -1
  110. package/dist/package.json +1 -1
  111. package/dist/pixiv/AuthClient.d.ts.map +1 -1
  112. package/dist/pixiv/AuthClient.js +56 -7
  113. package/dist/pixiv/AuthClient.js.map +1 -1
  114. package/dist/storage/Database.d.ts +22 -0
  115. package/dist/storage/Database.d.ts.map +1 -1
  116. package/dist/storage/Database.js +19 -0
  117. package/dist/storage/Database.js.map +1 -1
  118. package/dist/storage/DatabaseMigration.d.ts.map +1 -1
  119. package/dist/storage/DatabaseMigration.js +29 -0
  120. package/dist/storage/DatabaseMigration.js.map +1 -1
  121. package/dist/storage/repositories/TaskHistoryRepository.d.ts +61 -0
  122. package/dist/storage/repositories/TaskHistoryRepository.d.ts.map +1 -0
  123. package/dist/storage/repositories/TaskHistoryRepository.js +171 -0
  124. package/dist/storage/repositories/TaskHistoryRepository.js.map +1 -0
  125. package/dist/utils/errors.d.ts +14 -0
  126. package/dist/utils/errors.d.ts.map +1 -1
  127. package/dist/utils/errors.js +35 -12
  128. package/dist/utils/errors.js.map +1 -1
  129. package/dist/utils/pixiv-url-parser.d.ts +7 -1
  130. package/dist/utils/pixiv-url-parser.d.ts.map +1 -1
  131. package/dist/utils/pixiv-url-parser.js +75 -8
  132. package/dist/utils/pixiv-url-parser.js.map +1 -1
  133. package/dist/utils/token-manager.d.ts.map +1 -1
  134. package/dist/utils/token-manager.js +73 -5
  135. package/dist/utils/token-manager.js.map +1 -1
  136. package/dist/webui/package.json +1 -1
  137. package/dist/webui/routes/download.d.ts.map +1 -1
  138. package/dist/webui/routes/download.js +2 -0
  139. package/dist/webui/routes/download.js.map +1 -1
  140. package/dist/webui/routes/handlers/download-basic-handlers.d.ts +11 -0
  141. package/dist/webui/routes/handlers/download-basic-handlers.d.ts.map +1 -1
  142. package/dist/webui/routes/handlers/download-basic-handlers.js +199 -8
  143. package/dist/webui/routes/handlers/download-basic-handlers.js.map +1 -1
  144. package/dist/webui/services/DownloadTaskManager.d.ts.map +1 -1
  145. package/dist/webui/services/DownloadTaskManager.js +75 -3
  146. package/dist/webui/services/DownloadTaskManager.js.map +1 -1
  147. package/package.json +1 -1
  148. package/dist/webui/assets/ActionButton-DWq-fh3_.js +0 -2
  149. package/dist/webui/assets/ActionButton-DWq-fh3_.js.map +0 -1
  150. package/dist/webui/assets/CheckCircleOutlined-Can0-7ew.js +0 -2
  151. package/dist/webui/assets/CheckCircleOutlined-Can0-7ew.js.map +0 -1
  152. package/dist/webui/assets/CloseCircleOutlined-DfRmL2eG.js +0 -2
  153. package/dist/webui/assets/CloseCircleOutlined-DfRmL2eG.js.map +0 -1
  154. package/dist/webui/assets/Config-D9TWUGQR.js +0 -16
  155. package/dist/webui/assets/Config-D9TWUGQR.js.map +0 -1
  156. package/dist/webui/assets/Dashboard-CaGAH0y2.js +0 -2
  157. package/dist/webui/assets/Dashboard-CaGAH0y2.js.map +0 -1
  158. package/dist/webui/assets/DeleteOutlined-u-P2SpoK.js +0 -2
  159. package/dist/webui/assets/DeleteOutlined-u-P2SpoK.js.map +0 -1
  160. package/dist/webui/assets/Download-D9E4xrnM.js +0 -2
  161. package/dist/webui/assets/Download-D9E4xrnM.js.map +0 -1
  162. package/dist/webui/assets/Files-CKyc_PdW.js +0 -5
  163. package/dist/webui/assets/Files-CKyc_PdW.js.map +0 -1
  164. package/dist/webui/assets/PictureOutlined-C8Lbucj1.js +0 -2
  165. package/dist/webui/assets/PictureOutlined-C8Lbucj1.js.map +0 -1
  166. package/dist/webui/assets/SortDescendingOutlined-CR-hdhyW.js +0 -2
  167. package/dist/webui/assets/SortDescendingOutlined-CR-hdhyW.js.map +0 -1
  168. package/dist/webui/assets/ThunderboltOutlined-CiiB2de5.js +0 -2
  169. package/dist/webui/assets/ThunderboltOutlined-CiiB2de5.js.map +0 -1
  170. package/dist/webui/assets/UrlDownload-ClkUOXN_.js +0 -3
  171. package/dist/webui/assets/UrlDownload-ClkUOXN_.js.map +0 -1
  172. package/dist/webui/assets/dateUtils-CBk8bEa_.js +0 -2
  173. package/dist/webui/assets/dateUtils-CBk8bEa_.js.map +0 -1
  174. package/dist/webui/assets/errorCodeTranslator-DWsWq6B3.js +0 -3
  175. package/dist/webui/assets/errorCodeTranslator-DWsWq6B3.js.map +0 -1
  176. package/dist/webui/assets/index-BFgUdwJv.js +0 -214
  177. package/dist/webui/assets/index-BFgUdwJv.js.map +0 -1
  178. package/dist/webui/assets/index-CN3FylAF.js +0 -2
  179. package/dist/webui/assets/index-CN3FylAF.js.map +0 -1
  180. package/dist/webui/assets/index-CSoUPZat.js +0 -2
  181. package/dist/webui/assets/index-CSoUPZat.js.map +0 -1
  182. package/dist/webui/assets/index-CiHwNwrk.js +0 -19
  183. package/dist/webui/assets/index-CiHwNwrk.js.map +0 -1
  184. package/dist/webui/assets/index-DHwJxrFi.css +0 -1
  185. package/dist/webui/assets/index-DTU-FGA4.js +0 -2
  186. package/dist/webui/assets/index-DTU-FGA4.js.map +0 -1
  187. package/dist/webui/assets/index-DjpD0HQ5.js +0 -2
  188. package/dist/webui/assets/index-DjpD0HQ5.js.map +0 -1
  189. package/dist/webui/assets/index-Dycn6xoz.js +0 -2
  190. package/dist/webui/assets/index-Dycn6xoz.js.map +0 -1
  191. package/dist/webui/assets/index-G0EJCamt.js +0 -22
  192. package/dist/webui/assets/index-G0EJCamt.js.map +0 -1
  193. package/dist/webui/assets/index-WaraZQH0.js +0 -2
  194. package/dist/webui/assets/index-WaraZQH0.js.map +0 -1
  195. package/dist/webui/assets/index-k2rGFxEM.js +0 -8
  196. package/dist/webui/assets/index-k2rGFxEM.js.map +0 -1
  197. package/dist/webui/assets/index-lwTtspUb.js +0 -14
  198. package/dist/webui/assets/index-lwTtspUb.js.map +0 -1
  199. package/dist/webui/assets/index-pT0W4KjK.js +0 -47
  200. package/dist/webui/assets/index-pT0W4KjK.js.map +0 -1
  201. package/dist/webui/assets/index-wvielV9A.js +0 -2
  202. package/dist/webui/assets/index-wvielV9A.js.map +0 -1
  203. package/dist/webui/assets/row-FRqVdQDX.js +0 -20
  204. package/dist/webui/assets/row-FRqVdQDX.js.map +0 -1
  205. package/dist/webui/assets/useAuth-BMt6dHSB.js +0 -9
  206. package/dist/webui/assets/useAuth-BMt6dHSB.js.map +0 -1
  207. package/dist/webui/assets/useConfig-29Ugtjk4.js +0 -9
  208. package/dist/webui/assets/useConfig-29Ugtjk4.js.map +0 -1
  209. package/dist/webui/assets/useDownload-Dt6lsP8S.js +0 -2
  210. package/dist/webui/assets/useDownload-Dt6lsP8S.js.map +0 -1
  211. package/dist/webui/assets/useErrorHandler-DWHs3RlU.js +0 -84
  212. package/dist/webui/assets/useErrorHandler-DWHs3RlU.js.map +0 -1
  213. package/dist/webui/index.html +0 -15
@@ -1 +0,0 @@
1
- {"version":3,"file":"Config-D9TWUGQR.js","sources":["../../node_modules/@ant-design/icons-svg/es/asn/UpOutlined.js","../../node_modules/@ant-design/icons/es/icons/UpOutlined.js","../../node_modules/@rc-component/mini-decimal/es/supportUtil.js","../../node_modules/@rc-component/mini-decimal/es/numberUtil.js","../../node_modules/@rc-component/mini-decimal/es/BigIntDecimal.js","../../node_modules/@rc-component/mini-decimal/es/NumberDecimal.js","../../node_modules/@rc-component/mini-decimal/es/MiniDecimal.js","../../node_modules/rc-util/es/proxyObject.js","../../node_modules/rc-input-number/es/hooks/useCursor.js","../../node_modules/rc-util/es/hooks/useMobile.js","../../node_modules/rc-input-number/es/StepHandler.js","../../node_modules/rc-input-number/es/utils/numberUtil.js","../../node_modules/rc-input-number/es/hooks/useFrame.js","../../node_modules/rc-input-number/es/InputNumber.js","../../node_modules/antd/es/input-number/style/token.js","../../node_modules/antd/es/input-number/style/index.js","../../node_modules/antd/es/input-number/index.js","../../node_modules/@ant-design/icons-svg/es/asn/SaveOutlined.js","../../node_modules/@ant-design/icons/es/icons/SaveOutlined.js","../../node_modules/@ant-design/icons-svg/es/asn/UploadOutlined.js","../../node_modules/@ant-design/icons/es/icons/UploadOutlined.js","../../src/pages/Config/hooks/useConfigForm.ts","../../src/hooks/useLoadingState.ts","../../src/pages/Config/hooks/useConfigOperations.ts","../../src/pages/Config/hooks/useConfigModals.ts","../../src/pages/Config/hooks/useConfigTabs.ts","../../src/pages/Config/components/ConfigHeader.tsx","../../src/pages/Config/components/ConfigActions.tsx","../../src/components/forms/FormSection.tsx","../../src/pages/Config/components/BasicConfigForm.tsx","../../src/pages/Config/components/NetworkConfigForm.tsx","../../src/pages/Config/components/StorageConfigForm.tsx","../../src/pages/Config/components/SchedulerConfigForm.tsx","../../src/pages/Config/components/DownloadConfigForm.tsx","../../src/pages/Config/components/TargetModal.tsx","../../src/pages/Config/components/targets/TargetsInfoAlert.tsx","../../src/pages/Config/components/targets/TargetsTable.tsx","../../src/pages/Config/components/TargetsConfigForm.tsx","../../src/components/common/CodeEditor.tsx","../../src/pages/Config/components/ConfigJsonEditor.tsx","../../src/pages/Config/components/ConfigFilesManager.tsx","../../src/pages/Config/components/ConfigHistoryManager.tsx","../../src/pages/Config/components/hooks/useConfigTabItems.tsx","../../src/pages/Config/components/ConfigTabs.tsx","../../src/pages/Config/components/ConfigPreviewModal.tsx","../../src/pages/Config/Config.tsx"],"sourcesContent":["// This icon file is generated automatically.\nvar UpOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M890.5 755.3L537.9 269.2c-12.8-17.6-39-17.6-51.7 0L133.5 755.3A8 8 0 00140 768h75c5.1 0 9.9-2.5 12.9-6.6L512 369.8l284.1 391.6c3 4.1 7.8 6.6 12.9 6.6h75c6.5 0 10.3-7.4 6.5-12.7z\" } }] }, \"name\": \"up\", \"theme\": \"outlined\" };\nexport default UpOutlined;\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\n\nimport * as React from 'react';\nimport UpOutlinedSvg from \"@ant-design/icons-svg/es/asn/UpOutlined\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar UpOutlined = function UpOutlined(props, ref) {\n return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n ref: ref,\n icon: UpOutlinedSvg\n }));\n};\n\n/**![up](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTg5MC41IDc1NS4zTDUzNy45IDI2OS4yYy0xMi44LTE3LjYtMzktMTcuNi01MS43IDBMMTMzLjUgNzU1LjNBOCA4IDAgMDAxNDAgNzY4aDc1YzUuMSAwIDkuOS0yLjUgMTIuOS02LjZMNTEyIDM2OS44bDI4NC4xIDM5MS42YzMgNC4xIDcuOCA2LjYgMTIuOSA2LjZoNzVjNi41IDAgMTAuMy03LjQgNi41LTEyLjd6IiAvPjwvc3ZnPg==) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(UpOutlined);\nif (process.env.NODE_ENV !== 'production') {\n RefIcon.displayName = 'UpOutlined';\n}\nexport default RefIcon;","export function supportBigInt() {\n return typeof BigInt === 'function';\n}","import { supportBigInt } from \"./supportUtil\";\nexport function isEmpty(value) {\n return !value && value !== 0 && !Number.isNaN(value) || !String(value).trim();\n}\n\n/**\n * Format string number to readable number\n */\nexport function trimNumber(numStr) {\n var str = numStr.trim();\n var negative = str.startsWith('-');\n if (negative) {\n str = str.slice(1);\n }\n str = str\n // Remove decimal 0. `1.000` => `1.`, `1.100` => `1.1`\n .replace(/(\\.\\d*[^0])0*$/, '$1')\n // Remove useless decimal. `1.` => `1`\n .replace(/\\.0*$/, '')\n // Remove integer 0. `0001` => `1`, 000.1' => `.1`\n .replace(/^0+/, '');\n if (str.startsWith('.')) {\n str = \"0\".concat(str);\n }\n var trimStr = str || '0';\n var splitNumber = trimStr.split('.');\n var integerStr = splitNumber[0] || '0';\n var decimalStr = splitNumber[1] || '0';\n if (integerStr === '0' && decimalStr === '0') {\n negative = false;\n }\n var negativeStr = negative ? '-' : '';\n return {\n negative: negative,\n negativeStr: negativeStr,\n trimStr: trimStr,\n integerStr: integerStr,\n decimalStr: decimalStr,\n fullStr: \"\".concat(negativeStr).concat(trimStr)\n };\n}\nexport function isE(number) {\n var str = String(number);\n return !Number.isNaN(Number(str)) && str.includes('e');\n}\n\n/**\n * [Legacy] Convert 1e-9 to 0.000000001.\n * This may lose some precision if user really want 1e-9.\n */\nexport function getNumberPrecision(number) {\n var numStr = String(number);\n if (isE(number)) {\n var precision = Number(numStr.slice(numStr.indexOf('e-') + 2));\n var decimalMatch = numStr.match(/\\.(\\d+)/);\n if (decimalMatch !== null && decimalMatch !== void 0 && decimalMatch[1]) {\n precision += decimalMatch[1].length;\n }\n return precision;\n }\n return numStr.includes('.') && validateNumber(numStr) ? numStr.length - numStr.indexOf('.') - 1 : 0;\n}\n\n/**\n * Convert number (includes scientific notation) to -xxx.yyy format\n */\nexport function num2str(number) {\n var numStr = String(number);\n if (isE(number)) {\n if (number > Number.MAX_SAFE_INTEGER) {\n return String(supportBigInt() ? BigInt(number).toString() : Number.MAX_SAFE_INTEGER);\n }\n if (number < Number.MIN_SAFE_INTEGER) {\n return String(supportBigInt() ? BigInt(number).toString() : Number.MIN_SAFE_INTEGER);\n }\n numStr = number.toFixed(getNumberPrecision(numStr));\n }\n return trimNumber(numStr).fullStr;\n}\nexport function validateNumber(num) {\n if (typeof num === 'number') {\n return !Number.isNaN(num);\n }\n\n // Empty\n if (!num) {\n return false;\n }\n return (\n // Normal type: 11.28\n /^\\s*-?\\d+(\\.\\d+)?\\s*$/.test(num) ||\n // Pre-number: 1.\n /^\\s*-?\\d+\\.\\s*$/.test(num) ||\n // Post-number: .1\n /^\\s*-?\\.\\d+\\s*$/.test(num)\n );\n}","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport { isE, isEmpty, num2str, trimNumber, validateNumber } from \"./numberUtil\";\nvar BigIntDecimal = /*#__PURE__*/function () {\n /** BigInt will convert `0009` to `9`. We need record the len of decimal */\n\n function BigIntDecimal(value) {\n _classCallCheck(this, BigIntDecimal);\n _defineProperty(this, \"origin\", '');\n _defineProperty(this, \"negative\", void 0);\n _defineProperty(this, \"integer\", void 0);\n _defineProperty(this, \"decimal\", void 0);\n _defineProperty(this, \"decimalLen\", void 0);\n _defineProperty(this, \"empty\", void 0);\n _defineProperty(this, \"nan\", void 0);\n if (isEmpty(value)) {\n this.empty = true;\n return;\n }\n this.origin = String(value);\n\n // Act like Number convert\n if (value === '-' || Number.isNaN(value)) {\n this.nan = true;\n return;\n }\n var mergedValue = value;\n\n // We need convert back to Number since it require `toFixed` to handle this\n if (isE(mergedValue)) {\n mergedValue = Number(mergedValue);\n }\n mergedValue = typeof mergedValue === 'string' ? mergedValue : num2str(mergedValue);\n if (validateNumber(mergedValue)) {\n var trimRet = trimNumber(mergedValue);\n this.negative = trimRet.negative;\n var numbers = trimRet.trimStr.split('.');\n this.integer = BigInt(numbers[0]);\n var decimalStr = numbers[1] || '0';\n this.decimal = BigInt(decimalStr);\n this.decimalLen = decimalStr.length;\n } else {\n this.nan = true;\n }\n }\n _createClass(BigIntDecimal, [{\n key: \"getMark\",\n value: function getMark() {\n return this.negative ? '-' : '';\n }\n }, {\n key: \"getIntegerStr\",\n value: function getIntegerStr() {\n return this.integer.toString();\n }\n\n /**\n * @private get decimal string\n */\n }, {\n key: \"getDecimalStr\",\n value: function getDecimalStr() {\n return this.decimal.toString().padStart(this.decimalLen, '0');\n }\n\n /**\n * @private Align BigIntDecimal with same decimal length. e.g. 12.3 + 5 = 1230000\n * This is used for add function only.\n */\n }, {\n key: \"alignDecimal\",\n value: function alignDecimal(decimalLength) {\n var str = \"\".concat(this.getMark()).concat(this.getIntegerStr()).concat(this.getDecimalStr().padEnd(decimalLength, '0'));\n return BigInt(str);\n }\n }, {\n key: \"negate\",\n value: function negate() {\n var clone = new BigIntDecimal(this.toString());\n clone.negative = !clone.negative;\n return clone;\n }\n }, {\n key: \"cal\",\n value: function cal(offset, calculator, calDecimalLen) {\n var maxDecimalLength = Math.max(this.getDecimalStr().length, offset.getDecimalStr().length);\n var myAlignedDecimal = this.alignDecimal(maxDecimalLength);\n var offsetAlignedDecimal = offset.alignDecimal(maxDecimalLength);\n var valueStr = calculator(myAlignedDecimal, offsetAlignedDecimal).toString();\n var nextDecimalLength = calDecimalLen(maxDecimalLength);\n\n // We need fill string length back to `maxDecimalLength` to avoid parser failed\n var _trimNumber = trimNumber(valueStr),\n negativeStr = _trimNumber.negativeStr,\n trimStr = _trimNumber.trimStr;\n var hydrateValueStr = \"\".concat(negativeStr).concat(trimStr.padStart(nextDecimalLength + 1, '0'));\n return new BigIntDecimal(\"\".concat(hydrateValueStr.slice(0, -nextDecimalLength), \".\").concat(hydrateValueStr.slice(-nextDecimalLength)));\n }\n }, {\n key: \"add\",\n value: function add(value) {\n if (this.isInvalidate()) {\n return new BigIntDecimal(value);\n }\n var offset = new BigIntDecimal(value);\n if (offset.isInvalidate()) {\n return this;\n }\n return this.cal(offset, function (num1, num2) {\n return num1 + num2;\n }, function (len) {\n return len;\n });\n }\n }, {\n key: \"multi\",\n value: function multi(value) {\n var target = new BigIntDecimal(value);\n if (this.isInvalidate() || target.isInvalidate()) {\n return new BigIntDecimal(NaN);\n }\n return this.cal(target, function (num1, num2) {\n return num1 * num2;\n }, function (len) {\n return len * 2;\n });\n }\n }, {\n key: \"isEmpty\",\n value: function isEmpty() {\n return this.empty;\n }\n }, {\n key: \"isNaN\",\n value: function isNaN() {\n return this.nan;\n }\n }, {\n key: \"isInvalidate\",\n value: function isInvalidate() {\n return this.isEmpty() || this.isNaN();\n }\n }, {\n key: \"equals\",\n value: function equals(target) {\n return this.toString() === (target === null || target === void 0 ? void 0 : target.toString());\n }\n }, {\n key: \"lessEquals\",\n value: function lessEquals(target) {\n return this.add(target.negate().toString()).toNumber() <= 0;\n }\n }, {\n key: \"toNumber\",\n value: function toNumber() {\n if (this.isNaN()) {\n return NaN;\n }\n return Number(this.toString());\n }\n }, {\n key: \"toString\",\n value: function toString() {\n var safe = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n if (!safe) {\n return this.origin;\n }\n if (this.isInvalidate()) {\n return '';\n }\n return trimNumber(\"\".concat(this.getMark()).concat(this.getIntegerStr(), \".\").concat(this.getDecimalStr())).fullStr;\n }\n }]);\n return BigIntDecimal;\n}();\nexport { BigIntDecimal as default };","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport { getNumberPrecision, isEmpty, num2str } from \"./numberUtil\";\n\n/**\n * We can remove this when IE not support anymore\n */\nvar NumberDecimal = /*#__PURE__*/function () {\n function NumberDecimal(value) {\n _classCallCheck(this, NumberDecimal);\n _defineProperty(this, \"origin\", '');\n _defineProperty(this, \"number\", void 0);\n _defineProperty(this, \"empty\", void 0);\n if (isEmpty(value)) {\n this.empty = true;\n return;\n }\n this.origin = String(value);\n this.number = Number(value);\n }\n _createClass(NumberDecimal, [{\n key: \"negate\",\n value: function negate() {\n return new NumberDecimal(-this.toNumber());\n }\n }, {\n key: \"add\",\n value: function add(value) {\n if (this.isInvalidate()) {\n return new NumberDecimal(value);\n }\n var target = Number(value);\n if (Number.isNaN(target)) {\n return this;\n }\n var number = this.number + target;\n\n // [Legacy] Back to safe integer\n if (number > Number.MAX_SAFE_INTEGER) {\n return new NumberDecimal(Number.MAX_SAFE_INTEGER);\n }\n if (number < Number.MIN_SAFE_INTEGER) {\n return new NumberDecimal(Number.MIN_SAFE_INTEGER);\n }\n var maxPrecision = Math.max(getNumberPrecision(this.number), getNumberPrecision(target));\n return new NumberDecimal(number.toFixed(maxPrecision));\n }\n }, {\n key: \"multi\",\n value: function multi(value) {\n var target = Number(value);\n if (this.isInvalidate() || Number.isNaN(target)) {\n return new NumberDecimal(NaN);\n }\n var number = this.number * target;\n\n // [Legacy] Back to safe integer\n if (number > Number.MAX_SAFE_INTEGER) {\n return new NumberDecimal(Number.MAX_SAFE_INTEGER);\n }\n if (number < Number.MIN_SAFE_INTEGER) {\n return new NumberDecimal(Number.MIN_SAFE_INTEGER);\n }\n var maxPrecision = Math.max(getNumberPrecision(this.number), getNumberPrecision(target));\n return new NumberDecimal(number.toFixed(maxPrecision));\n }\n }, {\n key: \"isEmpty\",\n value: function isEmpty() {\n return this.empty;\n }\n }, {\n key: \"isNaN\",\n value: function isNaN() {\n return Number.isNaN(this.number);\n }\n }, {\n key: \"isInvalidate\",\n value: function isInvalidate() {\n return this.isEmpty() || this.isNaN();\n }\n }, {\n key: \"equals\",\n value: function equals(target) {\n return this.toNumber() === (target === null || target === void 0 ? void 0 : target.toNumber());\n }\n }, {\n key: \"lessEquals\",\n value: function lessEquals(target) {\n return this.add(target.negate().toString()).toNumber() <= 0;\n }\n }, {\n key: \"toNumber\",\n value: function toNumber() {\n return this.number;\n }\n }, {\n key: \"toString\",\n value: function toString() {\n var safe = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n if (!safe) {\n return this.origin;\n }\n if (this.isInvalidate()) {\n return '';\n }\n return num2str(this.number);\n }\n }]);\n return NumberDecimal;\n}();\nexport { NumberDecimal as default };","/* eslint-disable max-classes-per-file */\n\nimport BigIntDecimal from \"./BigIntDecimal\";\nimport NumberDecimal from \"./NumberDecimal\";\nimport { trimNumber } from \"./numberUtil\";\nimport { supportBigInt } from \"./supportUtil\";\n\n// Still support origin export\nexport { NumberDecimal, BigIntDecimal };\nexport default function getMiniDecimal(value) {\n // We use BigInt here.\n // Will fallback to Number if not support.\n if (supportBigInt()) {\n return new BigIntDecimal(value);\n }\n return new NumberDecimal(value);\n}\n\n/**\n * Align the logic of toFixed to around like 1.5 => 2.\n * If set `cutOnly`, will just remove the over decimal part.\n */\nexport function toFixed(numStr, separatorStr, precision) {\n var cutOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n if (numStr === '') {\n return '';\n }\n var _trimNumber = trimNumber(numStr),\n negativeStr = _trimNumber.negativeStr,\n integerStr = _trimNumber.integerStr,\n decimalStr = _trimNumber.decimalStr;\n var precisionDecimalStr = \"\".concat(separatorStr).concat(decimalStr);\n var numberWithoutDecimal = \"\".concat(negativeStr).concat(integerStr);\n if (precision >= 0) {\n // We will get last + 1 number to check if need advanced number\n var advancedNum = Number(decimalStr[precision]);\n if (advancedNum >= 5 && !cutOnly) {\n var advancedDecimal = getMiniDecimal(numStr).add(\"\".concat(negativeStr, \"0.\").concat('0'.repeat(precision)).concat(10 - advancedNum));\n return toFixed(advancedDecimal.toString(), separatorStr, precision, cutOnly);\n }\n if (precision === 0) {\n return numberWithoutDecimal;\n }\n return \"\".concat(numberWithoutDecimal).concat(separatorStr).concat(decimalStr.padEnd(precision, '0').slice(0, precision));\n }\n if (precisionDecimalStr === '.0') {\n return numberWithoutDecimal;\n }\n return \"\".concat(numberWithoutDecimal).concat(precisionDecimalStr);\n}","/**\n * Proxy object if environment supported\n */\nexport default function proxyObject(obj, extendProps) {\n if (typeof Proxy !== 'undefined' && obj) {\n return new Proxy(obj, {\n get: function get(target, prop) {\n if (extendProps[prop]) {\n return extendProps[prop];\n }\n\n // Proxy origin property\n var originProp = target[prop];\n return typeof originProp === 'function' ? originProp.bind(target) : originProp;\n }\n });\n }\n return obj;\n}","import { useRef } from 'react';\nimport warning from \"rc-util/es/warning\";\n/**\n * Keep input cursor in the correct position if possible.\n * Is this necessary since we have `formatter` which may mass the content?\n */\nexport default function useCursor(input, focused) {\n var selectionRef = useRef(null);\n function recordCursor() {\n // Record position\n try {\n var start = input.selectionStart,\n end = input.selectionEnd,\n value = input.value;\n var beforeTxt = value.substring(0, start);\n var afterTxt = value.substring(end);\n selectionRef.current = {\n start: start,\n end: end,\n value: value,\n beforeTxt: beforeTxt,\n afterTxt: afterTxt\n };\n } catch (e) {\n // Fix error in Chrome:\n // Failed to read the 'selectionStart' property from 'HTMLInputElement'\n // http://stackoverflow.com/q/21177489/3040605\n }\n }\n\n /**\n * Restore logic:\n * 1. back string same\n * 2. start string same\n */\n function restoreCursor() {\n if (input && selectionRef.current && focused) {\n try {\n var value = input.value;\n var _selectionRef$current = selectionRef.current,\n beforeTxt = _selectionRef$current.beforeTxt,\n afterTxt = _selectionRef$current.afterTxt,\n start = _selectionRef$current.start;\n var startPos = value.length;\n if (value.startsWith(beforeTxt)) {\n startPos = beforeTxt.length;\n } else if (value.endsWith(afterTxt)) {\n startPos = value.length - selectionRef.current.afterTxt.length;\n } else {\n var beforeLastChar = beforeTxt[start - 1];\n var newIndex = value.indexOf(beforeLastChar, start - 1);\n if (newIndex !== -1) {\n startPos = newIndex + 1;\n }\n }\n input.setSelectionRange(startPos, startPos);\n } catch (e) {\n warning(false, \"Something warning of cursor restore. Please fire issue about this: \".concat(e.message));\n }\n }\n }\n return [recordCursor, restoreCursor];\n}","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport { useState } from 'react';\nimport isMobile from \"../isMobile\";\nimport useLayoutEffect from \"./useLayoutEffect\";\n\n/**\n * Hook to detect if the user is on a mobile device\n * Notice that this hook will only detect the device type in effect, so it will always be false in server side\n */\nvar useMobile = function useMobile() {\n var _useState = useState(false),\n _useState2 = _slicedToArray(_useState, 2),\n mobile = _useState2[0],\n setMobile = _useState2[1];\n useLayoutEffect(function () {\n setMobile(isMobile());\n }, []);\n return mobile;\n};\nexport default useMobile;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\n/* eslint-disable react/no-unknown-property */\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport useMobile from \"rc-util/es/hooks/useMobile\";\nimport raf from \"rc-util/es/raf\";\n\n/**\n * When click and hold on a button - the speed of auto changing the value.\n */\nvar STEP_INTERVAL = 200;\n\n/**\n * When click and hold on a button - the delay before auto changing the value.\n */\nvar STEP_DELAY = 600;\nexport default function StepHandler(_ref) {\n var prefixCls = _ref.prefixCls,\n upNode = _ref.upNode,\n downNode = _ref.downNode,\n upDisabled = _ref.upDisabled,\n downDisabled = _ref.downDisabled,\n onStep = _ref.onStep;\n // ======================== Step ========================\n var stepTimeoutRef = React.useRef();\n var frameIds = React.useRef([]);\n var onStepRef = React.useRef();\n onStepRef.current = onStep;\n var onStopStep = function onStopStep() {\n clearTimeout(stepTimeoutRef.current);\n };\n\n // We will interval update step when hold mouse down\n var onStepMouseDown = function onStepMouseDown(e, up) {\n e.preventDefault();\n onStopStep();\n onStepRef.current(up);\n\n // Loop step for interval\n function loopStep() {\n onStepRef.current(up);\n stepTimeoutRef.current = setTimeout(loopStep, STEP_INTERVAL);\n }\n\n // First time press will wait some time to trigger loop step update\n stepTimeoutRef.current = setTimeout(loopStep, STEP_DELAY);\n };\n React.useEffect(function () {\n return function () {\n onStopStep();\n frameIds.current.forEach(function (id) {\n return raf.cancel(id);\n });\n };\n }, []);\n\n // ======================= Render =======================\n var isMobile = useMobile();\n if (isMobile) {\n return null;\n }\n var handlerClassName = \"\".concat(prefixCls, \"-handler\");\n var upClassName = classNames(handlerClassName, \"\".concat(handlerClassName, \"-up\"), _defineProperty({}, \"\".concat(handlerClassName, \"-up-disabled\"), upDisabled));\n var downClassName = classNames(handlerClassName, \"\".concat(handlerClassName, \"-down\"), _defineProperty({}, \"\".concat(handlerClassName, \"-down-disabled\"), downDisabled));\n\n // fix: https://github.com/ant-design/ant-design/issues/43088\n // In Safari, When we fire onmousedown and onmouseup events in quick succession, \n // there may be a problem that the onmouseup events are executed first, \n // resulting in a disordered program execution.\n // So, we need to use requestAnimationFrame to ensure that the onmouseup event is executed after the onmousedown event.\n var safeOnStopStep = function safeOnStopStep() {\n return frameIds.current.push(raf(onStopStep));\n };\n var sharedHandlerProps = {\n unselectable: 'on',\n role: 'button',\n onMouseUp: safeOnStopStep,\n onMouseLeave: safeOnStopStep\n };\n return /*#__PURE__*/React.createElement(\"div\", {\n className: \"\".concat(handlerClassName, \"-wrap\")\n }, /*#__PURE__*/React.createElement(\"span\", _extends({}, sharedHandlerProps, {\n onMouseDown: function onMouseDown(e) {\n onStepMouseDown(e, true);\n },\n \"aria-label\": \"Increase Value\",\n \"aria-disabled\": upDisabled,\n className: upClassName\n }), upNode || /*#__PURE__*/React.createElement(\"span\", {\n unselectable: \"on\",\n className: \"\".concat(prefixCls, \"-handler-up-inner\")\n })), /*#__PURE__*/React.createElement(\"span\", _extends({}, sharedHandlerProps, {\n onMouseDown: function onMouseDown(e) {\n onStepMouseDown(e, false);\n },\n \"aria-label\": \"Decrease Value\",\n \"aria-disabled\": downDisabled,\n className: downClassName\n }), downNode || /*#__PURE__*/React.createElement(\"span\", {\n unselectable: \"on\",\n className: \"\".concat(prefixCls, \"-handler-down-inner\")\n })));\n}","import { trimNumber, num2str } from '@rc-component/mini-decimal';\nexport function getDecupleSteps(step) {\n var stepStr = typeof step === 'number' ? num2str(step) : trimNumber(step).fullStr;\n var hasPoint = stepStr.includes('.');\n if (!hasPoint) {\n return step + '0';\n }\n return trimNumber(stepStr.replace(/(\\d)\\.(\\d)/g, '$1$2.')).fullStr;\n}","import { useRef, useEffect } from 'react';\nimport raf from \"rc-util/es/raf\";\n\n/**\n * Always trigger latest once when call multiple time\n */\nexport default (function () {\n var idRef = useRef(0);\n var cleanUp = function cleanUp() {\n raf.cancel(idRef.current);\n };\n useEffect(function () {\n return cleanUp;\n }, []);\n return function (callback) {\n cleanUp();\n idRef.current = raf(function () {\n callback();\n });\n };\n});","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nvar _excluded = [\"prefixCls\", \"className\", \"style\", \"min\", \"max\", \"step\", \"defaultValue\", \"value\", \"disabled\", \"readOnly\", \"upHandler\", \"downHandler\", \"keyboard\", \"changeOnWheel\", \"controls\", \"classNames\", \"stringMode\", \"parser\", \"formatter\", \"precision\", \"decimalSeparator\", \"onChange\", \"onInput\", \"onPressEnter\", \"onStep\", \"changeOnBlur\", \"domRef\"],\n _excluded2 = [\"disabled\", \"style\", \"prefixCls\", \"value\", \"prefix\", \"suffix\", \"addonBefore\", \"addonAfter\", \"className\", \"classNames\"];\nimport getMiniDecimal, { getNumberPrecision, num2str, toFixed, validateNumber } from '@rc-component/mini-decimal';\nimport clsx from 'classnames';\nimport { BaseInput } from 'rc-input';\nimport { useLayoutUpdateEffect } from \"rc-util/es/hooks/useLayoutEffect\";\nimport proxyObject from \"rc-util/es/proxyObject\";\nimport { composeRef } from \"rc-util/es/ref\";\nimport * as React from 'react';\nimport useCursor from \"./hooks/useCursor\";\nimport StepHandler from \"./StepHandler\";\nimport { getDecupleSteps } from \"./utils/numberUtil\";\nimport { triggerFocus } from \"rc-input/es/utils/commonUtils\";\nimport useFrame from \"./hooks/useFrame\";\n/**\n * We support `stringMode` which need handle correct type when user call in onChange\n * format max or min value\n * 1. if isInvalid return null\n * 2. if precision is undefined, return decimal\n * 3. format with precision\n * I. if max > 0, round down with precision. Example: max= 3.5, precision=0 afterFormat: 3\n * II. if max < 0, round up with precision. Example: max= -3.5, precision=0 afterFormat: -4\n * III. if min > 0, round up with precision. Example: min= 3.5, precision=0 afterFormat: 4\n * IV. if min < 0, round down with precision. Example: max= -3.5, precision=0 afterFormat: -3\n */\nvar getDecimalValue = function getDecimalValue(stringMode, decimalValue) {\n if (stringMode || decimalValue.isEmpty()) {\n return decimalValue.toString();\n }\n return decimalValue.toNumber();\n};\nvar getDecimalIfValidate = function getDecimalIfValidate(value) {\n var decimal = getMiniDecimal(value);\n return decimal.isInvalidate() ? null : decimal;\n};\nvar InternalInputNumber = /*#__PURE__*/React.forwardRef(function (props, ref) {\n var prefixCls = props.prefixCls,\n className = props.className,\n style = props.style,\n min = props.min,\n max = props.max,\n _props$step = props.step,\n step = _props$step === void 0 ? 1 : _props$step,\n defaultValue = props.defaultValue,\n value = props.value,\n disabled = props.disabled,\n readOnly = props.readOnly,\n upHandler = props.upHandler,\n downHandler = props.downHandler,\n keyboard = props.keyboard,\n _props$changeOnWheel = props.changeOnWheel,\n changeOnWheel = _props$changeOnWheel === void 0 ? false : _props$changeOnWheel,\n _props$controls = props.controls,\n controls = _props$controls === void 0 ? true : _props$controls,\n classNames = props.classNames,\n stringMode = props.stringMode,\n parser = props.parser,\n formatter = props.formatter,\n precision = props.precision,\n decimalSeparator = props.decimalSeparator,\n onChange = props.onChange,\n onInput = props.onInput,\n onPressEnter = props.onPressEnter,\n onStep = props.onStep,\n _props$changeOnBlur = props.changeOnBlur,\n changeOnBlur = _props$changeOnBlur === void 0 ? true : _props$changeOnBlur,\n domRef = props.domRef,\n inputProps = _objectWithoutProperties(props, _excluded);\n var inputClassName = \"\".concat(prefixCls, \"-input\");\n var inputRef = React.useRef(null);\n var _React$useState = React.useState(false),\n _React$useState2 = _slicedToArray(_React$useState, 2),\n focus = _React$useState2[0],\n setFocus = _React$useState2[1];\n var userTypingRef = React.useRef(false);\n var compositionRef = React.useRef(false);\n var shiftKeyRef = React.useRef(false);\n\n // ============================ Value =============================\n // Real value control\n var _React$useState3 = React.useState(function () {\n return getMiniDecimal(value !== null && value !== void 0 ? value : defaultValue);\n }),\n _React$useState4 = _slicedToArray(_React$useState3, 2),\n decimalValue = _React$useState4[0],\n setDecimalValue = _React$useState4[1];\n function setUncontrolledDecimalValue(newDecimal) {\n if (value === undefined) {\n setDecimalValue(newDecimal);\n }\n }\n\n // ====================== Parser & Formatter ======================\n /**\n * `precision` is used for formatter & onChange.\n * It will auto generate by `value` & `step`.\n * But it will not block user typing.\n *\n * Note: Auto generate `precision` is used for legacy logic.\n * We should remove this since we already support high precision with BigInt.\n *\n * @param number Provide which number should calculate precision\n * @param userTyping Change by user typing\n */\n var getPrecision = React.useCallback(function (numStr, userTyping) {\n if (userTyping) {\n return undefined;\n }\n if (precision >= 0) {\n return precision;\n }\n return Math.max(getNumberPrecision(numStr), getNumberPrecision(step));\n }, [precision, step]);\n\n // >>> Parser\n var mergedParser = React.useCallback(function (num) {\n var numStr = String(num);\n if (parser) {\n return parser(numStr);\n }\n var parsedStr = numStr;\n if (decimalSeparator) {\n parsedStr = parsedStr.replace(decimalSeparator, '.');\n }\n\n // [Legacy] We still support auto convert `$ 123,456` to `123456`\n return parsedStr.replace(/[^\\w.-]+/g, '');\n }, [parser, decimalSeparator]);\n\n // >>> Formatter\n var inputValueRef = React.useRef('');\n var mergedFormatter = React.useCallback(function (number, userTyping) {\n if (formatter) {\n return formatter(number, {\n userTyping: userTyping,\n input: String(inputValueRef.current)\n });\n }\n var str = typeof number === 'number' ? num2str(number) : number;\n\n // User typing will not auto format with precision directly\n if (!userTyping) {\n var mergedPrecision = getPrecision(str, userTyping);\n if (validateNumber(str) && (decimalSeparator || mergedPrecision >= 0)) {\n // Separator\n var separatorStr = decimalSeparator || '.';\n str = toFixed(str, separatorStr, mergedPrecision);\n }\n }\n return str;\n }, [formatter, getPrecision, decimalSeparator]);\n\n // ========================== InputValue ==========================\n /**\n * Input text value control\n *\n * User can not update input content directly. It updates with follow rules by priority:\n * 1. controlled `value` changed\n * * [SPECIAL] Typing like `1.` should not immediately convert to `1`\n * 2. User typing with format (not precision)\n * 3. Blur or Enter trigger revalidate\n */\n var _React$useState5 = React.useState(function () {\n var initValue = defaultValue !== null && defaultValue !== void 0 ? defaultValue : value;\n if (decimalValue.isInvalidate() && ['string', 'number'].includes(_typeof(initValue))) {\n return Number.isNaN(initValue) ? '' : initValue;\n }\n return mergedFormatter(decimalValue.toString(), false);\n }),\n _React$useState6 = _slicedToArray(_React$useState5, 2),\n inputValue = _React$useState6[0],\n setInternalInputValue = _React$useState6[1];\n inputValueRef.current = inputValue;\n\n // Should always be string\n function setInputValue(newValue, userTyping) {\n setInternalInputValue(mergedFormatter(\n // Invalidate number is sometime passed by external control, we should let it go\n // Otherwise is controlled by internal interactive logic which check by userTyping\n // You can ref 'show limited value when input is not focused' test for more info.\n newValue.isInvalidate() ? newValue.toString(false) : newValue.toString(!userTyping), userTyping));\n }\n\n // >>> Max & Min limit\n var maxDecimal = React.useMemo(function () {\n return getDecimalIfValidate(max);\n }, [max, precision]);\n var minDecimal = React.useMemo(function () {\n return getDecimalIfValidate(min);\n }, [min, precision]);\n var upDisabled = React.useMemo(function () {\n if (!maxDecimal || !decimalValue || decimalValue.isInvalidate()) {\n return false;\n }\n return maxDecimal.lessEquals(decimalValue);\n }, [maxDecimal, decimalValue]);\n var downDisabled = React.useMemo(function () {\n if (!minDecimal || !decimalValue || decimalValue.isInvalidate()) {\n return false;\n }\n return decimalValue.lessEquals(minDecimal);\n }, [minDecimal, decimalValue]);\n\n // Cursor controller\n var _useCursor = useCursor(inputRef.current, focus),\n _useCursor2 = _slicedToArray(_useCursor, 2),\n recordCursor = _useCursor2[0],\n restoreCursor = _useCursor2[1];\n\n // ============================= Data =============================\n /**\n * Find target value closet within range.\n * e.g. [11, 28]:\n * 3 => 11\n * 23 => 23\n * 99 => 28\n */\n var getRangeValue = function getRangeValue(target) {\n // target > max\n if (maxDecimal && !target.lessEquals(maxDecimal)) {\n return maxDecimal;\n }\n\n // target < min\n if (minDecimal && !minDecimal.lessEquals(target)) {\n return minDecimal;\n }\n return null;\n };\n\n /**\n * Check value is in [min, max] range\n */\n var isInRange = function isInRange(target) {\n return !getRangeValue(target);\n };\n\n /**\n * Trigger `onChange` if value validated and not equals of origin.\n * Return the value that re-align in range.\n */\n var triggerValueUpdate = function triggerValueUpdate(newValue, userTyping) {\n var updateValue = newValue;\n var isRangeValidate = isInRange(updateValue) || updateValue.isEmpty();\n\n // Skip align value when trigger value is empty.\n // We just trigger onChange(null)\n // This should not block user typing\n if (!updateValue.isEmpty() && !userTyping) {\n // Revert value in range if needed\n updateValue = getRangeValue(updateValue) || updateValue;\n isRangeValidate = true;\n }\n if (!readOnly && !disabled && isRangeValidate) {\n var numStr = updateValue.toString();\n var mergedPrecision = getPrecision(numStr, userTyping);\n if (mergedPrecision >= 0) {\n updateValue = getMiniDecimal(toFixed(numStr, '.', mergedPrecision));\n\n // When to fixed. The value may out of min & max range.\n // 4 in [0, 3.8] => 3.8 => 4 (toFixed)\n if (!isInRange(updateValue)) {\n updateValue = getMiniDecimal(toFixed(numStr, '.', mergedPrecision, true));\n }\n }\n\n // Trigger event\n if (!updateValue.equals(decimalValue)) {\n setUncontrolledDecimalValue(updateValue);\n onChange === null || onChange === void 0 || onChange(updateValue.isEmpty() ? null : getDecimalValue(stringMode, updateValue));\n\n // Reformat input if value is not controlled\n if (value === undefined) {\n setInputValue(updateValue, userTyping);\n }\n }\n return updateValue;\n }\n return decimalValue;\n };\n\n // ========================== User Input ==========================\n var onNextPromise = useFrame();\n\n // >>> Collect input value\n var collectInputValue = function collectInputValue(inputStr) {\n recordCursor();\n\n // Update inputValue in case input can not parse as number\n // Refresh ref value immediately since it may used by formatter\n inputValueRef.current = inputStr;\n setInternalInputValue(inputStr);\n\n // Parse number\n if (!compositionRef.current) {\n var finalValue = mergedParser(inputStr);\n var finalDecimal = getMiniDecimal(finalValue);\n if (!finalDecimal.isNaN()) {\n triggerValueUpdate(finalDecimal, true);\n }\n }\n\n // Trigger onInput later to let user customize value if they want to handle something after onChange\n onInput === null || onInput === void 0 || onInput(inputStr);\n\n // optimize for chinese input experience\n // https://github.com/ant-design/ant-design/issues/8196\n onNextPromise(function () {\n var nextInputStr = inputStr;\n if (!parser) {\n nextInputStr = inputStr.replace(/。/g, '.');\n }\n if (nextInputStr !== inputStr) {\n collectInputValue(nextInputStr);\n }\n });\n };\n\n // >>> Composition\n var onCompositionStart = function onCompositionStart() {\n compositionRef.current = true;\n };\n var onCompositionEnd = function onCompositionEnd() {\n compositionRef.current = false;\n collectInputValue(inputRef.current.value);\n };\n\n // >>> Input\n var onInternalInput = function onInternalInput(e) {\n collectInputValue(e.target.value);\n };\n\n // ============================= Step =============================\n var onInternalStep = function onInternalStep(up) {\n var _inputRef$current;\n // Ignore step since out of range\n if (up && upDisabled || !up && downDisabled) {\n return;\n }\n\n // Clear typing status since it may be caused by up & down key.\n // We should sync with input value.\n userTypingRef.current = false;\n var stepDecimal = getMiniDecimal(shiftKeyRef.current ? getDecupleSteps(step) : step);\n if (!up) {\n stepDecimal = stepDecimal.negate();\n }\n var target = (decimalValue || getMiniDecimal(0)).add(stepDecimal.toString());\n var updatedValue = triggerValueUpdate(target, false);\n onStep === null || onStep === void 0 || onStep(getDecimalValue(stringMode, updatedValue), {\n offset: shiftKeyRef.current ? getDecupleSteps(step) : step,\n type: up ? 'up' : 'down'\n });\n (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 || _inputRef$current.focus();\n };\n\n // ============================ Flush =============================\n /**\n * Flush current input content to trigger value change & re-formatter input if needed.\n * This will always flush input value for update.\n * If it's invalidate, will fallback to last validate value.\n */\n var flushInputValue = function flushInputValue(userTyping) {\n var parsedValue = getMiniDecimal(mergedParser(inputValue));\n var formatValue;\n if (!parsedValue.isNaN()) {\n // Only validate value or empty value can be re-fill to inputValue\n // Reassign the formatValue within ranged of trigger control\n formatValue = triggerValueUpdate(parsedValue, userTyping);\n } else {\n formatValue = triggerValueUpdate(decimalValue, userTyping);\n }\n if (value !== undefined) {\n // Reset back with controlled value first\n setInputValue(decimalValue, false);\n } else if (!formatValue.isNaN()) {\n // Reset input back since no validate value\n setInputValue(formatValue, false);\n }\n };\n\n // Solve the issue of the event triggering sequence when entering numbers in chinese input (Safari)\n var onBeforeInput = function onBeforeInput() {\n userTypingRef.current = true;\n };\n var onKeyDown = function onKeyDown(event) {\n var key = event.key,\n shiftKey = event.shiftKey;\n userTypingRef.current = true;\n shiftKeyRef.current = shiftKey;\n if (key === 'Enter') {\n if (!compositionRef.current) {\n userTypingRef.current = false;\n }\n flushInputValue(false);\n onPressEnter === null || onPressEnter === void 0 || onPressEnter(event);\n }\n if (keyboard === false) {\n return;\n }\n\n // Do step\n if (!compositionRef.current && ['Up', 'ArrowUp', 'Down', 'ArrowDown'].includes(key)) {\n onInternalStep(key === 'Up' || key === 'ArrowUp');\n event.preventDefault();\n }\n };\n var onKeyUp = function onKeyUp() {\n userTypingRef.current = false;\n shiftKeyRef.current = false;\n };\n React.useEffect(function () {\n if (changeOnWheel && focus) {\n var onWheel = function onWheel(event) {\n // moving mouse wheel rises wheel event with deltaY < 0\n // scroll value grows from top to bottom, as screen Y coordinate\n onInternalStep(event.deltaY < 0);\n event.preventDefault();\n };\n var input = inputRef.current;\n if (input) {\n // React onWheel is passive and we can't preventDefault() in it.\n // That's why we should subscribe with DOM listener\n // https://stackoverflow.com/questions/63663025/react-onwheel-handler-cant-preventdefault-because-its-a-passive-event-listenev\n input.addEventListener('wheel', onWheel, {\n passive: false\n });\n return function () {\n return input.removeEventListener('wheel', onWheel);\n };\n }\n }\n });\n\n // >>> Focus & Blur\n var onBlur = function onBlur() {\n if (changeOnBlur) {\n flushInputValue(false);\n }\n setFocus(false);\n userTypingRef.current = false;\n };\n\n // ========================== Controlled ==========================\n // Input by precision & formatter\n useLayoutUpdateEffect(function () {\n if (!decimalValue.isInvalidate()) {\n setInputValue(decimalValue, false);\n }\n }, [precision, formatter]);\n\n // Input by value\n useLayoutUpdateEffect(function () {\n var newValue = getMiniDecimal(value);\n setDecimalValue(newValue);\n var currentParsedValue = getMiniDecimal(mergedParser(inputValue));\n\n // When user typing from `1.2` to `1.`, we should not convert to `1` immediately.\n // But let it go if user set `formatter`\n if (!newValue.equals(currentParsedValue) || !userTypingRef.current || formatter) {\n // Update value as effect\n setInputValue(newValue, userTypingRef.current);\n }\n }, [value]);\n\n // ============================ Cursor ============================\n useLayoutUpdateEffect(function () {\n if (formatter) {\n restoreCursor();\n }\n }, [inputValue]);\n\n // ============================ Render ============================\n return /*#__PURE__*/React.createElement(\"div\", {\n ref: domRef,\n className: clsx(prefixCls, className, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, \"\".concat(prefixCls, \"-focused\"), focus), \"\".concat(prefixCls, \"-disabled\"), disabled), \"\".concat(prefixCls, \"-readonly\"), readOnly), \"\".concat(prefixCls, \"-not-a-number\"), decimalValue.isNaN()), \"\".concat(prefixCls, \"-out-of-range\"), !decimalValue.isInvalidate() && !isInRange(decimalValue))),\n style: style,\n onFocus: function onFocus() {\n setFocus(true);\n },\n onBlur: onBlur,\n onKeyDown: onKeyDown,\n onKeyUp: onKeyUp,\n onCompositionStart: onCompositionStart,\n onCompositionEnd: onCompositionEnd,\n onBeforeInput: onBeforeInput\n }, controls && /*#__PURE__*/React.createElement(StepHandler, {\n prefixCls: prefixCls,\n upNode: upHandler,\n downNode: downHandler,\n upDisabled: upDisabled,\n downDisabled: downDisabled,\n onStep: onInternalStep\n }), /*#__PURE__*/React.createElement(\"div\", {\n className: \"\".concat(inputClassName, \"-wrap\")\n }, /*#__PURE__*/React.createElement(\"input\", _extends({\n autoComplete: \"off\",\n role: \"spinbutton\",\n \"aria-valuemin\": min,\n \"aria-valuemax\": max,\n \"aria-valuenow\": decimalValue.isInvalidate() ? null : decimalValue.toString(),\n step: step\n }, inputProps, {\n ref: composeRef(inputRef, ref),\n className: inputClassName,\n value: inputValue,\n onChange: onInternalInput,\n disabled: disabled,\n readOnly: readOnly\n }))));\n});\nvar InputNumber = /*#__PURE__*/React.forwardRef(function (props, ref) {\n var disabled = props.disabled,\n style = props.style,\n _props$prefixCls = props.prefixCls,\n prefixCls = _props$prefixCls === void 0 ? 'rc-input-number' : _props$prefixCls,\n value = props.value,\n prefix = props.prefix,\n suffix = props.suffix,\n addonBefore = props.addonBefore,\n addonAfter = props.addonAfter,\n className = props.className,\n classNames = props.classNames,\n rest = _objectWithoutProperties(props, _excluded2);\n var holderRef = React.useRef(null);\n var inputNumberDomRef = React.useRef(null);\n var inputFocusRef = React.useRef(null);\n var focus = function focus(option) {\n if (inputFocusRef.current) {\n triggerFocus(inputFocusRef.current, option);\n }\n };\n React.useImperativeHandle(ref, function () {\n return proxyObject(inputFocusRef.current, {\n focus: focus,\n nativeElement: holderRef.current.nativeElement || inputNumberDomRef.current\n });\n });\n return /*#__PURE__*/React.createElement(BaseInput, {\n className: className,\n triggerFocus: focus,\n prefixCls: prefixCls,\n value: value,\n disabled: disabled,\n style: style,\n prefix: prefix,\n suffix: suffix,\n addonAfter: addonAfter,\n addonBefore: addonBefore,\n classNames: classNames,\n components: {\n affixWrapper: 'div',\n groupWrapper: 'div',\n wrapper: 'div',\n groupAddon: 'div'\n },\n ref: holderRef\n }, /*#__PURE__*/React.createElement(InternalInputNumber, _extends({\n prefixCls: prefixCls,\n disabled: disabled,\n ref: inputFocusRef,\n domRef: inputNumberDomRef,\n className: classNames === null || classNames === void 0 ? void 0 : classNames.input\n }, rest)));\n});\nif (process.env.NODE_ENV !== 'production') {\n InputNumber.displayName = 'InputNumber';\n}\nexport default InputNumber;","import { FastColor } from '@ant-design/fast-color';\nimport { initComponentToken } from '../../input/style/token';\nexport const prepareComponentToken = token => {\n var _a;\n const handleVisible = (_a = token.handleVisible) !== null && _a !== void 0 ? _a : 'auto';\n const handleWidth = token.controlHeightSM - token.lineWidth * 2;\n return Object.assign(Object.assign({}, initComponentToken(token)), {\n controlWidth: 90,\n handleWidth,\n handleFontSize: token.fontSize / 2,\n handleVisible,\n handleActiveBg: token.colorFillAlter,\n handleBg: token.colorBgContainer,\n filledHandleBg: new FastColor(token.colorFillSecondary).onBackground(token.colorBgContainer).toHexString(),\n handleHoverColor: token.colorPrimary,\n handleBorderColor: token.colorBorder,\n handleOpacity: handleVisible === true ? 1 : 0,\n handleVisibleWidth: handleVisible === true ? handleWidth : 0\n });\n};","import { unit } from '@ant-design/cssinjs';\nimport { genBasicInputStyle, genInputGroupStyle, genPlaceholderStyle, initInputToken } from '../../input/style';\nimport { genBorderlessStyle, genFilledGroupStyle, genFilledStyle, genOutlinedGroupStyle, genOutlinedStyle, genUnderlinedStyle } from '../../input/style/variants';\nimport { resetComponent, resetIcon } from '../../style';\nimport { genCompactItemStyle } from '../../style/compact-item';\nimport { genStyleHooks, mergeToken } from '../../theme/internal';\nimport { prepareComponentToken } from './token';\nexport const genRadiusStyle = ({\n componentCls,\n borderRadiusSM,\n borderRadiusLG\n}, size) => {\n const borderRadius = size === 'lg' ? borderRadiusLG : borderRadiusSM;\n return {\n [`&-${size}`]: {\n [`${componentCls}-handler-wrap`]: {\n borderStartEndRadius: borderRadius,\n borderEndEndRadius: borderRadius\n },\n [`${componentCls}-handler-up`]: {\n borderStartEndRadius: borderRadius\n },\n [`${componentCls}-handler-down`]: {\n borderEndEndRadius: borderRadius\n }\n }\n };\n};\nconst genInputNumberStyles = token => {\n const {\n componentCls,\n lineWidth,\n lineType,\n borderRadius,\n inputFontSizeSM,\n inputFontSizeLG,\n controlHeightLG,\n controlHeightSM,\n colorError,\n paddingInlineSM,\n paddingBlockSM,\n paddingBlockLG,\n paddingInlineLG,\n colorIcon,\n motionDurationMid,\n handleHoverColor,\n handleOpacity,\n paddingInline,\n paddingBlock,\n handleBg,\n handleActiveBg,\n colorTextDisabled,\n borderRadiusSM,\n borderRadiusLG,\n controlWidth,\n handleBorderColor,\n filledHandleBg,\n lineHeightLG,\n calc\n } = token;\n return [{\n [componentCls]: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, resetComponent(token)), genBasicInputStyle(token)), {\n display: 'inline-block',\n width: controlWidth,\n margin: 0,\n padding: 0,\n borderRadius\n }), genOutlinedStyle(token, {\n [`${componentCls}-handler-wrap`]: {\n background: handleBg,\n [`${componentCls}-handler-down`]: {\n borderBlockStart: `${unit(lineWidth)} ${lineType} ${handleBorderColor}`\n }\n }\n })), genFilledStyle(token, {\n [`${componentCls}-handler-wrap`]: {\n background: filledHandleBg,\n [`${componentCls}-handler-down`]: {\n borderBlockStart: `${unit(lineWidth)} ${lineType} ${handleBorderColor}`\n }\n },\n '&:focus-within': {\n [`${componentCls}-handler-wrap`]: {\n background: handleBg\n }\n }\n })), genUnderlinedStyle(token, {\n [`${componentCls}-handler-wrap`]: {\n background: handleBg,\n [`${componentCls}-handler-down`]: {\n borderBlockStart: `${unit(lineWidth)} ${lineType} ${handleBorderColor}`\n }\n }\n })), genBorderlessStyle(token)), {\n '&-rtl': {\n direction: 'rtl',\n [`${componentCls}-input`]: {\n direction: 'rtl'\n }\n },\n '&-lg': {\n padding: 0,\n fontSize: inputFontSizeLG,\n lineHeight: lineHeightLG,\n borderRadius: borderRadiusLG,\n [`input${componentCls}-input`]: {\n height: calc(controlHeightLG).sub(calc(lineWidth).mul(2)).equal(),\n padding: `${unit(paddingBlockLG)} ${unit(paddingInlineLG)}`\n }\n },\n '&-sm': {\n padding: 0,\n fontSize: inputFontSizeSM,\n borderRadius: borderRadiusSM,\n [`input${componentCls}-input`]: {\n height: calc(controlHeightSM).sub(calc(lineWidth).mul(2)).equal(),\n padding: `${unit(paddingBlockSM)} ${unit(paddingInlineSM)}`\n }\n },\n // ===================== Out Of Range =====================\n '&-out-of-range': {\n [`${componentCls}-input-wrap`]: {\n input: {\n color: colorError\n }\n }\n },\n // Style for input-group: input with label, with button or dropdown...\n '&-group': Object.assign(Object.assign(Object.assign({}, resetComponent(token)), genInputGroupStyle(token)), {\n '&-wrapper': Object.assign(Object.assign(Object.assign({\n display: 'inline-block',\n textAlign: 'start',\n verticalAlign: 'top',\n [`${componentCls}-affix-wrapper`]: {\n width: '100%'\n },\n // Size\n '&-lg': {\n [`${componentCls}-group-addon`]: {\n borderRadius: borderRadiusLG,\n fontSize: token.fontSizeLG\n }\n },\n '&-sm': {\n [`${componentCls}-group-addon`]: {\n borderRadius: borderRadiusSM\n }\n }\n }, genOutlinedGroupStyle(token)), genFilledGroupStyle(token)), {\n // Fix the issue of using icons in Space Compact mode\n // https://github.com/ant-design/ant-design/issues/45764\n [`&:not(${componentCls}-compact-first-item):not(${componentCls}-compact-last-item)${componentCls}-compact-item`]: {\n [`${componentCls}, ${componentCls}-group-addon`]: {\n borderRadius: 0\n }\n },\n [`&:not(${componentCls}-compact-last-item)${componentCls}-compact-first-item`]: {\n [`${componentCls}, ${componentCls}-group-addon`]: {\n borderStartEndRadius: 0,\n borderEndEndRadius: 0\n }\n },\n [`&:not(${componentCls}-compact-first-item)${componentCls}-compact-last-item`]: {\n [`${componentCls}, ${componentCls}-group-addon`]: {\n borderStartStartRadius: 0,\n borderEndStartRadius: 0\n }\n }\n })\n }),\n [`&-disabled ${componentCls}-input`]: {\n cursor: 'not-allowed'\n },\n [componentCls]: {\n '&-input': Object.assign(Object.assign(Object.assign(Object.assign({}, resetComponent(token)), {\n width: '100%',\n padding: `${unit(paddingBlock)} ${unit(paddingInline)}`,\n textAlign: 'start',\n backgroundColor: 'transparent',\n border: 0,\n borderRadius,\n outline: 0,\n transition: `all ${motionDurationMid} linear`,\n appearance: 'textfield',\n fontSize: 'inherit'\n }), genPlaceholderStyle(token.colorTextPlaceholder)), {\n '&[type=\"number\"]::-webkit-inner-spin-button, &[type=\"number\"]::-webkit-outer-spin-button': {\n margin: 0,\n appearance: 'none'\n }\n })\n },\n [`&:hover ${componentCls}-handler-wrap, &-focused ${componentCls}-handler-wrap`]: {\n width: token.handleWidth,\n opacity: 1\n }\n })\n },\n // Handler\n {\n [componentCls]: Object.assign(Object.assign(Object.assign({\n [`${componentCls}-handler-wrap`]: {\n position: 'absolute',\n insetBlockStart: 0,\n insetInlineEnd: 0,\n width: token.handleVisibleWidth,\n opacity: handleOpacity,\n height: '100%',\n borderStartStartRadius: 0,\n borderStartEndRadius: borderRadius,\n borderEndEndRadius: borderRadius,\n borderEndStartRadius: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n transition: `all ${motionDurationMid}`,\n overflow: 'hidden',\n // Fix input number inside Menu makes icon too large\n // We arise the selector priority by nest selector here\n // https://github.com/ant-design/ant-design/issues/14367\n [`${componentCls}-handler`]: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flex: 'auto',\n height: '40%',\n [`\n ${componentCls}-handler-up-inner,\n ${componentCls}-handler-down-inner\n `]: {\n marginInlineEnd: 0,\n fontSize: token.handleFontSize\n }\n }\n },\n [`${componentCls}-handler`]: {\n height: '50%',\n overflow: 'hidden',\n color: colorIcon,\n fontWeight: 'bold',\n lineHeight: 0,\n textAlign: 'center',\n cursor: 'pointer',\n borderInlineStart: `${unit(lineWidth)} ${lineType} ${handleBorderColor}`,\n transition: `all ${motionDurationMid} linear`,\n '&:active': {\n background: handleActiveBg\n },\n // Hover\n '&:hover': {\n height: `60%`,\n [`\n ${componentCls}-handler-up-inner,\n ${componentCls}-handler-down-inner\n `]: {\n color: handleHoverColor\n }\n },\n '&-up-inner, &-down-inner': Object.assign(Object.assign({}, resetIcon()), {\n color: colorIcon,\n transition: `all ${motionDurationMid} linear`,\n userSelect: 'none'\n })\n },\n [`${componentCls}-handler-up`]: {\n borderStartEndRadius: borderRadius\n },\n [`${componentCls}-handler-down`]: {\n borderEndEndRadius: borderRadius\n }\n }, genRadiusStyle(token, 'lg')), genRadiusStyle(token, 'sm')), {\n // Disabled\n '&-disabled, &-readonly': {\n [`${componentCls}-handler-wrap`]: {\n display: 'none'\n },\n [`${componentCls}-input`]: {\n color: 'inherit'\n }\n },\n [`\n ${componentCls}-handler-up-disabled,\n ${componentCls}-handler-down-disabled\n `]: {\n cursor: 'not-allowed'\n },\n [`\n ${componentCls}-handler-up-disabled:hover &-handler-up-inner,\n ${componentCls}-handler-down-disabled:hover &-handler-down-inner\n `]: {\n color: colorTextDisabled\n }\n })\n }];\n};\nconst genAffixWrapperStyles = token => {\n const {\n componentCls,\n paddingBlock,\n paddingInline,\n inputAffixPadding,\n controlWidth,\n borderRadiusLG,\n borderRadiusSM,\n paddingInlineLG,\n paddingInlineSM,\n paddingBlockLG,\n paddingBlockSM,\n motionDurationMid\n } = token;\n return {\n [`${componentCls}-affix-wrapper`]: Object.assign(Object.assign({\n [`input${componentCls}-input`]: {\n padding: `${unit(paddingBlock)} 0`\n }\n }, genBasicInputStyle(token)), {\n // or number handler will cover form status\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: controlWidth,\n padding: 0,\n paddingInlineStart: paddingInline,\n '&-lg': {\n borderRadius: borderRadiusLG,\n paddingInlineStart: paddingInlineLG,\n [`input${componentCls}-input`]: {\n padding: `${unit(paddingBlockLG)} 0`\n }\n },\n '&-sm': {\n borderRadius: borderRadiusSM,\n paddingInlineStart: paddingInlineSM,\n [`input${componentCls}-input`]: {\n padding: `${unit(paddingBlockSM)} 0`\n }\n },\n [`&:not(${componentCls}-disabled):hover`]: {\n zIndex: 1\n },\n '&-focused, &:focus': {\n zIndex: 1\n },\n [`&-disabled > ${componentCls}-disabled`]: {\n background: 'transparent'\n },\n [`> div${componentCls}`]: {\n width: '100%',\n border: 'none',\n outline: 'none',\n [`&${componentCls}-focused`]: {\n boxShadow: 'none !important'\n }\n },\n '&::before': {\n display: 'inline-block',\n width: 0,\n visibility: 'hidden',\n content: '\"\\\\a0\"'\n },\n [`${componentCls}-handler-wrap`]: {\n zIndex: 2\n },\n [componentCls]: {\n position: 'static',\n color: 'inherit',\n '&-prefix, &-suffix': {\n display: 'flex',\n flex: 'none',\n alignItems: 'center',\n pointerEvents: 'none'\n },\n '&-prefix': {\n marginInlineEnd: inputAffixPadding\n },\n '&-suffix': {\n insetBlockStart: 0,\n insetInlineEnd: 0,\n height: '100%',\n marginInlineEnd: paddingInline,\n marginInlineStart: inputAffixPadding,\n transition: `margin ${motionDurationMid}`\n }\n },\n [`&:hover ${componentCls}-handler-wrap, &-focused ${componentCls}-handler-wrap`]: {\n width: token.handleWidth,\n opacity: 1\n },\n [`&:not(${componentCls}-affix-wrapper-without-controls):hover ${componentCls}-suffix`]: {\n marginInlineEnd: token.calc(token.handleWidth).add(paddingInline).equal()\n }\n }),\n // 覆盖 affix-wrapper borderRadius!\n [`${componentCls}-underlined`]: {\n borderRadius: 0\n }\n };\n};\nexport default genStyleHooks('InputNumber', token => {\n const inputNumberToken = mergeToken(token, initInputToken(token));\n return [genInputNumberStyles(inputNumberToken), genAffixWrapperStyles(inputNumberToken),\n // =====================================================\n // == Space Compact ==\n // =====================================================\n genCompactItemStyle(inputNumberToken)];\n}, prepareComponentToken, {\n unitless: {\n handleOpacity: true\n },\n resetFont: false\n});","\"use client\";\n\nvar __rest = this && this.__rest || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport * as React from 'react';\nimport DownOutlined from \"@ant-design/icons/es/icons/DownOutlined\";\nimport UpOutlined from \"@ant-design/icons/es/icons/UpOutlined\";\nimport classNames from 'classnames';\nimport RcInputNumber from 'rc-input-number';\nimport ContextIsolator from '../_util/ContextIsolator';\nimport { getMergedStatus, getStatusClassNames } from '../_util/statusUtils';\nimport { devUseWarning } from '../_util/warning';\nimport ConfigProvider, { ConfigContext } from '../config-provider';\nimport DisabledContext from '../config-provider/DisabledContext';\nimport useCSSVarCls from '../config-provider/hooks/useCSSVarCls';\nimport useSize from '../config-provider/hooks/useSize';\nimport { FormItemInputContext } from '../form/context';\nimport useVariant from '../form/hooks/useVariants';\nimport { useCompactItemContext } from '../space/Compact';\nimport useStyle from './style';\nconst InputNumber = /*#__PURE__*/React.forwardRef((props, ref) => {\n if (process.env.NODE_ENV !== 'production') {\n const typeWarning = devUseWarning('InputNumber');\n typeWarning.deprecated(!('bordered' in props), 'bordered', 'variant');\n typeWarning(!(props.type === 'number' && props.changeOnWheel), 'usage', 'When `type=number` is used together with `changeOnWheel`, changeOnWheel may not work properly. Please delete `type=number` if it is not necessary.');\n }\n const {\n getPrefixCls,\n direction\n } = React.useContext(ConfigContext);\n const inputRef = React.useRef(null);\n React.useImperativeHandle(ref, () => inputRef.current);\n const {\n className,\n rootClassName,\n size: customizeSize,\n disabled: customDisabled,\n prefixCls: customizePrefixCls,\n addonBefore,\n addonAfter,\n prefix,\n suffix,\n bordered,\n readOnly,\n status: customStatus,\n controls,\n variant: customVariant\n } = props,\n others = __rest(props, [\"className\", \"rootClassName\", \"size\", \"disabled\", \"prefixCls\", \"addonBefore\", \"addonAfter\", \"prefix\", \"suffix\", \"bordered\", \"readOnly\", \"status\", \"controls\", \"variant\"]);\n const prefixCls = getPrefixCls('input-number', customizePrefixCls);\n // Style\n const rootCls = useCSSVarCls(prefixCls);\n const [wrapCSSVar, hashId, cssVarCls] = useStyle(prefixCls, rootCls);\n const {\n compactSize,\n compactItemClassnames\n } = useCompactItemContext(prefixCls, direction);\n let upIcon = /*#__PURE__*/React.createElement(UpOutlined, {\n className: `${prefixCls}-handler-up-inner`\n });\n let downIcon = /*#__PURE__*/React.createElement(DownOutlined, {\n className: `${prefixCls}-handler-down-inner`\n });\n const controlsTemp = typeof controls === 'boolean' ? controls : undefined;\n if (typeof controls === 'object') {\n upIcon = typeof controls.upIcon === 'undefined' ? upIcon : (/*#__PURE__*/React.createElement(\"span\", {\n className: `${prefixCls}-handler-up-inner`\n }, controls.upIcon));\n downIcon = typeof controls.downIcon === 'undefined' ? downIcon : (/*#__PURE__*/React.createElement(\"span\", {\n className: `${prefixCls}-handler-down-inner`\n }, controls.downIcon));\n }\n const {\n hasFeedback,\n status: contextStatus,\n isFormItemInput,\n feedbackIcon\n } = React.useContext(FormItemInputContext);\n const mergedStatus = getMergedStatus(contextStatus, customStatus);\n const mergedSize = useSize(ctx => {\n var _a;\n return (_a = customizeSize !== null && customizeSize !== void 0 ? customizeSize : compactSize) !== null && _a !== void 0 ? _a : ctx;\n });\n // ===================== Disabled =====================\n const disabled = React.useContext(DisabledContext);\n const mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;\n const [variant, enableVariantCls] = useVariant('inputNumber', customVariant, bordered);\n const suffixNode = hasFeedback && /*#__PURE__*/React.createElement(React.Fragment, null, feedbackIcon);\n const inputNumberClass = classNames({\n [`${prefixCls}-lg`]: mergedSize === 'large',\n [`${prefixCls}-sm`]: mergedSize === 'small',\n [`${prefixCls}-rtl`]: direction === 'rtl',\n [`${prefixCls}-in-form-item`]: isFormItemInput\n }, hashId);\n const wrapperClassName = `${prefixCls}-group`;\n const element = /*#__PURE__*/React.createElement(RcInputNumber, Object.assign({\n ref: inputRef,\n disabled: mergedDisabled,\n className: classNames(cssVarCls, rootCls, className, rootClassName, compactItemClassnames),\n upHandler: upIcon,\n downHandler: downIcon,\n prefixCls: prefixCls,\n readOnly: readOnly,\n controls: controlsTemp,\n prefix: prefix,\n suffix: suffixNode || suffix,\n addonBefore: addonBefore && (/*#__PURE__*/React.createElement(ContextIsolator, {\n form: true,\n space: true\n }, addonBefore)),\n addonAfter: addonAfter && (/*#__PURE__*/React.createElement(ContextIsolator, {\n form: true,\n space: true\n }, addonAfter)),\n classNames: {\n input: inputNumberClass,\n variant: classNames({\n [`${prefixCls}-${variant}`]: enableVariantCls\n }, getStatusClassNames(prefixCls, mergedStatus, hasFeedback)),\n affixWrapper: classNames({\n [`${prefixCls}-affix-wrapper-sm`]: mergedSize === 'small',\n [`${prefixCls}-affix-wrapper-lg`]: mergedSize === 'large',\n [`${prefixCls}-affix-wrapper-rtl`]: direction === 'rtl',\n [`${prefixCls}-affix-wrapper-without-controls`]: controls === false || mergedDisabled || readOnly\n }, hashId),\n wrapper: classNames({\n [`${wrapperClassName}-rtl`]: direction === 'rtl'\n }, hashId),\n groupWrapper: classNames({\n [`${prefixCls}-group-wrapper-sm`]: mergedSize === 'small',\n [`${prefixCls}-group-wrapper-lg`]: mergedSize === 'large',\n [`${prefixCls}-group-wrapper-rtl`]: direction === 'rtl',\n [`${prefixCls}-group-wrapper-${variant}`]: enableVariantCls\n }, getStatusClassNames(`${prefixCls}-group-wrapper`, mergedStatus, hasFeedback), hashId)\n }\n }, others));\n return wrapCSSVar(element);\n});\nconst TypedInputNumber = InputNumber;\n/** @private Internal Component. Do not use in your production. */\nconst PureInputNumber = props => (/*#__PURE__*/React.createElement(ConfigProvider, {\n theme: {\n components: {\n InputNumber: {\n handleVisible: true\n }\n }\n }\n}, /*#__PURE__*/React.createElement(InputNumber, Object.assign({}, props))));\nif (process.env.NODE_ENV !== 'production') {\n TypedInputNumber.displayName = 'InputNumber';\n}\nTypedInputNumber._InternalPanelDoNotUseOrYouWillBeFired = PureInputNumber;\nexport default TypedInputNumber;","// This icon file is generated automatically.\nvar SaveOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M893.3 293.3L730.7 130.7c-7.5-7.5-16.7-13-26.7-16V112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V338.5c0-17-6.7-33.2-18.7-45.2zM384 184h256v104H384V184zm456 656H184V184h136v136c0 17.7 14.3 32 32 32h320c17.7 0 32-14.3 32-32V205.8l136 136V840zM512 442c-79.5 0-144 64.5-144 144s64.5 144 144 144 144-64.5 144-144-64.5-144-144-144zm0 224c-44.2 0-80-35.8-80-80s35.8-80 80-80 80 35.8 80 80-35.8 80-80 80z\" } }] }, \"name\": \"save\", \"theme\": \"outlined\" };\nexport default SaveOutlined;\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\n\nimport * as React from 'react';\nimport SaveOutlinedSvg from \"@ant-design/icons-svg/es/asn/SaveOutlined\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar SaveOutlined = function SaveOutlined(props, ref) {\n return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n ref: ref,\n icon: SaveOutlinedSvg\n }));\n};\n\n/**![save](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTg5My4zIDI5My4zTDczMC43IDEzMC43Yy03LjUtNy41LTE2LjctMTMtMjYuNy0xNlYxMTJIMTQ0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY3MzZjMCAxNy43IDE0LjMgMzIgMzIgMzJoNzM2YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjMzOC41YzAtMTctNi43LTMzLjItMTguNy00NS4yek0zODQgMTg0aDI1NnYxMDRIMzg0VjE4NHptNDU2IDY1NkgxODRWMTg0aDEzNnYxMzZjMCAxNy43IDE0LjMgMzIgMzIgMzJoMzIwYzE3LjcgMCAzMi0xNC4zIDMyLTMyVjIwNS44bDEzNiAxMzZWODQwek01MTIgNDQyYy03OS41IDAtMTQ0IDY0LjUtMTQ0IDE0NHM2NC41IDE0NCAxNDQgMTQ0IDE0NC02NC41IDE0NC0xNDQtNjQuNS0xNDQtMTQ0LTE0NHptMCAyMjRjLTQ0LjIgMC04MC0zNS44LTgwLTgwczM1LjgtODAgODAtODAgODAgMzUuOCA4MCA4MC0zNS44IDgwLTgwIDgweiIgLz48L3N2Zz4=) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(SaveOutlined);\nif (process.env.NODE_ENV !== 'production') {\n RefIcon.displayName = 'SaveOutlined';\n}\nexport default RefIcon;","// This icon file is generated automatically.\nvar UploadOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M400 317.7h73.9V656c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V317.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 163a8 8 0 00-12.6 0l-112 141.7c-4.1 5.3-.4 13 6.3 13zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z\" } }] }, \"name\": \"upload\", \"theme\": \"outlined\" };\nexport default UploadOutlined;\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\n\nimport * as React from 'react';\nimport UploadOutlinedSvg from \"@ant-design/icons-svg/es/asn/UploadOutlined\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar UploadOutlined = function UploadOutlined(props, ref) {\n return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n ref: ref,\n icon: UploadOutlinedSvg\n }));\n};\n\n/**![upload](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTQwMCAzMTcuN2g3My45VjY1NmMwIDQuNCAzLjYgOCA4IDhoNjBjNC40IDAgOC0zLjYgOC04VjMxNy43SDYyNGM2LjcgMCAxMC40LTcuNyA2LjMtMTIuOUw1MTguMyAxNjNhOCA4IDAgMDAtMTIuNiAwbC0xMTIgMTQxLjdjLTQuMSA1LjMtLjQgMTMgNi4zIDEzek04NzggNjI2aC02MGMtNC40IDAtOCAzLjYtOCA4djE1NEgyMTRWNjM0YzAtNC40LTMuNi04LTgtOGgtNjBjLTQuNCAwLTggMy42LTggOHYxOThjMCAxNy43IDE0LjMgMzIgMzIgMzJoNjg0YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjYzNGMwLTQuNC0zLjYtOC04LTh6IiAvPjwvc3ZnPg==) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(UploadOutlined);\nif (process.env.NODE_ENV !== 'production') {\n RefIcon.displayName = 'UploadOutlined';\n}\nexport default RefIcon;","import { useEffect } from 'react';\nimport { Form } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useConfig } from '../../../hooks/useConfig';\nimport { translateErrorCode } from '../../../utils/errorCodeTranslator';\nimport { QUERY_KEYS } from '../../../constants';\nimport { useErrorHandler } from '../../../hooks/useErrorHandler';\nimport { ApiError, handleApiError } from '../../../services/api';\nimport type { ConfigData } from '../../../services/api';\n\n/**\n * Hook for managing configuration form\n */\nexport function useConfigForm() {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const [form] = Form.useForm<ConfigFormValues>();\n const { config, isLoading, updateAsync, validate, isUpdating, isValidating } = useConfig();\n const { handleError, handleSuccess } = useErrorHandler();\n\n // Load config into form when it's available\n useEffect(() => {\n if (config) {\n const formData = sanitizeConfigForForm(config);\n form.setFieldsValue(formData);\n }\n }, [config, form]);\n\n const handleSave = async () => {\n try {\n const values = form.getFieldsValue();\n await updateAsync(values as Partial<ConfigData>);\n handleSuccess(t('config.saveSuccess'));\n } catch (error) {\n const apiError = handleApiError(error);\n const formattedMessage = formatConfigSaveError(apiError, t);\n handleError(apiError, formattedMessage);\n }\n };\n\n const handleValidate = () => {\n form.validateFields().then((values: ConfigFormValues) => {\n validate(values as Partial<ConfigData>);\n });\n };\n\n const handleTargetChange = async () => {\n // Auto-save targets when changed\n try {\n const values = form.getFieldsValue();\n const payload: Partial<ConfigData> = {\n ...stripConfigMetadata(config),\n ...values,\n targets: values.targets as ConfigData['targets'],\n };\n await updateAsync(payload);\n } catch (error) {\n const apiError = handleApiError(error);\n const autoSaveFailedMessage =\n translateErrorCode(apiError.code, t, apiError.params, t('config.saveFailed')) ??\n t('config.saveFailed');\n handleError(apiError, autoSaveFailedMessage);\n }\n };\n\n const getConfigPreview = () => {\n return JSON.stringify(form.getFieldsValue(), null, 2);\n };\n\n return {\n form,\n config,\n isLoading,\n isUpdating,\n isValidating,\n handleSave,\n handleValidate,\n handleTargetChange,\n getConfigPreview,\n refreshConfig: () => queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG }),\n };\n}\n\ntype ConfigTarget = NonNullable<ConfigData['targets']>[number];\n\nexport type ConfigFormTarget = {\n type?: ConfigTarget['type'];\n tag?: ConfigTarget['tag'];\n limit?: ConfigTarget['limit'];\n searchTarget?: ConfigTarget['searchTarget'];\n sort?: ConfigTarget['sort'];\n mode?: ConfigTarget['mode'];\n rankingMode?: ConfigTarget['rankingMode'];\n rankingDate?: ConfigTarget['rankingDate'];\n filterTag?: ConfigTarget['filterTag'];\n minBookmarks?: ConfigTarget['minBookmarks'];\n startDate?: ConfigTarget['startDate'];\n endDate?: ConfigTarget['endDate'];\n seriesId?: ConfigTarget['seriesId'];\n novelId?: ConfigTarget['novelId'];\n};\n\nexport type ConfigFormValues = Omit<ConfigData, '_meta' | '_validation' | 'targets'> & {\n targets?: ConfigFormTarget[];\n};\n\nconst sanitizeConfigForForm = (config: ConfigData): ConfigFormValues => {\n const { _meta, _validation, ...configWithoutMeta } = config;\n\n return {\n ...configWithoutMeta,\n targets: Array.isArray(configWithoutMeta.targets) ? configWithoutMeta.targets : [],\n };\n};\n\nconst stripConfigMetadata = (\n data: ConfigData | undefined\n): Partial<ConfigData> => {\n if (!data) {\n return {};\n }\n\n const { _meta, _validation, ...rest } = data;\n return rest;\n};\n\nconst formatConfigSaveError = (\n error: ApiError,\n t: ReturnType<typeof useTranslation>['t']\n): string => {\n if (error.code === 'CONFIG_INVALID' && Array.isArray(error.details)) {\n const errorMessages = error.details.map((detail) => {\n if (typeof detail === 'object' && detail && 'code' in detail) {\n const { code, params } = detail as { code?: string; params?: Record<string, unknown> };\n return translateErrorCode(code, t, params);\n }\n return String(detail);\n });\n\n return `${translateErrorCode(error.code, t)}: ${errorMessages.join(', ')}`;\n }\n\n return (\n translateErrorCode(error.code, t, error.params, error.message) ||\n error.message ||\n t('config.saveFailed')\n );\n};\n\n","import { useState, useCallback, useMemo } from 'react';\nimport { message } from 'antd';\n\n/**\n * Loading state with optional message\n */\nexport interface LoadingState {\n loading: boolean;\n message?: string;\n progress?: number; // 0-100\n}\n\n/**\n * Hook for unified loading state management\n * Provides loading state, loading message, and loading progress\n */\nexport function useLoadingState(initialState: boolean = false) {\n const [loading, setLoading] = useState<boolean>(initialState);\n const [loadingMessage, setLoadingMessage] = useState<string | undefined>(undefined);\n const [progress, setProgress] = useState<number | undefined>(undefined);\n const [messageKey, setMessageKey] = useState<string | undefined>(undefined);\n\n const startLoading = useCallback((msg?: string, key?: string) => {\n setLoading(true);\n if (msg) {\n setLoadingMessage(msg);\n if (key) {\n setMessageKey(key);\n message.loading({ content: msg, key, duration: 0 });\n }\n }\n }, []);\n\n const stopLoading = useCallback((successMessage?: string) => {\n setLoading(false);\n setLoadingMessage(undefined);\n setProgress(undefined);\n \n if (messageKey) {\n message.destroy(messageKey);\n if (successMessage) {\n message.success({ content: successMessage, key: messageKey, duration: 2 });\n }\n setMessageKey(undefined);\n }\n }, [messageKey]);\n\n const updateProgress = useCallback((value: number) => {\n setProgress(Math.max(0, Math.min(100, value)));\n }, []);\n\n const updateMessage = useCallback((msg: string) => {\n setLoadingMessage(msg);\n if (messageKey) {\n message.loading({ content: msg, key: messageKey, duration: 0 });\n }\n }, [messageKey]);\n\n const state: LoadingState = useMemo(\n () => ({\n loading,\n message: loadingMessage,\n progress,\n }),\n [loading, loadingMessage, progress]\n );\n\n return {\n ...state,\n startLoading,\n stopLoading,\n updateProgress,\n updateMessage,\n setLoading,\n };\n}\n\n/**\n * Hook for managing multiple loading states\n */\nexport function useLoadingStates<T extends string>(\n initialStates?: Partial<Record<T, boolean>>\n) {\n const [loadingStates, setLoadingStates] = useState<Partial<Record<T, LoadingState>>>(() => {\n if (!initialStates) {\n return {};\n }\n\n return Object.entries(initialStates).reduce<Partial<Record<T, LoadingState>>>(\n (acc, [key, value]) => {\n acc[key as T] = { loading: Boolean(value) };\n return acc;\n },\n {}\n );\n });\n\n const setLoading = useCallback((key: T, value: boolean, message?: string) => {\n setLoadingStates((prev) => ({\n ...prev,\n [key]: {\n loading: value,\n message: value ? message : undefined,\n progress: value ? prev[key]?.progress : undefined,\n },\n }));\n }, []);\n\n const startLoading = useCallback((key: T, message?: string) => {\n setLoading(key, true, message);\n }, [setLoading]);\n\n const stopLoading = useCallback((key: T, successMessage?: string) => {\n setLoadingStates((prev) => {\n const current = prev[key];\n if (current?.loading && successMessage) {\n // Show success message if provided\n message.success(successMessage);\n }\n return {\n ...prev,\n [key]: {\n loading: false,\n message: undefined,\n progress: undefined,\n },\n };\n });\n }, []);\n\n const updateProgress = useCallback((key: T, value: number) => {\n setLoadingStates((prev) => ({\n ...prev,\n [key]: {\n ...prev[key],\n loading: prev[key]?.loading ?? false,\n progress: Math.max(0, Math.min(100, value)),\n },\n }));\n }, []);\n\n const isLoading = useCallback(\n (key: T) => loadingStates[key]?.loading === true,\n [loadingStates]\n );\n\n const getLoadingState = useCallback(\n (key: T): LoadingState | undefined => loadingStates[key],\n [loadingStates]\n );\n\n const isAnyLoading = useMemo(() => {\n const stateValues = Object.values(loadingStates) as Array<LoadingState | undefined>;\n return stateValues.some((state) => state?.loading === true);\n }, [loadingStates]);\n\n return {\n loadingStates,\n setLoading,\n startLoading,\n stopLoading,\n updateProgress,\n isLoading,\n getLoadingState,\n isAnyLoading,\n };\n}\n\n","import { useCallback, useMemo } from 'react';\nimport { message } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { useQueryClient } from '@tanstack/react-query';\nimport type { ConfigData } from '../../../services/api';\nimport { configService } from '../../../services/configService';\nimport { extractErrorInfo } from '../../../utils/errorCodeTranslator';\nimport { QUERY_KEYS } from '../../../constants';\nimport { useConfigFiles } from '../../../hooks/useConfig';\nimport { useErrorHandler } from '../../../hooks/useErrorHandler';\nimport { useLoadingState } from '../../../hooks/useLoadingState';\n\n\nconst IMPORT_LOADING_KEY = 'config-import';\n\n/**\n * Hook for configuration operations (export, import, copy, etc.)\n */\nexport function useConfigOperations(config: ConfigData | undefined) {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const { refetch: refetchConfigFiles } = useConfigFiles();\n const { handleWarning, handleSuccess, handleError } = useErrorHandler();\n const { loading: isImporting, startLoading, stopLoading } = useLoadingState();\n\n const configExportPayload = useMemo(() => {\n if (!config) {\n return null;\n }\n\n const { _meta, _validation, ...configWithoutMeta } = config;\n return configWithoutMeta;\n }, [config]);\n\n const handleExportConfig = useCallback(() => {\n if (!configExportPayload) {\n handleWarning(t('config.configNotLoaded'));\n return;\n }\n\n const jsonStr = JSON.stringify(configExportPayload, null, 2);\n const blob = new Blob([jsonStr], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = `config-${new Date().toISOString().split('T')[0]}.json`;\n anchor.click();\n URL.revokeObjectURL(url);\n handleSuccess(t('config.configExported'));\n }, [configExportPayload, handleSuccess, handleWarning, t]);\n\n const parseConfigFile = useCallback(async (file: File): Promise<Partial<ConfigData>> => {\n const fileContent = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (event) => resolve((event.target?.result as string) ?? '');\n reader.onerror = () =>\n reject(new Error(t('config.configReadFailed', { defaultValue: 'Failed to read config file' })));\n reader.readAsText(file);\n });\n\n const parsed = JSON.parse(fileContent) as Partial<ConfigData>;\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error(t('config.configFormatError'));\n }\n\n const { _meta, _validation, ...normalized } = parsed as ConfigData;\n return normalized;\n }, [t]);\n\n const handleImportConfig = useCallback(() => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json';\n input.multiple = true;\n\n input.onchange = async (event: Event) => {\n const target = event.target as HTMLInputElement;\n const files = Array.from(target.files ?? []);\n if (files.length === 0) {\n return;\n }\n\n startLoading(undefined, IMPORT_LOADING_KEY);\n\n let successCount = 0;\n let failCount = 0;\n const failedFiles: string[] = [];\n let lastImportedPath: string | null = null;\n\n try {\n for (const file of files) {\n let configToImport: Partial<ConfigData>;\n\n try {\n configToImport = await parseConfigFile(file);\n } catch (error) {\n failCount++;\n failedFiles.push(`${file.name}: ${error instanceof Error ? error.message : t('config.configFormatError')}`);\n continue;\n }\n\n try {\n const validationResult = await configService.validateConfig(configToImport);\n if (!validationResult.valid) {\n const errorDetails = Array.isArray(validationResult.errors) && validationResult.errors.length > 0\n ? validationResult.errors.join(', ')\n : t('config.validationFailed');\n failCount++;\n failedFiles.push(`${file.name}: ${errorDetails}`);\n continue;\n }\n } catch (error) {\n console.warn('[Config Import] Validation error:', error);\n }\n\n try {\n const baseName = file.name.replace(/\\.json$/i, '').replace(/^standalone\\.config\\./i, '');\n const timestamp = new Date().toISOString().split('T')[0];\n const importName = baseName ? `${baseName}-${timestamp}` : `imported-${timestamp}`;\n const result = await configService.importConfigFile(configToImport, importName);\n lastImportedPath = result.path;\n successCount++;\n } catch (error) {\n const { message: errorMessage } = extractErrorInfo(error);\n failCount++;\n failedFiles.push(\n `${file.name}: ${errorMessage || (error instanceof Error ? error.message : t('config.unknownError'))}`\n );\n }\n }\n\n if (lastImportedPath) {\n try {\n await configService.switchConfigFile(lastImportedPath);\n } catch (error) {\n handleError(error);\n }\n }\n\n await queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG });\n await queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG_FILES });\n refetchConfigFiles();\n\n if (successCount > 0 && failCount === 0) {\n handleSuccess(\n files.length === 1\n ? t('config.configImportedAndSaved')\n : t('config.configBatchImportedSuccess', { count: successCount })\n );\n } else if (successCount > 0 && failCount > 0) {\n message.warning(\n t('config.configBatchImportedPartial', {\n success: successCount,\n total: files.length,\n failed: failCount,\n })\n );\n console.warn('[Config Import] Failed files:\\n', failedFiles.join('\\n'));\n } else {\n const errorMessage =\n files.length === 1\n ? `${t('config.configImportFailed')}: ${failedFiles[0] || t('config.unknownError')}`\n : t('config.configBatchImportedFailed', { count: failCount });\n message.error(errorMessage);\n }\n } finally {\n stopLoading();\n }\n };\n\n input.click();\n }, [\n handleError,\n handleSuccess,\n parseConfigFile,\n queryClient,\n refetchConfigFiles,\n startLoading,\n stopLoading,\n t,\n ]);\n\n const handleCopyConfig = useCallback(\n async (configJson: string) => {\n try {\n await navigator.clipboard.writeText(configJson);\n handleSuccess(t('config.configCopied'));\n } catch (error) {\n handleError(error, t('config.clipboardCopyFailed', { defaultValue: 'Failed to copy config to clipboard' }));\n }\n },\n [handleError, handleSuccess, t]\n );\n\n const handleConfigFileSwitch = useCallback(() => {\n setTimeout(() => {\n window.location.reload();\n }, 1000);\n }, []);\n\n const handleConfigApplied = useCallback(() => {\n setTimeout(() => {\n window.location.reload();\n }, 1000);\n }, []);\n\n return {\n handleExportConfig,\n handleImportConfig,\n handleCopyConfig,\n handleConfigFileSwitch,\n handleConfigApplied,\n isImporting,\n };\n}\n\n","import { useState, useCallback } from 'react';\n\n/**\n * Hook for managing config modals state\n */\nexport function useConfigModals() {\n const [previewVisible, setPreviewVisible] = useState(false);\n const [jsonEditorVisible, setJsonEditorVisible] = useState(false);\n const [editingConfigFile, setEditingConfigFile] = useState<string | null>(null);\n\n const openPreview = useCallback(() => {\n setPreviewVisible(true);\n }, []);\n\n const closePreview = useCallback(() => {\n setPreviewVisible(false);\n }, []);\n\n const openJsonEditor = useCallback((filename: string) => {\n setEditingConfigFile(filename);\n setJsonEditorVisible(true);\n }, []);\n\n const closeJsonEditor = useCallback(() => {\n setJsonEditorVisible(false);\n setEditingConfigFile(null);\n }, []);\n\n return {\n previewVisible,\n jsonEditorVisible,\n editingConfigFile,\n openPreview,\n closePreview,\n openJsonEditor,\n closeJsonEditor,\n };\n}\n\n","import { useState, useCallback } from 'react';\n\n/**\n * Hook for managing config tabs state\n */\nexport function useConfigTabs() {\n const [activeTab, setActiveTab] = useState('files');\n\n const handleTabChange = useCallback((tab: string) => {\n setActiveTab(tab);\n }, []);\n\n return {\n activeTab,\n setActiveTab: handleTabChange,\n };\n}\n\n","import { Typography, Space, Select, Tag } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { ConfigFileInfo } from '../../../services/api';\nimport { api } from '../../../services/api';\nimport { useErrorHandler } from '../../../hooks/useErrorHandler';\nimport { QUERY_KEYS } from '../../../constants';\n\nconst { Title, Text } = Typography;\nconst { Option } = Select;\n\ntype MaybePromise<T = void> = T | Promise<T>;\n\ninterface ConfigHeaderProps {\n currentConfigPath: string;\n configFiles: ConfigFileInfo[];\n onConfigFileSwitch: () => MaybePromise;\n refetchConfigFiles: () => MaybePromise<unknown>;\n}\n\n/**\n * ConfigHeader component - Header with title and config file selector\n */\nexport function ConfigHeader({\n currentConfigPath,\n configFiles,\n onConfigFileSwitch,\n refetchConfigFiles,\n}: ConfigHeaderProps) {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const { handleError, handleSuccess } = useErrorHandler();\n const activeConfigFile = configFiles?.find((f) => f.isActive);\n\n const handleConfigFileChange = async (filename: string) => {\n const file = configFiles.find((f) => f.filename === filename);\n if (file && !file.isActive) {\n try {\n await api.switchConfigFile(file.path);\n handleSuccess(t('config.configSwitched'));\n await queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG });\n await queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG_FILES });\n await Promise.resolve(refetchConfigFiles());\n await Promise.resolve(onConfigFileSwitch());\n } catch (error) {\n handleError(error, t('config.configSwitchFailed'));\n }\n }\n };\n\n return (\n <div style={{ flex: '1 1 auto', minWidth: 200 }}>\n <Title level={2} style={{ margin: 0, whiteSpace: 'normal', wordBreak: 'normal' }}>\n {t('config.title')}\n </Title>\n <Space direction=\"vertical\" size=\"small\" style={{ marginTop: 8 }}>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {t('config.currentConfigFile')}: {currentConfigPath}\n </Text>\n {configFiles && configFiles.length > 0 && (\n <Select\n value={activeConfigFile?.filename || undefined}\n onChange={handleConfigFileChange}\n style={{ width: 300, fontSize: 12 }}\n placeholder={t('config.selectConfigFile')}\n size=\"small\"\n >\n {configFiles.map((file) => (\n <Option key={file.filename} value={file.filename}>\n {file.isActive && <Tag color=\"green\" style={{ marginRight: 8 }}>{t('config.activeConfig')}</Tag>}\n {file.filename}\n </Option>\n ))}\n </Select>\n )}\n </Space>\n </div>\n );\n}\n\n","import { Button, Space, Tooltip } from 'antd';\nimport {\n SaveOutlined,\n ReloadOutlined,\n CheckCircleOutlined,\n DownloadOutlined,\n UploadOutlined,\n FileTextOutlined,\n CopyOutlined,\n} from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { useAuth } from '../../../hooks/useAuth';\n\ninterface ConfigActionsProps {\n onRefresh: () => void;\n onPreview: () => void;\n onExport: () => void;\n onImport: () => void;\n onCopy: () => void | Promise<void>;\n onValidate: () => void;\n onSave: () => void;\n isValidating: boolean;\n isUpdating: boolean;\n isImporting?: boolean;\n}\n\n/**\n * ConfigActions component - Action buttons for configuration operations\n */\nexport function ConfigActions({\n onRefresh,\n onPreview,\n onExport,\n onImport,\n onCopy,\n onValidate,\n onSave,\n isValidating,\n isUpdating,\n isImporting = false,\n}: ConfigActionsProps) {\n const { t } = useTranslation();\n const { authenticated } = useAuth();\n \n // Buttons that require authentication\n const requiresAuth = !authenticated;\n const loginTip = t('common.loginRequired');\n\n return (\n <Space wrap>\n <Button icon={<ReloadOutlined />} onClick={onRefresh}>\n {t('common.refresh')}\n </Button>\n <Button icon={<FileTextOutlined />} onClick={onPreview}>\n {t('config.previewConfig')}\n </Button>\n <Button icon={<DownloadOutlined />} onClick={onExport}>\n {t('config.exportConfig')}\n </Button>\n <Tooltip title={requiresAuth ? loginTip : undefined}>\n <Button \n icon={<UploadOutlined />} \n onClick={onImport} \n loading={isImporting} \n disabled={isImporting || requiresAuth}\n >\n {t('config.importConfig')}\n </Button>\n </Tooltip>\n <Button icon={<CopyOutlined />} onClick={onCopy}>\n {t('config.copyConfig')}\n </Button>\n <Button icon={<CheckCircleOutlined />} onClick={onValidate} loading={isValidating}>\n {t('config.validateConfig')}\n </Button>\n <Tooltip title={requiresAuth ? loginTip : undefined}>\n <Button\n type=\"primary\"\n icon={<SaveOutlined />}\n onClick={onSave}\n loading={isUpdating}\n disabled={requiresAuth}\n >\n {t('config.saveConfig')}\n </Button>\n </Tooltip>\n </Space>\n );\n}\n\n","import React from 'react';\nimport { Card, Collapse, Typography, Space } from 'antd';\nimport { FormSectionProps } from './types';\n\nconst { Panel } = Collapse;\nconst { Title, Text } = Typography;\n\n/**\n * Form section component that provides consistent grouping\n * for form fields. Supports both card and collapsible modes.\n */\nexport const FormSection: React.FC<FormSectionProps> = ({\n title,\n description,\n children,\n collapsible = false,\n defaultCollapsed = false,\n card = true,\n extra,\n style,\n className,\n}) => {\n if (collapsible) {\n return (\n <Collapse\n defaultActiveKey={defaultCollapsed ? [] : ['1']}\n style={style}\n className={className}\n >\n <Panel\n header={\n <Space direction=\"vertical\" size={0}>\n <Title level={5} style={{ margin: 0 }}>\n {title}\n </Title>\n {description && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {description}\n </Text>\n )}\n </Space>\n }\n key=\"1\"\n extra={extra}\n >\n {children}\n </Panel>\n </Collapse>\n );\n }\n\n if (card) {\n return (\n <Card\n title={\n <Space direction=\"vertical\" size={0}>\n <Title level={5} style={{ margin: 0 }}>\n {title}\n </Title>\n {description && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {description}\n </Text>\n )}\n </Space>\n }\n extra={extra}\n style={style}\n className={className}\n >\n {children}\n </Card>\n );\n }\n\n return (\n <div style={style} className={className}>\n <Space direction=\"vertical\" size={8} style={{ width: '100%' }}>\n <Title level={5} style={{ margin: 0 }}>\n {title}\n </Title>\n {description && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {description}\n </Text>\n )}\n {children}\n </Space>\n </div>\n );\n};\n\nexport default FormSection;\n\n","import React from 'react';\nimport { Form, InputNumber, Select, Tooltip, Space } from 'antd';\nimport { QuestionCircleOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { FormSection } from '../../../components/forms/FormSection';\n\nconst { Option } = Select;\n\nexport const BasicConfigForm: React.FC = () => {\n const { t } = useTranslation();\n\n return (\n <FormSection title={t('config.tabBasic')}>\n <Form.Item\n label={\n <Space>\n {t('config.logLevel')}\n <Tooltip title={t('config.logLevelTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"logLevel\"\n >\n <Select>\n <Option value=\"debug\">{t('config.logLevelDebug')}</Option>\n <Option value=\"info\">{t('config.logLevelInfo')}</Option>\n <Option value=\"warn\">{t('config.logLevelWarn')}</Option>\n <Option value=\"error\">{t('config.logLevelError')}</Option>\n </Select>\n </Form.Item>\n\n <Form.Item\n label={\n <Space>\n {t('config.initialDelay')}\n <Tooltip title={t('config.initialDelayTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"initialDelay\"\n >\n <InputNumber min={0} style={{ width: '100%' }} placeholder={t('config.initialDelayPlaceholder')} />\n </Form.Item>\n </FormSection>\n );\n};\n\n","import React from 'react';\nimport { Form, InputNumber, Input, Select, Switch, Divider } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { FormSection } from '../../../components/forms/FormSection';\n\nconst { Option } = Select;\n\nexport const NetworkConfigForm: React.FC = () => {\n const { t } = useTranslation();\n\n return (\n <FormSection title={t('config.tabNetwork')}>\n <Form.Item label={t('config.networkTimeout')} name={['network', 'timeoutMs']}>\n <InputNumber min={1000} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item label={t('config.networkRetries')} name={['network', 'retries']}>\n <InputNumber min={0} max={10} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item label={t('config.networkRetryDelay')} name={['network', 'retryDelay']}>\n <InputNumber min={0} style={{ width: '100%' }} />\n </Form.Item>\n\n <Divider>{t('config.proxySettings')}</Divider>\n\n <Form.Item label={t('config.proxyEnabled')} name={['network', 'proxy', 'enabled']} valuePropName=\"checked\">\n <Switch />\n </Form.Item>\n\n <Form.Item\n noStyle\n shouldUpdate={(prevValues, currentValues) =>\n prevValues.network?.proxy?.enabled !== currentValues.network?.proxy?.enabled\n }\n >\n {({ getFieldValue }) =>\n getFieldValue(['network', 'proxy', 'enabled']) ? (\n <>\n <Form.Item label={t('config.proxyHost')} name={['network', 'proxy', 'host']}>\n <Input />\n </Form.Item>\n <Form.Item label={t('config.proxyPort')} name={['network', 'proxy', 'port']}>\n <InputNumber min={1} max={65535} style={{ width: '100%' }} />\n </Form.Item>\n <Form.Item label={t('config.proxyProtocol')} name={['network', 'proxy', 'protocol']}>\n <Select>\n <Option value=\"http\">HTTP</Option>\n <Option value=\"https\">HTTPS</Option>\n <Option value=\"socks4\">SOCKS4</Option>\n <Option value=\"socks5\">SOCKS5</Option>\n </Select>\n </Form.Item>\n <Form.Item label={t('config.proxyUsername')} name={['network', 'proxy', 'username']}>\n <Input />\n </Form.Item>\n <Form.Item label={t('config.proxyPassword')} name={['network', 'proxy', 'password']}>\n <Input.Password />\n </Form.Item>\n </>\n ) : null\n }\n </Form.Item>\n </FormSection>\n );\n};\n\n","import React from 'react';\nimport { Form, Input, Select } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { FormSection } from '../../../components/forms/FormSection';\n\nconst { Option, OptGroup } = Select;\n\nexport const StorageConfigForm: React.FC = () => {\n const { t } = useTranslation();\n\n return (\n <FormSection title={t('config.tabStorage')}>\n <Form.Item label={t('config.storageDatabasePath')} name={['storage', 'databasePath']}>\n <Input />\n </Form.Item>\n\n <Form.Item label={t('config.storageDownloadDirectory')} name={['storage', 'downloadDirectory']}>\n <Input />\n </Form.Item>\n\n <Form.Item label={t('config.storageIllustrationDirectory')} name={['storage', 'illustrationDirectory']}>\n <Input />\n </Form.Item>\n\n <Form.Item label={t('config.storageNovelDirectory')} name={['storage', 'novelDirectory']}>\n <Input />\n </Form.Item>\n\n <Form.Item \n label={t('config.storageIllustrationOrganization')} \n name={['storage', 'illustrationOrganization']}\n tooltip={t('config.storageIllustrationOrganizationTooltip')}\n >\n <Select>\n <OptGroup label={t('config.organizationGroupSimple')}>\n <Option value=\"flat\">{t('config.organizationFlat')}</Option>\n <Option value=\"byAuthor\">{t('config.organizationByAuthor')}</Option>\n <Option value=\"byTag\">{t('config.organizationByTag')}</Option>\n </OptGroup>\n <OptGroup label={t('config.organizationGroupDate')}>\n <Option value=\"byDate\">{t('config.organizationByDate')}</Option>\n <Option value=\"byDay\">{t('config.organizationByDay')}</Option>\n <Option value=\"byDownloadDate\">{t('config.organizationByDownloadDate')}</Option>\n <Option value=\"byDownloadDay\">{t('config.organizationByDownloadDay')}</Option>\n </OptGroup>\n <OptGroup label={t('config.organizationGroupCombined')}>\n <Option value=\"byAuthorAndTag\">{t('config.organizationByAuthorAndTag')}</Option>\n <Option value=\"byDateAndAuthor\">{t('config.organizationByDateAndAuthor')}</Option>\n <Option value=\"byDayAndAuthor\">{t('config.organizationByDayAndAuthor')}</Option>\n <Option value=\"byDownloadDateAndAuthor\">{t('config.organizationByDownloadDateAndAuthor')}</Option>\n <Option value=\"byDownloadDayAndAuthor\">{t('config.organizationByDownloadDayAndAuthor')}</Option>\n </OptGroup>\n </Select>\n </Form.Item>\n\n <Form.Item \n label={t('config.storageNovelOrganization')} \n name={['storage', 'novelOrganization']}\n tooltip={t('config.storageNovelOrganizationTooltip')}\n >\n <Select>\n <OptGroup label={t('config.organizationGroupSimple')}>\n <Option value=\"flat\">{t('config.organizationFlat')}</Option>\n <Option value=\"byAuthor\">{t('config.organizationByAuthor')}</Option>\n <Option value=\"byTag\">{t('config.organizationByTag')}</Option>\n </OptGroup>\n <OptGroup label={t('config.organizationGroupDate')}>\n <Option value=\"byDate\">{t('config.organizationByDate')}</Option>\n <Option value=\"byDay\">{t('config.organizationByDay')}</Option>\n <Option value=\"byDownloadDate\">{t('config.organizationByDownloadDate')}</Option>\n <Option value=\"byDownloadDay\">{t('config.organizationByDownloadDay')}</Option>\n </OptGroup>\n <OptGroup label={t('config.organizationGroupCombined')}>\n <Option value=\"byAuthorAndTag\">{t('config.organizationByAuthorAndTag')}</Option>\n <Option value=\"byDateAndAuthor\">{t('config.organizationByDateAndAuthor')}</Option>\n <Option value=\"byDayAndAuthor\">{t('config.organizationByDayAndAuthor')}</Option>\n <Option value=\"byDownloadDateAndAuthor\">{t('config.organizationByDownloadDateAndAuthor')}</Option>\n <Option value=\"byDownloadDayAndAuthor\">{t('config.organizationByDownloadDayAndAuthor')}</Option>\n </OptGroup>\n </Select>\n </Form.Item>\n </FormSection>\n );\n};\n\n","import React from 'react';\nimport { Form, Switch, Input, InputNumber } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { FormSection } from '../../../components/forms/FormSection';\n\nexport const SchedulerConfigForm: React.FC = () => {\n const { t } = useTranslation();\n\n return (\n <FormSection title={t('config.tabScheduler')}>\n <Form.Item label={t('config.schedulerEnabled')} name={['scheduler', 'enabled']} valuePropName=\"checked\">\n <Switch />\n </Form.Item>\n\n <Form.Item label={t('config.schedulerCron')} name={['scheduler', 'cron']}>\n <Input placeholder={t('config.schedulerCronPlaceholder')} />\n </Form.Item>\n\n <Form.Item label={t('config.schedulerTimezone')} name={['scheduler', 'timezone']}>\n <Input placeholder={t('config.schedulerTimezonePlaceholder')} />\n </Form.Item>\n\n <Form.Item label={t('config.schedulerMaxExecutions')} name={['scheduler', 'maxExecutions']}>\n <InputNumber min={1} style={{ width: '100%' }} placeholder={t('config.schedulerMaxExecutionsPlaceholder')} />\n </Form.Item>\n\n <Form.Item label={t('config.schedulerMinInterval')} name={['scheduler', 'minInterval']}>\n <InputNumber min={0} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item label={t('config.schedulerTimeout')} name={['scheduler', 'timeout']}>\n <InputNumber min={1000} style={{ width: '100%' }} placeholder={t('config.schedulerTimeoutPlaceholder')} />\n </Form.Item>\n </FormSection>\n );\n};\n\n","import React from 'react';\nimport { Form, InputNumber } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { FormSection } from '../../../components/forms/FormSection';\n\nexport const DownloadConfigForm: React.FC = () => {\n const { t } = useTranslation();\n\n return (\n <FormSection title={t('config.tabDownload')}>\n <Form.Item label={t('config.downloadConcurrency')} name={['download', 'concurrency']}>\n <InputNumber min={1} max={10} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item label={t('config.downloadMaxRetries')} name={['download', 'maxRetries']}>\n <InputNumber min={0} max={10} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item label={t('config.downloadRetryDelay')} name={['download', 'retryDelay']}>\n <InputNumber min={0} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item label={t('config.downloadTimeout')} name={['download', 'timeout']}>\n <InputNumber min={1000} style={{ width: '100%' }} />\n </Form.Item>\n </FormSection>\n );\n};\n\n","import React, { useState, useEffect } from 'react';\nimport { Modal, Form, Input, InputNumber, Select, Steps, Collapse, Card, Button, Space, Tooltip, Typography } from 'antd';\nimport { QuestionCircleOutlined, ThunderboltOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { TargetConfig } from './targets/types';\n\nconst { Option } = Select;\nconst { Panel } = Collapse;\nconst { Step } = Steps;\nconst { Text, Paragraph } = Typography;\n\ninterface TargetModalProps {\n visible: boolean;\n editingTarget: TargetConfig | null;\n onSave: (values: TargetConfig) => void;\n onCancel: () => void;\n}\n\nexport const TargetModal: React.FC<TargetModalProps> = ({\n visible,\n editingTarget,\n onSave,\n onCancel,\n}) => {\n const { t } = useTranslation();\n const [form] = Form.useForm();\n const [targetStep, setTargetStep] = useState(0);\n\n // 配置模板\n const configTemplates = {\n tagSearch: {\n name: t('config.templateTagSearch'),\n description: t('config.templateTagSearchDesc'),\n config: {\n type: 'illustration',\n mode: 'search',\n tag: '',\n limit: 20,\n searchTarget: 'partial_match_for_tags',\n sort: 'date_desc',\n },\n },\n ranking: {\n name: t('config.templateRanking'),\n description: t('config.templateRankingDesc'),\n config: {\n type: 'illustration',\n mode: 'ranking',\n rankingMode: 'day',\n limit: 30,\n },\n },\n multiTag: {\n name: t('config.templateMultiTag'),\n description: t('config.templateMultiTagDesc'),\n config: {\n type: 'illustration',\n mode: 'search',\n tag: '',\n limit: 30,\n searchTarget: 'partial_match_for_tags',\n },\n },\n highQuality: {\n name: t('config.templateHighQuality'),\n description: t('config.templateHighQualityDesc'),\n config: {\n type: 'illustration',\n mode: 'search',\n tag: '',\n limit: 20,\n minBookmarks: 1000,\n sort: 'popular_desc',\n },\n },\n novel: {\n name: t('config.templateNovel'),\n description: t('config.templateNovelDesc'),\n config: {\n type: 'novel',\n mode: 'search',\n tag: '',\n limit: 10,\n },\n },\n };\n\n useEffect(() => {\n if (visible) {\n if (editingTarget) {\n form.setFieldsValue(editingTarget);\n setTargetStep(1);\n } else {\n form.resetFields();\n setTargetStep(0);\n }\n }\n }, [visible, editingTarget, form]);\n\n const handleApplyTemplate = (template: typeof configTemplates[keyof typeof configTemplates]) => {\n form.setFieldsValue(template.config);\n setTargetStep(1);\n };\n\n const handleOk = async () => {\n try {\n const values = await form.validateFields();\n onSave(values);\n form.resetFields();\n setTargetStep(0);\n } catch (error) {\n // Validation errors are handled by Ant Design\n }\n };\n\n const handleCancel = () => {\n form.resetFields();\n setTargetStep(0);\n onCancel();\n };\n\n return (\n <Modal\n title={\n <Space>\n {editingTarget ? t('config.editTarget') : t('config.addTarget')}\n {!editingTarget && (\n <Tooltip title={t('config.templateTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n )}\n </Space>\n }\n open={visible}\n onOk={handleOk}\n onCancel={handleCancel}\n width={800}\n okText={t('common.save')}\n cancelText={t('common.cancel')}\n >\n <Steps current={targetStep} style={{ marginBottom: 24 }}>\n <Step title={t('config.stepSelectTemplate')} description={t('config.stepSelectTemplateDesc')} />\n <Step title={t('config.stepConfigure')} description={t('config.stepConfigureDesc')} />\n </Steps>\n\n {targetStep === 0 && !editingTarget && (\n <div>\n <Paragraph type=\"secondary\" style={{ marginBottom: 16 }}>\n {t('config.templateSelectDescription')}\n </Paragraph>\n <Space direction=\"vertical\" style={{ width: '100%' }} size=\"middle\">\n {Object.entries(configTemplates).map(([key, template]) => (\n <Card\n key={key}\n hoverable\n style={{ cursor: 'pointer' }}\n onClick={() => handleApplyTemplate(template)}\n >\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <div>\n <Typography.Title level={5} style={{ margin: 0 }}>\n {template.name}\n </Typography.Title>\n <Text type=\"secondary\">{template.description}</Text>\n </div>\n <Button type=\"primary\" icon={<ThunderboltOutlined />}>\n {t('config.useTemplate')}\n </Button>\n </Space>\n </Card>\n ))}\n <Button\n block\n type=\"dashed\"\n onClick={() => setTargetStep(1)}\n style={{ marginTop: 8 }}\n >\n {t('config.skipTemplate')}\n </Button>\n </Space>\n </div>\n )}\n\n {targetStep === 1 && (\n <Form form={form} layout=\"vertical\">\n <Collapse defaultActiveKey={['basic']} ghost>\n <Panel header={t('config.targetBasicSettings')} key=\"basic\">\n <Form.Item\n label={\n <Space>\n {t('config.targetType')}\n <Tooltip title={t('config.targetTypeTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"type\"\n rules={[{ required: true, message: t('config.targetTypeRequired') }]}\n >\n <Select>\n <Option value=\"illustration\">{t('config.typeIllustration')}</Option>\n <Option value=\"novel\">{t('config.typeNovel')}</Option>\n </Select>\n </Form.Item>\n\n <Form.Item\n label={\n <Space>\n {t('config.targetMode')}\n <Tooltip title={t('config.targetModeTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"mode\"\n initialValue=\"search\"\n >\n <Select>\n <Option value=\"search\">{t('config.modeSearch')}</Option>\n <Option value=\"ranking\">{t('config.modeRanking')}</Option>\n </Select>\n </Form.Item>\n\n <Form.Item\n label={\n <Space>\n {t('config.targetLimit')}\n <Tooltip title={t('config.targetLimitTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"limit\"\n rules={[{ type: 'number', min: 1, max: 1000, message: t('config.targetLimitRange') }]}\n >\n <InputNumber min={1} max={1000} style={{ width: '100%' }} placeholder={t('config.targetLimitPlaceholder')} />\n </Form.Item>\n </Panel>\n\n <Panel header={t('config.targetModeSettings')} key=\"mode\">\n <Form.Item\n noStyle\n shouldUpdate={(prevValues, currentValues) => prevValues.mode !== currentValues.mode}\n >\n {({ getFieldValue }) => {\n const mode = getFieldValue('mode') || 'search';\n if (mode === 'search') {\n return (\n <>\n <Form.Item\n label={\n <Space>\n {t('config.targetTag')}\n <Tooltip title={t('config.targetTagTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"tag\"\n rules={[\n {\n validator: (_, value) => {\n if (!value || value.trim() === '') {\n return Promise.reject(new Error(t('config.targetTagRequired')));\n }\n return Promise.resolve();\n },\n },\n ]}\n >\n <Input placeholder={t('config.targetTagPlaceholder')} />\n </Form.Item>\n <Form.Item\n label={\n <Space>\n {t('config.searchTarget')}\n <Tooltip title={t('config.searchTargetTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"searchTarget\"\n initialValue=\"partial_match_for_tags\"\n >\n <Select>\n <Option value=\"partial_match_for_tags\">{t('config.searchTargetPartial')} ({t('common.recommended')})</Option>\n <Option value=\"exact_match_for_tags\">{t('config.searchTargetExact')}</Option>\n <Option value=\"title_and_caption\">{t('config.searchTargetTitle')}</Option>\n </Select>\n </Form.Item>\n <Form.Item\n label={\n <Space>\n {t('config.sort')}\n <Tooltip title={t('config.sortTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"sort\"\n initialValue=\"date_desc\"\n >\n <Select>\n <Option value=\"date_desc\">{t('config.sortDateDesc')}</Option>\n <Option value=\"date_asc\">{t('config.sortDateAsc')}</Option>\n <Option value=\"popular_desc\">{t('config.sortPopularDesc')}</Option>\n </Select>\n </Form.Item>\n </>\n );\n } else {\n return (\n <>\n <Form.Item\n label={\n <Space>\n {t('config.rankingMode')}\n <Tooltip title={t('config.rankingModeTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"rankingMode\"\n initialValue=\"day\"\n >\n <Select>\n <Option value=\"day\">{t('config.rankingDay')}</Option>\n <Option value=\"week\">{t('config.rankingWeek')}</Option>\n <Option value=\"month\">{t('config.rankingMonth')}</Option>\n <Option value=\"day_male\">{t('config.rankingDayMale')}</Option>\n <Option value=\"day_female\">{t('config.rankingDayFemale')}</Option>\n <Option value=\"day_ai\">{t('config.rankingDayAI')}</Option>\n <Option value=\"week_original\">{t('config.rankingWeekOriginal')}</Option>\n <Option value=\"week_rookie\">{t('config.rankingWeekRookie')}</Option>\n </Select>\n </Form.Item>\n <Form.Item\n label={\n <Space>\n {t('config.rankingDate')}\n <Tooltip title={t('config.rankingDateTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"rankingDate\"\n >\n <Input placeholder={t('config.rankingDatePlaceholder')} />\n </Form.Item>\n <Form.Item\n label={\n <Space>\n {t('config.filterTag')}\n <Tooltip title={t('config.filterTagTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"filterTag\"\n >\n <Input placeholder={t('config.filterTagPlaceholder')} />\n </Form.Item>\n </>\n );\n }\n }}\n </Form.Item>\n </Panel>\n\n <Panel header={t('config.targetAdvancedFilters')} key=\"advanced\">\n <Form.Item\n label={\n <Space>\n {t('config.minBookmarks')}\n <Tooltip title={t('config.minBookmarksTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"minBookmarks\"\n >\n <InputNumber min={0} style={{ width: '100%' }} placeholder={t('config.minBookmarksPlaceholder')} />\n </Form.Item>\n\n <Form.Item\n label={\n <Space>\n {t('config.startDate')}\n <Tooltip title={t('config.startDateTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"startDate\"\n >\n <Input placeholder={t('config.startDatePlaceholder')} />\n </Form.Item>\n\n <Form.Item\n label={\n <Space>\n {t('config.endDate')}\n <Tooltip title={t('config.endDateTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"endDate\"\n >\n <Input placeholder={t('config.endDatePlaceholder')} />\n </Form.Item>\n </Panel>\n </Collapse>\n </Form>\n )}\n </Modal>\n );\n};\n\n","import { Alert } from 'antd';\nimport { useTranslation } from 'react-i18next';\n\nexport function TargetsInfoAlert() {\n const { t } = useTranslation();\n\n return (\n <Alert\n message={t('config.targetsTitle')}\n description={t('config.targetsDescription')}\n type=\"info\"\n showIcon\n />\n );\n}\n\n","import { useMemo } from 'react';\nimport { Card, Table, Button, Space, Tag, Typography, Popconfirm } from 'antd';\nimport type { ColumnsType } from 'antd/es/table';\nimport { EditOutlined, DeleteOutlined, ThunderboltOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport type { TargetConfig } from './types';\n\nconst { Text } = Typography;\n\ninterface TargetsTableProps {\n targets: TargetConfig[];\n onAdd: () => void;\n onEdit: (target: TargetConfig, index: number) => void;\n onDelete: (index: number) => void;\n}\n\nexport function TargetsTable({\n targets,\n onAdd,\n onEdit,\n onDelete,\n}: TargetsTableProps) {\n const { t } = useTranslation();\n\n const columns = useMemo<ColumnsType<TargetConfig>>(() => [\n {\n title: t('config.targetType'),\n dataIndex: 'type',\n key: 'type',\n width: 100,\n render: (type: string) => (\n <Tag color={type === 'illustration' ? 'blue' : 'green'}>\n {type === 'illustration' ? t('config.typeIllustration') : t('config.typeNovel')}\n </Tag>\n ),\n },\n {\n title: t('config.targetMode'),\n dataIndex: 'mode',\n key: 'mode',\n width: 100,\n render: (mode: string) => {\n if (!mode) return '-';\n return (\n <Tag color={mode === 'ranking' ? 'purple' : 'cyan'}>\n {mode === 'ranking' ? t('config.modeRanking') : t('config.modeSearch')}\n </Tag>\n );\n },\n },\n {\n title: t('config.targetConfig'),\n key: 'config',\n render: (_: unknown, record: TargetConfig) => {\n if (record.mode === 'ranking') {\n const rankingLabels: Record<string, string> = {\n day: t('config.rankingDay'),\n week: t('config.rankingWeek'),\n month: t('config.rankingMonth'),\n day_male: t('config.rankingDayMale'),\n day_female: t('config.rankingDayFemale'),\n day_ai: t('config.rankingDayAI'),\n week_original: t('config.rankingWeekOriginal'),\n week_rookie: t('config.rankingWeekRookie'),\n };\n return (\n <Space direction=\"vertical\" size=\"small\" style={{ fontSize: 12 }}>\n <Text strong>{rankingLabels[record.rankingMode || 'day'] || record.rankingMode}</Text>\n {record.filterTag && <Text type=\"secondary\">{t('config.filterTag')}: {record.filterTag}</Text>}\n {record.rankingDate && <Text type=\"secondary\">{t('config.rankingDate')}: {record.rankingDate}</Text>}\n </Space>\n );\n }\n\n if (record.seriesId) {\n return <Text>{t('config.seriesId')}: {record.seriesId}</Text>;\n }\n\n if (record.novelId) {\n return <Text>{t('config.novelId')}: {record.novelId}</Text>;\n }\n\n return (\n <Space direction=\"vertical\" size=\"small\" style={{ fontSize: 12 }}>\n <Text strong>{record.tag || '-'}</Text>\n {record.searchTarget && (\n <Text type=\"secondary\">\n {record.searchTarget === 'partial_match_for_tags'\n ? t('config.searchTargetPartial')\n : record.searchTarget === 'exact_match_for_tags'\n ? t('config.searchTargetExact')\n : t('config.searchTargetTitle')}\n </Text>\n )}\n {record.sort && (\n <Text type=\"secondary\">\n {record.sort === 'date_desc'\n ? t('config.sortDateDesc')\n : record.sort === 'date_asc'\n ? t('config.sortDateAsc')\n : t('config.sortPopularDesc')}\n </Text>\n )}\n </Space>\n );\n },\n },\n {\n title: t('config.targetFilters'),\n key: 'filters',\n width: 150,\n render: (_: unknown, record: TargetConfig) => (\n <Space direction=\"vertical\" size=\"small\" style={{ fontSize: 12 }}>\n {record.limit && <Text>{t('config.limit')}: {record.limit}</Text>}\n {record.minBookmarks && <Text type=\"secondary\">{t('config.minBookmarks')} ≥ {record.minBookmarks}</Text>}\n {(record.startDate || record.endDate) && (\n <Text type=\"secondary\">\n {record.startDate && `${t('config.from')} ${record.startDate}`}\n {record.endDate && ` ${t('config.to')} ${record.endDate}`}\n </Text>\n )}\n </Space>\n ),\n },\n {\n title: t('common.actions'),\n key: 'action',\n width: 150,\n render: (_: unknown, record: TargetConfig, index: number) => (\n <Space>\n <Button\n type=\"link\"\n icon={<EditOutlined />}\n onClick={() => onEdit(record, index)}\n size=\"small\"\n >\n {t('common.edit')}\n </Button>\n <Popconfirm\n title={t('config.deleteTargetConfirm')}\n onConfirm={() => onDelete(index)}\n okText={t('common.ok')}\n cancelText={t('common.cancel')}\n >\n <Button\n type=\"link\"\n danger\n icon={<DeleteOutlined />}\n size=\"small\"\n >\n {t('common.delete')}\n </Button>\n </Popconfirm>\n </Space>\n ),\n },\n ], [onDelete, onEdit, t]);\n\n return (\n <Card\n title={t('config.targetsList')}\n extra={\n <Button icon={<ThunderboltOutlined />} onClick={onAdd}>\n {t('config.addTarget')}\n </Button>\n }\n >\n <Table\n columns={columns}\n dataSource={targets}\n rowKey={(record) => (\n record._rowKey\n ? record._rowKey\n : String(record._index ?? record.tag ?? record.mode ?? 'target')\n )}\n pagination={false}\n locale={{ emptyText: t('config.targetsEmpty') }}\n />\n </Card>\n );\n}\n\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Form, Space } from 'antd';\nimport type { FormInstance } from 'antd';\nimport { TargetModal } from './TargetModal';\nimport { TargetsInfoAlert } from './targets/TargetsInfoAlert';\nimport { TargetsTable } from './targets/TargetsTable';\nimport type { TargetConfig } from './targets/types';\n\ninterface TargetsConfigFormProps {\n form: FormInstance;\n onTargetChange?: () => void;\n}\n\nexport const TargetsConfigForm: React.FC<TargetsConfigFormProps> = ({\n form,\n onTargetChange,\n}) => {\n const [targetModalVisible, setTargetModalVisible] = useState(false);\n const [editingTarget, setEditingTarget] = useState<TargetConfig | null>(null);\n\n useEffect(() => {\n const currentTargets = form.getFieldValue('targets');\n if (!Array.isArray(currentTargets)) {\n form.setFieldsValue({ targets: [] });\n }\n }, [form]);\n\n const targets =\n Form.useWatch<TargetConfig[]>('targets', form) ||\n (form.getFieldValue('targets') as TargetConfig[] | undefined) ||\n [];\n\n const notifyTargetChange = useCallback(() => {\n if (onTargetChange) {\n onTargetChange();\n }\n }, [onTargetChange]);\n\n const handleAddTarget = useCallback(() => {\n setEditingTarget(null);\n setTargetModalVisible(true);\n }, []);\n\n const handleEditTarget = useCallback((target: TargetConfig, index: number) => {\n setEditingTarget({ ...target, _index: index });\n setTargetModalVisible(true);\n }, []);\n\n const handleDeleteTarget = useCallback((index: number) => {\n const currentTargets = (form.getFieldValue('targets') || []) as TargetConfig[];\n const nextTargets = currentTargets.filter((_target, idx) => idx !== index);\n form.setFieldsValue({ targets: nextTargets });\n notifyTargetChange();\n }, [form, notifyTargetChange]);\n\n const handleSaveTarget = useCallback((values: TargetConfig) => {\n const currentTargets = (form.getFieldValue('targets') || []) as TargetConfig[];\n const nextTargets = [...currentTargets];\n\n if (editingTarget && typeof editingTarget._index === 'number') {\n nextTargets[editingTarget._index] = values;\n } else {\n nextTargets.push(values);\n }\n\n form.setFieldsValue({ targets: nextTargets });\n setTargetModalVisible(false);\n setEditingTarget(null);\n notifyTargetChange();\n }, [editingTarget, form, notifyTargetChange]);\n\n const handleModalClose = useCallback(() => {\n setTargetModalVisible(false);\n setEditingTarget(null);\n }, []);\n\n const targetsWithMetadata = useMemo(\n () => targets.map((target, index) => ({\n ...target,\n _index: index,\n _rowKey: `${target.type || 'target'}-${index}`,\n })),\n [targets],\n );\n\n return (\n <>\n <Form.Item name=\"targets\" hidden>\n <input type=\"hidden\" />\n </Form.Item>\n <Space direction=\"vertical\" style={{ width: '100%' }} size=\"large\">\n <TargetsInfoAlert />\n <TargetsTable\n targets={targetsWithMetadata}\n onAdd={handleAddTarget}\n onEdit={handleEditTarget}\n onDelete={handleDeleteTarget}\n />\n </Space>\n\n <TargetModal\n visible={targetModalVisible}\n editingTarget={editingTarget}\n onSave={handleSaveTarget}\n onCancel={handleModalClose}\n />\n </>\n );\n};\n\n","import React, { useRef, useState } from 'react';\nimport { Space, Button, message } from 'antd';\nimport { CopyOutlined, CheckOutlined } from '@ant-design/icons';\n\nexport interface CodeEditorProps {\n /**\n * Code content\n */\n value: string;\n \n /**\n * Callback when code changes\n */\n onChange?: (value: string) => void;\n \n /**\n * Language mode (for syntax highlighting)\n */\n language?: 'json' | 'javascript' | 'typescript' | 'yaml' | 'xml' | 'html' | 'css' | 'text';\n \n /**\n * Whether the editor is read-only\n */\n readOnly?: boolean;\n \n /**\n * Placeholder text\n */\n placeholder?: string;\n \n /**\n * Minimum height\n */\n minHeight?: number;\n \n /**\n * Maximum height\n */\n maxHeight?: number;\n \n /**\n * Whether to show line numbers\n */\n showLineNumbers?: boolean;\n \n /**\n * Whether to show copy button\n */\n showCopyButton?: boolean;\n \n /**\n * Custom style\n */\n style?: React.CSSProperties;\n \n /**\n * Custom className\n */\n className?: string;\n}\n\n/**\n * Simple code editor component using textarea with basic formatting.\n * For more advanced features, consider using a library like Monaco Editor or CodeMirror.\n */\nexport const CodeEditor: React.FC<CodeEditorProps> = ({\n value,\n onChange,\n language = 'text',\n readOnly = false,\n placeholder = 'Enter code...',\n minHeight = 200,\n maxHeight = 600,\n showCopyButton = true,\n style,\n className,\n}) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [copied, setCopied] = useState(false);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (onChange) {\n onChange(e.target.value);\n }\n };\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n message.success('Copied to clipboard');\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n message.error('Failed to copy');\n }\n };\n\n // Format JSON on paste\n const handlePaste = (e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (language === 'json' && !readOnly) {\n const pastedText = e.clipboardData.getData('text');\n try {\n const parsed = JSON.parse(pastedText);\n const formatted = JSON.stringify(parsed, null, 2);\n e.preventDefault();\n if (onChange) {\n onChange(formatted);\n }\n } catch {\n // Not valid JSON, allow normal paste\n }\n }\n };\n\n const editorStyle: React.CSSProperties = {\n fontFamily: 'Monaco, Menlo, \"Ubuntu Mono\", Consolas, \"source-code-pro\", monospace',\n fontSize: '14px',\n lineHeight: '1.6',\n padding: '12px',\n border: '1px solid #d9d9d9',\n borderRadius: '4px',\n backgroundColor: language === 'json' ? '#1f1f1f' : '#fff',\n color: language === 'json' ? '#fff' : '#000',\n minHeight: `${minHeight}px`,\n maxHeight: `${maxHeight}px`,\n overflow: 'auto',\n resize: 'vertical',\n width: '100%',\n ...style,\n };\n\n return (\n <div className={className}>\n {showCopyButton && (\n <Space style={{ marginBottom: 8, justifyContent: 'flex-end', width: '100%' }}>\n <Button\n size=\"small\"\n icon={copied ? <CheckOutlined /> : <CopyOutlined />}\n onClick={handleCopy}\n disabled={!value}\n >\n {copied ? 'Copied' : 'Copy'}\n </Button>\n </Space>\n )}\n <textarea\n ref={textareaRef}\n value={value}\n onChange={handleChange}\n onPaste={handlePaste}\n readOnly={readOnly}\n placeholder={placeholder}\n style={editorStyle}\n spellCheck={false}\n />\n </div>\n );\n};\n\nexport default CodeEditor;\n\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Modal, Button, Space, Alert, Spin, message } from 'antd';\nimport { SaveOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { api } from '../../../services/api';\nimport { CodeEditor } from '../../../components/common/CodeEditor';\nimport { useConfigFiles } from '../../../hooks/useConfig';\nimport { extractErrorInfo, translateErrorCode } from '../../../utils/errorCodeTranslator';\nimport { QUERY_KEYS } from '../../../constants';\n\ninterface ConfigJsonEditorProps {\n visible: boolean;\n filename: string;\n onClose: () => void;\n onConfigFileSwitch?: () => void;\n}\n\nexport const ConfigJsonEditor: React.FC<ConfigJsonEditorProps> = ({\n visible,\n filename,\n onClose,\n onConfigFileSwitch,\n}) => {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const { configFiles, refetch: refetchConfigFiles } = useConfigFiles();\n const [jsonContent, setJsonContent] = useState<string>('');\n const [jsonEditorLoading, setJsonEditorLoading] = useState(false);\n const [lastReadContent, setLastReadContent] = useState<string>('');\n const [hasExternalChanges, setHasExternalChanges] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n \n const lastReadContentRef = useRef<string>('');\n const jsonContentRef = useRef<string>('');\n const isEditingRef = useRef<boolean>(false);\n\n // Load file content when modal opens\n useEffect(() => {\n if (visible && filename) {\n loadFileContent();\n } else {\n // Reset state when closing\n setJsonContent('');\n setLastReadContent('');\n setHasExternalChanges(false);\n lastReadContentRef.current = '';\n jsonContentRef.current = '';\n }\n }, [visible, filename]);\n\n // Poll for external changes (only when not editing)\n useEffect(() => {\n if (!visible || !filename || isEditingRef.current) {\n return;\n }\n\n let intervalId: NodeJS.Timeout;\n let isPolling = true;\n\n const pollFileContent = async () => {\n // Skip polling if user is editing or modal is closed\n if (!isPolling || !filename || isEditingRef.current) return;\n\n try {\n const response = await api.getConfigFileContent(filename);\n const newContent = response.data.data.content;\n const currentLastRead = lastReadContentRef.current;\n const currentEditorContent = jsonContentRef.current;\n \n // Only update if content changed and user is not editing\n if (newContent !== currentLastRead && newContent !== currentEditorContent && !isEditingRef.current) {\n setHasExternalChanges(true);\n setLastReadContent(newContent);\n lastReadContentRef.current = newContent;\n } else if (newContent === currentEditorContent) {\n setHasExternalChanges(false);\n setLastReadContent(newContent);\n lastReadContentRef.current = newContent;\n } else if (!isEditingRef.current) {\n setLastReadContent(newContent);\n lastReadContentRef.current = newContent;\n }\n } catch (error) {\n console.warn('Failed to poll config file content:', error);\n }\n };\n\n // Initial poll\n pollFileContent();\n // Poll every 5 seconds (reduced from 2 seconds) and only when not editing\n intervalId = setInterval(() => {\n if (!isEditingRef.current) {\n pollFileContent();\n }\n }, 5000);\n\n return () => {\n isPolling = false;\n if (intervalId) {\n clearInterval(intervalId);\n }\n };\n }, [visible, filename, isEditing]);\n\n // Sync refs\n useEffect(() => {\n lastReadContentRef.current = lastReadContent;\n }, [lastReadContent]);\n\n useEffect(() => {\n jsonContentRef.current = jsonContent;\n }, [jsonContent]);\n\n // Sync isEditing ref\n useEffect(() => {\n isEditingRef.current = isEditing;\n }, [isEditing]);\n\n const loadFileContent = async () => {\n try {\n setJsonEditorLoading(true);\n const response = await api.getConfigFileContent(filename);\n const content = response.data.data.content;\n setJsonContent(content);\n setLastReadContent(content);\n lastReadContentRef.current = content;\n jsonContentRef.current = content;\n setHasExternalChanges(false);\n } catch (error) {\n const { message: errorMessage } = extractErrorInfo(error);\n const errorMsg = error instanceof Error ? error.message : undefined;\n message.error(\n `${t('config.configFileReadFailed')}: ${errorMessage || errorMsg || t('config.unknownError')}`\n );\n } finally {\n setJsonEditorLoading(false);\n }\n };\n\n const handleRefresh = async () => {\n await loadFileContent();\n message.success(t('config.jsonEditorRefreshed'));\n };\n\n const handleSave = async () => {\n if (!filename) return;\n \n try {\n setJsonEditorLoading(true);\n \n // Validate JSON first\n try {\n JSON.parse(jsonContent);\n } catch (error) {\n message.error(t('config.jsonFormatError'));\n return;\n }\n \n await api.updateConfigFileContent(filename, jsonContent);\n message.success(t('config.configSaved'));\n \n // Update last read content\n setLastReadContent(jsonContent);\n lastReadContentRef.current = jsonContent;\n jsonContentRef.current = jsonContent;\n setHasExternalChanges(false);\n setIsEditing(false);\n isEditingRef.current = false;\n \n // Refresh config data\n await queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG });\n await queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG_FILES });\n refetchConfigFiles();\n \n // If this is the active config, reload the page\n const currentFile = configFiles?.find(\n (f) => f.filename === filename && f.isActive\n );\n if (currentFile) {\n if (onConfigFileSwitch) {\n onConfigFileSwitch();\n } else {\n setTimeout(() => {\n window.location.reload();\n }, 1000);\n }\n } else {\n onClose();\n }\n } catch (error) {\n const { errorCode, message: errorMessage, details } = extractErrorInfo(error);\n if (errorCode === 'CONFIG_INVALID' && details && Array.isArray(details)) {\n const errorMessages = details.map((err: unknown) => {\n if (typeof err === 'object' && err !== null && 'code' in err) {\n const errObj = err as { code: string; params?: Record<string, unknown> };\n return translateErrorCode(errObj.code, t, errObj.params);\n }\n return String(err);\n });\n message.error(`${translateErrorCode(errorCode, t)}: ${errorMessages.join(', ')}`);\n } else {\n message.error(errorMessage || t('config.configSaveFailed'));\n }\n } finally {\n setJsonEditorLoading(false);\n }\n };\n\n const handleFormat = () => {\n try {\n const parsed = JSON.parse(jsonContent);\n const formatted = JSON.stringify(parsed, null, 2);\n setJsonContent(formatted);\n message.success(t('config.jsonFormatted'));\n } catch (error) {\n message.error(t('config.jsonFormatError'));\n }\n };\n\n return (\n <Modal\n title={\n <Space>\n {t('config.editJson')}\n <span style={{ color: '#999', fontSize: 14 }}>({filename})</span>\n </Space>\n }\n open={visible}\n onCancel={onClose}\n width={900}\n footer={[\n <Button key=\"format\" onClick={handleFormat}>\n {t('config.formatJson')}\n </Button>,\n <Button key=\"cancel\" onClick={onClose}>\n {t('common.cancel')}\n </Button>,\n <Button\n key=\"save\"\n type=\"primary\"\n icon={<SaveOutlined />}\n loading={jsonEditorLoading}\n onClick={handleSave}\n >\n {t('config.saveConfig')}\n </Button>,\n ]}\n >\n <Spin spinning={jsonEditorLoading && !jsonContent}>\n {hasExternalChanges && (\n <Alert\n message={t('config.jsonEditorExternalChanges')}\n description={t('config.jsonEditorExternalChangesDesc')}\n type=\"warning\"\n showIcon\n style={{ marginBottom: 16 }}\n action={\n <Button size=\"small\" onClick={handleRefresh}>\n {t('config.refresh')}\n </Button>\n }\n />\n )}\n <CodeEditor\n value={jsonContent}\n onChange={(value) => {\n setJsonContent(value);\n setIsEditing(true);\n isEditingRef.current = true;\n if (hasExternalChanges && value !== lastReadContent) {\n setHasExternalChanges(false);\n }\n }}\n language=\"json\"\n minHeight={400}\n maxHeight={600}\n placeholder={t('config.jsonEditorPlaceholder')}\n />\n <Alert\n message={t('config.jsonEditorWarning')}\n type=\"warning\"\n showIcon\n style={{ marginTop: 16 }}\n />\n </Spin>\n </Modal>\n );\n};\n\n","import React, { useState } from 'react';\nimport { Card, Table, Button, Space, Tag, Typography, Alert, Popconfirm, message } from 'antd';\nimport { EditOutlined, PlayCircleOutlined, DeleteOutlined, ReloadOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { useConfigFiles } from '../../../hooks/useConfig';\nimport { useErrorHandler } from '../../../hooks/useErrorHandler';\nimport { extractErrorInfo } from '../../../utils/errorCodeTranslator';\nimport { ConfigJsonEditor } from './ConfigJsonEditor';\n\nconst { Text } = Typography;\n\ninterface ConfigFile {\n filename: string;\n path: string;\n pathRelative: string;\n modifiedTime: string;\n size: number;\n isActive: boolean;\n}\n\ninterface ConfigFilesManagerProps {\n onConfigFileSwitch?: () => void;\n onJsonEditorOpen?: (filename: string) => void;\n}\n\nexport const ConfigFilesManager: React.FC<ConfigFilesManagerProps> = ({\n onConfigFileSwitch,\n onJsonEditorOpen,\n}) => {\n const { t } = useTranslation();\n const { configFiles, isLoading, refetch, switchFileAsync, deleteFileAsync } = useConfigFiles();\n const { handleError } = useErrorHandler();\n const [jsonEditorVisible, setJsonEditorVisible] = useState(false);\n const [editingConfigFile, setEditingConfigFile] = useState<string | null>(null);\n\n const handleEditJson = async (filename: string) => {\n if (onJsonEditorOpen) {\n onJsonEditorOpen(filename);\n return;\n }\n\n try {\n setEditingConfigFile(filename);\n setJsonEditorVisible(true);\n } catch (error: unknown) {\n const { message: errorMessage } = extractErrorInfo(error);\n const errorObj = error instanceof Error ? error : null;\n message.error(\n `${t('config.configFileReadFailed')}: ${errorMessage || errorObj?.message || t('config.unknownError')}`\n );\n }\n };\n\n const handleSwitchFile = async (file: ConfigFile) => {\n if (file.isActive) return;\n\n try {\n await switchFileAsync(file.path);\n message.success(t('config.configSwitched'));\n if (onConfigFileSwitch) {\n onConfigFileSwitch();\n }\n } catch (error: unknown) {\n handleError(error);\n }\n };\n\n const handleDeleteFile = async (filename: string) => {\n try {\n await deleteFileAsync(filename);\n message.success(t('config.configFileDeleted'));\n refetch();\n } catch (error: unknown) {\n handleError(error);\n }\n };\n\n const columns = [\n {\n title: t('config.fileName'),\n dataIndex: 'filename',\n key: 'filename',\n render: (filename: string, record: ConfigFile) => (\n <Space>\n <Text strong={record.isActive}>{filename}</Text>\n {record.isActive && <Tag color=\"green\">{t('config.activeConfig')}</Tag>}\n </Space>\n ),\n },\n {\n title: t('config.filePath'),\n dataIndex: 'pathRelative',\n key: 'pathRelative',\n render: (path: string) => <Text type=\"secondary\" style={{ fontSize: 12 }}>{path}</Text>,\n },\n {\n title: t('config.fileModified'),\n dataIndex: 'modifiedTime',\n key: 'modifiedTime',\n render: (date: string) => new Date(date).toLocaleString(),\n },\n {\n title: t('config.fileSize'),\n dataIndex: 'size',\n key: 'size',\n render: (size: number) => `${(size / 1024).toFixed(2)} KB`,\n },\n {\n title: t('common.actions'),\n key: 'action',\n width: 250,\n render: (_: unknown, record: ConfigFile) => (\n <Space>\n <Button\n type=\"link\"\n icon={<EditOutlined />}\n onClick={() => handleEditJson(record.filename)}\n size=\"small\"\n >\n {t('config.editJson')}\n </Button>\n {!record.isActive && (\n <Button\n type=\"link\"\n icon={<PlayCircleOutlined />}\n onClick={() => handleSwitchFile(record)}\n size=\"small\"\n >\n {t('config.switch')}\n </Button>\n )}\n <Popconfirm\n title={t('config.deleteConfigFileConfirm')}\n onConfirm={() => handleDeleteFile(record.filename)}\n okText={t('common.ok')}\n cancelText={t('common.cancel')}\n >\n <Button\n type=\"link\"\n danger\n icon={<DeleteOutlined />}\n size=\"small\"\n >\n {t('common.delete')}\n </Button>\n </Popconfirm>\n </Space>\n ),\n },\n ];\n\n return (\n <>\n <Card\n title={t('config.configFiles')}\n extra={\n <Button icon={<ReloadOutlined />} onClick={() => refetch()}>\n {t('common.refresh')}\n </Button>\n }\n >\n {configFiles && configFiles.length > 0 ? (\n <Table\n columns={columns}\n dataSource={configFiles}\n rowKey=\"filename\"\n loading={isLoading}\n pagination={{ pageSize: 10 }}\n locale={{ emptyText: t('config.configFilesEmpty') }}\n />\n ) : (\n <Alert\n message={t('config.configFilesEmpty')}\n description={t('config.configFilesEmptyDesc')}\n type=\"info\"\n showIcon\n />\n )}\n </Card>\n\n {jsonEditorVisible && editingConfigFile && (\n <ConfigJsonEditor\n visible={jsonEditorVisible}\n filename={editingConfigFile}\n onClose={() => {\n setJsonEditorVisible(false);\n setEditingConfigFile(null);\n }}\n onConfigFileSwitch={onConfigFileSwitch}\n />\n )}\n </>\n );\n};\n\n","import React from 'react';\nimport { Card, Table, Button, Space, Tag, Typography, Alert, Popconfirm } from 'antd';\nimport { PlayCircleOutlined, DeleteOutlined, ReloadOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { useConfigHistory } from '../../../hooks/useConfig';\nimport { useErrorHandler } from '../../../hooks/useErrorHandler';\nimport { message } from 'antd';\n\nconst { Text } = Typography;\n\ninterface ConfigHistoryItem {\n id: number;\n name: string;\n description: string | null;\n created_at: string;\n updated_at: string;\n is_active: number;\n}\n\ninterface ConfigHistoryManagerProps {\n onConfigApplied?: () => void;\n}\n\nexport const ConfigHistoryManager: React.FC<ConfigHistoryManagerProps> = ({\n onConfigApplied,\n}) => {\n const { t } = useTranslation();\n const { history, isLoading, refetch, applyAsync, deleteAsync } = useConfigHistory();\n const { handleError } = useErrorHandler();\n\n const handleApply = async (id: number) => {\n try {\n await applyAsync(id);\n message.success(t('config.configApplied'));\n if (onConfigApplied) {\n onConfigApplied();\n }\n } catch (error: unknown) {\n handleError(error);\n }\n };\n\n const handleDelete = async (id: number) => {\n try {\n await deleteAsync(id);\n message.success(t('config.historyDeleted'));\n refetch();\n } catch (error: unknown) {\n handleError(error);\n }\n };\n\n const columns = [\n {\n title: t('config.historyName'),\n dataIndex: 'name',\n key: 'name',\n render: (name: string, record: ConfigHistoryItem) => (\n <Space>\n <Text strong={record.is_active === 1}>{name}</Text>\n {record.is_active === 1 && (\n <Tag color=\"green\">{t('config.activeConfig')}</Tag>\n )}\n </Space>\n ),\n },\n {\n title: t('config.historyDescription'),\n dataIndex: 'description',\n key: 'description',\n render: (desc: string | null) => desc || <Text type=\"secondary\">-</Text>,\n },\n {\n title: t('config.historyCreatedAt'),\n dataIndex: 'created_at',\n key: 'created_at',\n render: (date: string) => new Date(date).toLocaleString(),\n },\n {\n title: t('config.historyUpdatedAt'),\n dataIndex: 'updated_at',\n key: 'updated_at',\n render: (date: string) => new Date(date).toLocaleString(),\n },\n {\n title: t('common.actions'),\n key: 'action',\n width: 200,\n render: (_: unknown, record: ConfigHistoryItem) => (\n <Space>\n <Button\n type=\"link\"\n icon={<PlayCircleOutlined />}\n onClick={() => handleApply(record.id)}\n size=\"small\"\n >\n {t('config.apply')}\n </Button>\n <Popconfirm\n title={t('config.deleteHistoryConfirm')}\n onConfirm={() => handleDelete(record.id)}\n okText={t('common.ok')}\n cancelText={t('common.cancel')}\n >\n <Button\n type=\"link\"\n danger\n icon={<DeleteOutlined />}\n size=\"small\"\n >\n {t('common.delete')}\n </Button>\n </Popconfirm>\n </Space>\n ),\n },\n ];\n\n return (\n <Card\n title={t('config.configHistory')}\n extra={\n <Button icon={<ReloadOutlined />} onClick={() => refetch()}>\n {t('common.refresh')}\n </Button>\n }\n >\n {history && history.length > 0 ? (\n <Table\n columns={columns}\n dataSource={history}\n rowKey=\"id\"\n loading={isLoading}\n pagination={{ pageSize: 10 }}\n locale={{ emptyText: t('config.historyEmpty') }}\n />\n ) : (\n <Alert\n message={t('config.historyEmpty')}\n description={t('config.historyEmptyDesc')}\n type=\"info\"\n showIcon\n />\n )}\n </Card>\n );\n};\n\n","import { useMemo } from 'react';\nimport type { FormInstance } from 'antd';\nimport type { TabsProps } from 'antd';\nimport { Typography } from 'antd';\nimport {\n FileTextOutlined,\n HistoryOutlined,\n} from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { BasicConfigForm } from '../BasicConfigForm';\nimport { NetworkConfigForm } from '../NetworkConfigForm';\nimport { StorageConfigForm } from '../StorageConfigForm';\nimport { SchedulerConfigForm } from '../SchedulerConfigForm';\nimport { DownloadConfigForm } from '../DownloadConfigForm';\nimport { TargetsConfigForm } from '../TargetsConfigForm';\nimport { ConfigFilesManager } from '../ConfigFilesManager';\nimport { ConfigHistoryManager } from '../ConfigHistoryManager';\nimport type { ConfigFormValues } from '../../hooks';\n\nconst { Text } = Typography;\n\ninterface UseConfigTabItemsParams {\n form: FormInstance<ConfigFormValues>;\n onConfigFileSwitch: () => void;\n onJsonEditorOpen: (filename: string) => void;\n onConfigApplied: () => void;\n onTargetChange: () => void | Promise<void>;\n}\n\n/**\n * Hook that groups config tabs into form tabs and management tabs.\n */\nexport function useConfigTabItems({\n form,\n onConfigFileSwitch,\n onJsonEditorOpen,\n onConfigApplied,\n onTargetChange,\n}: UseConfigTabItemsParams) {\n const { t } = useTranslation();\n\n const managementTabItems = useMemo<TabsProps['items']>(() => [\n {\n key: 'files',\n label: (\n <>\n <FileTextOutlined /> {t('config.tabConfigFiles')}\n </>\n ),\n children: (\n <ConfigFilesManager\n onConfigFileSwitch={onConfigFileSwitch}\n onJsonEditorOpen={onJsonEditorOpen}\n />\n ),\n },\n {\n key: 'history',\n label: (\n <>\n <HistoryOutlined /> {t('config.tabHistory')}\n </>\n ),\n children: (\n <ConfigHistoryManager\n onConfigApplied={onConfigApplied}\n />\n ),\n },\n ], [onConfigApplied, onConfigFileSwitch, onJsonEditorOpen, t]);\n\n const formTabItems = useMemo<TabsProps['items']>(() => [\n {\n key: 'basic',\n label: t('config.tabBasic'),\n children: <BasicConfigForm />,\n },\n {\n key: 'pixiv',\n label: t('config.tabPixiv'),\n children: (\n <div>\n <Text type=\"secondary\">\n {t('config.pixivCredentialsHidden')}\n </Text>\n </div>\n ),\n },\n {\n key: 'network',\n label: t('config.tabNetwork'),\n children: <NetworkConfigForm />,\n },\n {\n key: 'storage',\n label: t('config.tabStorage'),\n children: <StorageConfigForm />,\n },\n {\n key: 'scheduler',\n label: t('config.tabScheduler'),\n children: <SchedulerConfigForm />,\n },\n {\n key: 'download',\n label: t('config.tabDownload'),\n children: <DownloadConfigForm />,\n },\n {\n key: 'targets',\n label: t('config.tabTargets'),\n children: (\n <TargetsConfigForm\n form={form}\n onTargetChange={onTargetChange}\n />\n ),\n },\n ], [form, onTargetChange, t]);\n\n const tabItems = useMemo<TabsProps['items']>(() => [\n ...(managementTabItems || []),\n ...(formTabItems || []),\n ], [formTabItems, managementTabItems]);\n\n return {\n managementTabItems,\n formTabItems,\n tabItems,\n };\n}\n\n\n","import { Form, Tabs } from 'antd';\nimport type { FormInstance } from 'antd';\nimport { useConfigTabItems } from './hooks/useConfigTabItems';\nimport type { ConfigFormValues } from '../hooks';\n\ninterface ConfigTabsProps {\n form: FormInstance<ConfigFormValues>;\n activeTab: string;\n onTabChange: (key: string) => void;\n onConfigFileSwitch: () => void;\n onJsonEditorOpen: (filename: string) => void;\n onConfigApplied: () => void;\n onTargetChange: () => void | Promise<void>;\n}\n\n/**\n * ConfigTabs component - Tab navigation for configuration sections\n */\nexport function ConfigTabs({\n form,\n activeTab,\n onTabChange,\n onConfigFileSwitch,\n onJsonEditorOpen,\n onConfigApplied,\n onTargetChange,\n}: ConfigTabsProps) {\n const { tabItems } = useConfigTabItems({\n form,\n onConfigFileSwitch,\n onJsonEditorOpen,\n onConfigApplied,\n onTargetChange,\n });\n\n return (\n <Form form={form} layout=\"vertical\">\n <Tabs activeKey={activeTab} onChange={onTabChange} items={tabItems} />\n </Form>\n );\n}\n\n","import { Modal, Button, message } from 'antd';\nimport { CopyOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { CodeEditor } from '../../../components/common/CodeEditor';\n\ninterface ConfigPreviewModalProps {\n visible: boolean;\n configPreview: string;\n onClose: () => void;\n}\n\n/**\n * Config preview modal component\n */\nexport function ConfigPreviewModal({\n visible,\n configPreview,\n onClose,\n}: ConfigPreviewModalProps) {\n const { t } = useTranslation();\n\n const handleCopy = () => {\n navigator.clipboard.writeText(configPreview);\n message.success(t('config.configCopied'));\n };\n\n return (\n <Modal\n title={t('config.previewConfig')}\n open={visible}\n onCancel={onClose}\n footer={[\n <Button key=\"copy\" icon={<CopyOutlined />} onClick={handleCopy}>\n {t('common.copy')}\n </Button>,\n <Button key=\"close\" onClick={onClose}>\n {t('common.close')}\n </Button>,\n ]}\n width={800}\n >\n <CodeEditor\n value={configPreview}\n readOnly\n language=\"json\"\n minHeight={400}\n maxHeight={600}\n />\n </Modal>\n );\n}\n\n","import { useTranslation } from 'react-i18next';\nimport { useConfigFiles } from '../../hooks/useConfig';\nimport { useConfigForm, useConfigOperations, useConfigModals, useConfigTabs } from './hooks';\nimport { ConfigHeader } from './components/ConfigHeader';\nimport { ConfigActions } from './components/ConfigActions';\nimport { ConfigTabs } from './components/ConfigTabs';\nimport { ConfigPreviewModal } from './components/ConfigPreviewModal';\nimport { ConfigJsonEditor } from './components/ConfigJsonEditor';\nimport { LoadingSpinner } from '../../components/common/LoadingSpinner';\n\nexport default function Config() {\n const { t } = useTranslation();\n const { activeTab, setActiveTab } = useConfigTabs();\n const {\n previewVisible,\n jsonEditorVisible,\n editingConfigFile,\n openPreview,\n closePreview,\n openJsonEditor,\n closeJsonEditor,\n } = useConfigModals();\n\n const {\n form,\n config,\n isLoading,\n isUpdating,\n isValidating,\n handleSave,\n handleValidate,\n handleTargetChange,\n getConfigPreview,\n refreshConfig,\n } = useConfigForm();\n\n const {\n handleExportConfig,\n handleImportConfig,\n handleCopyConfig,\n handleConfigFileSwitch,\n handleConfigApplied,\n isImporting,\n } = useConfigOperations(config);\n\n const { configFiles, refetch: refetchConfigFiles } = useConfigFiles();\n\n\n if (isLoading) {\n return (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px 0' }}>\n <LoadingSpinner />\n </div>\n );\n }\n\n const currentConfigPath =\n config?._meta?.configPathRelative ??\n config?._meta?.configPath ??\n t('config.unknown');\n\n return (\n <div>\n <div style={{ marginBottom: 16, width: '100%', display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', gap: 16, flexWrap: 'wrap' }}>\n <ConfigHeader\n currentConfigPath={currentConfigPath}\n configFiles={configFiles}\n onConfigFileSwitch={handleConfigFileSwitch}\n refetchConfigFiles={refetchConfigFiles}\n />\n <ConfigActions\n onRefresh={refreshConfig}\n onPreview={openPreview}\n onExport={handleExportConfig}\n onImport={handleImportConfig}\n onCopy={() => handleCopyConfig(getConfigPreview())}\n onValidate={handleValidate}\n onSave={handleSave}\n isValidating={isValidating}\n isUpdating={isUpdating}\n isImporting={isImporting}\n />\n </div>\n\n <ConfigTabs\n form={form}\n activeTab={activeTab}\n onTabChange={setActiveTab}\n onConfigFileSwitch={handleConfigFileSwitch}\n onJsonEditorOpen={openJsonEditor}\n onConfigApplied={handleConfigApplied}\n onTargetChange={handleTargetChange}\n />\n\n {/* Config Preview Modal */}\n <ConfigPreviewModal\n visible={previewVisible}\n configPreview={getConfigPreview()}\n onClose={closePreview}\n />\n\n {/* JSON Editor Modal - handled by ConfigFilesManager */}\n {jsonEditorVisible && editingConfigFile && (\n <ConfigJsonEditor\n visible={jsonEditorVisible}\n filename={editingConfigFile}\n onClose={closeJsonEditor}\n onConfigFileSwitch={handleConfigFileSwitch}\n />\n )}\n </div>\n );\n}\n\n"],"names":["UpOutlined","props","ref","AntdIcon","_extends","UpOutlinedSvg","RefIcon","React.forwardRef","supportBigInt","isEmpty","value","trimNumber","numStr","str","negative","trimStr","splitNumber","integerStr","decimalStr","negativeStr","isE","number","getNumberPrecision","precision","decimalMatch","validateNumber","num2str","num","BigIntDecimal","_classCallCheck","_defineProperty","mergedValue","trimRet","numbers","_createClass","decimalLength","clone","offset","calculator","calDecimalLen","maxDecimalLength","myAlignedDecimal","offsetAlignedDecimal","valueStr","nextDecimalLength","_trimNumber","hydrateValueStr","num1","num2","len","target","safe","NumberDecimal","maxPrecision","getMiniDecimal","toFixed","separatorStr","cutOnly","precisionDecimalStr","numberWithoutDecimal","advancedNum","advancedDecimal","proxyObject","obj","extendProps","prop","originProp","useCursor","input","focused","selectionRef","useRef","recordCursor","start","end","beforeTxt","afterTxt","restoreCursor","_selectionRef$current","startPos","beforeLastChar","newIndex","e","warning","useMobile","_useState","useState","_useState2","_slicedToArray","mobile","setMobile","useLayoutEffect","isMobile","STEP_INTERVAL","STEP_DELAY","StepHandler","_ref","prefixCls","upNode","downNode","upDisabled","downDisabled","onStep","stepTimeoutRef","React.useRef","frameIds","onStepRef","onStopStep","onStepMouseDown","up","loopStep","React.useEffect","id","raf","handlerClassName","upClassName","classNames","downClassName","safeOnStopStep","sharedHandlerProps","React.createElement","getDecupleSteps","step","stepStr","hasPoint","useFrame","idRef","cleanUp","useEffect","callback","_excluded","_excluded2","getDecimalValue","stringMode","decimalValue","getDecimalIfValidate","decimal","InternalInputNumber","className","style","min","max","_props$step","defaultValue","disabled","readOnly","upHandler","downHandler","keyboard","_props$changeOnWheel","changeOnWheel","_props$controls","controls","parser","formatter","decimalSeparator","onChange","onInput","onPressEnter","_props$changeOnBlur","changeOnBlur","domRef","inputProps","_objectWithoutProperties","inputClassName","inputRef","_React$useState","React.useState","_React$useState2","focus","setFocus","userTypingRef","compositionRef","shiftKeyRef","_React$useState3","_React$useState4","setDecimalValue","setUncontrolledDecimalValue","newDecimal","getPrecision","React.useCallback","userTyping","mergedParser","parsedStr","inputValueRef","mergedFormatter","mergedPrecision","_React$useState5","initValue","_typeof","_React$useState6","inputValue","setInternalInputValue","setInputValue","newValue","maxDecimal","React.useMemo","minDecimal","_useCursor","_useCursor2","getRangeValue","isInRange","triggerValueUpdate","updateValue","isRangeValidate","onNextPromise","collectInputValue","inputStr","finalValue","finalDecimal","nextInputStr","onCompositionStart","onCompositionEnd","onInternalInput","onInternalStep","_inputRef$current","stepDecimal","updatedValue","flushInputValue","parsedValue","formatValue","onBeforeInput","onKeyDown","event","key","shiftKey","onKeyUp","onWheel","onBlur","useLayoutUpdateEffect","currentParsedValue","clsx","composeRef","InputNumber","_props$prefixCls","prefix","suffix","addonBefore","addonAfter","rest","holderRef","inputNumberDomRef","inputFocusRef","option","triggerFocus","React.useImperativeHandle","BaseInput","prepareComponentToken","token","_a","handleVisible","handleWidth","initComponentToken","FastColor","genRadiusStyle","componentCls","borderRadiusSM","borderRadiusLG","size","borderRadius","genInputNumberStyles","lineWidth","lineType","inputFontSizeSM","inputFontSizeLG","controlHeightLG","controlHeightSM","colorError","paddingInlineSM","paddingBlockSM","paddingBlockLG","paddingInlineLG","colorIcon","motionDurationMid","handleHoverColor","handleOpacity","paddingInline","paddingBlock","handleBg","handleActiveBg","colorTextDisabled","controlWidth","handleBorderColor","filledHandleBg","lineHeightLG","calc","resetComponent","genBasicInputStyle","genOutlinedStyle","unit","genFilledStyle","genUnderlinedStyle","genBorderlessStyle","genInputGroupStyle","genOutlinedGroupStyle","genFilledGroupStyle","genPlaceholderStyle","resetIcon","genAffixWrapperStyles","inputAffixPadding","useStyle","genStyleHooks","inputNumberToken","mergeToken","initInputToken","genCompactItemStyle","__rest","s","t","p","getPrefixCls","direction","React.useContext","ConfigContext","rootClassName","customizeSize","customDisabled","customizePrefixCls","bordered","customStatus","customVariant","others","rootCls","useCSSVarCls","wrapCSSVar","hashId","cssVarCls","compactSize","compactItemClassnames","useCompactItemContext","upIcon","downIcon","DownOutlined","controlsTemp","hasFeedback","contextStatus","isFormItemInput","feedbackIcon","FormItemInputContext","mergedStatus","getMergedStatus","mergedSize","useSize","ctx","DisabledContext","mergedDisabled","variant","enableVariantCls","useVariant","suffixNode","React.Fragment","inputNumberClass","wrapperClassName","element","RcInputNumber","ContextIsolator","getStatusClassNames","TypedInputNumber","PureInputNumber","ConfigProvider","SaveOutlined","SaveOutlinedSvg","UploadOutlined","UploadOutlinedSvg","useConfigForm","useTranslation","queryClient","useQueryClient","form","Form","config","isLoading","updateAsync","validate","isUpdating","isValidating","useConfig","handleError","handleSuccess","useErrorHandler","formData","sanitizeConfigForForm","values","error","apiError","handleApiError","formattedMessage","formatConfigSaveError","payload","stripConfigMetadata","autoSaveFailedMessage","translateErrorCode","QUERY_KEYS","_meta","_validation","configWithoutMeta","data","errorMessages","detail","code","params","useLoadingState","initialState","loading","setLoading","loadingMessage","setLoadingMessage","progress","setProgress","messageKey","setMessageKey","startLoading","useCallback","msg","message","stopLoading","successMessage","updateProgress","updateMessage","useMemo","IMPORT_LOADING_KEY","useConfigOperations","refetchConfigFiles","useConfigFiles","handleWarning","isImporting","configExportPayload","handleExportConfig","jsonStr","blob","url","anchor","parseConfigFile","file","fileContent","resolve","reject","reader","parsed","normalized","handleImportConfig","files","successCount","failCount","failedFiles","lastImportedPath","configToImport","validationResult","configService","errorDetails","baseName","timestamp","importName","errorMessage","extractErrorInfo","handleCopyConfig","configJson","handleConfigFileSwitch","handleConfigApplied","useConfigModals","previewVisible","setPreviewVisible","jsonEditorVisible","setJsonEditorVisible","editingConfigFile","setEditingConfigFile","openPreview","closePreview","openJsonEditor","filename","closeJsonEditor","useConfigTabs","activeTab","setActiveTab","handleTabChange","tab","Title","Text","Typography","Option","Select","ConfigHeader","currentConfigPath","configFiles","onConfigFileSwitch","activeConfigFile","f","handleConfigFileChange","api","jsxs","jsx","Space","Tag","ConfigActions","onRefresh","onPreview","onExport","onImport","onCopy","onValidate","onSave","authenticated","useAuth","requiresAuth","loginTip","Button","ReloadOutlined","FileTextOutlined","DownloadOutlined","Tooltip","CopyOutlined","CheckCircleOutlined","Panel","Collapse","FormSection","title","description","children","collapsible","defaultCollapsed","card","extra","Card","BasicConfigForm","QuestionCircleOutlined","NetworkConfigForm","Divider","Switch","prevValues","currentValues","getFieldValue","Fragment","Input","OptGroup","StorageConfigForm","SchedulerConfigForm","DownloadConfigForm","Step","Steps","Paragraph","TargetModal","visible","editingTarget","onCancel","targetStep","setTargetStep","configTemplates","handleApplyTemplate","template","handleOk","handleCancel","Modal","ThunderboltOutlined","_","TargetsInfoAlert","Alert","TargetsTable","targets","onAdd","onEdit","onDelete","columns","type","mode","record","rankingLabels","index","EditOutlined","Popconfirm","DeleteOutlined","Table","TargetsConfigForm","onTargetChange","targetModalVisible","setTargetModalVisible","setEditingTarget","currentTargets","notifyTargetChange","handleAddTarget","handleEditTarget","handleDeleteTarget","nextTargets","_target","idx","handleSaveTarget","handleModalClose","targetsWithMetadata","CodeEditor","language","placeholder","minHeight","maxHeight","showCopyButton","textareaRef","copied","setCopied","handleChange","handleCopy","handlePaste","pastedText","formatted","editorStyle","CheckOutlined","ConfigJsonEditor","onClose","jsonContent","setJsonContent","jsonEditorLoading","setJsonEditorLoading","lastReadContent","setLastReadContent","hasExternalChanges","setHasExternalChanges","isEditing","setIsEditing","lastReadContentRef","jsonContentRef","isEditingRef","loadFileContent","intervalId","isPolling","pollFileContent","newContent","currentLastRead","currentEditorContent","content","errorMsg","handleRefresh","handleSave","errorCode","details","err","errObj","handleFormat","Spin","ConfigFilesManager","onJsonEditorOpen","refetch","switchFileAsync","deleteFileAsync","handleEditJson","errorObj","handleSwitchFile","handleDeleteFile","path","date","PlayCircleOutlined","ConfigHistoryManager","onConfigApplied","history","applyAsync","deleteAsync","useConfigHistory","handleApply","handleDelete","name","desc","useConfigTabItems","managementTabItems","HistoryOutlined","formTabItems","tabItems","ConfigTabs","onTabChange","Tabs","ConfigPreviewModal","configPreview","Config","handleValidate","handleTargetChange","getConfigPreview","refreshConfig","LoadingSpinner"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]}