From 3ea4cff4b9b332d0b19d97724ac4df4842b51184 Mon Sep 17 00:00:00 2001 From: Adrian Tiberius Date: Fri, 14 Oct 2016 15:07:08 +0300 Subject: [PATCH] fixes #298 #303 profile screen --- src/status_im/accounts/handlers.cljs | 17 +- src/status_im/accounts/recover/handlers.cljs | 3 +- src/status_im/components/drawer/view.cljs | 14 +- .../components/selectable_field/styles.cljs | 36 + .../components/selectable_field/view.cljs | 61 + src/status_im/contacts/views/new_contact.cljs | 5 +- src/status_im/navigation/handlers.cljs | 6 - src/status_im/profile/handlers.cljs | 31 +- .../profile/photo_capture/screen.cljs | 14 +- src/status_im/profile/screen.cljs | 167 +- src/status_im/profile/styles.cljs | 40 +- src/status_im/profile/validations.cljs | 2 +- src/status_im/translations/en.cljs | 1 + src/status_im/utils/gfycat/adjectives.cljs | 1505 ++++++++++++++ src/status_im/utils/gfycat/animals.cljs | 1753 +++++++++++++++++ src/status_im/utils/gfycat/core.cljs | 16 + src/status_im/utils/image_processing.cljs | 9 +- 17 files changed, 3526 insertions(+), 154 deletions(-) create mode 100644 src/status_im/components/selectable_field/styles.cljs create mode 100644 src/status_im/components/selectable_field/view.cljs create mode 100644 src/status_im/utils/gfycat/adjectives.cljs create mode 100644 src/status_im/utils/gfycat/animals.cljs create mode 100644 src/status_im/utils/gfycat/core.cljs diff --git a/src/status_im/accounts/handlers.cljs b/src/status_im/accounts/handlers.cljs index 7d94683f7f..80b0173626 100644 --- a/src/status_im/accounts/handlers.cljs +++ b/src/status_im/accounts/handlers.cljs @@ -14,8 +14,9 @@ status-im.accounts.recover.handlers [clojure.string :as str] [status-im.utils.datetime :as time] - [status-im.utils.handlers :as u] + [status-im.utils.handlers :as u :refer [get-hashtags]] [status-im.accounts.statuses :as statuses] + [status-im.utils.gfycat.core :refer [generate-gfy]] [status-im.constants :refer [console-chat-id]])) @@ -36,7 +37,7 @@ {:keys [public private]} (protocol/new-keypair!) account {:public-key public-key :address address - :name address + :name (generate-gfy) :status (rand-nth statuses/data) :signed-up? true :updates-public-key public @@ -74,6 +75,18 @@ :status status :profile-image photo-path}}}}))) +(register-handler + :check-status-change + (u/side-effect! + (fn [{:keys [current-account-id accounts]} [_ status]] + (let [{old-status :status :as account} (get accounts current-account-id) + status-updated? (and (not= status nil) + (not= status old-status))] + (when status-updated? + (let [hashtags (get-hashtags status)] + (when-not (empty? hashtags) + (dispatch [:broadcast-status status hashtags])))))))) + (register-handler :account-update (-> (fn [{:keys [current-account-id accounts] :as db} [_ data]] diff --git a/src/status_im/accounts/recover/handlers.cljs b/src/status_im/accounts/recover/handlers.cljs index 8850fc05d6..c98f70c8d0 100644 --- a/src/status_im/accounts/recover/handlers.cljs +++ b/src/status_im/accounts/recover/handlers.cljs @@ -6,6 +6,7 @@ [taoensso.timbre :as log] [clojure.string :as str] [status-im.utils.handlers :as u] + [status-im.utils.gfycat.core :refer [generate-gfy]] [status-im.protocol.core :as protocol])) (defn account-recovered [result] @@ -16,7 +17,7 @@ {:keys [public private]} (protocol/new-keypair!) account {:public-key public-key :address address - :name address + :name (generate-gfy) :photo-path (identicon public-key) :updates-public-key public :updates-private-key private diff --git a/src/status_im/components/drawer/view.cljs b/src/status_im/components/drawer/view.cljs index 96730cfde0..474166680c 100644 --- a/src/status_im/components/drawer/view.cljs +++ b/src/status_im/components/drawer/view.cljs @@ -14,7 +14,6 @@ [status-im.components.text-field.view :refer [text-field]] [status-im.components.drawer.styles :as st] [status-im.profile.validations :as v] - [status-im.profile.handlers :refer [update-profile]] [status-im.resources :as res] [status-im.i18n :refer [label]] [status-im.components.react :refer [dismiss-keyboard!]])) @@ -43,8 +42,8 @@ name]]) (defview drawer-menu [] - [{:keys [name address photo-path status] :as account} [:get-current-account] - {new-name :name :as profile-edit-data} [:get :profile-edit] + [{:keys [name photo-path status]} [:get-current-account] + {new-name :name new-status :status} [:get :profile-edit] keyboard-height [:get :keyboard-height]] [view st/drawer-menu [touchable-without-feedback {:on-press #(dismiss-keyboard!)} @@ -60,10 +59,9 @@ :editable true :input-style (st/name-input-text (s/valid? ::v/name (or new-name name))) :wrapper-style st/name-input-wrapper - :value (if (not= name address) - name) + :value name :on-change-text #(dispatch [:set-in [:profile-edit :name] %]) - :on-end-editing #(update-profile account profile-edit-data)}]] + :on-end-editing #(dispatch [:account-update {:name new-name}])}]] [view st/status-container [text-input {:style st/status-input :editable true @@ -73,7 +71,9 @@ :accessibility-label :input :placeholder (label :t/profile-no-status) :on-change-text #(dispatch [:set-in [:profile-edit :status] %]) - :on-blur #(update-profile account profile-edit-data) + :on-blur (fn[] + (dispatch [:check-status-change new-status]) + (dispatch [:account-update {:status new-status}])) :default-value status}]] [view st/menu-items-container [menu-item {:name (label :t/profile) diff --git a/src/status_im/components/selectable_field/styles.cljs b/src/status_im/components/selectable_field/styles.cljs new file mode 100644 index 0000000000..f121e04ca7 --- /dev/null +++ b/src/status_im/components/selectable_field/styles.cljs @@ -0,0 +1,36 @@ +(ns status-im.components.selectable-field.styles + (:require [status-im.utils.platform :refer [platform-specific]])) + + +(def selectable-field-container + {}) + +(def label-container + {:margin-bottom 13}) + +(def label + {:color "#838c93" + :background-color :transparent + :font-size 14}) + +(def text-container + {:padding 0 + :margin-bottom 18 + :margin 0}) + +(def text + {:font-size 16 + :color "#555555" + :margin-right 16 + :text-align-vertical :top}) + +(defn sized-text + [height] + (merge text {:height height + :margin-bottom 0 + :margin-top 0 + :padding-top 0 + :padding-left 0 + :margin-left 0 + :padding-bottom 0})) + diff --git a/src/status_im/components/selectable_field/view.cljs b/src/status_im/components/selectable_field/view.cljs new file mode 100644 index 0000000000..1f5c2e8df8 --- /dev/null +++ b/src/status_im/components/selectable_field/view.cljs @@ -0,0 +1,61 @@ +(ns status-im.components.selectable-field.view + (:require [status-im.components.react :refer [view + text-input + text]] + [reagent.core :as r] + [status-im.components.selectable-field.styles :as st] + [status-im.i18n :refer [label]] + [taoensso.timbre :as log])) + +(defn- on-press + [event component] + (log/debug "Pressed " event component) + (r/set-state component {:focused? true})) + +(defn- on-selection-change + [event component] + (let [selection (.-selection (.-nativeEvent event)) + start (.-start selection) + end (.-end selection)] + (log/debug "Selection changed: " start end))) + +(defn- on-layout-text + [event component] + (let [height (.-height (.-layout (.-nativeEvent event))) + {:keys [full-height]} (r/state component)] + (when (and (pos? height) (not full-height)) + (r/set-state component {:full-height height + :measured? true})))) + +(defn- reagent-render + [{:keys [label value props] :as data}] + (let [component (r/current-component) + {:keys [focused? measured? full-height]} (r/state component)] + (log/debug "reagent-render: " data focused? measured? full-height) + [view st/selectable-field-container + [view st/label-container + [text {:style st/label + :font :medium} (or label "")]] + [view st/text-container + (if focused? + [text-input {:style (st/sized-text full-height) + :multiline true + :selectTextOnFocus true + :editable true + :auto-focus true + :on-selection-change #(on-selection-change % component) + :on-focus #(log/debug "Focused" %) + :on-blur #(r/set-state component {:focused? false}) + :value value}] + [text (merge {:style st/text + :on-press #(on-press % component) + :onLayout #(on-layout-text % component) + :font :default + :ellipsizeMode :middle + :number-of-lines (if measured? 1 0)} (or props {})) (or value "")])]])) + +(defn selectable-field [{:keys [label value props]}] + (let [component-data {:display-name "selectable-field" + :reagent-render reagent-render}] + (reagent.core/create-class component-data))) + diff --git a/src/status_im/contacts/views/new_contact.cljs b/src/status_im/contacts/views/new_contact.cljs index 018fc6e2e4..fc982f6a2d 100644 --- a/src/status_im/contacts/views/new_contact.cljs +++ b/src/status_im/contacts/views/new_contact.cljs @@ -24,6 +24,7 @@ [cljs.spec :as s] [status-im.contacts.validations :as v] [status-im.contacts.styles :as st] + [status-im.utils.gfycat.core :refer [generate-gfy]] [status-im.utils.hex :refer [normalize-hex]])) @@ -38,13 +39,13 @@ (fn [{:keys [contacts]}] (if (> (count contacts) 0) (let [{:keys [whisper-identity]} (first contacts) - contact {:name "" + contact {:name (generate-gfy) :address id :photo-path (identicon whisper-identity) :whisper-identity whisper-identity}] (dispatch [:add-new-contact contact])) (dispatch [:set :new-contact-address-error (label :t/unknown-address)])))) - (dispatch [:add-new-contact {:name "" + (dispatch [:add-new-contact {:name (generate-gfy) :photo-path (identicon id) :whisper-identity id}]))) diff --git a/src/status_im/navigation/handlers.cljs b/src/status_im/navigation/handlers.cljs index c9521f396f..55df2ff4fd 100644 --- a/src/status_im/navigation/handlers.cljs +++ b/src/status_im/navigation/handlers.cljs @@ -78,12 +78,6 @@ (register-handler :show-profile show-profile) -(defn show-profile-photo-capture - [db _] - (push-view db :profile-photo-capture)) - -(register-handler :show-profile-photo-capture show-profile-photo-capture) - (defn navigate-to-clean [db [_ view-id]] (-> db diff --git a/src/status_im/profile/handlers.cljs b/src/status_im/profile/handlers.cljs index 8503ae222b..fec0730ba6 100644 --- a/src/status_im/profile/handlers.cljs +++ b/src/status_im/profile/handlers.cljs @@ -5,45 +5,22 @@ [status-im.utils.image-processing :refer [img->base64]] [status-im.i18n :refer [label]] [status-im.utils.handlers :as u :refer [get-hashtags]] - [status-im.utils.platform :refer [ios?]] [clojure.string :as str] [status-im.profile.validations :as v] - [cljs.spec :as s])) + [cljs.spec :as s] + [taoensso.timbre :as log])) (defn message-user [identity] (when identity (dispatch [:navigate-to :chat identity]))) -(defn update-profile [{name :name - email :email - photo-path :photo-path - status :status} - {new-name :name - new-email :email - new-status :status - new-photo-path :photo-path}] - (let [new-name (if (or (not new-name) - (not (s/valid? ::v/name new-name))) - name - new-name) - status-updated? (and (not= new-status nil) - (not= status new-status))] - (when status-updated? - (let [hashtags (get-hashtags new-status)] - (when-not (empty? hashtags) - (dispatch [:broadcast-status new-status hashtags])))) - (dispatch [:account-update {:name new-name - :email (or new-email email) - :status (or new-status status) - :photo-path (or new-photo-path photo-path)}]))) - (register-handler :open-image-picker (u/side-effect! (fn [_ _] (show-image-picker (fn [image] (let [path (get (js->clj image) "path") - path (if ios? path (subs path 12)) + _ (log/debug path) on-success (fn [base64] (dispatch [:set-in [:profile-edit :photo-path] (str "data:image/jpeg;base64," base64)])) on-error (fn [type error] @@ -57,7 +34,7 @@ :options [(label :t/image-source-make-photo) (label :t/image-source-gallery)] :callback (fn [index] (case index - 0 (dispatch [:show-profile-photo-capture]) + 0 (dispatch [:navigate-to :profile-photo-capture]) 1 (dispatch [:open-image-picker]) :default)) :cancel-text (label :t/image-source-cancel)})))) diff --git a/src/status_im/profile/photo_capture/screen.cljs b/src/status_im/profile/photo_capture/screen.cljs index d4b524c8db..80be3a6b6c 100644 --- a/src/status_im/profile/photo_capture/screen.cljs +++ b/src/status_im/profile/photo_capture/screen.cljs @@ -16,15 +16,18 @@ [status-im.utils.image-processing :refer [img->base64]] [status-im.profile.photo-capture.styles :as st] [status-im.i18n :refer [label]] - [reagent.core :as r])) + [reagent.core :as r] + [taoensso.timbre :as log])) -(defn image-captured [path] - (let [path (subs path 5) +(defn image-captured [data] + (let [path (.-path data) + _ (log/debug "Captured image: " path) on-success (fn [base64] + (log/debug "Captured success: " base64) (dispatch [:set-in [:profile-edit :photo-path] (str "data:image/jpeg;base64," base64)]) (dispatch [:navigate-back])) on-error (fn [type error] - (.log js/console type error))] + (log/debug type error))] (img->base64 path on-success on-error))) (defn profile-photo-capture [] @@ -47,7 +50,8 @@ :on-press (fn [] (let [camera @camera-ref] (-> (.capture camera) - (.then image-captured))))} + (.then image-captured) + (.catch #(log/debug "Error capturing image: " %)))))} [view [ion-icon {:name :md-camera :style {:font-size 36}}]]]]])) \ No newline at end of file diff --git a/src/status_im/profile/screen.cljs b/src/status_im/profile/screen.cljs index 5f072e666d..9dd10a5654 100644 --- a/src/status_im/profile/screen.cljs +++ b/src/status_im/profile/screen.cljs @@ -12,24 +12,25 @@ scroll-view touchable-highlight touchable-opacity - show-image-picker]] + show-image-picker + dismiss-keyboard!]] [status-im.components.icons.custom-icons :refer [oct-icon]] [status-im.components.chat-icon.screen :refer [my-profile-icon]] [status-im.components.status-bar :refer [status-bar]] [status-im.components.text-field.view :refer [text-field]] + [status-im.components.selectable-field.view :refer [selectable-field]] [status-im.components.qr-code :refer [qr-code]] - [status-im.utils.handlers :refer [get-hashtags]] [status-im.utils.phone-number :refer [format-phone-number]] [status-im.utils.image-processing :refer [img->base64]] [status-im.utils.platform :refer [platform-specific]] - [status-im.profile.handlers :refer [message-user - update-profile]] + [status-im.profile.handlers :refer [message-user]] [status-im.profile.validations :as v] [status-im.profile.styles :as st] + [status-im.utils.random :refer [id]] [status-im.i18n :refer [label]])) -(defn toolbar [{:keys [account profile-edit-data edit?]}] - (let [profile-edit-data-valid? (s/valid? ::v/profile profile-edit-data)] +(defn toolbar [{:keys [account edit?]}] + (let [profile-edit-data-valid? (s/valid? ::v/profile account)] [view [touchable-highlight {:style st/back-btn-touchable :on-press (fn [] @@ -41,20 +42,32 @@ :on-press (fn [] (if edit? (when profile-edit-data-valid? - (update-profile account profile-edit-data) + (dismiss-keyboard!) + (dispatch [:check-status-change (:status account)]) + (dispatch [:account-update account]) (dispatch [:set-in [:profile-edit :edit?] false])) - (dispatch [:set-in [:profile-edit :edit?] true])))} + (dispatch [:set :profile-edit (merge account {:edit? true})])))} [view st/actions-btn-container (if edit? [oct-icon {:name :check :style (st/ok-btn-icon profile-edit-data-valid?)}] [icon :dots st/edit-btn-icon])]]])) -(defn status-image-view [{{address :address - username :name} :account - {new-name :name} :profile-edit-data - photo-path :photo-path - status :status +(defn- get-text + [word] + (let [props (merge {:key (id)} + (if (str/starts-with? word "#") + {:style st/hashtag} + {}))] + [text props (str word " ")])) + +(defn- highlight-tags + [status] + (->> + (str/split status #" ") + (map get-text))) + +(defn status-image-view [{{:keys [name status photo-path]} :account edit? :edit?}] [view st/status-block [view st/user-photo-container @@ -64,27 +77,27 @@ (dispatch [:open-image-source-selector list-selection-fn])))} [view [my-profile-icon {:account {:photo-path photo-path - :name username} + :name name} :edit? edit?}]]] [my-profile-icon {:account {:photo-path photo-path - :name username} + :name name} :edit? edit?}])] [text-field {:line-color :white :focus-line-color :white - :placeholder (label :t/user-anonymous) :editable edit? - :input-style (st/username-input edit? (s/valid? ::v/name (or new-name username))) + :input-style (st/username-input edit? (s/valid? ::v/name name)) :wrapper-style st/username-wrapper - :value (if (not= username address) - username) + :value name :on-change-text #(dispatch [:set-in [:profile-edit :name] %])}] - [text-input {:style st/status-input - :maxLength 140 - :editable edit? - :placeholder (label :t/profile-no-status) - :on-change-text #(dispatch [:set-in [:profile-edit :status] %]) - :default-value status}]]) + (if edit? + [text-input {:style st/status-input + :maxLength 140 + :editable edit? + :placeholder (label :t/profile-no-status) + :on-change-text #(dispatch [:set-in [:profile-edit :status] %]) + :default-value status}] + [text {:style st/status-text} (highlight-tags status)])]) (defview profile [] [{whisper-identity :whisper-identity @@ -149,69 +162,43 @@ )} [view [text {:style st/report-user-text} (label :t/report-user)]]]]]]) -(defview my-profile-render [] - [{public-key :public-key - address :address - username :name - email :email - photo-path :photo-path - phone :phone - status :status - :as account} [:get-current-account] - {edit? :edit? - new-name :name - new-email :email - new-status :status - new-photo-path :photo-path - :as profile-edit-data} [:get :profile-edit]] - [scroll-view {:style st/profile} - [status-bar] - [toolbar {:account account - :profile-edit-data profile-edit-data - :edit? edit?}] - - [status-image-view {:account account - :profile-edit-data profile-edit-data - :photo-path (or new-photo-path photo-path) - :status (or new-status status) - :edit? edit?}] - - [scroll-view st/profile-properties-container - [text-field - {:editable false - :input-style st/profile-input-text-non-editable - :wrapper-style st/profile-input-wrapper - :value (if (and phone (not (str/blank? phone))) - (format-phone-number phone)) - :label (label :t/phone-number)}] - - [text-field - {:error (if-not (s/valid? ::v/email new-email) - (label :t/error-incorrect-email)) - :error-color "#7099e6" - :editable edit? - :input-style (if edit? - st/profile-input-text - st/profile-input-text-non-editable) - :wrapper-style st/profile-input-wrapper - :value (if (and email (not (str/blank? email))) - email) - :label (label :t/email) - :on-change-text #(dispatch [:set-in [:profile-edit :email] %])}] - - [view st/qr-code-container - ;; TODO: this public key should be replaced by address - [qr-code {:value (str "ethereum:" public-key) - :size 220}]]]]) - (defview my-profile [] - [{username :name - email :email} [:get-current-account]] - (r/create-class - {:component-will-mount - (fn [] - (dispatch [:set :profile-edit {:edit? false - :name username - :email email}])) - :reagent-render - my-profile-render})) + [edit? [:get-in [:profile-edit :edit?]] + current-account [:get-current-account] + changed-account [:get :profile-edit]] + (let [{:keys [phone + address + public-key] :as account} (if edit? + changed-account + current-account)] + [scroll-view {:style st/profile + :keyboardShouldPersistTaps true} + [status-bar] + [toolbar {:account account + :edit? edit?}] + + [status-image-view {:account account + :edit? edit?}] + + [scroll-view (merge st/profile-properties-container {:keyboardShouldPersistTaps true}) + [view st/profile-property + [selectable-field {:label (label :t/phone-number) + :value (if (and phone (not (str/blank? phone))) + (format-phone-number phone) + (label :t/not-specified))}] + [view st/underline-container]] + + [view st/profile-property + [selectable-field {:label (label :t/address) + :value address}] + [view st/underline-container]] + + [view st/profile-property + [selectable-field {:label (label :t/public-key) + :value public-key}]] + + [view st/underline-container] + + [view st/qr-code-container + [qr-code {:value (str "ethereum:" public-key) + :size 220}]]]])) \ No newline at end of file diff --git a/src/status_im/profile/styles.cljs b/src/status_im/profile/styles.cljs index c73a6b02d1..af153b07c0 100644 --- a/src/status_im/profile/styles.cljs +++ b/src/status_im/profile/styles.cljs @@ -53,8 +53,8 @@ {:margin-top 22}) (def username-wrapper - {:width 300 - :margin-top -22 + {:width 300 + :margin-top -22 :margin-bottom -16}) (defn username-input [edit? valid?] @@ -68,20 +68,28 @@ {:flex-direction "column" :align-items "center" :justifyContent "center" - :margin-left 100 - :margin-right 100}) + :margin-bottom 38 + :margin-left 55 + :margin-right 55}) (def status-input {:align-self "stretch" :margin-left 16 :margin-right 16 :height 40 - :margin-top -4 + :margin-top 0 :font-size 14 :line-height 20 :text-align :center :color text2-color}) +(def status-text + {:text-align :center + :margin-left 0 + :margin-right 0 + :margin-top 10 + :color text2-color}) + (def btns-container {:margin-top 18 :flex-direction :row}) @@ -95,9 +103,9 @@ :border-radius 20}) (def message-btn-text - {:margin-top -2.5 - :font-size 14 - :color color-white}) + {:margin-top -2.5 + :font-size 14 + :color color-white}) (def more-btn {:margin-left 10 @@ -114,11 +122,12 @@ :height 16}) (def profile-properties-container - {:margin-top 20 - :margin-left 16 - :align-items :stretch + {:align-items :stretch :flex-firection :column}) +(def profile-property + {:margin-left 16}) + (def profile-input-wrapper {:margin-bottom 16}) @@ -144,3 +153,12 @@ {:flex 1 :alignItems :center :margin 32}) + +(def hashtag + {:color "#7099e6"}) + +(def underline-container + {:background-color "#0000001f" + :margin-bottom 18 + :height 1 + :align-items :center}) diff --git a/src/status_im/profile/validations.cljs b/src/status_im/profile/validations.cljs index 78882ebc71..1e29f7883a 100644 --- a/src/status_im/profile/validations.cljs +++ b/src/status_im/profile/validations.cljs @@ -18,4 +18,4 @@ (s/def ::name correct-name?) (s/def ::email correct-email?) -(s/def ::profile (s/keys :req-un [::name ::email])) +(s/def ::profile (s/keys :req-un [::name])) diff --git a/src/status_im/translations/en.cljs b/src/status_im/translations/en.cljs index 025d56e39e..92727dfe9b 100644 --- a/src/status_im/translations/en.cljs +++ b/src/status_im/translations/en.cljs @@ -63,6 +63,7 @@ :username "Username" :user-anonymous "Anonymous" :not-specified "Not specified" + :public-key "Public Key" :phone-number "Phone number" :email "Email" :profile-no-status "No status" diff --git a/src/status_im/utils/gfycat/adjectives.cljs b/src/status_im/utils/gfycat/adjectives.cljs new file mode 100644 index 0000000000..138b38d42a --- /dev/null +++ b/src/status_im/utils/gfycat/adjectives.cljs @@ -0,0 +1,1505 @@ +(ns status-im.utils.gfycat.adjectives) + + +(def data + ["abandoned" + "able" + "absolute" + "academic" + "acceptable" + "acclaimed" + "accomplished" + "accurate" + "aching" + "acidic" + "acrobatic" + "adorable" + "adventurous" + "babyish" + "back" + "bad" + "baggy" + "bare" + "barren" + "basic" + "beautiful" + "belated" + "beloved" + "calculating" + "calm" + "candid" + "canine" + "capital" + "carefree" + "careful" + "careless" + "caring" + "cautious" + "cavernous" + "celebrated" + "charming" + "damaged" + "damp" + "dangerous" + "dapper" + "daring" + "dark" + "darling" + "dazzling" + "dead" + "deadly" + "deafening" + "dear" + "dearest" + "each" + "eager" + "early" + "earnest" + "easy" + "easygoing" + "ecstatic" + "edible" + "educated" + "fabulous" + "failing" + "faint" + "fair" + "faithful" + "fake" + "familiar" + "famous" + "fancy" + "fantastic" + "far" + "faraway" + "farflung" + "faroff" + "gargantuan" + "gaseous" + "general" + "generous" + "gentle" + "genuine" + "giant" + "giddy" + "gigantic" + "hairy" + "half" + "handmade" + "handsome" + "handy" + "happy" + "happygolucky" + "hard" + "icky" + "icy" + "ideal" + "idealistic" + "identical" + "idiotic" + "idle" + "idolized" + "ignorant" + "ill" + "illegal" + "jaded" + "jagged" + "jampacked" + "kaleidoscopic" + "keen" + "lame" + "lanky" + "large" + "last" + "lasting" + "late" + "lavish" + "lawful" + "mad" + "madeup" + "magnificent" + "majestic" + "major" + "male" + "mammoth" + "married" + "marvelous" + "naive" + "narrow" + "nasty" + "natural" + "naughty" + "obedient" + "obese" + "oblong" + "oblong" + "obvious" + "occasional" + "oily" + "palatable" + "pale" + "paltry" + "parallel" + "parched" + "partial" + "passionate" + "past" + "pastel" + "peaceful" + "peppery" + "perfect" + "perfumed" + "quaint" + "qualified" + "radiant" + "ragged" + "rapid" + "rare" + "rash" + "raw" + "recent" + "reckless" + "rectangular" + "sad" + "safe" + "salty" + "same" + "sandy" + "sane" + "sarcastic" + "sardonic" + "satisfied" + "scaly" + "scarce" + "scared" + "scary" + "scented" + "scholarly" + "scientific" + "scornful" + "scratchy" + "scrawny" + "second" + "secondary" + "secondhand" + "secret" + "selfassured" + "selfish" + "selfreliant" + "sentimental" + "talkative" + "tall" + "tame" + "tan" + "tangible" + "tart" + "tasty" + "tattered" + "taut" + "tedious" + "teeming" + "ugly" + "ultimate" + "unacceptable" + "unaware" + "uncomfortable" + "uncommon" + "unconscious" + "understated" + "unequaled" + "vacant" + "vague" + "vain" + "valid" + "wan" + "warlike" + "warm" + "warmhearted" + "warped" + "wary" + "wasteful" + "watchful" + "waterlogged" + "watery" + "wavy" + "yawning" + "yearly" + "zany" + "false" + "active" + "actual" + "adept" + "admirable" + "admired" + "adolescent" + "adorable" + "adored" + "advanced" + "affectionate" + "afraid" + "aged" + "aggravating" + "beneficial" + "best" + "better" + "bewitched" + "big" + "bighearted" + "biodegradable" + "bitesized" + "bitter" + "black" + "cheap" + "cheerful" + "cheery" + "chief" + "chilly" + "chubby" + "circular" + "classic" + "clean" + "clear" + "clearcut" + "clever" + "close" + "closed" + "decent" + "decimal" + "decisive" + "deep" + "defenseless" + "defensive" + "defiant" + "deficient" + "definite" + "definitive" + "delayed" + "delectable" + "delicious" + "elaborate" + "elastic" + "elated" + "elderly" + "electric" + "elegant" + "elementary" + "elliptical" + "embarrassed" + "fast" + "fat" + "fatal" + "fatherly" + "favorable" + "favorite" + "fearful" + "fearless" + "feisty" + "feline" + "female" + "feminine" + "few" + "fickle" + "gifted" + "giving" + "glamorous" + "glaring" + "glass" + "gleaming" + "gleeful" + "glistening" + "glittering" + "hardtofind" + "harmful" + "harmless" + "harmonious" + "harsh" + "hasty" + "hateful" + "haunting" + "illfated" + "illinformed" + "illiterate" + "illustrious" + "imaginary" + "imaginative" + "immaculate" + "immaterial" + "immediate" + "immense" + "impassioned" + "jaunty" + "jealous" + "jittery" + "key" + "kind" + "lazy" + "leading" + "leafy" + "lean" + "left" + "legal" + "legitimate" + "light" + "masculine" + "massive" + "mature" + "meager" + "mealy" + "mean" + "measly" + "meaty" + "medical" + "mediocre" + "nautical" + "near" + "neat" + "necessary" + "needy" + "odd" + "oddball" + "offbeat" + "offensive" + "official" + "old" + "periodic" + "perky" + "personal" + "pertinent" + "pesky" + "pessimistic" + "petty" + "phony" + "physical" + "piercing" + "pink" + "pitiful" + "plain" + "quarrelsome" + "quarterly" + "ready" + "real" + "realistic" + "reasonable" + "red" + "reflecting" + "regal" + "regular" + "separate" + "serene" + "serious" + "serpentine" + "several" + "severe" + "shabby" + "shadowy" + "shady" + "shallow" + "shameful" + "shameless" + "sharp" + "shimmering" + "shiny" + "shocked" + "shocking" + "shoddy" + "short" + "shortterm" + "showy" + "shrill" + "shy" + "sick" + "silent" + "silky" + "tempting" + "tender" + "tense" + "tepid" + "terrible" + "terrific" + "testy" + "thankful" + "that" + "these" + "uneven" + "unfinished" + "unfit" + "unfolded" + "unfortunate" + "unhappy" + "unhealthy" + "uniform" + "unimportant" + "unique" + "valuable" + "vapid" + "variable" + "vast" + "velvety" + "weak" + "wealthy" + "weary" + "webbed" + "wee" + "weekly" + "weepy" + "weighty" + "weird" + "welcome" + "welldocumented" + "yellow" + "zealous" + "aggressive" + "agile" + "agitated" + "agonizing" + "agreeable" + "ajar" + "alarmed" + "alarming" + "alert" + "alienated" + "alive" + "all" + "altruistic" + "blackandwhite" + "bland" + "blank" + "blaring" + "bleak" + "blind" + "blissful" + "blond" + "blue" + "blushing" + "cloudy" + "clueless" + "clumsy" + "cluttered" + "coarse" + "cold" + "colorful" + "colorless" + "colossal" + "comfortable" + "common" + "compassionate" + "competent" + "complete" + "delightful" + "delirious" + "demanding" + "dense" + "dental" + "dependable" + "dependent" + "descriptive" + "deserted" + "detailed" + "determined" + "devoted" + "different" + "embellished" + "eminent" + "emotional" + "empty" + "enchanted" + "enchanting" + "energetic" + "enlightened" + "enormous" + "filthy" + "fine" + "finished" + "firm" + "first" + "firsthand" + "fitting" + "fixed" + "flaky" + "flamboyant" + "flashy" + "flat" + "flawed" + "flawless" + "flickering" + "gloomy" + "glorious" + "glossy" + "glum" + "golden" + "good" + "goodnatured" + "gorgeous" + "graceful" + "healthy" + "heartfelt" + "hearty" + "heavenly" + "heavy" + "hefty" + "helpful" + "helpless" + "impartial" + "impeccable" + "imperfect" + "imperturbable" + "impish" + "impolite" + "important" + "impossible" + "impractical" + "impressionable" + "impressive" + "improbable" + "joint" + "jolly" + "jovial" + "kindhearted" + "kindly" + "lighthearted" + "likable" + "likely" + "limited" + "limp" + "limping" + "linear" + "lined" + "liquid" + "medium" + "meek" + "mellow" + "melodic" + "memorable" + "menacing" + "merry" + "messy" + "metallic" + "mild" + "negative" + "neglected" + "negligible" + "neighboring" + "nervous" + "new" + "oldfashioned" + "only" + "open" + "optimal" + "optimistic" + "opulent" + "plaintive" + "plastic" + "playful" + "pleasant" + "pleased" + "pleasing" + "plump" + "plush" + "pointed" + "pointless" + "poised" + "polished" + "polite" + "political" + "queasy" + "querulous" + "reliable" + "relieved" + "remarkable" + "remorseful" + "remote" + "repentant" + "required" + "respectful" + "responsible" + "silly" + "silver" + "similar" + "simple" + "simplistic" + "sinful" + "single" + "sizzling" + "skeletal" + "skinny" + "sleepy" + "slight" + "slim" + "slimy" + "slippery" + "slow" + "slushy" + "small" + "smart" + "smoggy" + "smooth" + "smug" + "snappy" + "snarling" + "sneaky" + "sniveling" + "snoopy" + "thick" + "thin" + "third" + "thirsty" + "this" + "thorny" + "thorough" + "those" + "thoughtful" + "threadbare" + "united" + "unkempt" + "unknown" + "unlawful" + "unlined" + "unlucky" + "unnatural" + "unpleasant" + "unrealistic" + "venerated" + "vengeful" + "verifiable" + "vibrant" + "vicious" + "wellgroomed" + "wellinformed" + "welllit" + "wellmade" + "welloff" + "welltodo" + "wellworn" + "wet" + "which" + "whimsical" + "whirlwind" + "whispered" + "yellowish" + "zesty" + "amazing" + "ambitious" + "ample" + "amused" + "amusing" + "anchored" + "ancient" + "angelic" + "angry" + "anguished" + "animated" + "annual" + "another" + "antique" + "bogus" + "boiling" + "bold" + "bony" + "boring" + "bossy" + "both" + "bouncy" + "bountiful" + "bowed" + "complex" + "complicated" + "composed" + "concerned" + "concrete" + "confused" + "conscious" + "considerate" + "constant" + "content" + "conventional" + "cooked" + "cool" + "cooperative" + "difficult" + "digital" + "diligent" + "dim" + "dimpled" + "dimwitted" + "direct" + "disastrous" + "discrete" + "disfigured" + "disgusting" + "disloyal" + "dismal" + "enraged" + "entire" + "envious" + "equal" + "equatorial" + "essential" + "esteemed" + "ethical" + "euphoric" + "flimsy" + "flippant" + "flowery" + "fluffy" + "fluid" + "flustered" + "focused" + "fond" + "foolhardy" + "foolish" + "forceful" + "forked" + "formal" + "forsaken" + "gracious" + "grand" + "grandiose" + "granular" + "grateful" + "grave" + "gray" + "great" + "greedy" + "green" + "hidden" + "hideous" + "high" + "highlevel" + "hilarious" + "hoarse" + "hollow" + "homely" + "impure" + "inborn" + "incomparable" + "incompatible" + "incomplete" + "inconsequential" + "incredible" + "indelible" + "indolent" + "inexperienced" + "infamous" + "infantile" + "joyful" + "joyous" + "jubilant" + "klutzy" + "knobby" + "little" + "live" + "lively" + "livid" + "loathsome" + "lone" + "lonely" + "long" + "milky" + "mindless" + "miniature" + "minor" + "minty" + "miserable" + "miserly" + "misguided" + "misty" + "mixed" + "next" + "nice" + "nifty" + "nimble" + "nippy" + "orange" + "orderly" + "ordinary" + "organic" + "ornate" + "ornery" + "poor" + "popular" + "portly" + "posh" + "positive" + "possible" + "potable" + "powerful" + "powerless" + "practical" + "precious" + "present" + "prestigious" + "questionable" + "quick" + "repulsive" + "revolving" + "rewarding" + "rich" + "right" + "rigid" + "ringed" + "ripe" + "sociable" + "soft" + "soggy" + "solid" + "somber" + "some" + "sophisticated" + "sore" + "sorrowful" + "soulful" + "soupy" + "sour" + "spanish" + "sparkling" + "sparse" + "specific" + "spectacular" + "speedy" + "spherical" + "spicy" + "spiffy" + "spirited" + "spiteful" + "splendid" + "spotless" + "spotted" + "spry" + "thrifty" + "thunderous" + "tidy" + "tight" + "timely" + "tinted" + "tiny" + "tired" + "torn" + "total" + "unripe" + "unruly" + "unselfish" + "unsightly" + "unsteady" + "unsung" + "untidy" + "untimely" + "untried" + "victorious" + "vigilant" + "vigorous" + "villainous" + "violet" + "white" + "whole" + "whopping" + "wicked" + "wide" + "wideeyed" + "wiggly" + "wild" + "willing" + "wilted" + "winding" + "windy" + "young" + "zigzag" + "anxious" + "any" + "apprehensive" + "appropriate" + "apt" + "arctic" + "arid" + "aromatic" + "artistic" + "ashamed" + "assured" + "astonishing" + "athletic" + "brave" + "breakable" + "brief" + "bright" + "brilliant" + "brisk" + "broken" + "bronze" + "brown" + "bruised" + "coordinated" + "corny" + "corrupt" + "costly" + "courageous" + "courteous" + "crafty" + "crazy" + "creamy" + "creative" + "creepy" + "criminal" + "crisp" + "dirty" + "disguised" + "dishonest" + "dismal" + "distant" + "distant" + "distinct" + "distorted" + "dizzy" + "dopey" + "downright" + "dreary" + "even" + "evergreen" + "everlasting" + "every" + "evil" + "exalted" + "excellent" + "excitable" + "exemplary" + "exhausted" + "forthright" + "fortunate" + "fragrant" + "frail" + "frank" + "frayed" + "free" + "french" + "frequent" + "fresh" + "friendly" + "frightened" + "frightening" + "frigid" + "gregarious" + "grim" + "grimy" + "gripping" + "grizzled" + "gross" + "grotesque" + "grouchy" + "grounded" + "honest" + "honorable" + "honored" + "hopeful" + "horrible" + "hospitable" + "hot" + "huge" + "infatuated" + "inferior" + "infinite" + "informal" + "innocent" + "insecure" + "insidious" + "insignificant" + "insistent" + "instructive" + "insubstantial" + "judicious" + "juicy" + "jumbo" + "knotty" + "knowing" + "knowledgeable" + "longterm" + "loose" + "lopsided" + "lost" + "loud" + "lovable" + "lovely" + "loving" + "modern" + "modest" + "moist" + "monstrous" + "monthly" + "monumental" + "moral" + "mortified" + "motherly" + "motionless" + "nocturnal" + "noisy" + "nonstop" + "normal" + "notable" + "noted" + "original" + "other" + "our" + "outgoing" + "outlandish" + "outlying" + "precious" + "pretty" + "previous" + "pricey" + "prickly" + "primary" + "prime" + "pristine" + "private" + "prize" + "probable" + "productive" + "profitable" + "quickwitted" + "quiet" + "quintessential" + "roasted" + "robust" + "rosy" + "rotating" + "rotten" + "rough" + "round" + "rowdy" + "square" + "squeaky" + "squiggly" + "stable" + "staid" + "stained" + "stale" + "standard" + "starchy" + "stark" + "starry" + "steel" + "steep" + "sticky" + "stiff" + "stimulating" + "stingy" + "stormy" + "straight" + "strange" + "strict" + "strident" + "striking" + "striped" + "strong" + "studious" + "stunning" + "tough" + "tragic" + "trained" + "traumatic" + "treasured" + "tremendous" + "tremendous" + "triangular" + "tricky" + "trifling" + "trim" + "untrue" + "unused" + "unusual" + "unwelcome" + "unwieldy" + "unwilling" + "unwitting" + "unwritten" + "upbeat" + "violent" + "virtual" + "virtuous" + "visible" + "winged" + "wiry" + "wise" + "witty" + "wobbly" + "woeful" + "wonderful" + "wooden" + "woozy" + "wordy" + "worldly" + "worn" + "youthful" + "attached" + "attentive" + "attractive" + "austere" + "authentic" + "authorized" + "automatic" + "avaricious" + "average" + "aware" + "awesome" + "awful" + "awkward" + "bubbly" + "bulky" + "bumpy" + "buoyant" + "burdensome" + "burly" + "bustling" + "busy" + "buttery" + "buzzing" + "critical" + "crooked" + "crowded" + "cruel" + "crushing" + "cuddly" + "cultivated" + "cultured" + "cumbersome" + "curly" + "curvy" + "cute" + "cylindrical" + "doting" + "double" + "downright" + "drab" + "drafty" + "dramatic" + "dreary" + "droopy" + "dry" + "dual" + "dull" + "dutiful" + "excited" + "exciting" + "exotic" + "expensive" + "experienced" + "expert" + "extralarge" + "extraneous" + "extrasmall" + "extroverted" + "frilly" + "frivolous" + "frizzy" + "front" + "frosty" + "frozen" + "frugal" + "fruitful" + "full" + "fumbling" + "functional" + "funny" + "fussy" + "fuzzy" + "growing" + "growling" + "grown" + "grubby" + "gruesome" + "grumpy" + "guilty" + "gullible" + "gummy" + "humble" + "humiliating" + "humming" + "humongous" + "hungry" + "hurtful" + "husky" + "intelligent" + "intent" + "intentional" + "interesting" + "internal" + "international" + "intrepid" + "ironclad" + "irresponsible" + "irritating" + "itchy" + "jumpy" + "junior" + "juvenile" + "known" + "kooky" + "kosher" + "low" + "loyal" + "lucky" + "lumbering" + "luminous" + "lumpy" + "lustrous" + "luxurious" + "mountainous" + "muddy" + "muffled" + "multicolored" + "mundane" + "murky" + "mushy" + "musty" + "muted" + "mysterious" + "noteworthy" + "novel" + "noxious" + "numb" + "nutritious" + "nutty" + "onerlooked" + "outrageous" + "outstanding" + "oval" + "overcooked" + "overdue" + "overjoyed" + "profuse" + "proper" + "proud" + "prudent" + "punctual" + "pungent" + "puny" + "pure" + "purple" + "pushy" + "putrid" + "puzzled" + "puzzling" + "quirky" + "quixotic" + "quizzical" + "royal" + "rubbery" + "ruddy" + "rude" + "rundown" + "runny" + "rural" + "rusty" + "stupendous" + "stupid" + "sturdy" + "stylish" + "subdued" + "submissive" + "substantial" + "subtle" + "suburban" + "sudden" + "sugary" + "sunny" + "super" + "superb" + "superficial" + "superior" + "supportive" + "surefooted" + "surprised" + "suspicious" + "svelte" + "sweaty" + "sweet" + "sweltering" + "swift" + "sympathetic" + "trivial" + "troubled" + "trusting" + "trustworthy" + "trusty" + "truthful" + "tubby" + "turbulent" + "twin" + "upright" + "upset" + "urban" + "usable" + "used" + "useful" + "useless" + "utilized" + "utter" + "vital" + "vivacious" + "vivid" + "voluminous" + "worried" + "worrisome" + "worse" + "worst" + "worthless" + "worthwhile" + "worthy" + "wrathful" + "wretched" + "writhing" + "wrong" + "wry" + "yummy" + "true" + "aliceblue" + "antiquewhite" + "aqua" + "aquamarine" + "azure" + "beige" + "bisque" + "black" + "blanchedalmond" + "blue" + "blueviolet" + "brown" + "burlywood" + "cadetblue" + "chartreuse" + "chocolate" + "coral" + "cornflowerblue" + "cornsilk" + "crimson" + "cyan" + "darkblue" + "darkcyan" + "darkgoldenrod" + "darkgray" + "darkgreen" + "darkgrey" + "darkkhaki" + "darkmagenta" + "darkolivegreen" + "darkorange" + "darkorchid" + "darkred" + "darksalmon" + "darkseagreen" + "darkslateblue" + "darkslategray" + "darkslategrey" + "darkturquoise" + "darkviolet" + "deeppink" + "deepskyblue" + "dimgray" + "dimgrey" + "dodgerblue" + "firebrick" + "floralwhite" + "forestgreen" + "fractal" + "fuchsia" + "gainsboro" + "ghostwhite" + "gold" + "goldenrod" + "gray" + "green" + "greenyellow" + "honeydew" + "hotpink" + "indianred" + "indigo" + "ivory" + "khaki" + "lavender" + "lavenderblush" + "lawngreen" + "lemonchiffon" + "lightblue" + "lightcoral" + "lightcyan" + "lightgoldenrod" + "lightgoldenrodyellow" + "lightgray" + "lightgreen" + "lightgrey" + "lightpink" + "lightsalmon" + "lightseagreen" + "lightskyblue" + "lightslateblue" + "lightslategray" + "lightsteelblue" + "lightyellow" + "lime" + "limegreen" + "linen" + "magenta" + "maroon" + "mediumaquamarine" + "mediumblue" + "mediumforestgreen" + "mediumgoldenrod" + "mediumorchid" + "mediumpurple" + "mediumseagreen" + "mediumslateblue" + "mediumspringgreen" + "mediumturquoise" + "mediumvioletred" + "midnightblue" + "mintcream" + "mistyrose" + "moccasin" + "navajowhite" + "navy" + "navyblue" + "oldlace" + "olive" + "olivedrab" + "opaque" + "orange" + "orangered" + "orchid" + "palegoldenrod" + "palegreen" + "paleturquoise" + "palevioletred" + "papayawhip" + "peachpuff" + "peru" + "pink" + "plum" + "powderblue" + "purple" + "red" + "rosybrown" + "royalblue" + "saddlebrown" + "salmon" + "sandybrown" + "seagreen" + "seashell" + "sienna" + "silver" + "skyblue" + "slateblue" + "slategray" + "slategrey" + "snow" + "springgreen" + "steelblue" + "tan" + "teal" + "thistle" + "tomato" + "transparent" + "turquoise" + "violet" + "violetred" + "wheat" + "white" + "whitesmoke" + "yellow" + "yellowgreen"]) \ No newline at end of file diff --git a/src/status_im/utils/gfycat/animals.cljs b/src/status_im/utils/gfycat/animals.cljs new file mode 100644 index 0000000000..64a0e660b9 --- /dev/null +++ b/src/status_im/utils/gfycat/animals.cljs @@ -0,0 +1,1753 @@ +(ns status-im.utils.gfycat.animals) + +(def data + ["aardvark" + "aardwolf" + "abalone" + "abyssiniancat" + "abyssiniangroundhornbill" + "acaciarat" + "achillestang" + "acornbarnacle" + "acornweevil" + "acornwoodpecker" + "acouchi" + "adamsstaghornedbeetle" + "addax" + "adder" + "adeliepenguin" + "admiralbutterfly" + "adouri" + "aegeancat" + "affenpinscher" + "afghanhound" + "africanaugurbuzzard" + "africanbushviper" + "africancivet" + "africanclawedfrog" + "africanelephant" + "africanfisheagle" + "africangoldencat" + "africangroundhornbill" + "africanharrierhawk" + "africanhornbill" + "africanjacana" + "africanmolesnake" + "africanparadiseflycatcher" + "africanpiedkingfisher" + "africanporcupine" + "africanrockpython" + "africanwildcat" + "africanwilddog" + "agama" + "agouti" + "aidi" + "airedale" + "airedaleterrier" + "akitainu" + "alabamamapturtle" + "alaskajingle" + "alaskanhusky" + "alaskankleekai" + "alaskanmalamute" + "albacoretuna" + "albatross" + "albertosaurus" + "albino" + "aldabratortoise" + "allensbigearedbat" + "alleycat" + "alligator" + "alligatorgar" + "alligatorsnappingturtle" + "allosaurus" + "alpaca" + "alpinegoat" + "alpineroadguidetigerbeetle" + "altiplanochinchillamouse" + "amazondolphin" + "amazonparrot" + "amazontreeboa" + "amberpenshell" + "ambushbug" + "americanalligator" + "americanavocet" + "americanbadger" + "americanbittern" + "americanblackvulture" + "americanbobtail" + "americanbulldog" + "americancicada" + "americancrayfish" + "americancreamdraft" + "americancrocodile" + "americancrow" + "americancurl" + "americangoldfinch" + "americanindianhorse" + "americankestrel" + "americanlobster" + "americanmarten" + "americanpainthorse" + "americanquarterhorse" + "americanratsnake" + "americanredsquirrel" + "americanriverotter" + "americanrobin" + "americansaddlebred" + "americanshorthair" + "americantoad" + "americanwarmblood" + "americanwigeon" + "americanwirehair" + "amethystgemclam" + "amethystinepython" + "amethystsunbird" + "ammonite" + "amoeba" + "amphibian" + "amphiuma" + "amurminnow" + "amurratsnake" + "amurstarfish" + "anaconda" + "anchovy" + "andalusianhorse" + "andeancat" + "andeancockoftherock" + "andeancondor" + "anemone" + "anemonecrab" + "anemoneshrimp" + "angelfish" + "angelwingmussel" + "anglerfish" + "angora" + "angwantibo" + "anhinga" + "ankole" + "ankolewatusi" + "annashummingbird" + "annelid" + "annelida" + "anole" + "anophelesmosquito" + "ant" + "antarcticfurseal" + "antarcticgiantpetrel" + "antbear" + "anteater" + "antelope" + "antelopegroundsquirrel" + "antipodesgreenparakeet" + "antlion" + "anura" + "aoudad" + "apatosaur" + "ape" + "aphid" + "apisdorsatalaboriosa" + "aplomadofalcon" + "appaloosa" + "aquaticleech" + "arabianhorse" + "arabianoryx" + "arabianwildcat" + "aracari" + "arachnid" + "arawana" + "archaeocete" + "archaeopteryx" + "archerfish" + "arcticduck" + "arcticfox" + "arctichare" + "arcticseal" + "arcticwolf" + "argali" + "argentinehornedfrog" + "argentineruddyduck" + "argusfish" + "arieltoucan" + "arizonaalligatorlizard" + "arkshell" + "armadillo" + "armedcrab" + "armednylonshrimp" + "armyant" + "armyworm" + "arrowana" + "arrowcrab" + "arrowworm" + "arthropods" + "aruanas" + "asianconstablebutterfly" + "asiandamselfly" + "asianelephant" + "asianlion" + "asianpiedstarling" + "asianporcupine" + "asiansmallclawedotter" + "asiantrumpetfish" + "asianwaterbuffalo" + "asiaticgreaterfreshwaterclam" + "asiaticlesserfreshwaterclam" + "asiaticmouflon" + "asiaticwildass" + "asp" + "ass" + "assassinbug" + "astarte" + "astrangiacoral" + "atlanticblackgoby" + "atlanticbluetang" + "atlanticridleyturtle" + "atlanticsharpnosepuffer" + "atlanticspadefish" + "atlasmoth" + "attwatersprairiechicken" + "auk" + "auklet" + "aurochs" + "australiancattledog" + "australiancurlew" + "australianfreshwatercrocodile" + "australianfurseal" + "australiankelpie" + "australiankestrel" + "australianshelduck" + "australiansilkyterrier" + "austrianpinscher" + "avians" + "avocet" + "axisdeer" + "axolotl" + "ayeaye" + "aztecant" + "azurevase" + "azurevasesponge" + "azurewingedmagpie" + "babirusa" + "baboon" + "backswimmer" + "bactrian" + "badger" + "bagworm" + "baiji" + "baldeagle" + "baleenwhale" + "balloonfish" + "ballpython" + "bandicoot" + "bangeltiger" + "bantamrooster" + "banteng" + "barasinga" + "barasingha" + "barb" + "barbet" + "barebirdbat" + "barnacle" + "barnowl" + "barnswallow" + "barracuda" + "basenji" + "basil" + "basilisk" + "bass" + "bassethound" + "bat" + "bats" + "beagle" + "bear" + "beardedcollie" + "beardeddragon" + "beauceron" + "beaver" + "bedbug" + "bedlingtonterrier" + "bee" + "beetle" + "bellfrog" + "bellsnake" + "belugawhale" + "bengaltiger" + "bergerpicard" + "bernesemountaindog" + "betafish" + "bettong" + "bichonfrise" + "bighorn" + "bighornedsheep" + "bighornsheep" + "bigmouthbass" + "bilby" + "billygoat" + "binturong" + "bird" + "birdofparadise" + "bison" + "bittern" + "blackandtancoonhound" + "blackbear" + "blackbird" + "blackbuck" + "blackcrappie" + "blackfish" + "blackfly" + "blackfootedferret" + "blacklab" + "blacklemur" + "blackmamba" + "blacknorwegianelkhound" + "blackpanther" + "blackrhino" + "blackrussianterrier" + "blackwidowspider" + "blesbok" + "blobfish" + "blowfish" + "blueandgoldmackaw" + "bluebird" + "bluebottle" + "bluebottlejellyfish" + "bluebreastedkookaburra" + "bluefintuna" + "bluefish" + "bluegill" + "bluejay" + "bluemorphobutterfly" + "blueshark" + "bluet" + "bluetickcoonhound" + "bluetonguelizard" + "bluewhale" + "boa" + "boaconstrictor" + "boar" + "bobcat" + "bobolink" + "bobwhite" + "boilweevil" + "bongo" + "bonobo" + "booby" + "bordercollie" + "borderterrier" + "borer" + "borzoi" + "boto" + "boubou" + "boutu" + "bovine" + "brahmanbull" + "brahmancow" + "brant" + "bream" + "brocketdeer" + "bronco" + "brontosaurus" + "brownbear" + "brownbutterfly" + "bubblefish" + "buck" + "buckeyebutterfly" + "budgie" + "bufeo" + "buffalo" + "bufflehead" + "bug" + "bull" + "bullfrog" + "bullmastiff" + "bumblebee" + "bunny" + "bunting" + "burro" + "bushbaby" + "bushsqueaker" + "bustard" + "butterfly" + "buzzard" + "caecilian" + "caiman" + "caimanlizard" + "calf" + "camel" + "canadagoose" + "canary" + "canine" + "canvasback" + "capeghostfrog" + "capybara" + "caracal" + "cardinal" + "caribou" + "carp" + "carpenterant" + "cassowary" + "cat" + "catbird" + "caterpillar" + "catfish" + "cats" + "cattle" + "caudata" + "cavy" + "centipede" + "cero" + "chafer" + "chameleon" + "chamois" + "chanticleer" + "cheetah" + "chevrotain" + "chick" + "chickadee" + "chicken" + "chihuahua" + "chimneyswift" + "chimpanzee" + "chinchilla" + "chinesecrocodilelizard" + "chipmunk" + "chital" + "chrysalis" + "chrysomelid" + "chuckwalla" + "chupacabra" + "cicada" + "cirriped" + "civet" + "clam" + "cleanerwrasse" + "clingfish" + "clownanemonefish" + "clumber" + "coati" + "cob" + "cobra" + "cock" + "cockatiel" + "cockatoo" + "cockerspaniel" + "cockroach" + "cod" + "coelacanth" + "collardlizard" + "collie" + "colt" + "comet" + "commabutterfly" + "commongonolek" + "conch" + "condor" + "coney" + "conure" + "cony" + "coot" + "cooter" + "copepod" + "copperbutterfly" + "copperhead" + "coqui" + "coral" + "cormorant" + "cornsnake" + "corydorascatfish" + "cottonmouth" + "cottontail" + "cougar" + "cow" + "cowbird" + "cowrie" + "coyote" + "coypu" + "crab" + "crane" + "cranefly" + "crayfish" + "creature" + "cricket" + "crocodile" + "crocodileskink" + "crossbill" + "crow" + "crownofthornsstarfish" + "crustacean" + "cub" + "cuckoo" + "cur" + "curassow" + "curlew" + "cuscus" + "cusimanse" + "cuttlefish" + "cutworm" + "cygnet" + "dachshund" + "daddylonglegs" + "dairycow" + "dalmatian" + "damselfly" + "danishswedishfarmdog" + "darklingbeetle" + "dartfrog" + "darwinsfox" + "dassie" + "dassierat" + "davidstiger" + "deer" + "deermouse" + "degu" + "degus" + "deinonychus" + "desertpupfish" + "devilfish" + "deviltasmanian" + "diamondbackrattlesnake" + "dikdik" + "dikkops" + "dingo" + "dinosaur" + "diplodocus" + "dipper" + "discus" + "dobermanpinscher" + "doctorfish" + "dodo" + "dodobird" + "doe" + "dog" + "dogfish" + "dogwoodclubgall" + "dogwoodtwigborer" + "dolphin" + "donkey" + "dorado" + "dore" + "dorking" + "dormouse" + "dotterel" + "douglasfirbarkbeetle" + "dove" + "dowitcher" + "drafthorse" + "dragon" + "dragonfly" + "drake" + "drever" + "dromaeosaur" + "dromedary" + "drongo" + "duck" + "duckbillcat" + "duckbillplatypus" + "duckling" + "dugong" + "duiker" + "dungbeetle" + "dungenesscrab" + "dunlin" + "dunnart" + "dutchshepherddog" + "dutchsmoushond" + "dwarfmongoose" + "dwarfrabbit" + "eagle" + "earthworm" + "earwig" + "easternglasslizard" + "easternnewt" + "easteuropeanshepherd" + "eastrussiancoursinghounds" + "eastsiberianlaika" + "echidna" + "eel" + "eelelephant" + "eeve" + "eft" + "egg" + "egret" + "eider" + "eidolonhelvum" + "ekaltadeta" + "eland" + "electriceel" + "elephant" + "elephantbeetle" + "elephantseal" + "elk" + "elkhound" + "elver" + "emeraldtreeskink" + "emperorpenguin" + "emperorshrimp" + "emu" + "englishpointer" + "englishsetter" + "equestrian" + "equine" + "erin" + "ermine" + "erne" + "eskimodog" + "esok" + "estuarinecrocodile" + "ethiopianwolf" + "europeanfiresalamander" + "europeanpolecat" + "ewe" + "eyas" + "eyelashpitviper" + "eyra" + "fairybluebird" + "fairyfly" + "falcon" + "fallowdeer" + "fantail" + "fanworms" + "fattaileddunnart" + "fawn" + "feline" + "fennecfox" + "ferret" + "fiddlercrab" + "fieldmouse" + "fieldspaniel" + "finch" + "finnishspitz" + "finwhale" + "fireant" + "firebelliedtoad" + "firecrest" + "firefly" + "fish" + "fishingcat" + "flamingo" + "flatcoatretriever" + "flatfish" + "flea" + "flee" + "flicker" + "flickertailsquirrel" + "flies" + "flounder" + "fluke" + "fly" + "flycatcher" + "flyingfish" + "flyingfox" + "flyinglemur" + "flyingsquirrel" + "foal" + "fossa" + "fowl" + "fox" + "foxhound" + "foxterrier" + "frenchbulldog" + "freshwatereel" + "frigatebird" + "frilledlizard" + "frillneckedlizard" + "fritillarybutterfly" + "frog" + "frogmouth" + "fruitbat" + "fruitfly" + "fugu" + "fulmar" + "funnelweaverspider" + "furseal" + "gadwall" + "galago" + "galah" + "galapagosalbatross" + "galapagosdove" + "galapagoshawk" + "galapagosmockingbird" + "galapagospenguin" + "galapagossealion" + "galapagostortoise" + "gallinule" + "gallowaycow" + "gander" + "gangesdolphin" + "gannet" + "gar" + "gardensnake" + "garpike" + "gartersnake" + "gaur" + "gavial" + "gazelle" + "gecko" + "geese" + "gelada" + "gelding" + "gemsbok" + "gemsbuck" + "genet" + "gentoopenguin" + "gerbil" + "gerenuk" + "germanpinscher" + "germanshepherd" + "germanshorthairedpointer" + "germanspaniel" + "germanspitz" + "germanwirehairedpointer" + "gharial" + "ghostshrimp" + "giantschnauzer" + "gibbon" + "gilamonster" + "giraffe" + "glassfrog" + "globefish" + "glowworm" + "gnat" + "gnatcatcher" + "gnu" + "goa" + "goat" + "godwit" + "goitered" + "goldeneye" + "goldenmantledgroundsquirrel" + "goldenretriever" + "goldfinch" + "goldfish" + "gonolek" + "goose" + "goosefish" + "gopher" + "goral" + "gordonsetter" + "gorilla" + "goshawk" + "gosling" + "gossamerwingedbutterfly" + "gourami" + "grackle" + "grasshopper" + "grassspider" + "grayfox" + "grayling" + "grayreefshark" + "graysquirrel" + "graywolf" + "greatargus" + "greatdane" + "greathornedowl" + "greatwhiteshark" + "grebe" + "greendarnerdragonfly" + "greyhounddog" + "grison" + "grizzlybear" + "grosbeak" + "groundbeetle" + "groundhog" + "grouper" + "grouse" + "grub" + "grunion" + "guanaco" + "guernseycow" + "guillemot" + "guineafowl" + "guineapig" + "gull" + "guppy" + "gypsymoth" + "gyrfalcon" + "hackee" + "haddock" + "hadrosaurus" + "hagfish" + "hairstreak" + "hairstreakbutterfly" + "hake" + "halcyon" + "halibut" + "halicore" + "hamadryad" + "hamadryas" + "hammerheadbird" + "hammerheadshark" + "hammerkop" + "hamster" + "hanumanmonkey" + "hapuka" + "hapuku" + "harborporpoise" + "harborseal" + "hare" + "harlequinbug" + "harpseal" + "harpyeagle" + "harrier" + "harrierhawk" + "hart" + "hartebeest" + "harvestmen" + "harvestmouse" + "hatchetfish" + "hawaiianmonkseal" + "hawk" + "hectorsdolphin" + "hedgehog" + "heifer" + "hellbender" + "hen" + "herald" + "herculesbeetle" + "hermitcrab" + "heron" + "herring" + "heterodontosaurus" + "hind" + "hippopotamus" + "hoatzin" + "hochstettersfrog" + "hog" + "hogget" + "hoiho" + "hoki" + "homalocephale" + "honeybadger" + "honeybee" + "honeycreeper" + "honeyeater" + "hookersealion" + "hoopoe" + "hornbill" + "hornedtoad" + "hornedviper" + "hornet" + "hornshark" + "horse" + "horsechestnutleafminer" + "horsefly" + "horsemouse" + "horseshoebat" + "horseshoecrab" + "hound" + "housefly" + "hoverfly" + "howlermonkey" + "huemul" + "huia" + "human" + "hummingbird" + "humpbackwhale" + "husky" + "hydatidtapeworm" + "hydra" + "hyena" + "hylaeosaurus" + "hypacrosaurus" + "hypsilophodon" + "hyracotherium" + "hyrax" + "iaerismetalmark" + "ibadanmalimbe" + "iberianbarbel" + "iberianchiffchaff" + "iberianemeraldlizard" + "iberianlynx" + "iberianmidwifetoad" + "iberianmole" + "iberiannase" + "ibex" + "ibis" + "ibisbill" + "ibizanhound" + "iceblueredtopzebra" + "icefish" + "icelandgull" + "icelandichorse" + "icelandicsheepdog" + "ichidna" + "ichneumonfly" + "ichthyosaurs" + "ichthyostega" + "icterinewarbler" + "iggypops" + "iguana" + "iguanodon" + "illadopsis" + "ilsamochadegu" + "imago" + "impala" + "imperatorangel" + "imperialeagle" + "incatern" + "inchworm" + "indianabat" + "indiancow" + "indianelephant" + "indianglassfish" + "indianhare" + "indianjackal" + "indianpalmsquirrel" + "indianpangolin" + "indianrhinoceros" + "indianringneckparakeet" + "indianrockpython" + "indianskimmer" + "indianspinyloach" + "indigobunting" + "indigowingedparrot" + "indochinahogdeer" + "indochinesetiger" + "indri" + "indusriverdolphin" + "inexpectatumpleco" + "inganue" + "insect" + "intermediateegret" + "invisiblerail" + "iraniangroundjay" + "iridescentshark" + "iriomotecat" + "irishdraughthorse" + "irishredandwhitesetter" + "irishsetter" + "irishterrier" + "irishwaterspaniel" + "irishwolfhound" + "irrawaddydolphin" + "irukandjijellyfish" + "isabellineshrike" + "isabellinewheatear" + "islandcanary" + "islandwhistler" + "isopod" + "italianbrownbear" + "italiangreyhound" + "ivorybackedwoodswallow" + "ivorybilledwoodpecker" + "ivorygull" + "izuthrush" + "jabiru" + "jackal" + "jackrabbit" + "jaeger" + "jaguar" + "jaguarundi" + "janenschia" + "japanesebeetle" + "javalina" + "jay" + "jellyfish" + "jenny" + "jerboa" + "joey" + "johndory" + "juliabutterfly" + "jumpingbean" + "junco" + "junebug" + "kagu" + "kakapo" + "kakarikis" + "kangaroo" + "karakul" + "katydid" + "kawala" + "kentrosaurus" + "kestrel" + "kid" + "killdeer" + "killerwhale" + "killifish" + "kingbird" + "kingfisher" + "kinglet" + "kingsnake" + "kinkajou" + "kiskadee" + "kissingbug" + "kite" + "kitfox" + "kitten" + "kittiwake" + "kitty" + "kiwi" + "koala" + "koalabear" + "kob" + "kodiakbear" + "koi" + "komododragon" + "koodoo" + "kookaburra" + "kouprey" + "krill" + "kronosaurus" + "kudu" + "kusimanse" + "labradorretriever" + "lacewing" + "ladybird" + "ladybug" + "lamb" + "lamprey" + "langur" + "lark" + "larva" + "laughingthrush" + "lcont" + "leafbird" + "leafcutterant" + "leafhopper" + "leafwing" + "leech" + "lemming" + "lemur" + "leonberger" + "leopard" + "leopardseal" + "leveret" + "lhasaapso" + "lice" + "liger" + "lightningbug" + "limpet" + "limpkin" + "ling" + "lion" + "lionfish" + "littlenightmonkeys" + "lizard" + "llama" + "lobo" + "lobster" + "locust" + "loggerheadturtle" + "longhorn" + "longhornbeetle" + "longspur" + "loon" + "lorikeet" + "loris" + "louse" + "lovebird" + "lowchen" + "lunamoth" + "lungfish" + "lynx" + "lynxÂ" + "macaque" + "macaw" + "macropod" + "madagascarhissingroach" + "maggot" + "magpie" + "maiasaura" + "majungatholus" + "malamute" + "mallard" + "maltesedog" + "mamba" + "mamenchisaurus" + "mammal" + "mammoth" + "manatee" + "mandrill" + "mangabey" + "manta" + "mantaray" + "mantid" + "mantis" + "mantisray" + "manxcat" + "mara" + "marabou" + "marbledmurrelet" + "mare" + "marlin" + "marmoset" + "marmot" + "marten" + "martin" + "massasauga" + "massospondylus" + "mastiff" + "mastodon" + "mayfly" + "meadowhawk" + "meadowlark" + "mealworm" + "meerkat" + "megalosaurus" + "megalotomusquinquespinosus" + "megaraptor" + "merganser" + "merlin" + "metalmarkbutterfly" + "metamorphosis" + "mice" + "microvenator" + "midge" + "milksnake" + "milkweedbug" + "millipede" + "minibeast" + "mink" + "minnow" + "mite" + "moa" + "mockingbird" + "mole" + "mollies" + "mollusk" + "molly" + "monarch" + "mongoose" + "mongrel" + "monkey" + "monkfishÂ" + "monoclonius" + "montanoceratops" + "moorhen" + "moose" + "moray" + "morayeel" + "morpho" + "mosasaur" + "mosquito" + "moth" + "motmot" + "mouflon" + "mountaincat" + "mountainlion" + "mouse" + "mouse/mice" + "mousebird" + "mudpuppy" + "mule" + "mullet" + "muntjac" + "murrelet" + "muskox" + "muskrat" + "mussaurus" + "mussel" + "mustang" + "mutt" + "myna" + "mynah" + "myotisÂ" + "nabarlek" + "nag" + "naga" + "nagapies" + "nakedmolerat" + "nandine" + "nandoo" + "nandu" + "narwhal" + "narwhale" + "natterjacktoad" + "nauplius" + "nautilus" + "needlefish" + "needletail" + "nematode" + "nene" + "neonblueguppy" + "neonbluehermitcrab" + "neondwarfgourami" + "neonrainbowfish" + "neonredguppy" + "neontetra" + "nerka" + "nettlefish" + "newfoundlanddog" + "newt" + "newtnutria" + "nightcrawler" + "nighthawk" + "nightheron" + "nightingale" + "nightjar" + "nijssenissdwarfchihlid" + "nilgai" + "ninebandedarmadillo" + "noctilio" + "noctule" + "noddy" + "noolbenger" + "northerncardinals" + "northernelephantseal" + "northernflyingsquirrel" + "northernfurseal" + "northernhairynosedwombat" + "northernpike" + "northernseahorse" + "northernspottedowl" + "norwaylobster" + "norwayrat" + "nubiangoat" + "nudibranch" + "numbat" + "nurseshark" + "nutcracker" + "nuthatch" + "nutria" + "nyala" + "nymph" + "ocelot" + "octopus" + "okapi" + "olingo" + "olm" + "opossum" + "orangutan" + "orca" + "oregonsilverspotbutterfly" + "oriole" + "oropendola" + "oropendula" + "oryx" + "osprey" + "ostracod" + "ostrich" + "otter" + "ovenbird" + "owl" + "owlbutterfly" + "ox" + "oxen" + "oxpecker" + "oyster" + "ozarkbigearedbat" + "pacaÂ" + "pachyderm" + "pacificparrotlet" + "paddlefish" + "paintedladybutterfly" + "panda" + "pangolin" + "panther" + "paperwasp" + "papillon" + "parakeet" + "parrot" + "partridge" + "peacock" + "peafowl" + "peccary" + "pekingese" + "pelican" + "pelicinuspetrel" + "penguin" + "perch" + "peregrinefalcon" + "pewee" + "phalarope" + "pharaohhound" + "pheasant" + "phoebe" + "phoenix" + "pig" + "pigeon" + "piglet" + "pika" + "pike" + "pikeperchÂ" + "pilchard" + "pinemarten" + "pinkriverdolphin" + "pinniped" + "pintail" + "pipistrelle" + "pipit" + "piranha" + "pitbull" + "pittabird" + "plainsqueaker" + "plankton" + "planthopper" + "platypus" + "plover" + "polarbear" + "polecat" + "polliwog" + "polyp" + "polyturator" + "pomeranian" + "pondskater" + "pony" + "pooch" + "poodle" + "porcupine" + "porpoise" + "portuguesemanofwar" + "possum" + "prairiedog" + "prawn" + "prayingmantid" + "prayingmantis" + "primate" + "pronghorn" + "pseudodynerusquadrisectus" + "ptarmigan" + "pterodactyls" + "pterosaurs" + "puffer" + "pufferfish" + "puffin" + "pug" + "pullet" + "puma" + "pupa" + "pupfish" + "puppy" + "purplemarten" + "pussycat" + "pygmy" + "python" + "quadrisectus" + "quagga" + "quahog" + "quail" + "queenalexandrasbirdwing" + "queenalexandrasbirdwingbutterfly" + "queenant" + "queenbee" + "queenconch" + "queenslandgrouper" + "queenslandheeler" + "queensnake" + "quelea" + "quetzal" + "quetzalcoatlus" + "quillback" + "quinquespinosus" + "quokka" + "quoll" + "rabbit" + "rabidsquirrel" + "raccoon" + "racer" + "racerunner" + "ragfish" + "rail" + "rainbowfish" + "rainbowlorikeet" + "rainbowtrout" + "ram" + "raptors" + "rasbora" + "rat" + "ratfish" + "rattail" + "rattlesnake" + "raven" + "ray" + "redhead" + "redheadedwoodpecker" + "redpoll" + "redstart" + "redtailedhawk" + "reindeer" + "reptile" + "reynard" + "rhea" + "rhesusmonkey" + "rhino" + "rhinoceros" + "rhinocerosbeetle" + "rhodesianridgeback" + "ringtailedlemur" + "ringworm" + "riograndeescuerzo" + "roach" + "roadrunner" + "roan" + "robberfly" + "robin" + "rockrat" + "rodent" + "roebuck" + "roller" + "rook" + "rooster" + "rottweiler" + "sable" + "sableantelope" + "sablefishÂ" + "saiga" + "sakimonkey" + "salamander" + "salmon" + "saltwatercrocodile" + "sambar" + "samoyeddog" + "sandbarshark" + "sanddollar" + "sanderling" + "sandpiper" + "sapsucker" + "sardine" + "sawfish" + "scallop" + "scarab" + "scarletibis" + "scaup" + "schapendoes" + "schipperke" + "schnauzer" + "scorpion" + "scoter" + "screamer" + "seabird" + "seagull" + "seahog" + "seahorse" + "seal" + "sealion" + "seamonkey" + "seaslug" + "seaurchin" + "senegalpython" + "seriema" + "serpent" + "serval" + "shark" + "shearwater" + "sheep" + "sheldrake" + "shelduck" + "shibainu" + "shihtzu" + "shorebird" + "shoveler" + "shrew" + "shrike" + "shrimp" + "siamang" + "siamesecat" + "siberiantiger" + "sidewinder" + "sifaka" + "silkworm" + "silverfish" + "silverfox" + "silversidefish" + "siskin" + "skimmer" + "skink" + "skipper" + "skua" + "skunk" + "skylark" + "sloth" + "slothbear" + "slug" + "smelts" + "smew" + "snail" + "snake" + "snipe" + "snoutbutterfly" + "snowdog" + "snowgeese" + "snowleopard" + "snowmonkey" + "snowyowl" + "sockeyesalmon" + "solenodon" + "solitaire" + "songbird" + "sora" + "southernhairnosedwombat" + "sow" + "spadefoot" + "sparrow" + "sphinx" + "spider" + "spidermonkey" + "spiketail" + "spittlebug" + "sponge" + "spoonbill" + "spotteddolphin" + "spreadwing" + "springbok" + "springpeeper" + "springtail" + "squab" + "squamata" + "squeaker" + "squid" + "squirrel" + "stag" + "stagbeetle" + "stallion" + "starfish" + "starling" + "steed" + "steer" + "stegosaurus" + "stickinsect" + "stickleback" + "stilt" + "stingray" + "stinkbug" + "stinkpot" + "stoat" + "stonefly" + "stork" + "stud" + "sturgeon" + "sugarglider" + "sulphurbutterfly" + "sunbear" + "sunbittern" + "sunfish" + "swallow" + "swallowtail" + "swallowtailbutterfly" + "swan" + "swellfish" + "swift" + "swordfish" + "tadpole" + "tahr" + "takin" + "tamarin" + "tanager" + "tapaculo" + "tapeworm" + "tapir" + "tarantula" + "tarpan" + "tarsier" + "taruca" + "tasmaniandevil" + "tasmaniantiger" + "tattler" + "tayra" + "teal" + "tegus" + "teledu" + "tench" + "tenrec" + "termite" + "tern" + "terrapin" + "terrier" + "thoroughbred" + "thrasher" + "thrip" + "thrush" + "thunderbird" + "thylacine" + "tick" + "tiger" + "tigerbeetle" + "tigermoth" + "tigershark" + "tilefish" + "tinamou" + "titi" + "titmouse" + "toad" + "toadfish" + "tomtitÂ" + "topi" + "tortoise" + "toucan" + "towhee" + "tragopan" + "treecreeper" + "trex" + "triceratops" + "trogon" + "trout" + "trumpeterbird" + "trumpeterswan" + "tsetsefly" + "tuatara" + "tuna" + "turaco" + "turkey" + "turnstone" + "turtle" + "turtledove" + "uakari" + "ugandakob" + "uintagroundsquirrel" + "ulyssesbutterfly" + "umbrellabird" + "umbrette" + "unau" + "ungulate" + "unicorn" + "upupa" + "urchin" + "urial" + "uromastyxmaliensis" + "uromastyxspinipes" + "urson" + "urubu" + "urus" + "urutu" + "urva" + "utahprairiedog" + "vampirebat" + "vaquita" + "veery" + "velociraptor" + "velvetcrab" + "velvetworm" + "venomoussnake" + "verdin" + "vervet" + "viceroybutterfly" + "vicuna" + "viper" + "viperfish" + "vipersquid" + "vireo" + "virginiaopossum" + "vixen" + "vole" + "volvox" + "vulpesvelox" + "vulpesvulpes" + "vulture" + "walkingstick" + "wallaby" + "wallaroo" + "walleye" + "walrus" + "warbler" + "warthog" + "wasp" + "waterboatman" + "waterbuck" + "waterbuffalo" + "waterbug" + "waterdogs" + "waterdragons" + "watermoccasin" + "waterstrider" + "waterthrush" + "wattlebird" + "watussi" + "waxwing" + "weasel" + "weaverbird" + "weevil" + "westafricanantelope" + "whale" + "whapuku" + "whelp" + "whimbrel" + "whippet" + "whippoorwill" + "whitebeakeddolphin" + "whiteeye" + "whitepelican" + "whiterhino" + "whitetaileddeer" + "whitetippedreefshark" + "whooper" + "whoopingcrane" + "widgeon" + "widowspider" + "wildcat" + "wildebeast" + "wildebeest" + "willet" + "wireworm" + "wisent" + "wobbegongshark" + "wolf" + "wolfspider" + "wolverine" + "wombat" + "woodborer" + "woodchuck" + "woodcock" + "woodnymphbutterfly" + "woodpecker" + "woodstorks" + "woollybearcaterpillar" + "worm" + "wrasse" + "wreckfish" + "wren" + "wrenchbird" + "wryneck" + "wuerhosaurus" + "wyvern" + "xanclomys" + "xanthareel" + "xantus" + "xantusmurrelet" + "xeme" + "xenarthra" + "xenoposeidon" + "xenops" + "xenopterygii" + "xenopus" + "xenotarsosaurus" + "xenurine" + "xenurusunicinctus" + "xerus" + "xiaosaurus" + "xinjiangovenator" + "xiphias" + "xiphiasgladius" + "xiphosuran" + "xoloitzcuintli" + "xoni" + "xrayfish" + "xraytetra" + "xuanhanosaurus" + "xuanhuaceratops" + "xuanhuasaurus" + "yaffle" + "yak" + "yapok" + "yardant" + "yearling" + "yellowbelliedmarmot" + "yellowbellylizard" + "yellowhammer" + "yellowjacket" + "yellowlegs" + "yellowthroat" + "yellowwhitebutterfly" + "yeti" + "ynambu" + "yorkshireterrier" + "yosemitetoad" + "yucker" + "zander" + "zanzibardaygecko" + "zebra" + "zebradove" + "zebrafinch" + "zebrafish" + "zebralongwingbutterfly" + "zebraswallowtailbutterfly" + "zebratailedlizard" + "zebu" + "zenaida" + "zeren" + "zethusspinipes" + "zethuswasp" + "zigzagsalamander" + "zonetailedpigeon" + "zooplankton" + "zopilote" + "zorilla"]) \ No newline at end of file diff --git a/src/status_im/utils/gfycat/core.cljs b/src/status_im/utils/gfycat/core.cljs new file mode 100644 index 0000000000..ce261d0600 --- /dev/null +++ b/src/status_im/utils/gfycat/core.cljs @@ -0,0 +1,16 @@ +(ns status-im.utils.gfycat.core + (:require [status-im.utils.gfycat.animals :as animals] + [status-im.utils.gfycat.adjectives :as adjectives] + [clojure.string :as str])) + +(defn- pick-random + [vector] + (-> (rand-nth vector) + str/capitalize)) + +(defn generate-gfy + [] + (let [first-adjective (pick-random adjectives/data) + second-adjective (pick-random adjectives/data) + animal (pick-random animals/data)] + (str first-adjective " " second-adjective " " animal))) \ No newline at end of file diff --git a/src/status_im/utils/image_processing.cljs b/src/status_im/utils/image_processing.cljs index 36927fefbd..6f6e664ebf 100644 --- a/src/status_im/utils/image_processing.cljs +++ b/src/status_im/utils/image_processing.cljs @@ -1,6 +1,8 @@ (ns status-im.utils.image-processing (:require [reagent.core :as r] - [status-im.utils.fs :refer [read-file]])) + [status-im.utils.fs :refer [read-file]] + [taoensso.timbre :as log] + [clojure.string :as str])) (def resizer-class (js/require "react-native-image-resizer")) @@ -19,7 +21,10 @@ (defn img->base64 [path on-success on-error] (let [on-resized (fn [path] - (image-base64-encode path on-success on-error)) + (let [path (str/replace path "file:" "")] + (log/debug "Resized: " path) + (image-base64-encode path on-success on-error))) on-error (fn [error] + (log/debug "Resized error: " error) (on-error :resize error))] (resize path 150 150 on-resized on-error))) \ No newline at end of file