schedule_item.tsx 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import showAlert from "@/components/basic/Alert";
  2. import { getThemeColor } from "@/features/health/hooks/health_hooks";
  3. import { rpxToPx } from "@/utils/tools";
  4. import { View, Text } from "@tarojs/components";
  5. import { AtSwipeAction } from "taro-ui";
  6. import StatusIndicator, { StatusType } from "../base/status_indicator";
  7. import { MainColorType } from "@/context/themes/color";
  8. import { IconError, IconNotificationOff } from "@/components/basic/Icons";
  9. import { useState } from "react";
  10. import NewModal from "../base/new_modal";
  11. import Card from "./card";
  12. import NewTimePicker from "../base/new_timepicker";
  13. import './schedule_item.scss'
  14. export default function ScheduleItem(props: {
  15. key: any,
  16. obj: any,
  17. highlight?: boolean,
  18. disable?: boolean,
  19. gray?: boolean,
  20. days?: string,
  21. showLine: boolean,
  22. errors: any,
  23. selMode: any,
  24. hideReminderIcon?: boolean,
  25. onDelete?: Function,
  26. onChange?: Function,
  27. index: number,
  28. count: number
  29. }) {
  30. const [showTimePicker, setShowTimePicker] = useState(false)
  31. const [time, setTime] = useState(props.obj.time)
  32. function itemStyle(obj) {
  33. if (obj.is_conflict) {
  34. return {
  35. // backgroundColor: '#FF00001A',
  36. // color: '#FF0000'
  37. backgroundColor: '#B2B2B21A',
  38. color: '#000',
  39. borderColor: '#FF0000',
  40. }
  41. }
  42. if (props.errors.length > 0) {
  43. return {
  44. backgroundColor: '#B2B2B21A',
  45. color: '#000',
  46. borderColor:'transparent'
  47. }
  48. }
  49. return {
  50. backgroundColor: '#B2B2B21A',
  51. color: '#000',
  52. borderColor: obj.window == props.selMode ? getThemeColor(props.selMode) : 'transparent',
  53. }
  54. // return {
  55. // backgroundColor: obj.window == props.selMode ? getThemeColor(props.selMode) + '1A' : '#B2B2B21A',
  56. // color: obj.window == props.selMode ? getThemeColor(props.selMode) : '#000'
  57. // }
  58. }
  59. return <View key={props.key}>
  60. <View className="ss" style={{
  61. borderTopLeftRadius: props.index == 0 ? rpxToPx(26) : 0,
  62. borderTopRightRadius: props.index == 0 ? rpxToPx(26) : 0,
  63. borderBottomLeftRadius: props.index == props.count - 1 ? rpxToPx(26) : 0,
  64. borderBottomRightRadius: props.index == props.count - 1 ? rpxToPx(26) : 0,
  65. }}>
  66. <AtSwipeAction
  67. isOpened={false}
  68. autoClose
  69. disabled={(props.obj.window != 'EAT' && props.obj.window != 'ACTIVE' && !props.disable) || props.obj.window == 'FAST' || props.obj.window == 'SLEEP'}
  70. options={[
  71. {
  72. text: '删除',
  73. style: {
  74. backgroundColor: '#FF4949'
  75. }
  76. }
  77. ]}
  78. onClick={() => {
  79. if (props.obj.window == 'ACTIVE' || props.obj.window == 'EAT') {
  80. // if (item.list.length == 1) {
  81. // Taro.showToast({
  82. // title: '至少保留一项',
  83. // icon: 'none'
  84. // })
  85. // return;
  86. // }
  87. }
  88. showAlert({
  89. title: '删除',
  90. content: '确认删除此计划',
  91. showCancel: true,
  92. cancel: () => {
  93. console.log('cancel')
  94. },
  95. confirm: () => {
  96. if (props.onDelete) {
  97. props.onDelete()
  98. }
  99. }
  100. })
  101. }}
  102. ><View className='schedule_item' style={{
  103. width: rpxToPx(700),
  104. boxSizing: 'border-box',
  105. backgroundColor: props.highlight ? getThemeColor(props.obj.window) + '0D' : '#fff',
  106. }}>
  107. <View className='item_left2'>
  108. <StatusIndicator
  109. type={props.obj.is_conflict ? StatusType.img : StatusType.normal}
  110. text={props.obj.title}
  111. fontSize={rpxToPx(34)}
  112. fontColor="#000"
  113. space={rpxToPx(12)}
  114. color={props.obj.is_conflict ? MainColorType.error : props.errors.length == 0 ? getThemeColor(props.obj.window) : 'transparent'} >
  115. {
  116. props.obj.is_conflict && <IconError color="#fff" width={rpxToPx(26)} />
  117. }
  118. </StatusIndicator>
  119. <View style={{ flex: 1 }} />
  120. {
  121. props.days && <View className="h30" style={{ color: MainColorType.g02 }}>+{props.days} day</View>
  122. }
  123. {
  124. !props.hideReminderIcon && props.obj.specific_time && !props.obj.reminder && <IconNotificationOff color={MainColorType.g03} width={rpxToPx(28)} />
  125. }
  126. <View style={{ width: rpxToPx(12) }} />
  127. {
  128. !props.disable && props.obj.specific_time && <View className='edit_item_time schedule_border' onClick={() => {
  129. // setSelIndex(i)
  130. // setSelItem(obj)
  131. setTime(props.obj.time)
  132. setShowTimePicker(true)
  133. // if (props.onClick)
  134. // props.onClick()
  135. }} style={itemStyle(props.obj)}>{props.obj.time}</View>
  136. }
  137. {
  138. props.disable && <View className="schedule_border" style={{borderColor:'transparent'}}>
  139. <View className="edit_item_time" style={{ backgroundColor: 'transparent', color: props.gray ? MainColorType.g02 : '#000' }}>{props.obj.time}</View>
  140. </View>
  141. }
  142. </View>
  143. {
  144. props.showLine && <View className='border_footer_line' style={{ left: rpxToPx(66) }} />
  145. }
  146. </View>
  147. </AtSwipeAction>
  148. </View>
  149. {
  150. showTimePicker && <NewModal title={props.obj.title}
  151. dismiss={() => { setShowTimePicker(false) }}
  152. confirm={() => {
  153. setShowTimePicker(false)
  154. if (props.onChange)
  155. props.onChange(time)
  156. // props.onChange({
  157. // time: time,
  158. // duration: minutes,
  159. // isYesterday: isYesterday
  160. // })
  161. }}
  162. themeColor={getThemeColor(props.obj.window)}>
  163. <Card>
  164. <View style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
  165. <View className="picker_title" style={{ color: getThemeColor(props.obj.window), width: rpxToPx(618) }}>{time}
  166. <View className="border_footer_line" />
  167. </View>
  168. <NewTimePicker time={time}
  169. color={getThemeColor(props.obj.window)}
  170. onChange={(e) => {
  171. setTime(e)
  172. }}
  173. />
  174. </View>
  175. </Card>
  176. </NewModal>
  177. }
  178. </View>
  179. }