Skip to content

Instantly share code, notes, and snippets.

@Knotschi
Last active April 15, 2020 11:13
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Knotschi/6f97efe89681ac149113ddec4c396cc5 to your computer and use it in GitHub Desktop.
Save Knotschi/6f97efe89681ac149113ddec4c396cc5 to your computer and use it in GitHub Desktop.
react native reagent text input focus prop from state
(require '[reagent.core :as r :refer [atom]
'[reagent.impl.util :as ru]])
(def view (r/adapt-react-class (.-View js/React)))
(def input (r/adapt-react-class (.-TextInput js/React)))
(defn focusable-input [init-attrs]
(r/create-class
{:display-name "focusable-input"
:component-will-receive-props
(fn [this new-argv]
(let [ref-c (aget this "refs" (:ref init-attrs))
focus (:focus (ru/extract-props new-argv))
is-focused (.isFocused ref-c)]
(if focus
(when-not is-focused (.focus ref-c))
(when is-focused (.blur ref-c)))))
:reagent-render
(fn [attrs]
(let [init-focus (:focus init-attrs)
auto-focus (or (:auto-focus attrs) init-focus)
attrs (assoc attrs :auto-focus auto-focus)]
[input attrs]))}))
;; Usage
(def my-state (atom {}))
(defn my-form []
[view
[focusable-input {:ref "field1"
:return-key-type "next"
:auto-focus true
:focus #(= "field1" (:focused-field @my-state))
:on-focus #(swap! my-state assoc :focused-field "field1")
:on-submit-editing #(swap! my-state assoc :focused-field "field2")}]
[focusable-input {:ref "field2"
:return-key-type "done"
:focus #(= "field2" (:focused-field @my-state))
:on-focus #(swap! my-state assoc :focused-field "field2")
:on-submit-editing #(swap! my-state assoc :focused-field nil)}]])
@FabianMk
Copy link

I tried running your code. Unfortunately ru/extract-props is undeclared in reagent 0.10.0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment