Skip to content

feat: release version#3292

Closed
eduardoformiga wants to merge 154 commits intomainfrom
dev
Closed

feat: release version#3292
eduardoformiga wants to merge 154 commits intomainfrom
dev

Conversation

@eduardoformiga
Copy link
Copy Markdown
Member

@eduardoformiga eduardoformiga commented May 4, 2026

What's the purpose of this pull request?

This PR aims to generate a new version from dev to main.

Summary by CodeRabbit

  • New Features

    • Added gift item detection capability for store offers
    • Introduced Shopping Assistant component for CMS pages
  • Improvements

    • Enhanced session validation and token refresh logic
    • Improved preview tag positioning and styling
    • Added file upload support with CSV parsing capabilities

lariciamota and others added 30 commits October 30, 2025 09:26
## What's the purpose of this pull request?

Build our default image loader.

## How it works?

- When the FastStore image component is used, the `faststoreLoader` is
used.
- When the Next image component is used directly, the
`customImageLoader` is used.
- Both have the same behavior when handling images from VTEX (from the
file manager/cms and product images) -- they add to the URL the info
regarding size, quality and aspect, since those VTEX services already
handles optimizations.
- The difference between those loaders is regarding external images --
the one used for Next images uses the Next optimizations, and the
FastStore one doesn't.

It won't be necessary to use a feature flag like
`enableVtexAssetsLoader`.

## How to test it?

<!--- Describe the steps with bullet points. Is there any external link
that can be used to better test it or an example? --->

### Starters Deploy Preview

PR: vtex-sites/faststoreqa.store#881

## References

