new_durationpicker.tsx 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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 enum DurationPickerType {
  9. moment = 'moment',
  10. normal = 'normal',
  11. long = 'long'
  12. }
  13. export default function NewDurationPicker(props: { value?: any, onChange?: any, color?: string, type?: DurationPickerType }) {
  14. const [items, setItems] = useState<any>([[0]])
  15. const [values, setValues] = useState<any>([0])
  16. const [loaded, setLoaded] = useState(false)
  17. console.log('picker value',props.value)
  18. useEffect(() => {
  19. switch (props.type) {
  20. case DurationPickerType.normal:
  21. setItems(itemDatas())
  22. setValues(itemValues())
  23. break;
  24. case DurationPickerType.long:
  25. setItems(longDatas())
  26. setValues(longValues())
  27. break;
  28. case DurationPickerType.moment:
  29. default:
  30. {
  31. var hours: any = []
  32. var tempValues: any = [props.value / 5]
  33. var array: any = []
  34. for (var i = 0; i <= 12 * 3; i++) {
  35. var count = i * 5;
  36. var hour = Math.floor(count / 60);
  37. var minute = count % 60;
  38. var str = ''
  39. if (hour > 0) {
  40. str = hour + '小时'
  41. }
  42. if (minute > 0) {
  43. str += minute + '分钟'
  44. }
  45. if (hour == 0 && minute == 0) {
  46. str = '0分钟'
  47. }
  48. array.push(str)
  49. }
  50. setItems([array])
  51. setValues(tempValues)
  52. }
  53. break;
  54. }
  55. setLoaded(true)
  56. }, [])
  57. function itemDatas() {
  58. var min: number = 1
  59. var max: number = 23
  60. var step: number = 5
  61. // if (common.duration) {
  62. min = 0//common.duration.min
  63. max = 23//common.duration.max
  64. step = 5//common.duration.step
  65. // }
  66. var minutes: string[] = []
  67. for (let i = 0; i < 60; i += step) {
  68. minutes.push(i + TimeFormatter.getMinutesUnit(i))
  69. }
  70. var hours: string[] = []
  71. for (let i = min; i <= max; i++) {
  72. hours.push(i + TimeFormatter.getHoursUnit(i))
  73. }
  74. return [hours, minutes]
  75. }
  76. function itemValues() {
  77. const seconds = props.value / 1000
  78. const hours = Math.floor(seconds / 3600)
  79. const minutes = Math.floor((seconds % 3600) / 60)
  80. return [hours, Math.floor(minutes / 5)]
  81. }
  82. function longDatas() {
  83. var min = 1
  84. var max = 99
  85. var days: string[] = []
  86. for (let i = min; i <= max; i++) {
  87. days.push(i + TimeFormatter.getDaysUnit(i,true))
  88. }
  89. var hours: string[] = []
  90. for (var i = 0; i < 24; i++) {
  91. hours.push(i + TimeFormatter.getHoursUnit(i))
  92. }
  93. return [days, hours]
  94. }
  95. function longValues() {
  96. if (props.value){
  97. var day = Math.floor(props.value/24)
  98. var hour = props.value%24
  99. return [day-1,hour]
  100. }
  101. return [0, 0]
  102. }
  103. function onPickerChange(e) {
  104. setValues(e.detail.value)
  105. if (props.onChange) {
  106. var list = e.detail.value
  107. switch (props.type) {
  108. case DurationPickerType.normal:
  109. props.onChange(list[0] * 3600 * 1000 + list[1] * 5 * 60 * 1000)
  110. break
  111. case DurationPickerType.long:
  112. props.onChange(list[0]*24+list[1]+24)
  113. break
  114. case DurationPickerType.moment:
  115. default:
  116. props.onChange(list[0] * 5)
  117. break
  118. }
  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. return false
  129. }
  130. if (!loaded) return <View />
  131. const bgStyle = `background-color: ${props.color}1A !important;`
  132. return <PickerView
  133. value={values}
  134. style={{ color: '#000', height: rpxToPx(340), width: rpxToPx(618) }}
  135. onChange={onPickerChange}
  136. indicatorClass="pick_sel_item"
  137. indicatorStyle={bgStyle}//""
  138. immediateChange={true}
  139. className="picker"
  140. >
  141. {
  142. items.map((item, index) => {
  143. return <PickerViewColumn key={index}>
  144. {item.map((obj, j) => {
  145. return (
  146. <Text key={j} style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', color: getColor(index, j) ? props.color ?? MainColorType.fast : '#000' }}>{obj}</Text>
  147. );
  148. })}
  149. </PickerViewColumn>
  150. })
  151. }
  152. </PickerView >
  153. }