How to make base component aware of reactions? (re-frame, react native)

Hello

how did you solve this issue?
Has anyone had it?

i created an app (react native) that deals with orientation a lot
and there are a lot of places where UI should change based on orientation
so i decided instead of having subscribe to orientation all over the app that i’d abstract default view and just use that component but i run into a problem.

(defn view [& [props & children]]
  (let [config (rf/subscribe [:app-config/all])]
    (fn []
      (let [{:keys [orientation]} @config]
        (reduce (fn [base child]
                  (conj base child))
                [:> rn/View (merge {:style {:flex 1
                                            :flex-direction orientation}}
                                   props)]
                children)))))

This is the view abstraction
but when i use it like

[comps/view
         {}
         [:> rn/View {:style {:flex 1
                              :padding 10
                              :justify-content :space-around
                              :align-items :center
                              :background-color :red
                              }}
          [:> rn-elem/CheckBox {:center true
                                :title "BUY"
                                :checked-icon :dot-circle-o
                                :unchecked-icon :circle-o
                                :checked (= @action :buy)
                                :on-press #(reset! action :buy)
                                :checked-color :black}]
          [:> rn/Text {:style {:font-weight :bold
                               :font-size 24
                               :color :black}} "OR"]
          [:> rn-elem/CheckBox {:center true
                                :title "SELL"
                                :checked-icon :dot-circle-o
                                :unchecked-icon :circle-o
                                :checked (= @action :sell)
                                :on-press #(reset! action :sell)
                                :checked-color :black}]]
         (if (= :buy @action)
           [buy-details @option @gameplay (second selected-option)]
           [sell-details @option @gameplay (second selected-option)])]

it is as though option, gameplay and action are non existent, like reactions are not happening, checkboxes don’t work.

What i think is happening is that view component’s scope doesn’t see option, gameplay or action and it fails silently.

is there a way to deal with this?
any way to make it work?

i’d appreciate feedback on the approach as well. Should i be doing this in a different way?

After some experimenting i managed to make it work with

(defn view [& [props & children]]
  (let [config (rf/subscribe [:app-config/all])]
    (reduce conj [:> rn/View (merge {:style {:flex 1
                                             :flex-direction (:orientation @config)}}
                                    props)]
            children)))

In my mind there is nothing different about the views but as soon as this view returns fn problems start. Does anyone know why?

SOLVED:

(defn view
  "reference https://github.com/reagent-project/reagent/blob/master/doc/CreatingReagentComponents.md#form-2--a-function-returning-a-function"
  [& [props & children]]
  (let [config (rf/subscribe [:app-config/all])]
    (fn [& [props & children]]
      (let [{:keys [orientation]} @config]
        (reduce conj [:> rn/View (merge {:style {:flex 1
                                                 :flex-direction orientation}}
                                        props)]
                children)))))

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.