UnknownSpoolModal.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { useTranslation } from 'react-i18next';
  2. import { ConfirmModal } from './ConfirmModal';
  3. import { getSwatchStyle } from '../utils/colors';
  4. import type { UnknownSpoolPrompt } from '../hooks/useUnknownTagPrompt';
  5. interface UnknownSpoolModalProps {
  6. prompt: UnknownSpoolPrompt | null;
  7. isPending: boolean;
  8. onConfirm: () => void;
  9. onCancel: () => void;
  10. }
  11. export function UnknownSpoolModal({ prompt, isPending, onConfirm, onCancel }: UnknownSpoolModalProps) {
  12. const { t } = useTranslation();
  13. if (!prompt) return null;
  14. const location = `${prompt.printer_name} • ${prompt.ams_label} • ${prompt.slot_label}`;
  15. const swatchStyle = prompt.color_hex ? getSwatchStyle(prompt.color_hex) : undefined;
  16. return (
  17. <ConfirmModal
  18. title={t('inventory.unknownSpoolTitle')}
  19. message={t('inventory.unknownSpoolMessage', { location })}
  20. confirmText={t('inventory.addToInventory')}
  21. cancelText={t('common.cancel')}
  22. variant="default"
  23. isLoading={isPending}
  24. loadingText={t('inventory.addToInventoryPending')}
  25. onConfirm={onConfirm}
  26. onCancel={onCancel}
  27. >
  28. <div className="flex items-center gap-3 p-3 rounded-lg bg-bambu-dark-secondary border border-bambu-dark-tertiary">
  29. {swatchStyle && (
  30. <div
  31. className="w-8 h-8 rounded-full border border-black/20 flex-shrink-0"
  32. style={swatchStyle}
  33. aria-label={prompt.color_hex ?? undefined}
  34. />
  35. )}
  36. <div className="min-w-0 flex-1">
  37. <p className="text-white text-sm font-medium truncate">
  38. {prompt.brand ? `${prompt.brand} ${prompt.material ?? ''}`.trim() : prompt.material ?? '—'}
  39. </p>
  40. {prompt.color_hex && (
  41. <p className="text-xs text-bambu-gray font-mono uppercase">#{prompt.color_hex.replace(/^#/, '').slice(0, 6)}</p>
  42. )}
  43. </div>
  44. </div>
  45. </ConfirmModal>
  46. );
  47. }