            (catch :default e
              [:error e]))))
 
+(defn validate-response [{:keys [guests] :as selection} {:keys [infos] :as response}]
+  (when (some (fn [{:keys [id] :as guest}]
+                (not (contains? infos id)))
+              guests)
+    "Please let us know whether each guest can attend."))
+
 (defn rsvp-card-view [{:keys [party guests] :as selection} owner]
   (reify
     om/IRender
     (render [_]
-      (let [{:keys [contact food-preferences infos] :as response} (om/observe owner (response))]
+      (let [{:keys [contact food-preferences infos error] :as response} (om/observe owner (response))]
         (when (nil? contact)
           (om/update! response :contact (:contact party)))
         

         :response {:contact nil
                    :food-preferences ""
                    :infos {}
                    :sent false}}))

(defn search []
  (om/ref-cursor (:rsvp-search (om/root-cursor app-state))))

          [:form {:id "rsvpsubmit"
                  :onSubmit (fn [e]
                              (.preventDefault e)
                              (if-let [error (validate-response selection response)]
                                (om/update! response :error error)
                                (go (om/update! response :error nil)
                                    (let [[result data] (<! (send-rsvps! selection response))]
                                      (condp = result
                                        :success (om/update! response :sent true)
                                        :failure (js/console.error "Error sending response to Parse:" data))))))}
           [:section {:class "guests"}
            (map-indexed
             (fn [idx {id :id, original-name :name :as info}]
