@expo/ui 55.0.2 → 55.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/expo/modules/ui/AnimatedVisibilityView.kt +130 -0
  4. package/android/src/main/java/expo/modules/ui/CardView.kt +138 -34
  5. package/android/src/main/java/expo/modules/ui/CheckboxView.kt +98 -0
  6. package/android/src/main/java/expo/modules/ui/ChipView.kt +267 -142
  7. package/android/src/main/java/expo/modules/ui/DatePickerView.kt +258 -70
  8. package/android/src/main/java/expo/modules/ui/ExpoUIModule.kt +204 -57
  9. package/android/src/main/java/expo/modules/ui/ModifierRegistry.kt +44 -1
  10. package/android/src/main/java/expo/modules/ui/ProgressView.kt +189 -89
  11. package/android/src/main/java/expo/modules/ui/RadioButtonView.kt +3 -7
  12. package/android/src/main/java/expo/modules/ui/SegmentedButtonView.kt +115 -0
  13. package/android/src/main/java/expo/modules/ui/SegmentedControlView.kt +35 -0
  14. package/android/src/main/java/expo/modules/ui/SliderView.kt +70 -12
  15. package/android/src/main/java/expo/modules/ui/SwitchView.kt +53 -161
  16. package/android/src/main/java/expo/modules/ui/ToggleButtonView.kt +95 -57
  17. package/android/src/main/java/expo/modules/ui/button/Button.kt +117 -158
  18. package/android/src/main/java/expo/modules/ui/button/FloatingActionButton.kt +92 -0
  19. package/android/src/main/java/expo/modules/ui/button/IconButton.kt +73 -86
  20. package/android/src/main/java/expo/modules/ui/menu/DropdownMenu.kt +39 -0
  21. package/android/src/main/java/expo/modules/ui/menu/DropdownMenuItem.kt +70 -0
  22. package/android/src/main/java/expo/modules/ui/menu/DropdownMenuRecords.kt +18 -0
  23. package/build/jetpack-compose/AnimatedVisibility/index.d.ts +134 -0
  24. package/build/jetpack-compose/AnimatedVisibility/index.d.ts.map +1 -0
  25. package/build/jetpack-compose/AnimatedVisibility/symbols.d.ts +3 -0
  26. package/build/jetpack-compose/AnimatedVisibility/symbols.d.ts.map +1 -0
  27. package/build/jetpack-compose/Button/index.d.ts +65 -51
  28. package/build/jetpack-compose/Button/index.d.ts.map +1 -1
  29. package/build/jetpack-compose/Card/index.d.ts +72 -14
  30. package/build/jetpack-compose/Card/index.d.ts.map +1 -1
  31. package/build/jetpack-compose/Checkbox/index.d.ts +73 -0
  32. package/build/jetpack-compose/Checkbox/index.d.ts.map +1 -0
  33. package/build/jetpack-compose/Chip/index.d.ts +247 -27
  34. package/build/jetpack-compose/Chip/index.d.ts.map +1 -1
  35. package/build/jetpack-compose/DatePicker/index.d.ts +38 -3
  36. package/build/jetpack-compose/DatePicker/index.d.ts.map +1 -1
  37. package/build/jetpack-compose/DropdownMenu/DropdownMenuItem.d.ts +70 -0
  38. package/build/jetpack-compose/DropdownMenu/DropdownMenuItem.d.ts.map +1 -0
  39. package/build/jetpack-compose/DropdownMenu/index.d.ts +68 -0
  40. package/build/jetpack-compose/DropdownMenu/index.d.ts.map +1 -0
  41. package/build/jetpack-compose/FloatingActionButton/index.d.ts +150 -0
  42. package/build/jetpack-compose/FloatingActionButton/index.d.ts.map +1 -0
  43. package/build/jetpack-compose/HorizontalFloatingToolbar/index.d.ts +2 -2
  44. package/build/jetpack-compose/HorizontalFloatingToolbar/index.d.ts.map +1 -1
  45. package/build/jetpack-compose/IconButton/index.d.ts +45 -29
  46. package/build/jetpack-compose/IconButton/index.d.ts.map +1 -1
  47. package/build/jetpack-compose/MultiChoiceSegmentedButtonRow/index.d.ts +17 -0
  48. package/build/jetpack-compose/MultiChoiceSegmentedButtonRow/index.d.ts.map +1 -0
  49. package/build/jetpack-compose/Progress/index.d.ts +78 -35
  50. package/build/jetpack-compose/Progress/index.d.ts.map +1 -1
  51. package/build/jetpack-compose/RadioButton/index.d.ts +2 -2
  52. package/build/jetpack-compose/RadioButton/index.d.ts.map +1 -1
  53. package/build/jetpack-compose/SegmentedButton/index.d.ts +74 -0
  54. package/build/jetpack-compose/SegmentedButton/index.d.ts.map +1 -0
  55. package/build/jetpack-compose/SingleChoiceSegmentedButtonRow/index.d.ts +17 -0
  56. package/build/jetpack-compose/SingleChoiceSegmentedButtonRow/index.d.ts.map +1 -0
  57. package/build/jetpack-compose/Slider/index.d.ts +34 -10
  58. package/build/jetpack-compose/Slider/index.d.ts.map +1 -1
  59. package/build/jetpack-compose/Switch/index.d.ts +10 -50
  60. package/build/jetpack-compose/Switch/index.d.ts.map +1 -1
  61. package/build/jetpack-compose/ToggleButton/index.d.ts +60 -32
  62. package/build/jetpack-compose/ToggleButton/index.d.ts.map +1 -1
  63. package/build/jetpack-compose/index.d.ts +5 -4
  64. package/build/jetpack-compose/index.d.ts.map +1 -1
  65. package/build/jetpack-compose/modifiers/index.d.ts +18 -1
  66. package/build/jetpack-compose/modifiers/index.d.ts.map +1 -1
  67. package/build/swift-ui/ProgressView/index.d.ts +1 -5
  68. package/build/swift-ui/ProgressView/index.d.ts.map +1 -1
  69. package/build/swift-ui/Stepper/index.d.ts +3 -3
  70. package/build/swift-ui/Stepper/index.d.ts.map +1 -1
  71. package/build/swift-ui/Text/index.d.ts +33 -1
  72. package/build/swift-ui/Text/index.d.ts.map +1 -1
  73. package/build/swift-ui/modifiers/index.d.ts +22 -1
  74. package/build/swift-ui/modifiers/index.d.ts.map +1 -1
  75. package/build/swift-ui/modifiers/shapes/index.d.ts +2 -2
  76. package/build/swift-ui/types.d.ts +7 -0
  77. package/build/swift-ui/types.d.ts.map +1 -1
  78. package/expo-module.config.json +1 -1
  79. package/ios/BottomSheetView.swift +1 -6
  80. package/ios/ClosedRangeDateRecord.swift +10 -0
  81. package/ios/ColorPickerView.swift +9 -8
  82. package/ios/ConfirmationDialog/ConfirmationDialog.swift +4 -6
  83. package/ios/DatePickerView.swift +7 -5
  84. package/ios/DisclosureGroupView.swift +5 -7
  85. package/ios/ListView.swift +6 -14
  86. package/ios/Modifiers/DefaultScrollAnchorForRoleModifier.swift +32 -0
  87. package/ios/Modifiers/DefaultScrollAnchorModifier.swift +16 -0
  88. package/ios/Modifiers/ViewModifierRegistry.swift +8 -0
  89. package/ios/Picker/PickerView.swift +6 -10
  90. package/ios/Popover/PopoverView.swift +3 -5
  91. package/ios/ProgressView.swift +0 -5
  92. package/ios/SectionView.swift +3 -5
  93. package/ios/SliderView.swift +8 -6
  94. package/ios/StepperView.swift +12 -16
  95. package/ios/TextView.swift +37 -1
  96. package/ios/Toggle/ToggleView.swift +5 -7
  97. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3-sources.jar +0 -0
  98. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3-sources.jar.md5 +1 -0
  99. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3-sources.jar.sha1 +1 -0
  100. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3-sources.jar.sha256 +1 -0
  101. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3-sources.jar.sha512 +1 -0
  102. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.aar +0 -0
  103. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.aar.md5 +1 -0
  104. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.aar.sha1 +1 -0
  105. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.aar.sha256 +1 -0
  106. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.aar.sha512 +1 -0
  107. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{55.0.2/expo.modules.ui-55.0.2.module → 55.0.3/expo.modules.ui-55.0.3.module} +22 -22
  108. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.module.md5 +1 -0
  109. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.module.sha1 +1 -0
  110. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.module.sha256 +1 -0
  111. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.module.sha512 +1 -0
  112. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{55.0.2/expo.modules.ui-55.0.2.pom → 55.0.3/expo.modules.ui-55.0.3.pom} +1 -1
  113. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.pom.md5 +1 -0
  114. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.pom.sha1 +1 -0
  115. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.pom.sha256 +1 -0
  116. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.pom.sha512 +1 -0
  117. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml +4 -4
  118. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.md5 +1 -1
  119. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha1 +1 -1
  120. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha256 +1 -1
  121. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha512 +1 -1
  122. package/package.json +5 -2
  123. package/src/jetpack-compose/AnimatedVisibility/index.tsx +206 -0
  124. package/src/jetpack-compose/AnimatedVisibility/symbols.ts +8 -0
  125. package/src/jetpack-compose/Button/index.tsx +69 -92
  126. package/src/jetpack-compose/Card/index.tsx +105 -29
  127. package/src/jetpack-compose/Checkbox/index.tsx +126 -0
  128. package/src/jetpack-compose/Chip/index.tsx +391 -51
  129. package/src/jetpack-compose/DatePicker/index.tsx +112 -7
  130. package/src/jetpack-compose/DropdownMenu/DropdownMenuItem.tsx +126 -0
  131. package/src/jetpack-compose/DropdownMenu/index.tsx +107 -0
  132. package/src/jetpack-compose/FloatingActionButton/index.tsx +207 -0
  133. package/src/jetpack-compose/HorizontalFloatingToolbar/index.tsx +4 -2
  134. package/src/jetpack-compose/IconButton/index.tsx +49 -56
  135. package/src/jetpack-compose/MultiChoiceSegmentedButtonRow/index.tsx +34 -0
  136. package/src/jetpack-compose/Progress/index.tsx +120 -62
  137. package/src/jetpack-compose/RadioButton/index.tsx +8 -9
  138. package/src/jetpack-compose/SegmentedButton/index.tsx +109 -0
  139. package/src/jetpack-compose/SingleChoiceSegmentedButtonRow/index.tsx +34 -0
  140. package/src/jetpack-compose/Slider/index.tsx +76 -29
  141. package/src/jetpack-compose/Switch/index.tsx +17 -87
  142. package/src/jetpack-compose/ToggleButton/index.tsx +67 -43
  143. package/src/jetpack-compose/index.ts +5 -4
  144. package/src/jetpack-compose/modifiers/index.ts +26 -2
  145. package/src/swift-ui/ProgressView/index.tsx +1 -3
  146. package/src/swift-ui/Stepper/index.tsx +7 -7
  147. package/src/swift-ui/Text/index.tsx +66 -2
  148. package/src/swift-ui/modifiers/index.ts +40 -0
  149. package/src/swift-ui/types.ts +5 -0
  150. package/android/src/main/java/expo/modules/ui/FilterChipView.kt +0 -59
  151. package/android/src/main/java/expo/modules/ui/PickerView.kt +0 -161
  152. package/android/src/main/java/expo/modules/ui/TextButtonView.kt +0 -33
  153. package/android/src/main/java/expo/modules/ui/menu/ContextMenu.kt +0 -183
  154. package/android/src/main/java/expo/modules/ui/menu/ContextMenuRecords.kt +0 -64
  155. package/build/jetpack-compose/Button/types.d.ts +0 -5
  156. package/build/jetpack-compose/Button/types.d.ts.map +0 -1
  157. package/build/jetpack-compose/ContextMenu/Submenu.d.ts +0 -17
  158. package/build/jetpack-compose/ContextMenu/Submenu.d.ts.map +0 -1
  159. package/build/jetpack-compose/ContextMenu/index.d.ts +0 -65
  160. package/build/jetpack-compose/ContextMenu/index.d.ts.map +0 -1
  161. package/build/jetpack-compose/ContextMenu/utils.d.ts +0 -24
  162. package/build/jetpack-compose/ContextMenu/utils.d.ts.map +0 -1
  163. package/build/jetpack-compose/FilterChip/index.d.ts +0 -49
  164. package/build/jetpack-compose/FilterChip/index.d.ts.map +0 -1
  165. package/build/jetpack-compose/Picker/index.d.ts +0 -62
  166. package/build/jetpack-compose/Picker/index.d.ts.map +0 -1
  167. package/build/jetpack-compose/TextButton/index.d.ts +0 -29
  168. package/build/jetpack-compose/TextButton/index.d.ts.map +0 -1
  169. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2-sources.jar +0 -0
  170. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2-sources.jar.md5 +0 -1
  171. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2-sources.jar.sha1 +0 -1
  172. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2-sources.jar.sha256 +0 -1
  173. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2-sources.jar.sha512 +0 -1
  174. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.aar +0 -0
  175. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.aar.md5 +0 -1
  176. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.aar.sha1 +0 -1
  177. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.aar.sha256 +0 -1
  178. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.aar.sha512 +0 -1
  179. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.module.md5 +0 -1
  180. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.module.sha1 +0 -1
  181. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.module.sha256 +0 -1
  182. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.module.sha512 +0 -1
  183. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.pom.md5 +0 -1
  184. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.pom.sha1 +0 -1
  185. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.pom.sha256 +0 -1
  186. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.pom.sha512 +0 -1
  187. package/src/jetpack-compose/Button/types.ts +0 -57
  188. package/src/jetpack-compose/ContextMenu/Submenu.tsx +0 -21
  189. package/src/jetpack-compose/ContextMenu/index.tsx +0 -149
  190. package/src/jetpack-compose/ContextMenu/utils.ts +0 -144
  191. package/src/jetpack-compose/FilterChip/index.tsx +0 -89
  192. package/src/jetpack-compose/Picker/index.tsx +0 -90
  193. package/src/jetpack-compose/TextButton/index.tsx +0 -55
