Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[19159] Implement drawer action component #19159 #19289

Merged
merged 2 commits into from
Mar 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions src/quo/components/drawers/drawer_action/component_spec.cljs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
(ns quo.components.drawers.drawer-action.component-spec
(:require
[quo.components.drawers.drawer-action.view :as drawer-action]
[quo.foundations.colors :as colors]
[test-helpers.component :as h]))

(h/describe "Drawers: drawer-action"
(h/test "default render"
(h/render-with-theme-provider [drawer-action/view {}])
(h/is-truthy (h/query-by-label-text :container)))

(h/test "on-press-in changes internal state to :pressed"
(h/render-with-theme-provider [drawer-action/view {}])
(h/fire-event :on-press-in (h/get-by-label-text :container))
(h/wait-for #(h/has-style (h/query-by-label-text :container)
{:backgroundColor (colors/resolve-color :blue :light 5)})))

(h/test "render default action with state :selected"
(h/render-with-theme-provider [drawer-action/view {:state :selected}])
(h/has-style (h/query-by-label-text :container)
{:backgroundColor (colors/resolve-color :blue :light 5)})
(h/is-truthy (h/query-by-label-text :check-icon)))

(h/test "call on-press"
(let [on-press (h/mock-fn)]
(h/render-with-theme-provider [drawer-action/view {:on-press on-press}])
(h/fire-event :on-press (h/get-by-label-text :container))
(h/was-called on-press)))


(h/test "render :arrow action"
(h/render-with-theme-provider [drawer-action/view {:action :arrow}])
(h/is-truthy (h/query-by-label-text :arrow-icon)))

(h/test "render :toggle action"
(h/render-with-theme-provider [drawer-action/view {:action :toggle}])
(h/is-truthy (h/query-by-label-text "toggle-off")))

(h/test "render :toggle action with state :selected"
(h/render-with-theme-provider [drawer-action/view
{:action :toggle
:state :selected}])
(h/is-truthy (h/query-by-label-text "toggle-on"))
(h/has-style (h/query-by-label-text :container)
{:backgroundColor :transparent}))

(h/test "render default action with icon, title, description"
(h/render-with-theme-provider [drawer-action/view
{:icon :i/contact
:title "Check contact"
:description "Just a small desc"}])
(h/is-truthy (h/query-by-label-text :left-icon))
(h/is-truthy (h/query-by-text "Check contact"))
(h/is-truthy (h/query-by-text "Just a small desc"))))
16 changes: 16 additions & 0 deletions src/quo/components/drawers/drawer_action/schema.cljs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
(ns quo.components.drawers.drawer-action.schema)

(def ?schema
[:=>
[:cat
[:map {:closed true}
[:action {:optional true} [:maybe [:enum :arrow :toggle]]]
[:icon {:optional true} [:maybe :keyword]]
[:description {:optional true} [:maybe :string]]
[:state {:optional true} [:maybe [:enum :selected]]]
[:title {:optional true} :string]
[:on-press {:optional true} [:maybe fn?]]
[:customization-color {:optional true}
[:maybe :schema.common/customization-color]]
[:blur? {:optional true} [:maybe :boolean]]]]
:any])
55 changes: 55 additions & 0 deletions src/quo/components/drawers/drawer_action/style.cljs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
(ns quo.components.drawers.drawer-action.style
(:require
[quo.foundations.colors :as colors]))

(defn- background-color
[{:keys [state action customization-color theme pressed? blur?]}]
(let [checked? (and (= :selected state) (nil? action))]
(cond
(and (or checked? pressed?) blur?)
colors/white-opa-5

(or pressed? checked?)
(colors/resolve-color customization-color theme 5)

:else :transparent)))

(defn container
[{:keys [description?] :as props}]
{:flex-direction :row
:align-items :center
:padding-vertical (if description? 8 13)
:padding-horizontal 13
:border-radius 12
:background-color (background-color props)})

(defn text-container
[]
{:flex 1
:margin-right 12})

(defn- neutral-color
[theme blur?]
(if blur?
colors/white-70-blur
(colors/theme-colors colors/neutral-50 colors/neutral-40 theme)))

(defn left-icon
[]
{:align-self :flex-start
:margin-right 13
:margin-top 1})

(defn icon-color
[{:keys [theme blur?]}]
(neutral-color theme blur?))

(defn desc
[{:keys [theme blur?]}]
{:color (neutral-color theme blur?)})

(defn check-color
[{:keys [theme blur? customization-color]}]
(if blur?
colors/white-70-blur
(colors/resolve-color customization-color theme)))
73 changes: 73 additions & 0 deletions src/quo/components/drawers/drawer_action/view.cljs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
(ns quo.components.drawers.drawer-action.view
(:require
[quo.components.drawers.drawer-action.schema :as component-schema]
[quo.components.drawers.drawer-action.style :as style]
[quo.components.icon :as icon]
[quo.components.markdown.text :as text]
[quo.components.selectors.selectors.view :as selectors]
[quo.theme :as theme]
[react-native.core :as rn]
[schema.core :as schema]))

