From 8ce30c829965961ca04d1fdac4da2f6698f83437 Mon Sep 17 00:00:00 2001 From: Taras Yemets Date: Thu, 20 Jun 2024 23:08:38 +0300 Subject: [PATCH 1/8] feat(plg): remove seats from subscription --- client/web/src/cody/invites/InviteUsers.tsx | 43 +++++++++++++++++---- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/client/web/src/cody/invites/InviteUsers.tsx b/client/web/src/cody/invites/InviteUsers.tsx index e3cf2c5e5dc1..b609d9c51896 100644 --- a/client/web/src/cody/invites/InviteUsers.tsx +++ b/client/web/src/cody/invites/InviteUsers.tsx @@ -2,13 +2,13 @@ import React, { useState, useCallback, useMemo } from 'react' import { pluralize } from '@sourcegraph/common' import type { TelemetryV2Props } from '@sourcegraph/shared/src/telemetry' -import { ButtonLink, H2, Link, Text, H3, TextArea } from '@sourcegraph/wildcard' +import { H2, Link, Text, H3, TextArea, Button, H1 } from '@sourcegraph/wildcard' import { CodyAlert } from '../components/CodyAlert' import { CodyContainer } from '../components/CodyContainer' import { CodyProBadgeDeck } from '../components/CodyProBadgeDeck' import { useSendInvite, useTeamInvites } from '../management/api/react-query/invites' -import { useCurrentSubscription } from '../management/api/react-query/subscriptions' +import { useCurrentSubscription, useUpdateCurrentSubscription } from '../management/api/react-query/subscriptions' import { useTeamMembers } from '../management/api/react-query/teams' import type { SubscriptionSummary } from '../management/api/teamSubscriptions' import { isValidEmailAddress } from '../util' @@ -39,6 +39,7 @@ export const InviteUsers: React.FunctionComponent = ({ telemet const [emailAddressErrorMessage, setEmailAddressErrorMessage] = useState(null) const sendInviteMutation = useSendInvite() + const updateSubscriptionMutation = useUpdateCurrentSubscription() const verifyEmailList = useCallback((): Error | void => { if (emailAddresses.length === 0) { @@ -104,12 +105,22 @@ export const InviteUsers: React.FunctionComponent = ({ telemet }) }, [emailAddresses, sendInviteMutation.mutateAsync, teamId, telemetryRecorder, verifyEmailList]) - if (!isAdmin || !remainingInviteCount) { + if (!isAdmin || !remainingInviteCount || !subscriptionQueryResult.data) { return null } + const { maxSeats } = subscriptionQueryResult.data + return ( <> + {updateSubscriptionMutation.isSuccess && ( + +

+ Remaining invites removed from plan +

+ You can add more seats at any time with the "Add seats" button. +
+ )} {sendInviteMutation.status === 'success' && (

@@ -153,15 +164,33 @@ export const InviteUsers: React.FunctionComponent = ({ telemet isValid={emailAddressErrorMessage ? false : undefined} /> {emailAddressErrorMessage ? ( - {emailAddressErrorMessage} + {emailAddressErrorMessage} ) : ( - Enter email addresses separated by a comma. + Enter email addresses separated by a comma. )}
- + +
From bae2776719b1992cb8c7b2f99de6ddadd93be635 Mon Sep 17 00:00:00 2001 From: Taras Yemets Date: Fri, 21 Jun 2024 01:10:10 +0300 Subject: [PATCH 2/8] chore(plg): provide user cody plan on page level --- client/web/src/cody/codyProRoutes.tsx | 24 +++++++++- .../cody/management/CodyManagementPage.tsx | 37 ++++----------- .../manage/CodySubscriptionManagePage.tsx | 32 +++---------- .../new/NewCodyProSubscriptionPage.tsx | 46 +++++-------------- .../subscription/CodySubscriptionPage.tsx | 33 ++++--------- .../subscription/useUserCodySubscription.ts | 29 ++++++++++++ .../web/src/cody/team/CodyManageTeamPage.tsx | 2 + 7 files changed, 90 insertions(+), 113 deletions(-) create mode 100644 client/web/src/cody/subscription/useUserCodySubscription.ts diff --git a/client/web/src/cody/codyProRoutes.tsx b/client/web/src/cody/codyProRoutes.tsx index c9a3ebfadf1f..60240e01d95c 100644 --- a/client/web/src/cody/codyProRoutes.tsx +++ b/client/web/src/cody/codyProRoutes.tsx @@ -1,9 +1,10 @@ -import type { RouteObject } from 'react-router-dom' +import { Navigate, type RouteObject } from 'react-router-dom' import { lazyComponent } from '@sourcegraph/shared/src/util/lazyComponent' import { type LegacyLayoutRouteContext, LegacyRoute } from '../LegacyRouteContext' +import { useUserCodySubscription } from './subscription/useUserCodySubscription' import { isEmbeddedCodyProUIEnabled } from './util' export enum CodyProRoutes { @@ -76,6 +77,25 @@ interface CodyProPageProps extends Pick = props => { + const { data } = useUserCodySubscription() + if (!data) { + return null + } + + if (!data.currentUser) { + return + } + + if (!data.currentUser.codySubscription) { + return null + } + const Component = routeComponents[props.path] - return + return ( + + ) } diff --git a/client/web/src/cody/management/CodyManagementPage.tsx b/client/web/src/cody/management/CodyManagementPage.tsx index 311f5ee64fba..a11ed2a48f0d 100644 --- a/client/web/src/cody/management/CodyManagementPage.tsx +++ b/client/web/src/cody/management/CodyManagementPage.tsx @@ -11,13 +11,7 @@ import { ButtonLink, H1, H2, Icon, Link, PageHeader, Text, useSearchParameters, import type { AuthenticatedUser } from '../../auth' import { Page } from '../../components/Page' import { PageTitle } from '../../components/PageTitle' -import { - type UserCodyPlanResult, - type UserCodyPlanVariables, - type UserCodyUsageResult, - type UserCodyUsageVariables, - CodySubscriptionPlan, -} from '../../graphql-operations' +import { type UserCodyUsageResult, type UserCodyUsageVariables, CodySubscriptionPlan } from '../../graphql-operations' import { CodyProRoutes } from '../codyProRoutes' import { CodyAlert } from '../components/CodyAlert' import { ProIcon } from '../components/CodyIcon' @@ -26,7 +20,8 @@ import { AcceptInviteBanner } from '../invites/AcceptInviteBanner' import { InviteUsers } from '../invites/InviteUsers' import { isCodyEnabled } from '../isCodyEnabled' import { CodyOnboarding, type IEditor } from '../onboarding/CodyOnboarding' -import { USER_CODY_PLAN, USER_CODY_USAGE } from '../subscription/queries' +import { USER_CODY_USAGE } from '../subscription/queries' +import type { UserCodySubscription } from '../subscription/useUserCodySubscription' import { getManageSubscriptionPageURL } from '../util' import { useSubscriptionSummary } from './api/react-query/subscriptions' @@ -37,6 +32,7 @@ import styles from './CodyManagementPage.module.scss' interface CodyManagementPageProps extends TelemetryV2Props { authenticatedUser: AuthenticatedUser | null + codySubscription: UserCodySubscription } export enum EditorStep { @@ -47,6 +43,7 @@ export enum EditorStep { export const CodyManagementPage: React.FunctionComponent = ({ authenticatedUser, telemetryRecorder, + codySubscription, }) => { const navigate = useNavigate() const parameters = useSearchParameters() @@ -69,8 +66,6 @@ export const CodyManagementPage: React.FunctionComponent(USER_CODY_PLAN, {}) - const { data: usageData, error: usageDateError } = useQuery( USER_CODY_USAGE, {} @@ -82,14 +77,6 @@ export const CodyManagementPage: React.FunctionComponent(null) const [selectedEditorStep, setSelectedEditorStep] = React.useState(null) - const subscription = data?.currentUser?.codySubscription - - useEffect(() => { - if (!!data && !data?.currentUser) { - navigate(`/sign-in?returnTo=${CodyProRoutes.Manage}`) - } - }, [data, navigate]) - const getTeamInviteButton = (): JSX.Element | null => { const isSoloUser = subscriptionSummaryQueryResult?.data?.teamMaxMembers === 1 const hasFreeSeats = subscriptionSummaryQueryResult?.data @@ -114,19 +101,15 @@ export const CodyManagementPage: React.FunctionComponent @@ -191,7 +174,7 @@ export const CodyManagementPage: React.FunctionComponent )} - + { authenticatedUser: AuthenticatedUser + codySubscription: UserCodySubscription } -const AuthenticatedCodySubscriptionManagePage: React.FC = ({ telemetryRecorder }) => { - const { - loading: userCodyPlanLoading, - error: useCodyPlanError, - data: userCodyPlanData, - } = useQuery(USER_CODY_PLAN, {}) +const AuthenticatedCodySubscriptionManagePage: React.FC = ({ telemetryRecorder, codySubscription }) => { const subscriptionSummaryQuery = useSubscriptionSummary() useEffect( @@ -47,26 +38,15 @@ const AuthenticatedCodySubscriptionManagePage: React.FC = ({ telemetryRec [telemetryRecorder] ) - if (userCodyPlanLoading || subscriptionSummaryQuery.isLoading) { + if (subscriptionSummaryQuery.isLoading) { return } - if (useCodyPlanError) { - logger.error('Failed to fetch Cody subscription data', useCodyPlanError) - return null - } - if (subscriptionSummaryQuery.isError) { logger.error('Failed to fetch Cody subscription summary', subscriptionSummaryQuery.error) return null } - const subscriptionData = userCodyPlanData?.currentUser?.codySubscription - if (!subscriptionData) { - logger.error('Cody subscription data is not available.') - return null - } - if (!subscriptionSummaryQuery.data) { logger.error('Cody subscription summary is not available.') return null @@ -74,7 +54,7 @@ const AuthenticatedCodySubscriptionManagePage: React.FC = ({ telemetryRec // This page only applies to users who have a Cody Pro subscription to manage. // Otherwise, direct them to the ./new page to sign up. - if (subscriptionData.plan !== CodySubscriptionPlan.PRO) { + if (codySubscription.plan !== CodySubscriptionPlan.PRO) { return } diff --git a/client/web/src/cody/management/subscription/new/NewCodyProSubscriptionPage.tsx b/client/web/src/cody/management/subscription/new/NewCodyProSubscriptionPage.tsx index d922b958c943..844f364a53e5 100644 --- a/client/web/src/cody/management/subscription/new/NewCodyProSubscriptionPage.tsx +++ b/client/web/src/cody/management/subscription/new/NewCodyProSubscriptionPage.tsx @@ -9,7 +9,6 @@ import { loadStripe } from '@stripe/stripe-js' import classNames from 'classnames' import { Navigate, useSearchParams } from 'react-router-dom' -import { useQuery } from '@sourcegraph/http-client' import type { TelemetryV2Props } from '@sourcegraph/shared/src/telemetry' import { PageHeader, Text, LoadingSpinner, Alert, logger } from '@sourcegraph/wildcard' @@ -17,14 +16,10 @@ import type { AuthenticatedUser } from '../../../../auth' import { withAuthenticatedUser } from '../../../../auth/withAuthenticatedUser' import { Page } from '../../../../components/Page' import { PageTitle } from '../../../../components/PageTitle' -import { - type UserCodyPlanResult, - type UserCodyPlanVariables, - CodySubscriptionPlan, -} from '../../../../graphql-operations' +import { CodySubscriptionPlan } from '../../../../graphql-operations' import { CodyProRoutes } from '../../../codyProRoutes' import { PageHeaderIcon } from '../../../components/PageHeaderIcon' -import { USER_CODY_PLAN } from '../../../subscription/queries' +import type { UserCodySubscription } from '../../../subscription/useUserCodySubscription' import { defaultCodyProApiClientContext, CodyProApiClientContext } from '../../api/components/CodyProApiClient' import { useCurrentSubscription } from '../../api/react-query/subscriptions' import { useBillingAddressStripeElementsOptions } from '../manage/BillingAddress' @@ -41,11 +36,13 @@ const stripe = await loadStripe(publishableKey || '') interface NewCodyProSubscriptionPageProps extends TelemetryV2Props { authenticatedUser: AuthenticatedUser + codySubscription: UserCodySubscription } const AuthenticatedNewCodyProSubscriptionPage: FunctionComponent = ({ authenticatedUser, telemetryRecorder, + codySubscription, }) => { const [urlSearchParams] = useSearchParams() const addSeats = !!urlSearchParams.get('addSeats') @@ -53,12 +50,6 @@ const AuthenticatedNewCodyProSubscriptionPage: FunctionComponent(USER_CODY_PLAN, {}) const subscriptionQueryResult = useCurrentSubscription() const subscription = subscriptionQueryResult?.data @@ -67,25 +58,20 @@ const AuthenticatedNewCodyProSubscriptionPage: FunctionComponent { - if (userCodyPlanError) { - logger.error('Failed to fetch subscription data', userCodyPlanError) - } - }, [userCodyPlanError]) - useEffect(() => { - if (subscriptionQueryResult.isError) { + if (subscriptionQueryResult.error) { logger.error('Failed to fetch subscription data', subscriptionQueryResult.error) } - }, [subscriptionQueryResult.isError, subscriptionQueryResult.error]) - - if (userCodyPlanLoading || subscriptionQueryResult.isLoading) { - return - } + }, [subscriptionQueryResult.error]) // If the user already has a Cody Pro subscription, direct them back to the Cody Management page. - if (!addSeats && userCodyPlanData?.currentUser?.codySubscription?.plan === CodySubscriptionPlan.PRO) { + if (!addSeats && codySubscription.plan === CodySubscriptionPlan.PRO) { return } + if (subscriptionQueryResult.isLoading) { + return + } + const PageWithHeader = ({ children }: { children: React.ReactNode }): React.ReactElement => ( @@ -103,7 +89,7 @@ const AuthenticatedNewCodyProSubscriptionPage: FunctionComponent ) - if (userCodyPlanLoading || subscriptionQueryResult.isLoading) { + if (subscriptionQueryResult.isLoading) { return ( @@ -111,14 +97,6 @@ const AuthenticatedNewCodyProSubscriptionPage: FunctionComponent - Failed to fetch user Cody plan data - - ) - } - if (addSeats && subscriptionQueryResult.isError) { return ( diff --git a/client/web/src/cody/subscription/CodySubscriptionPage.tsx b/client/web/src/cody/subscription/CodySubscriptionPage.tsx index 2a174cf8a8cf..15e40e3d3c25 100644 --- a/client/web/src/cody/subscription/CodySubscriptionPage.tsx +++ b/client/web/src/cody/subscription/CodySubscriptionPage.tsx @@ -4,7 +4,6 @@ import { mdiArrowLeft, mdiInformationOutline, mdiTrendingUp, mdiCreditCardOutlin import classNames from 'classnames' import { useNavigate } from 'react-router-dom' -import { useQuery } from '@sourcegraph/http-client' import type { TelemetryV2Props } from '@sourcegraph/shared/src/telemetry' import { Badge, @@ -21,27 +20,27 @@ import { } from '@sourcegraph/wildcard' import type { AuthenticatedUser } from '../../auth' +import { withAuthenticatedUser } from '../../auth/withAuthenticatedUser' import { Page } from '../../components/Page' import { PageTitle } from '../../components/PageTitle' import { CodySubscriptionPlan } from '../../graphql-operations' -import type { UserCodyPlanResult, UserCodyPlanVariables } from '../../graphql-operations' import { CodyProRoutes } from '../codyProRoutes' import { ProIcon } from '../components/CodyIcon' import { PageHeaderIcon } from '../components/PageHeaderIcon' -import { isCodyEnabled } from '../isCodyEnabled' import { getManageSubscriptionPageURL, isEmbeddedCodyProUIEnabled, manageSubscriptionRedirectURL } from '../util' -import { USER_CODY_PLAN } from './queries' +import type { UserCodySubscription } from './useUserCodySubscription' import styles from './CodySubscriptionPage.module.scss' interface CodySubscriptionPageProps extends TelemetryV2Props { - authenticatedUser?: AuthenticatedUser | null + authenticatedUser: AuthenticatedUser + codySubscription: UserCodySubscription } -export const CodySubscriptionPage: React.FunctionComponent = ({ - authenticatedUser, +const AuthenticatedCodySubscriptionManagePage: React.FunctionComponent = ({ telemetryRecorder, + codySubscription, }) => { const parameters = useSearchParameters() @@ -50,26 +49,10 @@ export const CodySubscriptionPage: React.FunctionComponent(USER_CODY_PLAN, {}) - const navigate = useNavigate() const useEmbeddedCodyUI = useMemo(() => isEmbeddedCodyProUIEnabled(), []) - useEffect(() => { - if (!!data && !data?.currentUser) { - navigate(`/sign-in?returnTo=${CodyProRoutes.Subscription}`) - } - }, [data, navigate]) - - if (dataError) { - throw dataError - } - - if (!isCodyEnabled() || !data?.currentUser || !authenticatedUser) { - return null - } - - const isProUser = data.currentUser.codySubscription?.plan === CodySubscriptionPlan.PRO + const isProUser = codySubscription.plan === CodySubscriptionPlan.PRO return ( <> @@ -454,6 +437,8 @@ export const CodySubscriptionPage: React.FunctionComponent ( >['codySubscription']>, + '__typename' +> + +const USER_CODY_PLAN = gql` + query UserCodyPlan { + currentUser { + id + codySubscription { + status + plan + applyProRateLimits + currentPeriodStartAt + currentPeriodEndAt + cancelAtPeriodEnd + } + } + } +` + +export const useUserCodySubscription = (): QueryResult => + useQuery(USER_CODY_PLAN, {}) diff --git a/client/web/src/cody/team/CodyManageTeamPage.tsx b/client/web/src/cody/team/CodyManageTeamPage.tsx index 4fea4ee10369..0c01b141db75 100644 --- a/client/web/src/cody/team/CodyManageTeamPage.tsx +++ b/client/web/src/cody/team/CodyManageTeamPage.tsx @@ -18,11 +18,13 @@ import { InviteUsers } from '../invites/InviteUsers' import { useTeamInvites } from '../management/api/react-query/invites' import { useCurrentSubscription, useSubscriptionSummary } from '../management/api/react-query/subscriptions' import { useTeamMembers } from '../management/api/react-query/teams' +import type { UserCodySubscription } from '../subscription/useUserCodySubscription' import { TeamMemberList } from './TeamMemberList' interface CodyManageTeamPageProps extends TelemetryV2Props { authenticatedUser: AuthenticatedUser + codySubscription: UserCodySubscription } const AuthenticatedCodyManageTeamPage: React.FunctionComponent = ({ telemetryRecorder }) => { From 32090933094f1fd90ea5e5da6f690ecfa0b1864a Mon Sep 17 00:00:00 2001 From: Taras Yemets Date: Fri, 21 Jun 2024 01:39:07 +0300 Subject: [PATCH 3/8] fix banner styles --- .../src/cody/components/CodyAlert.module.scss | 7 +++++++ client/web/src/cody/invites/InviteUsers.tsx | 19 +++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/client/web/src/cody/components/CodyAlert.module.scss b/client/web/src/cody/components/CodyAlert.module.scss index 4437c4ce8556..8b6ed5c1a84c 100644 --- a/client/web/src/cody/components/CodyAlert.module.scss +++ b/client/web/src/cody/components/CodyAlert.module.scss @@ -41,8 +41,15 @@ background-color: #51cf66; } &::after { + top: calc(50% - 16px); + left: 1.5rem; + /* stylelint-disable-next-line declaration-property-unit-allowed-list */ + width: 32px; + /* stylelint-disable-next-line declaration-property-unit-allowed-list */ + height: 32px; // Green checkmark SVG background-image: url("data:image/svg+xml,"); + background-repeat: no-repeat; } } diff --git a/client/web/src/cody/invites/InviteUsers.tsx b/client/web/src/cody/invites/InviteUsers.tsx index b609d9c51896..74a47b45ffec 100644 --- a/client/web/src/cody/invites/InviteUsers.tsx +++ b/client/web/src/cody/invites/InviteUsers.tsx @@ -105,6 +105,17 @@ export const InviteUsers: React.FunctionComponent = ({ telemet }) }, [emailAddresses, sendInviteMutation.mutateAsync, teamId, telemetryRecorder, verifyEmailList]) + if (updateSubscriptionMutation.isSuccess) { + return ( + +

+ Remaining invites removed from plan +

+ You can add more seats at any time with the "Add seats" button. + + ) + } + if (!isAdmin || !remainingInviteCount || !subscriptionQueryResult.data) { return null } @@ -113,14 +124,6 @@ export const InviteUsers: React.FunctionComponent = ({ telemet return ( <> - {updateSubscriptionMutation.isSuccess && ( - -

- Remaining invites removed from plan -

- You can add more seats at any time with the "Add seats" button. -
- )} {sendInviteMutation.status === 'success' && (

From 94807802e66d12cbc22c2e9f41343e6541d8dc25 Mon Sep 17 00:00:00 2001 From: Taras Yemets Date: Fri, 21 Jun 2024 01:48:11 +0300 Subject: [PATCH 4/8] add comment and log error --- client/web/src/cody/codyProRoutes.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/web/src/cody/codyProRoutes.tsx b/client/web/src/cody/codyProRoutes.tsx index 60240e01d95c..58772f256df9 100644 --- a/client/web/src/cody/codyProRoutes.tsx +++ b/client/web/src/cody/codyProRoutes.tsx @@ -1,5 +1,6 @@ import { Navigate, type RouteObject } from 'react-router-dom' +import { logger } from '@sourcegraph/common' import { lazyComponent } from '@sourcegraph/shared/src/util/lazyComponent' import { type LegacyLayoutRouteContext, LegacyRoute } from '../LegacyRouteContext' @@ -83,10 +84,12 @@ const CodyProPage: React.FC = props => { } if (!data.currentUser) { + // Cody plan is not available if the user is not authenticated. Redirecting to the sign-in page. return } if (!data.currentUser.codySubscription) { + logger.error('Cody subscription data is not available.') return null } From 84349d1a8be5a627863dcd4f9eca33393a7d5f08 Mon Sep 17 00:00:00 2001 From: Taras Yemets Date: Fri, 21 Jun 2024 01:57:02 +0300 Subject: [PATCH 5/8] refetch user cody plan after accepting an invite --- .../src/cody/invites/AcceptInviteBanner.tsx | 18 +++++++++--------- .../src/cody/management/CodyManagementPage.tsx | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/client/web/src/cody/invites/AcceptInviteBanner.tsx b/client/web/src/cody/invites/AcceptInviteBanner.tsx index 0af1cda0cdc3..57d8ee4601c3 100644 --- a/client/web/src/cody/invites/AcceptInviteBanner.tsx +++ b/client/web/src/cody/invites/AcceptInviteBanner.tsx @@ -3,11 +3,12 @@ import { Button, ButtonLink, H1, Text } from '@sourcegraph/wildcard' import { CodyProRoutes } from '../codyProRoutes' import { CodyAlert } from '../components/CodyAlert' import { useAcceptInvite, useCancelInvite } from '../management/api/react-query/invites' +import { useUserCodySubscription } from '../subscription/useUserCodySubscription' import { useInviteParams } from './useInviteParams' import { UserInviteStatus, useInviteState } from './useInviteState' -export const AcceptInviteBanner: React.FC<{ onSuccess: () => unknown }> = ({ onSuccess }) => { +export const AcceptInviteBanner: React.FC = () => { const { inviteParams, clearInviteParams } = useInviteParams() if (!inviteParams) { return null @@ -16,18 +17,17 @@ export const AcceptInviteBanner: React.FC<{ onSuccess: () => unknown }> = ({ onS ) } -const AcceptInviteBannerContent: React.FC<{ - teamId: string - inviteId: string - onSuccess: () => unknown - clearInviteParams: () => void -}> = ({ teamId, inviteId, onSuccess, clearInviteParams }) => { +const AcceptInviteBannerContent: React.FC<{ teamId: string; inviteId: string; clearInviteParams: () => void }> = ({ + teamId, + inviteId, + clearInviteParams, +}) => { + const { refetch } = useUserCodySubscription() const inviteState = useInviteState(teamId, inviteId) const acceptInviteMutation = useAcceptInvite() const cancelInviteMutation = useCancelInvite() @@ -108,7 +108,7 @@ const AcceptInviteBannerContent: React.FC<{ onClick={() => acceptInviteMutation.mutate( { teamId, inviteId }, - { onSuccess, onSettled: clearInviteParams } + { onSuccess: () => refetch(), onSettled: clearInviteParams } ) } > diff --git a/client/web/src/cody/management/CodyManagementPage.tsx b/client/web/src/cody/management/CodyManagementPage.tsx index a11ed2a48f0d..3dbc21389352 100644 --- a/client/web/src/cody/management/CodyManagementPage.tsx +++ b/client/web/src/cody/management/CodyManagementPage.tsx @@ -115,7 +115,7 @@ export const CodyManagementPage: React.FunctionComponent - + {welcomeToPro && (

Welcome to Cody Pro

From e29333e1e2cca9df209bf02b1d126b12fe8a560f Mon Sep 17 00:00:00 2001 From: Taras Yemets Date: Fri, 21 Jun 2024 02:03:40 +0300 Subject: [PATCH 6/8] fix page name --- client/web/src/cody/subscription/CodySubscriptionPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/web/src/cody/subscription/CodySubscriptionPage.tsx b/client/web/src/cody/subscription/CodySubscriptionPage.tsx index 15e40e3d3c25..b9eb7ea0b346 100644 --- a/client/web/src/cody/subscription/CodySubscriptionPage.tsx +++ b/client/web/src/cody/subscription/CodySubscriptionPage.tsx @@ -38,7 +38,7 @@ interface CodySubscriptionPageProps extends TelemetryV2Props { codySubscription: UserCodySubscription } -const AuthenticatedCodySubscriptionManagePage: React.FunctionComponent = ({ +const AuthenticatedCodySubscriptionPage: React.FunctionComponent = ({ telemetryRecorder, codySubscription, }) => { @@ -437,7 +437,7 @@ const AuthenticatedCodySubscriptionManagePage: React.FunctionComponent ( Date: Fri, 21 Jun 2024 02:28:01 +0300 Subject: [PATCH 7/8] bazel configure --- client/web/BUILD.bazel | 1 + 1 file changed, 1 insertion(+) diff --git a/client/web/BUILD.bazel b/client/web/BUILD.bazel index 382bea2945c9..b8cee9378440 100644 --- a/client/web/BUILD.bazel +++ b/client/web/BUILD.bazel @@ -281,6 +281,7 @@ ts_project( "src/cody/sidebar/useSidebarSize.tsx", "src/cody/subscription/CodySubscriptionPage.tsx", "src/cody/subscription/queries.tsx", + "src/cody/subscription/useUserCodySubscription.ts", "src/cody/switch-account/CodySwitchAccountPage.tsx", "src/cody/team/CodyManageTeamPage.tsx", "src/cody/team/TeamMemberList.tsx", From acf25ac9d0ac17405f4d471184e2f3d2a469b9f0 Mon Sep 17 00:00:00 2001 From: Taras Yemets Date: Tue, 25 Jun 2024 15:12:52 +0300 Subject: [PATCH 8/8] Update client/web/src/cody/management/subscription/new/NewCodyProSubscriptionPage.tsx Co-authored-by: David Veszelovszki --- .../management/subscription/new/NewCodyProSubscriptionPage.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/client/web/src/cody/management/subscription/new/NewCodyProSubscriptionPage.tsx b/client/web/src/cody/management/subscription/new/NewCodyProSubscriptionPage.tsx index 844f364a53e5..e2e003e3d730 100644 --- a/client/web/src/cody/management/subscription/new/NewCodyProSubscriptionPage.tsx +++ b/client/web/src/cody/management/subscription/new/NewCodyProSubscriptionPage.tsx @@ -68,6 +68,7 @@ const AuthenticatedNewCodyProSubscriptionPage: FunctionComponent } + // Display spinner without page header because without the subscription, we don't know which header to show if (subscriptionQueryResult.isLoading) { return }