Compare commits
19
Commits
15378
...
release/1.22.x
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cb15e503d5 | ||
|
|
35ff3a4eca | ||
|
|
0168ab6baf | ||
|
|
5ca5c5f2bb | ||
|
|
5e9ceec65f | ||
|
|
05d616e417 | ||
|
|
3e756ce897 | ||
|
|
7c362cd246 | ||
|
|
12552c9491 | ||
|
|
9cdbf41d74 | ||
|
|
8b05a551d9 | ||
|
|
6417d90e1c | ||
|
|
21d409ce36 | ||
|
|
d458bca193 | ||
|
|
4f2f8dea4c | ||
|
|
f744d761c0 | ||
|
|
7ad5e2181d | ||
|
|
a10425e318 | ||
|
|
9c0ab739ea |
@@ -417,7 +417,9 @@
|
||||
TestTargetID = 13B07F861A680F5B00A75B9A;
|
||||
};
|
||||
13B07F861A680F5B00A75B9A = {
|
||||
DevelopmentTeam = 8B5X2M6H2Y;
|
||||
LastSwiftMigration = 1140;
|
||||
ProvisioningStyle = Manual;
|
||||
SystemCapabilities = {
|
||||
com.apple.BackgroundModes = {
|
||||
enabled = 1;
|
||||
@@ -841,8 +843,9 @@
|
||||
BUNDLE_ID_SUFFIX = .debug;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = StatusIm/StatusIm.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CODE_SIGN_IDENTITY = "iPhone Distribution";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CUSTOM_PRODUCT_NAME = "Status Debug";
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = 8B5X2M6H2Y;
|
||||
@@ -895,7 +898,8 @@
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum;
|
||||
PRODUCT_NAME = StatusIm;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
PROVISIONING_PROFILE = "9da75626-9594-43d9-a827-0f6d43c28f54";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "match Development im.status.ethereum";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "StatusIm-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
@@ -913,8 +917,9 @@
|
||||
BUNDLE_ID_SUFFIX = "";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = StatusIm/StatusIm.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CUSTOM_PRODUCT_NAME = Status;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = 8B5X2M6H2Y;
|
||||
@@ -959,7 +964,8 @@
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum;
|
||||
PRODUCT_NAME = StatusIm;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
PROVISIONING_PROFILE = "e2202b12-7a66-4ff7-af3c-a52e35f32dc1";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "match AdHoc im.status.ethereum";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "StatusIm-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
|
||||
+8
-4
@@ -149,11 +149,15 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL
|
||||
this.getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("gethEvent", params);
|
||||
}
|
||||
|
||||
private File getLogsFile() {
|
||||
private File getPublicStorageDirectory() {
|
||||
final Context context = this.getReactApplicationContext();
|
||||
// Environment.getExternalStoragePublicDirectory doesn't work as expected on Android Q
|
||||
// https://developer.android.com/reference/android/os/Environment#getExternalStoragePublicDirectory(java.lang.String)
|
||||
final File pubDirectory = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
|
||||
return context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
|
||||
|
||||
}
|
||||
private File getLogsFile() {
|
||||
final File pubDirectory = this.getPublicStorageDirectory();
|
||||
final File logFile = new File(pubDirectory, gethLogFileName);
|
||||
|
||||
return logFile;
|
||||
@@ -1170,8 +1174,8 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL
|
||||
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
public String logFilePath() {
|
||||
return getLogsFile().getAbsolutePath();
|
||||
public String logFileDirectory() {
|
||||
return getPublicStorageDirectory().getAbsolutePath();
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
|
||||
@@ -882,7 +882,7 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(backupDisabledDataDir) {
|
||||
return rootUrl.path;
|
||||
}
|
||||
|
||||
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(logFilePath) {
|
||||
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(logFileDirectory) {
|
||||
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||
NSURL *rootUrl =[[fileManager
|
||||
URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask]
|
||||
|
||||
@@ -16,15 +16,13 @@
|
||||
:height 230
|
||||
:border-radius 20}
|
||||
:on-press on-press}
|
||||
[rn/view
|
||||
{:flex 1}
|
||||
[rn/view {:style style/detail-container}
|
||||
[rn/view (style/community-cover-container 60)
|
||||
[rn/image
|
||||
{:source cover
|
||||
:style
|
||||
{:flex 1
|
||||
:border-top-right-radius 20
|
||||
:border-top-left-radius 20}}]]
|
||||
:style {:flex 1
|
||||
:border-top-right-radius 20
|
||||
:border-top-left-radius 20}}]]
|
||||
[rn/view (style/card-view-content-container 12)
|
||||
[rn/view (style/card-view-chat-icon 48)
|
||||
[icon/community-icon {:images images} 48]]
|
||||
@@ -38,7 +36,7 @@
|
||||
{:title name
|
||||
:description description}]
|
||||
[rn/view {:style (style/card-stats-position)}
|
||||
[community-view/community-stats-column :card-view]]
|
||||
[community-view/community-stats-column
|
||||
{:type :card-view}]]
|
||||
[rn/view {:style (style/community-tags-position)}
|
||||
[community-view/community-tags tags]]]]]]])
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
(merge {:style {:height 56
|
||||
:border-radius 16}}
|
||||
props)
|
||||
[rn/view {:flex 1}
|
||||
[rn/view {:style style/detail-container}
|
||||
[rn/view (style/list-info-container)
|
||||
[community-icon/community-icon
|
||||
{:images community-icon} 32]
|
||||
@@ -64,7 +64,8 @@
|
||||
colors/neutral-40
|
||||
colors/neutral-60))}}
|
||||
name]
|
||||
[community-view/community-stats-column :list-view]]
|
||||
[community-view/community-stats-column
|
||||
{:type :list-view}]]
|
||||
(if (= status :gated)
|
||||
[community-view/permission-tag-container
|
||||
{:locked? locked?
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
[quo2.components.tags.permission-tag :as permission]
|
||||
[quo2.components.tags.tag :as tag]
|
||||
[quo2.foundations.colors :as colors]
|
||||
[quo.gesture-handler :as gesture-handler] ;;TODO move to quo2
|
||||
[react-native.core :as rn]))
|
||||
|
||||
(defn community-stats
|
||||
@@ -23,7 +24,7 @@
|
||||
members-count]])
|
||||
|
||||
(defn community-stats-column
|
||||
[type]
|
||||
[{:keys [type]}]
|
||||
(let [icon-color (colors/theme-colors colors/neutral-50 colors/neutral-40)]
|
||||
[rn/view
|
||||
(if (= type :card-view)
|
||||
@@ -41,7 +42,9 @@
|
||||
|
||||
(defn community-tags
|
||||
[tags]
|
||||
[rn/view (style/community-tags-container)
|
||||
[gesture-handler/scroll-view
|
||||
{:shows-horizontal-scroll-indicator false
|
||||
:horizontal true}
|
||||
(for [{:keys [name emoji]} tags]
|
||||
^{:key name}
|
||||
[rn/view {:margin-right 8}
|
||||
|
||||
@@ -22,6 +22,9 @@
|
||||
colors/white
|
||||
colors/neutral-90)})
|
||||
|
||||
(def detail-container
|
||||
{:flex 1})
|
||||
|
||||
(defn stats-count-container
|
||||
[]
|
||||
{:flex-direction :row
|
||||
@@ -37,10 +40,6 @@
|
||||
{:flex-direction :row
|
||||
:align-items :center})
|
||||
|
||||
(defn community-tags-container
|
||||
[]
|
||||
{:flex-direction :row})
|
||||
|
||||
(defn card-stats-position
|
||||
[]
|
||||
{:position :absolute
|
||||
@@ -62,7 +61,7 @@
|
||||
:bottom 0
|
||||
:left 0
|
||||
:right 0
|
||||
:height 20
|
||||
:border-radius 20
|
||||
:padding-horizontal padding-horizontal
|
||||
:border-top-right-radius 16
|
||||
:border-top-left-radius 16
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
(ns quo2.components.drawers.drawer-buttons.style
|
||||
(:require [quo2.foundations.colors :as colors]))
|
||||
(:require [quo2.foundations.colors :as colors]
|
||||
[react-native.platform :as platform]))
|
||||
|
||||
(def outer-container {:height 216})
|
||||
(def outer-container
|
||||
{:height 216
|
||||
:border-radius 20})
|
||||
|
||||
(def top-card
|
||||
{:flex 1
|
||||
@@ -9,7 +12,9 @@
|
||||
:padding-horizontal 20
|
||||
:border-top-left-radius 20
|
||||
:border-top-right-radius 20
|
||||
:background-color colors/neutral-80})
|
||||
:background-color (if platform/ios?
|
||||
colors/neutral-80-opa-80-blur
|
||||
colors/neutral-80)})
|
||||
|
||||
(def bottom-card
|
||||
{:position :absolute
|
||||
@@ -21,7 +26,7 @@
|
||||
:padding-horizontal 20
|
||||
:border-top-left-radius 20
|
||||
:border-top-right-radius 20
|
||||
:background-color (colors/alpha colors/white 0.05)})
|
||||
:background-color colors/white-opa-5})
|
||||
|
||||
(def bottom-container
|
||||
{:flex-direction :row
|
||||
@@ -35,14 +40,14 @@
|
||||
:width 28
|
||||
:justify-content :center
|
||||
:align-items :center
|
||||
:border-color (colors/alpha colors/white 0.05)})
|
||||
:border-color colors/white-opa-5})
|
||||
|
||||
(def bottom-text
|
||||
{:flex 1
|
||||
:color (colors/alpha colors/white 0.7)})
|
||||
:color colors/white-70-blur})
|
||||
|
||||
(def top-text
|
||||
{:color (colors/alpha colors/white 0.7)})
|
||||
{:color colors/white-70-blur})
|
||||
|
||||
(defn heading-text
|
||||
[gap]
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
[quo2.components.icon :as icon]
|
||||
[quo2.components.markdown.text :as text]
|
||||
[quo2.foundations.colors :as colors]
|
||||
[react-native.blur :as blur]
|
||||
[quo2.components.drawers.drawer-buttons.style :as style]))
|
||||
|
||||
(defn render-bottom
|
||||
@@ -70,7 +71,7 @@
|
||||
child-2 string, keyword or hiccup
|
||||
"
|
||||
[{:keys [container-style top-card bottom-card]} child-1 child-2]
|
||||
[rn/view
|
||||
[blur/ios-view
|
||||
{:style (merge container-style style/outer-container)}
|
||||
[card
|
||||
(merge {:gap 4
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
[quo2.components.inputs.title-input.view :as title-input]
|
||||
[quo2.foundations.colors :as colors]
|
||||
[react-native.core :as rn]
|
||||
[react-native.platform :as platform]
|
||||
[react-native.hole-view :as hole-view]))
|
||||
|
||||
(defn profile-input
|
||||
@@ -18,20 +19,29 @@
|
||||
[rn/view
|
||||
{:style (style/container customization-color)}
|
||||
[rn/view
|
||||
[hole-view/hole-view
|
||||
{:holes [{:x 33
|
||||
:y 23
|
||||
:width 24
|
||||
:height 24
|
||||
:borderRadius 12}]}
|
||||
[user-avatar/user-avatar
|
||||
(assoc image-picker-props
|
||||
:customization-color customization-color
|
||||
:full-name (if (seq full-name)
|
||||
full-name
|
||||
placeholder)
|
||||
:status-indicator? false
|
||||
:size :medium)]]
|
||||
(if platform/ios?
|
||||
[hole-view/hole-view
|
||||
{:holes [{:x 33
|
||||
:y 23
|
||||
:width 24
|
||||
:height 24
|
||||
:borderRadius 12}]}
|
||||
[user-avatar/user-avatar
|
||||
(assoc image-picker-props
|
||||
:customization-color customization-color
|
||||
:full-name (if (seq full-name)
|
||||
full-name
|
||||
placeholder)
|
||||
:status-indicator? false
|
||||
:size :medium)]]
|
||||
[user-avatar/user-avatar
|
||||
(assoc image-picker-props
|
||||
:customization-color customization-color
|
||||
:full-name (if (seq full-name)
|
||||
full-name
|
||||
placeholder)
|
||||
:status-indicator? false
|
||||
:size :medium)])
|
||||
[buttons/button
|
||||
{:accessibility-label :select-profile-picture-button
|
||||
:type :grey
|
||||
@@ -47,6 +57,7 @@
|
||||
[rn/view {:style style/input-container}
|
||||
[title-input/title-input
|
||||
(merge title-input-props
|
||||
{:override-theme :dark
|
||||
{:blur? true
|
||||
:override-theme :dark
|
||||
:placeholder placeholder
|
||||
:customization-color customization-color})]]]))
|
||||
|
||||
@@ -2,34 +2,35 @@
|
||||
(:require [quo2.foundations.colors :as colors]))
|
||||
|
||||
(defn get-focused-placeholder-color
|
||||
[blur?]
|
||||
[blur? override-theme]
|
||||
(if blur?
|
||||
(colors/theme-colors colors/neutral-80-opa-20 (colors/alpha colors/white 0.2))
|
||||
(colors/theme-colors colors/neutral-30 colors/neutral-60)))
|
||||
(colors/theme-colors colors/neutral-80-opa-20 colors/white-opa-20 override-theme)
|
||||
(colors/theme-colors colors/neutral-30 colors/neutral-60 override-theme))
|
||||
)
|
||||
|
||||
(defn get-placeholder-color
|
||||
[blur?]
|
||||
[blur? override-theme]
|
||||
(if blur?
|
||||
(colors/theme-colors colors/neutral-80-opa-40 (colors/alpha colors/white 0.3))
|
||||
(colors/theme-colors colors/neutral-40 colors/neutral-50)))
|
||||
(colors/theme-colors colors/neutral-80-opa-40 colors/white-opa-30 override-theme)
|
||||
(colors/theme-colors colors/neutral-40 colors/neutral-50 override-theme)))
|
||||
|
||||
(defn- get-disabled-color
|
||||
[blur?]
|
||||
[blur? override-theme]
|
||||
(if blur?
|
||||
(colors/theme-colors colors/neutral-80-opa-40 (colors/alpha colors/white 0.3))
|
||||
(colors/theme-colors colors/neutral-40 colors/neutral-50)))
|
||||
(colors/theme-colors colors/neutral-80-opa-40 colors/white-opa-30)
|
||||
(colors/theme-colors colors/neutral-40 colors/neutral-50 override-theme)))
|
||||
|
||||
(defn- get-char-count-color
|
||||
[blur?]
|
||||
[blur? override-theme]
|
||||
(if blur?
|
||||
(colors/theme-colors colors/neutral-80-opa-40 (colors/alpha colors/white 0.4))
|
||||
(colors/theme-colors colors/neutral-40 colors/neutral-50)))
|
||||
(colors/theme-colors colors/neutral-80-opa-40 colors/white-opa-40)
|
||||
(colors/theme-colors colors/neutral-40 colors/neutral-50 override-theme)))
|
||||
|
||||
(defn get-selection-color
|
||||
[customization-color blur?]
|
||||
[customization-color blur? override-theme]
|
||||
(if blur?
|
||||
(colors/theme-colors colors/neutral-100 colors/white)
|
||||
(colors/custom-color customization-color (if colors/dark? 60 50))))
|
||||
(colors/theme-colors colors/neutral-100 colors/white override-theme)
|
||||
(colors/custom-color customization-color (if (or (= :dark override-theme) colors/dark?) 60 50))))
|
||||
|
||||
(def text-input-container {:flex 1})
|
||||
|
||||
@@ -37,12 +38,12 @@
|
||||
[disabled? blur? override-theme]
|
||||
{:text-align-vertical :bottom
|
||||
:color (if disabled?
|
||||
(get-disabled-color blur?)
|
||||
(get-disabled-color blur? override-theme)
|
||||
(colors/theme-colors colors/neutral-100 colors/white override-theme))})
|
||||
|
||||
(defn char-count
|
||||
[blur?]
|
||||
{:color (get-char-count-color blur?)})
|
||||
[blur? override-theme]
|
||||
{:color (get-char-count-color blur? override-theme)})
|
||||
|
||||
(def container
|
||||
{:flex-direction :row
|
||||
|
||||
@@ -45,21 +45,21 @@
|
||||
:editable (not disabled?)
|
||||
:max-length max-length
|
||||
:placeholder placeholder
|
||||
:selection-color (style/get-selection-color customization-color blur?)
|
||||
:selection-color (style/get-selection-color customization-color blur? override-theme)
|
||||
:placeholder-text-color (if @focused?
|
||||
(style/get-focused-placeholder-color blur?)
|
||||
(style/get-placeholder-color blur?))}]]
|
||||
(style/get-focused-placeholder-color blur? override-theme)
|
||||
(style/get-placeholder-color blur? override-theme))}]]
|
||||
[rn/view
|
||||
{:style style/counter-container}
|
||||
[text/text
|
||||
[text/text
|
||||
{:style (style/char-count blur?)
|
||||
{:style (style/char-count blur? override-theme)
|
||||
:size :paragraph-2}
|
||||
(pad-0
|
||||
(str
|
||||
(count @value)))]
|
||||
[text/text
|
||||
{:style (style/char-count blur?)
|
||||
{:style (style/char-count blur? override-theme)
|
||||
:size :paragraph-2}
|
||||
(str "/"
|
||||
(pad-0
|
||||
|
||||
@@ -203,8 +203,8 @@
|
||||
}
|
||||
}
|
||||
"
|
||||
[{:keys [one-icon-align-left? horizontal-description? align-mid?
|
||||
page-nav-color page-nav-background-uri
|
||||
[{:keys [container-style one-icon-align-left? horizontal-description?
|
||||
align-mid? page-nav-color page-nav-background-uri
|
||||
mid-section
|
||||
left-section
|
||||
right-section-buttons]}]
|
||||
@@ -222,13 +222,14 @@
|
||||
:left-icon (:left-icon mid-section)
|
||||
:avatar (:avatar mid-section)}]
|
||||
[rn/view
|
||||
{:style (cond-> {:display :flex
|
||||
:flex-direction :row
|
||||
;; iPhone 11 Pro's height in Figma divided by Component height 56/1125
|
||||
:align-items :center
|
||||
:padding-horizontal 20
|
||||
:height 56
|
||||
:justify-content :space-between}
|
||||
{:style (cond-> (merge {:display :flex
|
||||
:flex-direction :row
|
||||
;; iPhone 11 Pro's height in Figma divided by Component height 56/1125
|
||||
:align-items :center
|
||||
:padding-horizontal 20
|
||||
:height 56
|
||||
:justify-content :space-between}
|
||||
container-style)
|
||||
page-nav-background-uri (assoc :background-color page-nav-color)
|
||||
page-nav-color (assoc :background page-nav-background-uri))}
|
||||
[rn/view
|
||||
|
||||
@@ -117,6 +117,7 @@
|
||||
|
||||
;;;;Blur
|
||||
(def white-70-blur (alpha white 0.7))
|
||||
(def neutral-80-opa-1-blur (alpha "#192438" 0.1))
|
||||
(def neutral-5-opa-70-blur (alpha neutral-5 0.7))
|
||||
(def neutral-80-opa-80-blur (alpha "#192438" 0.8))
|
||||
(def neutral-90-opa-70-blur (alpha neutral-90 0.7))
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
(ns react-native.blur
|
||||
(:require ["@react-native-community/blur" :as blur]
|
||||
[reagent.core :as reagent]))
|
||||
[react-native.platform :as platform]
|
||||
[reagent.core :as reagent]
|
||||
[react-native.core :as rn]))
|
||||
|
||||
(def view (reagent/adapt-react-class (.-BlurView blur)))
|
||||
|
||||
;; blur view is currently not working correctly on Android.
|
||||
(def ios-view (if platform/ios? view rn/view))
|
||||
|
||||
@@ -125,6 +125,28 @@
|
||||
(fn [[cb options]]
|
||||
(authenticate-fx #(cb %) options)))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:biometric/enable-and-save-password
|
||||
(fn [{:keys [key-uid
|
||||
masked-password
|
||||
on-success
|
||||
on-error]}]
|
||||
(-> (keychain/save-user-password!
|
||||
key-uid
|
||||
masked-password)
|
||||
(.then
|
||||
(fn [_]
|
||||
(keychain/save-auth-method!
|
||||
key-uid
|
||||
keychain/auth-method-biometric)))
|
||||
(.then
|
||||
(fn [_]
|
||||
(when on-success
|
||||
(on-success))))
|
||||
(.catch (fn [error]
|
||||
(when on-error
|
||||
(on-error error)))))))
|
||||
|
||||
(rf/defn update-biometric
|
||||
[{db :db :as cofx} biometric-auth?]
|
||||
(let [key-uid (or (get-in db [:multiaccount :key-uid])
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
(let [me? (= (:public-key current-multiaccount) identity)]
|
||||
(if me?
|
||||
[(or (:preferred-name current-multiaccount)
|
||||
(:primary-name contact)
|
||||
(gfycat/generate-gfy identity))]
|
||||
[(:primary-name contact) (:secondary-name contact)])))
|
||||
|
||||
|
||||
@@ -365,6 +365,25 @@
|
||||
[_]
|
||||
(status/get-node-config #(re-frame/dispatch [::get-node-config-callback %])))
|
||||
|
||||
(rf/defn redirect-to-root
|
||||
"Decides which root should be initialised depending on user and app state"
|
||||
[{:keys [db] :as cofx}]
|
||||
(cond
|
||||
(get db :local-pairing/completed-pairing?)
|
||||
{:dispatch [:syncing/pairing-completed]}
|
||||
|
||||
(get db :onboarding-2/new-account?)
|
||||
{:dispatch [:onboarding-2/finalize-setup]}
|
||||
|
||||
(get db :tos/accepted?)
|
||||
(rf/merge
|
||||
cofx
|
||||
(multiaccounts/switch-theme nil :shell-stack)
|
||||
(navigation/init-root :shell-stack))
|
||||
|
||||
:else
|
||||
{:dispatch [:init-root :tos]}))
|
||||
|
||||
(rf/defn get-settings-callback
|
||||
{:events [::get-settings-callback]}
|
||||
[{:keys [db] :as cofx} settings]
|
||||
@@ -397,7 +416,8 @@
|
||||
(logging/set-log-level (:log-level multiaccount))
|
||||
(activity-center/notifications-fetch-pending-contact-requests)
|
||||
(activity-center/update-seen-state)
|
||||
(activity-center/notifications-fetch-unread-count))))
|
||||
(activity-center/notifications-fetch-unread-count)
|
||||
(redirect-to-root))))
|
||||
|
||||
(re-frame/reg-fx
|
||||
::open-last-chat
|
||||
@@ -472,22 +492,6 @@
|
||||
keychain/auth-method-biometric
|
||||
keychain/auth-method-password))))
|
||||
|
||||
(defn redirect-to-root
|
||||
"Decides which root should be initialised depending on user and app state"
|
||||
[db]
|
||||
(cond
|
||||
(get db :local-pairing/completed-pairing?)
|
||||
(re-frame/dispatch [:syncing/pairing-completed])
|
||||
|
||||
(get db :onboarding-2/new-account?)
|
||||
(re-frame/dispatch [:navigate-to :enable-notifications])
|
||||
|
||||
(get db :tos/accepted?)
|
||||
(re-frame/dispatch [:init-root :shell-stack])
|
||||
|
||||
:else
|
||||
(re-frame/dispatch [:init-root :tos])))
|
||||
|
||||
(rf/defn login-only-events
|
||||
[{:keys [db] :as cofx} key-uid password save-password?]
|
||||
(let [auth-method (:auth-method db)
|
||||
@@ -499,8 +503,7 @@
|
||||
{:db (assoc db :chats/loading? true)
|
||||
:json-rpc/call
|
||||
[{:method "settings_getSettings"
|
||||
:on-success #(do (re-frame/dispatch [::get-settings-callback %])
|
||||
(redirect-to-root db))}]}
|
||||
:on-success #(re-frame/dispatch [::get-settings-callback %])}]}
|
||||
(notifications/load-notification-preferences)
|
||||
(when save-password?
|
||||
(keychain/save-user-password key-uid password))
|
||||
|
||||
@@ -628,6 +628,6 @@
|
||||
[]
|
||||
(.keystoreDir ^js (status)))
|
||||
|
||||
(defn log-file-path
|
||||
(defn log-file-directory
|
||||
[]
|
||||
(.logFilePath ^js (status)))
|
||||
(.logFileDirectory ^js (status)))
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
:MailserversConfig {:Enabled true}
|
||||
:EnableNTPSync true
|
||||
:WakuConfig
|
||||
{:Enabled true
|
||||
{:Enabled (not wakuv2-enabled)
|
||||
:BloomFilterMode waku-bloom-filter-mode
|
||||
:LightClient true
|
||||
:MinimumPoW 0.000001}
|
||||
|
||||
@@ -155,19 +155,36 @@
|
||||
(callback nil))))
|
||||
(callback nil))))))
|
||||
|
||||
(defn save-user-password!
|
||||
[key-uid password]
|
||||
(save-credentials
|
||||
key-uid
|
||||
key-uid
|
||||
(security/safe-unmask-data password)
|
||||
#(when-not %
|
||||
(log/error
|
||||
(str "Error while saving password."
|
||||
" "
|
||||
"The app will continue to work normally, "
|
||||
"but you will have to login again next time you launch it.")))))
|
||||
|
||||
(defn save-auth-method!
|
||||
[key-uid method]
|
||||
(save-credentials
|
||||
(str key-uid "-auth")
|
||||
key-uid
|
||||
method
|
||||
#(when-not %
|
||||
(log/error
|
||||
(str "Error while saving auth method."
|
||||
" "
|
||||
"The app will continue to work normally, "
|
||||
"but you will have to login again next time you launch it.")))))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:keychain/save-user-password
|
||||
(fn [[key-uid password]]
|
||||
(save-credentials
|
||||
key-uid
|
||||
key-uid
|
||||
(security/safe-unmask-data password)
|
||||
#(when-not %
|
||||
(log/error
|
||||
(str "Error while saving password."
|
||||
" "
|
||||
"The app will continue to work normally, "
|
||||
"but you will have to login again next time you launch it."))))))
|
||||
(fn [[key-uid masked-password]]
|
||||
(save-user-password! key-uid masked-password)))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:keychain/save-auth-method
|
||||
@@ -178,16 +195,7 @@
|
||||
"method"
|
||||
method)
|
||||
(when-not (empty? key-uid) ; key-uid may be nil after restore from local pairing
|
||||
(save-credentials
|
||||
(str key-uid "-auth")
|
||||
key-uid
|
||||
method
|
||||
#(when-not %
|
||||
(log/error
|
||||
(str "Error while saving auth method."
|
||||
" "
|
||||
"The app will continue to work normally, "
|
||||
"but you will have to login again next time you launch it.")))))))
|
||||
(save-auth-method! key-uid method))))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:keychain/save-keycard-keys
|
||||
|
||||
@@ -138,6 +138,12 @@
|
||||
:url "#"
|
||||
:icons ["https://statusnetwork.com/img/press-kit-status-logo.svg"]})
|
||||
|
||||
(def default-network-id
|
||||
(get-in default-networks-by-id [default-network :config :NetworkId]))
|
||||
|
||||
(def default-network-rpc-url
|
||||
(get-in default-networks-by-id [default-network :config :UpstreamConfig :URL]))
|
||||
|
||||
(def wallet-connect-project-id "87815d72a81d739d2a7ce15c2cfdefb3")
|
||||
|
||||
(def delete-message-undo-time-limit-ms 4000)
|
||||
|
||||
@@ -552,7 +552,7 @@
|
||||
{:icon :placeholder
|
||||
:icon-color colors/primary-50-opa-40
|
||||
:title (i18n/label :t/contact-request-accepted-toast
|
||||
{:name (:alias message)})})
|
||||
{:name (or name (:alias message))})})
|
||||
|
||||
:else
|
||||
cofx))
|
||||
|
||||
@@ -13,3 +13,5 @@
|
||||
(def ^:const velocity-factor 0.5)
|
||||
|
||||
(def ^:const default-duration 300)
|
||||
|
||||
(def ^:const default-dimension 300)
|
||||
|
||||
@@ -216,10 +216,11 @@
|
||||
curr-orientation (or (rf/sub [:lightbox/orientation])
|
||||
orientation/portrait)
|
||||
portrait? (= curr-orientation orientation/portrait)
|
||||
dimensions (utils/get-dimensions image-width
|
||||
image-height
|
||||
curr-orientation
|
||||
args)
|
||||
dimensions (utils/get-dimensions
|
||||
(or image-width c/default-dimension)
|
||||
(or image-height c/default-duration)
|
||||
curr-orientation
|
||||
args)
|
||||
animations {:scale (anim/use-val c/min-scale)
|
||||
:saved-scale (anim/use-val c/min-scale)
|
||||
:pan-x-start (anim/use-val c/init-offset)
|
||||
|
||||
@@ -46,8 +46,7 @@
|
||||
{:on-press (fn []
|
||||
(permissions/request-permissions
|
||||
{:permissions [:read-external-storage :write-external-storage]
|
||||
:on-allowed #(rf/dispatch
|
||||
[:open-modal :photo-selector {:insets insets}])
|
||||
:on-allowed #(rf/dispatch [:open-modal :photo-selector {:insets insets}])
|
||||
:on-denied (fn []
|
||||
(background-timer/set-timeout
|
||||
#(utils-old/show-popup (i18n/label :t/error)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
[units {:keys [type literal destination]} chat-id]
|
||||
(case (keyword type)
|
||||
:code
|
||||
(conj units [rn/view {:style (merge style/block (style/code))} [quo/text {:weight :code} literal]])
|
||||
(conj units [quo/text {:style (merge style/block (style/code)) :weight :code} literal])
|
||||
|
||||
:emph
|
||||
(conj units [quo/text {:style {:font-style :italic}} literal])
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
[react-native.platform :as platform]))
|
||||
|
||||
(defn gradient-container
|
||||
[insets]
|
||||
[bottom-inset]
|
||||
{:left 0
|
||||
:right 0
|
||||
:height (+ (:bottom insets) (if platform/ios? 65 85))
|
||||
:height (+ bottom-inset (if platform/ios? 65 85))
|
||||
:position :absolute
|
||||
:bottom 0})
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
{:colors [:black :transparent]
|
||||
:start {:x 0 :y 1}
|
||||
:end {:x 0 :y 0}
|
||||
:style (style/gradient-container insets)}
|
||||
:style (style/gradient-container (:bottom insets))}
|
||||
[quo/button
|
||||
{:style {:align-self :stretch
|
||||
:margin-horizontal 20
|
||||
|
||||
@@ -22,10 +22,11 @@
|
||||
|
||||
(def featured-list-container
|
||||
{:flex-direction :row
|
||||
:overflow :hidden
|
||||
:margin-bottom 24
|
||||
:margin-left 20
|
||||
:padding-right 20})
|
||||
:overflow :hidden})
|
||||
|
||||
(def flat-list-container
|
||||
{:padding-bottom 24
|
||||
:padding-horizontal 20})
|
||||
|
||||
(def other-communities-container
|
||||
{:flex 1
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
[quo2.core :as quo]
|
||||
[quo2.foundations.colors :as colors]
|
||||
[react-native.core :as rn]
|
||||
[react-native.platform :as platform]
|
||||
[reagent.core :as reagent]
|
||||
[status-im2.common.resources :as resources]
|
||||
[status-im2.contexts.communities.menus.community-options.view :as options]
|
||||
[status-im.ui.screens.communities.community :as community]
|
||||
[status-im.ui.components.react :as react]
|
||||
[react-native.platform :as platform]
|
||||
[status-im2.common.scroll-page.view :as scroll-page]
|
||||
[status-im2.contexts.communities.discover.style :as style]
|
||||
[utils.re-frame :as rf]))
|
||||
@@ -22,7 +22,7 @@
|
||||
:group [{:id 1
|
||||
:token-icon (resources/get-mock-image :status-logo)}]}]}})
|
||||
|
||||
(defn render-fn
|
||||
(defn community-list-item
|
||||
[community-item _ _ {:keys [width view-type]}]
|
||||
(let [item (merge community-item
|
||||
(get mock-community-item-data :data))
|
||||
@@ -98,18 +98,20 @@
|
||||
{:style style/featured-list-container
|
||||
:on-layout #(swap! view-size
|
||||
(fn []
|
||||
(- (oops/oget % "nativeEvent.layout.width") 20)))}
|
||||
(- (oops/oget % "nativeEvent.layout.width") 40)))}
|
||||
(when-not (= @view-size 0)
|
||||
[rn/flat-list
|
||||
{:key-fn :id
|
||||
:horizontal true
|
||||
:keyboard-should-persist-taps :always
|
||||
:shows-horizontal-scroll-indicator false
|
||||
:nestedScrollEnabled true
|
||||
:separator [rn/view {:width 12}]
|
||||
:data communities
|
||||
:render-fn render-fn
|
||||
:render-fn community-list-item
|
||||
:render-data {:width @view-size
|
||||
:view-type view-type}}])])))
|
||||
:view-type view-type}
|
||||
:content-container-style style/flat-list-container}])])))
|
||||
|
||||
(defn discover-communities-header
|
||||
[{:keys [featured-communities-count
|
||||
@@ -120,7 +122,7 @@
|
||||
[screen-title]
|
||||
[featured-communities-header featured-communities-count]
|
||||
[featured-list featured-communities view-type]
|
||||
[quo/separator]
|
||||
[quo/separator {:style {:margin-horizontal 20}}]
|
||||
[discover-communities-segments selected-tab false]])
|
||||
|
||||
(defn other-communities-list
|
||||
@@ -131,14 +133,16 @@
|
||||
(let [community-id (when communities-ids item)
|
||||
community (if communities
|
||||
item
|
||||
[rf/sub [:communities/home-item community-id]])]
|
||||
(rf/sub [:communities/home-item community-id]))
|
||||
cover {:uri (get-in (:images item) [:banner :uri])}]
|
||||
[rn/view
|
||||
{:key (str inner-index (:id community))
|
||||
:margin-bottom 16}
|
||||
(if (= view-type :card-view)
|
||||
[quo/community-card-view-item
|
||||
(merge community
|
||||
(get mock-community-item-data :data))
|
||||
(get mock-community-item-data :data)
|
||||
{:cover cover})
|
||||
#(rf/dispatch [:navigate-to :community-overview (:id community)])]
|
||||
[quo/communities-list-view-item
|
||||
{:on-press (fn []
|
||||
|
||||
@@ -1,25 +1,59 @@
|
||||
(ns status-im2.contexts.onboarding.create-profile.style
|
||||
(:require [quo2.foundations.colors :as colors]
|
||||
[react-native.platform :as platform]))
|
||||
(:require [react-native.platform :as platform]
|
||||
[quo2.foundations.colors :as colors]))
|
||||
|
||||
(def continue-button
|
||||
{:width "100%"
|
||||
:margin-left :auto
|
||||
:margin-top (if platform/android? :auto 0)
|
||||
:margin-right :auto})
|
||||
|
||||
(def button-container
|
||||
{:width "100%"
|
||||
:margin-top :auto
|
||||
:margin-bottom 72
|
||||
:margin-left :auto
|
||||
:margin-right :auto
|
||||
:align-self :flex-end})
|
||||
:padding-left 20
|
||||
:padding-right 20
|
||||
:padding-top (if platform/android? 0 12)
|
||||
:align-self :flex-end
|
||||
:height 64})
|
||||
|
||||
(def blur-button-container
|
||||
(merge button-container
|
||||
{:background-color colors/neutral-80-opa-1-blur}))
|
||||
|
||||
(def view-button-container
|
||||
(merge button-container {:margin-bottom 24}))
|
||||
|
||||
(def page-container
|
||||
{:padding-top (if platform/ios? 44 0)
|
||||
:position :absolute
|
||||
:top 0
|
||||
:bottom 0
|
||||
:left 0
|
||||
:right 0
|
||||
:background-color colors/neutral-80-opa-80-blur})
|
||||
{:position :absolute
|
||||
:top 0
|
||||
:bottom 0
|
||||
:left 0
|
||||
:right 0})
|
||||
|
||||
(def navigation-bar {:height 56})
|
||||
|
||||
(def info-message
|
||||
{:margin-top 8})
|
||||
|
||||
(def title
|
||||
{:color colors/white
|
||||
:margin-top 12
|
||||
:margin-bottom 20})
|
||||
|
||||
(def color-title
|
||||
{:color colors/white-70-blur
|
||||
:margin-top 20
|
||||
:margin-bottom 16})
|
||||
|
||||
(def content-container
|
||||
{:flex 1
|
||||
:padding-horizontal 20})
|
||||
|
||||
(def input-container
|
||||
{:flex 1
|
||||
:align-items :flex-start
|
||||
:margin-bottom 24})
|
||||
|
||||
(def profile-input-container
|
||||
{:flex-direction :row
|
||||
:justify-content :center})
|
||||
|
||||
@@ -9,18 +9,21 @@
|
||||
[status-im2.contexts.onboarding.common.background.view :as background]
|
||||
[status-im2.contexts.onboarding.select-photo.method-menu.view :as method-menu]
|
||||
[utils.re-frame :as rf]
|
||||
[oops.core :as oops]
|
||||
[react-native.blur :as blur]
|
||||
[status-im2.constants :as c]))
|
||||
|
||||
(defn navigation-bar
|
||||
[]
|
||||
[rn/view {:style style/navigation-bar}
|
||||
[quo/page-nav
|
||||
{:align-mid? true
|
||||
:mid-section {:type :text-only :main-text ""}
|
||||
:left-section {:type :blur-bg
|
||||
:icon :i/arrow-left
|
||||
:icon-override-theme :dark
|
||||
:on-press #(rf/dispatch [:navigate-back])}}]])
|
||||
{:container-style {:padding-horizontal 0}
|
||||
:align-mid? true
|
||||
:mid-section {:type :text-only :main-text ""}
|
||||
:left-section {:type :blur-bg
|
||||
:icon :i/arrow-left
|
||||
:icon-override-theme :dark
|
||||
:on-press #(rf/dispatch [:navigate-back])}}]])
|
||||
|
||||
(def emoji-regex
|
||||
(new
|
||||
@@ -30,96 +33,131 @@
|
||||
(defn has-emojis [s] (re-find emoji-regex s))
|
||||
(def common-names ["Ethereum" "Bitcoin"])
|
||||
(defn has-common-names [s] (pos? (count (filter #(string/includes? s %) common-names))))
|
||||
(def special-characters-regex (new js/RegExp #"[^a-zA-Z\d\s-]" "i"))
|
||||
(def special-characters-regex (new js/RegExp #"[^a-zA-Z\d\s-._]" "i"))
|
||||
(defn has-special-characters [s] (re-find special-characters-regex s))
|
||||
(def min-length 5)
|
||||
(defn length-not-valid [s] (< (count (string/trim s)) min-length))
|
||||
(def valid-regex (new js/RegExp #"^[\w-\s]{5,24}$" "i"))
|
||||
(defn valid-name [s] (re-find valid-regex s))
|
||||
|
||||
(defn validation-message
|
||||
[s]
|
||||
(cond
|
||||
(or (= s nil) (= s "")) nil
|
||||
(has-emojis s) (i18n/label :t/are-not-allowed {:check (i18n/label :t/emojis)})
|
||||
(has-special-characters s) (i18n/label :t/are-not-allowed
|
||||
{:check (i18n/label :t/special-characters)})
|
||||
(string/ends-with? s "-eth") (i18n/label :t/ending-not-allowed {:ending "-eth"})
|
||||
(string/ends-with? s "_eth") (i18n/label :t/ending-not-allowed {:ending "_eth"})
|
||||
(string/ends-with? s ".eth") (i18n/label :t/ending-not-allowed {:ending ".eth"})
|
||||
(has-common-names s) (i18n/label :t/are-not-allowed {:check (i18n/label :t/common-names)})
|
||||
(has-emojis s) (i18n/label :t/are-not-allowed {:check (i18n/label :t/emojis)})
|
||||
(length-not-valid s) (i18n/label :t/name-must-have-at-least-characters
|
||||
{:min-chars min-length})
|
||||
(not (valid-name s)) (i18n/label :t/name-is-not-valid)
|
||||
:else nil))
|
||||
|
||||
(defn button-container
|
||||
[keyboard-shown? children]
|
||||
(if keyboard-shown?
|
||||
[blur/ios-view
|
||||
{:style style/blur-button-container}
|
||||
children]
|
||||
[rn/view {:style style/view-button-container}
|
||||
children]))
|
||||
|
||||
(defn page
|
||||
[{:keys [image-path display-name color]}]
|
||||
(let [full-name (reagent/atom display-name)
|
||||
validation-msg (reagent/atom (validation-message @full-name))
|
||||
on-change-text (fn [s]
|
||||
(reset! validation-msg (validation-message s))
|
||||
|
||||
(reset! full-name s))
|
||||
custom-color (reagent/atom (or color c/profile-default-color))
|
||||
profile-pic (reagent/atom image-path)
|
||||
on-change-profile-pic #(reset! profile-pic %)
|
||||
on-change #(reset! custom-color %)]
|
||||
(fn []
|
||||
[rn/view {:style style/page-container}
|
||||
[navigation-bar]
|
||||
[rn/view
|
||||
{:style {:flex 1
|
||||
:padding-horizontal 20}}
|
||||
[quo/text
|
||||
{:size :heading-1
|
||||
:weight :semi-bold
|
||||
:style {:color colors/white
|
||||
:margin-top 12
|
||||
:margin-bottom 20}} (i18n/label :t/create-profile)]
|
||||
[rn/view
|
||||
{:flex 1
|
||||
:align-items :flex-start}
|
||||
|
||||
[rn/view
|
||||
{:flex-direction :row
|
||||
:justify-content :center}
|
||||
[quo/profile-input
|
||||
{:customization-color @custom-color
|
||||
:placeholder (i18n/label :t/your-name)
|
||||
:on-press #(rf/dispatch
|
||||
[:bottom-sheet/show-sheet
|
||||
{:override-theme :dark
|
||||
:content
|
||||
(fn []
|
||||
[method-menu/view on-change-profile-pic])}])
|
||||
:image-picker-props {:profile-picture @profile-pic
|
||||
:full-name @full-name}
|
||||
:title-input-props {:max-length c/profile-name-max-length
|
||||
:on-change-text on-change-text}}]]
|
||||
(when @validation-msg
|
||||
[quo/info-message
|
||||
{:type :error
|
||||
:size :default
|
||||
:icon :i/info
|
||||
:style style/info-message}
|
||||
@validation-msg])
|
||||
[quo/text
|
||||
{:size :paragraph-2
|
||||
:style {:color colors/white-70-blur
|
||||
:margin-top 20
|
||||
:margin-bottom 16}} (i18n/label :t/accent-colour)]
|
||||
[quo/color-picker
|
||||
{:blur? true
|
||||
:default-selected? :blue
|
||||
:selected @custom-color
|
||||
:on-change on-change}]]
|
||||
[quo/button
|
||||
{:accessibility-label :submit-create-profile-button
|
||||
:type :primary
|
||||
:override-background-color (colors/custom-color @custom-color 60)
|
||||
:on-press #(rf/dispatch [:onboarding-2/profile-data-set
|
||||
{:image-path @profile-pic
|
||||
:display-name @full-name
|
||||
:color @custom-color}])
|
||||
:style style/continue-button
|
||||
:disabled (and (not (seq @full-name)) (not @validation-msg))}
|
||||
(i18n/label :t/continue)]]])))
|
||||
[:f>
|
||||
(fn []
|
||||
(let [full-name (reagent/atom display-name)
|
||||
keyboard-shown? (reagent/atom false)
|
||||
validation-msg (reagent/atom (validation-message @full-name))
|
||||
on-change-text (fn [s]
|
||||
(reset! validation-msg (validation-message s))
|
||||
(reset! full-name (string/trim s)))
|
||||
custom-color (reagent/atom (or color c/profile-default-color))
|
||||
profile-pic (reagent/atom image-path)
|
||||
on-change-profile-pic #(reset! profile-pic %)
|
||||
on-change #(reset! custom-color %)]
|
||||
(fn []
|
||||
(rn/use-effect
|
||||
(let [will-show-listener (oops/ocall rn/keyboard
|
||||
"addListener"
|
||||
"keyboardWillShow"
|
||||
#(swap! keyboard-shown? (fn [] true)))
|
||||
will-hide-listener (oops/ocall rn/keyboard
|
||||
"addListener"
|
||||
"keyboardWillHide"
|
||||
#(swap! keyboard-shown? (fn [] false)))]
|
||||
(fn []
|
||||
(fn []
|
||||
(oops/ocall will-show-listener "remove")
|
||||
(oops/ocall will-hide-listener "remove"))))
|
||||
[])
|
||||
[rn/view {:style style/page-container}
|
||||
[rn/scroll-view
|
||||
{:keyboard-should-persist-taps :always
|
||||
:content-container-style {:flex-grow 1}}
|
||||
[rn/view {:style style/page-container}
|
||||
[rn/view
|
||||
{:style style/content-container}
|
||||
[navigation-bar]
|
||||
[quo/text
|
||||
{:size :heading-1
|
||||
:weight :semi-bold
|
||||
:style style/title} (i18n/label :t/create-profile)]
|
||||
[rn/view
|
||||
{:style style/input-container}
|
||||
[rn/view
|
||||
{:style style/profile-input-container}
|
||||
[quo/profile-input
|
||||
{:customization-color @custom-color
|
||||
:placeholder (i18n/label :t/your-name)
|
||||
:on-press #(rf/dispatch
|
||||
[:bottom-sheet/show-sheet
|
||||
{:override-theme :dark
|
||||
:content
|
||||
(fn []
|
||||
[method-menu/view on-change-profile-pic])}])
|
||||
:image-picker-props {:profile-picture @profile-pic
|
||||
:full-name @full-name}
|
||||
:title-input-props {:default-value @full-name
|
||||
:max-length c/profile-name-max-length
|
||||
:on-change-text on-change-text}}]]
|
||||
(when @validation-msg
|
||||
[quo/info-message
|
||||
{:type :error
|
||||
:size :default
|
||||
:icon :i/info
|
||||
:style style/info-message}
|
||||
@validation-msg])
|
||||
[quo/text
|
||||
{:size :paragraph-2
|
||||
:style style/color-title}
|
||||
(i18n/label :t/accent-colour)]
|
||||
[quo/color-picker
|
||||
{:blur? true
|
||||
:default-selected? :blue
|
||||
:selected @custom-color
|
||||
:on-change on-change}]]]]]
|
||||
[rn/keyboard-avoiding-view {}
|
||||
[button-container @keyboard-shown?
|
||||
[quo/button
|
||||
{:accessibility-label :submit-create-profile-button
|
||||
:type :primary
|
||||
:override-background-color (colors/custom-color @custom-color 60)
|
||||
:on-press (fn []
|
||||
(rf/dispatch [:onboarding-2/profile-data-set
|
||||
{:image-path @profile-pic
|
||||
:display-name @full-name
|
||||
:color @custom-color}]))
|
||||
:style style/continue-button
|
||||
:disabled (or (not (seq @full-name)) @validation-msg)}
|
||||
(i18n/label :t/continue)]]]])))])
|
||||
|
||||
(defn create-profile
|
||||
[]
|
||||
[rn/view {:style {:flex 1}}
|
||||
(let [onboarding-profile-data (rf/sub [:onboarding-2/profile])]
|
||||
(let [onboarding-profile-data (rf/sub [:onboarding-2/profile])]
|
||||
[:<>
|
||||
[background/view true]
|
||||
[page onboarding-profile-data])])
|
||||
[page onboarding-profile-data]]))
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
(ns status-im2.contexts.onboarding.events
|
||||
(:require
|
||||
[utils.re-frame :as rf]
|
||||
[taoensso.timbre :as log]
|
||||
[re-frame.core :as re-frame]
|
||||
[status-im.utils.types :as types]
|
||||
[status-im2.config :as config]
|
||||
@@ -92,18 +93,19 @@
|
||||
:wakuV2Nameserver "1.1.1.1"
|
||||
:logLevel (when log-enabled? config/log-level)
|
||||
:logEnabled log-enabled?
|
||||
:logFilePath (status/log-file-path)
|
||||
:logFilePath (status/log-file-directory)
|
||||
:openseaAPIKey config/opensea-api-key
|
||||
:verifyTransactionURL config/verify-transaction-url
|
||||
:verifyENSURL config/verify-ens-url
|
||||
:verifyENSContractAddress config/verify-ens-contract-address
|
||||
:verifyTransactionChainID config/verify-transaction-chain-id
|
||||
:upstreamConfig config/default-network-rpc-url
|
||||
:networkId config/default-network-id
|
||||
:currentNetwork config/default-network
|
||||
:previewPrivacy config/blank-preview?}]
|
||||
{effect request
|
||||
:dispatch [:navigate-to :generating-keys]
|
||||
:db (-> db
|
||||
(dissoc :onboarding-2/profile)
|
||||
(assoc :onboarding-2/new-account? true))}))
|
||||
:db (assoc db :onboarding-2/new-account? true)}))
|
||||
|
||||
(rf/defn on-delete-profile-success
|
||||
{:events [:onboarding-2/on-delete-profile-success]}
|
||||
@@ -151,3 +153,23 @@
|
||||
;; Restart the flow
|
||||
{:db (dissoc db :onboarding-2/profile)
|
||||
:dispatch [:navigate-to :create-profile]})
|
||||
|
||||
(rf/defn onboarding-new-account-finalize-setup
|
||||
{:events [:onboarding-2/finalize-setup]}
|
||||
[{:keys [db]}]
|
||||
(let [masked-password (get-in db [:onboarding-2/profile :password])
|
||||
key-uid (get-in db [:multiaccount :key-uid])
|
||||
biometric-enabled? (=
|
||||
constants/auth-method-biometric
|
||||
(get-in db [:onboarding-2/profile :auth-method]))]
|
||||
|
||||
(cond-> {:db (dissoc db :onboarding-2/profile)
|
||||
:dispatch [:navigate-to :enable-notifications]}
|
||||
biometric-enabled?
|
||||
(assoc :biometric/enable-and-save-password
|
||||
{:key-uid key-uid
|
||||
:masked-password masked-password
|
||||
:on-success #(log/debug "successfully saved biometric")
|
||||
:on-error #(log/error "failed to save biometrics"
|
||||
{:key-uid key-uid
|
||||
:error %})}))))
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
[quo2.foundations.colors :as colors]))
|
||||
|
||||
(def progress-bar-container
|
||||
{:background-color colors/neutral-100
|
||||
{:background-color :transparent
|
||||
:flex-direction :row
|
||||
:margin-vertical 16})
|
||||
|
||||
@@ -26,12 +26,12 @@
|
||||
:left 0
|
||||
:right 0
|
||||
:z-index 2
|
||||
:background-color colors/neutral-100
|
||||
:background-color :transparent
|
||||
:padding-vertical 12
|
||||
:padding-horizontal 20})
|
||||
|
||||
(def carousel-text
|
||||
{:background-color colors/neutral-100
|
||||
{:background-color :transparent
|
||||
:color colors/white})
|
||||
|
||||
(def page-container
|
||||
@@ -39,14 +39,13 @@
|
||||
:justify-content :flex-end})
|
||||
|
||||
(def page-image
|
||||
{:position :absolute
|
||||
:background-color colors/neutral-100
|
||||
:top 0
|
||||
:bottom 0
|
||||
:left 0
|
||||
:right 0
|
||||
:width "100%"
|
||||
:aspect-ratio 1})
|
||||
{:position :absolute
|
||||
:top 0
|
||||
:bottom 0
|
||||
:left 0
|
||||
:right 0
|
||||
:width "100%"
|
||||
:aspect-ratio 1})
|
||||
|
||||
(def text-container
|
||||
{:flex 1
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
[quo2.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[status-im.keycard.recovery :as keycard]
|
||||
[status-im.multiaccounts.recover.core :as multiaccounts.recover]
|
||||
[status-im2.common.resources :as resources]
|
||||
[status-im2.contexts.onboarding.new-to-status.style :as style]
|
||||
[status-im2.contexts.onboarding.common.navigation-bar.view :as navigation-bar]
|
||||
@@ -40,21 +39,6 @@
|
||||
(i18n/label :t/experienced-web3)]]
|
||||
|
||||
[rn/view {:style style/suboptions}
|
||||
[quo/small-option-card
|
||||
{:variant :icon
|
||||
:title "Temporary (old) generate keys flow"
|
||||
:subtitle "generate keys"
|
||||
:image (resources/get-image :use-keycard)
|
||||
:accessibility-label :generate-old-key
|
||||
:on-press #(rf/dispatch [:generate-and-derive-addresses])}]
|
||||
[rn/view {:style style/space-between-suboptions}]
|
||||
[quo/small-option-card
|
||||
{:variant :icon
|
||||
:title "Temporary (old) recover phrase flow"
|
||||
:subtitle (i18n/label :t/use-recovery-phrase-subtitle)
|
||||
:image (resources/get-image :ethereum-address)
|
||||
:on-press #(rf/dispatch [::multiaccounts.recover/enter-phrase-pressed])}]
|
||||
[rn/view {:style style/space-between-suboptions}]
|
||||
[quo/small-option-card
|
||||
{:variant :icon
|
||||
:title (i18n/label :t/use-recovery-phrase)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
[taoensso.timbre :as log]
|
||||
[reagent.core :as reagent]
|
||||
[react-native.core :as rn]
|
||||
[status-im.utils.types :as types]
|
||||
[utils.transforms :as types]
|
||||
[utils.security.core :as security]
|
||||
[status-im.native-module.core :as status]
|
||||
[status-im2.contexts.onboarding.profiles.style :as style]
|
||||
@@ -181,7 +181,7 @@
|
||||
:accessibility-label :forget-password-button
|
||||
:override-theme :dark
|
||||
:style style/forget-password-button}
|
||||
(i18n/label :t/forget-password)]
|
||||
(i18n/label :t/forgot-password)]
|
||||
[quo/button
|
||||
{:size 40
|
||||
:type :primary
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
(:labelled? @state))
|
||||
:resource (if (= :emoji (:type @state))
|
||||
(resources/get-image :music)
|
||||
:main-icons2/placeholder)})]]]]])))
|
||||
:i/placeholder)})]]]]])))
|
||||
(defn preview-tag
|
||||
[]
|
||||
[rn/view
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
[status-im.node.core :as node]
|
||||
[re-frame.core :as re-frame]
|
||||
[status-im.data-store.settings :as data-store.settings]
|
||||
[status-im.utils.platform :as utils.platform]))
|
||||
[status-im.utils.platform :as utils.platform]
|
||||
[status-im2.constants :as constants]))
|
||||
|
||||
(rf/defn local-pairing-completed
|
||||
{:events [:syncing/pairing-completed]}
|
||||
@@ -54,19 +55,25 @@
|
||||
(rf/defn preparations-for-connection-string
|
||||
{:events [:syncing/get-connection-string-for-bootstrapping-another-device]}
|
||||
[{:keys [db]} entered-password]
|
||||
(let [sha3-pwd (status/sha3 (str (security/safe-unmask-data entered-password)))
|
||||
key-uid (get-in db [:multiaccount :key-uid])
|
||||
config-map (.stringify js/JSON
|
||||
(clj->js {:senderConfig {:keyUID key-uid
|
||||
:keystorePath ""
|
||||
:password sha3-pwd
|
||||
:deviceType utils.platform/os}
|
||||
:serverConfig {:timeout 0}}))]
|
||||
(status/get-connection-string-for-bootstrapping-another-device
|
||||
config-map
|
||||
(fn [connection-string]
|
||||
(rf/dispatch
|
||||
[:bottom-sheet/show-sheet
|
||||
{:show-handle? false
|
||||
:content (fn []
|
||||
[sheet/qr-code-view-with-connection-string connection-string])}])))))
|
||||
(let [valid-password? (>= (count entered-password) constants/min-password-length)
|
||||
show-sheet (fn [connection-string]
|
||||
(rf/dispatch
|
||||
[:bottom-sheet/show-sheet
|
||||
{:show-handle? false
|
||||
:content (fn []
|
||||
[sheet/qr-code-view-with-connection-string
|
||||
connection-string])}]))]
|
||||
(if valid-password?
|
||||
(let [sha3-pwd (status/sha3 (str (security/safe-unmask-data entered-password)))
|
||||
key-uid (get-in db [:multiaccount :key-uid])
|
||||
config-map (.stringify js/JSON
|
||||
(clj->js {:senderConfig {:keyUID key-uid
|
||||
:keystorePath ""
|
||||
:password sha3-pwd
|
||||
:deviceType utils.platform/os}
|
||||
:serverConfig {:timeout 0}}))]
|
||||
(status/get-connection-string-for-bootstrapping-another-device
|
||||
config-map
|
||||
#(show-sheet %)))
|
||||
(show-sheet ""))))
|
||||
|
||||
|
||||
@@ -6,16 +6,16 @@
|
||||
[status-im2.navigation.state :as state]))
|
||||
|
||||
(defn status-bar-options
|
||||
[]
|
||||
[& [status-bar-theme]]
|
||||
;; dark-mode? = After login we are going to use theme as per user's choice (colors/dark?)
|
||||
;; but before login we only have dark mode (dark-mode? = true)
|
||||
(let [dark-mode? (if (= @state/root-id :shell-stack) (colors/dark?) true)]
|
||||
(if platform/android?
|
||||
{:navigationBar {:backgroundColor colors/neutral-100}
|
||||
:statusBar {:backgroundColor :transparent
|
||||
:style (if dark-mode? :light :dark)
|
||||
:style (or status-bar-theme (if dark-mode? :light :dark))
|
||||
:drawBehind true}}
|
||||
{:statusBar {:style (if dark-mode? :light :dark)}})))
|
||||
{:statusBar {:style (or status-bar-theme (if dark-mode? :light :dark))}})))
|
||||
|
||||
(defn topbar-options
|
||||
[]
|
||||
@@ -155,7 +155,8 @@
|
||||
{:stack {:id :shell-stack
|
||||
:children [{:component {:name :shell-stack
|
||||
:id :shell-stack
|
||||
:options (merge (status-bar-options)
|
||||
:options (merge (status-bar-options
|
||||
(if (colors/dark?) :light :dark))
|
||||
{:topBar {:visible false}})}}]}}}
|
||||
:profiles
|
||||
{:root
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"_comment": "Instead use: scripts/update-status-go.sh <rev>",
|
||||
"owner": "status-im",
|
||||
"repo": "status-go",
|
||||
"version": "v0.141.2",
|
||||
"commit-sha1": "91c6949cd25449d5459581a21f2c8b929290ced0",
|
||||
"src-sha256": "0d4x1y9jhdxy5jn9kqp5avx157iqz4ma7903c3ys0njmnxhmjyf8"
|
||||
"version": "v0.142.5",
|
||||
"commit-sha1": "7c2b5a39b370ceb9276a01b53cf9fb966bfe9d5b",
|
||||
"src-sha256": "0rppkkkhhjzq6sykv34r3y3sslv821jjzd319f9bh3lybqqy5jp3"
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ pytest_config_global = dict()
|
||||
test_suite_data = TestSuiteData()
|
||||
appium_container = AppiumContainer()
|
||||
|
||||
common_password = 'qwerty'
|
||||
common_password = 'qwerty1234'
|
||||
unique_password = 'unique' + get_current_time()
|
||||
pin = '121212'
|
||||
puk = '000000000000'
|
||||
|
||||
@@ -212,7 +212,7 @@ def pytest_configure(config):
|
||||
sauce.storage.upload(file_path)
|
||||
os.remove(file_path)
|
||||
break
|
||||
except ConnectionError:
|
||||
except (ConnectionError, RemoteDisconnected):
|
||||
sleep(10)
|
||||
else:
|
||||
sauce.storage.upload(config.getoption('apk'))
|
||||
|
||||
@@ -154,8 +154,8 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
run_in_parallel(
|
||||
(
|
||||
(sign_in_views[0].create_user, {'enable_notifications': True}),
|
||||
(sign_in_views[1].create_user, {'enable_notifications': True}),
|
||||
(sign_in_views[2].create_user, {'enable_notifications': True})
|
||||
(sign_in_views[1].create_user, {'enable_notifications': True, 'username': "test user1"}),
|
||||
(sign_in_views[2].create_user, {'enable_notifications': True, 'username': "test user2"})
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -494,7 +494,12 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
'yotube_full': {
|
||||
'url': 'https://www.youtube.com/watch?v=XN-SVmuJH2g&list=PLbrz7IuP1hrgNtYe9g6YHwHO6F3OqNMao',
|
||||
'txt': 'Status & Keycard – Hardware-Enforced Security',
|
||||
'subtitle': 'YouTube'}
|
||||
'subtitle': 'YouTube'},
|
||||
'yotube_mobile': {
|
||||
'url': 'https://m.youtube.com/watch?v=Je7yErjEVt4',
|
||||
'txt': 'Status, your gateway to Ethereum',
|
||||
'subtitle': 'YouTube'},
|
||||
|
||||
# twitter link is temporary removed from check as current xpath locator in message.preview_title is not applicable for this type of links
|
||||
# 'twitter': {
|
||||
# 'url': 'https://twitter.com/ethdotorg/status/1445161651771162627?s=20',
|
||||
|
||||
@@ -95,6 +95,7 @@ class TestActivityCenterContactRequestMultipleDevicePR(MultipleSharedDeviceTestC
|
||||
[home.chats_tab.click() for home in [self.home_1, self.home_2]]
|
||||
|
||||
@marks.testrail_id(702850)
|
||||
@marks.xfail(reason="Blocked by 15500")
|
||||
def test_activity_center_contact_request_decline(self):
|
||||
self.device_1.put_app_to_background()
|
||||
self.device_2.just_fyi('Device2 sends a contact request to Device1 via Paste button and check user details')
|
||||
@@ -183,8 +184,8 @@ class TestActivityMultipleDevicePR(MultipleSharedDeviceTestCase):
|
||||
self.drivers, self.loop = create_shared_drivers(2)
|
||||
self.device_1, self.device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
|
||||
self.loop.run_until_complete(
|
||||
run_in_parallel(((self.device_1.create_user, ),
|
||||
(self.device_2.create_user,))))
|
||||
run_in_parallel(((self.device_1.create_user, {'username': 'user1'}),
|
||||
(self.device_2.create_user, {'username': 'user2'}))))
|
||||
self.home_1, self.home_2 = self.device_1.get_home_view(), self.device_2.get_home_view()
|
||||
self.profile_1, self.profile_2 = self.home_1.get_profile_view(), self.home_2.get_profile_view()
|
||||
users = self.loop.run_until_complete(run_in_parallel(
|
||||
@@ -331,6 +332,7 @@ class TestActivityMultipleDevicePR(MultipleSharedDeviceTestCase):
|
||||
self.errors.verify_no_errors()
|
||||
|
||||
@marks.testrail_id(702957)
|
||||
@marks.xfail(reason="Blocked by 15500")
|
||||
def test_activity_center_mentions(self):
|
||||
self.home_1.jump_to_communities_home()
|
||||
self.home_2.jump_to_card_by_text('# %s' % self.channel_name)
|
||||
@@ -365,6 +367,7 @@ class TestActivityMultipleDevicePR(MultipleSharedDeviceTestCase):
|
||||
self.errors.verify_no_errors()
|
||||
|
||||
@marks.testrail_id(702958)
|
||||
@marks.xfail(reason="Blocked by 15500")
|
||||
def test_activity_center_admin_notification_accept_swipe(self):
|
||||
self.home_2.just_fyi("Clearing history")
|
||||
self.home_2.jump_to_messages_home()
|
||||
@@ -380,7 +383,7 @@ class TestActivityMultipleDevicePR(MultipleSharedDeviceTestCase):
|
||||
community_element = self.home_1.get_chat(community_name, community=True)
|
||||
self.community_1.share_community(community_element, self.default_username_2)
|
||||
|
||||
self.home_1.just_fyi("Request access to community")
|
||||
self.home_2.just_fyi("Request access to community")
|
||||
self.home_2.jump_to_messages_home()
|
||||
self.chat_2 = self.home_2.get_chat(self.default_username_1).click()
|
||||
self.chat_2.element_by_text_part('View').click()
|
||||
|
||||
@@ -595,11 +595,11 @@ class BaseView(object):
|
||||
|
||||
def jump_to_messages_home(self):
|
||||
self.jump_to_button.click()
|
||||
self.chats_tab.click()
|
||||
self.chats_tab.click_until_presence_of_element(self.jump_to_button)
|
||||
|
||||
def jump_to_communities_home(self):
|
||||
self.jump_to_button.click()
|
||||
self.communities_tab.click()
|
||||
self.communities_tab.click_until_presence_of_element(self.jump_to_button)
|
||||
|
||||
def jump_to_card_by_text(self, text: str):
|
||||
self.jump_to_button.click()
|
||||
|
||||
@@ -140,11 +140,8 @@ class SignInView(BaseView):
|
||||
xpath="(//android.widget.EditText[@content-desc='password-input'])[1]")
|
||||
self.confirm_your_password_input = EditBox(self.driver,
|
||||
xpath="(//android.widget.EditText[@content-desc='password-input'])[2]")
|
||||
self.enable_notifications_button = Button(self.driver, accessibility_id="enable-notifications-button")
|
||||
self.maybe_later_button = Button(self.driver, accessibility_id="enable-notifications-later-button")
|
||||
self.privacy_policy_link = PrivacyPolicyLink(self.driver)
|
||||
self.terms_of_use_link = TermsOfUseLink(self.driver)
|
||||
self.start_button = Button(self.driver, accessibility_id="welcome-button")
|
||||
self.keycard_storage_button = KeycardKeyStorageButton(self.driver)
|
||||
self.first_username_on_choose_chat_name = Text(self.driver,
|
||||
xpath="//*[@content-desc='select-account-button-0']//android.widget.TextView[1]")
|
||||
@@ -177,60 +174,81 @@ class SignInView(BaseView):
|
||||
self.continue_custom_seed_phrase_button = Button(self.driver, accessibility_id="continue-custom-seed-phrase")
|
||||
self.cancel_custom_seed_phrase_button = Button(self.driver, accessibility_id="cancel-custom-seed-phrase")
|
||||
|
||||
def create_user(self, password=common_password, keycard=False, enable_notifications=False, second_user=False):
|
||||
# New onboarding
|
||||
self.generate_keys_button = Button(self.driver, translation_id="create-multiaccount")
|
||||
self.profile_your_name_edit_box = EditBox(self.driver, accessibility_id="profile-title-input")
|
||||
self.profile_continue_button = Button(self.driver, accessibility_id="submit-create-profile-button")
|
||||
self.profile_password_edit_box = EditBox(self.driver, translation_id="password-creation-placeholder-1")
|
||||
self.profile_repeat_password_edit_box = EditBox(self.driver, translation_id="password-creation-placeholder-2")
|
||||
self.profile_confirm_password_button = Button(self.driver, translation_id="password-creation-confirm")
|
||||
self.enable_biometric_maybe_later_button = Button(self.driver, translation_id="maybe-later")
|
||||
self.enable_notifications_button = Button(self.driver, accessibility_id="enable-notifications-button")
|
||||
self.maybe_later_button = Button(self.driver, accessibility_id="enable-notifications-later-button")
|
||||
self.start_button = Button(self.driver, accessibility_id="welcome-button")
|
||||
self.use_recovery_phrase_button = Button(self.driver, translation_id="use-recovery-phrase")
|
||||
self.passphrase_edit_box = EditBox(self.driver, accessibility_id="use-recovery-phrase")
|
||||
|
||||
def set_password(self, password: str):
|
||||
self.profile_password_edit_box.set_value(password)
|
||||
self.profile_repeat_password_edit_box.click()
|
||||
self.profile_repeat_password_edit_box.send_keys(password)
|
||||
self.checkbox_button.scroll_to_element()
|
||||
self.checkbox_button.double_click()
|
||||
self.profile_confirm_password_button.click()
|
||||
|
||||
def set_profile(self, username: str, set_image=False):
|
||||
self.profile_your_name_edit_box.set_value(username)
|
||||
self.profile_continue_button.click_until_presence_of_element(self.profile_password_edit_box)
|
||||
if set_image:
|
||||
pass
|
||||
|
||||
def create_user(self, password=common_password, keycard=False, enable_notifications=False, second_user=False,
|
||||
username="test user"):
|
||||
self.driver.info("## Creating new multiaccount (password:'%s', keycard:'%s', enable_notification: '%s')" %
|
||||
(password, str(keycard), str(enable_notifications)), device=False)
|
||||
if not second_user:
|
||||
self.i_m_new_in_status_button.click_until_presence_of_element(self.generate_key_button)
|
||||
self.generate_key_button.click()
|
||||
|
||||
self.next_button.click_until_absense_of_element(self.element_by_translation_id("intro-wizard-title2"))
|
||||
if keycard:
|
||||
keycard_flow = self.keycard_storage_button.click()
|
||||
keycard_flow.confirm_pin_and_proceed()
|
||||
keycard_flow.backup_seed_phrase()
|
||||
else:
|
||||
self.next_button.click()
|
||||
self.create_password_input.set_value(password)
|
||||
self.confirm_your_password_input.set_value(password)
|
||||
self.next_button.click()
|
||||
self.i_m_new_in_status_button.click_until_presence_of_element(self.generate_keys_button)
|
||||
self.generate_keys_button.click_until_presence_of_element(self.profile_your_name_edit_box)
|
||||
self.set_profile(username)
|
||||
self.set_password(password)
|
||||
self.enable_biometric_maybe_later_button.wait_and_click(30)
|
||||
# self.next_button.click_until_absense_of_element(self.element_by_translation_id("intro-wizard-title2"))
|
||||
# if keycard:
|
||||
# keycard_flow = self.keycard_storage_button.click()
|
||||
# keycard_flow.confirm_pin_and_proceed()
|
||||
# keycard_flow.backup_seed_phrase()
|
||||
# else:
|
||||
# self.next_button.click()
|
||||
# self.create_password_input.set_value(password)
|
||||
# self.confirm_your_password_input.set_value(password)
|
||||
# self.next_button.click()
|
||||
if enable_notifications:
|
||||
self.enable_notifications_button.click_until_presence_of_element(self.start_button)
|
||||
else:
|
||||
self.maybe_later_button.click_until_presence_of_element(self.start_button)
|
||||
self.start_button.click()
|
||||
self.chats_tab.wait_for_visibility_of_element(30)
|
||||
|
||||
self.driver.info("## New multiaccount is created successfully!", device=False)
|
||||
return self.get_home_view()
|
||||
|
||||
def recover_access(self, passphrase: str, password: str = common_password, keycard=False,
|
||||
enable_notifications=False, second_user=False):
|
||||
def recover_access(self, passphrase: str, password: str = common_password+'1234', keycard=False,
|
||||
enable_notifications=False, second_user=False, username='Restore user', set_image=False):
|
||||
self.driver.info("## Recover access(password:%s, keycard:%s)" % (password, str(keycard)), device=False)
|
||||
|
||||
if not second_user:
|
||||
self.accept_tos_checkbox.enable()
|
||||
self.get_started_button.click_until_presence_of_element(self.access_key_button)
|
||||
self.access_key_button.click()
|
||||
self.enter_seed_phrase_button.click()
|
||||
self.seedphrase_input.click()
|
||||
self.seedphrase_input.set_value(passphrase)
|
||||
self.next_button.click()
|
||||
self.reencrypt_your_key_button.click()
|
||||
if keycard:
|
||||
keycard_flow = self.keycard_storage_button.click()
|
||||
keycard_flow.confirm_pin_and_proceed()
|
||||
else:
|
||||
self.next_button.click()
|
||||
self.create_password_input.set_value(password)
|
||||
self.confirm_your_password_input.set_value(password)
|
||||
self.next_button.click_until_presence_of_element(self.maybe_later_button)
|
||||
self.maybe_later_button.wait_for_element(30)
|
||||
self.i_m_new_in_status_button.click_until_presence_of_element(self.generate_keys_button)
|
||||
self.use_recovery_phrase_button.click()
|
||||
self.passphrase_edit_box.set_value(passphrase)
|
||||
self.continue_button.click_until_presence_of_element(self.profile_your_name_edit_box)
|
||||
self.set_profile(username, set_image)
|
||||
self.set_password(password)
|
||||
self.enable_biometric_maybe_later_button.wait_and_click(30)
|
||||
if enable_notifications:
|
||||
self.enable_notifications_button.click_until_presence_of_element(self.start_button)
|
||||
else:
|
||||
self.maybe_later_button.click_until_presence_of_element(self.start_button)
|
||||
self.start_button.click()
|
||||
self.profile_button.wait_for_visibility_of_element(30)
|
||||
self.chats_tab.wait_for_visibility_of_element(30)
|
||||
self.driver.info("## Multiaccount is recovered successfully!", device=False)
|
||||
return self.get_home_view()
|
||||
|
||||
|
||||
@@ -2030,7 +2030,7 @@
|
||||
"logged-in": "Logged in",
|
||||
"profiles-on-device": "Profiles on device",
|
||||
"profile-password": "Profile password",
|
||||
"forget-password": "Forgot password?",
|
||||
"forgot-password": "Forgot password?",
|
||||
"log-in": "Log in",
|
||||
"type-your-password": "Type your password",
|
||||
"oops-wrong-password": "Oops, wrong password!",
|
||||
@@ -2054,5 +2054,7 @@
|
||||
"error-syncing-connection-failed": "Oops! Connection failed. Try again",
|
||||
"camera-permission-denied": "Permission denied",
|
||||
"enable-biometrics": "Enable biometrics",
|
||||
"use-biometrics": "Use biometrics to fill in your password"
|
||||
"use-biometrics": "Use biometrics to fill in your password",
|
||||
"name-must-have-at-least-characters": "Name must have at least {{min-chars}} characters",
|
||||
"name-is-not-valid": "Name is not valid"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user