useCellClassName.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { isInRange } from '../utils/dateUtil';
  2. import { getValue } from '../utils/miscUtil';
  3. export default function useCellClassName(_ref) {
  4. let {
  5. cellPrefixCls,
  6. generateConfig,
  7. rangedValue,
  8. hoverRangedValue,
  9. isInView,
  10. isSameCell,
  11. offsetCell,
  12. today,
  13. value
  14. } = _ref;
  15. function getClassName(currentDate) {
  16. const prevDate = offsetCell(currentDate, -1);
  17. const nextDate = offsetCell(currentDate, 1);
  18. const rangeStart = getValue(rangedValue, 0);
  19. const rangeEnd = getValue(rangedValue, 1);
  20. const hoverStart = getValue(hoverRangedValue, 0);
  21. const hoverEnd = getValue(hoverRangedValue, 1);
  22. const isRangeHovered = isInRange(generateConfig, hoverStart, hoverEnd, currentDate);
  23. function isRangeStart(date) {
  24. return isSameCell(rangeStart, date);
  25. }
  26. function isRangeEnd(date) {
  27. return isSameCell(rangeEnd, date);
  28. }
  29. const isHoverStart = isSameCell(hoverStart, currentDate);
  30. const isHoverEnd = isSameCell(hoverEnd, currentDate);
  31. const isHoverEdgeStart = (isRangeHovered || isHoverEnd) && (!isInView(prevDate) || isRangeEnd(prevDate));
  32. const isHoverEdgeEnd = (isRangeHovered || isHoverStart) && (!isInView(nextDate) || isRangeStart(nextDate));
  33. return {
  34. // In view
  35. [`${cellPrefixCls}-in-view`]: isInView(currentDate),
  36. // Range
  37. [`${cellPrefixCls}-in-range`]: isInRange(generateConfig, rangeStart, rangeEnd, currentDate),
  38. [`${cellPrefixCls}-range-start`]: isRangeStart(currentDate),
  39. [`${cellPrefixCls}-range-end`]: isRangeEnd(currentDate),
  40. [`${cellPrefixCls}-range-start-single`]: isRangeStart(currentDate) && !rangeEnd,
  41. [`${cellPrefixCls}-range-end-single`]: isRangeEnd(currentDate) && !rangeStart,
  42. [`${cellPrefixCls}-range-start-near-hover`]: isRangeStart(currentDate) && (isSameCell(prevDate, hoverStart) || isInRange(generateConfig, hoverStart, hoverEnd, prevDate)),
  43. [`${cellPrefixCls}-range-end-near-hover`]: isRangeEnd(currentDate) && (isSameCell(nextDate, hoverEnd) || isInRange(generateConfig, hoverStart, hoverEnd, nextDate)),
  44. // Range Hover
  45. [`${cellPrefixCls}-range-hover`]: isRangeHovered,
  46. [`${cellPrefixCls}-range-hover-start`]: isHoverStart,
  47. [`${cellPrefixCls}-range-hover-end`]: isHoverEnd,
  48. // Range Edge
  49. [`${cellPrefixCls}-range-hover-edge-start`]: isHoverEdgeStart,
  50. [`${cellPrefixCls}-range-hover-edge-end`]: isHoverEdgeEnd,
  51. [`${cellPrefixCls}-range-hover-edge-start-near-range`]: isHoverEdgeStart && isSameCell(prevDate, rangeEnd),
  52. [`${cellPrefixCls}-range-hover-edge-end-near-range`]: isHoverEdgeEnd && isSameCell(nextDate, rangeStart),
  53. // Others
  54. [`${cellPrefixCls}-today`]: isSameCell(today, currentDate),
  55. [`${cellPrefixCls}-selected`]: isSameCell(value, currentDate)
  56. };
  57. }
  58. return getClassName;
  59. }