expo-dev-launcher 6.0.7 → 6.0.8

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 (121) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/android/build.gradle +2 -2
  3. package/android/src/debug/java/expo/modules/devlauncher/compose/DevLauncherBottomTabsNavigator.kt +2 -33
  4. package/android/src/debug/java/expo/modules/devlauncher/compose/primitives/Accordion.kt +8 -11
  5. package/android/src/debug/java/expo/modules/devlauncher/compose/primitives/AsyncImage.kt +17 -8
  6. package/android/src/debug/java/expo/modules/devlauncher/compose/primitives/CircularProgressBar.kt +0 -1
  7. package/android/src/debug/java/expo/modules/devlauncher/compose/primitives/DefaultScaffold.kt +4 -2
  8. package/android/src/debug/java/expo/modules/devlauncher/compose/routes/CrashReport.kt +1 -1
  9. package/android/src/debug/java/expo/modules/devlauncher/compose/routes/Home.kt +1 -1
  10. package/android/src/debug/java/expo/modules/devlauncher/compose/routes/Profile.kt +90 -85
  11. package/android/src/debug/java/expo/modules/devlauncher/compose/routes/Routes.kt +3 -0
  12. package/android/src/debug/java/expo/modules/devlauncher/compose/routes/Settings.kt +1 -1
  13. package/android/src/debug/java/expo/modules/devlauncher/compose/routes/Updates.kt +54 -44
  14. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/BranchScreen.kt +11 -23
  15. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/BranchesScreen.kt +17 -24
  16. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/CrashReportScreen.kt +28 -130
  17. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/ErrorScreen.kt +11 -8
  18. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/HomeScreen.kt +84 -59
  19. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/NoUpdatesScreen.kt +1 -1
  20. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/SettingsScreen.kt +45 -49
  21. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/AccountAvatar.kt +2 -6
  22. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/AccountSelector.kt +3 -9
  23. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/AppHeader.kt +5 -15
  24. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/AppLoadingErrorDialog.kt +23 -6
  25. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/BottomSheet.kt +4 -1
  26. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/BottomTabBar.kt +30 -29
  27. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/BottomTabButton.kt +7 -11
  28. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/DefaultScreenContainer.kt +23 -0
  29. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/FetchDevelopmentServersButton.kt +5 -12
  30. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/LauncherIcons.kt +220 -0
  31. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/RunningAppCard.kt +3 -10
  32. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/ScanQRCodeButton.kt +5 -12
  33. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/ServerUrlInput.kt +1 -10
  34. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/StackTrace.kt +50 -0
  35. package/android/src/debug/java/expo/modules/devlauncher/compose/utils/Scrollbar.kt +65 -0
  36. package/android/src/debug/java/expo/modules/devlauncher/compose/utils/UrlUtils.kt +12 -0
  37. package/android/src/main/res/values/colors.xml +0 -3
  38. package/ios/SwiftUI/GraphQL/APIClient.swift +0 -4
  39. package/ios/SwiftUI/UpdatesTab/UpdateRow.swift +3 -1
  40. package/ios/SwiftUI/UpdatesTab/UpdatesListView.swift +37 -38
  41. package/ios/SwiftUI/UpdatesTab/UpdatesTabView.swift +9 -7
  42. package/package.json +4 -4
  43. package/android/src/debug/assets/Inter-Black.otf +0 -0
  44. package/android/src/debug/assets/Inter-Bold.otf +0 -0
  45. package/android/src/debug/assets/Inter-ExtraBold.otf +0 -0
  46. package/android/src/debug/assets/Inter-ExtraLight.otf +0 -0
  47. package/android/src/debug/assets/Inter-Light.otf +0 -0
  48. package/android/src/debug/assets/Inter-Medium.otf +0 -0
  49. package/android/src/debug/assets/Inter-Regular.otf +0 -0
  50. package/android/src/debug/assets/Inter-SemiBold.otf +0 -0
  51. package/android/src/debug/assets/Inter-Thin.otf +0 -0
  52. package/android/src/debug/java/expo/modules/devlauncher/launcher/errors/DevLauncherStackAdapter.kt +0 -39
  53. package/android/src/debug/res/drawable-mdpi/building_icon.png +0 -0
  54. package/android/src/debug/res/drawable-mdpi/check_icon.png +0 -0
  55. package/android/src/debug/res/drawable-mdpi/chevron_right_icon.png +0 -0
  56. package/android/src/debug/res/drawable-mdpi/home_icon.png +0 -0
  57. package/android/src/debug/res/drawable-mdpi/info_icon.png +0 -0
  58. package/android/src/debug/res/drawable-mdpi/qr_code.png +0 -0
  59. package/android/src/debug/res/drawable-mdpi/settings_icon.png +0 -0
  60. package/android/src/debug/res/drawable-mdpi/shake_device_icon.png +0 -0
  61. package/android/src/debug/res/drawable-mdpi/show_menu_at_launch_icon.png +0 -0
  62. package/android/src/debug/res/drawable-mdpi/terminal_icon.png +0 -0
  63. package/android/src/debug/res/drawable-mdpi/three_finger_long_press_icon.png +0 -0
  64. package/android/src/debug/res/drawable-mdpi/user_icon.png +0 -0
  65. package/android/src/debug/res/drawable-mdpi/x_icon.png +0 -0
  66. package/android/src/debug/res/drawable-night-mdpi/qr_code.png +0 -0
  67. package/android/src/debug/res/drawable-night-mdpi/shake_device_icon.png +0 -0
  68. package/android/src/debug/res/drawable-night-xhdpi/qr_code.png +0 -0
  69. package/android/src/debug/res/drawable-night-xhdpi/shake_device_icon.png +0 -0
  70. package/android/src/debug/res/drawable-night-xxhdpi/qr_code.png +0 -0
  71. package/android/src/debug/res/drawable-night-xxhdpi/shake_device_icon.png +0 -0
  72. package/android/src/debug/res/drawable-xhdpi/building_icon.png +0 -0
  73. package/android/src/debug/res/drawable-xhdpi/check_icon.png +0 -0
  74. package/android/src/debug/res/drawable-xhdpi/chevron_right_icon.png +0 -0
  75. package/android/src/debug/res/drawable-xhdpi/home_icon.png +0 -0
  76. package/android/src/debug/res/drawable-xhdpi/info_icon.png +0 -0
  77. package/android/src/debug/res/drawable-xhdpi/qr_code.png +0 -0
  78. package/android/src/debug/res/drawable-xhdpi/settings_icon.png +0 -0
  79. package/android/src/debug/res/drawable-xhdpi/shake_device_icon.png +0 -0
  80. package/android/src/debug/res/drawable-xhdpi/show_menu_at_launch_icon.png +0 -0
  81. package/android/src/debug/res/drawable-xhdpi/terminal_icon.png +0 -0
  82. package/android/src/debug/res/drawable-xhdpi/three_finger_long_press_icon.png +0 -0
  83. package/android/src/debug/res/drawable-xhdpi/user_icon.png +0 -0
  84. package/android/src/debug/res/drawable-xhdpi/x_icon.png +0 -0
  85. package/android/src/debug/res/drawable-xxhdpi/building_icon.png +0 -0
  86. package/android/src/debug/res/drawable-xxhdpi/check_icon.png +0 -0
  87. package/android/src/debug/res/drawable-xxhdpi/chevron_right_icon.png +0 -0
  88. package/android/src/debug/res/drawable-xxhdpi/home_icon.png +0 -0
  89. package/android/src/debug/res/drawable-xxhdpi/info_icon.png +0 -0
  90. package/android/src/debug/res/drawable-xxhdpi/qr_code.png +0 -0
  91. package/android/src/debug/res/drawable-xxhdpi/settings_icon.png +0 -0
  92. package/android/src/debug/res/drawable-xxhdpi/shake_device_icon.png +0 -0
  93. package/android/src/debug/res/drawable-xxhdpi/show_menu_at_launch_icon.png +0 -0
  94. package/android/src/debug/res/drawable-xxhdpi/terminal_icon.png +0 -0
  95. package/android/src/debug/res/drawable-xxhdpi/three_finger_long_press_icon.png +0 -0
  96. package/android/src/debug/res/drawable-xxhdpi/user_icon.png +0 -0
  97. package/android/src/debug/res/drawable-xxhdpi/x_icon.png +0 -0
  98. package/android/src/main/res/drawable/arrow_right.xml +0 -9
  99. package/android/src/main/res/drawable/copy.xml +0 -13
  100. package/android/src/main/res/drawable/inspect.xml +0 -10
  101. package/android/src/main/res/drawable/pulse.xml +0 -10
  102. package/android/src/main/res/drawable/signal.xml +0 -26
  103. package/android/src/main/res/drawable-hdpi/dev_laucher_ic_home_white_36dp.png +0 -0
  104. package/android/src/main/res/drawable-hdpi/dev_launcher_ic_refresh_white_36dp.png +0 -0
  105. package/android/src/main/res/drawable-mdpi/dev_laucher_ic_home_white_36dp.png +0 -0
  106. package/android/src/main/res/drawable-mdpi/dev_launcher_ic_refresh_white_36dp.png +0 -0
  107. package/android/src/main/res/drawable-mdpi/dev_menu_fab_icon.png +0 -0
  108. package/android/src/main/res/drawable-xhdpi/dev_laucher_ic_home_white_36dp.png +0 -0
  109. package/android/src/main/res/drawable-xhdpi/dev_launcher_ic_refresh_white_36dp.png +0 -0
  110. package/android/src/main/res/drawable-xhdpi/dev_menu_fab_icon.png +0 -0
  111. package/android/src/main/res/drawable-xxhdpi/dev_laucher_ic_home_white_36dp.png +0 -0
  112. package/android/src/main/res/drawable-xxhdpi/dev_launcher_ic_refresh_white_36dp.png +0 -0
  113. package/android/src/main/res/drawable-xxhdpi/dev_menu_fab_icon.png +0 -0
  114. package/android/src/main/res/drawable-xxxhdpi/dev_laucher_ic_home_white_36dp.png +0 -0
  115. package/android/src/main/res/drawable-xxxhdpi/dev_launcher_ic_refresh_white_36dp.png +0 -0
  116. package/android/src/main/res/layout/error_activity_content_view.xml +0 -7
  117. package/android/src/main/res/layout/error_console_fragment.xml +0 -53
  118. package/android/src/main/res/layout/error_console_list_item.xml +0 -23
  119. package/android/src/main/res/layout/error_fragment.xml +0 -102
  120. package/android/src/main/res/values/strings.xml +0 -10
  121. /package/android/src/main/res/drawable/{reload.xml → updates_nav.xml} +0 -0
