Skip to content

What's New Modal: Improve version comparison logic to handle prerelease version transitions - #1403

Merged
ivan-ottinger merged 1 commit into
trunkfrom
update/whats-new-modal-logic-to-respect-prerelease-version-changes
May 20, 2025
Merged

What's New Modal: Improve version comparison logic to handle prerelease version transitions#1403
ivan-ottinger merged 1 commit into
trunkfrom
update/whats-new-modal-logic-to-respect-prerelease-version-changes

Conversation

@ivan-ottinger

@ivan-ottinger ivan-ottinger commented May 16, 2025

Copy link
Copy Markdown
Contributor

Related issues

  • Resolves STU-449
  • Related discussion: p1746514247326159-slack-C06DRMD6VPZ

Proposed Changes

  • update the What's New modal display logic to make the modal rendered in the following extra cases:
    • transitions from one prerelease to another prerelease version (e.g. 1.5.1-beta1 to 1.5.1-beta2)
    • transitions from prerelease to stable version (and vice-versa) (e.g. 1.5.1-beta1 to 1.5.2)
  • add related unit tests

Testing Instructions

  1. Check out the PR branch and build the app with npm start.
  2. Head over to the appdata-v1.json and try changing the lastSeenVersion in it and then reload the app.

For example (if the current app version (in package.json) is 1.5.2-beta2):

  • change the lastSeenVersion to 1.5.2-beta3 → modal should render
  • change the lastSeenVersion to 1.5.2 → modal should render
  1. All related tests should pass (npm test src/stores/tests/app-version-api.test.ts).

Pre-merge Checklist

  • Have you checked for TypeScript, React or other console errors?
@ivan-ottinger ivan-ottinger self-assigned this May 16, 2025
@ivan-ottinger
ivan-ottinger force-pushed the update/whats-new-modal-logic-to-respect-prerelease-version-changes branch from 001b0ee to a6f4864 Compare May 16, 2025 08:40
@ivan-ottinger
ivan-ottinger requested a review from a team May 16, 2025 08:41

@sejas sejas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It works as described, and I see the what's new modal when I try a different beta.

I wonder if we could simplify all these logic by using something like:

const cleanLastSeen = semver.valid(
				semver.coerce( lastSeenVersion, { includePrerelease: true } )
			);
			const cleanCurrent = semver.valid(
				semver.coerce( currentVersion, { includePrerelease: true } )
			);

That would return stable versions and also betas like 1.5.2-beta2, which we could compare:

semver.gt( cleanLastSeen , cleanCurrent ) || forceNewVersion

For me it only has sense to see the what's new modal if I go from one version to a higher version. So I wouldn't display the modal when lastSeen is 1.5.2-beta3 and current is 1.5.2-beta2. Not sure if this was already discussed.

@epeicher epeicher left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for improving this! I have tested it, and it works as advertised, I can see the modal as expected. LGTM! :shipit:

I also think the suggestion by Antonio above is worth exploring.

const currentPrerelease = semver.prerelease( currentVersion );
const lastSeenPrerelease = semver.prerelease( lastSeenVersion );

// Handle prerelease to prerelease transitions

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it makes sense to me to have a modal when we transition from the prerelease to stable version but I am wondering if we need to display it when we transition from one prerelease version to another prerelease considering that we can access it from the topbar and see the modal?

I am guessing one advantage is that when we produce the beta for testers, they will be able to see the modal as well.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good question! We could leave the modal displayed on prerelease updates first and if we find it annoying, we could then adjust the logic further.

@katinthehatsite

Copy link
Copy Markdown
Contributor

It terms of functionality, the code works as expected 👍 I left one question but it is not a strong preference on my end.

@gcsecsey gcsecsey left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for improving this @ivan-ottinger! 🙌 I can see the modal rendered on the release transitions as described. 🚢

@ivan-ottinger

Copy link
Copy Markdown
Contributor Author

Thank you for your reviews and feedback, everyone! ❤️

It works as described, and I see the what's new modal when I try a different beta.

I wonder if we could simplify all these logic by using something like:

const cleanLastSeen = semver.valid(
				semver.coerce( lastSeenVersion, { includePrerelease: true } )
			);
			const cleanCurrent = semver.valid(
				semver.coerce( currentVersion, { includePrerelease: true } )
			);

That would return stable versions and also betas like 1.5.2-beta2, which we could compare:

