From 18a267fd8c18d078f1d243d681947c32ea56774e Mon Sep 17 00:00:00 2001
From: Simon Brooke <simon@journeyman.cc>
Date: Thu, 26 Jul 2018 08:41:59 +0100
Subject: [PATCH] WARNING: this is a REGRESSION, and does not work.

---
 src/cljs/youyesyet/canvasser_app/core.cljs    |   2 +-
 src/cljs/youyesyet/canvasser_app/gis.cljs     |  14 +-
 .../youyesyet/canvasser_app/handlers.cljs     | 154 ++++++++----------
 .../canvasser_app/views/followup.cljs         |   6 +-
 4 files changed, 85 insertions(+), 91 deletions(-)

diff --git a/src/cljs/youyesyet/canvasser_app/core.cljs b/src/cljs/youyesyet/canvasser_app/core.cljs
index e93d9ab..08d6ed0 100644
--- a/src/cljs/youyesyet/canvasser_app/core.cljs
+++ b/src/cljs/youyesyet/canvasser_app/core.cljs
@@ -192,7 +192,7 @@
 
 (defn init! []
   (rf/dispatch-sync [:initialize-db])
-  (get-current-location)
+  (rf/dispatch-sync [:get-current-location])
   (rf/dispatch [:fetch-locality])
   (rf/dispatch [:fetch-options])
   (rf/dispatch [:fetch-issues])
diff --git a/src/cljs/youyesyet/canvasser_app/gis.cljs b/src/cljs/youyesyet/canvasser_app/gis.cljs
index 0f694b8..d357dcd 100644
--- a/src/cljs/youyesyet/canvasser_app/gis.cljs
+++ b/src/cljs/youyesyet/canvasser_app/gis.cljs
@@ -8,6 +8,7 @@
             [ajax.core :refer [GET]]
             [ajax.json :refer [json-request-format json-response-format]]
             [youyesyet.canvasser-app.state :as db]
+            [youyesyet.locality :refer [locality]]
             ))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -37,7 +38,8 @@
 ;; references, so do it here.
 
 (defn get-current-location []
-  "Get the current location from the device."
+  "Get the current location from the device, setting it in the database and
+   returning the locality."
   (try
     (if (.-geolocation js/navigator)
       (.getCurrentPosition
@@ -46,11 +48,13 @@
           (js/console.log (str "Current location is: "
                                (.-latitude (.-coords position)) ", "
                                (.-longitude (.-coords position))))
-          (dispatch [:set-latitude (.-latitude (.-coords position))])
-          (dispatch [:set-longitude (.-longitude (.-coords position))])))
-      (js/console.log "Geolocation not available"))
+          (dispatch-sync [:set-latitude (.-latitude (.-coords position))])
+          (dispatch-sync [:set-longitude (.-longitude (.-coords position))])))
+      (js/console.log "Geolocation not available")
+      (locality (.-latitude (.-coords position)) (.-longitude (.-coords position)))
     (catch js/Object any
-      (js/console.log "Exception while trying to access location: " + any))))
+      (js/console.log "Exception while trying to access location: " + any)
+      0)))
 
 
 (defn pin-image
diff --git a/src/cljs/youyesyet/canvasser_app/handlers.cljs b/src/cljs/youyesyet/canvasser_app/handlers.cljs
index 684c9b2..5da6468 100644
--- a/src/cljs/youyesyet/canvasser_app/handlers.cljs
+++ b/src/cljs/youyesyet/canvasser_app/handlers.cljs
@@ -155,27 +155,35 @@
  :fetch-locality
  (fn [{db :db} _]
    (let [locality (locality (:latitude db) (:longitude db))
-          uri (str source-host
+         uri (str source-host
                   "rest/get-local-data?locality="
                   locality)]
-     (js/console.log
-      (str
-       "Fetching locality data: " uri))
-     ;; we return a map of (side) effects
-     {:http-xhrio {:method          :get
-                   :uri             uri
-                   :format          (json-request-format)
-                   :response-format (json-response-format {:keywords? true})
-                   :on-success      [:process-locality]
-                   :on-failure      [:bad-locality]}
-      :db  (add-to-feedback db :fetch-locality)})))
+         (js/console.log
+          (str
+           "Fetching locality data: " uri))
+         ;; we return a map of (side) effects
+         {:http-xhrio {:method          :get
+                       :uri             uri
+                       :format          (json-request-format)
+                       :response-format (json-response-format {:keywords? true})
+                       :on-success      [:process-locality]
+                       :on-failure      [:bad-locality]}
+          :db  (assoc
+                 (add-to-feedback db :fetch-locality)
+                 :locality locality)})))
 
 
 (reg-event-db
-  :get-current-location
-  (fn [db _]
-    (js/console.log "Updating current location")
-    (assoc db :froboz (get-current-location))))
+ :get-current-location
+ (fn [db _]
+   (let [locality (get-current-location)]
+     (js/console.log "Updating current location")
+     (if
+       (and (locality > 0) (not (= locality (:locality db))))
+       (do
+         (dispatch :fetch-locality) ;; if the locality has changed, fetch it immediately
+         (assoc db :locality locality))
+       db))))
 
 
 (reg-event-db
@@ -184,7 +192,7 @@
     [db [_ response]]
     (js/console.log (str "Updating locality data: " (count response) " addresses"))
     ;; loop to do it again
-    (dispatch [:dispatch-later [{:ms 5000 :dispatch [:fetch-locality]}
+    (dispatch [:dispatch-later [{:ms 60000 :dispatch [:fetch-locality]}
                                 {:ms 1000 :dispatch [:get-current-location]}]])
     (refresh-map-pins)
     (assoc
@@ -198,13 +206,19 @@
     ;; TODO: signal something has failed? It doesn't matter very much, unless it keeps failing.
     (js/console.log "Failed to fetch locality data")
     ;; loop to do it again
-    (dispatch [:dispatch-later [{:ms 60000 :dispatch [:fetch-locality]}
-                                {:ms 1000 :dispatch [:get-current-location]}]])
+    (dispatch [:dispatch-later [{:ms 60000 :dispatch [:fetch-locality]}]])
     (assoc
       (remove-from-feedback db :fetch-locality)
       :error (cons :fetch-locality (:error db)))))
 
 
+(reg-event-fx
+ :process-outqueue
+ (fn [{db :db} _]
+   (if
+     (empty? (:outqueue db))
+
+
 (reg-event-fx
   :fetch-options
   (fn [{db :db} _]
@@ -231,6 +245,7 @@
 
 
 (reg-event-db
+ ;; TODO: should try again
   :bad-options
   (fn [db _]
     (js/console.log "Failed to fetch options")
@@ -269,6 +284,7 @@
 
 
 (reg-event-db
+ ;; TODO: should try again
   :bad-issues
   (fn [db _]
     (js/console.log "Failed to fetch issues")
@@ -281,53 +297,22 @@
   :send-intention
   (fn [db [_ args]]
     (let [intention (:intention args)
-          elector-id (:elector-id args)
-          old-elector (first
-                        (remove nil?
-                                (map
-                                  #(if (= elector-id (:id %)) %)
-                                  (:electors (:dwelling db)))))
-          new-elector (assoc old-elector :intention intention)
-          old-dwelling (:dwelling db)
-          new-dwelling (assoc
-                         old-dwelling
-                         :electors
-                         (cons
-                           new-elector
-                           (remove
-                             #(= % old-elector)
-                             (:electors old-dwelling))))
-          old-address (:address db)
-          new-address (assoc
-                        old-address
-                        :dwellings
-                        (cons
-                          new-dwelling
-                          (remove
-                            #(= % old-dwelling)
-                            (:dwellings old-address))))]
-      (cond
-        (nil? old-elector)
-        (assoc db :error (cons "No elector found; not setting intention" (:error db))
-          (= intention (:intention old-elector))
-          (do
-            (js/console.log "Elector's intention hasn't changed; not setting intention")
-            db))
-        true
+          elector-id (:elector-id args)]
+      (if
+        (nil? (-> db :elector))
+        (assoc db :error (cons "No elector found; not setting intention" (:error db)))
         (do
           (js/console.log (str "Setting intention of elector " old-elector " to " intention))
-          (merge
-            (clear-messages db)
-            {:addresses
-             (cons
-               new-address
-               (remove #(= % old-address) (:addresses db)))
-             :address new-address
-             :dwelling new-dwelling
-             :elector new-elector
-             :outqueue (cons
-                         (assoc args :action :set-intention)
-                         (:outqueue db))}))))))
+          (->
+           db
+           clear-messages
+           #(add-to-outqueue % (assoc
+                           args
+                           :address_id (-> db :address :id)
+                           :locality (-> db :address :locality)
+                           :elector_id (-> db :elector :id)
+                           :action :set-intention))
+           #(assoc % :elector (assoc (:elector db) :intention intention))))))))
 
 
 (reg-event-db
@@ -337,8 +322,11 @@
       (do
         (js/console.log "Sending request")
         (-> db
-            #(add-to-outqueue % {:elector-id (:id (:elector db))
-                                 :issue (:issue db)
+            #(add-to-outqueue % {:elector_id (-> db :elector :id)
+                                 :issue_id (-> db :issue :id)
+                                 :address_id (-> db :address :id)
+                                 :method_id "Phone"
+                                 :method_detail (-> db :method_detail)
                                  :action :add-request})
             #(add-to-feedback % :send-request)))
       (assoc db :error "Please supply a telephone number to call"))))
@@ -357,18 +345,20 @@
  (fn [db [_ address-id]]
    (let [id (coerce-to-number  address-id)
          address (first (remove nil? (map #(if (= id (:id %)) %) (:addresses db))))]
-     (if
-       (= (count (:dwellings address)) 1)
-       (assoc (clear-messages db)
-         :address address
-         :dwelling (first (:dwellings address))
-         :electors (:electors (first (:dwellings address)))
-         :page :dwelling)
-       (assoc (clear-messages db)
-         :address address
-         :dwelling nil
-         :electors nil
-         :page :building)))))
+     (-> db
+         clear-messages
+         #(if
+            (= (count (:dwellings address)) 1)
+            (assoc %
+              :address address
+              :dwelling (first (:dwellings address))
+              :electors (:electors (first (:dwellings address)))
+              :page :dwelling)
+            (assoc %
+              :address address
+              :dwelling nil
+              :electors nil
+              :page :building))))))
 
 
 (reg-event-db
@@ -445,10 +435,10 @@
 
 
 (reg-event-db
- :set-telephone
- (fn [db [_ telephone]]
-   (js/console.log (str "Setting telephone to " telephone))
-   (assoc (clear-messages db) :telephone telephone)))
+ :set-method-detail
+ (fn [db [_ detail]]
+   (js/console.log (str "Setting method detail to " detail))
+   (assoc (clear-messages db) :method_detail detail)))
 
 
 (reg-event-db
diff --git a/src/cljs/youyesyet/canvasser_app/views/followup.cljs b/src/cljs/youyesyet/canvasser_app/views/followup.cljs
index 385ffe4..115fd15 100644
--- a/src/cljs/youyesyet/canvasser_app/views/followup.cljs
+++ b/src/cljs/youyesyet/canvasser_app/views/followup.cljs
@@ -69,9 +69,9 @@
            #(let []
               [:option {:key % :value %} %]) (keys issues))]]
         [:p.widget
-         [:label {:for "telephone"} "Telephone number"]
-         [:input {:type "text" :id "telephone" :name "telephone"
-                  :on-change #(dispatch [:set-telephone (.-value (.-target %))])}]]
+         [:label {:for "method_detail"} "Telephone number"]
+         [:input {:type "text" :id "method_detail" :name "method_detail"
+                  :on-change #(dispatch [:set-method-detail (.-value (.-target %))])}]]
         [:p.widget
          [:label {:for "send"} "To request a call"]
          [:button {:id "send" :on-click #(dispatch [:send-request])} "Send this!"]]]