@@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.Row
9
9
  import androidx.compose.foundation.layout.fillMaxSize
10
10
  import androidx.compose.foundation.layout.fillMaxWidth
11
11
  import androidx.compose.foundation.layout.padding
12
- import androidx.compose.foundation.layout.size
13
12
  import androidx.compose.foundation.lazy.LazyColumn
14
13
  import androidx.compose.foundation.lazy.items
15
14
  import androidx.compose.foundation.lazy.rememberLazyListState
@@ -33,21 +32,23 @@ import androidx.compose.ui.unit.sp
33
32
  import com.composeunstyled.Icon
34
33
  import expo.modules.devlauncher.R
35
34
  import expo.modules.devlauncher.compose.Branch
36
- import expo.modules.devlauncher.compose.DefaultScreenContainer
37
35
  import expo.modules.devlauncher.compose.Update
38
36
  import expo.modules.devlauncher.compose.models.BranchesAction
39
37
  import expo.modules.devlauncher.compose.primitives.CircularProgressBar
40
38
  import expo.modules.devlauncher.compose.ui.ActionButton
41
39
  import expo.modules.devlauncher.compose.ui.AppHeader
40
+ import expo.modules.devlauncher.compose.ui.DefaultScreenContainer
41
+ import expo.modules.devlauncher.compose.ui.LauncherIcons
42
42
  import expo.modules.devlauncher.compose.utils.DateFormat
