DateTimePicker.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { useMemo } from 'react';
  2. import { DatePicker } from 'antd';
  3. import dayjs from 'dayjs';
  4. import type { Dayjs } from 'dayjs';
  5. import { PersianDateTimePicker } from 'persian-calendar-suite';
  6. import { useDatepicker } from '@/hooks/useDatepicker';
  7. import { useTheme } from '@/hooks/useTheme';
  8. import './DateTimePicker.css';
  9. interface DateTimePickerProps {
  10. value: Dayjs | null;
  11. onChange: (next: Dayjs | null) => void;
  12. showTime?: boolean;
  13. format?: string;
  14. placeholder?: string;
  15. disabled?: boolean;
  16. }
  17. const LIGHT_THEME = {
  18. primaryColor: '#1677ff',
  19. backgroundColor: '#ffffff',
  20. borderColor: '#d9d9d9',
  21. hoverColor: 'rgba(22, 119, 255, 0.10)',
  22. selectedTextColor: '#ffffff',
  23. textColor: 'rgba(0, 0, 0, 0.88)',
  24. };
  25. const DARK_THEME = {
  26. primaryColor: '#1677ff',
  27. backgroundColor: '#23252b',
  28. borderColor: 'rgba(255, 255, 255, 0.12)',
  29. hoverColor: 'rgba(22, 119, 255, 0.18)',
  30. selectedTextColor: '#ffffff',
  31. textColor: 'rgba(255, 255, 255, 0.88)',
  32. };
  33. const ULTRA_DARK_THEME = {
  34. primaryColor: '#1677ff',
  35. backgroundColor: '#101013',
  36. borderColor: 'rgba(255, 255, 255, 0.08)',
  37. hoverColor: 'rgba(22, 119, 255, 0.16)',
  38. selectedTextColor: '#ffffff',
  39. textColor: 'rgba(255, 255, 255, 0.88)',
  40. };
  41. export default function DateTimePicker({
  42. value,
  43. onChange,
  44. showTime = true,
  45. format = 'YYYY-MM-DD HH:mm:ss',
  46. placeholder = '',
  47. disabled = false,
  48. }: DateTimePickerProps) {
  49. const { datepicker } = useDatepicker();
  50. const { isDark, isUltra } = useTheme();
  51. const persianTheme = useMemo(() => {
  52. if (isUltra) return ULTRA_DARK_THEME;
  53. if (isDark) return DARK_THEME;
  54. return LIGHT_THEME;
  55. }, [isDark, isUltra]);
  56. if (datepicker === 'jalalian') {
  57. return (
  58. <div className={`jdp-wrap${isDark ? ' jdp-dark' : ''}${isUltra ? ' jdp-ultra' : ''}${disabled ? ' jdp-disabled' : ''}`}>
  59. <PersianDateTimePicker
  60. value={value ? value.valueOf() : null}
  61. onChange={(next: number | string | null) => {
  62. if (next == null || next === '') {
  63. onChange(null);
  64. return;
  65. }
  66. const ms = typeof next === 'number' ? next : Number(next);
  67. if (Number.isFinite(ms)) onChange(dayjs(ms));
  68. }}
  69. showTime={showTime}
  70. outputFormat="timestamp"
  71. persianNumbers
  72. rtlCalendar
  73. theme={persianTheme}
  74. />
  75. </div>
  76. );
  77. }
  78. return (
  79. <DatePicker
  80. value={value}
  81. onChange={(next) => onChange(next || null)}
  82. showTime={showTime ? { format: 'HH:mm:ss' } : false}
  83. format={format}
  84. placeholder={placeholder}
  85. disabled={disabled}
  86. style={{ width: '100%' }}
  87. />
  88. );
  89. }