OpenTimeCom.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. /* eslint-disable prefer-const */
  2. /* eslint-disable no-underscore-dangle */
  3. import React from "react";
  4. import { StyleSheet, LayoutAnimation, Platform, UIManager } from "react-native";
  5. import { range, convert2Digit } from "beeshell/dist/common/utils";
  6. import {
  7. CheckBox,
  8. Layout,
  9. Modal,
  10. Button,
  11. Card,
  12. Text,
  13. MenuItem,
  14. Icon,
  15. } from "@ui-kitten/components";
  16. import { Scrollpicker } from "beeshell";
  17. import { useModel } from "flooks";
  18. import { useBoolean } from "@umijs/hooks";
  19. import moment from "moment";
  20. import OpenTimeUtil from "../Utils/OpenTimeUtil";
  21. if (Platform.OS === "android") {
  22. if (UIManager.setLayoutAnimationEnabledExperimental) {
  23. UIManager.setLayoutAnimationEnabledExperimental(true);
  24. }
  25. }
  26. const styles = StyleSheet.create({
  27. checkBoxAll: {
  28. paddingVertical: 10,
  29. },
  30. checkBoxItem: {
  31. paddingVertical: 2,
  32. paddingHorizontal: 10,
  33. },
  34. time: {
  35. // width: 100,
  36. // height: 300,
  37. },
  38. backdrop: {
  39. backgroundColor: "rgba(0, 0, 0, 0.5)",
  40. },
  41. btnList: {
  42. flexDirection: "row",
  43. justifyContent: "space-between",
  44. paddingTop: 15,
  45. },
  46. hideHeight: {
  47. height: 0,
  48. borderWidth: 0,
  49. },
  50. btn: {
  51. flex: 1,
  52. minWidth: 50,
  53. },
  54. });
  55. const ForwardIcon = props => <Icon {...props} name="arrow-ios-forward" />;
  56. const titleText = (props, title, value) => (
  57. <Text {...props} category="s1" numberOfLines={1} ellipsizeMode="tail">
  58. {title}
  59. <Text category="c1" style={{ paddingLeft: 10 }}>
  60. {value}
  61. </Text>
  62. </Text>
  63. );
  64. export default function OpenTimeCom({ submit, openTime, node$ }) {
  65. const {
  66. MONDAY,
  67. TUESDAY,
  68. WEDNESDAY,
  69. THURSDAY,
  70. FRIDAY,
  71. SATURDAY,
  72. SUNDAY,
  73. every,
  74. confirm,
  75. cancel,
  76. start,
  77. end,
  78. hour,
  79. min,
  80. weekName,
  81. weekWords,
  82. } = useModel("wordsModel");
  83. const open = useBoolean();
  84. const weeks = [
  85. {
  86. key: "MONDAY",
  87. label: MONDAY,
  88. },
  89. {
  90. key: "TUESDAY",
  91. label: TUESDAY,
  92. },
  93. {
  94. key: "WEDNESDAY",
  95. label: WEDNESDAY,
  96. },
  97. {
  98. key: "THURSDAY",
  99. label: THURSDAY,
  100. },
  101. {
  102. key: "FRIDAY",
  103. label: FRIDAY,
  104. },
  105. {
  106. key: "SATURDAY",
  107. label: SATURDAY,
  108. },
  109. {
  110. key: "SUNDAY",
  111. label: SUNDAY,
  112. },
  113. ];
  114. const [checkList, changeChecked] = React.useState([]);
  115. const listItems = weeks.map((item, index) => (
  116. <CheckBox
  117. style={styles.checkBoxItem}
  118. key={index}
  119. checked={checkList.includes(item.key)}
  120. onChange={checked => {
  121. const _checkList = [...checkList];
  122. if (checked) {
  123. _checkList.push(item.key);
  124. } else {
  125. _checkList.splice(_checkList.indexOf(item.key), 1);
  126. }
  127. changeChecked(_checkList);
  128. }}
  129. >
  130. {item.label}
  131. </CheckBox>
  132. ));
  133. const list = React.useMemo(() => {
  134. const hourSum = 24;
  135. const minuteSum = 60;
  136. const hours = range(hourSum / 1).map(item => {
  137. item = convert2Digit(item * 1);
  138. return {
  139. label: `${item} ${hour}`,
  140. value: item,
  141. };
  142. });
  143. const minutes = range(minuteSum / 10).map(item => {
  144. item = convert2Digit(item * 10);
  145. return {
  146. label: `${item} ${min}`,
  147. value: item,
  148. };
  149. });
  150. return [hours, minutes];
  151. }, [open.state]);
  152. const [time1, setTime1] = React.useState([8, 0]);
  153. const [time2, setTime2] = React.useState([20, 0]);
  154. const [showTime1, changeShowTime1] = React.useState(true);
  155. const [showTime2, changeShowTime2] = React.useState(false);
  156. const [showWeek, changeShowWeek] = React.useState(false);
  157. const backOpenTime = React.useMemo(() => {
  158. return new OpenTimeUtil(
  159. moment(`${time1[0]}:${time1[1] * 10}`, "H:m").format("HH:mm:ss"),
  160. moment(`${time2[0]}:${time2[1] * 10}`, "H:m").format("HH:mm:ss"),
  161. checkList.toString(),
  162. weekWords()
  163. );
  164. }, [openTime, checkList, time1, time2]);
  165. const allChecked = React.useMemo(() => {
  166. if (weeks.length === checkList.length) {
  167. return true;
  168. }
  169. return false;
  170. }, [weeks, checkList]);
  171. const indeterminate = React.useMemo(() => {
  172. if (!allChecked && checkList.length > 0) {
  173. return true;
  174. }
  175. return false;
  176. }, [allChecked, checkList]);
  177. const canSubmit = React.useMemo(() => {
  178. if (time1.length === 2 && time2.length === 2 && checkList.length > 0) {
  179. return true;
  180. }
  181. return false;
  182. }, [time1, time2, checkList]);
  183. if (node$) {
  184. node$.useSubscription(() => {
  185. setTime1(openTime.selectStart);
  186. setTime2(openTime.selectEnd);
  187. changeChecked(openTime.getWeek());
  188. open.setTrue();
  189. });
  190. }
  191. function hideElseShow(key) {
  192. changeShowTime1(key === 1);
  193. changeShowTime2(key === 2);
  194. changeShowWeek(key === 3);
  195. LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
  196. }
  197. return (
  198. <>
  199. <Modal
  200. visible={open.state && list.length > 0}
  201. backdropStyle={styles.backdrop}
  202. onBackdropPress={() => {
  203. open.setFalse();
  204. }}
  205. >
  206. <Card disabled appearance="modalCrad" style={{ width: 242 }}>
  207. <Layout>
  208. <MenuItem
  209. appearance="cardContent"
  210. title={props =>
  211. titleText(props, start, backOpenTime.getStartTimeStr())
  212. }
  213. accessoryRight={ForwardIcon}
  214. onPress={() => {
  215. hideElseShow(1);
  216. }}
  217. />
  218. </Layout>
  219. <Card
  220. disabled
  221. appearance="modalCrad"
  222. style={[{ width: 222 }, showTime1 ? {} : styles.hideHeight]}
  223. >
  224. <Scrollpicker
  225. key="time1"
  226. list={list}
  227. proportion={[1, 1]}
  228. offsetCount={1}
  229. value={time1}
  230. onChange={(index, value) => {
  231. const _time1 = [...time1];
  232. _time1[index] = value;
  233. setTime1(_time1);
  234. }}
  235. />
  236. </Card>
  237. <Layout>
  238. <MenuItem
  239. appearance="cardContent"
  240. title={props =>
  241. titleText(props, end, backOpenTime.getEndTimeStr())
  242. }
  243. accessoryRight={ForwardIcon}
  244. onPress={() => {
  245. hideElseShow(2);
  246. }}
  247. />
  248. </Layout>
  249. <Card
  250. disabled
  251. appearance="modalCrad"
  252. style={[{ width: 222 }, showTime2 ? {} : styles.hideHeight]}
  253. >
  254. <Scrollpicker
  255. key="time2"
  256. list={list}
  257. proportion={[1, 1]}
  258. offsetCount={1}
  259. value={time2}
  260. onChange={(index, value) => {
  261. const _time2 = [...time2];
  262. _time2[index] = value;
  263. setTime2(_time2);
  264. }}
  265. />
  266. </Card>
  267. <Layout>
  268. <MenuItem
  269. appearance="cardContent"
  270. title={props =>
  271. titleText(props, weekName, backOpenTime.getWeekStr())
  272. }
  273. accessoryRight={ForwardIcon}
  274. onPress={() => {
  275. hideElseShow(3);
  276. }}
  277. />
  278. </Layout>
  279. <Card
  280. appearance="modalCrad"
  281. style={[showWeek ? {} : styles.hideHeight]}
  282. >
  283. <CheckBox
  284. style={styles.checkBoxAll}
  285. checked={allChecked}
  286. indeterminate={indeterminate}
  287. onChange={checked => {
  288. changeChecked(
  289. checked
  290. ? weeks.map(item => {
  291. return item.key;
  292. })
  293. : []
  294. );
  295. }}
  296. >
  297. {every}
  298. </CheckBox>
  299. {listItems}
  300. </Card>
  301. <Layout style={styles.btnList}>
  302. <Button
  303. style={styles.btn}
  304. appearance="outline"
  305. status="info"
  306. onPress={() => {
  307. open.setFalse();
  308. }}
  309. >
  310. {cancel}
  311. </Button>
  312. <Button
  313. style={[styles.btn, { marginLeft: 10 }]}
  314. disabled={!canSubmit}
  315. onPress={() => {
  316. submit(backOpenTime);
  317. open.setFalse();
  318. }}
  319. >
  320. {confirm}
  321. </Button>
  322. </Layout>
  323. </Card>
  324. </Modal>
  325. </>
  326. );
  327. }