removed unused npm modules, screens, components

Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
This commit is contained in:
Andrey Shovkoplyas 2018-03-23 15:52:37 +03:00
parent f7f41d2f37
commit c1c5854cb1
No known key found for this signature in database
GPG Key ID: EAAB7C8622D860A4
63 changed files with 147 additions and 2437 deletions

View File

@ -15,17 +15,12 @@
"realm",
"react-native-i18n",
"realm/react-native",
"react-native-action-button",
"react-native-vector-icons/Ionicons",
"react-native-vector-icons/Octicons",
"react-native-randombytes",
"dismissKeyboard",
"react-native-linear-gradient",
"react-native-splash-screen",
"react-native-status",
"react-native-camera",
"react-native-qrcode",
"react-native-orientation",
"identicon.js",
"react-native-fs",
"react-native-dialogs",

View File

@ -197,15 +197,12 @@ dependencies {
implementation project(':react-native-dialogs')
implementation project(':react-native-randombytes')
implementation project(':realm')
implementation project(':react-native-vector-icons')
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "com.android.support:appcompat-v7:23.0.1"
implementation "com.facebook.react:react-native:+" // From node_modules
implementation project(':react-native-i18n')
implementation project(':react-native-linear-gradient')
implementation project(':react-native-camera')
implementation project(':react-native-status')
implementation project(':react-native-orientation')
implementation project(':react-native-fs')
implementation project(':react-native-image-crop-picker')
implementation project(':react-native-webview-bridge')

View File

@ -1,7 +1,6 @@
package im.status.ethereum;
import android.support.multidex.MultiDexApplication;
import com.BV.LinearGradient.LinearGradientPackage;
import com.aakashns.reactnativedialogs.ReactNativeDialogsPackage;
import com.bitgo.randombytes.RandomBytesPackage;
import org.devio.rn.splashscreen.SplashScreenReactPackage;
@ -15,11 +14,9 @@ import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;
import com.github.alinz.reactnativewebviewbridge.WebViewBridgePackage;
import com.github.yamill.orientation.OrientationPackage;
import com.AlexanderZaytsev.RNI18n.RNI18nPackage;
import com.instabug.reactlibrary.RNInstabugReactnativePackage;
import com.lwansbrough.RCTCamera.RCTCameraPackage;
import com.oblador.vectoricons.VectorIconsPackage;
import com.reactnative.ivpusic.imagepicker.PickerPackage;
import com.rnfs.RNFSPackage;
import es.tiarg.nfcreactnative.NfcReactNativePackage;
@ -65,12 +62,9 @@ public class MainApplication extends MultiDexApplication implements ReactApplica
new SplashScreenReactPackage(),
statusPackage,
new RealmReactPackage(),
new VectorIconsPackage(),
new RNI18nPackage(),
new RandomBytesPackage(),
new LinearGradientPackage(),
new RCTCameraPackage(),
new OrientationPackage(),
new RNFSPackage(),
new ReactNativeDialogsPackage(),
new ImageResizerPackage(),

View File

@ -22,18 +22,12 @@ include ':react-native-randombytes'
project(':react-native-randombytes').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-randombytes/android')
include ':react-native-i18n'
project(':react-native-i18n').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-i18n/android')
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 ':react-native-linear-gradient'
project(':react-native-linear-gradient').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-linear-gradient/android')
include ':react-native-status'
project(':react-native-status').projectDir = new File(rootProject.projectDir, '../modules/react-native-status/android')
include ':react-native-camera'
project(':react-native-camera').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-camera/android')
include ':react-native-orientation', ':app'
project(':react-native-orientation').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-orientation/android')
include ':react-native-fs'
project(':react-native-fs').projectDir = new File(settingsDir, '../node_modules/react-native-fs/android')
include ':react-native-image-crop-picker'

View File

@ -24,7 +24,6 @@
(def native-modules (.-NativeModules js-dependencies/react-native))
(def device-event-emitter (.-DeviceEventEmitter js-dependencies/react-native))
(def dismiss-keyboard! js-dependencies/dismiss-keyboard)
(def orientation js-dependencies/orientation)
(def back-handler (get-react-property "BackHandler"))
(def splash-screen (.-SplashScreen native-modules))
@ -51,16 +50,11 @@
(def switch (get-class "Switch"))
(def check-box (get-class "CheckBox"))
(def touchable-without-feedback (get-class "TouchableWithoutFeedback"))
(def touchable-highlight-class (get-class "TouchableHighlight"))
(def touchable-opacity (get-class "TouchableOpacity"))
(def activity-indicator (get-class "ActivityIndicator"))
(def modal (get-class "Modal"))
(def picker-class (get-class "Picker"))
(def picker-item-class
(when-let [picker (get-react-property "Picker")]
(adapt-class (.-Item picker))))
(def pan-responder (.-PanResponder js-dependencies/react-native))
(def animated (.-Animated js-dependencies/react-native))
@ -123,22 +117,9 @@
(defn get-dimensions [name]
(js->clj (.get dimensions name) :keywordize-keys true))
(def gradient (adapt-class (.-default js-dependencies/linear-gradient)))
(defn linear-gradient [props]
[gradient props])
(defn list-item [component]
(reagent/as-element component))
(defn picker
([{:keys [style item-style selected on-change]} items]
[picker-class {:selectedValue selected :style style :itemStyle item-style :onValueChange on-change}
(for [{:keys [label value]} items]
^{:key (str value)}
[picker-item-class
{:label (or label value) :value value}])]))
;; Image picker
(def image-picker-class js-dependencies/image-crop-picker)

View File

@ -2,7 +2,7 @@
(:require [clojure.string :as string]
[hickory.core :as hickory]))
(def svg-tags #{:svg :g :rect :path :use :defs})
(def svg-tags #{:svg :g :rect :path :use :defs :circle})
(defmacro slurp-svg [file]
"Reads svg file, and return function (fn [color] ..), which returns hiccup structure for react-native-svg lib

View File

@ -13,7 +13,6 @@
00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
00E356F31AD99517003FC87E /* StatusImTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* StatusImTests.m */; };
0F942CF509F74CCDB5CB35B0 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 54E2B86FB12D4CC49DA05C69 /* MaterialIcons.ttf */; };
133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
@ -34,15 +33,10 @@
25DC9C9DC25846BD8D084888 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B9A886A2CB448B1ABA0EB62 /* libc++.tbd */; };
3E15DFEC1F6F4D7CAE088F49 /* libTcpSockets.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C2A4E93F6B154AEFA3485B45 /* libTcpSockets.a */; };
4C16DE0C1F89508700AA10DB /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C16DE0B1F89508700AA10DB /* JavaScriptCore.framework */; };
4D3D740D5EFA4F8592B048D7 /* libBVLinearGradient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DF1CD4C3D1254774ACCAE4E8 /* libBVLinearGradient.a */; };
4FFAE7B0414A463991039A2E /* libRNRandomBytes.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C55F15EB4D4DAF9202A662 /* libRNRandomBytes.a */; };
5974D2035B8B47E0946B63B6 /* libRNFIRMessaging.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F752F17B1E04216B1337A72 /* libRNFIRMessaging.a */; };
5F8585D411844E5981B94F40 /* libRNInstabug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EC426A98043452BB6F9C134 /* libRNInstabug.a */; };
67F099D82798449FADF8358A /* libRCTOrientation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5535217F57E44D77AA9CF083 /* libRCTOrientation.a */; };
6CE6374707AC4EC788354DD1 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 11632AA0A5F84F029DD91797 /* libRNVectorIcons.a */; };
74242ACAF37A48D0BFACDE82 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2756305FAFF144C4A6B0A039 /* Zocial.ttf */; };
81C6E6AE0AA739BE9D87C1D0 /* libPods-StatusImTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FC1CBCFE6C906043D6CCEEE1 /* libPods-StatusImTests.a */; };
82E689BAF9FB43C8AC6FF1CA /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CEB0E2659D1A4F5FA842057A /* EvilIcons.ttf */; };
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
8E55E6877F950B81C8D711C5 /* libPods-StatusIm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 101A4045637A2ADF57D28EF5 /* libPods-StatusIm.a */; };
925C1F471F7B73B20063DFA0 /* FirebaseCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 925C1F401F7B73B20063DFA0 /* FirebaseCore.framework */; };
@ -63,9 +57,7 @@
9EE89E271E03FCB7007D3C25 /* libSplashScreen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B24FC7F21DE718EF00D694FF /* libSplashScreen.a */; };
9EE89E2D1E03FD9F007D3C25 /* libimageCropPicker.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 20A5C9531D927137002C4965 /* libimageCropPicker.a */; };
9EF0836B1F3B53AB00876A8F /* libReactNativeConfig.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EF083611F3B538B00876A8F /* libReactNativeConfig.a */; };
A6AF670051B842249D520C7B /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7ED174A34D7D42358313368B /* Foundation.ttf */; };
ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };
AE97D4B08C9F4821B8E9C50B /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 359B076A658B4FBAB5128B03 /* Ionicons.ttf */; };
B23B48FF1E76917B006D4535 /* RobotoMono-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B23B48FE1E76917B006D4535 /* RobotoMono-Medium.ttf */; };
B24FC7FD1DE7195700D694FF /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B24FC7FC1DE7195700D694FF /* Social.framework */; };
B24FC7FF1DE7195F00D694FF /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B24FC7FE1DE7195F00D694FF /* MessageUI.framework */; };
@ -73,12 +65,9 @@
B2F2D1BC1D9D531B00B7B453 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B2F2D1BB1D9D531B00B7B453 /* Images.xcassets */; };
B957A49EB0DE44D9A31CAF2D /* libRNSVG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2BF381BC7B4EB0887F0091 /* libRNSVG.a */; };
BA68A2377A20496EA737000D /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E586E1B0E544F64AA9F5BD1 /* libz.tbd */; };
C3EE9AEA6F77464588FBAA64 /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7B5870D9ED504F32B6A09C35 /* FontAwesome.ttf */; };
C93242561FE1C68C00FE7099 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C93242531FE1C68C00FE7099 /* libRCTAnimation.a */; };
CE4E31B31D8695250033ED64 /* Statusgo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE4E31B21D8695250033ED64 /* Statusgo.framework */; };
D28AEFB4C39548EB80416889 /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 52E205D210BC48B7A553BB62 /* Entypo.ttf */; };
E0AD9E8F495A4907B65104BF /* libRCTImageResizer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2BEE3436791D42248F853999 /* libRCTImageResizer.a */; };
EF2B5857B4A34E0C9707FB3F /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B3B19223008342D096AA356E /* Octicons.ttf */; };
F9238D6C1E5F055900C047B9 /* SF-UI-Text-Semibold.otf in Resources */ = {isa = PBXBuildFile; fileRef = F9238D6B1E5F055900C047B9 /* SF-UI-Text-Semibold.otf */; };
FD4F213C3873473CB703B1D2 /* libRNFS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 674B3D9595A047AB8D518F4E /* libRNFS.a */; };
/* End PBXBuildFile section */
@ -175,13 +164,6 @@
remoteGlobalIDString = 73EEC9391BFE4B1D00D468EB;
remoteInfo = RNRandomBytes;
};
20B7D1021D3F74CD00B70F14 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 8AE71EE8751F4652B13BFE83 /* RNVectorIcons.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 5DBEB1501B18CEA900B34395;
remoteInfo = RNVectorIcons;
};
20B7D10D1D3F74CD00B70F14 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 46E2F6052EB44C698C680894 /* RNI18n.xcodeproj */;
@ -203,20 +185,6 @@
remoteGlobalIDString = F12AFB9B1ADAF8F800E0535D;
remoteInfo = RNFS;
};
20B7D11E1D3F74CD00B70F14 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 807594C429CA44128AB5666B /* BVLinearGradient.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 134814201AA4EA6300B7C361;
remoteInfo = BVLinearGradient;
};
20B7D1231D3F74CD00B70F14 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 43A6FA689D844B0BAF3AA8B4 /* RCTOrientation.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 134814201AA4EA6300B7C361;
remoteInfo = RCTOrientation;
};
20B7D1281D3F74CD00B70F14 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = F090E261B9854867A728CE4F /* RealmReact.xcodeproj */;
@ -224,6 +192,20 @@
remoteGlobalIDString = F60690131CA2766F0003FB26;
remoteInfo = RealmReact;
};
5537E2A920650E640085CED4 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = EBF21BDC1FC498900052F4D5;
remoteInfo = jsinspector;
};
5537E2AB20650E640085CED4 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = EBF21BFA1FC4989A0052F4D5;
remoteInfo = "jsinspector-tvOS";
};
78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
@ -343,13 +325,6 @@
remoteGlobalIDString = B29EC9CC1E48BED600704A36;
remoteInfo = RCTHttpServer;
};
C90047C41FC47AF50002B8EA /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 807594C429CA44128AB5666B /* BVLinearGradient.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 64AA15081EF7F30100718508;
remoteInfo = "BVLinearGradient-tvOS";
};
C90047CC1FC47AF50002B8EA /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;
@ -559,34 +534,25 @@
20A5C96E1D92716C002C4965 /* QBImagePicker.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QBImagePicker.framework; path = "../node_modules/react-native-image-crop-picker/ios/QBImagePicker/build/Debug-iphoneos/QBImagePicker.framework"; sourceTree = "<group>"; };
20B6B6831D92C42600CC5C6A /* RSKImageCropper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RSKImageCropper.framework; sourceTree = BUILT_PRODUCTS_DIR; };
20B6B6861D92C42600CC5C6A /* QBImagePicker.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = QBImagePicker.framework; sourceTree = BUILT_PRODUCTS_DIR; };
2756305FAFF144C4A6B0A039 /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = "<group>"; };
2BEE3436791D42248F853999 /* libRCTImageResizer.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTImageResizer.a; sourceTree = "<group>"; };
305F194186D848FDB07AF34C /* RNFS.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNFS.xcodeproj; path = "../node_modules/react-native-fs/RNFS.xcodeproj"; sourceTree = "<group>"; };
359B076A658B4FBAB5128B03 /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = "<group>"; };
38A44830EC5708E89387F641 /* Pods-StatusIm.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StatusIm.release.xcconfig"; path = "Pods/Target Support Files/Pods-StatusIm/Pods-StatusIm.release.xcconfig"; sourceTree = "<group>"; };
38E1A2C8D0734EE99E2B16CE /* TcpSockets.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = TcpSockets.xcodeproj; path = "../node_modules/react-native-tcp/ios/TcpSockets.xcodeproj"; sourceTree = "<group>"; };
3A7EB0491DD9CABC00A4FCC8 /* SplashScreen.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SplashScreen.xcodeproj; path = "../node_modules/react-native-splash-screen/ios/SplashScreen.xcodeproj"; sourceTree = "<group>"; };
439B6B4B407A4E2AACAFE5BE /* RCTStatus.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTStatus.xcodeproj; path = "../modules/react-native-status/ios/RCTStatus/RCTStatus.xcodeproj"; sourceTree = "<group>"; };
43A6FA689D844B0BAF3AA8B4 /* RCTOrientation.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTOrientation.xcodeproj; path = "../node_modules/react-native-orientation/iOS/RCTOrientation.xcodeproj"; sourceTree = "<group>"; };
45FB5F523DE04BDE9877869C /* RNRandomBytes.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNRandomBytes.xcodeproj; path = "../node_modules/react-native-randombytes/RNRandomBytes.xcodeproj"; sourceTree = "<group>"; };
46E2F6052EB44C698C680894 /* RNI18n.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNI18n.xcodeproj; path = "../node_modules/react-native-i18n/ios/RNI18n.xcodeproj"; sourceTree = "<group>"; };
4C16DE0B1F89508700AA10DB /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
4E586E1B0E544F64AA9F5BD1 /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
4EC426A98043452BB6F9C134 /* libRNInstabug.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNInstabug.a; sourceTree = "<group>"; };
52E205D210BC48B7A553BB62 /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = "<group>"; };
52F6ED6465184513A082652B /* libRNI18n.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNI18n.a; sourceTree = "<group>"; };
54E2B86FB12D4CC49DA05C69 /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = "<group>"; };
5535217F57E44D77AA9CF083 /* libRCTOrientation.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTOrientation.a; sourceTree = "<group>"; };
5E5A7625B76441D984EA8C0D /* RCTImageResizer.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTImageResizer.xcodeproj; path = "../node_modules/react-native-image-resizer/ios/RCTImageResizer.xcodeproj"; sourceTree = "<group>"; };
674B3D9595A047AB8D518F4E /* libRNFS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFS.a; sourceTree = "<group>"; };
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
78C55F15EB4D4DAF9202A662 /* libRNRandomBytes.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNRandomBytes.a; sourceTree = "<group>"; };
7B5870D9ED504F32B6A09C35 /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = "<group>"; };
7ED174A34D7D42358313368B /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = "<group>"; };
7F752F17B1E04216B1337A72 /* libRNFIRMessaging.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFIRMessaging.a; sourceTree = "<group>"; };
807594C429CA44128AB5666B /* BVLinearGradient.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = BVLinearGradient.xcodeproj; path = "../node_modules/react-native-linear-gradient/BVLinearGradient.xcodeproj"; sourceTree = "<group>"; };
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
8AE71EE8751F4652B13BFE83 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = "<group>"; };
8B9A886A2CB448B1ABA0EB62 /* libc++.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
922C4CA61F4D5F8B0033C753 /* StatusIm.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = StatusIm.entitlements; path = StatusIm/StatusIm.entitlements; sourceTree = "<group>"; };
925C1F401F7B73B20063DFA0 /* FirebaseCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = FirebaseCore.framework; sourceTree = "<group>"; };
@ -616,11 +582,9 @@
B2A5F42F1DEC36B200174F4D /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = "<group>"; };
B2DEA0A41E49E32000FA28D6 /* RCTHttpServer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTHttpServer.xcodeproj; path = "../node_modules/react-native-http-bridge/ios/RCTHttpServer.xcodeproj"; sourceTree = "<group>"; };
B2F2D1BB1D9D531B00B7B453 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = StatusIm/Images.xcassets; sourceTree = "<group>"; };
B3B19223008342D096AA356E /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = "<group>"; };
C2A4E93F6B154AEFA3485B45 /* libTcpSockets.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libTcpSockets.a; sourceTree = "<group>"; };
CD48A32459B64E96843BB238 /* libRealmReact.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRealmReact.a; sourceTree = "<group>"; };
CE4E31B21D8695250033ED64 /* Statusgo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Statusgo.framework; path = "../modules/react-native-status/ios/RCTStatus/Statusgo.framework"; sourceTree = "<group>"; };
CEB0E2659D1A4F5FA842057A /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = "<group>"; };
D489EE8D5F52DA10AC715727 /* Pods-StatusImTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StatusImTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-StatusImTests/Pods-StatusImTests.release.xcconfig"; sourceTree = "<group>"; };
DF1CD4C3D1254774ACCAE4E8 /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libBVLinearGradient.a; sourceTree = "<group>"; };
F090E261B9854867A728CE4F /* RealmReact.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RealmReact.xcodeproj; path = "../node_modules/realm/react-native/ios/RealmReact.xcodeproj"; sourceTree = "<group>"; };
@ -674,10 +638,7 @@
9E7C64731E03FDDE004C7042 /* libRCTCamera.a in Frameworks */,
FD4F213C3873473CB703B1D2 /* libRNFS.a in Frameworks */,
213311F38CA74CE280FD09AD /* libRNI18n.a in Frameworks */,
4D3D740D5EFA4F8592B048D7 /* libBVLinearGradient.a in Frameworks */,
67F099D82798449FADF8358A /* libRCTOrientation.a in Frameworks */,
4FFAE7B0414A463991039A2E /* libRNRandomBytes.a in Frameworks */,
6CE6374707AC4EC788354DD1 /* libRNVectorIcons.a in Frameworks */,
22118DE1207A419FBFE7B62D /* libRealmReact.a in Frameworks */,
25DC9C9DC25846BD8D084888 /* libc++.tbd in Frameworks */,
BA68A2377A20496EA737000D /* libz.tbd in Frameworks */,
@ -803,6 +764,8 @@
C90048061FC47AF50002B8EA /* libcxxreact.a */,
C90048081FC47AF50002B8EA /* libjschelpers.a */,
C900480A1FC47AF50002B8EA /* libjschelpers.a */,
5537E2AA20650E640085CED4 /* libjsinspector.a */,
5537E2AC20650E640085CED4 /* libjsinspector-tvOS.a */,
C900480C1FC47AF50002B8EA /* libthird-party.a */,
C900480E1FC47AF50002B8EA /* libthird-party.a */,
C90048101FC47AF50002B8EA /* libdouble-conversion.a */,
@ -817,14 +780,6 @@
isa = PBXGroup;
children = (
2028E0111D4275BD00227DCD /* SF */,
52E205D210BC48B7A553BB62 /* Entypo.ttf */,
CEB0E2659D1A4F5FA842057A /* EvilIcons.ttf */,
7B5870D9ED504F32B6A09C35 /* FontAwesome.ttf */,
7ED174A34D7D42358313368B /* Foundation.ttf */,
359B076A658B4FBAB5128B03 /* Ionicons.ttf */,
54E2B86FB12D4CC49DA05C69 /* MaterialIcons.ttf */,
B3B19223008342D096AA356E /* Octicons.ttf */,
2756305FAFF144C4A6B0A039 /* Zocial.ttf */,
B23B48FE1E76917B006D4535 /* RobotoMono-Medium.ttf */,
);
name = Resources;
@ -878,14 +833,6 @@
name = Products;
sourceTree = "<group>";
};
20B7D0FF1D3F74CD00B70F14 /* Products */ = {
isa = PBXGroup;
children = (
20B7D1031D3F74CD00B70F14 /* libRNVectorIcons.a */,
);
name = Products;
sourceTree = "<group>";
};
20B7D1041D3F74CD00B70F14 /* Products */ = {
isa = PBXGroup;
children = (
@ -912,23 +859,6 @@
name = Products;
sourceTree = "<group>";
};
20B7D11B1D3F74CD00B70F14 /* Products */ = {
isa = PBXGroup;
children = (
20B7D11F1D3F74CD00B70F14 /* libBVLinearGradient.a */,
C90047C51FC47AF50002B8EA /* libBVLinearGradient.a */,
);
name = Products;
sourceTree = "<group>";
};
20B7D1201D3F74CD00B70F14 /* Products */ = {
isa = PBXGroup;
children = (
20B7D1241D3F74CD00B70F14 /* libRCTOrientation.a */,
);
name = Products;
sourceTree = "<group>";
};
20B7D1251D3F74CD00B70F14 /* Products */ = {
isa = PBXGroup;
children = (
@ -981,10 +911,7 @@
9F1854E6D9654226B1FC8308 /* RCTCamera.xcodeproj */,
305F194186D848FDB07AF34C /* RNFS.xcodeproj */,
46E2F6052EB44C698C680894 /* RNI18n.xcodeproj */,
807594C429CA44128AB5666B /* BVLinearGradient.xcodeproj */,
43A6FA689D844B0BAF3AA8B4 /* RCTOrientation.xcodeproj */,
45FB5F523DE04BDE9877869C /* RNRandomBytes.xcodeproj */,
8AE71EE8751F4652B13BFE83 /* RNVectorIcons.xcodeproj */,
F090E261B9854867A728CE4F /* RealmReact.xcodeproj */,
38E1A2C8D0734EE99E2B16CE /* TcpSockets.xcodeproj */,
439B6B4B407A4E2AACAFE5BE /* RCTStatus.xcodeproj */,
@ -1255,10 +1182,6 @@
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = 20B7D11B1D3F74CD00B70F14 /* Products */;
ProjectRef = 807594C429CA44128AB5666B /* BVLinearGradient.xcodeproj */;
},
{
ProductGroup = 20A5C94C1D927137002C4965 /* Products */;
ProjectRef = 20A5C94B1D927137002C4965 /* imageCropPicker.xcodeproj */;
@ -1303,10 +1226,6 @@
ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;
ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
},
{
ProductGroup = 20B7D1201D3F74CD00B70F14 /* Products */;
ProjectRef = 43A6FA689D844B0BAF3AA8B4 /* RCTOrientation.xcodeproj */;
},
{
ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;
ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
@ -1371,10 +1290,6 @@
ProductGroup = 92925B361F571DE600203EEB /* Products */;
ProjectRef = 1E74DC52A1E449A2BA858B14 /* RNSVG.xcodeproj */;
},
{
ProductGroup = 20B7D0FF1D3F74CD00B70F14 /* Products */;
ProjectRef = 8AE71EE8751F4652B13BFE83 /* RNVectorIcons.xcodeproj */;
},
{
ProductGroup = B24FC7BB1DE718EA00D694FF /* Products */;
ProjectRef = 3A7EB0491DD9CABC00A4FCC8 /* SplashScreen.xcodeproj */;
@ -1477,13 +1392,6 @@
remoteRef = 20B7D0FD1D3F74CC00B70F14 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
20B7D1031D3F74CD00B70F14 /* libRNVectorIcons.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNVectorIcons.a;
remoteRef = 20B7D1021D3F74CD00B70F14 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
20B7D10E1D3F74CD00B70F14 /* libRNI18n.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@ -1505,20 +1413,6 @@
remoteRef = 20B7D1191D3F74CD00B70F14 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
20B7D11F1D3F74CD00B70F14 /* libBVLinearGradient.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libBVLinearGradient.a;
remoteRef = 20B7D11E1D3F74CD00B70F14 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
20B7D1241D3F74CD00B70F14 /* libRCTOrientation.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRCTOrientation.a;
remoteRef = 20B7D1231D3F74CD00B70F14 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
20B7D1291D3F74CD00B70F14 /* libRealmReact.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@ -1526,6 +1420,20 @@
remoteRef = 20B7D1281D3F74CD00B70F14 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
5537E2AA20650E640085CED4 /* libjsinspector.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libjsinspector.a;
remoteRef = 5537E2A920650E640085CED4 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
5537E2AC20650E640085CED4 /* libjsinspector-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libjsinspector-tvOS.a";
remoteRef = 5537E2AB20650E640085CED4 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@ -1645,13 +1553,6 @@
remoteRef = B2DEA0B01E49E32000FA28D6 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
C90047C51FC47AF50002B8EA /* libBVLinearGradient.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libBVLinearGradient.a;
remoteRef = C90047C41FC47AF50002B8EA /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
C90047CD1FC47AF50002B8EA /* libRCTBlob-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@ -1837,17 +1738,9 @@
2028DFFC1D4275B600227DCD /* SF-UI-Display-Thin.otf in Resources */,
2028DFFB1D4275B600227DCD /* SF-UI-Display-Semibold.otf in Resources */,
B23B48FF1E76917B006D4535 /* RobotoMono-Medium.ttf in Resources */,
D28AEFB4C39548EB80416889 /* Entypo.ttf in Resources */,
82E689BAF9FB43C8AC6FF1CA /* EvilIcons.ttf in Resources */,
C3EE9AEA6F77464588FBAA64 /* FontAwesome.ttf in Resources */,
A6AF670051B842249D520C7B /* Foundation.ttf in Resources */,
9E54D6011F17A5DB009F0C16 /* upload-dsym.sh in Resources */,
B2F2D1BC1D9D531B00B7B453 /* Images.xcassets in Resources */,
AE97D4B08C9F4821B8E9C50B /* Ionicons.ttf in Resources */,
0F942CF509F74CCDB5CB35B0 /* MaterialIcons.ttf in Resources */,
EF2B5857B4A34E0C9707FB3F /* Octicons.ttf in Resources */,
92A0DF7D1F4DE3A4002051BC /* GoogleService-Info.plist in Resources */,
74242ACAF37A48D0BFACDE82 /* Zocial.ttf in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

96
package-lock.json generated
View File

@ -1926,7 +1926,7 @@
},
"compression": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/compression/-/compression-1.5.2.tgz",
"resolved": "http://registry.npmjs.org/compression/-/compression-1.5.2.tgz",
"integrity": "sha1-sDuNhub4rSloPLqN+R3cb/x3s5U=",
"requires": {
"accepts": "1.2.13",
@ -8036,14 +8036,6 @@
}
}
},
"react-native-action-button": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/react-native-action-button/-/react-native-action-button-2.8.1.tgz",
"integrity": "sha512-u5DWS2ZorgRGNNhh3H8+PKq0KHQqOIk6jr/w/qGaTrPpX4Fvg0t5WsqlSjDa4J6xrgWJ712OX3rhc56wLLSI3g==",
"requires": {
"prop-types": "15.6.0"
}
},
"react-native-background-timer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/react-native-background-timer/-/react-native-background-timer-2.0.0.tgz",
@ -8150,19 +8142,6 @@
"levelup": "0.18.6"
}
},
"react-native-linear-gradient": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.4.0.tgz",
"integrity": "sha512-h4nwmcjfeedSiHGBmQkMmCSIqm3196YtT1AtbAqE93jgAcpib0btvoCx8nBUemmhfm+CA5mFEh8p5biA4wFw/A==",
"requires": {
"prop-types": "15.6.0"
}
},
"react-native-orientation": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/react-native-orientation/-/react-native-orientation-3.1.0.tgz",
"integrity": "sha1-zkcP5EqaR99b5JlbAaEInT9KAz4="
},
"react-native-os": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/react-native-os/-/react-native-os-1.1.0.tgz",
@ -8215,9 +8194,9 @@
"integrity": "sha512-yaTnGAHRyhduLSfD85gP3Vsf0BRePHW3aNNtDXbkbUhwIIeafu2cJH86U/qKFuKLMYLnFOXteOkP80gaYVGAYg=="
},
"react-native-svg": {
"version": "6.0.1-rc.3",
"resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-6.0.1-rc.3.tgz",
"integrity": "sha512-JesFrzf4egetLS+37EO8h2CibnVCv9PNyCEcULXC/7WOtWEE0fSTPlbm7J+2q/szPcf9G6I8P2dec+LGhlH1cA==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-6.3.1.tgz",
"integrity": "sha512-0kmfUwKUBWnPuJpy+bdGIYKkXHg/M/X57ji8b3d3ZFB2rRTWMRkwI1D+AJ6FQRX109+FJn6L6hsIokDj1lckzA==",
"requires": {
"color": "2.0.1",
"lodash": "4.17.4",
@ -8267,73 +8246,6 @@
"util": "0.10.3"
}
},
"react-native-vector-icons": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-4.4.2.tgz",
"integrity": "sha512-0E53c7OolA6nMuQdh4gTuYKGe0yPuVbNXHfty0gJoE3Bct80JE8Q8Rrlv8xWSFe8jqYcSPiUr8Lg1+G8LAttYg==",
"requires": {
"lodash": "4.17.4",
"prop-types": "15.6.0",
"yargs": "8.0.2"
},
"dependencies": {
"camelcase": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
"integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
},
"cliui": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
"integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
"requires": {
"string-width": "1.0.2",
"strip-ansi": "3.0.1",
"wrap-ansi": "2.1.0"
},
"dependencies": {
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"requires": {
"code-point-at": "1.1.0",
"is-fullwidth-code-point": "1.0.0",
"strip-ansi": "3.0.1"
}
}
}
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"requires": {
"number-is-nan": "1.0.1"
}
},
"yargs": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
"integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
"requires": {
"camelcase": "4.1.0",
"cliui": "3.2.0",
"decamelize": "1.2.0",
"get-caller-file": "1.0.2",
"os-locale": "2.1.0",
"read-pkg-up": "2.0.0",
"require-directory": "2.1.1",
"require-main-filename": "1.0.1",
"set-blocking": "2.0.0",
"string-width": "2.1.1",
"which-module": "2.0.0",
"y18n": "3.2.1",
"yargs-parser": "7.0.0"
}
}
}
},
"react-native-webview-bridge": {
"version": "github:status-im/react-native-webview-bridge#b4200c08c0036a90ee07199b118849a65c7cc635",
"requires": {

View File

@ -46,7 +46,6 @@
"react": "16.2.0",
"react-dom": "16.2.0",
"react-native": "0.53.3",
"react-native-action-button": "2.8.1",
"react-native-background-timer": "2.0.0",
"react-native-camera": "0.10.0",
"react-native-config": "0.9.0",
@ -62,16 +61,13 @@
"react-native-image-resizer": "1.0.0",
"react-native-invertible-scroll-view": "1.1.0",
"react-native-level-fs": "3.0.0",
"react-native-linear-gradient": "2.4.0",
"react-native-orientation": "3.1.0",
"react-native-os": "1.1.0",
"react-native-qrcode": "0.2.6",
"react-native-randombytes": "3.0.0",
"react-native-splash-screen": "3.0.6",
"react-native-svg": "6.0.1-rc.3",
"react-native-svg": "6.3.1",
"react-native-tcp": "3.3.0",
"react-native-udp": "2.2.1",
"react-native-vector-icons": "4.4.2",
"react-native-webview-bridge": "github:status-im/react-native-webview-bridge#feature/camera-permissions",
"readable-stream": "1.1.14",
"realm": "2.0.7",

View File

@ -1,6 +1,5 @@
(ns status-im.react-native.js-dependencies)
(def action-button (js/require "react-native-action-button"))
(def camera (js/require "react-native-camera"))
(def config (js/require "react-native-config"))
(def dialogs (js/require "react-native-dialogs"))
@ -13,14 +12,11 @@
(def image-crop-picker (js/require "react-native-image-crop-picker"))
(def image-resizer (js/require "react-native-image-resizer"))
(def instabug (js/require "instabug-reactnative"))
(def linear-gradient (js/require "react-native-linear-gradient"))
(def nfc (js/require "nfc-react-native"))
(def orientation (js/require "react-native-orientation"))
(def qr-code (js/require "react-native-qrcode"))
(def random-bytes (js/require "react-native-randombytes"))
(def react-native (js/require "react-native"))
(def realm (js/require "realm"))
(def vector-icons (js/require "react-native-vector-icons/Ionicons"))
(def webview-bridge (js/require "react-native-webview-bridge"))
(def svg (js/require "react-native-svg"))
(def react-native-fcm (js/require "react-native-fcm"))

View File

@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="66" height="66" viewBox="0 0 66 66">
<g fill="" fill-rule="evenodd">
<path d="M33,66 C14.7746033,66 0,51.2253967 0,33 C0,14.7746033 14.7746033,0 33,0 C51.2253967,0 66,14.7746033 66,33 C66,51.2253967 51.2253967,66 33,66 Z M33,59 C47.3594035,59 59,47.3594035 59,33 C59,18.6405965 47.3594035,7 33,7 C18.6405965,7 7,18.6405965 7,33 C7,47.3594035 18.6405965,59 33,59 Z"/>
<circle cx="33" cy="33" r="24" opacity=".5"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 496 B

View File

@ -1,9 +0,0 @@
// workaround for react-native-vector-icons
// https://github.com/oblador/react-native-vector-icons/issues/626#issuecomment-362386341
const blacklist = require('metro/src/blacklist')
module.exports = {
getBlacklistRE () {
return blacklist([/react-native\/local-cli\/core\/__fixtures__.*/])
},
}

