index.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. import {
  2. useLayoutEffect,
  3. useState
  4. } from "react";
  5. import {
  6. View
  7. } from "react-native";
  8. import stylesheet from "./stylesheet";
  9. import {
  10. NCoreUIKitLocalize,
  11. NCoreUIKitTheme,
  12. DateTimePicker,
  13. PageContainer,
  14. CodeViewer,
  15. SelectBox,
  16. Header,
  17. Switch,
  18. Text
  19. } from "ncore-ui-kit";
  20. import {
  21. useNavigation
  22. } from "@react-navigation/native";
  23. import type RootStackParamList from "../../../navigation/type";
  24. import type {
  25. NativeStackNavigationProp
  26. } from "@react-navigation/native-stack";
  27. import type {
  28. DateTimePickerPickerType,
  29. IDateTimePickerProps
  30. } from "ncore-ui-kit";
  31. const DATE_TIME_PICKER_TYPES: Array<IDateTimePickerProps["type"]> = [
  32. "default",
  33. "danger",
  34. "warning",
  35. "success",
  36. "info",
  37. "question"
  38. ];
  39. const DATE_TIME_PICKER_SPREAD_BEHAVIOURS: Array<IDateTimePickerProps["spreadBehaviour"]> = [
  40. "baseline",
  41. "stretch",
  42. "free"
  43. ];
  44. const DATE_TIME_PICKER_PICKER_TYPES: Array<IDateTimePickerProps["pickerType"]> = [
  45. "date",
  46. "time",
  47. "date-time"
  48. ];
  49. const DATE_TIME_PICKER_VARIANTS: Array<IDateTimePickerProps["variant"]> = [
  50. "single",
  51. "range",
  52. "rrule"
  53. ];
  54. const DATE_TIME_PICKER_TYPES_DATA = DATE_TIME_PICKER_TYPES.map((item) => ({
  55. __title: item as string,
  56. __key: item as string
  57. }));
  58. const DATE_TIME_PICKER_SPREAD_BEHAVIOURS_DATA =
  59. DATE_TIME_PICKER_SPREAD_BEHAVIOURS.map((item) => ({
  60. __title: item as string,
  61. __key: item as string
  62. }));
  63. const DATE_TIME_PICKER_PICKER_TYPES_DATA = DATE_TIME_PICKER_PICKER_TYPES.map(
  64. (item) => ({
  65. __title: item as string,
  66. __key: item as string
  67. }),
  68. );
  69. const DATE_TIME_PICKER_VARIANTS_DATA = DATE_TIME_PICKER_VARIANTS.map(
  70. (item) => ({
  71. __title: item as string,
  72. __key: item as string
  73. }),
  74. );
  75. const DateTimePickerPage = () => {
  76. const {
  77. radiuses,
  78. borders,
  79. spaces,
  80. colors
  81. } = NCoreUIKitTheme.useContext();
  82. const {
  83. localize
  84. } = NCoreUIKitLocalize.useContext();
  85. const navigation = useNavigation<NativeStackNavigationProp<RootStackParamList>>();
  86. const [
  87. spreadIndex,
  88. setSpreadIndex
  89. ] = useState<number>(1);
  90. const [
  91. pickerTypeIndex,
  92. setPickerTypeIndex
  93. ] = useState<number>(0);
  94. const [
  95. variantIndex,
  96. setVariantIndex
  97. ] = useState<number>(0);
  98. const [
  99. typeIndex,
  100. setTypeIndex
  101. ] = useState<number>(0);
  102. const [
  103. isDisabled,
  104. setIsDisabled
  105. ] = useState<boolean>(false);
  106. useLayoutEffect(() => {
  107. navigation.setOptions({
  108. header: () => <Header
  109. title={localize("dateTimePicker-title")}
  110. isWrapSafeareaContext={false}
  111. navigation={navigation}
  112. isGoBackEnable={true}
  113. />,
  114. headerShown: true
  115. });
  116. }, []);
  117. return <PageContainer
  118. scrollViewProps={{
  119. contentContainerStyle: stylesheet.scrollContent
  120. }}
  121. isWorkWithHeaderSpace={false}
  122. scrollViewStyle={[
  123. stylesheet.container
  124. ]}
  125. isScrollable={true}
  126. >
  127. <View
  128. style={[
  129. stylesheet.contentContainer
  130. ]}
  131. >
  132. <Text
  133. style={stylesheet.descText}
  134. variant="bodyMediumSize"
  135. color="mid"
  136. >
  137. {localize("dateTimePicker-desc")}
  138. </Text>
  139. <View
  140. style={[
  141. stylesheet.previewContainer,
  142. {
  143. borderColor: colors.content.border.subtle,
  144. marginBottom: spaces.spacingMd,
  145. borderRadius: radiuses.form,
  146. borderWidth: borders.line,
  147. padding: spaces.spacingMd
  148. }
  149. ]}
  150. >
  151. <DateTimePicker
  152. spreadBehaviour={
  153. DATE_TIME_PICKER_SPREAD_BEHAVIOURS[spreadIndex]
  154. }
  155. pickerType={
  156. DATE_TIME_PICKER_PICKER_TYPES[pickerTypeIndex]
  157. }
  158. variant={DATE_TIME_PICKER_VARIANTS[variantIndex]}
  159. title={localize("dateTimePicker-title")}
  160. type={DATE_TIME_PICKER_TYPES[typeIndex]}
  161. isDisabled={isDisabled}
  162. />
  163. </View>
  164. <View
  165. style={{
  166. marginBottom: spaces.spacingMd
  167. }}
  168. >
  169. <Text
  170. style={{
  171. marginBottom: spaces.spacingSm
  172. }}
  173. variant="headlineSmallSize"
  174. >
  175. {localize("usage")}
  176. </Text>
  177. <CodeViewer
  178. code={"import {\n DateTimePicker\n} from \"ncore-ui-kit\";\n\n<DateTimePicker\n title=\"Title\"\n pickerType=\"date\"\n variant=\"single\"\n type=\"default\"\n/>"}
  179. language="tsx"
  180. />
  181. </View>
  182. <View
  183. style={[
  184. stylesheet.rowContainer,
  185. {
  186. gap: spaces.spacingMd
  187. }
  188. ]}
  189. >
  190. <SelectBox
  191. onChange={(selectedItems) => {
  192. if (selectedItems.length > 0) {
  193. const index = DATE_TIME_PICKER_TYPES.indexOf(
  194. selectedItems[0]!
  195. .__key as IDateTimePickerProps["type"],
  196. );
  197. if (index !== -1) setTypeIndex(index);
  198. }
  199. }}
  200. initialSelectedItems={
  201. DATE_TIME_PICKER_TYPES_DATA[typeIndex]
  202. ? [
  203. DATE_TIME_PICKER_TYPES_DATA[typeIndex]!
  204. ]
  205. : []
  206. }
  207. title={localize("dateTimePicker-changeType")}
  208. titleExtractor={(item) => item.__title}
  209. keyExtractor={(item) => item.__key}
  210. data={DATE_TIME_PICKER_TYPES_DATA}
  211. spreadBehaviour="free"
  212. />
  213. <SelectBox
  214. onChange={(selectedItems) => {
  215. if (selectedItems.length > 0) {
  216. const index =
  217. DATE_TIME_PICKER_SPREAD_BEHAVIOURS.indexOf(
  218. selectedItems[0]!
  219. .__key as IDateTimePickerProps["spreadBehaviour"],
  220. );
  221. if (index !== -1) setSpreadIndex(index);
  222. }
  223. }}
  224. initialSelectedItems={
  225. DATE_TIME_PICKER_SPREAD_BEHAVIOURS_DATA[spreadIndex]
  226. ? [
  227. DATE_TIME_PICKER_SPREAD_BEHAVIOURS_DATA[
  228. spreadIndex
  229. ]!
  230. ]
  231. : []
  232. }
  233. title={localize("dateTimePicker-changeSpread")}
  234. data={DATE_TIME_PICKER_SPREAD_BEHAVIOURS_DATA}
  235. titleExtractor={(item) => item.__title}
  236. keyExtractor={(item) => item.__key}
  237. spreadBehaviour="free"
  238. />
  239. <SelectBox
  240. onChange={(selectedItems) => {
  241. if (selectedItems.length > 0) {
  242. const index =
  243. DATE_TIME_PICKER_PICKER_TYPES.indexOf(
  244. selectedItems[0]!
  245. .__key as DateTimePickerPickerType,
  246. );
  247. if (index !== -1) setPickerTypeIndex(index);
  248. }
  249. }}
  250. initialSelectedItems={
  251. DATE_TIME_PICKER_PICKER_TYPES_DATA[pickerTypeIndex]
  252. ? [
  253. DATE_TIME_PICKER_PICKER_TYPES_DATA[
  254. pickerTypeIndex
  255. ]!
  256. ]
  257. : []
  258. }
  259. data={DATE_TIME_PICKER_PICKER_TYPES_DATA}
  260. titleExtractor={(item) => item.__title}
  261. title={localize(
  262. "dateTimePicker-changePickerType",
  263. )}
  264. keyExtractor={(item) => item.__key}
  265. spreadBehaviour="free"
  266. />
  267. <SelectBox
  268. onChange={(selectedItems) => {
  269. if (selectedItems.length > 0) {
  270. const index = DATE_TIME_PICKER_VARIANTS.indexOf(
  271. selectedItems[0]!
  272. .__key as IDateTimePickerProps["variant"],
  273. );
  274. if (index !== -1) setVariantIndex(index);
  275. }
  276. }}
  277. initialSelectedItems={
  278. DATE_TIME_PICKER_VARIANTS_DATA[variantIndex]
  279. ? [
  280. DATE_TIME_PICKER_VARIANTS_DATA[variantIndex]!
  281. ]
  282. : []
  283. }
  284. title={localize("dateTimePicker-changeVariant")}
  285. titleExtractor={(item) => item.__title}
  286. data={DATE_TIME_PICKER_VARIANTS_DATA}
  287. keyExtractor={(item) => item.__key}
  288. spreadBehaviour="free"
  289. />
  290. <View
  291. style={stylesheet.switchesContainer}
  292. >
  293. <Switch
  294. title={localize(
  295. "dateTimePicker-toggleDisabled",
  296. )}
  297. onPress={() => {
  298. setIsDisabled(!isDisabled);
  299. }}
  300. spreadBehaviour="free"
  301. isActive={isDisabled}
  302. />
  303. </View>
  304. </View>
  305. </View>
  306. </PageContainer>;
  307. };
  308. export default DateTimePickerPage;