LimitPickers.tsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import { PickerView, PickerViewColumn, View, Text } from "@tarojs/components";
  2. import { forwardRef, useEffect, useImperativeHandle, useState } from "react";
  3. import './LimitPickers.scss'
  4. // export default function Component(props: { limit: number, onChange: Function, onCancel: Function,isRealTime?:boolean,limitDay?:number,time?:number,ref?:any }) {
  5. const Component = forwardRef((props: { limit: number, onChange: Function, onCancel: Function, isRealTime?: boolean, limitDay?: number, time?: number }, ref) => {
  6. const days: string[] = [];
  7. const today = new Date();
  8. const [values, setValues] = useState([props.limitDay ? props.limitDay - 1 : 6, today.getHours(), today.getMinutes()])
  9. useEffect(() => {
  10. if (props.time) {
  11. var date = new Date(props.time)
  12. setValues([(props.limitDay ? props.limitDay - 1 : 6) - getDaysDiff(date), date.getHours(), date.getMinutes()])
  13. }
  14. }, [])
  15. // useEffect(() => {
  16. // setValues([6, today.getHours(), today.getMinutes()])
  17. // }, [props.limit])
  18. for (let i = props.limitDay ? props.limitDay - 1 : 7; i >= 0; i--) {
  19. const date = new Date();
  20. date.setDate(today.getDate() - i);
  21. const month = date.getMonth() + 1;
  22. const day = date.getDate();
  23. const weekday = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'][date.getDay()];
  24. const formattedDate = `${month}月${day}日 ${weekday}`;
  25. if (i == 0) {
  26. days.push('今天 ');
  27. }
  28. else if (i == 1) {
  29. days.push('昨天 ');
  30. }
  31. else {
  32. days.push(formattedDate);
  33. }
  34. }
  35. const hours: number[] = [];
  36. for (let i = 0; i <= 23; i++) {
  37. hours.push(i);
  38. }
  39. const minutes: number[] = [];
  40. for (let i = 0; i <= 59; i++) {
  41. minutes.push(i);
  42. }
  43. function getTimestamp(dateTimeString: string): number {
  44. const timestamp = Date.parse(dateTimeString);
  45. return timestamp;
  46. }
  47. function getDaysDiff(date: Date): number {
  48. const today = new Date();
  49. today.setHours(0, 0, 0, 0);
  50. const targetDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
  51. targetDate.setHours(0, 0, 0, 0);
  52. const timeDiff = today.getTime() - targetDate.getTime();
  53. const daysDiff = Math.floor(timeDiff / (1000 * 60 * 60 * 24));
  54. return daysDiff;
  55. }
  56. function onPickerChange(e) {
  57. var list = e.detail.value
  58. const date = new Date();
  59. date.setDate(today.getDate() - ((props.limitDay ? props.limitDay - 1 : 6) - list[0]));
  60. const year = date.getFullYear();
  61. const month = date.getMonth() + 1;
  62. const day = date.getDate();
  63. const time = `${year}-${expandZero(month)}-${expandZero(day)}T${expandZero(hours[list[1]])}:${expandZero(minutes[list[2]])}:00`;
  64. if (getTimestamp(time) > today.getTime()) {
  65. setValues([list[0], today.getHours(), today.getMinutes()])
  66. }
  67. else {
  68. var limitDate = new Date(props.limit)
  69. // const date = new Date();
  70. // date.setDate(today.getDate() - (6 - list[0]));
  71. // const year = date.getFullYear();
  72. // const month = date.getMonth() + 1;
  73. // const day = date.getDate();
  74. // debugger
  75. // const time = `${year}-${expandZero(month)}-${expandZero(day)}T${expandZero(hours[list[1]])}:${expandZero(minutes[list[2]])}:59`;
  76. if (getTimestamp(time) < props.limit) {
  77. // console.log(6 - getDaysDiff(limitDate))
  78. setValues([(props.limitDay ? props.limitDay - 1 : 6) - getDaysDiff(limitDate), limitDate.getHours(), limitDate.getMinutes()])
  79. return
  80. }
  81. setValues(e.detail.value)
  82. }
  83. }
  84. function expandZero(num: number): string {
  85. return num < 10 ? `0${num}` : `${num}`;
  86. }
  87. function cancel() {
  88. props.onCancel()
  89. }
  90. // function confirm() {
  91. // var date = new Date();
  92. // if (!props.isRealTime) {
  93. // date = new Date(global.set_time);
  94. // }
  95. // date.setDate(today.getDate() - ((props.limitDay ? props.limitDay - 1 : 6) - values[0]));
  96. // date.setHours(values[1])
  97. // date.setMinutes(values[2])
  98. // props.onChange(date.getTime())
  99. // }
  100. function getConfirmData(){
  101. var date = new Date();
  102. if (!props.isRealTime) {
  103. date = new Date(global.set_time);
  104. }
  105. date.setDate(today.getDate() - ((props.limitDay ? props.limitDay - 1 : 6) - values[0]));
  106. date.setHours(values[1])
  107. date.setMinutes(values[2])
  108. return date.getTime()
  109. }
  110. useImperativeHandle(ref, () => ({
  111. getConfirmData:getConfirmData
  112. }));
  113. return <View style={{ backgroundColor: 'transparent', position: 'relative' }}>
  114. <PickerView value={values}
  115. className="picker"
  116. maskClass="picker-mask"
  117. onChange={onPickerChange}
  118. immediateChange={true}
  119. indicatorStyle='height: 50px;'>
  120. <PickerViewColumn style='flex:0 0 45%'>
  121. {days.map(item => {
  122. return (
  123. <View style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>{item}</View>
  124. );
  125. })}
  126. </PickerViewColumn>
  127. <PickerViewColumn>
  128. {hours.map(item => {
  129. return (
  130. <View style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>{item < 10 ? `0${item}` : item}</View>
  131. );
  132. })}
  133. </PickerViewColumn>
  134. <PickerViewColumn>
  135. {minutes.map(item => {
  136. return (
  137. <View style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>{item < 10 ? `0${item}` : item}</View>
  138. );
  139. })}
  140. </PickerViewColumn>
  141. </PickerView>
  142. <View style={{
  143. position: 'absolute', width: '20%', height: 50, backgroundColor: 'transparent', left: '62.5%', top: 125,
  144. display: 'flex', alignItems: 'center', justifyContent: 'center'
  145. }}>
  146. <Text style={{ color: '#000', fontSize: 16, fontWeight: 'bold' }}>:</Text>
  147. </View>
  148. </View>
  149. })
  150. export default Component;