semver.gt( cleanLastSeen , cleanCurrent ) || forceNewVersion

Thank you for the suggestion, Antonio!

The issue I see with semver.gt is that it does not distinguish between major/minor/patch versions. So even we could use it for the logic partially, we would still need to get more granular to filter out patch version change for which we don't want to display the modal.

For me it only has sense to see the what's new modal if I go from one version to a higher version. So I wouldn't display the modal when lastSeen is 1.5.2-beta3 and current is 1.5.2-beta2. Not sure if this was already discussed.

I have thought about this when we were implementing the initial logic, but then did not proceed to cater for this case. The reason is that moving from higher to lower version shouldn't normally happen and I did not want to complicate the logic further.

With that said, I think we could indeed consider refactoring the whole logic and make it more readable. → Created a new task: STU-516 so we can move forward with this PR. 🙂

@ivan-ottinger
ivan-ottinger merged commit e5d4006 into trunk May 20, 2025
@ivan-ottinger
ivan-ottinger deleted the update/whats-new-modal-logic-to-respect-prerelease-version-changes branch May 20, 2025 10:01

sejas commented May 20, 2025

Copy link
Copy Markdown
Member

@ivan-ottinger, thanks for considering my suggestion.

The issue I see with semver.gt is that it does not distinguish between major/minor/patch versions. So even we could use it for the logic partially, we would still need to get more granular to filter out patch version change for which we don't want to display the modal.

I think semver.gt correctly distinguishes between any two versions. I created a quick table, and it seems to work as we expect, except for betas higher than 9. We could change our beta naming to fix that, or we could consider it as an edgecase for this case as we never cerated so many betas for any release.

Screenshot 2025-05-20 at 12.40.53.png

Here is a CodeSanbdox: https://codesandbox.io/p/sandbox/knlpqy

sejas commented May 20, 2025

Copy link
Copy Markdown
Member

Ivan, Thanks for clarifying. I didn't realized that we want the minor versions to return false to avoid displaying the What's new modal. All good. You can forget my last comment xD.

@ivan-ottinger

Copy link
Copy Markdown
Contributor Author

No worries at all! I think I could have been more clear in my last comment. When I re-read it again, it indeed wasn't communicating what I had on mind. 😅

I think semver.gt correctly distinguishes between any two versions. I created a quick table, and it seems to work as we expect, except for betas higher than 9. We could change our beta naming to fix that, or we could consider it as an edgecase for this case as we never cerated so many betas for any release.

Just adding for others (since we discussed this with Antonio already): What I meant was that semver.gt will still return true even if we are comparing for the minor version, e.g. 1.5.2 vs 1.5.1. In that case it will still return true.

But for our use, we want the modal to not display if the update is just for patch version. That is the reason we would still need additional check for that. 🙂

