diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index dd3e82e02..0816b20a4 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -47,3 +47,11 @@ p.notice:empty { #navbar>ul.navbar-nav>li>a.nav-link { color: var(--bs-navbar-hover-color) !important; } + +span.obfuscated { + -webkit-text-security: disc; +} + +span.deobfuscated { + -webkit-text-security: none; +} diff --git a/app/components/copy_button.rb b/app/components/copy_button.rb index da26980ac..35b69e4bb 100644 --- a/app/components/copy_button.rb +++ b/app/components/copy_button.rb @@ -9,7 +9,7 @@ class Components::CopyButton < Components::Base end def view_template - a href: "#", class: "link-secondary", data: {controller: "copy-text", action: "click->copy-text#copy:prevent", copy_text_text_value: @text} do + button class: "btn btn-secondary", data: {controller: "copy-text", action: "click->copy-text#copy:prevent", copy_text_text_value: @text} do Icon icon: "clipboard-plus", label: @label end end diff --git a/app/components/copyable_text.rb b/app/components/copyable_text.rb new file mode 100644 index 000000000..adc75d5b5 --- /dev/null +++ b/app/components/copyable_text.rb @@ -0,0 +1,27 @@ +class Components::CopyableText < Components::Base + def initialize(text:, label: nil, obfuscated: false) + @text = text + @label = label + @obfuscated = obfuscated + end + + def before_template + @label ||= t("components.copy_button.copy") + end + + def view_template + div(data: {controller: "obfuscated-text"}) do + span(class: @obfuscated ? "obfuscated" : nil) { @text } + whitespace + if @obfuscated + button class: "btn btn-sm btn-outline-secondary", title: t("components.copyable_text.reveal"), data: {action: "click->obfuscated-text#toggle:prevent"} do + Icon icon: "eye" + end + end + whitespace + button class: "btn btn-sm btn-outline-secondary", title: @label, data: {controller: "copy-text", action: "click->copy-text#copy:prevent", copy_text_text_value: @text} do + Icon icon: "clipboard-plus" + end + end + end +end diff --git a/app/javascript/controllers/index.ts b/app/javascript/controllers/index.ts index cf8307575..d710611a7 100644 --- a/app/javascript/controllers/index.ts +++ b/app/javascript/controllers/index.ts @@ -11,6 +11,7 @@ import CocoonedController from './cocooned_controller' import CopyTextController from './copy_text_controller' import EditableController from './editable_controller' import I18nController from './i18n_controller' +import ObfuscatedTextController from './obfuscated_text_controller' import RendererController from './renderer_controller' import SearchableSelectController from './searchable_select_controller' import StorageServiceController from './storage_service_controller' @@ -27,6 +28,7 @@ application.register('cocooned', CocoonedController) application.register('copy-text', CopyTextController) application.register('editable', EditableController) application.register('i18n', I18nController) +application.register('obfuscated-text', ObfuscatedTextController) application.register('renderer', RendererController) application.register('searchable-select', SearchableSelectController) application.register('storage-service', StorageServiceController) diff --git a/app/javascript/controllers/obfuscated_text_controller.ts b/app/javascript/controllers/obfuscated_text_controller.ts new file mode 100644 index 000000000..edb173554 --- /dev/null +++ b/app/javascript/controllers/obfuscated_text_controller.ts @@ -0,0 +1,15 @@ +import { Controller } from '@hotwired/stimulus' + +// Connects to data-controller="obfuscated-text" +export default class extends Controller { + toggle (): void { + const hidden = this.element.querySelectorAll('.obfuscated') + const shown = this.element.querySelectorAll('.deobfuscated') + hidden.forEach((element: HTMLElement) => { + element.classList.replace('obfuscated', 'deobfuscated') + }) + shown.forEach((element: HTMLElement) => { + element.classList.replace('deobfuscated', 'obfuscated') + }) + } +} diff --git a/app/views/collections/show.html.erb b/app/views/collections/show.html.erb index 6e822dba7..24f11b827 100644 --- a/app/views/collections/show.html.erb +++ b/app/views/collections/show.html.erb @@ -19,8 +19,7 @@ <%= link_to @collection.federails_actor.at_address, @collection.federails_actor.profile_url, target: "new" %> <% elsif SiteSettings.federation_enabled? %> - <%= @collection.federails_actor.short_at_address %> - <%= CopyButton(text: @collection.federails_actor.at_address, label: t("general.copy_fediverse_handle")) %> + <%= CopyableText(text: @collection.federails_actor.at_address, label: t("general.copy_fediverse_handle")) %> <% end %>
diff --git a/app/views/creators/show.html.erb b/app/views/creators/show.html.erb index d7563a082..48d8b6976 100644 --- a/app/views/creators/show.html.erb +++ b/app/views/creators/show.html.erb @@ -25,8 +25,7 @@ <%= link_to @creator.federails_actor.at_address, @creator.federails_actor.profile_url, target: "new" %> <% elsif SiteSettings.federation_enabled? %> - <%= @creator.federails_actor.short_at_address %> - <%= CopyButton(text: @creator.federails_actor.at_address, label: t("general.copy_fediverse_handle")) %> + <%= CopyableText(text: @creator.federails_actor.at_address, label: t("general.copy_fediverse_handle")) %> <% end %> diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb index 750f61826..1d5b8b49d 100644 --- a/app/views/devise/registrations/edit.html.erb +++ b/app/views/devise/registrations/edit.html.erb @@ -15,8 +15,7 @@ <% if SiteSettings.federation_enabled? %><%= resource.federails_actor.at_address %>
- <%= CopyButton(text: resource.federails_actor.at_address, label: t("general.copy_fediverse_handle")) %>
+ <%= CopyableText(text: resource.federails_actor.at_address, label: t("general.copy_fediverse_handle")) %>
<%= @application.uid %><%= @application.secret %><%= current_user.creators.local.first.federails_actor.at_address %>
- <%= CopyButton text: current_user.creators.local.first.federails_actor.at_address, label: t("general.copy_fediverse_handle") %>
+ <%= CopyableText text: current_user.creators.local.first.federails_actor.at_address, label: t("general.copy_fediverse_handle") %>
<%= current_user.federails_actor.at_address %>
- <%= CopyButton text: current_user.federails_actor.at_address, label: t("general.copy_fediverse_handle") %>
+ <%= CopyableText text: current_user.federails_actor.at_address, label: t("general.copy_fediverse_handle") %>