From b50b06ecce3c1a6992a7194a8c0da51c948f7191 Mon Sep 17 00:00:00 2001
From: "Mahatthana (Kelvin) Nomsawadi" <mahatthana.n@gmail.com>
Date: Wed, 20 Jul 2022 17:07:47 +0700
Subject: [PATCH] Fix SSO users can't change language setting (#24091)

* Fix changing locale doesn't reload page

* Fix SSO users can't set language

* Address Alexander's feedback
---
 .../UserProfileForm/UserProfileForm.jsx       | 20 +++++++++-------
 frontend/src/metabase/entities/users/forms.js | 24 +++++++++----------
 .../onboarding/setup/user_settings.cy.spec.js |  3 +++
 3 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/frontend/src/metabase/account/profile/components/UserProfileForm/UserProfileForm.jsx b/frontend/src/metabase/account/profile/components/UserProfileForm/UserProfileForm.jsx
index 45a412908a4..c1eba20a5c3 100644
--- a/frontend/src/metabase/account/profile/components/UserProfileForm/UserProfileForm.jsx
+++ b/frontend/src/metabase/account/profile/components/UserProfileForm/UserProfileForm.jsx
@@ -1,22 +1,24 @@
 import React, { useCallback } from "react";
 import PropTypes from "prop-types";
+
 import User from "metabase/entities/users";
+import { usePrevious } from "metabase/hooks/use-previous";
 
 const propTypes = {
   user: PropTypes.object,
 };
 
 const UserProfileForm = ({ user }) => {
-  const handleSaved = useCallback(
-    ({ locale }) => {
-      if (locale !== user.locale) {
-        window.location.reload();
-      }
-    },
-    [user],
-  );
+  const previousUser = usePrevious(user);
+  const handleSaved = useCallback(() => {
+    if (previousUser.locale !== user.locale) {
+      window.location.reload();
+    }
+  }, [previousUser?.locale, user?.locale]);
 
-  return <User.Form user={user} form={User.forms.user} onSaved={handleSaved} />;
+  return (
+    <User.Form user={user} form={User.forms.user(user)} onSaved={handleSaved} />
+  );
 };
 
 UserProfileForm.propTypes = propTypes;
diff --git a/frontend/src/metabase/entities/users/forms.js b/frontend/src/metabase/entities/users/forms.js
index d2043de0d75..54237677188 100644
--- a/frontend/src/metabase/entities/users/forms.js
+++ b/frontend/src/metabase/entities/users/forms.js
@@ -84,20 +84,18 @@ export default {
       ...PLUGIN_ADMIN_USER_FORM_FIELDS,
     ],
   },
-  user: {
-    fields: user => {
-      const isSsoUser = !PLUGIN_IS_PASSWORD_USER.every(predicate =>
-        predicate(user),
-      );
+  user: user => {
+    const isSsoUser = !PLUGIN_IS_PASSWORD_USER.every(predicate =>
+      predicate(user),
+    );
+    const fields = isSsoUser
+      ? [getLocaleField()]
+      : [...getNameFields(), getEmailField(), getLocaleField()];
 
-      if (isSsoUser) {
-        return [getLocaleField()];
-      }
-
-      // password user
-      return [...getNameFields(), getEmailField(), getLocaleField()];
-    },
-    disablePristineSubmit: true,
+    return {
+      fields,
+      disablePristineSubmit: true,
+    };
   },
   setup: () => ({
     fields: [
diff --git a/frontend/test/metabase/scenarios/onboarding/setup/user_settings.cy.spec.js b/frontend/test/metabase/scenarios/onboarding/setup/user_settings.cy.spec.js
index 7b171907d08..8d737ac298e 100644
--- a/frontend/test/metabase/scenarios/onboarding/setup/user_settings.cy.spec.js
+++ b/frontend/test/metabase/scenarios/onboarding/setup/user_settings.cy.spec.js
@@ -142,6 +142,9 @@ describe("user > settings", () => {
     cy.button("Update").click();
     cy.wait("@updateUserSettings");
 
+    // Assert that the page reloaded with the new language
+    cy.findByLabelText("Nama depan").should("exist");
+
     // We need some UI element other than a string
     cy.icon("gear").should("exist");
   });
-- 
GitLab