expo-dev-launcher 6.0.0 → 6.0.2

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 (49) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/android/build.gradle +3 -3
  3. package/android/src/debug/java/expo/modules/devlauncher/compose/BindingView.kt +4 -2
  4. package/android/src/debug/java/expo/modules/devlauncher/compose/DevLauncherBottomTabsNavigator.kt +4 -2
  5. package/android/src/debug/java/expo/modules/devlauncher/compose/models/BranchesViewModel.kt +57 -13
  6. package/android/src/debug/java/expo/modules/devlauncher/compose/primitives/Accordion.kt +40 -45
  7. package/android/src/debug/java/expo/modules/devlauncher/compose/routes/Profile.kt +98 -18
  8. package/android/src/debug/java/expo/modules/devlauncher/compose/routes/Updates.kt +3 -1
  9. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/BranchScreen.kt +171 -146
  10. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/BranchesScreen.kt +248 -150
  11. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/CrashReportScreen.kt +75 -46
  12. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/HomeScreen.kt +234 -238
  13. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/NoUpdatesScreen.kt +52 -35
  14. package/android/src/debug/java/expo/modules/devlauncher/compose/screens/SettingsScreen.kt +246 -107
  15. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/AccountAvatar.kt +17 -9
  16. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/AccountSelector.kt +63 -46
  17. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/ActionButton.kt +51 -3
  18. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/AppHeader.kt +70 -44
  19. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/BottomSheet.kt +42 -2
  20. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/BottomTabBar.kt +14 -10
  21. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/BottomTabButton.kt +46 -23
  22. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/DevelopmentServerHelp.kt +23 -16
  23. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/RunningAppCard.kt +65 -34
  24. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/ScreenHeaderContainer.kt +0 -5
  25. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/ServerUrlInput.kt +56 -17
  26. package/android/src/debug/java/expo/modules/devlauncher/compose/ui/SignUp.kt +20 -27
  27. package/android/src/main/res/drawable/arrow_right.xml +9 -0
  28. package/android/src/main/res/drawable/check_circle.xml +10 -0
  29. package/android/src/main/res/drawable/chevron_right.xml +10 -0
  30. package/android/src/main/res/drawable/copy.xml +13 -0
  31. package/android/src/main/res/drawable/expo_logo.xml +9 -0
  32. package/android/src/main/res/drawable/home.xml +10 -0
  33. package/android/src/main/res/drawable/inspect.xml +10 -0
  34. package/android/src/main/res/drawable/log_in.xml +12 -0
  35. package/android/src/main/res/drawable/pulse.xml +10 -0
  36. package/android/src/main/res/drawable/reload.xml +10 -0
  37. package/android/src/main/res/drawable/scan.xml +42 -0
  38. package/android/src/main/res/drawable/settings.xml +14 -0
  39. package/android/src/main/res/drawable/show_at_launch.xml +12 -0
  40. package/android/src/main/res/drawable/signal.xml +26 -0
  41. package/android/src/main/res/drawable/user.xml +13 -0
  42. package/ios/EXDevLauncherController.m +23 -4
  43. package/ios/SwiftUI/CrashReportView.swift +11 -3
  44. package/ios/SwiftUI/DevLauncherViews.swift +18 -2
  45. package/ios/SwiftUI/DevServersView.swift +2 -2
  46. package/ios/SwiftUI/HomeTabView.swift +4 -0
  47. package/ios/SwiftUI/Navigation/Navigation.swift +3 -0
  48. package/ios/SwiftUI/SettingsTabView.swift +4 -3
  49. package/package.json +4 -4
@@ -1,20 +1,30 @@
1
1
  package expo.modules.devlauncher.compose.ui
2
2
 
3
+ import androidx.compose.foundation.layout.Arrangement
3
4
  import androidx.compose.foundation.layout.Box
4
5
  import androidx.compose.foundation.layout.Column
6
+ import androidx.compose.foundation.layout.Row
5
7
  import androidx.compose.foundation.layout.padding
6
8
  import androidx.compose.foundation.layout.size
7
9
  import androidx.compose.runtime.Composable
10
+ import androidx.compose.ui.Alignment
8
11
  import androidx.compose.ui.Modifier
9
12
  import androidx.compose.ui.draw.drawBehind
13
+ import androidx.compose.ui.graphics.Color
14
+ import androidx.compose.ui.graphics.SolidColor
10
15
  import androidx.compose.ui.res.painterResource
16
+ import androidx.compose.ui.text.font.FontWeight
17
+ import androidx.compose.ui.text.style.TextOverflow
11
18
  import androidx.compose.ui.tooling.preview.Preview
12
- import com.composables.core.Icon
19
+ import androidx.compose.ui.unit.dp
13
20
  import com.composeunstyled.Button
21
+ import com.composeunstyled.Icon
14
22
  import expo.modules.devlauncher.R
15
- import expo.modules.devmenu.compose.primitives.RowLayout
16
- import expo.modules.devmenu.compose.primitives.Spacer
17
- import expo.modules.devmenu.compose.primitives.Text
23
+ import expo.modules.devmenu.compose.fromHex
24
+ import expo.modules.devmenu.compose.newtheme.NewAppTheme
25
+ import expo.modules.devmenu.compose.primitives.NewText
26
+ import expo.modules.devmenu.compose.primitives.RoundedSurface
27
+ import expo.modules.devmenu.compose.primitives.pulseEffect
18
28
  import expo.modules.devmenu.compose.theme.Theme
19
29
 
20
30
  @Composable
@@ -30,44 +40,65 @@ fun RunningAppCard(
30
40
  null
31
41
  }
32
42
 
