                      (set-results!
                        (seq (mapcat (fn [e] (e v (config :thread-id))) engines)))
                      (highlight-first!)
+                     (recur)))))
+           (go (loop []
+                 (let [[v ch] (alts! [throttled-thread-text-chan thread-text-kill-chan])]
+                   (when (= ch throttled-thread-text-chan)
+                     (dispatch! :new-message-text v)
                      (recur)))))))
 
        :component-will-update
        (fn [c [_ {new-config :config}]]
-         (reset! thread-id (new-config :thread-id)))
+         (reset! thread-id (new-config :thread-id))
+         (swap! state assoc :text @thread-text))
 
        :component-will-unmount
        (fn []
-         (put! kill-chan (js/Date.)))
+         (put! kill-chan (js/Date.))
+         (put! thread-text-kill-chan (js/Date.)))
 
        :reagent-render
        (fn [{:keys [config textarea-view results-view]}]

      {:display-name "autocomplete"
       :component-will-mount
       (fn [c]
         (let [{:keys [config]} (r/props c)]
           (go (loop []
                 (let [[v ch] (alts! [throttled-autocomplete-chan kill-chan])]

        kill-chan (chan)
        throttled-autocomplete-chan (debounce autocomplete-chan 100)

        thread-text-kill-chan (chan)
        thread-text-chan (chan)
        throttled-thread-text-chan (debounce thread-text-chan 500)
        thread-id (r/atom (config :thread-id))
        thread-text (subscribe [:thread-new-message] [thread-id])

        ; delibrately closing over value of sub
        state (r/atom {:text @thread-text
                       :force-close? false
                       :highlighted-result-index 0
                       :results nil})
