WARNING: this is a REGRESSION, and does not work.

This commit is contained in:
Simon Brooke 2018-07-26 08:41:59 +01:00
parent 913beffb61
commit 18a267fd8c
4 changed files with 85 additions and 91 deletions

View file

@ -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])

View file

@ -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

View file

@ -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

View file

@ -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!"]]]