33
- Button(
34
- onClick = { onClick(appIp) },
35
- backgroundColor = Theme.colors.background.default
43
+ RoundedSurface(
44
+ borderRadius = NewAppTheme.borderRadius.xl,
45
+ color = NewAppTheme.colors.background.subtle
36
46
  ) {
37
- Column(modifier = Modifier.padding(Theme.spacing.medium)) {
38
- RowLayout(
39
- leftComponent = {
40
- val iconColor = Theme.colors.status.success
41
-
42
- Box(
43
- modifier = Modifier.size(Theme.spacing.small).drawBehind {
44
- drawCircle(iconColor)
47
+ Button(
48
+ onClick = { onClick(appIp) }
49
+ ) {
50
+ Row(
51
+ horizontalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`3`),
52
+ verticalAlignment = Alignment.CenterVertically,
53
+ modifier = Modifier.padding(NewAppTheme.spacing.`3`)
54
+ ) {
55
+ val dotColor = Color.fromHex("#34C759")
56
+ Box(
57
+ modifier = Modifier
58
+ .size(Theme.spacing.small)
59
+ .drawBehind {
60
+ drawCircle(dotColor)
45
61
  }
62
+ .pulseEffect(
63
+ brush = SolidColor(dotColor.copy(alpha = 0.3f))
64
+ )
65
+ )
66
+
67
+ Column(
68
+ verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`1`),
69
+ modifier = Modifier.weight(1f)
70
+ ) {
71
+ NewText(
72
+ label,
73
+ maxLines = 1,
74
+ overflow = TextOverflow.Ellipsis,
75
+ style = NewAppTheme.font.lg.merge(
76
+ fontWeight = if (appName != null) {
77
+ FontWeight.SemiBold
78
+ } else {
79
+ FontWeight.Normal
80
+ }
81
+ )
46
82
  )
47
- },
48
- rightComponent = {
49
- Icon(
50
- painterResource(R.drawable.chevron_right_icon),
51
- contentDescription = "Open app",
52
- tint = Theme.colors.icon.default,
53
- modifier = Modifier
54
- .size(Theme.sizing.icon.extraSmall)
55
- )
56
- }
57
- ) {
58
- Column {
59
- Text(label)
60
83
 
61
84
  if (description != null) {
62
- Spacer(Theme.spacing.tiny)
63
-
64
- Text(
65
- text = description,
66
- fontSize = Theme.typography.small,
67
- color = Theme.colors.text.secondary
85
+ NewText(
86
+ description,
87
+ maxLines = 1,
88
+ overflow = TextOverflow.Ellipsis,
89
+ style = NewAppTheme.font.sm,
90
+ color = NewAppTheme.colors.text.tertiary
68
91
  )
69
92
  }
70
93
  }
94
+
95
+ Icon(
96
+ painter = painterResource(R.drawable.chevron_right),
97
+ contentDescription = "Open app",
98
+ tint = NewAppTheme.colors.icon.quaternary,
99
+ modifier = Modifier
100
+ .size(20.dp)
101
+ )
71
102
  }
72
103
  }
73
104
  }
@@ -1,6 +1,5 @@
1
1
  package expo.modules.devlauncher.compose.ui
2
2
 
3
- import androidx.compose.foundation.background
4
3
  import androidx.compose.foundation.layout.Row
5
4
  import androidx.compose.foundation.layout.RowScope
6
5
  import androidx.compose.foundation.layout.fillMaxWidth
@@ -8,12 +7,9 @@ import androidx.compose.foundation.layout.statusBarsPadding
8
7
  import androidx.compose.runtime.Composable
9
8
  import androidx.compose.ui.Alignment
10
9
  import androidx.compose.ui.Modifier
11
- import androidx.compose.ui.graphics.Color
12
- import expo.modules.devmenu.compose.theme.Theme
13
10
 
14
11
  @Composable
15
12
  fun ScreenHeaderContainer(
16
- backgroundColor: Color = Theme.colors.background.default,
17
13
  modifier: Modifier = Modifier,
18
14
  content: @Composable RowScope.() -> Unit
19
15
  ) {
@@ -21,7 +17,6 @@ fun ScreenHeaderContainer(
21
17
  verticalAlignment = Alignment.Companion.CenterVertically,
22
18
  modifier = Modifier
23
19
  .fillMaxWidth()
24
- .background(backgroundColor)
25
20
  .statusBarsPadding()
26
21
  .then(modifier)
27
22
  ) {
@@ -2,7 +2,9 @@ package expo.modules.devlauncher.compose.ui
2
2
 
3
3
  import android.widget.Toast
4
4
  import androidx.compose.foundation.border
5
+ import androidx.compose.foundation.layout.Arrangement
5
6
  import androidx.compose.foundation.layout.Column
7
+ import androidx.compose.foundation.layout.fillMaxWidth
6
8
  import androidx.compose.foundation.layout.padding
7
9
  import androidx.compose.foundation.shape.RoundedCornerShape
8
10
  import androidx.compose.foundation.text.KeyboardOptions
@@ -12,13 +14,19 @@ import androidx.compose.runtime.mutableStateOf
12
14
  import androidx.compose.runtime.remember
13
15
  import androidx.compose.runtime.setValue
14
16
  import androidx.compose.ui.Modifier
17
+ import androidx.compose.ui.graphics.Color
18
+ import androidx.compose.ui.graphics.SolidColor
15
19
  import androidx.compose.ui.platform.LocalContext
20
+ import androidx.compose.ui.text.font.FontWeight
16
21
  import androidx.compose.ui.text.input.KeyboardCapitalization
17
22
  import androidx.compose.ui.text.input.KeyboardType
23
+ import androidx.compose.ui.tooling.preview.Preview
24
+ import androidx.compose.ui.unit.dp
18
25
  import androidx.core.net.toUri
19
26
  import com.composeunstyled.TextField
20
- import expo.modules.devmenu.compose.primitives.Spacer
21
- import expo.modules.devmenu.compose.theme.Theme
27
+ import com.composeunstyled.TextInput
28
+ import expo.modules.devmenu.compose.newtheme.NewAppTheme
29
+ import expo.modules.devmenu.compose.primitives.NewText
22
30
 
23
31
  private fun validateUrl(url: String): Boolean {
24
32
  return try {
@@ -36,35 +44,58 @@ fun ServerUrlInput(
36
44
  var url by remember { mutableStateOf("") }
37
45
  val context = LocalContext.current
38
46
 
39
- Column {
47
+ Column(
48
+ verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`2`)
49
+ ) {
40
50
  TextField(
41
- url,
42
- onValueChange = { newValue ->
43
- url = newValue
51
+ value = url,
52
+ onValueChange = { newUrl ->
53
+ url = newUrl
44
54
  },
45
- placeholder = "http://10.0.2.2:8081",
46
- textStyle = Theme.typography.medium.font,
47
- contentColor = Theme.colors.text.default,
55
+ textColor = NewAppTheme.colors.text.default,
56
+ textStyle = NewAppTheme.font.sm.merge(
57
+ fontFamily = NewAppTheme.font.mono,
58
+ fontWeight = FontWeight.Light
59
+ ),
48
60
  singleLine = true,
49
61
  modifier = Modifier
62
+ .fillMaxWidth()
50
63
  .border(
51
- width = Theme.sizing.border.default,
52
- shape = RoundedCornerShape(Theme.sizing.borderRadius.small),
53
- color = Theme.colors.border.default
64
+ width = 1.dp,
65
+ shape = RoundedCornerShape(NewAppTheme.borderRadius.sm),
66
+ color = NewAppTheme.colors.border.default
54
67
  )
55
- .padding(Theme.spacing.small),
68
+ .padding(NewAppTheme.spacing.`2`),
56
69
  keyboardOptions = KeyboardOptions(
57
70
  capitalization = KeyboardCapitalization.None,
58
71
  autoCorrectEnabled = false,
59
72
  keyboardType = KeyboardType.Uri
73
+ ),
74
+ cursorBrush = SolidColor(NewAppTheme.colors.text.default.copy(alpha = 0.9f))
75
+ ) {
76
+ TextInput(
77
+ placeholder = {
78
+ NewText(
79
+ text = "http://localhost:8081",
80
+ style = NewAppTheme.font.sm.merge(
81
+ fontFamily = NewAppTheme.font.mono,
82
+ fontWeight = FontWeight.Light
83
+ ),
84
+ color = NewAppTheme.colors.text.quaternary
85
+ )
86
+ }
60
87
  )
61
- )
62
-
63
- Spacer(Theme.spacing.tiny)
88
+ }
64
89
 
65
90
  ActionButton(
66
91
  text = "Connect",
67
- style = Theme.colors.button.tertiary,
92
+ foreground = Color.White,
93
+ background = Color.Black,
94
+ modifier = Modifier.padding(vertical = NewAppTheme.spacing.`2`),
95
+ borderRadius = NewAppTheme.borderRadius.sm,
96
+ textStyle = NewAppTheme.font.sm.merge(
97
+ fontWeight = FontWeight.SemiBold
98
+ ),
68
99
  onClick = {
69
100
  if (validateUrl(url)) {
70
101
  openApp(url)
@@ -77,3 +108,11 @@ fun ServerUrlInput(
77
108
  )
78
109
  }
79
110
  }
111
+
112
+ @Composable
113
+ @Preview(showBackground = true, widthDp = 300)
114
+ fun ServerUrlInputPreview() {
115
+ ServerUrlInput(
116
+ openApp = {}
117
+ )
118
+ }
@@ -1,44 +1,37 @@
1
1
  package expo.modules.devlauncher.compose.ui
2
2
 
3
+ import androidx.compose.foundation.layout.Arrangement
3
4
  import androidx.compose.foundation.layout.Column
4
5
  import androidx.compose.foundation.layout.padding
5
6
  import androidx.compose.runtime.Composable
6
7
  import androidx.compose.ui.Modifier
8
+ import androidx.compose.ui.graphics.Color
7
9
  import androidx.compose.ui.tooling.preview.Preview
8
- import expo.modules.devmenu.compose.primitives.RoundedSurface
9
- import expo.modules.devmenu.compose.primitives.Spacer
10
- import expo.modules.devmenu.compose.primitives.Text
11
- import expo.modules.devmenu.compose.theme.Theme
10
+ import expo.modules.devmenu.compose.newtheme.NewAppTheme
12
11
 
13
12
  @Composable
14
13
  fun SignUp(
15
14
  onLogIn: () -> Unit = {},
16
15
  onSignUp: () -> Unit = {}
17
16
  ) {
18
- RoundedSurface {
19
- Column(modifier = Modifier.padding(Theme.spacing.small)) {
20
- Text(
21
- "Log in or create an account to view local development servers and more.",
22
- color = Theme.colors.text.secondary,
23
- fontSize = Theme.typography.small
24
- )
17
+ Column(
18
+ verticalArrangement = Arrangement.spacedBy(NewAppTheme.spacing.`2`)
19
+ ) {
20
+ ActionButton(
21
+ "Login",
22
+ foreground = Color.White,
23
+ background = Color.Black,
24
+ modifier = Modifier.padding(NewAppTheme.spacing.`3`),
25
+ onClick = onLogIn
26
+ )
25
27
 
26
- Spacer(Theme.spacing.small)
27
-
28
- ActionButton(
29
- "Log In",
30
- style = Theme.colors.button.tertiary,
31
- onClick = onLogIn
32
- )
33
-
34
- Spacer(Theme.spacing.small)
35
-
36
- ActionButton(
37
- "Sign Up",
38
- style = Theme.colors.button.secondary,
39
- onClick = onSignUp
40
- )
41
- }
28
+ ActionButton(
29
+ "Sign Up",
30
+ foreground = NewAppTheme.colors.text.secondary,
31
+ background = NewAppTheme.colors.background.element,
32
+ modifier = Modifier.padding(NewAppTheme.spacing.`3`),
33
+ onClick = onSignUp
34
+ )
42
35
  }
43
36
  }
44
37
 
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="16dp"
3
+ android:height="16dp"
4
+ android:viewportWidth="16"
5
+ android:viewportHeight="16">
6
+ <path
7
+ android:pathData="M8.471,2.862C8.211,2.602 7.789,2.602 7.529,2.862C7.268,3.122 7.268,3.544 7.529,3.805L11.057,7.333H3.333C2.965,7.333 2.667,7.632 2.667,8C2.667,8.368 2.965,8.667 3.333,8.667H11.057L7.529,12.195C7.268,12.456 7.268,12.878 7.529,13.138C7.789,13.399 8.211,13.399 8.471,13.138L13.138,8.471C13.398,8.211 13.398,7.789 13.138,7.529L8.471,2.862Z"
8
+ android:fillColor="#0072DE"/>
9
+ </vector>
@@ -0,0 +1,10 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="20dp"
3
+ android:height="20dp"
4
+ android:viewportWidth="20"
5
+ android:viewportHeight="20">
6
+ <path
7
+ android:pathData="M10,0.833C4.937,0.833 0.833,4.938 0.833,10C0.833,15.063 4.937,19.167 10,19.167C15.063,19.167 19.167,15.063 19.167,10C19.167,4.938 15.063,0.833 10,0.833ZM14.339,8.089C14.665,7.764 14.665,7.236 14.339,6.911C14.014,6.585 13.486,6.585 13.161,6.911L8.75,11.322L6.839,9.411C6.514,9.085 5.986,9.085 5.661,9.411C5.335,9.736 5.335,10.264 5.661,10.589L8.161,13.089C8.486,13.415 9.014,13.415 9.339,13.089L14.339,8.089Z"
8
+ android:fillColor="#34C759"
9
+ android:fillType="evenOdd"/>
10
+ </vector>
@@ -0,0 +1,10 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="20dp"
3
+ android:height="20dp"
4
+ android:viewportWidth="20"
5
+ android:viewportHeight="20">
6
+ <path
7
+ android:pathData="M6.911,4.411C7.236,4.085 7.764,4.085 8.089,4.411L13.089,9.411C13.415,9.736 13.415,10.264 13.089,10.589L8.089,15.589C7.764,15.915 7.236,15.915 6.911,15.589C6.585,15.264 6.585,14.736 6.911,14.411L11.321,10L6.911,5.589C6.585,5.264 6.585,4.736 6.911,4.411Z"
8
+ android:fillColor="#B9BBC6"
9
+ android:fillType="evenOdd"/>
10
+ </vector>
@@ -0,0 +1,13 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="16dp"
3
+ android:height="16dp"
4
+ android:viewportWidth="16"
5
+ android:viewportHeight="16">
6
+ <path
7
+ android:pathData="M5.333,10.667V12.533C5.333,13.28 5.333,13.653 5.479,13.939C5.606,14.189 5.81,14.393 6.061,14.521C6.347,14.667 6.72,14.667 7.467,14.667H12.533C13.28,14.667 13.653,14.667 13.939,14.521C14.189,14.393 14.394,14.189 14.521,13.939C14.667,13.653 14.667,13.28 14.667,12.533V7.467C14.667,6.72 14.667,6.346 14.521,6.061C14.394,5.81 14.189,5.606 13.939,5.479C13.653,5.333 13.28,5.333 12.533,5.333H10.667M3.467,10.667H8.533C9.28,10.667 9.653,10.667 9.939,10.521C10.189,10.393 10.394,10.189 10.521,9.939C10.667,9.653 10.667,9.28 10.667,8.533V3.467C10.667,2.72 10.667,2.346 10.521,2.061C10.394,1.81 10.189,1.606 9.939,1.479C9.653,1.333 9.28,1.333 8.533,1.333H3.467C2.72,1.333 2.347,1.333 2.061,1.479C1.81,1.606 1.606,1.81 1.479,2.061C1.333,2.346 1.333,2.72 1.333,3.467V8.533C1.333,9.28 1.333,9.653 1.479,9.939C1.606,10.189 1.81,10.393 2.061,10.521C2.347,10.667 2.72,10.667 3.467,10.667Z"
8
+ android:strokeLineJoin="round"
9
+ android:strokeWidth="1.33333"
10
+ android:fillColor="#00000000"
11
+ android:strokeColor="#0072DE"
12
+ android:strokeLineCap="round"/>
13
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="25dp"
3
+ android:height="22dp"
4
+ android:viewportWidth="25"
5
+ android:viewportHeight="22">
6
+ <path
7
+ android:pathData="M11.891,8.269C12.08,7.993 12.287,7.957 12.455,7.957C12.623,7.957 12.903,7.993 13.092,8.269C14.582,10.3 17.042,14.345 18.857,17.328C20.041,19.274 20.95,20.769 21.136,20.959C21.837,21.673 22.797,21.228 23.355,20.418C23.904,19.621 24.056,19.061 24.056,18.464C24.056,18.057 16.098,3.378 15.297,2.156C14.526,0.98 14.275,0.684 12.956,0.684H11.969C10.654,0.684 10.464,0.98 9.693,2.156C8.892,3.378 0.934,18.057 0.934,18.464C0.934,19.061 1.086,19.621 1.636,20.418C2.194,21.228 3.154,21.673 3.854,20.959C4.04,20.769 4.95,19.274 6.133,17.328C7.948,14.345 10.4,10.3 11.891,8.269Z"
8
+ android:fillColor="#000000"/>
9
+ </vector>
@@ -0,0 +1,10 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="25dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="25"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:pathData="M13.433,4.7C13.078,4.433 12.589,4.433 12.233,4.7L6.233,9.2C5.982,9.389 5.833,9.685 5.833,10V18C5.833,18.552 6.281,19 6.833,19H9.833V14C9.833,13.448 10.281,13 10.833,13H14.833C15.386,13 15.833,13.448 15.833,14V19H18.833C19.386,19 19.833,18.552 19.833,18V10C19.833,9.685 19.685,9.389 19.433,9.2L13.433,4.7ZM13.833,19V15H11.833V19H13.833ZM11.033,3.1C12.1,2.3 13.567,2.3 14.633,3.1L20.633,7.6C21.389,8.167 21.833,9.056 21.833,10V18C21.833,19.657 20.49,21 18.833,21H6.833C5.176,21 3.833,19.657 3.833,18V10C3.833,9.056 4.278,8.167 5.033,7.6L11.033,3.1Z"
8
+ android:fillColor="#B9BBC6"
9
+ android:fillType="evenOdd"/>
10
+ </vector>
@@ -0,0 +1,10 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="20dp"
3
+ android:height="20dp"
4
+ android:viewportWidth="20"
5
+ android:viewportHeight="20">
6
+ <path
7
+ android:pathData="M5.968,2.5H6.667C7.127,2.5 7.5,2.873 7.5,3.333C7.5,3.794 7.127,4.167 6.667,4.167H6C5.52,4.167 5.209,4.167 4.973,4.187C4.747,4.205 4.663,4.236 4.622,4.258C4.465,4.337 4.337,4.465 4.258,4.622C4.236,4.663 4.205,4.747 4.187,4.973C4.167,5.209 4.167,5.52 4.167,6V6.667C4.167,7.127 3.794,7.5 3.333,7.5C2.873,7.5 2.5,7.127 2.5,6.667V5.968C2.5,5.529 2.5,5.15 2.525,4.837C2.552,4.508 2.612,4.18 2.772,3.865C3.012,3.395 3.395,3.012 3.865,2.772C4.18,2.612 4.508,2.552 4.837,2.525C5.15,2.5 5.529,2.5 5.968,2.5ZM15.027,4.187C14.791,4.167 14.481,4.167 14,4.167H13.333C12.873,4.167 12.5,3.794 12.5,3.333C12.5,2.873 12.873,2.5 13.333,2.5H14.032C14.471,2.5 14.85,2.5 15.163,2.525C15.492,2.552 15.82,2.612 16.135,2.772C16.605,3.012 16.988,3.395 17.228,3.865C17.388,4.18 17.448,4.508 17.475,4.837C17.5,5.15 17.5,5.529 17.5,5.968V6.667C17.5,7.127 17.127,7.5 16.667,7.5C16.206,7.5 15.833,7.127 15.833,6.667V6C15.833,5.52 15.833,5.209 15.813,4.973C15.795,4.747 15.764,4.663 15.743,4.622C15.663,4.465 15.535,4.337 15.378,4.258C15.337,4.236 15.253,4.205 15.027,4.187ZM3.333,12.5C3.794,12.5 4.167,12.873 4.167,13.333V14C4.167,14.481 4.167,14.791 4.187,15.027C4.205,15.253 4.236,15.337 4.258,15.378C4.337,15.535 4.465,15.663 4.622,15.743C4.663,15.764 4.747,15.795 4.973,15.813C5.209,15.833 5.52,15.833 6,15.833H6.667C7.127,15.833 7.5,16.206 7.5,16.667C7.5,17.127 7.127,17.5 6.667,17.5H5.968C5.529,17.5 5.15,17.5 4.837,17.475C4.508,17.448 4.18,17.388 3.865,17.228C3.395,16.988 3.012,16.605 2.772,16.135C2.612,15.82 2.552,15.492 2.525,15.163C2.5,14.85 2.5,14.471 2.5,14.032V13.333C2.5,12.873 2.873,12.5 3.333,12.5ZM16.667,12.5C17.127,12.5 17.5,12.873 17.5,13.333V14.032C17.5,14.471 17.5,14.85 17.475,15.163C17.448,15.492 17.388,15.82 17.228,16.135C16.988,16.605 16.605,16.988 16.135,17.228C15.82,17.388 15.492,17.448 15.163,17.475C14.85,17.5 14.471,17.5 14.032,17.5H13.333C12.873,17.5 12.5,17.127 12.5,16.667C12.5,16.206 12.873,15.833 13.333,15.833H14C14.481,15.833 14.791,15.833 15.027,15.813C15.253,15.795 15.337,15.764 15.378,15.743C15.535,15.663 15.663,15.535 15.743,15.378C15.764,15.337 15.795,15.253 15.813,15.027C15.833,14.791 15.833,14.481 15.833,14V13.333C15.833,12.873 16.206,12.5 16.667,12.5Z"
8
+ android:fillColor="#8B8D98"
9
+ android:fillType="evenOdd"/>
10
+ </vector>
@@ -0,0 +1,12 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="49dp"
3
+ android:height="48dp"
4
+ android:viewportWidth="49"
5
+ android:viewportHeight="48">
6
+ <path
7
+ android:pathData="M20.225,4L32.982,4C34.592,4 35.921,4 37.004,4.088C38.128,4.18 39.161,4.377 40.132,4.872C41.637,5.639 42.861,6.863 43.628,8.368C44.123,9.339 44.32,10.372 44.412,11.496C44.5,12.579 44.5,13.907 44.5,15.517V32.483C44.5,34.092 44.5,35.421 44.412,36.504C44.32,37.628 44.123,38.661 43.628,39.632C42.861,41.137 41.637,42.361 40.132,43.128C39.161,43.623 38.128,43.82 37.004,43.912C35.921,44 34.592,44 32.983,44L20.225,44C18.634,44.001 17.453,44.001 16.429,43.727C13.669,42.988 11.512,40.831 10.773,38.07C10.498,37.047 10.499,35.866 10.5,34.275L10.5,34C10.5,32.895 11.395,32 12.5,32C13.604,32 14.5,32.895 14.5,34C14.5,35.989 14.517,36.591 14.636,37.035C15.006,38.416 16.084,39.494 17.465,39.864C17.909,39.983 18.511,40 20.5,40H32.9C34.613,40 35.778,39.998 36.678,39.925C37.555,39.853 38.003,39.723 38.316,39.564C39.069,39.181 39.681,38.569 40.064,37.816C40.223,37.503 40.353,37.055 40.425,36.178C40.498,35.278 40.5,34.113 40.5,32.4V15.6C40.5,13.887 40.498,12.722 40.425,11.822C40.353,10.945 40.223,10.497 40.064,10.184C39.681,9.431 39.069,8.819 38.316,8.436C38.003,8.277 37.555,8.147 36.678,8.075C35.778,8.002 34.613,8 32.9,8H20.5C18.511,8 17.909,8.017 17.465,8.136C16.084,8.506 15.006,9.584 14.636,10.965C14.517,11.409 14.5,12.011 14.5,14C14.5,15.104 13.604,16 12.5,16C11.395,16 10.5,15.104 10.5,14L10.5,13.725C10.499,12.134 10.498,10.953 10.773,9.929C11.512,7.169 13.669,5.012 16.429,4.273C17.453,3.998 18.634,3.999 20.225,4Z"
8
+ android:fillColor="#0587F0"/>
9
+ <path
10
+ android:pathData="M23.086,14.586C23.867,13.805 25.133,13.805 25.914,14.586L33.914,22.586C34.695,23.367 34.695,24.633 33.914,25.414L25.914,33.414C25.133,34.195 23.867,34.195 23.086,33.414C22.305,32.633 22.305,31.367 23.086,30.586L27.672,26H6.5C5.395,26 4.5,25.105 4.5,24C4.5,22.895 5.395,22 6.5,22H27.672L23.086,17.414C22.305,16.633 22.305,15.367 23.086,14.586Z"
11
+ android:fillColor="#0587F0"/>
12
+ </vector>
@@ -0,0 +1,10 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="20dp"
3
+ android:height="20dp"
4
+ android:viewportWidth="20"
5
+ android:viewportHeight="20">
6
+ <path
7
+ android:pathData="M8.424,4.172C8.771,4.21 9.057,4.46 9.142,4.798L11.185,12.97L13.473,9.538C13.628,9.306 13.888,9.167 14.167,9.167H17.5C17.96,9.167 18.333,9.54 18.333,10C18.333,10.46 17.96,10.833 17.5,10.833H14.613L11.527,15.462C11.344,15.737 11.016,15.877 10.691,15.821C10.366,15.765 10.105,15.522 10.025,15.202L8.071,7.388L6.579,10.373C6.438,10.655 6.149,10.833 5.833,10.833H2.5C2.04,10.833 1.667,10.46 1.667,10C1.667,9.54 2.04,9.167 2.5,9.167H5.318L7.588,4.627C7.744,4.316 8.078,4.134 8.424,4.172Z"
8
+ android:fillColor="#8B8D98"
9
+ android:fillType="evenOdd"/>
10
+ </vector>
@@ -0,0 +1,10 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="25dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="25"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:pathData="M12.5,5C8.634,5 5.5,8.134 5.5,12C5.5,12.552 5.052,13 4.5,13C3.948,13 3.5,12.552 3.5,12C3.5,7.029 7.529,3 12.5,3C14.805,3 16.908,3.868 18.5,5.292V4C18.5,3.448 18.948,3 19.5,3C20.052,3 20.5,3.448 20.5,4V8C20.5,8.552 20.052,9 19.5,9H15.5C14.948,9 14.5,8.552 14.5,8C14.5,7.448 14.948,7 15.5,7H17.399C16.136,5.762 14.407,5 12.5,5ZM20.5,11C21.052,11 21.5,11.448 21.5,12C21.5,16.971 17.471,21 12.5,21C10.195,21 8.092,20.132 6.5,18.708V20C6.5,20.552 6.052,21 5.5,21C4.948,21 4.5,20.552 4.5,20V16C4.5,15.448 4.948,15 5.5,15H9.5C10.052,15 10.5,15.448 10.5,16C10.5,16.552 10.052,17 9.5,17H7.601C8.864,18.238 10.593,19 12.5,19C16.366,19 19.5,15.866 19.5,12C19.5,11.448 19.948,11 20.5,11Z"
8
+ android:fillColor="#B9BBC6"
9
+ android:fillType="evenOdd"/>
10
+ </vector>
@@ -0,0 +1,42 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:pathData="M7.759,2L8,2C8.552,2 9,2.448 9,3C9,3.552 8.552,4 8,4H7.8C6.943,4 6.361,4.001 5.911,4.038C5.473,4.073 5.248,4.138 5.092,4.218C4.716,4.41 4.41,4.716 4.218,5.092C4.138,5.248 4.073,5.473 4.038,5.911C4.001,6.361 4,6.943 4,7.8V8C4,8.552 3.552,9 3,9C2.448,9 2,8.552 2,8L2,7.759C2,6.954 2,6.289 2.044,5.748C2.09,5.186 2.189,4.669 2.436,4.184C2.819,3.431 3.431,2.819 4.184,2.436C4.669,2.189 5.186,2.09 5.748,2.044C6.289,2 6.954,2 7.759,2Z"
8
+ android:fillColor="#000000"
9
+ android:fillType="evenOdd"/>
10
+ <path
11
+ android:pathData="M3,15C3.552,15 4,15.448 4,16V16.2C4,17.057 4.001,17.639 4.038,18.089C4.073,18.527 4.138,18.752 4.218,18.908C4.41,19.284 4.716,19.59 5.092,19.782C5.248,19.862 5.473,19.927 5.911,19.962C6.361,19.999 6.943,20 7.8,20H8C8.552,20 9,20.448 9,21C9,21.552 8.552,22 8,22H7.759C6.954,22 6.289,22 5.748,21.956C5.186,21.91 4.669,21.811 4.184,21.564C3.431,21.181 2.819,20.569 2.436,19.816C2.189,19.331 2.09,18.814 2.044,18.252C2,17.711 2,17.046 2,16.241C2,16.228 2,16.214 2,16.2V16C2,15.448 2.448,15 3,15Z"
12
+ android:fillColor="#000000"
13
+ android:fillType="evenOdd"/>
14
+ <path
15
+ android:pathData="M18.089,4.038C17.639,4.001 17.057,4 16.2,4H16C15.448,4 15,3.552 15,3C15,2.448 15.448,2 16,2H16.2C16.214,2 16.228,2 16.241,2C17.046,2 17.711,2 18.252,2.044C18.814,2.09 19.331,2.189 19.816,2.436C20.569,2.819 21.181,3.431 21.564,4.184C21.811,4.669 21.91,5.186 21.956,5.748C22,6.289 22,6.954 22,7.759V8C22,8.552 21.552,9 21,9C20.448,9 20,8.552 20,8V7.8C20,6.943 19.999,6.361 19.962,5.911C19.927,5.473 19.862,5.248 19.782,5.092C19.59,4.716 19.284,4.41 18.908,4.218C18.752,4.138 18.527,4.073 18.089,4.038Z"
16
+ android:fillColor="#000000"
17
+ android:fillType="evenOdd"/>
18
+ <path
19
+ android:pathData="M21,15C21.552,15 22,15.448 22,16V16.241C22,17.046 22,17.711 21.956,18.252C21.91,18.814 21.811,19.331 21.564,19.816C21.181,20.569 20.569,21.181 19.816,21.564C19.331,21.811 18.814,21.91 18.252,21.956C17.711,22 17.046,22 16.241,22H16C15.448,22 15,21.552 15,21C15,20.448 15.448,20 16,20H16.2C17.057,20 17.639,19.999 18.089,19.962C18.527,19.927 18.752,19.862 18.908,19.782C19.284,19.59 19.59,19.284 19.782,18.908C19.862,18.752 19.927,18.527 19.962,18.089C19.999,17.639 20,17.057 20,16.2V16C20,15.448 20.448,15 21,15Z"
20
+ android:fillColor="#000000"
21
+ android:fillType="evenOdd"/>
22
+ <path
23
+ android:pathData="M2,12C2,11.448 2.448,11 3,11H3.01C3.562,11 4.01,11.448 4.01,12C4.01,12.552 3.562,13 3.01,13H3C2.448,13 2,12.552 2,12Z"
24
+ android:fillColor="#000000"
25
+ android:fillType="evenOdd"/>
26
+ <path
27
+ android:pathData="M6.5,12C6.5,11.448 6.948,11 7.5,11H7.51C8.062,11 8.51,11.448 8.51,12C8.51,12.552 8.062,13 7.51,13H7.5C6.948,13 6.5,12.552 6.5,12Z"
28
+ android:fillColor="#000000"
29
+ android:fillType="evenOdd"/>
30
+ <path
31
+ android:pathData="M15.5,12C15.5,11.448 15.948,11 16.5,11H16.51C17.062,11 17.51,11.448 17.51,12C17.51,12.552 17.062,13 16.51,13H16.5C15.948,13 15.5,12.552 15.5,12Z"
32
+ android:fillColor="#000000"
33
+ android:fillType="evenOdd"/>
34
+ <path
35
+ android:pathData="M11,12C11,11.448 11.448,11 12,11H12.01C12.562,11 13.01,11.448 13.01,12C13.01,12.552 12.562,13 12.01,13H12C11.448,13 11,12.552 11,12Z"
36
+ android:fillColor="#000000"
37
+ android:fillType="evenOdd"/>
38
+ <path
39
+ android:pathData="M20,12C20,11.448 20.448,11 21,11H21.01C21.562,11 22.01,11.448 22.01,12C22.01,12.552 21.562,13 21.01,13H21C20.448,13 20,12.552 20,12Z"
40
+ android:fillColor="#000000"
41
+ android:fillType="evenOdd"/>
42
+ </vector>
@@ -0,0 +1,14 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="25dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="25"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:pathData="M12.167,10C11.062,10 10.167,10.895 10.167,12C10.167,13.105 11.062,14 12.167,14C13.271,14 14.167,13.105 14.167,12C14.167,10.895 13.271,10 12.167,10ZM8.167,12C8.167,9.791 9.958,8 12.167,8C14.376,8 16.167,9.791 16.167,12C16.167,14.209 14.376,16 12.167,16C9.958,16 8.167,14.209 8.167,12Z"
8
+ android:fillColor="#B9BBC6"
9
+ android:fillType="evenOdd"/>
10
+ <path
11
+ android:pathData="M12.657,4.423C12.352,4.252 11.981,4.252 11.676,4.423L5.676,7.798C5.362,7.975 5.167,8.308 5.167,8.67V15.33C5.167,15.692 5.362,16.025 5.676,16.202L11.676,19.577C11.981,19.748 12.352,19.748 12.657,19.577L18.657,16.202C18.972,16.025 19.167,15.692 19.167,15.33V8.67C19.167,8.308 18.972,7.975 18.657,7.798L12.657,4.423ZM10.696,2.68C11.609,2.166 12.724,2.166 13.637,2.68L19.638,6.055C20.582,6.586 21.167,7.586 21.167,8.67V15.33C21.167,16.414 20.582,17.414 19.638,17.945L13.637,21.32C12.724,21.834 11.609,21.834 10.696,21.32L4.696,17.945C3.751,17.414 3.167,16.414 3.167,15.33V8.67C3.167,7.586 3.751,6.586 4.696,6.055L10.696,2.68Z"
12
+ android:fillColor="#B9BBC6"
13
+ android:fillType="evenOdd"/>
14
+ </vector>
@@ -0,0 +1,12 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="20dp"
3
+ android:height="20dp"
4
+ android:viewportWidth="20"
5
+ android:viewportHeight="20">
6
+ <path
7
+ android:pathData="M5.833,1.667C3.992,1.667 2.5,3.159 2.5,5V17.5C2.5,17.96 2.873,18.333 3.333,18.333C3.794,18.333 4.167,17.96 4.167,17.5V5C4.167,4.08 4.913,3.333 5.833,3.333H14.167C15.087,3.333 15.833,4.08 15.833,5V17.5C15.833,17.96 16.206,18.333 16.667,18.333C17.127,18.333 17.5,17.96 17.5,17.5V5C17.5,3.159 16.008,1.667 14.167,1.667H5.833Z"
8
+ android:fillColor="#80838D"/>
9
+ <path
10
+ android:pathData="M5,10C5,9.079 5.746,8.333 6.667,8.333H13.333C14.254,8.333 15,9.079 15,10V17.5C15,17.96 14.627,18.333 14.167,18.333H5.833C5.373,18.333 5,17.96 5,17.5V10Z"
11
+ android:fillColor="#80838D"/>
12
+ </vector>
@@ -0,0 +1,26 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:pathData="M15.535,7.05C15.926,6.66 16.559,6.66 16.95,7.05C19.683,9.784 19.683,14.216 16.95,16.95C16.559,17.34 15.926,17.34 15.535,16.95C15.145,16.559 15.145,15.926 15.535,15.536C17.488,13.583 17.488,10.417 15.535,8.464C15.145,8.074 15.145,7.441 15.535,7.05Z"
8
+ android:fillColor="#000000"
9
+ android:fillType="evenOdd"/>
10
+ <path
11
+ android:pathData="M8.464,7.05C8.855,7.441 8.855,8.074 8.464,8.464C6.512,10.417 6.512,13.583 8.464,15.535C8.855,15.926 8.855,16.559 8.464,16.95C8.074,17.34 7.441,17.34 7.05,16.95C4.317,14.216 4.317,9.784 7.05,7.05C7.441,6.66 8.074,6.66 8.464,7.05Z"
12
+ android:fillColor="#000000"
13
+ android:fillType="evenOdd"/>
14
+ <path
15
+ android:pathData="M5.636,4.222C6.027,4.612 6.027,5.246 5.636,5.636C2.121,9.151 2.121,14.849 5.636,18.364C6.027,18.754 6.027,19.388 5.636,19.778C5.246,20.169 4.612,20.169 4.222,19.778C-0.074,15.482 -0.074,8.518 4.222,4.222C4.612,3.831 5.246,3.831 5.636,4.222Z"
16
+ android:fillColor="#000000"
17
+ android:fillType="evenOdd"/>
18
+ <path
19
+ android:pathData="M18.364,4.222C18.754,3.831 19.388,3.831 19.778,4.222C24.074,8.518 24.074,15.483 19.778,19.778C19.388,20.169 18.754,20.169 18.364,19.778C17.973,19.388 17.973,18.755 18.364,18.364C21.879,14.849 21.879,9.151 18.364,5.636C17.973,5.246 17.973,4.612 18.364,4.222Z"
20
+ android:fillColor="#000000"
21
+ android:fillType="evenOdd"/>
22
+ <path
23
+ android:pathData="M9,12C9,10.343 10.343,9 12,9C13.657,9 15,10.343 15,12C15,13.657 13.657,15 12,15C10.343,15 9,13.657 9,12Z"
24
+ android:fillColor="#000000"
25
+ android:fillType="evenOdd"/>
26
+ </vector>
@@ -0,0 +1,13 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:pathData="M3,20C5.336,17.523 8.507,16 12,16C15.493,16 18.664,17.523 21,20M16.5,7.5C16.5,9.985 14.485,12 12,12C9.515,12 7.5,9.985 7.5,7.5C7.5,5.015 9.515,3 12,3C14.485,3 16.5,5.015 16.5,7.5Z"
8
+ android:strokeLineJoin="round"
9
+ android:strokeWidth="2"
10
+ android:fillColor="#00000000"
11
+ android:strokeColor="#8B8D98"
12
+ android:strokeLineCap="round"/>
13
+ </vector>
@@ -86,7 +86,7 @@
86
86
  self.shouldPreferUpdatesInterfaceSourceUrl = NO;
87
87
 
88
88
  self.dependencyProvider = [RCTAppDependencyProvider new];
89
- self.reactNativeFactory = [[EXDevLauncherReactNativeFactory alloc] initWithDelegate:self];
89
+ self.reactNativeFactory = [[EXDevLauncherReactNativeFactory alloc] initWithDelegate:self releaseLevel:[self getReactNativeReleaseLevel]];
90
90
  }
91
91
  return self;
92
92
  }
@@ -340,12 +340,12 @@
340
340
 
341
341
  [self _addInitModuleObserver];
342
342
  #endif
343
-
343
+
344
344
  DevLauncherViewController *swiftUIViewController = [[DevLauncherViewController alloc] init];
345
-
345
+
346
346
  _window.rootViewController = swiftUIViewController;
347
347
  [_window makeKeyAndVisible];
348
-
348
+
349
349
  dispatch_async(dispatch_get_main_queue(), ^{
350
350
  [self onAppContentDidAppear];
351
351
  });
@@ -718,6 +718,25 @@
718
718
  return appVersion;
719
719
  }
720
720
 
721
+ -(RCTReleaseLevel)getReactNativeReleaseLevel
722
+ {
723
+ // @TODO: Read this value from the main react-native factory instance on 0.82
724
+ NSString *releaseLevelString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"ReactNativeReleaseLevel"];
725
+ RCTReleaseLevel releaseLevel = Stable;
726
+ if ([releaseLevelString isKindOfClass:[NSString class]]) {
727
+ NSString *lower = [releaseLevelString lowercaseString];
728
+ if ([lower isEqualToString:@"canary"]) {
729
+ releaseLevel = Canary;
730
+ } else if ([lower isEqualToString:@"experimental"]) {
731
+ releaseLevel = Experimental;
732
+ } else if ([lower isEqualToString:@"stable"]) {
733
+ releaseLevel = Stable;
734
+ }
735
+ }
736
+
737
+ return releaseLevel;
738
+ }
739
+
721
740
  -(void)copyToClipboard:(NSString *)content {
722
741
  #if !TARGET_OS_TV
723
742
  UIPasteboard *clipboard = [UIPasteboard generalPasteboard];