new_date_time_picker.tsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. debugger
  40. result.push(string)
  41. date.setDate(date.getDate() + 1)
  42. }
  43. debugger
  44. return result
  45. }
  46. function longValues() {
  47. if (props.date) {
  48. var obj = dayjs(props.date)
  49. const startDate = new Date(props.minTimestamp!)
  50. let date = startDate
  51. for (var i = 0; i < longDatas().length; i++) {
  52. var dt = dayjs(date.getTime())
  53. if (dt.isSame(obj, 'day') && dt.isSame(obj, 'month') && dt.isSame(obj, 'year')) {
  54. return i
  55. }
  56. date.setDate(date.getDate() + 1)
  57. }
  58. }
  59. return 0
  60. }
  61. useEffect(() => {
  62. loadData()
  63. }, [props.count])
  64. function loadData(){
  65. var hours: any = []
  66. var tempValues: any = [longValues(), 0, 0]
  67. var str = props.time ? props.time : dayjs().format('HH:mm')
  68. var tempHour = str.split(':')[0]
  69. var tempMinute = str.split(':')[1]
  70. for (var i = 0; i <= 23; i++) {
  71. var str = (i + '').padStart(2, '0')
  72. if (str == tempHour) {
  73. tempValues[1] = i
  74. }
  75. hours.push(str)
  76. }
  77. var minutes: any = []
  78. for (var i = 0; i <= 59; i++) {
  79. var str = (i + '').padStart(2, '0')
  80. if (str == tempMinute) {
  81. tempValues[2] = i
  82. }
  83. minutes.push(str)
  84. }
  85. // var dates = ['Today', 'Yesterday', 'Dec 31']
  86. setItems([longDatas(), hours, minutes])
  87. setValues(tempValues)
  88. setLoaded(true)
  89. }
  90. useEffect(() => {
  91. var hours: any = []
  92. var tempValues: any = [longValues(), 0, 0]
  93. var str = props.time ? props.time : dayjs().format('HH:mm')
  94. var tempHour = str.split(':')[0]
  95. var tempMinute = str.split(':')[1]
  96. for (var i = 0; i <= 23; i++) {
  97. var str = (i + '').padStart(2, '0')
  98. if (str == tempHour) {
  99. tempValues[1] = i
  100. }
  101. hours.push(str)
  102. }
  103. var minutes: any = []
  104. for (var i = 0; i <= 59; i++) {
  105. var str = (i + '').padStart(2, '0')
  106. if (str == tempMinute) {
  107. tempValues[2] = i
  108. }
  109. minutes.push(str)
  110. }
  111. setValues(tempValues)
  112. }, [props.date, props.time])
  113. function onPickerChange(e) {
  114. setValues(e.detail.value)
  115. if (props.onChange) {
  116. var list = e.detail.value
  117. var timestamp = props.minTimestamp! + list[0] * 24 * 3600 * 1000
  118. var strDate = dayjs(timestamp).format('YYYY-MM-DD')
  119. var strTime = (list[1] + '').padStart(2, '0') + ':' + (list[2] + '').padStart(2, '0')
  120. props.onChange([strDate, strTime])
  121. }
  122. }
  123. function getColor(i, j) {
  124. if (i == 0 && j == values[0]) {
  125. return true
  126. }
  127. if (i == 1 && j == values[1]) {
  128. return true
  129. }
  130. if (i == 2 && j == values[2]) {
  131. return true
  132. }
  133. return false
  134. }
  135. if (!loaded) return <View />
  136. const bgStyle = `background-color: ${props.color}0D !important;`
  137. return <PickerView
  138. value={values}
  139. // itemStyle={{ color: '#000' }}
  140. style={{ color: '#000', height: rpxToPx(340), width: rpxToPx(578) }}
  141. onChange={onPickerChange}
  142. indicatorClass="pick_sel_item"
  143. indicatorStyle={bgStyle}//""
  144. immediateChange={true}
  145. className="picker"
  146. // maskClass={props.hideTitle?"picker-mask-small":"picker-mask"}
  147. >
  148. {
  149. items.map((item, index) => {
  150. return <PickerViewColumn key={index}>
  151. {item.map((obj, j) => {
  152. return (
  153. <Text key={j} className="item_text" style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', color: getColor(index, j) ? props.color ?? MainColorType.fast : '#000' }}>{obj}</Text>
  154. );
  155. })}
  156. </PickerViewColumn>
  157. })
  158. }
  159. </PickerView >
  160. }