status.tsx 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { ReactNode } from 'react'
  2. import MaterialIcon from '@/shared/components/material-icon'
  3. import OLSpinner from '@/shared/components/ol/ol-spinner'
  4. type Status = 'pending' | 'success' | 'error'
  5. type LinkingStatusProps = {
  6. status: Status
  7. description: string | ReactNode
  8. }
  9. export default function LinkingStatus({
  10. status,
  11. description,
  12. }: LinkingStatusProps) {
  13. return (
  14. <span>
  15. <StatusIcon status={status} />
  16. <span className="small"> {description}</span>
  17. </span>
  18. )
  19. }
  20. type StatusIconProps = {
  21. status: Status
  22. }
  23. function StatusIcon({ status }: StatusIconProps) {
  24. switch (status) {
  25. case 'success':
  26. return (
  27. <MaterialIcon
  28. type="check_circle"
  29. className="settings-widget-status-icon status-success"
  30. />
  31. )
  32. case 'error':
  33. return (
  34. <MaterialIcon
  35. type="cancel"
  36. className="settings-widget-status-icon status-error"
  37. />
  38. )
  39. case 'pending':
  40. return <OLSpinner size="sm" />
  41. default:
  42. return null
  43. }
  44. }