43
43
  import expo.modules.devmenu.compose.newtheme.NewAppTheme
44
44
  import expo.modules.devmenu.compose.primitives.NewText
45
45
  import expo.modules.devmenu.compose.primitives.RoundedSurface
46
46
  import expo.modules.devmenu.compose.primitives.Spacer
47
+ import expo.modules.devmenu.compose.ui.MenuIcons
47
48
  import kotlin.time.ExperimentalTime
48
49
 
49
50
  @Composable
50
- fun BranchBadge(
51
+ private fun BranchBadge(
51
52
  name: String
52
53
  ) {
53
54
  val backgroundColor = NewAppTheme.colors.background.info
@@ -61,11 +62,9 @@ fun BranchBadge(
61
62
  .background(backgroundColor)
62
63
  .padding(NewAppTheme.spacing.`2`)
63
64
  ) {
64
- Icon(
65
- painter = painterResource(R.drawable.branch_icon),
66
- contentDescription = "Branch Icon",
67
- tint = textColor,
68
- modifier = Modifier.size(16.dp)
65
+ LauncherIcons.Branch(
66
+ size = 16.dp,
67
+ tint = textColor
69
68
  )
70
69
 
71
70
  NewText(
@@ -80,7 +79,7 @@ fun BranchBadge(
80
79
  }
81
80
 
82
81
  @Composable
83
- fun NeedToSingInComponent(
82
+ private fun NeedToSingInComponent(
84
83
  onProfileClick: () -> Unit = {}
85
84
  ) {
86
85
  Box(
@@ -203,11 +202,9 @@ fun BranchesScreen(
203
202
  ) {
204
203
  BranchBadge(branch.name)
205
204
 
206
- Icon(
207
- painter = painterResource(R.drawable.chevron_right),
208
- contentDescription = "Chevron Icon",
209
- tint = NewAppTheme.colors.icon.quaternary,
210
- modifier = Modifier.size(20.dp)
205
+ LauncherIcons.Chevron(
206
+ size = 20.dp,
207
+ tint = NewAppTheme.colors.icon.quaternary
211
208
  )
212
209
  }
213
210
 
@@ -222,11 +219,9 @@ fun BranchesScreen(
222
219
  .background(NewAppTheme.colors.background.warning)
223
220
  .padding(NewAppTheme.spacing.`2`)
224
221
  ) {
225
- Icon(
226
- painter = painterResource(expo.modules.devmenu.R.drawable.alert),
227
- contentDescription = "Warning Icon",
228
- tint = NewAppTheme.colors.icon.warning,
229
- modifier = Modifier.size(20.dp)
222
+ MenuIcons.Warning(
223
+ size = 20.dp,
224
+ tint = NewAppTheme.colors.icon.warning
230
225
  )
231
226
 
232
227
  NewText(
@@ -244,11 +239,9 @@ fun BranchesScreen(
244
239
  verticalAlignment = Alignment.CenterVertically,
245
240
  horizontalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`2`)
246
241
  ) {
247
- Icon(
248
- painter = painterResource(R.drawable.update_icon),
249
- contentDescription = "Update Icon",
250
- tint = NewAppTheme.colors.icon.quaternary,
251
- modifier = Modifier.size(20.dp)
242
+ LauncherIcons.Updates(
243
+ size = 20.dp,
244
+ tint = NewAppTheme.colors.icon.quaternary
252
245
  )
253
246
 
254
247
  Column(
@@ -1,29 +1,17 @@
1
1
  package expo.modules.devlauncher.compose.screens
2
2
 
3
- import androidx.compose.foundation.ScrollState
4
- import androidx.compose.foundation.horizontalScroll
5
3
  import androidx.compose.foundation.layout.Arrangement
6
- import androidx.compose.foundation.layout.Box
7
4
  import androidx.compose.foundation.layout.Column
8
5
  import androidx.compose.foundation.layout.padding
9
6
  import androidx.compose.foundation.layout.safeDrawingPadding
10
- import androidx.compose.foundation.rememberScrollState
11
- import androidx.compose.foundation.verticalScroll
12
7
  import androidx.compose.runtime.Composable
13
8
  import androidx.compose.ui.Modifier
14
- import androidx.compose.ui.draw.drawWithContent
15
- import androidx.compose.ui.geometry.Offset
16
- import androidx.compose.ui.geometry.Size
17
- import androidx.compose.ui.graphics.Color
18
9
  import androidx.compose.ui.platform.LocalContext
19
- import androidx.compose.ui.text.TextStyle
20
10
  import androidx.compose.ui.text.font.FontWeight
21
11
  import androidx.compose.ui.tooling.preview.Preview
22
- import androidx.compose.ui.unit.Dp
23
- import androidx.compose.ui.unit.dp
24
- import androidx.compose.ui.unit.sp
25
- import expo.modules.devlauncher.compose.DefaultScreenContainer
12
+ import expo.modules.devlauncher.compose.ui.DefaultScreenContainer
26
13
  import expo.modules.devlauncher.compose.ui.ActionButton
14
+ import expo.modules.devlauncher.compose.ui.StackTrace
27
15
  import expo.modules.devmenu.compose.newtheme.NewAppTheme
28
16
  import expo.modules.devmenu.compose.primitives.NewText
29
17
  import expo.modules.devmenu.compose.utils.copyToClipboard
@@ -31,94 +19,6 @@ import org.json.JSONObject
31
19
  import java.text.SimpleDateFormat
32
20
  import java.util.Date
33
21
 
34
- @Composable
35
- fun Modifier.verticalScrollbar(
36
- scrollState: ScrollState,
37
- width: Dp = 6.dp,
38
- scrollBarColor: Color = Color.LightGray,
39
- endPadding: Float = 12f
40
- ): Modifier {
41
- return drawWithContent {
42
- drawContent()
43
-
44
- val viewportHeight = this.size.height
45
- val totalContentHeight = scrollState.maxValue.toFloat() + viewportHeight
46
- val scrollValue = scrollState.value.toFloat()
47
-
48
- val scrollBarHeight =
49
- (viewportHeight / totalContentHeight) * viewportHeight
50
- val scrollBarStartOffset =
51
- (scrollValue / totalContentHeight) * viewportHeight
52
-
53
- drawRoundRect(
54
- color = scrollBarColor,
55
- topLeft = Offset(this.size.width - endPadding, scrollBarStartOffset),
56
- size = Size(width.toPx(), scrollBarHeight)
57
- )
58
- }
59
- }
60
-
61
- @Composable
62
- fun Modifier.horizontalScrollbar(
63
- scrollState: ScrollState,
64
- width: Dp = 6.dp,
65
- scrollBarColor: Color = Color.LightGray,
66
- endPadding: Float = 12f
67
- ): Modifier {
68
- return drawWithContent {
69
- drawContent()
70
-
71
- val viewportWidth = this.size.width
72
- val totalContentWidth = scrollState.maxValue.toFloat() + viewportWidth
73
- val scrollValue = scrollState.value.toFloat()
74
-
75
- val scrollBarHeight =
76
- (viewportWidth / totalContentWidth) * viewportWidth
77
- val scrollBarStartOffset =
78
- (scrollValue / totalContentWidth) * viewportWidth
79
-
80
- drawRoundRect(
81
- color = scrollBarColor,
82
- topLeft = Offset(scrollBarStartOffset, this.size.height - endPadding),
83
- size = Size(scrollBarHeight, width.toPx())
84
- )
85
- }
86
- }
87
-
88
- @Composable
89
- fun StackTrace(
90
- stack: String,
91
- modifier: Modifier = Modifier
92
- ) {
93
- val verticalScrollState = rememberScrollState()
94
- val horizontalScrollState = rememberScrollState()
95
- Box(
96
- modifier = Modifier
97
- .verticalScrollbar(verticalScrollState)
98
- .horizontalScrollbar(horizontalScrollState)
99
- .then(modifier)
100
- ) {
101
- Box(
102
- Modifier
103
- .verticalScroll(verticalScrollState)
104
- .horizontalScroll(horizontalScrollState)
105
-
106
- ) {
107
- Box(modifier = Modifier.padding(horizontal = NewAppTheme.spacing.`4`)) {
108
- NewText(
109
- stack,
110
- style = TextStyle.Default.merge(
111
- lineHeight = 16.sp,
112
- fontSize = 10.sp,
113
- fontFamily = NewAppTheme.font.mono,
114
- fontWeight = FontWeight.Light
115
- )
116
- )
117
- }
118
- }
119
- }
120
- }
121
-
122
22
  @Composable
123
23
  fun CrashReportScreen(
124
24
  timestamp: Long,
@@ -159,35 +59,15 @@ fun CrashReportScreen(
159
59
  }
160
60
  )
161
61
 
162
- Column(verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`1`)) {
163
- NewText(
164
- "Occurred:",
165
- style = NewAppTheme.font.lg.merge(
166
- fontWeight = FontWeight.Medium
167
- )
168
- )
169
-
170
- NewText(
171
- SimpleDateFormat.getDateTimeInstance().format(Date(timestamp)).toString(),
172
- style = NewAppTheme.font.md,
173
- color = NewAppTheme.colors.text.secondary
174
- )
175
- }
176
-
177
- Column(verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`1`)) {
178
- NewText(
179
- "Reason:",
180
- style = NewAppTheme.font.lg.merge(
181
- fontWeight = FontWeight.Medium
182
- )
183
- )
62
+ KeyValueRow(
63
+ "Occurred:",
64
+ SimpleDateFormat.getDateTimeInstance().format(Date(timestamp)).toString()
65
+ )
184
66
 
185
- NewText(
186
- message,
187
- style = NewAppTheme.font.md,
188
- color = NewAppTheme.colors.text.secondary
189
- )
190
- }
67
+ KeyValueRow(
68
+ "Reason:",
69
+ message
70
+ )
191
71
  }
192
72
 
193
73
  Column(
@@ -207,6 +87,24 @@ fun CrashReportScreen(
207
87
  }
208
88
  }
209
89
 
90
+ @Composable
91
+ private fun KeyValueRow(text: String, value: String) {
92
+ Column(verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`1`)) {
93
+ NewText(
94
+ text,
95
+ style = NewAppTheme.font.lg.merge(
96
+ fontWeight = FontWeight.Medium
97
+ )
98
+ )
99
+
100
+ NewText(
101
+ value,
102
+ style = NewAppTheme.font.md,
103
+ color = NewAppTheme.colors.text.secondary
104
+ )
105
+ }
106
+ }
107
+
210
108
  @Composable
211
109
  @Preview(showBackground = true)
212
110
  fun CrashReportScreenPreview() {
@@ -1,6 +1,7 @@
1
1
  package expo.modules.devlauncher.compose.screens
2
2
 
3
3
  import androidx.compose.foundation.background
4
+ import androidx.compose.foundation.layout.Arrangement
4
5
  import androidx.compose.foundation.layout.Column
5
6
  import androidx.compose.foundation.layout.fillMaxSize
6
7
  import androidx.compose.foundation.layout.navigationBarsPadding
@@ -12,9 +13,9 @@ import androidx.compose.ui.text.font.FontWeight
12
13
  import androidx.compose.ui.tooling.preview.Preview
13
14
  import expo.modules.devlauncher.compose.models.ErrorAction
14
15
  import expo.modules.devlauncher.compose.ui.ActionButton
16
+ import expo.modules.devlauncher.compose.ui.StackTrace
15
17
  import expo.modules.devmenu.compose.newtheme.NewAppTheme
16
18
  import expo.modules.devmenu.compose.primitives.NewText
17
- import expo.modules.devmenu.compose.primitives.Spacer
18
19
 
19
20
  @Composable
20
21
  fun ErrorScreen(
@@ -27,8 +28,14 @@ fun ErrorScreen(
27
28
  .fillMaxSize()
28
29
  .statusBarsPadding()
29
30
  ) {
30
- Column(modifier = Modifier.padding(horizontal = NewAppTheme.spacing.`2`)) {
31
- Spacer(NewAppTheme.spacing.`3`)
31
+ Column(
32
+ verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`3`),
33
+ modifier = Modifier
34
+ .padding(
35
+ horizontal = NewAppTheme.spacing.`2`,
36
+ vertical = NewAppTheme.spacing.`3`
37
+ )
38
+ ) {
32
39
  NewText(
33
40
  "There was a problem loading the project.",
34
41
  style = NewAppTheme.font.lg.merge(
@@ -36,10 +43,7 @@ fun ErrorScreen(
36
43
  )
37
44
  )
38
45
 
39
- Spacer(NewAppTheme.spacing.`3`)
40
46
  NewText("This development build encountered the following error.")
41
-
42
- Spacer(NewAppTheme.spacing.`3`)
43
47
  }
44
48
 
45
49
  StackTrace(
@@ -49,6 +53,7 @@ fun ErrorScreen(
49
53
  )
50
54
 
51
55
  Column(
56
+ verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`2`),
52
57
  modifier = Modifier
53
58
  .background(NewAppTheme.colors.background.default)
54
59
  .padding(NewAppTheme.spacing.`3`)
@@ -64,8 +69,6 @@ fun ErrorScreen(
64
69
  }
65
70
  )
66
71
 
67
- Spacer(NewAppTheme.spacing.`2`)
68
-
69
72
  ActionButton(
70
73
  "Go To Home",
71
74
  foreground = NewAppTheme.colors.buttons.secondary.foreground,
@@ -8,12 +8,10 @@ import androidx.compose.foundation.layout.padding
8
8
  import androidx.compose.foundation.rememberScrollState
9
9
  import androidx.compose.foundation.verticalScroll
10
10
  import androidx.compose.runtime.Composable
11
- import androidx.compose.runtime.LaunchedEffect
12
11
  import androidx.compose.ui.Modifier
13
12
  import androidx.compose.ui.tooling.preview.Preview
14
- import com.composables.core.rememberDialogState
15
13
  import com.composeunstyled.Button
16
- import expo.modules.devlauncher.compose.DefaultScreenContainer
14
+ import expo.modules.devlauncher.compose.ui.DefaultScreenContainer
17
15
  import expo.modules.devlauncher.compose.models.HomeAction
18
16
  import expo.modules.devlauncher.compose.models.HomeState
19
17
  import expo.modules.devlauncher.compose.primitives.Accordion
@@ -22,6 +20,7 @@ import expo.modules.devlauncher.compose.ui.AppLoadingErrorDialog
22
20
  import expo.modules.devlauncher.compose.ui.DevelopmentSessionActions
23
21
  import expo.modules.devlauncher.compose.ui.DevelopmentSessionSection
24
22
  import expo.modules.devlauncher.compose.ui.RunningAppCard
23
+ import expo.modules.devlauncher.compose.ui.rememberAppLoadingErrorDialogState
25
24
  import expo.modules.devlauncher.launcher.DevLauncherAppEntry
26
25
  import expo.modules.devlauncher.launcher.errors.DevLauncherErrorInstance
27
26
  import expo.modules.devlauncher.services.PackagerInfo
@@ -59,21 +58,8 @@ fun HomeScreen(
59
58
  onProfileClick: () -> Unit,
60
59
  onDevServersClick: () -> Unit
61
60
  ) {
62
- val hasPackager = state.runningPackagers.isNotEmpty()
63
- val errorDialogState = rememberDialogState(initiallyVisible = false)
64
61
  val scrollState = rememberScrollState()
65
-
66
- LaunchedEffect(state.loadingError) {
67
- if (state.loadingError != null) {
68
- errorDialogState.visible = true
69
- }
70
- }
71
-
72
- LaunchedEffect(errorDialogState.visible) {
73
- if (!errorDialogState.visible) {
74
- onAction(HomeAction.ClearLoadingError)
75
- }
76
- }
62
+ val errorDialogState = rememberAppLoadingErrorDialogState(state, onAction)
77
63
 
78
64
  AppLoadingErrorDialog(
79
65
  errorDialogState,
@@ -112,59 +98,90 @@ fun HomeScreen(
112
98
 
113
99
  Spacer(NewAppTheme.spacing.`3`)
114
100
 
115
- if (hasPackager) {
116
- Column(
117
- verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`2`)
118
- ) {
119
- for (packager in state.runningPackagers) {
120
- RunningAppCard(
121
- appIp = packager.url,
122
- appName = packager.description
123
- ) {
124
- onAction(HomeAction.OpenApp(packager.url))
125
- }
126
- }
127
- }
101
+ val runningPackagers = state.runningPackagers
102
+ if (runningPackagers.isNotEmpty()) {
103
+ LocalPackagers(
104
+ state.isFetchingPackagers,
105
+ runningPackagers,
106
+ onAction
107
+ )
108
+ } else {
109
+ DevelopmentSessionSection(state.isFetchingPackagers, onAction)
110
+ }
111
+
112
+ Spacer(NewAppTheme.spacing.`6`)
128
113
 
129
- Spacer(NewAppTheme.spacing.`2`)
114
+ RecentlyOpenedApps(
115
+ state.recentlyOpenedApps,
116
+ onAction
117
+ )
118
+ }
119
+ }
120
+ }
130
121
 
131
- Accordion(
132
- "New development server",
133
- initialState = false,
134
- modifier = Modifier
135
- .fillMaxWidth()
122
+ @Composable
123
+ private fun LocalPackagers(
124
+ isFetchingPackagers: Boolean,
125
+ runningPackagers: Set<PackagerInfo>,
126
+ onAction: (HomeAction) -> Unit
127
+ ) {
128
+ Column(
129
+ verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`2`)
130
+ ) {
131
+ Column(
132
+ verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`2`)
133
+ ) {
134
+ for (packager in runningPackagers) {
135
+ RunningAppCard(
136
+ appIp = packager.url,
137
+ appName = packager.description
136
138
  ) {
137
- DevelopmentSessionActions(state.isFetchingPackagers, onAction)
139
+ onAction(HomeAction.OpenApp(packager.url))
138
140
  }
139
- } else {
140
- DevelopmentSessionSection(state.isFetchingPackagers, onAction)
141
141
  }
142
+ }
142
143
 
143
- if (state.recentlyOpenedApps.isNotEmpty()) {
144
- Spacer(NewAppTheme.spacing.`6`)
144
+ Accordion(
145
+ "New development server",
146
+ initialState = false,
147
+ modifier = Modifier
148
+ .fillMaxWidth()
149
+ ) {
150
+ DevelopmentSessionActions(isFetchingPackagers, onAction)
151
+ }
152
+ }
153
+ }
145
154
 
146
- Row(
147
- horizontalArrangement = Arrangement.SpaceBetween,
148
- modifier = Modifier.fillMaxWidth()
149
- ) {
150
- Section.Header("RECENTLY OPENED")
155
+ @Composable
156
+ private fun RecentlyOpenedApps(
157
+ recentlyOpenedApps: List<DevLauncherAppEntry>,
158
+ onAction: (HomeAction) -> Unit
159
+ ) {
160
+ if (recentlyOpenedApps.isEmpty()) {
161
+ return
162
+ }
151
163
 
152
- Section.Button("RESET", { onAction(HomeAction.ResetRecentlyOpenedApps) })
153
- }
164
+ Column(
165
+ verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`3`)
166
+ ) {
167
+ Row(
168
+ horizontalArrangement = Arrangement.SpaceBetween,
169
+ modifier = Modifier.fillMaxWidth()
170
+ ) {
171
+ Section.Header("RECENTLY OPENED")
154
172
 
155
- Spacer(NewAppTheme.spacing.`3`)
173
+ Section.Button("RESET", { onAction(HomeAction.ResetRecentlyOpenedApps) })
174
+ }
156
175
 
157
- Column(
158
- verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`1`)
176
+ Column(
177
+ verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`1`)
178
+ ) {
179
+ for (packager in recentlyOpenedApps) {
180
+ RunningAppCard(
181
+ appIp = packager.url,
182
+ appName = packager.name
159
183
  ) {
160
- for (packager in state.recentlyOpenedApps) {
161
- RunningAppCard(
162
- appIp = packager.url,
163
- appName = packager.name
164
- ) {
165
- onAction(HomeAction.OpenApp(packager.url))
166
- }
167
- }
184
+ onAction(HomeAction.OpenApp(packager.url))
168
185
  }
169
186
  }
170
187
  }
@@ -190,6 +207,14 @@ fun HomeScreenPreview() {
190
207
  )
191
208
  ),
192
209
  recentlyOpenedApps = listOf(
210
+ DevLauncherAppEntry(
211
+ timestamp = 1752249592809L,
212
+ name = "BareExpo",
213
+ url = "http://10.0.2.2:8081",
214
+ isEASUpdate = false,
215
+ updateMessage = null,
216
+ branchName = null
217
+ ),
193
218
  DevLauncherAppEntry(
194
219
  timestamp = 1752249592809L,
195
220
  name = "BareExpo",
@@ -22,7 +22,7 @@ import androidx.compose.ui.text.withLink
22
22
  import androidx.compose.ui.tooling.preview.Preview
23
23
  import androidx.compose.ui.unit.dp
24
24
  import expo.modules.devlauncher.R
25
- import expo.modules.devlauncher.compose.DefaultScreenContainer
25
+ import expo.modules.devlauncher.compose.ui.DefaultScreenContainer
26
26
  import expo.modules.devlauncher.compose.ui.AppHeader
27
27
  import expo.modules.devmenu.compose.newtheme.NewAppTheme
28
28
  import expo.modules.devmenu.compose.primitives.NewText