@@ -1,10 +1,16 @@
1
1
  package expo.modules.ui
2
2
 
3
+ import androidx.compose.material3.AlertDialog
4
+ import androidx.compose.ui.res.stringResource
3
5
  import androidx.compose.material3.DatePicker
4
6
  import androidx.compose.material3.DatePickerDefaults
7
+ import androidx.compose.material3.DatePickerDialog
5
8
  import androidx.compose.material3.DatePickerState
6
9
  import androidx.compose.material3.DisplayMode
7
10
  import androidx.compose.material3.ExperimentalMaterial3Api
11
+ import androidx.compose.material3.SelectableDates
12
+ import androidx.compose.material3.Text
13
+ import androidx.compose.material3.TextButton
8
14
  import androidx.compose.material3.TimePicker
9
15
  import androidx.compose.material3.TimePickerDefaults
10
16
  import androidx.compose.material3.TimePickerLayoutType
@@ -28,10 +34,11 @@ data class DatePickerResult(
28
34
  val date: Long?
29
35
  ) : Record
30
36
 
37
+
31
38
  enum class DisplayedComponents(val value: String) : Enumerable {
32
39
  DATE("date"),
33
40
  HOUR_AND_MINUTE("hourAndMinute"),
34
- DATE_AND_TIME("dateAndTime")
41
+ DATE_AND_TIME("dateAndTime") // for alignment with JS, not supported at the moment
35
42
  }
