(Breaking change) Switch between set password and change password on the settings page. (#15582)

Here is what the PR does:

- Surface password state in validatePasswordResetToken, returning
hasPassword so the client can tell whether a user is setting or changing
their password.
- Consume that flag throughout the front end (mock data, stories,
GraphQL types) and update the Reset/Set Password modal to swap the
heading/button label and success toast accordingly.
- After a successful password set/reset, immediately update the
logged-in user’s hasPassword flag so the Settings screen reflects the
new state without a reload.

Modal has two states now - reset password modal uses change password
state since it made intuitive sense.

<p align="center">
<img width="404" height="397" alt="image"
src="https://github.com/user-attachments/assets/c54cc581-1248-4395-833d-0202758e1947"
/>
</p>

<p align="center">
<img width="403" height="393" alt="image"
src="https://github.com/user-attachments/assets/d8a39a95-27e6-4037-86f2-1f74176002ba"
/>
</p>

---------

Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
This commit is contained in:
Abdullah.
2025-11-05 11:29:37 +01:00
committed by GitHub
co-authored by Félix Malfait
parent cc7343a8f2
commit 0fcfcec426
80 changed files with 755 additions and 357 deletions
@@ -4,7 +4,7 @@ export class ProfileSection {
private readonly firstNameField: Locator;
private readonly lastNameField: Locator;
private readonly emailField: Locator;
private readonly changePasswordButton: Locator;
private readonly passwordLinkButton: Locator;
private readonly deleteAccountButton: Locator;
constructor(public readonly page: Page) {
@@ -12,8 +12,8 @@ export class ProfileSection {
this.firstNameField = page.getByPlaceholder('Tim');
this.lastNameField = page.getByPlaceholder('Cook');
this.emailField = page.getByRole('textbox').nth(2);
this.changePasswordButton = page.getByRole('button', {
name: 'Change Password',
this.passwordLinkButton = page.getByRole('button', {
name: /Change Password|Set Password/,
});
this.deleteAccountButton = page.getByRole('button', {
name: 'Delete account',
@@ -34,8 +34,8 @@ export class ProfileSection {
await this.emailField.textContent();
}
async sendChangePasswordEmail() {
await this.changePasswordButton.click();
async sendPasswordSetOrChangeEmail() {
await this.passwordLinkButton.click();
}
async deleteAccount() {