From 9dadc0141cf9fff19d86814d25706a1c55e8dc0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Fri, 20 Jun 2025 10:22:29 +0200 Subject: [PATCH] FEATURE: add link to "associated accounts" providers (#33275) This adds a link for each authentication providers that are listed in /my/preferences/account in the "Associated Accounts" section. This is particularly useful when Discourse is being used in the PWA or in the DiscourseMobile app where there's no browser bar available and the only way to visit the provider's website is to open a browser window. That way, they can _just_ click the provider's name. Internal ref - t/156255 --- **BEFORE** ![Screenshot 2025-06-19 at 21 04 46](https://github.com/user-attachments/assets/3d2be5d0-d857-4b8a-b0a5-5672301c59c6) **AFTER** ![Screenshot 2025-06-19 at 21 03 39](https://github.com/user-attachments/assets/4c8bc5e9-3c99-4924-8d33-547f567bb346) --- .../app/controllers/preferences/account.js | 14 ++--- .../app/templates/preferences/account.gjs | 24 ++++++- app/serializers/auth_provider_serializer.rb | 31 +++++---- lib/auth/auth_provider.rb | 24 ++++--- lib/auth/authenticator.rb | 5 ++ lib/auth/discord_authenticator.rb | 4 ++ lib/auth/discourse_id_authenticator.rb | 4 ++ lib/auth/facebook_authenticator.rb | 4 ++ lib/auth/github_authenticator.rb | 4 ++ lib/auth/google_oauth2_authenticator.rb | 4 ++ lib/auth/linkedin_oidc_authenticator.rb | 4 ++ lib/auth/twitter_authenticator.rb | 4 ++ .../user_preferences_account_spec.rb | 63 ++++++++++++++++++- 13 files changed, 151 insertions(+), 38 deletions(-) diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/account.js b/app/assets/javascripts/discourse/app/controllers/preferences/account.js index 90c3fa35bb2..fc45021fee2 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/account.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/account.js @@ -87,16 +87,12 @@ export default class AccountController extends Controller { @discourseComputed("model.associated_accounts.[]") authProviders(accounts) { - const allMethods = findAll(); - - const result = allMethods.map((method) => { - return { + return findAll() + .map((method) => ({ method, - account: accounts.find((account) => account.name === method.name), // Will be undefined if no account - }; - }); - - return result.filter((value) => value.account || value.method.can_connect); + account: accounts.find(({ name }) => name === method.name), + })) + .filter((value) => value.account || value.method.can_connect); } @discourseComputed( diff --git a/app/assets/javascripts/discourse/app/templates/preferences/account.gjs b/app/assets/javascripts/discourse/app/templates/preferences/account.gjs index ba10c911acb..55415fc6122 100644 --- a/app/assets/javascripts/discourse/app/templates/preferences/account.gjs +++ b/app/assets/javascripts/discourse/app/templates/preferences/account.gjs @@ -168,7 +168,17 @@ export default RouteTemplate(
- {{authProvider.method.prettyName}} + {{#if authProvider.method.provider_url}} + + {{authProvider.method.prettyName}} + + {{else}} + {{authProvider.method.prettyName}} + {{/if}}
{{authProvider.account.description}} @@ -206,7 +216,17 @@ export default RouteTemplate(