[8069] feature - [Profile] My profile edit and share screens

Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
This commit is contained in:
bitsikka 2019-08-08 14:01:13 +05:45 committed by Andrey Shovkoplyas
parent 11ed6f481f
commit 39e095e1ed
No known key found for this signature in database
GPG Key ID: EAAB7C8622D860A4
28 changed files with 3949 additions and 1832 deletions

View File

@ -11,6 +11,7 @@
status-im/timbre {:mvn/version "4.10.0-2-status"}
com.taoensso/encore {:mvn/version "2.94.0"}
hickory {:mvn/version "0.7.1"}
cljs-bean {:mvn/version "1.3.0"}
com.cognitect/transit-cljs {:mvn/version "0.8.248"}
status-im/pluto {:mvn/version "iteration-4-9"}
mvxcvi/alphabase {:mvn/version "1.0.0"}

View File

@ -1,10 +1,16 @@
https://repo.clojars.org/binaryage/devtools/0.9.10/devtools-0.9.10
https://repo.clojars.org/binaryage/env-config/0.2.2/env-config-0.2.2
https://repo.clojars.org/cheshire/cheshire/5.4.0/cheshire-5.4.0
https://repo.clojars.org/clj-http/clj-http/1.1.0/clj-http-1.1.0
https://repo.clojars.org/clj-http/clj-http/3.7.0/clj-http-3.7.0
https://repo.clojars.org/clj-stacktrace/clj-stacktrace/0.2.5/clj-stacktrace-0.2.5
https://repo.clojars.org/clj-time/clj-time/0.11.0/clj-time-0.11.0
https://repo.clojars.org/clj-time/clj-time/0.6.0/clj-time-0.6.0
https://repo.clojars.org/clj-time/clj-time/0.9.0/clj-time-0.9.0
https://repo.clojars.org/clj-tuple/clj-tuple/0.1.7/clj-tuple-0.1.7
https://repo.clojars.org/clj-tuple/clj-tuple/0.2.2/clj-tuple-0.2.2
https://repo.clojars.org/cljfmt/cljfmt/0.5.7/cljfmt-0.5.7
https://repo.clojars.org/cljs-bean/cljs-bean/1.3.0/cljs-bean-1.3.0
https://repo.clojars.org/cljsbuild/cljsbuild/1.1.7/cljsbuild-1.1.7
https://repo.clojars.org/cljsjs/create-react-class/15.5.3-0/create-react-class-15.5.3-0
https://repo.clojars.org/cljsjs/create-react-class/15.6.3-0/create-react-class-15.6.3-0
@ -25,6 +31,7 @@ https://repo.clojars.org/cljsjs/react/16.3.2-0/react-16.3.2-0
https://repo.clojars.org/clout/clout/2.1.2/clout-2.1.2
https://repo.clojars.org/com/andrewmcveigh/cljs-time/0.4.0/cljs-time-0.4.0
https://repo.clojars.org/com/andrewmcveigh/cljs-time/0.5.2/cljs-time-0.5.2
https://repo.clojars.org/com/jakemccrary/lein-test-refresh/0.21.1/lein-test-refresh-0.21.1
https://repo.clojars.org/com/taoensso/encore/2.79.1/encore-2.79.1
https://repo.clojars.org/com/taoensso/encore/2.84.2/encore-2.84.2
https://repo.clojars.org/com/taoensso/encore/2.91.0/encore-2.91.0
@ -35,23 +42,36 @@ https://repo.clojars.org/com/taoensso/truss/1.3.5/truss-1.3.5
https://repo.clojars.org/com/taoensso/truss/1.3.6/truss-1.3.6
https://repo.clojars.org/com/taoensso/truss/1.5.0/truss-1.5.0
https://repo.clojars.org/compojure/compojure/1.5.2/compojure-1.5.2
https://repo.clojars.org/crouton/crouton/0.1.2/crouton-0.1.2
https://repo.clojars.org/crypto-equality/crypto-equality/1.0.0/crypto-equality-1.0.0
https://repo.clojars.org/crypto-random/crypto-random/1.2.0/crypto-random-1.2.0
https://repo.clojars.org/day8/re-frame/re-frame-10x/0.3.2/re-frame-10x-0.3.2
https://repo.clojars.org/doric/doric/0.9.0/doric-0.9.0
https://repo.clojars.org/fs/fs/1.1.2/fs-1.1.2
https://repo.clojars.org/gntp/gntp/0.6.0/gntp-0.6.0
https://repo.clojars.org/hiccup/hiccup/1.0.5/hiccup-1.0.5
https://repo.clojars.org/hickory/hickory/0.7.1/hickory-0.7.1
https://repo.clojars.org/http-kit/http-kit/2.2.0/http-kit-2.2.0
https://repo.clojars.org/instaparse/instaparse/1.4.0/instaparse-1.4.0
https://repo.clojars.org/io/aviso/pretty/0.1.30/pretty-0.1.30
https://repo.clojars.org/io/aviso/pretty/0.1.33/pretty-0.1.33
https://repo.clojars.org/jakemcc/clojure-gntp/0.1.1/clojure-gntp-0.1.1
https://repo.clojars.org/lein-ancient/lein-ancient/0.6.14/lein-ancient-0.6.14
https://repo.clojars.org/lein-autoexpect/lein-autoexpect/1.9.0/lein-autoexpect-1.9.0
https://repo.clojars.org/lein-cljfmt/lein-cljfmt/0.5.7/lein-cljfmt-0.5.7
https://repo.clojars.org/lein-cljsbuild/lein-cljsbuild/1.1.7/lein-cljsbuild-1.1.7
https://repo.clojars.org/lein-count/lein-count/1.0.3/lein-count-1.0.3
https://repo.clojars.org/lein-plz/lein-plz/0.4.0-SNAPSHOT/lein-plz-0.4.0-20150409.161059-1
https://repo.clojars.org/lein-pprint/lein-pprint/1.1.2/lein-pprint-1.1.2
https://repo.clojars.org/lein-re-frisk/lein-re-frisk/0.5.8/lein-re-frisk-0.5.8
https://repo.clojars.org/leinjacker/leinjacker/0.4.2/leinjacker-0.4.2
https://repo.clojars.org/medley/medley/0.8.2/medley-0.8.2
https://repo.clojars.org/meta-merge/meta-merge/1.0.0/meta-merge-1.0.0
https://repo.clojars.org/mvxcvi/alphabase/1.0.0/alphabase-1.0.0
https://repo.clojars.org/net/cgrand/macrovich/0.2.0/macrovich-0.2.0
https://repo.clojars.org/org/clojars/jgrocho/digest/1.5.0/digest-1.5.0
https://repo.clojars.org/potemkin/potemkin/0.3.12/potemkin-0.3.12
https://repo.clojars.org/potemkin/potemkin/0.4.3/potemkin-0.4.3
https://repo.clojars.org/quoin/quoin/0.1.2/quoin-0.1.2
https://repo.clojars.org/rasom/cljs-react-navigation/0.1.4/cljs-react-navigation-0.1.4
https://repo.clojars.org/rasom/lein-githooks/0.1.5/lein-githooks-0.1.5
@ -69,6 +89,8 @@ https://repo.clojars.org/rewrite-clj/rewrite-clj/0.5.2/rewrite-clj-0.5.2
https://repo.clojars.org/rewrite-clj/rewrite-clj/0.6.0/rewrite-clj-0.6.0
https://repo.clojars.org/rewrite-cljs/rewrite-cljs/0.4.3/rewrite-cljs-0.4.3
https://repo.clojars.org/rewrite-cljs/rewrite-cljs/0.4.4/rewrite-cljs-0.4.4
https://repo.clojars.org/riddley/riddley/0.1.12/riddley-0.1.12
https://repo.clojars.org/riddley/riddley/0.1.7/riddley-0.1.7
https://repo.clojars.org/ring-cors/ring-cors/0.1.8/ring-cors-0.1.8
https://repo.clojars.org/ring/ring-anti-forgery/1.0.0/ring-anti-forgery-1.0.0
https://repo.clojars.org/ring/ring-codec/1.0.0/ring-codec-1.0.0
@ -80,28 +102,62 @@ https://repo.clojars.org/ring/ring-core/1.5.1/ring-core-1.5.1
https://repo.clojars.org/ring/ring-defaults/0.1.5/ring-defaults-0.1.5
https://repo.clojars.org/ring/ring-headers/0.1.3/ring-headers-0.1.3
https://repo.clojars.org/ring/ring-ssl/0.2.1/ring-ssl-0.2.1
https://repo.clojars.org/slingshot/slingshot/0.12.2/slingshot-0.12.2
https://repo.clojars.org/status-im/pluto/iteration-4-9/pluto-iteration-4-9
https://repo.clojars.org/status-im/re-frame/0.10.5/re-frame-0.10.5
https://repo.clojars.org/status-im/timbre/4.10.0-2-status/timbre-4.10.0-2-status
https://repo.clojars.org/table/table/0.4.0/table-0.4.0
https://repo.clojars.org/tigris/tigris/0.1.1/tigris-0.1.1
https://repo.clojars.org/viebel/codox-klipse-theme/0.0.1/codox-klipse-theme-0.0.1
https://repo.clojars.org/zprint/zprint/0.4.7/zprint-0.4.7
https://repo1.maven.org/maven2/args4j/args4j-site/2.0.26/args4j-site-2.0.26
https://repo1.maven.org/maven2/args4j/args4j-site/2.33/args4j-site-2.33
https://repo1.maven.org/maven2/args4j/args4j/2.0.26/args4j-2.0.26
https://repo1.maven.org/maven2/args4j/args4j/2.33/args4j-2.33
https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-core/1.11.28/aws-java-sdk-core-1.11.28
https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-core/1.9.0/aws-java-sdk-core-1.9.0
https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-kms/1.11.28/aws-java-sdk-kms-1.11.28
https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-pom/1.11.28/aws-java-sdk-pom-1.11.28
https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-pom/1.9.0/aws-java-sdk-pom-1.9.0
https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-s3/1.11.28/aws-java-sdk-s3-1.11.28
https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-s3/1.9.0/aws-java-sdk-s3-1.9.0
https://repo1.maven.org/maven2/com/amazonaws/jmespath-java/1.0/jmespath-java-1.0
https://repo1.maven.org/maven2/com/cognitect/transit-clj/0.8.269/transit-clj-0.8.269
https://repo1.maven.org/maven2/com/cognitect/transit-clj/0.8.290/transit-clj-0.8.290
https://repo1.maven.org/maven2/com/cognitect/transit-clj/0.8.309/transit-clj-0.8.309
https://repo1.maven.org/maven2/com/cognitect/transit-cljs/0.8.239/transit-cljs-0.8.239
https://repo1.maven.org/maven2/com/cognitect/transit-cljs/0.8.243/transit-cljs-0.8.243
https://repo1.maven.org/maven2/com/cognitect/transit-cljs/0.8.248/transit-cljs-0.8.248
https://repo1.maven.org/maven2/com/cognitect/transit-java/0.8.276/transit-java-0.8.276
https://repo1.maven.org/maven2/com/cognitect/transit-java/0.8.316/transit-java-0.8.316
https://repo1.maven.org/maven2/com/cognitect/transit-java/0.8.332/transit-java-0.8.332
https://repo1.maven.org/maven2/com/cognitect/transit-js/0.8.846/transit-js-0.8.846
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.1.1/jackson-annotations-2.1.1
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.3.0/jackson-annotations-2.3.0
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.6.0/jackson-annotations-2.6.0
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.1.1/jackson-core-2.1.1
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.3.2/jackson-core-2.3.2
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.4.4/jackson-core-2.4.4
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.6.6/jackson-core-2.6.6
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.8.7/jackson-core-2.8.7
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.1.1/jackson-databind-2.1.1
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.3.2/jackson-databind-2.3.2
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.6.6/jackson-databind-2.6.6
https://repo1.maven.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.4.4/jackson-dataformat-cbor-2.4.4
https://repo1.maven.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.6.6/jackson-dataformat-cbor-2.6.6
https://repo1.maven.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-smile/2.4.4/jackson-dataformat-smile-2.4.4
https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-json-org/2.3.2/jackson-datatype-json-org-2.3.2
https://repo1.maven.org/maven2/com/fasterxml/jackson/jackson-parent/2.4/jackson-parent-2.4
https://repo1.maven.org/maven2/com/fasterxml/jackson/jackson-parent/2.6.1/jackson-parent-2.6.1
https://repo1.maven.org/maven2/com/fasterxml/jackson/jackson-parent/2.6.2/jackson-parent-2.6.2
https://repo1.maven.org/maven2/com/fasterxml/jackson/jackson-parent/2.8/jackson-parent-2.8
https://repo1.maven.org/maven2/com/fasterxml/oss-parent/11/oss-parent-11
https://repo1.maven.org/maven2/com/fasterxml/oss-parent/12/oss-parent-12
https://repo1.maven.org/maven2/com/fasterxml/oss-parent/16/oss-parent-16
https://repo1.maven.org/maven2/com/fasterxml/oss-parent/23/oss-parent-23
https://repo1.maven.org/maven2/com/fasterxml/oss-parent/24/oss-parent-24
https://repo1.maven.org/maven2/com/fasterxml/oss-parent/27/oss-parent-27
https://repo1.maven.org/maven2/com/fasterxml/oss-parent/4/oss-parent-4
https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9
https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.1/jsr305-3.0.1
https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2
@ -176,19 +232,25 @@ https://repo1.maven.org/maven2/com/googlecode/json-simple/json-simple/1.1.1/json
https://repo1.maven.org/maven2/com/yahoo/platform/yui/yuicompressor/2.4.8/yuicompressor-2.4.8
https://repo1.maven.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10
https://repo1.maven.org/maven2/commons-codec/commons-codec/1.6/commons-codec-1.6
https://repo1.maven.org/maven2/commons-codec/commons-codec/1.8/commons-codec-1.8
https://repo1.maven.org/maven2/commons-codec/commons-codec/1.9/commons-codec-1.9
https://repo1.maven.org/maven2/commons-fileupload/commons-fileupload/1.3.1/commons-fileupload-1.3.1
https://repo1.maven.org/maven2/commons-fileupload/commons-fileupload/1.3/commons-fileupload-1.3
https://repo1.maven.org/maven2/commons-io/commons-io/2.2/commons-io-2.2
https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4
https://repo1.maven.org/maven2/commons-io/commons-io/2.5/commons-io-2.5
https://repo1.maven.org/maven2/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1
https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2
https://repo1.maven.org/maven2/javax/servlet/servlet-api/2.5/servlet-api-2.5
https://repo1.maven.org/maven2/joda-time/joda-time/2.2/joda-time-2.2
https://repo1.maven.org/maven2/joda-time/joda-time/2.6/joda-time-2.6
https://repo1.maven.org/maven2/joda-time/joda-time/2.8.2/joda-time-2.8.2
https://repo1.maven.org/maven2/junit/junit/4.10/junit-4.10
https://repo1.maven.org/maven2/org/apache/apache/11/apache-11
https://repo1.maven.org/maven2/org/apache/apache/13/apache-13
https://repo1.maven.org/maven2/org/apache/apache/15/apache-15
https://repo1.maven.org/maven2/org/apache/apache/16/apache-16
https://repo1.maven.org/maven2/org/apache/apache/4/apache-4
https://repo1.maven.org/maven2/org/apache/apache/9/apache-9
https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.3/commons-compress-1.3
https://repo1.maven.org/maven2/org/apache/commons/commons-parent/22/commons-parent-22
@ -196,8 +258,39 @@ https://repo1.maven.org/maven2/org/apache/commons/commons-parent/24/commons-pare
https://repo1.maven.org/maven2/org/apache/commons/commons-parent/25/commons-parent-25
https://repo1.maven.org/maven2/org/apache/commons/commons-parent/28/commons-parent-28
https://repo1.maven.org/maven2/org/apache/commons/commons-parent/32/commons-parent-32
https://repo1.maven.org/maven2/org/apache/commons/commons-parent/34/commons-parent-34
https://repo1.maven.org/maven2/org/apache/commons/commons-parent/35/commons-parent-35
https://repo1.maven.org/maven2/org/apache/commons/commons-parent/39/commons-parent-39
https://repo1.maven.org/maven2/org/apache/commons/commons-parent/5/commons-parent-5
https://repo1.maven.org/maven2/org/apache/directory/project/project/31/project-31
https://repo1.maven.org/maven2/org/apache/directory/studio/org.apache.commons.codec/1.8/org.apache.commons.codec-1.8
https://repo1.maven.org/maven2/org/apache/directory/studio/parent-libraries/2.0.0.v20130628/parent-libraries-2.0.0.v20130628
https://repo1.maven.org/maven2/org/apache/directory/studio/parent/2.0.0.v20130628/parent-2.0.0.v20130628
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpasyncclient/4.1.3/httpasyncclient-4.1.3
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.2/httpclient-4.2
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.4/httpclient-4.4
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.2/httpclient-4.5.2
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.3/httpclient-4.5.3
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-asyncclient/4.1.3/httpcomponents-asyncclient-4.1.3
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-client/4.2/httpcomponents-client-4.2
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-client/4.4/httpcomponents-client-4.4
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-client/4.5.2/httpcomponents-client-4.5.2
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-client/4.5.3/httpcomponents-client-4.5.3
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-core/4.2/httpcomponents-core-4.2
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-core/4.4.1/httpcomponents-core-4.4.1
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-core/4.4.4/httpcomponents-core-4.4.4
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-core/4.4.6/httpcomponents-core-4.4.6
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-core/4.4/httpcomponents-core-4.4
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore-nio/4.4.6/httpcore-nio-4.4.6
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.2/httpcore-4.2
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.1/httpcore-4.4.1
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.4/httpcore-4.4.4
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4/httpcore-4.4
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpmime/4.4/httpmime-4.4
https://repo1.maven.org/maven2/org/apache/httpcomponents/httpmime/4.5.3/httpmime-4.5.3
https://repo1.maven.org/maven2/org/apache/httpcomponents/project/5/project-5
https://repo1.maven.org/maven2/org/apache/httpcomponents/project/6/project-6
https://repo1.maven.org/maven2/org/apache/httpcomponents/project/7/project-7
https://repo1.maven.org/maven2/org/checkerframework/checker-qual/2.0.0/checker-qual-2.0.0
https://repo1.maven.org/maven2/org/clojure/clojure/1.10.0/clojure-1.10.0
https://repo1.maven.org/maven2/org/clojure/clojure/1.2.1/clojure-1.2.1
@ -226,9 +319,11 @@ https://repo1.maven.org/maven2/org/clojure/clojurescript/1.9.946/clojurescript-1
https://repo1.maven.org/maven2/org/clojure/core.async/0.2.395/core.async-0.2.395
https://repo1.maven.org/maven2/org/clojure/core.async/0.4.474/core.async-0.4.474
https://repo1.maven.org/maven2/org/clojure/core.cache/0.6.5/core.cache-0.6.5
https://repo1.maven.org/maven2/org/clojure/core.contracts/0.0.1/core.contracts-0.0.1
https://repo1.maven.org/maven2/org/clojure/core.memoize/0.5.9/core.memoize-0.5.9
https://repo1.maven.org/maven2/org/clojure/core.specs.alpha/0.1.24/core.specs.alpha-0.1.24
https://repo1.maven.org/maven2/org/clojure/core.specs.alpha/0.2.44/core.specs.alpha-0.2.44
https://repo1.maven.org/maven2/org/clojure/core.unify/0.5.3/core.unify-0.5.3
https://repo1.maven.org/maven2/org/clojure/data.json/0.2.6/data.json-0.2.6
https://repo1.maven.org/maven2/org/clojure/data.priority-map/0.0.7/data.priority-map-0.0.7
https://repo1.maven.org/maven2/org/clojure/google-closure-library-third-party/0.0-20140718-946a7d39/google-closure-library-third-party-0.0-20140718-946a7d39
@ -243,6 +338,7 @@ https://repo1.maven.org/maven2/org/clojure/google-closure-library/0.0-20160609-f
https://repo1.maven.org/maven2/org/clojure/google-closure-library/0.0-20170519-fa0499ef/google-closure-library-0.0-20170519-fa0499ef
https://repo1.maven.org/maven2/org/clojure/google-closure-library/0.0-20170809-b9c14c6b/google-closure-library-0.0-20170809-b9c14c6b
https://repo1.maven.org/maven2/org/clojure/google-closure-library/0.0-20190213-2033d5d9/google-closure-library-0.0-20190213-2033d5d9
https://repo1.maven.org/maven2/org/clojure/pom.contrib/0.0.26/pom.contrib-0.0.26
https://repo1.maven.org/maven2/org/clojure/pom.contrib/0.1.2/pom.contrib-0.1.2
https://repo1.maven.org/maven2/org/clojure/pom.contrib/0.2.0/pom.contrib-0.2.0
https://repo1.maven.org/maven2/org/clojure/pom.contrib/0.2.2/pom.contrib-0.2.2
@ -256,6 +352,7 @@ https://repo1.maven.org/maven2/org/clojure/tools.macro/0.1.5/tools.macro-0.1.5
https://repo1.maven.org/maven2/org/clojure/tools.namespace/0.2.11/tools.namespace-0.2.11
https://repo1.maven.org/maven2/org/clojure/tools.reader/0.10.0/tools.reader-0.10.0
https://repo1.maven.org/maven2/org/clojure/tools.reader/0.8.1/tools.reader-0.8.1
https://repo1.maven.org/maven2/org/clojure/tools.reader/0.8.16/tools.reader-0.8.16
https://repo1.maven.org/maven2/org/clojure/tools.reader/0.9.1/tools.reader-0.9.1
https://repo1.maven.org/maven2/org/clojure/tools.reader/1.0.0-alpha1/tools.reader-1.0.0-alpha1
https://repo1.maven.org/maven2/org/clojure/tools.reader/1.0.0-alpha3/tools.reader-1.0.0-alpha3
@ -277,10 +374,13 @@ https://repo1.maven.org/maven2/org/codehaus/mojo/mojo-parent/34/mojo-parent-34
https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1
https://repo1.maven.org/maven2/org/hamcrest/hamcrest-parent/1.1/hamcrest-parent-1.1
https://repo1.maven.org/maven2/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA
https://repo1.maven.org/maven2/org/json/json/20090211/json-20090211
https://repo1.maven.org/maven2/org/jsoup/jsoup/1.7.1/jsoup-1.7.1
https://repo1.maven.org/maven2/org/jsoup/jsoup/1.9.2/jsoup-1.9.2
https://repo1.maven.org/maven2/org/kohsuke/pom/14/pom-14
https://repo1.maven.org/maven2/org/kohsuke/pom/6/pom-6
https://repo1.maven.org/maven2/org/mozilla/rhino/1.7R5/rhino-1.7R5
https://repo1.maven.org/maven2/org/msgpack/msgpack/0.6.10/msgpack-0.6.10
https://repo1.maven.org/maven2/org/msgpack/msgpack/0.6.12/msgpack-0.6.12
https://repo1.maven.org/maven2/org/ow2/asm/asm-all/4.2/asm-all-4.2
https://repo1.maven.org/maven2/org/ow2/asm/asm-parent/4.2/asm-parent-4.2

