hooks.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import {
  2. useCallback,
  3. useEffect,
  4. useRef,
  5. useState,
  6. } from 'react'
  7. import { TaskStatus } from '@/app/components/plugins/types'
  8. import type { PluginStatus } from '@/app/components/plugins/types'
  9. import {
  10. useMutationClearAllTaskPlugin,
  11. useMutationClearTaskPlugin,
  12. usePluginTaskList,
  13. } from '@/service/use-plugins'
  14. export const usePluginTaskStatus = () => {
  15. const {
  16. pluginTasks,
  17. handleRefetch,
  18. } = usePluginTaskList()
  19. const { mutateAsync } = useMutationClearTaskPlugin()
  20. const { mutateAsync: mutateAsyncClearAll } = useMutationClearAllTaskPlugin()
  21. const allPlugins = pluginTasks.map(task => task.plugins.map((plugin) => {
  22. return {
  23. ...plugin,
  24. taskId: task.id,
  25. }
  26. })).flat()
  27. const errorPlugins: PluginStatus[] = []
  28. const successPlugins: PluginStatus[] = []
  29. const runningPlugins: PluginStatus[] = []
  30. allPlugins.forEach((plugin) => {
  31. if (plugin.status === TaskStatus.running)
  32. runningPlugins.push(plugin)
  33. if (plugin.status === TaskStatus.failed)
  34. errorPlugins.push(plugin)
  35. if (plugin.status === TaskStatus.success)
  36. successPlugins.push(plugin)
  37. })
  38. const handleClearErrorPlugin = useCallback(async (taskId: string, pluginId: string) => {
  39. await mutateAsync({
  40. taskId,
  41. pluginId,
  42. })
  43. handleRefetch()
  44. }, [mutateAsync, handleRefetch])
  45. const handleClearAllErrorPlugin = useCallback(async () => {
  46. await mutateAsyncClearAll()
  47. handleRefetch()
  48. }, [mutateAsyncClearAll, handleRefetch])
  49. const totalPluginsLength = allPlugins.length
  50. const runningPluginsLength = runningPlugins.length
  51. const errorPluginsLength = errorPlugins.length
  52. const successPluginsLength = successPlugins.length
  53. const isInstalling = runningPluginsLength > 0 && errorPluginsLength === 0 && successPluginsLength === 0
  54. const isInstallingWithSuccess = runningPluginsLength > 0 && successPluginsLength > 0 && errorPluginsLength === 0
  55. const isInstallingWithError = runningPluginsLength > 0 && errorPluginsLength > 0
  56. const isSuccess = successPluginsLength === totalPluginsLength && totalPluginsLength > 0
  57. const isFailed = runningPluginsLength === 0 && (errorPluginsLength + successPluginsLength) === totalPluginsLength && totalPluginsLength > 0 && errorPluginsLength > 0
  58. const [opacity, setOpacity] = useState(1)
  59. const timerRef = useRef<NodeJS.Timeout | null>(null)
  60. useEffect(() => {
  61. if (isSuccess) {
  62. if (timerRef.current) {
  63. clearTimeout(timerRef.current)
  64. timerRef.current = null
  65. }
  66. if (opacity > 0) {
  67. timerRef.current = setTimeout(() => {
  68. setOpacity(v => v - 0.1)
  69. }, 200)
  70. }
  71. }
  72. if (!isSuccess)
  73. setOpacity(1)
  74. }, [isSuccess, opacity])
  75. return {
  76. errorPlugins,
  77. successPlugins,
  78. runningPlugins,
  79. runningPluginsLength,
  80. errorPluginsLength,
  81. successPluginsLength,
  82. totalPluginsLength,
  83. isInstalling,
  84. isInstallingWithSuccess,
  85. isInstallingWithError,
  86. isSuccess,
  87. isFailed,
  88. handleClearErrorPlugin,
  89. handleClearAllErrorPlugin,
  90. opacity,
  91. }
  92. }