Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Domain management: Create add new mailbox subpage #97847

Merged
merged 8 commits into from
Jan 7, 2025
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { useTranslate } from 'i18n-calypso';
import NavigationHeader from 'calypso/components/navigation-header';
import {
domainManagementAllEmailRoot,
domainManagementOverviewRoot,
} from 'calypso/my-sites/domains/paths';
import { CustomHeaderComponentType } from './custom-header-component-type';

const AddMailboxHeader: CustomHeaderComponentType = ( {
selectedDomainName,
selectedSiteSlug,
} ) => {
const translate = useTranslate();
return (
<>
<NavigationHeader
className="navigation-header__breadcrumb"
navigationItems={ [
{
label: selectedDomainName,
href: `${ domainManagementOverviewRoot() }/${ selectedDomainName }/${ selectedSiteSlug }`,
},
{
label: 'Emails',
href: `${ domainManagementAllEmailRoot() }/${ selectedDomainName }/${ selectedSiteSlug }`,
},
{
label: translate( 'Add new mailbox' ),
},
] }
/>
<NavigationHeader
className="navigation-header__title"
title={ translate( 'Add new Mailboxes' ) }
subtitle={ translate( 'Integrated email solution with powerful features.' ) }
/>
</>
);
};

export default AddMailboxHeader;
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import clsx from 'clsx';
import NavigationHeader from 'calypso/components/navigation-header';
import { domainManagementAllOverview } from 'calypso/my-sites/domains/paths';
import { getSubpageParams } from './subpages';
Expand All @@ -15,7 +16,7 @@ const SubpageWrapper = ( { children, subpageKey, siteName, domainName }: Subpage

if ( CustomHeader ) {
return (
<div className="subpage-wrapper">
<div className={ clsx( 'subpage-wrapper', `subpage-wrapper--${ subpageKey }` ) }>
<CustomHeader
selectedDomainName={ domainName }
selectedSiteSlug={ siteName }
Expand All @@ -38,7 +39,7 @@ const SubpageWrapper = ( { children, subpageKey, siteName, domainName }: Subpage
];

return (
<div className="subpage-wrapper">
<div className={ clsx( 'subpage-wrapper', `subpage-wrapper--${ subpageKey }` ) }>
<NavigationHeader
className="subpage-wrapper__header"
navigationItems={ breadcrumbItems }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,35 @@
}
}
}

&.subpage-wrapper--add-mailbox {
.card-heading.new-mailbox-list__numbered-heading,
.section-header__label {
color: $studio-gray-100;
font-size: 1rem;
font-weight: 500;
margin-bottom: 1rem;
}

.card.new-mailbox {
border-radius: 4px;
}

.new-mailbox-list__separator {
margin-inline: -24px;
background: $studio-gray-5;
}

.vertical-nav {
.card.is-placeholder:first-child {
border-radius: 4px 4px 0 0;
}

.card.is-placeholder:last-child {
border-radius: 0 0 4px 4px;
}
}
}
}

