FoodTimelineItem.tsx 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import { View, Image, Text } from "@tarojs/components";
  2. import './FoodTimelineItem.scss'
  3. import Taro from "@tarojs/taro";
  4. import { useTranslation } from "react-i18next";
  5. import { editFoodJournal } from "@/services/foodJournal";
  6. import { useEffect, useState } from "react";
  7. import LimitPickers from "@/components/input/LimitPickers";
  8. import Modal from "@/components/layout/Modal";
  9. import { ColorType } from "@/context/themes/color";
  10. import { useSelector } from "react-redux";
  11. export default function Component(props: { data: any, delete: Function, preview: Function }) {
  12. const common = useSelector((state: any) => state.common);
  13. const [detail, setDetail] = useState(props.data)
  14. const [count, setCount] = useState(0)
  15. const [showModal, setShowModal] = useState(false)
  16. const [isStart, setIsStart] = useState(false)
  17. const { t } = useTranslation()
  18. useEffect(() => {
  19. setDetail(props.data)
  20. }, [props.data])
  21. function preview() {
  22. // Taro.previewImage({
  23. // current: props.data.cover,
  24. // urls: [props.data.cover]
  25. // })
  26. props.preview()
  27. }
  28. function showActionSheet() {
  29. Taro.showActionSheet({
  30. itemList: [t('feature.common.action_sheet.delete'), '餐前时间', '餐后时间']
  31. })
  32. .then(res => {
  33. switch (res.tapIndex) {
  34. case 0:
  35. Taro.showModal({
  36. title: t('feature.common.modal.delete_item_title'),
  37. content: t('feature.common.modal.delete_item_content'),
  38. success: function (res) {
  39. if (res.confirm) {
  40. props.delete();
  41. }
  42. }
  43. })
  44. break;
  45. case 1:
  46. {
  47. setIsStart(true)
  48. setShowModal(true)
  49. }
  50. break;
  51. case 2:
  52. {
  53. setIsStart(false)
  54. setShowModal(true)
  55. }
  56. break;
  57. }
  58. })
  59. .catch(err => {
  60. console.log(err.errMsg)
  61. })
  62. }
  63. function updateTag(index) {
  64. var tag = common.meal_tags[index]
  65. editFoodJournal({
  66. meal_tag: {
  67. code: tag.code
  68. }
  69. }, detail.id).then(res => {
  70. var obj = detail
  71. // obj.tags = [tag]
  72. obj.meal_tag = {
  73. code: tag.code,
  74. label: tag.label
  75. }
  76. setDetail(obj)
  77. setCount(count + 1)
  78. }).catch(e => {
  79. })
  80. }
  81. function updateTime(e) {
  82. var date = new Date(e)
  83. var year = date.getFullYear()
  84. var month = date.getMonth() + 1
  85. var day = date.getDate()
  86. var obj: any;
  87. obj = {
  88. start: {
  89. date: (year + '') + (month < 10 ? '0' + month : month) + (day < 10 ? '0' + day : day),
  90. timestamp: e
  91. }
  92. }
  93. if (!isStart) {
  94. obj = {
  95. end: {
  96. date: (year + '') + (month < 10 ? '0' + month : month) + (day < 10 ? '0' + day : day),
  97. timestamp: e
  98. }
  99. }
  100. }
  101. editFoodJournal({
  102. ...obj
  103. }, detail.id).then(res => {
  104. setDetail(res)
  105. setCount(count + 1)
  106. }).catch(e => {
  107. })
  108. }
  109. function getTime(t) {
  110. var date = new Date(t)
  111. var hour = date.getHours()
  112. var minute = date.getMinutes()
  113. return (hour < 10 ? '0' + hour : hour) + ':' + (minute < 10 ? '0' + minute : minute)
  114. }
  115. return <View className="food_timeline_item" onLongPress={showActionSheet}>
  116. {/* <View className="thumb" style={{backgroundColor:'pink'}}/> */}
  117. <View className="tags">
  118. {
  119. common.meal_tags.map((item, index) => {
  120. return <Text onClick={() => updateTag(index)}>{item.label}</Text>
  121. })
  122. }
  123. </View>
  124. <View className="thumb_bg">
  125. <Image className="thumb" src={detail.cover} mode="aspectFill" onClick={preview} />
  126. <View className="food_desc">
  127. <Text>{detail.meal_tag && detail.meal_tag.label}</Text>
  128. <Text>{detail.start && getTime(detail.start.timestamp)} </Text>
  129. {
  130. detail.end.timestamp && <Text>{'-' + getTime(detail.end.timestamp)}</Text>
  131. }
  132. </View>
  133. </View>
  134. <Text className="food_item_date">{detail.start.date}</Text>
  135. {
  136. showModal && <Modal dismiss={() => { setShowModal(false) }} confirm={() => { setShowModal(false) }}>
  137. <View className='modal_content'>
  138. <LimitPickers
  139. isRealTime={true} time={new Date().getTime()} limit={new Date().getTime() - 120 * 24 * 3600 * 1000}
  140. title={isStart ? '餐前時間' : '餐後時間'}
  141. themeColor={ColorType.fast}
  142. limitDay={120} onCancel={() => { setShowModal(false) }}
  143. onChange={(e) => {
  144. updateTime(e)
  145. setShowModal(false)
  146. }} />
  147. </View>
  148. </Modal>
  149. }
  150. </View>
  151. }