Skip to content

upcoming: [UIE-9823] - Implement the Contact Sales Drawer for Marketplace products#13368

Open
harsh-akamai wants to merge 9 commits intolinode:developfrom
harsh-akamai:UIE-9823
Open

upcoming: [UIE-9823] - Implement the Contact Sales Drawer for Marketplace products#13368
harsh-akamai wants to merge 9 commits intolinode:developfrom
harsh-akamai:UIE-9823

Conversation

@harsh-akamai
Copy link
Contributor

@harsh-akamai harsh-akamai commented Feb 5, 2026

Description 📝

Implement the Contact Sales Drawer for Marketplace products

Scope 🚢

Upon production release, changes in this PR will be visible to:

  • All customers
  • Some customers (e.g. in Beta or Limited Availability)
  • No customers / Not applicable

Preview 📷

Non Error State Error State
image image

How to test 🧪

Prerequisites

Verification steps

  • Turn on the MarketplaceV2 feature flag
  • Navigate to localhost:3000/marketplace/catalog/{productName}
  • Click on the "Contact Sales" button
  • Verify that the form styles stay responsive in different layouts
  • Ensure the error states are thrown correctly
  • Click on "Submit" and verify that you get a success or error snackbar
Author Checklists

As an Author, to speed up the review process, I considered 🤔

👀 Doing a self review
❔ Our contribution guidelines
🤏 Splitting feature into small PRs
➕ Adding a changeset
🧪 Providing/improving test coverage
🔐 Removing all sensitive information from the code and PR description
🚩 Using a feature flag to protect the release
👣 Providing comprehensive reproduction steps
📑 Providing or updating our documentation
🕛 Scheduling a pair reviewing session
📱 Providing mobile support
♿ Providing accessibility support


  • I have read and considered all applicable items listed above.

As an Author, before moving this PR from Draft to Open, I confirmed ✅

  • All tests and CI checks are passing
  • TypeScript compilation succeeded without errors
  • Code passes all linting rules

@harsh-akamai harsh-akamai marked this pull request as ready for review February 5, 2026 06:22
@harsh-akamai harsh-akamai requested a review from a team as a code owner February 5, 2026 06:23
@linode-gh-bot
Copy link
Collaborator

Cloud Manager UI test results

🎉 866 passing tests on test run #8 ↗︎

❌ Failing✅ Passing↪️ Skipped🕐 Duration
0 Failing866 Passing11 Skipped44m 47s

@tvijay-akamai
Copy link
Contributor

tvijay-akamai commented Feb 8, 2026

The form initializes additional email to ['']. API Spec expects: ["email1@akamai.com"] or omit if empty
What gets sent: ['']. Please check with backend team if this is okay.

@tvijay-akamai
Copy link
Contributor

One observation in api spec doc there is a typo API Spec shows: "parner_name": "Akamai" (typo - missing 't'). Please get this corrected from backend team.

? getAPIErrorOrDefault(error)?.[0].reason
: "Oops! Something went wrong and we couldn't send your contacts. Please try again in a moment, or refresh the page.";
enqueueSnackbar(errorMessage, { variant: 'error' });
onClose();
Copy link
Contributor

Choose a reason for hiding this comment

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

On api error do we need to close the drawer?

return (
<Drawer
data-testid="contact-sales-drawer"
onClose={() => {
Copy link
Contributor

Choose a reason for hiding this comment

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

Instead of resetting the form onClose which can cause visual glitches if the form resets while the drawer is animating closed. we can use onTransitionExited={() => reset()}

@@ -0,0 +1,590 @@
import { yupResolver } from '@hookform/resolvers/yup';
Copy link
Contributor

Choose a reason for hiding this comment

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

No unit tests for ContactSalesDrawer component

} from '@linode/ui';
import { createPartnerReferralSchema } from '@linode/validation';
import { createFilterOptions, Grid } from '@mui/material';
import { enqueueSnackbar } from 'notistack';
Copy link
Contributor

Choose a reason for hiding this comment

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

mostly this pattern is follwed in the codebase import { useSnackbar } from 'notistack';
const { enqueueSnackbar } = useSnackbar(); . Direct import works but is inconsistent with codebase conventions.

render={({ field }) => {
const emailErrors = errors.additional_emails;
return (
<MultipleIPInput
Copy link
Contributor

Choose a reason for hiding this comment

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

Using MultipleIPInput for email addresses works but is semantically confusing. looked like the component was designed for IP addresses. Consider:

Adding a comment explaining this reuse
Or see if there is possibility of MultipleEmailInput wrapper

<MultipleIPInput
buttonText="Add email address"
className={
field.value?.length === 2
Copy link
Contributor

Choose a reason for hiding this comment

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

can we use a constant here : MAX_ADDITIONAL_EMAILS = 2


const {
control,
formState: { errors, isSubmitting },
Copy link
Contributor

Choose a reason for hiding this comment

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

When the form is submitted While isSubmitting is used to disable form fields. Is this is correct submitting state. Can we check with ux on this.

const { classes } = useStyles();
const { onClose, open, partnerName, productName } = props;

const { data: profile } = useProfile();
Copy link
Contributor

Choose a reason for hiding this comment

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

Are we sure this data is not asynchronous and will always be available when drawer is opened? Basically do you this we should handle async nature of this data?

@@ -0,0 +1,590 @@
import { yupResolver } from '@hookform/resolvers/yup';
Copy link
Contributor

Choose a reason for hiding this comment

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

Missing Notice for in-form api returned errors

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

Projects

Status: Review

Development

Successfully merging this pull request may close these issues.

3 participants