File diff suppressed because it is too large Load Diff

View File

@ -18,6 +18,7 @@
[status-im/timbre "4.10.0-2-status"]
[com.taoensso/encore "2.94.0"]
[hickory "0.7.1"]
[cljs-bean "1.3.0"]
[com.cognitect/transit-cljs "0.8.248"]
[status-im/pluto "iteration-4-9"]
[mvxcvi/alphabase "1.0.0"]

View File

@ -11,7 +11,8 @@
[status-im.ui.screens.navigation :as navigation]
[status-im.utils.fx :as fx]
[status-im.utils.money :as money]
[status-im.signing.core :as signing])
[status-im.signing.core :as signing]
[status-im.ethereum.eip55 :as eip55])
(:refer-clojure :exclude [name]))
(defn fullname [custom-domain? username]
@ -47,7 +48,7 @@
(defn- on-resolve [registry custom-domain? username address public-key s]
(cond
(= (ethereum/normalized-address address) (ethereum/normalized-address s))
(= (eip55/address->checksum address) (eip55/address->checksum s))
(resolver/pubkey registry (fullname custom-domain? username)
#(re-frame/dispatch [:ens/set-state username (if (= % public-key) :connected :owned)]))

View File

@ -9,11 +9,17 @@
(defn utils [] (dependencies/web3-utils))
(def hex-prefix "0x")
(defn address->checksum
"Converts an arbitrary case address to one with correct checksum case."
[address]
(when address
(.toChecksumAddress (utils) address)))
(.toChecksumAddress
(utils)
(if (string/starts-with? address hex-prefix)
address
(str hex-prefix address)))))
(defn valid-address-checksum?
"Checks address checksum validity."

View File

@ -11,4 +11,4 @@
(fx/defn hide-popover
{:events [:hide-popover]}
[{:keys [db]}]
{:db (dissoc db :popover/popover)})
{:db (dissoc db :popover/popover)})

View File

@ -169,5 +169,11 @@
(defn my-profile-icon [{{:keys [photo-path name]} :multiaccount
edit? :edit?}]
(let [color colors/default-chat-color
size 56]
size 64]
[profile-icon-view photo-path name color edit? size {}]))
(defn my-profile-header-icon [{{:keys [photo-path name]} :multiaccount
edit? :edit?}]
(let [color colors/default-chat-color
size 40]
[profile-icon-view photo-path name color edit? size {}]))

View File

@ -0,0 +1,90 @@
(ns status-im.ui.components.copyable-text
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [reagent.core :as reagent]
[status-im.ui.components.react :as react]
[status-im.i18n :as i18n]
[status-im.ui.components.colors :as colors]
[status-im.ui.components.animation :as animation]
[status-im.ui.components.typography :as typography]))
(defn hide-cue-atom [anim-opacity anim-y cue-atom]
(animation/start
(animation/parallel
[(animation/timing anim-opacity
{:toValue 0
:duration 140
:delay 1000
:easing (.-ease (animation/easing))
:useNativeDriver true})
(animation/timing anim-y
{:toValue 0
:duration 140
:delay 1000
:easing (.-ease (animation/easing))
:useNativeDriver true})])
#(reset! cue-atom false)))
(defn show-cue-atom [anim-opacity anim-y cue-atom y]
(when @cue-atom
(animation/start
(animation/parallel
[(animation/timing anim-opacity
{:toValue 1
:duration 140
:easing (.-ease (animation/easing))
:useNativeDriver true})
(animation/timing anim-y
{:toValue y
:duration 140
:easing (.-ease (animation/easing))
:useNativeDriver true})])
#(hide-cue-atom anim-opacity anim-y cue-atom))))
(defn copy-action-visual-cue [anim-opacity anim-y width cue-atom]
[react/animated-view {:style {:opacity anim-opacity
:transform [{:translateY anim-y}]
:height 34
:max-width @width
:position :absolute
:border-radius 8
:align-self :center
:z-index (if @cue-atom 1 -1)
:align-items :center
:justify-content :center
:shadow-offset {:width 0 :height 4}
:shadow-radius 12
:shadow-opacity 1
:shadow-color "rgba(0, 34, 51, 0.08)"
:background-color colors/white}}
[react/view {:padding-horizontal 16
:padding-vertical 7
:border-radius 8
:background-color colors/white
:shadow-offset {:width 0 :height 2}
:shadow-radius 4
:shadow-opacity 1
:shadow-color "rgba(0, 34, 51, 0.16)"}
[react/text {:style {:typography :main-medium :line-height 20 :font-size 14}}
(i18n/label :sharing-copied-to-clipboard)]]])
(defview copyable-text-view [{:keys [label copied-text]} content]
(letsubs [cue-atom (reagent/atom false)
width (reagent/atom nil)
anim-y (animation/create-value 0)
anim-opacity (animation/create-value 0)]
[react/view
[copy-action-visual-cue anim-opacity anim-y width cue-atom]
[react/touchable-opacity
{:active-opacity (if @cue-atom 1 0.7)
:style {:margin-top 12 :margin-bottom 4}
:on-press #(when (not @cue-atom)
(reset! cue-atom true)
(show-cue-atom anim-opacity anim-y cue-atom -22)
(react/copy-to-clipboard copied-text))}
[react/view
[react/text {:style {:font-size 13 :line-height 18 :font-weight "500"
:color colors/gray :margin-bottom 4}}
(i18n/label label)]
[react/view
{:on-layout #(reset! width (-> % .-nativeEvent .-layout .-width))}
content]]]]))

View File

@ -0,0 +1,144 @@
(ns status-im.ui.components.large-toolbar
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [reagent.core :as reagent]
[cljs-bean.core :refer [->clj ->js]]
[status-im.ui.components.colors :as colors]
[status-im.ui.components.list.views :as list.views]
[status-im.ui.components.react :as react]
[status-im.ui.components.toolbar.view :as toolbar]
[status-im.ui.components.toolbar.styles :as toolbar.styles]
[status-im.utils.platform :as platform]
[status-im.ui.components.animation :as animation]))
(def hidden (reagent/atom 0))
(def shown (reagent/atom 100))
(def minimized-header-visible? (reagent/atom false))
(def initial-on-show-done? (volatile! false))
(defview animated-content-wrapper [header-in-toolbar has-nav? show?]
(letsubs [anim-opacity (animation/create-value 0)
to-hide (reagent/atom false)]
{:component-will-update
(fn [_ [_ _ _ show?]]
(cond
(and (not @to-hide) show?)
(animation/start
(animation/timing
anim-opacity
{:toValue 1
:duration 200
:easing (.-ease (animation/easing))
:useNativeDriver true})
#(reset! to-hide true))
(and @to-hide (not show?))
(animation/start
(animation/timing
anim-opacity
{:toValue 0
:duration 200
:easing (.-ease (animation/easing))
:useNativeDriver true})
#(reset! to-hide false))))}
[react/animated-view
{:style (cond-> {:flex 1
:align-self :stretch
:opacity anim-opacity}
(false? has-nav?)
(assoc :margin-left -40 :margin-right 40))}
header-in-toolbar]))
(defn on-viewable-items-changed [threshold interporlation-step]
(fn [info]
(let [changed (->> (->clj info)
:changed
(filter #(= 1 (:index %))))
viewable? (when (seq changed)
(->> changed
first
:isViewable))]
(when (and @initial-on-show-done? (not (nil? viewable?)))
(if (= threshold 0)
(if viewable?
(reset! minimized-header-visible? false)
(reset! minimized-header-visible? true))
(if viewable?
(do (swap! hidden - interporlation-step) (swap! shown + interporlation-step))
(do (swap! hidden + interporlation-step) (swap! shown - interporlation-step))))))))
(defonce viewability-config-callback-pairs
(let [interporlation-step 20]
(->js
(vec
(for [threshold (range 0 (+ 100 interporlation-step) interporlation-step)]
{:viewabilityConfig {:itemVisiblePercentThreshold threshold}
:onViewableItemsChanged (on-viewable-items-changed threshold interporlation-step)})))))
;; header-in-toolbar - component - small header in toolbar
;; nav-item - component/nil - if nav-item like back button is needed, else nil
;; action-items - status-im.ui.components.toolbar.view/actions
(defn minimized-toolbar [header-in-toolbar nav-item action-items]
(let [has-nav? (boolean nav-item)]
[toolbar/toolbar
{:transparent? true
:style {:z-index 100
:elevation 9}}
nav-item
[animated-content-wrapper header-in-toolbar has-nav? @minimized-header-visible?]
action-items]))
;; header - component that serves as large header without any top/bottom padding
;; top(4px high) and bottom(16px high and with border) padding
;; are assumed to be constant
;; this is wrapped with padding components and merged with content
;; content - vector - of the rest(from header) of the list components
;; wrapped header and content form the data prop of flat-list
;; list-ref - atom - a reference to flat-list for the purpose of invoking its
;; methods
(defview flat-list-with-large-header [header content list-ref]
(letsubs [window-width [:dimensions/window-width]]
{:component-did-mount #(do (reset! hidden 0) (reset! shown 100)
(reset! minimized-header-visible? false)
(vreset! initial-on-show-done? false))}
(let [header-top-padding [react/view {:height 4}]
;; header bottom padding with border-bottom
;; fades out as it approaches toolbar shadow
header-bottom [react/animated-view
{:style {:height 16
:opacity (/ @shown 100)
:border-bottom-width 1
:border-bottom-color colors/gray-lighter}}]
wrapped-data (into [header-top-padding header header-bottom] content)
status-bar-height (get platform/platform-specific :status-bar-default-height)
toolbar-shadow-component-height
(+ 50 toolbar.styles/toolbar-height (if (zero? status-bar-height) 50 status-bar-height))]
[react/view {:flex 1}
;; toolbar shadow
[react/animated-view
{:style
(cond-> {:flex 1
:align-self :stretch
:position :absolute
:height toolbar-shadow-component-height
:width window-width
:top (- toolbar-shadow-component-height)
:shadow-radius 8
:shadow-offset {:width 0 :height 2}
:shadow-opacity 1
:shadow-color "rgba(0, 9, 26, 0.12)"
:elevation (if (>= @hidden 40) (- (/ @hidden 10) 2) 0)
:background-color colors/white}
platform/ios?
(assoc :opacity (if (>= @hidden 40) (/ @hidden 100) 0)))}]
[list.views/flat-list
{:style {:z-index -1}
:data wrapped-data
:initial-num-to-render 3
:ref #(reset! list-ref %)
:render-fn (fn [item idx] item)
:key-fn (fn [item idx] (str idx))
:on-scroll-begin-drag #(when (false? @initial-on-show-done?)
(vreset! initial-on-show-done? true))
:viewabilityConfigCallbackPairs viewability-config-callback-pairs
:keyboard-should-persist-taps :handled}]])))

View File

@ -55,7 +55,6 @@
:show-extension-modal {:type :main}
:wallet {:type :main}
:wallet-stack {:type :main}
:profile-qr-viewer {:type :modal-white}
:recipient-qr-code {:type :transparent}
:wallet-send-assets {:type :wallet}
:wallet-request-assets {:type :wallet}

View File

@ -11,6 +11,7 @@
[react/view {:style (style/photo-container size)}
[react/image {:source (utils.image/source photo-path)
:style (style/photo size)
:resize-mode :cover
:accessibility-label (or accessibility-label :chat-icon)}]
[react/view {:style (style/photo-border size)}]])

View File

@ -13,7 +13,6 @@
{:position :absolute
:width size
:height size
:opacity 0.4
:border-color colors/black-transparent
:border-width 1
:border-radius (radius size)})

View File

@ -114,8 +114,9 @@
{:on-press #(re-frame/dispatch [:intro-wizard/on-key-selected (:id acc)])}
[react/view {:style (styles/list-item selected?)}
[react/image {:source {:uri (identicon/identicon public-key)}
:style styles/multiaccount-image}]
[react/image {:source {:uri (identicon/identicon public-key)}
:resize-mode :cover
:style styles/multiaccount-image}]
[react/view {:style {:margin-horizontal 16 :flex 1 :justify-content :space-between}}
[react/text {:style (assoc styles/wizard-text :text-align :left
:color colors/black

View File

@ -5,7 +5,8 @@
[status-im.ui.components.react :as react]
[re-frame.core :as re-frame]
[status-im.ui.screens.wallet.signing-phrase.views :as signing-phrase]
[status-im.ui.screens.wallet.request.views :as request]))
[status-im.ui.screens.wallet.request.views :as request]
[status-im.ui.screens.profile.user.views :as profile.user]))
(defn hide-panel-anim
[bottom-anim-value alpha-value window-height]
@ -34,60 +35,73 @@
current-popover (reagent/atom nil)
update? (reagent/atom nil)]
(reagent/create-class
{:component-will-update (fn [_ [_ popover _]]
(when @clear-timeout (js/clearTimeout @clear-timeout))
(cond
@update?
(do (reset! update? false)
(show-panel-anim bottom-anim-value alpha-value))
{:component-will-update
(fn [_ [_ popover _]]
(when @clear-timeout (js/clearTimeout @clear-timeout))
(cond
@update?
(do (reset! update? false)
(show-panel-anim bottom-anim-value alpha-value))
(and @current-popover popover)
(do (reset! update? true)
(js/setTimeout #(reset! current-popover popover) 600)
(hide-panel-anim bottom-anim-value alpha-value (- window-height)))
(and @current-popover popover)
(do (reset! update? true)
(js/setTimeout #(reset! current-popover popover) 600)
(hide-panel-anim bottom-anim-value alpha-value (- window-height)))
popover
(do (reset! current-popover popover)
(show-panel-anim bottom-anim-value alpha-value))
popover
(do (reset! current-popover popover)
(show-panel-anim bottom-anim-value alpha-value))
:else
(do (reset! clear-timeout (js/setTimeout #(reset! current-popover nil) 500))
(hide-panel-anim bottom-anim-value alpha-value (- window-height)))))
:reagent-render (fn []
(when @current-popover
(let [{:keys [view style]} @current-popover]
[react/view {:position :absolute :top 0 :bottom 0 :left 0 :right 0}
[react/animated-view {:style {:flex 1 :background-color :black :opacity alpha-value}}]
[react/animated-view {:style
{:position :absolute
:height window-height
:left 0
:right 0
:transform [{:translateY bottom-anim-value}]}}
[react/touchable-highlight {:style {:flex 1} :on-press #(re-frame/dispatch [:hide-popover])}
[react/view {:flex 1 :align-items :center :justify-content :center}
[react/view (merge {:background-color :white
:border-radius 16
:margin 32
:shadow-offset {:width 0 :height 2}
:shadow-radius 8
:shadow-opacity 1
:shadow-color "rgba(0, 9, 26, 0.12)"}
style)
(cond
(vector? view)
view
:else
(reset! current-popover nil)))
:reagent-render
(fn []
(when @current-popover
(let [{:keys [view style]} @current-popover]
[react/view {:position :absolute :top 0 :bottom 0 :left 0 :right 0}
[react/animated-view
{:style {:flex 1 :background-color :black :opacity alpha-value}}]
[react/animated-view {:style
{:position :absolute
:height window-height
:left 0
:right 0
:transform [{:translateY bottom-anim-value}]}}
[react/touchable-highlight
{:style {:flex 1 :align-items :center :justify-content :center}
:on-press (fn []
(reset! clear-timeout
(js/setTimeout
#(do (reset! current-popover nil)
(re-frame/dispatch [:hide-popover])) 200))
(hide-panel-anim
bottom-anim-value alpha-value (- window-height)))}
[react/view (merge {:background-color :white
:border-radius 16
:margin 32
:shadow-offset {:width 0 :height 2}
:shadow-radius 8
:shadow-opacity 1
:shadow-color "rgba(0, 9, 26, 0.12)"}
style)
[react/touchable-opacity {:active-opacity 1}
(cond
(vector? view)
view
(= :signing-phrase view)
[signing-phrase/signing-phrase]
(= :signing-phrase view)
[signing-phrase/signing-phrase]
(= :share-account view)
[request/share-address]
(= :share-account view)
[request/share-address]
:else
[view])]]]]])))})))
(= :share-chat-key view)
[profile.user/share-chat-key]
:else
[view])]]]]])))})))
(views/defview popover []
(views/letsubs [popover [:popover/popover]
{window-height :height} [:dimensions/window]]
[popover-view popover window-height]))
[popover-view popover window-height]))

View File

@ -6,8 +6,8 @@
;; profile header elements
(def profile-header-display
{:flex-direction :column
:justify-content :center
{:flex-direction :row
:justify-content :flex-start
:align-items :center})
(def profile-header-edit
@ -15,30 +15,43 @@
:justify-content :center})
(defstyle profile-name-text
{:padding-vertical 8
:text-align :center
:font-weight "700"})
{:typography :header
:line-height 28
:text-align :left})
(defstyle profile-name-text-with-subtitle
{:margin-vertical 5
:typography :header
:line-height 28
:text-align :left})
(defstyle profile-three-words
{:font-size 12
:text-align :center
:color colors/gray})
{:color colors/gray})
(defstyle profile-name-input-text
{:text-align :center
:flex 1
:desktop {:height 20
:width 200}
:ios {:margin-top 1
:height 45
:border-bottom-width 1
:border-bottom-color colors/gray-light}
:android {:border-bottom-width 2
:border-bottom-color colors/blue}})
{:text-align :center
:flex 1
:desktop {:height 20
:width 200}
:ios {:margin-top 1
:height 45
:border-bottom-width 1
:border-bottom-color colors/gray-light}
:android {:border-bottom-width 2
:border-bottom-color colors/blue}})
(def profile-header-name-container
{:flex 1
:justify-content :center})
:justify-content :center
:align-items :flex-start
:margin-left 16})
(def profile-header-name-container-with-subtitle
{:flex 1
:justify-content :flex-start
:align-items :flex-start
:align-self :stretch
:margin-left 16})
;; settings items elements
@ -63,9 +76,9 @@
:align-items :center})
(def settings-item-text-wrapper
{:flex 1
:flex-direction :row
:justify-content :space-between})
{:flex 1
:flex-direction :row
:justify-content :space-between})
(def settings-item-text
{:flex-wrap :nowrap})

