From 9e5aeaf572575eb0bcec3ddfe198dfb1e092be1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 6 Sep 2023 12:15:25 +0200 Subject: [PATCH] Add user avatars --- app/controllers/settings_controller.rb | 3 +- app/models/user.rb | 28 ++++++++++ app/views/settings/_profile.html.erb | 75 ++++++++++++++++++-------- 3 files changed, 82 insertions(+), 24 deletions(-) diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb index f4168c3..7a29675 100644 --- a/app/controllers/settings_controller.rb +++ b/app/controllers/settings_controller.rb @@ -19,6 +19,7 @@ class SettingsController < ApplicationController def update @user.preferences.merge!(user_params[:preferences] || {}) @user.display_name = user_params[:display_name] + @user.avatar = user_params[:avatar] if user_params[:avatar].present? if @user.save if @user.display_name && (@user.display_name != @user.ldap_entry[:display_name]) @@ -117,7 +118,7 @@ class SettingsController < ApplicationController end def user_params - params.require(:user).permit(:display_name, preferences: [ + params.require(:user).permit(:display_name, :avatar, preferences: [ :lightning_notify_sats_received, :xmpp_exchange_contacts_with_invitees ]) diff --git a/app/models/user.rb b/app/models/user.rb index cb596fe..d5db570 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -5,6 +5,12 @@ class User < ApplicationRecord serialize :preferences, UserPreferences + # + # File attachments + # + + has_one_attached :avatar + # Relations has_many :invitations, dependent: :destroy has_one :invitation, inverse_of: :invitee, foreign_key: 'invited_user_id' @@ -40,6 +46,7 @@ class User < ApplicationRecord validates_uniqueness_of :nostr_pubkey, allow_blank: true + validate :acceptable_avatar scope :confirmed, -> { where.not(confirmed_at: nil) } scope :pending, -> { where(confirmed_at: nil) } scope :all_except, -> (user) { where.not(id: user) } @@ -140,6 +147,14 @@ class User < ApplicationRecord @display_name ||= ldap_entry[:display_name] end + def avatar_64px + avatar.variant(resize_to_fill: [64, 64]) + end + + def avatar_256px + avatar.variant(resize_to_fill: [256, 256]) + end + def services_enabled ldap_entry[:service] || [] end @@ -168,4 +183,17 @@ class User < ApplicationRecord return @ldap_service if defined?(@ldap_service) @ldap_service = LdapService.new end + + def acceptable_avatar + return unless avatar.attached? + + if avatar.blob.byte_size > 1.megabyte + errors.add(:avatar, "file size is too large") + end + + acceptable_types = ["image/jpeg", "image/png"] + unless acceptable_types.include?(avatar.content_type) + errors.add(:avatar, "must be a JPEG or PNG file") + end + end end diff --git a/app/views/settings/_profile.html.erb b/app/views/settings/_profile.html.erb index b3424aa..40e2eec 100644 --- a/app/views/settings/_profile.html.erb +++ b/app/views/settings/_profile.html.erb @@ -1,33 +1,62 @@

Profile

-

- <%= label :user_address, 'User address', class: 'font-bold' %> -

-

- disabled="disabled" - data-clipboard-target="source" /> - -

-

- Your user address for Chat and Lightning Network. -

+
+

+ <%= label :user_address, 'User address', class: 'font-bold' %> +

+

+ disabled="disabled" + data-clipboard-target="source" /> + +

+

+ Your user address for Chat and Lightning Network. +

+
<%= form_for(@user, url: setting_path(:profile), html: { :method => :put }) do |f| %> <%= render FormElements::FieldsetComponent.new(tag: "div", title: "Display name") do %> - <%= f.text_field :display_name, class: "w-full sm:w-3/5 mb-2" %> + <%= f.text_field :display_name, class: "w-full sm:w-3/5" %> <% if @validation_errors.present? && @validation_errors[:display_name].present? %> -

<%= @validation_errors[:display_name].first %>

+

<%= @validation_errors[:display_name].first %>

<% end %> <% end %> + + +

<%= f.submit 'Save', class: "btn-md btn-blue w-full md:w-auto" %>