├── local.properties ├── .gradle ├── 6.3 │ ├── gc.properties │ ├── fileChanges │ │ └── last-build.bin │ ├── fileHashes │ │ ├── fileHashes.bin │ │ └── fileHashes.lock │ └── executionHistory │ │ ├── executionHistory.bin │ │ └── executionHistory.lock ├── 6.5.1 │ ├── gc.properties │ ├── fileChanges │ │ └── last-build.bin │ ├── fileHashes │ │ ├── fileHashes.bin │ │ └── fileHashes.lock │ └── executionHistory │ │ ├── executionHistory.bin │ │ └── executionHistory.lock ├── vcs-1 │ └── gc.properties ├── buildOutputCleanup │ ├── cache.properties │ ├── outputFiles.bin │ └── buildOutputCleanup.lock └── checksums │ ├── checksums.lock │ ├── md5-checksums.bin │ ├── sha1-checksums.bin │ ├── sha256-checksums.bin │ └── sha512-checksums.bin ├── settings.gradle.kts ├── gradle.properties ├── .idea ├── .gitignore ├── vcs.xml ├── misc.xml ├── artifacts │ ├── ojaynico_kotlin_react_native_js_1_0.xml │ ├── ojaynico_kotlin_react_native_js_1_0_1.xml │ ├── ojaynico_kotlin_react_native_jvm_1_0.xml │ ├── ojaynico_kotlin_react_native_jvm_1_0_1.xml │ └── ojaynico_kotlin_react_native_1_0_1.xml ├── kotlinScripting.xml ├── compiler.xml ├── gradle.xml ├── modules │ ├── ojaynico-kotlin-react-native.nativeMain.iml │ ├── ojaynico-kotlin-react-native.nativeTest.iml │ ├── ojaynico-kotlin-react-native.main.iml │ ├── ojaynico-kotlin-react-native.test.iml │ ├── ojaynico-kotlin-react-native.commonMain.iml │ ├── ojaynico-kotlin-react-native.commonTest.iml │ ├── ojaynico-kotlin-react-native.jsTest.iml │ ├── ojaynico-kotlin-react-native.jvmMain.iml │ └── ojaynico-kotlin-react-native.jvmTest.iml └── jarRepositories.xml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── src └── main │ └── kotlin │ └── ojaynico │ └── kotlin │ └── react │ ├── NavigatorBuilder.kt │ ├── Extensions.kt │ ├── NativeBuilder.kt │ ├── navigator │ └── Navigator.kt │ ├── native │ ├── api │ │ └── Api.kt │ └── component │ │ └── Components.kt │ └── Style.kt ├── LICENSE ├── gradlew.bat ├── gradlew └── README.md /local.properties: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/6.3/gc.properties: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/6.5.1/gc.properties: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/vcs-1/gc.properties: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/6.3/fileChanges/last-build.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/6.5.1/fileChanges/last-build.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | 2 | rootProject.name = "ojaynico-kotlin-react-native" 3 | 4 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | kotlin.js.generate.executable.default=false 3 | -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/cache.properties: -------------------------------------------------------------------------------- 1 | #Tue Nov 17 13:34:25 EAT 2020 2 | gradle.version=6.7 3 | -------------------------------------------------------------------------------- /.gradle/checksums/checksums.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/checksums/checksums.lock -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | -------------------------------------------------------------------------------- /.gradle/checksums/md5-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/checksums/md5-checksums.bin -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /.gradle/6.3/fileHashes/fileHashes.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/6.3/fileHashes/fileHashes.bin -------------------------------------------------------------------------------- /.gradle/checksums/sha1-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/checksums/sha1-checksums.bin -------------------------------------------------------------------------------- /.gradle/6.3/fileHashes/fileHashes.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/6.3/fileHashes/fileHashes.lock -------------------------------------------------------------------------------- /.gradle/6.5.1/fileHashes/fileHashes.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/6.5.1/fileHashes/fileHashes.bin -------------------------------------------------------------------------------- /.gradle/6.5.1/fileHashes/fileHashes.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/6.5.1/fileHashes/fileHashes.lock -------------------------------------------------------------------------------- /.gradle/checksums/sha256-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/checksums/sha256-checksums.bin -------------------------------------------------------------------------------- /.gradle/checksums/sha512-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/checksums/sha512-checksums.bin -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/outputFiles.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/buildOutputCleanup/outputFiles.bin -------------------------------------------------------------------------------- /.gradle/6.3/executionHistory/executionHistory.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/6.3/executionHistory/executionHistory.bin -------------------------------------------------------------------------------- /.gradle/6.3/executionHistory/executionHistory.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/6.3/executionHistory/executionHistory.lock -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/buildOutputCleanup.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/buildOutputCleanup/buildOutputCleanup.lock -------------------------------------------------------------------------------- /.gradle/6.5.1/executionHistory/executionHistory.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/6.5.1/executionHistory/executionHistory.bin -------------------------------------------------------------------------------- /.gradle/6.5.1/executionHistory/executionHistory.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ojaynico/ojaynico-kotlin-react-native/HEAD/.gradle/6.5.1/executionHistory/executionHistory.lock -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /.idea/artifacts/ojaynico_kotlin_react_native_js_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | $PROJECT_DIR$/build/libs 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/artifacts/ojaynico_kotlin_react_native_js_1_0_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | $PROJECT_DIR$/build/libs 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/artifacts/ojaynico_kotlin_react_native_jvm_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | $PROJECT_DIR$/build/libs 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/artifacts/ojaynico_kotlin_react_native_jvm_1_0_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | $PROJECT_DIR$/build/libs 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/artifacts/ojaynico_kotlin_react_native_1_0_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | $PROJECT_DIR$/build/libs 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/kotlinScripting.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 2147483647 6 | true 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/main/kotlin/ojaynico/kotlin/react/NavigatorBuilder.kt: -------------------------------------------------------------------------------- 1 | package ojaynico.kotlin.react 2 | 3 | /* 4 | fun RBuilder.navigator(handler: RElementBuilder.() -> Unit) = child(Navigator::class) { 5 | handler() 6 | } 7 | 8 | fun RBuilder.route(handler: RElementBuilder.() -> Unit) = child(Route) { 9 | handler() 10 | } 11 | 12 | fun ChildrenBuilder.nico(handler: NavigatorProps) = child(Navigator::class) { 13 | handler 14 | }*/ 15 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/main/kotlin/ojaynico/kotlin/react/Extensions.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("unused") 2 | 3 | package ojaynico.kotlin.react 4 | 5 | import ojaynico.kotlin.react.native.api.AppRegistry 6 | import react.Component 7 | 8 | // Components 9 | 10 | inline fun > AppRegistry.registerComponent(name: String) { 11 | registerComponent(name) { T::class.js } 12 | } 13 | 14 | // JS 15 | 16 | inline fun json(init: dynamic.() -> Unit): dynamic { 17 | val o = json() 18 | init(o) 19 | return o 20 | } 21 | 22 | @Suppress("NOTHING_TO_INLINE") 23 | inline fun json(): dynamic = js("{}") 24 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Nicodemus Ojwee 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.idea/modules/ojaynico-kotlin-react-native.nativeMain.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ojaynico-kotlin-react-native:commonMain 7 | 8 | ojaynico-kotlin-react-native.commonMain 9 | 10 | COMPILATION_AND_SOURCE_SET_HOLDER 11 | 12 | 13 | 18 | 21 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /.idea/modules/ojaynico-kotlin-react-native.nativeTest.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ojaynico-kotlin-react-native:commonTest 7 | 8 | ojaynico-kotlin-react-native.nativeMain 9 | ojaynico-kotlin-react-native.commonMain 10 | ojaynico-kotlin-react-native.commonTest 11 | 12 | COMPILATION_AND_SOURCE_SET_HOLDER 13 | 14 | nativeTest|ojaynico-kotlin-react-native:nativeTest|native 15 | 16 | 17 | 18 | 23 | 26 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /.idea/modules/ojaynico-kotlin-react-native.main.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | COMPILATION_AND_SOURCE_SET_HOLDER 7 | 8 | 9 | 21 | 24 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /.idea/modules/ojaynico-kotlin-react-native.test.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | ojaynico-kotlin-react-native.main 8 | 9 | COMPILATION_AND_SOURCE_SET_HOLDER 10 | 11 | nodeTest|ojaynico-kotlin-react-native:test|js 12 | 13 | 14 | 15 | 27 | 30 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | 39 | 40 | 44 | 45 | 49 | 50 | -------------------------------------------------------------------------------- /.idea/modules/ojaynico-kotlin-react-native.commonMain.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | SOURCE_SET_HOLDER 7 | 8 | 9 | 14 | 25 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /.idea/modules/ojaynico-kotlin-react-native.commonTest.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | SOURCE_SET_HOLDER 7 | 8 | jsNodeTest|ojaynico-kotlin-react-native:jsTest|js 9 | jsBrowserTest|ojaynico-kotlin-react-native:jsTest|js 10 | jvmTest|ojaynico-kotlin-react-native:jvmTest|jvm 11 | nativeTest|ojaynico-kotlin-react-native:nativeTest|native 12 | 13 | 14 | 15 | 20 | 31 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto init 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto init 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :init 68 | @rem Get command-line arguments, handling Windows variants 69 | 70 | if not "%OS%" == "Windows_NT" goto win9xME_args 71 | 72 | :win9xME_args 73 | @rem Slurp the command line arguments. 74 | set CMD_LINE_ARGS= 75 | set _SKIP=2 76 | 77 | :win9xME_args_slurp 78 | if "x%~1" == "x" goto execute 79 | 80 | set CMD_LINE_ARGS=%* 81 | 82 | :execute 83 | @rem Setup the command line 84 | 85 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 86 | 87 | @rem Execute Gradle 88 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 89 | 90 | :end 91 | @rem End local scope for the variables with windows NT shell 92 | if "%ERRORLEVEL%"=="0" goto mainEnd 93 | 94 | :fail 95 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 96 | rem the _cmd.exe /c_ return code! 97 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 98 | exit /b 1 99 | 100 | :mainEnd 101 | if "%OS%"=="Windows_NT" endlocal 102 | 103 | :omega 104 | -------------------------------------------------------------------------------- /.idea/modules/ojaynico-kotlin-react-native.jsTest.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ojaynico-kotlin-react-native:commonTest 7 | 8 | ojaynico-kotlin-react-native.jsMain 9 | ojaynico-kotlin-react-native.commonMain 10 | ojaynico-kotlin-react-native.commonTest 11 | 12 | COMPILATION_AND_SOURCE_SET_HOLDER 13 | 14 | jsNodeTest|ojaynico-kotlin-react-native:jsTest|js 15 | jsBrowserTest|ojaynico-kotlin-react-native:jsTest|js 16 | 17 | 18 | 19 | 31 | 42 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /.idea/modules/ojaynico-kotlin-react-native.jvmMain.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ojaynico-kotlin-react-native:commonMain 7 | 8 | ojaynico-kotlin-react-native.commonMain 9 | 10 | COMPILATION_AND_SOURCE_SET_HOLDER 11 | 12 | 14 | 15 | 26 | 37 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/main/kotlin/ojaynico/kotlin/react/NativeBuilder.kt: -------------------------------------------------------------------------------- 1 | package ojaynico.kotlin.react 2 | 3 | import ojaynico.kotlin.react.native.* 4 | import react.ReactNode 5 | 6 | /*fun RBuilder.view(handler: RElementBuilder.() -> Unit) = child(View::class) { 7 | handler() 8 | } 9 | 10 | fun RBuilder.animatedView(handler: RElementBuilder.() -> Unit) = child(Animated.View::class) { 11 | handler() 12 | } 13 | 14 | fun RBuilder.text(text: String, handler: RElementBuilder.() -> Unit) = child(Text::class) { 15 | this.childList.add(ReactNode(text)) 16 | handler() 17 | } 18 | 19 | fun RBuilder.animatedText(text: String, handler: RElementBuilder.() -> Unit) = child(Animated.Text::class) { 20 | this.childList.add(ReactNode(text)) 21 | handler() 22 | } 23 | 24 | fun RBuilder.button(handler: ButtonProps.() -> Unit) = child(Button::class) { 25 | attrs(handler) 26 | } 27 | 28 | fun RBuilder.image(handler: ImageProps.() -> Unit) = child(Image::class) { 29 | attrs(handler) 30 | } 31 | 32 | fun RBuilder.animatedImage(handler: ImageProps.() -> Unit) = child(Animated.Image::class) { 33 | attrs(handler) 34 | } 35 | 36 | fun RBuilder.imageBackground(handler: RElementBuilder.() -> Unit) = child(ImageBackground::class) { 37 | handler() 38 | } 39 | 40 | fun RBuilder.textInput(handler: TextInputProps.() -> Unit) = child(TextInput::class) { 41 | attrs(handler) 42 | } 43 | 44 | fun RBuilder.switch(handler: SwitchProps.() -> Unit) = child(Switch::class) { 45 | attrs(handler) 46 | } 47 | 48 | fun RBuilder.flatList(handler: FlatListProps.() -> Unit) = child(FlatList::class) { 49 | attrs(handler) 50 | } 51 | 52 | fun RBuilder.animatedFlatList(handler: FlatListProps.() -> Unit) = child(Animated.FlatList::class) { 53 | attrs(handler) 54 | } 55 | 56 | fun RBuilder.sectionList(handler: SectionListProps.() -> Unit) = child(SectionList::class) { 57 | attrs(handler) 58 | } 59 | 60 | fun RBuilder.animatedSectionList(handler: SectionListProps.() -> Unit) = child(Animated.SectionList::class) { 61 | attrs(handler) 62 | } 63 | 64 | fun RBuilder.scrollView(handler: RElementBuilder.() -> Unit) = child(ScrollView::class) { 65 | handler() 66 | } 67 | 68 | fun RBuilder.animatedScrollView(handler: RElementBuilder.() -> Unit) = child(Animated.ScrollView::class) { 69 | handler() 70 | } 71 | 72 | fun RBuilder.safeAreaView(handler: RElementBuilder.() -> Unit) = child(SafeAreaView::class) { 73 | handler() 74 | } 75 | 76 | fun RBuilder.activityIndicator(handler: ActivityIndicatorProps.() -> Unit) = child(ActivityIndicator::class) { 77 | attrs(handler) 78 | } 79 | 80 | fun RBuilder.keyboardAvoidingView(handler: KeyboardAvoidingViewProps.() -> Unit) = child(KeyboardAvoidingView::class) { 81 | attrs(handler) 82 | } 83 | 84 | fun RBuilder.modal(handler: ModalProps.() -> Unit) = child(Modal::class) { 85 | attrs(handler) 86 | } 87 | 88 | fun RBuilder.pressable(handler: RElementBuilder.() -> Unit) = child(Pressable::class) { 89 | handler() 90 | } 91 | 92 | fun RBuilder.refreshControl(handler: RefreshControlProps.() -> Unit) = child(RefreshControl::class) { 93 | attrs(handler) 94 | } 95 | 96 | fun RBuilder.statusBar(handler: StatusBarProps.() -> Unit) = child(StatusBar::class) { 97 | attrs(handler) 98 | } 99 | 100 | fun RBuilder.touchableHighlight(handler: TouchableHighlightProps.() -> Unit) = child(TouchableHighlight::class) { 101 | attrs(handler) 102 | } 103 | 104 | fun RBuilder.touchableOpacity(handler: RElementBuilder.() -> Unit) = child(TouchableOpacity::class) { 105 | handler() 106 | } 107 | 108 | fun RBuilder.touchableWithoutFeedback(handler: TouchableWithoutFeedbackProps.() -> Unit) = child(TouchableWithoutFeedback::class) { 109 | attrs(handler) 110 | } 111 | 112 | fun RBuilder.virtualizedList(handler: VirtualizedListProps.() -> Unit) = child(VirtualizedList::class) { 113 | attrs(handler) 114 | } 115 | 116 | fun RBuilder.drawerLayoutAndroid(handler: DrawerLayoutAndroidProps.() -> Unit) = child(DrawerLayoutAndroid::class) { 117 | attrs(handler) 118 | } 119 | 120 | fun RBuilder.touchableNativeFeedback(handler: TouchableNativeFeedbackProps.() -> Unit) = child(TouchableNativeFeedback::class) { 121 | attrs(handler) 122 | } 123 | 124 | fun RBuilder.inputAccessoryView(handler: InputAccessoryViewProps.() -> Unit) = child(InputAccessoryView::class) { 125 | attrs(handler) 126 | }*/ 127 | 128 | typealias ComponentProvider = () -> dynamic 129 | -------------------------------------------------------------------------------- /.idea/modules/ojaynico-kotlin-react-native.jvmTest.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ojaynico-kotlin-react-native:commonTest 7 | 8 | ojaynico-kotlin-react-native.jvmMain 9 | ojaynico-kotlin-react-native.commonMain 10 | ojaynico-kotlin-react-native.commonTest 11 | 12 | COMPILATION_AND_SOURCE_SET_HOLDER 13 | 14 | jvmTest|ojaynico-kotlin-react-native:jvmTest|jvm 15 | 16 | 17 | 19 | 20 | 33 | 38 | 49 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | # Determine the Java command to use to start the JVM. 86 | if [ -n "$JAVA_HOME" ] ; then 87 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 88 | # IBM's JDK on AIX uses strange locations for the executables 89 | JAVACMD="$JAVA_HOME/jre/sh/java" 90 | else 91 | JAVACMD="$JAVA_HOME/bin/java" 92 | fi 93 | if [ ! -x "$JAVACMD" ] ; then 94 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 95 | 96 | Please set the JAVA_HOME variable in your environment to match the 97 | location of your Java installation." 98 | fi 99 | else 100 | JAVACMD="java" 101 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 102 | 103 | Please set the JAVA_HOME variable in your environment to match the 104 | location of your Java installation." 105 | fi 106 | 107 | # Increase the maximum file descriptors if we can. 108 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 109 | MAX_FD_LIMIT=`ulimit -H -n` 110 | if [ $? -eq 0 ] ; then 111 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 112 | MAX_FD="$MAX_FD_LIMIT" 113 | fi 114 | ulimit -n $MAX_FD 115 | if [ $? -ne 0 ] ; then 116 | warn "Could not set maximum file descriptor limit: $MAX_FD" 117 | fi 118 | else 119 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 120 | fi 121 | fi 122 | 123 | # For Darwin, add options to specify how the application appears in the dock 124 | if $darwin; then 125 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 126 | fi 127 | 128 | # For Cygwin or MSYS, switch paths to Windows format before running java 129 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 130 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 131 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 132 | JAVACMD=`cygpath --unix "$JAVACMD"` 133 | 134 | # We build the pattern for arguments to be converted via cygpath 135 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 136 | SEP="" 137 | for dir in $ROOTDIRSRAW ; do 138 | ROOTDIRS="$ROOTDIRS$SEP$dir" 139 | SEP="|" 140 | done 141 | OURCYGPATTERN="(^($ROOTDIRS))" 142 | # Add a user-defined pattern to the cygpath arguments 143 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 144 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 145 | fi 146 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 147 | i=0 148 | for arg in "$@" ; do 149 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 150 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 151 | 152 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 153 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 154 | else 155 | eval `echo args$i`="\"$arg\"" 156 | fi 157 | i=`expr $i + 1` 158 | done 159 | case $i in 160 | 0) set -- ;; 161 | 1) set -- "$args0" ;; 162 | 2) set -- "$args0" "$args1" ;; 163 | 3) set -- "$args0" "$args1" "$args2" ;; 164 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 165 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 166 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 167 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 168 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 169 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 170 | esac 171 | fi 172 | 173 | # Escape application args 174 | save () { 175 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 176 | echo " " 177 | } 178 | APP_ARGS=`save "$@"` 179 | 180 | # Collect all arguments for the java command, following the shell quoting and substitution rules 181 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 182 | 183 | exec "$JAVACMD" "$@" 184 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ojaynico-kotlin-react-native 2 | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.ojaynico/ojaynico-kotlin-react-native/badge.svg)](https://search.maven.org/artifact/com.github.ojaynico/ojaynico-kotlin-react-native/1.2.0/pom) 3 | [![Kotlin](https://img.shields.io/badge/kotlin-1.7.10-blue.svg?logo=kotlin)](http://kotlinlang.org) 4 | [![npm version](https://img.shields.io/npm/v/react.svg?style=flat)](https://www.npmjs.com/package/react) 5 | [![npm version](https://img.shields.io/npm/v/react-native?color=brightgreen&label=npm%20package)](https://www.npmjs.com/package/react-native) 6 | [![Kotlin JS IR supported](https://img.shields.io/badge/Kotlin%2FJS-IR%20supported-yellow)](https://kotl.in/jsirsupported) 7 | 8 | Kotlin Wrappers for React Native Components and APIs 9 | 10 | Available components: All react native components are available in this wrapper. Check them out using the URL below: 11 | 12 | https://reactnative.dev/docs/components-and-apis 13 | 14 | Available APIs: All react native APIs are available in this wrapper. Check them out using the URL below: 15 | 16 | https://reactnative.dev/docs/accessibilityinfo 17 | 18 | ## `How to use the wrapper?` 19 | 20 | Use the cli tool below to generate a new Kotlin React Native application. 21 | 22 | https://github.com/ojaynico/create-ojaynico-krn 23 | 24 | Proceed to the next step after generating the project. 25 | 26 | In your react native application shared module (a kotlin gradle project), update your gradle file to include the following in the respective blocks. 27 | 28 | ```kotlin 29 | repositories { 30 | mavenCentral() 31 | jcenter() 32 | } 33 | 34 | dependencies { 35 | implementation("com.github.ojaynico:ojaynico-kotlin-react-native:1.2.0") 36 | } 37 | ``` 38 | 39 | ### `Example of a react native app using the above wrapper` 40 | 41 | ```kotlin 42 | import ojaynico.kotlin.react.native.api.AppRegistry 43 | import ojaynico.kotlin.react.native.api.Platform 44 | import ojaynico.kotlin.react.native.component.ScrollView 45 | import ojaynico.kotlin.react.native.component.StyleSheet 46 | import ojaynico.kotlin.react.native.component.Text 47 | import ojaynico.kotlin.react.native.component.View 48 | import react.FC 49 | import react.Props 50 | 51 | val styles = StyleSheet.create(object { 52 | val body = object { 53 | val backgroundColor = "#FFF" 54 | } 55 | val text = object { 56 | val fontSize = 24 57 | val fontWeight = "600" 58 | val color = "#000" 59 | } 60 | }) 61 | 62 | val App = FC { 63 | ScrollView { 64 | contentInsetAdjustmentBehavior = "automatic" 65 | 66 | View { 67 | style = styles.body 68 | 69 | Text { 70 | style = styles.text 71 | +"Welcome to Kotlin React Native" 72 | } 73 | } 74 | } 75 | } 76 | 77 | fun main() { 78 | // For class components 79 | //AppRegistry.registerComponent("MyApp") { App::class.js } 80 | // For functional components (Assume App is the functional component) 81 | AppRegistry.registerComponent("MyApp") { App } 82 | 83 | // Code below will work if you have added react native web dependency to your project. 84 | // Visit how to set up react native web in your project for a detailed instruction. 85 | // An example project using react native web is in the link at the end of this document. 86 | if (Platform.OS == "web") { 87 | AppRegistry.runApplication("MyApp", json { 88 | rootTag = document.getElementById("root") 89 | }) 90 | } 91 | } 92 | ``` 93 | 94 | ## `NOTE: STILL UNDER DEVELOPMENT. USE ALTERNATIVE NAVIGATION` 95 | ### `Example using Navigation` 96 | 97 | ```kotlin 98 | import ojaynico.kotlin.react.* 99 | import ojaynico.kotlin.react.native.AppRegistry 100 | import ojaynico.kotlin.react.native.Platform 101 | import kotlinx.browser.document 102 | import react.* 103 | 104 | val Menu = functionComponent { props -> 105 | view { 106 | this.attrs.style = json { 107 | flex = 1 108 | backgroundColor = "white" 109 | marginRight = "90%" 110 | } 111 | 112 | button { 113 | title = "Screen Two" 114 | onPress = { 115 | // props being passed through a json object 116 | // NOTE: An interface with the props below have to be defined and used by ScreenTwo component 117 | props.navigator.push("ScreenTwo", json { 118 | name = "Nicodemus Ojwee" 119 | age = 25 120 | school = "Namilyango College" 121 | }) 122 | } 123 | } 124 | button { 125 | title = "Screen Three" 126 | onPress = { 127 | props.navigator.push("ScreenThree", json { }) 128 | } 129 | } 130 | 131 | } 132 | } 133 | 134 | val App = functionComponent { 135 | navigator { 136 | this.attrs { 137 | // Side Menu (from above) is passed as functional component prop 138 | // Using asDynamic() for now till the next update 139 | asDynamic().sideMenu = Menu 140 | asDynamic().menuPosition = "left" 141 | } 142 | route { 143 | this.attrs { 144 | name = "ScreenOne" 145 | component = ScreenOne 146 | } 147 | } 148 | // pathVariables has to be defined as below if you plan to pass props in react native web 149 | // pathVariables names are supposed to be similar and in the order in which you have defined your props interface in ScreenTwoProps 150 | route { 151 | this.attrs { 152 | name = "ScreenTwo" 153 | component = ScreenTwo 154 | pathVariables = "name/age/school" 155 | } 156 | } 157 | route { 158 | this.attrs { 159 | name = "ScreenThree" 160 | component = ScreenThree 161 | } 162 | } 163 | } 164 | } 165 | 166 | val ScreenOne = functionComponent { props -> 167 | view { 168 | this.attrs.style = json { 169 | backgroundColor = "#59C9A5" 170 | flex = 1 171 | } 172 | 173 | button { 174 | title = "Menu" 175 | onPress = { 176 | props.navigator.showMenu() 177 | } 178 | } 179 | 180 | button { 181 | title = "Screen Two" 182 | onPress = { 183 | // props being passed through a json object 184 | // NOTE: An interface with the props below have to be defined and used by ScreenTwo component 185 | props.navigator.push("ScreenTwo", json { 186 | name = "Nicodemus Ojwee" 187 | age = 25 188 | school = "Namilyango College" 189 | }) 190 | } 191 | } 192 | 193 | button { 194 | title = "Pop" 195 | onPress = { 196 | props.navigator.pop() 197 | } 198 | } 199 | } 200 | } 201 | 202 | // If using web, the props defined in the interface below have to be defined as pathVariables 203 | // in the route {} function above in App component and they have to follow the order. 204 | external interface ScreenTwoProps : NavigationProps { 205 | var name: String 206 | var age: Int 207 | var school: String 208 | } 209 | 210 | val ScreenTwo = functionComponent { props -> 211 | view { 212 | this.attrs.style = json { 213 | backgroundColor = "#23395B" 214 | flex = 1 215 | alignItems = "center" 216 | justifyContent = "center" 217 | } 218 | 219 | button { 220 | title = "Screen Three" 221 | onPress = { 222 | props.navigator.push("ScreenThree", json { }) 223 | } 224 | } 225 | 226 | button { 227 | title = "Pop" 228 | onPress = { 229 | props.navigator.pop() 230 | } 231 | } 232 | 233 | text("Name is " + props.name) { 234 | this.attrs { 235 | style = json { 236 | color = "white" 237 | } 238 | } 239 | } 240 | 241 | text("Age is " + props.age) { 242 | this.attrs { 243 | style = json { 244 | color = "white" 245 | } 246 | } 247 | } 248 | 249 | text("School is " + props.school) { 250 | this.attrs { 251 | style = json { 252 | color = "white" 253 | } 254 | } 255 | } 256 | } 257 | } 258 | 259 | val ScreenThree = functionComponent { props -> 260 | view { 261 | this.attrs.style = json { 262 | backgroundColor = "#B9E3C6" 263 | flex = 1 264 | alignItems = "center" 265 | justifyContent = "center" 266 | } 267 | 268 | button { 269 | title = "Pop" 270 | onPress = { 271 | props.navigator.pop() 272 | } 273 | } 274 | } 275 | } 276 | 277 | fun main() { 278 | AppRegistry.registerComponent("MyApp") { App } 279 | 280 | // Code below will work if you have added react native web dependency to your project. 281 | // Visit how to set up react native web in your project for a detailed instruction. 282 | // An example project using react native web is in the link at the end of this document. 283 | if (Platform.OS == "web") { 284 | AppRegistry.runApplication("MyApp", json { 285 | rootTag = document.getElementById("root") 286 | }) 287 | } 288 | } 289 | 290 | ``` 291 | 292 | **NOTE:** In the main function, MyApp should be the same as the name of the app directory 293 | 294 | **A fully set up and working example can be found in the repository below.** 295 | 296 | https://github.com/ojaynico/KotlinReactNativeApp 297 | 298 | [!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/ojaynico) 299 | -------------------------------------------------------------------------------- /src/main/kotlin/ojaynico/kotlin/react/navigator/Navigator.kt: -------------------------------------------------------------------------------- 1 | package ojaynico.kotlin.react.navigator 2 | 3 | import csstype.HtmlAttributes 4 | import kotlinext.js.getOwnPropertyNames 5 | import kotlinx.browser.window 6 | import ojaynico.kotlin.react.json 7 | import ojaynico.kotlin.react.native.* 8 | import ojaynico.kotlin.react.native.api.* 9 | import ojaynico.kotlin.react.native.component.StyleSheet 10 | import ojaynico.kotlin.react.native.component.View 11 | import react.* 12 | import kotlin.js.Json 13 | 14 | external interface RouteProps : Props { 15 | var name: String 16 | var component: dynamic 17 | var pathVariables: String 18 | } 19 | 20 | val Route = FC { } 21 | 22 | fun buildSceneConfig(children: Array, sideMenu: FC<*>): Json { 23 | val config = json { } 24 | 25 | children.forEach { child -> 26 | config[child.asDynamic().props.name] = json { 27 | key = child.asDynamic().props.name 28 | component = child.asDynamic().props.component 29 | pathVariables = child.asDynamic().props.pathVariables 30 | } 31 | } 32 | 33 | 34 | if (sideMenu != undefined) { 35 | config["krnMenu"] = json { 36 | key = "krnMenu" 37 | component = sideMenu 38 | } 39 | } 40 | 41 | return config.unsafeCast() 42 | } 43 | 44 | external interface NavigatorFunctions { 45 | var pop: () -> Unit 46 | val push: (routeName: String, props: dynamic) -> Unit 47 | var showMenu: () -> Unit 48 | } 49 | 50 | external interface NavigationProps : Props { 51 | var navigator: NavigatorFunctions 52 | } 53 | 54 | val screenWidth = Dimensions.get("window").width 55 | 56 | /*external interface NavigatorState : State { 57 | var initialSceneName: String 58 | var stack: List 59 | var sceneConfig: Json 60 | var showSideMenu: Boolean 61 | var touchX: dynamic 62 | var browserHistory: List 63 | }*/ 64 | 65 | external interface NavigatorProps : Props { 66 | var sideMenu: FC<*> 67 | var menuPosition: String 68 | var disableMenuGesture: Boolean 69 | } 70 | 71 | fun getSceneNameFromUrl(): String { 72 | val href = window.location.href 73 | return href.substringAfter("/#/").substringBefore("/") 74 | } 75 | 76 | val Navigator = FC { props -> 77 | 78 | var initialSceneName: String by useState("") 79 | var stack: List by useState>(emptyList()) 80 | var sceneConfig: Json by useState(json { }) 81 | var showSideMenu: Boolean by useState(false) 82 | var touchX: dynamic by useState("") 83 | var browserHistory: List by useState>(emptyList()) 84 | var firstTimeRender = useRef(true) 85 | 86 | val onBrowserHashChange = { 87 | window.location.reload() 88 | 89 | /*setState { 90 | val sceneName: String = getSceneNameFromUrl().ifEmpty { props.asDynamic().children[0].props.name as String } 91 | 92 | val pathVariables = sceneConfig[sceneName].unsafeCast()["pathVariables"] 93 | 94 | if (state.browserHistory.last() == sceneName) { 95 | handlePop() 96 | } else { 97 | handlePush(sceneName, getSceneProps(sceneName, 98 | pathVariables as String 99 | )) 100 | } 101 | }*/ 102 | } 103 | 104 | val _animatedValue = Animated.Value(0) 105 | 106 | val handlePop = { 107 | Animated.asDynamic().timing(_animatedValue, json { 108 | toValue = if (state.showSideMenu && props.menuPosition == "left") -screenWidth else screenWidth 109 | duration = 250 110 | useNativeDriver = true 111 | }).start { 112 | 113 | if (showSideMenu) { 114 | if (props.menuPosition == "left") { 115 | _animatedValue.setValue(screenWidth) 116 | } else { 117 | _animatedValue.setValue(-screenWidth) 118 | } 119 | 120 | showSideMenu = false 121 | } else { 122 | _animatedValue.setValue(0) 123 | } 124 | 125 | if (stack.size > 1) { 126 | stack = stack.slice(0 until stack.size - 1) 127 | 128 | if (Platform.OS == "web") { 129 | browserHistory = browserHistory.slice(0 until browserHistory.size - 1) 130 | } 131 | 132 | if (Platform.OS == "web") { 133 | window.history.back() 134 | } 135 | } 136 | } 137 | } 138 | 139 | val backAction = { 140 | if (stack.size == 1 && !showSideMenu) { 141 | BackHandler.exitApp() 142 | } else { 143 | handlePop() 144 | } 145 | 146 | true 147 | } 148 | 149 | val getSceneProps: dynamic = { sceneName: String, pathVariables: String -> 150 | val path = if (sceneName.isEmpty()) window.location.protocol + "://" + window.location.host + "/#/" 151 | else 152 | window.location.protocol + "://" + window.location.host + "/#/" + sceneName + "/" 153 | 154 | val filterParam = window.location.href.substring(path.length - 1) 155 | val values = filterParam.split("/") 156 | val variables = pathVariables.split("/") 157 | val urlProps = json { } 158 | 159 | variables.forEachIndexed { index, s -> 160 | urlProps[s] = values[index] 161 | } 162 | 163 | urlProps 164 | } 165 | 166 | useEffect(dependencies = emptyArray()) { 167 | 168 | firstTimeRender.current = false 169 | 170 | if (Platform.OS == "web" && !window.location.href.contains("/#/")) { 171 | window.history.pushState("", "", "/#/") 172 | } 173 | 174 | initialSceneName = if (Platform.OS == "web" && getSceneNameFromUrl().isNotEmpty()) getSceneNameFromUrl() else props.asDynamic().children[0].props.name 175 | sceneConfig = buildSceneConfig(props.asDynamic().children, props.sideMenu) 176 | 177 | if (Platform.OS == "web") { 178 | browserHistory = listOf(initialSceneName) 179 | val pathVariables = sceneConfig[initialSceneName].unsafeCast()["pathVariables"] 180 | 181 | if (pathVariables != undefined) { 182 | sceneConfig[initialSceneName].unsafeCast()["props"] = getSceneProps(initialSceneName, 183 | pathVariables as String 184 | ) 185 | } 186 | } 187 | 188 | stack = listOf(sceneConfig[initialSceneName].unsafeCast()) 189 | showSideMenu = false 190 | 191 | if (Platform.OS == "web") { 192 | window.onhashchange = { hashChangeEvent -> 193 | onBrowserHashChange() 194 | } 195 | } 196 | 197 | BackHandler.addEventListener( 198 | "hardwareBackPress", 199 | backAction() 200 | ) 201 | } 202 | 203 | useEffect(dependencies = emptyArray()) { 204 | return@useEffect BackHandler.removeEventListener( 205 | "hardwareBackPress", 206 | backAction() 207 | ) 208 | } 209 | 210 | val onSwipeLeft = { 211 | if (showSideMenu) { 212 | handlePop() 213 | 214 | showSideMenu = !showSideMenu 215 | } 216 | } 217 | 218 | val onSwipeRight = { 219 | if (showSideMenu) { 220 | handlePop() 221 | 222 | showSideMenu = !showSideMenu 223 | } 224 | } 225 | 226 | val changeUrl = { urlata: String, sceneName: String -> 227 | if (sceneName != "krnMenu") { 228 | if (Platform.OS == "web") { 229 | if (initialSceneName == sceneName) { 230 | if (urlata.isNotEmpty()) 231 | window.history.pushState("", "", "/#${HtmlAttributes.data}") 232 | else 233 | window.history.pushState("", "", "/#/") 234 | } else { 235 | if (urlata.isNotEmpty()) 236 | window.history.pushState("", "", "/#/$sceneName${HtmlAttributes.data}") 237 | else 238 | window.history.pushState("", "", "/#/$sceneName") 239 | } 240 | } 241 | } 242 | /*val path = if (state.initialSceneName == sceneName) window.location.protocol + "://" + window.location.host + "/#/" 243 | else 244 | window.location.protocol + "://" + window.location.host + "/#/" + sceneName + "/" 245 | 246 | val filterParam = window.location.href.substring(path.length - 1) 247 | return filterParam.split("/")*/ 248 | } 249 | 250 | useEffect(dependencies = arrayOf(stack)) { 251 | if (!firstTimeRender.current!!) { 252 | if (stack.last()["key"].toString() == "krnMenu") { 253 | if (props.menuPosition == "left") { 254 | _animatedValue.setValue(-screenWidth) 255 | } else { 256 | _animatedValue.setValue(screenWidth) 257 | } 258 | } else { 259 | _animatedValue.setValue(screenWidth) 260 | } 261 | 262 | Animated.asDynamic().timing(_animatedValue, json { 263 | toValue = 0 264 | duration = 250 265 | useNativeDriver = true 266 | }).start() 267 | } 268 | } 269 | 270 | val handlePush = { sceneName: String, childProps: dynamic -> 271 | showSideMenu = sceneName == "krnMenu" 272 | 273 | if (childProps != undefined && childProps != "") { 274 | var propsParams = "" 275 | val props_tmp = childProps.unsafeCast() 276 | val childPropsNames = props_tmp.getOwnPropertyNames() 277 | 278 | for (propName in childPropsNames) { 279 | propsParams += "/" + childProps[propName] 280 | } 281 | 282 | changeUrl(propsParams, sceneName) 283 | } 284 | 285 | sceneConfig[sceneName].unsafeCast()["props"] = childProps 286 | 287 | if (Platform.OS == "web") { 288 | browserHistory = browserHistory + listOf(sceneName) 289 | } 290 | 291 | stack = if (stack.last()["key"].toString() == "krnMenu") { 292 | stack.slice(0 until stack.size - 1) + listOf(sceneConfig[sceneName].unsafeCast()) 293 | } else { 294 | stack + listOf( 295 | sceneConfig[sceneName].unsafeCast() 296 | ) 297 | } 298 | } 299 | 300 | 301 | 302 | val handleShowMenu = { 303 | handlePush("krnMenu") {} 304 | } 305 | 306 | View { 307 | style = json { 308 | asDynamic().flex = 1 309 | flexDirection = "row" 310 | } 311 | asDynamic().onTouchStart = { e: dynamic -> 312 | if (props.disableMenuGesture == undefined || !props.disableMenuGesture) { 313 | val pageX = e.nativeEvent.pageX 314 | touchX = pageX 315 | } 316 | } 317 | asDynamic().onTouchEnd = { e: dynamic -> 318 | if (props.disableMenuGesture == undefined || !props.disableMenuGesture) { 319 | val positionX = e.nativeEvent.pageX 320 | val range = screenWidth / 6 321 | 322 | if (positionX - touchX > range) { 323 | onSwipeRight() 324 | } else if (touchX - positionX > range) { 325 | onSwipeLeft() 326 | } 327 | } 328 | } 329 | 330 | if (!stack.isNullOrEmpty()) { 331 | stack.forEachIndexed { index, json -> 332 | val sceneStyles = StyleSheet.compose( 333 | json { 334 | asDynamic().flex = 1 335 | }, 336 | StyleSheet.asDynamic().absoluteFillObject 337 | ) 338 | 339 | if (index == stack.size - 1 && index > 0) { 340 | sceneStyles.push(json { 341 | transform = arrayOf( 342 | json { 343 | translateX = _animatedValue 344 | } 345 | ) 346 | }) 347 | } 348 | 349 | // Fragments 350 | AnimatedView { 351 | style = sceneStyles 352 | asDynamic().key = json["key"].toString() 353 | 354 | /*json.asDynamic().component.unsafeCast> { 355 | asDynamic().navigator = object : NavigatorFunctions { 356 | override var pop = handlePop 357 | override val push = handlePush 358 | override var showMenu = handleShowMenu 359 | } 360 | 361 | if (json["props"] != undefined) { 362 | val childProps = json["props"].unsafeCast() 363 | val childPropsNames = childProps.getOwnPropertyNames() 364 | for (propName in childPropsNames) { 365 | asDynamic()[propName] = window.asDynamic().decodeURI(json["props"].asDynamic()[propName]) 366 | } 367 | } 368 | 369 | }*/ 370 | 371 | /*child(json.asDynamic().component.unsafeCast>()) { 372 | if (json["props"] != undefined) { 373 | val childProps = json["props"].unsafeCast() 374 | val childPropsNames = childProps.getOwnPropertyNames() 375 | for (propName in childPropsNames) { 376 | this.attrs.asDynamic()[propName] = window.asDynamic().decodeURI(json["props"].asDynamic()[propName]) 377 | } 378 | } 379 | 380 | this.attrs { 381 | asDynamic().navigator = object : NavigatorFunctions { 382 | override var pop = handlePop 383 | override val push = handlePush 384 | override var showMenu = handleShowMenu 385 | } 386 | } 387 | }*/ 388 | } 389 | } 390 | } 391 | 392 | } 393 | } 394 | -------------------------------------------------------------------------------- /src/main/kotlin/ojaynico/kotlin/react/native/api/Api.kt: -------------------------------------------------------------------------------- 1 | @file:JsModule("react-native") 2 | @file:Suppress("unused") 3 | 4 | package ojaynico.kotlin.react.native.api 5 | 6 | import ojaynico.kotlin.react.ComponentProvider 7 | import ojaynico.kotlin.react.native.component.* 8 | import react.Component 9 | import react.FC 10 | import react.Props 11 | import react.State 12 | import kotlin.js.Promise 13 | 14 | // Alert Component 15 | external class Alert: Component { 16 | override fun render(): dynamic = definedExternally 17 | 18 | class Buttons(text: String, onPress: () -> Unit, style: String = definedExternally) 19 | 20 | companion object { 21 | fun alert(title: String, 22 | message: String, 23 | buttons: Array = definedExternally, 24 | options : dynamic = definedExternally 25 | ) 26 | } 27 | } 28 | 29 | external val AnimatedView : FC 30 | 31 | external class Animated : Component { 32 | 33 | class View : Component { 34 | override fun render(): dynamic = definedExternally 35 | } 36 | 37 | class Text : Component { 38 | override fun render(): dynamic = definedExternally 39 | } 40 | 41 | class Image : Component { 42 | override fun render(): dynamic = definedExternally 43 | } 44 | 45 | class ScrollView : Component { 46 | override fun render(): dynamic = definedExternally 47 | } 48 | 49 | class FlatList : Component { 50 | override fun render(): dynamic = definedExternally 51 | } 52 | 53 | class SectionList : Component { 54 | override fun render(): dynamic = definedExternally 55 | } 56 | 57 | class Value(value: dynamic) { 58 | fun setValue(value: Number) 59 | fun setOffset(offset: Number) 60 | fun flattenOffset() 61 | fun extractOffset() 62 | fun addListener(callback: (dynamic) -> Unit) 63 | fun removeListener(id: String) 64 | fun removeAllListeners() 65 | fun stopAnimation(callback: (dynamic) -> Unit) 66 | fun resetAnimation(callback: (dynamic) -> Unit) 67 | fun interpolate(config: dynamic) 68 | fun animate(animations: dynamic, callback: (dynamic) -> Unit) 69 | fun stopTracking() 70 | fun track(tracking: dynamic) 71 | } 72 | 73 | class ValueXY { 74 | fun setValue(value: Number) 75 | fun setOffset(offset: Number) 76 | fun flattenOffset() 77 | fun extractOffset() 78 | fun addListener(callback: (dynamic) -> Unit) 79 | fun removeListener(id: String) 80 | fun removeAllListeners() 81 | fun stopAnimation(callback: (dynamic) -> Unit) 82 | fun resetAnimation(callback: (dynamic) -> Unit) 83 | fun getLayout() 84 | fun getTranslateTransform() 85 | } 86 | 87 | companion object { 88 | fun decay(value: dynamic, config: dynamic) 89 | fun timing(value: dynamic, config: dynamic) 90 | fun spring(value: dynamic, config: dynamic) 91 | fun add(a: dynamic, b: dynamic) 92 | fun subtract(a: dynamic, b: dynamic) 93 | fun divide(a: dynamic, b: dynamic) 94 | fun multiply(a: dynamic, b: dynamic) 95 | fun modulo(a: dynamic, modulus: dynamic) 96 | fun diffClamp(a: dynamic, min: dynamic, mac: dynamic) 97 | fun delay(time: dynamic) 98 | fun sequence(animations: dynamic) 99 | fun parallel(animations: dynamic, config: dynamic) 100 | fun stagger(time: dynamic, animations: dynamic) 101 | fun loop(animation: dynamic, config: dynamic) 102 | fun event(argMapping: dynamic, config: dynamic) 103 | fun forkEvent(event: dynamic, listener: dynamic) 104 | fun unforkEvent(event: dynamic, listener: dynamic) 105 | fun start(callback: (dynamic) -> Unit) 106 | fun stop() 107 | fun reset() 108 | } 109 | 110 | override fun render(): dynamic = definedExternally 111 | } 112 | 113 | external object Appearance { 114 | fun getColorScheme(): dynamic 115 | fun addChangeListener(listener: dynamic) 116 | fun removeChangeListener(listener: dynamic) 117 | } 118 | 119 | external object AppRegistry { 120 | fun registerComponent(appKey: String, getComponentFunc: ComponentProvider): String 121 | fun setWrapperComponentProvider(componentProvider: () -> JsClass) 122 | fun enableArchitectureIndicator(enabled: Boolean) 123 | fun registerConfig(config: dynamic) 124 | fun registerComponent(appKey: String, getComponentFunc: ComponentProvider, section: Boolean) 125 | fun registerRunnable(appKey: String, run: () -> Unit) 126 | fun registerSection(appKey: String, componentProvider: ComponentProvider) 127 | fun getAppKeys() 128 | fun getSectionKeys() 129 | fun getSections() 130 | fun getRunnable(appKey: String) 131 | fun getRegistry() 132 | fun setComponentProviderInstrumentationHook(hook: (componentProvider: ComponentProvider, scopedPerformanceLogger: dynamic) -> Unit) 133 | fun runApplication(appKey: String, appParameters: dynamic) 134 | fun unmountApplicationComponentAtRootTag(rootTag: Number) 135 | fun registerHeadlessTask(taskKey: String, taskProvider: dynamic) 136 | fun registerCancellableHeadlessTask(taskKey: String, taskProvider: dynamic, taskCancelProvider: dynamic) 137 | fun startHeadlessTask(taskId: Number, taskKey: String, data: dynamic) 138 | fun cancelHeadlessTask(taskId: Number, taskKey: String) 139 | } 140 | 141 | external class AppState { 142 | companion object { 143 | val currentState: dynamic 144 | fun addEventListener(type: dynamic, handler: dynamic) 145 | fun removeEventListener(type: dynamic, handler: dynamic) 146 | } 147 | } 148 | 149 | external class DevSettings { 150 | companion object { 151 | fun addMenuItem(title: String, handler: () -> Unit) 152 | fun reload() 153 | } 154 | } 155 | 156 | external class Dimensions { 157 | companion object { 158 | fun addEventListener(type: dynamic, handler: dynamic) 159 | fun get(dim: dynamic): dynamic 160 | fun removeEventListener(type: dynamic, handler: dynamic) 161 | fun set(dims: dynamic) 162 | } 163 | } 164 | 165 | external class Easing { 166 | companion object { 167 | fun step0(n: dynamic): dynamic 168 | fun step1(n: dynamic): dynamic 169 | fun linear(t: dynamic) 170 | fun ease(t: dynamic) 171 | fun quad(t: dynamic) 172 | fun cubic(t: dynamic) 173 | fun poly(n: dynamic) 174 | fun sin(t: dynamic) 175 | fun circle(t: dynamic) 176 | fun exp(t: dynamic) 177 | fun elastic(bounciness: dynamic) 178 | fun back(s: dynamic) 179 | fun bounce(t: dynamic) 180 | fun bezier(x1: dynamic, y1: dynamic, x2: dynamic, y2: dynamic) 181 | fun `in`() 182 | fun out() 183 | fun inOut() 184 | } 185 | } 186 | 187 | external object InteractionManager { 188 | fun runAfterInteractions(task: dynamic): dynamic 189 | fun createInteractionHandle() 190 | fun clearInteractionHandle(handle: dynamic) 191 | fun setDeadline(deadline: dynamic) 192 | } 193 | 194 | external object Keyboard{ 195 | fun addListener(eventName: dynamic, callback: () -> Unit): dynamic 196 | fun removeListener(eventName: dynamic, callback: () -> Unit) 197 | fun removeAllListeners(eventName: String) 198 | fun dismiss() 199 | fun scheduleLayoutAnimation(event: dynamic) 200 | } 201 | 202 | external object LayoutAnimation { 203 | fun configureNext(config: dynamic, onAnimationDidEnd: () -> Unit) 204 | fun create(duration: dynamic, type: dynamic, creationProp: dynamic): dynamic 205 | 206 | object Types { 207 | val spring: dynamic 208 | val linear: dynamic 209 | val easeInEaseOut: dynamic 210 | val easeIn: dynamic 211 | val easeOut: dynamic 212 | val keyboard: dynamic 213 | } 214 | 215 | object Properties { 216 | val opacity: dynamic 217 | val scaleX: dynamic 218 | val scaleY: dynamic 219 | val scaleXY: dynamic 220 | } 221 | 222 | object Presets { 223 | val easeInEaseOut: dynamic 224 | val linear: dynamic 225 | val spring: dynamic 226 | } 227 | } 228 | 229 | external class Linking { 230 | companion object { 231 | suspend fun addEventListener(type: dynamic, handler: dynamic) 232 | suspend fun removeEventListener(type: dynamic, handler: dynamic) 233 | suspend fun openURL(url: dynamic) 234 | suspend fun canOpenURL(url: dynamic): dynamic 235 | suspend fun openSettings() 236 | suspend fun getInitialURL(): dynamic 237 | suspend fun sendIntent(action: String, extras: dynamic) 238 | } 239 | } 240 | 241 | external object PanResponder { 242 | fun create(config: dynamic) 243 | } 244 | 245 | external class PixelRatio { 246 | companion object { 247 | fun get(): dynamic 248 | fun getFontScale(): Number 249 | fun getPixelSizeForLayoutSize(layoutSize: Number): Number 250 | fun roundToNearestPixel(layoutSize: Number): Number 251 | } 252 | } 253 | 254 | external fun PlatformColor(vararg colors: dynamic): dynamic 255 | 256 | external class Share { 257 | companion object { 258 | suspend fun share(content: dynamic, options: dynamic): dynamic 259 | val sharedAction: dynamic 260 | val dismissedAction: dynamic 261 | } 262 | } 263 | 264 | external object Systrace { 265 | fun installReactHook(useFiber: dynamic) 266 | fun setEnabled(enabled: dynamic) 267 | fun isEnabled(): dynamic 268 | fun beginEvent(profileName: dynamic, args: dynamic) 269 | fun endEvent() 270 | fun beginAsyncEvent(profileName: dynamic) 271 | fun endAsyncEvent(profileName: dynamic, cookie: dynamic) 272 | fun counterEvent(profileName: dynamic, value: dynamic) 273 | } 274 | 275 | external object Vibration { 276 | fun vibrate() 277 | fun vibrate(pattern: dynamic, repeat: dynamic) 278 | fun cancel() 279 | } 280 | 281 | external object BackHandler { 282 | fun addEventListener(eventName: dynamic, handler: dynamic) 283 | fun exitApp() 284 | fun removeEventListener(eventName: dynamic, handler: dynamic) 285 | } 286 | 287 | external class PermissionsAndroid { 288 | companion object { 289 | suspend fun check(permission: String): dynamic 290 | suspend fun request(permission: String, rationale: dynamic): dynamic 291 | fun requestMultiple(permissions: Array): dynamic 292 | } 293 | } 294 | 295 | external object ToastAndroid { 296 | val SHORT: dynamic 297 | val LONG: dynamic 298 | val TOP: dynamic 299 | val BOTTOM: dynamic 300 | val CENTER: dynamic 301 | 302 | fun show(message: dynamic, duration: dynamic) 303 | fun showWithGravity(message: dynamic, duration: dynamic, gravity: dynamic) 304 | fun showWithGravityAndOffset(message: dynamic, duration: dynamic, gravity: dynamic, xOffset: dynamic, yOffset: dynamic) 305 | } 306 | 307 | external object ActionSheetIOS { 308 | fun showActionSheetWithOptions(options: dynamic, callback: (index: dynamic) -> Unit) 309 | fun showShareActionSheetWithOptions(options: dynamic, failureCallback: (error: dynamic) -> Unit, successCallback: (status: Boolean, method: String) -> Unit) 310 | } 311 | 312 | external fun DynamicColorIOS(arg: dynamic): dynamic 313 | 314 | external object Settings { 315 | fun clearWatch(watchId: Number) 316 | fun get(key: String): dynamic 317 | fun set(settings: dynamic) 318 | fun watchKeys(keys: dynamic, callback: () -> Unit): Number 319 | } 320 | 321 | external var Platform: dynamic = definedExternally 322 | 323 | external object AccessibilityInfo { 324 | fun isBoldTextEnabled(): Promise 325 | fun isGrayscaleEnabled(): Promise 326 | fun isInvertColorsEnabled(): Promise 327 | fun isReduceMotionEnabled(): Promise 328 | fun isReduceTransparencyEnabled(): Promise 329 | fun isScreenReaderEnabled(): Promise 330 | fun setAccessibilityFocus(reactTag: Number) 331 | fun sendAccessibilityEvent_unstable(handle: dynamic, eventType: dynamic) 332 | fun announceForAccessibility(announcement: String) 333 | fun getRecommendedTimeoutMillis(originalTimeout: Number): Promise 334 | fun addEventListener(eventName: String, handler: (args: dynamic) -> Unit): dynamic 335 | fun removeEventListener(eventName: String, handler: (args: dynamic) -> Unit) 336 | } 337 | 338 | external object Image { 339 | fun getSize(uri: String, success: () -> Unit, failure: () -> Unit): dynamic 340 | fun getSizeWithHeaders(uri: String, headers: dynamic, success: () -> Unit, failure: () -> Unit): dynamic 341 | fun prefetch(uri: String): dynamic 342 | fun abortPrefetch(requestId: Number): dynamic 343 | fun queryCache(vararg urls: String): dynamic 344 | fun resolveAssetSource(source: dynamic): dynamic 345 | } 346 | 347 | external object TextInput { 348 | fun focus() 349 | fun blur() 350 | fun clear() 351 | fun isFocused(): dynamic 352 | } 353 | 354 | external object FlatList { 355 | fun scrollToEnd(params: dynamic) 356 | fun scrollToIndex(params: dynamic) 357 | fun scrollToItem(params: dynamic) 358 | fun scrollToOffset(params: dynamic) 359 | fun recordInteraction() 360 | fun flashScrollIndicators() 361 | fun getNativeScrollRef() 362 | fun getScrollResponder() 363 | fun getScrollableNode() 364 | } 365 | 366 | external object ScrollView { 367 | fun flashScrollIndicators() 368 | fun scrollTo(vararg options: dynamic) 369 | fun scrollToEnd(vararg options: dynamic) 370 | fun scrollWithoutAnimationTo(y: dynamic, x: dynamic) 371 | } 372 | 373 | external object SectionList { 374 | fun scrollToLocation(params: dynamic) 375 | fun recordInteraction() 376 | fun flashScrollIndicators() 377 | } 378 | 379 | external object StatusBar { 380 | fun popStackEntry(entry: dynamic): dynamic 381 | fun pushStackEntry(entry: dynamic): dynamic 382 | fun replaceStackEntry(entry: dynamic, props: dynamic): dynamic 383 | fun setBackgroundColor(color: String, animated: Boolean) 384 | fun setBarStyle(style: dynamic, animated: Boolean) 385 | fun setHidden(hidden: Boolean, animation: dynamic) 386 | fun setNetworkActivityIndicatorVisible(visible: Boolean) 387 | fun setTranslucent(translucent: Boolean) 388 | } 389 | 390 | external object TouchableOpacity { 391 | fun setOpacityTo(value: Number, duration: Number) 392 | } 393 | 394 | external object VirtualizedList { 395 | fun scrollToEnd(params: dynamic) 396 | fun scrollToIndex(params: dynamic) 397 | fun scrollToItem(params: dynamic) 398 | fun scrollToOffset(params: dynamic) 399 | fun recordInteraction() 400 | fun flashScrollIndicators() 401 | fun getScrollRef() 402 | fun getScrollResponder() 403 | fun getScrollableNode() 404 | fun setNativeProps(params: dynamic) 405 | fun getChildContext() : dynamic 406 | fun hasMore(): Boolean 407 | } 408 | 409 | external object DrawerLayoutAndroid { 410 | fun closeDrawer() 411 | fun openDrawer() 412 | } 413 | 414 | external object TouchableNativeFeedback { 415 | fun SelectableBackground(rippleRadius: Number) 416 | fun SelectableBackgroundBorderless(rippleRadius: Number) 417 | fun Ripple(color: String, borderless: Boolean, rippleRadius: Number) 418 | fun canUseNativeForeground() 419 | } 420 | -------------------------------------------------------------------------------- /src/main/kotlin/ojaynico/kotlin/react/Style.kt: -------------------------------------------------------------------------------- 1 | package ojaynico.kotlin.react 2 | 3 | interface LayoutStyle { 4 | val alignContent: dynamic 5 | val alignItems: dynamic 6 | val alignSelf: dynamic 7 | val aspectRatio: Number? 8 | val backgroundColor: String? 9 | val borderBottomWidth: Number? 10 | val borderEndWidth: dynamic 11 | val borderLeftWidth: Number? 12 | val borderRightWidth: Number? 13 | val borderStartWidth: dynamic 14 | val borderTopWidth: Number? 15 | val borderWidth: Number? 16 | var borderColor: dynamic 17 | val bottom: dynamic 18 | val direction: dynamic 19 | val display: dynamic 20 | val end: dynamic 21 | val flex: Number? 22 | val flexBasis: dynamic 23 | val flexDirection: dynamic 24 | val flexGrow: Number? 25 | val flexShrink: Number? 26 | val flexWrap: dynamic 27 | val height: dynamic 28 | val justifyContent: dynamic 29 | val left: dynamic 30 | val margin: dynamic 31 | val marginBottom: dynamic 32 | val marginEnd: dynamic 33 | val marginHorizontal: dynamic 34 | val marginLeft: dynamic 35 | val marginRight: dynamic 36 | val marginStart: dynamic 37 | val marginTop: dynamic 38 | val marginVertical: dynamic 39 | val maxHeight: dynamic 40 | val maxWidth: dynamic 41 | val minHeight: dynamic 42 | val minWidth: dynamic 43 | val overflow: dynamic 44 | val padding: dynamic 45 | val paddingBottom: dynamic 46 | val paddingEnd: dynamic 47 | val paddingHorizontal: dynamic 48 | val paddingLeft: dynamic 49 | val paddingRight: dynamic 50 | val paddingStart: dynamic 51 | val paddingTop: dynamic 52 | val paddingVertical: dynamic 53 | val position: dynamic 54 | val right: dynamic 55 | val start: dynamic 56 | val top: dynamic 57 | val width: dynamic 58 | val zIndex: Number? 59 | } 60 | 61 | class LayoutStyleC( 62 | val alignContent: dynamic = undefined, 63 | val alignItems: dynamic = undefined, 64 | val alignSelf: dynamic = undefined, 65 | val aspectRatio: Number? = undefined, 66 | val borderBottomWidth: Number? = undefined, 67 | val borderEndWidth: dynamic = undefined, 68 | val borderLeftWidth: Number? = undefined, 69 | val borderRightWidth: Number? = undefined, 70 | val borderStartWidth: dynamic = undefined, 71 | val borderTopWidth: Number? = undefined, 72 | val borderWidth: Number? = undefined, 73 | var borderColor: dynamic = undefined, 74 | val bottom: dynamic = undefined, 75 | val direction: dynamic = undefined, 76 | val display: dynamic = undefined, 77 | val end: dynamic = undefined, 78 | val flex: Number? = undefined, 79 | val flexBasis: dynamic = undefined, 80 | val flexDirection: dynamic = undefined, 81 | val flexGrow: Number? = undefined, 82 | val flexShrink: Number? = undefined, 83 | val flexWrap: dynamic = undefined, 84 | val height: dynamic = undefined, 85 | val justifyContent: dynamic = undefined, 86 | val left: dynamic = undefined, 87 | val margin: dynamic = undefined, 88 | val marginBottom: dynamic = undefined, 89 | val marginEnd: dynamic = undefined, 90 | val marginHorizontal: dynamic = undefined, 91 | val marginLeft: dynamic = undefined, 92 | val marginRight: dynamic = undefined, 93 | val marginStart: dynamic = undefined, 94 | val marginTop: dynamic = undefined, 95 | val marginVertical: dynamic = undefined, 96 | val maxHeight: dynamic = undefined, 97 | val maxWidth: dynamic = undefined, 98 | val minHeight: dynamic = undefined, 99 | val minWidth: dynamic = undefined, 100 | val overflow: dynamic = undefined, 101 | val padding: dynamic = undefined, 102 | val paddingBottom: dynamic = undefined, 103 | val paddingEnd: dynamic = undefined, 104 | val paddingHorizontal: dynamic = undefined, 105 | val paddingLeft: dynamic = undefined, 106 | val paddingRight: dynamic = undefined, 107 | val paddingStart: dynamic = undefined, 108 | val paddingTop: dynamic = undefined, 109 | val paddingVertical: dynamic = undefined, 110 | val position: dynamic = undefined, 111 | val right: dynamic = undefined, 112 | val start: dynamic = undefined, 113 | val top: dynamic = undefined, 114 | val width: dynamic = undefined, 115 | val zIndex: Number? = undefined, 116 | ) 117 | 118 | open class ViewStyle( 119 | val borderRightColor: String? = undefined, 120 | val backfaceVisibility: String? = undefined, 121 | val borderBottomColor: String? = undefined, 122 | val borderBottomEndRadius: Number? = undefined, 123 | val borderBottomLeftRadius: Number? = undefined, 124 | val borderBottomRightRadius: Number? = undefined, 125 | val borderBottomStartRadius: Number? = undefined, 126 | override val borderBottomWidth: Number? = undefined, 127 | override var borderColor: String? = undefined, 128 | val borderEndColor: String? = undefined, 129 | val borderLeftColor: String? = undefined, 130 | override val borderLeftWidth: Number? = undefined, 131 | val borderRadius: Number? = undefined, 132 | override val backgroundColor: String? = undefined, 133 | override val borderRightWidth: Number? = undefined, 134 | val borderStartColor: String? = undefined, 135 | val borderStyle: Number? = undefined, 136 | val borderTopColor: Number? = undefined, 137 | val borderTopEndRadius: Number? = undefined, 138 | val borderTopLeftRadius: Number? = undefined, 139 | val borderTopRightRadius: Number? = undefined, 140 | val borderTopStartRadius: Number? = undefined, 141 | override val borderTopWidth: Number? = undefined, 142 | override val borderWidth: Number? = undefined, 143 | val opacity: Number? = undefined, 144 | val elevation: Number? = undefined, 145 | override val alignItems: dynamic = undefined, 146 | 147 | override val alignSelf: dynamic = undefined, 148 | 149 | override val aspectRatio: Number? = undefined, 150 | 151 | override val borderEndWidth: dynamic = undefined, 152 | 153 | override val borderStartWidth: dynamic = undefined, 154 | 155 | override val bottom: dynamic = undefined, 156 | 157 | override val direction: dynamic = undefined, 158 | 159 | override val display: dynamic = undefined, 160 | 161 | override val end: dynamic = undefined, 162 | 163 | override val flex: Number? = undefined, 164 | 165 | override val flexBasis: dynamic = undefined, 166 | 167 | override val flexDirection: dynamic = undefined, 168 | 169 | override val flexGrow: Number? = undefined, 170 | 171 | override val flexShrink: Number? = undefined, 172 | 173 | override val flexWrap: dynamic = undefined, 174 | 175 | override val height: dynamic = undefined, 176 | 177 | override val justifyContent: dynamic = undefined, 178 | 179 | override val left: dynamic = undefined, 180 | 181 | override val margin: dynamic = undefined, 182 | 183 | override val marginBottom: dynamic = undefined, 184 | 185 | override val marginEnd: dynamic = undefined, 186 | 187 | override val marginHorizontal: dynamic = undefined, 188 | 189 | override val marginLeft: dynamic = undefined, 190 | 191 | override val marginRight: dynamic = undefined, 192 | 193 | override val marginStart: dynamic = undefined, 194 | 195 | override val marginTop: dynamic = undefined, 196 | 197 | override val marginVertical: dynamic = undefined, 198 | 199 | override val maxHeight: dynamic = undefined, 200 | 201 | override val maxWidth: dynamic = undefined, 202 | 203 | override val minHeight: dynamic = undefined, 204 | 205 | override val minWidth: dynamic = undefined, 206 | 207 | override val overflow: dynamic = undefined, 208 | 209 | override val padding: dynamic = undefined, 210 | 211 | override val paddingBottom: dynamic = undefined, 212 | 213 | override val paddingEnd: dynamic = undefined, 214 | 215 | override val paddingHorizontal: dynamic = undefined, 216 | 217 | override val paddingLeft: dynamic = undefined, 218 | 219 | override val paddingRight: dynamic = undefined, 220 | 221 | override val paddingStart: dynamic = undefined, 222 | 223 | override val paddingTop: dynamic = undefined, 224 | 225 | override val paddingVertical: dynamic = undefined, 226 | 227 | override val position: dynamic = undefined, 228 | 229 | override val right: dynamic = undefined, 230 | 231 | override val start: dynamic = undefined, 232 | 233 | override val top: dynamic = undefined, 234 | 235 | override val width: dynamic = undefined, 236 | 237 | override val zIndex: Number? = undefined, 238 | 239 | override val alignContent: dynamic = undefined 240 | ) : LayoutStyle 241 | 242 | class TextStyle( 243 | val textShadowOffset: dynamic = undefined, 244 | val color: String? = undefined, 245 | val fontSize: Number? = undefined, 246 | val fontStyle: String? = undefined, 247 | val fontWeight: String? = undefined, 248 | val lineHeight: Number? = undefined, 249 | val textAlign: String? = undefined, 250 | val textDecorationLine: String? = undefined, 251 | val textShadowColor: String? = undefined, 252 | val fontFamily: String? = undefined, 253 | val textShadowRadius: Number? = undefined, 254 | val includeFontPadding: Boolean? = undefined, 255 | val textAlignVertical: String? = undefined, 256 | val fontVariant: dynamic = undefined, 257 | val letterSpacing: Number? = undefined, 258 | val textDecorationColor: String? = undefined, 259 | val textDecorationStyle: String? = undefined, 260 | val textTransform: String? = undefined, 261 | val writingDirection: String? = undefined, 262 | override val alignContent: dynamic = undefined, 263 | 264 | override val alignItems: dynamic = undefined, 265 | 266 | override val alignSelf: dynamic = undefined, 267 | 268 | override val aspectRatio: Number? = undefined, 269 | 270 | override val borderEndWidth: dynamic = undefined, 271 | 272 | override val borderStartWidth: dynamic = undefined, 273 | 274 | override val bottom: dynamic = undefined, 275 | 276 | override val direction: dynamic = undefined, 277 | 278 | override val display: dynamic = undefined, 279 | 280 | override val end: dynamic = undefined, 281 | 282 | override val flex: Number? = undefined, 283 | 284 | override val flexBasis: dynamic = undefined, 285 | 286 | override val flexDirection: dynamic = undefined, 287 | 288 | override val flexGrow: Number? = undefined, 289 | 290 | override val flexShrink: Number? = undefined, 291 | 292 | override val flexWrap: dynamic = undefined, 293 | 294 | override val height: dynamic = undefined, 295 | 296 | override val justifyContent: dynamic = undefined, 297 | 298 | override val left: dynamic = undefined, 299 | 300 | override val margin: dynamic = undefined, 301 | 302 | override val marginBottom: dynamic = undefined, 303 | 304 | override val marginEnd: dynamic = undefined, 305 | 306 | override val marginHorizontal: dynamic = undefined, 307 | 308 | override val marginLeft: dynamic = undefined, 309 | 310 | override val marginRight: dynamic = undefined, 311 | 312 | override val marginStart: dynamic = undefined, 313 | 314 | override val marginTop: dynamic = undefined, 315 | 316 | override val marginVertical: dynamic = undefined, 317 | 318 | override val maxHeight: dynamic = undefined, 319 | 320 | override val maxWidth: dynamic = undefined, 321 | 322 | override val minHeight: dynamic = undefined, 323 | 324 | override val minWidth: dynamic = undefined, 325 | 326 | override val overflow: dynamic = undefined, 327 | 328 | override val padding: dynamic = undefined, 329 | 330 | override val paddingBottom: dynamic = undefined, 331 | 332 | override val paddingEnd: dynamic = undefined, 333 | 334 | override val paddingHorizontal: dynamic = undefined, 335 | 336 | override val paddingLeft: dynamic = undefined, 337 | 338 | override val paddingRight: dynamic = undefined, 339 | 340 | override val paddingStart: dynamic = undefined, 341 | 342 | override val paddingTop: dynamic = undefined, 343 | 344 | override val paddingVertical: dynamic = undefined, 345 | 346 | override val position: dynamic = undefined, 347 | 348 | override val right: dynamic = undefined, 349 | 350 | override val start: dynamic = undefined, 351 | 352 | override val top: dynamic = undefined, 353 | 354 | override val width: dynamic = undefined, 355 | 356 | override val zIndex: Number? = undefined, 357 | override val borderBottomWidth: Number? = undefined, 358 | override val borderLeftWidth: Number? = undefined, 359 | override val borderRightWidth: Number? = undefined, 360 | override val borderTopWidth: Number? = undefined, 361 | override val borderWidth: Number? = undefined, 362 | override var borderColor: dynamic = undefined, 363 | override var backgroundColor: String? = undefined 364 | 365 | ) : LayoutStyle 366 | 367 | interface ShadowStyle : LayoutStyle { 368 | val shadowColor: String? 369 | val shadowOffset: dynamic 370 | val shadowOpacity: Number? 371 | val shadowRadius: Number? 372 | 373 | override val alignContent: dynamic 374 | 375 | override val alignItems: dynamic 376 | 377 | override val alignSelf: dynamic 378 | 379 | override val aspectRatio: Number? 380 | 381 | override val borderEndWidth: dynamic 382 | 383 | override val borderStartWidth: dynamic 384 | 385 | override val bottom: dynamic 386 | 387 | override val direction: dynamic 388 | 389 | override val display: dynamic 390 | 391 | override val end: dynamic 392 | 393 | override val flex: Number? 394 | 395 | override val flexBasis: dynamic 396 | 397 | override val flexDirection: dynamic 398 | 399 | override val flexGrow: Number? 400 | 401 | override val flexShrink: Number? 402 | 403 | override val flexWrap: dynamic 404 | 405 | override val height: dynamic 406 | 407 | override val justifyContent: dynamic 408 | 409 | override val left: dynamic 410 | 411 | override val margin: dynamic 412 | 413 | override val marginBottom: dynamic 414 | 415 | override val marginEnd: dynamic 416 | 417 | override val marginHorizontal: dynamic 418 | 419 | override val marginLeft: dynamic 420 | 421 | override val marginRight: dynamic 422 | 423 | override val marginStart: dynamic 424 | 425 | override val marginTop: dynamic 426 | 427 | override val marginVertical: dynamic 428 | 429 | override val maxHeight: dynamic 430 | 431 | override val maxWidth: dynamic 432 | 433 | override val minHeight: dynamic 434 | 435 | override val minWidth: dynamic 436 | 437 | override val overflow: dynamic 438 | 439 | override val padding: dynamic 440 | 441 | override val paddingBottom: dynamic 442 | 443 | override val paddingEnd: dynamic 444 | 445 | override val paddingHorizontal: dynamic 446 | 447 | override val paddingLeft: dynamic 448 | 449 | override val paddingRight: dynamic 450 | 451 | override val paddingStart: dynamic 452 | 453 | override val paddingTop: dynamic 454 | 455 | override val paddingVertical: dynamic 456 | 457 | override val position: dynamic 458 | 459 | override val right: dynamic 460 | 461 | override val start: dynamic 462 | 463 | override val top: dynamic 464 | 465 | override val width: dynamic 466 | 467 | override val zIndex: Number? 468 | 469 | } 470 | 471 | class ImageStyle( 472 | val borderTopRightRadius: Number? = undefined, 473 | val backfaceVisibility: String? = undefined, 474 | val borderBottomLeftRadius: Number? = undefined, 475 | val borderBottomRightRadius: Number? = undefined, 476 | override var borderColor: String? = undefined, 477 | val borderRadius: Number? = undefined, 478 | val borderTopLeftRadius: Number? = undefined, 479 | val opacity: Number? = undefined, 480 | val resizeMode: String? = undefined, 481 | val tintColor: String? = undefined, 482 | val overlayColor: String? = undefined, 483 | 484 | override val alignContent: dynamic = undefined, 485 | 486 | override val alignItems: dynamic = undefined, 487 | 488 | override val alignSelf: dynamic = undefined, 489 | 490 | override val aspectRatio: Number? = undefined, 491 | 492 | override val borderEndWidth: dynamic = undefined, 493 | 494 | override val borderStartWidth: dynamic = undefined, 495 | 496 | override val bottom: dynamic = undefined, 497 | 498 | override val direction: dynamic = undefined, 499 | 500 | override val display: dynamic = undefined, 501 | 502 | override val end: dynamic = undefined, 503 | 504 | override val flex: Number? = undefined, 505 | 506 | override val flexBasis: dynamic = undefined, 507 | 508 | override val flexDirection: dynamic = undefined, 509 | 510 | override val flexGrow: Number? = undefined, 511 | 512 | override val flexShrink: Number? = undefined, 513 | 514 | override val flexWrap: dynamic = undefined, 515 | 516 | override val height: dynamic = undefined, 517 | 518 | override val justifyContent: dynamic = undefined, 519 | 520 | override val left: dynamic = undefined, 521 | 522 | override val margin: dynamic = undefined, 523 | 524 | override val marginBottom: dynamic = undefined, 525 | 526 | override val marginEnd: dynamic = undefined, 527 | 528 | override val marginHorizontal: dynamic = undefined, 529 | 530 | override val marginLeft: dynamic = undefined, 531 | 532 | override val marginRight: dynamic = undefined, 533 | 534 | override val marginStart: dynamic = undefined, 535 | 536 | override val marginTop: dynamic = undefined, 537 | 538 | override val marginVertical: dynamic = undefined, 539 | 540 | override val maxHeight: dynamic = undefined, 541 | 542 | override val maxWidth: dynamic = undefined, 543 | 544 | override val minHeight: dynamic = undefined, 545 | 546 | override val minWidth: dynamic = undefined, 547 | 548 | override val overflow: dynamic = undefined, 549 | 550 | override val padding: dynamic = undefined, 551 | 552 | override val paddingBottom: dynamic = undefined, 553 | 554 | override val paddingEnd: dynamic = undefined, 555 | 556 | override val paddingHorizontal: dynamic = undefined, 557 | 558 | override val paddingLeft: dynamic = undefined, 559 | 560 | override val paddingRight: dynamic = undefined, 561 | 562 | override val paddingStart: dynamic = undefined, 563 | 564 | override val paddingTop: dynamic = undefined, 565 | 566 | override val paddingVertical: dynamic = undefined, 567 | 568 | override val position: dynamic = undefined, 569 | 570 | override val right: dynamic = undefined, 571 | 572 | override val start: dynamic = undefined, 573 | 574 | override val top: dynamic = undefined, 575 | 576 | override val width: dynamic = undefined, 577 | 578 | override val zIndex: Number? = undefined, 579 | override val borderBottomWidth: Number? = undefined, 580 | override val borderLeftWidth: Number? = undefined, 581 | override val borderRightWidth: Number? = undefined, 582 | override val borderTopWidth: Number? = undefined, 583 | override val borderWidth: Number? = undefined, 584 | override val shadowColor: String? = undefined, 585 | override val shadowOffset: dynamic = undefined, 586 | override val shadowOpacity: Number? = undefined, 587 | override val shadowRadius: Number? = undefined, 588 | override var backgroundColor: String? = undefined 589 | ) : ShadowStyle 590 | -------------------------------------------------------------------------------- /src/main/kotlin/ojaynico/kotlin/react/native/component/Components.kt: -------------------------------------------------------------------------------- 1 | @file:JsModule("react-native") 2 | @file:Suppress("unused") 3 | 4 | package ojaynico.kotlin.react.native.component 5 | 6 | import react.* 7 | 8 | // View Component 9 | external interface ViewProps : Props { 10 | var onStartShouldSetResponder: (dynamic) -> Boolean 11 | var accessible: Boolean? 12 | var accessibilityLabel: String 13 | var accessibilityHint: String 14 | var accessibilityRole: String 15 | var accessibilityState: dynamic 16 | var accessibilityValue: dynamic 17 | var accessibilityActions: List 18 | var onAccessibilityAction: (dynamic) -> Unit 19 | var onAccessibilityTap: () -> Unit 20 | var onMagicTap: () -> Unit 21 | var onAccessibilityEscape: () -> Unit 22 | var accessibilityViewIsModal: Boolean? 23 | var accessibilityElementsHidden: Boolean? 24 | var accessibilityIgnoresInvertColors: Boolean? 25 | var accessibilityLiveRegion: String 26 | var importantForAccessibility: String 27 | var hitSlop: dynamic 28 | var nativeID: String 29 | var onLayout: () -> dynamic 30 | var onMoveShouldSetResponder: () -> Boolean 31 | var onMoveShouldSetResponderCapture: () -> Boolean 32 | var onResponderGrant: () -> Unit 33 | var onResponderMove: () -> Unit 34 | var onResponderReject: () -> Unit 35 | var onResponderRelease: () -> Unit 36 | var onResponderTerminate: () -> Unit 37 | var onResponderTerminationRequest: () -> Unit 38 | var onStartShouldSetResponderCapture: () -> Boolean 39 | var pointerEvents: String 40 | var removeClippedSubviews: Boolean? 41 | var style: dynamic 42 | var testID: String 43 | var collapsable: Boolean? 44 | var needsOffscreenAlphaCompositing: Boolean? 45 | var renderToHardwareTextureAndroid: Boolean? 46 | var shouldRasterizeIOS: Boolean? 47 | var nextFocusDown: Number 48 | var nextFocusForward: Number 49 | var nextFocusLeft: Number 50 | var nextFocusRight: Number 51 | var nextFocusUp: Number 52 | var focusable: Boolean? 53 | } 54 | 55 | external val View : FC 56 | 57 | // Text Component 58 | external interface TextProps : Props { 59 | var accessibilityLabel: String 60 | var accessibilityHint: String 61 | var accessibilityRole: String 62 | var accessibilityState: dynamic 63 | var accessible: Boolean? 64 | var adjustsFontSizeToFit: Boolean? 65 | var allowFontScaling: Boolean? 66 | var dataDetectorType: String 67 | var disabled: Boolean? 68 | var ellipsizeMode: String 69 | var maxFontSizeMultiplier: Number 70 | var minimumFontScale: Number 71 | var nativeID: String 72 | var numberOfLines: Number 73 | var onLayout: () -> dynamic 74 | var onLongPress: () -> Unit 75 | var onMoveShouldSetResponder: () -> Boolean 76 | var onPress: () -> Unit 77 | var onResponderGrant: () -> Unit 78 | var onResponderMove: () -> Unit 79 | var onResponderRelease: () -> Unit 80 | var onResponderTerminate: () -> Unit 81 | var onResponderTerminationRequest: () -> Unit 82 | var onStartShouldSetResponderCapture: () -> Boolean 83 | var onTextLayout: () -> Boolean 84 | var pressRetentionOffset: dynamic 85 | var selectable: Boolean? 86 | var selectionColor: dynamic 87 | var style: dynamic 88 | var suppressHighlighting: Boolean? 89 | var testID: String 90 | var textBreakStrategy: String 91 | var onPressIn: (event: dynamic) -> Unit 92 | var onPressOut: (event: dynamic) -> Unit 93 | } 94 | 95 | external val Text: FC 96 | 97 | // Button Component 98 | external interface ButtonProps : Props { 99 | var onPress: () -> Unit 100 | var title: String 101 | var accessibilityLabel: String 102 | var color: String 103 | var disabled: Boolean? 104 | var testID: String 105 | var hasTVPreferredFocus: Boolean? 106 | var nextFocusDown: Number 107 | var nextFocusForward: Number 108 | var nextFocusLeft: Number 109 | var nextFocusRight: Number 110 | var nextFocusUp: Number 111 | var touchSoundDisabled: Boolean? 112 | } 113 | 114 | external val Button: FC 115 | 116 | // Image Component 117 | external interface ImageProps : Props { 118 | var style: dynamic 119 | var accessible: Boolean? 120 | var accessibilityLabel: String 121 | var blurRadius: Number 122 | var capInsets: dynamic 123 | var defaultSource: Number 124 | var fadeDuration: Number 125 | var loadingIndicatorSource: Array 126 | var onError: () -> Unit 127 | var onLayout: (dynamic, dynamic, dynamic, dynamic) -> Unit 128 | var onLoad: () -> Unit 129 | var onLoadEnd: () -> Unit 130 | var onLoadStart: (dynamic) -> dynamic 131 | var onPartialLoad: () -> Unit 132 | var onProgress: (dynamic, dynamic) -> Unit 133 | var progressiveRenderingEnabled: Boolean? 134 | var resizeMethod: String 135 | var resizeMode: String 136 | var source: dynamic 137 | var testID: String 138 | } 139 | 140 | external val Image: FC 141 | 142 | external interface ImageBackgroundProps : ImageProps, Props { 143 | var imageStyle: dynamic 144 | var imageRef: dynamic 145 | override var style: dynamic 146 | override var accessible: Boolean? 147 | override var accessibilityLabel: String 148 | override var blurRadius: Number 149 | override var capInsets: dynamic 150 | override var defaultSource: Number 151 | override var fadeDuration: Number 152 | override var loadingIndicatorSource: Array 153 | override var onError: () -> Unit 154 | override var onLayout: (dynamic, dynamic, dynamic, dynamic) -> Unit 155 | override var onLoad: () -> Unit 156 | override var onLoadEnd: () -> Unit 157 | override var onLoadStart: (dynamic) -> dynamic 158 | override var onPartialLoad: () -> Unit 159 | override var onProgress: (dynamic, dynamic) -> Unit 160 | override var progressiveRenderingEnabled: Boolean? 161 | override var resizeMethod: String 162 | override var resizeMode: String 163 | override var source: dynamic 164 | override var testID: String 165 | } 166 | 167 | external val ImageBackground: FC 168 | 169 | // TextInput Component 170 | external interface TextInputProps : Props { 171 | var allowFontScaling: Boolean? 172 | var autoCapitalize: String 173 | var autoCompleteType: String 174 | var autoCorrect: Boolean? 175 | var autoFocus: Boolean? 176 | var blurOnSubmit: Boolean? 177 | var caretHidden: Boolean? 178 | var clearButtonMode: String 179 | var clearTextOnFocus: Boolean? 180 | var contextMenuHidden: Boolean? 181 | var dataDetectorTypes: String 182 | var defaultValue: String 183 | var disableFullscreenUI: Boolean? 184 | var editable: Boolean? 185 | var enablesReturnKeyAutomatically: Boolean? 186 | var importantForAutofill: String 187 | var inlineImageLeft: String 188 | var inlineImagePadding: Number 189 | var inputAccessoryViewID: String 190 | var keyboardAppearance: String 191 | var keyboardType: String 192 | var maxFontSizeMultiplier: Number 193 | var maxLength: Number 194 | var multiline: Boolean? 195 | var numberOfLines: Number 196 | var onBlur: () -> Unit 197 | var onChange: () -> Unit 198 | var onChangeText: (String) -> Unit 199 | var onContentSizeChange: () -> Unit 200 | var onEndEditing: () -> Unit 201 | var onFocus: () -> Unit 202 | var onKeyPress: () -> Unit 203 | var onLayout: () -> Unit 204 | var onScroll: () -> Unit 205 | var onSelectionChange: () -> Unit 206 | var onSubmitEditing: () -> Unit 207 | var onTextInput: () -> Unit 208 | var placeholder: String 209 | var placeholderTextColor: String 210 | var returnKeyLabel: String 211 | var returnKeyType: String 212 | var rejectResponderTermination: Boolean? 213 | var scrollEnabled: Boolean? 214 | var secureTextEntry: Boolean? 215 | var selection: JSON 216 | var selectionColor: String 217 | var selectTextOnFocus: Boolean? 218 | var showSoftInputOnFocus: Boolean? 219 | var spellCheck: Boolean? 220 | var textAlign: String 221 | var textContentType: String 222 | var passwordRules: String 223 | var style: dynamic 224 | var textBreakStrategy: String 225 | var underlineColorAndroid: String 226 | var value: String 227 | } 228 | 229 | /*external class TextInput : Component { 230 | override fun render(): dynamic = definedExternally 231 | 232 | companion object { 233 | fun focus() 234 | fun blur() 235 | fun clear() 236 | fun isFocused(): dynamic 237 | } 238 | }*/ 239 | 240 | external val TextInput: FC 241 | 242 | // Switch Component 243 | external interface SwitchProps : Props { 244 | var disabled: Boolean? 245 | var ios_backgroundColor: String 246 | var onChange: () -> Unit 247 | var onValueChange: () -> Unit 248 | var thumbColor: String 249 | var trackColor: dynamic 250 | var value: Boolean? 251 | } 252 | 253 | external val Switch: FC 254 | 255 | // FlatList Component 256 | external interface FlatListProps : Props { 257 | var renderItem: (arguments: dynamic) -> dynamic 258 | var data: Array 259 | var itemSeparatorComponent: dynamic 260 | var listEmptyComponent: dynamic 261 | var listFooterComponent: dynamic 262 | var listFooterComponentStyle: dynamic 263 | var listHeaderComponent: dynamic 264 | var ListHeaderComponentStyle: dynamic 265 | var columnWrapperStyle: dynamic 266 | var extraData: dynamic 267 | var getItemLayout: (data: dynamic, index: Number) -> Unit 268 | var horizontal: Boolean? 269 | var initialNumToRender: Number 270 | var initialScrollIndex: Number 271 | var inverted: Boolean? 272 | var keyExtractor: (item: dynamic, index: Number) -> String 273 | var numColumns: Number 274 | var onEndReached: (info: dynamic) -> Unit 275 | var onEndReachedThreshold: Number 276 | var onRefresh: () -> Unit 277 | var onViewableItemsChanged: (info: dynamic) -> Unit 278 | var progressViewOffset: Number 279 | var refreshing: Boolean? 280 | var removeClippedSubviews: Boolean? 281 | var viewabilityConfig: dynamic 282 | var viewabilityConfigCallbackPairs: dynamic 283 | } 284 | 285 | /*external class FlatList : Component { 286 | override fun render(): dynamic = definedExternally 287 | 288 | companion object { 289 | fun scrollToEnd(params: dynamic) 290 | fun scrollToIndex(params: dynamic) 291 | fun scrollToItem(params: dynamic) 292 | fun scrollToOffset(params: dynamic) 293 | fun recordInteraction() 294 | fun flashScrollIndicators() 295 | fun getNativeScrollRef() 296 | fun getScrollResponder() 297 | fun getScrollableNode() 298 | } 299 | }*/ 300 | 301 | external val FlatList : FC 302 | 303 | // ScrollView Component 304 | external interface ScrollViewProps : Props { 305 | var alwaysBounceHorizontal: Boolean? 306 | var alwaysBounceVertical: Boolean? 307 | var automaticallyAdjustContentInsets: Boolean? 308 | var bounces: Boolean? 309 | var bouncesZoom: Boolean? 310 | var canCancelContentTouches: Boolean? 311 | var centerContent: Boolean? 312 | var contentContainerStyle: dynamic 313 | var contentInset: JSON 314 | var contentInsetAdjustmentBehavior: String 315 | var contentOffset: JSON 316 | var decelerationRate: String 317 | var directionalLockEnabled: Boolean? 318 | var disableIntervalMomentum: Boolean? 319 | var disableScrollViewPanResponder: Boolean? 320 | var endFillColor: String 321 | var fadingEdgeLength: Int 322 | var horizontal: Boolean? 323 | var indicatorStyle: String 324 | var invertStickyHeaders: Boolean? 325 | var keyboardDismissMode: String 326 | var keyboardShouldPersistTaps: String 327 | var maintainVisibleContentPosition: JSON 328 | var maximumZoomScale: Int 329 | var minimumZoomScale: Int 330 | var nestedScrollEnabled: Boolean? 331 | var onContentSizeChange: () -> Unit 332 | var onMomentumScrollBegin: () -> Unit 333 | var onMomentumScrollEnd: () -> Unit 334 | var onScroll: () -> Unit 335 | var onScrollBeginDrag: () -> Unit 336 | var onScrollEndDrag: () -> Unit 337 | var onScrollToTop: () -> Unit 338 | var overScrollMode: String 339 | var pagingEnabled: Boolean? 340 | var persistentScrollbar: Boolean? 341 | var pinchGestureEnabled: Boolean? 342 | var refreshControl: dynamic 343 | var removeClippedSubviews: Boolean? 344 | var scrollBarThumbImage: Int 345 | var scrollEnabled: Boolean? 346 | var scrollEventThrottle: Int 347 | var scrollIndicatorInsets: JSON 348 | var scrollPerfTag: String 349 | var scrollToOverflowEnabled: Boolean? 350 | var scrollsToTop: Boolean? 351 | var showsHorizontalScrollIndicator: Boolean? 352 | var showsVerticalScrollIndicator: Boolean? 353 | var snapToAlignment: String 354 | var snapToEnd: Boolean? 355 | var snapToInterval: Int 356 | var snapToOffsets: Array 357 | var snapToStart: Boolean? 358 | var stickyHeaderIndices: Array 359 | var zoomScale: Int 360 | var stickyHeaderHiddenOnScroll: Boolean? 361 | } 362 | 363 | /*external class ScrollView : Component { 364 | override fun render(): dynamic = definedExternally 365 | 366 | companion object { 367 | fun flashScrollIndicators() 368 | fun scrollTo(vararg options: dynamic) 369 | fun scrollToEnd(vararg options: dynamic) 370 | fun scrollWithoutAnimationTo(y: dynamic, x: dynamic) 371 | } 372 | }*/ 373 | 374 | external val ScrollView : FC 375 | 376 | // SafeAreaView Component 377 | external interface SafeAreaViewProps : ViewProps { 378 | var emulateUnlessSupported: Boolean? 379 | } 380 | 381 | external val SafeAreaView: FC 382 | 383 | // SectionList Component 384 | external interface SectionListProps : Props { 385 | var emulateUnlessSupported: Boolean? 386 | var renderItem: (item: dynamic, index: Int, separators: dynamic) -> Unit 387 | var section: Array 388 | var ItemSeparatorComponent: dynamic 389 | var ListEmptyComponent: dynamic 390 | var ListFooterComponent: dynamic 391 | var ListHeaderComponent: dynamic 392 | var columnWrapperStyle: dynamic 393 | var extraData: dynamic 394 | var getItemLayout: (data: dynamic, index: Int) -> Unit 395 | var horizontal: Boolean? 396 | var initialNumToRender: Int 397 | var initialScrollIndex: Int 398 | var inverted: Boolean? 399 | var keyExtractor: (item: dynamic, index: Int) -> String 400 | var numColumns: Int 401 | var onEndReached: (info: dynamic) -> Unit 402 | var onEndReachedThreshold: Int 403 | var onRefresh: () -> Unit 404 | var onViewableItemsChanged: (info: dynamic) -> Unit 405 | var refreshing: Boolean? 406 | var removeClippedSubviews: Boolean? 407 | var renderSectionHeader: (info: dynamic) -> dynamic 408 | var renderSectionFooter: (info: dynamic) -> dynamic 409 | var sectionSeparatorComponent: dynamic 410 | var stickySectionHeadersEnabled: Boolean? 411 | } 412 | 413 | /*external class SectionList: Component { 414 | override fun render(): dynamic = definedExternally 415 | 416 | companion object { 417 | fun scrollToLocation(params: dynamic) 418 | fun recordInteraction() 419 | fun flashScrollIndicators() 420 | } 421 | }*/ 422 | 423 | external val SectionList: FC 424 | 425 | // ActivityIndicator Component 426 | external interface ActivityIndicatorProps : Props { 427 | var animating: Boolean? 428 | var color: String 429 | var hidesWhenStopped: Boolean? 430 | var size: dynamic 431 | } 432 | 433 | external val ActivityIndicator: FC 434 | 435 | external class StyleSheet { 436 | var absoluteFill: dynamic = definedExternally 437 | var absoluteFillObject: dynamic = definedExternally 438 | var hairlineWidth: dynamic = definedExternally 439 | 440 | companion object { 441 | fun compose(style1: dynamic, style2: dynamic): dynamic 442 | fun create(obj: dynamic): dynamic 443 | fun flatten(style: Array): dynamic 444 | fun setStyleAttributePreprocessor(property: String, process: (propValue: dynamic) -> dynamic) 445 | } 446 | } 447 | 448 | external interface KeyboardAvoidingViewProps : ViewProps, Props { 449 | var behavior: dynamic 450 | var contentContainerStyle: dynamic 451 | var enabled: Boolean? 452 | override var onStartShouldSetResponder: (dynamic) -> Boolean 453 | override var accessible: Boolean? 454 | override var accessibilityLabel: String 455 | override var accessibilityHint: String 456 | override var accessibilityRole: String 457 | override var accessibilityState: dynamic 458 | override var accessibilityValue: dynamic 459 | override var accessibilityActions: List 460 | override var onAccessibilityAction: (dynamic) -> Unit 461 | override var onAccessibilityTap: () -> Unit 462 | override var onMagicTap: () -> Unit 463 | override var onAccessibilityEscape: () -> Unit 464 | override var accessibilityViewIsModal: Boolean? 465 | override var accessibilityElementsHidden: Boolean? 466 | override var accessibilityIgnoresInvertColors: Boolean? 467 | override var accessibilityLiveRegion: String 468 | override var importantForAccessibility: String 469 | override var hitSlop: dynamic 470 | override var nativeID: String 471 | override var onLayout: () -> dynamic 472 | override var onMoveShouldSetResponder: () -> Boolean 473 | override var onMoveShouldSetResponderCapture: () -> Boolean 474 | override var onResponderGrant: () -> Unit 475 | override var onResponderMove: () -> Unit 476 | override var onResponderReject: () -> Unit 477 | override var onResponderRelease: () -> Unit 478 | override var onResponderTerminate: () -> Unit 479 | override var onResponderTerminationRequest: () -> Unit 480 | override var onStartShouldSetResponderCapture: () -> Boolean 481 | override var pointerEvents: String 482 | override var removeClippedSubviews: Boolean? 483 | override var style: dynamic 484 | override var testID: String 485 | override var collapsable: Boolean? 486 | override var needsOffscreenAlphaCompositing: Boolean? 487 | override var renderToHardwareTextureAndroid: Boolean? 488 | override var shouldRasterizeIOS: Boolean? 489 | override var nextFocusDown: Number 490 | override var nextFocusForward: Number 491 | override var nextFocusLeft: Number 492 | override var nextFocusRight: Number 493 | override var nextFocusUp: Number 494 | override var focusable: Boolean? 495 | 496 | } 497 | 498 | external val KeyboardAvoidingView : FC 499 | 500 | external interface ModalProps : Props { 501 | var animationType: dynamic 502 | var hardwareAccelerated: Boolean? 503 | var onDismiss: () -> Unit 504 | var onOrientationChange: () -> Unit 505 | var onRequestClose: () -> Unit 506 | var onShow: () -> Unit 507 | var presentationStyle: dynamic 508 | var statusBarTranslucent: Boolean? 509 | var supportedOrientations: dynamic 510 | var transparent: Boolean? 511 | var visible: Boolean? 512 | } 513 | 514 | external val Modal : FC 515 | 516 | external interface PressableProps : Props { 517 | var android_disableSound: Boolean? 518 | var android_ripple: dynamic 519 | var children: dynamic 520 | var delayLongPress: Number 521 | var disabled: Boolean? 522 | var hitSlop: dynamic 523 | var onLongPress: dynamic 524 | var onPress: dynamic 525 | var onPressIn: dynamic 526 | var onPressOut: dynamic 527 | var pressRetentionOffset: dynamic 528 | var style: dynamic 529 | var testOnly_pressed: Boolean? 530 | var onBlur: (event: dynamic) -> dynamic 531 | var onFocus: (event: dynamic) -> dynamic 532 | } 533 | 534 | external val Pressable : FC 535 | 536 | external interface RefreshControlProps : Props { 537 | var refreshing: Boolean? 538 | var onRefresh: () -> Unit 539 | var colors: Array 540 | var enabled: Boolean? 541 | var progressBackgroundColor: dynamic 542 | var progressViewOffset: Number 543 | var size: dynamic 544 | var tintColor: dynamic 545 | var title: String 546 | var titleColor: dynamic 547 | } 548 | 549 | external val RefreshControl : FC 550 | 551 | external interface StatusBarProps : Props { 552 | var animated: Boolean? 553 | var backgroundColor: dynamic 554 | var barStyle: dynamic 555 | var hidden: Boolean? 556 | var networkActivityIndicatorVisible: Boolean? 557 | var showHideTransition: dynamic 558 | var translucent: Boolean? 559 | } 560 | 561 | /*external class StatusBar : Component { 562 | override fun render(): dynamic = definedExternally 563 | 564 | companion object { 565 | fun popStackEntry(entry: dynamic): dynamic 566 | fun pushStackEntry(entry: dynamic): dynamic 567 | fun replaceStackEntry(entry: dynamic, props: dynamic): dynamic 568 | fun setBackgroundColor(color: String, animated: Boolean) 569 | fun setBarStyle(style: dynamic, animated: Boolean) 570 | fun setHidden(hidden: Boolean, animation: dynamic) 571 | fun setNetworkActivityIndicatorVisible(visible: Boolean) 572 | fun setTranslucent(translucent: Boolean) 573 | } 574 | }*/ 575 | 576 | external val StatusBar : FC 577 | 578 | external interface TouchableHighlightProps : Props { 579 | var activeOpacity: Number 580 | var onHideUnderlay: () -> Unit 581 | var onShowUnderlay: () -> Unit 582 | var style: dynamic 583 | var underlayColor: dynamic 584 | var hasTVPreferredFocus: Boolean? 585 | var nextFocusDown: Boolean? 586 | var nextFocusForward: Boolean? 587 | var nextFocusLeft: Boolean? 588 | var nextFocusRight: Boolean? 589 | var nextFocusUp: Boolean? 590 | var testOnly_pressed: Boolean? 591 | var onPress: () -> Unit 592 | } 593 | 594 | external val TouchableHighlight : FC 595 | 596 | external interface TouchableOpacityProps : Props { 597 | var style: dynamic 598 | var onPress: () -> Unit 599 | var activeOpacity: Number 600 | var tvParallaxProperties: dynamic 601 | var hasTVPreferredFocus: Boolean? 602 | var nextFocusDown: Boolean? 603 | var nextFocusForward: Boolean? 604 | var nextFocusLeft: Boolean? 605 | var nextFocusRight: Boolean? 606 | var nextFocusUp: Boolean? 607 | } 608 | 609 | /*external class TouchableOpacity : Component { 610 | override fun render(): dynamic = definedExternally 611 | 612 | companion object { 613 | fun setOpacityTo(value: Number, duration: Number) 614 | } 615 | }*/ 616 | 617 | external val TouchableOpacity : FC 618 | 619 | external interface TouchableWithoutFeedbackProps : Props { 620 | var accessibilityIgnoresInvertColors: Boolean? 621 | var accessible: Boolean? 622 | var accessibilityLabel: String 623 | var accessibilityHint: String 624 | var accessibilityRole: String 625 | var accessibilityState: dynamic 626 | var accessibilityActions: Array 627 | var onAccessibilityAction: () -> Unit 628 | var accessibilityValue: dynamic 629 | var delayLongPress: Number 630 | var delayPressIn: Number 631 | var delayPressOut: Number 632 | var disabled: Boolean? 633 | var hitSlop: dynamic 634 | var onBlur: () -> Unit 635 | var onFocus: () -> Unit 636 | var onLayout: () -> Unit 637 | var onLongPress: () -> Unit 638 | var onPress: () -> Unit 639 | var onPressIn: () -> Unit 640 | var onPressOut: () -> Unit 641 | var pressRetentionOffset: dynamic 642 | var nativeID: String 643 | var testID: String 644 | var touchSoundDisabled: Boolean? 645 | } 646 | 647 | external val TouchableWithoutFeedback : FC 648 | 649 | external interface VirtualizedListProps : Props { 650 | var renderItem: (arguments: dynamic) -> dynamic 651 | var data: dynamic 652 | var getItem: (data: dynamic, index: Number) -> dynamic 653 | var getItemCount: (data: dynamic) -> Number 654 | var debug: Boolean? 655 | var extraData: dynamic 656 | var getItemLayout: (data: dynamic, index: Number) -> dynamic 657 | var initialScrollIndex: Number 658 | var inverted: Boolean? 659 | var CellRendererComponent: dynamic 660 | var ItemSeparatorComponent: dynamic 661 | var listKey: String 662 | var ListEmptyComponent: dynamic 663 | var ListItemComponent: dynamic 664 | var ListFooterComponent: dynamic 665 | var ListFooterComponentStyle: dynamic 666 | var ListHeaderComponent: dynamic 667 | var ListHeaderComponentStyle: dynamic 668 | var onRefresh: () -> Unit 669 | var onScrollToIndexFailed: (info: dynamic) -> Unit 670 | var onViewableItemsChanged: (info: dynamic) -> Unit 671 | var refreshing: Boolean? 672 | var refreshControl: dynamic 673 | var removeClippedSubviews: Boolean? 674 | var renderScrollComponent: (props: dynamic) -> dynamic 675 | var viewabilityConfig: dynamic 676 | var viewabilityConfigCallbackPairs: dynamic 677 | var horizontal: Boolean? 678 | var initialNumToRender: Number 679 | var keyExtractor: (item: dynamic, index: Number) -> String 680 | var maxToRenderPerBatch: Number 681 | var onEndReached: (info: dynamic) -> Unit 682 | var onEndReachedThreshold: Number 683 | var updateCellsBatchingPeriod: Number 684 | var windowSize: Number 685 | var persistentScrollbar: Boolean? 686 | var progressViewOffset: Number 687 | } 688 | 689 | /*external class VirtualizedList : Component { 690 | override fun render(): dynamic = definedExternally 691 | 692 | companion object { 693 | fun scrollToEnd(params: dynamic) 694 | fun scrollToIndex(params: dynamic) 695 | fun scrollToItem(params: dynamic) 696 | fun scrollToOffset(params: dynamic) 697 | fun recordInteraction() 698 | fun flashScrollIndicators() 699 | fun getScrollRef() 700 | fun getScrollResponder() 701 | fun getScrollableNode() 702 | fun setNativeProps(params: dynamic) 703 | fun getChildContext() : dynamic 704 | fun hasMore(): Boolean 705 | } 706 | }*/ 707 | 708 | external val VirtualizedList : FC 709 | 710 | external interface DrawerLayoutAndroidProps : Props { 711 | var drawerBackgroundColor: dynamic 712 | var drawerLockMode: dynamic 713 | var drawerPosition: dynamic 714 | var drawerWidth: Number 715 | var keyboardDismissMode: dynamic 716 | var onDrawerClose: () -> Unit 717 | var onDrawerOpen: () -> Unit 718 | var onDrawerSlide: () -> Unit 719 | var onDrawerStateChanged: () -> Unit 720 | var renderNavigationView: () -> Unit 721 | var statusBarBackgroundColor: dynamic 722 | } 723 | 724 | /*external class DrawerLayoutAndroid : Component { 725 | override fun render(): dynamic = definedExternally 726 | 727 | companion object { 728 | fun closeDrawer() 729 | fun openDrawer() 730 | } 731 | }*/ 732 | 733 | external val DrawerLayoutAndroid : FC 734 | 735 | external interface TouchableNativeFeedbackProps : Props { 736 | var background: dynamic 737 | var useForeground: Boolean? 738 | var hasTVPreferredFocus: Boolean? 739 | var nextFocusDown: Boolean? 740 | var nextFocusForward: Boolean? 741 | var nextFocusLeft: Boolean? 742 | var nextFocusRight: Boolean? 743 | var nextFocusUp: Boolean? 744 | } 745 | 746 | /*external class TouchableNativeFeedback : Component { 747 | override fun render(): dynamic = definedExternally 748 | 749 | companion object { 750 | fun SelectableBackground(rippleRadius: Number) 751 | fun SelectableBackgroundBorderless(rippleRadius: Number) 752 | fun Ripple(color: String, borderless: Boolean, rippleRadius: Number) 753 | fun canUseNativeForeground() 754 | } 755 | }*/ 756 | 757 | external val TouchableNativeFeedback : FC 758 | 759 | external interface InputAccessoryViewProps : Props { 760 | var backgroundColor: dynamic 761 | var nativeID: String 762 | var style: dynamic 763 | } 764 | 765 | external val InputAccessoryView : FC 766 | --------------------------------------------------------------------------------