View File

@ -9,9 +9,6 @@
[status-im.ui.screens.views :as views]
[status-im.ui.components.react :as react]
[status-im.native-module.core :as status]
[status-im.utils.error-handler :as error-handler]
[status-im.utils.utils :as utils]
[status-im.utils.config :as config]
[status-im.utils.notifications :as notifications]
[status-im.core :as core]
[status-im.utils.snoopy :as snoopy]))
@ -35,9 +32,6 @@
:else false)))]
(.addEventListener react/back-handler "hardwareBackPress" new-listener)))
(defn orientation->keyword [o]
(keyword (.toLowerCase o)))
(defn app-state-change-handler [state]
(dispatch [:app-state-change state]))
@ -46,12 +40,6 @@
(reagent/create-class
{:component-will-mount
(fn []
(let [o (orientation->keyword (.getInitialOrientation react/orientation))]
(dispatch [:set :orientation o]))
(.addOrientationListener
react/orientation
#(dispatch [:set :orientation (orientation->keyword %)]))
(.lockToPortrait react/orientation)
(.addListener react/keyboard
"keyboardDidShow"
(fn [e]

View File

@ -14,6 +14,7 @@
(s/def :chat/selected-participants (s/nilable set?))
(s/def :chat/chat-loaded-callbacks (s/nilable map?))
(s/def :chat/public-group-topic (s/nilable string?))
(s/def :chat/public-group-topic-error (s/nilable string?))
(s/def :chat/messages (s/nilable map?)) ; messages indexed by message-id
(s/def :chat/not-loaded-message-ids (s/nilable set?)) ; set of message-ids not yet fully loaded from persisted state
(s/def :chat/last-clock-value (s/nilable number?)) ; last logical clock value of messages in chat

View File

@ -8,28 +8,15 @@
status-im.data-store.core
[status-im.ui.screens.views :as views]
[status-im.ui.components.react :as react]
[status-im.native-module.core :as status]
[status-im.utils.error-handler :as error-handler]
[status-im.utils.utils :as utils]
[status-im.utils.config :as config]
[status-im.utils.notifications :as notifications]
[status-im.core :as core]
[status-im.utils.snoopy :as snoopy]))
(defn orientation->keyword [o]
(keyword (.toLowerCase o)))
(defn app-root []
(let [keyboard-height (subscribe [:get :keyboard-height])]
(reagent/create-class
{:component-will-mount
(fn []
(let [o (orientation->keyword (.getInitialOrientation react/orientation))]
(dispatch [:set :orientation o]))
(.addOrientationListener
react/orientation
#(dispatch [:set :orientation (orientation->keyword %)]))
(.lockToPortrait react/orientation)
(.addListener react/keyboard
"keyboardWillShow"
(fn [e]

View File

@ -210,6 +210,7 @@
:search-chats "Search chats"
:empty-topic "Empty topic"
:topic-format "Wrong format [a-z0-9\\-]+"
:topic-name-error "A topic name can contain only following characters: a-z -"
:public-group-topic "Topic"
:set-a-topic "Set a topic"
:empty-chat-description "There are no messages \nin this chat yet"

View File

@ -1,196 +0,0 @@
(ns status-im.ui.components.carousel.carousel
(:require [reagent.impl.component :as component]
[status-im.ui.components.react :as react]
[status-im.ui.components.carousel.styles :as styles]
[taoensso.timbre :as log]
[status-im.react-native.js-dependencies :as js-dependencies]
[status-im.utils.utils :as utils]))
(defn window-page-width []
(.-width (.get (.. js-dependencies/react-native -Dimensions) "window")))
(def defaults {:gap 8
:sneak 8
:pageStyle {}
:scrollThreshold 20})
(defn get-active-page [data]
(get data :activePage 0))
(defn get-sneak [{:keys [sneak gap count]}]
(if (> (or count 2) 1)
(or sneak (:sneak defaults))
gap))
(defn get-gap [data]
(get data :gap (:gap defaults)))
(defn get-count [data]
(get data :count))
(defn compute-page-width
([gap sneak]
(compute-page-width (window-page-width) gap sneak))
([window-page-width gap sneak]
(- window-page-width (+ (* 2 gap) (* 2 sneak)))))
(defn get-page-width [data]
(get data :pageWidth (compute-page-width (get-gap data) (get-sneak data))))
(defn get-page-style [data]
(let [data-style (get data :pageStyle {})]
(merge (:pageStyle defaults) data-style)))
(defn get-scroll-threshold [data]
(get data :scrollThreshold (:scrollThreshold defaults)))
(defn apply-props [component props]
(let [sneak (get-sneak props)
page-width (get-page-width props)
style (get-page-style props)
gap (quot (- (window-page-width)
(* 2 sneak)
page-width)
2)
count (get-count props)]
(reagent.core/set-state component {:sneak sneak
:pageWidth page-width
:pageStyle style
:gap gap
:count count})))
(defn scroll-to [component x y]
(.scrollTo (.-scrollView component) (clj->js {:y y
:x x})))
(defn get-current-position [event]
(.-x (.-contentOffset (.-nativeEvent event))))
(defn get-page-position [state page]
(let [page-width (get-page-width state)
gap (get-gap state)
sneak (get-sneak state)
count (get-count state)
addition (condp = page
0 gap
(dec count) (- (* 3 gap) (* sneak 2))
(- sneak (* gap 2)))]
(+ (* page page-width)
(* (dec page) gap)
addition)))
(defn go-to-page [component page]
(let [props (reagent.core/props component)
state (reagent.core/state component)
page-width (get-page-width state)
gap (get-gap state)
page-position (get-page-position state page)]
(log/debug "go-to-page: props-page-width=" page-width "; gap=" gap
"; page-position=" page-position "; page: " page)
(reagent.core/set-state component {:scrolling? true})
(utils/set-timeout #(reagent.core/set-state component {:scrolling? false}) 200)
(scroll-to component page-position 0)
(reagent.core/set-state component {:activePage page})
(when (:onPageChange props)
((:onPageChange props) page))))
(defn on-scroll-end [event component starting-position]
(let [props (reagent.core/props component)
state (reagent.core/state component)
scroll-threshold (get-scroll-threshold props)
current-page (get-active-page state)
current-position (get-current-position event)
page-count (get-count state)
direction (cond
(> current-position (+ starting-position scroll-threshold)) 1
(< current-position (- starting-position scroll-threshold)) -1
:else 0)
new-page (+ current-page direction)]
(log/debug state "on-scroll-end: starting position=" starting-position
"; current-position=" current-position "; direction=" direction
"; current-page=" current-page "; new-page=" new-page)
(if (and (not= current-page new-page)
(< -1 new-page page-count))
(go-to-page component new-page)
(scroll-to component starting-position 0))))
(defn component-will-mount [component new-args]
(let [props (reagent.core/props component)]
(log/debug "component-will-mount: new-args=" new-args)
(apply-props component props)))
(defn component-did-mount [component]
(let [props (reagent.core/props component)
initial-page (.-initialPage props)]
(log/debug "component-did-mount: initial-page="initial-page)
(when (pos? initial-page)
(go-to-page component initial-page))))
(defn component-will-receive-props [component new-argv]
(let [props (component/extract-props new-argv)]
(log/debug "component-will-receive-props: props=" props)
(apply-props component props)))
(defn get-event-width [event]
(.-width (.-layout (.-nativeEvent event))))
(defn on-layout-change [event component]
(let [state (reagent.core/state component)
page-width (compute-page-width (get-event-width event)
(get-gap state)
(get-sneak state))
state-page-width (get-page-width state)
active-page (get-active-page state)
gap (get-gap state)
page-position (* active-page (+ page-width gap))]
(log/debug "Layout changed: " " page-width=" page-width "; state-page-width=" state-page-width)
(if (not= page-width state-page-width)
(do
(reagent.core/set-state component {:pageWidth page-width})
(.setState component (clj->js {:layout (.-layout (.-nativeEvent event))})))
(scroll-to component page-position 0))))
(defn get-pages [component data children]
(let [page-width (get-page-width data)
page-style (get-page-style data)
gap (get-gap data)
count (get-count data)]
(doall (map-indexed (fn [index child]
(let [page-index index
touchable-data {:key index
:onPress #(go-to-page component page-index)}]
[react/touchable-without-feedback touchable-data
[react/view {:style [(styles/page index count page-width gap)
page-style]
:onLayout #(log/debug "view onLayout" %)}
child]])) children))))
(defn reagent-render [data children]
(let [starting-position (atom 0)
component (reagent.core/current-component)
state (reagent.core/state component)
gap (get-gap state)]
(log/debug "reagent-render: " data state)
[react/view {:style styles/scroll-view-container}
[react/scroll-view {:contentContainerStyle (styles/content-container gap)
:automaticallyAdjustContentInsets false
:bounces false
:decelerationRate 0.9
:horizontal true
:onLayout #(on-layout-change % component)
:scrollEnabled (not (get state :scrolling?))
:onScrollBeginDrag #(reset! starting-position (get-current-position %))
:onScrollEndDrag #(on-scroll-end % component @starting-position)
:showsHorizontalScrollIndicator false
:ref #(set! (.-scrollView component) %)}
(get-pages component state children)]]))
(defn carousel [_ _]
(let [component-data {:component-did-mount component-did-mount
:component-will-mount component-will-mount
:component-will-receive-props component-will-receive-props
:display-name "carousel"
:reagent-render reagent-render}]
(reagent.core/create-class component-data)))

View File

@ -1,19 +0,0 @@
(ns status-im.ui.components.carousel.styles)
(def scroll-view-container
{:flex 1})
(defn content-container [gap]
{:padding-left (quot gap 2)
:padding-right (quot gap 2)})
(defn page [index count page-width gap]
(let [margin (quot gap 2)
left-spacing (if (zero? index) gap 0)
right-spacing (if (and (= index (dec count))
(> count 1))
gap 0)]
{:width page-width
:justify-content :center
:margin-left (+ margin left-spacing)
:margin-right (+ margin right-spacing)}))

View File

@ -13,26 +13,16 @@
(defn top-shadow []
(when platform/android?
[react/linear-gradient
{:style styles/gradient-bottom
:colors styles/gradient-top-colors}]))
[react/view]))
(defn bottom-shadow []
(when platform/android?
[react/linear-gradient
{:style styles/gradient-top
:colors styles/gradient-bottom-colors}]))
[react/view]))
(defn separator [style & [wrapper-style]]
[react/view (merge styles/separator-wrapper wrapper-style)
[react/view (merge styles/separator style)]])
(defn form-spacer []
[react/view
[bottom-shadow]
[react/view styles/form-spacer]
[top-shadow]])
(defn list-separator []
[separator styles/list-separator])

View File

@ -1,11 +0,0 @@
(ns status-im.ui.components.drag-drop
(:require [status-im.ui.components.react :as react]))
(defn pan-handlers [pan-responder]
(js->clj (.-panHandlers pan-responder)))
(defn create-pan-responder [{:keys [on-move on-release]}]
(.create react/pan-responder
(clj->js {:onStartShouldSetPanResponder (fn [] true)
:onPanResponderMove on-move
:onPanResponderRelease on-release})))

View File

@ -1,6 +0,0 @@
(ns status-im.ui.components.icons.custom-icons
(:require [reagent.core :as reagent]
[status-im.react-native.js-dependencies :as js-dependencies]))
(def ion-icon
(reagent/adapt-react-class (.-default js-dependencies/vector-icons)))

View File

@ -24,6 +24,7 @@
(def path (get-class "Path"))
(def use (get-class "Use"))
(def defs (get-class "Defs"))
(def circle (get-class "Circle"))
(def icons {:icons/discover (components.svg/slurp-svg "./resources/icons/bottom/discover_gray.svg")
:icons/contacts (components.svg/slurp-svg "./resources/icons/bottom/contacts_gray.svg")
@ -80,7 +81,8 @@
:icons/wnode (components.svg/slurp-svg "./resources/icons/wnode.svg")
:icons/refresh (components.svg/slurp-svg "./resources/icons/refresh.svg")
:icons/newchat (components.svg/slurp-svg "./resources/icons/newchat.svg")
:icons/logo (components.svg/slurp-svg "./resources/icons/logo.svg")})
:icons/logo (components.svg/slurp-svg "./resources/icons/logo.svg")
:icons/camera (components.svg/slurp-svg "./resources/icons/camera.svg")})
(defn normalize-property-name [n]
(if (= n :icons/options)

View File

@ -1,29 +0,0 @@
(ns status-im.ui.components.image-button.styles
(:require [status-im.ui.components.styles :as styles]))
(def image-button
{:position :absolute
:bottom 2
:right 16
:flex 1
:height 50
:align-items :center})
(def image-button-content
{:flex 1
:flex-direction :row
:height 50
:align-items :center
:align-self :center})
(def image-button-text
{:flex 1
:flex-direction :column
:letter-spacing -0.3
:margin-left 8})
(def scan-button-text
(merge image-button-text {:color styles/color-blue}))
(def show-qr-button-text
(merge image-button-text {:color "#838c93"}))

View File

@ -1,20 +0,0 @@
(ns status-im.ui.components.image-button.view
(:require [status-im.i18n :as i18n]
[status-im.ui.components.icons.vector-icons :as vector-icons]
[status-im.ui.components.image-button.styles :as styles]
[status-im.ui.components.react :as react]
[status-im.ui.components.styles :as components.styles]))
(defn- image-button [{:keys [value style handler]}]
[react/view styles/image-button
[react/touchable-highlight {:on-press handler}
[react/view styles/image-button-content
[vector-icons/icon :icons/fullscreen {:color :blue :style components.styles/icon-scan}]
(when value
[react/text {:style style} value])]]])
(defn scan-button [{:keys [show-label? handler]}]
[image-button {:value (when show-label?
(i18n/label :t/scan-qr))
:style styles/scan-button-text
:handler handler}])

View File

@ -1,10 +0,0 @@
(ns status-im.ui.components.native-action-button
(:require [reagent.core :as reagent]
[status-im.react-native.js-dependencies :as js-dependencies]))
(def native-action-button
(reagent/adapt-react-class (.-default js-dependencies/action-button)))
(def native-action-button-item
(reagent/adapt-react-class (.. js-dependencies/action-button -default -Item)))

View File

@ -1,30 +0,0 @@
(ns status-im.ui.components.status-view.view
(:require [clojure.string :as string]
[status-im.ui.components.react :as react]
[status-im.ui.components.styles :as components.styles]
[status-im.utils.core :as utils.core]))
(defn tag-view [tag]
[react/text {:style {:color components.styles/color-blue4-faded}
:font :medium}
(str tag " ")])
(defn status-view [{:keys [style
non-tag-color
message-id
status
on-press
number-of-lines]
:or {message-id "msg"
non-tag-color components.styles/color-black}}]
[react/text {:style style
:on-press on-press
:number-of-lines number-of-lines
:font :default}
(for [[i status] (map-indexed vector (string/split status #" "))]
(if (utils.core/hash-tag? status)
^{:key (str "item-" message-id "-" i)}
[tag-view status]
^{:key (str "item-" message-id "-" i)}
[react/text {:style {:color non-tag-color}}
(str status " ")]))])

View File

@ -1,30 +0,0 @@
(ns status-im.ui.components.sticky-button
(:require-macros [status-im.utils.styles :refer [defstyle defnstyle]])
(:require [status-im.ui.components.styles :as styles]
[status-im.utils.platform :as platform]
[status-im.utils.core :as u]
[status-im.ui.components.react :as react]))
(def sticky-button-style
{:flex-direction :row
:height 52
:justify-content :center
:align-items :center
:background-color styles/color-light-blue})
(defstyle sticky-button-label-style
{:color styles/color-white
:ios {:font-size 17
:line-height 20
:letter-spacing -0.2}
:android {:font-size 14
:letter-spacing 0.5}})
(defn sticky-button
([label on-press] (sticky-button label on-press false))
([label on-press once?]
[react/touchable-highlight {:on-press (if once? (u/wrap-call-once! on-press) on-press)}
[react/view sticky-button-style
[react/text {:style sticky-button-label-style
:uppercase? true}
label]]]))

View File

@ -1,25 +1,16 @@
(ns status-im.ui.components.styles
(:require [status-im.utils.platform :as platform]
[status-im.ui.components.colors :as colors]))
;; TODO(oskarth): Make a palette of all these colors
(:require [status-im.ui.components.colors :as colors]))
(def color-transparent "transparent")
(def color-blue "#7099e6")
(def color-blue2 "#5b6dee")
(def color-blue3 "#424fae")
(def color-blue4 "#4360df") ; colors/blue
(def color-blue4-faded "rgba(67,96,222,0.87)")
(def color-blue4-transparent "rgba(67, 96, 223, 0.10)")
(def color-blue6 "#3745AF")
(def color-blue-transparent "#7099e632")
(def color-black "#000000")
(def color-purple "#a187d5")
(def color-gray-transparent-light "rgba(0, 0, 0, 0.1)")
(def color-gray-transparent-medium-light "rgba(0, 0, 0, 0.2)")
(def color-gray-transparent "rgba(0, 0, 0, 0.4)")
(def color-gray4-transparent "rgba(147, 155, 161, 0.2)")
(def color-gray10-transparent "rgba(184, 193, 199, 0.5)")
(def color-gray "#838c93de")
(def color-gray2 "#8f838c93")
(def color-gray3 "#00000040")
@ -28,42 +19,25 @@
(def color-gray6 "#212121")
(def color-gray7 "#9fa3b4")
(def color-gray9 "#E9EBEC")
(def color-gray10 "#9BA3A8")
(def color-gray11 "#EEF1F5")
(def color-dark "#49545d")
(def color-steel "#838b91")
(def color-white "white")
(def color-white-transparent "#ffffff66")
(def color-white-transparent-1 "#f1f1f11a")
(def color-white-transparent-2 "#fefefe21")
(def color-white-transparent-3 "#FFFFFF1A")
(def color-white-transparent-4 "#FFFFFF33")
(def color-white-transparent-5 "#FFFFFF8C")
(def color-white-transparent-6 "rgba(255, 255, 255, 0.6)")
(def color-light-blue "#628fe3")
(def color-light-blue-transparent "#628fe333")
(def color-light-blue6 "#e3ebfa")
(def color-dark-blue-1 "#252c4a")
(def color-dark-blue-2 "#1f253f")
(def color-dark-blue-3 "#191f37")
(def color-dark-blue-4 "#6e00e4")
(def color-light-gray "#EEF2F5")
(def color-light-gray2 "#ececf0")
(def color-light-gray3 "#e8ebec")
(def color-light-gray4 "#eff2f3")
(def color-light-gray5 "#D7D7D7")
(def color-light-gray6 "#BAC1C6")
(def color-red "red")
(def color-red-2 "#d84b4b")
(def color-red-3 "#FFC1BD")
(def color-red-4 "#8A3832")
(def color-light-red "#e86363")
(def color-green-1 "#a8f4d4")
(def color-green-2 "#448469")
(def color-green-3 "#44d058")
(def color-green-3-light "rgba(68, 208, 88, 0.2)")
(def color-green-4 "#0dcd8d")
(def color-cyan "#7adcfb")
(def color-separator "#D6D6D6")
@ -76,7 +50,6 @@
(def online-color color-light-blue)
(def new-messages-count-color color-blue-transparent)
(def chat-background color-light-gray)
(def selected-message-color "#E4E9ED")
(def separator-color "#0000001f")
(def default-chat-color color-purple)
@ -118,23 +91,6 @@
{:width 23
:height 22})
(def icon-scan
{:width 18
:height 18})
(def icon-plus
{:width 18
:height 18})
(def icon-close
{:width 12
:height 12})
(def white-form-text-input
{:margin-left -4
:font-size 14
:color color-white})
(def button-input-container
{:flex 1
:flex-direction :row})

View File

@ -1,35 +0,0 @@
(ns status-im.ui.components.text-field.styles
(:require-macros [status-im.utils.styles :refer [defnstyle]]))
(def text-field-container
{:padding-top 2})
(def text-input
{:font-size 16
:text-align-vertical :center})
(defnstyle label [top font-size color]
{:position :absolute
:top top
:color color
:font-size font-size
:background-color :transparent
:ios {:left 0}
:android {:left 4}})
(defn underline-container [background-color]
{:background-color background-color
:align-items :center})
(defn underline [background-color width height]
{:background-color background-color
:height height
:width width})
(defnstyle error-text [color]
{:color color
:background-color :transparent
:font-size 12
:line-height 20
:ios {:margin-left 0}
:android {:margin-left 4}})

View File

@ -1,178 +0,0 @@
(ns status-im.ui.components.text-field.view
(:require [clojure.string :as string]
[reagent.core :as reagent]
[status-im.ui.components.react :as react]
[status-im.ui.components.text-field.styles :as styles]
[status-im.ui.components.animation :as animation]
[taoensso.timbre :as log]
[status-im.ui.components.styles :as components.styles]))
(def config {:label-top 16
:label-bottom 37
:label-font-large 16
:label-font-small 13
:label-animation-duration 200})
(def default-props {:wrapper-style {}
:input-style {}
:line-style {}
:editable true
:label-color "#838c93"
:line-color components.styles/separator-color
:focus-line-color components.styles/separator-color
:focus-line-height 1
:error-color "#d50000"
:secure-text-entry false
:on-focus #()
:on-blur #()
:on-change-text #()
:on-change #()
:auto-capitalize :sentences})
(defn field-animation [{:keys [top to-top font-size to-font-size
line-width to-line-width line-height to-line-height]} & [value-blank?]]
(let [duration (:label-animation-duration config)
animation (animation/parallel (into []
(concat
(when (or (nil? value-blank?) value-blank?)
[(animation/timing top {:toValue to-top
:duration duration})
(animation/timing font-size {:toValue to-font-size
:duration duration})])
[(animation/timing line-width {:toValue to-line-width
:duration duration})
(animation/timing line-height {:toValue to-line-height
:duration duration})])))]
(animation/start animation (fn [arg]
(when (.-finished arg)
(log/debug "Field animation finished"))))))
; Invoked once before the component is mounted. The return value will be used
; as the initial value of this.state.
(defn get-initial-state [_]
{:has-focus false
:float-label? false
:label-top 0
:label-font-size 0
:line-width (animation/create-value 0)
:line-height (animation/create-value 1)
:max-line-width 100})
; Invoked once, both on the client and server, immediately before the initial
; rendering occurs. If you call setState within this method, render() will see
; the updated state and will be executed only once despite the state change.
(defn component-will-mount [component]
(let [{:keys [value]} (reagent/props component)
data {:label-top (animation/create-value (if (string/blank? value)
(:label-bottom config)
(:label-top config)))
:label-font-size (animation/create-value (if (string/blank? value)
(:label-font-large config)
(:label-font-small config)))
:float-label? (if (string/blank? value) false true)}]
;(log/debug "component-will-mount")
(reagent/set-state component data)))
(defn on-input-focus [{:keys [component animation onFocus]}]
(do
(log/debug "input focused")
(reagent/set-state component {:has-focus true
:float-label? true})
(field-animation (merge animation
{:to-line-width (:max-line-width (reagent/state component))}))
(when onFocus (onFocus))))
(defn on-input-blur [{:keys [component value animation onBlur]}]
(log/debug "Input blurred")
(reagent/set-state component {:has-focus false
:float-label? (if (string/blank? value) false true)})
(field-animation animation (string/blank? value))
(when onBlur (onBlur)))
(defn get-width [event]
(.-width (.-layout (.-nativeEvent event))))
(defn reagent-render [_ _]
(let [component (reagent/current-component)
input-ref (reagent/atom nil)
{:keys [float-label?
label-top
label-font-size
line-width
line-height
current-value
valid-value
temp-value
max-length]} (reagent/state component)
{:keys [wrapper-style input-style label-hidden? focus-line-height
secure-text-entry label-color error-color error label value on-focus on-blur validator
auto-focus on-change-text on-change on-end-editing on-submit-editing editable placeholder
placeholder-text-color auto-capitalize multiline number-of-lines accessibility-label]}
(merge default-props (reagent/props component))
valid-value (or valid-value "")
label-color (if (and error (not float-label?)) error-color label-color)
label (when-not label-hidden?
(if error (str label " *") label))]
[react/view (merge styles/text-field-container wrapper-style)
(when-not label-hidden?
[react/animated-text {:style (styles/label label-top label-font-size label-color)} label])
[react/text-input {:ref #(reset! input-ref %)
:style (merge styles/text-input input-style)
:placeholder (or placeholder "")
:placeholder-text-color placeholder-text-color
:editable editable
:multiline multiline
:number-of-lines number-of-lines
:secure-text-entry secure-text-entry
:auto-capitalize auto-capitalize
:on-focus #(on-input-focus {:component component
:animation {:top label-top
:to-top (:label-top config)
:font-size label-font-size
:to-font-size (:label-font-small config)
:line-width line-width
:line-height line-height
:to-line-height focus-line-height}
:onFocus on-focus})
:on-blur #(on-input-blur {:component component
:value (or current-value value)
:animation {:top label-top
:to-top (:label-bottom config)
:font-size label-font-size
:to-font-size (:label-font-large config)
:line-width line-width
:line-height line-height
:to-line-width 0
:to-line-height 1}
:onBlur on-blur})
:on-change-text (fn [text]
(reagent/set-state component {:current-value text})
(if (or (not validator) (validator text))
(do
(reagent/set-state component {:valid-value text
:temp-value nil})
(on-change-text text))
(reagent/set-state component {:temp-value valid-value
:max-length (count valid-value)})))
:on-change on-change
:default-value value
:value temp-value
:max-length max-length
:on-submit-editing #(do (.blur @input-ref) (when on-submit-editing (on-submit-editing)))
:on-end-editing (when on-end-editing on-end-editing)
:auto-focus (true? auto-focus)
:accessibility-label accessibility-label}]]))
(defn text-field [_ _]
(let [component-data {:get-initial-state get-initial-state
:component-will-mount component-will-mount
:display-name "text-field"
:reagent-render reagent-render
:component-did-update (fn [comp]
(let [{:keys [temp-value]} (reagent/state comp)]
(when temp-value
(reagent/set-state comp {:temp-value nil
:max-length nil}))))}]
;(log/debug "Creating text-field component: " data)
(reagent/create-class component-data)))

View File

@ -4,12 +4,12 @@
[status-im.ui.components.colors :as colors]
[status-im.ui.components.tooltip.views :as tooltip]))
(defn text-input-with-label [{:keys [label error style height] :as props}]
(defn text-input-with-label [{:keys [label error style height container] :as props}]
[react/view
(when label
[react/text {:style styles/label}
label])
[react/view {:style (styles/input-container height)}
[react/view {:style (merge (styles/input-container height) container)}
[react/text-input
(merge
{:style (merge styles/input style)

View File

@ -16,4 +16,4 @@
(spec/def ::topic (spec/and :global/not-empty-string
::legal-name
(partial re-matches #"[a-z0-9\-]+")))
(partial re-matches #"[a-z\-]+")))

View File

@ -1,7 +1,6 @@
(ns status-im.ui.screens.add-new.new-public-chat.styles
(:require-macros [status-im.utils.styles :refer [defstyle]])
(:require [status-im.ui.components.colors :as colors]
[status-im.ui.components.styles :as styles]))
(:require [status-im.ui.components.colors :as colors]))
(def group-chat-name-input
{:font-size 17
@ -9,29 +8,13 @@
:letter-spacing -0.2
:color colors/text})
(defstyle group-chat-topic-input
{:font-size 14
:line-height 16
:color colors/text
:padding-left -1
:ios {:padding-bottom 0}})
(defstyle topic-hash-style
{:width 10
:position :absolute
:android {:top 8 :left 3}
:ios {:top 6 :left 3}})
(def topic-hash
(merge group-chat-name-input
{:margin-left 14}))
(def group-chat-name-wrapper
{:flex 1})
(def group-container
{:flex 1
:flex-direction :column})
{:flex 1
:flex-direction :column})
(def chat-name-container
{:margin-top 10})
@ -46,14 +29,6 @@
(merge members-text
{:padding-horizontal 16}))
(def input-container
{:flex-direction :row
:align-items :center
:border-radius styles/border-radius
:height 52
:background-color colors/gray-light
:margin-top 24})
(def public-chat-icon
{:background-color colors/blue
:border-radius 50
@ -65,3 +40,12 @@
(def public-chat-icon-symbol
{:font-size 20
:color colors/white})
(def input-container
{:padding-left 0
:background-color nil})
(def tooltip
{:bottom-value -15
:color colors/red-light
:font-size 12})

View File

@ -1,42 +1,38 @@
(ns status-im.ui.screens.add-new.new-public-chat.view
(:require-macros [status-im.utils.views :as views])
(:require [cljs.spec.alpha :as spec]
[re-frame.core :as re-frame]
(:require [re-frame.core :as re-frame]
[status-im.i18n :as i18n]
[status-im.ui.components.list.views :as list]
[status-im.ui.components.react :as react]
[status-im.ui.components.styles :as components.styles]
[status-im.ui.components.status-bar.view :as status-bar]
[status-im.ui.components.text-field.view :as text-field]
[status-im.ui.components.toolbar.view :as toolbar]
[status-im.ui.screens.add-new.styles :as add-new.styles]
[status-im.ui.screens.add-new.new-public-chat.styles :as styles]
[status-im.ui.screens.add-new.new-public-chat.db :as v]
status-im.utils.db))
[status-im.ui.components.text-input.view :as text-input.view]
status-im.utils.db
[status-im.ui.components.styles :as common.styles]
[cljs.spec.alpha :as spec]
[status-im.ui.components.tooltip.views :as tooltip]))
(defn- topic-error-label [topic]
(cond
(not (spec/valid? :global/not-empty-string topic))
(i18n/label :t/empty-topic)
(not (spec/valid? ::v/topic topic))
(i18n/label :t/topic-format)))
(defn- chat-name-input [topic]
[react/view (merge add-new.styles/input-container {:margin-top 8})
[react/text {:style styles/topic-hash} "#"]
[text-field/text-field
{:wrapper-style styles/group-chat-name-wrapper
:line-color components.styles/color-transparent
:focus-line-color components.styles/color-transparent
:label-hidden? true
:input-style styles/group-chat-topic-input
:on-change-text #(re-frame/dispatch [:set :public-group-topic %])
:on-submit-editing #(when topic (re-frame/dispatch [:create-new-public-chat topic]))
:value topic
:validator #(re-matches #"[a-z\-]*" %)
:auto-capitalize :none
:accessibility-label :chat-name-input}]])
(defn- chat-name-input [topic error]
[react/view
[react/view (merge add-new.styles/input-container {:margin-top 8})
[react/text {:style styles/topic-hash} "#"]
[react/view common.styles/flex
[text-input.view/text-input-with-label
{:container styles/input-container
:on-change-text #(do
(re-frame/dispatch [:set :public-group-topic-error (when-not (spec/valid? ::v/topic %)
(i18n/label :t/topic-name-error))])
(re-frame/dispatch [:set :public-group-topic %]))
:on-submit-editing #(when (and topic (spec/valid? ::v/topic topic))
(re-frame/dispatch [:create-new-public-chat topic]))
:auto-capitalize :none
:accessibility-label :chat-name-input
:placeholder nil}]]]
(when error
[tooltip/tooltip error styles/tooltip])])
(defn- public-chat-icon [topic]
[react/view styles/public-chat-icon
@ -58,7 +54,8 @@
(def default-public-chats ["status" "openbounty" "ethereum"])
(views/defview new-public-chat []
(views/letsubs [topic [:get :public-group-topic]]
(views/letsubs [topic [:get :public-group-topic]
error [:get :public-group-topic-error]]
[react/view styles/group-container
[status-bar/status-bar]
[toolbar/simple-toolbar
@ -67,7 +64,7 @@
[react/text {:style styles/section-title
:font :medium}
(i18n/label :t/public-group-topic)]
[chat-name-input topic]]
[chat-name-input topic error]]
[react/view styles/chat-name-container
[react/text {:style styles/section-title
:font :medium}

View File

@ -6,22 +6,17 @@
[status-im.protocol.core :as protocol]
[status-im.utils.contacts :as utils.contacts]
[status-im.utils.random :as random]
[taoensso.timbre :as log]
[cljs.reader :refer [read-string]]
[status-im.utils.js-resources :as js-res]
[status-im.react-native.js-dependencies :as rn-dependencies]
[status-im.js-dependencies :as dependencies]
[status-im.i18n :refer [label]]
[status-im.ui.screens.contacts.navigation]
[status-im.ui.screens.navigation :as navigation]
[status-im.ui.screens.discover.events :as discover-events]
[status-im.chat.console :as console-chat]
[status-im.commands.events.loading :as loading-events]
[cljs.spec.alpha :as spec]
[status-im.protocol.web3.utils :as web3.utils]
[status-im.ui.screens.add-new.new-chat.db :as new-chat.db]
[clojure.string :as string]
[status-im.utils.datetime :as datetime]))
[status-im.utils.datetime :as datetime]
[status-im.js-dependencies :as js-dependencies]))
;;;; COFX
(reg-cofx
@ -135,7 +130,7 @@
128 public-key
nil)]
(when normalized-key
(subs (.sha3 dependencies/Web3.prototype normalized-key #js {:encoding "hex"}) 26))))
(subs (.sha3 js-dependencies/Web3.prototype normalized-key #js {:encoding "hex"}) 26))))
(defn- prepare-default-groups-events [groups default-groups]
[[:add-contact-groups
@ -268,7 +263,6 @@
:pending? false)]
(-> fx
(watch-contact contact')
(discover-events/send-portions-when-contact-exists chat-or-whisper-id)
(add-new-contact contact'))))
(defn add-contact-and-open-chat [fx whisper-id]

View File

@ -2,9 +2,6 @@
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [re-frame.core :refer [dispatch]]
[status-im.ui.components.react :refer [view text touchable-highlight scroll-view]]
[status-im.ui.components.native-action-button :refer [native-action-button
native-action-button-item]]
[status-im.ui.components.icons.custom-icons :refer [ion-icon]]
[status-im.ui.components.contact.contact :refer [contact-view]]
[status-im.utils.platform :refer [platform-specific ios? android?]]
[status-im.utils.utils :as u]

View File

@ -10,7 +10,6 @@
status-im.chat.specs
status-im.commands.specs
status-im.ui.screens.profile.db
status-im.ui.screens.discover.db
status-im.ui.screens.network-settings.db
status-im.ui.screens.offline-messaging-settings.db
status-im.ui.screens.browser.db
@ -64,8 +63,6 @@
;;height of native keyboard if shown
(spec/def ::keyboard-height (spec/nilable number?))
(spec/def ::keyboard-max-height (spec/nilable number?))
;;:unknown - not used
(spec/def ::orientation (spec/nilable keyword?))
;;:online - presence of internet connection in the phone
(spec/def ::network-status (spec/nilable keyword?))
@ -180,7 +177,6 @@
::status-node-started?
::keyboard-height
::keyboard-max-height
::orientation
::network-status
::mailserver-status
::peers-count
@ -211,6 +207,7 @@
:chat/selected-participants
:chat/chat-loaded-callbacks
:chat/public-group-topic
:chat/public-group-topic-error
:chat/messages
:chat/not-loaded-message-ids
:chat/last-clock-value

View File

@ -1,74 +0,0 @@
(ns status-im.ui.screens.discover.all-dapps.views
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [cljs.pprint :as pprint]
[re-frame.core :as re-frame]
[status-im.ui.components.react :as react]
[status-im.ui.components.list.views :as list]
[status-im.ui.components.chat-icon.screen :as chat-icon]
[status-im.ui.screens.discover.components.views :as discover-components]
[status-im.ui.screens.discover.styles :as styles]
[status-im.i18n :as i18n]
[status-im.ui.components.toolbar.view :as toolbar]))
(defn navigate-to-dapp [dapp]
(do (re-frame/dispatch [:set :discover-current-dapp dapp])
(re-frame/dispatch [:navigate-to :discover-dapp-details])))
(defn render-dapp [{:keys [name photo-path dapp?] :as dapp}]
[react/touchable-highlight {:on-press #(navigate-to-dapp dapp)
:disabled (empty? name)}
[react/view {:style styles/all-dapps-flat-list-item}
[react/view styles/dapps-list-item-name-container
[react/view styles/dapps-list-item-avatar-container
[react/view [chat-icon/contact-icon-view dapp {:size 80}]]]
[react/text {:style styles/dapps-list-item-name
:font :medium
:number-of-lines 2}
name]]]])
;; TODO(oskarth): Move this to top level discover ns
(defn preview [dapps]
[react/view styles/dapp-preview-container
;; TODO(oskarth): Refactor to shorter form
[discover-components/title
:t/dapps
:t/all
#(re-frame/dispatch [:navigate-to :discover-all-dapps])
true]
(if (seq dapps)
[list/flat-list {:data (vals dapps)
:key-fn :dapp-url
:render-fn render-dapp
:horizontal true
:default-separator? false
:shows-horizontal-scroll-indicator false
:content-container-style styles/dapp-preview-flat-list}]
[react/text (i18n/label :t/none)])])
;; todo(goranjovic): this is a hacky fix for the dapp alignment problem in a flatlist based grid
;; it works fine only if the number of items is evenly divisible with the number of columns
;; so we make it so by adding up blank dapp items.
;; the proper solution might be to find a decent component for grid lists
(defn add-blank-dapps-for-padding [columns dapps]
(let [extras (mod (count dapps) columns)]
(if (zero? extras)
dapps
(concat dapps
(map (fn [i] {:name ""
:dapp-url (str "blank-" i)})
(range (- columns extras)))))))
(defview main []
(letsubs [all-dapps [:discover/all-dapps]]
(let [columns 3]
(when (seq all-dapps)
[react/view styles/all-dapps-container
[toolbar/toolbar {}
toolbar/default-nav-back
[toolbar/content-title (i18n/label :t/dapps)]]
[list/flat-list {:data (add-blank-dapps-for-padding columns (vals all-dapps))
:key-fn :dapp-url
:render-fn render-dapp
:num-columns columns
:content-container-style styles/all-dapps-flat-list}]]))))

View File

@ -1,122 +0,0 @@
(ns status-im.ui.screens.discover.components.views
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [re-frame.core :as re-frame]
[clojure.string :as str]
[status-im.ui.components.react :as react]
[status-im.ui.screens.discover.styles :as styles]
[status-im.ui.components.status-view.view :as view]
[status-im.utils.gfycat.core :as gfycat]
[status-im.utils.identicon :as identicon]
[status-im.ui.components.chat-icon.screen :as chat-icon]
[status-im.ui.components.icons.vector-icons :as vector-icons]
[status-im.i18n :as i18n]))
;; TODO(oskarth): Too many positional args, refactor to map
(defn title [label-kw action-kw action-fn active?]
[react/view styles/title
[react/text {:style styles/title-text
:font :medium}
(i18n/label label-kw)]
[react/touchable-highlight {:on-press action-fn
:disabled (not active?)}
[react/view {}
;; NOTE(oskarth): text-transform to uppercase not supported as RN style
;; https://github.com/facebook/react-native/issues/2088
[react/text {:style (styles/title-action-text active?)
:uppercase? true}
(i18n/label action-kw)]]]])
;; TODO(oskarth): Reconcile with above fn
(defn title-no-action [label-kw]
[react/view styles/title
[react/text {:style styles/title-text
:font :medium}
(i18n/label label-kw)]])
(defn display-name [me? account-name contact-name name whisper-id]
(cond
me? account-name ;status by current user
(not (str/blank? contact-name)) contact-name ; what's the
(not (str/blank? name)) name ;difference
:else (gfycat/generate-gfy whisper-id)))
(defn display-image [me? account-photo-path contact-photo-path photo-path whisper-id]
(cond
me? account-photo-path
(not (str/blank? contact-photo-path)) contact-photo-path
(not (str/blank? photo-path)) photo-path
:else (identicon/identicon whisper-id)))
(defn chat-button [whisper-id]
[react/touchable-highlight {:on-press #(re-frame/dispatch [:start-chat whisper-id {:navigation-replace? true}])}
[react/view styles/chat-button-container
[react/view styles/chat-button-inner
[vector-icons/icon :icons/chats {:color :active}]
[react/text {:style styles/chat-button-text
:uppercase? true}
(i18n/label :t/chat)]]]])
(defn discover-list-item [{:keys [message show-separator? current-account contacts]}]
(let [{contact-name :name
contact-photo-path :photo-path} (get contacts (:whisper-id message))
{:keys [name photo-path whisper-id message-id status]} message
{account-photo-path :photo-path
account-address :public-key
account-name :name} current-account
me? (= account-address whisper-id)]
[react/view
[react/view styles/discover-list-item
[view/status-view {:id message-id
:style styles/discover-item-status-text
:status status}]
[react/touchable-highlight {:on-press #(re-frame/dispatch [:show-status-author-profile whisper-id])}
[react/view styles/discover-list-item-second-row
[react/view styles/discover-list-item-name-container
[react/view styles/discover-list-item-avatar-container
[chat-icon/chat-icon
(display-image me? account-photo-path contact-photo-path photo-path whisper-id)
{:size 24}]]
[react/view
[react/text {:style styles/discover-list-item-name
:font :medium
:number-of-lines 1}
(display-name me? account-name contact-name name whisper-id)]]]
(when-not me?
(chat-button whisper-id))]]
(when show-separator?
[react/view styles/separator])]]))
;; NOTE(oskarth): Should possibly be merged with discover-list-item-full, but
;; there are too many differences between preview item (main screen) and full
;; screen, so safer to modify custom styles here without risking regressions.
(defn discover-list-item-full [{:keys [message show-separator? current-account contacts]}]
(let [{contact-name :name
contact-photo-path :photo-path} (get contacts (:whisper-id message))
{:keys [name photo-path whisper-id message-id status]} message
{account-photo-path :photo-path
account-address :public-key
account-name :name} current-account
me? (= account-address whisper-id)]
[react/view
[react/view styles/discover-list-item-full ;; XXX: Custom style here
[view/status-view {:id message-id
:style styles/discover-item-status-text
:status status}]
[react/touchable-highlight {:on-press #(re-frame/dispatch [:show-status-author-profile whisper-id])}
[react/view styles/discover-list-item-second-row
[react/view styles/discover-list-item-name-container
[react/view styles/discover-list-item-avatar-container
[chat-icon/chat-icon
(display-image me? account-photo-path contact-photo-path photo-path whisper-id)
{:size 24}]]
[react/view
[react/text {:style styles/discover-list-item-name
:font :medium
:number-of-lines 1}
(display-name me? account-name contact-name name whisper-id)]]]
(when-not me?
(chat-button whisper-id))]]]
(when show-separator?
[react/view styles/separator])]))

View File

@ -1,47 +0,0 @@
(ns status-im.ui.screens.discover.dapp-details.views
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [status-im.ui.components.react :as react]
[status-im.ui.screens.discover.components.views :as components]
[status-im.ui.components.chat-icon.screen :as chat-icon.screen]
[status-im.ui.components.common.common :as common]
[status-im.ui.components.icons.vector-icons :as vector-icons]
[status-im.ui.components.toolbar.view :as toolbar]
[status-im.ui.screens.discover.styles :as styles]
[status-im.i18n :as i18n]
[re-frame.core :as re-frame]))
(defn section [title content]
[react/view styles/dapp-details-section-container
[react/view styles/dapp-details-section-title-container
[react/text {:font :small
:style styles/dapp-details-section-title-text} title]]
[react/view styles/dapp-details-section-body-container
[react/text {:font :medium
:style styles/dapp-details-section-content-text} content]]])
(defview dapp-details []
(letsubs [{:keys [photo-path name dapp-url] :as dapp} [:get :discover-current-dapp]]
[react/view styles/dapp-details-container
[toolbar/toolbar {}
toolbar/default-nav-back
[toolbar/content-title (i18n/label :t/dapp-profile)]]
[react/view styles/dapp-details-inner-container
[react/view styles/dapp-details-header
[react/view styles/dapp-details-icon
[chat-icon.screen/chat-icon photo-path {:size 56}]]
[react/view styles/dapp-details-name-container
[react/text {:font :medium
:style styles/dapp-details-name-text} name]]]
[react/touchable-highlight {:on-press #(re-frame/dispatch [:open-chat-with-contact dapp])}
[react/view styles/dapp-details-action-container
[react/view styles/dapp-details-action-icon-container
[vector-icons/icon :icons/open {:color :active
:style styles/dapp-details-open-icon
:container-style styles/dapp-details-open-icon-background}]]
[react/view styles/dapp-details-action-name-container
[react/view
[react/text {:font :medium
:style styles/dapp-details-action-name-text} (i18n/label :t/open)]]]]]
[section (i18n/label :t/description) (:description dapp "Description goes here")]
[common/separator]
[section (i18n/label :t/url) dapp-url]]]))

View File

@ -1,9 +0,0 @@
(ns status-im.ui.screens.discover.db
(:require [cljs.spec.alpha :as s]))
;; {id (string) descovery (map)}
(s/def :discoveries/discoveries (s/nilable map?))
(s/def :discoveries/discover-search-tags (s/nilable set?))
(s/def :discoveries/tags (s/nilable vector?))
(s/def :discoveries/current-tag (s/nilable map?))
(s/def :discoveries/request-discoveries-timer (s/nilable int?))

View File

@ -1,177 +0,0 @@
(ns status-im.ui.screens.discover.events
(:require [re-frame.core :as re-frame]
[status-im.protocol.core :as protocol]
[status-im.utils.handlers :as handlers]
[clojure.string :as string]
[status-im.utils.utils :as utils]))
(def request-discoveries-interval-s 600)
(def maximum-number-of-discoveries 1000)
;; EFFECTS
(re-frame/reg-fx
::send-portions
(fn [{:keys [current-public-key web3 contacts to discoveries]}]
(protocol/send-discoveries-response!
{:web3 web3
:discoveries discoveries
:message {:from current-public-key
:to to}})))
(re-frame/reg-fx
::request-discoveries
(fn [{:keys [identities web3 current-public-key message-id]}]
(doseq [id identities]
(when-not (protocol/message-pending? web3 :discoveries-request id)
(protocol/send-discoveries-request!
{:web3 web3
:message {:from current-public-key
:to id
:message-id message-id}})))))
(re-frame/reg-fx
::broadcast-status
(fn [{:keys [identities web3 message]}]
(doseq [id identities]
(protocol/send-status!
{:web3 web3
:message (assoc message :to id)}))))
;; HELPER-FN
(defn send-portions-when-contact-exists
"Takes fx map and adds send-portions if contact exists"
[{{:keys [current-public-key web3 discoveries]
:contacts/keys [contacts]} :db :as fx}
to]
(cond-> fx
(get contacts to)
(assoc ::send-portions {:current-public-key current-public-key
:web3 web3
:contacts contacts
:to to
:discoveries (mapv #(dissoc % :tags) (vals discoveries))})))
(defn add-discover [db {:keys [message-id] :as discover}]
(assoc-in db [:discoveries message-id] discover))
(defn add-discovers [db discovers]
(reduce add-discover db discovers))
(defn new-discover? [discoveries {:keys [message-id]}]
(not (get discoveries message-id)))
;; EVENTS
(defn navigate-to-discover-search-results [db search-tags]
{:db (assoc db :discover-search-tags search-tags)
:dispatch [:navigate-to :discover-search-results]})
(handlers/register-handler-fx
:discover/search-tags-results-view
(fn [{:keys [db]} [_ search-text]]
(navigate-to-discover-search-results db (reduce (fn [acc tag]
(conj acc (-> tag
(string/replace #"#" "")
string/lower-case
keyword)))
#{}
(re-seq #"[^ !?,;:.]+" search-text)))))
(handlers/register-handler-fx
:discover/search-tag-results-view
(fn [{:keys [db]} [_ tag]]
(navigate-to-discover-search-results db #{(keyword tag)})))
(handlers/register-handler-fx
:discover/popular-tags-view
(fn [{:keys [db]} [_ popular-tags]]
{:db (assoc db :discover-search-tags (into #{} popular-tags))
:dispatch [:navigate-to :discover-all-hashtags]}))
(handlers/register-handler-fx
:broadcast-status
[(re-frame/inject-cofx :random-id)]
(fn [{{:keys [current-public-key web3]
:accounts/keys [accounts current-account-id]
:contacts/keys [contacts]} :db
random-id :random-id}
[_ status]]
(when-let [hashtags (seq (handlers/get-hashtags status))]
(let [{:keys [name photo-path]} (get accounts current-account-id)
message {:message-id random-id
:from current-public-key
:payload {:message-id random-id
:status status
:hashtags (vec hashtags)
:profile {:name name
:profile-image photo-path}}}]
{::broadcast-status {:web3 web3
:message message
:identities (handlers/identities contacts)}
:dispatch [:status-received message]}))))
(handlers/register-handler-fx
:request-discoveries
[(re-frame/inject-cofx :random-id)]
(fn [{{:keys [current-public-key web3]
:contacts/keys [contacts]} :db
random-id :random-id} _]
{::request-discoveries {:current-public-key current-public-key
:web3 web3
:identities (handlers/identities contacts)
:message-id random-id}}))
(handlers/register-handler-fx
:discoveries-send-portions
(fn [{:keys [db]} [_ to]]
(send-portions-when-contact-exists {:db db} to)))
(handlers/register-handler-fx
:discoveries-request-received
(fn [{:keys [db]} [_ {:keys [from]}]]
(send-portions-when-contact-exists {:db db} from)))
(handlers/register-handler-fx
:discoveries-response-received
[(re-frame/inject-cofx :now)]
(fn [{{:keys [discoveries]
:contacts/keys [contacts] :as db} :db
now :now}
[_ {:keys [payload from]}]]
(when (get contacts from)
(when-let [discovers (some->> (:data payload)
(filter #(new-discover? discoveries %))
(map #(assoc %
:created-at now
:tags (handlers/get-hashtags (:status %)))))]
{:db (add-discovers db discovers)
:data-store.discover/save-all [discovers maximum-number-of-discoveries]}))))
(handlers/register-handler-fx
:status-received
[(re-frame/inject-cofx :now)]
(fn [{{:keys [discoveries] :as db} :db
now :now}
[_ {{:keys [message-id status profile] :as payload} :payload
from :from}]]
(when (new-discover? discoveries payload)
(let [{:keys [name profile-image]} profile
discover {:message-id message-id
:name name
:photo-path profile-image
:status status
:tags (handlers/get-hashtags status)
:whisper-id from
:created-at now}]
{:db (add-discover db discover)
:data-store.discover/save-all [[discover] maximum-number-of-discoveries]}))))
(handlers/register-handler-fx
:show-status-author-profile
(fn [{db :db} [_ identity]]
{:db (assoc db :contacts/identity identity)
:dispatch [:navigate-to :profile]}))

View File

@ -1,47 +0,0 @@
(ns status-im.ui.screens.discover.popular-hashtags.views
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [status-im.ui.components.react :as react]
[status-im.ui.screens.discover.styles :as styles]
[status-im.ui.screens.discover.components.views :as components]
[status-im.ui.components.list.views :as list]
[re-frame.core :as re-frame]
[status-im.i18n :as i18n]
[status-im.ui.components.toolbar.view :as toolbar]))
(defn render-tag [tag]
[react/touchable-highlight
{:on-press #(re-frame/dispatch [:discover/search-tag-results-view tag])}
[react/view styles/tag-view
[react/text {:style styles/tag-title
:font :default}
(str " #" tag)]]])
(defn tags-menu [tags]
[react/view styles/tag-title-container
[list/flat-list {:data tags
:key-fn (fn [_ i] (str i))
:render-fn render-tag
:horizontal true
:shows-horizontal-scroll-indicator false
:default-separator? false}]])
(defview discover-all-popular-hashtags []
(letsubs [current-account [:get-current-account]
contacts [:get-contacts]
{:keys [discoveries tags]} [:discover/all-popular-hashtags]]
[react/view styles/all-recent-container
[toolbar/toolbar {}
toolbar/default-nav-back
[toolbar/content-title (i18n/label :t/popular-tags)]]
[tags-menu (map name tags)]
[react/scroll-view styles/list-container
[react/view styles/status-list-outer
[react/view styles/status-list-inner
(let [discoveries (map-indexed vector discoveries)]
(for [[i {:keys [message-id] :as message}] discoveries]
^{:key (str "message-hashtag-" message-id)}
[components/discover-list-item-full
{:message message
:show-separator? (not= (inc i) (count discoveries))
:contacts contacts
:current-account current-account}]))]]]]))

View File

@ -1,28 +0,0 @@
(ns status-im.ui.screens.discover.recent-statuses.views
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [status-im.ui.components.react :as react]
[status-im.ui.screens.discover.components.views :as components]
[status-im.ui.screens.discover.styles :as styles]
[status-im.ui.components.toolbar.view :as toolbar]
[status-im.i18n :as i18n]))
(defview discover-all-recent []
(letsubs [discoveries [:discover/recent-discoveries]
current-account [:get-current-account]
contacts [:get-contacts]]
[react/view styles/all-recent-container
[toolbar/toolbar {}
toolbar/default-nav-back
[toolbar/content-title (i18n/label :t/recent)]]
(when (seq discoveries)
[react/scroll-view (styles/list-container false)
[react/view styles/status-list-outer
[react/view styles/status-list-inner
(let [discoveries (map-indexed vector discoveries)]
(for [[i {:keys [message-id] :as message}] discoveries]
^{:key (str "message-recent-" message-id)}
[components/discover-list-item-full
{:message message
:show-separator? (not= (inc i) (count discoveries))
:contacts contacts
:current-account current-account}]))]]])]))

View File

@ -1,35 +0,0 @@
(ns status-im.ui.screens.discover.search-results.views
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [status-im.ui.components.react :as react]
[status-im.ui.components.icons.vector-icons :as vi]
[status-im.ui.components.toolbar.view :as toolbar]
[status-im.ui.screens.discover.components.views :as components]
[status-im.i18n :as i18n]
[status-im.ui.screens.discover.styles :as styles]
[status-im.ui.screens.contacts.styles :as contacts-styles]))
;; TOOD(oskarth): Refactor this, very similar to discover-all-hashtags view
(defview discover-search-results []
(letsubs [{:keys [discoveries tags total]} [:discover/search-results 250]
contacts [:get-contacts]
current-account [:get-current-account]]
[react/view styles/discover-tag-container
[toolbar/toolbar {}
toolbar/default-nav-back
[toolbar/content-title (str "#" (name (first tags)) " " total)]]
(if (empty? discoveries)
[react/view styles/empty-view
[vi/icon :icons/group-big {:style contacts-styles/empty-contacts-icon}]
[react/text {:style contacts-styles/empty-contacts-text}
(i18n/label :t/no-statuses-found)]]
[react/scroll-view styles/list-container
[react/view styles/status-list-outer
[react/view styles/status-list-inner
(let [discoveries (map-indexed vector discoveries)]
(for [[i {:keys [message-id] :as message}] discoveries]
^{:key (str "message-hashtag-" message-id)}
[components/discover-list-item-full
{:message message
:show-separator? (not= (inc i) (count discoveries))
:contacts contacts
:current-account current-account}]))]]])]))

View File

@ -1,441 +0,0 @@
(ns status-im.ui.screens.discover.styles
(:require-macros [status-im.utils.styles :refer [defstyle]])
(:require [status-im.ui.components.styles :as styles]))
;; Common
(def background-color styles/color-light-gray)
(def row-separator
{:border-bottom-width 1
:border-bottom-color styles/color-light-gray4})
(def row
{:flex 1
:flex-direction :row
:align-items :center
:justify-content :space-between
:margin-bottom 10})
(def column
{:flex-direction :column})
(def empty-view
{:flex 1
:background-color styles/color-white
:align-items :center
:justify-content :center})
(def title
{:padding 16
:flex-direction :row
:justify-content :space-between})
(defstyle title-text
{:ios {:color styles/color-steel
:font-size 13}
:android {:color styles/color-gray2
:font-size 14}})
(defstyle discover-item-status-text
{:ios {:font-size 14
:letter-spacing -0.1}
:android {:line-height 22
:font-size 16}})
(def discover-list-item-name-container
{:flex 1
:padding-right 30
:flex-direction :row
:justify-content :flex-start
:align-items :center})
(def discover-list-item-name
{:margin-left 7
:color styles/color-black
:font-size 14})
;; TODO(oskarth): These rules should be pulled out into more custom styles, not
;; generic enough for discover-list-item
(def discover-list-item
{:flex-direction :column
:padding-bottom 16
:margin-right 10
:top 1})
(def discover-list-item-full
{:flex-direction :column
:margin-top 16
:margin-horizontal 16
:margin-bottom 12})
;; TODO(oskarth): Style too specific for full view, refactor
(def discover-list-item-second-row
{:flex 1
:flex-direction :row
:align-items :center
:justify-content :space-between
:padding-top 25})
(defstyle discover-list-item-avatar-container
{:flex-direction :column})
(def popular-container
{:background-color background-color})
(def carousel-page-style
{})
(def tag-button
{:color styles/color-blue
:font-size 14
:padding-right 5
:padding-bottom 2
:align-items :center
:justify-content :center})
(def tag-name
{:color styles/color-blue
:background-color :white
:font-size 14
:align-items :center
:justify-content :center})
(def tag-count
{:color styles/color-gray
:font-size 12
:padding-right 6
:padding-bottom 2
:align-items :center
:justify-content :center})
(def tag-count-container
{:flex 0.2
:flex-direction :column
:align-items :flex-end
:padding-top 6
:padding-right 9})
(def separator
{:background-color styles/color-gray11
:height 4
:margin-top 2
:margin-bottom 2})
;; Popular list item
(defstyle popular-list-container
{:flex 1
:background-color :white
:padding-top 18
:padding-left 16
:ios {:border-radius 3
:border-width 1
:border-color styles/color-white}
:android {:border-radius 4
:margin-top 2
:margin-bottom 4
:margin-right 2}})
(def chat-button-container
{:justify-content :center
:align-items :center
:background-color styles/color-blue4-transparent
:border-radius 8})
(defstyle chat-button-inner
{:flex-direction :row
:padding-top 7
:padding-left 7
:padding-right 8
:padding-bottom 5})
(defstyle chat-button-text
{:color styles/color-blue4
:ios {:font-size 15}
:android {:font-size 14
:font-weight :bold}})
;; discover_recent
(def status-list-outer
{:background-color background-color})
(def status-list-inner
{:background-color :white
:margin-top 4})
;; All dapps
(def all-dapps-container
{:flex 1
:margin-top 16
:background-color background-color})
(def all-dapps-flat-list
{:flex-direction :column
:flex-wrap :wrap
:justify-content :center
:align-items :center
:margin-top 8
:background-color styles/color-white})
(def all-dapps-flat-list-item
{:margin 10
:width 90
:height 140
:justify-content :center
:align-items :center})
(def dapps-list-item-name-container
{:background-color styles/color-white
:flex-direction :column
:align-items :center})
(def dapps-list-item-name
{:margin-left 7
:padding 4
:margin 4
:color styles/text1-color
:font-size 14
:text-align :center})
(defstyle dapps-list-item-avatar-container
{:flex-direction :column
:padding 4
:margin 4
:align-items :center
:ios {:padding-top 0
:bottom -4
:justify-content :flex-end}})
(def dapp-preview-container
{:background-color styles/color-white
:margin-top 16
:margin-bottom 4})
(def dapp-preview-flat-list
{:justify-content :center
:flex-direction :row
:margin-left 8
:margin-vertical 0
:background-color styles/color-white})
;; Discover tag
(def discover-tag-toolbar
{:border-bottom-color styles/color-light-gray5
:border-bottom-width 1})
(def tag-title-container
{:height 68
:margin-left 16
:align-items :center
:justify-content :flex-start
:flex-direction :row
:background-color styles/color-light-gray})
(defstyle tag-view
{:margin-horizontal 2
:padding 10
:padding-bottom 8
:height 36
:background-color styles/color-white
:justify-content :center
:align-items :center
:flex-direction :column
:ios {
:border-color styles/color-light-blue6}
:android {:border-radius 4}})
(def tag-title
{:color styles/color-blue4
:background-color styles/color-white
:font-size 14})
(def icon-back
{:width 8
:height 14})
(def discover-container
{:flex 1
:background-color styles/color-light-gray})
(def list-container
{:flex 1})
(defn title-action-text [active?]
{:color (if active?
styles/color-blue
styles/color-gray-transparent)})
(def recent-statuses-preview-container
{:background-color background-color})
(def recent-statuses-preview-content
{:border-radius 4
:padding-top 18
:padding-left 16
:margin-top 2
:margin-bottom 4
:margin-right 2
:background-color :white})
(def public-chats-container
{:background-color styles/color-white})
(def public-chats-item-container
{:flex-direction :row
:padding 16})
(def public-chats-icon-width-ratio
0.15)
(def public-chats-icon-container
{:flex public-chats-icon-width-ratio})
(defn public-chats-icon [color]
{:width 50
:height 50
:border-radius 25
:background-color color
:flex-direction :row
:justify-content :center
:align-items :center})
(def public-chats-icon-text
{:font-size 25})
(def public-chats-item-inner
{:flex (- 1 public-chats-icon-width-ratio)
:margin-left 10
:flex-direction :column})
(def public-chats-item-name-container
{:flex-direction :row})
(def public-chats-item-name-text
{:font-size 16
:margin-left 5})
(def dapp-details-inner-container
{:flex-direction :column})
(defstyle dapp-details-header
{:flex-direction :row
:justify-content :flex-start
:align-items :center
:height 80
:background-color styles/color-white
:margin-top 4
:android {:elevation 2}})
(def dapp-details-icon
{:flex 0.2
:background-color styles/color-white
:margin-left 10})
(def dapp-details-name-container
{:flex 0.8
:background-color styles/color-white})
(defstyle dapp-details-name-text
{:android {:font-size 16
:color styles/color-gray6}
:ios {:font-size 17}})
(defstyle dapp-details-action-container
{:flex-direction :row
:margin-top 15
:margin-bottom 15
:align-items :center
:background-color styles/color-white
:android {:height 64
:elevation 2}
:ios {:height 72}})
(def dapp-details-action-icon-container
{:padding-left 10
:flex 0.2
:justify-content :center
:align-items :center
:background-color styles/color-white})
(defstyle dapp-details-open-icon-background
{:ios {:background-color styles/color-blue4-transparent
:height 40
:width 40
:border-radius 20
:justify-content :center
:align-items :center}})
(defstyle dapp-details-open-icon
{:width 24
:height 24})
(def dapp-details-action-name-container
{:flex 0.80
:background-color styles/color-white
:flex-direction :row
:justify-content :flex-start
:align-items :center})
(defstyle dapp-details-action-name-text
{:color styles/color-blue4
:android {:font-size 16
:color styles/color-gray6}
:ios {:font-size 17}})
(defstyle dapp-details-section-container
{:background-color styles/color-white
:android {:elevation 2}})
(def dapp-details-section-title-container
{:background-color styles/color-white
:padding 10})
(defstyle dapp-details-section-title-text
{:color styles/color-gray
:ios {:font-size 14}
:android {:font-size 12}})
(def dapp-details-section-body-container
{:background-color styles/color-white
:padding-left 10
:padding-right 10
:padding-bottom 16})
(defstyle dapp-details-section-content-text
{:ios {:font-size 17}
:android {:font-size 16
:color styles/color-gray6}})
(def empty-section-container
{:flex-direction :row
:justify-content :center
:align-items :center
:padding-vertical 50
:margin-right 6})
(def empty-section-image
{:height 70
:width 70})
(def empty-section-description
{:flex-direction :column
:margin-left 6})
(def empty-section-title-text
{:font-size 15})
(def empty-section-body-text
{:margin-top 2
:font-size 14})
;; TODO(oskarth): Copy of existing style, generalize - discover-container overloaded
(def all-recent-container all-dapps-container)
(def all-popular-container all-dapps-container)
;; TODO(goranjovic): Using the same style in dapp-details screen - reconcile later
(def dapp-details-container all-dapps-container)
(def discover-tag-container all-dapps-container)

View File

@ -1,108 +0,0 @@
(ns status-im.ui.screens.discover.subs
(:require [re-frame.core :refer [reg-sub]]
[status-im.utils.datetime :as time]))
(defn- calculate-priority [now-ms chats current-public-key contacts
{:keys [whisper-id created-at]}]
(let [contact (get contacts whisper-id)
chat (get chats whisper-id)
seen-online-recently? (< (- now-ms (get contact :last-online))
time/hour)
me? (= current-public-key whisper-id)]
(+ created-at ; message is newer => priority is higher
(if (or me? contact) time/day 0) ; user exists in contact list => increase priority
(if (or me? chat) time/day 0) ; chat with this user exists => increase priority
(if (or me? seen-online-recently?) time/hour 0)))) ; the user was online recently => increase priority
(defn- get-discoveries-by-tags [discoveries-by-tags search-tags]
(reduce (fn [acc search-tag]
(concat acc (get discoveries-by-tags search-tag [])))
[]
search-tags))
(reg-sub :discover/discoveries :discoveries)
(reg-sub :discover/discoveries-with-priority
:<- [:discover/discoveries]
:<- [:get-active-chats]
:<- [:get-contacts]
:<- [:get :current-public-key]
(fn [[discoveries chats contacts current-public-key]]
(let [now-ms (time/timestamp)]
(map #(assoc % :priority (calculate-priority now-ms chats current-public-key contacts %)) (vals discoveries)))))
(reg-sub :discover/search-tags :discover-search-tags)
(reg-sub :discover/tags
:<- [:discover/discoveries]
(fn [discoveries]
(reduce (fn [acc {:keys [tags]}]
(into acc tags))
#{}
(vals discoveries))))
;; TODO(yenda) this is not really the most recent discoveries
;; it's just all off them
(reg-sub :discover/recent-discoveries
:<- [:discover/discoveries]
(fn [discoveries]
(sort-by :created-at > (vals discoveries))))
(reg-sub :discover/discoveries-by-tags
:<- [:discover/discoveries-with-priority]
(fn [discoveries]
(reduce (fn [discoveries-by-tags {:keys [tags] :as discovery}]
(reduce (fn [discoveries-by-tags tag]
(update discoveries-by-tags tag conj discovery))
discoveries-by-tags
tags))
{}
discoveries)))
(reg-sub :discover/most-popular-hashtags
:<- [:discover/discoveries-by-tags]
(fn [discoveries]
(->> discoveries
(sort-by (comp count val) >)
(take 10))))
(reg-sub :discover/popular-hashtags-preview
:<- [:discover/most-popular-hashtags]
(fn [most-popular-hashtags]
(->> most-popular-hashtags
(map (fn [[tag discoveries]] {:tag tag
:total (count discoveries)
:discovery (first (sort-by :priority > discoveries))})))))
(reg-sub :discover/all-popular-hashtags
:<- [:discover/most-popular-hashtags]
(fn [most-popular-hashtags]
(let [tags (map first most-popular-hashtags)
discoveries (apply concat (map second most-popular-hashtags))]
{:tags tags
:discoveries (sort-by :priority > (distinct discoveries))})))
(reg-sub :discover/search-results
:<- [:discover/discoveries-by-tags]
:<- [:discover/search-tags]
:<- [:get-active-chats]
:<- [:get-contacts]
:<- [:get :current-public-key]
(fn [[discoveries search-tags chats contacts current-public-key] [_ limit]]
(let [discoveries (->> (get-discoveries-by-tags discoveries search-tags)
(sort-by :priority >))]
{:discoveries (take limit discoveries)
:tags search-tags
:total (count discoveries)})))
(reg-sub :discover/all-dapps
(fn [db]
(let [dapp? (->> (get-in db [:group/contact-groups "dapps" :contacts])
(map :identity)
set)]
(->> (:contacts/contacts db)
(filter #(-> % key dapp?))
(into {})))))

View File

@ -1,148 +0,0 @@
(ns status-im.ui.screens.discover.views
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [re-frame.core :as re-frame]
[clojure.string :as string]
[status-im.ui.components.react :as react]
[status-im.ui.components.icons.vector-icons :as vector-icons]
[status-im.ui.components.toolbar.view :as toolbar]
[status-im.ui.components.toolbar.actions :as actions]
[status-im.ui.components.carousel.carousel :as carousel]
[status-im.ui.screens.discover.components.views :as components]
[status-im.ui.screens.discover.all-dapps.views :as all-dapps]
[status-im.i18n :as i18n]
[status-im.ui.screens.discover.styles :as styles]
[status-im.ui.screens.contacts.styles :as contacts-st]
[status-im.ui.components.list.views :as list]
[status-im.react-native.resources :as resources]))
(defn empty-section [image-kw title-kw body-kw]
[react/view styles/empty-section-container
[react/image {:source (image-kw resources/ui)
:style styles/empty-section-image}]
[react/view styles/empty-section-description
[react/text {:font :medium
:style styles/empty-section-title-text}
(i18n/label title-kw)]
[react/text {:style styles/empty-section-body-text}
(i18n/label body-kw)]]])
(defn get-hashtags [status]
(let [hashtags (map #(string/lower-case (string/replace % #"#" "")) (re-seq #"[^ !?,;:.]+" status))]
(or hashtags [])))
(defn top-status-for-popular-hashtag [{:keys [popular-hashtag current-account contacts]}]
(let [{:keys [tag discovery total]} popular-hashtag]
[react/view styles/popular-list-container
[react/view styles/row
[react/view {}
[react/touchable-highlight
{:on-press #(re-frame/dispatch [:discover/search-tag-results-view tag])}
[react/view {}
[react/text {:style styles/tag-name
:font :medium}
(str " #" (name tag))]]]]
[react/view styles/tag-count-container
[react/text {:style styles/tag-count
:font :default}
(str total)]]]
[components/discover-list-item {:message discovery
:show-separator? false
:current-account current-account
:contacts contacts}]]))
(defn popular-hashtags-preview [{:keys [popular-hashtags contacts current-account]}]
(let [has-content? (seq popular-hashtags)]
[react/view styles/popular-container
[components/title :t/popular-tags :t/all #(re-frame/dispatch [:navigate-to :discover-all-popular-hashtags]) has-content?]
(if has-content?
[carousel/carousel {:pageStyle styles/carousel-page-style
:gap 8
:sneak 16
:count (count popular-hashtags)}
(for [popular-hashtag popular-hashtags]
[top-status-for-popular-hashtag {:popular-hashtag popular-hashtag
:contacts contacts
:current-account current-account}])]
[empty-section :empty-hashtags :t/no-hashtags-discovered-title :t/no-hashtags-discovered-body])]))
(defn recent-statuses-preview [{:keys [current-account contacts discoveries]}]
(let [has-content? (seq discoveries)]
[react/view styles/recent-statuses-preview-container
[components/title :t/recent :t/all #(re-frame/dispatch [:navigate-to :discover-all-recent]) has-content?]
(if has-content?
[carousel/carousel {:pageStyle styles/carousel-page-style
:gap 8
:sneak 16
:count (count discoveries)}
(for [discovery discoveries]
[react/view styles/recent-statuses-preview-content
[components/discover-list-item {:message discovery
:show-separator? false
:current-account current-account
:contacts contacts}]])]
[empty-section :empty-recent :t/no-statuses-discovered :t/no-statuses-discovered-body])]))
;; TODO(oskarth): Figure out chat count how to get from public chat list subscription
;; TODO(oskarth): Move colors into common namespace
(def public-chats-mock-data
[{:name "Status"
:topic "status"
:count 25
:color "#77DCC6"}
{:name "ETH news"
:topic "ethnews"
:count 12
:color "#DC77CE"}
{:name "All about Ethereum"
:topic "ethereum"
:count 32
:color "#778CDC"}
{:name "Devcon"
:topic "devcon"
:count 47
:color "#77DCC6"}])
(defn navigate-to-public-chat [topic]
(re-frame/dispatch [:create-new-public-chat topic]))
(defn render-public-chats-item [{:keys [name color topic] :as item}]
[react/touchable-highlight {:on-press #(navigate-to-public-chat topic)}
[react/view styles/public-chats-item-container
[react/view styles/public-chats-icon-container
[react/view (styles/public-chats-icon color)
[react/text {:style styles/public-chats-icon-text}
(-> name first str)]]]
[react/view styles/public-chats-item-inner
[react/view styles/public-chats-item-name-container
[vector-icons/icon :icons/public-chat]
[react/text {:font :medium
:style styles/public-chats-item-name-text}
name]]
[react/view {}
[react/text {:style {:color :lightgray}}
(str "#" topic)]]]]])
(defn public-chats-teaser []
[react/view styles/public-chats-container
[components/title-no-action :t/public-chats]
[list/flat-list {:data public-chats-mock-data
:key-fn :topic
:render-fn render-public-chats-item}]])
(defview discover [current-view?]
(letsubs [contacts [:get-contacts]
current-account [:get-current-account]
discoveries [:discover/recent-discoveries]
all-dapps [:discover/all-dapps]
popular-hashtags [:discover/popular-hashtags-preview]]
[react/view styles/discover-container
[toolbar/simple-toolbar (i18n/label :t/discover)]
[react/scroll-view styles/list-container
[recent-statuses-preview {:contacts contacts
:current-account current-account
:discoveries discoveries}]
[popular-hashtags-preview {:popular-hashtags popular-hashtags
:contacts contacts
:current-account current-account}]
[all-dapps/preview all-dapps]
[public-chats-teaser]]]))

View File

@ -10,7 +10,6 @@
status-im.ui.screens.accounts.login.events
status-im.ui.screens.accounts.recover.events
status-im.ui.screens.contacts.events
status-im.ui.screens.discover.events
status-im.ui.screens.group.chat-settings.events
status-im.ui.screens.group.events
status-im.ui.screens.navigation

View File

@ -11,4 +11,4 @@
(defmethod nav/preload-data! :new-public-chat
[db]
(dissoc db :public-group-topic))
(dissoc db :public-group-topic :public-group-topic-error))

View File

@ -219,3 +219,16 @@
:width delete-button-width
:justify-content :center
:align-items :center})
(def action-button-container
{:position :absolute
:bottom 16
:right 16})
(def action-button
{:width 56
:height 56
:background-color colors/blue
:border-radius 28
:align-items :center
:justify-content :center})

View File

@ -4,7 +4,6 @@
[status-im.ui.components.colors :as colors]
[status-im.ui.components.list.views :as list]
[status-im.ui.components.react :as react]
[status-im.ui.components.native-action-button :refer [native-action-button]]
[status-im.ui.components.toolbar.view :as toolbar]
[status-im.ui.components.toolbar.actions :as toolbar.actions]
[status-im.ui.components.connectivity.view :as connectivity]
@ -16,7 +15,8 @@
[status-im.utils.platform :as platform]
[status-im.react-native.resources :as resources]
[status-im.ui.components.common.common :as components.common]
[status-im.i18n :as i18n]))
[status-im.i18n :as i18n]
[status-im.ui.components.icons.vector-icons :as icons]))
(defn- toolbar [show-welcome?]
[toolbar/toolbar nil nil
@ -28,25 +28,25 @@
[(toolbar.actions/add #(re-frame/dispatch [:navigate-to :new]))])]])
(defn- home-action-button []
[native-action-button {:button-color colors/blue
:offset-x styles/native-button-offset
:offset-y styles/native-button-offset
:accessibility-label :plus-button
:on-press #(re-frame/dispatch [:navigate-to :new])}])
[react/view styles/action-button-container
[react/touchable-highlight {:accessibility-label :plus-button
:on-press #(re-frame/dispatch [:navigate-to :new])}
[react/view styles/action-button
[icons/icon :icons/add {:color :white}]]]])
(views/defview home-list-deletable [[home-item-id home-item]]
(views/letsubs [swiped? [:delete-swipe-position home-item-id]]
(let [delete-action (if (:chat-id home-item) :remove-chat :remove-browser)
inner-item-view (if (:chat-id home-item)
inner-item/home-list-chat-item-inner-view
inner-item/home-list-browser-item-inner-view)
offset-x (animation/create-value (if swiped? styles/delete-button-width 0))
(views/letsubs [swiped? [:delete-swipe-position home-item-id]]
(let [delete-action (if (:chat-id home-item) :remove-chat :remove-browser)
inner-item-view (if (:chat-id home-item)
inner-item/home-list-chat-item-inner-view
inner-item/home-list-browser-item-inner-view)
offset-x (animation/create-value (if swiped? styles/delete-button-width 0))
swipe-pan-responder (responder/swipe-pan-responder offset-x styles/delete-button-width home-item-id swiped?)
swipe-pan-handler (responder/pan-handlers swipe-pan-responder)]
swipe-pan-handler (responder/pan-handlers swipe-pan-responder)]
[react/view swipe-pan-handler
[react/animated-view {:style {:flex 1 :right offset-x}}
[inner-item-view home-item]
[react/touchable-highlight {:style styles/delete-icon-highlight
[react/touchable-highlight {:style styles/delete-icon-highlight
:on-press #(do
(re-frame/dispatch [:set-swipe-position home-item-id false])
(re-frame/dispatch [delete-action home-item-id]))}

View File

@ -1,24 +0,0 @@
(ns status-im.ui.screens.network-settings.add-rpc.views
(:require
[re-frame.core :refer [dispatch]]
[status-im.ui.components.status-bar.view :as status-bar]
[status-im.ui.components.toolbar.view :as toolbar]
[status-im.ui.components.text-input.view :as text-input]
[status-im.ui.screens.network-settings.views :as network-settings]
[status-im.ui.components.react :as react]
[status-im.ui.components.sticky-button :as sticky-button]
[status-im.i18n :as i18n]
[clojure.string :as str]))
(defn add-rpc-url []
(let [rpc-url "text"]
[react/view {:flex 1}
[status-bar/status-bar]
[toolbar/simple-toolbar
(i18n/label :t/add-network)]
[network-settings/network-badge]
[react/view {:margin-top 8}
[text-input/text-input-with-label {:label (i18n/label :t/rpc-url)}]]
[react/view {:flex 1}]
(when (not (str/blank? rpc-url))
[sticky-button/sticky-button (i18n/label :t/add-network) #()])]))

View File

@ -1,61 +0,0 @@
(ns status-im.ui.screens.network-settings.network-details.views
(:require-macros [status-im.utils.views :as views])
(:require
[re-frame.core :as rf]
[status-im.ui.components.status-bar.view :as status-bar]
[status-im.ui.components.toolbar.view :as toolbar]
[status-im.ui.screens.network-settings.views :as network-settings]
[status-im.ui.components.react :as react]
[status-im.utils.platform :as platform]
[status-im.i18n :as i18n]
[status-im.ui.screens.network-settings.styles :as st]))
(def options
[{:text (i18n/label :t/add-json-file)
:value #(rf/dispatch [:network-add-json-file])}
{:text (i18n/label :t/paste-json-as-text)
:value #(rf/dispatch [:network-paste-json-as-text])}
{:text (i18n/label :t/:edit-rpc-url)
:value #(rf/dispatch [:network-edit-rpc-url])}
{:text (i18n/label :t/:remove-network)
:value #(rf/dispatch [:network-remove])}])
(views/defview network-details []
(views/letsubs [{:keys [networks/selected-network]} [:get-screen-params]
{:keys [network]} [:get-current-account]]
(let [{:keys [id name config]} selected-network
connected? (= id network)]
[react/view {:flex 1}
[status-bar/status-bar]
[toolbar/simple-toolbar]
[network-settings/network-badge
{:name name
:connected? connected?}]
(when-not connected?
[react/touchable-highlight {:on-press #(rf/dispatch [:connect-network id])}
[react/view st/connect-button-container
[react/view {:style st/connect-button
:accessibility-label :network-connect-button}
[react/text {:style st/connect-button-label
:uppercase? true}
(i18n/label :t/connect)]]
[react/text {:style st/connect-button-description}
(i18n/label :t/connecting-requires-login)]]])
[react/view st/network-config-container
[react/text {:style st/network-config-text
:accessibility-label :network-details-text}
config]]
;; TODO(rasom): uncomment edit-button when it will be functional,
;; https://github.com/status-im/status-react/issues/2104
#_[react/view {:opacity 0.4}
[react/view st/edit-button-container
[react/view st/edit-button
[react/text {:style st/edit-button-label
:uppercase? true}
(i18n/label :t/edit-network-config)]]
#_[context-menu ; TODO should be implemented later
[view st/edit-button
[text {:style st/edit-button-label} (i18n/label :t/edit-network-config)]]
options]
[react/text {:style st/edit-button-description}
(i18n/label :t/edit-network-warning)]]]])))

View File

@ -1,32 +0,0 @@
(ns status-im.ui.screens.network-settings.parse-json.views
(:require
[re-frame.core :refer [dispatch]]
[status-im.ui.components.status-bar.view :refer [status-bar]]
[status-im.ui.components.toolbar.view :as toolbar]
[status-im.ui.screens.network-settings.views :as network-settings]
[status-im.ui.components.react :refer [view text text-input]]
[status-im.ui.components.sticky-button :as sticky-button]
[status-im.ui.screens.network-settings.styles :as st]
[status-im.i18n :as i18n]
[clojure.string :as str]))
(defn paste-json-text []
(let [network-json "test"
error nil]
[view {:flex 1}
[status-bar]
[toolbar/simple-toolbar
(i18n/label :t/add-network)]
[network-settings/network-badge]
[view {:margin-top 16
:margin-left 16
:flex 1}
(when error
[text {:style {:color :red}}
(i18n/label :t/error-processing-json)])
[text-input {:style st/paste-json-text-input
:flex 1
:placeholder (i18n/label :t/paste-json)
:multiline true}]]
(when (not (str/blank? network-json))
[sticky-button/sticky-button (i18n/label :t/process-json) #()])]))

View File

@ -1,7 +1,6 @@
(ns status-im.ui.screens.network-settings.views
(:require-macros [status-im.utils.views :as views])
(:require [re-frame.core :as re-frame]
[status-im.ui.components.action-button.action-button :as action-button]
[status-im.ui.components.action-button.styles :as action-button-styles]
[status-im.ui.components.react :as react]
[status-im.ui.components.icons.vector-icons :as vector-icons]
@ -16,33 +15,11 @@
[react/view (styles/network-icon connected? size)
[vector-icons/icon :icons/network {:color (if connected? :white :gray)}]])
(defn network-badge [& [{:keys [name connected? options]}]]
[react/view styles/network-badge
[network-icon connected? 56]
[react/view {:padding-left 16}
[react/text {:style styles/badge-name-text}
(or name (i18n/label :t/new-network))]
(when connected?
[react/text {:style styles/badge-connected-text}
(i18n/label :t/connected)])]])
(defn actions-view []
[react/view action-button-styles/actions-list
;; TODO(rasom): uncomment add-new-network button when it will be functional,
;; https://github.com/status-im/status-react/issues/2104
#_[react/view {:opacity 0.4}
[action-button/action-button
{:label (i18n/label :t/add-new-network)
:icon :icons/add
:icon-opts {:color :blue}}]]
#_[context-menu ; TODO should be implemented later
[action-button-view (i18n/label :t/add-new-network) :add_blue]
[{:text (i18n/label :t/add-json-file) :value #(dispatch [:navigate-to :paste-json-text])}
{:text (i18n/label :t/paste-json-as-text) :value #(dispatch [:navigate-to :paste-json-text])}
{:text (i18n/label :t/specify-rpc-url) :value #(dispatch [:navigate-to :add-rpc-url])}]]])
[react/view action-button-styles/actions-list])
(defn render-network [current-network]
(fn [{:keys [id name config] :as network}]
(fn [{:keys [id name] :as network}]
(let [connected? (= id current-network)]
[react/touchable-highlight
{:on-press #(re-frame/dispatch [:navigate-to :network-details {:networks/selected-network network}])

View File

@ -1,5 +1,12 @@
(ns status-im.ui.screens.profile.photo-capture.styles)
(def container
{:flex 1
{:flex 1
:background-color :white})
(def button-container
{:align-items :center})
(def button
{:position :absolute
:bottom 10})

View File

@ -2,14 +2,14 @@
(:require [re-frame.core :as re-frame]
[reagent.core :as reagent]
[status-im.ui.components.camera :as camera]
[status-im.ui.components.icons.custom-icons :as custom-icons]
[status-im.ui.components.react :as react]
[status-im.ui.components.status-bar.view :as status-bar]
[status-im.ui.components.toolbar.view :as toolbar]
[status-im.i18n :as i18n]
[status-im.ui.screens.profile.photo-capture.styles :as styles]
[status-im.utils.image-processing :as image-processing]
[taoensso.timbre :as log]))
[taoensso.timbre :as log]
[status-im.ui.components.icons.vector-icons :as icons]))
(defn image-captured [data]
(let [path (.-path data)
@ -35,13 +35,12 @@
:captureTarget (:disk camera/capture-targets)
:type "front"
:ref #(reset! camera-ref %)}]
[react/view {:style {:padding 10}}
[react/touchable-highlight {:style {:align-self "center"}
:on-press (fn []
(let [camera @camera-ref]
(-> (.capture camera)
(.then image-captured)
(.catch #(log/debug "Error capturing image: " %)))))}
[react/view
[custom-icons/ion-icon {:name :md-camera
:style {:font-size 36}}]]]]]))
[react/view styles/button-container
[react/view styles/button
[react/touchable-highlight {:on-press (fn []
(let [camera @camera-ref]
(-> (.capture camera)
(.then image-captured)
(.catch #(log/debug "Error capturing image: " %)))))}
[react/view
[icons/icon :icons/camera {:color :white}]]]]]]))

View File

@ -5,7 +5,6 @@
status-im.ui.screens.accounts.subs
status-im.ui.screens.home.subs
status-im.ui.screens.group.chat-settings.subs
status-im.ui.screens.discover.subs
status-im.ui.screens.contacts.subs
status-im.ui.screens.group.subs
status-im.ui.screens.wallet.subs

View File

@ -38,16 +38,8 @@
[status-im.ui.screens.wallet.transactions.views :as wallet-transactions]
[status-im.ui.screens.wallet.send.transaction-sent.views :refer [transaction-sent transaction-sent-modal]]
[status-im.ui.screens.wallet.components.views :refer [contact-code recent-recipients recipient-qr-code]]
[status-im.ui.screens.discover.search-results.views :as discover-search]
[status-im.ui.screens.discover.recent-statuses.views :as discover-recent]
[status-im.ui.screens.discover.all-dapps.views :as discover-all-dapps]
[status-im.ui.screens.discover.popular-hashtags.views :as discover-popular]
[status-im.ui.screens.discover.dapp-details.views :as discover-dapp-details]
[status-im.ui.screens.network-settings.views :refer [network-settings]]
[status-im.ui.screens.offline-messaging-settings.views :refer [offline-messaging-settings]]
[status-im.ui.screens.network-settings.add-rpc.views :refer [add-rpc-url]]
[status-im.ui.screens.network-settings.network-details.views :refer [network-details]]
[status-im.ui.screens.network-settings.parse-json.views :refer [paste-json-text]]
[status-im.ui.screens.browser.views :refer [browser]]
[status-im.ui.screens.add-new.open-dapp.views :refer [open-dapp dapp-description]]
[status-im.ui.screens.intro.views :refer [intro]]
@ -153,20 +145,12 @@
:chat chat
:profile profile.contact/profile
:group-chat-profile profile.group-chat/group-chat-profile
:discover-all-recent discover-recent/discover-all-recent
:discover-all-popular-hashtags discover-popular/discover-all-popular-hashtags
:discover-search-results discover-search/discover-search-results
:discover-dapp-details discover-dapp-details/dapp-details
:discover-all-dapps discover-all-dapps/main
:profile-photo-capture profile-photo-capture
:accounts accounts
:login login
:recover recover
:network-settings network-settings
:offline-messaging-settings offline-messaging-settings
:paste-json-text paste-json-text
:add-rpc-url add-rpc-url
:network-details network-details
:recent-recipients recent-recipients
:recipient-qr-code recipient-qr-code
:contact-code contact-code