@youversion/platform-react-native 0.7.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 (116) hide show
  1. package/.releaserc.json +104 -0
  2. package/CHANGELOG.md +29 -0
  3. package/CONTRIBUTING.md +319 -0
  4. package/LICENSE +201 -0
  5. package/README.md +562 -0
  6. package/RELEASING.md +85 -0
  7. package/android/build.gradle +43 -0
  8. package/android/src/main/AndroidManifest.xml +2 -0
  9. package/assets/github-reactNative-sdk-banner.png +0 -0
  10. package/build/api/bible.d.ts +26 -0
  11. package/build/api/bible.d.ts.map +1 -0
  12. package/build/api/bible.js +32 -0
  13. package/build/api/bible.js.map +1 -0
  14. package/build/api/highlights.d.ts +109 -0
  15. package/build/api/highlights.d.ts.map +1 -0
  16. package/build/api/highlights.js +49 -0
  17. package/build/api/highlights.js.map +1 -0
  18. package/build/api/index.d.ts +27 -0
  19. package/build/api/index.d.ts.map +1 -0
  20. package/build/api/index.js +13 -0
  21. package/build/api/index.js.map +1 -0
  22. package/build/api/languages.d.ts +11 -0
  23. package/build/api/languages.d.ts.map +1 -0
  24. package/build/api/languages.js +13 -0
  25. package/build/api/languages.js.map +1 -0
  26. package/build/api/users.d.ts +20 -0
  27. package/build/api/users.d.ts.map +1 -0
  28. package/build/api/users.js +26 -0
  29. package/build/api/users.js.map +1 -0
  30. package/build/api/votd.d.ts +15 -0
  31. package/build/api/votd.d.ts.map +1 -0
  32. package/build/api/votd.js +13 -0
  33. package/build/api/votd.js.map +1 -0
  34. package/build/components/BibleReaderView.d.ts +22 -0
  35. package/build/components/BibleReaderView.d.ts.map +1 -0
  36. package/build/components/BibleReaderView.js +18 -0
  37. package/build/components/BibleReaderView.js.map +1 -0
  38. package/build/components/BibleTextView.d.ts +18 -0
  39. package/build/components/BibleTextView.d.ts.map +1 -0
  40. package/build/components/BibleTextView.js +25 -0
  41. package/build/components/BibleTextView.js.map +1 -0
  42. package/build/components/BibleWidgetView.d.ts +23 -0
  43. package/build/components/BibleWidgetView.d.ts.map +1 -0
  44. package/build/components/BibleWidgetView.js +17 -0
  45. package/build/components/BibleWidgetView.js.map +1 -0
  46. package/build/components/SignInWithYouVersionButton.d.ts +37 -0
  47. package/build/components/SignInWithYouVersionButton.d.ts.map +1 -0
  48. package/build/components/SignInWithYouVersionButton.js +12 -0
  49. package/build/components/SignInWithYouVersionButton.js.map +1 -0
  50. package/build/components/VotdView.d.ts +11 -0
  51. package/build/components/VotdView.d.ts.map +1 -0
  52. package/build/components/VotdView.js +12 -0
  53. package/build/components/VotdView.js.map +1 -0
  54. package/build/components/index.d.ts +6 -0
  55. package/build/components/index.d.ts.map +1 -0
  56. package/build/components/index.js +6 -0
  57. package/build/components/index.js.map +1 -0
  58. package/build/index.d.ts +5 -0
  59. package/build/index.d.ts.map +1 -0
  60. package/build/index.js +6 -0
  61. package/build/index.js.map +1 -0
  62. package/build/native.d.ts +22 -0
  63. package/build/native.d.ts.map +1 -0
  64. package/build/native.js +3 -0
  65. package/build/native.js.map +1 -0
  66. package/build/platform.d.ts +21 -0
  67. package/build/platform.d.ts.map +1 -0
  68. package/build/platform.js +28 -0
  69. package/build/platform.js.map +1 -0
  70. package/build/types.d.ts +320 -0
  71. package/build/types.d.ts.map +1 -0
  72. package/build/types.js +2 -0
  73. package/build/types.js.map +1 -0
  74. package/commitlint.config.js +23 -0
  75. package/dist/youversion-platform-react-native-0.7.2.tgz +0 -0
  76. package/eslint.config.js +4 -0
  77. package/expo-module.config.json +17 -0
  78. package/ios/APIs/YVPBibleAPI.swift +197 -0
  79. package/ios/APIs/YVPHighlightsAPI.swift +105 -0
  80. package/ios/APIs/YVPLanguagesAPI.swift +70 -0
  81. package/ios/RNBibleReaderViewModule.swift +9 -0
  82. package/ios/RNBibleTextViewModule.swift +9 -0
  83. package/ios/RNBibleWidgetViewModule.swift +9 -0
  84. package/ios/RNSignInWithYouVersionButtonModule.swift +9 -0
  85. package/ios/RNVotdViewModule.swift +9 -0
  86. package/ios/RNYouVersionPlatformModule.swift +79 -0
  87. package/ios/Views/YVPBibleReaderView.swift +57 -0
  88. package/ios/Views/YVPBibleTextView.swift +114 -0
  89. package/ios/Views/YVPBibleWidgetView.swift +64 -0
  90. package/ios/Views/YVPSignInWithYouVersionButton.swift +52 -0
  91. package/ios/Views/YVPVotdView.swift +35 -0
  92. package/ios/YVPAuthAPI.swift +77 -0
  93. package/ios/YVPVotdAPI.swift +20 -0
  94. package/ios/YVPlatform.swift +17 -0
  95. package/ios/YouVersionReactNative.podspec +33 -0
  96. package/mocks/RNYouVersionPlatform.ts +146 -0
  97. package/package.json +58 -0
  98. package/scripts/release-local.sh +224 -0
  99. package/scripts/sync-android-version.js +75 -0
  100. package/src/api/bible.ts +35 -0
  101. package/src/api/highlights.ts +145 -0
  102. package/src/api/index.ts +13 -0
  103. package/src/api/languages.ts +14 -0
  104. package/src/api/users.ts +35 -0
  105. package/src/api/votd.ts +20 -0
  106. package/src/components/BibleReaderView.tsx +52 -0
  107. package/src/components/BibleTextView.tsx +63 -0
  108. package/src/components/BibleWidgetView.tsx +45 -0
  109. package/src/components/SignInWithYouVersionButton.tsx +70 -0
  110. package/src/components/VotdView.tsx +36 -0
  111. package/src/components/index.ts +5 -0
  112. package/src/index.ts +5 -0
  113. package/src/native.ts +58 -0
  114. package/src/platform.ts +30 -0
  115. package/src/types.ts +382 -0
  116. package/tsconfig.json +9 -0
