customers.mapper.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. const HAIR_LENGTH_MAP: Record<string, 'SHORT' | 'MEDIUM' | 'LONG'> = {
  2. Short: 'SHORT',
  3. Medium: 'MEDIUM',
  4. Long: 'LONG',
  5. };
  6. const CONTACT_TYPE_MAP: Record<string, 'LINE' | 'PHONE' | 'EMAIL'> = {
  7. LINE: 'LINE',
  8. Phone: 'PHONE',
  9. Email: 'EMAIL',
  10. };
  11. const LINE_STATUS_MAP: Record<string, 'LINKED' | 'UNLINKED' | 'INVITED' | 'KEEP'> = {
  12. 已关联: 'LINKED',
  13. 已連携: 'LINKED',
  14. 未关联: 'UNLINKED',
  15. 未連携: 'UNLINKED',
  16. 邀请已发送: 'INVITED',
  17. 保留: 'KEEP',
  18. };
  19. const FOLLOW_STATUS_MAP: Record<string, 'NONE' | 'NEED_FOLLOW_UP' | 'SENT'> = {
  20. '': 'NONE',
  21. NONE: 'NONE',
  22. NEED_FOLLOW_UP: 'NEED_FOLLOW_UP',
  23. SENT: 'SENT',
  24. 需跟进: 'NEED_FOLLOW_UP',
  25. 已发送: 'SENT',
  26. 发送计划: 'NEED_FOLLOW_UP',
  27. };
  28. export function normalizeHairLength(value?: string) {
  29. return value ? HAIR_LENGTH_MAP[value] ?? null : null;
  30. }
  31. export function normalizeContactType(value?: string) {
  32. return value ? CONTACT_TYPE_MAP[value] ?? 'LINE' : 'LINE';
  33. }
  34. export function normalizeLineStatus(value?: string) {
  35. return value ? LINE_STATUS_MAP[value] ?? null : null;
  36. }
  37. export function normalizeFollowStatus(value?: string) {
  38. return value == null ? 'NONE' : FOLLOW_STATUS_MAP[value] ?? 'NONE';
  39. }
  40. export function parseDateOnly(value?: string) {
  41. return value ? new Date(`${value}T00:00:00.000Z`) : null;
  42. }
  43. export function formatDateOnly(value: Date | null) {
  44. return value ? value.toISOString().slice(0, 10) : undefined;
  45. }
  46. export function toFrontendHairLength(value: string | null) {
  47. if (!value) {
  48. return undefined;
  49. }
  50. return value[0] + value.slice(1).toLowerCase();
  51. }