(defn view-internal
[{:keys [action icon description state title on-press
customization-color blur?]
:or {customization-color :blue
blur? false}}]
(let [theme (theme/use-theme-value)
[pressed? set-pressed] (rn/use-state false)
on-press-in (rn/use-callback #(set-pressed true))
on-press-out (rn/use-callback #(set-pressed false))]
[rn/pressable
{:on-press on-press
:on-press-in on-press-in
:on-press-out on-press-out
:style (style/container {:state state
:action action
:customization-color customization-color
:theme theme
:pressed? pressed?
:description? (not-empty description)
:blur? blur?})
:accessibility-label :container}
(when icon
[icon/icon icon
{:accessibility-label :left-icon
:container-style (style/left-icon)
:color (style/icon-color {:theme theme
:blur? blur?})}])

[rn/view {:style (style/text-container)}
[text/text {:weight :medium}
title]

(when (seq description)
[text/text
{:size :paragraph-2
:style (style/desc {:theme theme
:blur? blur?})}
description])]

(cond
(= action :toggle)
[selectors/view
{:theme theme
:label-prefix "toggle"
:customization-color customization-color
:type :toggle
:checked? (= state :selected)}]

(= action :arrow)
[icon/icon :i/chevron-right
{:accessibility-label :arrow-icon
:color (style/icon-color {:theme theme
:blur? blur?})}]

(= state :selected)
[icon/icon :i/check
{:accessibility-label :check-icon
:color (style/check-color {:theme theme
:blur? blur?
:customization-color customization-color})}])]))

(def view (schema/instrument #'view-internal component-schema/?schema))
2 changes: 2 additions & 0 deletions src/quo/core.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
quo.components.drawers.action-drawers.view
quo.components.drawers.bottom-actions.view
quo.components.drawers.documentation-drawers.view
quo.components.drawers.drawer-action.view
quo.components.drawers.drawer-buttons.view
quo.components.drawers.drawer-top.view
quo.components.drawers.permission-context.view
Expand Down Expand Up @@ -250,6 +251,7 @@

;;;; Drawers
(def action-drawer quo.components.drawers.action-drawers.view/action-drawer)
(def drawer-action quo.components.drawers.drawer-action.view/view)
(def documentation-drawers quo.components.drawers.documentation-drawers.view/view)
(def drawer-buttons quo.components.drawers.drawer-buttons.view/view)
(def drawer-top quo.components.drawers.drawer-top.view/view)
Expand Down
1 change: 1 addition & 0 deletions src/quo/core_spec.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
quo.components.drawers.action-drawers.component-spec
quo.components.drawers.bottom-actions.component-spec
quo.components.drawers.documentation-drawers.component-spec
quo.components.drawers.drawer-action.component-spec
quo.components.drawers.drawer-buttons.component-spec
quo.components.drawers.drawer-top.component-spec
quo.components.drawers.permission-context.component-spec
Expand Down
41 changes: 41 additions & 0 deletions src/status_im/contexts/preview/quo/drawers/drawer_action.cljs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
(ns status-im.contexts.preview.quo.drawers.drawer-action
(:require
[quo.core :as quo]
[reagent.core :as reagent]
[status-im.contexts.preview.quo.preview :as preview]))

Rende11 marked this conversation as resolved.
Show resolved Hide resolved
(def descriptor
[{:key :title
:type :text}
{:key :state
:type :select
:options [{:key :selected}]}
{:key :icon
:type :select
:options [{:key :i/placeholder}
{:key :i/info}
{:key :i/browser}]}
{:key :action
:type :select
:options [{:key :arrow}
{:key :toggle}]}
{:key :description
:type :text}
{:key :blur?
:type :boolean}
(preview/customization-color-option)])

(defn view
[]
(let [state (reagent/atom {:title "Action"
:description "This is a description"
:customization-color :blue
:on-press #(js/alert "Pressed!")})]
(fn []
[preview/preview-container
{:state state
:descriptor descriptor
:blur? (:blur? @state)
:show-blur-background? true
:blur-dark-only? true}
[quo/drawer-action @state]])))
3 changes: 3 additions & 0 deletions src/status_im/contexts/preview/quo/main.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
[status-im.contexts.preview.quo.drawers.bottom-actions :as bottom-actions]
[status-im.contexts.preview.quo.drawers.documentation-drawers :as
documentation-drawers]
[status-im.contexts.preview.quo.drawers.drawer-action :as drawer-action]
[status-im.contexts.preview.quo.drawers.drawer-buttons :as drawer-buttons]
[status-im.contexts.preview.quo.drawers.drawer-top :as drawer-top]
[status-im.contexts.preview.quo.drawers.permission-drawers :as
Expand Down Expand Up @@ -294,6 +295,8 @@
:component action-drawers/view}
{:name :documentation-drawer
:component documentation-drawers/view}
{:name :drawer-action
:component drawer-action/view}
{:name :drawer-buttons
:component drawer-buttons/view}
{:name :drawer-top
Expand Down