36
43
 
37
44
  enum class Variant(val value: String) : Enumerable {
@@ -90,8 +97,12 @@ class DateTimePickerColorOverrides : Record {
90
97
  @Field val timeSelectorUnselectedContentColor: AndroidColor? = null
91
98
  }
92
99
 
100
+ class SelectableDatesRecord : Record {
101
+ @Field val start: Long? = null
102
+ @Field val end: Long? = null
103
+ }
104
+
93
105
  data class DateTimePickerProps(
94
- val title: String = "",
95
106
  val initialDate: Long? = null,
96
107
  val variant: Variant = Variant.PICKER,
97
108
  val displayedComponents: DisplayedComponents = DisplayedComponents.DATE,
@@ -99,18 +110,242 @@ data class DateTimePickerProps(
99
110
  val is24Hour: Boolean = true,
100
111
  val color: AndroidColor? = null,
101
112
  val elementColors: DateTimePickerColorOverrides = DateTimePickerColorOverrides(),
113
+ val selectableDates: SelectableDatesRecord? = null,
102
114
  val modifiers: ModifierList = emptyList()
103
115
  ) : ComposeProps
104
116
 
117
+ data class DatePickerDialogProps(
118
+ val initialDate: Long? = null,
119
+ val variant: Variant = Variant.PICKER,
120
+ val showVariantToggle: Boolean = true,
121
+ val confirmButtonLabel: String? = null,
122
+ val dismissButtonLabel: String? = null,
123
+ val color: AndroidColor? = null,
124
+ val elementColors: DateTimePickerColorOverrides = DateTimePickerColorOverrides(),
125
+ val selectableDates: SelectableDatesRecord? = null,
126
+ ) : ComposeProps
127
+
128
+ data class TimePickerDialogProps(
129
+ val initialDate: Long? = null,
130
+ val is24Hour: Boolean = true,
131
+ val confirmButtonLabel: String? = null,
132
+ val dismissButtonLabel: String? = null,
133
+ val color: AndroidColor? = null,
134
+ val elementColors: DateTimePickerColorOverrides = DateTimePickerColorOverrides(),
135
+ ) : ComposeProps
136
+
137
+ private fun toUtcDayMillis(localMillis: Long): Long {
138
+ val cal = Calendar.getInstance()
139
+ cal.timeInMillis = localMillis
140
+ val utcCal = Calendar.getInstance(java.util.TimeZone.getTimeZone("UTC"))
141
+ utcCal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0)
142
+ utcCal.set(Calendar.MILLISECOND, 0)
143
+ return utcCal.timeInMillis
144
+ }
145
+
146
+ @OptIn(ExperimentalMaterial3Api::class)
147
+ @Composable
148
+ fun rememberSelectableDates(selectableDatesRecord: SelectableDatesRecord?): SelectableDates {
149
+ val start = selectableDatesRecord?.start
150
+ val end = selectableDatesRecord?.end
151
+ return remember(start, end) {
152
+ if (start != null || end != null) {
153
+ val startUtcDayMillis = start?.let { toUtcDayMillis(it) }
154
+ val endUtcDayMillis = end?.let { toUtcDayMillis(it) }
155
+
156
+ val startYear = start?.let {
157
+ val cal = Calendar.getInstance()
158
+ cal.timeInMillis = it
159
+ cal.get(Calendar.YEAR)
160
+ }
161
+ val endYear = end?.let {
162
+ val cal = Calendar.getInstance()
163
+ cal.timeInMillis = it
164
+ cal.get(Calendar.YEAR)
165
+ }
166
+
167
+ object : SelectableDates {
168
+ override fun isSelectableDate(utcTimeMillis: Long): Boolean {
169
+ if (startUtcDayMillis != null && utcTimeMillis < startUtcDayMillis) return false
170
+ if (endUtcDayMillis != null && utcTimeMillis > endUtcDayMillis) return false
171
+ return true
172
+ }
173
+
174
+ override fun isSelectableYear(year: Int): Boolean {
175
+ if (startYear != null && year < startYear) return false
176
+ if (endYear != null && year > endYear) return false
177
+ return true
178
+ }
179
+ }
180
+ } else {
181
+ DatePickerDefaults.AllDates
182
+ }
183
+ }
184
+ }
185
+
186
+ @OptIn(ExperimentalMaterial3Api::class)
187
+ @Composable
188
+ fun buildDatePickerColors(
189
+ elementColors: DateTimePickerColorOverrides = DateTimePickerColorOverrides(),
190
+ colorProp: androidx.compose.ui.graphics.Color? = null,
191
+ defaults: androidx.compose.material3.DatePickerColors = DatePickerDefaults.colors()
192
+ ): androidx.compose.material3.DatePickerColors {
193
+ return defaults.copy(
194
+ containerColor = elementColors.containerColor.composeOrNull ?: defaults.containerColor,
195
+ titleContentColor = elementColors.titleContentColor.composeOrNull ?: colorProp ?: defaults.titleContentColor,
196
+ headlineContentColor = elementColors.headlineContentColor.composeOrNull ?: colorProp ?: defaults.headlineContentColor,
197
+ weekdayContentColor = elementColors.weekdayContentColor.composeOrNull ?: defaults.weekdayContentColor,
198
+ subheadContentColor = elementColors.subheadContentColor.composeOrNull ?: defaults.subheadContentColor,
199
+ navigationContentColor = elementColors.navigationContentColor.composeOrNull ?: defaults.navigationContentColor,
200
+ yearContentColor = elementColors.yearContentColor.composeOrNull ?: defaults.yearContentColor,
201
+ disabledYearContentColor = elementColors.disabledYearContentColor.composeOrNull ?: defaults.disabledYearContentColor,
202
+ currentYearContentColor = elementColors.currentYearContentColor.composeOrNull ?: defaults.currentYearContentColor,
203
+ selectedYearContentColor = elementColors.selectedYearContentColor.composeOrNull ?: defaults.selectedYearContentColor,
204
+ disabledSelectedYearContentColor = elementColors.disabledSelectedYearContentColor.composeOrNull ?: defaults.disabledSelectedYearContentColor,
205
+ selectedYearContainerColor = elementColors.selectedYearContainerColor.composeOrNull ?: defaults.selectedYearContainerColor,
206
+ disabledSelectedYearContainerColor = elementColors.disabledSelectedYearContainerColor.composeOrNull ?: defaults.disabledSelectedYearContainerColor,
207
+ dayContentColor = elementColors.dayContentColor.composeOrNull ?: defaults.dayContentColor,
208
+ disabledDayContentColor = elementColors.disabledDayContentColor.composeOrNull ?: defaults.disabledDayContentColor,
209
+ selectedDayContentColor = elementColors.selectedDayContentColor.composeOrNull ?: defaults.selectedDayContentColor,
210
+ disabledSelectedDayContentColor = elementColors.disabledSelectedDayContentColor.composeOrNull ?: defaults.disabledSelectedDayContentColor,
211
+ selectedDayContainerColor = elementColors.selectedDayContainerColor.composeOrNull ?: colorProp ?: defaults.selectedDayContainerColor,
212
+ disabledSelectedDayContainerColor = elementColors.disabledSelectedDayContainerColor.composeOrNull ?: defaults.disabledSelectedDayContainerColor,
213
+ todayContentColor = elementColors.todayContentColor.composeOrNull ?: defaults.todayContentColor,
214
+ todayDateBorderColor = elementColors.todayDateBorderColor.composeOrNull ?: colorProp ?: defaults.todayDateBorderColor,
215
+ dayInSelectionRangeContentColor = elementColors.dayInSelectionRangeContentColor.composeOrNull ?: defaults.dayInSelectionRangeContentColor,
216
+ dayInSelectionRangeContainerColor = elementColors.dayInSelectionRangeContainerColor.composeOrNull ?: defaults.dayInSelectionRangeContainerColor,
217
+ dividerColor = elementColors.dividerColor.composeOrNull ?: defaults.dividerColor
218
+ )
219
+ }
220
+
221
+ @OptIn(ExperimentalMaterial3Api::class)
222
+ @Composable
223
+ fun buildTimePickerColors(
224
+ elementColors: DateTimePickerColorOverrides = DateTimePickerColorOverrides(),
225
+ colorProp: androidx.compose.ui.graphics.Color? = null,
226
+ defaults: androidx.compose.material3.TimePickerColors = TimePickerDefaults.colors()
227
+ ): androidx.compose.material3.TimePickerColors {
228
+ return defaults.copy(
229
+ containerColor = elementColors.containerColor.composeOrNull ?: defaults.containerColor,
230
+ clockDialColor = elementColors.clockDialColor.composeOrNull ?: colorProp?.copy(alpha = 0.3f) ?: defaults.clockDialColor,
231
+ clockDialSelectedContentColor = elementColors.clockDialSelectedContentColor.composeOrNull ?: defaults.clockDialSelectedContentColor,
232
+ clockDialUnselectedContentColor = elementColors.clockDialUnselectedContentColor.composeOrNull ?: defaults.clockDialUnselectedContentColor,
233
+ selectorColor = elementColors.selectorColor.composeOrNull ?: colorProp ?: defaults.selectorColor,
234
+ periodSelectorBorderColor = elementColors.periodSelectorBorderColor.composeOrNull ?: defaults.periodSelectorBorderColor,
235
+ periodSelectorSelectedContainerColor = elementColors.periodSelectorSelectedContainerColor.composeOrNull ?: defaults.periodSelectorSelectedContainerColor,
236
+ periodSelectorUnselectedContainerColor = elementColors.periodSelectorUnselectedContainerColor.composeOrNull ?: defaults.periodSelectorUnselectedContainerColor,
237
+ periodSelectorSelectedContentColor = elementColors.periodSelectorSelectedContentColor.composeOrNull ?: defaults.periodSelectorSelectedContentColor,
238
+ periodSelectorUnselectedContentColor = elementColors.periodSelectorUnselectedContentColor.composeOrNull ?: defaults.periodSelectorUnselectedContentColor,
239
+ timeSelectorSelectedContainerColor = elementColors.timeSelectorSelectedContainerColor.composeOrNull ?: colorProp ?: defaults.timeSelectorSelectedContainerColor,
240
+ timeSelectorUnselectedContainerColor = elementColors.timeSelectorUnselectedContainerColor.composeOrNull ?: defaults.timeSelectorUnselectedContainerColor,
241
+ timeSelectorSelectedContentColor = elementColors.timeSelectorSelectedContentColor.composeOrNull ?: defaults.timeSelectorSelectedContentColor,
242
+ timeSelectorUnselectedContentColor = elementColors.timeSelectorUnselectedContentColor.composeOrNull ?: defaults.timeSelectorUnselectedContentColor
243
+ )
244
+ }
245
+
246
+ @OptIn(ExperimentalMaterial3Api::class)
247
+ @Composable
248
+ fun ExpoDatePickerDialogContent(props: DatePickerDialogProps, onDateSelected: (DatePickerResult) -> Unit, onDismissRequest: () -> Unit) {
249
+ val locale = LocalConfiguration.current.locales[0]
250
+ val variant = props.variant.toDisplayMode()
251
+ val selectableDates = rememberSelectableDates(props.selectableDates)
252
+ val fallbackDate = remember { Date().time }
253
+ val initialDate = props.initialDate ?: fallbackDate
254
+
255
+ val state = remember(variant, initialDate, selectableDates) {
256
+ DatePickerState(
257
+ initialDisplayMode = variant,
258
+ locale = locale,
259
+ initialSelectedDateMillis = initialDate,
260
+ initialDisplayedMonthMillis = initialDate,
261
+ yearRange = DatePickerDefaults.YearRange,
262
+ selectableDates = selectableDates
263
+ )
264
+ }
265
+
266
+ val colors = buildDatePickerColors(props.elementColors, props.color.composeOrNull, DatePickerDefaults.colors())
267
+
268
+ DatePickerDialog(
269
+ onDismissRequest = { onDismissRequest() },
270
+ confirmButton = {
271
+ TextButton(onClick = { onDateSelected(DatePickerResult(date = state.selectedDateMillis)) }) {
272
+ Text(props.confirmButtonLabel ?: stringResource(android.R.string.ok))
273
+ }
274
+ },
275
+ dismissButton = {
276
+ TextButton(onClick = { onDismissRequest() }) {
277
+ Text(props.dismissButtonLabel ?: stringResource(android.R.string.cancel))
278
+ }
279
+ },
280
+ colors = colors
281
+ ) {
282
+ DatePicker(
283
+ state = state,
284
+ showModeToggle = props.showVariantToggle,
285
+ colors = colors
286
+ )
287
+ }
288
+ }
289
+
290
+ @OptIn(ExperimentalMaterial3Api::class)
291
+ @Composable
292
+ fun ExpoTimePickerDialogContent(props: TimePickerDialogProps, onDateSelected: (DatePickerResult) -> Unit, onDismissRequest: () -> Unit) {
293
+ val initialDate = props.initialDate
294
+
295
+ val state = remember(initialDate, props.is24Hour) {
296
+ val cal = Calendar.getInstance()
297
+ if (initialDate != null) {
298
+ cal.timeInMillis = initialDate
299
+ }
300
+ TimePickerState(
301
+ initialHour = cal.get(Calendar.HOUR_OF_DAY),
302
+ initialMinute = cal.get(Calendar.MINUTE),
303
+ is24Hour = props.is24Hour
304
+ )
305
+ }
306
+
307
+ val timePickerColors = buildTimePickerColors(props.elementColors, props.color.composeOrNull, TimePickerDefaults.colors())
308
+
309
+ AlertDialog(
310
+ onDismissRequest = { onDismissRequest() },
311
+ confirmButton = {
312
+ TextButton(onClick = {
313
+ val cal = Calendar.getInstance()
314
+ if (initialDate != null) {
315
+ cal.timeInMillis = initialDate
316
+ }
317
+ cal.set(Calendar.HOUR_OF_DAY, state.hour)
318
+ cal.set(Calendar.MINUTE, state.minute)
319
+ onDateSelected(DatePickerResult(date = cal.time.time))
320
+ }) {
321
+ Text(props.confirmButtonLabel ?: stringResource(android.R.string.ok))
322
+ }
323
+ },
324
+ dismissButton = {
325
+ TextButton(onClick = { onDismissRequest() }) {
326
+ Text(props.dismissButtonLabel ?: stringResource(android.R.string.cancel))
327
+ }
328
+ },
329
+ text = {
330
+ TimePicker(
331
+ state = state,
332
+ layoutType = TimePickerLayoutType.Vertical,
333
+ colors = timePickerColors
334
+ )
335
+ }
336
+ )
337
+ }
338
+
105
339
  @OptIn(ExperimentalMaterial3Api::class)
106
340
  @Composable
107
341
  fun FunctionalComposableScope.DateTimePickerContent(props: DateTimePickerProps, onDateSelected: (DatePickerResult) -> Unit) {
342
+ val modifier = ModifierRegistry.applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher)
108
343
  if (props.displayedComponents == DisplayedComponents.HOUR_AND_MINUTE) {
109
- ExpoTimePicker(props = props, modifier = ModifierRegistry.applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher)) {
344
+ ExpoTimePicker(props = props, modifier = modifier) {
110
345
  onDateSelected(it)
111
346
  }
112
347
  } else {
113
- ExpoDatePicker(props = props, modifier = ModifierRegistry.applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher)) {
348
+ ExpoDatePicker(props = props, modifier = modifier) {
114
349
  onDateSelected(it)
115
350
  }
116
351
  }
@@ -122,15 +357,17 @@ fun ExpoDatePicker(modifier: Modifier = Modifier, props: DateTimePickerProps, on
122
357
  val locale = LocalConfiguration.current.locales[0]
123
358
  val variant = props.variant.toDisplayMode()
124
359
  val initialDate = props.initialDate
360
+ val selectableDates = rememberSelectableDates(props.selectableDates)
125
361
 
126
- val state = remember(variant, initialDate) {
362
+ val state = remember(variant, initialDate, selectableDates) {
363
+ val fallbackDate = Date().time
127
364
  DatePickerState(
128
365
  initialDisplayMode = variant,
129
366
  locale = locale,
130
- initialSelectedDateMillis = initialDate ?: Date().time,
131
- initialDisplayedMonthMillis = initialDate ?: Date().time,
367
+ initialSelectedDateMillis = initialDate ?: fallbackDate,
368
+ initialDisplayedMonthMillis = initialDate ?: fallbackDate,
132
369
  yearRange = DatePickerDefaults.YearRange,
133
- selectableDates = DatePickerDefaults.AllDates
370
+ selectableDates = selectableDates
134
371
  )
135
372
  }
136
373
 
@@ -138,96 +375,47 @@ fun ExpoDatePicker(modifier: Modifier = Modifier, props: DateTimePickerProps, on
138
375
  onDateSelected(DatePickerResult(date = state.selectedDateMillis))
139
376
  }
140
377
 
141
- val elementColors = props.elementColors
142
- val colorProp = props.color.composeOrNull
143
- val defaults = DatePickerDefaults.colors()
144
-
145
378
  DatePicker(
146
379
  modifier = modifier,
147
380
  state = state,
148
381
  showModeToggle = props.showVariantToggle,
149
- colors = DatePickerDefaults.colors().copy(
150
- containerColor = elementColors.containerColor.composeOrNull ?: defaults.containerColor,
151
- titleContentColor = elementColors.titleContentColor.composeOrNull ?: colorProp ?: defaults.titleContentColor,
152
- headlineContentColor = elementColors.headlineContentColor.composeOrNull ?: colorProp ?: defaults.headlineContentColor,
153
- weekdayContentColor = elementColors.weekdayContentColor.composeOrNull ?: defaults.weekdayContentColor,
154
- subheadContentColor = elementColors.subheadContentColor.composeOrNull ?: defaults.subheadContentColor,
155
- navigationContentColor = elementColors.navigationContentColor.composeOrNull ?: defaults.navigationContentColor,
156
- yearContentColor = elementColors.yearContentColor.composeOrNull ?: defaults.yearContentColor,
157
- disabledYearContentColor = elementColors.disabledYearContentColor.composeOrNull ?: defaults.disabledYearContentColor,
158
- currentYearContentColor = elementColors.currentYearContentColor.composeOrNull ?: defaults.currentYearContentColor,
159
- selectedYearContentColor = elementColors.selectedYearContentColor.composeOrNull ?: defaults.selectedYearContentColor,
160
- disabledSelectedYearContentColor = elementColors.disabledSelectedYearContentColor.composeOrNull ?: defaults.disabledSelectedYearContentColor,
161
- selectedYearContainerColor = elementColors.selectedYearContainerColor.composeOrNull ?: defaults.selectedYearContainerColor,
162
- disabledSelectedYearContainerColor = elementColors.disabledSelectedYearContainerColor.composeOrNull ?: defaults.disabledSelectedYearContainerColor,
163
- dayContentColor = elementColors.dayContentColor.composeOrNull ?: defaults.dayContentColor,
164
- disabledDayContentColor = elementColors.disabledDayContentColor.composeOrNull ?: defaults.disabledDayContentColor,
165
- selectedDayContentColor = elementColors.selectedDayContentColor.composeOrNull ?: defaults.selectedDayContentColor,
166
- disabledSelectedDayContentColor = elementColors.disabledSelectedDayContentColor.composeOrNull ?: defaults.disabledSelectedDayContentColor,
167
- selectedDayContainerColor = elementColors.selectedDayContainerColor.composeOrNull ?: colorProp ?: defaults.selectedDayContainerColor,
168
- disabledSelectedDayContainerColor = elementColors.disabledSelectedDayContainerColor.composeOrNull ?: defaults.disabledSelectedDayContainerColor,
169
- todayContentColor = elementColors.todayContentColor.composeOrNull ?: defaults.todayContentColor,
170
- todayDateBorderColor = elementColors.todayDateBorderColor.composeOrNull ?: colorProp ?: defaults.todayDateBorderColor,
171
- dayInSelectionRangeContentColor = elementColors.dayInSelectionRangeContentColor.composeOrNull ?: defaults.dayInSelectionRangeContentColor,
172
- dayInSelectionRangeContainerColor = elementColors.dayInSelectionRangeContainerColor.composeOrNull ?: defaults.dayInSelectionRangeContainerColor,
173
- dividerColor = elementColors.dividerColor.composeOrNull ?: defaults.dividerColor
174
- )
382
+ colors = buildDatePickerColors(props.elementColors, props.color.composeOrNull)
175
383
  )
176
384
  }
177
385
 
178
386
  @OptIn(ExperimentalMaterial3Api::class)
179
387
  @Composable
180
388
  fun ExpoTimePicker(modifier: Modifier = Modifier, props: DateTimePickerProps, onDateSelected: (DatePickerResult) -> Unit) {
181
- val cal = Calendar.getInstance()
389
+ val initialDate = props.initialDate
182
390
 
183
- val state = remember(props.initialDate, props.is24Hour) {
184
- val initialDate = props.initialDate
391
+ val state = remember(initialDate, props.is24Hour) {
392
+ val cal = Calendar.getInstance()
393
+ cal.isLenient = false
185
394
  if (initialDate != null) {
186
395
  cal.timeInMillis = initialDate
187
- } else {
188
- cal.time = Date()
189
396
  }
190
- val hour = cal.get(Calendar.HOUR_OF_DAY)
191
- val minute = cal.get(Calendar.MINUTE)
192
-
193
397
  TimePickerState(
194
- initialHour = hour,
195
- initialMinute = minute,
398
+ initialHour = cal.get(Calendar.HOUR_OF_DAY),
399
+ initialMinute = cal.get(Calendar.MINUTE),
196
400
  is24Hour = props.is24Hour
197
401
  )
198
402
  }
199
403
 
200
404
  LaunchedEffect(state.hour, state.minute) {
405
+ val cal = Calendar.getInstance()
406
+ cal.isLenient = false
407
+ if (initialDate != null) {
408
+ cal.timeInMillis = initialDate
409
+ }
201
410
  cal.set(Calendar.HOUR_OF_DAY, state.hour)
202
411
  cal.set(Calendar.MINUTE, state.minute)
203
- cal.isLenient = false
204
-
205
412
  onDateSelected(DatePickerResult(date = cal.time.time))
206
413
  }
207
414
 
208
- val elementColors = props.elementColors
209
- val colorProp = props.color.composeOrNull
210
- val defaults = TimePickerDefaults.colors()
211
-
212
415
  TimePicker(
213
416
  modifier = modifier,
214
417
  state = state,
215
418
  layoutType = TimePickerLayoutType.Vertical,
216
- colors = TimePickerDefaults.colors().copy(
217
- containerColor = elementColors.containerColor.composeOrNull ?: defaults.containerColor,
218
- clockDialColor = elementColors.clockDialColor.composeOrNull ?: colorProp?.copy(alpha = 0.3f) ?: defaults.clockDialColor,
219
- clockDialSelectedContentColor = elementColors.clockDialSelectedContentColor.composeOrNull ?: defaults.clockDialSelectedContentColor,
220
- clockDialUnselectedContentColor = elementColors.clockDialUnselectedContentColor.composeOrNull ?: defaults.clockDialUnselectedContentColor,
221
- selectorColor = elementColors.selectorColor.composeOrNull ?: colorProp ?: defaults.selectorColor,
222
- periodSelectorBorderColor = elementColors.periodSelectorBorderColor.composeOrNull ?: defaults.periodSelectorBorderColor,
223
- periodSelectorSelectedContainerColor = elementColors.periodSelectorSelectedContainerColor.composeOrNull ?: defaults.periodSelectorSelectedContainerColor,
224
- periodSelectorUnselectedContainerColor = elementColors.periodSelectorUnselectedContainerColor.composeOrNull ?: defaults.periodSelectorUnselectedContainerColor,
225
- periodSelectorSelectedContentColor = elementColors.periodSelectorSelectedContentColor.composeOrNull ?: defaults.periodSelectorSelectedContentColor,
226
- periodSelectorUnselectedContentColor = elementColors.periodSelectorUnselectedContentColor.composeOrNull ?: defaults.periodSelectorUnselectedContentColor,
227
- timeSelectorSelectedContainerColor = elementColors.timeSelectorSelectedContainerColor.composeOrNull ?: colorProp ?: defaults.timeSelectorSelectedContainerColor,
228
- timeSelectorUnselectedContainerColor = elementColors.timeSelectorUnselectedContainerColor.composeOrNull ?: defaults.timeSelectorUnselectedContainerColor,
229
- timeSelectorSelectedContentColor = elementColors.timeSelectorSelectedContentColor.composeOrNull ?: defaults.timeSelectorSelectedContentColor,
230
- timeSelectorUnselectedContentColor = elementColors.timeSelectorUnselectedContentColor.composeOrNull ?: defaults.timeSelectorUnselectedContentColor
231
- )
419
+ colors = buildTimePickerColors(props.elementColors, props.color.composeOrNull)
232
420
  )
233
421
  }