- [Jira task](https://vtex-dev.atlassian.net/browse/SFS-2878)
- [Slack
thread](https://vtex.slack.com/archives/C03L3CRCDC4/p1761334946034969)
## What's the purpose of this pull request?

Atts.
## What's the purpose of this pull request?

This PR fixes a visual bug in the TextareaField component where long
text would appear underneath the floating label during scroll, making it
difficult to read. The issue was identified during the review of [PR
#2705](#2705 (review)).

Additionally, comprehensive Storybook documentation was added to
showcase all TextareaField variations and use cases.


https://github.com/user-attachments/assets/a86cd4df-e286-40f4-82b0-271a8bc66a26




## How it works?

**Bug Fix:**
- Added `--fs-textarea-field-label-background-color` CSS variable to
`packages/ui/src/components/molecules/TextareaField/styles.scss`
- Set default value to neutral-0 (white) to prevent text from showing
through the label
- When the textarea content is long and the user scrolls, the label now
has an opaque background, preventing text overlap

## How to test it?

**Test the scroll bug fix:**

From the project root:
```bash
pnpm --filter "@faststore/storybook" dev
```

Or navigate to the storybook package:
```bash
cd packages/storybook
pnpm dev
```

Then:
1. Open http://localhost:6006 in your browser
2. Navigate to **"TextareaField"** → **"LargeText"** story
3. Scroll inside the textarea content
4. Verify that the text no longer appears underneath the label

## References
- **Related Issue:** [PR #2705 - TextareaField label overlap issue
identified](#2705 (review))
- **Task:** [SFS-2385 ](https://vtex-dev.atlassian.net/browse/SFS-2385)
## What's the purpose of this pull request?

Revert changes from 
- #2988
since the approach to filter shopper changes to use text field instead
of selected filter in the drawer.

## details

remove purchaseAgentId filter and related components from
`MyAccountListOrders`.

This update removes the purchaseAgentId filter and its associated
components from the MyAccountListOrders section. The changes include:
- Deleting the MyAccountFilterFacetPlacedBy component and its styles.
- Adjusting the MyAccountListOrders and MyAccountSelectedTags components
to eliminate references to purchaseAgentId.
- Cleaning up related styles and imports to streamline the codebase.

These modifications aim to simplify the order filtering process and
improve overall maintainability.
## What's the purpose of this pull request?

From a current Next.js's known issue
([discussion#44013](vercel/next.js#44013)),
these changes aim to add an experimental custom hook to handle scroll
restoration when navigating back from PDPs to PLPs.


https://github.com/user-attachments/assets/9a452081-4c65-4a83-8c16-9775f97d226d

Along with this experimental hook, some adjustments needed to be made to
correct the behavior of related components, such as `Sentinel`.

While the Next.js experimental `scrollRestoration` flag is not working
as it should, we are proposing this FastStore's experimental scroll
restoration alternative.

## How it works?

While navigating through PLPs and loading more pages, when users
navigate to a PDP and navigate back the scroll should be restored to the
last position before the navigation.

### Starters Deploy Preview

vtex-sites/faststoreqa.store#878

## References

#2054
## What's the purpose of this pull request?

Merge the changes from main
## What's the purpose of this pull request?

By using the direction property users will be able to use RTL or LTR
layouts.
## What's the purpose of this pull request?

With these changes, if merchants remove the footer logo the entire
footer component will not be hid anymore, it will throw a console error
but the component should be displayed with no logo.
#3077)

## What's the purpose of this pull request?

This PR fixes the `border-radius` of the Slider thumb in Firefox. The
current CSS rule for Mozilla uses an inexistent variable, making the
browser render a square instead of a circle:

<img width="1028" height="181" alt="image"
src="https://github.com/user-attachments/assets/50c08d79-a6a9-4d31-b2e7-5ef9e287080f"
/>

## How it works?

The `--fs-slider-thumb-radius` variable is replaced by
`--fs-slider-thumb-border-radius`, the one that is defined in the
default thumb variables.

## How to test it?

- Use the `Local Install Instructions` from the [CodeSandbox
CI](https://ci.codesandbox.io/status/vtex/faststore/pr/3077) to add this
version in the `package.json` of a store.
- Import the `Slider` atom (and styles) in a component following the
docs: https://developers.vtex.com/docs/guides/faststore/atoms-slider
- Run the store in development mode and browse it in Mozilla Firefox.

### Starters Deploy Preview

I'm unable to generate a preview link but here's a screenshot from
localhost:

<img width="1287" height="617" alt="image"
src="https://github.com/user-attachments/assets/f0a5a5e9-d657-41db-9415-303b5d17fefd"
/>

## Checklist

**PR Title and Commit Messages**

- [x] PR title and commit messages follow the [Conventional
Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification
- Available prefixes: `feat`, `fix`, `chore`, `docs`, `style`,
`refactor`, `ci` and `test`

**PR Description**

- [ ] Added a label according to the PR goal - `breaking change`, `bug`,
`contributing`, `performance`, `documentation`..
_(No permissions. It's a bug though.)_

**Dependencies**

- [N/A] Committed the `pnpm-lock.yaml` file when there were changes to
the packages

**Documentation**

- [x] PR description
- [N/A] For documentation changes, ping `@Mariana-Caetano` to review and
update (Or submit a doc request)
)

## What's the purpose of this pull request?

Adds a new "Pending Approval" filter to the MyAccount orders page,
allowing users to quickly filter orders that require their approval.

## How it works?

- New toggle filter: Added "Pending Approval" as the first filter option
in the orders filter slider
- Toggle switch: Users can turn on/off the filter to show only pending
approval orders
- URL integration: Filter state is reflected in the URL
(?pendingApproval=true)
- Selected tag: When active, shows "Pending my approval" tag below the
search bar

## How to test it?

- Go to /account/orders
- Open filter slider and verify "Pending Approval" is the first option
- Toggle the switch and click "Apply"
- Check URL - should include ?pendingApproval=true
- Verify tag appears - "Pending my approval" tag should show below
search bar
- Test removal - click "×" on tag or "Clear All" to remove filter
- Test direct URL - navigate to /account/orders?pendingApproval=true and
verify filter is active

## Starter deploy preview

vtex-sites/b2bfaststoredev.store#358

## References

[SFS-2618](https://vtex-dev.atlassian.net/browse/SFS-2618)

| List | Filter |
| - | - |
|
![image](https://github.com/user-attachments/assets/70a02298-4461-4b21-926d-8d6b754a78bc)
|
![image](https://github.com/user-attachments/assets/2d6afc76-7153-473a-b839-c141e4f0ca1f)
|

[SFS-2618]:

https://vtex-dev.atlassian.net/browse/SFS-2618?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

[SFS-2618]:
https://vtex-dev.atlassian.net/browse/SFS-2618?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

---------

Co-authored-by: Artur Santiago <artur.santiago@cubos.io>
)

## What's the purpose of this pull request?

Fix a bug that occurs when regionalized and `isSessionReady` is sent in
the' validateSession' and' validateCart' mutations.

## How does it work?

It removes the `isSessionReady` from the session sent to the `setRegion`
method.

<img width="1909" height="916" alt="Screenshot 2025-11-11 at 16 22 55"
src="https://github.com/user-attachments/assets/468cc987-a2ee-432f-b306-399bfd32e891"
/>
## What's the purpose of this pull request?

This PR aims to fix the build in the dev branch.
## What's the purpose of this pull request?

With these changes, a loading skeleton will be displayed when product
price is still being validated, preventing product price flickering on
PDP.

## How to test it?

### Starters Deploy Preview
## What's the purpose of this pull request?

Allow svg files in public folder, avoid it getting deleted/overwritten
when generating .faststore

## How it works?

Add it to the allow list.

## How to test it?

Create a svg file or modify an existing svg file, it should be copied
correctly to the `/.faststore/public` when running the build command.
You can use this PR to test:
vtex-sites/faststoreqa.store#887, I've added a
new svg file and changed an existing one, before it was being
deleted/overwritten.
<img width="287" height="420" alt="Screenshot 2025-11-20 at 09 57 19"
src="https://github.com/user-attachments/assets/7b01d806-bdf9-4c3b-a385-32ea11ab2518"
/>

Nothing else should change.

### Starters Deploy Preview

- https://storeframework-cm652ufll028lmgv665a6xv0g-h0max2o2h.b.vtex.app/

## References
- [Jira task](https://vtex-dev.atlassian.net/browse/SO-559)
## What's the purpose of this pull request?

This PR considers the session when deducing the changes to the orderForm
done externally.

## What it aims to solve

The current FastStore shows a competing nature when dealing with the
same cart on two different devices (E.g. 2 browsers, Chrome and
Firefox).

### How to reproduce the problem

- Open your store in Chrome and Firefox
- Make note of the checkout.vtex.com cookie value of Chrome and view the
content of the orderForm using a client like Postman
- Paste the value of the cookie to the checkout cookie of Firefox
- Now you should have the same orderForm in Chrome, Firefox and Postman
- Add an item to the cart from Chrome
- Without going to Firefox, verify that the item is present in the
orderForm using Postman
- Now go to Firefox, but you will not see the item (Expected: the item
should be present in the cart, Actual: the browser cart in Firefox will
override the items of the real orderForm object)
- Open Postman, and you will notice that the item is not present in the
orderForm
- Now go back to Chrome, and it will add back the item to the orderForm
- Open Postman, and you will notice that the item is present in the
orderForm

## How it works?

We include the session ID to the MD5 hash, so that when the store is
used in a different browser with the same orderForm, the two hashes are
different. The two browsers should respect the changes performed by each
other.

## How to test it?

- First verify that the existing behavior of the mutation `validateCart`
is as expected.
- Follow the steps under **How to reproduce the problem**, and verify
that the expected behavior is observed.

### Starters Deploy Preview

<!--- Add a link to a deploy preview from `starter.store` with this
branch being used. --->

<!--- Tip: You can get an installable version of this branch from the
CodeSandbox generated when this PR is created. --->

## References

<!--- Spread the knowledge: is there any content you used to create this
PR that is worth sharing? --->

<!--- Extra tip: adding references to related issues or mentioning
people important to this PR may be good for the documentation and
reviewing process --->

## Checklist

<em>You may erase this after checking them all 😉</em>

**PR Title and Commit Messages**

- [ ] PR title and commit messages follow the [Conventional
Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification
- Available prefixes: `feat`, `fix`, `chore`, `docs`, `style`,
`refactor`, `ci` and `test`

**PR Description**

- [ ] Added a label according to the PR goal - `breaking change`, `bug`,
`contributing`, `performance`, `documentation`..

**Dependencies**

- [ ] Committed the `pnpm-lock.yaml` file when there were changes to the
packages

**Documentation**

- [ ] PR description
- [ ] For documentation changes, ping `@Mariana-Caetano` to review and
update (Or submit a doc request)
## What's the purpose of this pull request?

This PR aims to fix the source code to show `undefined` `searchTerm`.
<img width="916" height="811" alt="Screenshot 2025-11-20 at 19 01 42"
src="https://github.com/user-attachments/assets/b07e44a4-9e37-45e3-9712-6ab19b1af758"
/>


## How it works?

1. The source code can't access the searchTerm from the build time;
thus, this page uses the default
<img width="1899" height="656" alt="Screenshot 2025-11-20 at 18 42 43"
src="https://github.com/user-attachments/assets/697d1b4a-e5cb-4325-a5a1-3ba5d429b7b3"
/>

2. The final code (runtime code after hydration, you can see the element
tab in the devtools), can access the dynamic search term and uses it.
<img width="1570" height="1049" alt="Screenshot 2025-11-20 at 18 42 05"
src="https://github.com/user-attachments/assets/04e0a613-950f-4416-9200-dcc239326b41"
/>

## How to test it?

You can run `pnpm build && pnpm serve` and view the source code
(right-click> Source Code). Additionally, you can view the final code
using the Element tab in the DevTools.
eduardoformiga and others added 23 commits March 27, 2026 19:25
## What's the purpose of this pull request?

<!--- Considering the context, what is the problem we'll solve? Where in
VTEX's big picture our issue fits in? Write a tweet about the context
and the problem itself. --->

## How it works?

<!--- Tell us the role of the new feature, or component, in its context.
Provide details about what you have implemented and screenshots if
applicable. --->

## How to test it?

<!--- Describe the steps with bullet points. Is there any external link
that can be used to better test it or an example? --->

### Starters Deploy Preview

<!--- Add a link to a deploy preview from `starter.store` with this
branch being used. --->

<!--- Tip: You can get an installable version of this branch from the
CodeSandbox generated when this PR is created. --->

## References

<!--- Spread the knowledge: is there any content you used to create this
PR that is worth sharing? --->

<!--- Extra tip: adding references to related issues or mentioning
people important to this PR may be good for the documentation and
reviewing process --->

## Checklist

<em>You may erase this after checking them all 😉</em>

**PR Title and Commit Messages**

- [ ] PR title and commit messages follow the [Conventional
Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification
- Available prefixes: `feat`, `fix`, `chore`, `docs`, `style`,
`refactor`, `ci` and `test`

**PR Description**

- [ ] Added a label according to the PR goal - `breaking change`, `bug`,
`contributing`, `performance`, `documentation`..

**Dependencies**

- [ ] Committed the `pnpm-lock.yaml` file when there were changes to the
packages

**Documentation**

- [ ] PR description
- [ ] For documentation changes, ping `@Mariana-Caetano` to review and
update (Or submit a doc request)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

## Release Notes

* **New Features**
  * Added CSV file upload and parsing for bulk product ordering
* Introduced Quick Order Drawer component for managing multiple products
  * Added Dropzone and FileUploadCard components for file uploads
  * Added search ID tracking for improved search analytics
  * Integrated Shopping Assistant third-party feature

* **Bug Fixes**
  * Fixed `after` attribute type handling in pagination

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Lucas Feijó <lucas.portela@vtex.com>
Co-authored-by: Mateus Pontes <mateuspo10@gmail.com>
Co-authored-by: Larícia Mota <laricia.mota@vtex.com.br>
Co-authored-by: Matheus P. Silva <cout.matheusps@gmail.com>
Co-authored-by: Leandro Rodrigues <leandro.swf@gmail.com>
Co-authored-by: vtexgithubbot <vtexgithubbot@github.com>
Co-authored-by: Luiz Falcão <39093175+llfalcao@users.noreply.github.com>
Co-authored-by: Artur Santiago <artur.santiago@cubos.io>
Co-authored-by: Sahan Jayawardana <sahan@clouda.io>
Co-authored-by: Matheus Martins <mathews_2010@outlook.com>
Co-authored-by: renatomaurovtex <167437775+renatomaurovtex@users.noreply.github.com>
Co-authored-by: Leandro Rodrigues <leandro.rodrigues@vtex.com>
Co-authored-by: Fanny Chien <fanny.chien@vtex.com>
Co-authored-by: Arthur Andrade <arthurfelandrade@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Thiago Pereira <thiago.pereira@vtex.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Giuliana Rigaud <62848434+giurigaud@users.noreply.github.com>
Co-authored-by: renato <renato.neto@cubos.io>
Co-authored-by: Bruna Santos <brunassdev@gmail.com>
Co-authored-by: BrunaCubos <104789782+BrunaCubos@users.noreply.github.com>
Co-authored-by: Ícaro Oliveira <icarovinici@gmail.com>
Co-authored-by: Bruna Santos <bruna.santos@cubos.io>
Co-authored-by: Everton Ataide <everton.ataide@vtex.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
## What's the purpose of this pull request?
- Introduced a new Shopping Assistant component schema in `schema.json`.
- Updated references in `cms_content_type__globalsections.jsonc` to
include the Shopping Assistant.
- Created a new JSONC file for the Shopping Assistant component with its
properties and description.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

## Release Notes

* **New Features**
* Shopping Assistant component is now available in the CMS for page
editors to use and configure.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## What's the purpose of this pull request?

Updates dev with latest main (fixes)



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

## Release Notes

* **Bug Fixes**
* Improved city and postal code display logic in region selector,
enabling more flexible location information rendering.

* **New Features**
* Added postal code-based support for delivery promise features and
regional content caching.

* **Chores**
  * Updated internal schema definitions and cache management logic.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Lucas Feijó <lucas.portela@vtex.com>
Co-authored-by: Mateus Pontes <mateuspo10@gmail.com>
Co-authored-by: Eduardo Formiga <eduardo.formiga@gmail.com>
Co-authored-by: Larícia Mota <laricia.mota@vtex.com.br>
Co-authored-by: Matheus P. Silva <cout.matheusps@gmail.com>
Co-authored-by: Leandro Rodrigues <leandro.swf@gmail.com>
Co-authored-by: vtexgithubbot <vtexgithubbot@github.com>
Co-authored-by: Luiz Falcão <39093175+llfalcao@users.noreply.github.com>
Co-authored-by: Artur Santiago <artur.santiago@cubos.io>
Co-authored-by: Sahan Jayawardana <sahan@clouda.io>
Co-authored-by: Matheus Martins <mathews_2010@outlook.com>
Co-authored-by: renatomaurovtex <167437775+renatomaurovtex@users.noreply.github.com>
Co-authored-by: Leandro Rodrigues <leandro.rodrigues@vtex.com>
Co-authored-by: Arthur Andrade <arthurfelandrade@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Thiago Pereira <thiago.pereira@vtex.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Giuliana Rigaud <62848434+giurigaud@users.noreply.github.com>
Co-authored-by: renato <renato.neto@cubos.io>
Co-authored-by: Bruna Santos <brunassdev@gmail.com>
Co-authored-by: BrunaCubos <104789782+BrunaCubos@users.noreply.github.com>
Co-authored-by: Ícaro Oliveira <icarovinici@gmail.com>
Co-authored-by: Bruna Santos <bruna.santos@cubos.io>
Co-authored-by: Everton Ataide <everton.ataide@vtex.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Otavio Moreira Meirelles <otavio.meirelles@vtex.com>
…3267)

## What's the purpose of this pull request?

fix: Prevent IDB writes before store hydration completes

## How it works?

- Introduced a hydration flag to ensure that IDB writes are blocked
until the initial read from IndexedDB is complete. This prevents
potential data overwrites from early store updates.
- Modified the store initialization to read from IDB immediately without
debounce, ensuring the store is hydrated before any other operations can
occur.



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Fixed data persistence to prevent stored information from being
overwritten during app initialization, ensuring data integrity and
reliability on startup.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
…3220)

## What's the purpose of this pull request?

This PR aims to make possible the use of isGift from the orderForm item
instead of price = 0 when dealing with gift.For that, you should use the
flag `useIsGiftFromOrderForm` as true.

- When true, use the orderForm's isGift field to detect gift items.
- When false or unset, use the legacy behavior (item.price === 0).

## How it works?

- Introduced an optional `isGift` field in the `StoreOffer` type to
indicate if an offer is a gift.
- Updated GraphQL schema and resolvers to handle the new `isGift` field.
- Modified the cart validation mutation to include the `isGift` property
for cart items.
- Adjusted the `isGift` logic in the cart SDK to utilize the new field
when applicable.


(see the gift icon and the free tag in the minicart)
| Flag false / default | flag true |
|-|-|
|<img width="1916" height="923" alt="Screenshot 2026-02-23 at 18 09 09"
src="https://github.com/user-attachments/assets/64191213-5a83-490f-9263-ce86cf96d440"
/>|<img width="1916" height="920" alt="Screenshot 2026-02-23 at 18 19
48"
src="https://github.com/user-attachments/assets/e3a544fe-09dd-4e54-87b1-3b15c9c17bd3"
/>|

## How to test it?

...

### Starters Deploy Preview

<!--- Add a link to a deploy preview from `starter.store` with this
branch being used. --->

<!--- Tip: You can get an installable version of this branch from the
CodeSandbox generated when this PR is created. --->

## References

<!--- Spread the knowledge: is there any content you used to create this
PR that is worth sharing? --->

<!--- Extra tip: adding references to related issues or mentioning
people important to this PR may be good for the documentation and
reviewing process --->

## Checklist

<em>You may erase this after checking them all 😉</em>

**PR Title and Commit Messages**

- [ ] PR title and commit messages follow the [Conventional
Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification
- Available prefixes: `feat`, `fix`, `chore`, `docs`, `style`,
`refactor`, `ci` and `test`

**PR Description**

- [ ] Added a label according to the PR goal - `breaking change`, `bug`,
`contributing`, `performance`, `documentation`..

**Dependencies**

- [ ] Committed the `pnpm-lock.yaml` file when there were changes to the
packages

**Documentation**

- [ ] PR description
- [ ] For documentation changes, ping `@Mariana-Caetano` to review and
update (Or submit a doc request)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Cart items now include gift detection and an isGift flag to mark
promotional/complimentary items.
* An experimental configuration option controls how gifts are detected
(store-provided flag vs. price-based).
* Checkout totals and item lists account for gifts, enabling proper
splitting between gifts and regular items.
* Cart state exposes a flag to support conditional item-splitting
behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## What's the purpose of this pull request?

- Enhance session management with logout handling and validation
tracking

## How it works?

- Added SESSION_READY_KEY to manage session readiness state after
logout.
- Updated checkAndReloadIfReturnedFromLogout to set session readiness on
reload.
- Modified createValidationStore to include hasValidatedStore for
tracking validation completion.
- Adjusted useSession and useSessionReady hooks to utilize hasValidated
for improved session state management, addressing React 18 batching
issues.

## How to test it?

using b2b store url.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved session state management to ensure proper tracking after user
logout and return.
* Enhanced session readiness detection for more reliable authentication
handling.

* **Refactor**
* Optimized internal session validation logic for better performance and
state consistency.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## What's the purpose of this pull request?

Migrate FastStore package preview pipeline away from CodeSandbox CI,
which is being discontinued.

CodeSandbox CI will be shut down on April 15, 2026, which directly
impacts our current PR preview flow. Without a replacement, we lose the
ability to generate installable preview builds for testing changes in
real stores.

This PR introduces pkg.pr.new as a replacement, ensuring continuity of
the preview pipeline with a more reliable and simpler approach.

## How it works?

This PR adds a new CI workflow that generates installable package
previews using pkg.pr.new for every PR.

Instead of relying on CodeSandbox, we now:
- Generate a preview package URL directly from the PR
- Allow installation via yarn/npm using a URL
- Support commit-based versions for more granular validation

Task:
https://vtex-dev.atlassian.net/jira/software/c/projects/SFS/boards/1051?selectedIssue=SFS-3102
…3263)

- Simplified conditions for refreshing tokens by consolidating checks
for expired tokens and the presence of refresh tokens.
- Removed redundant checks to streamline the authentication flow.

## What's the purpose of this pull request?

<!--- Considering the context, what is the problem we'll solve? Where in
VTEX's big picture our issue fits in? Write a tweet about the context
and the problem itself. --->

## How it works?

<!--- Tell us the role of the new feature, or component, in its context.
Provide details about what you have implemented and screenshots if
applicable. --->

## How to test it?

<!--- Describe the steps with bullet points. Is there any external link
that can be used to better test it or an example? --->

### Starters Deploy Preview

<!--- Add a link to a deploy preview from `starter.store` with this
branch being used. --->

<!--- Tip: You can get an installable version of this branch from the
CodeSandbox generated when this PR is created. --->

## References

<!--- Spread the knowledge: is there any content you used to create this
PR that is worth sharing? --->

<!--- Extra tip: adding references to related issues or mentioning
people important to this PR may be good for the documentation and
reviewing process --->

## Checklist

<em>You may erase this after checking them all 😉</em>

**PR Title and Commit Messages**

- [ ] PR title and commit messages follow the [Conventional
Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification
- Available prefixes: `feat`, `fix`, `chore`, `docs`, `style`,
`refactor`, `ci` and `test`

**PR Description**

- [ ] Added a label according to the PR goal - `breaking change`, `bug`,
`contributing`, `performance`, `documentation`..

**Dependencies**

- [ ] Committed the `pnpm-lock.yaml` file when there were changes to the
packages

**Documentation**

- [ ] PR description
- [ ] For documentation changes, ping `@Mariana-Caetano` to review and
update (Or submit a doc request)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Refactor**
* Centralized and simplified session validation and refresh decision
logic for more consistent token handling.

* **Bug Fixes / Behavior Change**
* On refresh failure, users are immediately logged out and session data
cleared to avoid stale session states; refresh attempts are no longer
silently postponed.

* **New Features**
* Added a helper to determine when a validation request must force a
token refresh.

* **Tests**
* New unit tests cover the refresh-decision helper across expected
scenarios.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
#3285)

…environments

- Introduced a check to bypass token refresh logic when running in local
environments (localhost or 127.0.0.1).
- Updated GraphQL API handler and session validation functions to ensure
consistent behavior across environments.
- This change prevents unnecessary refresh attempts during local
development, improving the developer experience.



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Session validation now detects local development environments
(localhost/127.0.0.1) and adapts behavior to simplify local
authentication handling and improve developer workflow.

* **Bug Fixes**
* Refined token refresh logic to skip refresh enforcement when running
locally, preventing unnecessary 401-driven refresh flows during
development.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
…-3144 (#3286)

- Added a new script "release:v3" in package.json for versioning and
publishing with a dist-tag of v3-latest.
- Updated GitHub Actions workflow to include a new job for publishing on
the 3.x branch.

## What's the purpose of this pull request?

### `release.yml`

- **Linha 9** — `3.x` adicionado ao trigger de branches
- **Linhas 75-77** — Step `Publish (3.x)` com condição `if:
github.ref_name == '3.x'` apontando para `pnpm release:v3`

### `package.json`

- **Linha 22** — Script `release:v3` com `lerna version
--conventional-commits --yes && lerna publish from-git
--dist-tag=v3-latest --yes`
- Sem `--conventional-graduate` (correto, pois no `3.x` não haverá
prereleases para graduar)
- Sem `--conventional-prerelease` (correto, pois serão releases estáveis
da v3)
- Com `--dist-tag=v3-latest` (correto, para não sobrescrever a tag
`latest` que será da v4)

Os hotfixes da v3 publicados a partir do branch `3.x` serão instaláveis
via `npm install @faststore/core@v3-latest` e não vão interferir com a
tag `latest` da v4.


Nota importante: não usem pnpm release (o mesmo da main) no branch 3.x,
porque esse comando usa --conventional-graduate que é para graduar
prereleases. No 3.x, hotfixes serão commits normais (fix:, feat:) e o
lerna version --conventional-commits (sem graduate) é o adequado — ele
vai gerar 3.99.1, 3.99.2, etc., baseado nos commits.
## What's the purpose of this pull request?

Fix the base CMS schema to ensure that components will be created
**without** the `$componentKey` and `$componentTitle` keys as
properties.

## How to test it?

The latest FS schema on Schema Registry (`vtex.faststore@3.99.0`) should
not have `$componentKey` and `$componentTitle` keys as components'
properties.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Changes**
* Component configurations are now more flexible with relaxed validation
requirements. Components no longer require specific identifiers to be
defined, allowing for greater customization and optional field
specifications.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## What’s the purpose of this pull request?
This PR fixes the Preview tag styling when previews are shown in stores
that use custom themes.
An example from a preview page in the `heringhomolog` account:

### Before
<img width="146" height="55" alt="Screenshot 2025-09-29 at 14 15 47"
src="https://github.com/user-attachments/assets/d4aec357-72d7-40d9-9dd5-f4a92c67b4e1"
/>
<img width="1543" height="599" alt="Screenshot 2025-09-29 at 14 16 04"
src="https://github.com/user-attachments/assets/2e737e68-00f2-413e-9c84-bb85d23e1171"
/>

### After
<img width="146" height="55" alt="Screenshot 2025-09-29 at 14 15 12"
src="https://github.com/user-attachments/assets/efd0620d-9f46-4355-be5b-6cb38e8d016f"
/>
<img width="1543" height="599" alt="Screenshot 2025-09-29 at 17 43 18"
src="https://github.com/user-attachments/assets/4dd720a9-063d-476d-8571-2c3980e77229"
/>

## How it works
It replaces styles inherited from the `Badge`, `Tag`, and `Icon`
components with scoped custom styles, preventing overrides by
store-specific theme customizations.

## How to test
1. Clone the `heringhomolog` [store
repository](https://github.com/Cia-Hering/heringhomolog.store/).
2. Set the data source to Content Platform (CP).
3. Run the store locally.
4. In the `heringhomolog` Content Platform, set the preview URL to your
local build.
5. Preview a page. The Preview tag should initially appear with broken
styling.
6. Apply this PR locally by either:
- Linking the `faststore/core` package from this PR into the store, or
- Overriding the Preview tag stylesheet with the version from this PR.
7. Refresh the preview. The Preview tag should display with the
corrected styling.

Note: The preview tag is shown only on pages previewed from the Content
Platform. This change doesn't apply to the preview flow for hCMS pages.

### Starters Deploy Preview

<!--- Add a link to a deploy preview from `starter.store` with this
branch being used. --->

<!--- Tip: You can get an installable version of this branch from the
CodeSandbox generated when this PR is created. --->

## References
<!--- Spread the knowledge: is there any content you used to create this
PR that is worth sharing? --->

<!--- Extra tip: adding references to related issues or mentioning
people important to this PR may be good for the documentation and
reviewing process --->
## What's the purpose of this pull request?

This pull request introduces instrumentation and logging enhancements to
the `core` package, primarily enabling experimental instrumentation
hooks in Next.js and conditionally loading logging libraries in
production node environments.

## References


https://vercel.com/docs/environment-variables/system-environment-variables#VERCEL
https://nextjs.org/docs/app/guides/instrumentation

https://nextjs.org/docs/app/api-reference/file-conventions/instrumentation

---------

Co-authored-by: eduardoformiga <eduardo.formiga@gmail.com>
@eduardoformiga eduardoformiga requested a review from a team as a code owner May 4, 2026 19:55
@eduardoformiga eduardoformiga requested review from hellofanny and ommeirelles and removed request for a team May 4, 2026 19:55
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 4, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f05cab86-89e1-4c66-971a-5f77bd4079e2

📥 Commits

Reviewing files that changed from the base of the PR and between ee710a0 and 40bdd92.

⛔ Files ignored due to path filters (9)
  • .github/workflows/packages-preview.yml is excluded by none and included by none
  • .github/workflows/release.yml is excluded by none and included by none
  • CHANGELOG.md is excluded by none and included by none
  • lerna.json is excluded by none and included by none
  • package.json is excluded by none and included by none
  • packages/api/src/__generated__/schema.ts is excluded by !**/__generated__/** and included by packages/**
  • packages/core/@generated/gql.ts is excluded by !**/@generated/**, !**/@generated/** and included by packages/**
  • packages/core/@generated/graphql.ts is excluded by !**/@generated/**, !**/@generated/** and included by packages/**
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml and included by none
📒 Files selected for processing (39)
  • packages/api/CHANGELOG.md
  • packages/api/package.json
  • packages/api/src/platforms/vtex/resolvers/offer.ts
  • packages/api/src/typeDefs/offer.graphql
  • packages/cli/CHANGELOG.md
  • packages/cli/README.md
  • packages/cli/package.json
  • packages/components/CHANGELOG.md
  • packages/components/package.json
  • packages/core/CHANGELOG.md
  • packages/core/cms/faststore/base.jsonc
  • packages/core/cms/faststore/components/cms_component__shoppingassistant.jsonc
  • packages/core/cms/faststore/pages/cms_content_type__globalsections.jsonc
  • packages/core/cms/faststore/schema.json
  • packages/core/discovery.config.default.js
  • packages/core/next.config.js
  • packages/core/package.json
  • packages/core/src/components/account/MyAccountDrawer/OrganizationDrawer/useReloadAfterLogoutReturn.ts
  • packages/core/src/components/common/PreviewTag/section.module.scss
  • packages/core/src/instrumentation.ts
  • packages/core/src/pages/api/graphql.ts
  • packages/core/src/sdk/account/useRefreshToken.ts
  • packages/core/src/sdk/cart/index.ts
  • packages/core/src/sdk/session/index.ts
  • packages/core/src/sdk/session/storageKeys.ts
  • packages/core/src/sdk/useStore.ts
  • packages/core/src/utils/validateSessionRefreshToken.ts
  • packages/core/test/utils/validateSessionRefreshToken.test.ts
  • packages/graphql-utils/CHANGELOG.md
  • packages/graphql-utils/package.json
  • packages/lighthouse/CHANGELOG.md
  • packages/lighthouse/package.json
  • packages/sdk/CHANGELOG.md
  • packages/sdk/package.json
  • packages/sdk/src/store/persisted.ts
  • packages/storybook/CHANGELOG.md
  • packages/storybook/package.json
  • packages/ui/CHANGELOG.md
  • packages/ui/package.json

Walkthrough

This is a multi-package development release (v3.99.0-dev) that introduces an isGift field to the StoreOffer GraphQL type, substantially refactors session validation and logout behavior to improve token refresh and readiness tracking, adds a CMS ShoppingAssistant component, enhances persisted store hydration, and updates all package versions along with configuration for Next.js instrumentation and logging.

Changes

Gift Field Enhancement

Layer / File(s) Summary
GraphQL Type & Resolver
packages/api/src/typeDefs/offer.graphql, packages/api/src/platforms/vtex/resolvers/offer.ts
StoreOffer adds optional isGift: Boolean field. Resolver returns root.isGift ?? false for OrderFormProduct roots, null otherwise.
Cart Logic & Config
packages/core/src/sdk/cart/index.ts, packages/core/discovery.config.default.js
CartItem type includes optional isGift field. isGift(item) function conditionally uses item.isGift when experimental.useIsGiftFromOrderForm is enabled, otherwise falls back to price === 0. GraphQL fragment requests isGift from ValidateCartMutation.
Validation Query
packages/api/CHANGELOG.md
Documentation updated to reflect new isGift addition to StoreOffer type and resolvers.

Session Management Refactoring

Layer / File(s) Summary
Storage Keys & Shared Constants
packages/core/src/sdk/session/storageKeys.ts
New exported constants RELOAD_AFTER_LOGOUT_KEY and SESSION_READY_KEY centralize session-related storage identifiers.
Logout & Session Clearing
packages/core/src/sdk/session/index.ts, packages/core/src/sdk/account/useRefreshToken.ts, packages/core/src/components/account/MyAccountDrawer/OrganizationDrawer/useReloadAfterLogoutReturn.ts
New logoutAndClearSession(session) function POSTs to /api/fs/logout and clears session fields. Refresh-token failure now clears session instead of deferring refresh. Logout return flow sets SESSION_READY_KEY before forcing page refresh.
Refresh Token & Validation Helpers
packages/core/src/utils/validateSessionRefreshToken.ts, packages/core/src/pages/api/graphql.ts
New shouldForceRefreshTokenForValidateSession helper extracts token-expiry logic. GraphQL API handler gates refresh behavior via local environment check and uses the helper for cleaner decision logic.
Session Validation Flow
packages/core/src/sdk/session/index.ts
validateSession refactored to use extracted handleRefreshToken and isRefreshAfterExpired helpers. Returns early when reload-after-logout is pending. Refresh is attempted both when refresh-after is expired and on 401 errors (if enabled, not local). Session readiness now derived from hasValidated store state instead of ref-based transitions.
Session Readiness Tracking
packages/core/src/sdk/useStore.ts, packages/core/src/sdk/session/index.ts
createValidationStore returns 3-tuple [store, onValidate, hasValidatedStore]. Store remains true during validation; hasValidatedStore flips to true when validation completes. useSessionReady takes { isValidating, hasValidated } and marks ready only after first completed validation cycle.
Test Coverage
packages/core/test/utils/validateSessionRefreshToken.test.ts
New test suite for shouldForceRefreshTokenForValidateSession covering JWT presence, expiry, and refresh-after conditions.

CMS ShoppingAssistant Component

Layer / File(s) Summary
Base Schema Loosening
packages/core/cms/faststore/base.jsonc
base-component definition changes from enforcing $componentKey/$componentTitle to allowing any properties (required: [], properties: {}), enabling more flexible component schemas.
Component Definition
packages/core/cms/faststore/components/cms_component__shoppingassistant.jsonc
New ShoppingAssistant component schema extending base-component with component key, title, and description.
Global Schema Integration
packages/core/cms/faststore/schema.json, packages/core/cms/faststore/pages/cms_content_type__globalsections.jsonc
ShoppingAssistant added to top-level components and included in globalSections.sections.items.anyOf alongside EmptyState and RegionPopover.

Store Hydration & UX Improvements

Layer / File(s) Summary
Persisted Store Hydration
packages/sdk/src/store/persisted.ts
Splits initial IDB load into dedicated hydrateFromIDB function that sets hydrated flag upon completion. Cross-tab sync via debounced syncFromIDB only updates store when IDB payload is defined. Store writes to IDB now gated behind hydrated flag, preventing premature persistence before initial hydration.
Preview Tag Styling
packages/core/src/components/common/PreviewTag/section.module.scss
Preview tag repositioned with inset and CSS variable --fs-z-index-highest instead of hardcoded positioning/z-index. Nested badge-wrapper and icon-button styles consolidated under .section [data-fs-preview-tag] selector with updated hover/focus behavior.

Development Release Updates

Layer / File(s) Summary
Infrastructure Configuration
packages/core/next.config.js, packages/core/package.json
Next.js experimental.instrumentationHook enabled. Added next-logger (^5.0.2) and upgraded pino to ^9.7.0 for production logging support.
New Instrumentation Hook
packages/core/src/instrumentation.ts
Exported register() function that conditionally loads pino and next-logger in production Node.js runtime (non-Vercel environments).
Multi-Package Version Bumps
packages/*/package.json
All packages bumped: @faststore/api → 3.99.0-dev.6, @faststore/cli → 3.99.0-dev.7, @faststore/components → 3.99.0-dev.6, @faststore/core → 3.99.0-dev.7, @faststore/graphql-utils → 3.99.0-dev.6, @faststore/lighthouse → 3.99.0-dev.6, @faststore/sdk → 3.99.0-dev.6, @faststore/storybook → 3.99.0-dev.6, @faststore/ui → 3.99.0-dev.6. Cross-package dependencies updated to match.
Changelog & Documentation
packages/*/CHANGELOG.md, packages/cli/README.md
All changelogs updated with new version entries and feature/bug-fix bullets. CLI README example and "See code" links updated to v3.99.0-dev.7. Unreleased sections now document CSV parsing hooks and FileUploadCard component additions.

Sequence Diagram

sequenceDiagram
    participant Client as Client
    participant Store as Session Store
    participant GraphQL as GraphQL API
    participant RefreshAPI as Refresh Endpoint
    participant LogoutAPI as Logout API
    participant IDB as IndexedDB

    rect rgba(0, 150, 136, 0.5)
    Note over Client,LogoutAPI: New Session Validation Flow
    end
    
    Client->>GraphQL: validateSession(jwt, refreshAfter)
    alt Reload Pending
        GraphQL-->>Client: Early return (avoid 401)
    else Normal Validation
        alt Refresh Expired
            GraphQL->>RefreshAPI: POST refresh token
            RefreshAPI-->>GraphQL: New session
            GraphQL->>Store: Update session
        else Refresh Not Expired
            Store->>Store: Session valid
        end
        GraphQL-->>Client: Validated session
    end
    
    rect rgba(76, 175, 80, 0.5)
    Note over Client,LogoutAPI: Logout with Session Clear
    end
    
    Client->>LogoutAPI: POST /api/fs/logout
    LogoutAPI->>Store: Clear person, b2b, refreshAfter
    Store->>IDB: Persist cleared state
    LogoutAPI-->>Client: Complete
    Client->>Client: Set SESSION_READY_KEY, force refresh
    
    rect rgba(156, 39, 176, 0.5)
    Note over Client,IDB: Store Hydration on Init
    end
    
    Client->>IDB: Load persisted state
    IDB-->>Store: Return payload
    Store->>Store: Set hydrated=true
    Store->>Client: Ready for subscriptions
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • vtex/faststore#3220: Both PRs modify the same GraphQL StoreOffer type/resolver to add an isGift field and update cart logic with an experimental flag to use isGift from the order form.
  • vtex/faststore#3268: Both PRs modify session management flow and storage keys, including RELOAD_AFTER_LOGOUT_KEY / SESSION_READY_KEY, useReloadAfterLogoutReturn, createValidationStore, and session hooks.
  • vtex/faststore#3275: Both PRs add the same ShoppingAssistant CMS component schema and registrations, including new cms_component__shoppingassistant.jsonc and global sections updates.

Suggested reviewers

  • hellofanny
  • ommeirelles

Poem

🎁 Gift fields bloom in StoredOffers bright,
Sessions logout and readiness takes flight,
ShoppingAssistant joins the CMS stage,
Hydration flows true on each new page,
Three-ninety-nine dev—a release well-staged! 🚀

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

@codesandbox-ci
Copy link
Copy Markdown

codesandbox-ci Bot commented May 4, 2026

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.