Skip to content

Commit 526a207

Browse files
feat: Implement all Compose views (#42)
* chore: refactor to follow Expo's guidance This isn't a change in functionality, but it matches what Expo is doing with their Compose components. * chore: add icon assets for bottom nav * chore: use icons in bottom navigation * chore: refactor VOTD Compose to be functional component * chore: refactor BibleReaderView to be functional component * feat: implement BibleTextView as functional component * feat: implement BibleWidgetView as functional component * chore: refactor sign in button as functional component * chore: use correct <Host /> for each platform * chore: implement onTap callback * chore: remove unnecessary color utility function * chore: swap order of styles to allow for overriding * chore: update default Bible version to 3034 * chore: remove mutableState It looks like Expo no longer supports piping props into mutable state. We should use the regular primitives instead. * chore: make urlScheme and footnotes optional
1 parent 8d79858 commit 526a207

20 files changed

+409
-260
lines changed
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.youversion.reactnativesdk
22

3+
import com.youversion.reactnativesdk.views.BibleReaderViewProps
34
import com.youversion.reactnativesdk.views.YVPBibleReaderView
45
import expo.modules.kotlin.modules.Module
56
import expo.modules.kotlin.modules.ModuleDefinition
@@ -8,6 +9,8 @@ class RNBibleReaderViewModule : Module() {
89
override fun definition() = ModuleDefinition {
910
Name("BibleReaderView")
1011

11-
View(YVPBibleReaderView::class)
12+
View("YVPBibleReaderView") { props: BibleReaderViewProps ->
13+
YVPBibleReaderView(props)
14+
}
1215
}
1316
}
Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
11
package com.youversion.reactnativesdk
22

3+
import androidx.compose.runtime.remember
4+
import com.youversion.reactnativesdk.api.VerseTappedEvent
5+
import com.youversion.reactnativesdk.views.BibleTextViewProps
36
import com.youversion.reactnativesdk.views.YVPBibleTextView
47
import expo.modules.kotlin.modules.Module
58
import expo.modules.kotlin.modules.ModuleDefinition
9+
import expo.modules.kotlin.viewevent.getValue
610

711
class RNBibleTextViewModule : Module() {
812
override fun definition() = ModuleDefinition {
913
Name("BibleTextView")
1014

11-
View(YVPBibleTextView::class) {
12-
Events("onTap")
15+
View(
16+
name = "YVPBibleTextView",
17+
events = { Events("onTap") }
18+
) { props: BibleTextViewProps ->
19+
val onTap by remember { EventDispatcher<VerseTappedEvent>() }
20+
21+
YVPBibleTextView(props) { event: VerseTappedEvent ->
22+
onTap(event)
23+
}
1324
}
1425
}
1526
}
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.youversion.reactnativesdk
22

3+
import com.youversion.reactnativesdk.views.BibleWidgetViewProps
34
import com.youversion.reactnativesdk.views.YVPBibleWidgetView
45
import expo.modules.kotlin.modules.Module
56
import expo.modules.kotlin.modules.ModuleDefinition
@@ -8,6 +9,8 @@ class RNBibleWidgetViewModule : Module() {
89
override fun definition() = ModuleDefinition {
910
Name("BibleWidgetView")
1011

11-
View(YVPBibleWidgetView::class)
12+
View("YVPBibleWidgetView") { props: BibleWidgetViewProps ->
13+
YVPBibleWidgetView(props)
14+
}
1215
}
1316
}
Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
11
package com.youversion.reactnativesdk
22

3+
import androidx.compose.runtime.remember
4+
import com.youversion.reactnativesdk.views.SignInWithYouVersionButtonProps
35
import com.youversion.reactnativesdk.views.YVPSignInWithYouVersionButton
46
import expo.modules.kotlin.modules.Module
57
import expo.modules.kotlin.modules.ModuleDefinition
8+
import expo.modules.kotlin.viewevent.getValue
69

710
class RNSignInWithYouVersionButtonModule : Module() {
811
override fun definition() = ModuleDefinition {
912
Name("SignInWithYouVersionButton")
1013

11-
View(YVPSignInWithYouVersionButton::class) {
12-
Events("onTap")
14+
View(
15+
name = "YVPSignInWithYouVersionButton",
16+
events = { Events("onTap") }
17+
) { props: SignInWithYouVersionButtonProps ->
18+
val onTap by remember { EventDispatcher<Unit>() }
19+
20+
YVPSignInWithYouVersionButton(
21+
props = props
22+
) {
23+
onTap(Unit)
24+
}
1325
}
1426
}
1527
}
Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,28 @@
11
package com.youversion.reactnativesdk
22

3+
import androidx.compose.runtime.remember
4+
import com.youversion.reactnativesdk.views.VotdViewProps
35
import com.youversion.reactnativesdk.views.YVPVotdView
46
import expo.modules.kotlin.modules.Module
57
import expo.modules.kotlin.modules.ModuleDefinition
8+
import expo.modules.kotlin.viewevent.getValue
69

710
class RNVotdViewModule : Module() {
811
override fun definition() = ModuleDefinition {
912
Name("VotdView")
1013

11-
View(YVPVotdView::class)
14+
View(
15+
name = "YVPVotdView",
16+
events = { Events("onSharePress", "onFullChapterPress") }
17+
) { props: VotdViewProps ->
18+
val onSharePress by remember { EventDispatcher<Unit>() }
19+
val onFullChapterPress by remember { EventDispatcher<Unit>() }
20+
21+
YVPVotdView(
22+
props = props,
23+
onSharePress = { onSharePress(Unit) },
24+
onFullChapterPress = { onFullChapterPress(Unit) }
25+
)
26+
}
1227
}
1328
}

android/src/main/java/com/youversion/reactnativesdk/api/YVPRecords.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.youversion.reactnativesdk.api
22

3+
import com.youversion.platform.core.bibles.domain.BibleReference
34
import com.youversion.platform.core.bibles.models.BibleBook
45
import com.youversion.platform.core.bibles.models.BibleChapter
56
import com.youversion.platform.core.bibles.models.BibleVersion
@@ -61,6 +62,20 @@ data class LanguageRecord(
6162
)
6263
}
6364

65+
data class VerseTappedEvent(
66+
@Field
67+
val bibleReference: BibleReferenceRecord
68+
) : Record {
69+
constructor(bibleReference: BibleReference) : this(
70+
bibleReference = BibleReferenceRecord(
71+
versionId = bibleReference.versionId,
72+
bookUSFM = bibleReference.bookUSFM,
73+
chapter = bibleReference.chapter,
74+
verse = bibleReference.verseStart
75+
)
76+
)
77+
}
78+
6479
data class BibleVersionRecord(
6580
@Field
6681
val id: Int,
@@ -155,6 +170,8 @@ data class BibleReferenceRecord(
155170
val bookUSFM: String,
156171
@Field
157172
val chapter: Int,
173+
@Field
174+
val verse: Int?
158175
) : Record
159176

160177
data class HighlightRecord(
Lines changed: 37 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,55 @@
11
package com.youversion.reactnativesdk.views
22

3-
import android.content.Context
43
import androidx.compose.runtime.Composable
5-
import androidx.compose.runtime.MutableState
6-
import androidx.compose.runtime.mutableStateOf
7-
import androidx.compose.ui.Modifier
84
import com.youversion.platform.core.bibles.domain.BibleReference
95
import com.youversion.platform.reader.BibleReader
10-
import expo.modules.kotlin.AppContext
11-
import expo.modules.kotlin.views.ComposableScope
126
import expo.modules.kotlin.views.ComposeProps
13-
import expo.modules.kotlin.views.ExpoComposeView
147

158
const val DEFAULT_BEREAN_STANDARD_BIBLE_VERSION = 3034
169

1710
data class BibleReaderViewProps(
18-
val versionId: MutableState<Int?> = mutableStateOf(null),
19-
val bookUSFM: MutableState<String?> = mutableStateOf(null),
20-
val chapter: MutableState<Int?> = mutableStateOf(null),
21-
val verse: MutableState<Int?> = mutableStateOf(null),
22-
val verseStart: MutableState<Int?> = mutableStateOf(null),
23-
val verseEnd: MutableState<Int?> = mutableStateOf(null),
24-
val appName: MutableState<String?> = mutableStateOf(null),
25-
val signInMessage: MutableState<String?> = mutableStateOf(null),
26-
val hasReference: MutableState<Boolean?> = mutableStateOf(null)
11+
val versionId: Int? = null,
12+
val bookUSFM: String? = null,
13+
val chapter: Int? = null,
14+
val verse: Int? = null,
15+
val verseStart: Int? = null,
16+
val verseEnd: Int? = null,
17+
val appName: String? = null,
18+
val signInMessage: String? = null,
19+
val hasReference: Boolean? = null
2720
) : ComposeProps
2821

29-
class YVPBibleReaderView(context: Context, appContext: AppContext) :
30-
ExpoComposeView<BibleReaderViewProps>(context, appContext, withHostingView = true) {
31-
override val props = BibleReaderViewProps()
22+
@Composable
23+
fun YVPBibleReaderView(props: BibleReaderViewProps) {
24+
BibleReader(
25+
appName = props.appName ?: "",
26+
appSignInMessage = props.signInMessage ?: "",
27+
bibleReference = bibleReference(props),
28+
)
29+
}
3230

33-
@Composable
34-
override fun ComposableScope.Content() {
35-
BibleReader(
36-
appName = props.appName.value ?: "",
37-
appSignInMessage = props.signInMessage.value ?: "",
38-
bibleReference = bibleReference(),
31+
fun bibleReference(props: BibleReaderViewProps): BibleReference? {
32+
val start = props.verseStart
33+
val end = props.verseEnd
34+
35+
if (start != null && end != null) {
36+
return BibleReference(
37+
versionId = props.versionId ?: DEFAULT_BEREAN_STANDARD_BIBLE_VERSION,
38+
bookUSFM = props.bookUSFM ?: "JHN",
39+
chapter = props.chapter ?: 1,
40+
verseStart = start,
41+
verseEnd = end
3942
)
4043
}
4144

42-
fun bibleReference(): BibleReference? {
43-
val start = props.verseStart.value
44-
val end = props.verseEnd.value
45-
46-
if (start != null && end != null) {
47-
return BibleReference(
48-
versionId = props.versionId.value ?: DEFAULT_BEREAN_STANDARD_BIBLE_VERSION,
49-
bookUSFM = props.bookUSFM.value ?: "JHN",
50-
chapter = props.chapter.value ?: 1,
51-
verseStart = start,
52-
verseEnd = end
53-
)
54-
}
55-
56-
if (props.hasReference.value == true) {
57-
return BibleReference(
58-
versionId = props.versionId.value ?: DEFAULT_BEREAN_STANDARD_BIBLE_VERSION,
59-
bookUSFM = props.bookUSFM.value ?: "JHN",
60-
chapter = props.chapter.value ?: 1,
61-
verse = props.verse.value
62-
)
63-
}
64-
65-
return null
45+
if (props.hasReference == true) {
46+
return BibleReference(
47+
versionId = props.versionId ?: DEFAULT_BEREAN_STANDARD_BIBLE_VERSION,
48+
bookUSFM = props.bookUSFM ?: "JHN",
49+
chapter = props.chapter ?: 1,
50+
verse = props.verse
51+
)
6652
}
53+
54+
return null
6755
}

0 commit comments

Comments
 (0)