bcotrim added a commit that referenced this pull request May 27, 2025
commit d31733b
Author: katinthehatsite <katerynakodonenko@gmail.com>
Date:   Tue May 27 09:12:55 2025 +0200

    Studio: Delete old proof-of-concept WP-CLI implementation (#1426)

    * Remove old scripts

    * Remove old cli.ts

    * Cleanup tests

    * Clean up terminal opening and feature flag

    * Cleanup assistant code

    * Clean shortcuts code

    * Cleanup feature flags

    * Cleanup feature flags

    * Cleanup shortcuts sessions

    * Removed unused feature flag for assistant

    * Assistant code block test fix

    * Adjust preload

    * Cleanup index file and tests

    * Refactor terminal usage

    * Add back the lock

    * Remove unintended change

    * Remove unnecesary type for warp

    * Use bundled Ids

    * Cleanup event parameter

    ---------

    Co-authored-by: Kateryna Kodonenko <kateryna@automattic.com>

commit 4fac446
Author: Volodymyr Makukha <nei.css@gmail.com>
Date:   Mon May 26 20:19:35 2025 +0100

    Update Ukrainian translations - May 26 (#1439)

commit c7536ef
Author: Antonio Sejas <antonio.sejas@automattic.com>
Date:   Mon May 26 18:34:28 2025 +0100

    Load LTR and RTL stylesheets conditionally (#1429)

    * Add a new component
    * Load @wordpress/components css conditionally based on RTL and LTR.
    * Load index.css a.k.a main_window.css after loading the WordPress stylesheet

commit c80b70e
Author: Bero <berislav.grgicak@gmail.com>
Date:   Mon May 26 19:20:42 2025 +0200

    Update Playground packages to 1.0.38 and remove the Symlink manager (#1425)

    * Update Playground packages to 1.0.38
    * Remove SymlinkManager
    * Activate Playground's followSymlinks feature
    * Remove @php-wasm/universal patch

commit 5bfe676
Author: Wojtek Naruniec <wojtek.naruniec@automattic.com>
Date:   Mon May 26 15:40:18 2025 +0200

    Sanitize regex in Win editor path (#1411)

    * Sanitize regex

    * Import only escapeRegExp function

commit 2cd3e44
Author: Ivan Ottinger <ivan.ottinger@automattic.com>
Date:   Mon May 26 13:18:02 2025 +0200

    Bump version from 1.5.2-beta4 to 1.5.2 (#1436)

commit f16865e
Author: Ivan Ottinger <ivan.ottinger@automattic.com>
Date:   Mon May 26 12:38:24 2025 +0200

    Add release notes for 1.5.2 (#1434)

    * Add release notes for 1.5.2

    * Reorder release notes

    * Update release notes order and formatting

    * Added latest UI fix to the release notes

    * Consolidate Studio CLI fixes into a single bullet point

commit f6e48d5
Author: Ivan Ottinger <ivan.ottinger@automattic.com>
Date:   Mon May 26 12:21:30 2025 +0200

    Add translations for 1.5.2 (#1433)

    * Add translations for 1.5.2

    * Add latest Polish and Spanish translations

    * Update spanish translations

    ---------

    Co-authored-by: Antonio Sejas <antonio@sejas.es>

commit ae1d163
Author: Antonio Sejas <antonio.sejas@automattic.com>
Date:   Mon May 26 10:58:22 2025 +0100

    Share same styles between preview and sync tabs (#1435)

commit d6a7905
Author: Roberto Aranda <roberto.aranda@automattic.com>
Date:   Fri May 23 15:23:14 2025 +0200

    Return original URL param when it cannot be parsed (#1420)

    * Return the passed URL parameter when it cannot be parsed instead of an empty string

commit 91d04be
Author: Antonio Sejas <antonio.sejas@automattic.com>
Date:   Fri May 23 14:22:34 2025 +0100

    Update localized docs links for Studio Sync  and Studio CLI (#1431)

    * Add translation link to new Spanish studio docs CLI
    * Add hash to Studio sync supported sites

commit 6213094
Author: katinthehatsite <katerynakodonenko@gmail.com>
Date:   Fri May 23 14:27:53 2025 +0200

    Add patch to fix the accessibility with modals (#1423)

    Co-authored-by: Kateryna Kodonenko <kateryna@automattic.com>

commit b2724c0
Author: Rahul Gavande <rahul.gavande@automattic.com>
Date:   Fri May 23 14:45:11 2025 +0530

    Use uri scheme to open Warp terminal app (#1428)

commit 43c831b
Author: Fredrik Rombach Ekelund <fredrik@f26d.dev>
Date:   Wed May 21 16:10:40 2025 +0200

    CLI: Set UTF8 encoding for output on Windows (#1424)

commit b1c0eeb
Author: Volodymyr Makukha <nei.css@gmail.com>
Date:   Wed May 21 10:34:47 2025 +0100

    Fix hiding plugins spinner (#1419)

commit 48988ed
Author: Fredrik Rombach Ekelund <fredrik@f26d.dev>
Date:   Wed May 21 10:31:33 2025 +0200

    Add migration to rename launch uniques stat (#1415)

    * Add migration to rename launch uniques stat

    * Fix CLI zod schema

commit f363144
Author: Ivan Ottinger <ivan.ottinger@automattic.com>
Date:   Tue May 20 18:24:00 2025 +0200

    Bump version to 1.5.2-beta4 (#1421)

commit 9768e67
Author: Ivan Ottinger <ivan.ottinger@automattic.com>
Date:   Tue May 20 15:29:33 2025 +0200

    Pressable Sync: Fix remaining Sync modal issues (#1416)

    * Use absolute path for `WordPressLogoCircle` import

    * Use separate `isDisabled` to makde WP logo gray

    * Remove trailing space in site selector helper text

    * Decrease font size of sync sites modal learn more link

commit 9fab398
Author: Ian G. Maia <iangmaia@users.noreply.github.com>
Date:   Tue May 20 13:15:23 2025 +0200

    [Tooling] Update code to DRY the Windows build PS1 (#1408)

    * Update code to DRY the Windows build PS1

    * Update case of `Exit` command

    * Use `windows` instead of just `win` to prefix windows-related scripts

    * Add $LastExitCode check after `npm run make`

commit e5d4006
Author: Ivan Ottinger <ivan.ottinger@automattic.com>
Date:   Tue May 20 12:01:21 2025 +0200

    Improve version comparison logic to handle prerelease transitions correctly (#1403)

commit f0a282b
Author: Rahul Gavande <rahul.gavande@automattic.com>
Date:   Tue May 20 15:15:25 2025 +0530

    HTTPS: Convert domain name Unicode characters to ASCII characters (#1400)

    * Convert domain name unicode chars to ASCII

    * Do not use punnycode domain name for paths

    * Remove unncessary punnycode domain name

commit 6cdc351
Author: Roberto Aranda <roberto.aranda@automattic.com>
Date:   Tue May 20 11:35:52 2025 +0200

    Sync: Update notification to include Hostname (#1412)

    * Push: Update notification to include Hostname

    * Pull: Update notification to include hostname

    * Add hints for translators

commit 69419a6
Author: Gergely Csécsey <gergely.csecsey@automattic.com>
Date:   Tue May 20 10:30:57 2025 +0100

    Increase HTTP request timeout to 60 seconds (#1407)

    * Increase HTTP request timeout to 60 seconds

    * Increase curl timeout to 60 seconds

    * update comments

commit 6bcbbff
Author: Antonio Sejas <antonio.sejas@automattic.com>
Date:   Tue May 20 09:36:18 2025 +0100

    Update connect site text button when connecting another site (#1413)

    * Adapt the "Connect Site" button when connecting multiple sites on Sync.

commit 60a9cab
Author: Antonio Sejas <antonio.sejas@automattic.com>
Date:   Tue May 20 09:10:37 2025 +0100

    Avoid orphan in sync title (#1414)

commit 3b103cc
Author: Antonio Sejas <antonio.sejas@automattic.com>
Date:   Mon May 19 10:39:12 2025 +0100

    Release 1.5.2-beta3 (#1410)

commit a109671
Author: Ivan Ottinger <ivan.ottinger@automattic.com>
Date:   Mon May 19 09:45:17 2025 +0200

    Sync: Update sync tab text and remove WordPress logo from title (#1405)

    * Update sync tab text and remove WordPress logo from title

    * Fix related test

    * Use comma

    * Update copy of the bullet points

    * Replace `WP.com` with `WordPress.com`.

    Co-authored-by: Antonio Sejas <antonio.sejas@automattic.com>

    * Replace WP.com with WordPress.com

    Co-authored-by: Antonio Sejas <antonio.sejas@automattic.com>

    * Delete unused WordPress short logo component

    ---------

    Co-authored-by: Antonio Sejas <antonio.sejas@automattic.com>

commit 716bc7a
Author: Ivan Ottinger <ivan.ottinger@automattic.com>
Date:   Fri May 16 16:15:16 2025 +0200

    Sync: Update Sync modal content (#1406)

    * Update WordPress logo component `viewBox`

    * Update Sync modal heading

    * Update text below Sync search field

    * Update Sync modal site logos

    * Replace hardcoded arrows with `ArrowIcon` component in sync sites modal links

    * Localize sync modal Read more link using `getLocalizedLink` utility

commit 11b4302
Author: Roberto Aranda <roberto.aranda@automattic.com>
Date:   Fri May 16 15:14:40 2025 +0200

    Push: Read and update the progress from the sync endpoint (#1389)

    * Calls the GET /sync/import using the importId to obtain the progress
    * Use the progress from the /sync/import endpoint to update the progress in the importing state
    * Splits the progress of the importing state between backup and import

commit 7423bdf
Author: katinthehatsite <katerynakodonenko@gmail.com>
Date:   Fri May 16 11:40:18 2025 +0200

    Studio: Fix no directory or file error on Windows (#1391)

    * Fix no directory or file error on Windows

    * Cleanup directories

    ---------

    Co-authored-by: Kateryna Kodonenko <kateryna@automattic.com>

commit 1661ac4
Author: Antonio Sejas <antonio.sejas@automattic.com>
Date:   Fri May 16 10:04:32 2025 +0100

    Force display of what's new for minor version (#1404)

    * Force what's new display for minor version
    * Skip test that compares the patch version
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

5 participants