diff --git a/app/helpers/bridge_helper.rb b/app/helpers/bridge_helper.rb index fe53b86c3..0fd43044e 100644 --- a/app/helpers/bridge_helper.rb +++ b/app/helpers/bridge_helper.rb @@ -10,4 +10,14 @@ module BridgeHelper bridge_title: "Go to #{board.name}" } end + + def bridged_share_button(type = nil) + tag.button "Share", hidden: true, data: { + controller: "bridge--share", + action: "bridge--share#share", + bridge__overflow_menu_target: "item", + bridge_title: "Share", + bridge_share_type: type + } + end end diff --git a/app/javascript/controllers/bridge/share_controller.js b/app/javascript/controllers/bridge/share_controller.js new file mode 100644 index 000000000..2c6e24248 --- /dev/null +++ b/app/javascript/controllers/bridge/share_controller.js @@ -0,0 +1,45 @@ +import { BridgeComponent } from "@hotwired/hotwire-native-bridge" + +export default class extends BridgeComponent { + static component = "share" + + share() { + const type = this.bridgeElement.bridgeAttribute("share-type") + switch (type) { + case "card-url": + this.send("shareCardUrl", this.#data(type)) + break + default: + this.send("shareUrl", this.#data(type)) + } + } + + #data(type) { + return { + title: document.title, + url: window.location.href, + ...this.#additionalDataFor(type) + } + } + + #additionalDataFor(type) { + switch (type) { + case "card-url": + return { + author: this.#author, + dateAdded: this.#dateAdded + } + default: + return null + } + } + + get #author() { + return document.querySelector(".card__meta-text--author strong")?.textContent?.trim() ?? null + } + + get #dateAdded() { + const timestamp = document.querySelector(".card__meta-text--added time")?.dateTime + return parseInt(timestamp) || null + } +} diff --git a/app/views/boards/show.html.erb b/app/views/boards/show.html.erb index bcccf4512..49391dd58 100644 --- a/app/views/boards/show.html.erb +++ b/app/views/boards/show.html.erb @@ -30,3 +30,5 @@ <%= render "boards/show/columns", page: @page, board: @board %> <% end %> <% end %> + +<%= bridged_share_button() %> diff --git a/app/views/cards/show.html.erb b/app/views/cards/show.html.erb index cf6d239db..90481c5b8 100644 --- a/app/views/cards/show.html.erb +++ b/app/views/cards/show.html.erb @@ -23,3 +23,5 @@ <%= button_to_remove_card_image(@card) if @card.image.attached? %> <% end %> + +<%= bridged_share_button("card-url") %>