Added discover screen
This commit is contained in:
parent
ee54e12f5a
commit
376241fe38
Binary file not shown.
After Width: | Height: | Size: 82 B |
Binary file not shown.
After Width: | Height: | Size: 249 B |
|
@ -0,0 +1,15 @@
|
|||
(ns syng-im.components.carousel)
|
||||
|
||||
(set! js/Carousel (.-default (js/require "react-native-carousel-control")))
|
||||
|
||||
|
||||
(defn carousel [opts & children]
|
||||
(apply js/React.createElement js/Carousel (clj->js opts) children))
|
||||
|
||||
|
||||
|
||||
(comment
|
||||
|
||||
|
||||
|
||||
)
|
|
@ -0,0 +1,40 @@
|
|||
(ns syng-im.components.discovery.discovery-popular-list-item
|
||||
(:require
|
||||
[syng-im.components.react :refer [android?
|
||||
view
|
||||
scroll-view
|
||||
list-view
|
||||
text
|
||||
image
|
||||
navigator
|
||||
toolbar-android]]
|
||||
[syng-im.resources :as res]
|
||||
[reagent.core :as r])
|
||||
)
|
||||
|
||||
(defn discovery-popular-list-item [discovery]
|
||||
(r/as-element [view {:style {:flexDirection "row"
|
||||
:paddingTop 10
|
||||
:paddingBottom 10}}
|
||||
[view {:style {:flex 0.8
|
||||
:flexDirection "column"}}
|
||||
[text {:style {:color "black"
|
||||
:fontWeight "bold"
|
||||
:fontSize 12}} (aget discovery "name")]
|
||||
[text {:style {:color "black"
|
||||
:fontWeight "normal"
|
||||
:fontSize 12}
|
||||
:numberOfLines 2} (aget discovery "status")]
|
||||
]
|
||||
[view {:style {:flex 0.2
|
||||
:flexDirection "column"
|
||||
:alignItems "center"
|
||||
:paddingTop 5}}
|
||||
[image {:style {:resizeMode "contain"
|
||||
:borderRadius 150
|
||||
:width 30
|
||||
:height 30}
|
||||
:source res/user-no-photo}]
|
||||
]
|
||||
])
|
||||
)
|
|
@ -0,0 +1,44 @@
|
|||
(ns syng-im.components.discovery.discovery-recent
|
||||
(:require-macros
|
||||
[natal-shell.data-source :refer [data-source clone-with-rows]]
|
||||
|
||||
)
|
||||
(:require
|
||||
[syng-im.components.react :refer [android?
|
||||
view
|
||||
scroll-view
|
||||
list-view
|
||||
text
|
||||
image
|
||||
navigator
|
||||
toolbar-android]]
|
||||
[syng-im.components.carousel :refer [carousel]]
|
||||
[syng-im.components.discovery.discovery-popular-list-item :refer [discovery-popular-list-item]]
|
||||
[syng-im.models.discoveries :refer [generate-discoveries]]
|
||||
[reagent.core :as r]
|
||||
[syng-im.resources :as res]))
|
||||
|
||||
|
||||
(defn render-row [row section-id row-id]
|
||||
(let [elem (discovery-popular-list-item row)]
|
||||
elem)
|
||||
)
|
||||
|
||||
(defn render-separator [sectionID, rowID, adjacentRowHighlighted]
|
||||
(let [elem (r/as-element [view {:style {:borderBottomWidth 1
|
||||
:borderBottomColor "#eff2f3"}
|
||||
:key rowID}])]
|
||||
elem))
|
||||
|
||||
(defn get-data-source [elements]
|
||||
(clone-with-rows (data-source {:rowHasChanged (fn [row1 row2]
|
||||
(not= (:discovery-id row1) (:discovery-id row2)))})
|
||||
elements))
|
||||
|
||||
(defn discovery-recent [recent-discoveries]
|
||||
[list-view {:dataSource (get-data-source recent-discoveries)
|
||||
:renderRow render-row
|
||||
:renderSeparator render-separator
|
||||
:style {:backgroundColor "white"
|
||||
:paddingLeft 15}}]
|
||||
)
|
|
@ -0,0 +1,106 @@
|
|||
(ns syng-im.components.discovery.discovery
|
||||
|
||||
(:require
|
||||
[re-frame.core :refer [subscribe dispatch dispatch-sync]]
|
||||
[syng-im.components.react :refer [android?
|
||||
view
|
||||
scroll-view
|
||||
text
|
||||
image
|
||||
navigator
|
||||
toolbar-android]]
|
||||
[reagent.core :as r]
|
||||
[syng-im.components.discovery.discovery-popular :refer [discovery-popular]]
|
||||
[syng-im.components.discovery.discovery-recent :refer [discovery-recent]]
|
||||
[syng-im.models.discoveries :refer [generate-discoveries
|
||||
get-discovery-popular
|
||||
get-discovery-recent]]
|
||||
[syng-im.resources :as res]))
|
||||
|
||||
(defn discovery [{:keys [navigator]}]
|
||||
(let [discoveries (subscribe [:get-discoveries])
|
||||
pop-discoveries (get-discovery-popular 3)]
|
||||
(fn []
|
||||
[view {:style {:flex 1
|
||||
:backgroundColor "#edf2f5"}}
|
||||
[toolbar-android {:title "Discover"
|
||||
:titleColor "#4A5258"
|
||||
:navIcon res/menu
|
||||
:actions [{:title "Search"
|
||||
:icon res/search
|
||||
:show "always"}]
|
||||
:style {:backgroundColor "white"
|
||||
:justifyContent "center"
|
||||
:height 56
|
||||
:elevation 2}
|
||||
:onIconClicked (fn []
|
||||
(.log console "testttt"))
|
||||
:onActionSelected (fn [index]
|
||||
(index))}]
|
||||
|
||||
[scroll-view {:style {}}
|
||||
[view {:style {:paddingTop 5}}
|
||||
[text {:style {:color "#b2bdc5"
|
||||
:fontSize 14
|
||||
:textAlign "center"}} "Discover popular contacts \n around the world"]]
|
||||
[view {:style {:paddingLeft 30
|
||||
:paddingTop 15
|
||||
:paddingBottom 15}}
|
||||
[text {:style {:color "#b2bdc5"
|
||||
:fontSize 14
|
||||
:fontWeight "bold"}} "Popular Tags"]]
|
||||
[discovery-popular pop-discoveries]
|
||||
[view {:style {:paddingLeft 30
|
||||
:paddingTop 15
|
||||
:paddingBottom 15}}
|
||||
[text {:style {:color "#b2bdc5"
|
||||
:fontSize 14
|
||||
:fontWeight "bold"}} "Recent"]]
|
||||
[discovery-recent (get-discovery-recent 10)]
|
||||
]
|
||||
]
|
||||
)
|
||||
)
|
||||
)
|
||||
(comment
|
||||
(def page-width (aget (natal-shell.dimensions/get "window") "width"))
|
||||
(def page-height (aget (natal-shell.dimensions/get "window") "height"))
|
||||
[view {:style {:flex 1
|
||||
:backgroundColor "white"}}
|
||||
[toolbar-android {:title "Discover"
|
||||
:titleColor "#4A5258"
|
||||
:navIcon res/menu
|
||||
:actions [{:title "Search"
|
||||
:icon res/search
|
||||
:show "always"}]
|
||||
:style {:backgroundColor "white"
|
||||
:height 56
|
||||
:elevation 2}
|
||||
:onIconClicked (fn []
|
||||
(.log console "testttt"))
|
||||
:onActionSelected (fn [index]
|
||||
(index))}]
|
||||
[scroll-view {:style { }}
|
||||
[view {:style {:paddingLeft 30
|
||||
:paddingTop 15
|
||||
:paddingBottom 15}}
|
||||
[text {:style {:color "#232323"
|
||||
:fontSize 18
|
||||
:fontWeight "bold"}} "Popular Tags"]]
|
||||
[carousel {:pageStyle {:backgroundColor "white", :borderRadius 5}
|
||||
:pageWidth (- page-width 60)}
|
||||
[view {:style {:height (- page-height 100)}} [text {:style {:color "#232323"
|
||||
:fontSize 18
|
||||
:fontWeight "bold"}} "Popular Tags"]]
|
||||
[view [text "Welcome to Syng"]]
|
||||
[view [text "Welcome to Syng"]]
|
||||
[view [text "Welcome to Syng"]]]
|
||||
[view {:style {:paddingLeft 30
|
||||
:paddingTop 15
|
||||
:paddingBottom 15}}
|
||||
[text {:style {:color "#232323"
|
||||
:fontSize 18
|
||||
:fontWeight "bold"}} "Recent"]]
|
||||
[view {:style {:height 200}}]
|
||||
]]
|
||||
)
|
|
@ -0,0 +1,42 @@
|
|||
(ns syng-im.components.discovery.discovery-popular
|
||||
|
||||
(:require
|
||||
[syng-im.components.react :refer [android?
|
||||
view
|
||||
scroll-view
|
||||
text
|
||||
image
|
||||
navigator
|
||||
toolbar-android]]
|
||||
[syng-im.components.carousel :refer [carousel]]
|
||||
[syng-im.components.discovery.discovery-popular-list :refer [discovery-popular-list]]
|
||||
[syng-im.models.discoveries :refer [generate-discoveries]]
|
||||
[syng-im.resources :as res]))
|
||||
|
||||
(defn page-width []
|
||||
(.-width (.get (.. js/React -Dimensions) "window")))
|
||||
|
||||
|
||||
(defn discovery-popular [popular-discoveries]
|
||||
(let [popular-lists (mapv #(discovery-popular-list % (get popular-discoveries %)) (keys popular-discoveries))]
|
||||
(if (> (count popular-lists) 0)
|
||||
(apply carousel {:pageStyle {:borderRadius 1
|
||||
:shadowColor "black"
|
||||
:shadowRadius 1
|
||||
:shadowOpacity 0.8
|
||||
:elevation 2
|
||||
:marginBottom 10}
|
||||
:pageWidth (- (page-width) 60)
|
||||
|
||||
}
|
||||
popular-lists
|
||||
)
|
||||
[text "None"]
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(comment
|
||||
(set! React (js/require "react-native"))
|
||||
(.get (.Dimensions React) "window")
|
||||
)
|
|
@ -0,0 +1,64 @@
|
|||
(ns syng-im.components.discovery.discovery-popular-list
|
||||
(:require-macros
|
||||
[natal-shell.data-source :refer [data-source clone-with-rows]]
|
||||
|
||||
)
|
||||
(:require
|
||||
[syng-im.components.react :refer [android?
|
||||
view
|
||||
scroll-view
|
||||
list-view
|
||||
text
|
||||
image
|
||||
navigator
|
||||
toolbar-android]]
|
||||
[reagent.core :as r]
|
||||
[syng-im.components.discovery.discovery-popular-list-item :refer [discovery-popular-list-item] ])
|
||||
)
|
||||
|
||||
|
||||
(defn render-row [row section-id row-id]
|
||||
(let [elem (discovery-popular-list-item row)]
|
||||
elem)
|
||||
)
|
||||
|
||||
(defn render-separator [sectionID, rowID, adjacentRowHighlighted]
|
||||
(let [elem (r/as-element [view {:style {:borderBottomWidth 1
|
||||
:borderBottomColor "#eff2f3"}
|
||||
:key rowID}])]
|
||||
elem))
|
||||
|
||||
(defn get-data-source [elements]
|
||||
(clone-with-rows (data-source {:rowHasChanged (fn [row1 row2]
|
||||
(not= (:discovery-id row1) (:discovery-id row2)))})
|
||||
elements))
|
||||
|
||||
(defn discovery-popular-list [tag elements]
|
||||
(r/as-element [view {:style {:flex 1
|
||||
:backgroundColor "white"
|
||||
:paddingLeft 10
|
||||
:paddingTop 10}}
|
||||
[view {:style {:flexDirection "row"
|
||||
:backgroundColor "white"
|
||||
:padding 0}}
|
||||
[view {:style {:flexDirection "column"
|
||||
:backgroundColor "#e9f7fe"
|
||||
:borderRadius 5
|
||||
:padding 0}}
|
||||
[text {:style {:color "#6092df"
|
||||
:paddingRight 5
|
||||
:paddingBottom 2
|
||||
:alignItems "center"
|
||||
:justifyContent "center"}} (str " #" (name tag))]]]
|
||||
[list-view {:dataSource (get-data-source elements)
|
||||
:renderRow render-row
|
||||
:renderSeparator render-separator
|
||||
:style {:backgroundColor "white"}}]
|
||||
])
|
||||
)
|
||||
|
||||
(comment
|
||||
list-view {:dataSource elements
|
||||
:renderRow (partial render-row list-element)
|
||||
:style {:backgroundColor "white"}}
|
||||
)
|
|
@ -0,0 +1,183 @@
|
|||
(ns syng-im.models.discoveries
|
||||
(:require [cljs.core.async :as async :refer [chan put! <! >!]]
|
||||
[re-frame.core :refer [subscribe dispatch dispatch-sync]]
|
||||
[syng-im.utils.utils :refer [log toast]]
|
||||
[syng-im.persistence.realm :as realm]
|
||||
[syng-im.persistence.realm :as r]
|
||||
[syng-im.resources :as res]
|
||||
[syng-im.db :as db]))
|
||||
|
||||
;; TODO see https://github.com/rt2zz/react-native-contacts/issues/45
|
||||
(def fake-discoveries? true)
|
||||
|
||||
|
||||
|
||||
(defn signal-discovery-updated [db]
|
||||
(update-in db db/updated-discovery-signal-path (fn [current]
|
||||
(if current
|
||||
(inc current)
|
||||
0))))
|
||||
|
||||
(defn discovery-updated? [db]
|
||||
(get-in db db/updated-discovery-signal-path))
|
||||
|
||||
(defn- generate-discovery [n]
|
||||
{:discovery-id n
|
||||
:name (str "Contact " n)
|
||||
:status (apply str (repeat (+ n 3) "Contact Status "))
|
||||
:whisper-id (str "id-" n)
|
||||
:photo ""
|
||||
:tags ["tag1" "tag2"]
|
||||
:last-updated (js/Date. "10/01/2015")
|
||||
})
|
||||
|
||||
(defn- generate-discoveries [n]
|
||||
(map generate-discovery (range 1 (inc n))))
|
||||
|
||||
(def fake-discoveries (generate-discoveries 20))
|
||||
|
||||
(defn- get-discoveries []
|
||||
( let [list (realm/get-list :discoveries)]
|
||||
(if (> (.-length list) 0) (.slice list 0) [])))
|
||||
|
||||
(defn load-syng-discoveries [db]
|
||||
(let [discoveries (map (fn [discovery]
|
||||
(merge discovery
|
||||
{}))
|
||||
(get-discoveries))]
|
||||
(assoc db :discoveries discoveries)))
|
||||
|
||||
(defn get-tag [tag]
|
||||
(-> (r/get-by-field :tag :name tag)
|
||||
(r/single-cljs)))
|
||||
|
||||
(defn remove-tag [tag]
|
||||
(let [tag-object (get-tag tag)]
|
||||
(if tag-object
|
||||
(realm/create :tag
|
||||
{:name tag
|
||||
:count (dec (:count tag-object))
|
||||
}))))
|
||||
|
||||
(defn add-tag [tag]
|
||||
(let [tag-object (get-tag tag)
|
||||
counter (if tag-object (:count tag-object) 1)]
|
||||
(realm/create :tag
|
||||
{:name tag
|
||||
:count (inc counter)
|
||||
}
|
||||
(if tag-object true false))))
|
||||
|
||||
(defn remove-tags [tags]
|
||||
(doseq [tag tags]
|
||||
(remove-tag tag)))
|
||||
|
||||
(defn add-tags [tags]
|
||||
(doseq [tag tags]
|
||||
(add-tag tag)))
|
||||
|
||||
(defn get-tags [whisper-id]
|
||||
(:tags (-> (r/get-by-field :discoveries :whisper-id whisper-id)
|
||||
(r/single-cljs))))
|
||||
|
||||
(defn- create-discovery [{:keys [name status whisper-id photo tags last-updated]}]
|
||||
(do
|
||||
;(add-tags tags)
|
||||
(realm/create :discoveries
|
||||
{:name name
|
||||
:status status
|
||||
:whisper-id whisper-id
|
||||
:photo photo
|
||||
:tags (mapv (fn [tag]
|
||||
{:name tag}) tags)
|
||||
:last-updated last-updated} true)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
|
||||
(defn- update-discovery [{:keys [name status whisper-id photo tags last-updated]}]
|
||||
(let [old-tags (get-tags whisper-id)]
|
||||
(do
|
||||
;;(remove-tags old-tags)
|
||||
;;(add-tags tags)
|
||||
(realm/create :discoveries
|
||||
{:name name
|
||||
:status status
|
||||
:whisper-id whisper-id
|
||||
:photo photo
|
||||
:tags (mapv (fn [tag]
|
||||
{:name tag}) tags)
|
||||
:last-updated last-updated}
|
||||
true)
|
||||
))
|
||||
)
|
||||
|
||||
(defn- discovery-exist? [discoveries discovery]
|
||||
(some #(= (:whisper-id discovery) (:whisper-id %)) discoveries))
|
||||
|
||||
(defn- add-discoveries [discoveries]
|
||||
(realm/write (fn []
|
||||
(let [db-discoveries (get-discoveries)]
|
||||
(dorun (map (fn [discovery]
|
||||
(if (not (discovery-exist? db-discoveries discovery))
|
||||
(create-discovery discovery)
|
||||
(update-discovery discovery)
|
||||
))
|
||||
discoveries))))))
|
||||
|
||||
(defn save-discoveries [discoveries]
|
||||
(add-discoveries discoveries))
|
||||
|
||||
(defn discovery-list []
|
||||
(-> (r/get-all :discoveries)
|
||||
(r/sorted :discovery-id :desc)))
|
||||
|
||||
(defn get-discovery-recent [limit]
|
||||
(if fake-discoveries?
|
||||
(take limit fake-discoveries)
|
||||
(-> (r/get-all :discoveries)
|
||||
(r/sorted :last-updated :desc)
|
||||
(r/page 0 limit)))
|
||||
)
|
||||
|
||||
(defn get-tag-popular [limit]
|
||||
(-> (r/get-all :tag)
|
||||
(r/sorted :count :desc)
|
||||
(r/page 0 limit)))
|
||||
|
||||
(defn add-with-limit [data value limit]
|
||||
(if (>= (count data) limit)
|
||||
data
|
||||
(conj data value))
|
||||
)
|
||||
|
||||
(defn group-by-tag [discoveries tag-limit]
|
||||
(reduce (fn [result discovery]
|
||||
(let [keys (:tags discovery)]
|
||||
(reduce (fn [data key]
|
||||
(assoc data (keyword key) (add-with-limit (get data (keyword key) []) discovery tag-limit)))
|
||||
result
|
||||
keys)))
|
||||
{}
|
||||
discoveries)
|
||||
)
|
||||
|
||||
(defn get-discovery-popular [tag-limit]
|
||||
(if fake-discoveries?
|
||||
(group-by-tag fake-discoveries tag-limit)
|
||||
(-> (r/get-all :discoveries)
|
||||
(r/sorted :last-updated :desc)
|
||||
(.slice 0)
|
||||
(group-by-tag tag-limit))
|
||||
)
|
||||
)
|
||||
|
||||
(comment
|
||||
(group-by-tag [{:tags ["a" "b" "c"]
|
||||
:name "test1"}
|
||||
{:tags ["a" "c"]
|
||||
:name "test2"}
|
||||
{:tags ["c"]
|
||||
:name "test3"}])
|
||||
)
|
Loading…
Reference in New Issue