removed unused npm modules, screens, components
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
This commit is contained in:
parent
f7f41d2f37
commit
c1c5854cb1
|
@ -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",
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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 |
|
@ -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__.*/])
|
||||
},
|
||||
}
|
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)))
|
|
@ -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)}))
|
|
@ -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])
|
||||
|
||||
|
|
|
@ -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})))
|
|
@ -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)))
|
|
@ -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)
|
||||
|
|
|
@ -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"}))
|
|
@ -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}])
|
|
@ -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)))
|
|
@ -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 " ")]))])
|
|
@ -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]]]))
|
|
@ -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})
|
||||
|
|
|
@ -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}})
|
|
@ -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)))
|
|
@ -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)
|
||||
|
|
|
@ -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\-]+")))
|
||||
|
|
|
@ -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,26 +8,10 @@
|
|||
: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})
|
||||
|
@ -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})
|
||||
|
|
|
@ -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]
|
||||
(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} "#"]
|
||||
[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\-]*" %)
|
||||
[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}]])
|
||||
: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}
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}]]))))
|
|
@ -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])]))
|
|
@ -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]]]))
|
|
@ -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?))
|
|
@ -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]}))
|
|
@ -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}]))]]]]))
|
|
@ -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}]))]]])]))
|
|
@ -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}]))]]])]))
|
|
@ -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)
|
|
@ -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 {})))))
|
|
@ -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]]]))
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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})
|
||||
|
|
|
@ -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,11 +28,11 @@
|
|||
[(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]]
|
||||
|
|
|
@ -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) #()])]))
|
|
@ -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)]]]])))
|
|
@ -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) #()])]))
|
|
@ -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}])
|
||||
|
|
|
@ -3,3 +3,10 @@
|
|||
(def container
|
||||
{:flex 1
|
||||
:background-color :white})
|
||||
|
||||
(def button-container
|
||||
{:align-items :center})
|
||||
|
||||
(def button
|
||||
{:position :absolute
|
||||
:bottom 10})
|
|
@ -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 []
|
||||
[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
|
||||
[custom-icons/ion-icon {:name :md-camera
|
||||
:style {:font-size 36}}]]]]]))
|
||||
[icons/icon :icons/camera {:color :white}]]]]]]))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue