You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.2 KiB

  1. import { Tag, TagProps } from 'antd'
  2. import { useTranslation } from '@/i18n.ts'
  3. import { SyncOutlined } from '@ant-design/icons'
  4. export interface StatusProps extends TagProps {
  5. status: string
  6. }
  7. const getColor = (status: string) => {
  8. if (status.includes('error') || status.includes('err')) {
  9. return 'danger'
  10. }
  11. switch (status) {
  12. case 'running':
  13. return 'success'
  14. case 'stopped':
  15. return 'danger'
  16. case 'unhealthy':
  17. case 'paused':
  18. case 'exited':
  19. case 'dead':
  20. case 'removing':
  21. return 'warning'
  22. default:
  23. return 'default'
  24. }
  25. }
  26. const loadingStatus = [
  27. 'installing',
  28. 'building',
  29. 'restarting',
  30. 'upgrading',
  31. 'rebuilding',
  32. 'recreating',
  33. 'creating',
  34. 'starting',
  35. 'removing',
  36. 'applying',
  37. ]
  38. const loadingIcon = (status: string): boolean => {
  39. return loadingStatus.indexOf(status) > -1
  40. }
  41. export const Status = ({ status = 'running', ...props }: StatusProps) => {
  42. const { t } = useTranslation()
  43. const icon = loadingIcon(status) ? <SyncOutlined spin/> : null
  44. return (
  45. <>
  46. <Tag {...props}
  47. color={getColor(status)}
  48. icon={icon}>{t(`status.${status}`, status)}</Tag>
  49. </>
  50. )
  51. }
  52. export default Status