Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
349c707066 |
+16
-27
@@ -30,7 +30,7 @@ Ready for testing PR should meet the following criteria:
|
||||
3. Wait for the review.
|
||||
4. Make sure that after review and before requesting manual QA your PR is rebased to current develop.
|
||||
5. Once the PR has been approved by reviewer(s) - label `request-manual-qa` should be applied to the PR
|
||||
6. Move PR to the E2E column when it is ready for testing (**mandatory for all PRs**). That will also trigger e2e tests run. QAs are monitoring PRs from E2E column and take it into test.
|
||||
6. Move PR to the E2E column when it is ready for testing. That will also trigger e2e tests run. QAs are monitoring PRs from E2E column and take it into test.
|
||||
|
||||
After that - PR will be taken into manual testing by the QA team.
|
||||
|
||||
@@ -41,37 +41,27 @@ After that - PR will be taken into manual testing by the QA team.
|
||||
- QA engineer picks up one of PRs with the ```request-manual-qa``` label, drags the item to the ```IN TESTING``` column and assigns it to themselves.
|
||||
- During testing, QA will add comments describing the issues found, and also review automation tests results.
|
||||
Usually found issues are numbered as "Issue 1, Issue 2", etc.
|
||||
When the first round of testing is completed and all issues for this stage are found, the QA can add the ```Tested - Issues``` label and drag the card to the ```CONTRIBUTOR``` column. These two actions are optional.
|
||||
- When manual testing of the PR is fully completed and all the issues are fixed, the QA adds the ```Tested - OK``` label and drags the card to the ```Design review``` column (the cases when design review is necessary are described below).
|
||||
- If design review is not required, the QA drags the PR to the ```MERGE``` column. After that the developer merges PR into develop.
|
||||
- If design review has been done, the designer (```@Francesca-G```) drags the PR to the ```MERGE``` column.
|
||||
After that the developer merges PR into develop.
|
||||
- If manual testing/design review was not carried out, the developer drags PR to the ```MERGE``` column themselves.
|
||||
|
||||
### Design review
|
||||
_**How do I know if a design review is needed?**_
|
||||
|
||||
There are three cases here depending on the changes in the PR:
|
||||
1. **Functional PRs with UI changes:** after the ```Tested - OK``` label is added, the QA moves the PR to the ```Design review``` column + mentions ```@Francesca-G``` in comments.
|
||||
2. **Component PRs:** can be moved directly to the ```Design review``` column by the developer when get a review from devs (manual testing step can be skipped) + the developer mentions ```@Francesca-G``` in comments.
|
||||
3. **Functional PRs changes in which are not related to UI (e.g. a crash fix):** skip the ```Design review``` step (the PR should only be manually tested by QA).
|
||||
|
||||
There are three possible scenarios when the design review is completed:
|
||||
1. **Approved by design** > the PR is moved to the ```MERGE``` column by Francesca
|
||||
2. **Some changes requested, but can be fixed as followups** > need to be negotiated with Francesca > Francesca moves PR to the ```MERGE``` column and adds the ```Follow-up required``` label > follow-ups should be added **by the dev** right after the PR is merged
|
||||
3. **Some changes requested, they should be fixed before merge** > Francesca reviews the PR again after the fixes and moves PR to the ```MERGE``` column from ```Design review```
|
||||
|
||||
---
|
||||
**Notes:**
|
||||
- If your PR has a long story and started from `develop` branch several days ago, please rebase it to current develop before adding label
|
||||
- if PR can be tested by developer (in case of small changes) and/or developer is sure that the changes made cannot introduce a regression, then PR can be merged without manual testing. Also, currently, PRs are not manually tested if the changes relate only the design (creation of components, etc.) and do not affect the functionality.
|
||||
---
|
||||
When the first round of testing is completed and all issues for this stage are found, tester can add the ```Tested - Issues``` label and drag the card to the ```CONTRIBUTOR``` column. These two actions are optional.
|
||||
- When manual testing of PR is fully completed and all issues are fixed, QA adds the ```Tested - OK``` label and drags the card to the ```MERGE``` column, after which developer merges PR into develop.
|
||||
If manual testing was not carried out, developer drags PR to the ```MERGE``` column themselves.
|
||||
|
||||
**Notes:**
|
||||
- If your PR has a long story and started from `develop` branch several days ago, please rebase it to current develop before adding label
|
||||
- if PR can be tested by developer (in case of small changes) and/or developer is sure that the changes made cannot introduce a regression, then PR can be merged without manual testing. Also, currently, PRs are not manually tested if the changes relate only the design (creation of components, etc.) and do not affect the functionality.
|
||||
|
||||
#### Why my PR is in `Contributor` column?
|
||||
PR can be moved to this column by the ```status-github-bot``` or by QA engineer with label `Tested-issues`.
|
||||
In the first case most often this happens due to conflicting files in PR.
|
||||
In the second case - after fixing of all found issues, the developer should ping the QA in the PR comments for retesting.
|
||||
|
||||
|
||||
#### Why is my PR in `To Rebase` column?
|
||||
PR is moved to the "To Rebase" column in two cases:
|
||||
- automatically by github bot if PR branch has conflicts that should be resolved
|
||||
- manually (by QAs) if PR branch is out-of-date with the base branch and requires rebasing to the latest develop
|
||||
|
||||
If PR appeared in the "To Rebase" column dev who is working on the PR should resolve conflicts/rebase branch to the latest develop. After resolving conflicts/rebasing PR should be moved by developer to the right column depending on PR work progress.
|
||||
|
||||
## Merging a PR
|
||||
**Merge conditions:**
|
||||
1. Required number of reviews received
|
||||
@@ -83,7 +73,6 @@ In the second case - after fixing of all found issues, the developer should ping
|
||||
|
||||
|
||||
6. In case of manual testing - the label ```Tested - OK``` from QA
|
||||
7. In case of design review - the approval from the designer
|
||||
|
||||
|
||||
You can merge your PR into develop - some useful clues you can find [here](https://notes.status.im/setup-e2e#3-Merging-PR)
|
||||
|
||||
+2
-2
@@ -66,13 +66,13 @@
|
||||
"react-native-randombytes": "^3.6.1",
|
||||
"react-native-reanimated": "2.11.0",
|
||||
"react-native-redash": "^16.0.11",
|
||||
"react-native-svg": "13.10.0",
|
||||
"react-native-shake": "^3.3.1",
|
||||
"react-native-share": "^8.2.2",
|
||||
"react-native-static-safe-area-insets": "^2.2.0",
|
||||
"react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#refs/tags/v2.5.39",
|
||||
"react-native-svg": "13.10.0",
|
||||
"react-native-touch-id": "^4.4.1",
|
||||
"react-native-transparent-video": "git+https://github.com/status-im/react-native-transparent-video.git#refs/tags/0.1.1",
|
||||
"react-native-transparent-video": "git+https://github.com/status-im/react-native-transparent-video.git#refs/tags/0.0.9",
|
||||
"react-native-webview": "git+https://github.com/status-im/react-native-webview.git#refs/tags/v11.16.0-status",
|
||||
"react-syntax-highlighter": "^15.5.0",
|
||||
"rn-emoji-keyboard": "0.7.0",
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 737 B |
Binary file not shown.
|
Before Width: | Height: | Size: 1.0 KiB |
@@ -10,14 +10,14 @@
|
||||
;; (-> reanimated/slide-out-up-animation (.damping 20) .springify (.stiffness 300))
|
||||
(js/eval
|
||||
"
|
||||
var globalThis
|
||||
if (typeof window === \"undefined\") {
|
||||
globalThis = global
|
||||
} else {
|
||||
globalThis = window
|
||||
}
|
||||
globalThis.__STATUS_MOBILE_JS_IDENTITY_PROXY__ = new Proxy({}, {get() { return () => globalThis.__STATUS_MOBILE_JS_IDENTITY_PROXY__}})
|
||||
")
|
||||
var globalThis
|
||||
if (typeof window === \"undefined\") {
|
||||
globalThis = global
|
||||
} else {
|
||||
globalThis = window
|
||||
}
|
||||
globalThis.__STATUS_MOBILE_JS_IDENTITY_PROXY__ = new Proxy({}, {get() { return () => globalThis.__STATUS_MOBILE_JS_IDENTITY_PROXY__}})
|
||||
")
|
||||
|
||||
(def action-button #js {:default #js {:Item #js {}}})
|
||||
(def config #js {:default #js {}})
|
||||
@@ -139,17 +139,15 @@
|
||||
(def react-native-share #js {:default {}})
|
||||
(def react-native-svg
|
||||
#js
|
||||
{:ClipPath #js {:render identity}
|
||||
:Circle #js {:render identity}
|
||||
:Defs #js {:render identity}
|
||||
:G #js {:render identity}
|
||||
:Path #js {:render identity}
|
||||
:Rect #js {:render identity}
|
||||
:SvgUri #js {:render identity}
|
||||
:SvgXml #js {:render identity}
|
||||
:LinearGradient #js {:render identity}
|
||||
:Stop #js {:render identity}
|
||||
:default #js {:render identity}})
|
||||
{:ClipPath #js {:render identity}
|
||||
:Circle #js {:render identity}
|
||||
:Defs #js {:render identity}
|
||||
:G #js {:render identity}
|
||||
:Path #js {:render identity}
|
||||
:Rect #js {:render identity}
|
||||
:SvgUri #js {:render identity}
|
||||
:SvgXml #js {:render identity}
|
||||
:default #js {:render identity}})
|
||||
(def react-native-webview #js {:default {}})
|
||||
(def react-native-audio-toolkit
|
||||
#js
|
||||
|
||||
@@ -7,33 +7,27 @@
|
||||
[quo2.components.avatars.group-avatar.style :as style]))
|
||||
|
||||
(def sizes
|
||||
{:size/s-20 {:icon 12
|
||||
:container 20}
|
||||
:size/s-28 {:icon 16
|
||||
:container 28}
|
||||
:size/s-32 {:icon 16
|
||||
:container 32}
|
||||
:size/s-48 {:icon 20
|
||||
:container 48}
|
||||
:size/s-80 {:icon 32
|
||||
:container 80}})
|
||||
{20 {:icon 12}
|
||||
28 {:icon 16}
|
||||
32 {:icon 16}
|
||||
48 {:icon 20}
|
||||
80 {:icon 32}})
|
||||
|
||||
(defn- view-internal
|
||||
[_]
|
||||
(fn [{:keys [size theme customization-color picture]
|
||||
:or {size :size/s-20
|
||||
:or {size 20
|
||||
customization-color :blue}}]
|
||||
(let [container-size (get-in sizes [size :container])
|
||||
icon-size (get-in sizes [size :icon])]
|
||||
(let [icon-size (get-in sizes [size :icon])]
|
||||
[rn/view
|
||||
{:style (style/container {:container-size container-size
|
||||
{:style (style/container {:container-size size
|
||||
:customization-color customization-color
|
||||
:theme theme})}
|
||||
(if picture
|
||||
[fast-image/fast-image
|
||||
{:source picture
|
||||
:style {:width container-size
|
||||
:height container-size}}]
|
||||
:style {:width size
|
||||
:height size}}]
|
||||
[icon/icon :i/members
|
||||
{:size icon-size
|
||||
:color colors/white-opa-70}])])))
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
(ns quo2.components.avatars.icon-avatar
|
||||
(:require [quo2.components.icon :as icons]
|
||||
[quo2.foundations.colors :as colors]
|
||||
[quo2.theme :as quo.theme]
|
||||
[react-native.core :as rn]))
|
||||
|
||||
(def sizes
|
||||
@@ -9,8 +8,8 @@
|
||||
:medium 32
|
||||
:small 20})
|
||||
|
||||
(defn icon-avatar-internal
|
||||
[{:keys [size icon color opacity border? theme]
|
||||
(defn icon-avatar
|
||||
[{:keys [size icon color opacity]
|
||||
:or {opacity 20}}]
|
||||
(let [component-size (size sizes)
|
||||
circle-color (colors/custom-color color 50 opacity)
|
||||
@@ -23,13 +22,9 @@
|
||||
{:style {:width component-size
|
||||
:height component-size
|
||||
:border-radius component-size
|
||||
:border-width (when border? 1)
|
||||
:border-color (colors/theme-colors colors/neutral-20 colors/neutral-80 theme)
|
||||
:background-color circle-color
|
||||
:justify-content :center
|
||||
:align-items :center}}
|
||||
[icons/icon icon
|
||||
{:size icon-size
|
||||
:color icon-color}]]))
|
||||
|
||||
(def icon-avatar (quo.theme/with-theme icon-avatar-internal))
|
||||
|
||||
@@ -61,7 +61,6 @@
|
||||
:active-opacity 1
|
||||
:hit-slop {:top 5 :bottom 5 :left 5 :right 5}
|
||||
:pointer-events :auto
|
||||
:style {:height 24}
|
||||
:accessibility-label type}
|
||||
[rn/view
|
||||
{:style (merge
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
(ns quo2.components.buttons.wallet-button.component-spec
|
||||
(:require [quo2.components.buttons.wallet-button.view :as wallet-button]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(h/describe "button tests"
|
||||
(h/test "default render of wallet button component"
|
||||
(h/render [wallet-button/view
|
||||
{:icon :i/placeholder
|
||||
:accessibility-label "test-button"}])
|
||||
(h/is-truthy (h/get-by-label-text "test-button")))
|
||||
|
||||
(h/test "button on-press works"
|
||||
(let [event (h/mock-fn)]
|
||||
(h/render [wallet-button/view
|
||||
{:icon :i/placeholder
|
||||
:on-press event
|
||||
:accessibility-label "test-button"}])
|
||||
(h/fire-event :press (h/get-by-label-text "test-button"))
|
||||
(h/was-called event)))
|
||||
|
||||
(h/test "button on-press disabled when disabled"
|
||||
(let [event (h/mock-fn)]
|
||||
(h/render [wallet-button/view
|
||||
{:icon :i/placeholder
|
||||
:on-press event
|
||||
:accessibility-label "test-button"
|
||||
:disabled? true}])
|
||||
(h/fire-event :press (h/get-by-label-text "test-button"))
|
||||
(h/was-not-called event)))
|
||||
|
||||
(h/test "button on-long-press works"
|
||||
(let [event (h/mock-fn)]
|
||||
(h/render [wallet-button/view
|
||||
{:icon :i/placeholder
|
||||
:on-long-press event
|
||||
:accessibility-label "test-button"}])
|
||||
(h/fire-event :long-press (h/get-by-label-text "test-button"))
|
||||
(h/was-called event))))
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
(ns quo2.components.buttons.wallet-button.style
|
||||
(:require [quo2.foundations.colors :as colors]))
|
||||
|
||||
(defn get-border-color
|
||||
[{:keys [pressed? theme]}]
|
||||
(if (= pressed? true)
|
||||
(colors/theme-colors colors/neutral-40 colors/neutral-60 theme)
|
||||
(colors/theme-colors colors/neutral-30 colors/neutral-70 theme)))
|
||||
|
||||
(defn main
|
||||
[{:keys [pressed? theme disabled?]}]
|
||||
{:border-color (get-border-color {:pressed? pressed?
|
||||
:theme theme})
|
||||
:border-width 1
|
||||
:border-radius 10
|
||||
:width 32
|
||||
:height 32
|
||||
:justify-content :center
|
||||
:align-items :center
|
||||
:opacity (when disabled? 0.3)})
|
||||
@@ -1,29 +0,0 @@
|
||||
(ns quo2.components.buttons.wallet-button.view
|
||||
(:require
|
||||
[quo2.components.buttons.wallet-button.style :as style]
|
||||
[quo2.components.icon :as quo2.icons]
|
||||
[quo2.foundations.colors :as colors]
|
||||
[quo2.theme :as theme]
|
||||
[react-native.core :as rn]
|
||||
[reagent.core :as reagent]))
|
||||
|
||||
(defn- view-internal
|
||||
[]
|
||||
(let [pressed? (reagent/atom false)]
|
||||
(fn
|
||||
[{:keys [on-press on-long-press disabled? icon accessibility-label container-style theme]}]
|
||||
[rn/pressable
|
||||
{:accessibility-label (or accessibility-label :wallet-button)
|
||||
:on-press on-press
|
||||
:on-press-in #(reset! pressed? true)
|
||||
:on-press-out #(reset! pressed? nil)
|
||||
:on-long-press on-long-press
|
||||
:disabled disabled?
|
||||
:style (merge (style/main {:pressed? @pressed?
|
||||
:theme theme
|
||||
:disabled? disabled?})
|
||||
container-style)}
|
||||
[quo2.icons/icon icon
|
||||
{:color (colors/theme-colors colors/neutral-100 colors/white theme)}]])))
|
||||
|
||||
(def view (theme/with-theme view-internal))
|
||||
@@ -1,11 +0,0 @@
|
||||
(ns quo2.components.buttons.wallet-ctas.component-spec
|
||||
(:require [test-helpers.component :as h]
|
||||
[quo2.components.buttons.wallet-ctas.view :as wallet-ctas]))
|
||||
|
||||
(h/describe "Wallet CTAs test"
|
||||
(h/test "Buttons render"
|
||||
(h/render [wallet-ctas/view])
|
||||
(h/is-truthy (h/get-by-label-text :buy))
|
||||
(h/is-truthy (h/get-by-label-text :send))
|
||||
(h/is-truthy (h/get-by-label-text :receive))
|
||||
(h/is-truthy (h/get-by-label-text :bridge))))
|
||||
@@ -1,13 +0,0 @@
|
||||
(ns quo2.components.buttons.wallet-ctas.style)
|
||||
|
||||
(def container
|
||||
{:padding-top 24
|
||||
:padding-bottom 12
|
||||
:padding-horizontal 20
|
||||
:flex-direction :row})
|
||||
|
||||
(def button-container
|
||||
{:padding-vertical 8
|
||||
:width 77.75
|
||||
:justify-content :center
|
||||
:align-items :center})
|
||||
@@ -1,55 +0,0 @@
|
||||
(ns quo2.components.buttons.wallet-ctas.view
|
||||
(:require
|
||||
[quo2.components.buttons.wallet-button.view :as wallet-button]
|
||||
[quo2.components.markdown.text :as text]
|
||||
[quo2.foundations.colors :as colors]
|
||||
[quo2.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[utils.i18n :as i18n]
|
||||
[quo2.components.buttons.wallet-ctas.style :as style]))
|
||||
|
||||
|
||||
(defn action-button
|
||||
[{:keys [icon text on-press theme accessibility-label]}]
|
||||
[rn/view
|
||||
{:style style/button-container
|
||||
:accessibility-label accessibility-label}
|
||||
[wallet-button/view
|
||||
{:icon icon
|
||||
:on-press on-press
|
||||
:on-long-press #(js/alert "long pressed")}]
|
||||
[text/text
|
||||
{:weight :medium
|
||||
:size :paragraph-2
|
||||
:style {:margin-top 4
|
||||
:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)}} text]])
|
||||
|
||||
(defn view-internal
|
||||
[{:keys [theme buy-action send-action receive-action bridge-action]}]
|
||||
[rn/view {:style style/container}
|
||||
[action-button
|
||||
{:icon :i/add
|
||||
:text (i18n/label :t/buy)
|
||||
:on-press buy-action
|
||||
:theme theme
|
||||
:accessibility-label :buy}]
|
||||
[action-button
|
||||
{:icon :i/send
|
||||
:text (i18n/label :t/send)
|
||||
:on-press send-action
|
||||
:theme theme
|
||||
:accessibility-label :send}]
|
||||
[action-button
|
||||
{:icon :i/receive
|
||||
:text (i18n/label :t/receive)
|
||||
:on-press receive-action
|
||||
:theme theme
|
||||
:accessibility-label :receive}]
|
||||
[action-button
|
||||
{:icon :i/bridge
|
||||
:text (i18n/label :t/bridge)
|
||||
:on-press bridge-action
|
||||
:theme theme
|
||||
:accessibility-label :bridge}]])
|
||||
|
||||
(def view (quo.theme/with-theme view-internal))
|
||||
@@ -0,0 +1,59 @@
|
||||
(ns quo2.components.navigation.floating-shell-button
|
||||
(:require [quo2.components.buttons.dynamic-button.view :as dynamic-button]
|
||||
[react-native.core :as rn]
|
||||
[react-native.reanimated :as reanimated]))
|
||||
|
||||
(defn dynamic-button-view
|
||||
[type dynamic-buttons style]
|
||||
(when-let [{:keys [on-press customization-color label] :as props} (get dynamic-buttons type)]
|
||||
[dynamic-button/view
|
||||
{:type type
|
||||
:label label
|
||||
:on-press on-press
|
||||
:count (:count props)
|
||||
:style style
|
||||
:customization-color customization-color}]))
|
||||
|
||||
(defn- section
|
||||
[children]
|
||||
[rn/view {:style {:flex 1} :pointer-events :box-none} children])
|
||||
|
||||
(defn- f-floating-shell-button
|
||||
[dynamic-buttons style opacity-anim]
|
||||
(let [original-style (merge {:flex-direction :row
|
||||
:margin-horizontal 12
|
||||
:pointer-events :box-none}
|
||||
style)
|
||||
animated-style (reanimated/apply-animations-to-style
|
||||
(if opacity-anim
|
||||
{:opacity opacity-anim}
|
||||
{})
|
||||
original-style)]
|
||||
[reanimated/view {:style animated-style}
|
||||
;; Left Section
|
||||
[section
|
||||
[dynamic-button-view :search dynamic-buttons
|
||||
{:position :absolute
|
||||
:right 8}]]
|
||||
;; Mid Section (jump-to)
|
||||
[dynamic-button-view :jump-to dynamic-buttons nil]
|
||||
;; Right Section
|
||||
[section
|
||||
[rn/view
|
||||
{:style {:position :absolute
|
||||
:flex-direction :row
|
||||
:right 0}}
|
||||
[dynamic-button-view :mention dynamic-buttons {:margin-left 8}]
|
||||
[dynamic-button-view :notification-down dynamic-buttons {:margin-left 8}]
|
||||
[dynamic-button-view :notification-up dynamic-buttons {:margin-left 8}]
|
||||
[dynamic-button-view :scroll-to-bottom dynamic-buttons {:margin-left 8}]]]]))
|
||||
|
||||
(defn floating-shell-button
|
||||
"[floating-shell-button dynamic-buttons style opacity-anim pointer-anim]
|
||||
dynamic-buttons {:button-type {:on-press on-press :count count}}
|
||||
style override style
|
||||
opacity-anim reanimated value (optional)"
|
||||
([dynamic-buttons style]
|
||||
[:f> f-floating-shell-button dynamic-buttons style nil])
|
||||
([dynamic-buttons style opacity-anim]
|
||||
[:f> f-floating-shell-button dynamic-buttons style opacity-anim]))
|
||||
@@ -1,22 +0,0 @@
|
||||
(ns quo2.components.navigation.floating-shell-button.style
|
||||
(:require [react-native.reanimated :as reanimated]))
|
||||
|
||||
(defn floating-shell-button
|
||||
[style opacity-anim]
|
||||
(reanimated/apply-animations-to-style
|
||||
(if opacity-anim
|
||||
{:opacity opacity-anim}
|
||||
{})
|
||||
(merge
|
||||
{:flex-direction :row
|
||||
:height 44
|
||||
:align-self :center
|
||||
:padding-top 8
|
||||
:padding-horizontal 12
|
||||
:pointer-events :box-none}
|
||||
style)))
|
||||
|
||||
(def right-section
|
||||
{:position :absolute
|
||||
:flex-direction :row
|
||||
:right 0})
|
||||
@@ -1,49 +0,0 @@
|
||||
(ns quo2.components.navigation.floating-shell-button.view
|
||||
(:require [react-native.core :as rn]
|
||||
[react-native.reanimated :as reanimated]
|
||||
[quo2.components.buttons.dynamic-button.view :as dynamic-button]
|
||||
[quo2.components.navigation.floating-shell-button.style :as style]))
|
||||
|
||||
(defn dynamic-button-view
|
||||
[type dynamic-buttons style]
|
||||
(when-let [{:keys [on-press customization-color label] :as props} (get dynamic-buttons type)]
|
||||
[dynamic-button/view
|
||||
{:type type
|
||||
:label label
|
||||
:on-press on-press
|
||||
:count (:count props)
|
||||
:style style
|
||||
:customization-color customization-color}]))
|
||||
|
||||
(defn- section
|
||||
[children]
|
||||
[rn/view {:style {:flex 1} :pointer-events :box-none} children])
|
||||
|
||||
(defn- f-floating-shell-button
|
||||
[dynamic-buttons style opacity-anim]
|
||||
[reanimated/view {:style (style/floating-shell-button style opacity-anim)}
|
||||
;; Left Section
|
||||
[section
|
||||
[dynamic-button-view :search dynamic-buttons
|
||||
{:position :absolute
|
||||
:right 8}]]
|
||||
;; Mid Section (jump-to)
|
||||
[dynamic-button-view :jump-to dynamic-buttons nil]
|
||||
;; Right Section
|
||||
[section
|
||||
[rn/view
|
||||
{:style style/right-section}
|
||||
[dynamic-button-view :mention dynamic-buttons {:margin-left 8}]
|
||||
[dynamic-button-view :notification-down dynamic-buttons {:margin-left 8}]
|
||||
[dynamic-button-view :notification-up dynamic-buttons {:margin-left 8}]
|
||||
[dynamic-button-view :scroll-to-bottom dynamic-buttons {:margin-left 8}]]]])
|
||||
|
||||
(defn view
|
||||
"[floating-shell-button dynamic-buttons style opacity-anim pointer-anim]
|
||||
dynamic-buttons {:button-type {:on-press on-press :count count}}
|
||||
style override style
|
||||
opacity-anim reanimated value (optional)"
|
||||
([dynamic-buttons style]
|
||||
[:f> f-floating-shell-button dynamic-buttons style nil])
|
||||
([dynamic-buttons style opacity-anim]
|
||||
[:f> f-floating-shell-button dynamic-buttons style opacity-anim]))
|
||||
@@ -1,61 +0,0 @@
|
||||
(ns quo2.components.wallet.keypair.component-spec
|
||||
(:require [test-helpers.component :as h]
|
||||
[quo2.components.wallet.keypair.view :as keypair]))
|
||||
|
||||
(def accounts
|
||||
[{:account-props {:customization-color :turquoise
|
||||
:size 32
|
||||
:emoji "\uD83C\uDFB2"
|
||||
:type :default
|
||||
:name "Trip to Vegas"
|
||||
:address "0x0ah...71a"}
|
||||
:networks [:ethereum :optimism]
|
||||
:state :default
|
||||
:action :none}])
|
||||
|
||||
(def default-details
|
||||
{:full-name "John Doe"
|
||||
:address "zQ3...6fBd2"})
|
||||
|
||||
(def other-details {:full-name "Metamask"})
|
||||
|
||||
(h/describe "Wallet: Keypair"
|
||||
(h/test "Default keypair title renders"
|
||||
(h/render [keypair/view
|
||||
{:accounts accounts
|
||||
:customization-color :blue
|
||||
:type :default-keypair
|
||||
:stored :on-device
|
||||
:action :selector
|
||||
:details default-details}])
|
||||
(h/is-truthy (h/get-by-label-text :title)))
|
||||
|
||||
(h/test "On device renders"
|
||||
(h/render [keypair/view
|
||||
{:accounts accounts
|
||||
:customization-color :blue
|
||||
:type :other
|
||||
:stored :on-device
|
||||
:action :selector
|
||||
:details other-details}])
|
||||
(h/is-truthy (h/get-by-label-text :details)))
|
||||
|
||||
(h/test "Selector action renders"
|
||||
(h/render [keypair/view
|
||||
{:accounts accounts
|
||||
:customization-color :blue
|
||||
:type :other
|
||||
:stored :on-keycard
|
||||
:action :selector
|
||||
:details other-details}])
|
||||
(h/is-truthy (h/get-by-label-text :radio-on)))
|
||||
|
||||
(h/test "Options action renders"
|
||||
(h/render [keypair/view
|
||||
{:accounts accounts
|
||||
:customization-color :blue
|
||||
:type :other
|
||||
:stored :on-keycard
|
||||
:action :options
|
||||
:details other-details}])
|
||||
(h/is-truthy (h/get-by-label-text :options-button))))
|
||||
@@ -1,26 +0,0 @@
|
||||
(ns quo2.components.wallet.keypair.style
|
||||
(:require [quo2.foundations.colors :as colors]))
|
||||
|
||||
(defn container
|
||||
[selected? customization-color theme]
|
||||
{:border-radius 20
|
||||
:border-width 1
|
||||
:border-color (if selected?
|
||||
(colors/theme-colors (colors/custom-color customization-color 50)
|
||||
(colors/custom-color customization-color 60)
|
||||
theme)
|
||||
(colors/theme-colors colors/neutral-10 colors/neutral-80 theme))
|
||||
:padding-bottom 8})
|
||||
|
||||
(def header-container
|
||||
{:padding-horizontal 12
|
||||
:padding-top 8
|
||||
:padding-bottom 12
|
||||
:flex-direction :row
|
||||
:align-items :center})
|
||||
|
||||
(def title-container
|
||||
{:flex-direction :row
|
||||
:align-items :center
|
||||
:justify-content :space-between
|
||||
:flex 1})
|
||||
@@ -1,93 +0,0 @@
|
||||
(ns quo2.components.wallet.keypair.view
|
||||
(:require
|
||||
[quo2.components.avatars.icon-avatar :as icon-avatar]
|
||||
[quo2.components.avatars.user-avatar.view :as user-avatar]
|
||||
[quo2.components.icon :as icon]
|
||||
[quo2.components.list-items.account-list-card.view :as account-list-card]
|
||||
[quo2.components.markdown.text :as text]
|
||||
[quo2.foundations.colors :as colors]
|
||||
[quo2.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[quo2.components.selectors.selectors.view :as selectors]
|
||||
[reagent.core :as reagent]
|
||||
[utils.i18n :as i18n]
|
||||
[quo2.components.wallet.keypair.style :as style]
|
||||
[clojure.string :as string]))
|
||||
|
||||
(defn keypair-string
|
||||
[full-name]
|
||||
(let [first-name (first (string/split full-name #" "))]
|
||||
(i18n/label :t/keypair-title {:name first-name})))
|
||||
|
||||
(defn details-string
|
||||
[address stored]
|
||||
(str (when address (str address " ∙ "))
|
||||
(if (= stored :on-device) (i18n/label :t/on-device) (i18n/label :t/on-keycard))))
|
||||
|
||||
(defn avatar
|
||||
[type full-name customization-color]
|
||||
(if (= type :default-keypair)
|
||||
[user-avatar/user-avatar
|
||||
{:full-name full-name
|
||||
:ring? true
|
||||
:size :small
|
||||
:customization-color customization-color}]
|
||||
[icon-avatar/icon-avatar
|
||||
{:size :medium
|
||||
:icon :i/placeholder
|
||||
:border? true}]))
|
||||
|
||||
(defn title-view
|
||||
[full-name action selected? type customization-color on-options-press theme]
|
||||
[rn/view
|
||||
{:style style/title-container
|
||||
:accessibility-label :title}
|
||||
[text/text {:weight :semi-bold}
|
||||
(if (= type :default-keypair) (keypair-string full-name) full-name)]
|
||||
(if (= action :selector)
|
||||
[selectors/radio
|
||||
{:checked? selected?
|
||||
:customization-color customization-color}]
|
||||
[rn/pressable {:on-press on-options-press}
|
||||
[icon/icon :i/options
|
||||
{:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
|
||||
:accessibility-label :options-button}]])])
|
||||
|
||||
(defn details-view
|
||||
[address stored theme]
|
||||
[rn/view
|
||||
{:style {:flex-direction :row
|
||||
:align-items :center}}
|
||||
[text/text
|
||||
{:size :paragraph-2
|
||||
:accessibility-label :details
|
||||
:style {:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)}}
|
||||
(details-string address stored)]
|
||||
(when (= stored :on-keycard)
|
||||
[rn/view {:style {:margin-left 4}}
|
||||
[icon/icon :i/keycard-card
|
||||
{:size 16
|
||||
:color (colors/theme-colors colors/neutral-50 colors/neutral-40)}]])])
|
||||
|
||||
(defn- view-internal
|
||||
[]
|
||||
(let [selected? (reagent/atom true)]
|
||||
(fn [{:keys [theme accounts customization-color type details stored action on-options-press]}]
|
||||
(let [{:keys [address full-name]} details]
|
||||
[rn/pressable
|
||||
{:style (style/container @selected? customization-color theme)
|
||||
:on-press #(when (= action :selector) (reset! selected? (not @selected?)))}
|
||||
[rn/view {:style style/header-container}
|
||||
[avatar type full-name customization-color]
|
||||
[rn/view
|
||||
{:style {:margin-left 8
|
||||
:flex 1}}
|
||||
[title-view full-name action @selected? type customization-color on-options-press theme]
|
||||
[details-view address stored theme]]]
|
||||
[rn/flat-list
|
||||
{:data accounts
|
||||
:render-fn account-list-card/view
|
||||
:separator [rn/view {:style {:height 8}}]
|
||||
:style {:padding-horizontal 8}}]]))))
|
||||
|
||||
(def view (quo.theme/with-theme view-internal))
|
||||
@@ -1,85 +0,0 @@
|
||||
(ns quo2.components.wallet.network-link.view
|
||||
(:require
|
||||
[quo2.foundations.colors :as colors]
|
||||
[quo2.theme :as quo.theme]
|
||||
[react-native.svg :as svg]))
|
||||
|
||||
(defn link-linear
|
||||
[{:keys [source theme]}]
|
||||
[svg/svg {:xmlns "http://www.w3.org/2000/svg" :width "73" :height "10" :fill :none}
|
||||
[svg/path {:stroke (get colors/networks source) :d "M68 5H5"}]
|
||||
[svg/circle
|
||||
{:cx "68"
|
||||
:cy "5"
|
||||
:r "4"
|
||||
:fill (colors/theme-colors colors/white colors/neutral-90 theme)
|
||||
:stroke (get colors/networks source)}]
|
||||
[svg/circle
|
||||
{:cx "5"
|
||||
:cy "5"
|
||||
:r "4"
|
||||
:fill (colors/theme-colors colors/white colors/neutral-90 theme)
|
||||
:stroke (get colors/networks source)}]])
|
||||
|
||||
(defn link-1x
|
||||
[{:keys [source destination theme]}]
|
||||
[svg/svg {:xmlns "http://www.w3.org/2000/svg" :width "73" :height "66" :fill :none}
|
||||
[svg/path
|
||||
{:stroke "url(#gradient)" :d "M68 5h-9.364c-11.046 0-20 8.954-20 20v16c0 11.046-8.955 20-20 20H5"}]
|
||||
[svg/circle
|
||||
{:cx "68"
|
||||
:cy "5"
|
||||
:r "4"
|
||||
:fill (colors/theme-colors colors/white colors/neutral-90 theme)
|
||||
:stroke (get colors/networks destination)}]
|
||||
[svg/circle
|
||||
{:cx "5"
|
||||
:cy "61"
|
||||
:r "4"
|
||||
:fill (colors/theme-colors colors/white colors/neutral-90 theme)
|
||||
:stroke (get colors/networks source)}]
|
||||
[svg/defs
|
||||
[svg/linear-gradient
|
||||
{:id "gradient" :x1 "72.271" :x2 "82.385" :y1 "5" :y2 "34.155" :gradientUnits "userSpaceOnUse"}
|
||||
[svg/stop {:stopColor (get colors/networks destination)}]
|
||||
[svg/stop {:offset "1" :stopColor (get colors/networks source)}]]]])
|
||||
|
||||
(defn link-2x
|
||||
[{:keys [source destination theme]}]
|
||||
[svg/svg
|
||||
{:width "73" :height "122" :viewBox "0 0 73 122" :fill "none" :xmlns "http://www.w3.org/2000/svg"}
|
||||
[svg/path
|
||||
{:d
|
||||
"M67.9999 5L58.6356 5C47.5899 5 38.6356 13.9543 38.6356 25L38.6356 97C38.6356 108.046 29.6813 117 18.6356 117L5.00006 117"
|
||||
:stroke "url(#gradient)"}]
|
||||
[svg/circle
|
||||
{:cx "68"
|
||||
:cy "5"
|
||||
:r "4"
|
||||
:fill (colors/theme-colors colors/white colors/neutral-90 theme)
|
||||
:stroke (get colors/networks destination)}]
|
||||
[svg/circle
|
||||
{:cx "5"
|
||||
:cy "117"
|
||||
:r "4"
|
||||
:fill (colors/theme-colors colors/white colors/neutral-90 theme)
|
||||
:stroke (get colors/networks source)}]
|
||||
[svg/defs
|
||||
[svg/linear-gradient
|
||||
{:id "gradient"
|
||||
:x1 "72.2711"
|
||||
:y1 "5.00001"
|
||||
:x2 "102.867"
|
||||
:y2 "49.0993"
|
||||
:gradientUnits "userSpaceOnUse"}
|
||||
[svg/stop {:stop-color (get colors/networks destination)}]
|
||||
[svg/stop {:offset "1" :stop-color (get colors/networks source)}]]]])
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [shape] :as props}]
|
||||
(case shape
|
||||
:linear [link-linear props]
|
||||
:1x [link-1x props]
|
||||
:2x [link-2x props]))
|
||||
|
||||
(def view (quo.theme/with-theme view-internal))
|
||||
@@ -12,10 +12,6 @@
|
||||
{:flex-direction :row
|
||||
:justify-content :space-between})
|
||||
|
||||
(def container-info-bottom
|
||||
{:flex-direction :row
|
||||
:padding-top 4})
|
||||
|
||||
(def network-dropdown
|
||||
{:border-color colors/neutral-50
|
||||
:border-width 1
|
||||
@@ -24,10 +20,8 @@
|
||||
:height 32})
|
||||
|
||||
(defn color-metrics
|
||||
[metrics theme]
|
||||
(if (= metrics :positive)
|
||||
(colors/theme-colors colors/success-50 colors/success-60 theme)
|
||||
(colors/theme-colors colors/danger-50 colors/danger-60 theme)))
|
||||
[metrics]
|
||||
(if (= metrics :positive) colors/success-50 colors/danger-50))
|
||||
|
||||
(defn color-text-heading
|
||||
[theme]
|
||||
@@ -46,8 +40,8 @@
|
||||
{:color (color-text-paragraph theme)})
|
||||
|
||||
(defn dot-separator
|
||||
[metrics theme]
|
||||
{:background-color (color-metrics metrics theme)
|
||||
[metrics]
|
||||
{:background-color (color-metrics metrics)
|
||||
:margin-horizontal 4
|
||||
:width 2
|
||||
:height 2})
|
||||
|
||||
@@ -42,38 +42,38 @@
|
||||
[network-dropdown-temporary]])
|
||||
|
||||
(defn- view-metrics
|
||||
[{:keys [metrics currency-change percentage-change theme]}]
|
||||
[metrics currency-change percentage-change]
|
||||
[rn/view
|
||||
{:style {:flex-direction :row
|
||||
:align-items :center}}
|
||||
[text/text
|
||||
{:weight :medium
|
||||
:size :paragraph-2
|
||||
:style {:color (style/color-metrics metrics theme)}}
|
||||
:style {:color (style/color-metrics metrics)}}
|
||||
percentage-change]
|
||||
[rn/view
|
||||
{:style (style/dot-separator metrics theme)}]
|
||||
{:style (style/dot-separator metrics)}]
|
||||
[text/text
|
||||
{:weight :medium
|
||||
:size :paragraph-2
|
||||
:style {:color (style/color-metrics metrics theme)
|
||||
:style {:color (style/color-metrics metrics)
|
||||
:margin-right 4}}
|
||||
currency-change]
|
||||
[icons/icon
|
||||
(if (= metrics :positive) :i/positive :i/negative)
|
||||
{:color (style/color-metrics metrics theme)
|
||||
{:color (style/color-metrics metrics)
|
||||
:size 16}]])
|
||||
|
||||
(defn- view-info-bottom
|
||||
[{:keys [state time-frame metrics date begin-date end-date
|
||||
currency-change percentage-change theme]}]
|
||||
[rn/view {:style style/container-info-bottom}
|
||||
[rn/view {:flex-direction :row}
|
||||
(when (= state :loading)
|
||||
[rn/view
|
||||
{:style {:flex-direction :row
|
||||
:align-items :center}}
|
||||
(loading-bars [{:width 32 :height 10 :margin 8}
|
||||
{:width 32 :height 10 :margin 2}
|
||||
{:width 32 :height 10 :margin 4}
|
||||
{:width 62 :height 10 :margin 4}
|
||||
{:width 10 :height 10 :margin 0}]
|
||||
theme)])
|
||||
@@ -107,11 +107,7 @@
|
||||
:margin-right 8}}
|
||||
(time-frame time-frames)]
|
||||
(when (and (= state :default) (not= metrics :none))
|
||||
[view-metrics
|
||||
{:metrics metrics
|
||||
:currency-change currency-change
|
||||
:percentage-change percentage-change
|
||||
:theme theme}])])])
|
||||
[view-metrics metrics currency-change percentage-change])])])
|
||||
|
||||
(defn- view-internal
|
||||
[props]
|
||||
|
||||
+2
-10
@@ -13,8 +13,6 @@
|
||||
quo2.components.buttons.dynamic-button.view
|
||||
quo2.components.buttons.predictive-keyboard.view
|
||||
quo2.components.buttons.slide-button.view
|
||||
quo2.components.buttons.wallet-button.view
|
||||
quo2.components.buttons.wallet-ctas.view
|
||||
quo2.components.browser.browser-input.view
|
||||
quo2.components.calendar.calendar.view
|
||||
quo2.components.calendar.calendar-day.view
|
||||
@@ -72,7 +70,7 @@
|
||||
quo2.components.messages.author.view
|
||||
quo2.components.messages.gap
|
||||
quo2.components.messages.system-message
|
||||
quo2.components.navigation.floating-shell-button.view
|
||||
quo2.components.navigation.floating-shell-button
|
||||
quo2.components.navigation.page-nav
|
||||
quo2.components.notifications.activity-log.view
|
||||
quo2.components.notifications.activity-logs-photos.view
|
||||
@@ -111,10 +109,8 @@
|
||||
quo2.components.text-combinations.title.view
|
||||
quo2.components.wallet.account-overview.view
|
||||
quo2.components.wallet.account-card.view
|
||||
quo2.components.wallet.keypair.view
|
||||
quo2.components.wallet.network-amount.view
|
||||
quo2.components.wallet.network-bridge.view
|
||||
quo2.components.wallet.network-link.view
|
||||
quo2.components.wallet.progress-bar.view
|
||||
quo2.components.wallet.summary-info.view
|
||||
quo2.components.wallet.token-input.view
|
||||
@@ -139,8 +135,6 @@
|
||||
(def dynamic-button quo2.components.buttons.dynamic-button.view/view)
|
||||
(def predictive-keyboard quo2.components.buttons.predictive-keyboard.view/view)
|
||||
(def slide-button quo2.components.buttons.slide-button.view/view)
|
||||
(def wallet-button quo2.components.buttons.wallet-button.view/view)
|
||||
(def wallet-ctas quo2.components.buttons.wallet-ctas.view/view)
|
||||
|
||||
;;;; Browser
|
||||
(def browser-input quo2.components.browser.browser-input.view/view)
|
||||
@@ -244,7 +238,7 @@
|
||||
(def static-skeleton quo2.components.loaders.skeleton.view/view)
|
||||
|
||||
;;;; Navigation
|
||||
(def floating-shell-button quo2.components.navigation.floating-shell-button.view/view)
|
||||
(def floating-shell-button quo2.components.navigation.floating-shell-button/floating-shell-button)
|
||||
(def page-nav quo2.components.navigation.page-nav/page-nav)
|
||||
|
||||
;;;; Markdown
|
||||
@@ -319,11 +313,9 @@
|
||||
;;;; Wallet
|
||||
(def account-card quo2.components.wallet.account-card.view/view)
|
||||
(def account-overview quo2.components.wallet.account-overview.view/view)
|
||||
(def keypair quo2.components.wallet.keypair.view/view)
|
||||
(def network-amount quo2.components.wallet.network-amount.view/view)
|
||||
(def network-bridge quo2.components.wallet.network-bridge.view/view)
|
||||
(def progress-bar quo2.components.wallet.progress-bar.view/view)
|
||||
(def summary-info quo2.components.wallet.summary-info.view/view)
|
||||
(def network-link quo2.components.wallet.network-link.view/view)
|
||||
(def token-input quo2.components.wallet.token-input.view/view)
|
||||
(def wallet-overview quo2.components.wallet.wallet-overview.view/view)
|
||||
|
||||
@@ -8,8 +8,6 @@
|
||||
[quo2.components.buttons.composer-button.component-spec]
|
||||
[quo2.components.buttons.predictive-keyboard.component-spec]
|
||||
[quo2.components.buttons.slide-button.component-spec]
|
||||
[quo2.components.buttons.wallet-button.component-spec]
|
||||
[quo2.components.buttons.wallet-ctas.component-spec]
|
||||
[quo2.components.calendar.calendar.component-spec]
|
||||
[quo2.components.calendar.calendar-day.component-spec]
|
||||
[quo2.components.calendar.calendar.month-picker.component-spec]
|
||||
@@ -56,7 +54,6 @@
|
||||
[quo2.components.tags.status-tags-component-spec]
|
||||
[quo2.components.wallet.account-overview.component-spec]
|
||||
[quo2.components.wallet.account-card.component-spec]
|
||||
[quo2.components.wallet.keypair.component-spec]
|
||||
[quo2.components.wallet.network-amount.component-spec]
|
||||
[quo2.components.wallet.network-bridge.component-spec]
|
||||
[quo2.components.wallet.progress-bar.component-spec]
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
(ns quo2.foundations.colors
|
||||
(:require [clojure.string :as string]
|
||||
[react-native.platform :as platform]
|
||||
[quo2.theme :as theme]))
|
||||
|
||||
(defn alpha
|
||||
@@ -127,13 +126,12 @@
|
||||
(def neutral-5-opa-70-blur (alpha neutral-5 0.7))
|
||||
(def neutral-10-opa-10-blur (alpha neutral-10 0.1))
|
||||
(def neutral-10-opa-40-blur (alpha neutral-10 0.4))
|
||||
;; https://github.com/status-im/status-mobile/issues/14903
|
||||
(def neutral-80-opa-80-blur (if platform/android? (alpha "#192438" 0.8) "#1E2430CC"))
|
||||
(def neutral-80-opa-80-blur (alpha "#192438" 0.8))
|
||||
(def neutral-90-opa-10-blur (alpha neutral-90 0.1))
|
||||
(def neutral-90-opa-40-blur (alpha neutral-90 0.4))
|
||||
(def neutral-90-opa-70-blur (alpha neutral-90 0.7))
|
||||
(def neutral-95-opa-70-blur neutral-95-opa-70)
|
||||
(def neutral-100-opa-70-blur (if platform/android? neutral-100-opa-70 "#0D1014B3"))
|
||||
(def neutral-100-opa-70-blur neutral-100-opa-70)
|
||||
|
||||
;;;;Black
|
||||
|
||||
|
||||
@@ -10,5 +10,3 @@
|
||||
(def circle (reagent/adapt-react-class Svg/Circle))
|
||||
(def svgxml (reagent/adapt-react-class Svg/SvgXml))
|
||||
(def g (reagent/adapt-react-class Svg/G))
|
||||
(def linear-gradient (reagent/adapt-react-class Svg/LinearGradient))
|
||||
(def stop (reagent/adapt-react-class Svg/Stop))
|
||||
|
||||
@@ -220,6 +220,15 @@
|
||||
(log/error "failed to import community" %)
|
||||
(re-frame/dispatch [::failed-to-import %]))}]})
|
||||
|
||||
(rf/defn join
|
||||
{:events [:communities/join]}
|
||||
[_ community-id]
|
||||
{:json-rpc/call [{:method "wakuext_joinCommunity"
|
||||
:params [community-id]
|
||||
:js-response true
|
||||
:on-success #(re-frame/dispatch [::joined %])
|
||||
:on-error #(log/error "failed to join community" community-id %)}]})
|
||||
|
||||
(rf/defn request-to-join
|
||||
{:events [:communities/request-to-join]}
|
||||
[_ community-id]
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
:margin-vertical 8})
|
||||
|
||||
(defn sheet
|
||||
[{:keys [top bottom]} window-height theme padding-bottom-override selected-item shell?]
|
||||
[{:keys [top bottom]} window-height theme padding-bottom-override shell?]
|
||||
{:position :absolute
|
||||
:max-height (- window-height top)
|
||||
:z-index 1
|
||||
@@ -23,19 +23,13 @@
|
||||
:right 0
|
||||
:border-top-left-radius 20
|
||||
:border-top-right-radius 20
|
||||
:overflow (when-not selected-item :hidden)
|
||||
:overflow (when shell? :hidden)
|
||||
:flex 1
|
||||
:padding-bottom (or padding-bottom-override (+ bottom 8))
|
||||
:background-color (if shell?
|
||||
:transparent
|
||||
(colors/theme-colors colors/white colors/neutral-95 theme))})
|
||||
|
||||
(def gradient-bg
|
||||
{:position :absolute
|
||||
:top 0
|
||||
:left 0
|
||||
:right 0})
|
||||
|
||||
(def shell-bg
|
||||
{:position :absolute
|
||||
:background-color (if platform/ios? colors/white-opa-5 colors/neutral-100-opa-90)
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
(ns status-im2.common.bottom-sheet.view
|
||||
(:require [oops.core :as oops]
|
||||
[quo2.core :as quo]
|
||||
[quo2.foundations.colors :as colors]
|
||||
[quo2.theme :as quo.theme]
|
||||
[quo2.theme :as theme]
|
||||
[react-native.blur :as blur]
|
||||
[react-native.core :as rn]
|
||||
[react-native.gesture :as gesture]
|
||||
@@ -58,8 +57,7 @@
|
||||
[_ _]
|
||||
(let [sheet-height (reagent/atom 0)]
|
||||
(fn [{:keys [hide? insets theme]}
|
||||
{:keys [content selected-item padding-bottom-override on-close shell?
|
||||
gradient-cover? customization-color]}]
|
||||
{:keys [content selected-item padding-bottom-override on-close shell?]}]
|
||||
(let [{window-height :height} (rn/get-window)
|
||||
bg-opacity (reanimated/use-shared-value 0)
|
||||
translate-y (reanimated/use-shared-value window-height)
|
||||
@@ -90,12 +88,8 @@
|
||||
window-height
|
||||
theme
|
||||
padding-bottom-override
|
||||
selected-item
|
||||
shell?))
|
||||
:on-layout #(reset! sheet-height (oops/oget % "nativeEvent" "layout" "height"))}
|
||||
(when gradient-cover?
|
||||
[rn/view {:style style/gradient-bg}
|
||||
[quo/gradient-cover {:customization-color customization-color}]])
|
||||
(when shell?
|
||||
[blur/ios-view {:style style/shell-bg}])
|
||||
(when selected-item
|
||||
@@ -112,4 +106,4 @@
|
||||
[args sheet]
|
||||
[:f> f-view args sheet])
|
||||
|
||||
(def view (quo.theme/with-theme internal-view))
|
||||
(def view (theme/with-theme internal-view))
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
(if group-chat
|
||||
[quo/group-avatar
|
||||
{:customization-color color
|
||||
:size :size/s-20}]
|
||||
:size :x-small}]
|
||||
[quo/user-avatar
|
||||
{:full-name display-name
|
||||
:profile-picture photo-path
|
||||
|
||||
@@ -102,12 +102,12 @@
|
||||
:on-press #(dispatch-and-chill [:open-modal :share-shell] 1000)})
|
||||
:i/qr-code]
|
||||
[rn/view
|
||||
[unread-indicator]
|
||||
[quo/button
|
||||
(merge button-common-props
|
||||
{:accessibility-label :open-activity-center-button
|
||||
:on-press #(rf/dispatch [:activity-center/open])})
|
||||
:i/activity-center]
|
||||
[unread-indicator]]]))
|
||||
:i/activity-center]]]))
|
||||
|
||||
;; TODO: should be moved to quo2 https://github.com/status-im/status-mobile/issues/16964
|
||||
(defn top-nav
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
(ns status-im2.common.log
|
||||
(:require [clojure.string :as string]
|
||||
[native-module.core :as native-module]
|
||||
[re-frame.core :as re-frame]
|
||||
[status-im.utils.types :as types]
|
||||
[status-im2.config :as config]
|
||||
[taoensso.timbre :as log]
|
||||
[utils.re-frame :as rf]))
|
||||
[utils.re-frame :as rf]
|
||||
[native-module.core :as native-module]
|
||||
[status-im.utils.types :as types]))
|
||||
|
||||
(def logs-queue (atom #queue []))
|
||||
(def max-log-entries 1000)
|
||||
@@ -28,7 +28,6 @@
|
||||
:mobile-system? false
|
||||
:log-level level
|
||||
:callback handle-error}]
|
||||
(log/merge-config! {:ns-whitelist ["*"]})
|
||||
(if (string/blank? level)
|
||||
(native-module/init-status-go-logging (merge logging-params {:log-level "WARN"}))
|
||||
(do
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
[status-im2.common.parallax.style :as style]))
|
||||
|
||||
(defn f-sensor-animated-video
|
||||
[{:keys [offset stretch order source disable-parallax? enable-looping?]}]
|
||||
[{:keys [offset stretch order source disable-parallax?]}]
|
||||
(let [double-stretch (* 2 stretch)
|
||||
{window-width :width
|
||||
window-height :height} (rn/get-window)
|
||||
@@ -25,15 +25,14 @@
|
||||
image-style]}
|
||||
[transparent-video/view
|
||||
{:source source
|
||||
:style style/video
|
||||
:loop enable-looping?}]])))
|
||||
:style style/video}]])))
|
||||
|
||||
(defn sensor-animated-video
|
||||
[props]
|
||||
[:f> f-sensor-animated-video props])
|
||||
|
||||
(defn f-video
|
||||
[{:keys [layers disable-parallax? offset stretch container-style enable-looping?]
|
||||
[{:keys [layers disable-parallax? offset stretch container-style]
|
||||
:or {offset 50
|
||||
stretch 0}}]
|
||||
[rn/view
|
||||
@@ -45,8 +44,7 @@
|
||||
:offset offset
|
||||
:stretch stretch
|
||||
:order (inc idx)
|
||||
:disable-parallax? disable-parallax?
|
||||
:enable-looping? enable-looping?}])
|
||||
:disable-parallax? disable-parallax?}])
|
||||
layers)])
|
||||
|
||||
(defn video
|
||||
|
||||
@@ -65,16 +65,16 @@
|
||||
:i/arrow-up]])
|
||||
|
||||
(defn send-button
|
||||
[props {:keys [text-value] :as state} animations window-height images? edit btn-opacity]
|
||||
(let [z-index (reagent/atom (if (and (empty? @text-value) (not images?)) 0 1))]
|
||||
[props {:keys [text-value] :as state} animations window-height images? edit]
|
||||
(let [btn-opacity (reanimated/use-shared-value 0)
|
||||
z-index (reagent/atom (if (and (empty? @text-value) (not images?)) 0 1))]
|
||||
[:f> f-send-button props state animations window-height images? btn-opacity z-index edit]))
|
||||
|
||||
(defn disabled-audio-button
|
||||
[opacity]
|
||||
[reanimated/view {:style (reanimated/apply-animations-to-style {:opacity opacity} {})}
|
||||
[quo/composer-button
|
||||
{:on-press #(js/alert "to be implemented")
|
||||
:icon :i/audio}]])
|
||||
[]
|
||||
[quo/composer-button
|
||||
{:on-press #(js/alert "to be implemented")
|
||||
:icon :i/audio}])
|
||||
|
||||
(defn audio-button
|
||||
[{:keys [record-reset-fn input-ref]}
|
||||
@@ -169,8 +169,8 @@
|
||||
[quo/composer-button
|
||||
{:on-press #(go-to-camera images-count)
|
||||
:icon :i/camera
|
||||
:container-style {:margin-right 12}}]))
|
||||
|
||||
:container-style {:margin-right 12}}
|
||||
]))
|
||||
|
||||
(defn open-photo-selector
|
||||
[{:keys [input-ref]}
|
||||
@@ -212,18 +212,16 @@
|
||||
|
||||
(defn view
|
||||
[props state animations window-height insets {:keys [edit images]}]
|
||||
(let [send-btn-opacity (reanimated/use-shared-value 0)
|
||||
audio-btn-opacity (reanimated/interpolate send-btn-opacity [0 1] [1 0])]
|
||||
[rn/view {:style style/actions-container}
|
||||
[rn/view
|
||||
{:style {:flex-direction :row
|
||||
:display (if @(:recording? state) :none :flex)}}
|
||||
[camera-button]
|
||||
[image-button props animations insets]
|
||||
[reaction-button]
|
||||
[format-button]]
|
||||
[:f> send-button props state animations window-height images edit send-btn-opacity]
|
||||
(when (and (not edit) (not images))
|
||||
;; TODO(alwx): needs to be replaced with an `audio-button` later.
|
||||
;; See https://github.com/status-im/status-mobile/issues/16084 for more details.
|
||||
[:f> disabled-audio-button audio-btn-opacity])]))
|
||||
[rn/view {:style style/actions-container}
|
||||
[rn/view
|
||||
{:style {:flex-direction :row
|
||||
:display (if @(:recording? state) :none :flex)}}
|
||||
[camera-button]
|
||||
[image-button props animations insets]
|
||||
[reaction-button]
|
||||
[format-button]]
|
||||
[:f> send-button props state animations window-height images edit]
|
||||
(when (and (not edit) (not images))
|
||||
;; TODO(alwx): needs to be replaced with an `audio-button` later.
|
||||
;; See https://github.com/status-im/status-mobile/issues/16084 for more details.
|
||||
[disabled-audio-button])])
|
||||
|
||||
@@ -69,8 +69,7 @@
|
||||
{:full-name display-name
|
||||
:profile-picture photo-path
|
||||
:status-indicator? false
|
||||
:size :xxxs
|
||||
:ring? false}]
|
||||
:size :xxxs}]
|
||||
[quo/text
|
||||
{:weight :semi-bold
|
||||
:size :paragraph-2
|
||||
|
||||
@@ -14,12 +14,6 @@
|
||||
:shadow-offset {:width 0 :height (colors/theme-colors -4 -8)}}
|
||||
{:elevation (if @focused? 10 0)}))
|
||||
|
||||
(def composer-sheet-and-jump-to-container
|
||||
{:position :absolute
|
||||
:bottom 0
|
||||
:left 0
|
||||
:right 0})
|
||||
|
||||
(defn sheet-container
|
||||
[insets {:keys [focused?]} {:keys [container-opacity]}]
|
||||
(reanimated/apply-animations-to-style
|
||||
@@ -28,6 +22,10 @@
|
||||
{:border-top-left-radius 20
|
||||
:border-top-right-radius 20
|
||||
:padding-horizontal 20
|
||||
:position :absolute
|
||||
:bottom 0
|
||||
:left 0
|
||||
:right 0
|
||||
:background-color (colors/theme-colors colors/white colors/neutral-95)
|
||||
:z-index 3
|
||||
:padding-bottom (:bottom insets)}
|
||||
@@ -89,7 +87,8 @@
|
||||
:right 0
|
||||
:bottom 0
|
||||
:height window-height
|
||||
:background-color colors/neutral-95-opa-70}))
|
||||
:background-color colors/neutral-95-opa-70
|
||||
:z-index 1}))
|
||||
|
||||
(defn blur-container
|
||||
[height focused?]
|
||||
@@ -111,11 +110,18 @@
|
||||
:blur-type (colors/theme-colors :light :dark)
|
||||
:blur-amount 20})
|
||||
|
||||
(defn shell-container
|
||||
[bottom translate-y]
|
||||
(reanimated/apply-animations-to-style
|
||||
{:bottom bottom ; we use height of the input directly as bottom position
|
||||
:transform [{:translate-y translate-y}]}
|
||||
{:position :absolute
|
||||
:left 0
|
||||
:right 0}))
|
||||
|
||||
(defn shell-button
|
||||
[translate-y opacity]
|
||||
(reanimated/apply-animations-to-style
|
||||
{:transform [{:translate-y translate-y}]
|
||||
:opacity opacity}
|
||||
{:position :absolute
|
||||
:top 0
|
||||
:align-self :center}))
|
||||
{}))
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
[react-native.core :as rn]
|
||||
[status-im2.config :as config]
|
||||
[react-native.reanimated :as reanimated]
|
||||
[react-native.safe-area :as safe-area]
|
||||
[status-im2.contexts.chat.composer.style :as style]
|
||||
[status-im2.contexts.chat.composer.utils :as utils]
|
||||
[status-im2.contexts.chat.messages.list.view :as messages.list]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
@@ -25,8 +27,12 @@
|
||||
[:f> f-blur-view layout-height focused?])
|
||||
|
||||
(defn- f-shell-button
|
||||
[{:keys [focused?]}]
|
||||
[{:keys [maximized? focused?]} {:keys [height]} {:keys [reply edit]}]
|
||||
(let [customization-color (rf/sub [:profile/customization-color])
|
||||
insets (safe-area/get-insets)
|
||||
extra-height (utils/calc-top-content-height reply edit)
|
||||
neg-y (utils/calc-shell-neg-y insets maximized? extra-height)
|
||||
y-container (reanimated/use-shared-value neg-y)
|
||||
hide-shell? (or @focused? @messages.list/show-floating-scroll-down-button)
|
||||
y-shell (reanimated/use-shared-value (if hide-shell? 35 0))
|
||||
opacity (reanimated/use-shared-value (if hide-shell? 0 1))]
|
||||
@@ -35,7 +41,8 @@
|
||||
(reanimated/animate opacity (if hide-shell? 0 1))
|
||||
(reanimated/animate y-shell (if hide-shell? 35 0)))
|
||||
[@focused? @messages.list/show-floating-scroll-down-button])
|
||||
[:<>
|
||||
[reanimated/view
|
||||
{:style (style/shell-container height y-container)}
|
||||
[reanimated/view
|
||||
{:style (style/shell-button y-shell opacity)}
|
||||
[quo/floating-shell-button
|
||||
@@ -46,12 +53,11 @@
|
||||
(rf/dispatch [:shell/navigate-to-jump-to]))
|
||||
:customization-color customization-color
|
||||
:label (i18n/label :t/jump-to)
|
||||
:style {:align-self :center}}}
|
||||
{}]]
|
||||
:style {:align-self :center}}} {}]]
|
||||
[quo/floating-shell-button
|
||||
(when @messages.list/show-floating-scroll-down-button
|
||||
{:scroll-to-bottom {:on-press messages.list/scroll-to-bottom}})
|
||||
{}]]))
|
||||
{:bottom 24}]]))
|
||||
|
||||
(defn shell-button
|
||||
[state animations subs]
|
||||
|
||||
@@ -66,64 +66,62 @@
|
||||
(effects/link-previews props state animations subs)
|
||||
(effects/images props state animations subs)
|
||||
[:<>
|
||||
[sub-view/shell-button state animations subs]
|
||||
(when chat-screen-loaded?
|
||||
[mentions/view props state animations max-height cursor-pos
|
||||
(:images subs)
|
||||
(:link-previews? subs)
|
||||
(:reply subs)
|
||||
(:edit subs)])
|
||||
[rn/view
|
||||
{:style style/composer-sheet-and-jump-to-container}
|
||||
[sub-view/shell-button state]
|
||||
[gesture/gesture-detector
|
||||
{:gesture (drag-gesture/drag-gesture props state animations subs dimensions keyboard-shown)}
|
||||
[reanimated/view
|
||||
{:style (style/sheet-container insets state animations)
|
||||
:on-layout #(handler/layout % state blur-height)}
|
||||
[sub-view/bar]
|
||||
[gesture/gesture-detector
|
||||
{:gesture (drag-gesture/drag-gesture props state animations subs dimensions keyboard-shown)}
|
||||
[reanimated/view
|
||||
{:style (style/sheet-container insets state animations)
|
||||
:on-layout #(handler/layout % state blur-height)}
|
||||
[sub-view/bar]
|
||||
(when chat-screen-loaded?
|
||||
[:<>
|
||||
[reply/view state]
|
||||
[edit/view state]])
|
||||
[reanimated/touchable-opacity
|
||||
{:active-opacity 1
|
||||
:on-press (when @(:input-ref props) #(.focus ^js @(:input-ref props)))
|
||||
:style (style/input-container (:height animations) max-height)
|
||||
:accessibility-label :message-input-container}
|
||||
[rn/selectable-text-input
|
||||
{:ref #(reset! (:selectable-input-ref props) %)
|
||||
:menu-items @(:menu-items state)
|
||||
:style (style/input-view state)}
|
||||
[rn/text-input
|
||||
{:ref #(reset! (:input-ref props) %)
|
||||
:default-value @(:text-value state)
|
||||
:on-focus #(handler/focus props state animations dimensions)
|
||||
:on-blur #(handler/blur state animations dimensions subs)
|
||||
:on-content-size-change #(handler/content-size-change %
|
||||
state
|
||||
animations
|
||||
subs
|
||||
dimensions
|
||||
(or keyboard-shown (:edit subs)))
|
||||
:on-scroll #(handler/scroll % props state animations dimensions)
|
||||
:on-change-text #(handler/change-text % props state)
|
||||
:on-selection-change #(handler/selection-change % props state)
|
||||
:on-selection #(selection/on-selection % props state)
|
||||
:keyboard-appearance (theme/theme-value :light :dark)
|
||||
:max-height max-height
|
||||
:max-font-size-multiplier 1
|
||||
:multiline true
|
||||
:placeholder (i18n/label :t/type-something)
|
||||
:placeholder-text-color (colors/theme-colors colors/neutral-30 colors/neutral-50)
|
||||
:style (style/input-text props state subs max-height)
|
||||
:max-length constants/max-text-size
|
||||
:accessibility-label :chat-message-input}]]
|
||||
(when chat-screen-loaded?
|
||||
[:<>
|
||||
[reply/view state]
|
||||
[edit/view state]])
|
||||
[reanimated/touchable-opacity
|
||||
{:active-opacity 1
|
||||
:on-press (when @(:input-ref props) #(.focus ^js @(:input-ref props)))
|
||||
:style (style/input-container (:height animations) max-height)
|
||||
:accessibility-label :message-input-container}
|
||||
[rn/selectable-text-input
|
||||
{:ref #(reset! (:selectable-input-ref props) %)
|
||||
:menu-items @(:menu-items state)
|
||||
:style (style/input-view state)}
|
||||
[rn/text-input
|
||||
{:ref #(reset! (:input-ref props) %)
|
||||
:default-value @(:text-value state)
|
||||
:on-focus #(handler/focus props state animations dimensions)
|
||||
:on-blur #(handler/blur state animations dimensions subs)
|
||||
:on-content-size-change #(handler/content-size-change %
|
||||
state
|
||||
animations
|
||||
subs
|
||||
dimensions
|
||||
(or keyboard-shown (:edit subs)))
|
||||
:on-scroll #(handler/scroll % props state animations dimensions)
|
||||
:on-change-text #(handler/change-text % props state)
|
||||
:on-selection-change #(handler/selection-change % props state)
|
||||
:on-selection #(selection/on-selection % props state)
|
||||
:keyboard-appearance (theme/theme-value :light :dark)
|
||||
:max-height max-height
|
||||
:max-font-size-multiplier 1
|
||||
:multiline true
|
||||
:placeholder (i18n/label :t/type-something)
|
||||
:placeholder-text-color (colors/theme-colors colors/neutral-30 colors/neutral-50)
|
||||
:style (style/input-text props state subs max-height)
|
||||
:max-length constants/max-text-size
|
||||
:accessibility-label :chat-message-input}]]
|
||||
(when chat-screen-loaded?
|
||||
[:<>
|
||||
[gradients/view props state animations show-bottom-gradient?]
|
||||
[link-preview/view]
|
||||
[images/images-list]])]
|
||||
[:f> actions/view props state animations window-height insets subs]]]]]))
|
||||
[gradients/view props state animations show-bottom-gradient?]
|
||||
[link-preview/view]
|
||||
[images/images-list]])]
|
||||
[actions/view props state animations window-height insets subs]]]]))
|
||||
|
||||
(defn composer
|
||||
[insets]
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
:padding-horizontal 20}}
|
||||
[quo/group-avatar
|
||||
{:customization-color color
|
||||
:size :size/s-32}]
|
||||
:size :small}]
|
||||
[quo/text
|
||||
{:weight :semi-bold
|
||||
:size :heading-1
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
(assoc :ring? false))])
|
||||
[quo/group-avatar
|
||||
{:customization-color color
|
||||
:size :size/s-32}]))
|
||||
:size :small}]))
|
||||
|
||||
(defn notification
|
||||
[{:keys [muted group-chat unviewed-messages-count unviewed-mentions-count]}]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
(ns status-im2.contexts.chat.home.view
|
||||
(:require [oops.core :as oops]
|
||||
[quo2.theme :as quo.theme]
|
||||
[quo2.theme :as theme]
|
||||
[re-frame.core :as re-frame]
|
||||
[react-native.core :as rn]
|
||||
[react-native.reanimated :as reanimated]
|
||||
@@ -27,32 +27,31 @@
|
||||
(filter k)
|
||||
(sort-by :timestamp >))))
|
||||
|
||||
(defn empty-state-content
|
||||
[theme]
|
||||
(def empty-state-content
|
||||
#:tab{:contacts
|
||||
{:title (i18n/label :t/no-contacts)
|
||||
:description (i18n/label :t/no-contacts-description)
|
||||
:image (resources/get-image
|
||||
(quo.theme/theme-value :no-contacts-light :no-contacts-dark theme))}
|
||||
(theme/theme-value :no-contacts-light :no-contacts-dark))}
|
||||
:groups
|
||||
{:title (i18n/label :t/no-group-chats)
|
||||
:description (i18n/label :t/no-group-chats-description)
|
||||
:image (resources/get-image
|
||||
(quo.theme/theme-value :no-group-chats-light :no-group-chats-dark theme))}
|
||||
(theme/theme-value :no-group-chats-light :no-group-chats-dark))}
|
||||
:recent
|
||||
{:title (i18n/label :t/no-messages)
|
||||
:description (i18n/label :t/no-messages-description)
|
||||
:image (resources/get-image
|
||||
(quo.theme/theme-value :no-messages-light :no-messages-dark theme))}})
|
||||
(theme/theme-value :no-messages-light :no-messages-dark))}})
|
||||
|
||||
(defn chats
|
||||
[{:keys [theme selected-tab set-scroll-ref scroll-shared-value]}]
|
||||
[{:keys [selected-tab set-scroll-ref scroll-shared-value]}]
|
||||
(let [unfiltered-items (rf/sub [:chats-stack-items])
|
||||
items (filter-and-sort-items-by-tab selected-tab unfiltered-items)]
|
||||
(if (empty? items)
|
||||
[common.home/empty-state-image
|
||||
{:selected-tab selected-tab
|
||||
:tab->content (empty-state-content theme)}]
|
||||
:tab->content empty-state-content}]
|
||||
[reanimated/flat-list
|
||||
{:ref set-scroll-ref
|
||||
:key-fn #(or (:chat-id %) (:public-key %) (:id %))
|
||||
@@ -82,12 +81,12 @@
|
||||
item]))
|
||||
|
||||
(defn contacts
|
||||
[{:keys [theme pending-contact-requests set-scroll-ref scroll-shared-value]}]
|
||||
[{:keys [pending-contact-requests set-scroll-ref scroll-shared-value]}]
|
||||
(let [items (rf/sub [:contacts/active-sections])]
|
||||
(if (and (empty? items) (empty? pending-contact-requests))
|
||||
[common.home/empty-state-image
|
||||
{:selected-tab :tab/contacts
|
||||
:tab->content (empty-state-content theme)}]
|
||||
:tab->content empty-state-content}]
|
||||
[rn/section-list
|
||||
{:ref set-scroll-ref
|
||||
:key-fn :public-key
|
||||
@@ -118,8 +117,8 @@
|
||||
:title (i18n/label :t/invite-friends-to-status)
|
||||
:description (i18n/label :t/share-invite-link)}})
|
||||
|
||||
(defn- f-view-internal
|
||||
[{:keys [theme]}]
|
||||
(defn home
|
||||
[]
|
||||
(let [scroll-ref (atom nil)
|
||||
set-scroll-ref #(reset! scroll-ref %)]
|
||||
(fn []
|
||||
@@ -132,13 +131,11 @@
|
||||
[contacts
|
||||
{:pending-contact-requests pending-contact-requests
|
||||
:set-scroll-ref set-scroll-ref
|
||||
:scroll-shared-value scroll-shared-value
|
||||
:theme theme}]
|
||||
:scroll-shared-value scroll-shared-value}]
|
||||
[chats
|
||||
{:selected-tab selected-tab
|
||||
:set-scroll-ref set-scroll-ref
|
||||
:scroll-shared-value scroll-shared-value
|
||||
:theme theme}])
|
||||
:scroll-shared-value scroll-shared-value}])
|
||||
[:f> common.home.banner/animated-banner
|
||||
{:content banner-data
|
||||
:customization-color customization-color
|
||||
@@ -156,9 +153,3 @@
|
||||
:selected-tab selected-tab
|
||||
:on-tab-change (fn [tab] (rf/dispatch [:messages-home/select-tab tab]))
|
||||
:scroll-shared-value scroll-shared-value}]]))))
|
||||
|
||||
(defn- internal-chats-home-view
|
||||
[params]
|
||||
[:f> f-view-internal params])
|
||||
|
||||
(def view (quo.theme/with-theme internal-chats-home-view))
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]
|
||||
[quo2.core :as quo]
|
||||
[status-im2.contexts.shell.jump-to.constants :as jump-to.constants]
|
||||
[quo2.components.drawers.permission-context.view :as permission-context]
|
||||
[status-im2.constants :as constants]
|
||||
[react-native.core :as rn]
|
||||
@@ -38,13 +37,13 @@
|
||||
(= contact-request-state
|
||||
constants/contact-request-state-sent)
|
||||
(i18n/label :t/contact-request-chat-pending))]]
|
||||
[quo/floating-shell-button
|
||||
{:jump-to
|
||||
{:on-press (fn []
|
||||
(when config/shell-navigation-disabled?
|
||||
(rf/dispatch [:chat/close true]))
|
||||
(rf/dispatch [:shell/navigate-to-jump-to]))
|
||||
:customization-color customization-color
|
||||
:label (i18n/label :t/jump-to)}}
|
||||
{:position :absolute
|
||||
:top (- jump-to.constants/floating-shell-button-height)}]]))
|
||||
[rn/view {:position :absolute :top -36 :align-self :center}
|
||||
[quo/floating-shell-button
|
||||
{:jump-to
|
||||
{:on-press (fn []
|
||||
(when config/shell-navigation-disabled?
|
||||
(rf/dispatch [:chat/close true]))
|
||||
(rf/dispatch [:shell/navigate-to-jump-to]))
|
||||
:customization-color customization-color
|
||||
:label (i18n/label :t/jump-to)}}
|
||||
{}]]]))
|
||||
|
||||
@@ -13,14 +13,3 @@
|
||||
|
||||
(and (not in-pinned-view?) (or mentioned pinned-by last-in-group?))
|
||||
(assoc :margin-top 8))))
|
||||
|
||||
(defn user-message-content
|
||||
[{:keys [first-in-group? outgoing outgoing-status]}]
|
||||
{:border-radius 16
|
||||
:padding-horizontal 8
|
||||
:padding-vertical (if first-in-group?
|
||||
8
|
||||
4)
|
||||
:opacity (if (and outgoing (= outgoing-status :sending))
|
||||
0.5
|
||||
1)})
|
||||
|
||||
@@ -134,10 +134,9 @@
|
||||
:message-sending
|
||||
:message-sent)
|
||||
:underlay-color (colors/theme-colors colors/neutral-5 colors/neutral-90)
|
||||
:style (style/user-message-content
|
||||
{:first-in-group? (:first-in-group? message-data)
|
||||
:outgoing outgoing
|
||||
:outgoing-status outgoing-status})
|
||||
:style {:border-radius 16
|
||||
:padding 8
|
||||
:opacity (if (and outgoing (= outgoing-status :sending)) 0.5 1)}
|
||||
:on-press (fn []
|
||||
(if (and platform/ios? keyboard-shown?)
|
||||
(rn/dismiss-keyboard!)
|
||||
|
||||
@@ -12,11 +12,10 @@
|
||||
[status-im.ui.screens.chat.group :as chat.group]
|
||||
[status-im.ui.screens.chat.message.gap :as message.gap]
|
||||
[status-im2.constants :as constants]
|
||||
[status-im2.contexts.chat.composer.constants :as composer.constants]
|
||||
[status-im2.contexts.chat.messages.content.view :as message]
|
||||
[status-im2.contexts.chat.messages.list.state :as state]
|
||||
[status-im2.contexts.chat.messages.list.style :as style]
|
||||
[status-im2.contexts.shell.jump-to.constants :as jump-to.constants]
|
||||
[status-im2.contexts.chat.composer.constants :as composer.constants]
|
||||
[status-im2.contexts.chat.messages.navigation.style :as navigation.style]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
@@ -25,6 +24,7 @@
|
||||
(defonce ^:const loading-indicator-extra-spacing 250)
|
||||
(defonce ^:const loading-indicator-page-loading-height 100)
|
||||
(defonce ^:const scroll-animation-input-range [50 125])
|
||||
(defonce ^:const spacing-between-composer-and-content 64)
|
||||
(defonce ^:const min-message-height 32)
|
||||
|
||||
(defonce messages-list-ref (atom nil))
|
||||
@@ -129,14 +129,15 @@
|
||||
[insets able-to-send-message?]
|
||||
[rn/view
|
||||
{:background-color (colors/theme-colors colors/white colors/neutral-95)
|
||||
:margin-bottom (when platform/ios? (- style/overscroll-cover-height))
|
||||
:margin-bottom (- 0
|
||||
(:top insets)
|
||||
(when platform/ios? style/overscroll-cover-height))
|
||||
:height (+ (if able-to-send-message?
|
||||
(+ composer.constants/composer-default-height
|
||||
jump-to.constants/floating-shell-button-height
|
||||
spacing-between-composer-and-content
|
||||
(:bottom insets))
|
||||
(- 70 (:bottom insets)))
|
||||
(when platform/ios?
|
||||
(- style/overscroll-cover-height (:top insets))))}])
|
||||
(when platform/ios? style/overscroll-cover-height))}])
|
||||
|
||||
(defn f-list-footer-avatar
|
||||
[{:keys [scroll-y display-name online? profile-picture]}]
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
:on-press (fn []
|
||||
(if can-join?
|
||||
(do
|
||||
(rf/dispatch [:communities/request-to-join id])
|
||||
(rf/dispatch [:communities/join id])
|
||||
(rf/dispatch [:navigate-back]))
|
||||
(do (and can-request-access?
|
||||
(not pending?)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
(ns status-im2.contexts.communities.home.view
|
||||
(:require [oops.core :as oops]
|
||||
[quo2.core :as quo]
|
||||
[quo2.theme :as quo.theme]
|
||||
[quo2.theme :as theme]
|
||||
[react-native.core :as rn]
|
||||
[react-native.reanimated :as reanimated]
|
||||
[status-im2.common.home.banner.view :as common.home.banner]
|
||||
@@ -37,9 +37,7 @@
|
||||
{:id :pending :label (i18n/label :t/pending) :accessibility-label :pending-tab}
|
||||
{:id :opened :label (i18n/label :t/opened) :accessibility-label :opened-tab}])
|
||||
|
||||
|
||||
(defn empty-state-content
|
||||
[theme]
|
||||
(def empty-state-content
|
||||
{:joined
|
||||
{:title (i18n/label :t/no-communities)
|
||||
:description [:<>
|
||||
@@ -47,21 +45,18 @@
|
||||
(i18n/label :t/no-communities-description-strikethrough)]
|
||||
" "
|
||||
(i18n/label :t/no-communities-description)]
|
||||
:image (resources/get-image (quo.theme/theme-value :no-communities-light
|
||||
:no-communities-dark
|
||||
theme))}
|
||||
:image (resources/get-image (theme/theme-value :no-communities-light
|
||||
:no-communities-dark))}
|
||||
:pending
|
||||
{:title (i18n/label :t/no-pending-communities)
|
||||
:description (i18n/label :t/no-pending-communities-description)
|
||||
:image (resources/get-image (quo.theme/theme-value :no-pending-communities-light
|
||||
:no-pending-communities-dark
|
||||
theme))}
|
||||
:image (resources/get-image (theme/theme-value :no-pending-communities-light
|
||||
:no-pending-communities-dark))}
|
||||
:opened
|
||||
{:title (i18n/label :t/no-opened-communities)
|
||||
:description (i18n/label :t/no-opened-communities-description)
|
||||
:image (resources/get-image (quo.theme/theme-value :no-opened-communities-light
|
||||
:no-opened-communities-dark
|
||||
theme))}})
|
||||
:image (resources/get-image (theme/theme-value :no-opened-communities-light
|
||||
:no-opened-communities-dark))}})
|
||||
|
||||
(def ^:private banner-data
|
||||
{:title-props
|
||||
@@ -75,8 +70,8 @@
|
||||
:banner (resources/get-image :discover)
|
||||
:accessibility-label :communities-home-discover-card}})
|
||||
|
||||
(defn- f-view-internal
|
||||
[{:keys [theme]}]
|
||||
(defn home
|
||||
[]
|
||||
(let [flat-list-ref (atom nil)
|
||||
set-flat-list-ref #(reset! flat-list-ref %)]
|
||||
(fn []
|
||||
@@ -92,7 +87,7 @@
|
||||
(if (empty? selected-items)
|
||||
[common.home/empty-state-image
|
||||
{:selected-tab selected-tab
|
||||
:tab->content (empty-state-content theme)}]
|
||||
:tab->content empty-state-content}]
|
||||
[reanimated/flat-list
|
||||
{:ref set-flat-list-ref
|
||||
:key-fn :id
|
||||
@@ -114,9 +109,3 @@
|
||||
:selected-tab selected-tab
|
||||
:on-tab-change (fn [tab] (rf/dispatch [:communities/select-tab tab]))
|
||||
:scroll-shared-value scroll-shared-value}]]))))
|
||||
|
||||
(defn- internal-communities-home-view
|
||||
[params]
|
||||
[:f> f-view-internal params])
|
||||
|
||||
(def view (quo.theme/with-theme internal-communities-home-view))
|
||||
|
||||
@@ -367,4 +367,4 @@
|
||||
:customization-color customization-color
|
||||
:label (i18n/label :t/jump-to)}}
|
||||
{:position :absolute
|
||||
:bottom 34}]]))
|
||||
:bottom 41}]]))
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]
|
||||
[oops.core :refer [oget]]
|
||||
[react-native.platform :as platform]
|
||||
[status-im2.common.resources :as resources]
|
||||
[status-im.async-storage.core :as async-storage]
|
||||
[status-im2.contexts.shell.jump-to.state :as shell.state]
|
||||
@@ -89,9 +88,10 @@
|
||||
(when dark-overlay?
|
||||
[blur/view
|
||||
{:style style/background-blur-overlay
|
||||
:blur-amount (if platform/android? 30 20)
|
||||
:blur-radius (if platform/android? 25 10)
|
||||
:blur-amount 30
|
||||
:blur-radius 25
|
||||
:blur-type :transparent
|
||||
:overlay-color :transparent}])]))
|
||||
|
||||
(defn view [dark-overlay?] [:f> f-view dark-overlay?])
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
[react-native.blur :as blur]
|
||||
[react-native.core :as rn]
|
||||
[reagent.core :as reagent]
|
||||
[react-native.platform :as platform]
|
||||
[status-im2.contexts.onboarding.common.overlay.style :as style]
|
||||
[status-im2.constants :as constants]))
|
||||
|
||||
@@ -62,7 +61,7 @@
|
||||
:style (style/blur-container opacity)}
|
||||
[blur/view
|
||||
{:blur-amount @blur-amount
|
||||
:blur-radius (if platform/android? 25 10)
|
||||
:blur-radius 25
|
||||
:blur-type :transparent
|
||||
:overlay-color :transparent
|
||||
:style style/blur-style}]]))
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
|
||||
(defn show-button-background
|
||||
[keyboard-height keyboard-shown content-scroll-y]
|
||||
[keyboard-height keyboard-shown]
|
||||
(let [button-container-height 64
|
||||
keyboard-view-height (+ keyboard-height button-container-height)]
|
||||
(when keyboard-shown
|
||||
@@ -60,7 +60,7 @@
|
||||
(< (- @scroll-view-height button-container-height) @content-container-height)
|
||||
|
||||
platform/ios?
|
||||
(< (- @scroll-view-height keyboard-view-height) (- @content-container-height content-scroll-y))
|
||||
(< (- @scroll-view-height keyboard-view-height) @content-container-height)
|
||||
|
||||
:else
|
||||
false))))
|
||||
@@ -93,7 +93,6 @@
|
||||
(defn- f-page
|
||||
[{:keys [onboarding-profile-data navigation-bar-top]}]
|
||||
(reagent/with-let [show-keyboard? (reagent/atom false)
|
||||
content-scroll-y (reagent/atom 0)
|
||||
show-listener (oops/ocall rn/keyboard
|
||||
"addListener"
|
||||
(if platform/android?
|
||||
@@ -130,8 +129,7 @@
|
||||
:else :success)
|
||||
{:keys [keyboard-shown keyboard-height]} (hooks/use-keyboard)
|
||||
show-background? (show-button-background keyboard-height
|
||||
keyboard-shown
|
||||
@content-scroll-y)]
|
||||
keyboard-shown)]
|
||||
[rn/view {:style style/page-container}
|
||||
[navigation-bar/navigation-bar
|
||||
{:stack-id :new-to-status
|
||||
@@ -139,12 +137,7 @@
|
||||
[rn/scroll-view
|
||||
{:on-layout (fn [event]
|
||||
(let [height (oops/oget event "nativeEvent.layout.height")]
|
||||
(reset! scroll-view-height height)
|
||||
(reset! content-scroll-y 0)))
|
||||
:on-scroll (fn [event]
|
||||
(let [y (oops/oget event "nativeEvent.contentOffset.y")]
|
||||
(reset! content-scroll-y y)))
|
||||
:scroll-event-throttle 64
|
||||
(reset! scroll-view-height height)))
|
||||
:content-container-style {:flexGrow 1}}
|
||||
[rn/view
|
||||
{:on-layout (fn [event]
|
||||
|
||||
@@ -125,8 +125,7 @@
|
||||
:container-style {:top 40
|
||||
:left 20}
|
||||
:layers (:generate-keys resources/parallax-video)
|
||||
:disable-parallax? true
|
||||
:enable-looping? false}]
|
||||
:disable-parallax? true}]
|
||||
[:f> f-page-title insets]])
|
||||
|
||||
(defn f-simple-page
|
||||
|
||||
@@ -10,16 +10,16 @@
|
||||
[{:label "Size"
|
||||
:key :size
|
||||
:type :select
|
||||
:options [{:key :size/s-20
|
||||
:value "20"}
|
||||
{:key :size/s-28
|
||||
:value "28"}
|
||||
{:key :size/s-32
|
||||
:value "32"}
|
||||
{:key :size/s-48
|
||||
:value "48"}
|
||||
{:key :size/s-80
|
||||
:value "80"}]}
|
||||
:options [{:key 20
|
||||
:value 20}
|
||||
{:key 28
|
||||
:value 28}
|
||||
{:key 32
|
||||
:value 32}
|
||||
{:key 48
|
||||
:value 48}
|
||||
{:key 80
|
||||
:value 80}]}
|
||||
{:label "Avatar"
|
||||
:key :picture?
|
||||
:type :boolean}
|
||||
@@ -31,7 +31,7 @@
|
||||
[]
|
||||
(let [state (reagent/atom {:theme :light
|
||||
:customization-color :blue
|
||||
:size :size/s-20
|
||||
:size 20
|
||||
:picture? false})]
|
||||
(fn []
|
||||
[rn/touchable-without-feedback {:on-press rn/dismiss-keyboard!}
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
(ns status-im2.contexts.quo-preview.buttons.wallet-button
|
||||
(:require
|
||||
[quo2.core :as quo]
|
||||
[quo2.foundations.colors :as colors]
|
||||
[react-native.core :as rn]
|
||||
[reagent.core :as reagent]
|
||||
[status-im2.contexts.quo-preview.preview :as preview]))
|
||||
|
||||
(def descriptor
|
||||
[{:label "Disabled?:"
|
||||
:key :disabled?
|
||||
:type :boolean}])
|
||||
|
||||
(defn cool-preview
|
||||
[]
|
||||
(let [state (reagent/atom {:icon :i/placeholder
|
||||
:on-press #(js/alert "pressed")
|
||||
:on-long-press #(js/alert "long pressed")})]
|
||||
(fn []
|
||||
[rn/touchable-without-feedback {:on-press rn/dismiss-keyboard!}
|
||||
[rn/view {:flex 1 :padding-bottom 20}
|
||||
[rn/view {:height 200}
|
||||
[preview/customizer state descriptor]]
|
||||
[rn/view
|
||||
{:flex 1
|
||||
:align-items :center
|
||||
:justify-content :center}
|
||||
[quo/wallet-button @state]]]])))
|
||||
|
||||
(defn preview
|
||||
[]
|
||||
[rn/view
|
||||
{:background-color (colors/theme-colors colors/white colors/neutral-95)
|
||||
:flex 1}
|
||||
[cool-preview]])
|
||||
@@ -1,30 +0,0 @@
|
||||
(ns status-im2.contexts.quo-preview.buttons.wallet-ctas
|
||||
(:require
|
||||
[quo2.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[reagent.core :as reagent]))
|
||||
|
||||
(defn cool-preview
|
||||
[]
|
||||
(let [state (reagent/atom {:buy-action #(js/alert "Buy button pressed")
|
||||
:send-action #(js/alert "Send button pressed")
|
||||
:receive-action #(js/alert "Receive button pressed")
|
||||
:bridge-action #(js/alert "Bridge button pressed")})]
|
||||
(fn []
|
||||
[rn/touchable-without-feedback {:on-press rn/dismiss-keyboard!}
|
||||
[rn/view {:style {:padding-bottom 150}}
|
||||
[rn/view
|
||||
{:style {:padding-vertical 60
|
||||
:flex-direction :row
|
||||
:justify-content :center}}
|
||||
[quo/wallet-ctas @state]]]])))
|
||||
|
||||
(defn preview
|
||||
[]
|
||||
[rn/view
|
||||
{:style {:flex 1}}
|
||||
[rn/flat-list
|
||||
{:flex 1
|
||||
:keyboard-should-persist-taps :always
|
||||
:header [cool-preview]
|
||||
:key-fn str}]])
|
||||
@@ -1,44 +1,21 @@
|
||||
(ns status-im2.contexts.quo-preview.gradient.gradient-cover
|
||||
(:require [quo2.core :as quo]
|
||||
(:require [quo2.components.colors.color-picker.view :as color-picker]
|
||||
[quo2.components.gradient.gradient-cover.view :as gradient-cover]
|
||||
[quo2.foundations.colors :as colors]
|
||||
[quo2.theme :as quo.theme]
|
||||
[react-native.blur :as blur]
|
||||
[react-native.core :as rn]
|
||||
[reagent.core :as reagent]
|
||||
[status-im2.common.resources :as resources]
|
||||
[status-im2.contexts.quo-preview.preview :as preview]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn render-action-sheet
|
||||
[]
|
||||
[:<>
|
||||
[rn/view {:style {:align-items :center}}
|
||||
[quo/summary-info
|
||||
{:type :status-account
|
||||
:networks? false
|
||||
:account-props {:customization-color :purple
|
||||
:size 32
|
||||
:emoji "🍑"
|
||||
:type :default
|
||||
:name "Collectibles vault"
|
||||
:address "0x0ah...78b"}}]]
|
||||
[quo/action-drawer
|
||||
[[{:icon :i/edit
|
||||
:label "Edit account"
|
||||
:on-press #(js/alert "Edit account")}
|
||||
{:icon :i/copy
|
||||
:label "Copy address"
|
||||
:on-press #(js/alert "Copy address")}
|
||||
{:icon :i/share
|
||||
:label "Share account"
|
||||
:on-press #(js/alert "Share account")}
|
||||
{:icon :i/delete
|
||||
:label "Remove account"
|
||||
:danger? true
|
||||
:on-press #(js/alert "Remove account")}]]]])
|
||||
[status-im2.contexts.quo-preview.preview :as preview]))
|
||||
|
||||
(def descriptor
|
||||
[(preview/customization-color-option)
|
||||
[{:label "Customization color:"
|
||||
:key :customization-color
|
||||
:type :select
|
||||
:options (mapv (fn [color]
|
||||
{:key color :value color})
|
||||
color-picker/color-list)}
|
||||
{:label "Blur (dark only)?"
|
||||
:key :blur?
|
||||
:type :boolean}])
|
||||
@@ -74,21 +51,14 @@
|
||||
:bottom 0
|
||||
:padding-vertical 40}
|
||||
:blur-type :dark}
|
||||
[quo/gradient-cover @state]]]
|
||||
[gradient-cover/view @state]]]
|
||||
[rn/view
|
||||
{:style {:padding-vertical 20
|
||||
:padding-horizontal 16}}
|
||||
[quo/color-picker
|
||||
[color-picker/view
|
||||
{:blur? @blur?
|
||||
:selected @customization-color
|
||||
:on-change #(reset! customization-color %)}]]
|
||||
[quo/button
|
||||
{:container-style {:margin-horizontal 40}
|
||||
:on-press #(rf/dispatch [:show-bottom-sheet
|
||||
{:content (fn [] [render-action-sheet])
|
||||
:gradient-cover? true
|
||||
:customization-color @customization-color}])}
|
||||
"See in bottom sheet"]])]))
|
||||
:on-change #(reset! customization-color %)}]]])]))
|
||||
|
||||
(defn preview-gradient-cover
|
||||
[]
|
||||
|
||||
@@ -20,8 +20,6 @@
|
||||
[status-im2.contexts.quo-preview.buttons.slide-button :as slide-button]
|
||||
[status-im2.contexts.quo-preview.buttons.dynamic-button :as dynamic-button]
|
||||
[status-im2.contexts.quo-preview.buttons.predictive-keyboard :as predictive-keyboard]
|
||||
[status-im2.contexts.quo-preview.buttons.wallet-button :as wallet-button]
|
||||
[status-im2.contexts.quo-preview.buttons.wallet-ctas :as wallet-ctas]
|
||||
[status-im2.contexts.quo-preview.calendar.calendar :as calendar]
|
||||
[status-im2.contexts.quo-preview.calendar.calendar-day :as calendar-day]
|
||||
[status-im2.contexts.quo-preview.calendar.calendar-year :as calendar-year]
|
||||
@@ -112,10 +110,8 @@
|
||||
[status-im2.contexts.quo-preview.gradient.gradient-cover :as gradient-cover]
|
||||
[status-im2.contexts.quo-preview.wallet.account-overview :as account-overview]
|
||||
[status-im2.contexts.quo-preview.wallet.account-card :as account-card]
|
||||
[status-im2.contexts.quo-preview.wallet.keypair :as keypair]
|
||||
[status-im2.contexts.quo-preview.wallet.network-amount :as network-amount]
|
||||
[status-im2.contexts.quo-preview.wallet.network-bridge :as network-bridge]
|
||||
[status-im2.contexts.quo-preview.wallet.network-link :as network-link]
|
||||
[status-im2.contexts.quo-preview.wallet.progress-bar :as progress-bar]
|
||||
[status-im2.contexts.quo-preview.wallet.summary-info :as summary-info]
|
||||
[status-im2.contexts.quo-preview.wallet.token-input :as token-input]
|
||||
@@ -150,11 +146,7 @@
|
||||
{:name :slide-button
|
||||
:component slide-button/preview-slide-button}
|
||||
{:name :predictive-keyboard
|
||||
:component predictive-keyboard/preview-predictive-keyboard}
|
||||
{:name :wallet-button
|
||||
:component wallet-button/preview}
|
||||
{:name :wallet-ctas
|
||||
:component wallet-ctas/preview}]
|
||||
:component predictive-keyboard/preview-predictive-keyboard}]
|
||||
:browser [{:name :browser-input
|
||||
:component browser-input/preview-browser-input}]
|
||||
:calendar [{:name :calendar
|
||||
@@ -339,15 +331,10 @@
|
||||
:component account-card/preview-account-card}
|
||||
{:name :account-overview
|
||||
:component account-overview/preview-account-overview}
|
||||
{:name :keypair
|
||||
:options {:topBar {:visible true}}
|
||||
:component keypair/preview}
|
||||
{:name :network-amount
|
||||
:component network-amount/preview}
|
||||
{:name :network-bridge
|
||||
:component network-bridge/preview}
|
||||
{:name :network-link
|
||||
:component network-link/preview}
|
||||
{:name :progress-bar
|
||||
:component progress-bar/preview}
|
||||
{:name :summary-info
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
(ns status-im2.contexts.quo-preview.navigation.floating-shell-button
|
||||
(:require [quo2.core :as quo]
|
||||
(:require [quo2.components.navigation.floating-shell-button :as quo2]
|
||||
[quo2.foundations.colors :as colors]
|
||||
[react-native.core :as rn]
|
||||
[react-native.reanimated :as reanimated]
|
||||
[reagent.core :as reagent]
|
||||
[utils.i18n :as i18n]
|
||||
[status-im2.contexts.quo-preview.preview :as preview]))
|
||||
@@ -42,6 +43,11 @@
|
||||
(= scroll-type :scroll-to-bottom)
|
||||
(assoc :scroll-to-bottom {:on-press #()})))
|
||||
|
||||
(defn- f-shell-button
|
||||
[state]
|
||||
[quo2/floating-shell-button (mock-data state)
|
||||
nil (reanimated/use-shared-value 1)])
|
||||
|
||||
(defn cool-preview
|
||||
[]
|
||||
(let [state (reagent/atom {:show-jump-to? true
|
||||
@@ -53,7 +59,7 @@
|
||||
[rn/view
|
||||
{:padding-vertical 60
|
||||
:align-items :center}
|
||||
[quo/floating-shell-button (mock-data @state) nil]]]])))
|
||||
[:f> f-shell-button @state]]]])))
|
||||
|
||||
(defn preview-floating-shell-button
|
||||
[]
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
|
||||
:group-avatar [quo2/group-avatar-tag (:label @state)
|
||||
{:blur? (:blur? @state)
|
||||
:size :size/s-20
|
||||
:size 20
|
||||
:customization-color :purple}]
|
||||
|
||||
:public-key [quo2/public-key-tag
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
(ns status-im2.contexts.quo-preview.wallet.keypair
|
||||
(:require
|
||||
[quo2.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[reagent.core :as reagent]
|
||||
[status-im2.contexts.quo-preview.preview :as preview]))
|
||||
|
||||
(def accounts
|
||||
[{:account-props {:customization-color :turquoise
|
||||
:size 32
|
||||
:emoji "\uD83C\uDFB2"
|
||||
:type :default
|
||||
:name "Trip to Vegas"
|
||||
:address "0x0ah...71a"}
|
||||
:networks [:ethereum :optimism]
|
||||
:state :default
|
||||
:action :none}
|
||||
{:account-props {:customization-color :purple
|
||||
:size 32
|
||||
:emoji "\uD83C\uDF7F"
|
||||
:type :default
|
||||
:name "My savings"
|
||||
:address "0x0ah...72b"}
|
||||
:networks [:ethereum :optimism]
|
||||
:state :default
|
||||
:action :none}
|
||||
{:account-props {:customization-color :army
|
||||
:size 32
|
||||
:emoji "\uD83D\uDCC8"
|
||||
:type :default
|
||||
:name "Coin vault"
|
||||
:address "0x0ah...73c"}
|
||||
:networks [:ethereum :optimism]
|
||||
:state :default
|
||||
:action :none}
|
||||
{:account-props {:customization-color :orange
|
||||
:size 32
|
||||
:emoji "\uD83C\uDFF0"
|
||||
:type :default
|
||||
:name "Crypto fortress"
|
||||
:address "0x0ah...74e"}
|
||||
:networks [:ethereum :optimism]
|
||||
:state :default
|
||||
:action :none}
|
||||
{:account-props {:customization-color :yellow
|
||||
:size 32
|
||||
:emoji "\uD83C\uDFDD️"
|
||||
:type :default
|
||||
:name "Block treasure"
|
||||
:address "0x0ah...75f"}
|
||||
:networks [:ethereum :optimism]
|
||||
:state :default
|
||||
:action :none}])
|
||||
|
||||
(def descriptor
|
||||
[{:label "Stored:"
|
||||
:key :stored
|
||||
:type :select
|
||||
:options [{:key :on-device
|
||||
:value "On device"}
|
||||
{:key :on-keycard
|
||||
:value "On Keycard"}]}
|
||||
{:label "Action:"
|
||||
:key :action
|
||||
:type :select
|
||||
:options [{:key :selector
|
||||
:value "Selector"}
|
||||
{:key :options
|
||||
:value "Options"}]}
|
||||
{:label "Type:"
|
||||
:key :type
|
||||
:type :select
|
||||
:options [{:key :default-keypair
|
||||
:value "Default keypair"}
|
||||
{:key :other
|
||||
:value "Other"}]}
|
||||
(preview/customization-color-option)])
|
||||
|
||||
(def default-details
|
||||
{:full-name "John Doe"
|
||||
:address "zQ3...6fBd2"})
|
||||
|
||||
(def other-details {:full-name "Metamask"})
|
||||
|
||||
(defn cool-preview
|
||||
[]
|
||||
(let [state (reagent/atom {:accounts accounts
|
||||
:customization-color :blue
|
||||
:type :default-keypair
|
||||
:stored :on-device
|
||||
:on-options-press #(js/alert "Options pressed")
|
||||
:action :selector})]
|
||||
(fn []
|
||||
[rn/touchable-without-feedback {:on-press rn/dismiss-keyboard!}
|
||||
[rn/view {:style {:padding-bottom 150}}
|
||||
[rn/view {:style {:flex 1}}
|
||||
[preview/customizer state descriptor]]
|
||||
[rn/view
|
||||
{:style {:padding-vertical 30
|
||||
:flex-direction :row
|
||||
:justify-content :center}}
|
||||
[quo/keypair
|
||||
(merge
|
||||
@state
|
||||
{:details (if (= (:type @state) :default-keypair) default-details other-details)})]]]])))
|
||||
|
||||
(defn preview
|
||||
[]
|
||||
[rn/view
|
||||
{:style {:flex 1}}
|
||||
[rn/flat-list
|
||||
{:flex 1
|
||||
:keyboard-should-persist-taps :always
|
||||
:header [cool-preview]
|
||||
:key-fn str}]])
|
||||
@@ -1,50 +0,0 @@
|
||||
(ns status-im2.contexts.quo-preview.wallet.network-link
|
||||
(:require
|
||||
[quo2.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[reagent.core :as reagent]
|
||||
[status-im2.contexts.quo-preview.preview :as preview]))
|
||||
|
||||
(def networks
|
||||
[{:key :ethereum
|
||||
:value "Ethereum"}
|
||||
{:key :optimism
|
||||
:value "Optimism"}
|
||||
{:key :arbitrum
|
||||
:vault "Arbitrum"}])
|
||||
|
||||
(def descriptor
|
||||
[{:label "Shape:"
|
||||
:key :shape
|
||||
:type :select
|
||||
:options [{:key :linear
|
||||
:value "Linear"}
|
||||
{:key :1x
|
||||
:value "1x"}
|
||||
{:key :2x
|
||||
:value "2x"}]}
|
||||
{:label "Source:"
|
||||
:key :source
|
||||
:type :select
|
||||
:options networks}
|
||||
{:label "Destination:"
|
||||
:key :destination
|
||||
:type :select
|
||||
:options networks}])
|
||||
|
||||
(defn preview
|
||||
[]
|
||||
(let [state (reagent/atom {:shape :linear
|
||||
:source :ethereum
|
||||
:destination :optimism})]
|
||||
(fn []
|
||||
[rn/view
|
||||
{:style {:flex 1
|
||||
:padding-horizontal 20}}
|
||||
[rn/view {:style {:min-height 150}}
|
||||
[preview/customizer state descriptor]]
|
||||
[rn/view
|
||||
{:style {:flex 1
|
||||
:padding-top 40
|
||||
:align-items :center}}
|
||||
[quo/network-link @state]]])))
|
||||
@@ -9,7 +9,7 @@
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(def tag-params
|
||||
{:size :size/s-20
|
||||
{:size 20
|
||||
:customization-color :blue
|
||||
:style style/user-avatar-tag
|
||||
:text-style style/user-avatar-tag-text
|
||||
|
||||
+3
-10
@@ -21,11 +21,9 @@
|
||||
(defn- get-header-text-and-context
|
||||
[community membership-status]
|
||||
(let [community-name (:name community)
|
||||
permissions (:permissions community)
|
||||
community-image (get-in community [:images :thumbnail :uri])
|
||||
community-context-tag [quo/context-tag common/tag-params community-image
|
||||
community-name]
|
||||
open? (not= 3 (:access permissions))]
|
||||
community-name]]
|
||||
(cond
|
||||
(= membership-status constants/activity-center-membership-status-idle)
|
||||
{:header-text (i18n/label :t/community-request-not-accepted)
|
||||
@@ -42,14 +40,9 @@
|
||||
community-context-tag]}
|
||||
|
||||
(= membership-status constants/activity-center-membership-status-accepted)
|
||||
{:header-text (i18n/label (if open?
|
||||
:t/join-open-community
|
||||
:t/community-request-accepted))
|
||||
{:header-text (i18n/label :t/community-request-accepted)
|
||||
:context [[quo/text {:style common-style/user-avatar-tag-text}
|
||||
(i18n/label (if open?
|
||||
:t/joined-community
|
||||
:t/community-request-accepted-body-text)
|
||||
(when open? {:community community-name}))]
|
||||
(i18n/label :t/community-request-accepted-body-text)]
|
||||
community-context-tag]}
|
||||
|
||||
:else nil)))
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
:context [[common/user-avatar-tag author]
|
||||
(i18n/label :t/added-you-to)
|
||||
[quo/group-avatar-tag chat-name
|
||||
{:size :size/s-20
|
||||
{:size 20
|
||||
:customization-color :purple}]]
|
||||
:items (when-not (or accepted dismissed)
|
||||
[{:type :button
|
||||
|
||||
@@ -40,10 +40,6 @@
|
||||
:justify-content :center
|
||||
:padding-bottom 20})
|
||||
|
||||
(def box { :background-color :red
|
||||
:height 100
|
||||
:width 100})
|
||||
|
||||
(def empty-title
|
||||
{:padding-bottom 2
|
||||
:color colors/white})
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
(ns status-im2.contexts.shell.activity-center.tabs.empty-tab.view
|
||||
(:require
|
||||
[react-native.blur :as blur]
|
||||
[utils.re-frame :as rf]
|
||||
[react-native.core :as rn]
|
||||
[quo2.core :as quo]
|
||||
[status-im2.contexts.shell.activity-center.style :as style]
|
||||
[utils.i18n :as i18n]
|
||||
[status-im2.contexts.shell.activity-center.notification-types :as types]
|
||||
[status-im2.common.resources :as resources]))
|
||||
(:require [utils.re-frame :as rf]
|
||||
[react-native.core :as rn]
|
||||
[quo2.core :as quo]
|
||||
[status-im2.contexts.shell.activity-center.style :as style]
|
||||
[utils.i18n :as i18n]
|
||||
[status-im2.contexts.shell.activity-center.notification-types :as types]
|
||||
[status-im2.common.resources :as resources]))
|
||||
|
||||
(def empty-tab-description
|
||||
{types/no-type (i18n/label :t/empty-notifications-all-tab)
|
||||
@@ -25,11 +23,8 @@
|
||||
(let [filter-type (rf/sub [:activity-center/filter-type])
|
||||
description (get empty-tab-description filter-type nil)]
|
||||
[rn/view {:style style/empty-container}
|
||||
[blur/view {:overlayColor :transparent} [rn/view {:style style/box}]]
|
||||
;[quo/empty-state
|
||||
; {:blur? true
|
||||
; :placeholder? true
|
||||
; :image (resources/get-image :no-notifications-dark)
|
||||
; :title (i18n/label :t/empty-notifications-title-unread)
|
||||
; :description description}]
|
||||
]))
|
||||
[quo/empty-state
|
||||
{:blur? true
|
||||
:image (resources/get-image :no-notifications-dark)
|
||||
:title (i18n/label :t/empty-notifications-title-unread)
|
||||
:description description}]]))
|
||||
|
||||
@@ -27,13 +27,10 @@
|
||||
:flex 1
|
||||
:accessibility-label :bottom-tabs})
|
||||
|
||||
(defn bottom-tabs-blur-overlay
|
||||
[height]
|
||||
(reanimated/apply-animations-to-style
|
||||
{:height height}
|
||||
{:position :absolute
|
||||
:left 0
|
||||
:right 0
|
||||
:bottom 0
|
||||
:height (utils/bottom-tabs-container-height)
|
||||
:background-color colors/neutral-100-opa-70-blur}))
|
||||
(def bottom-tabs-blur-overlay
|
||||
{:position :absolute
|
||||
:left 0
|
||||
:right 0
|
||||
:bottom 0
|
||||
:height (utils/bottom-tabs-extended-container-height)
|
||||
:background-color colors/neutral-100-opa-70})
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
(ns status-im2.contexts.shell.jump-to.components.bottom-tabs.view
|
||||
(:require [utils.re-frame :as rf]
|
||||
[react-native.core :as rn]
|
||||
[react-native.blur :as blur]
|
||||
[react-native.gesture :as gesture]
|
||||
[react-native.platform :as platform]
|
||||
[react-native.reanimated :as reanimated]
|
||||
[status-im2.contexts.shell.jump-to.utils :as utils]
|
||||
[status-im2.contexts.shell.jump-to.state :as state]
|
||||
@@ -14,8 +14,8 @@
|
||||
(defn blur-overlay-params
|
||||
[style]
|
||||
{:style style
|
||||
:blur-amount (if platform/android? 30 20)
|
||||
:blur-radius (if platform/android? 25 10)
|
||||
:blur-amount 30
|
||||
:blur-radius 25
|
||||
:blur-type :transparent
|
||||
:overlay-color :transparent})
|
||||
|
||||
@@ -53,15 +53,13 @@
|
||||
(gesture/number-of-taps 2)
|
||||
(gesture/on-start
|
||||
(fn [_event]
|
||||
(rf/dispatch [:messages-home/select-tab :tab/recent]))))
|
||||
bottom-tabs-blur-overlay-style (style/bottom-tabs-blur-overlay (:bottom-tabs-height
|
||||
shared-values))]
|
||||
(rf/dispatch [:messages-home/select-tab :tab/recent]))))]
|
||||
(utils/load-stack @state/selected-stack-id)
|
||||
(reanimated/set-shared-value (:pass-through? shared-values) pass-through?)
|
||||
[reanimated/view
|
||||
{:style (style/bottom-tabs-container pass-through? (:bottom-tabs-height shared-values))}
|
||||
(when pass-through?
|
||||
[reanimated/blur-view (blur-overlay-params bottom-tabs-blur-overlay-style)])
|
||||
[blur/view (blur-overlay-params style/bottom-tabs-blur-overlay)])
|
||||
[rn/view {:style (style/bottom-tabs)}
|
||||
[gesture/gesture-detector {:gesture communities-double-tab-gesture}
|
||||
[bottom-tab :i/communities :communities-stack shared-values notifications-data]]
|
||||
|
||||
@@ -28,8 +28,8 @@
|
||||
:z-index (get shared-values
|
||||
(get shell.constants/stacks-z-index-keywords stack-id))})}
|
||||
(case stack-id
|
||||
:communities-stack [:f> communities/view]
|
||||
:chats-stack [:f> chat/view]
|
||||
:communities-stack [:f> communities/home]
|
||||
:chats-stack [:f> chat/home]
|
||||
;NOTE temporary while we support old wallet
|
||||
:wallet-stack (if @state/load-new-wallet?
|
||||
[wallet-new/view]
|
||||
|
||||
@@ -61,4 +61,4 @@
|
||||
:left 0
|
||||
:right 0
|
||||
:top 0
|
||||
:background-color colors/neutral-100-opa-70-blur})
|
||||
:background-color colors/neutral-100-opa-70})
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
shell.constants/private-group-chat-card
|
||||
[quo/group-avatar
|
||||
{:customization-color customization-color
|
||||
:size :size/s-48
|
||||
:size :large
|
||||
:override-theme :dark}]
|
||||
|
||||
(shell.constants/community-card
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
(def ^:const shell-animation-time 200)
|
||||
(def ^:const switcher-card-size 160)
|
||||
(def ^:const floating-shell-button-height 44)
|
||||
|
||||
;; Bottom tabs
|
||||
(def ^:const bottom-tabs-container-height-android 57)
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
:label (i18n/label :t/jump-to)
|
||||
:customization-color (rf/sub [:profile/customization-color])}}
|
||||
{:position :absolute
|
||||
:bottom (utils/bottom-tabs-container-height)}
|
||||
:bottom (+ (utils/bottom-tabs-container-height) 12)}
|
||||
(:home-stack-opacity shared-values)])
|
||||
|
||||
(defn f-shell-stack
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"_comment": "Instead use: scripts/update-status-go.sh <rev>",
|
||||
"owner": "status-im",
|
||||
"repo": "status-go",
|
||||
"version": "v0.163.9",
|
||||
"commit-sha1": "f2f599fe867a0eba90aaa717a29bb6e99cb5749e",
|
||||
"src-sha256": "0p282pv2lz5f2b0vhpcx0nj74dp5mf7hb41l12js2hxsp21sprmj"
|
||||
"version": "7603b10fb902244899836a19d906cd573fb26093",
|
||||
"commit-sha1": "7603b10fb902244899836a19d906cd573fb26093",
|
||||
"src-sha256": "0asnapan03skhxr1r9cmj3q2rfa36sky1qzczficw34kb2icgj15"
|
||||
}
|
||||
|
||||
@@ -845,7 +845,7 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
|
||||
self.profile_1.just_fyi("Sending contact request via Profile > Contacts")
|
||||
for home in (self.home_1, self.home_2):
|
||||
home.navigate_back_to_home_view()
|
||||
home.click_system_back_button_until_element_is_shown()
|
||||
home.chats_tab.click()
|
||||
self.home_1.send_contact_request_via_bottom_sheet(self.public_key_2)
|
||||
|
||||
@@ -855,7 +855,7 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
self.profile_1.just_fyi("Sending message to contact via Messages > Recent")
|
||||
self.chat_1 = self.home_1.get_chat(self.username_2).click()
|
||||
self.chat_1.send_message('hey')
|
||||
self.home_2.navigate_back_to_home_view()
|
||||
self.home_2.click_system_back_button_until_element_is_shown()
|
||||
self.chat_2 = self.home_2.get_chat(self.username_1).click()
|
||||
self.message_1, self.message_2, self.message_3, self.message_4 = \
|
||||
"Message 1", "Message 2", "Message 3", "Message 4"
|
||||
@@ -919,7 +919,9 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
@marks.testrail_id(702782)
|
||||
def test_1_1_chat_emoji_send_reply_and_open_link(self):
|
||||
for chat in self.chat_1, self.chat_2:
|
||||
chat.navigate_back_to_chat_view()
|
||||
element = chat.chat_message_input
|
||||
if not element.is_element_displayed():
|
||||
chat.click_system_back_button_until_element_is_shown(element)
|
||||
self.home_1.just_fyi("Check that can send emoji in 1-1 chat")
|
||||
emoji_name = random.choice(list(emoji.EMOJI_UNICODE))
|
||||
emoji_unicode = emoji.EMOJI_UNICODE[emoji_name]
|
||||
@@ -1084,14 +1086,14 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
self.home_1.jump_to_messages_home()
|
||||
self.home_1.profile_button.click()
|
||||
self.profile_1.edit_profile_picture('sauce_logo.png')
|
||||
self.profile_1.navigate_back_to_home_view()
|
||||
self.profile_1.click_system_back_button_until_element_is_shown()
|
||||
self.profile_1.chats_tab.click()
|
||||
|
||||
self.chat_2.just_fyi("Send messages with non-latin symbols")
|
||||
self.home_1.jump_to_card_by_text(self.username_2)
|
||||
self.chat_1.send_message("just a text") # Sending a message here so the next ones will be in a separate line
|
||||
|
||||
self.home_2.navigate_back_to_home_view()
|
||||
self.home_2.click_system_back_button_until_element_is_shown()
|
||||
self.home_2.jump_to_card_by_text(self.username_1)
|
||||
messages = ['hello', '¿Cómo estás tu año?', 'ё, доброго вечерочка', '® æ ç ♥']
|
||||
[self.chat_2.send_message(message) for message in messages]
|
||||
@@ -1130,7 +1132,7 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
def test_1_1_chat_push_emoji(self):
|
||||
message_no_pn, message = 'No PN', 'Text push notification'
|
||||
|
||||
[home.navigate_back_to_home_view() for home in self.homes]
|
||||
[home.click_system_back_button_until_element_is_shown() for home in self.homes]
|
||||
self.home_2.profile_button.click()
|
||||
self.home_1.chats_tab.click()
|
||||
|
||||
@@ -1142,7 +1144,7 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
self.chat_1.send_message(message)
|
||||
|
||||
self.device_1.just_fyi("Device 1 puts app on background to receive emoji push notification")
|
||||
self.device_1.navigate_back_to_home_view()
|
||||
self.device_1.click_system_back_button_until_element_is_shown()
|
||||
self.device_1.profile_button.click()
|
||||
|
||||
self.device_2.just_fyi("Check text push notification and tap it")
|
||||
@@ -1180,7 +1182,7 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
|
||||
@marks.testrail_id(702855)
|
||||
def test_1_1_chat_edit_message(self):
|
||||
[home.navigate_back_to_home_view() for home in self.homes]
|
||||
[home.click_system_back_button_until_element_is_shown() for home in self.homes]
|
||||
self.chat_2.jump_to_card_by_text(self.username_1)
|
||||
self.chat_1.jump_to_card_by_text(self.username_2)
|
||||
|
||||
@@ -1235,7 +1237,7 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
except TimeoutException:
|
||||
self.errors.append(
|
||||
"%s can't share an image via Gmail." % ("Sender" if chat is self.chat_1 else "Receiver"))
|
||||
chat.navigate_back_to_chat_view()
|
||||
chat.click_system_back_button_until_element_is_shown(element="chat")
|
||||
|
||||
for chat in self.chat_1, self.chat_2:
|
||||
chat.just_fyi("Open the image and save it")
|
||||
@@ -1252,7 +1254,7 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
toast_element_text, chat.get_translation_by_key("photo-saved"), device_name))
|
||||
else:
|
||||
self.errors.append("Message about saving a photo is not shown for %s." % device_name)
|
||||
chat.navigate_back_to_chat_view()
|
||||
chat.click_system_back_button_until_element_is_shown(element="chat")
|
||||
|
||||
for chat in self.chat_1, self.chat_2:
|
||||
chat.just_fyi("Check that image is saved in gallery")
|
||||
@@ -1305,7 +1307,7 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
for chat in (self.chat_2, self.chat_1):
|
||||
if chat.chat_element_by_text(message_after_edit_1_1).is_element_displayed(30):
|
||||
self.errors.append("Deleted message is shown in chat view for 1-1 chat")
|
||||
self.chat_1.navigate_back_to_home_view()
|
||||
self.chat_1.click_system_back_button_until_element_is_shown()
|
||||
if self.home_1.element_by_text(message_after_edit_1_1).is_element_displayed(30):
|
||||
self.errors.append("Deleted message is shown on chat element on home screen")
|
||||
|
||||
@@ -1323,7 +1325,7 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
if pn_to_disappear:
|
||||
if not pn_to_disappear.is_element_disappeared(90):
|
||||
self.errors.append("Push notification was not removed after initial message deletion")
|
||||
[device.navigate_back_to_home_view() for device in (self.device_1, self.device_2)]
|
||||
[device.click_system_back_button_until_element_is_shown() for device in (self.device_1, self.device_2)]
|
||||
self.errors.verify_no_errors()
|
||||
|
||||
@marks.testrail_id(702783)
|
||||
@@ -1378,7 +1380,7 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
|
||||
@marks.testrail_id(703496)
|
||||
def test_1_1_chat_mute_chat(self):
|
||||
self.home_1.navigate_back_to_home_view()
|
||||
self.home_1.click_system_back_button_until_element_is_shown()
|
||||
self.home_1.chats_tab.click()
|
||||
self.home_1.just_fyi("Mute chat")
|
||||
self.home_1.mute_chat_long_press(self.username_2)
|
||||
@@ -1395,13 +1397,13 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
self.errors.append("Message '%s' is not shown in chat for receiver after mute" % muted_message)
|
||||
|
||||
self.chat_1.just_fyi("Unmute chat")
|
||||
self.chat_1.navigate_back_to_home_view()
|
||||
self.chat_1.click_system_back_button_until_element_is_shown()
|
||||
chat.long_press_element()
|
||||
if self.home_1.mute_chat_button.text != transl["unmute-chat"]:
|
||||
self.errors.append("Chat is not muted")
|
||||
expected_text = "Muted until you turn it back on"
|
||||
if not self.home_1.element_by_text(expected_text).is_element_displayed():
|
||||
self.errors.append("Text '%s' is not shown for muted chat" % expected_text)
|
||||
self.errors.append("Text '%s' is not shown for muted chat" %expected_text)
|
||||
self.home_1.mute_chat_button.click()
|
||||
|
||||
unmuted_message = "after unmute"
|
||||
@@ -1419,7 +1421,7 @@ class TestOneToOneChatMultipleSharedDevicesNewUi(MultipleSharedDeviceTestCase):
|
||||
|
||||
@marks.testrail_id(702784)
|
||||
def test_1_1_chat_delete_via_long_press_relogin(self):
|
||||
self.home_2.navigate_back_to_home_view()
|
||||
self.home_2.click_system_back_button_until_element_is_shown()
|
||||
self.home_2.chats_tab.click()
|
||||
|
||||
self.home_2.just_fyi("Deleting chat via delete button and check it will not reappear after relaunching app")
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import datetime
|
||||
|
||||
import pytest
|
||||
from _pytest.outcomes import Failed
|
||||
from selenium.common.exceptions import NoSuchElementException, TimeoutException
|
||||
@@ -178,7 +176,7 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
self.homes[0].just_fyi('Admin adds future members to contacts')
|
||||
|
||||
for i in range(3):
|
||||
self.homes[i].navigate_back_to_home_view()
|
||||
self.homes[i].click_system_back_button_until_element_is_shown()
|
||||
self.homes[i].chats_tab.click()
|
||||
|
||||
for i in range(1, 3):
|
||||
@@ -194,7 +192,7 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
)
|
||||
)
|
||||
for i in range(1, 3):
|
||||
self.homes[i].navigate_back_to_home_view()
|
||||
self.homes[i].click_system_back_button_until_element_is_shown()
|
||||
|
||||
self.homes[0].just_fyi('Admin creates group chat')
|
||||
self.chat_name = self.homes[0].get_random_chat_name()
|
||||
@@ -209,7 +207,7 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
@marks.testrail_id(702807)
|
||||
def test_group_chat_join_send_text_messages_push(self):
|
||||
message_to_admin = self.message_to_admin
|
||||
[self.homes[i].navigate_back_to_home_view() for i in range(3)]
|
||||
[self.homes[i].click_system_back_button_until_element_is_shown() for i in range(3)]
|
||||
self.homes[1].get_chat(self.chat_name).click()
|
||||
|
||||
self.chats[1].send_message(message_to_admin)
|
||||
@@ -232,7 +230,7 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
|
||||
@marks.testrail_id(703202)
|
||||
def test_group_chat_reactions(self):
|
||||
[self.homes[i].navigate_back_to_home_view() for i in range(3)]
|
||||
[self.homes[i].click_system_back_button_until_element_is_shown() for i in range(3)]
|
||||
[self.homes[i].get_chat(self.chat_name).click() for i in range(3)]
|
||||
message = "This is a test message to check some reactions."
|
||||
self.chats[0].just_fyi("Admin sends a message")
|
||||
@@ -284,7 +282,7 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
)
|
||||
except NoSuchElementException:
|
||||
self.errors.append("User profile was not opened from the list of reactions")
|
||||
self.chats[0].navigate_back_to_chat_view()
|
||||
self.chats[0].click_system_back_button_until_element_is_shown(element="chat")
|
||||
|
||||
self.chats[1].just_fyi("Member_1 removes 'thumbs-up' reaction and adds 'sad' one")
|
||||
self.chats[1].add_remove_same_reaction(message=message, emoji="thumbs-up")
|
||||
@@ -319,7 +317,7 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
|
||||
for chat in self.chats[1], self.chats[2]:
|
||||
chat.just_fyi("Just making the session not to quit")
|
||||
chat.navigate_back_to_home_view()
|
||||
chat.click_system_back_button_until_element_is_shown()
|
||||
|
||||
self.chats[0].just_fyi("Admin checks info about voted users after relogin")
|
||||
message_element.emojis_below_message(
|
||||
@@ -345,7 +343,7 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
|
||||
@marks.testrail_id(703297)
|
||||
def test_group_chat_send_image_save_and_share(self):
|
||||
[self.homes[i].navigate_back_to_home_view() for i in range(3)]
|
||||
[self.homes[i].click_system_back_button_until_element_is_shown() for i in range(3)]
|
||||
for i in range(3):
|
||||
self.homes[i].get_chat(self.chat_name).click()
|
||||
|
||||
@@ -373,9 +371,9 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
self.chats[0].wait_for_current_package_to_be('com.google.android.gm')
|
||||
except TimeoutException:
|
||||
self.errors.append("Admin can't share an image via Gmail.")
|
||||
self.chats[0].navigate_back_to_chat_view()
|
||||
self.chats[0].click_system_back_button_until_element_is_shown(element="chat")
|
||||
|
||||
self.chats[1].navigate_back_to_home_view()
|
||||
self.chats[1].click_system_back_button_until_element_is_shown()
|
||||
|
||||
self.chats[2].just_fyi("Member_2 opens the image and saves it")
|
||||
self.chats[2].chat_element_by_text(image_description).image_in_message.click()
|
||||
@@ -390,22 +388,22 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
toast_element_text, self.chats[2].get_translation_by_key("photo-saved")))
|
||||
else:
|
||||
self.errors.append("Message about saving a photo is not shown for member_2.")
|
||||
self.chats[2].navigate_back_to_chat_view()
|
||||
self.chats[2].click_system_back_button_until_element_is_shown(element="chat")
|
||||
|
||||
self.chats[2].just_fyi("Member_2 checks that image was saved in gallery")
|
||||
self.chats[2].show_images_button.click()
|
||||
self.chats[2].allow_button.click_if_shown()
|
||||
if not self.chats[2].get_image_by_index(0).is_element_image_similar_to_template("saucelabs_sauce_gallery.png"):
|
||||
self.errors.append("Image is not saved to gallery for member_2.")
|
||||
self.chats[2].navigate_back_to_chat_view()
|
||||
self.chats[2].click_system_back_button_until_element_is_shown(element="chat")
|
||||
|
||||
self.errors.verify_no_errors()
|
||||
|
||||
@marks.testrail_id(702808)
|
||||
def test_group_chat_offline_pn(self):
|
||||
self.homes[0].click_system_back_button_until_element_is_shown()
|
||||
[self.homes[i].jump_to_messages_home() for i in range(3)]
|
||||
for i in range(1, 3):
|
||||
self.homes[i].navigate_back_to_home_view()
|
||||
self.homes[i].chats_tab.click()
|
||||
self.homes[i].groups_tab.click()
|
||||
self.homes[i].get_chat(self.chat_name).click()
|
||||
|
||||
@@ -443,7 +441,7 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
@marks.xfail(reason="Pin feature is in development", run=False)
|
||||
@marks.testrail_id(702732)
|
||||
def test_group_chat_pin_messages(self):
|
||||
[self.homes[i].navigate_back_to_home_view() for i in range(3)]
|
||||
[self.homes[i].click_system_back_button_until_element_is_shown() for i in range(3)]
|
||||
[self.homes[i].get_chat(self.chat_name).click() for i in range(3)]
|
||||
|
||||
self.message_1, self.message_2, self.message_3, self.message_4 = \
|
||||
@@ -522,35 +520,27 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
|
||||
@marks.testrail_id(703495)
|
||||
def test_group_chat_mute_chat(self):
|
||||
[self.homes[i].navigate_back_to_home_view() for i in range(3)]
|
||||
[self.homes[i].click_system_back_button_until_element_is_shown() for i in range(3)]
|
||||
|
||||
self.homes[1].just_fyi("Member 1 mutes the chat for 1 hour")
|
||||
self.homes[1].mute_chat_long_press(self.chat_name, "mute-for-1-hour")
|
||||
device_time = self.homes[1].driver.device_time
|
||||
current_time = datetime.datetime.strptime(device_time, "%Y-%m-%dT%H:%M:%S%z")
|
||||
expected_time = current_time + datetime.timedelta(minutes=60)
|
||||
expected_text = "Muted until %s %s" % (
|
||||
expected_time.strftime('%H:%M'), "today" if current_time.hour < 23 else "tomorrow")
|
||||
chat = self.homes[1].get_chat(self.chat_name)
|
||||
chat.long_press_element()
|
||||
if self.homes[1].mute_chat_button.text != transl["unmute-chat"]:
|
||||
pytest.fail("Chat is not muted")
|
||||
if not self.homes[1].element_by_text(expected_text).is_element_displayed():
|
||||
self.errors.append("Text '%s' is not shown for muted chat" % expected_text)
|
||||
self.homes[1].click_system_back_button()
|
||||
try:
|
||||
initial_counter = int(self.homes[1].chats_tab.counter.text)
|
||||
except NoSuchElementException:
|
||||
initial_counter = 0
|
||||
self.homes[1].just_fyi("Member 1 mutes the chat")
|
||||
self.homes[1].mute_chat_long_press(self.chat_name)
|
||||
# ToDo: should be redone to some exact period mute after issue with adb commands execution is solved with
|
||||
# SauceLabs or an option for 1 minute mute is added for e2e apk
|
||||
# self.homes[1].mute_chat_long_press(self.chat_name, "mute-for-1-hour")
|
||||
# device_time = self.homes[1].driver.device_time
|
||||
|
||||
self.homes[0].just_fyi("Admin sends a message")
|
||||
muted_message = "Text message in the muted chat"
|
||||
self.homes[0].get_chat(self.chat_name).click()
|
||||
try:
|
||||
initial_counter = int(self.homes[1].chats_tab.counter.text)
|
||||
except NoSuchElementException:
|
||||
initial_counter = 0
|
||||
self.chats[0].send_message(muted_message)
|
||||
|
||||
self.homes[1].just_fyi("Member 1 checks that chat is muted and message is received")
|
||||
chat = self.homes[1].get_chat(self.chat_name)
|
||||
if chat.new_messages_grey_dot.is_element_displayed(30):
|
||||
self.errors.append("New messages grey dot near chat name is shown after mute")
|
||||
self.errors.append("New messages counter near chat name is shown after mute")
|
||||
try:
|
||||
after_mute_counter = int(self.homes[1].chats_tab.counter.text)
|
||||
except NoSuchElementException:
|
||||
@@ -564,18 +554,30 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
||||
if not self.chats[1].chat_element_by_text(muted_message).is_element_displayed(30):
|
||||
self.errors.append(
|
||||
"Message '%s' is not shown in chat for %s after mute" % (muted_message, self.usernames[1]))
|
||||
self.chats[1].navigate_back_to_home_view()
|
||||
|
||||
self.chats[1].just_fyi("Change device time so chat will be unmuted by timer")
|
||||
unmute_time = current_time + datetime.timedelta(minutes=61)
|
||||
self.homes[1].driver.execute_script("mobile: shell",
|
||||
{"command": "su root date %s" % unmute_time.strftime("%m%d%H%M%Y.%S")}
|
||||
)
|
||||
self.chats[1].click_system_back_button_until_element_is_shown()
|
||||
chat.long_press_element()
|
||||
if self.homes[1].element_starts_with_text("Muted until").is_element_displayed():
|
||||
self.errors.append("Chat is still muted after timeout")
|
||||
self.errors.verify_no_errors()
|
||||
self.homes[1].click_system_back_button()
|
||||
if self.homes[1].mute_chat_button.text != transl["unmute-chat"]:
|
||||
self.errors.append("Chat is not muted")
|
||||
# expected_text = "Muted until %s today" % device_time + 1
|
||||
expected_text = "Muted until you turn it back on"
|
||||
if not self.homes[1].element_by_text(expected_text).is_element_displayed():
|
||||
self.errors.append("Text '%s' is not shown for muted chat" % expected_text)
|
||||
self.chats[1].just_fyi("Member 1 unmutes the chat")
|
||||
# self.chats[1].just_fyi("Close app and change device time so chat will be unmuted by timer")
|
||||
# self.homes[1].put_app_to_background()
|
||||
# self.homes[1].driver.execute('mobile: shell', {
|
||||
# 'command': 'date',
|
||||
# 'args': [str(device_time + 1)]
|
||||
# })
|
||||
# self.homes[1].driver.launch_app()
|
||||
# self.sign_in_views[1].sign_in()
|
||||
# self.homes[1].chats_tab.click()
|
||||
# chat.long_press_element()
|
||||
# if self.homes[1].element_starts_with_text("Muted until").is_element_displayed():
|
||||
# self.errors.append("Chat is still muted after timeout")
|
||||
# self.errors.verify_no_errors()
|
||||
# self.homes[1].click_system_back_button()
|
||||
self.homes[1].mute_chat_button.click() # ToDo: remove when ^ is enabled
|
||||
|
||||
unmuted_message = "Chat is unmuted now"
|
||||
self.homes[2].just_fyi("Member 2 sends a message")
|
||||
|
||||
@@ -52,7 +52,7 @@ class TestOnboardingOneDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
self.profile.share_via_messenger()
|
||||
if not self.profile.element_by_text_part(public_key).is_element_displayed():
|
||||
self.errors.append("Can't share public key")
|
||||
self.profile.navigate_back_to_home_view()
|
||||
self.profile.click_system_back_button_until_element_is_shown()
|
||||
|
||||
self.home.just_fyi("Check that can paste contact code in chat message input")
|
||||
self.profile.home_button.double_click()
|
||||
@@ -80,7 +80,7 @@ class TestOnboardingOneDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
wallet.share_via_messenger()
|
||||
if not wallet.element_by_text_part(address).is_element_displayed():
|
||||
self.errors.append("Can't share address")
|
||||
wallet.navigate_back_to_home_view()
|
||||
wallet.click_system_back_button_until_element_is_shown()
|
||||
|
||||
self.home.just_fyi("Check that can paste wallet address in chat message input")
|
||||
wallet.home_button.click()
|
||||
|
||||
@@ -151,7 +151,7 @@ class TestPairingSyncMultipleDevicesMerged(MultipleSharedDeviceTestCase):
|
||||
web_page = dapp.open_url('status.im')
|
||||
web_page.add_to_bookmarks()
|
||||
if not web_page.home_button.is_element_displayed():
|
||||
web_page.navigate_back_to_home_view()
|
||||
web_page.click_system_back_button_until_element_is_shown()
|
||||
|
||||
self.home_1.just_fyi("Close the ENS banner")
|
||||
[home.home_button.double_click() for home in (self.home_1, self.home_2)]
|
||||
|
||||
@@ -343,7 +343,7 @@ class TestCommunityOneDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
def test_community_navigate_to_channel_when_relaunch(self):
|
||||
text_message = 'some_text'
|
||||
if not self.channel.chat_message_input.is_element_displayed():
|
||||
self.home.navigate_back_to_home_view()
|
||||
self.home.click_system_back_button_until_element_is_shown()
|
||||
self.home.get_to_community_channel_from_home(self.community_name)
|
||||
|
||||
self.channel.send_message(text_message)
|
||||
@@ -355,7 +355,7 @@ class TestCommunityOneDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
def test_community_copy_and_paste_message_in_chat_input(self):
|
||||
message_texts = ['mmmeowesage_text', 'https://status.im']
|
||||
if not self.channel.chat_message_input.is_element_displayed():
|
||||
self.home.navigate_back_to_home_view()
|
||||
self.home.click_system_back_button_until_element_is_shown()
|
||||
self.home.get_to_community_channel_from_home(self.community_name)
|
||||
|
||||
for message in message_texts:
|
||||
@@ -371,7 +371,7 @@ class TestCommunityOneDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
@marks.testrail_id(702869)
|
||||
def test_community_undo_delete_message(self):
|
||||
if not self.channel.chat_message_input.is_element_displayed():
|
||||
self.home.navigate_back_to_home_view()
|
||||
self.home.click_system_back_button_until_element_is_shown()
|
||||
self.home.get_to_community_channel_from_home(self.community_name)
|
||||
message_to_delete = "message to delete and undo"
|
||||
self.channel.send_message(message_to_delete)
|
||||
@@ -494,7 +494,7 @@ class TestCommunityOneDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
|
||||
if not pytest_config_global['pr_number']:
|
||||
self.home.just_fyi("Perform back up")
|
||||
self.home.navigate_back_to_home_view()
|
||||
self.home.click_system_back_button_until_element_is_shown()
|
||||
self.home.profile_button.click()
|
||||
profile.sync_settings_button.click()
|
||||
profile.backup_settings_button.click()
|
||||
@@ -542,7 +542,7 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
self.homes = self.home_1, self.home_2 = self.device_1.get_home_view(), self.device_2.get_home_view()
|
||||
self.public_key_2 = self.home_2.get_public_key_via_share_profile_tab()
|
||||
self.profile_1 = self.home_1.get_profile_view()
|
||||
[home.navigate_back_to_home_view() for home in self.homes]
|
||||
[home.click_system_back_button_until_element_is_shown() for home in self.homes]
|
||||
[home.chats_tab.click() for home in self.homes]
|
||||
self.home_1.add_contact(self.public_key_2)
|
||||
self.home_2.handle_contact_request(self.username_1)
|
||||
@@ -554,7 +554,7 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
self.chat_2 = self.home_2.get_chat(self.username_1).click()
|
||||
# self.chat_2.send_message(self.text_message)
|
||||
# [home.click_system_back_button_until_element_is_shown() for home in self.homes]
|
||||
self.home_1.navigate_back_to_home_view()
|
||||
self.home_1.click_system_back_button_until_element_is_shown()
|
||||
|
||||
self.home_1.just_fyi("Open community to message")
|
||||
self.home_1.communities_tab.click()
|
||||
@@ -665,7 +665,7 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
else:
|
||||
self.errors.append("Image options button is not shown for an image from gallery.")
|
||||
|
||||
self.channel_2.navigate_back_to_chat_view()
|
||||
self.channel_2.click_system_back_button_until_element_is_shown(element="chat")
|
||||
|
||||
self.channel_2.just_fyi("Can reply to gallery")
|
||||
self.channel_2.quote_message(image_description)
|
||||
@@ -707,7 +707,7 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
toast_element_text, self.channel_1.get_translation_by_key("photo-saved")))
|
||||
else:
|
||||
self.errors.append("Message about saving a photo is not shown.")
|
||||
self.channel_1.navigate_back_to_chat_view()
|
||||
self.channel_1.click_system_back_button_until_element_is_shown(element="chat")
|
||||
|
||||
self.channel_1.just_fyi("Check that image is saved in gallery")
|
||||
self.channel_1.show_images_button.click()
|
||||
@@ -725,7 +725,7 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
self.channel_2.wait_for_current_package_to_be('com.google.android.gm')
|
||||
except TimeoutException:
|
||||
self.errors.append("Can't share image")
|
||||
self.channel_2.navigate_back_to_chat_view()
|
||||
self.channel_2.click_system_back_button_until_element_is_shown(element="chat")
|
||||
|
||||
self.channel_2.just_fyi("Can reply to images")
|
||||
self.channel_2.quote_message(image_description)
|
||||
@@ -818,7 +818,7 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
}
|
||||
for home in self.home_1, self.home_2:
|
||||
if not home.chat_floating_screen.is_element_displayed():
|
||||
home.navigate_back_to_home_view()
|
||||
home.click_system_back_button_until_element_is_shown()
|
||||
home.get_to_community_channel_from_home(self.community_name)
|
||||
|
||||
for key, data in preview_urls.items():
|
||||
@@ -935,7 +935,7 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
profile_1.element_by_text(self.username_2).click()
|
||||
self.chat_1.unblock_contact_button.click()
|
||||
self.chat_1.close_button.click()
|
||||
self.chat_1.navigate_back_to_home_view()
|
||||
self.chat_1.click_system_back_button_until_element_is_shown()
|
||||
|
||||
self.home_2.just_fyi("Check that can send message in community after unblock")
|
||||
self.chat_2.send_message(message_unblocked)
|
||||
@@ -979,38 +979,33 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
@marks.testrail_id(703086)
|
||||
def test_community_mark_all_messages_as_read(self):
|
||||
for home in self.home_1, self.home_2:
|
||||
home.navigate_back_to_home_view()
|
||||
home.click_system_back_button_until_element_is_shown()
|
||||
home.communities_tab.click()
|
||||
self.home_2.get_chat(self.community_name, community=True).click()
|
||||
self.community_2.get_channel(self.channel_name).click()
|
||||
self.channel_2.send_message(self.text_message)
|
||||
community_1_element = self.community_1.get_chat(self.community_name, community=True)
|
||||
community_1_element = self.community_1.get_chat(self.community_name)
|
||||
if not community_1_element.new_messages_grey_dot.is_element_displayed(90):
|
||||
self.errors.append('New messages counter is not shown in home > Community element')
|
||||
community_1_element.click()
|
||||
channel_1_element = self.community_1.get_chat(self.channel_name, community_channel=True)
|
||||
if not channel_1_element.new_messages_grey_dot.is_element_displayed():
|
||||
self.errors.append("New messages counter is not shown in community channel element")
|
||||
self.community_1.click_system_back_button()
|
||||
self.errors.append('New messages counter is not shown in home > Commmunity element')
|
||||
mark_as_read_button = self.community_1.mark_all_messages_as_read_button
|
||||
community_1_element.long_press_until_element_is_shown(mark_as_read_button)
|
||||
mark_as_read_button.click()
|
||||
if community_1_element.new_messages_grey_dot.is_element_displayed():
|
||||
self.errors.append(
|
||||
'Unread messages badge is shown in community element while there are no unread messages')
|
||||
community_1_element.click()
|
||||
if channel_1_element.new_messages_grey_dot.is_element_displayed():
|
||||
self.errors.append(
|
||||
"New messages badge is shown in community channel element while there are no unread messages")
|
||||
'Unread messages badge is shown in community channel while there are no unread messages')
|
||||
# TODO: there should be one more check for community channel, which is still not ready
|
||||
|
||||
# self.community_1.click_system_back_button_until_element_is_shown()
|
||||
# community_1_element = self.home_1.get_chat(self.community_name, community=True)
|
||||
# if community_1_element.new_messages_community.is_element_displayed():
|
||||
# self.errors.append('New messages community badge is shown on community after marking messages as read')
|
||||
self.errors.verify_no_errors()
|
||||
|
||||
@marks.testrail_id(702786)
|
||||
@marks.xfail(
|
||||
reason="Issue with username in PN, issue #6 in https://github.com/status-im/status-mobile/issues/15500")
|
||||
def test_community_mentions_push_notification(self):
|
||||
self.home_1.navigate_back_to_home_view()
|
||||
self.home_1.click_system_back_button_until_element_is_shown()
|
||||
if not self.channel_2.chat_message_input.is_element_displayed():
|
||||
self.channel_2.navigate_back_to_home_view()
|
||||
self.channel_2.click_system_back_button_until_element_is_shown()
|
||||
self.home_2.communities_tab.click()
|
||||
self.home_2.get_chat(self.community_name, community=True).click()
|
||||
self.community_2.get_channel(self.channel_name).click()
|
||||
@@ -1035,8 +1030,6 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
else:
|
||||
self.errors.append("Push notification with the mention was not received by admin")
|
||||
|
||||
self.channel_1.click_system_back_button()
|
||||
|
||||
if message_received:
|
||||
self.channel_1.just_fyi("Set reaction for the message with a mention")
|
||||
self.channel_1.set_reaction(message=self.username_1, emoji="sad")
|
||||
@@ -1046,45 +1039,46 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
except (Failed, NoSuchElementException):
|
||||
self.errors.append("Message reaction is not shown for the sender")
|
||||
|
||||
self.device_2.just_fyi("Sender edits the message with a mention")
|
||||
self.channel_2.chat_element_by_text(self.username_1).wait_for_sent_state()
|
||||
self.channel_2.chat_element_by_text(self.username_1).long_press_element_by_coordinate(rel_y=0)
|
||||
try:
|
||||
self.channel_2.element_by_translation_id("edit-message").click()
|
||||
for i in range(29, 32):
|
||||
self.channel_2.driver.press_keycode(i)
|
||||
self.channel_2.send_message_button.click()
|
||||
edited_message = self.username_1 + " abc"
|
||||
if not self.channel_2.chat_element_by_text(edited_message).is_element_displayed():
|
||||
self.errors.append("Edited message is not shown correctly for the sender")
|
||||
if not self.channel_1.chat_element_by_text(edited_message).is_element_displayed():
|
||||
self.errors.append("Edited message is not shown correctly for the (receiver) admin")
|
||||
except NoSuchElementException:
|
||||
self.errors.append("Can not edit a message with a mention")
|
||||
# ToDo: this part is skipped because of an issue - sent messages stuck without any status for a long time
|
||||
# and can not be edited during that time
|
||||
# self.device_2.just_fyi("Sender edits the message with a mention")
|
||||
# self.channel_2.chat_element_by_text(self.username_1).wait_for_sent_state()
|
||||
# self.channel_2.chat_element_by_text(self.username_1).long_press_element_by_coordinate(rel_y=0)
|
||||
# try:
|
||||
# self.channel_2.element_by_translation_id("edit-message").click()
|
||||
# for i in range(29, 32):
|
||||
# self.channel_2.driver.press_keycode(i)
|
||||
# self.channel_2.send_message_button.click()
|
||||
# edited_message = self.username_1 + " abc"
|
||||
# if not self.channel_2.chat_element_by_text(edited_message).is_element_displayed():
|
||||
# self.errors.append("Edited message is not shown correctly for the sender")
|
||||
# if not self.channel_1.chat_element_by_text(edited_message).is_element_displayed():
|
||||
# self.errors.append("Edited message is not shown correctly for the (receiver) admin")
|
||||
# except NoSuchElementException:
|
||||
# self.errors.append("Can not edit a message with a mention")
|
||||
|
||||
self.home_2.navigate_back_to_home_view()
|
||||
if not self.channel_1.chat_message_input.is_element_displayed():
|
||||
self.channel_1.navigate_back_to_home_view()
|
||||
self.home_1.communities_tab.click()
|
||||
self.home_1.get_chat(self.community_name, community=True).click()
|
||||
self.community_1.get_channel(self.channel_name).click()
|
||||
|
||||
self.device_1.just_fyi("Admin sends a message with a mention")
|
||||
self.channel_1.mention_user(self.username_2)
|
||||
self.channel_1.send_message_button.click()
|
||||
self.device_2.just_fyi("Invited member gets push notification with the mention and tap it")
|
||||
self.device_2.open_notification_bar()
|
||||
push_notification_element = self.home_2.get_pn(self.username_2)
|
||||
if push_notification_element:
|
||||
push_notification_element.click()
|
||||
if not self.channel_2.chat_element_by_text(self.username_2).is_element_displayed():
|
||||
if self.channel_2.chat_message_input.is_element_displayed():
|
||||
self.errors.append("Message with the mention is not shown in the chat for the invited member")
|
||||
else:
|
||||
self.errors.append(
|
||||
"Channel did not open by clicking on a notification with the mention for the invited member")
|
||||
else:
|
||||
self.errors.append("Push notification with the mention was not received by the invited member")
|
||||
# ToDo: enable when https://github.com/status-im/status-mobile/issues/14956 is fixed
|
||||
# self.home_2.click_system_back_button_until_element_is_shown()
|
||||
# if not self.channel_1.chat_message_input.is_element_displayed():
|
||||
# self.channel_1.click_system_back_button_until_element_is_shown()
|
||||
# self.home_1.communities_tab.click()
|
||||
# self.home_1.get_chat(self.community_name, community=True).click()
|
||||
# self.community_1.get_channel(self.channel_name).click()
|
||||
#
|
||||
# self.device_1.just_fyi("Admin sends a message with a mention")
|
||||
# self.channel_1.mention_user(self.username_2)
|
||||
# self.channel_1.send_message_button.click()
|
||||
# self.device_2.just_fyi("Invited member gets push notification with the mention and tap it")
|
||||
# self.device_2.open_notification_bar()
|
||||
# if not self.home_2.get_pn(self.username_2):
|
||||
# self.device_2.driver.fail("Push notification with the mention was not received by the invited member")
|
||||
# self.device_2.click_upon_push_notification_by_text(self.username_2)
|
||||
# if not self.channel_2.chat_element_by_text(self.username_2).is_element_displayed():
|
||||
# if self.channel_2.chat_message_input.is_element_displayed():
|
||||
# self.device_2.driver.fail("Message with the mention is not shown in the chat for the invited member")
|
||||
# else:
|
||||
# self.device_2.driver.fail(
|
||||
# "Channel did not open by clicking on a notification with the mention for the invited member")
|
||||
self.errors.verify_no_errors()
|
||||
|
||||
@marks.testrail_id(702809)
|
||||
@@ -1100,7 +1094,7 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
}
|
||||
|
||||
for home in self.homes:
|
||||
home.navigate_back_to_home_view()
|
||||
home.click_system_back_button_until_element_is_shown()
|
||||
home.jump_to_communities_home()
|
||||
community = home.get_chat(self.community_name, community=True).click()
|
||||
community.get_channel(self.channel_name).click()
|
||||
@@ -1139,7 +1133,7 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
|
||||
@marks.testrail_id(702845)
|
||||
def test_community_leave(self):
|
||||
self.home_2.navigate_back_to_home_view()
|
||||
self.home_2.click_system_back_button_until_element_is_shown()
|
||||
self.home_2.jump_to_communities_home()
|
||||
community = self.home_2.get_chat(self.community_name, community=True)
|
||||
community_to_leave = CommunityView(self.drivers[1])
|
||||
@@ -1153,7 +1147,7 @@ class TestCommunityMultipleDeviceMerged(MultipleSharedDeviceTestCase):
|
||||
@marks.testrail_id(702948)
|
||||
def test_community_hashtag_links_to_community_channels(self):
|
||||
for home in self.homes:
|
||||
home.navigate_back_to_home_view()
|
||||
home.click_system_back_button_until_element_is_shown()
|
||||
self.home_2.jump_to_messages_home()
|
||||
self.home_1.jump_to_communities_home()
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ class TestActivityCenterContactRequestMultipleDevicePR(MultipleSharedDeviceTestC
|
||||
self.profile_1, self.profile_2 = self.home_1.get_profile_view(), self.home_2.get_profile_view()
|
||||
self.public_key_1 = self.home_1.get_public_key()
|
||||
self.public_key_2 = self.home_2.get_public_key_via_share_profile_tab()
|
||||
[home.navigate_back_to_home_view() for home in self.homes]
|
||||
[home.click_system_back_button_until_element_is_shown() for home in self.homes]
|
||||
[home.chats_tab.click() for home in self.homes]
|
||||
|
||||
@marks.testrail_id(702850)
|
||||
@@ -40,7 +40,7 @@ class TestActivityCenterContactRequestMultipleDevicePR(MultipleSharedDeviceTestC
|
||||
|
||||
chat.view_profile_new_contact_button.click_until_presence_of_element(chat.profile_block_contact_button)
|
||||
chat.profile_add_to_contacts_button.click()
|
||||
self.home_2.navigate_back_to_home_view()
|
||||
self.home_2.click_system_back_button_until_element_is_shown()
|
||||
|
||||
self.device_1.just_fyi("Device 1: check there is no PN when receiving new message to activity centre")
|
||||
self.device_1.open_notification_bar()
|
||||
@@ -121,7 +121,7 @@ class TestActivityCenterContactRequestMultipleDevicePR(MultipleSharedDeviceTestC
|
||||
self.errors.append("Contact was not added to contact list after accepting contact request (as receiver)")
|
||||
|
||||
self.device_2.just_fyi('Device1 check that contact appeared in contact list mutually')
|
||||
self.home_2.navigate_back_to_home_view()
|
||||
self.home_2.click_system_back_button_until_element_is_shown()
|
||||
self.home_2.chats_tab.click()
|
||||
self.home_2.contacts_tab.click()
|
||||
if not self.home_2.contact_details_row(username=self.username_1).is_element_displayed(20):
|
||||
@@ -144,7 +144,7 @@ class TestActivityMultipleDevicePR(MultipleSharedDeviceTestCase):
|
||||
self.homes = 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()
|
||||
self.public_key_2 = self.home_2.get_public_key()
|
||||
self.home_2.navigate_back_to_home_view()
|
||||
self.home_2.click_system_back_button_until_element_is_shown()
|
||||
[home.chats_tab.click() for home in self.homes]
|
||||
|
||||
self.home_1.add_contact(self.public_key_2)
|
||||
@@ -157,7 +157,7 @@ class TestActivityMultipleDevicePR(MultipleSharedDeviceTestCase):
|
||||
self.chat_1.send_message(self.one_to_one_message)
|
||||
self.chat_2 = self.home_2.get_chat(self.username_1).click()
|
||||
self.chat_2.send_message(self.text_message)
|
||||
[home.navigate_back_to_home_view() for home in self.homes]
|
||||
[home.click_system_back_button_until_element_is_shown() for home in self.homes]
|
||||
|
||||
self.home_1.just_fyi("Open community to message")
|
||||
self.home_1.communities_tab.click()
|
||||
|
||||
@@ -193,7 +193,7 @@ class TestBrowserProfileOneDevice(MultipleSharedDeviceTestCase):
|
||||
self.home.share_via_messenger()
|
||||
if not self.home.element_by_text_part('Hey join me on Status: https://join.status.im/u/%s' % chat_key).is_element_displayed(20):
|
||||
self.errors.append("No expected message in input field when sharing via 'Invite friend'")
|
||||
self.home.navigate_back_to_home_view()
|
||||
self.home.click_system_back_button_until_element_is_shown()
|
||||
|
||||
self.home.just_fyi("Check it via bottom sheet menu")
|
||||
self.home.plus_button.click()
|
||||
@@ -201,7 +201,7 @@ class TestBrowserProfileOneDevice(MultipleSharedDeviceTestCase):
|
||||
self.home.share_via_messenger()
|
||||
if not self.home.element_by_text_part('Hey join me on Status: https://join.status.im/u/%s' % chat_key).is_element_displayed(20):
|
||||
self.errors.append("No expected message in input field when sharing via 'bottom sheet'")
|
||||
self.home.navigate_back_to_home_view()
|
||||
self.home.click_system_back_button_until_element_is_shown()
|
||||
self.errors.verify_no_errors()
|
||||
|
||||
@marks.testrail_id(702160)
|
||||
|
||||
@@ -99,7 +99,7 @@ class TestDeeplinkChatProfileOneDevice(MultipleSharedDeviceTestCase):
|
||||
'https://join.status.im/u/%s' % dummy_user["public_key"]).is_element_displayed():
|
||||
self.errors.append("Can't share public key of contact")
|
||||
for _ in range(2):
|
||||
chat.navigate_back_to_home_view()
|
||||
chat.click_system_back_button_until_element_is_shown()
|
||||
|
||||
@marks.testrail_id(702252)
|
||||
def test_share_user_profile_url_public_chat(self):
|
||||
@@ -115,7 +115,7 @@ class TestDeeplinkChatProfileOneDevice(MultipleSharedDeviceTestCase):
|
||||
'https://join.status.im/%s' % self.public_chat_name).is_element_displayed():
|
||||
self.errors.append("Can't share link to public chat")
|
||||
for _ in range(2):
|
||||
self.public_chat.navigate_back_to_home_view()
|
||||
self.public_chat.click_system_back_button_until_element_is_shown()
|
||||
self.public_chat.get_back_to_home_view()
|
||||
|
||||
@marks.testrail_id(702251)
|
||||
@@ -134,7 +134,7 @@ class TestDeeplinkChatProfileOneDevice(MultipleSharedDeviceTestCase):
|
||||
browser.element_by_text_part(expeceted_text_2).is_element_displayed()):
|
||||
self.errors.append("Can't share link to URL")
|
||||
|
||||
browser.navigate_back_to_home_view()
|
||||
browser.click_system_back_button_until_element_is_shown()
|
||||
|
||||
self.errors.verify_no_errors()
|
||||
|
||||
|
||||
@@ -383,12 +383,15 @@ class BaseView(object):
|
||||
for _ in range(times):
|
||||
self.driver.press_keycode(4)
|
||||
|
||||
def navigate_back_to_home_view(self, attempts=3):
|
||||
def click_system_back_button_until_element_is_shown(self, attempts=3, element='home'):
|
||||
counter = 0
|
||||
while self.chat_floating_screen.is_element_displayed(2) \
|
||||
or self.community_floating_screen.is_element_displayed(2):
|
||||
if self.chat_floating_screen.is_element_displayed(2) or self.community_floating_screen.is_element_displayed(2):
|
||||
self.driver.press_keycode(4)
|
||||
element = self.chats_tab
|
||||
if element == 'home':
|
||||
element = self.chats_tab
|
||||
elif element == 'chat':
|
||||
chat = self.get_chat_view()
|
||||
element = chat.chat_message_input
|
||||
while not element.is_element_displayed(1) and counter <= attempts:
|
||||
self.driver.press_keycode(4)
|
||||
try:
|
||||
@@ -397,19 +400,7 @@ class BaseView(object):
|
||||
except (NoSuchElementException, TimeoutException):
|
||||
counter += 1
|
||||
else:
|
||||
self.driver.info("Could not reach home view by pressing system back button")
|
||||
|
||||
def navigate_back_to_chat_view(self, attempts=3):
|
||||
counter = 0
|
||||
element = self.get_chat_view().chat_message_input
|
||||
while not element.is_element_displayed(1) and counter <= attempts:
|
||||
self.driver.press_keycode(4)
|
||||
try:
|
||||
element.wait_for_element(2)
|
||||
return
|
||||
except (NoSuchElementException, TimeoutException):
|
||||
counter += 1
|
||||
self.driver.info("Could not reach chat view by pressing system back button")
|
||||
self.driver.info("Could not reach %s element by pressing back" % element.name)
|
||||
|
||||
def get_app_from_background(self):
|
||||
self.driver.info('Get Status back from Recent apps')
|
||||
@@ -617,8 +608,7 @@ class BaseView(object):
|
||||
self.hide_keyboard_if_shown()
|
||||
if self.chat_floating_screen.is_element_displayed(1):
|
||||
Button(self.driver, xpath='//*[@content-desc="%s"]//*[@content-desc="%s"]' %
|
||||
(self.chat_floating_screen.accessibility_id,
|
||||
self.jump_to_button.accessibility_id)).click()
|
||||
(self.chat_floating_screen.accessibility_id, self.jump_to_button.accessibility_id)).click()
|
||||
elif self.community_floating_screen.is_element_displayed(1):
|
||||
Button(self.driver, xpath='//*[@content-desc="%s"]//*[@content-desc="%s"]' %
|
||||
(self.community_floating_screen.accessibility_id,
|
||||
|
||||
@@ -403,7 +403,7 @@ class HomeView(BaseView):
|
||||
chat.profile_add_to_contacts_button.click()
|
||||
if nickname:
|
||||
chat.set_nickname(nickname)
|
||||
self.navigate_back_to_home_view()
|
||||
self.click_system_back_button_until_element_is_shown()
|
||||
|
||||
def create_group_chat(self, user_names_to_add: list, group_chat_name: str = 'new_group_chat'):
|
||||
self.driver.info("## Creating group chat '%s'" % group_chat_name, device=False)
|
||||
@@ -428,10 +428,9 @@ class HomeView(BaseView):
|
||||
chat.click_system_back_button()
|
||||
chat.view_profile_new_contact_button.click_until_presence_of_element(chat.profile_add_to_contacts_button)
|
||||
chat.profile_add_to_contacts_button.click()
|
||||
self.navigate_back_to_home_view()
|
||||
self.click_system_back_button_until_element_is_shown()
|
||||
|
||||
def create_community_e2e(self, name: str, description="some_description", set_image=False,
|
||||
file_name='sauce_logo.png',
|
||||
def create_community_e2e(self, name: str, description="some_description", set_image=False, file_name='sauce_logo.png',
|
||||
require_approval=True):
|
||||
self.driver.info("## Creating community '%s', set image is set to '%s'" % (name, str(set_image)), device=False)
|
||||
self.plus_community_button.click()
|
||||
@@ -546,7 +545,6 @@ class HomeView(BaseView):
|
||||
def get_public_key_via_share_profile_tab(self):
|
||||
self.driver.info("Getting public key via Share tab")
|
||||
self.show_qr_code_button.click()
|
||||
self.link_to_profile_text.wait_for_visibility_of_element()
|
||||
self.link_to_profile_text.click()
|
||||
c_text = self.driver.get_clipboard_text()
|
||||
self.click_system_back_button()
|
||||
|
||||
@@ -371,13 +371,13 @@ class ProfileView(BaseView):
|
||||
chat.public_key_edit_box.send_keys(public_key)
|
||||
chat.view_profile_new_contact_button.click_until_presence_of_element(chat.profile_add_to_contacts_button)
|
||||
chat.profile_add_to_contacts_button.click()
|
||||
self.navigate_back_to_home_view()
|
||||
self.click_system_back_button_until_element_is_shown()
|
||||
|
||||
def switch_push_notifications(self):
|
||||
self.driver.info("Enabling push notifications via Profile")
|
||||
self.profile_notifications_button.scroll_and_click()
|
||||
self.profile_notifications_toggle_button.click()
|
||||
self.navigate_back_to_home_view()
|
||||
self.click_system_back_button_until_element_is_shown()
|
||||
|
||||
def add_custom_network(self, rpc_url: str, name: str, symbol: str, netwrok_id:str):
|
||||
self.driver.info("## Add custom network", device=False)
|
||||
|
||||
@@ -196,7 +196,6 @@
|
||||
"communities-verified": "✓ Verified Status Community",
|
||||
"communities-enabled": "Communities enabled",
|
||||
"request-access": "Request access",
|
||||
"requesting": "Requesting",
|
||||
"membership-request-pending": "Membership request pending",
|
||||
"create-community": "Create a community",
|
||||
"create-category": "Create category",
|
||||
@@ -2280,10 +2279,5 @@
|
||||
"collectibles": "Collectibles",
|
||||
"no-collectibles-description": "Don't be a bored ape",
|
||||
"no-activity": "No activity",
|
||||
"no-activity-description": "C'mon do something...",
|
||||
"buy": "Buy",
|
||||
"bridge": "Bridge",
|
||||
"on-device": "On device",
|
||||
"on-keycard": "On Keycard",
|
||||
"keypair-title": "{{name}}'s default keypair"
|
||||
"no-activity-description": "C'mon do something..."
|
||||
}
|
||||
|
||||
@@ -9012,9 +9012,9 @@ react-native-touch-id@^4.4.1:
|
||||
resolved "https://registry.yarnpkg.com/react-native-touch-id/-/react-native-touch-id-4.4.1.tgz#8b1bb2d04c30bac36bb9696d2d723e719c4a8b08"
|
||||
integrity sha512-1jTl8fC+0fxvqegy/XXTyo6vMvPhjzkoDdaqoYZx0OH8AT250NuXnNPyKktvigIcys3+2acciqOeaCall7lrvg==
|
||||
|
||||
"react-native-transparent-video@git+https://github.com/status-im/react-native-transparent-video.git#refs/tags/0.1.1":
|
||||
"react-native-transparent-video@git+https://github.com/status-im/react-native-transparent-video.git#refs/tags/0.0.9":
|
||||
version "0.1.0"
|
||||
resolved "git+https://github.com/status-im/react-native-transparent-video.git#1327fc622f7521269f66299c3aca610494c76fe1"
|
||||
resolved "git+https://github.com/status-im/react-native-transparent-video.git#97d8c773eae82851b170b53c9fc13020f74eefe7"
|
||||
|
||||
"react-native-webview@git+https://github.com/status-im/react-native-webview.git#refs/tags/v11.16.0-status":
|
||||
version "11.16.0"
|
||||
|
||||
Reference in New Issue
Block a user