@@ -0,0 +1,17 @@
1
+ {
2
+ "platforms": ["apple", "android"],
3
+ "features": ["swiftui"],
4
+ "apple": {
5
+ "modules": [
6
+ "RNYouVersionPlatformModule",
7
+ "RNSignInWithYouVersionButtonModule",
8
+ "RNBibleTextViewModule",
9
+ "RNVotdViewModule",
10
+ "RNBibleReaderViewModule",
11
+ "RNBibleWidgetViewModule"
12
+ ]
13
+ },
14
+ "android": {
15
+ "modules": ["com.youversion.reactnativesdk.RNYouVersionPlatformModule"]
16
+ }
17
+ }
@@ -0,0 +1,197 @@
1
+ import ExpoModulesCore
2
+ import YouVersionPlatform
3
+
4
+ struct YVPBibleAPI {
5
+ static func versions(languageTag: String?, promise: Promise) {
6
+ Task {
7
+ do {
8
+ let response = try await YouVersionAPI.Bible.versions(forLanguageTag: languageTag)
9
+ let records = response.map(BibleVersionRecord.init)
10
+
11
+ promise.resolve(records)
12
+ } catch {
13
+ promise.reject(error)
14
+ }
15
+ }
16
+ }
17
+
18
+ static func version(versionId: Int, promise: Promise) {
19
+ Task {
20
+ do {
21
+ let response = try await YouVersionAPI.Bible.version(versionId: versionId)
22
+ let record = BibleVersionRecord.init(bibleVersion: response)
23
+
24
+ promise.resolve(record)
25
+ } catch {
26
+ promise.reject(error)
27
+ }
28
+ }
29
+ }
30
+
31
+ static func chapter(bibleReference record: BibleReferenceRecord, promise: Promise) {
32
+ Task {
33
+ do {
34
+ let response = try await YouVersionAPI.Bible.chapter(reference: self.bibleReference(record))
35
+
36
+ promise.resolve(response)
37
+ } catch {
38
+ promise.reject(error)
39
+ }
40
+ }
41
+ }
42
+
43
+ static func bibleReference(_ record: BibleReferenceRecord) -> BibleReference {
44
+ if let start = record.verseStart, let end = record.verseEnd {
45
+ return BibleReference(
46
+ versionId: record.versionId,
47
+ bookUSFM: record.bookUSFM,
48
+ chapter: record.chapter,
49
+ verseStart: start,
50
+ verseEnd: end
51
+ )
52
+ }
53
+
54
+ return BibleReference(
55
+ versionId: record.versionId,
56
+ bookUSFM: record.bookUSFM,
57
+ chapter: record.chapter,
58
+ verse: record.verse
59
+ )
60
+ }
61
+ }
62
+
63
+ internal struct BibleVersionRecord: Record {
64
+ @Field
65
+ var id: Int
66
+
67
+ @Field
68
+ var abbreviation: String?
69
+
70
+ @Field
71
+ var copyrightLong: String?
72
+
73
+ @Field
74
+ var copyrightShort: String?
75
+
76
+ @Field
77
+ var languageTag: String?
78
+
79
+ @Field
80
+ var localizedAbbreviation: String?
81
+
82
+ @Field
83
+ var localizedTitle: String?
84
+
85
+ @Field
86
+ var readerFooter: String?
87
+
88
+ @Field
89
+ var readerFooterUrl: String?
90
+
91
+ @Field
92
+ var title: String?
93
+
94
+ @Field
95
+ var bookCodes: [String]?
96
+
97
+ @Field
98
+ var books: [BibleBookRecord]?
99
+
100
+ @Field
101
+ var textDirection: String?
102
+
103
+ init() { }
104
+
105
+ init(bibleVersion: BibleVersion) {
106
+ self.id = bibleVersion.id
107
+ self.abbreviation = bibleVersion.abbreviation
108
+ self.copyrightLong = bibleVersion.copyrightLong
109
+ self.copyrightShort = bibleVersion.copyrightShort
110
+ self.languageTag = bibleVersion.languageTag
111
+ self.localizedAbbreviation = bibleVersion.localizedAbbreviation
112
+ self.localizedTitle = bibleVersion.localizedTitle
113
+ self.readerFooter = bibleVersion.readerFooter
114
+ self.readerFooterUrl = bibleVersion.readerFooterUrl
115
+ self.title = bibleVersion.title
116
+ self.bookCodes = bibleVersion.bookCodes
117
+
118
+ if let bibleVersionBooks = bibleVersion.books {
119
+ self.books = bibleVersionBooks.map(BibleBookRecord.init)
120
+ }
121
+
122
+ self.textDirection = bibleVersion.textDirection
123
+ }
124
+ }
125
+
126
+ internal struct BibleBookRecord: Record {
127
+ @Field
128
+ var usfm: String?
129
+
130
+ @Field
131
+ var abbreviation: String?
132
+
133
+ @Field
134
+ var title: String?
135
+
136
+ @Field
137
+ var titleLong: String?
138
+
139
+ @Field
140
+ var chapters: [BibleChapterRecord]?
141
+
142
+ init() { }
143
+
144
+ init(bibleBook: BibleBook) {
145
+ self.usfm = bibleBook.usfm
146
+ self.abbreviation = bibleBook.abbreviation
147
+ self.title = bibleBook.title
148
+ self.titleLong = bibleBook.titleLong
149
+
150
+ if let bibleBookChapters = bibleBook.chapters {
151
+ self.chapters = bibleBookChapters.map(BibleChapterRecord.init)
152
+ }
153
+ }
154
+ }
155
+
156
+ internal struct BibleChapterRecord: Record {
157
+ @Field
158
+ var bookUSFM: String?
159
+
160
+ @Field
161
+ var isCanonical: Bool?
162
+
163
+ @Field
164
+ var passageId: String?
165
+
166
+ @Field
167
+ var title: String?
168
+
169
+ init() { }
170
+
171
+ init(bibleChapter: BibleChapter) {
172
+ self.bookUSFM = bibleChapter.bookUSFM
173
+ self.isCanonical = bibleChapter.isCanonical
174
+ self.passageId = bibleChapter.passageId
175
+ self.title = bibleChapter.title
176
+ }
177
+ }
178
+
179
+ internal struct BibleReferenceRecord: Record {
180
+ @Field
181
+ var versionId: Int
182
+
183
+ @Field
184
+ var bookUSFM: String
185
+
186
+ @Field
187
+ var chapter: Int
188
+
189
+ @Field
190
+ var verseStart: Int?
191
+
192
+ @Field
193
+ var verseEnd: Int?
194
+
195
+ @Field
196
+ var verse: Int?
197
+ }
@@ -0,0 +1,105 @@
1
+ import ExpoModulesCore
2
+ import YouVersionPlatform
3
+
4
+ struct YVPHighlightsAPI {
5
+
6
+ static func createHighlight(bibleId: Int, passageId: String, color: String, promise: Promise) {
7
+ Task {
8
+ do {
9
+ let response = try await YouVersionAPI.Highlights.createHighlight(
10
+ bibleId: bibleId,
11
+ passageId: passageId,
12
+ color: color
13
+ )
14
+
15
+ promise.resolve(response)
16
+ } catch {
17
+ promise.reject(error)
18
+ }
19
+ }
20
+ }
21
+
22
+ static func getHighlights(bibleId: Int, passageId: String, promise: Promise) {
23
+ Task {
24
+ do {
25
+ let response = try await YouVersionAPI.Highlights.getHighlights(
26
+ bibleId: bibleId,
27
+ passageId: passageId
28
+ )
29
+
30
+ let records = response.map(HighlightRecord.init)
31
+
32
+ promise.resolve(records)
33
+ } catch {
34
+ promise.reject(error)
35
+ }
36
+ }
37
+ }
38
+
39
+ static func updateHighlight(bibleId: Int, passageId: String, color: String, promise: Promise) {
40
+ Task {
41
+ do {
42
+ let response = try await YouVersionAPI.Highlights.updateHighlight(
43
+ bibleId: bibleId,
44
+ passageId: passageId,
45
+ color: color
46
+ )
47
+
48
+ promise.resolve(response)
49
+ } catch {
50
+ promise.reject(error)
51
+ }
52
+ }
53
+ }
54
+
55
+ static func deleteHighlight(bibleId: Int, passageId: String, promise: Promise) {
56
+ Task {
57
+ do {
58
+ let response = try await YouVersionAPI.Highlights.deleteHighlight(
59
+ bibleId: bibleId,
60
+ passageId: passageId
61
+ )
62
+
63
+ promise.resolve(response)
64
+ } catch {
65
+ promise.reject(error)
66
+ }
67
+ }
68
+ }
69
+ }
70
+
71
+
72
+ internal struct HighlightRecord: Record {
73
+ init() { }
74
+
75
+ @Field
76
+ var id: String?
77
+
78
+ @Field
79
+ var bibleId: Int
80
+
81
+ @Field
82
+ var passageId: String
83
+
84
+ @Field
85
+ var color: String
86
+
87
+ @Field
88
+ var userId: String?
89
+
90
+ @Field
91
+ var createTime: String?
92
+
93
+ @Field
94
+ var updateTime: String?
95
+
96
+ init(_ response: HighlightResponse) {
97
+ self.id = response.id
98
+ self.bibleId = response.bibleId
99
+ self.passageId = response.passageId
100
+ self.color = response.color
101
+ self.userId = response.userId
102
+ self.createTime = response.createTime
103
+ self.updateTime = response.updateTime
104
+ }
105
+ }
@@ -0,0 +1,70 @@
1
+ import ExpoModulesCore
2
+ import YouVersionPlatform
3
+
4
+ struct YVPLanguagesAPI {
5
+ static func languages(country: String?, promise: Promise) {
6
+ Task {
7
+ do {
8
+ let response = try await YouVersionAPI.Languages.languages(country: country)
9
+ let records = response.map(LanguageRecord.init)
10
+
11
+ promise.resolve(records)
12
+ } catch {
13
+ promise.reject(error)
14
+ }
15
+ }
16
+ }
17
+ }
18
+
19
+
20
+
21
+ internal struct LanguageRecord: Record {
22
+ init() { }
23
+
24
+ @Field
25
+ var id: String
26
+
27
+ @Field
28
+ var language: String
29
+
30
+ @Field
31
+ var script: String?
32
+
33
+ @Field
34
+ var scriptName: String?
35
+
36
+ @Field
37
+ var aliases: [String]
38
+
39
+ @Field
40
+ var displayNames: [String: String]
41
+
42
+ @Field
43
+ var scripts: [String]
44
+
45
+ @Field
46
+ var variants: [String]
47
+
48
+ @Field
49
+ var countries: [String]
50
+
51
+ @Field
52
+ var textDirection: String
53
+
54
+ @Field
55
+ var defaultBibleVersionId: Int?
56
+
57
+ init(_ response: LanguageOverview) {
58
+ self.id = response.id
59
+ self.language = response.language
60
+ self.script = response.script
61
+ self.scriptName = response.scriptName
62
+ self.aliases = response.aliases
63
+ self.displayNames = response.displayNames
64
+ self.scripts = response.scripts
65
+ self.variants = response.variants
66
+ self.countries = response.countries
67
+ self.textDirection = response.textDirection
68
+ self.defaultBibleVersionId = response.defaultBibleVersionId
69
+ }
70
+ }
@@ -0,0 +1,9 @@
1
+ import ExpoModulesCore
2
+
3
+ public class RNBibleReaderViewModule: Module {
4
+ public func definition() -> ModuleDefinition {
5
+ Name("BibleReaderView")
6
+
7
+ View(YVPBibleReaderView.self)
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import ExpoModulesCore
2
+
3
+ public class RNBibleTextViewModule: Module {
4
+ public func definition() -> ModuleDefinition {
5
+ Name("BibleTextView")
6
+
7
+ View(YVPBibleTextView.self)
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import ExpoModulesCore
2
+
3
+ public class RNBibleWidgetViewModule: Module {
4
+ public func definition() -> ModuleDefinition {
5
+ Name("BibleWidgetView")
6
+
7
+ View(YVPBibleWidgetView.self)
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import ExpoModulesCore
2
+
3
+ public class RNSignInWithYouVersionButtonModule: Module {
4
+ public func definition() -> ModuleDefinition {
5
+ Name("SignInWithYouVersionButton")
6
+
7
+ View(YVPSignInWithYouVersionButton.self)
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import ExpoModulesCore
2
+
3
+ public class RNVotdViewModule: Module {
4
+ public func definition() -> ModuleDefinition {
5
+ Name("VotdView")
6
+
7
+ View(YVPVotdView.self)
8
+ }
9
+ }
@@ -0,0 +1,79 @@
1
+ import ExpoModulesCore
2
+
3
+ public class RNYouVersionPlatformModule: Module {
4
+ public func definition() -> ModuleDefinition {
5
+ Name("RNYouVersionPlatform")
6
+
7
+ AsyncFunction("configure") { (appKey: String) async -> Void in
8
+ await YVPlatform.configure(appKey: appKey)
9
+ }
10
+
11
+ AsyncFunction("setApiHost") { (apiHost: String) async -> Void in
12
+ YVPlatform.setApiHost(apiHost: apiHost)
13
+ }
14
+
15
+ Function("getAccessToken") { () -> String? in
16
+ return YVPlatform.getAccessToken()
17
+ }
18
+
19
+ AsyncFunction("signIn") { (
20
+ permissions: [String],
21
+ promise: Promise
22
+ ) in
23
+ YVPAuthAPI.signIn(
24
+ permissions: permissions,
25
+ promise: promise
26
+ )
27
+ }
28
+
29
+ AsyncFunction("signOut") { () async -> Void in
30
+ await YVPAuthAPI.signOut()
31
+ }
32
+
33
+ AsyncFunction("userInfo") { (
34
+ accessToken: String?,
35
+ promise: Promise
36
+ ) in
37
+ YVPAuthAPI.userInfo(accessToken: accessToken, promise: promise)
38
+ }
39
+
40
+ AsyncFunction("verseOfTheDay") { (
41
+ dayOfYear: Int,
42
+ promise: Promise
43
+ ) in
44
+ YVPVotdAPI.verseOfTheDay(dayOfYear: dayOfYear, promise: promise)
45
+ }
46
+
47
+ AsyncFunction("createHighlight") { (bibleId: Int, passageId: String, color: String, promise: Promise) in
48
+ YVPHighlightsAPI.createHighlight(bibleId: bibleId, passageId: passageId, color: color, promise: promise)
49
+ }
50
+
51
+ AsyncFunction("getHighlights") { (bibleId: Int, passageId: String, promise: Promise) in
52
+ YVPHighlightsAPI.getHighlights(bibleId: bibleId, passageId: passageId, promise: promise)
53
+ }
54
+
55
+ AsyncFunction("updateHighlight") { (bibleId: Int, passageId: String, color: String, promise: Promise) in
56
+ YVPHighlightsAPI.updateHighlight(bibleId: bibleId, passageId: passageId, color: color, promise: promise)
57
+ }
58
+
59
+ AsyncFunction("deleteHighlight") { (bibleId: Int, passageId: String, promise: Promise) in
60
+ YVPHighlightsAPI.deleteHighlight(bibleId: bibleId, passageId: passageId, promise: promise)
61
+ }
62
+
63
+ AsyncFunction("languages") { (country: String?, promise: Promise) in
64
+ YVPLanguagesAPI.languages(country: country, promise: promise)
65
+ }
66
+
67
+ AsyncFunction("versions") { (languageTag: String?, promise: Promise) in
68
+ YVPBibleAPI.versions(languageTag: languageTag, promise: promise)
69
+ }
70
+
71
+ AsyncFunction("version") { (versionId: Int, promise: Promise) in
72
+ YVPBibleAPI.version(versionId: versionId, promise: promise)
73
+ }
74
+
75
+ AsyncFunction("chapter") { (bibleReference: BibleReferenceRecord, promise: Promise) in
76
+ YVPBibleAPI.chapter(bibleReference: bibleReference, promise: promise)
77
+ }
78
+ }
79
+ }
@@ -0,0 +1,57 @@
1
+
2
+ import ExpoModulesCore
3
+ import YouVersionPlatform
4
+ import SwiftUI
5
+
6
+ class BibleReaderViewProps: ExpoSwiftUI.ViewProps {
7
+ // Bible reference
8
+ @Field var versionId: Int
9
+ @Field var bookUSFM: String
10
+ @Field var chapter: Int
11
+ @Field var verse: Int?
12
+ @Field var verseStart: Int?
13
+ @Field var verseEnd: Int?
14
+
15
+ @Field var appName: String
16
+ @Field var signInMessage: String
17
+ @Field var hasReference: Bool
18
+ }
19
+
20
+ struct YVPBibleReaderView: ExpoSwiftUI.View, ExpoSwiftUI.WithHostingView {
21
+ @ObservedObject var props: BibleReaderViewProps
22
+
23
+ init(props: BibleReaderViewProps) {
24
+ self.props = props
25
+ }
26
+
27
+ var body: some View {
28
+ BibleReaderView(
29
+ reference: bibleReference(),
30
+ appName: props.appName,
31
+ signInMessage: props.signInMessage
32
+ )
33
+ }
34
+
35
+ func bibleReference() -> BibleReference? {
36
+ if let start = props.verseStart, let end = props.verseEnd {
37
+ return BibleReference(
38
+ versionId: props.versionId,
39
+ bookUSFM: props.bookUSFM,
40
+ chapter: props.chapter,
41
+ verseStart: start,
42
+ verseEnd: end
43
+ )
44
+ }
45
+
46
+ if props.hasReference {
47
+ return BibleReference(
48
+ versionId: props.versionId,
49
+ bookUSFM: props.bookUSFM,
50
+ chapter: props.chapter,
51
+ verse: props.verse
52
+ )
53
+ }
54
+
55
+ return nil
56
+ }
57
+ }
@@ -0,0 +1,114 @@
1
+
2
+ import ExpoModulesCore
3
+ import YouVersionPlatform
4
+ import SwiftUI
5
+
6
+ class BibleTextViewProps: ExpoSwiftUI.ViewProps {
7
+ // Styling
8
+ @Field var fontFamily: String?
9
+ @Field var fontSize: CGFloat?
10
+ @Field var lineSpacing: CGFloat?
11
+ @Field var paragraphSpacing: CGFloat?
12
+ @Field var textColor: UIColor?
13
+ @Field var wocColor: UIColor?
14
+ @Field var footnoteMode: String?
15
+ @Field var renderVerseNumbers: Bool? = true
16
+
17
+ // Bible reference
18
+ @Field var versionId: Int
19
+ @Field var bookUSFM: String
20
+ @Field var chapter: Int
21
+ @Field var verse: Int?
22
+ @Field var verseStart: Int?
23
+ @Field var verseEnd: Int?
24
+
25
+ var onTap = EventDispatcher()
26
+ }
27
+
28
+ struct YVPBibleTextView: ExpoSwiftUI.View, ExpoSwiftUI.WithHostingView {
29
+ @ObservedObject var props: BibleTextViewProps
30
+ @EnvironmentObject var shadowNodeProxy: ExpoSwiftUI.ShadowNodeProxy
31
+
32
+ init(props: BibleTextViewProps) {
33
+ self.props = props
34
+ }
35
+
36
+ var body: some View {
37
+ ExpoSwiftUI.AutoSizingStack(shadowNodeProxy: shadowNodeProxy, axis: .vertical) {
38
+ BibleTextView(
39
+ bibleReference(),
40
+ textOptions: textOptions(),
41
+ onVerseTap: { bibleRef, point in
42
+ props.onTap([
43
+ "bibleReference": toJsBibleReference(bibleRef),
44
+ "point": toJsPoint(point)
45
+ ])
46
+ }
47
+ )
48
+ }
49
+ }
50
+
51
+ func toJsBibleReference(_ bibleRef: BibleReference) -> [String: Any] {
52
+ [
53
+ "versionId": bibleRef.versionId,
54
+ "bookUSFM": bibleRef.bookUSFM,
55
+ "chapter": bibleRef.chapter,
56
+ "verse": bibleRef.verseStart,
57
+ "type": "verse"
58
+ ]
59
+ }
60
+
61
+ func toJsPoint(_ point: CGPoint) -> [String: CGFloat] {
62
+ ["x": point.x, "y": point.y]
63
+ }
64
+
65
+ func bibleReference() -> BibleReference {
66
+ if let start = props.verseStart, let end = props.verseEnd {
67
+ return BibleReference(
68
+ versionId: props.versionId,
69
+ bookUSFM: props.bookUSFM,
70
+ chapter: props.chapter,
71
+ verseStart: start,
72
+ verseEnd: end
73
+ )
74
+ }
75
+
76
+ return BibleReference(
77
+ versionId: props.versionId,
78
+ bookUSFM: props.bookUSFM,
79
+ chapter: props.chapter,
80
+ verse: props.verse
81
+ )
82
+ }
83
+
84
+ func textOptions() -> BibleTextOptions {
85
+ BibleTextOptions(
86
+ fontFamily: props.fontFamily ?? "Times New Roman",
87
+ fontSize: props.fontSize ?? 16,
88
+ lineSpacing: props.lineSpacing,
89
+ paragraphSpacing: props.paragraphSpacing,
90
+ textColor: textColor(),
91
+ wocColor: wocColor(),
92
+ renderVerseNumbers: props.renderVerseNumbers ?? true,
93
+ footnoteMode: footnoteMode()
94
+ )
95
+ }
96
+
97
+ func textColor() -> Color? {
98
+ props.textColor == nil ? nil : Color(uiColor: props.textColor!)
99
+ }
100
+
101
+ func wocColor() -> Color {
102
+ // If there's no wocColor provided, use the YouVersion red as default
103
+ props.wocColor == nil ? Color(red: 1, green: 0x3d / 255.0, blue: 0x4d / 255.0) : Color(uiColor: props.wocColor!)
104
+ }
105
+
106
+ func footnoteMode() -> BibleTextFootnoteMode {
107
+ switch(props.footnoteMode) {
108
+ case "none": .none
109
+ case "inline": .inline
110
+ case "marker": .marker
111
+ default: .none
112
+ }
113
+ }
114
+ }