Compare commits
35
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
70f99407fc | ||
|
|
bf9fc03670 | ||
|
|
a3b04f8ce0 | ||
|
|
c2db5ec102 | ||
|
|
ab880b11cd | ||
|
|
f72f3ad1c8 | ||
|
|
aaef05a3c0 | ||
|
|
3bf8734a7e | ||
|
|
43493f82c0 | ||
|
|
a80f16f632 | ||
|
|
109ab6b2ff | ||
|
|
cfa893c746 | ||
|
|
8f76fb9f97 | ||
|
|
5b5d602511 | ||
|
|
5e32ba8e6c | ||
|
|
d63c73b6bf | ||
|
|
f079f52941 | ||
|
|
545abee7d1 | ||
|
|
fe6beef442 | ||
|
|
5f44d2b319 | ||
|
|
8f0c4087c2 | ||
|
|
690aab3185 | ||
|
|
843b1b57d7 | ||
|
|
160d4e6d71 | ||
|
|
d7e8d3c5c2 | ||
|
|
962ba6ccd0 | ||
|
|
928a87a368 | ||
|
|
e4c2bd0683 | ||
|
|
66f1de8d6b | ||
|
|
3455f9f1ef | ||
|
|
26acf1dd38 | ||
|
|
b1cb5221f1 | ||
|
|
00ea2f9f71 | ||
|
|
6be6c39bae | ||
|
|
c3df5139df |
@@ -29,37 +29,39 @@
|
||||
|
||||
(testing "transforms messages from RPC response"
|
||||
(is
|
||||
(= {:last-message {:quoted-message nil
|
||||
:outgoing-status nil
|
||||
:command-parameters nil
|
||||
:link-previews []
|
||||
:content {:sticker nil
|
||||
:rtl? nil
|
||||
:ens-name nil
|
||||
:parsed-text nil
|
||||
:response-to nil
|
||||
:chat-id nil
|
||||
:image nil
|
||||
:line-count nil
|
||||
:links nil
|
||||
:text nil}
|
||||
:outgoing false}
|
||||
(= {:last-message {:quoted-message nil
|
||||
:outgoing-status nil
|
||||
:command-parameters nil
|
||||
:link-previews []
|
||||
:status-link-previews []
|
||||
:content {:sticker nil
|
||||
:rtl? nil
|
||||
:ens-name nil
|
||||
:parsed-text nil
|
||||
:response-to nil
|
||||
:chat-id nil
|
||||
:image nil
|
||||
:line-count nil
|
||||
:links nil
|
||||
:text nil}
|
||||
:outgoing false}
|
||||
:message nil
|
||||
:reply-message {:quoted-message nil
|
||||
:outgoing-status nil
|
||||
:command-parameters nil
|
||||
:link-previews []
|
||||
:content {:sticker nil
|
||||
:rtl? nil
|
||||
:ens-name nil
|
||||
:parsed-text nil
|
||||
:response-to nil
|
||||
:chat-id nil
|
||||
:image nil
|
||||
:line-count nil
|
||||
:links nil
|
||||
:text nil}
|
||||
:outgoing false}}
|
||||
:reply-message {:quoted-message nil
|
||||
:outgoing-status nil
|
||||
:command-parameters nil
|
||||
:link-previews []
|
||||
:status-link-previews []
|
||||
:content {:sticker nil
|
||||
:rtl? nil
|
||||
:ens-name nil
|
||||
:parsed-text nil
|
||||
:response-to nil
|
||||
:chat-id nil
|
||||
:image nil
|
||||
:line-count nil
|
||||
:links nil
|
||||
:text nil}
|
||||
:outgoing false}}
|
||||
(-> raw-notification
|
||||
store/<-rpc
|
||||
(select-keys [:last-message :message :reply-message])))))
|
||||
|
||||
@@ -16,13 +16,51 @@
|
||||
:community-id :communityId
|
||||
:clock-value :clock})))
|
||||
|
||||
(defn- <-status-link-previews-rpc
|
||||
[preview]
|
||||
(-> preview
|
||||
(update :community
|
||||
set/rename-keys
|
||||
{:communityId :community-id
|
||||
:displayName :display-name
|
||||
:membersCount :members-count
|
||||
:activeMembersCount :active-members-count})
|
||||
(update-in [:community :banner] set/rename-keys {:dataUri :data-uri})
|
||||
(update-in [:community :icon] set/rename-keys {:dataUri :data-uri})
|
||||
(update-in [:contact :icon] set/rename-keys {:dataUri :data-uri})
|
||||
(update :contact
|
||||
set/rename-keys
|
||||
{:publicKey :public-key
|
||||
:displayName :display-name})))
|
||||
|
||||
(defn ->status-link-previews-rpc
|
||||
[preview]
|
||||
(-> preview
|
||||
(update :community
|
||||
set/rename-keys
|
||||
{:community-id :communityId
|
||||
:display-name :displayName
|
||||
:members-count :membersCount
|
||||
:active-members-count :activeMembersCount})
|
||||
(update-in [:community :banner] set/rename-keys {:data-uri :dataUri})
|
||||
(update-in [:community :icon] set/rename-keys {:data-uri :dataUri})
|
||||
(update :contact
|
||||
set/rename-keys
|
||||
{:public-key :publicKey
|
||||
:display-name :displayName})
|
||||
(update-in [:contact :icon] set/rename-keys {:data-uri :dataUri})))
|
||||
|
||||
(defn- <-link-preview-rpc
|
||||
[preview]
|
||||
(update preview :thumbnail set/rename-keys {:dataUri :data-uri}))
|
||||
(-> preview
|
||||
(update :thumbnail set/rename-keys {:dataUri :data-uri})
|
||||
(update :favicon set/rename-keys {:dataUri :data-uri})))
|
||||
|
||||
(defn ->link-preview-rpc
|
||||
[preview]
|
||||
(update preview :thumbnail set/rename-keys {:data-uri :dataUri}))
|
||||
(-> preview
|
||||
(update :thumbnail set/rename-keys {:data-uri :dataUri})
|
||||
(update :favicon set/rename-keys {:data-uri :dataUri})))
|
||||
|
||||
(defn <-rpc
|
||||
[message]
|
||||
@@ -53,8 +91,10 @@
|
||||
:new :new?
|
||||
:albumImagesCount :album-images-count
|
||||
:displayName :display-name
|
||||
:linkPreviews :link-previews})
|
||||
:linkPreviews :link-previews
|
||||
:statusLinkPreviews :status-link-previews})
|
||||
(update :link-previews #(map <-link-preview-rpc %))
|
||||
(update :status-link-previews #(map <-status-link-previews-rpc %))
|
||||
(update :quoted-message
|
||||
set/rename-keys
|
||||
{:parsedText :parsed-text
|
||||
|
||||
@@ -37,7 +37,19 @@
|
||||
:compressed-key "c"
|
||||
:timestamp 3
|
||||
:link-previews [{:thumbnail {:url "http://localhost"
|
||||
:data-uri "data:image/png"}}]}
|
||||
:data-uri "data:image/png"}
|
||||
:favicon nil}]
|
||||
:status-link-previews [{:url "http://localhost"
|
||||
:community {:community-id "0x01"
|
||||
:display-name "Test Comm"
|
||||
:members-count 12
|
||||
:active-members-count 12
|
||||
:banner
|
||||
{:data-uri
|
||||
"data:image/png"}
|
||||
:icon
|
||||
{:data-uri
|
||||
"data:image/png"}}}]}
|
||||
message {:id message-id
|
||||
:whisperTimestamp 1
|
||||
:parsedText "parsed-text"
|
||||
@@ -61,5 +73,17 @@
|
||||
:timestamp 3
|
||||
:outgoingStatus "sending"
|
||||
:linkPreviews [{:thumbnail {:url "http://localhost"
|
||||
:dataUri "data:image/png"}}]}]
|
||||
:dataUri "data:image/png"}
|
||||
:favicon nil}]
|
||||
:statusLinkPreviews [{:url "http://localhost"
|
||||
:community {:communityId "0x01"
|
||||
:displayName "Test Comm"
|
||||
:membersCount 12
|
||||
:activeMembersCount 12
|
||||
:banner
|
||||
{:dataUri
|
||||
"data:image/png"}
|
||||
:icon
|
||||
{:dataUri
|
||||
"data:image/png"}}}]}]
|
||||
(is (= expected (m/<-rpc message))))))
|
||||
|
||||
@@ -99,6 +99,7 @@
|
||||
;;; Link previews
|
||||
(reg-root-key-sub :link-previews-whitelist :link-previews-whitelist)
|
||||
(reg-root-key-sub :chat/link-previews :chat/link-previews)
|
||||
(reg-root-key-sub :chat/status-link-previews :chat/status-link-previews)
|
||||
|
||||
;;commands
|
||||
(reg-root-key-sub :commands/select-account :commands/select-account)
|
||||
|
||||
@@ -85,9 +85,7 @@
|
||||
:accessibility-label :share-community-link
|
||||
:type :secondary
|
||||
:on-press #(debounce/throttle-and-dispatch
|
||||
[(if can-invite?
|
||||
::communities/invite-people-confirmation-pressed
|
||||
::communities/share-community-confirmation-pressed) @user-pk
|
||||
[::communities/share-community-confirmation-pressed @user-pk
|
||||
selected]
|
||||
3000)}
|
||||
(i18n/label (if can-invite? :t/invite :t/share))]}]]))))
|
||||
|
||||
@@ -60,8 +60,8 @@
|
||||
:padding-horizontal 12
|
||||
:padding-top 10
|
||||
:padding-bottom 12
|
||||
:height (if (= :message size) 245 266)
|
||||
:width (if (= :message size) 295 335)})
|
||||
:width (if (= :message size) 295 335)
|
||||
:flex 1})
|
||||
|
||||
(def header-container
|
||||
{:flex-direction :row
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
{:title "Some title"
|
||||
:description "Some description"
|
||||
:link "status.im"
|
||||
:logo "data:image/png,logo-x"
|
||||
:thumbnail "data:image/png,whatever"})
|
||||
|
||||
(h/describe "Links - Link Preview"
|
||||
@@ -21,17 +20,12 @@
|
||||
(h/is-truthy (h/query-by-text (:title props)))
|
||||
(h/is-truthy (h/query-by-text (:description props)))
|
||||
(h/is-truthy (h/query-by-text (:link props)))
|
||||
(h/is-truthy (h/query-by-label-text :logo))
|
||||
(h/is-truthy (h/query-by-label-text :thumbnail)))
|
||||
|
||||
(h/test "does not render thumbnail if prop is not present"
|
||||
(h/render [view/view (dissoc props :thumbnail)])
|
||||
(h/is-null (h/query-by-label-text :thumbnail)))
|
||||
|
||||
(h/test "does not render logo if prop is not present"
|
||||
(h/render [view/view (dissoc props :logo)])
|
||||
(h/is-null (h/query-by-label-text :logo)))
|
||||
|
||||
(h/test "shows button to enable preview when preview is disabled"
|
||||
(h/render [view/view
|
||||
(assoc props
|
||||
|
||||
@@ -1,9 +1,15 @@
|
||||
(ns quo.components.links.link-preview.view
|
||||
(:require
|
||||
["react-native-blob-util" :default ReactNativeBlobUtil]
|
||||
[oops.core :as oops]
|
||||
[quo.components.buttons.button.view :as button]
|
||||
[quo.components.links.link-preview.style :as style]
|
||||
[quo.components.markdown.text :as text]
|
||||
[react-native.core :as rn]))
|
||||
[react-native.core :as rn]
|
||||
[react-native.platform :as platform]
|
||||
[react-native.svg :as svg]
|
||||
[reagent.core :as reagent]
|
||||
[taoensso.timbre :as log]))
|
||||
|
||||
(defn- button-disabled
|
||||
[disabled-text on-enable]
|
||||
@@ -53,12 +59,25 @@
|
||||
|
||||
(defn- logo-comp
|
||||
[logo]
|
||||
[rn/image
|
||||
{:accessibility-label :logo
|
||||
:source (if (string? logo)
|
||||
{:uri logo}
|
||||
logo)
|
||||
:style style/logo}])
|
||||
(let [image-data (reagent/atom nil)
|
||||
is-svg? (reagent/atom nil)
|
||||
on-success (fn [data-uri]
|
||||
(reset! image-data data-uri))
|
||||
_get-svg (-> (.config ReactNativeBlobUtil (clj->js {:trusty platform/ios?}))
|
||||
(.fetch "GET" logo)
|
||||
(.then (fn [imgObj]
|
||||
(reset! is-svg? (= "image/svg"
|
||||
(oops/oget imgObj
|
||||
["respInfo" "headers" "Content-Type"])))
|
||||
(on-success (oops/oget imgObj "data"))))
|
||||
(.catch #(log/error "could not fetch favicon " logo)))]
|
||||
(fn []
|
||||
(if @is-svg?
|
||||
[svg/svg-xml (merge style/logo {:xml @image-data})]
|
||||
[rn/image
|
||||
{:accessibility-label :logo
|
||||
:source {:uri (str "data:image/png;base64," @image-data)}
|
||||
:style style/logo}]))))
|
||||
|
||||
(defn view
|
||||
[{:keys [title logo description link thumbnail
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
:border-radius 12
|
||||
:border-style :dashed
|
||||
:align-items :center
|
||||
:flex-direction :row
|
||||
:justify-content :center
|
||||
:align-self :stretch
|
||||
:padding horizontal-padding
|
||||
|
||||
@@ -1,19 +1,31 @@
|
||||
(ns quo.components.links.url-preview.view
|
||||
(:require
|
||||
[clojure.string :as string]
|
||||
[quo.components.icon :as icon]
|
||||
[quo.components.links.url-preview.style :as style]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.foundations.colors :as colors]
|
||||
[react-native.core :as rn]))
|
||||
[react-native.core :as rn]
|
||||
[react-native.svg :as svg]))
|
||||
|
||||
(def base64-svg-prefix "data:image/svg;base64,")
|
||||
|
||||
(defn- logo-comp
|
||||
[{:keys [logo]}]
|
||||
[rn/image
|
||||
{:accessibility-label :logo
|
||||
:source (if (string? logo)
|
||||
{:uri logo}
|
||||
logo)
|
||||
:style style/logo}])
|
||||
(if (and (string? logo)
|
||||
(string/starts-with? logo base64-svg-prefix))
|
||||
[svg/svg-xml
|
||||
(merge style/logo
|
||||
{:xml (-> logo
|
||||
(string/replace base64-svg-prefix "")
|
||||
js/atob)})]
|
||||
[rn/image
|
||||
{:accessibility-label :logo
|
||||
:source (if (string? logo)
|
||||
{:uri logo}
|
||||
logo)
|
||||
:style style/logo
|
||||
:resize-mode :cover}]))
|
||||
|
||||
(defn- content
|
||||
[{:keys [title body]}]
|
||||
@@ -50,6 +62,10 @@
|
||||
[rn/view
|
||||
{:accessibility-label :url-preview-loading
|
||||
:style (merge (style/loading-container) container-style)}
|
||||
[icon/icon :i/loading
|
||||
{:size 12
|
||||
:color (colors/theme-colors colors/neutral-50 colors/neutral-40)
|
||||
:container-style {:margin-right 8}}]
|
||||
[rn/text
|
||||
{:size :paragraph-2
|
||||
:weight :medium
|
||||
@@ -60,6 +76,9 @@
|
||||
{:accessibility-label :url-preview
|
||||
:style (merge (style/container) container-style)}
|
||||
(when logo
|
||||
[logo-comp {:logo logo}])
|
||||
[logo-comp
|
||||
{:logo (if (map? logo)
|
||||
(:data-uri logo)
|
||||
logo)}])
|
||||
[content {:title title :body body}]
|
||||
[clear-button {:on-press on-clear}]]))
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
[rn/view {:style style/url-preview-separator}])
|
||||
|
||||
(defn- item-component
|
||||
[{:keys [title body loading? logo]} _ _
|
||||
[{:keys [title body loading? logo url]} _ _
|
||||
{:keys [width on-clear loading-message container-style]}]
|
||||
[url-preview/view
|
||||
{:logo logo
|
||||
@@ -41,7 +41,8 @@
|
||||
:loading? loading?
|
||||
:loading-message loading-message
|
||||
:on-clear on-clear
|
||||
:container-style (merge container-style {:width width})}])
|
||||
:container-style (merge container-style {:width width})
|
||||
:url url}])
|
||||
|
||||
(defn- f-view
|
||||
[]
|
||||
|
||||
@@ -465,3 +465,5 @@
|
||||
|
||||
(def ^:const bridge-name-transfer "Transfer")
|
||||
(def ^:const bridge-name-erc-721-transfer "ERC721Transfer")
|
||||
|
||||
(def ^:const status-hostname "status.app")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
(ns status-im.contexts.chat.messenger.composer.events
|
||||
(:require [clojure.string :as string]
|
||||
[legacy.status-im.chat.models.mentions :as mentions]
|
||||
[legacy.status-im.data-store.messages :as data-store-messages]
|
||||
[legacy.status-im.data-store.messages :as data-store.messages]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.contexts.chat.messenger.composer.link-preview.events :as link-preview]
|
||||
[status-im.contexts.chat.messenger.messages.transport.events :as messages.transport]
|
||||
@@ -132,6 +132,43 @@
|
||||
:response-to message-id})
|
||||
images)))
|
||||
|
||||
(defn- build-status-link-previews
|
||||
[status-link-previews]
|
||||
(map (fn [{{:keys [community-id color description display-name
|
||||
members-count active-members-count icon banner]} :community
|
||||
url :url
|
||||
{contact-description :description
|
||||
contact-icon :icon
|
||||
contact-display-name :display-name
|
||||
pk :public-key} :contact}]
|
||||
{:url url
|
||||
:community {:community-id community-id
|
||||
:color color
|
||||
:description description
|
||||
:display-name display-name
|
||||
:members-count members-count
|
||||
:active-members-count active-members-count
|
||||
:icon {:data-uri (:data-uri icon)
|
||||
:width (:width icon)
|
||||
:height (:height icon)}
|
||||
:banner {:data-uri (:data-uri banner)
|
||||
:width (:width banner)
|
||||
:height (:height banner)}}
|
||||
:contact {:public-key pk
|
||||
:display-name contact-display-name
|
||||
:description contact-description
|
||||
:icon {:data-uri (:data-uri contact-icon)}}})
|
||||
status-link-previews))
|
||||
|
||||
(defn- build-link-previews
|
||||
[link-previews]
|
||||
(->> link-previews
|
||||
(map #(select-keys %
|
||||
[:url :title :description :thumbnail
|
||||
:status-link-preview? :favicon]))
|
||||
(filter (fn [{:keys [status-link-preview?]}]
|
||||
(not status-link-preview?)))))
|
||||
|
||||
(defn build-text-message
|
||||
[{:keys [db]} input-text current-chat-id]
|
||||
(when-not (string/blank? input-text)
|
||||
@@ -140,15 +177,16 @@
|
||||
preferred-name (get-in db [:profile/profile :preferred-name])
|
||||
emoji? (emoji-only-content? {:text input-text
|
||||
:response-to message-id})]
|
||||
{:chat-id current-chat-id
|
||||
:content-type (if emoji?
|
||||
constants/content-type-emoji
|
||||
constants/content-type-text)
|
||||
:text input-text
|
||||
:response-to message-id
|
||||
:ens-name preferred-name
|
||||
:link-previews (map #(select-keys % [:url :title :description :thumbnail])
|
||||
(get-in db [:chat/link-previews :unfurled]))})))
|
||||
{:chat-id current-chat-id
|
||||
:content-type (if emoji?
|
||||
constants/content-type-emoji
|
||||
constants/content-type-text)
|
||||
:text input-text
|
||||
:response-to message-id
|
||||
:ens-name preferred-name
|
||||
:link-previews (build-link-previews (get-in db [:chat/link-previews :unfurled]))
|
||||
:status-link-previews (build-status-link-previews
|
||||
(get-in db [:chat/status-link-previews :unfurled]))})))
|
||||
|
||||
(rf/defn send-messages
|
||||
[{:keys [db] :as cofx} input-text current-chat-id]
|
||||
@@ -181,29 +219,41 @@
|
||||
(when message-id
|
||||
{:response-to message-id}))])))))
|
||||
|
||||
(defn- process-link-previews
|
||||
[link-previews]
|
||||
(->> link-previews
|
||||
(map #(select-keys %
|
||||
[:url :title :description :thumbnail
|
||||
:status-link-preview? :favicon]))
|
||||
(map data-store.messages/->link-preview-rpc)
|
||||
(filter (fn [{:keys [status-link-preview?]}]
|
||||
(not status-link-preview?)))))
|
||||
|
||||
(rf/defn send-edited-message
|
||||
[{:keys [db]
|
||||
:as cofx} text {:keys [message-id quoted-message chat-id]}]
|
||||
(rf/merge
|
||||
cofx
|
||||
{:json-rpc/call [{:method "wakuext_editMessage"
|
||||
:params [{:id message-id
|
||||
:text text
|
||||
:content-type (if (emoji-only-content?
|
||||
{:text text
|
||||
:response-to quoted-message})
|
||||
constants/content-type-emoji
|
||||
constants/content-type-text)
|
||||
:linkPreviews (map #(-> %
|
||||
(select-keys [:url :title :description
|
||||
:thumbnail])
|
||||
data-store-messages/->link-preview-rpc)
|
||||
(get-in db [:chat/link-previews :unfurled]))}]
|
||||
:js-response true
|
||||
:on-error #(log/error "failed to edit message " %)
|
||||
:on-success (fn [result]
|
||||
(rf/dispatch [:sanitize-messages-and-process-response
|
||||
result]))}]}
|
||||
{:json-rpc/call
|
||||
[{:method "wakuext_editMessage"
|
||||
:params [{:id message-id
|
||||
:text text
|
||||
:content-type (if (emoji-only-content?
|
||||
{:text text
|
||||
:response-to quoted-message})
|
||||
constants/content-type-emoji
|
||||
constants/content-type-text)
|
||||
:linkPreviews (process-link-previews (get-in db
|
||||
[:chat/link-previews :unfurled]))
|
||||
:statusLinkPreviews (map data-store.messages/->status-link-previews-rpc
|
||||
(get-in db
|
||||
[:chat/status-link-previews
|
||||
:unfurled]))}]
|
||||
:js-response true
|
||||
:on-error #(log/error "failed to edit message " %)
|
||||
:on-success (fn [result]
|
||||
(rf/dispatch [:sanitize-messages-and-process-response
|
||||
result]))}]}
|
||||
(link-preview/reset-unfurled)
|
||||
(cancel-message-edit)))
|
||||
|
||||
|
||||
@@ -80,24 +80,53 @@
|
||||
[]
|
||||
curr-previews))
|
||||
|
||||
(defn- merge-preview-types
|
||||
[new-previews new-status-link-previews]
|
||||
(-> (map
|
||||
(fn [{{:keys [display-name members-count banner icon
|
||||
description]} :community
|
||||
{contact-display-name :display-name
|
||||
contact-icon :icon} :contact
|
||||
url :url}]
|
||||
;; Other types of previews need to be done here too
|
||||
;; Like User link preview and Channel link preview
|
||||
{:url url
|
||||
:display-name (or contact-display-name display-name)
|
||||
:members-count members-count
|
||||
:banner banner
|
||||
:icon (or (:data-uri contact-icon) icon)
|
||||
:description description
|
||||
;; Need to set status-link-preview?
|
||||
;; to true to not send status-link-previews
|
||||
;; with normal link-previews
|
||||
:status-link-preview? true})
|
||||
new-status-link-previews)
|
||||
(concat new-previews)))
|
||||
|
||||
(rf/defn unfurl-parsed-urls-success
|
||||
{:events [:link-preview/unfurl-parsed-urls-success]}
|
||||
[{:keys [db]} request-id {new-previews :linkPreviews}]
|
||||
[{:keys [db]} request-id {new-previews :linkPreviews status-link-previews :statusLinkPreviews}]
|
||||
(when (= request-id (get-in db [:chat/link-previews :request-id]))
|
||||
(let [new-previews (map data-store.messages/<-link-preview-rpc new-previews)
|
||||
curr-previews (get-in db [:chat/link-previews :unfurled])
|
||||
indexed-new-previews (utils.collection/index-by :url new-previews)]
|
||||
(let [new-previews (map data-store.messages/<-link-preview-rpc new-previews)
|
||||
new-status-link-previews (map data-store.messages/<-status-link-previews-rpc
|
||||
status-link-previews)
|
||||
merged-preview-types (merge-preview-types new-previews new-status-link-previews)
|
||||
curr-previews (get-in db [:chat/link-previews :unfurled])
|
||||
indexed-new-previews (utils.collection/index-by :url merged-preview-types)]
|
||||
(log/debug "URLs unfurled"
|
||||
:chat/link-previews
|
||||
{:event :link-preview/unfurl-parsed-urls-success
|
||||
:previews (map #(update % :thumbnail dissoc :data-uri) new-previews)
|
||||
:previews (map #(update % :thumbnail dissoc :data-uri) merged-preview-types)
|
||||
:request-id request-id})
|
||||
{:db (-> db
|
||||
(assoc-in [:chat/status-link-previews :unfurled] new-status-link-previews)
|
||||
(update-in [:chat/link-previews :unfurled] reconcile-unfurled indexed-new-previews)
|
||||
(update-in [:chat/link-previews :cache]
|
||||
merge
|
||||
indexed-new-previews
|
||||
(utils.collection/index-by :url
|
||||
(failed-previews curr-previews new-previews))))})))
|
||||
(failed-previews curr-previews
|
||||
merged-preview-types))))})))
|
||||
|
||||
(rf/defn unfurl-parsed-urls-error
|
||||
{:events [:link-preview/unfurl-parsed-urls-error]}
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
|
||||
(def url-github "https://github.com")
|
||||
(def url-gitlab "https://gitlab.com")
|
||||
(def url-community
|
||||
"https://status.app/c/iyKACkQKB0Rvb2RsZXMSJ0NvbG9yaW5nIHRoZSB3b3JsZCB3aXRoIGpveSDigKIg4bSXIOKAohiYohsiByMxMzFEMkYqAwEhMwM=#zQ3shYSHp7GoiXaauJMnDcjwU2yNjdzpXLosAWapPS4CFxc11")
|
||||
(def preview-github {:url url-github :thumbnail nil})
|
||||
(def preview-gitlab {:url url-gitlab :thumbnail nil})
|
||||
(def request-id "abc123")
|
||||
@@ -31,7 +33,15 @@
|
||||
(is (match? {:json-rpc/call [{:method "wakuext_getTextURLs"
|
||||
:params [url-github]}]}
|
||||
(remove-rpc-callbacks
|
||||
(events/unfurl-urls cofx url-github)))))))
|
||||
(events/unfurl-urls cofx url-github))))))
|
||||
(testing "fetches status community URLs"
|
||||
(let [cofx {:db {:chat/link-previews {:unfurled {}
|
||||
:cache {}
|
||||
:request-id "123"}}}]
|
||||
(is (match? {:json-rpc/call [{:method "wakuext_getTextURLs"
|
||||
:params [url-community]}]}
|
||||
(remove-rpc-callbacks
|
||||
(events/unfurl-urls cofx url-community)))))))
|
||||
|
||||
(deftest unfurl-parsed-urls-test
|
||||
(with-redefs [events/new-request-id (constantly request-id)]
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
(ns status-im.contexts.chat.messenger.composer.link-preview.view
|
||||
(:require
|
||||
[clojure.string :as string]
|
||||
[quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[react-native.reanimated :as reanimated]
|
||||
[status-im.common.resources :as resources]
|
||||
[status-im.constants]
|
||||
[status-im.contexts.chat.messenger.composer.constants :as constants]
|
||||
[status-im.contexts.chat.messenger.composer.link-preview.events]
|
||||
[status-im.contexts.chat.messenger.composer.link-preview.style :as style]
|
||||
@@ -33,13 +36,19 @@
|
||||
:horizontal-spacing style/padding-horizontal
|
||||
:loading-message (i18n/label :t/link-preview-loading-message)
|
||||
:on-clear #(rf/dispatch [:link-preview/clear])
|
||||
:data (map (fn [{:keys [title thumbnail hostname loading? url]}]
|
||||
{:title title
|
||||
:body hostname
|
||||
:loading? loading?
|
||||
:thumbnail (:data-uri thumbnail)
|
||||
:url url})
|
||||
previews)}]]))
|
||||
:data (map
|
||||
(fn [{:keys [title display-name thumbnail hostname loading? url favicon
|
||||
icon]}]
|
||||
{:title (or display-name title)
|
||||
:body (or (when-not display-name hostname)
|
||||
status-im.constants/status-hostname)
|
||||
:logo (if (string/starts-with? url "https://status.app/c")
|
||||
(resources/get-mock-image :status-logo)
|
||||
(or icon favicon))
|
||||
:loading? loading?
|
||||
:thumbnail (:data-uri thumbnail)
|
||||
:url url})
|
||||
previews)}]]))
|
||||
|
||||
(defn view
|
||||
[]
|
||||
|
||||
@@ -16,12 +16,13 @@
|
||||
(let [previews (rf/sub [:chats/message-link-previews chat-id message-id])]
|
||||
(when (seq previews)
|
||||
[:<>
|
||||
(for [{:keys [url title description thumbnail hostname]} previews]
|
||||
(for [{:keys [url title description thumbnail hostname favicon]} previews]
|
||||
^{:key url}
|
||||
[quo/link-preview
|
||||
{:title title
|
||||
:description description
|
||||
:link hostname
|
||||
:logo (:url favicon)
|
||||
:thumbnail (:url thumbnail)
|
||||
:thumbnail-size (when (nearly-square? thumbnail) :large)
|
||||
:container-style {:margin-top 8}}])])))
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
(ns status-im.contexts.chat.messenger.messages.content.status-link-preview.view
|
||||
(:require [quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn view
|
||||
[{:keys [chat-id message-id]}]
|
||||
(let [status-link-previews (rf/sub [:chats/message-status-link-previews chat-id message-id])
|
||||
link-previews? (rf/sub [:chats/message-link-previews? chat-id message-id])]
|
||||
(when (seq status-link-previews)
|
||||
[rn/view {:style {:margin-top (when link-previews? 8)}}
|
||||
(for [{:keys [url community]} status-link-previews]
|
||||
(when community
|
||||
(let [{community-description :description
|
||||
community-icon :icon
|
||||
community-banner :banner
|
||||
community-name :display-name
|
||||
members-count :members-count} community]
|
||||
^{:key url}
|
||||
[quo/internal-link-card
|
||||
{:type :community
|
||||
:size :message
|
||||
:description community-description
|
||||
:members-count members-count
|
||||
:title community-name
|
||||
:banner (:url community-banner)
|
||||
:icon (:url community-icon)
|
||||
:on-press #(rf/dispatch [:universal-links/handle-url url])}])))])))
|
||||
@@ -5,6 +5,7 @@
|
||||
[react-native.core :as rn]
|
||||
[react-native.platform :as platform]
|
||||
[status-im.contexts.chat.messenger.messages.content.link-preview.view :as link-preview]
|
||||
[status-im.contexts.chat.messenger.messages.content.status-link-preview.view :as status-link-preview]
|
||||
[status-im.contexts.chat.messenger.messages.content.text.style :as style]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
@@ -165,4 +166,5 @@
|
||||
[message-data]
|
||||
[:<>
|
||||
[render-parsed-text message-data]
|
||||
[link-preview/view message-data]])
|
||||
[link-preview/view message-data]
|
||||
[status-link-preview/view message-data]])
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
[legacy.status-im.data-store.chats :as data-store.chats]
|
||||
[legacy.status-im.data-store.communities :as data-store.communities]
|
||||
[legacy.status-im.data-store.invitations :as data-store.invitations]
|
||||
[legacy.status-im.data-store.messages :as data-store.messages]
|
||||
[legacy.status-im.group-chats.core :as models.group]
|
||||
[legacy.status-im.multiaccounts.update.core :as update.core]
|
||||
[legacy.status-im.pairing.core :as models.pairing]
|
||||
@@ -356,32 +357,35 @@
|
||||
(conj set-hash-fxs
|
||||
#(sanitize-messages-and-process-response % response-js false)))))
|
||||
|
||||
(defn- image->rpc [image] (set/rename-keys image {:data-uri :dataUri}))
|
||||
|
||||
(defn- link-preview->rpc
|
||||
[preview]
|
||||
(update preview
|
||||
:thumbnail
|
||||
(fn [thumbnail]
|
||||
(set/rename-keys thumbnail {:data-uri :dataUri}))))
|
||||
(-> preview
|
||||
(update :thumbnail image->rpc)
|
||||
(update :favicon image->rpc)))
|
||||
|
||||
(defn build-message
|
||||
[msg]
|
||||
(-> msg
|
||||
(update :link-previews #(map link-preview->rpc %))
|
||||
(update :status-link-previews #(set (map data-store.messages/->status-link-previews-rpc %)))
|
||||
(set/rename-keys
|
||||
{:album-id :albumId
|
||||
:audio-duration-ms :audioDurationMs
|
||||
:audio-path :audioPath
|
||||
:chat-id :chatId
|
||||
:community-id :communityId
|
||||
:content-type :contentType
|
||||
:ens-name :ensName
|
||||
:image-height :imageHeight
|
||||
:image-path :imagePath
|
||||
:image-width :imageWidth
|
||||
:link-previews :linkPreviews
|
||||
:response-to :responseTo
|
||||
:sticker :sticker
|
||||
:text :text})))
|
||||
{:album-id :albumId
|
||||
:audio-duration-ms :audioDurationMs
|
||||
:audio-path :audioPath
|
||||
:chat-id :chatId
|
||||
:community-id :communityId
|
||||
:content-type :contentType
|
||||
:ens-name :ensName
|
||||
:image-height :imageHeight
|
||||
:image-path :imagePath
|
||||
:image-width :imageWidth
|
||||
:link-previews :linkPreviews
|
||||
:status-link-previews :statusLinkPreviews
|
||||
:response-to :responseTo
|
||||
:sticker :sticker
|
||||
:text :text})))
|
||||
|
||||
(rf/defn send-chat-messages
|
||||
[_ messages]
|
||||
|
||||
@@ -423,11 +423,19 @@
|
||||
(fn [previews]
|
||||
(get previews :unfurled)))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:chats/status-link-previews-unfurled
|
||||
:<- [:chat/status-link-previews]
|
||||
(fn [previews]
|
||||
(:unfurled previews)))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:chats/link-previews?
|
||||
:<- [:chats/link-previews-unfurled]
|
||||
(fn [previews]
|
||||
(boolean (seq previews))))
|
||||
:<- [:chats/status-link-previews-unfurled]
|
||||
(fn [previews status-link-previews]
|
||||
(boolean (or (seq status-link-previews)
|
||||
(seq previews)))))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:chat/check-channel-muted?
|
||||
|
||||
@@ -102,6 +102,21 @@
|
||||
(fn [messages [_ chat-id message-id]]
|
||||
(get-in messages [chat-id message-id :link-previews])))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:chats/message-link-previews?
|
||||
:<- [:messages/messages]
|
||||
(fn [messages [_ chat-id message-id]]
|
||||
(-> messages
|
||||
(get-in [chat-id message-id :link-previews])
|
||||
count
|
||||
pos?)))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:chats/message-status-link-previews
|
||||
:<- [:messages/messages]
|
||||
(fn [messages [_ chat-id message-id]]
|
||||
(get-in messages [chat-id message-id :status-link-previews])))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:chats/pinned
|
||||
:<- [:messages/pin-messages]
|
||||
|
||||
@@ -159,3 +159,19 @@
|
||||
:pinned-at nil
|
||||
:pinned-by :test-user}]
|
||||
(rf/sub [sub-name :0xChat])))))
|
||||
|
||||
(def message-with-link-previews
|
||||
{:0xChat {:0x01 {:content {:response-to nil}
|
||||
:quoted-message nil
|
||||
:message-id "0x1"
|
||||
:from :xyz
|
||||
:timestamp-str "14:00"
|
||||
:content-type constants/content-type-text
|
||||
:chat-id :0xChat
|
||||
:link-previews [{:dummy-link-preview 1}]}}})
|
||||
|
||||
(h/deftest-sub :chats/message-link-previews?
|
||||
[sub-name]
|
||||
(testing "It returns true if link previews exists in a message"
|
||||
(swap! rf-db/app-db assoc :messages message-with-link-previews)
|
||||
(is (rf/sub [sub-name :0xChat :0x01]))))
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"_comment": "Instead use: scripts/update-status-go.sh <rev>",
|
||||
"owner": "status-im",
|
||||
"repo": "status-go",
|
||||
"version": "v0.176.6",
|
||||
"commit-sha1": "200d5f054096518848adabca82d56105af97086f",
|
||||
"src-sha256": "02c04j7dd29wd0sxbk97yfwq8gj3hwjvlrj07b188cqkq08p920f"
|
||||
"version": "add-favicons-to-link-previews",
|
||||
"commit-sha1": "ab85a9591b5ee08ebed16fed83bd53ffc1b43de3",
|
||||
"src-sha256": "1ldgzvsn8hv3k4r35l1x7zhzl8xmi72bbz1wsr7jmj5x8mmlfbwm"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user