pixivflow 2.0.38 → 2.0.39

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 (110) hide show
  1. package/dist/commands/DownloadCommand.d.ts.map +1 -1
  2. package/dist/commands/DownloadCommand.js +50 -2
  3. package/dist/commands/DownloadCommand.js.map +1 -1
  4. package/dist/config/validation.d.ts.map +1 -1
  5. package/dist/config/validation.js +11 -3
  6. package/dist/config/validation.js.map +1 -1
  7. package/dist/index.js +37 -14
  8. package/dist/index.js.map +1 -1
  9. package/dist/package.json +1 -1
  10. package/dist/pixiv/AuthClient.d.ts.map +1 -1
  11. package/dist/pixiv/AuthClient.js +56 -7
  12. package/dist/pixiv/AuthClient.js.map +1 -1
  13. package/dist/storage/Database.d.ts +22 -0
  14. package/dist/storage/Database.d.ts.map +1 -1
  15. package/dist/storage/Database.js +19 -0
  16. package/dist/storage/Database.js.map +1 -1
  17. package/dist/storage/DatabaseMigration.d.ts.map +1 -1
  18. package/dist/storage/DatabaseMigration.js +29 -0
  19. package/dist/storage/DatabaseMigration.js.map +1 -1
  20. package/dist/storage/repositories/TaskHistoryRepository.d.ts +61 -0
  21. package/dist/storage/repositories/TaskHistoryRepository.d.ts.map +1 -0
  22. package/dist/storage/repositories/TaskHistoryRepository.js +171 -0
  23. package/dist/storage/repositories/TaskHistoryRepository.js.map +1 -0
  24. package/dist/utils/errors.js +11 -11
  25. package/dist/utils/errors.js.map +1 -1
  26. package/dist/utils/pixiv-url-parser.d.ts +7 -1
  27. package/dist/utils/pixiv-url-parser.d.ts.map +1 -1
  28. package/dist/utils/pixiv-url-parser.js +75 -8
  29. package/dist/utils/pixiv-url-parser.js.map +1 -1
  30. package/dist/utils/token-manager.d.ts.map +1 -1
  31. package/dist/utils/token-manager.js +73 -5
  32. package/dist/utils/token-manager.js.map +1 -1
  33. package/dist/webui/package.json +1 -1
  34. package/dist/webui/routes/download.d.ts.map +1 -1
  35. package/dist/webui/routes/download.js +2 -0
  36. package/dist/webui/routes/download.js.map +1 -1
  37. package/dist/webui/routes/handlers/download-basic-handlers.d.ts +11 -0
  38. package/dist/webui/routes/handlers/download-basic-handlers.d.ts.map +1 -1
  39. package/dist/webui/routes/handlers/download-basic-handlers.js +199 -8
  40. package/dist/webui/routes/handlers/download-basic-handlers.js.map +1 -1
  41. package/dist/webui/services/DownloadTaskManager.d.ts.map +1 -1
  42. package/dist/webui/services/DownloadTaskManager.js +75 -3
  43. package/dist/webui/services/DownloadTaskManager.js.map +1 -1
  44. package/package.json +1 -1
  45. package/dist/webui/assets/ActionButton-DWq-fh3_.js +0 -2
  46. package/dist/webui/assets/ActionButton-DWq-fh3_.js.map +0 -1
  47. package/dist/webui/assets/CheckCircleOutlined-Can0-7ew.js +0 -2
  48. package/dist/webui/assets/CheckCircleOutlined-Can0-7ew.js.map +0 -1
  49. package/dist/webui/assets/CloseCircleOutlined-DfRmL2eG.js +0 -2
  50. package/dist/webui/assets/CloseCircleOutlined-DfRmL2eG.js.map +0 -1
  51. package/dist/webui/assets/Config-D9TWUGQR.js +0 -16
  52. package/dist/webui/assets/Config-D9TWUGQR.js.map +0 -1
  53. package/dist/webui/assets/Dashboard-CaGAH0y2.js +0 -2
  54. package/dist/webui/assets/Dashboard-CaGAH0y2.js.map +0 -1
  55. package/dist/webui/assets/DeleteOutlined-u-P2SpoK.js +0 -2
  56. package/dist/webui/assets/DeleteOutlined-u-P2SpoK.js.map +0 -1
  57. package/dist/webui/assets/Download-D9E4xrnM.js +0 -2
  58. package/dist/webui/assets/Download-D9E4xrnM.js.map +0 -1
  59. package/dist/webui/assets/Files-CKyc_PdW.js +0 -5
  60. package/dist/webui/assets/Files-CKyc_PdW.js.map +0 -1
  61. package/dist/webui/assets/PictureOutlined-C8Lbucj1.js +0 -2
  62. package/dist/webui/assets/PictureOutlined-C8Lbucj1.js.map +0 -1
  63. package/dist/webui/assets/SortDescendingOutlined-CR-hdhyW.js +0 -2
  64. package/dist/webui/assets/SortDescendingOutlined-CR-hdhyW.js.map +0 -1
  65. package/dist/webui/assets/ThunderboltOutlined-CiiB2de5.js +0 -2
  66. package/dist/webui/assets/ThunderboltOutlined-CiiB2de5.js.map +0 -1
  67. package/dist/webui/assets/UrlDownload-ClkUOXN_.js +0 -3
  68. package/dist/webui/assets/UrlDownload-ClkUOXN_.js.map +0 -1
  69. package/dist/webui/assets/dateUtils-CBk8bEa_.js +0 -2
  70. package/dist/webui/assets/dateUtils-CBk8bEa_.js.map +0 -1
  71. package/dist/webui/assets/errorCodeTranslator-DWsWq6B3.js +0 -3
  72. package/dist/webui/assets/errorCodeTranslator-DWsWq6B3.js.map +0 -1
  73. package/dist/webui/assets/index-BFgUdwJv.js +0 -214
  74. package/dist/webui/assets/index-BFgUdwJv.js.map +0 -1
  75. package/dist/webui/assets/index-CN3FylAF.js +0 -2
  76. package/dist/webui/assets/index-CN3FylAF.js.map +0 -1
  77. package/dist/webui/assets/index-CSoUPZat.js +0 -2
  78. package/dist/webui/assets/index-CSoUPZat.js.map +0 -1
  79. package/dist/webui/assets/index-CiHwNwrk.js +0 -19
  80. package/dist/webui/assets/index-CiHwNwrk.js.map +0 -1
  81. package/dist/webui/assets/index-DHwJxrFi.css +0 -1
  82. package/dist/webui/assets/index-DTU-FGA4.js +0 -2
  83. package/dist/webui/assets/index-DTU-FGA4.js.map +0 -1
  84. package/dist/webui/assets/index-DjpD0HQ5.js +0 -2
  85. package/dist/webui/assets/index-DjpD0HQ5.js.map +0 -1
  86. package/dist/webui/assets/index-Dycn6xoz.js +0 -2
  87. package/dist/webui/assets/index-Dycn6xoz.js.map +0 -1
  88. package/dist/webui/assets/index-G0EJCamt.js +0 -22
  89. package/dist/webui/assets/index-G0EJCamt.js.map +0 -1
  90. package/dist/webui/assets/index-WaraZQH0.js +0 -2
  91. package/dist/webui/assets/index-WaraZQH0.js.map +0 -1
  92. package/dist/webui/assets/index-k2rGFxEM.js +0 -8
  93. package/dist/webui/assets/index-k2rGFxEM.js.map +0 -1
  94. package/dist/webui/assets/index-lwTtspUb.js +0 -14
  95. package/dist/webui/assets/index-lwTtspUb.js.map +0 -1
  96. package/dist/webui/assets/index-pT0W4KjK.js +0 -47
  97. package/dist/webui/assets/index-pT0W4KjK.js.map +0 -1
  98. package/dist/webui/assets/index-wvielV9A.js +0 -2
  99. package/dist/webui/assets/index-wvielV9A.js.map +0 -1
  100. package/dist/webui/assets/row-FRqVdQDX.js +0 -20
  101. package/dist/webui/assets/row-FRqVdQDX.js.map +0 -1
  102. package/dist/webui/assets/useAuth-BMt6dHSB.js +0 -9
  103. package/dist/webui/assets/useAuth-BMt6dHSB.js.map +0 -1
  104. package/dist/webui/assets/useConfig-29Ugtjk4.js +0 -9
  105. package/dist/webui/assets/useConfig-29Ugtjk4.js.map +0 -1
  106. package/dist/webui/assets/useDownload-Dt6lsP8S.js +0 -2
  107. package/dist/webui/assets/useDownload-Dt6lsP8S.js.map +0 -1
  108. package/dist/webui/assets/useErrorHandler-DWHs3RlU.js +0 -84
  109. package/dist/webui/assets/useErrorHandler-DWHs3RlU.js.map +0 -1
  110. package/dist/webui/index.html +0 -15