.is-bulk-all-domains-page .layout__content .main {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { __ } from '@wordpress/i18n';
import AddForwardingEmailHeader from './headers/add-fowarding-email-header';
import MailboxHeader from './headers/add-mailbox-header';
import CompareEmailProvidersHeader from './headers/compare-email-providers';
import { CustomHeaderComponentType } from './headers/custom-header-component-type';
import DnsRecordHeader, {
Expand All @@ -21,6 +22,7 @@ type SubpageWrapperParamsType = {
};

// Subpage keys
export const ADD_MAILBOX = 'add-mailbox';
export const ADD_FORWARDING_EMAIL = 'add-forwarding-email';
export const COMPARE_EMAIL_PROVIDERS = 'compare-email-providers';
export const DNS_RECORDS = 'dns-records';
Expand Down Expand Up @@ -63,6 +65,12 @@ const SUBPAGE_TO_PARAMS_MAP: Record< string, SubpageWrapperParamsType > = {
showBreadcrumb: false,
context: 'edit',
},
[ ADD_MAILBOX ]: {
CustomHeader: MailboxHeader,
showFormHeader: false,
showPageHeader: false,
customFormHeader: __( 'New mailbox' ),
},
};

export const getSubpageParams = ( subPageKey: string ): SubpageWrapperParamsType => {
Expand Down
13 changes: 13 additions & 0 deletions client/my-sites/domains/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
EMAIL_MANAGEMENT,
} from './domain-management/domain-overview-pane/constants';
import {
ADD_MAILBOX,
ADD_FORWARDING_EMAIL,
COMPARE_EMAIL_PROVIDERS,
DNS_RECORDS,
Expand Down Expand Up @@ -484,4 +485,16 @@ export default function () {
makeLayout,
clientRender
);

page(
paths.domainManagementAllEmailRoot() + '/:site/titan/new/:domain',
siteSelection,
navigation,
domainManagementController.domainManagementSubpageParams( ADD_MAILBOX ),
emailController.emailManagementNewTitanAccount,
domainManagementController.domainManagementSubpageView,
domainManagementController.domainDashboardLayout,
makeLayout,
clientRender
);
}
52 changes: 45 additions & 7 deletions client/my-sites/email/add-mailboxes/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ import { GOOGLE_PROVIDER_NAME } from 'calypso/lib/gsuite/constants';
import { getTitanProductName } from 'calypso/lib/titan';
import { TITAN_PROVIDER_NAME } from 'calypso/lib/titan/constants';
import useCartKey from 'calypso/my-sites/checkout/use-cart-key';
import {
domainManagementAllEmailRoot,
isUnderDomainManagementAll,
} from 'calypso/my-sites/domains/paths';
import AddEmailAddressesCardPlaceholder from 'calypso/my-sites/email/add-mailboxes/add-users-placeholder';
import EmailProviderPricingNotice from 'calypso/my-sites/email/add-mailboxes/email-provider-pricing-notice';
import {
Expand Down Expand Up @@ -62,6 +66,9 @@ interface AddMailboxesProps {
provider?: EmailProvider;
selectedDomainName: string;
source?: string;
showPageHeader?: boolean;
showFormHeader?: boolean;
customFormHeader?: boolean;
}

interface AddMailboxesAdditionalProps {
Expand All @@ -75,6 +82,9 @@ interface AddMailboxesAdditionalProps {
selectedSiteId: number | undefined | null;
source: string;
translate: typeof translate;
showPageHeader?: boolean;
showFormHeader?: boolean;
customFormHeader?: boolean;
}

const isTitan = ( provider: EmailProvider ): boolean => provider === EmailProvider.Titan;
Expand All @@ -83,6 +93,9 @@ const useAdditionalProps = ( {
provider = EmailProvider.Titan,
selectedDomainName,
source = '',
showPageHeader = true,
showFormHeader = true,
customFormHeader,
}: AddMailboxesProps ): AddMailboxesAdditionalProps => {
const selectedSite = useSelector( getSelectedSite );
const selectedSiteId = selectedSite?.ID;
Expand Down Expand Up @@ -117,6 +130,9 @@ const useAdditionalProps = ( {
selectedSiteId,
source,
translate,
showPageHeader,
showFormHeader,
customFormHeader,
};
};

Expand Down Expand Up @@ -231,6 +247,9 @@ const MailboxesForm = ( {
selectedSite,
source,
translate,
showFormHeader,
customFormHeader,
currentRoute,
}: AddMailboxesAdditionalProps & {
emailProduct: ProductListItem | null;
goToEmail: () => void;
Expand Down Expand Up @@ -304,10 +323,18 @@ const MailboxesForm = ( {
recordContinueEvent( { canContinue: true } );
setIsAddingToCart( true );

const selectedSiteSlug = selectedSite?.slug ?? '';
let checkoutPath = '/checkout/' + selectedSiteSlug;

if ( isUnderDomainManagementAll( currentRoute ) ) {
const redirectTo = `${ domainManagementAllEmailRoot() }/${ selectedDomainName }/${ selectedSiteSlug }`;
checkoutPath += '?redirect_to=' + encodeURIComponent( redirectTo );
}

cartManager
.addProductsToCart( [ getCartItems( mailboxOperations.mailboxes, mailProperties ) ] )
.then( () => {
page( '/checkout/' + selectedSite?.slug ?? '' );
page( checkoutPath );
} )
.finally( () => setIsAddingToCart( false ) )
.catch( () => {
Expand All @@ -317,9 +344,14 @@ const MailboxesForm = ( {

return (
<>
<SectionHeader label={ translate( 'Add New Mailboxes' ) } />

<Card>
{ showFormHeader && <SectionHeader label={ translate( 'Add New Mailboxes' ) } /> }

<Card className="new-mailbox">
{ !! customFormHeader && (
<div className="section-header__label">
<span className="section-header__label-text">{ customFormHeader }</span>
</div>
) }
<NewMailBoxList
areButtonsBusy={ isAddingToCart || isValidating }
hiddenFieldNames={ hiddenFieldNames }
Expand Down Expand Up @@ -354,6 +386,7 @@ const AddMailboxes = ( props: AddMailboxesProps ): JSX.Element | null => {
selectedSite,
source,
translate,
showPageHeader,
} = additionalProps;

const emailProduct = useSelector( ( state ) =>
Expand Down Expand Up @@ -396,9 +429,14 @@ const AddMailboxes = ( props: AddMailboxesProps ): JSX.Element | null => {
<Main wideLayout>
<DocumentHead title={ translate( 'Add New Mailboxes' ) } />

<EmailHeader />

<HeaderCake onClick={ goToEmail }>{ productName + ': ' + selectedDomainName }</HeaderCake>
{ showPageHeader && (
<>
<EmailHeader />
<HeaderCake onClick={ goToEmail }>
{ productName + ': ' + selectedDomainName }
</HeaderCake>
</>
) }

<WithVerificationGate productFamily={ productName } provider={ provider }>
<MailboxNotices { ...additionalProps } emailProduct={ emailProduct } />
Expand Down
3 changes: 3 additions & 0 deletions client/my-sites/email/controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,9 @@ export default {
provider={ EmailProvider.Titan }
selectedDomainName={ pageContext.params.domain }
source={ pageContext.query.source }
showPageHeader={ pageContext?.params?.showPageHeader }
showFormHeader={ pageContext?.params?.showFormHeader }
customFormHeader={ pageContext?.params?.customFormHeader }
/>
</CalypsoShoppingCartProvider>
);
Expand Down
10 changes: 9 additions & 1 deletion client/my-sites/email/paths.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,15 @@ export const getNewTitanAccountPath: EmailPathUtilityFunction = (
domainName,
relativeTo,
urlParameters
) => getPath( siteName, domainName, 'titan/new', relativeTo, urlParameters );
) => {
if ( isUnderDomainManagementAll( relativeTo ) ) {
return `${ domainsManagementPrefix }/${ domainName }/titan/new/${ siteName }${ buildQueryString(
urlParameters
) }`;
}

return getPath( siteName, domainName, 'titan/new', relativeTo, urlParameters );
};

// Retrieves the URL to set up Titan mailboxes
export const getTitanSetUpMailboxPath: EmailPathUtilityFunction = (
Expand Down
Loading