From d54d6555a42b973cae8b4c3ab469153aa88ef11e Mon Sep 17 00:00:00 2001 From: michaelr Date: Mon, 4 Apr 2016 19:21:10 +0300 Subject: [PATCH] moved re-frame app to root folder Former-commit-id: 5a3b923b0c32e5e900b89e984393822ce6a15abc --- .gitignore | 9 +- .re-natal | 16 +- CHANGELOG.md | 8 +- README.md | 23 +- android/Messenger.iml | 19 - android/app/app.iml | 117 --- android/app/build.gradle | 17 +- android/app/react.gradle | 19 +- android/app/src/main/AndroidManifest.xml | 2 +- .../app/src/main/assets/fonts/Entypo.ttf | Bin .../app/src/main/assets/fonts/EvilIcons.ttf | Bin .../app/src/main/assets/fonts/FontAwesome.ttf | Bin .../app/src/main/assets/fonts/Foundation.ttf | Bin .../app/src/main/assets/fonts/Ionicons.ttf | Bin .../src/main/assets/fonts/MaterialIcons.ttf | Bin .../app/src/main/assets/fonts/Octicons.ttf | Bin .../app/src/main/assets/fonts/Zocial.ttf | Bin .../main/java/com/messenger/MainActivity.java | 80 -- .../main/java/com/syngim/MainActivity.java | 0 android/app/src/main/res/values/strings.xml | 2 +- android/settings.gradle | 6 +- doc/intro.md | 2 +- env/dev/env/android/main.cljs | 26 +- env/dev/env/ios/main.cljs | 23 +- env/prod/env/android/main.cljs | 8 +- env/prod/env/ios/main.cljs | 8 +- {syng-im/images => images}/chat.png | Bin {syng-im/images => images}/cljs.png | Bin {syng-im/images => images}/cljs@2x.png | Bin {syng-im/images => images}/cljs@3x.png | Bin {syng-im/images => images}/deliveryfailed.png | Bin {syng-im/images => images}/v.png | Bin ios/Messenger.xcodeproj/project.pbxproj | 89 +- package.json | 8 +- project.clj | 66 +- src/cljsjs/react/dom.cljs | 1 - src/messenger/android/core.cljs | 79 -- src/messenger/android/login.cljs | 83 -- src/messenger/android/sign_up_confirm.cljs | 108 -- src/messenger/comm/intercom.cljs | 75 -- src/messenger/comm/pubsub.cljs | 33 - src/messenger/comm/services.cljs | 35 - src/messenger/components/chat/chat.cljs | 91 -- src/messenger/components/chat/message.cljs | 107 -- .../components/chat/new_message.cljs | 60 -- .../components/contact_list/contact.cljs | 120 --- .../components/contact_list/contact_list.cljs | 47 - src/messenger/components/iname.cljs | 4 - .../components/invertible-scroll-view.cljs | 7 - src/messenger/components/spinner.cljs | 7 - src/messenger/constants.cljs | 5 - src/messenger/init.cljs | 6 - src/messenger/ios/core.cljs | 33 - src/messenger/models/chat.cljs | 8 - src/messenger/models/contacts.cljs | 78 -- src/messenger/models/messages.cljs | 42 - src/messenger/models/navigation.cljs | 8 - src/messenger/models/protocol.cljs | 23 - src/messenger/models/user_data.cljs | 28 - src/messenger/omnext.cljs | 74 -- src/messenger/persistence/realm.cljs | 94 -- .../persistence/simple_kv_store.cljs | 26 - src/messenger/protocol/protocol_handler.cljs | 46 - src/messenger/services/contacts.cljs | 84 -- src/messenger/services/navigate_to.cljs | 52 - src/messenger/services/protocol.cljs | 58 -- src/messenger/services/server.cljs | 31 - src/messenger/services/user_data.cljs | 38 - src/messenger/state.cljs | 64 -- src/messenger/utils/crypt.cljs | 17 - src/messenger/utils/event.cljs | 9 - src/messenger/utils/phone_number.cljs | 9 - src/messenger/utils/resources.cljs | 12 - src/messenger/utils/state.cljs | 7 - src/messenger/utils/types.cljs | 9 - src/messenger/utils/utils.cljs | 38 - src/re_natal/support.cljs | 35 - .../src => src}/syng_im/android/core.cljs | 0 .../syng_im/components/action_button.cljs | 0 .../src => src}/syng_im/components/chat.cljs | 0 .../syng_im/components/chat/chat_message.cljs | 0 .../components/chat/chat_message_new.cljs | 0 .../syng_im/components/chat/input/money.cljs | 0 .../components/chat/input/password.cljs | 0 .../syng_im/components/chat/input/phone.cljs | 0 .../components/chat/input/simple_command.cljs | 0 .../components/chat/plain_message_input.cljs | 0 .../syng_im/components/chat/suggestions.cljs | 0 .../components/chats/chat_list_item.cljs | 0 .../syng_im/components/chats/chats_list.cljs | 0 .../syng_im/components/chats/new_group.cljs | 0 .../components/chats/new_group_contact.cljs | 0 .../components/contact_list/contact.cljs | 0 .../contact_list/contact_inner.cljs | 0 .../components/contact_list/contact_list.cljs | 0 .../syng_im/components/icons/ionicons.cljs | 0 .../components/invertible_scroll_view.cljs | 0 .../syng_im/components/item_checkbox.cljs | 0 .../src => src}/syng_im/components/react.cljs | 0 .../src => src}/syng_im/components/realm.cljs | 0 .../syng_im/components/sign_up.cljs | 0 .../syng_im/components/sign_up_confirm.cljs | 0 .../syng_im/components/spinner.cljs | 0 {syng-im/src => src}/syng_im/constants.cljs | 0 {syng-im/src => src}/syng_im/db.cljs | 0 {syng-im/src => src}/syng_im/handlers.cljs | 0 .../syng_im/handlers/commands.cljs | 0 .../syng_im/handlers/contacts.cljs | 0 .../src => src}/syng_im/handlers/server.cljs | 0 .../src => src}/syng_im/handlers/sign_up.cljs | 0 .../syng_im/handlers/suggestions.cljs | 0 {syng-im/src => src}/syng_im/ios/core.cljs | 0 {syng-im/src => src}/syng_im/models/chat.cljs | 0 .../src => src}/syng_im/models/chats.cljs | 0 .../src => src}/syng_im/models/commands.cljs | 0 .../src => src}/syng_im/models/contacts.cljs | 0 .../src => src}/syng_im/models/messages.cljs | 0 .../src => src}/syng_im/models/protocol.cljs | 0 .../src => src}/syng_im/models/user_data.cljs | 0 {syng-im/src => src}/syng_im/navigation.cljs | 0 .../syng_im/persistence/realm.cljs | 0 .../syng_im/persistence/simple_kv_store.cljs | 0 .../syng_im/protocol/protocol_handler.cljs | 0 {syng-im/src => src}/syng_im/resources.cljs | 0 {syng-im/src => src}/syng_im/subs.cljs | 0 {syng-im/src => src}/syng_im/utils/crypt.cljs | 0 {syng-im/src => src}/syng_im/utils/event.cljs | 0 .../src => src}/syng_im/utils/listview.cljs | 0 .../syng_im/utils/phone_number.cljs | 0 {syng-im/src => src}/syng_im/utils/types.cljs | 0 {syng-im/src => src}/syng_im/utils/utils.cljs | 0 syng-im/.flowconfig | 65 -- syng-im/.gitignore | 44 - syng-im/.re-natal | 21 - syng-im/.watchmanconfig | 1 - syng-im/CHANGELOG.md | 24 - syng-im/LICENSE | 214 ---- syng-im/README.md | 14 - syng-im/android/app/build.gradle | 134 --- syng-im/android/app/proguard-rules.pro | 67 -- syng-im/android/app/react.gradle | 96 -- .../android/app/src/main/AndroidManifest.xml | 25 - .../src/main/assets/fonts/Avenir-Roman.ttf | Bin 104588 -> 0 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3418 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2206 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4842 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7718 -> 0 bytes .../app/src/main/res/values/strings.xml | 3 - .../app/src/main/res/values/styles.xml | 8 - syng-im/android/build.gradle | 31 - syng-im/android/gradle.properties | 20 - .../android/gradle/wrapper/gradle-wrapper.jar | Bin 52266 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - syng-im/android/gradlew | 164 --- syng-im/android/gradlew.bat | 90 -- syng-im/android/settings.gradle | 16 - syng-im/doc/intro.md | 3 - syng-im/env/dev/env/android/main.cljs | 18 - syng-im/env/dev/env/ios/main.cljs | 17 - syng-im/env/dev/user.clj | 26 - syng-im/env/prod/env/android/main.cljs | 6 - syng-im/env/prod/env/ios/main.cljs | 6 - syng-im/figwheel-bridge.js | 290 ------ syng-im/images/att.png | Bin 651 -> 0 bytes syng-im/images/delivered.png | Bin 316 -> 0 bytes syng-im/images/logo.png | Bin 526 -> 0 bytes syng-im/images/mic.png | Bin 529 -> 0 bytes syng-im/images/nav-back.png | Bin 985 -> 0 bytes syng-im/images/no-photo.png | Bin 23384 -> 0 bytes syng-im/images/online.png | Bin 307 -> 0 bytes syng-im/images/play.png | Bin 898 -> 0 bytes syng-im/images/seen.png | Bin 284 -> 0 bytes syng-im/images/smile.png | Bin 584 -> 0 bytes .../ios/Messenger.xcodeproj/project.pbxproj | 947 ------------------ .../xcshareddata/xcschemes/Messenger.xcscheme | 115 --- syng-im/ios/Messenger/AppDelegate.h | 16 - syng-im/ios/Messenger/AppDelegate.m | 57 -- .../ios/Messenger/Base.lproj/LaunchScreen.xib | 42 - .../AppIcon.appiconset/Contents.json | 38 - syng-im/ios/Messenger/Info.plist | 47 - syng-im/ios/Messenger/main.m | 22 - syng-im/ios/MessengerTests/Info.plist | 24 - syng-im/ios/MessengerTests/MessengerTests.m | 70 -- syng-im/ios/pom.xml | 38 - syng-im/package.json | 21 - syng-im/project.clj | 47 - syng-im/src/cljsjs/react.cljs | 1 - test/messenger/core_test.clj | 7 - {syng-im/test => test}/syng_im/core_test.clj | 0 189 files changed, 212 insertions(+), 5027 deletions(-) delete mode 100644 android/Messenger.iml delete mode 100644 android/app/app.iml rename {syng-im/android => android}/app/src/main/assets/fonts/Entypo.ttf (100%) rename {syng-im/android => android}/app/src/main/assets/fonts/EvilIcons.ttf (100%) rename {syng-im/android => android}/app/src/main/assets/fonts/FontAwesome.ttf (100%) rename {syng-im/android => android}/app/src/main/assets/fonts/Foundation.ttf (100%) rename {syng-im/android => android}/app/src/main/assets/fonts/Ionicons.ttf (100%) rename {syng-im/android => android}/app/src/main/assets/fonts/MaterialIcons.ttf (100%) rename {syng-im/android => android}/app/src/main/assets/fonts/Octicons.ttf (100%) rename {syng-im/android => android}/app/src/main/assets/fonts/Zocial.ttf (100%) delete mode 100644 android/app/src/main/java/com/messenger/MainActivity.java rename {syng-im/android => android}/app/src/main/java/com/syngim/MainActivity.java (100%) rename {syng-im/images => images}/chat.png (100%) rename {syng-im/images => images}/cljs.png (100%) rename {syng-im/images => images}/cljs@2x.png (100%) rename {syng-im/images => images}/cljs@3x.png (100%) rename {syng-im/images => images}/deliveryfailed.png (100%) rename {syng-im/images => images}/v.png (100%) delete mode 100644 src/cljsjs/react/dom.cljs delete mode 100644 src/messenger/android/core.cljs delete mode 100644 src/messenger/android/login.cljs delete mode 100644 src/messenger/android/sign_up_confirm.cljs delete mode 100644 src/messenger/comm/intercom.cljs delete mode 100644 src/messenger/comm/pubsub.cljs delete mode 100644 src/messenger/comm/services.cljs delete mode 100644 src/messenger/components/chat/chat.cljs delete mode 100644 src/messenger/components/chat/message.cljs delete mode 100644 src/messenger/components/chat/new_message.cljs delete mode 100644 src/messenger/components/contact_list/contact.cljs delete mode 100644 src/messenger/components/contact_list/contact_list.cljs delete mode 100644 src/messenger/components/iname.cljs delete mode 100644 src/messenger/components/invertible-scroll-view.cljs delete mode 100644 src/messenger/components/spinner.cljs delete mode 100644 src/messenger/constants.cljs delete mode 100644 src/messenger/init.cljs delete mode 100644 src/messenger/ios/core.cljs delete mode 100644 src/messenger/models/chat.cljs delete mode 100644 src/messenger/models/contacts.cljs delete mode 100644 src/messenger/models/messages.cljs delete mode 100644 src/messenger/models/navigation.cljs delete mode 100644 src/messenger/models/protocol.cljs delete mode 100644 src/messenger/models/user_data.cljs delete mode 100644 src/messenger/omnext.cljs delete mode 100644 src/messenger/persistence/realm.cljs delete mode 100644 src/messenger/persistence/simple_kv_store.cljs delete mode 100644 src/messenger/protocol/protocol_handler.cljs delete mode 100644 src/messenger/services/contacts.cljs delete mode 100644 src/messenger/services/navigate_to.cljs delete mode 100644 src/messenger/services/protocol.cljs delete mode 100644 src/messenger/services/server.cljs delete mode 100644 src/messenger/services/user_data.cljs delete mode 100644 src/messenger/state.cljs delete mode 100644 src/messenger/utils/crypt.cljs delete mode 100644 src/messenger/utils/event.cljs delete mode 100644 src/messenger/utils/phone_number.cljs delete mode 100644 src/messenger/utils/resources.cljs delete mode 100644 src/messenger/utils/state.cljs delete mode 100644 src/messenger/utils/types.cljs delete mode 100644 src/messenger/utils/utils.cljs delete mode 100644 src/re_natal/support.cljs rename {syng-im/src => src}/syng_im/android/core.cljs (100%) rename {syng-im/src => src}/syng_im/components/action_button.cljs (100%) rename {syng-im/src => src}/syng_im/components/chat.cljs (100%) rename {syng-im/src => src}/syng_im/components/chat/chat_message.cljs (100%) rename {syng-im/src => src}/syng_im/components/chat/chat_message_new.cljs (100%) rename {syng-im/src => src}/syng_im/components/chat/input/money.cljs (100%) rename {syng-im/src => src}/syng_im/components/chat/input/password.cljs (100%) rename {syng-im/src => src}/syng_im/components/chat/input/phone.cljs (100%) rename {syng-im/src => src}/syng_im/components/chat/input/simple_command.cljs (100%) rename {syng-im/src => src}/syng_im/components/chat/plain_message_input.cljs (100%) rename {syng-im/src => src}/syng_im/components/chat/suggestions.cljs (100%) rename {syng-im/src => src}/syng_im/components/chats/chat_list_item.cljs (100%) rename {syng-im/src => src}/syng_im/components/chats/chats_list.cljs (100%) rename {syng-im/src => src}/syng_im/components/chats/new_group.cljs (100%) rename {syng-im/src => src}/syng_im/components/chats/new_group_contact.cljs (100%) rename {syng-im/src => src}/syng_im/components/contact_list/contact.cljs (100%) rename {syng-im/src => src}/syng_im/components/contact_list/contact_inner.cljs (100%) rename {syng-im/src => src}/syng_im/components/contact_list/contact_list.cljs (100%) rename {syng-im/src => src}/syng_im/components/icons/ionicons.cljs (100%) rename {syng-im/src => src}/syng_im/components/invertible_scroll_view.cljs (100%) rename {syng-im/src => src}/syng_im/components/item_checkbox.cljs (100%) rename {syng-im/src => src}/syng_im/components/react.cljs (100%) rename {syng-im/src => src}/syng_im/components/realm.cljs (100%) rename {syng-im/src => src}/syng_im/components/sign_up.cljs (100%) rename {syng-im/src => src}/syng_im/components/sign_up_confirm.cljs (100%) rename {syng-im/src => src}/syng_im/components/spinner.cljs (100%) rename {syng-im/src => src}/syng_im/constants.cljs (100%) rename {syng-im/src => src}/syng_im/db.cljs (100%) rename {syng-im/src => src}/syng_im/handlers.cljs (100%) rename {syng-im/src => src}/syng_im/handlers/commands.cljs (100%) rename {syng-im/src => src}/syng_im/handlers/contacts.cljs (100%) rename {syng-im/src => src}/syng_im/handlers/server.cljs (100%) rename {syng-im/src => src}/syng_im/handlers/sign_up.cljs (100%) rename {syng-im/src => src}/syng_im/handlers/suggestions.cljs (100%) rename {syng-im/src => src}/syng_im/ios/core.cljs (100%) rename {syng-im/src => src}/syng_im/models/chat.cljs (100%) rename {syng-im/src => src}/syng_im/models/chats.cljs (100%) rename {syng-im/src => src}/syng_im/models/commands.cljs (100%) rename {syng-im/src => src}/syng_im/models/contacts.cljs (100%) rename {syng-im/src => src}/syng_im/models/messages.cljs (100%) rename {syng-im/src => src}/syng_im/models/protocol.cljs (100%) rename {syng-im/src => src}/syng_im/models/user_data.cljs (100%) rename {syng-im/src => src}/syng_im/navigation.cljs (100%) rename {syng-im/src => src}/syng_im/persistence/realm.cljs (100%) rename {syng-im/src => src}/syng_im/persistence/simple_kv_store.cljs (100%) rename {syng-im/src => src}/syng_im/protocol/protocol_handler.cljs (100%) rename {syng-im/src => src}/syng_im/resources.cljs (100%) rename {syng-im/src => src}/syng_im/subs.cljs (100%) rename {syng-im/src => src}/syng_im/utils/crypt.cljs (100%) rename {syng-im/src => src}/syng_im/utils/event.cljs (100%) rename {syng-im/src => src}/syng_im/utils/listview.cljs (100%) rename {syng-im/src => src}/syng_im/utils/phone_number.cljs (100%) rename {syng-im/src => src}/syng_im/utils/types.cljs (100%) rename {syng-im/src => src}/syng_im/utils/utils.cljs (100%) delete mode 100644 syng-im/.flowconfig delete mode 100644 syng-im/.gitignore delete mode 100644 syng-im/.re-natal delete mode 100644 syng-im/.watchmanconfig delete mode 100644 syng-im/CHANGELOG.md delete mode 100644 syng-im/LICENSE delete mode 100644 syng-im/README.md delete mode 100644 syng-im/android/app/build.gradle delete mode 100644 syng-im/android/app/proguard-rules.pro delete mode 100644 syng-im/android/app/react.gradle delete mode 100644 syng-im/android/app/src/main/AndroidManifest.xml delete mode 100644 syng-im/android/app/src/main/assets/fonts/Avenir-Roman.ttf delete mode 100644 syng-im/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 syng-im/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 syng-im/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 syng-im/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 syng-im/android/app/src/main/res/values/strings.xml delete mode 100644 syng-im/android/app/src/main/res/values/styles.xml delete mode 100644 syng-im/android/build.gradle delete mode 100644 syng-im/android/gradle.properties delete mode 100644 syng-im/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 syng-im/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 syng-im/android/gradlew delete mode 100644 syng-im/android/gradlew.bat delete mode 100644 syng-im/android/settings.gradle delete mode 100644 syng-im/doc/intro.md delete mode 100644 syng-im/env/dev/env/android/main.cljs delete mode 100644 syng-im/env/dev/env/ios/main.cljs delete mode 100644 syng-im/env/dev/user.clj delete mode 100644 syng-im/env/prod/env/android/main.cljs delete mode 100644 syng-im/env/prod/env/ios/main.cljs delete mode 100644 syng-im/figwheel-bridge.js delete mode 100644 syng-im/images/att.png delete mode 100644 syng-im/images/delivered.png delete mode 100644 syng-im/images/logo.png delete mode 100644 syng-im/images/mic.png delete mode 100644 syng-im/images/nav-back.png delete mode 100755 syng-im/images/no-photo.png delete mode 100644 syng-im/images/online.png delete mode 100644 syng-im/images/play.png delete mode 100644 syng-im/images/seen.png delete mode 100644 syng-im/images/smile.png delete mode 100644 syng-im/ios/Messenger.xcodeproj/project.pbxproj delete mode 100644 syng-im/ios/Messenger.xcodeproj/xcshareddata/xcschemes/Messenger.xcscheme delete mode 100644 syng-im/ios/Messenger/AppDelegate.h delete mode 100644 syng-im/ios/Messenger/AppDelegate.m delete mode 100644 syng-im/ios/Messenger/Base.lproj/LaunchScreen.xib delete mode 100644 syng-im/ios/Messenger/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 syng-im/ios/Messenger/Info.plist delete mode 100644 syng-im/ios/Messenger/main.m delete mode 100644 syng-im/ios/MessengerTests/Info.plist delete mode 100644 syng-im/ios/MessengerTests/MessengerTests.m delete mode 100644 syng-im/ios/pom.xml delete mode 100644 syng-im/package.json delete mode 100644 syng-im/project.clj delete mode 100644 syng-im/src/cljsjs/react.cljs delete mode 100644 test/messenger/core_test.clj rename {syng-im/test => test}/syng_im/core_test.clj (100%) diff --git a/.gitignore b/.gitignore index e333c78a6d..81c8fbfbec 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,7 @@ project.xcworkspace # Android/IJ # .idea -.gradle/ +.gradle local.properties # node.js @@ -41,9 +41,4 @@ target/ # Figwheel # -figwheel_server.log -.nrepl-port - -# Mercurial -.hg/ -.hgignore +figwheel_server.log \ No newline at end of file diff --git a/.re-natal b/.re-natal index 0292c842d3..8fd652b4ea 100644 --- a/.re-natal +++ b/.re-natal @@ -1,17 +1,21 @@ { - "name": "Messenger", - "interface": "om-next", - "androidHost": "localhost", + "name": "SyngIm", + "interface": "reagent", + "androidHost": "10.0.3.2", "modules": [ "react-native-contacts", "react-native-invertible-scroll-view", "awesome-phonenumber", "realm", "react-native-loading-spinner-overlay", - "react-native-i18n" + "react-native-i18n", + "realm/react-native", + "react-native-action-button", + "react-native-vector-icons/Ionicons", + "react-native-circle-checkbox", + "react-native-randombytes" ], "imageDirs": [ "images" - ], - "iosHost": "localhost" + ] } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 175e7e973a..e03cc81c3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. This change ### Changed - Add a new arity to `make-widget-async` to provide a different widget shape. -## [0.1.1] - 2016-02-21 +## [0.1.1] - 2016-03-23 ### Changed - Documentation on how to make the widgets. @@ -15,10 +15,10 @@ All notable changes to this project will be documented in this file. This change ### Fixed - Fixed widget maker to keep working when daylight savings switches over. -## 0.1.0 - 2016-02-21 +## 0.1.0 - 2016-03-23 ### Added - Files from the new template. - Widget maker public API - `make-widget-sync`. -[unreleased]: https://github.com/your-name/messenger/compare/0.1.1...HEAD -[0.1.1]: https://github.com/your-name/messenger/compare/0.1.0...0.1.1 +[unreleased]: https://github.com/your-name/syng-im/compare/0.1.1...HEAD +[0.1.1]: https://github.com/your-name/syng-im/compare/0.1.0...0.1.1 diff --git a/README.md b/README.md index 5bee2ef202..19e1fbc53f 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,14 @@ -# messenger +# syng-im -## Setup +A Clojure library designed to ... well, that part is up to you. -https://github.com/drapanjanas/re-natal +## Usage +FIXME -Can be required after pulling changes: +## License -switching between android device +Copyright © 2016 FIXME -https://github.com/drapanjanas/re-natal#switching-between-android-devices - - -Change `server-address` value at `/src/messenger/android/utils.cljs` - -## Issues - -`Requiring unknown module "react"` - -Solution: https://github.com/exponentjs/react-native-invertible-scroll-view/issues/20 +Distributed under the Eclipse Public License either version 1.0 or (at +your option) any later version. diff --git a/android/Messenger.iml b/android/Messenger.iml deleted file mode 100644 index e848486096..0000000000 --- a/android/Messenger.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/app.iml b/android/app/app.iml deleted file mode 100644 index 87cc7efa47..0000000000 --- a/android/app/app.iml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index 0f84db5236..9f152c2e9b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -26,9 +26,7 @@ import com.android.build.OutputFile * * // whether to bundle JS and assets in another build variant (if configured). * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants - * // The configuration property can be in the following formats - * // 'bundleIn${productFlavor}${buildType}' - * // 'bundleIn${buildType}' + * // The configuration property is in the format 'bundleIn${productFlavor}${buildType}' * // bundleInFreeDebug: true, * // bundleInPaidRelease: true, * // bundleInBeta: true, @@ -62,7 +60,8 @@ import com.android.build.OutputFile apply from: "react.gradle" /** - * Set this to true to create two separate APKs instead of one: + * Set this to true to create three separate APKs instead of one: + * - A universal APK that works on all devices * - An APK that only works on ARM devices * - An APK that only works on x86 devices * The advantage is the size of the APK is reduced by about 4MB. @@ -81,7 +80,7 @@ android { buildToolsVersion "23.0.1" defaultConfig { - applicationId "com.messenger" + applicationId "com.syngim" minSdkVersion 16 targetSdkVersion 22 versionCode 1 @@ -92,9 +91,9 @@ android { } splits { abi { - reset() enable enableSeparateBuildPerCPUArchitecture - universalApk false // If true, also generate a universal APK + universalApk false + reset() include "armeabi-v7a", "x86" } } @@ -120,6 +119,9 @@ android { } dependencies { + compile project(':randombytes') + compile project(':realm') + compile project(':react-native-vector-icons') compile fileTree(dir: "libs", include: ["*.jar"]) compile "com.android.support:appcompat-v7:23.0.1" compile "com.facebook.react:react-native:+" // From node_modules @@ -128,6 +130,5 @@ dependencies { // compile(name:'geth', ext:'aar') compile(group: 'syng-im', name: 'android-geth', version: '1.4.0-201603131817-92d65cf', ext: 'aar') - compile project(":realm") compile fileTree(dir: "node_modules/realm/android/libs", include: ["*.jar"]) } diff --git a/android/app/react.gradle b/android/app/react.gradle index 11a4f8b871..4b43bf910c 100644 --- a/android/app/react.gradle +++ b/android/app/react.gradle @@ -30,20 +30,21 @@ gradle.projectsEvaluated { productFlavors.each { productFlavorName -> buildTypes.each { buildTypeName -> - // Create variant and target names - def targetName = "${productFlavorName.capitalize()}${buildTypeName.capitalize()}" - def targetPath = productFlavorName ? - "${productFlavorName}/${buildTypeName}" : - "${buildTypeName}" + // Create variant and source names + def sourceName = "${buildTypeName}" + def targetName = "${sourceName.capitalize()}" + if (productFlavorName) { + sourceName = "${productFlavorName}${targetName}" + } // React js bundle directories def jsBundleDirConfigName = "jsBundleDir${targetName}" def jsBundleDir = elvisFile(config."$jsBundleDirConfigName") ?: - file("$buildDir/intermediates/assets/${targetPath}") + file("$buildDir/intermediates/assets/${sourceName}") def resourcesDirConfigName = "jsBundleDir${targetName}" def resourcesDir = elvisFile(config."${resourcesDirConfigName}") ?: - file("$buildDir/intermediates/res/merged/${targetPath}") + file("$buildDir/intermediates/res/merged/${sourceName}") def jsBundleFile = file("$jsBundleDir/$bundleAssetName") // Bundle task name for variant @@ -79,9 +80,7 @@ gradle.projectsEvaluated { "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir } - enabled config."bundleIn${targetName}" || - config."bundleIn${buildTypeName.capitalize()}" ?: - targetName.toLowerCase().contains("release") + enabled config."bundleIn${targetName}" ?: targetName.toLowerCase().contains("release") } // Hook bundle${productFlavor}${buildType}JsAndAssets into the android build process diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 6a317b1b0b..c56b2f64b8 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.syngim"> diff --git a/syng-im/android/app/src/main/assets/fonts/Entypo.ttf b/android/app/src/main/assets/fonts/Entypo.ttf similarity index 100% rename from syng-im/android/app/src/main/assets/fonts/Entypo.ttf rename to android/app/src/main/assets/fonts/Entypo.ttf diff --git a/syng-im/android/app/src/main/assets/fonts/EvilIcons.ttf b/android/app/src/main/assets/fonts/EvilIcons.ttf similarity index 100% rename from syng-im/android/app/src/main/assets/fonts/EvilIcons.ttf rename to android/app/src/main/assets/fonts/EvilIcons.ttf diff --git a/syng-im/android/app/src/main/assets/fonts/FontAwesome.ttf b/android/app/src/main/assets/fonts/FontAwesome.ttf similarity index 100% rename from syng-im/android/app/src/main/assets/fonts/FontAwesome.ttf rename to android/app/src/main/assets/fonts/FontAwesome.ttf diff --git a/syng-im/android/app/src/main/assets/fonts/Foundation.ttf b/android/app/src/main/assets/fonts/Foundation.ttf similarity index 100% rename from syng-im/android/app/src/main/assets/fonts/Foundation.ttf rename to android/app/src/main/assets/fonts/Foundation.ttf diff --git a/syng-im/android/app/src/main/assets/fonts/Ionicons.ttf b/android/app/src/main/assets/fonts/Ionicons.ttf similarity index 100% rename from syng-im/android/app/src/main/assets/fonts/Ionicons.ttf rename to android/app/src/main/assets/fonts/Ionicons.ttf diff --git a/syng-im/android/app/src/main/assets/fonts/MaterialIcons.ttf b/android/app/src/main/assets/fonts/MaterialIcons.ttf similarity index 100% rename from syng-im/android/app/src/main/assets/fonts/MaterialIcons.ttf rename to android/app/src/main/assets/fonts/MaterialIcons.ttf diff --git a/syng-im/android/app/src/main/assets/fonts/Octicons.ttf b/android/app/src/main/assets/fonts/Octicons.ttf similarity index 100% rename from syng-im/android/app/src/main/assets/fonts/Octicons.ttf rename to android/app/src/main/assets/fonts/Octicons.ttf diff --git a/syng-im/android/app/src/main/assets/fonts/Zocial.ttf b/android/app/src/main/assets/fonts/Zocial.ttf similarity index 100% rename from syng-im/android/app/src/main/assets/fonts/Zocial.ttf rename to android/app/src/main/assets/fonts/Zocial.ttf diff --git a/android/app/src/main/java/com/messenger/MainActivity.java b/android/app/src/main/java/com/messenger/MainActivity.java deleted file mode 100644 index e5716b31ca..0000000000 --- a/android/app/src/main/java/com/messenger/MainActivity.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.messenger; - -import com.facebook.react.ReactActivity; -import com.facebook.react.ReactPackage; -import com.facebook.react.shell.MainReactPackage; -import com.rt2zz.reactnativecontacts.ReactNativeContacts; -import android.os.Bundle; -import android.os.Environment; -import com.github.ethereum.go_ethereum.cmd.Geth; - -import java.util.Arrays; -import java.util.List; -import java.util.Properties; -import java.io.File; - -import com.i18n.reactnativei18n.ReactNativeI18n; -import io.realm.react.RealmReactPackage; - - -public class MainActivity extends ReactActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // Required for android-16 (???) - System.loadLibrary("gethraw"); - System.loadLibrary("geth"); - - // Required because of crazy APN settings redirecting localhost - Properties properties = System.getProperties(); - properties.setProperty("http.nonProxyHosts", "localhost|127.0.0.1"); - properties.setProperty("https.nonProxyHosts", "localhost|127.0.0.1"); - - File extStore = Environment.getExternalStorageDirectory(); - - final String dataFolder = extStore.exists() ? - extStore.getAbsolutePath() : - getApplicationInfo().dataDir; - - // Launch! - new Thread(new Runnable() { - public void run() { - Geth.run("--bootnodes enode://e2f28126720452aa82f7d3083e49e6b3945502cb94d9750a15e27ee310eed6991618199f878e5fbc7dfa0e20f0af9554b41f491dc8f1dbae8f0f2d37a3a613aa@139.162.13.89:30303 --shh --ipcdisable --nodiscover --rpc --rpcapi db,eth,net,web3,shh --fast --datadir=" + dataFolder); - } - }).start(); - } - - /** - * Returns the name of the main component registered from JavaScript. - * This is used to schedule rendering of the component. - */ - @Override - protected String getMainComponentName() { - return "Messenger"; - } - - /** - * Returns whether dev mode should be enabled. - * This enables e.g. the dev menu. - */ - @Override - protected boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } - - /** - * A list of packages used by the app. If the app uses additional views - * or modules besides the default ones, add more packages here. - */ - @Override - protected List getPackages() { - return Arrays.asList( - new MainReactPackage(), - new ReactNativeContacts(), - new ReactNativeI18n(), - new RealmReactPackage() - ); - } -} diff --git a/syng-im/android/app/src/main/java/com/syngim/MainActivity.java b/android/app/src/main/java/com/syngim/MainActivity.java similarity index 100% rename from syng-im/android/app/src/main/java/com/syngim/MainActivity.java rename to android/app/src/main/java/com/syngim/MainActivity.java diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 1f2549cd7e..7b66980444 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,3 +1,3 @@ - Messenger + SyngIm diff --git a/android/settings.gradle b/android/settings.gradle index 97921ba2db..784925e19a 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,4 @@ -rootProject.name = 'Messenger' +rootProject.name = 'SyngIm' include ':app' @@ -8,5 +8,9 @@ project(':react-native-contacts').projectDir = new File(settingsDir, '../node_mo include ':react-native-i18n' project(':react-native-i18n').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-i18n/android') // realm dependency +include ':react-native-vector-icons' +project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') include ':realm' project(':realm').projectDir = new File(rootProject.projectDir, '../node_modules/realm/android') +include ':randombytes' +project(':randombytes').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-randombytes/app') \ No newline at end of file diff --git a/doc/intro.md b/doc/intro.md index 7819a85571..7a0eb4e81c 100644 --- a/doc/intro.md +++ b/doc/intro.md @@ -1,3 +1,3 @@ -# Introduction to messenger +# Introduction to syng-im TODO: write [great documentation](http://jacobian.org/writing/what-to-write/) diff --git a/env/dev/env/android/main.cljs b/env/dev/env/android/main.cljs index b4a8bf350b..2348604c4a 100644 --- a/env/dev/env/android/main.cljs +++ b/env/dev/env/android/main.cljs @@ -1,16 +1,18 @@ -(ns ^:figwheel-no-load env.android.main - (:require [om.next :as om] - [messenger.android.core :as core] - [messenger.omnext :as omnext] - [figwheel.client :as figwheel :include-macros true])) + (ns ^:figwheel-no-load env.android.main + (:require [reagent.core :as r] + [syng-im.android.core :refer [app-root]] + [figwheel.client :as figwheel :include-macros true] + [syng-im.android.core :as core])) -(enable-console-print!) + (enable-console-print!) + +(def cnt (r/atom 0)) +(defn reloader [] @cnt [app-root]) +(def root-el (r/as-element [reloader])) (figwheel/watch-and-reload - :websocket-url "ws://localhost:3449/figwheel-ws" - :heads-up-display true - :jsload-callback #(om/add-root! omnext/reconciler core/AppRoot 1)) + :websocket-url "ws://10.0.3.2:3449/figwheel-ws" + :heads-up-display true + :jsload-callback #(swap! cnt inc)) -(core/init) - -(def root-el (core/app-root)) \ No newline at end of file +(core/init) \ No newline at end of file diff --git a/env/dev/env/ios/main.cljs b/env/dev/env/ios/main.cljs index dda2c4aeae..748936a414 100644 --- a/env/dev/env/ios/main.cljs +++ b/env/dev/env/ios/main.cljs @@ -1,16 +1,17 @@ -(ns ^:figwheel-no-load env.ios.main - (:require [om.next :as om] - [messenger.ios.core :as core] - [messenger.omnext :as omnext] + (ns ^:figwheel-no-load env.ios.main + (:require [reagent.core :as r] + [syng-im.ios.core :as core] [figwheel.client :as figwheel :include-macros true])) -(enable-console-print!) + (enable-console-print!) + +(def cnt (r/atom 0)) +(defn reloader [] @cnt [core/app-root]) +(def root-el (r/as-element [reloader])) (figwheel/watch-and-reload - :websocket-url "ws://localhost:3449/figwheel-ws" - :heads-up-display true - :jsload-callback #(om/add-root! omnext/reconciler core/AppRoot 1)) + :websocket-url "ws://localhost:3449/figwheel-ws" + :heads-up-display true + :jsload-callback #(swap! cnt inc)) -(core/init) - -(def root-el (core/app-root)) \ No newline at end of file +(core/init) \ No newline at end of file diff --git a/env/prod/env/android/main.cljs b/env/prod/env/android/main.cljs index a669d4b06f..f112100ec7 100644 --- a/env/prod/env/android/main.cljs +++ b/env/prod/env/android/main.cljs @@ -1,4 +1,6 @@ -(ns env.android.main - (:require [messenger.android.core :as core])) + (ns env.android.main + (:require [syng-im.android.core :as core])) + + (core/init) + -(core/init) \ No newline at end of file diff --git a/env/prod/env/ios/main.cljs b/env/prod/env/ios/main.cljs index 970116e404..11392b5e72 100644 --- a/env/prod/env/ios/main.cljs +++ b/env/prod/env/ios/main.cljs @@ -1,4 +1,6 @@ -(ns env.ios.main - (:require [messenger.ios.core :as core])) + (ns env.ios.main + (:require [syng-im.ios.core :as core])) + + (core/init) + -(core/init) \ No newline at end of file diff --git a/syng-im/images/chat.png b/images/chat.png similarity index 100% rename from syng-im/images/chat.png rename to images/chat.png diff --git a/syng-im/images/cljs.png b/images/cljs.png similarity index 100% rename from syng-im/images/cljs.png rename to images/cljs.png diff --git a/syng-im/images/cljs@2x.png b/images/cljs@2x.png similarity index 100% rename from syng-im/images/cljs@2x.png rename to images/cljs@2x.png diff --git a/syng-im/images/cljs@3x.png b/images/cljs@3x.png similarity index 100% rename from syng-im/images/cljs@3x.png rename to images/cljs@3x.png diff --git a/syng-im/images/deliveryfailed.png b/images/deliveryfailed.png similarity index 100% rename from syng-im/images/deliveryfailed.png rename to images/deliveryfailed.png diff --git a/syng-im/images/v.png b/images/v.png similarity index 100% rename from syng-im/images/v.png rename to images/v.png diff --git a/ios/Messenger.xcodeproj/project.pbxproj b/ios/Messenger.xcodeproj/project.pbxproj index 664e54be92..2780f9a5f1 100644 --- a/ios/Messenger.xcodeproj/project.pbxproj +++ b/ios/Messenger.xcodeproj/project.pbxproj @@ -5,7 +5,6 @@ }; objectVersion = 46; objects = { - /* Begin PBXBuildFile section */ 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; @@ -25,6 +24,19 @@ E343FE8E1C96F54100C01DB5 /* libRNI18n.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E343FE8B1C96F4E200C01DB5 /* libRNI18n.a */; }; E343FE8F1C96F54A00C01DB5 /* libRCTContacts.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E343FE841C96F4DA00C01DB5 /* libRCTContacts.a */; }; E343FE911C971D4200C01DB5 /* Geth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E343FE901C971D4200C01DB5 /* Geth.framework */; }; + 5F301739E81C4A7B92E80915 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1429DFB76DE749D59880DD64 /* libRNVectorIcons.a */; }; + 2171A55FE83747678065F72A /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 93C8E68B46DA4C0A98C39F9D /* Entypo.ttf */; }; + BDF23426F8854AC2A0416A03 /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 38E7B297EE0748008056796A /* EvilIcons.ttf */; }; + 221509FA6D5443C0B5215C52 /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2CF9FE7E98A3454D980A0BED /* FontAwesome.ttf */; }; + A33AC3EAFBC04C0B93BD2EC4 /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5A831378BBA14830A9540B8C /* Foundation.ttf */; }; + 1A4121618C94428C9F0DF1FE /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5F085711AC4A4BA3887A4655 /* Ionicons.ttf */; }; + 59FCD4F0208949BE80CC72BF /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0063E967269B49EE80DC3A77 /* MaterialIcons.ttf */; }; + 4452A93C123F4392A99A7719 /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A74F40BECFF8439FB1F41D8A /* Octicons.ttf */; }; + 1AE91A3E2C1A43EFA90C1CD7 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BCEC948817B84597AC493C0B /* Zocial.ttf */; }; + 34535F62E77D4A75A25E2981 /* libRNRandomBytes.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2925028DE4684DDAAA7389D7 /* libRNRandomBytes.a */; }; + 97BD21CBE96A4223B253A1E2 /* libRealmReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B29C182EE0942C889049F91 /* libRealmReact.a */; }; + 22802A9C745148D885F0AA01 /* libc++.tbd in Resources */ = {isa = PBXBuildFile; fileRef = 8003209F13C24D35AABD3933 /* libc++.tbd */; }; + 50EE6BCC6F1A48BBA1BDB893 /* libz.tbd in Resources */ = {isa = PBXBuildFile; fileRef = 313A77B1D7804DBDBE6FF6F5 /* libz.tbd */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -153,6 +165,22 @@ E343FE7F1C96F4DA00C01DB5 /* RCTContacts.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTContacts.xcodeproj; path = "../node_modules/react-native-contacts/ios/RCTContacts.xcodeproj"; sourceTree = ""; }; E343FE851C96F4E200C01DB5 /* RNI18n.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNI18n.xcodeproj; path = "../node_modules/react-native-i18n/RNI18n.xcodeproj"; sourceTree = ""; }; E343FE901C971D4200C01DB5 /* Geth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Geth.framework; path = target/Frameworks/Geth.framework; sourceTree = ""; }; + F04672B9D3824B768FCF6F71 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; name = "RNVectorIcons.xcodeproj"; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; + 1429DFB76DE749D59880DD64 /* libRNVectorIcons.a */ = {isa = PBXFileReference; name = "libRNVectorIcons.a"; path = "libRNVectorIcons.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; + 93C8E68B46DA4C0A98C39F9D /* Entypo.ttf */ = {isa = PBXFileReference; name = "Entypo.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 38E7B297EE0748008056796A /* EvilIcons.ttf */ = {isa = PBXFileReference; name = "EvilIcons.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 2CF9FE7E98A3454D980A0BED /* FontAwesome.ttf */ = {isa = PBXFileReference; name = "FontAwesome.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 5A831378BBA14830A9540B8C /* Foundation.ttf */ = {isa = PBXFileReference; name = "Foundation.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 5F085711AC4A4BA3887A4655 /* Ionicons.ttf */ = {isa = PBXFileReference; name = "Ionicons.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 0063E967269B49EE80DC3A77 /* MaterialIcons.ttf */ = {isa = PBXFileReference; name = "MaterialIcons.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + A74F40BECFF8439FB1F41D8A /* Octicons.ttf */ = {isa = PBXFileReference; name = "Octicons.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + BCEC948817B84597AC493C0B /* Zocial.ttf */ = {isa = PBXFileReference; name = "Zocial.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 06F26555B4054594966B6B08 /* RNRandomBytes.xcodeproj */ = {isa = PBXFileReference; name = "RNRandomBytes.xcodeproj"; path = "../node_modules/react-native-randombytes/RNRandomBytes.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; + 2925028DE4684DDAAA7389D7 /* libRNRandomBytes.a */ = {isa = PBXFileReference; name = "libRNRandomBytes.a"; path = "libRNRandomBytes.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; + 0D4A52AE301842E1B2533BD3 /* RealmReact.xcodeproj */ = {isa = PBXFileReference; name = "RealmReact.xcodeproj"; path = "../node_modules/realm/react-native/ios/RealmReact.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; + 2B29C182EE0942C889049F91 /* libRealmReact.a */ = {isa = PBXFileReference; name = "libRealmReact.a"; path = "libRealmReact.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; + 8003209F13C24D35AABD3933 /* libc++.tbd */ = {isa = PBXFileReference; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; fileEncoding = undefined; lastKnownFileType = sourcecode.text-based-dylib-definition; explicitFileType = undefined; includeInIndex = 0; }; + 313A77B1D7804DBDBE6FF6F5 /* libz.tbd */ = {isa = PBXFileReference; name = "libz.tbd"; path = "usr/lib/libz.tbd"; sourceTree = SDKROOT; fileEncoding = undefined; lastKnownFileType = sourcecode.text-based-dylib-definition; explicitFileType = undefined; includeInIndex = 0; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -180,6 +208,11 @@ 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, + 5F301739E81C4A7B92E80915 /* libRNVectorIcons.a in Frameworks */, + 34535F62E77D4A75A25E2981 /* libRNRandomBytes.a in Frameworks */, + 97BD21CBE96A4223B253A1E2 /* libRealmReact.a in Frameworks */, + 22802A9C745148D885F0AA01 /* libc++.tbd in Resources */, + 50EE6BCC6F1A48BBA1BDB893 /* libz.tbd in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -304,6 +337,9 @@ 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, + F04672B9D3824B768FCF6F71 /* RNVectorIcons.xcodeproj */, + 06F26555B4054594966B6B08 /* RNRandomBytes.xcodeproj */, + 0D4A52AE301842E1B2533BD3 /* RealmReact.xcodeproj */, ); name = Libraries; sourceTree = ""; @@ -324,6 +360,7 @@ 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* MessengerTests */, 83CBBA001A601CBA00E9B192 /* Products */, + A72CA0FB822D450E98649ACB /* Resources */, ); indentWidth = 2; sourceTree = ""; @@ -359,10 +396,28 @@ isa = PBXGroup; children = ( E343FE901C971D4200C01DB5 /* Geth.framework */, + 8003209F13C24D35AABD3933 /* libc++.tbd */, + 313A77B1D7804DBDBE6FF6F5 /* libz.tbd */, ); name = Frameworks; sourceTree = ""; }; + A72CA0FB822D450E98649ACB /* Resources */ = { + isa = PBXGroup; + children = ( + 93C8E68B46DA4C0A98C39F9D /* Entypo.ttf */, + 38E7B297EE0748008056796A /* EvilIcons.ttf */, + 2CF9FE7E98A3454D980A0BED /* FontAwesome.ttf */, + 5A831378BBA14830A9540B8C /* Foundation.ttf */, + 5F085711AC4A4BA3887A4655 /* Ionicons.ttf */, + 0063E967269B49EE80DC3A77 /* MaterialIcons.ttf */, + A74F40BECFF8439FB1F41D8A /* Octicons.ttf */, + BCEC948817B84597AC493C0B /* Zocial.ttf */, + ); + name = Resources; + path = ""; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -408,7 +463,7 @@ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0720; + LastUpgradeCheck = 720; ORGANIZATIONNAME = Facebook; TargetAttributes = { 00E356ED1AD99517003FC87E = { @@ -594,6 +649,14 @@ files = ( 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, + 2171A55FE83747678065F72A /* Entypo.ttf in Resources */, + BDF23426F8854AC2A0416A03 /* EvilIcons.ttf in Resources */, + 221509FA6D5443C0B5215C52 /* FontAwesome.ttf in Resources */, + A33AC3EAFBC04C0B93BD2EC4 /* Foundation.ttf in Resources */, + 1A4121618C94428C9F0DF1FE /* Ionicons.ttf in Resources */, + 59FCD4F0208949BE80CC72BF /* MaterialIcons.ttf in Resources */, + 4452A93C123F4392A99A7719 /* Octicons.ttf in Resources */, + 1AE91A3E2C1A43EFA90C1CD7 /* Zocial.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -675,6 +738,11 @@ PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Messenger.app/Messenger"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); }; name = Debug; }; @@ -693,6 +761,11 @@ PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Messenger.app/Messenger"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); }; name = Release; }; @@ -709,6 +782,9 @@ "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, "$(SRCROOT)/../node_modules/react-native/React/**", + "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", + "$(SRCROOT)/../node_modules/react-native-randombytes", + "$(SRCROOT)/../node_modules/realm/src/**", ); INFOPLIST_FILE = Messenger/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -730,6 +806,9 @@ "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, "$(SRCROOT)/../node_modules/react-native/React/**", + "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", + "$(SRCROOT)/../node_modules/react-native-randombytes", + "$(SRCROOT)/../node_modules/realm/src/**", ); INFOPLIST_FILE = Messenger/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -778,6 +857,9 @@ "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, "$(SRCROOT)/../node_modules/react-native/React/**", + "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", + "$(SRCROOT)/../node_modules/react-native-randombytes", + "$(SRCROOT)/../node_modules/realm/src/**", ); IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; @@ -818,6 +900,9 @@ "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, "$(SRCROOT)/../node_modules/react-native/React/**", + "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", + "$(SRCROOT)/../node_modules/react-native-randombytes", + "$(SRCROOT)/../node_modules/realm/src/**", ); IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; diff --git a/package.json b/package.json index 5d383198ef..f069c032a4 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "Messenger", + "name": "SyngIm", "version": "0.0.1", "private": true, "scripts": { @@ -8,10 +8,14 @@ "dependencies": { "awesome-phonenumber": "^1.0.12", "react-native": "^0.22.0", + "react-native-action-button": "^1.1.3", + "react-native-circle-checkbox": "^0.1.3", "react-native-contacts": "^0.2.1", "react-native-i18n": "0.0.8", "react-native-invertible-scroll-view": "^0.2.0", "react-native-loading-spinner-overlay": "0.0.6", - "realm": "^0.10.0" + "react-native-randombytes": "^2.0.0", + "react-native-vector-icons": "^1.3.3", + "realm": "^0.11.0" } } diff --git a/project.clj b/project.clj index e03925f130..37ed02bf72 100644 --- a/project.clj +++ b/project.clj @@ -1,13 +1,15 @@ -(defproject messenger "0.1.0-SNAPSHOT" +(defproject syng-im "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.7.0"] [org.clojure/clojurescript "1.7.170"] - [org.omcljs/om "1.0.0-alpha30" :exclusions [cljsjs/react cljsjs/react-dom]] - [natal-shell "0.1.6"] - [syng-im/protocol "0.1.1"]] + [reagent "0.5.1" :exclusions [cljsjs/react]] + [re-frame "0.6.0"] + [prismatic/schema "1.0.4"] + [syng-im/protocol "0.1.1"] + [natal-shell "0.1.6"]] :plugins [[lein-cljsbuild "1.1.1"] [lein-figwheel "0.5.0-2"]] :clean-targets ["target/" "index.ios.js" "index.android.js"] @@ -16,32 +18,30 @@ ["with-profile" "prod" "cljsbuild" "once" "ios"] ["with-profile" "prod" "cljsbuild" "once" "android"]]} :figwheel {:nrepl-port 7888} - :profiles - {:dev {:dependencies [[figwheel-sidecar "0.5.0-2"] - [com.cemerick/piggieback "0.2.1"]] - :source-paths ["src" "env/dev"] - :cljsbuild {:builds - {:ios {:source-paths ["src" "env/dev"] - :figwheel true - :compiler {:output-to "target/ios/not-used.js" - :main "env.ios.main" - :output-dir "target/ios" - :optimizations :none}} - :android {:source-paths ["src" "env/dev"] - :figwheel true - :compiler {:output-to "target/android/not-used.js" - :main "env.android.main" - :output-dir "target/android" - :optimizations :none}}}} - :repl-options {:nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}} - :prod {:cljsbuild {:builds - {:ios {:source-paths ["src" "env/prod"] - :compiler {:output-to "index.ios.js" - :main "env.ios.main" - :output-dir "target/ios" - :optimizations :simple}} - :android {:source-paths ["src" "env/prod"] - :compiler {:output-to "index.android.js" - :main "env.android.main" - :output-dir "target/android" - :optimizations :simple}}}}}}) + :profiles {:dev {:dependencies [[figwheel-sidecar "0.5.0-2"] + [com.cemerick/piggieback "0.2.1"]] + :source-paths ["src" "env/dev"] + :cljsbuild {:builds {:ios {:source-paths ["src" "env/dev"] + :figwheel true + :compiler {:output-to "target/ios/not-used.js" + :main "env.ios.main" + :output-dir "target/ios" + :optimizations :none}} + :android {:source-paths ["src" "env/dev"] + :figwheel true + :compiler {:output-to "target/android/not-used.js" + :main "env.android.main" + :output-dir "target/android" + :optimizations :none}}}} + :repl-options {:nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}} + :prod {:cljsbuild {:builds {:ios {:source-paths ["src" "env/prod"] + :compiler {:output-to "index.ios.js" + :main "env.ios.main" + :output-dir "target/ios" + :optimizations :simple}} + :android {:source-paths ["src" "env/prod"] + :compiler {:output-to "index.android.js" + :main "env.android.main" + :output-dir "target/android" + :optimizations :simple}}}} + }}) \ No newline at end of file diff --git a/src/cljsjs/react/dom.cljs b/src/cljsjs/react/dom.cljs deleted file mode 100644 index 3c69f0090f..0000000000 --- a/src/cljsjs/react/dom.cljs +++ /dev/null @@ -1 +0,0 @@ -(ns cljsjs.react.dom) \ No newline at end of file diff --git a/src/messenger/android/core.cljs b/src/messenger/android/core.cljs deleted file mode 100644 index 36aecbaf64..0000000000 --- a/src/messenger/android/core.cljs +++ /dev/null @@ -1,79 +0,0 @@ -(ns messenger.android.core - (:require-macros - [natal-shell.components :refer [navigator view text image touchable-highlight - list-view toolbar-android]] - [natal-shell.data-source :refer [data-source clone-with-rows]] - [natal-shell.back-android :refer [add-event-listener remove-event-listener]] - [natal-shell.core :refer [with-error-view]] - [natal-shell.alert :refer [alert]]) - (:require [om.next :as om :refer-macros [defui]] - [re-natal.support :as sup] - [messenger.omnext :as omnext] - [messenger.state :as state] - [messenger.utils.utils :refer [log toast]] - [messenger.android.login :refer [login Login]] - [messenger.comm.pubsub :as pubsub] - [messenger.comm.intercom :as intercom :refer [load-user-phone-number]] - [messenger.protocol.protocol-handler :refer [make-handler]] - [messenger.init :refer [init-simple-store]] - [messenger.components.chat.chat :as chat] - [syng-im.protocol.api :refer [init-protocol]] - [syng-im.utils.logging :as log] - [messenger.components.iname :as in] - [messenger.models.navigation :as n] - [messenger.components.contact-list.contact-list :refer [ContactList contact-list]])) - - -(def app-registry (.-AppRegistry js/React)) - -(def back-button-handler-atom (atom {:nav nil - :handler nil})) - -(defn init-back-button-handler! [nav] - (let [back-button-handler @back-button-handler-atom] - (when (not= (:nav back-button-handler) nav) - (remove-event-listener "hardwareBackPress" (:handler back-button-handler)) - (let [new-listener (fn [] - (binding [state/*nav-render* false] - (when (< 1 (.-length (.getCurrentRoutes nav))) - (.pop nav) - true)))] - (reset! back-button-handler-atom {:nav nav - :handler new-listener}) - (add-event-listener "hardwareBackPress" new-listener))))) - -(defui AppRoot - static om/IQuery - (query [this] - (let [component (n/current-screen-class)] - [{(in/get-name component) (om/get-query component)}])) - Object - (render [this] - (log/debug "APPROOT Rendering") - (navigator - {:initialRoute {:component contact-list} - :renderScene (fn [route nav] - (log/debug "RENDER SCENE") - (when state/*nav-render* - (init-back-button-handler! nav) - (let [{:keys [component]} (js->clj route :keywordize-keys true) - props (om/props this) - props (om/computed props {:nav nav})] - (component props))))}))) - -;; TODO to service? -(swap! state/app-state assoc :contacts-ds - (data-source {:rowHasChanged (fn [row1 row2] - (not= row1 row2))})) - -(defonce RootNode (sup/root-node! 1)) -(defonce app-root (om/factory RootNode)) - -(defn init [] - (n/set-current-screen-class ContactList) - (init-simple-store) - (pubsub/setup-pub-sub) - (init-protocol (make-handler)) - (load-user-phone-number) - (om/add-root! omnext/reconciler AppRoot 1) - (.registerComponent app-registry "Messenger" (fn [] app-root))) diff --git a/src/messenger/android/login.cljs b/src/messenger/android/login.cljs deleted file mode 100644 index a01d89538c..0000000000 --- a/src/messenger/android/login.cljs +++ /dev/null @@ -1,83 +0,0 @@ -(ns messenger.android.login - (:require-macros - [natal-shell.components :refer [view text image touchable-highlight list-view - toolbar-android text-input]] - [natal-shell.core :refer [with-error-view]]) - (:require [om.next :as om :refer-macros [defui]] - [re-natal.support :as sup] - [messenger.state :as state] - [messenger.comm.intercom :as intercom :refer [set-user-phone-number]] - [messenger.utils.utils :refer [log toast http-post]] - [messenger.utils.phone-number :refer [format-phone-number]] - [messenger.utils.resources :as res] - [messenger.components.spinner :refer [spinner]] - [messenger.android.sign-up-confirm :refer [sign-up-confirm]] - [messenger.constants :refer [ethereum-rpc-url]] - [messenger.components.iname :as in])) - -(def nav-atom (atom nil)) - -(defn show-confirm-view [] - (swap! state/app-state assoc :loading false) - (intercom/show-signup-confirm @nav-atom)) - -(defn sign-up [] - (swap! state/app-state assoc :loading true) - (let [app-state (state/state) - phone-number (:user-phone-number app-state) - whisper-identity (:public (:user-identity app-state))] - (intercom/sign-up phone-number whisper-identity show-confirm-view))) - -(defn update-phone-number [value] - (let [formatted (format-phone-number value)] - (set-user-phone-number formatted))) - -(defui Login - static in/IName - (get-name [this] - :login/login) - static om/IQuery - (query [this] - '[:user-phone-number :user-identity :loading]) - Object - (render [this] - (let [{{:keys [user-phone-number user-identity loading]} :login/login} (om/props this) - {:keys [nav]} (om/get-computed this)] - (reset! nav-atom nav) - (view - {:style {:flex 1}} - (view - {:style {:flex 1 - :backgroundColor "white"}} - (toolbar-android {:logo res/logo-icon - :title "Login" - :titleColor "#4A5258" - :style {:backgroundColor "white" - :height 56 - :elevation 2}}) - (view {:style { ;; :alignItems "center" - }} - (text-input {:underlineColorAndroid "#9CBFC0" - :placeholder "Enter your phone number" - :keyboardType "phone-pad" - :onChangeText (fn [value] - (update-phone-number value)) - :style {:flex 1 - :marginHorizontal 18 - :lineHeight 42 - :fontSize 14 - :fontFamily "Avenir-Roman" - :color "#9CBFC0"}} - user-phone-number) - (touchable-highlight {:onPress #(sign-up) - :style {:alignSelf "center" - :borderRadius 7 - :backgroundColor "#E5F5F6" - :width 100}} - (text {:style {:marginVertical 10 - :textAlign "center"}} - "Sign up")))) - (when (or loading (not user-identity)) - (spinner {:visible true})))))) - -(def login (om/factory Login)) diff --git a/src/messenger/android/sign_up_confirm.cljs b/src/messenger/android/sign_up_confirm.cljs deleted file mode 100644 index b5d3e7f5b3..0000000000 --- a/src/messenger/android/sign_up_confirm.cljs +++ /dev/null @@ -1,108 +0,0 @@ -(ns messenger.android.sign-up-confirm - (:require-macros - [natal-shell.components :refer [view text image touchable-highlight list-view - toolbar-android text-input]] - [natal-shell.async-storage :refer [get-item set-item]] - [natal-shell.core :refer [with-error-view]] - [natal-shell.alert :refer [alert]]) - (:require [om.next :as om :refer-macros [defui]] - [re-natal.support :as sup] - [messenger.state :as state] - [messenger.utils.utils :refer [log toast]] - [messenger.utils.resources :as res] - [messenger.components.spinner :refer [spinner]] - [messenger.components.contact-list.contact-list :refer [contact-list]] - [messenger.comm.intercom :as intercom :refer [set-confirmation-code]] - [messenger.components.iname :as in])) - -(def nav-atom (atom nil)) - -(defn show-home-view [] - (swap! state/app-state assoc :loading false) - (intercom/show-contacts @nav-atom)) - -(defn sync-contacts [] - (intercom/sync-contacts show-home-view)) - -(defn on-send-code-response [body] - (log body) - (toast (if (:confirmed body) - "Confirmed" - "Wrong code")) - (when (:confirmed body) - ;; TODO user action required - (sync-contacts))) - -(defn code-valid? [code] - (= 4 (count code))) - -(defn send-code [code] - (when (code-valid? code) - (swap! state/app-state assoc :loading true) - (intercom/sign-up-confirm code on-send-code-response))) - -(defn update-code [value] - (let [formatted value] - (set-confirmation-code formatted))) - -(defui SignUpConfirm - static in/IName - (get-name [this] - :signup/confirm) - static om/IQuery - (query [this] - '[:confirmation-code :loading]) - Object - (render - [this] - (let [{{:keys [confirmation-code loading]} :signup/confirm} (om/props this) - {:keys [nav]} (om/get-computed this)] - (reset! nav-atom nav) - (view - {:style {:flex 1}} - (view - {:style {:flex 1 - :backgroundColor "white"}} - (toolbar-android {:logo res/logo-icon - :title "Confirm" - :titleColor "#4A5258" - :style {:backgroundColor "white" - :height 56 - :elevation 2}}) - (view {} - (text-input {:underlineColorAndroid "#9CBFC0" - :placeholder "Enter confirmation code" - :keyboardType "number-pad" - :maxLength 4 - :onChangeText (fn [value] - (update-code value)) - :style {:flex 1 - :marginHorizontal 18 - :lineHeight 42 - :fontSize 14 - :fontFamily "Avenir-Roman" - :color "#9CBFC0"}} - confirmation-code) - (if (code-valid? confirmation-code) - (touchable-highlight - {:onPress #(send-code confirmation-code) - :style {:alignSelf "center" - :borderRadius 7 - :backgroundColor "#E5F5F6" - - :width 100}} - (text {:style {:marginVertical 10 - :textAlign "center"}} - "Confirm")) - (view - {:style {:alignSelf "center" - :borderRadius 7 - :backgroundColor "#AAB2B2" - :width 100}} - (text {:style {:marginVertical 10 - :textAlign "center"}} - "Confirm"))))) - (when loading - (spinner {:visible true})))))) - -(def sign-up-confirm (om/factory SignUpConfirm)) diff --git a/src/messenger/comm/intercom.cljs b/src/messenger/comm/intercom.cljs deleted file mode 100644 index 4982716565..0000000000 --- a/src/messenger/comm/intercom.cljs +++ /dev/null @@ -1,75 +0,0 @@ -(ns messenger.comm.intercom - (:require [cljs.core.async :as async :refer [put!]] - [messenger.state :refer [state - pub-sub-publisher]] - [syng-im.utils.logging :as log])) - -(defn publish! [topic message] - (let [publisher (->> (state) - (pub-sub-publisher))] - (put! publisher [topic message]))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; user data - -(defn set-user-phone-number [phone-number] - (publish! :service [:user-data :user-data/set-phone-number phone-number])) - -(defn save-user-phone-number [phone-number] - (publish! :service [:user-data :user-data/save-phone-number phone-number])) - -(defn load-user-phone-number [] - ;; :service [service_name action_id args_map] - (publish! :service [:user-data :user-data/load-phone-number nil])) - -(defn set-confirmation-code [confirmation-code] - (publish! :service [:user-data :user-data/set-confirmation-code confirmation-code])) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; server - -(defn sign-up [phone-number whisper-identity handler] - (publish! :service [:server :server/sign-up {:phone-number phone-number - :whisper-identity whisper-identity - :handler handler}])) - -(defn sign-up-confirm [confirmation-code handler] - (publish! :service [:server :server/sign-up-confirm - {:confirmation-code confirmation-code - :handler handler}])) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; contacts - -(defn load-syng-contacts [] - (publish! :service [:contacts :contacts/load-syng-contacts nil])) - -(defn sync-contacts [handler] - (publish! :service [:contacts :contacts/sync-contacts handler])) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; protocol - -(defn protocol-initialized [identity] - (publish! :service [:protocol :protocol/initialized {:identity identity}])) - -(defn save-new-msg [msg] - (publish! :service [:protocol :protocol/save-new-msg {:msg msg}])) - -(defn send-msg [chat-id text] - (publish! :service [:protocol :protocol/send-msg {:chat-id chat-id - :text text}])) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; navigate-to - -(defn show-chat [navigator chat-id] - (publish! :service [:navigate-to :scene/chat {:chat-id chat-id - :navigator navigator}])) - -(defn show-signup-confirm [navigator] - (publish! :service [:navigate-to :scene/signup-confirm {:navigator navigator}])) - -(defn show-contacts [navigator] - (publish! :service [:navigate-to :scene/contacts {:navigator navigator}])) diff --git a/src/messenger/comm/pubsub.cljs b/src/messenger/comm/pubsub.cljs deleted file mode 100644 index 7ddc74b640..0000000000 --- a/src/messenger/comm/pubsub.cljs +++ /dev/null @@ -1,33 +0,0 @@ -(ns messenger.comm.pubsub - (:require-macros [cljs.core.async.macros :refer [go alt!]]) - (:require [cljs.core.async :as async :refer [chan pub sub]] - [messenger.state :refer [state - pub-sub-publisher - app-state - pub-sub-path]] - [messenger.comm.services :refer [services-handler]] - [messenger.utils.event :refer [handle-channel-events]])) - -(defn service-id [message] - (first message)) - -(defn payload [message] - (rest message)) - -(defn subscribe-handler [publication topic handler] - (let [chn (chan)] - (sub publication topic chn) - (handle-channel-events chn (fn [_topic message] - (handler app-state - (service-id message) - (payload message)))))) - -(defn setup-publication! [app-state] - (let [publisher (pub-sub-publisher @app-state) - publication (pub publisher first)] - (swap! app-state assoc-in pub-sub-path publication) - publication)) - -(defn setup-pub-sub [] - (-> (setup-publication! app-state) - (subscribe-handler :service services-handler))) \ No newline at end of file diff --git a/src/messenger/comm/services.cljs b/src/messenger/comm/services.cljs deleted file mode 100644 index aeb5f2d5e9..0000000000 --- a/src/messenger/comm/services.cljs +++ /dev/null @@ -1,35 +0,0 @@ -(ns messenger.comm.services - (:require - [syng-im.utils.logging :as log] - [messenger.services.user-data :refer [user-data-handler]] - [messenger.services.protocol :refer [protocol-handler]] - [messenger.services.server :refer [server-handler]] - [messenger.services.contacts :refer [contacts-handler]] - [messenger.services.navigate-to :refer [navigate-to-handler]])) - -(defmulti service (fn [state service-id args] - service-id)) - -(defmethod service :user-data - [state service-id args] - (user-data-handler state args)) - -(defmethod service :server - [state service-id args] - (server-handler state args)) - -(defmethod service :contacts - [state service-id args] - (contacts-handler state args)) - -(defmethod service :protocol - [state service-id args] - (protocol-handler state args)) - -(defmethod service :navigate-to - [state service-id args] - (navigate-to-handler state args)) - -(defn services-handler [state service-id args] - (log/info "handling " service-id " args = " args) - (service state service-id args)) diff --git a/src/messenger/components/chat/chat.cljs b/src/messenger/components/chat/chat.cljs deleted file mode 100644 index f1a4cd2e50..0000000000 --- a/src/messenger/components/chat/chat.cljs +++ /dev/null @@ -1,91 +0,0 @@ -(ns messenger.components.chat.chat - (:require-macros - [natal-shell.components :refer [view list-view toolbar-android]] - [natal-shell.data-source :refer [data-source clone-with-rows]]) - (:require [om.next :as om :refer-macros [defui]] - [messenger.utils.resources :as res] - [messenger.components.invertible-scroll-view :refer [invertible-scroll-view]] - [messenger.components.chat.message :refer [message]] - [messenger.components.chat.new-message :refer [new-message NewMessage]] - [messenger.state :as state] - [syng-im.utils.logging :as log] - [messenger.components.iname :as in] - [messenger.omnext :as omnext])) - -;(defn generate-message [n] -; {:id n -; :type (if (= (rem n 4) 3) -; :audio -; :text) -; :body (if (= (rem n 3) 0) -; (apply str n "." (repeat 5 " This is a text.")) -; (str n ". This is a text.")) -; :outgoing (< (rand) 0.5) -; :delivery-status (if (< (rand) 0.5) :delivered :seen) -; :date "TODAY" -; :new-day (= (rem n 3) 0)}) -; -;(defn generate-messages [n] -; (map generate-message (range 1 (inc n)))) - -;(defn load-messages [] -; (clone-with-rows (data-source {:rowHasChanged (fn [row1 row2] -; (not= row1 row2))}) -; (vec (generate-messages 100)))) -; - -(defn to-datasource [msgs] - (-> (data-source {:rowHasChanged (fn [row1 row2] - (not= row1 row2))}) - (clone-with-rows msgs))) - -(defn nav-pop [nav] - (binding [state/*nav-render* false] - (.pop nav))) - -(defn render-row [row section-id row-id] - (message (js->clj row :keywordize-keys true))) - -(defui Chat - static in/IName - (get-name [this] - :chat/chat) - static om/IQuery - (query [this] - `[:chat/messages ~@(om/get-query NewMessage)]) - Object - (componentDidMount [this] - (om.next.protocols/reindex! omnext/reconciler)) - (render - [this] - (let [{:keys [nav]} (om/get-computed this) - {{messages :chat/messages - chat-id :chat/chat-id} :chat/chat} (om/props this) - _ (log/debug "messages=" messages) - messages-ds (when messages - (to-datasource messages))] - (view {:style {:flex 1 - :backgroundColor "white"}} - (toolbar-android {:logo res/logo-icon - :title "Chat name" - :titleColor "#4A5258" - :subtitle "Last seen just now" - :subtitleColor "#AAB2B2" - :navIcon res/nav-back-icon - :style {:backgroundColor "white" - :height 56 - :elevation 2} - :onIconClicked (fn [] - (nav-pop nav))}) - (when messages-ds - (list-view {:dataSource messages-ds - :renderScrollComponent - (fn [props] - (invertible-scroll-view nil)) - :renderRow render-row - :style {:backgroundColor "white"}})) - - (new-message {:chat-id chat-id}))))) - -(def chat (om/factory Chat)) - diff --git a/src/messenger/components/chat/message.cljs b/src/messenger/components/chat/message.cljs deleted file mode 100644 index 30d5595486..0000000000 --- a/src/messenger/components/chat/message.cljs +++ /dev/null @@ -1,107 +0,0 @@ -(ns messenger.components.chat.message - (:require-macros - [natal-shell.components :refer [view text image]]) - (:require [om.next :as om :refer-macros [defui]] - [messenger.utils.resources :as res] - [messenger.constants :refer [text-content-type]])) - -(defui Message - static om/Ident - (ident [this {:keys [msg-id]}] - [:message/by-id msg-id]) - static om/IQuery - (query [this] - '[:msg-id :content :content-type :outgoing :delivery-status :date :new-day]) - Object - (render - [this] - (let [{:keys [msg-id content content-type outgoing delivery-status date new-day] :as props} (om/props this)] - (view {:paddingHorizontal 15} - ;;; date - (when new-day - (text {:style {:marginVertical 10 - :fontFamily "Avenir-Roman" - :fontSize 11 - :color "#AAB2B2" - :letterSpacing 1 - :lineHeight 15 - :textAlign "center" - :opacity 0.8}} - date)) - ;;; body - (view {:style (merge {:flexDirection "column" - :width 260 - :marginVertical 5} - (if outgoing - {:alignSelf "flex-end" - :alignItems "flex-end"} - {:alignSelf "flex-start" - :alignItems "flex-start"}))} - (view {:style (merge {:borderRadius 6} - (if (= content-type text-content-type) - {:paddingVertical 12 - :paddingHorizontal 16} - {:paddingVertical 14 - :paddingHorizontal 10}) - (if outgoing - {:backgroundColor "#D3EEEF"} - {:backgroundColor "#FBF6E3"}))} - (if (= content-type text-content-type) - (text {:style {:fontSize 14 - :fontFamily "Avenir-Roman" - :color "#4A5258"}} - content) - ;;; audio - (view {:style {:flexDirection "row" - :alignItems "center"}} - (view {:style {:width 33 - :height 33 - :borderRadius 50 - :elevation 1}} - (image {:source res/play - :style {:width 33 - :height 33}})) - (view {:style {:marginTop 10 - :marginLeft 10 - :width 120 - :height 26 - :elevation 1}} - (view {:style {:position "absolute" - :top 4 - :width 120 - :height 2 - :backgroundColor "#EC7262"}}) - (view {:style {:position "absolute" - :left 0 - :top 0 - :width 2 - :height 10 - :backgroundColor "#4A5258"}}) - (text {:style {:position "absolute" - :left 1 - :top 11 - :fontFamily "Avenir-Roman" - :fontSize 11 - :color "#4A5258" - :letterSpacing 1 - :lineHeight 15}} - "03:39"))))) - ;;; delivery status - (when (and outgoing delivery-status) - (view {:style {:flexDirection "row" - :marginTop 2}} - (image {:source (if (= (keyword delivery-status) :seen) - res/seen-icon - res/delivered-icon) - :style {:marginTop 6 - :opacity 0.6}}) - (text {:style {:fontFamily "Avenir-Roman" - :fontSize 11 - :color "#AAB2B2" - :opacity 0.8 - :marginLeft 5}} - (if (= (keyword delivery-status) :seen) - "Seen" - "Delivered"))))))))) - -(def message (om/factory Message {:keyfn :msg-id})) \ No newline at end of file diff --git a/src/messenger/components/chat/new_message.cljs b/src/messenger/components/chat/new_message.cljs deleted file mode 100644 index 5dd56a685d..0000000000 --- a/src/messenger/components/chat/new_message.cljs +++ /dev/null @@ -1,60 +0,0 @@ -(ns messenger.components.chat.new-message - (:require-macros - [natal-shell.components :refer [view image text-input]]) - (:require [om.next :as om :refer-macros [defui]] - [messenger.utils.resources :as res] - [syng-im.utils.logging :as log] - [messenger.utils.state :refer [from-state]] - [messenger.comm.intercom :refer [send-msg]])) - -(def local-state (atom {})) - -(defui NewMessage - static om/IQuery - (query [this] - '[:chat/chat-id]) - Object - (render [this] - (view {:style {:flexDirection "row" - :margin 10 - :height 40 - :backgroundColor "#E5F5F6" - :borderRadius 5}} - (image {:source res/mic - :style {:marginTop 11 - :marginLeft 14 - :width 13 - :height 20}}) - (text-input {:underlineColorAndroid "#9CBFC0" - :style {:flex 1 - :marginLeft 18 - :lineHeight 42 - :fontSize 14 - :fontFamily "Avenir-Roman" - :color "#9CBFC0"} - :autoFocus true - :placeholder "Enter your message here" - :value (from-state this :text) - :onChangeText (fn [text] - ;(log/debug (with-out-str (pr (js->clj (om/props this)))) (-> (om/props this) :chat-id)) - ;(om/set-state! this (clj->js {:text text})) - (swap! local-state assoc :text text) - ) - :onSubmitEditing (fn [e] - (let [chat-id (-> (om/props this) :chat-id) - ;text (from-state this :text) - text (get @local-state :text)] - ;(om/set-state! this (clj->js {:text nil})) - (send-msg chat-id text)))}) - (image {:source res/smile - :style {:marginTop 11 - :marginRight 12 - :width 18 - :height 18}}) - (image {:source res/att - :style {:marginTop 14 - :marginRight 16 - :width 17 - :height 14}})))) - -(def new-message (om/factory NewMessage)) diff --git a/src/messenger/components/contact_list/contact.cljs b/src/messenger/components/contact_list/contact.cljs deleted file mode 100644 index 1e832e6b07..0000000000 --- a/src/messenger/components/contact_list/contact.cljs +++ /dev/null @@ -1,120 +0,0 @@ -(ns messenger.components.contact-list.contact - (:require-macros - [natal-shell.components :refer [view text image touchable-highlight]]) - (:require [om.next :as om :refer-macros [defui]] - [messenger.state :as state] - [messenger.utils.utils :refer [log toast http-post]] - [messenger.utils.resources :as res] - [messenger.comm.intercom :as intercom :refer [show-chat]] - [messenger.components.chat.chat :refer [chat]])) - -(def react-native-contacts (js/require "react-native-contacts")) - -(defui Contact - static om/Ident - (ident [this {:keys [name]}] - [:contact/by-name name]) - static om/IQuery - (query [this] - '[:name :photo-path :delivery-status :datetime :new-messages-count :online :whisper-identity]) - Object - (render [this] - (let [{:keys [name photo-path delivery-status datetime new-messages-count online whisper-identity]} - (dissoc (om/props this) :om.next/computed) - {:keys [nav]} (om/get-computed this)] - (touchable-highlight - {:onPress (fn [] - (show-chat nav whisper-identity))} - (view {:style {:flexDirection "row" - :marginTop 5 - :marginBottom 5 - :paddingLeft 15 - :paddingRight 15 - :height 75}} - (view {:width 54 - :height 54} - ;;; photo - (view {:width 54 - :height 54 - :borderRadius 50 - :backgroundColor "#FFFFFF" - :elevation 6} - (image {:source (if (< 0 (count photo-path)) - {:uri photo-path} - res/user-no-photo) - :style {:borderWidth 2 - :borderColor "#FFFFFF" - :borderRadius 50 - :width 54 - :height 54 - :position "absolute"}})) - ;;; online - (when online - (view {:position "absolute" - :top 41 - :left 36 - :width 12 - :height 12 - :borderRadius 50 - :backgroundColor "#FFFFFF" - :elevation 6} - (image {:source res/online-icon - :style {:width 12 - :height 12}})))) - (view {:style {:flexDirection "column" - :marginLeft 7 - :marginRight 10 - :flex 1 - :position "relative"}} - ;;; name - (text {:style {:fontSize 15 - :fontFamily "Avenir-Roman"}} name) - ;;; last message - (text {:style {:color "#AAB2B2" - :fontFamily "Avenir-Roman" - :fontSize 14 - :marginTop 2 - :paddingRight 10}} - (str "Hi, I'm " name))) - (view {:style {:flexDirection "column"}} - ;;; delivery status - (view {:style {:flexDirection "row" - :position "absolute" - :top 0 - :right 0}} - (when delivery-status - (image {:source (if (= (keyword delivery-status) :seen) - res/seen-icon - res/delivered-icon) - :style {:marginTop 5}})) - ;;; datetime - (text {:style {:fontFamily "Avenir-Roman" - :fontSize 11 - :color "#AAB2B2" - :letterSpacing 1 - :lineHeight 15 - :marginLeft 5}} - datetime)) - ;;; new messages count - (when (< 0 new-messages-count) - (view {:style {:position "absolute" - :right 0 - :bottom 24 - :width 18 - :height 18 - :backgroundColor "#6BC6C8" - :borderColor "#FFFFFF" - :borderRadius 50 - :alignSelf "flex-end"}} - (text {:style {:width 18 - :height 17 - :fontFamily "Avenir-Roman" - :fontSize 10 - :color "#FFFFFF" - :lineHeight 19 - :textAlign "center" - :top 1}} - new-messages-count))))))))) - -(def contact (om/factory Contact {:keyfn :name})) - diff --git a/src/messenger/components/contact_list/contact_list.cljs b/src/messenger/components/contact_list/contact_list.cljs deleted file mode 100644 index fa07257529..0000000000 --- a/src/messenger/components/contact_list/contact_list.cljs +++ /dev/null @@ -1,47 +0,0 @@ -(ns messenger.components.contact-list.contact-list - (:require-macros - [natal-shell.components :refer [view text image touchable-highlight list-view - toolbar-android]] - [natal-shell.core :refer [with-error-view]]) - (:require [om.next :as om :refer-macros [defui]] - [messenger.utils.utils :refer [log toast http-post]] - [messenger.utils.resources :as res] - [messenger.comm.intercom :as intercom] - [messenger.components.contact-list.contact :refer [contact]] - [messenger.components.iname :as in] - [syng-im.utils.logging :as log])) - -(defn render-row [nav row section-id row-id] - (contact (om/computed (js->clj row :keywordize-keys true) - {:nav nav}))) - -(defn load-contacts [] - (intercom/load-syng-contacts)) - -(defui ContactList - static in/IName - (get-name [this] - :contacts/contacts) - static om/IQuery - (query [this] - '[:contacts-ds]) - Object - (componentDidMount [this] - (load-contacts)) - (render [this] - (let [{{contacts-ds :contacts-ds} :contacts/contacts} (om/props this) - {:keys [nav]} (om/get-computed this)] - (view {:style {:flex 1 - :backgroundColor "white"}} - (toolbar-android {:logo res/logo-icon - :title "Chats" - :titleColor "#4A5258" - :style {:backgroundColor "white" - :height 56 - :elevation 2}}) - (when contacts-ds - (list-view {:dataSource contacts-ds - :renderRow (partial render-row nav) - :style {:backgroundColor "white"}})))))) - -(def contact-list (om/factory ContactList)) diff --git a/src/messenger/components/iname.cljs b/src/messenger/components/iname.cljs deleted file mode 100644 index dfea6e7013..0000000000 --- a/src/messenger/components/iname.cljs +++ /dev/null @@ -1,4 +0,0 @@ -(ns messenger.components.iname) - -(defprotocol IName - (get-name [this])) diff --git a/src/messenger/components/invertible-scroll-view.cljs b/src/messenger/components/invertible-scroll-view.cljs deleted file mode 100644 index 4408077a77..0000000000 --- a/src/messenger/components/invertible-scroll-view.cljs +++ /dev/null @@ -1,7 +0,0 @@ -(ns messenger.components.invertible-scroll-view) - -(set! js/InvertibleScrollView (js/require "react-native-invertible-scroll-view")) - -(defn invertible-scroll-view [props] - (js/React.createElement js/InvertibleScrollView - (clj->js (merge {:inverted true} props)))) diff --git a/src/messenger/components/spinner.cljs b/src/messenger/components/spinner.cljs deleted file mode 100644 index 83c5f55f53..0000000000 --- a/src/messenger/components/spinner.cljs +++ /dev/null @@ -1,7 +0,0 @@ -(ns messenger.components.spinner) - -(set! js/Spinner (.-default (js/require "react-native-loading-spinner-overlay"))) - -(defn spinner [props] - (js/React.createElement js/Spinner - (clj->js props))) diff --git a/src/messenger/constants.cljs b/src/messenger/constants.cljs deleted file mode 100644 index b838bafd6a..0000000000 --- a/src/messenger/constants.cljs +++ /dev/null @@ -1,5 +0,0 @@ -(ns messenger.constants) - -(def ethereum-rpc-url "http://localhost:8545") - -(def text-content-type "text/plain") \ No newline at end of file diff --git a/src/messenger/init.cljs b/src/messenger/init.cljs deleted file mode 100644 index 70ca211e5c..0000000000 --- a/src/messenger/init.cljs +++ /dev/null @@ -1,6 +0,0 @@ -(ns messenger.init - (:require [messenger.persistence.simple-kv-store :as kv] - [messenger.state :as state])) - -(defn init-simple-store [] - (swap! state/app-state assoc-in state/simple-store-path (kv/->SimpleKvStore))) diff --git a/src/messenger/ios/core.cljs b/src/messenger/ios/core.cljs deleted file mode 100644 index db80e27637..0000000000 --- a/src/messenger/ios/core.cljs +++ /dev/null @@ -1,33 +0,0 @@ -(ns messenger.ios.core - (:require-macros [natal-shell.components :refer [view text image touchable-highlight]] - [natal-shell.alert :refer [alert]]) - (:require [om.next :as om :refer-macros [defui]] - [re-natal.support :as sup] - [messenger.omnext :as omnext])) - -(set! js/React (js/require "react-native")) - -(def app-registry (.-AppRegistry js/React)) -(def logo-img (js/require "./images/cljs.png")) - -(defui AppRoot - static om/IQuery - (query [this] - '[:app/msg]) - Object - (render [this] - (let [{:keys [app/msg]} (om/props this)] - (view {:style {:flexDirection "column" :margin 40 :alignItems "center"}} - (text {:style {:fontSize 30 :fontWeight "100" :marginBottom 20 :textAlign "center"}} msg) - (image {:source logo-img - :style {:width 80 :height 80 :marginBottom 30}}) - (touchable-highlight {:style {:backgroundColor "#999" :padding 10 :borderRadius 5} - :onPress #(alert "HELLO!")} - (text {:style {:color "white" :textAlign "center" :fontWeight "bold"}} "press me")))))) - -(defonce RootNode (sup/root-node! 1)) -(defonce app-root (om/factory RootNode)) - -(defn init [] - (om/add-root! omnext/reconciler AppRoot 1) - (.registerComponent app-registry "Messenger" (fn [] app-root))) \ No newline at end of file diff --git a/src/messenger/models/chat.cljs b/src/messenger/models/chat.cljs deleted file mode 100644 index bb7eddd8b0..0000000000 --- a/src/messenger/models/chat.cljs +++ /dev/null @@ -1,8 +0,0 @@ -(ns messenger.models.chat - (:require [messenger.state :as state])) - -(defn set-current-chat-id [chat-id] - (swap! state/app-state assoc-in state/current-chat-id-path chat-id)) - -(defn current-chat-id [] - (get-in @state/app-state state/current-chat-id-path)) diff --git a/src/messenger/models/contacts.cljs b/src/messenger/models/contacts.cljs deleted file mode 100644 index daa16cc9f8..0000000000 --- a/src/messenger/models/contacts.cljs +++ /dev/null @@ -1,78 +0,0 @@ -(ns messenger.models.contacts - (:require-macros [natal-shell.data-source :refer [data-source clone-with-rows]]) - (:require [cljs.core.async :as async :refer [chan put! !]] - [messenger.state :as state] - [messenger.utils.utils :refer [log toast http-post]] - [messenger.persistence.realm :as realm])) - -(def fake-contacts? false) - -(def react-native-contacts (js/require "react-native-contacts")) - -(defn- generate-contact [n] - {:name (str "Contact " n) - :photo-path "" - :phone-numbers [{:label "mobile" :number (apply str (repeat 7 n))}] - :delivery-status (if (< (rand) 0.5) :delivered :seen) - :datetime "15:30" - :new-messages-count (rand-int 3) - :online (< (rand) 0.5)}) - -(defn- generate-contacts [n] - (map generate-contact (range 1 (inc n)))) - -(defn load-phone-contacts [] - (let [ch (chan)] - (if fake-contacts? - (put! ch {:error nil, :contacts (generate-contacts 10)}) - (.getAll react-native-contacts - (fn [error raw-contacts] - (put! ch - {:error error - :contacts - (when (not error) - (map (fn [contact] - (merge contact - (generate-contact 1) - {:name (:givenName contact) - :photo-path (:thumbnailPath contact) - :phone-numbers (:phoneNumbers contact)})) - (js->clj raw-contacts :keywordize-keys true)))})))) - ch)) - -(defn- get-contacts [] - (realm/get-list "Contact")) - -(defn load-syng-contacts [] - (let [contacts (map (fn [contact] - (merge contact - {:delivery-status (if (< (rand) 0.5) :delivered :seen) - :datetime "15:30" - :new-messages-count (rand-int 3) - :online (< (rand) 0.5)})) - (get-contacts))] - (swap! state/app-state update :contacts-ds - #(clone-with-rows % contacts)))) - -(defn- create-contact [{:keys [phone-number whisper-identity name photo-path]}] - (realm/create "Contact" - {:phone-number phone-number - :whisper-identity whisper-identity - :name (or name "") - :photo-path (or photo-path "")})) - -(defn- contact-exist? [contacts contact] - (some #(= (:phone-number contact) (:phone-number %)) contacts)) - -(defn- add-contacts [contacts] - (realm/write (fn [] - (let [db-contacts (get-contacts)] - (dorun (map (fn [contact] - (if (not (contact-exist? db-contacts contact)) - (create-contact contact) - ;; TODO else override? - )) - contacts)))))) - -(defn save-syng-contacts [syng-contacts] - (add-contacts syng-contacts)) diff --git a/src/messenger/models/messages.cljs b/src/messenger/models/messages.cljs deleted file mode 100644 index 75bd0e9900..0000000000 --- a/src/messenger/models/messages.cljs +++ /dev/null @@ -1,42 +0,0 @@ -(ns messenger.models.messages - (:require [messenger.persistence.realm :as r] - [cljs.reader :refer [read-string]] - [syng-im.utils.random :refer [timestamp]])) - -(defn save-message [chat-id {:keys [from to msg-id content content-type outgoing] :or {outgoing false} :as msg}] - (when-not (r/exists? :msgs :msg-id msg-id) - (r/write - (fn [] - (r/create :msgs {:chat-id chat-id - :msg-id msg-id - :from from - :to to - :content content - :content-type content-type - :outgoing outgoing - :timestamp (timestamp)} true))))) - -(defn get-messages* [chat-id] - (-> (r/get-by-field :msgs :chat-id chat-id) - (r/sorted :timestamp :desc) - (r/page 0 10))) - -(defn get-messages [chat-id] - (-> (get-messages* chat-id) - (js->clj :keywordize-keys true))) - -(comment - - (save-message "0x040028c500ff086ecf1cfbb3c1a7240179cde5b86f9802e6799b9bbe9cdd7ad1b05ae8807fa1f9ed19cc8ce930fc2e878738c59f030a6a2f94b3522dc1378ff154" - {:msg-id "153" - :content "hello!" - :content-type "text/plain"}) - - (get-messages* "0x040028c500ff086ecf1cfbb3c1a7240179cde5b86f9802e6799b9bbe9cdd7ad1b05ae8807fa1f9ed19cc8ce930fc2e878738c59f030a6a2f94b3522dc1378ff154") - - (get-messages "0x043df89d36f6e3d8ade18e55ac3e2e39406ebde152f76f2f82d674681d59319ffd9880eebfb4f5f8d5c222ec485b44d6e30ba3a03c96b1c946144fdeba1caccd43") - - (doseq [msg (get-messages* "0x043df89d36f6e3d8ade18e55ac3e2e39406ebde152f76f2f82d674681d59319ffd9880eebfb4f5f8d5c222ec485b44d6e30ba3a03c96b1c946144fdeba1caccd43")] - (r/delete msg)) - - ) \ No newline at end of file diff --git a/src/messenger/models/navigation.cljs b/src/messenger/models/navigation.cljs deleted file mode 100644 index 7906c1c272..0000000000 --- a/src/messenger/models/navigation.cljs +++ /dev/null @@ -1,8 +0,0 @@ -(ns messenger.models.navigation - (:require [messenger.state :as state])) - -(defn set-current-screen-class [class] - (swap! state/app-state assoc-in [:current-screen-class] class)) - -(defn current-screen-class [] - (get-in @state/app-state [:current-screen-class])) diff --git a/src/messenger/models/protocol.cljs b/src/messenger/models/protocol.cljs deleted file mode 100644 index ea89f2aa5b..0000000000 --- a/src/messenger/models/protocol.cljs +++ /dev/null @@ -1,23 +0,0 @@ -(ns messenger.models.protocol - (:require [cljs.reader :refer [read-string]] - [messenger.state :as state] - [syng-im.protocol.state.storage :as s] - [syng-im.utils.encryption :refer [password-encrypt - password-decrypt]] - [messenger.utils.types :refer [to-edn-string]])) - -(defn set-initialized [initialized?] - (swap! state/app-state assoc-in state/protocol-initialized-path initialized?)) - -(defn update-identity [identity] - (let [password (get-in @state/app-state state/identity-password-path) - encrypted (->> (to-edn-string identity) - (password-encrypt password))] - (s/put (state/kv-store) :identity encrypted))) - -(defn current-identity [] - (let [encrypted (s/get (state/kv-store) :identity) - password (get-in @state/app-state state/identity-password-path)] - (when encrypted - (-> (password-decrypt password encrypted) - (read-string))))) diff --git a/src/messenger/models/user_data.cljs b/src/messenger/models/user_data.cljs deleted file mode 100644 index f61b712c12..0000000000 --- a/src/messenger/models/user_data.cljs +++ /dev/null @@ -1,28 +0,0 @@ -(ns messenger.models.user-data - (:require-macros - [natal-shell.async-storage :refer [get-item set-item]]) - (:require [cljs.core.async :as async :refer [chan put! !]] - [syng-im.protocol.web3 :as web3] - [messenger.state :as state] - [messenger.utils.utils :refer [log on-error toast]])) - -(defn set-phone-number [phone-number] - (swap! state/app-state assoc :user-phone-number phone-number)) - -(defn save-phone-number [phone-number] - (set-item "user-phone-number" phone-number) - (swap! state/app-state assoc :user-phone-number phone-number)) - -(defn load-phone-number [] - (get-item "user-phone-number" - (fn [error value] - (if error - (on-error error) - (swap! state/app-state assoc :user-phone-number (when value - (str value))))))) - -(defn set-identity [identity] - (swap! state/app-state assoc :user-identity identity)) - -(defn set-confirmation-code [code] - (swap! state/app-state assoc :confirmation-code code)) diff --git a/src/messenger/omnext.cljs b/src/messenger/omnext.cljs deleted file mode 100644 index e7a5cec606..0000000000 --- a/src/messenger/omnext.cljs +++ /dev/null @@ -1,74 +0,0 @@ -(ns messenger.omnext - (:require [om.next :as om] - [syng-im.utils.logging :as log] - [re-natal.support :as sup] - [messenger.models.messages :as msgs] - [messenger.models.chat :as chat] - [messenger.state :as state] - [messenger.components.iname :as in])) - -(defmulti read om/dispatch) - -(defmethod read :default [{:keys [state] :as env} key param] - (log/debug "reading" "key=" key "param=" param) - (let [st @state] - (if-let [[_ v] (find st key)] - {:value v} - {:value :not-found}))) - -(defmethod read :chat/chat [env key param] - (log/debug "reading" "key=" key "param=" param) - (let [chat-id (chat/current-chat-id) - val {:value {:chat/messages (msgs/get-messages chat-id) - :chat/chat-id chat-id}} - _ (log/debug "returning" val)] - val)) - -(defmethod read :chat/messages [env key param] - (log/debug "reading" "key=" key "param=" param) - (let [chat-id (chat/current-chat-id) - val {:value {:chat/messages (msgs/get-messages chat-id) - :chat/chat-id chat-id}} - _ (log/debug "returning" val)] - val)) - -(defmethod read :contacts/contacts [env key param] - (log/debug "reading" "key=" key "param=" param) - (let [val {:value {:contacts-ds (get-in @state/app-state [:contacts-ds])}} - _ (log/debug "returning" val)] - val)) - -(defmethod read :login/login [env key param] - (log/debug "reading" "key=" key "param=" param) - (let [val {:value (select-keys @state/app-state [:user-phone-number :user-identity :loading])} - _ (log/debug "returning" val)] - val)) - -(defmethod read :signup/confirm [env key param] - (log/debug "reading" "key=" key "param=" param) - (let [val {:value (select-keys @state/app-state [:confirmation-code :loading])} - _ (log/debug "returning" val)] - val)) - -(defmulti mutate om/dispatch) - -(defmethod mutate 'chat/add-msg-to-chat [{:keys [state] :as env} key {:keys [chat-id msg] :as param}] - (log/debug "writing" "key=" key "param=" param) - {:action #(do - (log/debug "Writing msg to db") - (msgs/save-message chat-id msg) - (swap! state/app-state assoc-in [:chat :messages] msg))}) - -(defonce reconciler - (om/reconciler - {:state state/app-state - :parser (om/parser {:read read - :mutate mutate}) - :root-render sup/root-render - :root-unmount sup/root-unmount})) - - -(defn set-root-query [component] - (let [app-root (om/class->any reconciler (om/app-root reconciler))] - (om/set-query! app-root {:query [{(in/get-name component) (om/get-query component)}]}) - (om.next.protocols/reindex! reconciler))) \ No newline at end of file diff --git a/src/messenger/persistence/realm.cljs b/src/messenger/persistence/realm.cljs deleted file mode 100644 index b25ee6788e..0000000000 --- a/src/messenger/persistence/realm.cljs +++ /dev/null @@ -1,94 +0,0 @@ -(ns messenger.persistence.realm - (:require [cljs.reader :refer [read-string]] - [syng-im.utils.logging :as log] - [messenger.utils.types :refer [to-string]]) - (:refer-clojure :exclude [exists?])) - -(set! js/Realm (js/require "realm")) - -(def opts {:schema [{:name "Contact" - :properties {:phone-number "string" - :whisper-identity "string" - :name "string" - :photo-path "string"}} - {:name :kv-store - :primaryKey :key - :properties {:key "string" - :value "string"}} - {:name :msgs - :primaryKey :msg-id - :properties {:msg-id "string" - :from "string" - :to "string" - :content "string" ;; TODO make it ArrayBuffer - :content-type "string" - :timestamp "int" - :chat-id "string" - :outgoing "bool"}}]}) - -(def realm (js/Realm. (clj->js opts))) - -(def schema-by-name (->> (:schema opts) - (mapv (fn [{:keys [name] :as schema}] - [name schema])) - (into {}))) - -(defn field-type [schema-name field] - (get-in schema-by-name [schema-name :properties field])) - -(defn write [f] - (.write realm f)) - -(defn create - ([schema-name obj] - (create schema-name obj false)) - ([schema-name obj update?] - (.create realm (to-string schema-name) (clj->js obj) update?))) - -(defmulti to-query (fn [schema-name operator field value] - operator)) - -(defmethod to-query :eq [schema-name operator field value] - (let [value (to-string value) - query (str (name field) "=" (if (= "string" (field-type schema-name field)) - (str "\"" value "\"") - value)) - ;_ (log/debug query) - ] - query)) - -(defn get-by-field [schema-name field value] - (-> (.objects realm (name schema-name)) - (.filtered (to-query schema-name :eq field value)))) - -(defn sorted [results field-name order] - (.sorted results (to-string field-name) (if (= order :asc) - false - true))) - -(defn page [results from to] - (js/Array.prototype.slice.call results from to)) - -(defn single [result] - (-> (aget result 0))) - -(defn single-cljs [result] - (some-> (aget result 0) - (js->clj :keywordize-keys true))) - -(defn decode-value [{:keys [key value]}] - (read-string value)) - -(defn delete [obj] - (write (fn [] - (.delete realm obj)))) - -(defn exists? [schema-name field value] - (> (.-length (get-by-field schema-name field value)) - 0)) - -(defn get-count [objs] - (.-length objs)) - -(defn get-list [schema-name] - (vals (js->clj (.objects realm schema-name) :keywordize-keys true))) diff --git a/src/messenger/persistence/simple_kv_store.cljs b/src/messenger/persistence/simple_kv_store.cljs deleted file mode 100644 index 75f243e846..0000000000 --- a/src/messenger/persistence/simple_kv_store.cljs +++ /dev/null @@ -1,26 +0,0 @@ -(ns messenger.persistence.simple-kv-store - (:require [syng-im.protocol.state.storage :as st] - [messenger.persistence.realm :as r] - [messenger.utils.types :refer [to-edn-string]])) - -(defrecord SimpleKvStore [] - st/Storage - (put [_ key value] - (r/write - (fn [] - (r/create :kv-store {:key key - :value (to-edn-string value)} true)))) - (get [_ key] - (some-> (r/get-by-field :kv-store :key key) - (r/single-cljs) - (r/decode-value))) - (contains-key? [_ key] - (r/exists? :kv-store :key key)) - (delete [_ key] - (-> (r/get-by-field :kv-store :key key) - (r/single) - (r/delete)))) - -(comment - - ) \ No newline at end of file diff --git a/src/messenger/protocol/protocol_handler.cljs b/src/messenger/protocol/protocol_handler.cljs deleted file mode 100644 index caeecd0d42..0000000000 --- a/src/messenger/protocol/protocol_handler.cljs +++ /dev/null @@ -1,46 +0,0 @@ -(ns messenger.protocol.protocol-handler - (:require [syng-im.utils.logging :as log] - [messenger.constants :refer [ethereum-rpc-url]] - [messenger.comm.intercom :refer [protocol-initialized - save-new-msg]] - [messenger.models.protocol :refer [current-identity]] - [messenger.state :refer [kv-store]])) - - -(defn make-handler [] - {:ethereum-rpc-url ethereum-rpc-url - :identity (current-identity) - :storage (kv-store) - :handler (fn [{:keys [event-type] :as event}] - (log/info "Event:" (clj->js event)) - (case event-type - :initialized (let [{:keys [identity]} event] - (protocol-initialized identity)) - :new-msg (let [{:keys [from to payload]} event] - (save-new-msg (assoc payload :from from :to to))) - ;:msg-acked (let [{:keys [msg-id]} event] - ; (add-to-chat "chat" ":" (str "Message " msg-id " was acked"))) - ;:delivery-failed (let [{:keys [msg-id]} event] - ; (add-to-chat "chat" ":" (str "Delivery of message " msg-id " failed"))) - ;:new-group-chat (let [{:keys [from group-id identities]} event] - ; (set-group-id! group-id) - ; (set-group-identities identities) - ; (add-to-chat "group-chat" ":" (str "Received group chat invitation from " from " for group-id: " group-id))) - ;:group-chat-invite-acked (let [{:keys [from group-id]} event] - ; (add-to-chat "group-chat" ":" (str "Received ACK for group chat invitation from " from " for group-id: " group-id))) - ;:new-group-msg (let [{from :from - ; {content :content} :payload} event] - ; (add-to-chat "group-chat" from content)) - ;:group-new-participant (let [{:keys [group-id identity from]} event] - ; (add-to-chat "group-chat" ":" (str (shorten from) " added " (shorten identity) " to group chat")) - ; (add-identity-to-group-list identity)) - ;:group-removed-participant (let [{:keys [group-id identity from]} event] - ; (add-to-chat "group-chat" ":" (str (shorten from) " removed " (shorten identity) " from group chat")) - ; (remove-identity-from-group-list identity)) - ;:removed-from-group (let [{:keys [group-id from]} event] - ; (add-to-chat "group-chat" ":" (str (shorten from) " removed you from group chat"))) - ;:participant-left-group (let [{:keys [group-id from]} event] - ; (add-to-chat "group-chat" ":" (str (shorten from) " left group chat"))) - ;(add-to-chat "chat" ":" (str "Don't know how to handle " event-type)) - (log/info "Don't know how to handle" event-type) - ))}) diff --git a/src/messenger/services/contacts.cljs b/src/messenger/services/contacts.cljs deleted file mode 100644 index 74417b59e0..0000000000 --- a/src/messenger/services/contacts.cljs +++ /dev/null @@ -1,84 +0,0 @@ -(ns messenger.services.contacts - (:require-macros [cljs.core.async.macros :refer [go]]) - (:require [clojure.string :as cstr] - [cljs.core.async :as async :refer [chan put! clj (:contacts data)))) - -(defn- get-contacts-by-hash [contacts] - (let [numbers-info (reduce (fn [numbers contact] - (into numbers - (map (fn [c] - {:number (format-phone-number (:number c)) - :contact contact}) - (:phone-numbers contact)))) - '() - contacts)] - (reduce (fn [m number-info] - (let [number (:number number-info) - hash (encrypt number)] - (assoc m hash number-info))) - {} - numbers-info))) - -(defn- request-syng-contacts [contacts] - (let [contacts-by-hash (get-contacts-by-hash contacts) - data (keys contacts-by-hash) - ch (chan)] - (http-post "get-contacts" {:phone-number-hashes data} - (fn [data] - (put! ch - (to-syng-contacts contacts-by-hash data)))) - ch)) - -(defn sync-contacts [handler] - (go - (let [result (js route)))) - -(defn nav-replace [nav route] - (binding [state/*nav-render* false] - (.replace nav (clj->js route)))) - -(defmulti navigate-to (fn [state id args] - id)) - -(defmethod navigate-to :scene/chat - [state id {:keys [navigator chat-id] :as args}] - (log/debug "handling " id "args = " (dissoc args :navigator)) - (n/set-current-screen-class chat/Chat) - (set-current-chat-id chat-id) - (nav-push navigator {:component chat/chat})) - -(defmethod navigate-to :scene/signup-confirm - [state id {:keys [navigator] :as args}] - (log/debug "handling " id "args = " (dissoc args :navigator)) - (n/set-current-screen-class sc/SignUpConfirm) - (nav-replace navigator {:component sc/sign-up-confirm - :name "sign-up-confirm"})) - -(defmethod navigate-to :scene/contacts - [state id {:keys [navigator] :as args}] - (log/debug "handling " id "args = " (dissoc args :navigator)) - (n/set-current-screen-class cl/ContactList) - (nav-replace navigator {:component cl/contact-list - :name "contact-list"})) - -(defn navigate-to-handler [state [id args]] - (log/debug "navigate-to-handler: " (dissoc args :navigator)) - (navigate-to state id args)) - - -(comment - - ) \ No newline at end of file diff --git a/src/messenger/services/protocol.cljs b/src/messenger/services/protocol.cljs deleted file mode 100644 index 184290dd97..0000000000 --- a/src/messenger/services/protocol.cljs +++ /dev/null @@ -1,58 +0,0 @@ -(ns messenger.services.protocol - (:require [messenger.models.protocol :refer [set-initialized - update-identity]] - [messenger.models.messages :refer [save-message]] - [messenger.models.user-data :refer [set-identity]] - [syng-im.utils.logging :as log] - [syng-im.protocol.api :as api] - [messenger.omnext :as omnext] - [om.next :as om] - [messenger.constants :refer [text-content-type]])) - -(defmulti protocol (fn [state id args] - id)) - -(defmethod protocol :protocol/initialized - [state id {:keys [identity] :as args}] - (log/debug "handling " id "args = " args) - (update-identity identity) - (set-identity identity) - (set-initialized true)) - -(defmethod protocol :protocol/save-new-msg - [state id {{from :from :as msg} :msg :as args}] - (log/debug "handling " id "args = " args) - (let [chat-id from] - (om/transact! omnext/reconciler `[(chat/add-msg-to-chat {:msg ~msg - :chat-id ~chat-id}) [:chat/messages :chat/chat-id :chat/chat]]))) - -(defmethod protocol :protocol/send-msg - [state id {:keys [chat-id text] :as args}] - (log/debug "handling " id "args = " args) - (let [{msg-id :msg-id - {from :from - to :to} :msg} (api/send-user-msg {:to chat-id - :content text}) - msg {:msg-id msg-id - :from from - :to to - :content text - :content-type text-content-type - :outgoing true}] - (om/transact! omnext/reconciler ;;(om/class->any omnext/reconciler messenger.components.chat.chat/Chat) - `[(chat/add-msg-to-chat {:msg ~msg - :chat-id ~chat-id}) [:chat/messages :chat/chat-id :chat/chat]]))) - -(defn protocol-handler [state [id args]] - (log/debug "protocol-handler: " args) - (protocol state id args)) - - -(comment - - (om/transact! omnext/reconciler `[(chat/add-msg-to-chat {:msg {:msg-id "1458670960090-ed5f995a-b686-5cbe-bf96-8a60ada8f6c3"} - :chat-id "1"}) [:chat/chat]]) - - (om/get-indexer omnext/reconciler) -(om.next.protocols/reindex! omnext/reconciler) - ) \ No newline at end of file diff --git a/src/messenger/services/server.cljs b/src/messenger/services/server.cljs deleted file mode 100644 index 41bb77e748..0000000000 --- a/src/messenger/services/server.cljs +++ /dev/null @@ -1,31 +0,0 @@ -(ns messenger.services.server - (:require-macros [cljs.core.async.macros :refer [go]]) - (:require [cljs.core.async :as async :refer [chan put! (.digest sha-256) - byteArrayToHex)) diff --git a/src/messenger/utils/event.cljs b/src/messenger/utils/event.cljs deleted file mode 100644 index e099962087..0000000000 --- a/src/messenger/utils/event.cljs +++ /dev/null @@ -1,9 +0,0 @@ -(ns messenger.utils.event - (:require [cljs.core.async :refer [ (om/get-state component) - (js->clj :keywordize-keys true) - key)) diff --git a/src/messenger/utils/types.cljs b/src/messenger/utils/types.cljs deleted file mode 100644 index 883daf94b0..0000000000 --- a/src/messenger/utils/types.cljs +++ /dev/null @@ -1,9 +0,0 @@ -(ns messenger.utils.types) - -(defn to-string [s] - (if (keyword? s) - (name s) - s)) - -(defn to-edn-string [value] - (with-out-str (pr value))) \ No newline at end of file diff --git a/src/messenger/utils/utils.cljs b/src/messenger/utils/utils.cljs deleted file mode 100644 index 4da237a1c7..0000000000 --- a/src/messenger/utils/utils.cljs +++ /dev/null @@ -1,38 +0,0 @@ -(ns messenger.utils.utils - (:require-macros - [natal-shell.async-storage :refer [get-item set-item]] - [natal-shell.alert :refer [alert]] - [natal-shell.toast-android :as toast])) - -(def server-address "http://rpc0.syng.im:20000/") -;; (def server-address "http://10.0.3.2:3000/") - -(defn log [obj] - (.log js/console obj)) - -(defn toast [s] - (toast/show s (toast/long))) - -(defn on-error [error] - (toast (str "error: " error))) - -(defn http-post - ([action data on-success] - (http-post action data on-success nil)) - ([action data on-success on-error] - (-> (.fetch js/window - (str server-address action) - (clj->js {:method "POST" - :headers {:accept "application/json" - :content-type "application/json"} - :body (.stringify js/JSON (clj->js data))})) - (.then (fn [response] - (log response) - (.text response))) - (.then (fn [text] - (let [json (.parse js/JSON text) - obj (js->clj json :keywordize-keys true)] - (on-success obj)))) - (.catch (or on-error - (fn [error] - (toast (str error)))))))) diff --git a/src/re_natal/support.cljs b/src/re_natal/support.cljs deleted file mode 100644 index b38fcf0e2a..0000000000 --- a/src/re_natal/support.cljs +++ /dev/null @@ -1,35 +0,0 @@ -(ns re-natal.support - (:require [om.next :refer-macros [ui]])) - -(defonce root-nodes (atom {})) - -(defn root-node! - "A substitute for a real root node (1) for mounting om-next component. - You have to call function :on-render and :on-unmount in reconciler :root-render :root-unmount function." - [id] - (let [content (atom nil) - instance (atom nil) - class (ui Object - (componentWillMount [this] (reset! instance this)) - (render [_] @content))] - (swap! root-nodes assoc id {:on-render (fn [el] - (reset! content el) - (when @instance - (.forceUpdate @instance))) - :on-unmount (fn []) - :class class}) - class)) -(defn root-render - "Use this as reconciler :root-render function." - [el id] - (let [node (get @root-nodes id) - on-render (:on-render node)] - (when on-render (on-render el)))) - -(defn root-unmount - "Use this as reconciler :root-unmount function." - [id] - (let [node (get @root-nodes id) - unmount-fn (:on-unmount node)] - (when unmount-fn (unmount-fn)))) - diff --git a/syng-im/src/syng_im/android/core.cljs b/src/syng_im/android/core.cljs similarity index 100% rename from syng-im/src/syng_im/android/core.cljs rename to src/syng_im/android/core.cljs diff --git a/syng-im/src/syng_im/components/action_button.cljs b/src/syng_im/components/action_button.cljs similarity index 100% rename from syng-im/src/syng_im/components/action_button.cljs rename to src/syng_im/components/action_button.cljs diff --git a/syng-im/src/syng_im/components/chat.cljs b/src/syng_im/components/chat.cljs similarity index 100% rename from syng-im/src/syng_im/components/chat.cljs rename to src/syng_im/components/chat.cljs diff --git a/syng-im/src/syng_im/components/chat/chat_message.cljs b/src/syng_im/components/chat/chat_message.cljs similarity index 100% rename from syng-im/src/syng_im/components/chat/chat_message.cljs rename to src/syng_im/components/chat/chat_message.cljs diff --git a/syng-im/src/syng_im/components/chat/chat_message_new.cljs b/src/syng_im/components/chat/chat_message_new.cljs similarity index 100% rename from syng-im/src/syng_im/components/chat/chat_message_new.cljs rename to src/syng_im/components/chat/chat_message_new.cljs diff --git a/syng-im/src/syng_im/components/chat/input/money.cljs b/src/syng_im/components/chat/input/money.cljs similarity index 100% rename from syng-im/src/syng_im/components/chat/input/money.cljs rename to src/syng_im/components/chat/input/money.cljs diff --git a/syng-im/src/syng_im/components/chat/input/password.cljs b/src/syng_im/components/chat/input/password.cljs similarity index 100% rename from syng-im/src/syng_im/components/chat/input/password.cljs rename to src/syng_im/components/chat/input/password.cljs diff --git a/syng-im/src/syng_im/components/chat/input/phone.cljs b/src/syng_im/components/chat/input/phone.cljs similarity index 100% rename from syng-im/src/syng_im/components/chat/input/phone.cljs rename to src/syng_im/components/chat/input/phone.cljs diff --git a/syng-im/src/syng_im/components/chat/input/simple_command.cljs b/src/syng_im/components/chat/input/simple_command.cljs similarity index 100% rename from syng-im/src/syng_im/components/chat/input/simple_command.cljs rename to src/syng_im/components/chat/input/simple_command.cljs diff --git a/syng-im/src/syng_im/components/chat/plain_message_input.cljs b/src/syng_im/components/chat/plain_message_input.cljs similarity index 100% rename from syng-im/src/syng_im/components/chat/plain_message_input.cljs rename to src/syng_im/components/chat/plain_message_input.cljs diff --git a/syng-im/src/syng_im/components/chat/suggestions.cljs b/src/syng_im/components/chat/suggestions.cljs similarity index 100% rename from syng-im/src/syng_im/components/chat/suggestions.cljs rename to src/syng_im/components/chat/suggestions.cljs diff --git a/syng-im/src/syng_im/components/chats/chat_list_item.cljs b/src/syng_im/components/chats/chat_list_item.cljs similarity index 100% rename from syng-im/src/syng_im/components/chats/chat_list_item.cljs rename to src/syng_im/components/chats/chat_list_item.cljs diff --git a/syng-im/src/syng_im/components/chats/chats_list.cljs b/src/syng_im/components/chats/chats_list.cljs similarity index 100% rename from syng-im/src/syng_im/components/chats/chats_list.cljs rename to src/syng_im/components/chats/chats_list.cljs diff --git a/syng-im/src/syng_im/components/chats/new_group.cljs b/src/syng_im/components/chats/new_group.cljs similarity index 100% rename from syng-im/src/syng_im/components/chats/new_group.cljs rename to src/syng_im/components/chats/new_group.cljs diff --git a/syng-im/src/syng_im/components/chats/new_group_contact.cljs b/src/syng_im/components/chats/new_group_contact.cljs similarity index 100% rename from syng-im/src/syng_im/components/chats/new_group_contact.cljs rename to src/syng_im/components/chats/new_group_contact.cljs diff --git a/syng-im/src/syng_im/components/contact_list/contact.cljs b/src/syng_im/components/contact_list/contact.cljs similarity index 100% rename from syng-im/src/syng_im/components/contact_list/contact.cljs rename to src/syng_im/components/contact_list/contact.cljs diff --git a/syng-im/src/syng_im/components/contact_list/contact_inner.cljs b/src/syng_im/components/contact_list/contact_inner.cljs similarity index 100% rename from syng-im/src/syng_im/components/contact_list/contact_inner.cljs rename to src/syng_im/components/contact_list/contact_inner.cljs diff --git a/syng-im/src/syng_im/components/contact_list/contact_list.cljs b/src/syng_im/components/contact_list/contact_list.cljs similarity index 100% rename from syng-im/src/syng_im/components/contact_list/contact_list.cljs rename to src/syng_im/components/contact_list/contact_list.cljs diff --git a/syng-im/src/syng_im/components/icons/ionicons.cljs b/src/syng_im/components/icons/ionicons.cljs similarity index 100% rename from syng-im/src/syng_im/components/icons/ionicons.cljs rename to src/syng_im/components/icons/ionicons.cljs diff --git a/syng-im/src/syng_im/components/invertible_scroll_view.cljs b/src/syng_im/components/invertible_scroll_view.cljs similarity index 100% rename from syng-im/src/syng_im/components/invertible_scroll_view.cljs rename to src/syng_im/components/invertible_scroll_view.cljs diff --git a/syng-im/src/syng_im/components/item_checkbox.cljs b/src/syng_im/components/item_checkbox.cljs similarity index 100% rename from syng-im/src/syng_im/components/item_checkbox.cljs rename to src/syng_im/components/item_checkbox.cljs diff --git a/syng-im/src/syng_im/components/react.cljs b/src/syng_im/components/react.cljs similarity index 100% rename from syng-im/src/syng_im/components/react.cljs rename to src/syng_im/components/react.cljs diff --git a/syng-im/src/syng_im/components/realm.cljs b/src/syng_im/components/realm.cljs similarity index 100% rename from syng-im/src/syng_im/components/realm.cljs rename to src/syng_im/components/realm.cljs diff --git a/syng-im/src/syng_im/components/sign_up.cljs b/src/syng_im/components/sign_up.cljs similarity index 100% rename from syng-im/src/syng_im/components/sign_up.cljs rename to src/syng_im/components/sign_up.cljs diff --git a/syng-im/src/syng_im/components/sign_up_confirm.cljs b/src/syng_im/components/sign_up_confirm.cljs similarity index 100% rename from syng-im/src/syng_im/components/sign_up_confirm.cljs rename to src/syng_im/components/sign_up_confirm.cljs diff --git a/syng-im/src/syng_im/components/spinner.cljs b/src/syng_im/components/spinner.cljs similarity index 100% rename from syng-im/src/syng_im/components/spinner.cljs rename to src/syng_im/components/spinner.cljs diff --git a/syng-im/src/syng_im/constants.cljs b/src/syng_im/constants.cljs similarity index 100% rename from syng-im/src/syng_im/constants.cljs rename to src/syng_im/constants.cljs diff --git a/syng-im/src/syng_im/db.cljs b/src/syng_im/db.cljs similarity index 100% rename from syng-im/src/syng_im/db.cljs rename to src/syng_im/db.cljs diff --git a/syng-im/src/syng_im/handlers.cljs b/src/syng_im/handlers.cljs similarity index 100% rename from syng-im/src/syng_im/handlers.cljs rename to src/syng_im/handlers.cljs diff --git a/syng-im/src/syng_im/handlers/commands.cljs b/src/syng_im/handlers/commands.cljs similarity index 100% rename from syng-im/src/syng_im/handlers/commands.cljs rename to src/syng_im/handlers/commands.cljs diff --git a/syng-im/src/syng_im/handlers/contacts.cljs b/src/syng_im/handlers/contacts.cljs similarity index 100% rename from syng-im/src/syng_im/handlers/contacts.cljs rename to src/syng_im/handlers/contacts.cljs diff --git a/syng-im/src/syng_im/handlers/server.cljs b/src/syng_im/handlers/server.cljs similarity index 100% rename from syng-im/src/syng_im/handlers/server.cljs rename to src/syng_im/handlers/server.cljs diff --git a/syng-im/src/syng_im/handlers/sign_up.cljs b/src/syng_im/handlers/sign_up.cljs similarity index 100% rename from syng-im/src/syng_im/handlers/sign_up.cljs rename to src/syng_im/handlers/sign_up.cljs diff --git a/syng-im/src/syng_im/handlers/suggestions.cljs b/src/syng_im/handlers/suggestions.cljs similarity index 100% rename from syng-im/src/syng_im/handlers/suggestions.cljs rename to src/syng_im/handlers/suggestions.cljs diff --git a/syng-im/src/syng_im/ios/core.cljs b/src/syng_im/ios/core.cljs similarity index 100% rename from syng-im/src/syng_im/ios/core.cljs rename to src/syng_im/ios/core.cljs diff --git a/syng-im/src/syng_im/models/chat.cljs b/src/syng_im/models/chat.cljs similarity index 100% rename from syng-im/src/syng_im/models/chat.cljs rename to src/syng_im/models/chat.cljs diff --git a/syng-im/src/syng_im/models/chats.cljs b/src/syng_im/models/chats.cljs similarity index 100% rename from syng-im/src/syng_im/models/chats.cljs rename to src/syng_im/models/chats.cljs diff --git a/syng-im/src/syng_im/models/commands.cljs b/src/syng_im/models/commands.cljs similarity index 100% rename from syng-im/src/syng_im/models/commands.cljs rename to src/syng_im/models/commands.cljs diff --git a/syng-im/src/syng_im/models/contacts.cljs b/src/syng_im/models/contacts.cljs similarity index 100% rename from syng-im/src/syng_im/models/contacts.cljs rename to src/syng_im/models/contacts.cljs diff --git a/syng-im/src/syng_im/models/messages.cljs b/src/syng_im/models/messages.cljs similarity index 100% rename from syng-im/src/syng_im/models/messages.cljs rename to src/syng_im/models/messages.cljs diff --git a/syng-im/src/syng_im/models/protocol.cljs b/src/syng_im/models/protocol.cljs similarity index 100% rename from syng-im/src/syng_im/models/protocol.cljs rename to src/syng_im/models/protocol.cljs diff --git a/syng-im/src/syng_im/models/user_data.cljs b/src/syng_im/models/user_data.cljs similarity index 100% rename from syng-im/src/syng_im/models/user_data.cljs rename to src/syng_im/models/user_data.cljs diff --git a/syng-im/src/syng_im/navigation.cljs b/src/syng_im/navigation.cljs similarity index 100% rename from syng-im/src/syng_im/navigation.cljs rename to src/syng_im/navigation.cljs diff --git a/syng-im/src/syng_im/persistence/realm.cljs b/src/syng_im/persistence/realm.cljs similarity index 100% rename from syng-im/src/syng_im/persistence/realm.cljs rename to src/syng_im/persistence/realm.cljs diff --git a/syng-im/src/syng_im/persistence/simple_kv_store.cljs b/src/syng_im/persistence/simple_kv_store.cljs similarity index 100% rename from syng-im/src/syng_im/persistence/simple_kv_store.cljs rename to src/syng_im/persistence/simple_kv_store.cljs diff --git a/syng-im/src/syng_im/protocol/protocol_handler.cljs b/src/syng_im/protocol/protocol_handler.cljs similarity index 100% rename from syng-im/src/syng_im/protocol/protocol_handler.cljs rename to src/syng_im/protocol/protocol_handler.cljs diff --git a/syng-im/src/syng_im/resources.cljs b/src/syng_im/resources.cljs similarity index 100% rename from syng-im/src/syng_im/resources.cljs rename to src/syng_im/resources.cljs diff --git a/syng-im/src/syng_im/subs.cljs b/src/syng_im/subs.cljs similarity index 100% rename from syng-im/src/syng_im/subs.cljs rename to src/syng_im/subs.cljs diff --git a/syng-im/src/syng_im/utils/crypt.cljs b/src/syng_im/utils/crypt.cljs similarity index 100% rename from syng-im/src/syng_im/utils/crypt.cljs rename to src/syng_im/utils/crypt.cljs diff --git a/syng-im/src/syng_im/utils/event.cljs b/src/syng_im/utils/event.cljs similarity index 100% rename from syng-im/src/syng_im/utils/event.cljs rename to src/syng_im/utils/event.cljs diff --git a/syng-im/src/syng_im/utils/listview.cljs b/src/syng_im/utils/listview.cljs similarity index 100% rename from syng-im/src/syng_im/utils/listview.cljs rename to src/syng_im/utils/listview.cljs diff --git a/syng-im/src/syng_im/utils/phone_number.cljs b/src/syng_im/utils/phone_number.cljs similarity index 100% rename from syng-im/src/syng_im/utils/phone_number.cljs rename to src/syng_im/utils/phone_number.cljs diff --git a/syng-im/src/syng_im/utils/types.cljs b/src/syng_im/utils/types.cljs similarity index 100% rename from syng-im/src/syng_im/utils/types.cljs rename to src/syng_im/utils/types.cljs diff --git a/syng-im/src/syng_im/utils/utils.cljs b/src/syng_im/utils/utils.cljs similarity index 100% rename from syng-im/src/syng_im/utils/utils.cljs rename to src/syng_im/utils/utils.cljs diff --git a/syng-im/.flowconfig b/syng-im/.flowconfig deleted file mode 100644 index c3edaf9464..0000000000 --- a/syng-im/.flowconfig +++ /dev/null @@ -1,65 +0,0 @@ -[ignore] - -# We fork some components by platform. -.*/*.web.js -.*/*.android.js - -# Some modules have their own node_modules with overlap -.*/node_modules/node-haste/.* - -# Ugh -.*/node_modules/babel.* -.*/node_modules/babylon.* -.*/node_modules/invariant.* - -# Ignore react and fbjs where there are overlaps, but don't ignore -# anything that react-native relies on -.*/node_modules/fbjs/lib/Map.js -.*/node_modules/fbjs/lib/Promise.js -.*/node_modules/fbjs/lib/fetch.js -.*/node_modules/fbjs/lib/ExecutionEnvironment.js -.*/node_modules/fbjs/lib/isEmpty.js -.*/node_modules/fbjs/lib/crc32.js -.*/node_modules/fbjs/lib/ErrorUtils.js - -# Flow has a built-in definition for the 'react' module which we prefer to use -# over the currently-untyped source -.*/node_modules/react/react.js -.*/node_modules/react/lib/React.js -.*/node_modules/react/lib/ReactDOM.js - -# Ignore commoner tests -.*/node_modules/commoner/test/.* - -# See https://github.com/facebook/flow/issues/442 -.*/react-tools/node_modules/commoner/lib/reader.js - -# Ignore jest -.*/node_modules/jest-cli/.* - -# Ignore Website -.*/website/.* - -[include] - -[libs] -node_modules/react-native/Libraries/react-native/react-native-interface.js - -[options] -module.system=haste - -munge_underscores=true - -module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub' -module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\)$' -> 'RelativeImageStub' - -suppress_type=$FlowIssue -suppress_type=$FlowFixMe -suppress_type=$FixMe - -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(2[0-1]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(2[0-1]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ -suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy - -[version] -0.21.0 diff --git a/syng-im/.gitignore b/syng-im/.gitignore deleted file mode 100644 index 81c8fbfbec..0000000000 --- a/syng-im/.gitignore +++ /dev/null @@ -1,44 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android/IJ -# -.idea -.gradle -local.properties - -# node.js -# -node_modules/ -npm-debug.log - -# Generated by re-natal -# -index.android.js -index.ios.js -target/ - -# Figwheel -# -figwheel_server.log \ No newline at end of file diff --git a/syng-im/.re-natal b/syng-im/.re-natal deleted file mode 100644 index 8fd652b4ea..0000000000 --- a/syng-im/.re-natal +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "SyngIm", - "interface": "reagent", - "androidHost": "10.0.3.2", - "modules": [ - "react-native-contacts", - "react-native-invertible-scroll-view", - "awesome-phonenumber", - "realm", - "react-native-loading-spinner-overlay", - "react-native-i18n", - "realm/react-native", - "react-native-action-button", - "react-native-vector-icons/Ionicons", - "react-native-circle-checkbox", - "react-native-randombytes" - ], - "imageDirs": [ - "images" - ] -} \ No newline at end of file diff --git a/syng-im/.watchmanconfig b/syng-im/.watchmanconfig deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/syng-im/.watchmanconfig +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/syng-im/CHANGELOG.md b/syng-im/CHANGELOG.md deleted file mode 100644 index e03cc81c3e..0000000000 --- a/syng-im/CHANGELOG.md +++ /dev/null @@ -1,24 +0,0 @@ -# Change Log -All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/). - -## [Unreleased][unreleased] -### Changed -- Add a new arity to `make-widget-async` to provide a different widget shape. - -## [0.1.1] - 2016-03-23 -### Changed -- Documentation on how to make the widgets. - -### Removed -- `make-widget-sync` - we're all async, all the time. - -### Fixed -- Fixed widget maker to keep working when daylight savings switches over. - -## 0.1.0 - 2016-03-23 -### Added -- Files from the new template. -- Widget maker public API - `make-widget-sync`. - -[unreleased]: https://github.com/your-name/syng-im/compare/0.1.1...HEAD -[0.1.1]: https://github.com/your-name/syng-im/compare/0.1.0...0.1.1 diff --git a/syng-im/LICENSE b/syng-im/LICENSE deleted file mode 100644 index 7689f30efd..0000000000 --- a/syng-im/LICENSE +++ /dev/null @@ -1,214 +0,0 @@ -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - -a) in the case of the initial Contributor, the initial code and -documentation distributed under this Agreement, and - -b) in the case of each subsequent Contributor: - -i) changes to the Program, and - -ii) additions to the Program; - -where such changes and/or additions to the Program originate from and are -distributed by that particular Contributor. A Contribution 'originates' from -a Contributor if it was added to the Program by such Contributor itself or -anyone acting on such Contributor's behalf. Contributions do not include -additions to the Program which: (i) are separate modules of software -distributed in conjunction with the Program under their own license -agreement, and (ii) are not derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. - -"Program" means the Contributions distributed in accordance with this -Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. - -2. GRANT OF RIGHTS - -a) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free copyright license to -reproduce, prepare derivative works of, publicly display, publicly perform, -distribute and sublicense the Contribution of such Contributor, if any, and -such derivative works, in source code and object code form. - -b) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free patent license under -Licensed Patents to make, use, sell, offer to sell, import and otherwise -transfer the Contribution of such Contributor, if any, in source code and -object code form. This patent license shall apply to the combination of the -Contribution and the Program if, at the time the Contribution is added by the -Contributor, such addition of the Contribution causes such combination to be -covered by the Licensed Patents. The patent license shall not apply to any -other combinations which include the Contribution. No hardware per se is -licensed hereunder. - -c) Recipient understands that although each Contributor grants the licenses -to its Contributions set forth herein, no assurances are provided by any -Contributor that the Program does not infringe the patent or other -intellectual property rights of any other entity. Each Contributor disclaims -any liability to Recipient for claims brought by any other entity based on -infringement of intellectual property rights or otherwise. As a condition to -exercising the rights and licenses granted hereunder, each Recipient hereby -assumes sole responsibility to secure any other intellectual property rights -needed, if any. For example, if a third party patent license is required to -allow Recipient to distribute the Program, it is Recipient's responsibility -to acquire that license before distributing the Program. - -d) Each Contributor represents that to its knowledge it has sufficient -copyright rights in its Contribution, if any, to grant the copyright license -set forth in this Agreement. - -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under -its own license agreement, provided that: - -a) it complies with the terms and conditions of this Agreement; and - -b) its license agreement: - -i) effectively disclaims on behalf of all Contributors all warranties and -conditions, express and implied, including warranties or conditions of title -and non-infringement, and implied warranties or conditions of merchantability -and fitness for a particular purpose; - -ii) effectively excludes on behalf of all Contributors all liability for -damages, including direct, indirect, special, incidental and consequential -damages, such as lost profits; - -iii) states that any provisions which differ from this Agreement are offered -by that Contributor alone and not by any other party; and - -iv) states that source code for the Program is available from such -Contributor, and informs licensees how to obtain it in a reasonable manner on -or through a medium customarily used for software exchange. - -When the Program is made available in source code form: - -a) it must be made available under this Agreement; and - -b) a copy of this Agreement must be included with each copy of the Program. - -Contributors may not remove or alter any copyright notices contained within -the Program. - -Each Contributor must identify itself as the originator of its Contribution, -if any, in a manner that reasonably allows subsequent Recipients to identify -the originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a -manner which does not create potential liability for other Contributors. -Therefore, if a Contributor includes the Program in a commercial product -offering, such Contributor ("Commercial Contributor") hereby agrees to defend -and indemnify every other Contributor ("Indemnified Contributor") against any -losses, damages and costs (collectively "Losses") arising from claims, -lawsuits and other legal actions brought by a third party against the -Indemnified Contributor to the extent caused by the acts or omissions of such -Commercial Contributor in connection with its distribution of the Program in -a commercial product offering. The obligations in this section do not apply -to any claims or Losses relating to any actual or alleged intellectual -property infringement. In order to qualify, an Indemnified Contributor must: -a) promptly notify the Commercial Contributor in writing of such claim, and -b) allow the Commercial Contributor tocontrol, and cooperate with the -Commercial Contributor in, the defense and any related settlement -negotiations. The Indemnified Contributor may participate in any such claim -at its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If -that Commercial Contributor then makes performance claims, or offers -warranties related to Product X, those performance claims and warranties are -such Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a -court requires any other Contributor to pay any damages as a result, the -Commercial Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON -AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER -EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR -CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A -PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the -appropriateness of using and distributing the Program and assumes all risks -associated with its exercise of rights under this Agreement , including but -not limited to the risks and costs of program errors, compliance with -applicable laws, damage to or loss of data, programs or equipment, and -unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION -LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE -EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this Agreement, and without further action by the -parties hereto, such provision shall be reformed to the minimum extent -necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Program itself -(excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted -under Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and -does not cure such failure in a reasonable period of time after becoming -aware of such noncompliance. If all Recipient's rights under this Agreement -terminate, Recipient agrees to cease use and distribution of the Program as -soon as reasonably practicable. However, Recipient's obligations under this -Agreement and any licenses granted by Recipient relating to the Program shall -continue and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to -time. No one other than the Agreement Steward has the right to modify this -Agreement. The Eclipse Foundation is the initial Agreement Steward. The -Eclipse Foundation may assign the responsibility to serve as the Agreement -Steward to a suitable separate entity. Each new version of the Agreement will -be given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the -Agreement under which it was received. In addition, after a new version of -the Agreement is published, Contributor may elect to distribute the Program -(including its Contributions) under the new version. Except as expressly -stated in Sections 2(a) and 2(b) above, Recipient receives no rights or -licenses to the intellectual property of any Contributor under this -Agreement, whether expressly, by implication, estoppel or otherwise. All -rights in the Program not expressly granted under this Agreement are -reserved. - -This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial -in any resulting litigation. diff --git a/syng-im/README.md b/syng-im/README.md deleted file mode 100644 index 19e1fbc53f..0000000000 --- a/syng-im/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# syng-im - -A Clojure library designed to ... well, that part is up to you. - -## Usage - -FIXME - -## License - -Copyright © 2016 FIXME - -Distributed under the Eclipse Public License either version 1.0 or (at -your option) any later version. diff --git a/syng-im/android/app/build.gradle b/syng-im/android/app/build.gradle deleted file mode 100644 index 9f152c2e9b..0000000000 --- a/syng-im/android/app/build.gradle +++ /dev/null @@ -1,134 +0,0 @@ -apply plugin: "com.android.application" - -import com.android.build.OutputFile - -/** - * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets - * and bundleReleaseJsAndAssets). - * These basically call `react-native bundle` with the correct arguments during the Android build - * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the - * bundle directly from the development server. Below you can see all the possible configurations - * and their defaults. If you decide to add a configuration block, make sure to add it before the - * `apply from: "react.gradle"` line. - * - * project.ext.react = [ - * // the name of the generated asset file containing your JS bundle - * bundleAssetName: "index.android.bundle", - * - * // the entry file for bundle generation - * entryFile: "index.android.js", - * - * // whether to bundle JS and assets in debug mode - * bundleInDebug: false, - * - * // whether to bundle JS and assets in release mode - * bundleInRelease: true, - * - * // whether to bundle JS and assets in another build variant (if configured). - * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants - * // The configuration property is in the format 'bundleIn${productFlavor}${buildType}' - * // bundleInFreeDebug: true, - * // bundleInPaidRelease: true, - * // bundleInBeta: true, - * - * // the root of your project, i.e. where "package.json" lives - * root: "../../", - * - * // where to put the JS bundle asset in debug mode - * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", - * - * // where to put the JS bundle asset in release mode - * jsBundleDirRelease: "$buildDir/intermediates/assets/release", - * - * // where to put drawable resources / React Native assets, e.g. the ones you use via - * // require('./image.png')), in debug mode - * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", - * - * // where to put drawable resources / React Native assets, e.g. the ones you use via - * // require('./image.png')), in release mode - * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", - * - * // by default the gradle tasks are skipped if none of the JS files or assets change; this means - * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to - * // date; if you have any other folders that you want to ignore for performance reasons (gradle - * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ - * // for example, you might want to remove it from here. - * inputExcludes: ["android/**", "ios/**"] - * ] - */ - -apply from: "react.gradle" - -/** - * Set this to true to create three separate APKs instead of one: - * - A universal APK that works on all devices - * - An APK that only works on ARM devices - * - An APK that only works on x86 devices - * The advantage is the size of the APK is reduced by about 4MB. - * Upload all the APKs to the Play Store and people will download - * the correct one based on the CPU architecture of their device. - */ -def enableSeparateBuildPerCPUArchitecture = false - -/** - * Run Proguard to shrink the Java bytecode in release builds. - */ -def enableProguardInReleaseBuilds = false - -android { - compileSdkVersion 23 - buildToolsVersion "23.0.1" - - defaultConfig { - applicationId "com.syngim" - minSdkVersion 16 - targetSdkVersion 22 - versionCode 1 - versionName "1.0" - ndk { - abiFilters "armeabi-v7a", "x86" - } - } - splits { - abi { - enable enableSeparateBuildPerCPUArchitecture - universalApk false - reset() - include "armeabi-v7a", "x86" - } - } - buildTypes { - release { - minifyEnabled enableProguardInReleaseBuilds - proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - } - } - // applicationVariants are e.g. debug, release - applicationVariants.all { variant -> - variant.outputs.each { output -> - // For each separate APK per architecture, set a unique version code as described here: - // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits - def versionCodes = ["armeabi-v7a":1, "x86":2] - def abi = output.getFilter(OutputFile.ABI) - if (abi != null) { // null for the universal-debug, universal-release variants - output.versionCodeOverride = - versionCodes.get(abi) * 1048576 + defaultConfig.versionCode - } - } - } -} - -dependencies { - compile project(':randombytes') - compile project(':realm') - compile project(':react-native-vector-icons') - compile fileTree(dir: "libs", include: ["*.jar"]) - compile "com.android.support:appcompat-v7:23.0.1" - compile "com.facebook.react:react-native:+" // From node_modules - compile project(':react-native-contacts') - compile project(':react-native-i18n') -// compile(name:'geth', ext:'aar') - compile(group: 'syng-im', name: 'android-geth', version: '1.4.0-201603131817-92d65cf', ext: 'aar') - - compile fileTree(dir: "node_modules/realm/android/libs", include: ["*.jar"]) -} diff --git a/syng-im/android/app/proguard-rules.pro b/syng-im/android/app/proguard-rules.pro deleted file mode 100644 index 7d72e46927..0000000000 --- a/syng-im/android/app/proguard-rules.pro +++ /dev/null @@ -1,67 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Disabling obfuscation is useful if you collect stack traces from production crashes -# (unless you are using a system that supports de-obfuscate the stack traces). --dontobfuscate - -# React Native - -# Keep our interfaces so they can be used by other ProGuard rules. -# See http://sourceforge.net/p/proguard/bugs/466/ --keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip --keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters - -# Do not strip any method/class that is annotated with @DoNotStrip --keep @com.facebook.proguard.annotations.DoNotStrip class * --keepclassmembers class * { - @com.facebook.proguard.annotations.DoNotStrip *; -} - --keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { - void set*(***); - *** get*(); -} - --keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } --keep class * extends com.facebook.react.bridge.NativeModule { *; } --keepclassmembers,includedescriptorclasses class * { native ; } --keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } --keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } --keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } - --dontwarn com.facebook.react.** - -# okhttp - --keepattributes Signature --keepattributes *Annotation* --keep class com.squareup.okhttp.** { *; } --keep interface com.squareup.okhttp.** { *; } --dontwarn com.squareup.okhttp.** - -# okio - --keep class sun.misc.Unsafe { *; } --dontwarn java.nio.file.* --dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement --dontwarn okio.** - -# stetho - --dontwarn com.facebook.stetho.** diff --git a/syng-im/android/app/react.gradle b/syng-im/android/app/react.gradle deleted file mode 100644 index 4b43bf910c..0000000000 --- a/syng-im/android/app/react.gradle +++ /dev/null @@ -1,96 +0,0 @@ -import org.apache.tools.ant.taskdefs.condition.Os - -def config = project.hasProperty("react") ? project.react : []; - -def bundleAssetName = config.bundleAssetName ?: "index.android.bundle" -def entryFile = config.entryFile ?: "index.android.js" - -// because elvis operator -def elvisFile(thing) { - return thing ? file(thing) : null; -} - -def reactRoot = elvisFile(config.root) ?: file("../../") -def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"] - -void runBefore(String dependentTaskName, Task task) { - Task dependentTask = tasks.findByPath(dependentTaskName); - if (dependentTask != null) { - dependentTask.dependsOn task - } -} - -gradle.projectsEvaluated { - // Grab all build types and product flavors - def buildTypes = android.buildTypes.collect { type -> type.name } - def productFlavors = android.productFlavors.collect { flavor -> flavor.name } - - // When no product flavors defined, use empty - if (!productFlavors) productFlavors.add('') - - productFlavors.each { productFlavorName -> - buildTypes.each { buildTypeName -> - // Create variant and source names - def sourceName = "${buildTypeName}" - def targetName = "${sourceName.capitalize()}" - if (productFlavorName) { - sourceName = "${productFlavorName}${targetName}" - } - - // React js bundle directories - def jsBundleDirConfigName = "jsBundleDir${targetName}" - def jsBundleDir = elvisFile(config."$jsBundleDirConfigName") ?: - file("$buildDir/intermediates/assets/${sourceName}") - - def resourcesDirConfigName = "jsBundleDir${targetName}" - def resourcesDir = elvisFile(config."${resourcesDirConfigName}") ?: - file("$buildDir/intermediates/res/merged/${sourceName}") - def jsBundleFile = file("$jsBundleDir/$bundleAssetName") - - // Bundle task name for variant - def bundleJsAndAssetsTaskName = "bundle${targetName}JsAndAssets" - - def currentBundleTask = tasks.create( - name: bundleJsAndAssetsTaskName, - type: Exec) { - group = "react" - description = "bundle JS and assets for ${targetName}." - - // Create dirs if they are not there (e.g. the "clean" task just ran) - doFirst { - jsBundleDir.mkdirs() - resourcesDir.mkdirs() - } - - // Set up inputs and outputs so gradle can cache the result - inputs.files fileTree(dir: reactRoot, excludes: inputExcludes) - outputs.dir jsBundleDir - outputs.dir resourcesDir - - // Set up the call to the react-native cli - workingDir reactRoot - - // Set up dev mode - def devEnabled = !targetName.toLowerCase().contains("release") - if (Os.isFamily(Os.FAMILY_WINDOWS)) { - commandLine "cmd", "/c", "react-native", "bundle", "--platform", "android", "--dev", "${devEnabled}", - "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir - } else { - commandLine "react-native", "bundle", "--platform", "android", "--dev", "${devEnabled}", - "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir - } - - enabled config."bundleIn${targetName}" ?: targetName.toLowerCase().contains("release") - } - - // Hook bundle${productFlavor}${buildType}JsAndAssets into the android build process - currentBundleTask.dependsOn("merge${targetName}Resources") - currentBundleTask.dependsOn("merge${targetName}Assets") - - runBefore("processArmeabi-v7a${targetName}Resources", currentBundleTask) - runBefore("processX86${targetName}Resources", currentBundleTask) - runBefore("processUniversal${targetName}Resources", currentBundleTask) - runBefore("process${targetName}Resources", currentBundleTask) - } - } -} diff --git a/syng-im/android/app/src/main/AndroidManifest.xml b/syng-im/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index c56b2f64b8..0000000000 --- a/syng-im/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/syng-im/android/app/src/main/assets/fonts/Avenir-Roman.ttf b/syng-im/android/app/src/main/assets/fonts/Avenir-Roman.ttf deleted file mode 100644 index f58eeaab87363c67ee837c1c62566c33cdc225ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104588 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 G%YOiu_j7Il diff --git a/syng-im/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/syng-im/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index cde69bcccec65160d92116f20ffce4fce0b5245c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3418 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 diff --git a/syng-im/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/syng-im/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index bfa42f0e7b91d006d22352c9ff2f134e504e3c1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4842 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 diff --git a/syng-im/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/syng-im/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 324e72cdd7480cb983fa1bcc7ce686e51ef87fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7718 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 diff --git a/syng-im/android/app/src/main/res/values/strings.xml b/syng-im/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 7b66980444..0000000000 --- a/syng-im/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - SyngIm - diff --git a/syng-im/android/app/src/main/res/values/styles.xml b/syng-im/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 319eb0ca10..0000000000 --- a/syng-im/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/syng-im/android/build.gradle b/syng-im/android/build.gradle deleted file mode 100644 index f05bf1a9b7..0000000000 --- a/syng-im/android/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - repositories { - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:1.3.1' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - mavenLocal() - jcenter() - maven { - // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm - url "$projectDir/../../node_modules/react-native/android" - } - // for geth - flatDir { - dirs 'libs' - } - maven { - url "http://85.90.244.96:8081/artifactory/libs-release-local" - } - } -} diff --git a/syng-im/android/gradle.properties b/syng-im/android/gradle.properties deleted file mode 100644 index 1fd964e90b..0000000000 --- a/syng-im/android/gradle.properties +++ /dev/null @@ -1,20 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -android.useDeprecatedNdk=true diff --git a/syng-im/android/gradle/wrapper/gradle-wrapper.jar b/syng-im/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index b5166dad4d90021f6a0b45268c0755719f1d5cd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52266 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 z 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 diff --git a/syng-im/android/gradle/wrapper/gradle-wrapper.properties b/syng-im/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index b9fbfaba0e..0000000000 --- a/syng-im/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip diff --git a/syng-im/android/gradlew b/syng-im/android/gradlew deleted file mode 100755 index 91a7e269e1..0000000000 --- a/syng-im/android/gradlew +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/syng-im/android/gradlew.bat b/syng-im/android/gradlew.bat deleted file mode 100644 index aec99730b4..0000000000 --- a/syng-im/android/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/syng-im/android/settings.gradle b/syng-im/android/settings.gradle deleted file mode 100644 index 784925e19a..0000000000 --- a/syng-im/android/settings.gradle +++ /dev/null @@ -1,16 +0,0 @@ -rootProject.name = 'SyngIm' - -include ':app' - -include ':react-native-contacts' -project(':react-native-contacts').projectDir = new File(settingsDir, '../node_modules/react-native-contacts/android') - -include ':react-native-i18n' -project(':react-native-i18n').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-i18n/android') -// realm dependency -include ':react-native-vector-icons' -project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') -include ':realm' -project(':realm').projectDir = new File(rootProject.projectDir, '../node_modules/realm/android') -include ':randombytes' -project(':randombytes').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-randombytes/app') \ No newline at end of file diff --git a/syng-im/doc/intro.md b/syng-im/doc/intro.md deleted file mode 100644 index 7a0eb4e81c..0000000000 --- a/syng-im/doc/intro.md +++ /dev/null @@ -1,3 +0,0 @@ -# Introduction to syng-im - -TODO: write [great documentation](http://jacobian.org/writing/what-to-write/) diff --git a/syng-im/env/dev/env/android/main.cljs b/syng-im/env/dev/env/android/main.cljs deleted file mode 100644 index 2348604c4a..0000000000 --- a/syng-im/env/dev/env/android/main.cljs +++ /dev/null @@ -1,18 +0,0 @@ - (ns ^:figwheel-no-load env.android.main - (:require [reagent.core :as r] - [syng-im.android.core :refer [app-root]] - [figwheel.client :as figwheel :include-macros true] - [syng-im.android.core :as core])) - - (enable-console-print!) - -(def cnt (r/atom 0)) -(defn reloader [] @cnt [app-root]) -(def root-el (r/as-element [reloader])) - -(figwheel/watch-and-reload - :websocket-url "ws://10.0.3.2:3449/figwheel-ws" - :heads-up-display true - :jsload-callback #(swap! cnt inc)) - -(core/init) \ No newline at end of file diff --git a/syng-im/env/dev/env/ios/main.cljs b/syng-im/env/dev/env/ios/main.cljs deleted file mode 100644 index 748936a414..0000000000 --- a/syng-im/env/dev/env/ios/main.cljs +++ /dev/null @@ -1,17 +0,0 @@ - (ns ^:figwheel-no-load env.ios.main - (:require [reagent.core :as r] - [syng-im.ios.core :as core] - [figwheel.client :as figwheel :include-macros true])) - - (enable-console-print!) - -(def cnt (r/atom 0)) -(defn reloader [] @cnt [core/app-root]) -(def root-el (r/as-element [reloader])) - -(figwheel/watch-and-reload - :websocket-url "ws://localhost:3449/figwheel-ws" - :heads-up-display true - :jsload-callback #(swap! cnt inc)) - -(core/init) \ No newline at end of file diff --git a/syng-im/env/dev/user.clj b/syng-im/env/dev/user.clj deleted file mode 100644 index 4c2ca8be74..0000000000 --- a/syng-im/env/dev/user.clj +++ /dev/null @@ -1,26 +0,0 @@ -(ns user - (:use [figwheel-sidecar.repl-api :as ra])) -;; This namespace is loaded automatically by nREPL - -;; read project.clj to get build configs -(def profiles (->> "project.clj" - slurp - read-string - (drop-while #(not= % :profiles)) - (apply hash-map) - :profiles)) - -(def cljs-builds (get-in profiles [:dev :cljsbuild :builds])) - -(defn start-figwheel - "Start figwheel for one or more builds" - [& build-ids] - (ra/start-figwheel! - {:build-ids build-ids - :all-builds cljs-builds}) - (ra/cljs-repl)) - -(defn stop-figwheel - "Stops figwheel" - [] - (ra/stop-figwheel!)) \ No newline at end of file diff --git a/syng-im/env/prod/env/android/main.cljs b/syng-im/env/prod/env/android/main.cljs deleted file mode 100644 index f112100ec7..0000000000 --- a/syng-im/env/prod/env/android/main.cljs +++ /dev/null @@ -1,6 +0,0 @@ - (ns env.android.main - (:require [syng-im.android.core :as core])) - - (core/init) - - diff --git a/syng-im/env/prod/env/ios/main.cljs b/syng-im/env/prod/env/ios/main.cljs deleted file mode 100644 index 11392b5e72..0000000000 --- a/syng-im/env/prod/env/ios/main.cljs +++ /dev/null @@ -1,6 +0,0 @@ - (ns env.ios.main - (:require [syng-im.ios.core :as core])) - - (core/init) - - diff --git a/syng-im/figwheel-bridge.js b/syng-im/figwheel-bridge.js deleted file mode 100644 index 2a7cb1cc2f..0000000000 --- a/syng-im/figwheel-bridge.js +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Originally taken from https://github.com/decker405/figwheel-react-native - * - * @providesModule figwheel-bridge - */ - -var CLOSURE_UNCOMPILED_DEFINES = null; - -var config = { - basePath: "target/", - googBasePath: 'goog/', - serverPort: 8081 -}; - -var React = require('react-native'); -var self; -var scriptQueue = []; -var serverHost = null; // will be set dynamically -var fileBasePath = null; // will be set dynamically -var evaluate = eval; // This is needed, direct calls to eval does not work (RN packager???) -var externalModules = {}; -var evalListeners = []; // functions to be called when a script is evaluated - -var figwheelApp = function (platform, devHost) { - return React.createClass({ - getInitialState: function () { - return {loaded: false} - }, - render: function () { - if (!this.state.loaded) { - var plainStyle = {flex: 1, alignItems: 'center', justifyContent: 'center'}; - return ( - - Waiting for Figwheel to load files. - - ); - } - return this.state.root; - }, - componentDidMount: function () { - var app = this; - if (typeof goog === "undefined") { - loadApp(platform, devHost, function(appRoot) { - app.setState({root: appRoot, loaded: true}) - }); - } - } - }) -}; - -// evaluates js code ensuring proper ordering -function customEval(url, javascript, success, error) { - if (scriptQueue.length > 0) { - if (scriptQueue[0] === url) { - try { - evaluate(javascript); - console.info('Evaluated: ' + url); - scriptQueue.shift(); - evalListeners.forEach(function (listener) { - listener(url) - }); - success(); - } catch (e) { - console.error('Evaluation error in: ' + url); - console.error(e); - error(); - } - } else { - setTimeout(function () { - customEval(url, javascript, success, error) - }, 5); - } - } else { - console.error('Something bad happened...'); - error() - } -} - -var isChrome = function () { - return typeof importScripts === "function" -}; - -function asyncImportScripts(url, success, error) { - console.info('(asyncImportScripts) Importing: ' + url); - scriptQueue.push(url); - fetch(url) - .then(function (response) { - return response.text() - }) - .then(function (responseText) { - return customEval(url, responseText, success, error); - }) - .catch(function (error) { - console.error('Error loading script, please check your config setup.'); - console.error(error); - return error(); - }); -} - -function syncImportScripts(url, success, error) { - try { - importScripts(url); - console.info('Evaluated: ' + url); - evalListeners.forEach(function (listener) { - listener(url) - }); - success(); - } catch (e) { - error() - } -} - -// Loads js file sync if possible or async. -function importJs(src, success, error) { - if (typeof success !== 'function') { - success = function () { - }; - } - if (typeof error !== 'function') { - error = function () { - }; - } - - var file = fileBasePath + '/' + src; - - console.info('(importJs) Importing: ' + file); - if (isChrome()) { - syncImportScripts(serverBaseUrl("localhost") + '/' + file, success, error); - } else { - asyncImportScripts(serverBaseUrl(serverHost) + '/' + file, success, error); - } -} - -function interceptRequire() { - var oldRequire = window.require; - console.info("Shimming require"); - window.require = function (id) { - console.info("Requiring: " + id); - if (externalModules[id]) { - return externalModules[id]; - } - return oldRequire(id); - }; -} - -// do not show debug messages in yellow box -function debugToLog() { - console.debug = console.log; -} - -function serverBaseUrl(host) { - return "http://" + host + ":" + config.serverPort -} - -function loadApp(platform, devHost, onLoadCb) { - serverHost = devHost; - fileBasePath = config.basePath + platform; - - evalListeners.push(function (url) { - if (url.indexOf('jsloader') > -1) { - shimJsLoader(); - } - }); - - // callback when app is ready to get the reloadable component - var mainJs = '/env/' + platform + '/main.js'; - evalListeners.push(function (url) { - if (url.indexOf(mainJs) > -1) { - onLoadCb(env[platform].main.root_el); - console.log('Done loading Clojure app'); - } - }); - - if (typeof goog === "undefined") { - console.log('Loading Closure base.'); - interceptRequire(); - importJs('goog/base.js', function () { - shimBaseGoog(); - fakeLocalStorageAndDocument(); - importJs('cljs_deps.js'); - importJs('goog/deps.js', function () { - debugToLog(); - // This is needed because of RN packager - // seriously React packager? why. - var googreq = goog.require; - - googreq('figwheel.connect'); - }); - }); - } -} - -function startApp(appName, platform, devHost) { - React.AppRegistry.registerComponent( - appName, () => figwheelApp(platform, devHost)); -} - -function withModules(moduleById) { - externalModules = moduleById; - return self; -} - -// Goog fixes -function shimBaseGoog() { - console.info('Shimming goog functions.'); - goog.basePath = 'goog/'; - goog.writeScriptSrcNode = importJs; - goog.writeScriptTag_ = function (src, optSourceText) { - importJs(src); - return true; - }; - goog.inHtmlDocument_ = function () { - return true; - }; -} - -function fakeLocalStorageAndDocument() { - window.localStorage = {}; - window.localStorage.getItem = function () { - return 'true'; - }; - window.localStorage.setItem = function () { - }; - - window.document = {}; - window.document.body = {}; - window.document.body.dispatchEvent = function () { - }; - window.document.createElement = function () { - }; - - if (typeof window.location === 'undefined') { - window.location = {}; - } - console.debug = console.warn; - window.addEventListener = function () { - }; - // make figwheel think that heads-up-display divs are there - window.document.querySelector = function (selector) { - return {}; - }; - window.document.getElementById = function (id) { - return {style:{}}; - }; -} - -// Figwheel fixes -// Used by figwheel - uses importScript to load JS rather than