new_date_time_picker.tsx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import { rpxToPx } from "@/utils/tools";
  2. import { PickerView, PickerViewColumn, Text, View } from "@tarojs/components";
  3. import { useEffect, useState } from "react";
  4. import './new_timepicker.scss'
  5. import dayjs from "dayjs";
  6. import { MainColorType } from "@/context/themes/color";
  7. import { TimeFormatter } from "@/utils/time_format";
  8. export default function NewDateTimePicker(props: {
  9. count?: number, date?: string, time?: string, onChange?: any, color?: string,
  10. minTimestamp?: number,
  11. maxTimestamp?: number
  12. }) {
  13. const [items, setItems] = useState<any>([[0], [0], [0]])
  14. const [values, setValues] = useState<any>([0, 0, 0])
  15. const [loaded, setLoaded] = useState(false)
  16. function longDatas() {
  17. let result: any = []
  18. var max = props.maxTimestamp ?? new Date().getTime()
  19. const currentDate = new Date(max)
  20. currentDate.setHours(23)
  21. currentDate.setMinutes(59)
  22. currentDate.setSeconds(59)
  23. const startDate = new Date(props.minTimestamp!)
  24. let date = startDate
  25. const today = dayjs();
  26. const yesterday = today.subtract(1, 'day');
  27. while (date <= currentDate) {
  28. var dt = dayjs(date.getTime())
  29. var string = global.language == 'en' ? dt.format('MMM D') : dt.format('MMMD日')
  30. if (TimeFormatter.isToday(date.getTime())) {
  31. string = (global.language == 'en' ? 'Today' : '今天 ')// + string
  32. }
  33. else if (TimeFormatter.isYesterday(date.getTime())) {
  34. string = (global.language == 'en' ? 'Yesterday' : '昨天 ')// + string
  35. }
  36. else if (TimeFormatter.isTimestampInThisWeek(date.getTime())){
  37. string = dt.format('dddd')
  38. }
  39. result.push(string)
  40. date.setDate(date.getDate() + 1)
  41. }
  42. return result
  43. }
  44. function longValues() {
  45. if (props.date) {
  46. var obj = dayjs(props.date)
  47. const startDate = new Date(props.minTimestamp!)
  48. let date = startDate
  49. for (var i = 0; i < longDatas().length; i++) {
  50. var dt = dayjs(date.getTime())
  51. if (dt.isSame(obj, 'day') && dt.isSame(obj, 'month') && dt.isSame(obj, 'year')) {
  52. return i
  53. }
  54. date.setDate(date.getDate() + 1)
  55. }
  56. }
  57. return 0
  58. }
  59. useEffect(() => {
  60. loadData()
  61. }, [props.count])
  62. function loadData(){
  63. var hours: any = []
  64. var tempValues: any = [longValues(), 0, 0]
  65. var str = props.time ? props.time : dayjs().format('HH:mm')
  66. var tempHour = str.split(':')[0]
  67. var tempMinute = str.split(':')[1]
  68. for (var i = 0; i <= 23; i++) {
  69. var str = (i + '').padStart(2, '0')
  70. if (str == tempHour) {
  71. tempValues[1] = i
  72. }
  73. hours.push(str)
  74. }
  75. var minutes: any = []
  76. for (var i = 0; i <= 59; i++) {
  77. var str = (i + '').padStart(2, '0')
  78. if (str == tempMinute) {
  79. tempValues[2] = i
  80. }
  81. minutes.push(str)
  82. }
  83. // var dates = ['Today', 'Yesterday', 'Dec 31']
  84. setItems([longDatas(), hours, minutes])
  85. setValues(tempValues)
  86. setLoaded(true)
  87. }
  88. useEffect(() => {
  89. var hours: any = []
  90. var tempValues: any = [longValues(), 0, 0]
  91. var str = props.time ? props.time : dayjs().format('HH:mm')
  92. var tempHour = str.split(':')[0]
  93. var tempMinute = str.split(':')[1]
  94. for (var i = 0; i <= 23; i++) {
  95. var str = (i + '').padStart(2, '0')
  96. if (str == tempHour) {
  97. tempValues[1] = i
  98. }
  99. hours.push(str)
  100. }
  101. var minutes: any = []
  102. for (var i = 0; i <= 59; i++) {
  103. var str = (i + '').padStart(2, '0')
  104. if (str == tempMinute) {
  105. tempValues[2] = i
  106. }
  107. minutes.push(str)
  108. }
  109. setValues(tempValues)
  110. }, [props.date, props.time])
  111. function onPickerChange(e) {
  112. setValues(e.detail.value)
  113. if (props.onChange) {
  114. var list = e.detail.value
  115. var timestamp = props.minTimestamp! + list[0] * 24 * 3600 * 1000
  116. var strDate = dayjs(timestamp).format('YYYY-MM-DD')
  117. var strTime = (list[1] + '').padStart(2, '0') + ':' + (list[2] + '').padStart(2, '0')
  118. props.onChange([strDate, strTime])
  119. }
  120. }
  121. function getColor(i, j) {
  122. if (i == 0 && j == values[0]) {
  123. return true
  124. }
  125. if (i == 1 && j == values[1]) {
  126. return true
  127. }
  128. if (i == 2 && j == values[2]) {
  129. return true
  130. }
  131. return false
  132. }
  133. if (!loaded) return <View />
  134. const bgStyle = `background-color: ${props.color}0D !important;`
  135. return <PickerView
  136. value={values}
  137. // itemStyle={{ color: '#000' }}
  138. style={{ color: '#000', height: rpxToPx(340), width: rpxToPx(578) }}
  139. onChange={onPickerChange}
  140. indicatorClass="pick_sel_item"
  141. indicatorStyle={bgStyle}//""
  142. immediateChange={true}
  143. className="picker"
  144. // maskClass={props.hideTitle?"picker-mask-small":"picker-mask"}
  145. >
  146. {
  147. items.map((item, index) => {
  148. return <PickerViewColumn key={index}>
  149. {item.map((obj, j) => {
  150. return (
  151. <Text key={j} className="item_text" style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', color: getColor(index, j) ? props.color ?? MainColorType.fast : '#000' }}>{obj}</Text>
  152. );
  153. })}
  154. </PickerViewColumn>
  155. })
  156. }
  157. </PickerView >
  158. }