From 129bd5febc98d9b027fa46fa1eb06f3ef89f9e0e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com>
Date: Thu, 15 Sep 2022 12:28:51 +0200
Subject: [PATCH] resend confirmation banner

---
 app/controllers/users/confirmations_controller.rb | 9 +++++++++
 app/views/admin/layouts/application.html.erb      | 8 ++++++++
 config/locales/fr.yml                             | 2 ++
 config/routes.rb                                  | 2 ++
 4 files changed, 21 insertions(+)

diff --git a/app/controllers/users/confirmations_controller.rb b/app/controllers/users/confirmations_controller.rb
index 98000946c..663067dd4 100644
--- a/app/controllers/users/confirmations_controller.rb
+++ b/app/controllers/users/confirmations_controller.rb
@@ -1,3 +1,12 @@
 class Users::ConfirmationsController < Devise::ConfirmationsController
   include Users::AddUniversityToRequestParams
+
+  def resend
+    unless signed_in_resource.confirmed?
+      signed_in_resource.resend_confirmation_instructions
+      redirect_back(fallback_location: admin_root_path, notice: t('devise.confirmations.send_instructions'))
+    else
+      redirect_back(fallback_location: admin_root_path, alert: t('admin.users_alerts.already_confirmed'))
+    end
+  end
 end
diff --git a/app/views/admin/layouts/application.html.erb b/app/views/admin/layouts/application.html.erb
index 7ed091692..425183182 100644
--- a/app/views/admin/layouts/application.html.erb
+++ b/app/views/admin/layouts/application.html.erb
@@ -33,6 +33,14 @@
         <%= render 'admin/application/top' %>
         <main class="content">
           <div class="container-fluid p-0">
+            <% unless current_user.confirmed? %>
+              <div class="alert alert-warning">
+                <div class="alert-message">
+                  <%= t('admin.users_alerts.pending_confirmation', duration: distance_of_time_in_words(Rails.configuration.devise.allow_unconfirmed_access_for)) %>
+                  <%= link_to t('devise.confirmations.new.resend_confirmation_instructions'), resend_user_confirmation_path, method: :post, class: 'alert-link' %>
+                </div>
+              </div>
+            <% end %>
             <div class="d-flex justify-content-between">
               <h1><%= yield :title %></h1>
               <p class="text-end pt-1"><%= yield :title_right %></p>
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 25cb07d8a..dd33b0f80 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -106,8 +106,10 @@ fr:
     successfully_removed_html: "<i>%{model}</i> a bien été retiré(e)."
     successfully_updated_html: "<i>%{model}</i> a bien été mis(e) à jour."
     users_alerts:
+      already_confirmed: "Votre compte est déjà confirmé."
       not_locked_html: "<i>%{model}</i> n'était pas verrouillé(e)."
       successfully_unlocked_html: "<i>%{model}</i> a bien été déverrouillé(e)."
+      pending_confirmation: "Vous avez reçu un e-mail pour confirmer votre compte. Celui-ci est utilisable pendant %{duration}."
     will_be_published_html: "<i>%{model}</i> va bientôt être publié(e)."
   batch_selectable:
     title: Modifier la sélection
diff --git a/config/routes.rb b/config/routes.rb
index 2e983de6e..b97709544 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -13,11 +13,13 @@ Rails.application.routes.draw do
   }
 
   devise_scope :user do
+    post '/users/confirmation/resend' => 'users/confirmations#resend', as: :resend_user_confirmation
     match '/users/auth/saml/setup' => 'users/omniauth_callbacks#saml_setup', via: [:get, :post]
   end
 
   namespace :admin do
     resources :users do
+      post 'resend_confirmation_email' => 'users#resend_confirmation_email', on: :member
       patch 'unlock' => 'users#unlock', on: :member
     end
     draw 'admin/administration'
-- 
GitLab