View File

@ -11,6 +11,7 @@
[status-im.ui.components.react :as react]
[status-im.utils.gfycat.core :as gfy]
[status-im.ui.components.list-selection :as list-selection]
[status-im.ui.screens.profile.user.sheet.views :as sheets]
[status-im.ui.screens.profile.components.styles :as styles]))
;; profile header elements
@ -27,44 +28,63 @@
:accessibility-label :username-input}
props)]])
(defn- show-profile-icon-actions [options]
(when (seq options)
(list-selection/show {:title (i18n/label :t/image-source-title)
:options options})))
(defn- names [{:keys [name public-key] :as contact}]
(let [generated-name (when public-key (gfy/generate-gfy public-key))]
[react/view styles/profile-header-name-container
[react/text {:style styles/profile-name-text
:number-of-lines 1}
(defn- names [{:keys [usernames name public-key] :as contact}]
(let [generated-name (when public-key (gfy/generate-gfy public-key))
with-subtitle? (seq usernames)]
[react/view (if with-subtitle? styles/profile-header-name-container-with-subtitle
styles/profile-header-name-container)
[react/text {:style (if with-subtitle? styles/profile-name-text-with-subtitle
styles/profile-name-text)}
(multiaccounts/displayed-name contact)]
(when generated-name
(when with-subtitle?
[react/text {:style styles/profile-three-words
:number-of-lines 1}
generated-name])]))
(defn- profile-header-display [{:keys [name public-key] :as contact}]
(let [generated-name (when public-key (gfy/generate-gfy public-key))]
[react/view styles/profile-header-display
(defn- profile-header-display [{:keys [name public-key] :as contact}
allow-icon-change? include-remove-action?]
[react/view (merge styles/profile-header-display {:padding-horizontal 16})
(if allow-icon-change?
[react/view {:align-items :center
:align-self :stretch
:justify-content :center}
[react/touchable-highlight
{:accessibility-label :edit-profile-photo-button
:on-press
#(re-frame/dispatch
[:bottom-sheet/show-sheet
{:content (sheets/profile-icon-actions include-remove-action?)
:content-height (if include-remove-action? 192 128)}])}
[react/view
[react/view {:background-color colors/white
:border-radius 15
:width 30
:height 30
:justify-content :center
:align-items :center
:position :absolute
:z-index 1
:top -5
:right -5}
[react/view {:background-color colors/blue
:border-radius 12
:width 24
:height 24
:justify-content :center
:align-items :center}
[vector-icons/icon :tiny-edit {:color colors/white
:width 16
:height 16}]]]
[chat-icon.screen/my-profile-icon {:multiaccount contact
:edit? false}]]]]
;; else
[chat-icon.screen/my-profile-icon {:multiaccount contact
:edit? false}]
[names contact]]))
(defn- profile-header-edit [{:keys [name group-chat] :as contact}
icon-options on-change-text-event allow-icon-change?]
[react/view styles/profile-header-edit
[react/touchable-highlight {:on-press #(show-profile-icon-actions icon-options)
:accessibility-label :edit-profile-photo-button}
[react/view styles/modal-menu
[chat-icon.screen/my-profile-icon {:multiaccount contact
:edit? allow-icon-change?}]]]
:edit? false}])
[names contact]])
(defn profile-header
[{:keys [contact edited-contact editing? allow-icon-change? options on-change-text-event]}]
(if editing?
[profile-header-edit (merge edited-contact contact) options on-change-text-event allow-icon-change?]
[profile-header-display contact]))
[{:keys [contact allow-icon-change? include-remove-action?]}]
[profile-header-display contact allow-icon-change? include-remove-action?])
;; settings items elements

View File

@ -7,7 +7,8 @@
[status-im.ui.components.list-selection :as list-selection]
[status-im.utils.handlers :as handlers]
[status-im.utils.identicon :as identicon]
[status-im.utils.universal-links.core :as universal-links]))
[status-im.utils.universal-links.core :as universal-links]
[status-im.utils.fx :as fx]))
(re-frame/reg-fx
:open-image-picker
@ -33,10 +34,12 @@
(handlers/register-handler-fx
:my-profile/remove-current-photo
(fn [{:keys [db] :as cofx}]
{:db (-> db
(assoc-in [:my-profile/profile :photo-path]
(identicon/identicon (multiaccounts.model/current-public-key cofx)))
(assoc :my-profile/editing? true))}))
(fx/merge cofx
{:db (-> db
(assoc-in [:my-profile/profile :photo-path]
(identicon/identicon (multiaccounts.model/current-public-key cofx)))
(assoc :my-profile/editing? true))}
(profile.models/save))))
(handlers/register-handler-fx
:my-profile/start-editing-profile

View File

@ -36,14 +36,6 @@
(assoc-in [:my-profile/profile :valid-name?] (valid-name? name))
(assoc-in [:my-profile/profile :name] name))})
(defn update-picture [this-event base64-image {:keys [db]}]
(if base64-image
{:db (-> db
(assoc-in [:my-profile/profile :photo-path]
(str "data:image/jpeg;base64," base64-image))
(assoc :my-profile/editing? true))}
{:open-image-picker this-event}))
(defn- clean-name [db edit-view]
(let [name (get-in db [edit-view :name])]
(if (valid-name? name)
@ -60,7 +52,7 @@
:my-profile/editing? true
:my-profile/profile profile)}))
(defn save [{:keys [db now] :as cofx}]
(fx/defn save [{:keys [db now] :as cofx}]
(let [{:keys [photo-path]} (:my-profile/profile db)
cleaned-name (clean-name db :my-profile/profile)
cleaned-edit (merge {:name cleaned-name
@ -71,6 +63,16 @@
(clear-profile)
(multiaccounts.update/multiaccount-update cleaned-edit {}))))
(defn update-picture [this-event base64-image {:keys [db] :as cofx}]
(if base64-image
(fx/merge cofx
{:db (-> db
(assoc-in [:my-profile/profile :photo-path]
(str "data:image/jpeg;base64," base64-image))
(assoc :my-profile/editing? true))}
save)
{:open-image-picker this-event}))
(defn start-editing-group-chat-profile [{:keys [db]}]
(let [current-chat-name (get-in db [:chats (:current-chat-id db) :name])]
{:db (-> db

View File

@ -1,14 +1,6 @@
(ns status-im.ui.screens.profile.navigation
(:require [status-im.ui.screens.navigation :as navigation]))
;;TODO(goranjovic) - replace this with an atomic navigation event that calls functions, not dispatch
;; possibly use the generic event, see https://github.com/status-im/status-react/issues/2987
(defmethod navigation/preload-data! :profile-qr-viewer
[db [_ _ {:keys [contact source value]}]]
(update db :qr-modal #(merge % {:contact (or contact (get db :multiaccount))
:source source
:value value})))
(defmethod navigation/unload-data! :my-profile
[db]
(dissoc db :my-profile/editing?))

View File

@ -0,0 +1,49 @@
(ns status-im.ui.screens.profile.user.sheet.views
(:require [re-frame.core :as re-frame]
[status-im.i18n :as i18n]
[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.colors :as colors]
[status-im.ui.components.react :as react]
[status-im.utils.utils :as utils]))
(defn hide-sheet-and-dispatch [event]
(re-frame/dispatch [:bottom-sheet/hide-sheet])
(re-frame/dispatch event))
(defn profile-icon-actions [include-remove-action?]
(fn []
[react/view {:flex 1 :flex-direction :row}
[react/view action-button.styles/actions-list
[action-button/action-button
{:label (i18n/label :t/image-source-gallery)
:accessibility-label :group-info-button
:icon :main-icons/photo
:icon-opts {:color colors/blue}
:on-press #(hide-sheet-and-dispatch [:my-profile/update-picture])}]
[action-button/action-button
{:label (i18n/label :t/image-source-make-photo)
:accessibility-label :delete-and-leave-group-button
:icon :main-icons/camera
:icon-opts {:color colors/blue}
:on-press (fn []
(hide-sheet-and-dispatch
[:request-permissions
{:permissions [:camera :write-external-storage]
:on-allowed #(re-frame/dispatch
[:navigate-to :profile-photo-capture])
:on-denied
(fn []
(utils/set-timeout
#(utils/show-popup (i18n/label :t/error)
(i18n/label :t/camera-access-error))
50))}]))}]
(when include-remove-action?
[action-button/action-button
{:label (i18n/label :t/image-remove-current)
:label-style {:color colors/red}
:accessibility-label :group-info-button
:icon :main-icons/delete
:icon-opts {:color colors/red}
:cyrcle-color colors/red-light
:on-press #(hide-sheet-and-dispatch [:my-profile/remove-current-photo])}])]]))

View File

@ -20,8 +20,7 @@
:flex-direction :column})
(def share-link-button
{:margin-top 12
:margin-bottom 16})
{:margin-vertical 20})
(defstyle my-profile-info-container {})

View File

@ -1,4 +1,5 @@
(ns status-im.ui.screens.profile.user.views
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[reagent.core :as reagent]
@ -7,102 +8,64 @@
[status-im.ui.components.button.view :as button]
[status-im.ui.components.colors :as colors]
[status-im.ui.components.common.common :as components.common]
[status-im.ui.components.copyable-text :as copyable-text]
[status-im.ui.components.icons.vector-icons :as icons]
[status-im.ui.components.large-toolbar :as large-toolbar]
[status-im.ui.components.list-selection :as list-selection]
[status-im.ui.components.list.views :as list.views]
[status-im.ui.components.qr-code-viewer.views :as qr-code-viewer]
[status-im.ui.components.react :as react]
[status-im.ui.components.status-bar.view :as status-bar]
[status-im.ui.components.toolbar.actions :as toolbar.actions]
[status-im.ui.components.toolbar.view :as toolbar]
[status-im.ui.screens.profile.components.styles
:as
profile.components.styles]
[status-im.ui.screens.chat.photos :as photos]
[status-im.ui.screens.profile.components.views :as profile.components]
[status-im.ui.screens.profile.user.styles :as styles]
[status-im.utils.config :as config]
[status-im.utils.identicon :as identicon]
[status-im.utils.platform :as platform]
[status-im.utils.universal-links.core :as universal-links]
[status-im.biometric-auth.core :as biometric-auth]
[status-im.utils.utils :as utils])
(:require-macros [status-im.utils.views :refer [defview letsubs]]))
[status-im.ethereum.stateofus :as stateofus]))
(defn my-profile-toolbar []
[toolbar/toolbar
{}
nil
nil
[toolbar/text-action
{:handler #(re-frame/dispatch [:my-profile/start-editing-profile])
:accessibility-label :edit-button}
(i18n/label :t/edit)]])
(defn my-profile-edit-toolbar [on-show]
(reagent/create-class
{:component-did-mount on-show
:reagent-render (fn []
[toolbar/toolbar
{}
nil
nil
[toolbar/text-action
{:handler #(re-frame/dispatch [:my-profile/save-profile])
:accessibility-label :done-button}
(i18n/label :t/done)]])}))
(def profile-icon-options
[{:label (i18n/label :t/image-source-gallery)
:action #(re-frame/dispatch [:my-profile/update-picture])}
{:label (i18n/label :t/image-source-make-photo)
:action (fn []
(re-frame/dispatch [:request-permissions {:permissions [:camera :write-external-storage]
:on-allowed #(re-frame/dispatch [:navigate-to :profile-photo-capture])
:on-denied (fn []
(utils/set-timeout
#(utils/show-popup (i18n/label :t/error)
(i18n/label :t/camera-access-error))
50))}]))}])
(defn- profile-icon-options-ext []
(conj profile-icon-options {:label (i18n/label :t/image-remove-current)
:action #(re-frame/dispatch [:my-profile/remove-current-photo])}))
(defn qr-viewer-toolbar [label value]
[toolbar/toolbar nil
(toolbar/nav-button
(toolbar.actions/close toolbar.actions/default-handler))
[toolbar/content-title label]])
(defn qr-code-share-button [value]
(let [link (universal-links/generate-link :user :external value)]
[button/button-with-icon
{:on-press #(list-selection/open-share {:message link})
:label (i18n/label :t/share-link)
:icon :main-icons/share
:accessibility-label :share-my-contact-code-button
:style styles/share-link-button}]))
(defview qr-viewer []
(letsubs [{:keys [value contact]} [:qr-modal]
ttt-enabled? [:tribute-to-talk/enabled?]]
[react/view styles/qr-code-viewer
[status-bar/status-bar {:type :modal-white}]
[qr-viewer-toolbar (multiaccounts/displayed-name contact) value]
[qr-code-viewer/qr-code-viewer
(merge
{:style styles/qr-code
:value value
:hint (i18n/label :t/qr-code-public-key-hint)
:legend (str value)
:show-tribute-to-talk-warning? ttt-enabled?}
(when-not platform/desktop?
{:footer-button qr-code-share-button}))]]))
(defn- show-qr [contact source value]
#(re-frame/dispatch [:navigate-to :profile-qr-viewer {:contact contact
:source source
:value value}]))
(defview share-chat-key []
(letsubs [{:keys [address]} [:popover/popover]
window-width [:dimensions/window-width]
{:keys [names preferred-name]} [:ens.main/screen]]
(let [username (stateofus/username preferred-name)
qr-width (- window-width 128)
name (or username preferred-name)
link (universal-links/generate-link :user :external address)]
[react/view
[react/view {:style {:padding-top 16 :padding-left 16 :padding-right 16}}
[qr-code-viewer/qr-code-view qr-width address]
(when (seq names)
[react/view
[copyable-text/copyable-text-view
{:label :t/ens-usernames
:copied-text preferred-name}
[react/nested-text
{:style {:line-height 22 :font-size 15
:font-family "monospace"}
:accessibility-label :ens-username}
name
(when username [{:style {:color colors/gray}} (str "." stateofus/domain)])]]
[react/view {:height 1 :margin-top 12 :margin-horizontal -16
:background-color colors/gray-lighter}]])
[copyable-text/copyable-text-view
{:label :t/chat-key
:copied-text address}
[react/text {:number-of-lines 1
:ellipsize-mode :middle
:accessibility-label :chat-key
:style {:line-height 22 :font-size 15
:font-family "monospace"}}
address]]
[react/view styles/share-link-button
[button/button-with-icon
{:on-press #(list-selection/open-share {:message link})
:label (i18n/label :t/share-link)
:icon :main-icons/link
:style {:height 44 :margin-horizontal 0}
:accessibility-label :share-my-contact-code-button}]]]])))
(defn- my-profile-settings [{:keys [seed-backed-up? mnemonic]}
{:keys [settings]}
@ -272,17 +235,6 @@
(when advanced?
[advanced-settings params on-show supported-biometric-auth])]))
(defn share-profile-item
[{:keys [public-key photo-path] :as current-multiaccount}]
[list.views/big-list-item
{:text (i18n/label :t/share-my-profile)
:icon :main-icons/share
:accessibility-label :share-my-profile-button
:action-fn #(re-frame/dispatch [:navigate-to :profile-qr-viewer
{:contact current-multiaccount
:source :public-key
:value public-key}])}])
(defn contacts-list-item [active-contacts-count]
[list.views/big-list-item
{:text (i18n/label :t/contacts)
@ -325,52 +277,64 @@
[react/scroll-view
[view]]]))
(defn- header [{:keys [public-key photo-path] :as account}]
[profile.components/profile-header
{:contact account
:allow-icon-change? true
:include-remove-action? (not= (identicon/identicon public-key) photo-path)}])
(defn- header-in-toolbar [{:keys [photo-path] :as account}]
(let [displayed-name (multiaccounts/displayed-name account)]
[react/view {:flex 1
:flex-direction :row
:align-items :center
:align-self :stretch}
[photos/photo photo-path {:size 40}]
[react/text {:style {:typography :title-bold
:line-height 21
:margin-right 40
:margin-left 16
:text-align :left}}
displayed-name]]))
(defn- toolbar-action-items [public-key]
[toolbar/actions
[{:icon :main-icons/share
:icon-opts {:width 24
:height 24}
:handler #(re-frame/dispatch [:show-popover {:view :share-chat-key :address public-key}])}]])
(defview my-profile []
(letsubs [{:keys [public-key photo-path preferred-name] :as current-multiaccount} [:multiaccount]
editing? [:my-profile/editing?]
extensions [:extensions/profile]
changed-multiaccount [:my-profile/profile]
currency [:wallet/currency]
login-data [:multiaccounts/login]
scroll (reagent/atom nil)
active-contacts-count [:contacts/active-count]
tribute-to-talk [:tribute-to-talk/profile]
stateofus-registrar [:ens.stateofus/registrar]]
(let [shown-multiaccount (merge current-multiaccount changed-multiaccount)
(letsubs [list-ref (reagent/atom nil)
{:keys [public-key photo-path preferred-name]
:as current-multiaccount} [:multiaccount]
extensions [:extensions/profile]
changed-multiaccount [:my-profile/profile]
currency [:wallet/currency]
login-data [:multiaccounts/login]
active-contacts-count [:contacts/active-count]
tribute-to-talk [:tribute-to-talk/profile]
stateofus-registrar [:ens.stateofus/registrar]]
(let [shown-multiaccount (merge current-multiaccount changed-multiaccount)
;; We scroll on the component once rendered. setTimeout is necessary,
;; likely to allow the animation to finish.
on-show-edit (fn []
(js/setTimeout
#(.scrollTo @scroll {:x 0 :y 0 :animated false})
300))
on-show-advanced (fn []
(js/setTimeout
#(.scrollToEnd @scroll {:animated false})
300))]
[react/keyboard-avoiding-view {:style {:flex 1}}
on-show-advanced
(fn [] (js/setTimeout #(.scrollToEnd @list-ref {:animated false}) 300))
;; toolbar-contents
header-in-toolbar (header-in-toolbar shown-multiaccount)
toolbar-action-items (toolbar-action-items public-key)
;; flatlist contents
header (header shown-multiaccount)
content
[[ens-item preferred-name {:registrar stateofus-registrar}]
[contacts-list-item active-contacts-count]
(when tribute-to-talk [tribute-to-talk-item tribute-to-talk])
[my-profile-settings current-multiaccount shown-multiaccount
currency (nil? login-data) extensions]
(when (nil? login-data) [advanced shown-multiaccount on-show-advanced])]]
[(react/safe-area-view) {:style {:flex 1}}
[status-bar/status-bar {:type :main}]
[react/view profile.components.styles/profile
(if editing?
[my-profile-edit-toolbar on-show-edit]
[my-profile-toolbar])
[react/scroll-view {:ref #(reset! scroll %)
:keyboard-should-persist-taps :handled}
[react/view profile.components.styles/profile-form
[profile.components/profile-header
{:contact current-multiaccount
:edited-contact changed-multiaccount
:editing? editing?
:allow-icon-change? true
:options (if (not= (identicon/identicon public-key)
photo-path)
(profile-icon-options-ext)
profile-icon-options)
:on-change-text-event :my-profile/update-name}]]
[share-profile-item (dissoc current-multiaccount :mnemonic)]
[ens-item preferred-name {:registrar stateofus-registrar}]
[contacts-list-item active-contacts-count]
(when tribute-to-talk
[tribute-to-talk-item tribute-to-talk])
[my-profile-settings current-multiaccount shown-multiaccount currency (nil? login-data) extensions]
(when (nil? login-data)
[advanced shown-multiaccount on-show-advanced])]]])))
[large-toolbar/minimized-toolbar header-in-toolbar nil toolbar-action-items]
[large-toolbar/flat-list-with-large-header header content list-ref]])))

View File

@ -9,6 +9,5 @@
:hardwallet-connect-modal
:selection-modal-screen
:wallet-transactions-filter
:profile-qr-viewer
:welcome
:keycard-welcome])
:keycard-welcome])

View File

@ -123,7 +123,6 @@
:new add-new/add-new
:new-chat new-chat/new-chat
:qr-scanner qr-scanner/qr-scanner
:profile-qr-viewer [:modal profile.user/qr-viewer]
:take-picture extensions.module/take-picture-view
:extension-screen-holder extensions.module/screen-holder-view
:new-group group/new-group

View File

@ -156,4 +156,4 @@
:loadNavigationState (when js/goog.DEBUG load-state)}]
[signing/signing]
[bottom-sheet]
[popover/popover]]))})))
[popover/popover]]))})))

View File

@ -1,7 +1,7 @@
(ns status-im.utils.identicon
(:require [status-im.js-dependencies :as dependencies]))
(def default-size 40)
(def default-size 150)
(defn identicon
([hash] (identicon hash (clj->js {:background [255 255 255 255]

View File

@ -7,6 +7,7 @@
"other": "{{count}} members"
},
"chat-name": "Chat name",
"chat-key": "Chat key",
"public-group-topic": "Topic",
"debug-enabled": "Debug server has been launched! You can now execute *status-dev-cli scan* to find the server from your computer on the same network.",
"chat-settings": "Chat settings",
@ -1146,6 +1147,7 @@
"ens-terms-point-8": "These terms are guaranteed by the smart contract logic at addresses:",
"ens-terms-point-9": "{{address}} (Status UsernameRegistrar) ",
"ens-terms-point-10": "0x314159265dd8dbb310642f98f50c066173c1259b (ENS Registry).",
"ens-username": "ENS username",
"ens-usernames": "ENS usernames",
"ens-your-username": "Your username",
"ens-your-your-name": "Your ENS name",