@@ -1,2 +0,0 @@
1
- import{a as o,u as x,Q as p,b as f,r as g,s as c,j as s,S as j,B as S,R as y,c as w,d as v}from"./index-BFgUdwJv.js";import{R as u,C as i,a as d}from"./row-FRqVdQDX.js";import{S as h}from"./index-DjpD0HQ5.js";import{R as m}from"./PictureOutlined-C8Lbucj1.js";const b={async getStatsOverview(){return(await o.getStatsOverview()).data.data},async getDownloadStats(t){return(await o.getDownloadStats(t)).data.data},async getTagStats(t){return(await o.getTagStats(t)).data.data},async getAuthorStats(t){return(await o.getAuthorStats(t)).data.data}};function R(t=5e3){const{data:e,isLoading:a,error:r,refetch:l}=x({queryKey:p.STATS_OVERVIEW,queryFn:()=>b.getStatsOverview(),refetchInterval:t});return{stats:e,isLoading:a,error:r,refetch:l}}function I(){const{t}=f(),{stats:e,isLoading:a,refetch:r}=R(),l=g.useCallback(async()=>{c.loading({content:t("dashboard.refreshingStats"),key:"refresh-stats"});try{await r(),c.success({content:t("dashboard.statsRefreshed"),key:"refresh-stats",duration:2})}catch{c.error({content:t("dashboard.refreshStatsFailed"),key:"refresh-stats",duration:2})}},[r,t]);if(a)return s.jsx(j,{size:"large",style:{display:"block",textAlign:"center",marginTop:50}});const n=e||{totalDownloads:0,illustrations:0,novels:0,recentDownloads:0};return s.jsxs("div",{children:[s.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:16},children:[s.jsx("h2",{style:{margin:0},children:t("dashboard.title")}),s.jsx(S,{icon:s.jsx(y,{}),onClick:l,loading:a,children:t("dashboard.refreshStats")})]}),s.jsxs(u,{gutter:16,style:{marginTop:24},children:[s.jsx(i,{span:8,children:s.jsx(d,{children:s.jsx(h,{title:t("dashboard.totalDownloads"),value:n.totalDownloads,prefix:s.jsx(w,{})})})}),s.jsx(i,{span:8,children:s.jsx(d,{children:s.jsx(h,{title:t("dashboard.illustrations"),value:n.illustrations,prefix:s.jsx(m,{})})})}),s.jsx(i,{span:8,children:s.jsx(d,{children:s.jsx(h,{title:t("dashboard.novels"),value:n.novels,prefix:s.jsx(v,{})})})})]}),s.jsx(u,{gutter:16,style:{marginTop:16},children:s.jsx(i,{span:24,children:s.jsx(d,{title:t("dashboard.recentDownloads"),children:s.jsx("p",{children:t("dashboard.recentDownloadsDesc",{count:n.recentDownloads})})})})})]})}export{I as default};
2
- //# sourceMappingURL=Dashboard-CaGAH0y2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Dashboard-CaGAH0y2.js","sources":["../../src/services/statsService.ts","../../src/hooks/useStats.ts","../../src/pages/Dashboard.tsx"],"sourcesContent":["import { api } from './api';\n\n/**\n * Statistics Service\n * Encapsulates all statistics-related API calls\n */\nexport const statsService = {\n /**\n * Get overview statistics\n */\n async getStatsOverview() {\n const response = await api.getStatsOverview();\n return response.data.data;\n },\n\n /**\n * Get download statistics for a period\n */\n async getDownloadStats(period?: string) {\n const response = await api.getDownloadStats(period);\n return response.data.data;\n },\n\n /**\n * Get tag statistics\n */\n async getTagStats(limit?: number) {\n const response = await api.getTagStats(limit);\n return response.data.data;\n },\n\n /**\n * Get author statistics\n */\n async getAuthorStats(limit?: number) {\n const response = await api.getAuthorStats(limit);\n return response.data.data;\n },\n};\n\n","import { useQuery } from '@tanstack/react-query';\nimport { statsService } from '../services/statsService';\nimport { QUERY_KEYS } from '../constants';\n\n/**\n * Hook for getting overview statistics\n * @param refetchInterval - Auto-refresh interval in milliseconds (default: 5000ms)\n */\nexport function useStatsOverview(refetchInterval: number | false = 5000) {\n const {\n data: stats,\n isLoading,\n error,\n refetch,\n } = useQuery({\n queryKey: QUERY_KEYS.STATS_OVERVIEW,\n queryFn: () => statsService.getStatsOverview(),\n refetchInterval: refetchInterval,\n });\n\n return {\n stats,\n isLoading,\n error,\n refetch,\n };\n}\n\n/**\n * Hook for getting download statistics\n */\nexport function useDownloadStats(period?: string) {\n const {\n data: stats,\n isLoading,\n error,\n refetch,\n } = useQuery({\n queryKey: QUERY_KEYS.STATS_DOWNLOADS(period),\n queryFn: () => statsService.getDownloadStats(period),\n });\n\n return {\n stats,\n isLoading,\n error,\n refetch,\n };\n}\n\n/**\n * Hook for getting tag statistics\n */\nexport function useTagStats(limit?: number) {\n const {\n data: stats,\n isLoading,\n error,\n refetch,\n } = useQuery({\n queryKey: QUERY_KEYS.STATS_TAGS(limit),\n queryFn: () => statsService.getTagStats(limit),\n });\n\n return {\n stats,\n isLoading,\n error,\n refetch,\n };\n}\n\n/**\n * Hook for getting author statistics\n */\nexport function useAuthorStats(limit?: number) {\n const {\n data: stats,\n isLoading,\n error,\n refetch,\n } = useQuery({\n queryKey: QUERY_KEYS.STATS_AUTHORS(limit),\n queryFn: () => statsService.getAuthorStats(limit),\n });\n\n return {\n stats,\n isLoading,\n error,\n refetch,\n };\n}\n\n","import { Card, Row, Col, Statistic, Spin, Button, message } from 'antd';\nimport { DownloadOutlined, PictureOutlined, FileTextOutlined, ReloadOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { useCallback } from 'react';\nimport { useStatsOverview } from '../hooks/useStats';\nimport { StatsOverview } from '../services/api/types';\n\nexport default function Dashboard() {\n const { t } = useTranslation();\n const { stats, isLoading, refetch: refetchStats } = useStatsOverview();\n\n // Handle refresh stats\n const handleRefreshStats = useCallback(async () => {\n message.loading({ content: t('dashboard.refreshingStats'), key: 'refresh-stats' });\n try {\n await refetchStats();\n message.success({ content: t('dashboard.statsRefreshed'), key: 'refresh-stats', duration: 2 });\n } catch (error) {\n message.error({ content: t('dashboard.refreshStatsFailed'), key: 'refresh-stats', duration: 2 });\n }\n }, [refetchStats, t]);\n\n if (isLoading) {\n return <Spin size=\"large\" style={{ display: 'block', textAlign: 'center', marginTop: 50 }} />;\n }\n\n // Extract stats data - stats is already StatsOverview | undefined from the service\n const statsData: StatsOverview = stats || {\n totalDownloads: 0,\n illustrations: 0,\n novels: 0,\n recentDownloads: 0,\n };\n\n return (\n <div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 }}>\n <h2 style={{ margin: 0 }}>{t('dashboard.title')}</h2>\n <Button \n icon={<ReloadOutlined />} \n onClick={handleRefreshStats}\n loading={isLoading}\n >\n {t('dashboard.refreshStats')}\n </Button>\n </div>\n <Row gutter={16} style={{ marginTop: 24 }}>\n <Col span={8}>\n <Card>\n <Statistic\n title={t('dashboard.totalDownloads')}\n value={statsData.totalDownloads}\n prefix={<DownloadOutlined />}\n />\n </Card>\n </Col>\n <Col span={8}>\n <Card>\n <Statistic\n title={t('dashboard.illustrations')}\n value={statsData.illustrations}\n prefix={<PictureOutlined />}\n />\n </Card>\n </Col>\n <Col span={8}>\n <Card>\n <Statistic\n title={t('dashboard.novels')}\n value={statsData.novels}\n prefix={<FileTextOutlined />}\n />\n </Card>\n </Col>\n </Row>\n <Row gutter={16} style={{ marginTop: 16 }}>\n <Col span={24}>\n <Card title={t('dashboard.recentDownloads')}>\n <p>{t('dashboard.recentDownloadsDesc', { count: statsData.recentDownloads })}</p>\n </Card>\n </Col>\n </Row>\n </div>\n );\n}\n\n"],"names":["statsService","api","period","limit","useStatsOverview","refetchInterval","stats","isLoading","error","refetch","useQuery","QUERY_KEYS","Dashboard","useTranslation","refetchStats","handleRefreshStats","useCallback","message","jsx","Spin","statsData","jsxs","Button","ReloadOutlined","Row","Col","Card","Statistic","DownloadOutlined","PictureOutlined","FileTextOutlined"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{r as e,I as a,_ as r}from"./index-BFgUdwJv.js";var l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M360 184h-8c4.4 0 8-3.6 8-8v8h304v-8c0 4.4 3.6 8 8 8h-8v72h72v-80c0-35.3-28.7-64-64-64H352c-35.3 0-64 28.7-64 64v80h72v-72zm504 72H160c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h60.4l24.7 523c1.6 34.1 29.8 61 63.9 61h454c34.2 0 62.3-26.8 63.9-61l24.7-523H888c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM731.3 840H292.7l-24.2-512h487l-24.2 512z"}}]},name:"delete",theme:"outlined"},n=function(t,c){return e.createElement(a,r({},t,{ref:c,icon:l}))},h=e.forwardRef(n);export{h as R};
2
- //# sourceMappingURL=DeleteOutlined-u-P2SpoK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeleteOutlined-u-P2SpoK.js","sources":["../../node_modules/@ant-design/icons-svg/es/asn/DeleteOutlined.js","../../node_modules/@ant-design/icons/es/icons/DeleteOutlined.js"],"sourcesContent":["// This icon file is generated automatically.\nvar DeleteOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M360 184h-8c4.4 0 8-3.6 8-8v8h304v-8c0 4.4 3.6 8 8 8h-8v72h72v-80c0-35.3-28.7-64-64-64H352c-35.3 0-64 28.7-64 64v80h72v-72zm504 72H160c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h60.4l24.7 523c1.6 34.1 29.8 61 63.9 61h454c34.2 0 62.3-26.8 63.9-61l24.7-523H888c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM731.3 840H292.7l-24.2-512h487l-24.2 512z\" } }] }, \"name\": \"delete\", \"theme\": \"outlined\" };\nexport default DeleteOutlined;\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 DeleteOutlinedSvg from \"@ant-design/icons-svg/es/asn/DeleteOutlined\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar DeleteOutlined = function DeleteOutlined(props, ref) {\n return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n ref: ref,\n icon: DeleteOutlinedSvg\n }));\n};\n\n/**![delete](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTM2MCAxODRoLThjNC40IDAgOC0zLjYgOC04djhoMzA0di04YzAgNC40IDMuNiA4IDggOGgtOHY3Mmg3MnYtODBjMC0zNS4zLTI4LjctNjQtNjQtNjRIMzUyYy0zNS4zIDAtNjQgMjguNy02NCA2NHY4MGg3MnYtNzJ6bTUwNCA3MkgxNjBjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjMyYzAgNC40IDMuNiA4IDggOGg2MC40bDI0LjcgNTIzYzEuNiAzNC4xIDI5LjggNjEgNjMuOSA2MWg0NTRjMzQuMiAwIDYyLjMtMjYuOCA2My45LTYxbDI0LjctNTIzSDg4OGM0LjQgMCA4LTMuNiA4LTh2LTMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyek03MzEuMyA4NDBIMjkyLjdsLTI0LjItNTEyaDQ4N2wtMjQuMiA1MTJ6IiAvPjwvc3ZnPg==) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(DeleteOutlined);\nif (process.env.NODE_ENV !== 'production') {\n RefIcon.displayName = 'DeleteOutlined';\n}\nexport default RefIcon;"],"names":["DeleteOutlined","props","ref","AntdIcon","_extends","DeleteOutlinedSvg","RefIcon","React.forwardRef"],"mappings":"sDACA,IAAIA,EAAiB,CAAE,KAAQ,CAAE,IAAO,MAAO,MAAS,CAAE,QAAW,gBAAiB,UAAa,OAAO,EAAI,SAAY,CAAC,CAAE,IAAO,OAAQ,MAAS,CAAE,EAAK,qVAAqV,EAAI,CAAC,EAAI,KAAQ,SAAU,MAAS,UAAU,ECM3hBA,EAAiB,SAAwBC,EAAOC,EAAK,CACvD,uBAAwCC,EAAUC,EAAS,CAAA,EAAIH,EAAO,CACpE,IAAAC,EACA,KAAMG,CAAA,CACP,CAAC,CACJ,EAGIC,EAAuBC,EAAAA,WAAiBP,CAAc","x_google_ignoreList":[0,1]}
@@ -1,2 +0,0 @@
1
- import{r as g,I as W,_ as U,b as I,j as e,c as me,V as y,X as ee,B as C,R as V,Y as D,S as we,W as N,s as j,a as se,u as ge,Q as fe}from"./index-BFgUdwJv.js";import{R as Y,u as je,a as ye,b as Te,c as Ie}from"./useDownload-Dt6lsP8S.js";import{R as ne,C as Ce,u as ve}from"./useConfig-29Ugtjk4.js";import{a as L,R as ke,C as P}from"./row-FRqVdQDX.js";import{S as B}from"./index-DjpD0HQ5.js";import{R as G}from"./CheckCircleOutlined-Can0-7ew.js";import{R as X}from"./CloseCircleOutlined-DfRmL2eG.js";import{u as Se,P as De,F as H}from"./useAuth-BMt6dHSB.js";import{T as R}from"./index-pT0W4KjK.js";import{f as b}from"./dateUtils-CBk8bEa_.js";import{D as v}from"./index-DTU-FGA4.js";import{T as F}from"./index-lwTtspUb.js";import{M as Q}from"./index-k2rGFxEM.js";import{R as te}from"./DeleteOutlined-u-P2SpoK.js";import{F as le}from"./useErrorHandler-DWHs3RlU.js";import{e as k,t as S}from"./errorCodeTranslator-DWsWq6B3.js";import"./ActionButton-DWq-fh3_.js";var be={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}},{tag:"path",attrs:{d:"M464 336a48 48 0 1096 0 48 48 0 10-96 0zm72 112h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V456c0-4.4-3.6-8-8-8z"}}]},name:"info-circle",theme:"outlined"},Re=function(c,u){return g.createElement(W,U({},c,{ref:u,icon:be}))},K=g.forwardRef(Re),$e={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M758.2 839.1C851.8 765.9 912 651.9 912 523.9 912 303 733.5 124.3 512.6 124 291.4 123.7 112 302.8 112 523.9c0 125.2 57.5 236.9 147.6 310.2 3.5 2.8 8.6 2.2 11.4-1.3l39.4-50.5c2.7-3.4 2.1-8.3-1.2-11.1-8.1-6.6-15.9-13.7-23.4-21.2a318.64 318.64 0 01-68.6-101.7C200.4 609 192 567.1 192 523.9s8.4-85.1 25.1-124.5c16.1-38.1 39.2-72.3 68.6-101.7 29.4-29.4 63.6-52.5 101.7-68.6C426.9 212.4 468.8 204 512 204s85.1 8.4 124.5 25.1c38.1 16.1 72.3 39.2 101.7 68.6 29.4 29.4 52.5 63.6 68.6 101.7 16.7 39.4 25.1 81.3 25.1 124.5s-8.4 85.1-25.1 124.5a318.64 318.64 0 01-68.6 101.7c-9.3 9.3-19.1 18-29.3 26L668.2 724a8 8 0 00-14.1 3l-39.6 162.2c-1.2 5 2.6 9.9 7.7 9.9l167 .8c6.7 0 10.5-7.7 6.3-12.9l-37.3-47.9z"}}]},name:"redo",theme:"outlined"},Me=function(c,u){return g.createElement(W,U({},c,{ref:u,icon:$e}))},Ae=g.forwardRef(Me),Fe={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372 0-89 31.3-170.8 83.5-234.8l523.3 523.3C682.8 852.7 601 884 512 884zm288.5-137.2L277.2 223.5C341.2 171.3 423 140 512 140c205.4 0 372 166.6 372 372 0 89-31.3 170.8-83.5 234.8z"}}]},name:"stop",theme:"outlined"},ze=function(c,u){return g.createElement(W,U({},c,{ref:u,icon:Fe}))},z=g.forwardRef(ze);const Le=({total:o,completed:c,failed:u,stopped:i})=>{const{t:l}=I();return e.jsx(L,{style:{marginBottom:16},children:e.jsxs(ke,{gutter:16,children:[e.jsx(P,{span:6,children:e.jsx(B,{title:l("download.totalTasks"),value:o,prefix:e.jsx(me,{})})}),e.jsx(P,{span:6,children:e.jsx(B,{title:l("download.completed"),value:c,valueStyle:{color:"#3f8600"},prefix:e.jsx(G,{})})}),e.jsx(P,{span:6,children:e.jsx(B,{title:l("download.failed"),value:u,valueStyle:{color:"#cf1322"},prefix:e.jsx(X,{})})}),e.jsx(P,{span:6,children:e.jsx(B,{title:l("download.stopped"),value:i,valueStyle:{color:"#8c8c8c"},prefix:e.jsx(z,{})})})]})})},{Text:M}=R,Oe=({hasActiveTask:o,onStartClick:c,onRunAllClick:u,onStopClick:i,isStarting:l,isRunningAll:n,isStopping:s,storage:a,onRefreshConfig:d})=>{const{t}=I(),{authenticated:h}=Se(),r=!h,p=t("common.loginRequired"),x=a?.illustrationDirectory||(a?.downloadDirectory?`${a.downloadDirectory}/illustrations`:"./downloads/illustrations"),m=a?.novelDirectory||(a?.downloadDirectory?`${a.downloadDirectory}/novels`:"./downloads/novels");return e.jsxs(L,{title:e.jsxs(y,{children:[e.jsx(K,{}),e.jsx("span",{children:t("download.taskOperations")})]}),style:{marginBottom:16},children:[e.jsxs(y,{wrap:!0,children:[e.jsx(ee,{title:r?p:void 0,children:e.jsx(C,{type:"primary",size:"large",icon:e.jsx(ne,{}),onClick:c,disabled:o||r,loading:l,children:t("download.startDownload")})}),e.jsx(ee,{title:r?p:void 0,children:e.jsx(C,{size:"large",icon:e.jsx(V,{}),onClick:u,disabled:o||r,loading:n,children:t("download.downloadAll")})}),e.jsx(C,{danger:!0,size:"large",icon:e.jsx(z,{}),onClick:i,disabled:!o,loading:s,children:t("download.stopCurrent")})]}),o&&e.jsx(D,{message:t("download.hasActiveTask"),description:t("download.hasActiveTaskDesc"),type:"info",showIcon:!0,style:{marginTop:16}}),a&&e.jsx(D,{message:e.jsxs(y,{children:[e.jsx("span",{children:t("download.fileSavePath")}),d&&e.jsx(C,{type:"text",size:"small",icon:e.jsx(V,{}),onClick:d,title:t("download.refreshPath")})]}),description:e.jsxs(y,{direction:"vertical",size:"small",style:{width:"100%"},children:[e.jsxs(M,{children:[e.jsx(M,{strong:!0,children:t("download.illustrationPath")}),x]}),e.jsxs(M,{children:[e.jsx(M,{strong:!0,children:t("download.novelPath")}),m]}),e.jsx(M,{type:"secondary",style:{fontSize:"12px"},children:t("download.pathTip")})]}),type:"info",showIcon:!0,style:{marginTop:16}})]})},Ee=({logs:o,isRunning:c=!1})=>{const{t:u}=I(),i=g.useRef(null);if(g.useEffect(()=>{i.current&&o.length>0&&i.current.scrollIntoView({behavior:"smooth"})},[o]),!o||o.length===0)return null;const l={error:"#ff4d4f",warn:"#faad14",info:"#1890ff",debug:"#8c8c8c"};return e.jsx("div",{style:{marginTop:16},children:e.jsx(Ce,{items:[{key:"logs",label:e.jsxs(y,{children:[e.jsx(K,{}),e.jsxs("span",{children:[u("download.realtimeLogs")," (",o.length," ",u("download.entries"),")"]})]}),children:e.jsxs("div",{style:{maxHeight:"400px",overflowY:"auto",backgroundColor:"#1f1f1f",padding:"12px",borderRadius:"4px",fontFamily:"monospace",fontSize:"12px",lineHeight:"1.6"},children:[o.map((n,s)=>{const a=b(n.timestamp,{hour:"2-digit",minute:"2-digit",second:"2-digit"});return e.jsxs("div",{style:{marginBottom:"4px",color:l[n.level]||"#ffffff"},children:[e.jsxs("span",{style:{color:"#8c8c8c",marginRight:"8px"},children:["[",a,"]"]}),e.jsxs("span",{style:{color:l[n.level]||"#ffffff",marginRight:"8px",fontWeight:"bold"},children:["[",n.level.toUpperCase(),"]"]}),e.jsx("span",{children:n.message})]},s)}),e.jsx("div",{ref:i})]})}],defaultActiveKey:c?["logs"]:[]})})},{Text:q}=R,Pe=({task:o,logs:c,onStop:u,isStopping:i})=>{const{t:l}=I(),n=a=>{const d={running:{color:"processing",icon:e.jsx(Y,{}),text:l("download.statusRunning")},completed:{color:"success",icon:e.jsx(G,{}),text:l("download.statusCompleted")},failed:{color:"error",icon:e.jsx(X,{}),text:l("download.statusFailed")},stopped:{color:"default",icon:e.jsx(z,{}),text:l("download.statusStopped")}},t=d[a]||d.running;return t?e.jsx(F,{color:t.color,icon:t.icon,children:t.text}):null},s=(a,d)=>{const t=new Date(a).getTime(),h=d?new Date(d).getTime():Date.now(),r=Math.floor((h-t)/1e3);if(r<60)return`${r} ${l("download.seconds")}`;if(r<3600){const p=Math.floor(r/60),x=r%60;return`${p} ${l("download.minutes")} ${x} ${l("download.seconds")}`}else{const p=Math.floor(r/3600),x=Math.floor(r%3600/60);return`${p} ${l("download.hours")} ${x} ${l("download.minutes")}`}};return e.jsxs(L,{title:e.jsxs(y,{children:[e.jsx(Y,{}),e.jsx("span",{children:l("download.currentTask")})]}),style:{marginBottom:16},extra:e.jsx(C,{danger:!0,icon:e.jsx(z,{}),onClick:u,loading:i,children:l("download.stopTask")}),children:[e.jsxs(v,{column:2,bordered:!0,children:[e.jsx(v.Item,{label:l("download.taskId"),span:1,children:e.jsx(q,{code:!0,children:o.taskId})}),e.jsx(v.Item,{label:l("download.status"),span:1,children:n(o.status)}),e.jsx(v.Item,{label:l("download.startTime"),span:1,children:b(o.startTime)}),e.jsx(v.Item,{label:l("download.duration"),span:1,children:e.jsx(q,{strong:!0,children:s(new Date(o.startTime),o.endTime?new Date(o.endTime):void 0)})}),o.progress&&e.jsxs(v.Item,{label:l("download.progress"),span:2,children:[e.jsx(De,{percent:Math.round(o.progress.current/o.progress.total*100),status:o.status==="running"?"active":"success",format:()=>`${o.progress?.current||0} / ${o.progress?.total||0}`}),o.progress.message&&e.jsx(q,{type:"secondary",style:{display:"block",marginTop:8},children:o.progress.message})]}),o.endTime&&e.jsx(v.Item,{label:l("download.endTime"),span:2,children:b(o.endTime)}),o.error&&e.jsx(v.Item,{label:l("download.errorInfo"),span:2,children:e.jsx(D,{message:o.error,type:"error",showIcon:!0})})]}),c&&c.length>0&&e.jsx(Ee,{logs:c,isRunning:o.status==="running"})]})},{Text:_}=R,Be=({tasks:o,hasActiveTask:c,onRefresh:u,onResume:i,onDelete:l,onDeleteAll:n,isResuming:s,isDeleting:a,isDeletingAll:d})=>{const{t}=I();if(!o||o.length===0)return null;const h=[{title:t("download.tag"),dataIndex:"tag",key:"tag",width:150,render:r=>e.jsx(_,{strong:!0,children:r})},{title:t("download.type"),dataIndex:"type",key:"type",width:100,render:r=>e.jsx(F,{color:r==="illustration"?"blue":"purple",children:t(r==="illustration"?"download.typeIllustration":"download.typeNovel")})},{title:t("download.incompleteStatus"),dataIndex:"status",key:"status",width:120,render:r=>{const x={failed:{color:"error",text:t("download.statusFailed")},partial:{color:"warning",text:t("download.statusPartial")}}[r]||{color:"default",text:r};return e.jsx(F,{color:x.color,children:x.text})}},{title:t("download.errorMessage"),dataIndex:"message",key:"message",ellipsis:{showTitle:!1},width:300,render:r=>{if(!r)return e.jsx(_,{type:"secondary",children:"-"});const p=r.toLowerCase();let x=null;return p.includes("401")||p.includes("unauthorized")?x=t("download.error401"):p.includes("403")||p.includes("forbidden")?x=t("download.error403"):p.includes("timeout")||p.includes("timed out")?x=t("download.errorTimeout"):p.includes("failed after")&&(x=t("download.errorRetries")),e.jsxs("div",{children:[e.jsx(_,{type:"danger",ellipsis:{tooltip:r},children:r}),x&&e.jsx("div",{style:{marginTop:4},children:e.jsxs(_,{type:"secondary",style:{fontSize:"12px"},children:["💡 ",x]})})]})}},{title:t("download.executedAt"),dataIndex:"executedAt",key:"executedAt",width:180,render:r=>b(r)},{title:t("download.actions"),key:"action",width:150,fixed:"right",render:(r,p)=>e.jsxs(y,{children:[e.jsx(C,{type:"link",icon:e.jsx(Ae,{}),onClick:()=>i(p.tag,p.type),disabled:c||s,loading:s,children:t("download.resumeDownload")}),e.jsx(C,{type:"link",danger:!0,icon:e.jsx(te,{}),onClick:()=>{Q.confirm({title:t("download.confirmDelete"),content:t("download.confirmDeleteDesc",{tag:p.tag,type:p.type==="illustration"?t("download.typeIllustration"):t("download.typeNovel")}),okText:t("common.delete"),okType:"danger",cancelText:t("common.cancel"),onOk:()=>l(p.id)})},disabled:a,loading:a,children:t("download.deleteTask")})]})}];return e.jsxs(L,{title:e.jsxs(y,{children:[e.jsx(K,{}),e.jsx("span",{children:t("download.incompleteTasks")})]}),style:{marginBottom:16},extra:e.jsxs(y,{children:[e.jsx(C,{size:"small",icon:e.jsx(V,{}),onClick:u,children:t("download.refreshList")}),e.jsx(C,{size:"small",danger:!0,icon:e.jsx(te,{}),onClick:()=>{Q.confirm({title:t("download.confirmDeleteAll"),content:t("download.confirmDeleteAllDesc",{count:o.length}),okText:t("common.delete"),okType:"danger",cancelText:t("common.cancel"),onOk:n})},loading:d,disabled:d,children:t("download.deleteAll")})]}),children:[e.jsx(D,{message:t("download.incompleteTasksFound",{count:o.length}),description:t("download.incompleteTasksDesc"),type:"warning",showIcon:!0,style:{marginBottom:16}}),e.jsx(le,{columns:h,dataSource:o,rowKey:"id",pagination:{pageSize:10,showSizeChanger:!0,showTotal:r=>t("download.totalEntries",{total:r})},size:"small",scroll:{x:800}})]})},{Text:A}=R,He=({tasks:o,isLoading:c,calculateDuration:u})=>{const{t:i}=I(),l=s=>{const a={running:{color:"processing",icon:e.jsx(Y,{}),text:i("download.statusRunning")},completed:{color:"success",icon:e.jsx(G,{}),text:i("download.statusCompleted")},failed:{color:"error",icon:e.jsx(X,{}),text:i("download.statusFailed")},stopped:{color:"default",icon:e.jsx(z,{}),text:i("download.statusStopped")}},d=a[s]||a.running;return d?e.jsx(F,{color:d.color,icon:d.icon,children:d.text}):null},n=[{title:i("download.taskId"),dataIndex:"taskId",key:"taskId",width:120,render:s=>e.jsxs(A,{code:!0,children:[s.slice(0,8),"..."]})},{title:i("download.status"),dataIndex:"status",key:"status",width:100,render:s=>l(s)},{title:i("download.duration"),key:"duration",width:120,render:(s,a)=>u(new Date(a.startTime),a.endTime?new Date(a.endTime):void 0)},{title:i("download.startTime"),dataIndex:"startTime",key:"startTime",width:180,render:s=>b(s)},{title:i("download.endTime"),dataIndex:"endTime",key:"endTime",width:180,render:s=>b(s)},{title:i("download.errorInfo"),dataIndex:"error",key:"error",ellipsis:!0,render:s=>s?e.jsx(A,{type:"danger",ellipsis:{tooltip:s},children:s}):e.jsx(A,{type:"secondary",children:"-"})}];return e.jsx(L,{title:e.jsxs(y,{children:[e.jsx(K,{}),e.jsx("span",{children:i("download.taskHistory")})]}),children:c?e.jsxs("div",{style:{textAlign:"center",padding:"40px 0"},children:[e.jsx(we,{size:"large"}),e.jsx("div",{style:{marginTop:16},children:e.jsx(A,{type:"secondary",children:i("download.loadingHistory")})})]}):o&&o.length>0?e.jsx(le,{columns:n,dataSource:o,rowKey:"taskId",pagination:{pageSize:10,showSizeChanger:!0,showTotal:s=>i("download.taskRecords",{total:s}),pageSizeOptions:["10","20","50","100"]},size:"middle",scroll:{x:1e3}}):e.jsx("div",{style:{textAlign:"center",padding:"40px 0"},children:e.jsx(A,{type:"secondary",children:i("download.noHistory")})})})},{Text:oe}=R,_e=({open:o,onCancel:c,onFinish:u,isSubmitting:i,configFiles:l=[],targets:n=[]})=>{const{t:s}=I(),[a]=H.useForm(),d=()=>{a.resetFields(),c()};return e.jsxs(Q,{title:e.jsxs(y,{children:[e.jsx(ne,{}),e.jsx("span",{children:s("download.startDownloadModal")})]}),open:o,onCancel:d,onOk:()=>a.submit(),confirmLoading:i,okText:s("common.start"),cancelText:s("common.cancel"),width:600,children:[e.jsx(D,{message:s("download.startDownloadTip"),description:s("download.startDownloadTipDesc"),type:"info",showIcon:!0,style:{marginBottom:24}}),e.jsxs(H,{form:a,onFinish:u,layout:"vertical",children:[e.jsx(H.Item,{name:"configPaths",label:s("download.selectConfigFiles"),tooltip:s("download.selectConfigFilesTooltip"),extra:s("download.selectConfigFilesExtra"),children:e.jsx(N,{mode:"multiple",placeholder:s("download.selectConfigFilesPlaceholder"),allowClear:!0,size:"large",showSearch:!0,filterOption:(t,h)=>h?.label?.toLowerCase().includes(t.toLowerCase())||!1,options:l.map(t=>({label:`${t.filename}${t.isActive?` (${s("config.activeConfig")})`:""}`,value:t.path}))})}),e.jsx(H.Item,{name:"targetId",label:s("download.selectTarget"),tooltip:s("download.selectTargetTooltip"),extra:s("download.selectTargetExtra"),children:e.jsx(N,{placeholder:s("download.selectTargetPlaceholder"),allowClear:!0,size:"large",showSearch:!0,filterOption:(t,h)=>{const r=h?.children;return(typeof r=="string"?r:String(r||"")).toLowerCase().includes(t.toLowerCase())},children:n.map((t,h)=>e.jsx(N.Option,{value:h.toString(),children:e.jsxs(y,{children:[e.jsx(F,{color:t.type==="illustration"?"blue":"purple",children:t.type==="illustration"?s("download.typeIllustration"):s("download.typeNovel")}),e.jsx(oe,{strong:!0,children:t.tag||`Target ${h+1}`}),t.limit&&e.jsxs(oe,{type:"secondary",children:["(",s("download.limit"),": ",t.limit," ",s("download.entries"),")"]})]})},h))})}),n.length===0&&e.jsx(D,{message:s("download.noTargetsFound"),description:s("download.noTargetsFoundDesc"),type:"warning",showIcon:!0})]})]})};function Ke(o,c,u,i,l){const{t:n}=I(),[s,a]=g.useState(!1),d=g.useCallback(async m=>{try{await o({targetId:m.targetId,configPaths:m.configPaths}),j.success(n("download.taskStarted")),a(!1)}catch(w){const{errorCode:f,message:T}=k(w);j.error(S(f,n,void 0,T||n("download.startFailed")))}},[o,n]),t=g.useCallback(async m=>{try{await c(m),j.success(n("download.taskStopped"))}catch(w){const{errorCode:f,message:T}=k(w);j.error(S(f,n,void 0,T||n("download.stopFailed")))}},[c,n]),h=g.useCallback(()=>{se.runAllDownloads().then(()=>{j.success(n("download.allTargetsStarted"))}).catch(m=>{const{errorCode:w,message:f}=k(m);j.error(S(w,n,void 0,f||n("download.startFailed")))})},[n]),r=g.useCallback(async(m,w)=>{try{await u({tag:m,type:w}),j.success(n("download.taskResumedWithTag",{tag:m,type:n(w==="illustration"?"download.typeIllustration":"download.typeNovel")}))}catch(f){const{errorCode:T,message:$,params:O}=k(f);j.error(S(T,n,O,$||n("download.resumeFailed")))}},[u,n]),p=g.useCallback(async m=>{try{await i(m),j.success(n("download.incompleteTaskDeleted"))}catch(w){const{errorCode:f,message:T,params:$}=k(w);j.error(S(f,n,$,T||n("download.deleteFailed")))}},[i,n]),x=g.useCallback(async()=>{try{const w=(await l())?.deletedCount||0;w===0?j.info(n("download.noIncompleteTasks")):j.success(n("download.allIncompleteTasksDeleted",{count:w}))}catch(m){const{errorCode:w,message:f,params:T}=k(m);w?j.error(S(w,n,T,f||n("download.deleteAllFailed"))):j.error(f||n("download.deleteAllFailed")),console.error("Delete all incomplete tasks error:",m)}},[l,n]);return{showStartModal:s,setShowStartModal:a,handleStart:d,handleStop:t,handleRunAll:h,handleResume:r,handleDelete:p,handleDeleteAll:x}}function Ne(o){const{t:c}=I(),u=g.useMemo(()=>{const l=o||[],n=l.filter(d=>d.status==="completed").length,s=l.filter(d=>d.status==="failed").length,a=l.filter(d=>d.status==="stopped").length;return{total:l.length,completed:n,failed:s,stopped:a}},[o]),i=g.useCallback((l,n)=>{const s=new Date(l).getTime(),a=n?new Date(n).getTime():Date.now(),d=Math.floor((a-s)/1e3);if(d<60)return`${d} ${c("download.seconds")}`;if(d<3600){const t=Math.floor(d/60),h=d%60;return`${t} ${c("download.minutes")} ${h} ${c("download.seconds")}`}else{const t=Math.floor(d/3600),h=Math.floor(d%3600/60);return`${t} ${c("download.hours")} ${h} ${c("download.minutes")}`}},[c]);return{taskStats:u,calculateDuration:i}}const{Title:qe,Paragraph:Ve}=R;function it(){const{t:o}=I(),{startAsync:c,isStarting:u,stopAsync:i,isStopping:l}=je(),{isLoading:n,hasActiveTask:s,activeTask:a,allTasks:d}=ye(void 0,2e3),t=a?.taskId,{logs:h}=Te(t,void 0,2e3),{tasks:r,refetch:p,resumeAsync:x,deleteAsync:m,deleteAllAsync:w,isResuming:f,isDeleting:T,isDeletingAll:$}=Ie(),{config:O,refetch:ae}=ve(),{data:re}=ge({queryKey:fe.CONFIG_FILES,queryFn:()=>se.listConfigFiles()}),{showStartModal:de,setShowStartModal:J,handleStart:ie,handleStop:Z,handleRunAll:ce,handleResume:ue,handleDelete:pe,handleDeleteAll:he}=Ke(c,i,x,m,w),{taskStats:E,calculateDuration:xe}=Ne(d);return e.jsxs("div",{children:[e.jsx(qe,{level:2,children:o("download.title")}),e.jsx(Ve,{type:"secondary",style:{marginBottom:24},children:o("download.description")}),e.jsx(Le,{total:E.total,completed:E.completed,failed:E.failed,stopped:E.stopped}),e.jsx(Oe,{hasActiveTask:s,onStartClick:()=>J(!0),onRunAllClick:ce,onStopClick:()=>a?.taskId&&Z(a.taskId),isStarting:u,isRunningAll:!1,isStopping:l,storage:O?.storage,onRefreshConfig:ae}),a&&e.jsx(Pe,{task:a,logs:h,onStop:()=>a.taskId&&Z(a.taskId),isStopping:l}),r&&r.length>0&&e.jsx(Be,{tasks:r,hasActiveTask:s,onRefresh:p,onResume:ue,onDelete:pe,onDeleteAll:he,isResuming:f,isDeleting:T,isDeletingAll:$}),e.jsx(He,{tasks:d||[],isLoading:n,calculateDuration:xe}),e.jsx(_e,{open:de,onCancel:()=>J(!1),onFinish:ie,isSubmitting:u,configFiles:re?.data?.data||[],targets:O?.targets||[]})]})}export{it as default};
2
- //# sourceMappingURL=Download-D9E4xrnM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Download-D9E4xrnM.js","sources":["../../node_modules/@ant-design/icons-svg/es/asn/InfoCircleOutlined.js","../../node_modules/@ant-design/icons/es/icons/InfoCircleOutlined.js","../../node_modules/@ant-design/icons-svg/es/asn/RedoOutlined.js","../../node_modules/@ant-design/icons/es/icons/RedoOutlined.js","../../node_modules/@ant-design/icons-svg/es/asn/StopOutlined.js","../../node_modules/@ant-design/icons/es/icons/StopOutlined.js","../../src/pages/Download/components/TaskStatistics.tsx","../../src/pages/Download/components/TaskActions.tsx","../../src/pages/Download/components/TaskLogsViewer.tsx","../../src/pages/Download/components/ActiveTaskCard.tsx","../../src/pages/Download/components/IncompleteTasksTable.tsx","../../src/pages/Download/components/TaskHistoryTable.tsx","../../src/pages/Download/components/StartDownloadModal.tsx","../../src/pages/Download/hooks/useDownloadOperations.ts","../../src/pages/Download/hooks/useDownloadStatistics.ts","../../src/pages/Download/Download.tsx"],"sourcesContent":["// This icon file is generated automatically.\nvar InfoCircleOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z\" } }, { \"tag\": \"path\", \"attrs\": { \"d\": \"M464 336a48 48 0 1096 0 48 48 0 10-96 0zm72 112h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V456c0-4.4-3.6-8-8-8z\" } }] }, \"name\": \"info-circle\", \"theme\": \"outlined\" };\nexport default InfoCircleOutlined;\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 InfoCircleOutlinedSvg from \"@ant-design/icons-svg/es/asn/InfoCircleOutlined\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar InfoCircleOutlined = function InfoCircleOutlined(props, ref) {\n return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n ref: ref,\n icon: InfoCircleOutlinedSvg\n }));\n};\n\n/**![info-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0wIDgyMGMtMjA1LjQgMC0zNzItMTY2LjYtMzcyLTM3MnMxNjYuNi0zNzIgMzcyLTM3MiAzNzIgMTY2LjYgMzcyIDM3Mi0xNjYuNiAzNzItMzcyIDM3MnoiIC8+PHBhdGggZD0iTTQ2NCAzMzZhNDggNDggMCAxMDk2IDAgNDggNDggMCAxMC05NiAwem03MiAxMTJoLTQ4Yy00LjQgMC04IDMuNi04IDh2MjcyYzAgNC40IDMuNiA4IDggOGg0OGM0LjQgMCA4LTMuNiA4LThWNDU2YzAtNC40LTMuNi04LTgtOHoiIC8+PC9zdmc+) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(InfoCircleOutlined);\nif (process.env.NODE_ENV !== 'production') {\n RefIcon.displayName = 'InfoCircleOutlined';\n}\nexport default RefIcon;","// This icon file is generated automatically.\nvar RedoOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M758.2 839.1C851.8 765.9 912 651.9 912 523.9 912 303 733.5 124.3 512.6 124 291.4 123.7 112 302.8 112 523.9c0 125.2 57.5 236.9 147.6 310.2 3.5 2.8 8.6 2.2 11.4-1.3l39.4-50.5c2.7-3.4 2.1-8.3-1.2-11.1-8.1-6.6-15.9-13.7-23.4-21.2a318.64 318.64 0 01-68.6-101.7C200.4 609 192 567.1 192 523.9s8.4-85.1 25.1-124.5c16.1-38.1 39.2-72.3 68.6-101.7 29.4-29.4 63.6-52.5 101.7-68.6C426.9 212.4 468.8 204 512 204s85.1 8.4 124.5 25.1c38.1 16.1 72.3 39.2 101.7 68.6 29.4 29.4 52.5 63.6 68.6 101.7 16.7 39.4 25.1 81.3 25.1 124.5s-8.4 85.1-25.1 124.5a318.64 318.64 0 01-68.6 101.7c-9.3 9.3-19.1 18-29.3 26L668.2 724a8 8 0 00-14.1 3l-39.6 162.2c-1.2 5 2.6 9.9 7.7 9.9l167 .8c6.7 0 10.5-7.7 6.3-12.9l-37.3-47.9z\" } }] }, \"name\": \"redo\", \"theme\": \"outlined\" };\nexport default RedoOutlined;\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 RedoOutlinedSvg from \"@ant-design/icons-svg/es/asn/RedoOutlined\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar RedoOutlined = function RedoOutlined(props, ref) {\n return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n ref: ref,\n icon: RedoOutlinedSvg\n }));\n};\n\n/**![redo](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTc1OC4yIDgzOS4xQzg1MS44IDc2NS45IDkxMiA2NTEuOSA5MTIgNTIzLjkgOTEyIDMwMyA3MzMuNSAxMjQuMyA1MTIuNiAxMjQgMjkxLjQgMTIzLjcgMTEyIDMwMi44IDExMiA1MjMuOWMwIDEyNS4yIDU3LjUgMjM2LjkgMTQ3LjYgMzEwLjIgMy41IDIuOCA4LjYgMi4yIDExLjQtMS4zbDM5LjQtNTAuNWMyLjctMy40IDIuMS04LjMtMS4yLTExLjEtOC4xLTYuNi0xNS45LTEzLjctMjMuNC0yMS4yYTMxOC42NCAzMTguNjQgMCAwMS02OC42LTEwMS43QzIwMC40IDYwOSAxOTIgNTY3LjEgMTkyIDUyMy45czguNC04NS4xIDI1LjEtMTI0LjVjMTYuMS0zOC4xIDM5LjItNzIuMyA2OC42LTEwMS43IDI5LjQtMjkuNCA2My42LTUyLjUgMTAxLjctNjguNkM0MjYuOSAyMTIuNCA0NjguOCAyMDQgNTEyIDIwNHM4NS4xIDguNCAxMjQuNSAyNS4xYzM4LjEgMTYuMSA3Mi4zIDM5LjIgMTAxLjcgNjguNiAyOS40IDI5LjQgNTIuNSA2My42IDY4LjYgMTAxLjcgMTYuNyAzOS40IDI1LjEgODEuMyAyNS4xIDEyNC41cy04LjQgODUuMS0yNS4xIDEyNC41YTMxOC42NCAzMTguNjQgMCAwMS02OC42IDEwMS43Yy05LjMgOS4zLTE5LjEgMTgtMjkuMyAyNkw2NjguMiA3MjRhOCA4IDAgMDAtMTQuMSAzbC0zOS42IDE2Mi4yYy0xLjIgNSAyLjYgOS45IDcuNyA5LjlsMTY3IC44YzYuNyAwIDEwLjUtNy43IDYuMy0xMi45bC0zNy4zLTQ3Ljl6IiAvPjwvc3ZnPg==) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(RedoOutlined);\nif (process.env.NODE_ENV !== 'production') {\n RefIcon.displayName = 'RedoOutlined';\n}\nexport default RefIcon;","// This icon file is generated automatically.\nvar StopOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372 0-89 31.3-170.8 83.5-234.8l523.3 523.3C682.8 852.7 601 884 512 884zm288.5-137.2L277.2 223.5C341.2 171.3 423 140 512 140c205.4 0 372 166.6 372 372 0 89-31.3 170.8-83.5 234.8z\" } }] }, \"name\": \"stop\", \"theme\": \"outlined\" };\nexport default StopOutlined;\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 StopOutlinedSvg from \"@ant-design/icons-svg/es/asn/StopOutlined\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar StopOutlined = function StopOutlined(props, ref) {\n return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n ref: ref,\n icon: StopOutlinedSvg\n }));\n};\n\n/**![stop](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0wIDgyMGMtMjA1LjQgMC0zNzItMTY2LjYtMzcyLTM3MiAwLTg5IDMxLjMtMTcwLjggODMuNS0yMzQuOGw1MjMuMyA1MjMuM0M2ODIuOCA4NTIuNyA2MDEgODg0IDUxMiA4ODR6bTI4OC41LTEzNy4yTDI3Ny4yIDIyMy41QzM0MS4yIDE3MS4zIDQyMyAxNDAgNTEyIDE0MGMyMDUuNCAwIDM3MiAxNjYuNiAzNzIgMzcyIDAgODktMzEuMyAxNzAuOC04My41IDIzNC44eiIgLz48L3N2Zz4=) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(StopOutlined);\nif (process.env.NODE_ENV !== 'production') {\n RefIcon.displayName = 'StopOutlined';\n}\nexport default RefIcon;","import React from 'react';\nimport { Card, Row, Col, Statistic } from 'antd';\nimport {\n DownloadOutlined,\n CheckCircleOutlined,\n CloseCircleOutlined,\n StopOutlined,\n} from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\n\ninterface TaskStatisticsProps {\n total: number;\n completed: number;\n failed: number;\n stopped: number;\n}\n\nexport const TaskStatistics: React.FC<TaskStatisticsProps> = ({\n total,\n completed,\n failed,\n stopped,\n}) => {\n const { t } = useTranslation();\n\n return (\n <Card style={{ marginBottom: 16 }}>\n <Row gutter={16}>\n <Col span={6}>\n <Statistic\n title={t('download.totalTasks')}\n value={total}\n prefix={<DownloadOutlined />}\n />\n </Col>\n <Col span={6}>\n <Statistic\n title={t('download.completed')}\n value={completed}\n valueStyle={{ color: '#3f8600' }}\n prefix={<CheckCircleOutlined />}\n />\n </Col>\n <Col span={6}>\n <Statistic\n title={t('download.failed')}\n value={failed}\n valueStyle={{ color: '#cf1322' }}\n prefix={<CloseCircleOutlined />}\n />\n </Col>\n <Col span={6}>\n <Statistic\n title={t('download.stopped')}\n value={stopped}\n valueStyle={{ color: '#8c8c8c' }}\n prefix={<StopOutlined />}\n />\n </Col>\n </Row>\n </Card>\n );\n};\n\n","import React from 'react';\nimport { Card, Button, Space, Alert, Typography, Tooltip } from 'antd';\nimport {\n PlayCircleOutlined,\n StopOutlined,\n ReloadOutlined,\n InfoCircleOutlined,\n} from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { useAuth } from '../../../hooks/useAuth';\n\nconst { Text } = Typography;\n\ninterface TaskActionsProps {\n hasActiveTask: boolean;\n onStartClick: () => void;\n onRunAllClick: () => void;\n onStopClick: () => void;\n isStarting: boolean;\n isRunningAll: boolean;\n isStopping: boolean;\n storage?: {\n illustrationDirectory?: string;\n novelDirectory?: string;\n downloadDirectory?: string;\n };\n onRefreshConfig?: () => void;\n}\n\nexport const TaskActions: React.FC<TaskActionsProps> = ({\n hasActiveTask,\n onStartClick,\n onRunAllClick,\n onStopClick,\n isStarting,\n isRunningAll,\n isStopping,\n storage,\n onRefreshConfig,\n}) => {\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 const illustrationPath =\n storage?.illustrationDirectory ||\n (storage?.downloadDirectory\n ? `${storage.downloadDirectory}/illustrations`\n : './downloads/illustrations');\n const novelPath =\n storage?.novelDirectory ||\n (storage?.downloadDirectory\n ? `${storage.downloadDirectory}/novels`\n : './downloads/novels');\n\n return (\n <Card\n title={\n <Space>\n <InfoCircleOutlined />\n <span>{t('download.taskOperations')}</span>\n </Space>\n }\n style={{ marginBottom: 16 }}\n >\n <Space wrap>\n <Tooltip title={requiresAuth ? loginTip : undefined}>\n <Button\n type=\"primary\"\n size=\"large\"\n icon={<PlayCircleOutlined />}\n onClick={onStartClick}\n disabled={hasActiveTask || requiresAuth}\n loading={isStarting}\n >\n {t('download.startDownload')}\n </Button>\n </Tooltip>\n <Tooltip title={requiresAuth ? loginTip : undefined}>\n <Button\n size=\"large\"\n icon={<ReloadOutlined />}\n onClick={onRunAllClick}\n disabled={hasActiveTask || requiresAuth}\n loading={isRunningAll}\n >\n {t('download.downloadAll')}\n </Button>\n </Tooltip>\n <Button\n danger\n size=\"large\"\n icon={<StopOutlined />}\n onClick={onStopClick}\n disabled={!hasActiveTask}\n loading={isStopping}\n >\n {t('download.stopCurrent')}\n </Button>\n </Space>\n {hasActiveTask && (\n <Alert\n message={t('download.hasActiveTask')}\n description={t('download.hasActiveTaskDesc')}\n type=\"info\"\n showIcon\n style={{ marginTop: 16 }}\n />\n )}\n {storage && (\n <Alert\n message={\n <Space>\n <span>{t('download.fileSavePath')}</span>\n {onRefreshConfig && (\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ReloadOutlined />}\n onClick={onRefreshConfig}\n title={t('download.refreshPath')}\n />\n )}\n </Space>\n }\n description={\n <Space direction=\"vertical\" size=\"small\" style={{ width: '100%' }}>\n <Text>\n <Text strong>{t('download.illustrationPath')}</Text>\n {illustrationPath}\n </Text>\n <Text>\n <Text strong>{t('download.novelPath')}</Text>\n {novelPath}\n </Text>\n <Text type=\"secondary\" style={{ fontSize: '12px' }}>\n {t('download.pathTip')}\n </Text>\n </Space>\n }\n type=\"info\"\n showIcon\n style={{ marginTop: 16 }}\n />\n )}\n </Card>\n );\n};\n\n","import React, { useEffect, useRef } from 'react';\nimport { Collapse, Space } from 'antd';\nimport { InfoCircleOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { formatDate } from '../../../utils/dateUtils';\n\ninterface LogEntry {\n timestamp: string;\n level: string;\n message: string;\n}\n\ninterface TaskLogsViewerProps {\n logs: LogEntry[];\n isRunning?: boolean;\n}\n\nexport const TaskLogsViewer: React.FC<TaskLogsViewerProps> = ({\n logs,\n isRunning = false,\n}) => {\n const { t } = useTranslation();\n const logsEndRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (logsEndRef.current && logs.length > 0) {\n logsEndRef.current.scrollIntoView({ behavior: 'smooth' });\n }\n }, [logs]);\n\n if (!logs || logs.length === 0) {\n return null;\n }\n\n const levelColor: Record<string, string> = {\n error: '#ff4d4f',\n warn: '#faad14',\n info: '#1890ff',\n debug: '#8c8c8c',\n };\n\n return (\n <div style={{ marginTop: 16 }}>\n <Collapse\n items={[\n {\n key: 'logs',\n label: (\n <Space>\n <InfoCircleOutlined />\n <span>\n {t('download.realtimeLogs')} ({logs.length}{' '}\n {t('download.entries')})\n </span>\n </Space>\n ),\n children: (\n <div\n style={{\n maxHeight: '400px',\n overflowY: 'auto',\n backgroundColor: '#1f1f1f',\n padding: '12px',\n borderRadius: '4px',\n fontFamily: 'monospace',\n fontSize: '12px',\n lineHeight: '1.6',\n }}\n >\n {logs.map((log, index) => {\n const timestamp = formatDate(log.timestamp, {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n return (\n <div\n key={index}\n style={{\n marginBottom: '4px',\n color: levelColor[log.level] || '#ffffff',\n }}\n >\n <span style={{ color: '#8c8c8c', marginRight: '8px' }}>\n [{timestamp}]\n </span>\n <span\n style={{\n color: levelColor[log.level] || '#ffffff',\n marginRight: '8px',\n fontWeight: 'bold',\n }}\n >\n [{log.level.toUpperCase()}]\n </span>\n <span>{log.message}</span>\n </div>\n );\n })}\n <div ref={logsEndRef} />\n </div>\n ),\n },\n ]}\n defaultActiveKey={isRunning ? ['logs'] : []}\n />\n </div>\n );\n};\n\n","import React from 'react';\nimport { Card, Button, Space, Descriptions, Progress, Alert, Typography, Tag } from 'antd';\nimport {\n ClockCircleOutlined,\n StopOutlined,\n CheckCircleOutlined,\n CloseCircleOutlined,\n} from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { formatDate } from '../../../utils/dateUtils';\nimport { TaskLogsViewer } from './TaskLogsViewer';\n\nconst { Text } = Typography;\n\ninterface TaskProgress {\n current: number;\n total: number;\n message?: string;\n}\n\ninterface ActiveTask {\n taskId: string;\n status: string;\n startTime: string;\n endTime?: string;\n progress?: TaskProgress;\n error?: string;\n}\n\ninterface ActiveTaskCardProps {\n task: ActiveTask;\n logs?: Array<{ timestamp: string; level: string; message: string }>;\n onStop: () => void;\n isStopping: boolean;\n}\n\nexport const ActiveTaskCard: React.FC<ActiveTaskCardProps> = ({\n task,\n logs,\n onStop,\n isStopping,\n}) => {\n const { t } = useTranslation();\n\n const getStatusTag = (status: string) => {\n const statusMap: Record<string, { color: string; icon: React.ReactNode; text: string }> = {\n running: {\n color: 'processing',\n icon: <ClockCircleOutlined />,\n text: t('download.statusRunning'),\n },\n completed: {\n color: 'success',\n icon: <CheckCircleOutlined />,\n text: t('download.statusCompleted'),\n },\n failed: {\n color: 'error',\n icon: <CloseCircleOutlined />,\n text: t('download.statusFailed'),\n },\n stopped: {\n color: 'default',\n icon: <StopOutlined />,\n text: t('download.statusStopped'),\n },\n };\n const statusInfo = statusMap[status] || statusMap.running;\n if (!statusInfo) return null;\n return (\n <Tag color={statusInfo.color} icon={statusInfo.icon}>\n {statusInfo.text}\n </Tag>\n );\n };\n\n const calculateDuration = (startTime: Date, endTime?: Date) => {\n const start = new Date(startTime).getTime();\n const end = endTime ? new Date(endTime).getTime() : Date.now();\n const duration = Math.floor((end - start) / 1000); // seconds\n\n if (duration < 60) {\n return `${duration} ${t('download.seconds')}`;\n } else if (duration < 3600) {\n const minutes = Math.floor(duration / 60);\n const seconds = duration % 60;\n return `${minutes} ${t('download.minutes')} ${seconds} ${t('download.seconds')}`;\n } else {\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration % 3600) / 60);\n return `${hours} ${t('download.hours')} ${minutes} ${t('download.minutes')}`;\n }\n };\n\n return (\n <Card\n title={\n <Space>\n <ClockCircleOutlined />\n <span>{t('download.currentTask')}</span>\n </Space>\n }\n style={{ marginBottom: 16 }}\n extra={\n <Button danger icon={<StopOutlined />} onClick={onStop} loading={isStopping}>\n {t('download.stopTask')}\n </Button>\n }\n >\n <Descriptions column={2} bordered>\n <Descriptions.Item label={t('download.taskId')} span={1}>\n <Text code>{task.taskId}</Text>\n </Descriptions.Item>\n <Descriptions.Item label={t('download.status')} span={1}>\n {getStatusTag(task.status)}\n </Descriptions.Item>\n <Descriptions.Item label={t('download.startTime')} span={1}>\n {formatDate(task.startTime)}\n </Descriptions.Item>\n <Descriptions.Item label={t('download.duration')} span={1}>\n <Text strong>\n {calculateDuration(\n new Date(task.startTime),\n task.endTime ? new Date(task.endTime) : undefined\n )}\n </Text>\n </Descriptions.Item>\n {task.progress && (\n <Descriptions.Item label={t('download.progress')} span={2}>\n <Progress\n percent={Math.round((task.progress.current / task.progress.total) * 100)}\n status={task.status === 'running' ? 'active' : 'success'}\n format={() => `${task.progress?.current || 0} / ${task.progress?.total || 0}`}\n />\n {task.progress.message && (\n <Text type=\"secondary\" style={{ display: 'block', marginTop: 8 }}>\n {task.progress.message}\n </Text>\n )}\n </Descriptions.Item>\n )}\n {task.endTime && (\n <Descriptions.Item label={t('download.endTime')} span={2}>\n {formatDate(task.endTime)}\n </Descriptions.Item>\n )}\n {task.error && (\n <Descriptions.Item label={t('download.errorInfo')} span={2}>\n <Alert message={task.error} type=\"error\" showIcon />\n </Descriptions.Item>\n )}\n </Descriptions>\n\n {logs && logs.length > 0 && (\n <TaskLogsViewer logs={logs} isRunning={task.status === 'running'} />\n )}\n </Card>\n );\n};\n\n","import React from 'react';\nimport { Card, Table, Tag, Button, Space, Alert, Typography, Modal } from 'antd';\nimport {\n InfoCircleOutlined,\n ReloadOutlined,\n DeleteOutlined,\n RedoOutlined,\n} from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { formatDate } from '../../../utils/dateUtils';\n\nconst { Text } = Typography;\n\ninterface IncompleteTask {\n id: number;\n tag: string;\n type: 'illustration' | 'novel';\n status: string;\n message: string | null;\n executedAt: string;\n}\n\ninterface IncompleteTasksTableProps {\n tasks: IncompleteTask[];\n hasActiveTask: boolean;\n onRefresh: () => void;\n onResume: (tag: string, type: 'illustration' | 'novel') => void;\n onDelete: (id: number) => void;\n onDeleteAll: () => void;\n isResuming: boolean;\n isDeleting: boolean;\n isDeletingAll: boolean;\n}\n\nexport const IncompleteTasksTable: React.FC<IncompleteTasksTableProps> = ({\n tasks,\n hasActiveTask,\n onRefresh,\n onResume,\n onDelete,\n onDeleteAll,\n isResuming,\n isDeleting,\n isDeletingAll,\n}) => {\n const { t } = useTranslation();\n\n if (!tasks || tasks.length === 0) {\n return null;\n }\n\n const columns = [\n {\n title: t('download.tag'),\n dataIndex: 'tag',\n key: 'tag',\n width: 150,\n render: (tag: string) => <Text strong>{tag}</Text>,\n },\n {\n title: t('download.type'),\n dataIndex: 'type',\n key: 'type',\n width: 100,\n render: (type: string) => (\n <Tag color={type === 'illustration' ? 'blue' : 'purple'}>\n {type === 'illustration' ? t('download.typeIllustration') : t('download.typeNovel')}\n </Tag>\n ),\n },\n {\n title: t('download.incompleteStatus'),\n dataIndex: 'status',\n key: 'status',\n width: 120,\n render: (status: string) => {\n const statusMap: Record<string, { color: string; text: string }> = {\n failed: { color: 'error', text: t('download.statusFailed') },\n partial: { color: 'warning', text: t('download.statusPartial') },\n };\n const statusInfo = statusMap[status] || { color: 'default', text: status };\n return <Tag color={statusInfo.color}>{statusInfo.text}</Tag>;\n },\n },\n {\n title: t('download.errorMessage'),\n dataIndex: 'message',\n key: 'message',\n ellipsis: { showTitle: false },\n width: 300,\n render: (message: string | null) => {\n if (!message) {\n return <Text type=\"secondary\">-</Text>;\n }\n\n // Check for common error patterns and provide suggestions\n const msgLower = message.toLowerCase();\n let suggestion: string | null = null;\n\n if (msgLower.includes('401') || msgLower.includes('unauthorized')) {\n suggestion = t('download.error401');\n } else if (msgLower.includes('403') || msgLower.includes('forbidden')) {\n suggestion = t('download.error403');\n } else if (msgLower.includes('timeout') || msgLower.includes('timed out')) {\n suggestion = t('download.errorTimeout');\n } else if (msgLower.includes('failed after')) {\n suggestion = t('download.errorRetries');\n }\n\n return (\n <div>\n <Text type=\"danger\" ellipsis={{ tooltip: message }}>\n {message}\n </Text>\n {suggestion && (\n <div style={{ marginTop: 4 }}>\n <Text type=\"secondary\" style={{ fontSize: '12px' }}>\n 💡 {suggestion}\n </Text>\n </div>\n )}\n </div>\n );\n },\n },\n {\n title: t('download.executedAt'),\n dataIndex: 'executedAt',\n key: 'executedAt',\n width: 180,\n render: (time: string) => formatDate(time),\n },\n {\n title: t('download.actions'),\n key: 'action',\n width: 150,\n fixed: 'right' as const,\n render: (_: unknown, record: IncompleteTask) => (\n <Space>\n <Button\n type=\"link\"\n icon={<RedoOutlined />}\n onClick={() => onResume(record.tag, record.type)}\n disabled={hasActiveTask || isResuming}\n loading={isResuming}\n >\n {t('download.resumeDownload')}\n </Button>\n <Button\n type=\"link\"\n danger\n icon={<DeleteOutlined />}\n onClick={() => {\n Modal.confirm({\n title: t('download.confirmDelete'),\n content: t('download.confirmDeleteDesc', {\n tag: record.tag,\n type:\n record.type === 'illustration'\n ? t('download.typeIllustration')\n : t('download.typeNovel'),\n }),\n okText: t('common.delete'),\n okType: 'danger',\n cancelText: t('common.cancel'),\n onOk: () => onDelete(record.id),\n });\n }}\n disabled={isDeleting}\n loading={isDeleting}\n >\n {t('download.deleteTask')}\n </Button>\n </Space>\n ),\n },\n ];\n\n return (\n <Card\n title={\n <Space>\n <InfoCircleOutlined />\n <span>{t('download.incompleteTasks')}</span>\n </Space>\n }\n style={{ marginBottom: 16 }}\n extra={\n <Space>\n <Button size=\"small\" icon={<ReloadOutlined />} onClick={onRefresh}>\n {t('download.refreshList')}\n </Button>\n <Button\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={() => {\n Modal.confirm({\n title: t('download.confirmDeleteAll'),\n content: t('download.confirmDeleteAllDesc', { count: tasks.length }),\n okText: t('common.delete'),\n okType: 'danger',\n cancelText: t('common.cancel'),\n onOk: onDeleteAll,\n });\n }}\n loading={isDeletingAll}\n disabled={isDeletingAll}\n >\n {t('download.deleteAll')}\n </Button>\n </Space>\n }\n >\n <Alert\n message={t('download.incompleteTasksFound', { count: tasks.length })}\n description={t('download.incompleteTasksDesc')}\n type=\"warning\"\n showIcon\n style={{ marginBottom: 16 }}\n />\n <Table\n columns={columns}\n dataSource={tasks}\n rowKey=\"id\"\n pagination={{\n pageSize: 10,\n showSizeChanger: true,\n showTotal: (total) => t('download.totalEntries', { total }),\n }}\n size=\"small\"\n scroll={{ x: 800 }}\n />\n </Card>\n );\n};\n\n","import React from 'react';\nimport { Card, Table, Tag, Space, Typography, Spin } from 'antd';\nimport {\n InfoCircleOutlined,\n ClockCircleOutlined,\n CheckCircleOutlined,\n CloseCircleOutlined,\n StopOutlined,\n} from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { formatDate } from '../../../utils/dateUtils';\n\nconst { Text } = Typography;\n\ninterface Task {\n taskId: string;\n status: string;\n startTime: string;\n endTime?: string;\n error?: string;\n}\n\ninterface TaskHistoryTableProps {\n tasks: Task[];\n isLoading: boolean;\n calculateDuration: (startTime: Date, endTime?: Date) => string;\n}\n\nexport const TaskHistoryTable: React.FC<TaskHistoryTableProps> = ({\n tasks,\n isLoading,\n calculateDuration,\n}) => {\n const { t } = useTranslation();\n\n const getStatusTag = (status: string) => {\n const statusMap: Record<string, { color: string; icon: React.ReactNode; text: string }> = {\n running: {\n color: 'processing',\n icon: <ClockCircleOutlined />,\n text: t('download.statusRunning'),\n },\n completed: {\n color: 'success',\n icon: <CheckCircleOutlined />,\n text: t('download.statusCompleted'),\n },\n failed: {\n color: 'error',\n icon: <CloseCircleOutlined />,\n text: t('download.statusFailed'),\n },\n stopped: {\n color: 'default',\n icon: <StopOutlined />,\n text: t('download.statusStopped'),\n },\n };\n const statusInfo = statusMap[status] || statusMap.running;\n if (!statusInfo) return null;\n return (\n <Tag color={statusInfo.color} icon={statusInfo.icon}>\n {statusInfo.text}\n </Tag>\n );\n };\n\n const columns = [\n {\n title: t('download.taskId'),\n dataIndex: 'taskId',\n key: 'taskId',\n width: 120,\n render: (taskId: string) => <Text code>{taskId.slice(0, 8)}...</Text>,\n },\n {\n title: t('download.status'),\n dataIndex: 'status',\n key: 'status',\n width: 100,\n render: (status: string) => getStatusTag(status),\n },\n {\n title: t('download.duration'),\n key: 'duration',\n width: 120,\n render: (_: unknown, record: Task) => {\n return calculateDuration(\n new Date(record.startTime),\n record.endTime ? new Date(record.endTime) : undefined\n );\n },\n },\n {\n title: t('download.startTime'),\n dataIndex: 'startTime',\n key: 'startTime',\n width: 180,\n render: (time: string) => formatDate(time),\n },\n {\n title: t('download.endTime'),\n dataIndex: 'endTime',\n key: 'endTime',\n width: 180,\n render: (time: string | undefined) => formatDate(time),\n },\n {\n title: t('download.errorInfo'),\n dataIndex: 'error',\n key: 'error',\n ellipsis: true,\n render: (error: string | undefined) =>\n error ? (\n <Text type=\"danger\" ellipsis={{ tooltip: error }}>\n {error}\n </Text>\n ) : (\n <Text type=\"secondary\">-</Text>\n ),\n },\n ];\n\n return (\n <Card\n title={\n <Space>\n <InfoCircleOutlined />\n <span>{t('download.taskHistory')}</span>\n </Space>\n }\n >\n {isLoading ? (\n <div style={{ textAlign: 'center', padding: '40px 0' }}>\n <Spin size=\"large\" />\n <div style={{ marginTop: 16 }}>\n <Text type=\"secondary\">{t('download.loadingHistory')}</Text>\n </div>\n </div>\n ) : tasks && tasks.length > 0 ? (\n <Table\n columns={columns}\n dataSource={tasks}\n rowKey=\"taskId\"\n pagination={{\n pageSize: 10,\n showSizeChanger: true,\n showTotal: (total) => t('download.taskRecords', { total }),\n pageSizeOptions: ['10', '20', '50', '100'],\n }}\n size=\"middle\"\n scroll={{ x: 1000 }}\n />\n ) : (\n <div style={{ textAlign: 'center', padding: '40px 0' }}>\n <Text type=\"secondary\">{t('download.noHistory')}</Text>\n </div>\n )}\n </Card>\n );\n};\n\n","import React from 'react';\nimport { Modal, Form, Select, Alert, Space, Tag, Typography } from 'antd';\nimport { PlayCircleOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\n\nconst { Text } = Typography;\n\ninterface ConfigFile {\n filename: string;\n path: string;\n isActive: boolean;\n}\n\ninterface Target {\n type: 'illustration' | 'novel';\n tag?: string;\n limit?: number;\n [key: string]: unknown;\n}\n\ninterface StartDownloadModalProps {\n open: boolean;\n onCancel: () => void;\n onFinish: (values: { targetId?: string; configPaths?: string[] }) => void;\n isSubmitting: boolean;\n configFiles?: ConfigFile[];\n targets?: Target[];\n}\n\nexport const StartDownloadModal: React.FC<StartDownloadModalProps> = ({\n open,\n onCancel,\n onFinish,\n isSubmitting,\n configFiles = [],\n targets = [],\n}) => {\n const { t } = useTranslation();\n const [form] = Form.useForm();\n\n const handleCancel = () => {\n form.resetFields();\n onCancel();\n };\n\n return (\n <Modal\n title={\n <Space>\n <PlayCircleOutlined />\n <span>{t('download.startDownloadModal')}</span>\n </Space>\n }\n open={open}\n onCancel={handleCancel}\n onOk={() => form.submit()}\n confirmLoading={isSubmitting}\n okText={t('common.start')}\n cancelText={t('common.cancel')}\n width={600}\n >\n <Alert\n message={t('download.startDownloadTip')}\n description={t('download.startDownloadTipDesc')}\n type=\"info\"\n showIcon\n style={{ marginBottom: 24 }}\n />\n <Form form={form} onFinish={onFinish} layout=\"vertical\">\n <Form.Item\n name=\"configPaths\"\n label={t('download.selectConfigFiles')}\n tooltip={t('download.selectConfigFilesTooltip')}\n extra={t('download.selectConfigFilesExtra')}\n >\n <Select\n mode=\"multiple\"\n placeholder={t('download.selectConfigFilesPlaceholder')}\n allowClear\n size=\"large\"\n showSearch\n filterOption={(input, option) => {\n const label = option?.label as string;\n return label?.toLowerCase().includes(input.toLowerCase()) || false;\n }}\n options={configFiles.map((file) => ({\n label: `${file.filename}${file.isActive ? ` (${t('config.activeConfig')})` : ''}`,\n value: file.path,\n }))}\n />\n </Form.Item>\n <Form.Item\n name=\"targetId\"\n label={t('download.selectTarget')}\n tooltip={t('download.selectTargetTooltip')}\n extra={t('download.selectTargetExtra')}\n >\n <Select\n placeholder={t('download.selectTargetPlaceholder')}\n allowClear\n size=\"large\"\n showSearch\n filterOption={(input, option) => {\n const children = option?.children;\n const text = typeof children === 'string' ? children : String(children || '');\n return text.toLowerCase().includes(input.toLowerCase());\n }}\n >\n {targets.map((target, index) => (\n <Select.Option key={index} value={index.toString()}>\n <Space>\n <Tag color={target.type === 'illustration' ? 'blue' : 'purple'}>\n {target.type === 'illustration'\n ? t('download.typeIllustration')\n : t('download.typeNovel')}\n </Tag>\n <Text strong>{target.tag || `Target ${index + 1}`}</Text>\n {target.limit && (\n <Text type=\"secondary\">\n ({t('download.limit')}: {target.limit} {t('download.entries')})\n </Text>\n )}\n </Space>\n </Select.Option>\n ))}\n </Select>\n </Form.Item>\n {targets.length === 0 && (\n <Alert\n message={t('download.noTargetsFound')}\n description={t('download.noTargetsFoundDesc')}\n type=\"warning\"\n showIcon\n />\n )}\n </Form>\n </Modal>\n );\n};\n\n","import { useState, useCallback } from 'react';\nimport { message } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { ConfigData } from '../../../services/api';\nimport { api } from '../../../services/api';\nimport { translateErrorCode, extractErrorInfo } from '../../../utils/errorCodeTranslator';\n\n/**\n * Hook for managing download operations\n * Handles start, stop, run all, resume, delete operations\n */\nexport function useDownloadOperations(\n startDownloadAsync: (params: {\n targetId?: string;\n config?: Partial<ConfigData>;\n configPaths?: string[];\n }) => Promise<{ taskId: string }>,\n stopDownloadAsync: (taskId: string) => Promise<void>,\n resumeDownloadAsync: (params: { tag: string; type: 'illustration' | 'novel' }) => Promise<{ taskId: string }>,\n deleteIncompleteTaskAsync: (id: number) => Promise<void>,\n deleteAllIncompleteTasksAsync: () => Promise<{ deletedCount: number }>\n) {\n const { t } = useTranslation();\n const [showStartModal, setShowStartModal] = useState(false);\n\n const handleStart = useCallback(\n async (values: { targetId?: string; configPaths?: string[] }) => {\n try {\n await startDownloadAsync({\n targetId: values.targetId,\n configPaths: values.configPaths,\n });\n message.success(t('download.taskStarted'));\n setShowStartModal(false);\n } catch (error) {\n const { errorCode, message: errorMessage } = extractErrorInfo(error);\n message.error(\n translateErrorCode(errorCode, t, undefined, errorMessage || t('download.startFailed'))\n );\n }\n },\n [startDownloadAsync, t]\n );\n\n const handleStop = useCallback(\n async (taskId: string) => {\n try {\n await stopDownloadAsync(taskId);\n message.success(t('download.taskStopped'));\n } catch (error) {\n const { errorCode, message: errorMessage } = extractErrorInfo(error);\n message.error(\n translateErrorCode(errorCode, t, undefined, errorMessage || t('download.stopFailed'))\n );\n }\n },\n [stopDownloadAsync, t]\n );\n\n const handleRunAll = useCallback(() => {\n api\n .runAllDownloads()\n .then(() => {\n message.success(t('download.allTargetsStarted'));\n })\n .catch((error) => {\n const { errorCode, message: errorMessage } = extractErrorInfo(error);\n message.error(\n translateErrorCode(errorCode, t, undefined, errorMessage || t('download.startFailed'))\n );\n });\n }, [t]);\n\n const handleResume = useCallback(\n async (tag: string, type: 'illustration' | 'novel') => {\n try {\n await resumeDownloadAsync({ tag, type });\n message.success(\n t('download.taskResumedWithTag', {\n tag,\n type: type === 'illustration' ? t('download.typeIllustration') : t('download.typeNovel'),\n })\n );\n } catch (error) {\n const { errorCode, message: errorMessage, params } = extractErrorInfo(error);\n message.error(\n translateErrorCode(errorCode, t, params, errorMessage || t('download.resumeFailed'))\n );\n }\n },\n [resumeDownloadAsync, t]\n );\n\n const handleDelete = useCallback(\n async (id: number) => {\n try {\n await deleteIncompleteTaskAsync(id);\n message.success(t('download.incompleteTaskDeleted'));\n } catch (error) {\n const { errorCode, message: errorMessage, params } = extractErrorInfo(error);\n message.error(\n translateErrorCode(errorCode, t, params, errorMessage || t('download.deleteFailed'))\n );\n }\n },\n [deleteIncompleteTaskAsync, t]\n );\n\n const handleDeleteAll = useCallback(async () => {\n try {\n const response = await deleteAllIncompleteTasksAsync();\n const deletedCount = response?.deletedCount || 0;\n if (deletedCount === 0) {\n message.info(t('download.noIncompleteTasks'));\n } else {\n message.success(t('download.allIncompleteTasksDeleted', { count: deletedCount }));\n }\n } catch (error) {\n const { errorCode, message: errorMessage, params } = extractErrorInfo(error);\n if (errorCode) {\n message.error(\n translateErrorCode(errorCode, t, params, errorMessage || t('download.deleteAllFailed'))\n );\n } else {\n message.error(errorMessage || t('download.deleteAllFailed'));\n }\n console.error('Delete all incomplete tasks error:', error);\n }\n }, [deleteAllIncompleteTasksAsync, t]);\n\n return {\n showStartModal,\n setShowStartModal,\n handleStart,\n handleStop,\n handleRunAll,\n handleResume,\n handleDelete,\n handleDeleteAll,\n };\n}\n\n","import { useMemo, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { DownloadTask } from '../../../services/api/types';\n\nexport type Task = DownloadTask;\n\n/**\n * Hook for calculating download statistics and duration\n */\nexport function useDownloadStatistics(tasks: Task[] | undefined) {\n const { t } = useTranslation();\n\n // Calculate task statistics\n const taskStats = useMemo(() => {\n const taskList = tasks || [];\n const completed = taskList.filter((task) => task.status === 'completed').length;\n const failed = taskList.filter((task) => task.status === 'failed').length;\n const stopped = taskList.filter((task) => task.status === 'stopped').length;\n return {\n total: taskList.length,\n completed,\n failed,\n stopped,\n };\n }, [tasks]);\n\n // Calculate task duration helper\n const calculateDuration = useCallback(\n (startTime: Date | string, endTime?: Date | string) => {\n const start = new Date(startTime).getTime();\n const end = endTime ? new Date(endTime).getTime() : Date.now();\n const duration = Math.floor((end - start) / 1000); // seconds\n\n if (duration < 60) {\n return `${duration} ${t('download.seconds')}`;\n } else if (duration < 3600) {\n const minutes = Math.floor(duration / 60);\n const seconds = duration % 60;\n return `${minutes} ${t('download.minutes')} ${seconds} ${t('download.seconds')}`;\n } else {\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration % 3600) / 60);\n return `${hours} ${t('download.hours')} ${minutes} ${t('download.minutes')}`;\n }\n },\n [t]\n );\n\n return {\n taskStats,\n calculateDuration,\n };\n}\n\n","import { useQuery } from '@tanstack/react-query';\nimport { Typography } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { QUERY_KEYS } from '../../constants';\nimport { api } from '../../services/api';\nimport {\n useDownload,\n useDownloadStatus,\n useDownloadLogs,\n useIncompleteTasks,\n} from '../../hooks/useDownload';\nimport { useConfig } from '../../hooks/useConfig';\nimport {\n TaskStatistics,\n TaskActions,\n ActiveTaskCard,\n IncompleteTasksTable,\n TaskHistoryTable,\n StartDownloadModal,\n} from './components';\nimport {\n useDownloadOperations,\n useDownloadStatistics,\n} from './hooks';\n\nconst { Title, Paragraph } = Typography;\n\nexport default function Download() {\n const { t } = useTranslation();\n\n // Use hooks for download operations\n const {\n startAsync: startDownloadAsync,\n isStarting,\n stopAsync: stopDownloadAsync,\n isStopping,\n } = useDownload();\n\n const {\n isLoading: statusLoading,\n hasActiveTask,\n activeTask,\n allTasks,\n } = useDownloadStatus(undefined, 2000);\n\n const activeTaskId = activeTask?.taskId;\n const { logs: taskLogs } = useDownloadLogs(activeTaskId, undefined, 2000);\n\n const {\n tasks: incompleteTasks,\n refetch: refetchIncompleteTasks,\n resumeAsync: resumeDownloadAsync,\n deleteAsync: deleteIncompleteTaskAsync,\n deleteAllAsync: deleteAllIncompleteTasksAsync,\n isResuming,\n isDeleting,\n isDeletingAll,\n } = useIncompleteTasks();\n\n // Get config to show available targets and paths\n const { config: configData, refetch: refetchConfig } = useConfig();\n\n // Get configuration files list\n const { data: configFilesData } = useQuery({\n queryKey: QUERY_KEYS.CONFIG_FILES,\n queryFn: () => api.listConfigFiles(),\n });\n\n // Download operations\n const {\n showStartModal,\n setShowStartModal,\n handleStart,\n handleStop,\n handleRunAll,\n handleResume,\n handleDelete,\n handleDeleteAll\n } = useDownloadOperations(\n startDownloadAsync,\n stopDownloadAsync,\n resumeDownloadAsync,\n deleteIncompleteTaskAsync,\n deleteAllIncompleteTasksAsync\n );\n\n // Statistics\n const { taskStats, calculateDuration } = useDownloadStatistics(allTasks);\n\n return (\n <div>\n <Title level={2}>{t('download.title')}</Title>\n <Paragraph type=\"secondary\" style={{ marginBottom: 24 }}>\n {t('download.description')}\n </Paragraph>\n\n <TaskStatistics\n total={taskStats.total}\n completed={taskStats.completed}\n failed={taskStats.failed}\n stopped={taskStats.stopped}\n />\n\n <TaskActions\n hasActiveTask={hasActiveTask}\n onStartClick={() => setShowStartModal(true)}\n onRunAllClick={handleRunAll}\n onStopClick={() => activeTask?.taskId && handleStop(activeTask.taskId)}\n isStarting={isStarting}\n isRunningAll={false}\n isStopping={isStopping}\n storage={configData?.storage}\n onRefreshConfig={refetchConfig}\n />\n\n {activeTask && (\n <ActiveTaskCard\n task={activeTask}\n logs={taskLogs}\n onStop={() => activeTask.taskId && handleStop(activeTask.taskId)}\n isStopping={isStopping}\n />\n )}\n\n {incompleteTasks && incompleteTasks.length > 0 && (\n <IncompleteTasksTable\n tasks={incompleteTasks}\n hasActiveTask={hasActiveTask}\n onRefresh={refetchIncompleteTasks}\n onResume={handleResume}\n onDelete={handleDelete}\n onDeleteAll={handleDeleteAll}\n isResuming={isResuming}\n isDeleting={isDeleting}\n isDeletingAll={isDeletingAll}\n />\n )}\n\n <TaskHistoryTable\n tasks={allTasks || []}\n isLoading={statusLoading}\n calculateDuration={calculateDuration}\n />\n\n <StartDownloadModal\n open={showStartModal}\n onCancel={() => setShowStartModal(false)}\n onFinish={handleStart}\n isSubmitting={isStarting}\n configFiles={configFilesData?.data?.data || []}\n targets={configData?.targets || []}\n />\n </div>\n );\n}"],"names":["InfoCircleOutlined","props","ref","AntdIcon","_extends","InfoCircleOutlinedSvg","RefIcon","React.forwardRef","RedoOutlined","RedoOutlinedSvg","StopOutlined","StopOutlinedSvg","TaskStatistics","total","completed","failed","stopped","t","useTranslation","jsx","Card","jsxs","Row","Col","Statistic","DownloadOutlined","CheckCircleOutlined","CloseCircleOutlined","Text","Typography","TaskActions","hasActiveTask","onStartClick","onRunAllClick","onStopClick","isStarting","isRunningAll","isStopping","storage","onRefreshConfig","authenticated","useAuth","requiresAuth","loginTip","illustrationPath","novelPath","Space","Tooltip","Button","PlayCircleOutlined","ReloadOutlined","Alert","TaskLogsViewer","logs","isRunning","logsEndRef","useRef","useEffect","levelColor","Collapse","log","index","timestamp","formatDate","ActiveTaskCard","task","onStop","getStatusTag","status","statusMap","ClockCircleOutlined","statusInfo","Tag","calculateDuration","startTime","endTime","start","end","duration","minutes","seconds","hours","Descriptions","Progress","IncompleteTasksTable","tasks","onRefresh","onResume","onDelete","onDeleteAll","isResuming","isDeleting","isDeletingAll","columns","tag","type","message","msgLower","suggestion","time","_","record","DeleteOutlined","Modal","Table","TaskHistoryTable","isLoading","taskId","error","Spin","StartDownloadModal","open","onCancel","onFinish","isSubmitting","configFiles","targets","form","Form","handleCancel","Select","input","option","file","children","target","useDownloadOperations","startDownloadAsync","stopDownloadAsync","resumeDownloadAsync","deleteIncompleteTaskAsync","deleteAllIncompleteTasksAsync","showStartModal","setShowStartModal","useState","handleStart","useCallback","values","errorCode","errorMessage","extractErrorInfo","translateErrorCode","handleStop","handleRunAll","api","handleResume","params","handleDelete","id","handleDeleteAll","deletedCount","useDownloadStatistics","taskStats","useMemo","taskList","Title","Paragraph","Download","useDownload","statusLoading","activeTask","allTasks","useDownloadStatus","activeTaskId","taskLogs","useDownloadLogs","incompleteTasks","refetchIncompleteTasks","useIncompleteTasks","configData","refetchConfig","useConfig","configFilesData","useQuery","QUERY_KEYS"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5]}
@@ -1,5 +0,0 @@
1
- import{r as s,C as Ke,a7 as Pt,m as Q,N as on,t as Nt,v as it,y as an,z as Xe,aa as sn,a5 as Ct,ad as ln,g as fe,a4 as cn,aN as un,a3 as T,a2 as st,h as V,aO as dn,l as fn,n as Pe,a1 as je,_ as ee,a8 as mn,o as zt,a6 as lt,I as Re,F as Ie,aP as gn,az as vn,ac as ct,aQ as Ye,aR as pn,D as Tt,aE as kt,aS as He,ab as hn,aC as xn,a as ze,T as $t,u as Dt,Q as Ve,b as be,j as a,B as ue,aG as wn,V as Ne,W as Oe,aT as ut,d as dt,S as Lt,aM as yn,s as We,Y as nt}from"./index-BFgUdwJv.js";import{u as Ft}from"./errorCodeTranslator-DWsWq6B3.js";import{a as Cn,b as Me,u as vt,c as _t,F as bn,C as rt}from"./useErrorHandler-DWHs3RlU.js";import{R as pt,C as Ce,a as Te}from"./row-FRqVdQDX.js";import{R as At,I as Sn}from"./index-Dycn6xoz.js";import{R as Bt,a as Xt}from"./SortDescendingOutlined-CR-hdhyW.js";import{S as _e}from"./index-DjpD0HQ5.js";import{R as Ze}from"./PictureOutlined-C8Lbucj1.js";import{f as bt}from"./dateUtils-CBk8bEa_.js";import{T as Ae}from"./index-lwTtspUb.js";import{P as jn}from"./index-WaraZQH0.js";import{R as In}from"./DeleteOutlined-u-P2SpoK.js";import{D as On,g as Rn,i as Mn,M as Yt}from"./index-k2rGFxEM.js";import{T as Ht}from"./index-pT0W4KjK.js";import{D as ye}from"./index-DTU-FGA4.js";import"./ActionButton-DWq-fh3_.js";const qe=({children:e})=>{const{getPrefixCls:t}=s.useContext(Ke),n=t("breadcrumb");return s.createElement("li",{className:`${n}-separator`,"aria-hidden":"true"},e===""?e:e||"/")};qe.__ANT_BREADCRUMB_SEPARATOR=!0;var En=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]]);return n};function Pn(e,t){if(e.title===void 0||e.title===null)return null;const n=Object.keys(t).join("|");return typeof e.title=="object"?e.title:String(e.title).replace(new RegExp(`:(${n})`,"g"),(r,o)=>t[o]||r)}function Vt(e,t,n,r){if(n==null)return null;const{className:o,onClick:l}=t,u=En(t,["className","onClick"]),d=Object.assign(Object.assign({},Pt(u,{data:!0,aria:!0})),{onClick:l});return r!==void 0?s.createElement("a",Object.assign({},d,{className:Q(`${e}-link`,o),href:r}),n):s.createElement("span",Object.assign({},d,{className:Q(`${e}-link`,o)}),n)}function Nn(e,t){return(r,o,l,u,d)=>{if(t)return t(r,o,l,u);const c=Pn(r,o);return Vt(e,r,c,d)}}var ft=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]]);return n};const Wt=e=>{const{prefixCls:t,separator:n="/",children:r,menu:o,overlay:l,dropdownProps:u,href:d}=e,i=(g=>{if(o||l){const f=Object.assign({},u);if(o){const v=o||{},{items:h}=v,m=ft(v,["items"]);f.menu=Object.assign(Object.assign({},m),{items:h?.map((p,b)=>{var{key:C,title:E,label:M,path:R}=p,x=ft(p,["key","title","label","path"]);let j=M??E;return R&&(j=s.createElement("a",{href:`${d}${R}`},j)),Object.assign(Object.assign({},x),{key:C??b,label:j})})})}else l&&(f.overlay=l);return s.createElement(Cn,Object.assign({placement:"bottom"},f),s.createElement("span",{className:`${t}-overlay-link`},g,s.createElement(on,null)))}return g})(r);return i!=null?s.createElement(s.Fragment,null,s.createElement("li",null,i),n&&s.createElement(qe,null,n)):null},Zt=e=>{const{prefixCls:t,children:n,href:r}=e,o=ft(e,["prefixCls","children","href"]),{getPrefixCls:l}=s.useContext(Ke),u=l("breadcrumb",t);return s.createElement(Wt,Object.assign({},o,{prefixCls:u}),Vt(u,o,n,r))};Zt.__ANT_BREADCRUMB_ITEM=!0;const zn=e=>{const{componentCls:t,iconCls:n,calc:r}=e;return{[t]:Object.assign(Object.assign({},an(e)),{color:e.itemColor,fontSize:e.fontSize,[n]:{fontSize:e.iconFontSize},ol:{display:"flex",flexWrap:"wrap",margin:0,padding:0,listStyle:"none"},a:Object.assign({color:e.linkColor,transition:`color ${e.motionDurationMid}`,padding:`0 ${Xe(e.paddingXXS)}`,borderRadius:e.borderRadiusSM,height:e.fontHeight,display:"inline-block",marginInline:r(e.marginXXS).mul(-1).equal(),"&:hover":{color:e.linkHoverColor,backgroundColor:e.colorBgTextHover}},sn(e)),"li:last-child":{color:e.lastItemColor},[`${t}-separator`]:{marginInline:e.separatorMargin,color:e.separatorColor},[`${t}-link`]:{[`
2
- > ${n} + span,
3
- > ${n} + a
4
- `]:{marginInlineStart:e.marginXXS}},[`${t}-overlay-link`]:{borderRadius:e.borderRadiusSM,height:e.fontHeight,display:"inline-block",padding:`0 ${Xe(e.paddingXXS)}`,marginInline:r(e.marginXXS).mul(-1).equal(),[`> ${n}`]:{marginInlineStart:e.marginXXS,fontSize:e.fontSizeIcon},"&:hover":{color:e.linkHoverColor,backgroundColor:e.colorBgTextHover,a:{color:e.linkHoverColor}},a:{"&:hover":{backgroundColor:"transparent"}}},[`&${e.componentCls}-rtl`]:{direction:"rtl"}})}},Tn=e=>({itemColor:e.colorTextDescription,lastItemColor:e.colorText,iconFontSize:e.fontSize,linkColor:e.colorTextDescription,linkHoverColor:e.colorText,separatorColor:e.colorTextDescription,separatorMargin:e.marginXS}),kn=Nt("Breadcrumb",e=>{const t=it(e,{});return zn(t)},Tn);var St=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]]);return n};function $n(e){const{breadcrumbName:t,children:n}=e,r=St(e,["breadcrumbName","children"]),o=Object.assign({title:t},r);return n&&(o.menu={items:n.map(l=>{var{breadcrumbName:u}=l,d=St(l,["breadcrumbName"]);return Object.assign(Object.assign({},d),{title:u})})}),o}function Dn(e,t){return s.useMemo(()=>e||(t?t.map($n):null),[e,t])}var Ln=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]]);return n};const Fn=(e,t)=>{if(t===void 0)return t;let n=(t||"").replace(/^\//,"");return Object.keys(e).forEach(r=>{n=n.replace(`:${r}`,e[r])}),n},ht=e=>{const{prefixCls:t,separator:n="/",style:r,className:o,rootClassName:l,routes:u,items:d,children:c,itemRender:i,params:g={}}=e,f=Ln(e,["prefixCls","separator","style","className","rootClassName","routes","items","children","itemRender","params"]),{getPrefixCls:v,direction:h,breadcrumb:m}=s.useContext(Ke);let p;const b=v("breadcrumb",t),[C,E,M]=kn(b),R=Dn(d,u),x=Nn(b,i);if(R&&R.length>0){const w=[],O=d||u;p=R.map((I,y)=>{const{path:N,key:z,type:P,menu:k,overlay:$,onClick:B,className:G,separator:J,dropdownProps:W}=I,X=Fn(g,N);X!==void 0&&w.push(X);const K=z??y;if(P==="separator")return s.createElement(qe,{key:K},J);const Y={},re=y===R.length-1;k?Y.menu=k:$&&(Y.overlay=$);let{href:Z}=I;return w.length&&X!==void 0&&(Z=`#/${w.join("/")}`),s.createElement(Wt,Object.assign({key:K},Y,Pt(I,{data:!0,aria:!0}),{className:G,dropdownProps:W,href:Z,separator:re?"":n,onClick:B,prefixCls:b}),x(I,g,O,w,Z))})}else if(c){const w=Ct(c).length;p=Ct(c).map((O,I)=>{if(!O)return O;const y=I===w-1;return ln(O,{separator:y?"":n,key:I})})}const j=Q(b,m?.className,{[`${b}-rtl`]:h==="rtl"},o,l,E,M),S=Object.assign(Object.assign({},m?.style),r);return C(s.createElement("nav",Object.assign({className:j,style:S},f),s.createElement("ol",null,p)))};ht.Item=Zt;ht.Separator=qe;function Ut(){var e=document.documentElement.clientWidth,t=window.innerHeight||document.documentElement.clientHeight;return{width:e,height:t}}function _n(e){var t=e.getBoundingClientRect(),n=document.documentElement;return{left:t.left+(window.pageXOffset||n.scrollLeft)-(n.clientLeft||document.body.clientLeft||0),top:t.top+(window.pageYOffset||n.scrollTop)-(n.clientTop||document.body.clientTop||0)}}var ke=s.createContext(null),An=function(t){var n=t.visible,r=t.maskTransitionName,o=t.getContainer,l=t.prefixCls,u=t.rootClassName,d=t.icons,c=t.countRender,i=t.showSwitch,g=t.showProgress,f=t.current,v=t.transform,h=t.count,m=t.scale,p=t.minScale,b=t.maxScale,C=t.closeIcon,E=t.onActive,M=t.onClose,R=t.onZoomIn,x=t.onZoomOut,j=t.onRotateRight,S=t.onRotateLeft,w=t.onFlipX,O=t.onFlipY,I=t.onReset,y=t.toolbarRender,N=t.zIndex,z=t.image,P=s.useContext(ke),k=d.rotateLeft,$=d.rotateRight,B=d.zoomIn,G=d.zoomOut,J=d.close,W=d.left,X=d.right,K=d.flipX,Y=d.flipY,re="".concat(l,"-operations-operation");s.useEffect(function(){var L=function(_){_.keyCode===st.ESC&&M()};return n&&window.addEventListener("keydown",L),function(){window.removeEventListener("keydown",L)}},[n]);var Z=function(F,_){F.preventDefault(),F.stopPropagation(),E(_)},A=s.useCallback(function(L){var F=L.type,_=L.disabled,q=L.onClick,H=L.icon;return s.createElement("div",{key:F,className:Q(re,"".concat(l,"-operations-operation-").concat(F),fe({},"".concat(l,"-operations-operation-disabled"),!!_)),onClick:q},H)},[re,l]),de=i?A({icon:W,onClick:function(F){return Z(F,-1)},type:"prev",disabled:f===0}):void 0,oe=i?A({icon:X,onClick:function(F){return Z(F,1)},type:"next",disabled:f===h-1}):void 0,te=A({icon:Y,onClick:O,type:"flipY"}),D=A({icon:K,onClick:w,type:"flipX"}),se=A({icon:k,onClick:S,type:"rotateLeft"}),U=A({icon:$,onClick:j,type:"rotateRight"}),ne=A({icon:G,onClick:x,type:"zoomOut",disabled:m<=p}),le=A({icon:B,onClick:R,type:"zoomIn",disabled:m===b}),me=s.createElement("div",{className:"".concat(l,"-operations")},te,D,se,U,ne,le);return s.createElement(cn,{visible:n,motionName:r},function(L){var F=L.className,_=L.style;return s.createElement(un,{open:!0,getContainer:o??document.body},s.createElement("div",{className:Q("".concat(l,"-operations-wrapper"),F,u),style:T(T({},_),{},{zIndex:N})},C===null?null:s.createElement("button",{className:"".concat(l,"-close"),onClick:M},C||J),i&&s.createElement(s.Fragment,null,s.createElement("div",{className:Q("".concat(l,"-switch-left"),fe({},"".concat(l,"-switch-left-disabled"),f===0)),onClick:function(H){return Z(H,-1)}},W),s.createElement("div",{className:Q("".concat(l,"-switch-right"),fe({},"".concat(l,"-switch-right-disabled"),f===h-1)),onClick:function(H){return Z(H,1)}},X)),s.createElement("div",{className:"".concat(l,"-footer")},g&&s.createElement("div",{className:"".concat(l,"-progress")},c?c(f+1,h):s.createElement("bdi",null,"".concat(f+1," / ").concat(h))),y?y(me,T(T({icons:{prevIcon:de,nextIcon:oe,flipYIcon:te,flipXIcon:D,rotateLeftIcon:se,rotateRightIcon:U,zoomOutIcon:ne,zoomInIcon:le},actions:{onActive:E,onFlipY:O,onFlipX:w,onRotateLeft:S,onRotateRight:j,onZoomOut:x,onZoomIn:R,onReset:I,onClose:M},transform:v},P?{current:f,total:h}:{}),{},{image:z})):me)))})},Be={x:0,y:0,rotate:0,scale:1,flipX:!1,flipY:!1};function Bn(e,t,n,r){var o=s.useRef(null),l=s.useRef([]),u=s.useState(Be),d=V(u,2),c=d[0],i=d[1],g=function(m){i(Be),dn(Be,c)||r?.({transform:Be,action:m})},f=function(m,p){o.current===null&&(l.current=[],o.current=fn(function(){i(function(b){var C=b;return l.current.forEach(function(E){C=T(T({},C),E)}),o.current=null,r?.({transform:C,action:p}),C})})),l.current.push(T(T({},c),m))},v=function(m,p,b,C,E){var M=e.current,R=M.width,x=M.height,j=M.offsetWidth,S=M.offsetHeight,w=M.offsetLeft,O=M.offsetTop,I=m,y=c.scale*m;y>n?(y=n,I=n/c.scale):y<t&&(y=E?y:t,I=y/c.scale);var N=b??innerWidth/2,z=C??innerHeight/2,P=I-1,k=P*R*.5,$=P*x*.5,B=P*(N-c.x-w),G=P*(z-c.y-O),J=c.x-(B-k),W=c.y-(G-$);if(m<1&&y===1){var X=j*y,K=S*y,Y=Ut(),re=Y.width,Z=Y.height;X<=re&&K<=Z&&(J=0,W=0)}f({x:J,y:W,scale:y},p)};return{transform:c,resetTransform:g,updateTransform:f,dispatchZoomChange:v}}function jt(e,t,n,r){var o=t+n,l=(n-r)/2;if(n>r){if(t>0)return fe({},e,l);if(t<0&&o<r)return fe({},e,-l)}else if(t<0||o>r)return fe({},e,t<0?l:-l);return{}}function Gt(e,t,n,r){var o=Ut(),l=o.width,u=o.height,d=null;return e<=l&&t<=u?d={x:0,y:0}:(e>l||t>u)&&(d=T(T({},jt("x",n,e,l)),jt("y",r,t,u))),d}var Ee=1,Xn=1;function Yn(e,t,n,r,o,l,u){var d=o.rotate,c=o.scale,i=o.x,g=o.y,f=s.useState(!1),v=V(f,2),h=v[0],m=v[1],p=s.useRef({diffX:0,diffY:0,transformX:0,transformY:0}),b=function(x){!t||x.button!==0||(x.preventDefault(),x.stopPropagation(),p.current={diffX:x.pageX-i,diffY:x.pageY-g,transformX:i,transformY:g},m(!0))},C=function(x){n&&h&&l({x:x.pageX-p.current.diffX,y:x.pageY-p.current.diffY},"move")},E=function(){if(n&&h){m(!1);var x=p.current,j=x.transformX,S=x.transformY,w=i!==j&&g!==S;if(!w)return;var O=e.current.offsetWidth*c,I=e.current.offsetHeight*c,y=e.current.getBoundingClientRect(),N=y.left,z=y.top,P=d%180!==0,k=Gt(P?I:O,P?O:I,N,z);k&&l(T({},k),"dragRebound")}},M=function(x){if(!(!n||x.deltaY==0)){var j=Math.abs(x.deltaY/100),S=Math.min(j,Xn),w=Ee+S*r;x.deltaY>0&&(w=Ee/w),u(w,"wheel",x.clientX,x.clientY)}};return s.useEffect(function(){var R,x,j,S;if(t){j=Me(window,"mouseup",E,!1),S=Me(window,"mousemove",C,!1);try{window.top!==window.self&&(R=Me(window.top,"mouseup",E,!1),x=Me(window.top,"mousemove",C,!1))}catch{}}return function(){var w,O,I,y;(w=j)===null||w===void 0||w.remove(),(O=S)===null||O===void 0||O.remove(),(I=R)===null||I===void 0||I.remove(),(y=x)===null||y===void 0||y.remove()}},[n,h,i,g,d,t]),{isMoving:h,onMouseDown:b,onMouseMove:C,onMouseUp:E,onWheel:M}}function Hn(e){return new Promise(function(t){if(!e){t(!1);return}var n=document.createElement("img");n.onerror=function(){return t(!1)},n.onload=function(){return t(!0)},n.src=e})}function Kt(e){var t=e.src,n=e.isCustomPlaceholder,r=e.fallback,o=s.useState(n?"loading":"normal"),l=V(o,2),u=l[0],d=l[1],c=s.useRef(!1),i=u==="error";s.useEffect(function(){var h=!0;return Hn(t).then(function(m){!m&&h&&d("error")}),function(){h=!1}},[t]),s.useEffect(function(){n&&!c.current?d("loading"):i&&d("normal")},[t]);var g=function(){d("normal")},f=function(m){c.current=!1,u==="loading"&&m!==null&&m!==void 0&&m.complete&&(m.naturalWidth||m.naturalHeight)&&(c.current=!0,g())},v=i&&r?{src:r}:{onLoad:g,src:t};return[f,v,u]}function Ue(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.hypot(n,r)}function Vn(e,t,n,r){var o=Ue(e,n),l=Ue(t,r);if(o===0&&l===0)return[e.x,e.y];var u=o/(o+l),d=e.x+u*(t.x-e.x),c=e.y+u*(t.y-e.y);return[d,c]}function Wn(e,t,n,r,o,l,u){var d=o.rotate,c=o.scale,i=o.x,g=o.y,f=s.useState(!1),v=V(f,2),h=v[0],m=v[1],p=s.useRef({point1:{x:0,y:0},point2:{x:0,y:0},eventType:"none"}),b=function(x){p.current=T(T({},p.current),x)},C=function(x){if(t){x.stopPropagation(),m(!0);var j=x.touches,S=j===void 0?[]:j;S.length>1?b({point1:{x:S[0].clientX,y:S[0].clientY},point2:{x:S[1].clientX,y:S[1].clientY},eventType:"touchZoom"}):b({point1:{x:S[0].clientX-i,y:S[0].clientY-g},eventType:"move"})}},E=function(x){var j=x.touches,S=j===void 0?[]:j,w=p.current,O=w.point1,I=w.point2,y=w.eventType;if(S.length>1&&y==="touchZoom"){var N={x:S[0].clientX,y:S[0].clientY},z={x:S[1].clientX,y:S[1].clientY},P=Vn(O,I,N,z),k=V(P,2),$=k[0],B=k[1],G=Ue(N,z)/Ue(O,I);u(G,"touchZoom",$,B,!0),b({point1:N,point2:z,eventType:"touchZoom"})}else y==="move"&&(l({x:S[0].clientX-O.x,y:S[0].clientY-O.y},"move"),b({eventType:"move"}))},M=function(){if(n){if(h&&m(!1),b({eventType:"none"}),r>c)return l({x:0,y:0,scale:r},"touchZoom");var x=e.current.offsetWidth*c,j=e.current.offsetHeight*c,S=e.current.getBoundingClientRect(),w=S.left,O=S.top,I=d%180!==0,y=Gt(I?j:x,I?x:j,w,O);y&&l(T({},y),"dragRebound")}};return s.useEffect(function(){var R;return n&&t&&(R=Me(window,"touchmove",function(x){return x.preventDefault()},{passive:!1})),function(){var x;(x=R)===null||x===void 0||x.remove()}},[n,t]),{isTouching:h,onTouchStart:C,onTouchMove:E,onTouchEnd:M}}var Zn=["fallback","src","imgRef"],Un=["prefixCls","src","alt","imageInfo","fallback","movable","onClose","visible","icons","rootClassName","closeIcon","getContainer","current","count","countRender","scaleStep","minScale","maxScale","transitionName","maskTransitionName","imageRender","imgCommonProps","toolbarRender","onTransform","onChange"],Gn=function(t){var n=t.fallback,r=t.src,o=t.imgRef,l=Pe(t,Zn),u=Kt({src:r,fallback:n}),d=V(u,2),c=d[0],i=d[1];return je.createElement("img",ee({ref:function(f){o.current=f,c(f)}},l,i))},qt=function(t){var n=t.prefixCls,r=t.src,o=t.alt,l=t.imageInfo,u=t.fallback,d=t.movable,c=d===void 0?!0:d,i=t.onClose,g=t.visible,f=t.icons,v=f===void 0?{}:f,h=t.rootClassName,m=t.closeIcon,p=t.getContainer,b=t.current,C=b===void 0?0:b,E=t.count,M=E===void 0?1:E,R=t.countRender,x=t.scaleStep,j=x===void 0?.5:x,S=t.minScale,w=S===void 0?1:S,O=t.maxScale,I=O===void 0?50:O,y=t.transitionName,N=y===void 0?"zoom":y,z=t.maskTransitionName,P=z===void 0?"fade":z,k=t.imageRender,$=t.imgCommonProps,B=t.toolbarRender,G=t.onTransform,J=t.onChange,W=Pe(t,Un),X=s.useRef(),K=s.useContext(ke),Y=K&&M>1,re=K&&M>=1,Z=s.useState(!0),A=V(Z,2),de=A[0],oe=A[1],te=Bn(X,w,I,G),D=te.transform,se=te.resetTransform,U=te.updateTransform,ne=te.dispatchZoomChange,le=Yn(X,c,g,j,D,U,ne),me=le.isMoving,L=le.onMouseDown,F=le.onWheel,_=Wn(X,c,g,w,D,U,ne),q=_.isTouching,H=_.onTouchStart,pe=_.onTouchMove,Se=_.onTouchEnd,ge=D.rotate,ve=D.scale,Qe=Q(fe({},"".concat(n,"-moving"),me));s.useEffect(function(){de||oe(!0)},[de]);var Je=function(){se("close")},et=function(){ne(Ee+j,"zoomIn")},he=function(){ne(Ee/(Ee+j),"zoomOut")},xe=function(){U({rotate:ge+90},"rotateRight")},$e=function(){U({rotate:ge-90},"rotateLeft")},De=function(){U({flipX:!D.flipX},"flipX")},Le=function(){U({flipY:!D.flipY},"flipY")},tn=function(){se("reset")},tt=function(we){var Fe=C+we;!Number.isInteger(Fe)||Fe<0||Fe>M-1||(oe(!1),se(we<0?"prev":"next"),J?.(Fe,C))},nn=function(we){!g||!Y||(we.keyCode===st.LEFT?tt(-1):we.keyCode===st.RIGHT&&tt(1))},rn=function(we){g&&(ve!==1?U({x:0,y:0,scale:1},"doubleClick"):ne(Ee+j,"doubleClick",we.clientX,we.clientY))};s.useEffect(function(){var ae=Me(window,"keydown",nn,!1);return function(){ae.remove()}},[g,Y,C]);var wt=je.createElement(Gn,ee({},$,{width:t.width,height:t.height,imgRef:X,className:"".concat(n,"-img"),alt:o,style:{transform:"translate3d(".concat(D.x,"px, ").concat(D.y,"px, 0) scale3d(").concat(D.flipX?"-":"").concat(ve,", ").concat(D.flipY?"-":"").concat(ve,", 1) rotate(").concat(ge,"deg)"),transitionDuration:(!de||q)&&"0s"},fallback:u,src:r,onWheel:F,onMouseDown:L,onDoubleClick:rn,onTouchStart:H,onTouchMove:pe,onTouchEnd:Se,onTouchCancel:Se})),yt=T({url:r,alt:o},l);return je.createElement(je.Fragment,null,je.createElement(On,ee({transitionName:N,maskTransitionName:P,closable:!1,keyboard:!0,prefixCls:n,onClose:i,visible:g,classNames:{wrapper:Qe},rootClassName:h,getContainer:p},W,{afterClose:Je}),je.createElement("div",{className:"".concat(n,"-img-wrapper")},k?k(wt,T({transform:D,image:yt},K?{current:C}:{})):wt)),je.createElement(An,{visible:g,transform:D,maskTransitionName:P,closeIcon:m,getContainer:p,prefixCls:n,rootClassName:h,icons:v,countRender:R,showSwitch:Y,showProgress:re,current:C,count:M,scale:ve,minScale:w,maxScale:I,toolbarRender:B,onActive:tt,onZoomIn:et,onZoomOut:he,onRotateRight:xe,onRotateLeft:$e,onFlipX:De,onFlipY:Le,onClose:i,onReset:tn,zIndex:W.zIndex!==void 0?W.zIndex+1:void 0,image:yt}))},mt=["crossOrigin","decoding","draggable","loading","referrerPolicy","sizes","srcSet","useMap","alt"];function Kn(e){var t=s.useState({}),n=V(t,2),r=n[0],o=n[1],l=s.useCallback(function(d,c){return o(function(i){return T(T({},i),{},fe({},d,c))}),function(){o(function(i){var g=T({},i);return delete g[d],g})}},[]),u=s.useMemo(function(){return e?e.map(function(d){if(typeof d=="string")return{data:{src:d}};var c={};return Object.keys(d).forEach(function(i){["src"].concat(mn(mt)).includes(i)&&(c[i]=d[i])}),{data:c}}):Object.keys(r).reduce(function(d,c){var i=r[c],g=i.canPreview,f=i.data;return g&&d.push({data:f,id:c}),d},[])},[e,r]);return[u,l,!!e]}var qn=["visible","onVisibleChange","getContainer","current","movable","minScale","maxScale","countRender","closeIcon","onChange","onTransform","toolbarRender","imageRender"],Qn=["src"],Jn=function(t){var n,r=t.previewPrefixCls,o=r===void 0?"rc-image-preview":r,l=t.children,u=t.icons,d=u===void 0?{}:u,c=t.items,i=t.preview,g=t.fallback,f=zt(i)==="object"?i:{},v=f.visible,h=f.onVisibleChange,m=f.getContainer,p=f.current,b=f.movable,C=f.minScale,E=f.maxScale,M=f.countRender,R=f.closeIcon,x=f.onChange,j=f.onTransform,S=f.toolbarRender,w=f.imageRender,O=Pe(f,qn),I=Kn(c),y=V(I,3),N=y[0],z=y[1],P=y[2],k=lt(0,{value:p}),$=V(k,2),B=$[0],G=$[1],J=s.useState(!1),W=V(J,2),X=W[0],K=W[1],Y=((n=N[B])===null||n===void 0?void 0:n.data)||{},re=Y.src,Z=Pe(Y,Qn),A=lt(!!v,{value:v,onChange:function(q,H){h?.(q,H,B)}}),de=V(A,2),oe=de[0],te=de[1],D=s.useState(null),se=V(D,2),U=se[0],ne=se[1],le=s.useCallback(function(_,q,H,pe){var Se=P?N.findIndex(function(ge){return ge.data.src===q}):N.findIndex(function(ge){return ge.id===_});G(Se<0?0:Se),te(!0),ne({x:H,y:pe}),K(!0)},[N,P]);s.useEffect(function(){oe?X||G(0):K(!1)},[oe]);var me=function(q,H){G(q),x?.(q,H)},L=function(){te(!1),ne(null)},F=s.useMemo(function(){return{register:z,onPreview:le}},[z,le]);return s.createElement(ke.Provider,{value:F},l,s.createElement(qt,ee({"aria-hidden":!oe,movable:b,visible:oe,prefixCls:o,closeIcon:R,onClose:L,mousePosition:U,imgCommonProps:Z,src:re,fallback:g,icons:d,minScale:C,maxScale:E,getContainer:m,current:B,count:N.length,countRender:M,onTransform:j,toolbarRender:S,imageRender:w,onChange:me},O)))},It=0;function er(e,t){var n=s.useState(function(){return It+=1,String(It)}),r=V(n,1),o=r[0],l=s.useContext(ke),u={data:t,canPreview:e};return s.useEffect(function(){if(l)return l.register(o,u)},[]),s.useEffect(function(){l&&l.register(o,u)},[e,t]),o}var tr=["src","alt","onPreviewClose","prefixCls","previewPrefixCls","placeholder","fallback","width","height","style","preview","className","onClick","onError","wrapperClassName","wrapperStyle","rootClassName"],nr=["src","visible","onVisibleChange","getContainer","mask","maskClassName","movable","icons","scaleStep","minScale","maxScale","imageRender","toolbarRender"],xt=function(t){var n=t.src,r=t.alt,o=t.onPreviewClose,l=t.prefixCls,u=l===void 0?"rc-image":l,d=t.previewPrefixCls,c=d===void 0?"".concat(u,"-preview"):d,i=t.placeholder,g=t.fallback,f=t.width,v=t.height,h=t.style,m=t.preview,p=m===void 0?!0:m,b=t.className,C=t.onClick,E=t.onError,M=t.wrapperClassName,R=t.wrapperStyle,x=t.rootClassName,j=Pe(t,tr),S=i&&i!==!0,w=zt(p)==="object"?p:{},O=w.src,I=w.visible,y=I===void 0?void 0:I,N=w.onVisibleChange,z=N===void 0?o:N,P=w.getContainer,k=P===void 0?void 0:P,$=w.mask,B=w.maskClassName,G=w.movable,J=w.icons,W=w.scaleStep,X=w.minScale,K=w.maxScale,Y=w.imageRender,re=w.toolbarRender,Z=Pe(w,nr),A=O??n,de=lt(!!y,{value:y,onChange:z}),oe=V(de,2),te=oe[0],D=oe[1],se=Kt({src:n,isCustomPlaceholder:S,fallback:g}),U=V(se,3),ne=U[0],le=U[1],me=U[2],L=s.useState(null),F=V(L,2),_=F[0],q=F[1],H=s.useContext(ke),pe=!!p,Se=function(){D(!1),q(null)},ge=Q(u,M,x,fe({},"".concat(u,"-error"),me==="error")),ve=s.useMemo(function(){var he={};return mt.forEach(function(xe){t[xe]!==void 0&&(he[xe]=t[xe])}),he},mt.map(function(he){return t[he]})),Qe=s.useMemo(function(){return T(T({},ve),{},{src:A})},[A,ve]),Je=er(pe,Qe),et=function(xe){var $e=_n(xe.target),De=$e.left,Le=$e.top;H?H.onPreview(Je,A,De,Le):(q({x:De,y:Le}),D(!0)),C?.(xe)};return s.createElement(s.Fragment,null,s.createElement("div",ee({},j,{className:ge,onClick:pe?et:C,style:T({width:f,height:v},R)}),s.createElement("img",ee({},ve,{className:Q("".concat(u,"-img"),fe({},"".concat(u,"-img-placeholder"),i===!0),b),style:T({height:v},h),ref:ne},le,{width:f,height:v,onError:E})),me==="loading"&&s.createElement("div",{"aria-hidden":"true",className:"".concat(u,"-placeholder")},i),$&&pe&&s.createElement("div",{className:Q("".concat(u,"-mask"),B),style:{display:h?.display==="none"?"none":void 0}},$)),!H&&pe&&s.createElement(qt,ee({"aria-hidden":!te,visible:te,prefixCls:c,onClose:Se,mousePosition:_,src:A,alt:r,imageInfo:{width:f,height:v},fallback:g,getContainer:k,icons:J,movable:G,scaleStep:W,minScale:X,maxScale:K,rootClassName:x,imageRender:Y,imgCommonProps:ve,toolbarRender:re},Z)))};xt.PreviewGroup=Jn;var rr={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M672 418H144c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H188V494h440v326z"}},{tag:"path",attrs:{d:"M819.3 328.5c-78.8-100.7-196-153.6-314.6-154.2l-.2-64c0-6.5-7.6-10.1-12.6-6.1l-128 101c-4 3.1-3.9 9.1 0 12.3L492 318.6c5.1 4 12.7.4 12.6-6.1v-63.9c12.9.1 25.9.9 38.8 2.5 42.1 5.2 82.1 18.2 119 38.7 38.1 21.2 71.2 49.7 98.4 84.3 27.1 34.7 46.7 73.7 58.1 115.8a325.95 325.95 0 016.5 140.9h74.9c14.8-103.6-11.3-213-81-302.3z"}}]},name:"rotate-left",theme:"outlined"},or=function(t,n){return s.createElement(Re,ee({},t,{ref:n,icon:rr}))},ar=s.forwardRef(or),ir={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M480.5 251.2c13-1.6 25.9-2.4 38.8-2.5v63.9c0 6.5 7.5 10.1 12.6 6.1L660 217.6c4-3.2 4-9.2 0-12.3l-128-101c-5.1-4-12.6-.4-12.6 6.1l-.2 64c-118.6.5-235.8 53.4-314.6 154.2A399.75 399.75 0 00123.5 631h74.9c-.9-5.3-1.7-10.7-2.4-16.1-5.1-42.1-2.1-84.1 8.9-124.8 11.4-42.2 31-81.1 58.1-115.8 27.2-34.7 60.3-63.2 98.4-84.3 37-20.6 76.9-33.6 119.1-38.8z"}},{tag:"path",attrs:{d:"M880 418H352c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H396V494h440v326z"}}]},name:"rotate-right",theme:"outlined"},sr=function(t,n){return s.createElement(Re,ee({},t,{ref:n,icon:ir}))},lr=s.forwardRef(sr),cr={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M847.9 592H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h605.2L612.9 851c-4.1 5.2-.4 13 6.3 13h72.5c4.9 0 9.5-2.2 12.6-6.1l168.8-214.1c16.5-21 1.6-51.8-25.2-51.8zM872 356H266.8l144.3-183c4.1-5.2.4-13-6.3-13h-72.5c-4.9 0-9.5 2.2-12.6 6.1L150.9 380.2c-16.5 21-1.6 51.8 25.1 51.8h696c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z"}}]},name:"swap",theme:"outlined"},ur=function(t,n){return s.createElement(Re,ee({},t,{ref:n,icon:cr}))},Ot=s.forwardRef(ur),dr={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M637 443H519V309c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v134H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h118v134c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V519h118c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z"}}]},name:"zoom-in",theme:"outlined"},fr=function(t,n){return s.createElement(Re,ee({},t,{ref:n,icon:dr}))},mr=s.forwardRef(fr),gr={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M637 443H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h312c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z"}}]},name:"zoom-out",theme:"outlined"},vr=function(t,n){return s.createElement(Re,ee({},t,{ref:n,icon:gr}))},pr=s.forwardRef(vr);const gt=e=>({position:e||"absolute",inset:0}),hr=e=>{const{iconCls:t,motionDurationSlow:n,paddingXXS:r,marginXXS:o,prefixCls:l,colorTextLightSolid:u}=e;return{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",color:u,background:new Ie("#000").setA(.5).toRgbString(),cursor:"pointer",opacity:0,transition:`opacity ${n}`,[`.${l}-mask-info`]:Object.assign(Object.assign({},vn),{padding:`0 ${Xe(r)}`,[t]:{marginInlineEnd:o,svg:{verticalAlign:"baseline"}}})}},xr=e=>{const{previewCls:t,modalMaskBg:n,paddingSM:r,marginXL:o,margin:l,paddingLG:u,previewOperationColorDisabled:d,previewOperationHoverColor:c,motionDurationSlow:i,iconCls:g,colorTextLightSolid:f}=e,v=new Ie(n).setA(.1),h=v.clone().setA(.2);return{[`${t}-footer`]:{position:"fixed",bottom:o,left:{_skip_check_:!0,value:"50%"},display:"flex",flexDirection:"column",alignItems:"center",color:e.previewOperationColor,transform:"translateX(-50%)"},[`${t}-progress`]:{marginBottom:l},[`${t}-close`]:{position:"fixed",top:o,right:{_skip_check_:!0,value:o},display:"flex",color:f,backgroundColor:v.toRgbString(),borderRadius:"50%",padding:r,outline:0,border:0,cursor:"pointer",transition:`all ${i}`,"&:hover":{backgroundColor:h.toRgbString()},[`& > ${g}`]:{fontSize:e.previewOperationSize}},[`${t}-operations`]:{display:"flex",alignItems:"center",padding:`0 ${Xe(u)}`,backgroundColor:v.toRgbString(),borderRadius:100,"&-operation":{marginInlineStart:r,padding:r,cursor:"pointer",transition:`all ${i}`,userSelect:"none",[`&:not(${t}-operations-operation-disabled):hover > ${g}`]:{color:c},"&-disabled":{color:d,cursor:"not-allowed"},"&:first-of-type":{marginInlineStart:0},[`& > ${g}`]:{fontSize:e.previewOperationSize}}}}},wr=e=>{const{modalMaskBg:t,iconCls:n,previewOperationColorDisabled:r,previewCls:o,zIndexPopup:l,motionDurationSlow:u}=e,d=new Ie(t).setA(.1),c=d.clone().setA(.2);return{[`${o}-switch-left, ${o}-switch-right`]:{position:"fixed",insetBlockStart:"50%",zIndex:e.calc(l).add(1).equal(),display:"flex",alignItems:"center",justifyContent:"center",width:e.imagePreviewSwitchSize,height:e.imagePreviewSwitchSize,marginTop:e.calc(e.imagePreviewSwitchSize).mul(-1).div(2).equal(),color:e.previewOperationColor,background:d.toRgbString(),borderRadius:"50%",transform:"translateY(-50%)",cursor:"pointer",transition:`all ${u}`,userSelect:"none","&:hover":{background:c.toRgbString()},"&-disabled":{"&, &:hover":{color:r,background:"transparent",cursor:"not-allowed",[`> ${n}`]:{cursor:"not-allowed"}}},[`> ${n}`]:{fontSize:e.previewOperationSize}},[`${o}-switch-left`]:{insetInlineStart:e.marginSM},[`${o}-switch-right`]:{insetInlineEnd:e.marginSM}}},yr=e=>{const{motionEaseOut:t,previewCls:n,motionDurationSlow:r,componentCls:o}=e;return[{[`${o}-preview-root`]:{[n]:{height:"100%",textAlign:"center",pointerEvents:"none"},[`${n}-body`]:Object.assign(Object.assign({},gt()),{overflow:"hidden"}),[`${n}-img`]:{maxWidth:"100%",maxHeight:"70%",verticalAlign:"middle",transform:"scale3d(1, 1, 1)",cursor:"grab",transition:`transform ${r} ${t} 0s`,userSelect:"none","&-wrapper":Object.assign(Object.assign({},gt()),{transition:`transform ${r} ${t} 0s`,display:"flex",justifyContent:"center",alignItems:"center","& > *":{pointerEvents:"auto"},"&::before":{display:"inline-block",width:1,height:"50%",marginInlineEnd:-1,content:'""'}})},[`${n}-moving`]:{[`${n}-preview-img`]:{cursor:"grabbing","&-wrapper":{transitionDuration:"0s"}}}}},{[`${o}-preview-root`]:{[`${n}-wrap`]:{zIndex:e.zIndexPopup}}},{[`${o}-preview-operations-wrapper`]:{position:"fixed",zIndex:e.calc(e.zIndexPopup).add(1).equal()},"&":[xr(e),wr(e)]}]},Cr=e=>{const{componentCls:t}=e;return{[t]:{position:"relative",display:"inline-block",[`${t}-img`]:{width:"100%",height:"auto",verticalAlign:"middle"},[`${t}-img-placeholder`]:{backgroundColor:e.colorBgContainerDisabled,backgroundImage:"url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=')",backgroundRepeat:"no-repeat",backgroundPosition:"center center",backgroundSize:"30%"},[`${t}-mask`]:Object.assign({},hr(e)),[`${t}-mask:hover`]:{opacity:1},[`${t}-placeholder`]:Object.assign({},gt())}}},br=e=>{const{previewCls:t}=e;return{[`${t}-root`]:gn(e,"zoom"),"&":Mn(e,!0)}},Sr=e=>({zIndexPopup:e.zIndexPopupBase+80,previewOperationColor:new Ie(e.colorTextLightSolid).setA(.65).toRgbString(),previewOperationHoverColor:new Ie(e.colorTextLightSolid).setA(.85).toRgbString(),previewOperationColorDisabled:new Ie(e.colorTextLightSolid).setA(.25).toRgbString(),previewOperationSize:e.fontSizeIcon*1.5}),Qt=Nt("Image",e=>{const t=`${e.componentCls}-preview`,n=it(e,{previewCls:t,modalMaskBg:new Ie("#000").setA(.45).toRgbString(),imagePreviewSwitchSize:e.controlHeightLG});return[Cr(n),yr(n),Rn(it(n,{componentCls:t})),br(n)]},Sr);var jr=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]]);return n};const Jt={rotateLeft:s.createElement(ar,null),rotateRight:s.createElement(lr,null),zoomIn:s.createElement(mr,null),zoomOut:s.createElement(pr,null),close:s.createElement(pn,null),left:s.createElement(Ye,null),right:s.createElement(ct,null),flipX:s.createElement(Ot,null),flipY:s.createElement(Ot,{rotate:90})},Ir=e=>{var{previewPrefixCls:t,preview:n}=e,r=jr(e,["previewPrefixCls","preview"]);const{getPrefixCls:o,direction:l}=s.useContext(Ke),u=o("image",t),d=`${u}-preview`,c=o(),i=Tt(u),[g,f,v]=Qt(u,i),[h]=kt("ImagePreview",typeof n=="object"?n.zIndex:void 0),m=s.useMemo(()=>Object.assign(Object.assign({},Jt),{left:l==="rtl"?s.createElement(ct,null):s.createElement(Ye,null),right:l==="rtl"?s.createElement(Ye,null):s.createElement(ct,null)}),[l]),p=s.useMemo(()=>{var b;if(n===!1)return n;const C=typeof n=="object"?n:{},E=Q(f,v,i,(b=C.rootClassName)!==null&&b!==void 0?b:"");return Object.assign(Object.assign({},C),{transitionName:He(c,"zoom",C.transitionName),maskTransitionName:He(c,"fade",C.maskTransitionName),rootClassName:E,zIndex:h})},[n,c,h,f,v,i]);return g(s.createElement(xt.PreviewGroup,Object.assign({preview:p,previewPrefixCls:d,icons:m},r)))};var Rt=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]]);return n};const en=e=>{const{prefixCls:t,preview:n,className:r,rootClassName:o,style:l,fallback:u}=e,d=Rt(e,["prefixCls","preview","className","rootClassName","style","fallback"]),{getPrefixCls:c,getPopupContainer:i,className:g,style:f,preview:v,fallback:h}=hn("image"),[m]=xn("Image"),p=c("image",t),b=c(),C=Tt(p),[E,M,R]=Qt(p,C),x=Q(o,M,R,C),j=Q(r,M,g),[S]=kt("ImagePreview",typeof n=="object"?n.zIndex:void 0),w=s.useMemo(()=>{if(n===!1)return n;const y=typeof n=="object"?n:{},{getContainer:N,closeIcon:z,rootClassName:P,destroyOnClose:k,destroyOnHidden:$}=y,B=Rt(y,["getContainer","closeIcon","rootClassName","destroyOnClose","destroyOnHidden"]);return Object.assign(Object.assign({mask:s.createElement("div",{className:`${p}-mask-info`},s.createElement(At,null),m?.preview),icons:Jt},B),{destroyOnClose:$??k,rootClassName:Q(x,P),getContainer:N??i,transitionName:He(b,"zoom",y.transitionName),maskTransitionName:He(b,"fade",y.maskTransitionName),zIndex:S,closeIcon:z??v?.closeIcon})},[n,m,v?.closeIcon]),O=Object.assign(Object.assign({},f),l),I=u??h;return E(s.createElement(xt,Object.assign({prefixCls:p,preview:w,rootClassName:x,className:j,style:O,fallback:I},d)))};en.PreviewGroup=Ir;var Or={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M946.5 505L560.1 118.8l-25.9-25.9a31.5 31.5 0 00-44.4 0L77.5 505a63.9 63.9 0 00-18.8 46c.4 35.2 29.7 63.3 64.9 63.3h42.5V940h691.8V614.3h43.4c17.1 0 33.2-6.7 45.3-18.8a63.6 63.6 0 0018.7-45.3c0-17-6.7-33.1-18.8-45.2zM568 868H456V664h112v204zm217.9-325.7V868H632V640c0-22.1-17.9-40-40-40H432c-22.1 0-40 17.9-40 40v228H238.1V542.3h-96l370-369.7 23.1 23.1L882 542.3h-96.1z"}}]},name:"home",theme:"outlined"},Rr=function(t,n){return s.createElement(Re,ee({},t,{ref:n,icon:Or}))},Mr=s.forwardRef(Rr),Er={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M876.6 239.5c-.5-.9-1.2-1.8-2-2.5-5-5-13.1-5-18.1 0L684.2 409.3l-67.9-67.9L788.7 169c.8-.8 1.4-1.6 2-2.5 3.6-6.1 1.6-13.9-4.5-17.5-98.2-58-226.8-44.7-311.3 39.7-67 67-89.2 162-66.5 247.4l-293 293c-3 3-2.8 7.9.3 11l169.7 169.7c3.1 3.1 8.1 3.3 11 .3l292.9-292.9c85.5 22.8 180.5.7 247.6-66.4 84.4-84.5 97.7-213.1 39.7-311.3zM786 499.8c-58.1 58.1-145.3 69.3-214.6 33.6l-8.8 8.8-.1-.1-274 274.1-79.2-79.2 230.1-230.1s0 .1.1.1l52.8-52.8c-35.7-69.3-24.5-156.5 33.6-214.6a184.2 184.2 0 01144-53.5L537 318.9a32.05 32.05 0 000 45.3l124.5 124.5a32.05 32.05 0 0045.3 0l132.8-132.8c3.7 51.8-14.4 104.8-53.6 143.9z"}}]},name:"tool",theme:"outlined"},Pr=function(t,n){return s.createElement(Re,ee({},t,{ref:n,icon:Er}))},Nr=s.forwardRef(Pr);const Ge={async listFiles(e){return(await ze.listFiles(e)).data.data},async getRecentFiles(e){return(await ze.getRecentFiles(e)).data.data},async getFilePreview(e,t){return(await ze.getFilePreview(e,t)).data},async deleteFile(e,t){await ze.deleteFile(e,t)},async normalizeFiles(e){return(await ze.normalizeFiles(e)).data.data}};function zr(e){const t=$t(),{handleError:n}=vt(),{data:r,isLoading:o,error:l,refetch:u}=Dt({queryKey:Ve.FILES(e),queryFn:()=>Ge.listFiles(e)}),d=Ft({mutationFn:({id:c,path:i,type:g})=>Ge.deleteFile(c,{path:i,type:g}),onSuccess:()=>{t.invalidateQueries({queryKey:Ve.FILES()})},onError:c=>n(c)});return{files:r?.files??[],directories:r?.directories??[],currentPath:r?.currentPath??"",isLoading:o,error:l,refetch:u,deleteFile:d.mutate,deleteFileAsync:d.mutateAsync,isDeleting:d.isPending}}function Tr(e,t){const{data:n,isLoading:r,error:o,refetch:l}=Dt({queryKey:Ve.FILES_PREVIEW(e,t),queryFn:()=>Ge.getFilePreview(e,t),enabled:!!e});return{previewUrl:n?URL.createObjectURL(n):null,previewBlob:n,isLoading:r,error:o,refetch:l}}function kr(){const e=$t(),{handleError:t}=vt(),n=Ft({mutationFn:r=>Ge.normalizeFiles(r),onSuccess:()=>{e.invalidateQueries({queryKey:Ve.FILES()})},onError:r=>t(r)});return{normalize:n.mutate,normalizeAsync:n.mutateAsync,isNormalizing:n.isPending,normalizeResult:n.data}}function $r({currentPath:e,onNavigate:t,onGoBack:n}){const{t:r}=be(),o=[{title:a.jsx(ue,{type:"link",icon:a.jsx(Mr,{}),onClick:()=>t(""),style:{padding:0},children:r("files.root")})},...e?e.split("/").map((l,u,d)=>{const c=d.slice(0,u+1).join("/");return{title:a.jsx(ue,{type:"link",onClick:()=>t(c),style:{padding:0},children:l})}}):[]];return a.jsxs(a.Fragment,{children:[a.jsx(ht,{items:o}),e&&a.jsx(ue,{icon:a.jsx(Ye,{}),onClick:n,children:r("files.goBack")})]})}const{Option:ie}=Oe,{Search:Dr}=Sn;function Lr({searchText:e,onSearchChange:t,dateFilter:n,onDateFilterChange:r,sortBy:o,onSortByChange:l,sortOrder:u,onSortOrderChange:d}){const{t:c}=be();return a.jsxs(pt,{gutter:16,align:"middle",children:[a.jsx(Ce,{flex:"auto",children:a.jsx(Dr,{placeholder:c("files.searchPlaceholder"),allowClear:!0,prefix:a.jsx(wn,{}),value:e,onChange:i=>t(i.target.value),style:{width:"100%"}})}),a.jsx(Ce,{children:a.jsxs(Ne,{children:[a.jsxs(Oe,{value:n,onChange:r,style:{width:140},children:[a.jsx(ie,{value:"all",children:c("files.filterAll")}),a.jsx(ie,{value:"today",children:c("files.filterToday")}),a.jsx(ie,{value:"yesterday",children:c("files.filterYesterday")}),a.jsx(ie,{value:"thisWeek",children:c("files.filterThisWeek")}),a.jsx(ie,{value:"lastWeek",children:c("files.filterLastWeek")}),a.jsx(ie,{value:"thisMonth",children:c("files.filterThisMonth")}),a.jsx(ie,{value:"lastMonth",children:c("files.filterLastMonth")})]}),a.jsxs(Oe,{value:o,onChange:l,style:{width:150},children:[a.jsx(ie,{value:"name",children:c("files.sortByName")}),a.jsx(ie,{value:"time",children:c("files.sortByTime")}),a.jsx(ie,{value:"downloadedAt",children:c("files.sortByDownloadTime")}),a.jsx(ie,{value:"size",children:c("files.sortBySize")}),a.jsx(ie,{value:"type",children:c("files.sortByType")})]}),a.jsx(ue,{icon:u==="asc"?a.jsx(Bt,{}):a.jsx(Xt,{}),onClick:()=>d(u==="asc"?"desc":"asc"),children:c(u==="asc"?"files.ascending":"files.descending")})]})})]})}function Fr({directories:e,files:t,images:n,totalSize:r}){const{t:o}=be();return a.jsxs(pt,{gutter:16,style:{marginBottom:16},children:[a.jsx(Ce,{xs:24,sm:12,md:6,children:a.jsx(Te,{children:a.jsx(_e,{title:o("files.directories"),value:e,prefix:a.jsx(ut,{}),valueStyle:{color:"#1890ff"}})})}),a.jsx(Ce,{xs:24,sm:12,md:6,children:a.jsx(Te,{children:a.jsx(_e,{title:o("files.files"),value:t,prefix:a.jsx(_t,{}),valueStyle:{color:"#52c41a"}})})}),a.jsx(Ce,{xs:24,sm:12,md:6,children:a.jsx(Te,{children:a.jsx(_e,{title:o("files.images"),value:n,prefix:a.jsx(Ze,{}),valueStyle:{color:"#faad14"}})})}),a.jsx(Ce,{xs:24,sm:12,md:6,children:a.jsx(Te,{children:a.jsx(_e,{title:o("files.totalSize"),value:r,valueStyle:{color:"#722ed1"}})})})]})}const ot=[".jpg",".jpeg",".png",".gif",".webp",".bmp"],Mt=[".txt",".md",".text"];function _r({files:e,directories:t,loading:n=!1,sortBy:r,sortOrder:o,onSort:l,onPreview:u,onDelete:d,onNavigate:c}){const{t:i}=be(),g=m=>m?m<1024?`${m} B`:m<1024*1024?`${(m/1024).toFixed(2)} KB`:`${(m/(1024*1024)).toFixed(2)} MB`:"-",f=m=>r!==m?null:o==="asc"?a.jsx(Bt,{}):a.jsx(Xt,{}),v=s.useMemo(()=>[...t,...e],[t,e]),h=[{title:a.jsxs("span",{style:{cursor:"pointer",userSelect:"none"},onClick:()=>l("name"),children:[i("files.name")," ",f("name")]}),dataIndex:"name",key:"name",width:300,ellipsis:{showTitle:!0},render:(m,p)=>a.jsxs("div",{style:{display:"flex",alignItems:"center",width:"100%",minWidth:0},children:[a.jsx("span",{style:{flexShrink:0,marginRight:8},children:p.type==="directory"?a.jsx(ut,{style:{color:"#1890ff",fontSize:16}}):ot.includes(p.extension?.toLowerCase()||"")?a.jsx(Ze,{style:{color:"#52c41a",fontSize:16}}):a.jsx(dt,{style:{fontSize:16}})}),a.jsx(ue,{type:"link",onClick:()=>{p.type==="directory"?c(p.path):u(p)},style:{padding:0,height:"auto",flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",textAlign:"left"},title:m,children:m})]})},{title:a.jsxs("span",{style:{cursor:"pointer",userSelect:"none"},onClick:()=>l("type"),children:[i("files.type")," ",f("type")]}),dataIndex:"type",key:"type",width:120,render:(m,p)=>{if(m==="directory")return a.jsx(Ae,{color:"blue",icon:a.jsx(ut,{}),children:i("files.typeDirectory")});const b=p.extension?.toLowerCase()||"";return ot.includes(b)?a.jsx(Ae,{color:"green",icon:a.jsx(Ze,{}),children:i("files.typeImage")}):Mt.includes(b)?a.jsx(Ae,{color:"orange",icon:a.jsx(dt,{}),children:i("files.typeText")}):a.jsx(Ae,{icon:a.jsx(_t,{}),children:i("files.typeFile")})}},{title:a.jsxs("span",{style:{cursor:"pointer",userSelect:"none"},onClick:()=>l("size"),children:[i("files.size")," ",f("size")]}),dataIndex:"size",key:"size",width:120,render:m=>g(m)},{title:a.jsxs("span",{style:{cursor:"pointer",userSelect:"none"},onClick:()=>l("time"),children:[i("files.modified")," ",f("time")]}),dataIndex:"modified",key:"modified",width:180,render:m=>bt(m)},{title:a.jsxs("span",{style:{cursor:"pointer",userSelect:"none"},onClick:()=>l("downloadedAt"),children:[i("files.downloadedAt")," ",f("downloadedAt")]}),dataIndex:"downloadedAt",key:"downloadedAt",width:180,render:(m,p)=>p.type==="directory"?"-":m?bt(m):a.jsx("span",{style:{color:"#999"},children:i("files.unknown")})},{title:i("files.actions"),key:"action",width:150,fixed:"right",render:(m,p)=>a.jsxs(Ne,{children:[p.type==="file"&&(ot.includes(p.extension?.toLowerCase()||"")||Mt.includes(p.extension?.toLowerCase()||""))&&a.jsx(ue,{type:"link",icon:a.jsx(At,{}),onClick:()=>u(p),size:"small",children:i("files.preview")}),p.type==="file"&&a.jsx(jn,{title:i("files.confirmDelete"),onConfirm:()=>d(p),okText:i("common.ok"),cancelText:i("common.cancel"),children:a.jsx(ue,{type:"link",danger:!0,icon:a.jsx(In,{}),size:"small",children:i("files.delete")})})]})}];return a.jsx("div",{style:{overflowX:"auto"},children:a.jsx(bn,{columns:h,dataSource:v,rowKey:"path",loading:n,scroll:{x:900},pagination:{pageSize:50,showSizeChanger:!0,showTotal:(m,p)=>i("files.displaying",{start:p[0],end:p[1],total:m}),pageSizeOptions:["20","50","100","200"]}})})}const Ar=({title:e="Preview",type:t="custom",content:n,imageUrl:r,loading:o=!1,renderContent:l,width:u=800,showFooter:d=!1,open:c,...i})=>{const g=()=>{if(o)return a.jsx("div",{style:{textAlign:"center",padding:"40px 0"},children:a.jsx(Lt,{indicator:a.jsx(yn,{style:{fontSize:24},spin:!0})})});if(l)return l();switch(t){case"image":return a.jsx("div",{style:{textAlign:"center"},children:a.jsx(en,{src:r||(typeof n=="string"?n:void 0),alt:e,style:{maxWidth:"100%"},preview:!1})});case"text":return a.jsx("div",{style:{maxHeight:"60vh",overflow:"auto",padding:"16px",backgroundColor:"#f5f5f5",borderRadius:"4px",fontFamily:"monospace",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:n});case"json":return a.jsx("div",{style:{maxHeight:"60vh",overflow:"auto",padding:"16px",backgroundColor:"#1f1f1f",borderRadius:"4px",fontFamily:"monospace",fontSize:"12px",color:"#fff"},children:a.jsx("pre",{style:{margin:0,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:(()=>{try{return JSON.stringify(typeof n=="string"?JSON.parse(n):n,null,2)}catch{return typeof n=="string"?n:String(n)}})()})});case"custom":default:return a.jsx("div",{children:n})}};return a.jsx(Yt,{title:e,open:c,width:u,footer:d?i.footer:null,...i,children:g()})},Br=[".jpg",".jpeg",".png",".gif",".webp",".bmp"],Xr=[".txt",".md",".text"];function Yr({visible:e,file:t,fileType:n,onClose:r}){const{t:o}=be(),[l,u]=s.useState(""),d=t?.extension?.toLowerCase()||"",c=Br.includes(d),i=Xr.includes(d),{previewUrl:g,isLoading:f}=Tr(c?t?.path:void 0,n);if(s.useEffect(()=>{e&&t&&i?(async()=>{try{const m=`/api/files/preview?path=${encodeURIComponent(t.path)}&type=${n}`,p=await fetch(m);if(p.ok){const b=await p.text();u(b)}else We.error(o("files.loadContentFailed")),r()}catch{We.error(o("files.loadContentFailed")),r()}})():e||u("")},[e,t,i,n,o,r]),!t)return null;let v="custom";return c?v="image":i&&(v="text"),a.jsx(Ar,{open:e,title:t.name,type:v,imageUrl:c&&g||void 0,content:i?l:void 0,loading:f||i&&!l&&e,onCancel:r,width:800,showFooter:!1})}const{Option:at}=Oe,{Text:ce}=Ht;function Hr({visible:e,onClose:t}){const{t:n}=be(),{normalizeAsync:r,isNormalizing:o,normalizeResult:l}=kr(),[u,d]=s.useState({dryRun:!0,normalizeNames:!0,reorganize:!0,updateDatabase:!0,type:"all"}),c=async()=>{try{await r({...u,dryRun:!0})}catch{}},i=async()=>{try{await r({...u,dryRun:!1}),t()}catch{}},g=()=>{d({dryRun:!0,normalizeNames:!0,reorganize:!0,updateDatabase:!0,type:"all"}),t()},f=l?.result;return a.jsx(Yt,{open:e,onCancel:g,title:n("files.normalizeTitle"),width:700,footer:[a.jsx(ue,{onClick:g,children:n("common.cancel")},"cancel"),a.jsx(ue,{onClick:c,loading:o,children:n("files.previewButton")},"preview"),a.jsx(ue,{type:"primary",onClick:i,loading:o,danger:!u.dryRun,children:n("files.executeNormalize")},"execute")],children:a.jsxs(Ne,{direction:"vertical",style:{width:"100%"},size:"large",children:[a.jsx(nt,{message:n("files.normalizeTitle"),description:n("files.normalizeDescription"),type:"info",showIcon:!0}),a.jsxs("div",{children:[a.jsx(ce,{strong:!0,children:n("files.normalizeOptions")}),a.jsxs(Ne,{direction:"vertical",style:{marginTop:8,width:"100%"},children:[a.jsx(rt,{checked:u.normalizeNames,onChange:v=>d({...u,normalizeNames:v.target.checked}),children:n("files.normalizeNames")}),a.jsx(rt,{checked:u.reorganize,onChange:v=>d({...u,reorganize:v.target.checked}),children:n("files.reorganize")}),a.jsx(rt,{checked:u.updateDatabase,onChange:v=>d({...u,updateDatabase:v.target.checked}),children:n("files.updateDatabase")})]})]}),a.jsxs("div",{children:[a.jsx(ce,{strong:!0,children:n("files.fileType")}),a.jsxs(Oe,{value:u.type,onChange:v=>d({...u,type:v}),style:{width:"100%",marginTop:8},children:[a.jsx(at,{value:"all",children:n("files.allTypes")}),a.jsx(at,{value:"illustration",children:n("files.illustrationOnly")}),a.jsx(at,{value:"novel",children:n("files.novelOnly")})]})]}),o&&a.jsxs("div",{style:{textAlign:"center",padding:"20px"},children:[a.jsx(Lt,{size:"large"}),a.jsx("div",{style:{marginTop:16},children:a.jsx(ce,{children:n("files.processing")})})]}),f&&a.jsxs("div",{children:[a.jsx(ce,{strong:!0,children:n("files.normalizeResult")}),a.jsxs(ye,{bordered:!0,column:1,size:"small",style:{marginTop:8},children:[a.jsx(ye.Item,{label:n("files.totalFiles"),children:f.totalFiles}),a.jsx(ye.Item,{label:n("files.processedFiles"),children:f.processedFiles}),a.jsx(ye.Item,{label:n("files.movedFiles"),children:a.jsx(ce,{type:"success",children:f.movedFiles})}),a.jsx(ye.Item,{label:n("files.renamedFiles"),children:a.jsx(ce,{type:"success",children:f.renamedFiles})}),a.jsx(ye.Item,{label:n("files.updatedDatabase"),children:a.jsx(ce,{type:"success",children:f.updatedDatabase})}),a.jsx(ye.Item,{label:n("files.skippedFiles"),children:f.skippedFiles}),a.jsx(ye.Item,{label:n("files.errors"),children:f.errors?.length>0?a.jsx(ce,{type:"danger",children:f.errors.length}):a.jsx(ce,{type:"success",children:"0"})})]}),f.errors&&f.errors.length>0&&a.jsx(nt,{message:n("files.processingErrors"),description:a.jsx("div",{style:{maxHeight:"200px",overflow:"auto"},children:f.errors.map((v,h)=>a.jsxs("div",{style:{marginBottom:8},children:[a.jsxs(ce,{type:"danger",strong:!0,children:[v.file,":"]}),a.jsx(ce,{type:"danger",style:{marginLeft:8},children:v.error})]},h))}),type:"error",style:{marginTop:16}}),u.dryRun&&a.jsx(nt,{message:n("files.previewMode"),description:n("files.previewModeDesc"),type:"warning",style:{marginTop:16}})]})]})})}function Vr(){const[e,t]=s.useState(""),n=s.useCallback(l=>{t(l)},[]),r=s.useCallback(()=>{const l=e.split("/");l.pop(),n(l.join("/"))},[e,n]),o=s.useCallback(()=>{t("")},[]);return{currentPath:e,handleNavigate:n,handleGoBack:r,resetPath:o}}const Wr=[".jpg",".jpeg",".png",".gif",".webp",".bmp"];function Zr(e,t,n){const{t:r}=be(),{handleError:o}=vt(),[l,u]=s.useState(!1),[d,c]=s.useState(null),i=s.useCallback(v=>{if(v.type==="directory"){n?.(v.path);return}const h=v.extension?.toLowerCase()||"",m=Wr.includes(h),p=[".txt",".md",".text"].includes(h);m||p?(c(v),u(!0)):We.info(r("files.previewNotSupported"))},[n,r]),g=s.useCallback(async v=>{try{await e({id:v.name,path:v.path,type:t}),We.success(r("files.fileDeleted"))}catch(h){o(h)}},[e,t,o,r]),f=s.useCallback(()=>{u(!1),c(null)},[]);return{previewVisible:l,previewFile:d,handlePreview:i,handleDelete:g,closePreview:f}}function Ur(e,t,n,r){const o=s.useCallback(c=>{if(c==="all")return{startDate:null,endDate:null};const i=new Date;let g,f=null;switch(c){case"today":g=new Date(i.getFullYear(),i.getMonth(),i.getDate()),f=new Date(i.getFullYear(),i.getMonth(),i.getDate(),23,59,59,999);break;case"yesterday":const v=new Date(i);v.setDate(v.getDate()-1),g=new Date(v.getFullYear(),v.getMonth(),v.getDate()),f=new Date(v.getFullYear(),v.getMonth(),v.getDate(),23,59,59,999);break;case"thisWeek":const h=i.getDay();g=new Date(i),g.setDate(i.getDate()-h),g.setHours(0,0,0,0);break;case"lastWeek":const m=new Date(i);m.setDate(i.getDate()-i.getDay()-7),m.setHours(0,0,0,0),g=m;const p=new Date(m);p.setDate(m.getDate()+6),p.setHours(23,59,59,999),f=p;break;case"thisMonth":g=new Date(i.getFullYear(),i.getMonth(),1);break;case"lastMonth":g=new Date(i.getFullYear(),i.getMonth()-1,1),f=new Date(i.getFullYear(),i.getMonth(),0,23,59,59,999);break;default:g=new Date(0)}return{startDate:g,endDate:f}},[]),l=s.useMemo(()=>{let c=[...t,...e];if(n){const i=n.toLowerCase();c=c.filter(g=>g.name.toLowerCase().includes(i))}if(r!=="all"){const{startDate:i,endDate:g}=o(r);i&&(c=c.filter(f=>{if(f.type==="directory")return!0;if(!f.downloadedAt)return!1;const v=new Date(f.downloadedAt),h=v>=i,m=g?v<=g:!0;return h&&m}))}return c},[t,e,n,r,o]),{filteredDirectories:u,filteredFiles:d}=s.useMemo(()=>{const c=l.filter(g=>g.type==="directory"),i=l.filter(g=>g.type==="file");return{filteredDirectories:c,filteredFiles:i}},[l]);return{filteredDirectories:u,filteredFiles:d}}const Gr=[".jpg",".jpeg",".png",".gif",".webp",".bmp"];function Kr(e,t){return s.useMemo(()=>{const r=[...t,...e],o=r.filter(i=>i.type==="directory").length,l=r.filter(i=>i.type==="file").length,u=r.filter(i=>i.type==="file"&&i.size).reduce((i,g)=>i+(g.size||0),0),d=r.filter(i=>i.type==="file"&&Gr.includes(i.extension?.toLowerCase()||"")).length;return{directories:o,files:l,totalSize:(i=>i<1024?`${i} B`:i<1024*1024?`${(i/1024).toFixed(2)} KB`:`${(i/(1024*1024)).toFixed(2)} MB`)(u),images:d}},[t,e])}const{Title:qr}=Ht,{Option:Et}=Oe;function vo(){const{t:e}=be(),[t,n]=s.useState("illustration"),[r,o]=s.useState(!1),{currentPath:l,handleNavigate:u,handleGoBack:d,resetPath:c}=Vr(),[i,g]=s.useState("type"),[f,v]=s.useState("asc"),[h,m]=s.useState(""),[p,b]=s.useState("all"),{files:C,directories:E,isLoading:M,deleteFileAsync:R}=zr({path:l,type:t,sort:i,order:f,dateFilter:p==="all"?void 0:p}),x=Ur(C,E,h,p),{previewVisible:j,previewFile:S,handlePreview:w,handleDelete:O,closePreview:I}=Zr(R,t,u),y=Kr(C,E),N=P=>{n(P),c(),m("")},z=P=>{i===P?v(f==="asc"?"desc":"asc"):(g(P),v("asc"))};return a.jsxs("div",{children:[a.jsxs(pt,{justify:"space-between",align:"middle",style:{marginBottom:16},children:[a.jsx(Ce,{children:a.jsx(qr,{level:2,style:{margin:0},children:e("files.title")})}),a.jsx(Ce,{children:a.jsxs(Ne,{children:[a.jsxs(Oe,{value:t,onChange:N,style:{width:150},children:[a.jsxs(Et,{value:"illustration",children:[a.jsx(Ze,{})," ",e("dashboard.illustrations")]}),a.jsxs(Et,{value:"novel",children:[a.jsx(dt,{})," ",e("dashboard.novels")]})]}),a.jsx(ue,{type:"primary",icon:a.jsx(Nr,{}),onClick:()=>o(!0),children:e("files.normalizeFiles")})]})})]}),a.jsx(Fr,{directories:y.directories,files:y.files,images:y.images,totalSize:y.totalSize}),a.jsx(Te,{style:{overflow:"hidden"},children:a.jsxs(Ne,{direction:"vertical",style:{width:"100%"},size:"middle",children:[a.jsx(Lr,{searchText:h,onSearchChange:m,dateFilter:p,onDateFilterChange:b,sortBy:i,onSortByChange:g,sortOrder:f,onSortOrderChange:v}),a.jsx($r,{currentPath:l,onNavigate:u,onGoBack:d}),a.jsx(_r,{files:x.filteredFiles,directories:x.filteredDirectories,loading:M,sortBy:i,sortOrder:f,onSort:z,onPreview:w,onDelete:O,onNavigate:u,fileType:t})]})}),a.jsx(Yr,{visible:j,file:S,fileType:t,onClose:I}),a.jsx(Hr,{visible:r,onClose:()=>o(!1)})]})}export{vo as default};
5
- //# sourceMappingURL=Files-CKyc_PdW.js.map