diff --git a/packages/webapp/src/components/Layout/Group/Group.tsx b/packages/webapp/src/components/Layout/Group/Group.tsx
index 205f68da1..3a7573d27 100644
--- a/packages/webapp/src/components/Layout/Group/Group.tsx
+++ b/packages/webapp/src/components/Layout/Group/Group.tsx
@@ -48,7 +48,7 @@ const GroupStyled = styled(Box)`
box-sizing: border-box;
display: flex;
flex-direction: row;
- align-items: center;
+ align-items: ${(props: GroupProps) => (props.align || 'center')};
flex-wrap: ${(props: GroupProps) => (props.noWrap ? 'nowrap' : 'wrap')};
justify-content: ${(props: GroupProps) =>
GROUP_POSITIONS[props.position || 'left']};
diff --git a/packages/webapp/src/components/PricingPlan/PricingPlan.module.scss b/packages/webapp/src/components/PricingPlan/PricingPlan.module.scss
new file mode 100644
index 000000000..15e66cbef
--- /dev/null
+++ b/packages/webapp/src/components/PricingPlan/PricingPlan.module.scss
@@ -0,0 +1,58 @@
+.root{
+ border-radius: 5px;
+ padding: 40px 15px;
+ position: relative;
+ border: 1px solid #D8DEE4;
+ padding-top: 45px;
+
+ &.isFeatured {
+ background-color: #F5F6F8;
+ border: 0;
+ }
+}
+.featuredBox {
+ background-color: #A3ACBA;
+ height: 30px;
+ line-height: 30px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ border-radius: 5px 5px 0 0;
+ color: #fff;
+ text-align: center;
+ font-size: 12px;
+}
+.label {
+ font-size: 14px;
+ font-weight: 600;
+ color: #2F343C;
+
+}
+.description{
+ font-size: 14px;
+ color: #687385;
+ line-height: 1.5;
+}
+.buttonCTA {
+ min-height: 34px;
+ border-radius: 5px;
+}
+.features {
+ margin-top: 1rem;
+}
+.priceRoot{
+ padding-bottom: 10px;
+}
+.price {
+ font-size: 18px;
+ line-height: 1;
+ font-weight: 500;
+ color: #404854;
+}
+
+.pricePer{
+ color: #738091;
+ font-size: 12px;
+ line-height: 1;
+}
\ No newline at end of file
diff --git a/packages/webapp/src/components/PricingPlan/PricingPlan.tsx b/packages/webapp/src/components/PricingPlan/PricingPlan.tsx
new file mode 100644
index 000000000..52bbfecfa
--- /dev/null
+++ b/packages/webapp/src/components/PricingPlan/PricingPlan.tsx
@@ -0,0 +1,125 @@
+import { Button, ButtonProps, Intent } from '@blueprintjs/core';
+import clsx from 'classnames';
+import { Box, Group, Stack } from '../Layout';
+import styles from './PricingPlan.module.scss';
+import { CheckCircled } from '@/icons/CheckCircled';
+
+export interface PricingPlanProps {
+ featured?: boolean;
+ children: React.ReactNode;
+}
+
+/**
+ * Displays a pricing plan.
+ * @param featured - Whether the plan is featured.
+ * @param children - The content of the plan.
+ */
+export const PricingPlan = ({ featured, children }: PricingPlanProps) => {
+ return (
+
+ <>{children}>
+
+ );
+};
+
+/**
+ * Displays a featured section within a pricing plan.
+ * @param children - The content of the featured section.
+ */
+PricingPlan.Featured = ({ children }: { children: React.ReactNode }) => {
+ return {children};
+};
+
+export interface PricingHeaderProps {
+ label: string;
+ description: string;
+}
+
+/**
+ * Displays the header of a pricing plan.
+ * @param label - The label of the plan.
+ * @param description - The description of the plan.
+ */
+PricingPlan.Header = ({ label, description }: PricingHeaderProps) => {
+ return (
+
+ {label}
+ {description && {description}
}
+
+ );
+};
+
+export interface PricingPriceProps {
+ price: string;
+ subPrice: string;
+}
+
+/**
+ * Displays the price of a pricing plan.
+ * @param price - The main price of the plan.
+ * @param subPrice - The sub-price of the plan.
+ */
+PricingPlan.Price = ({ price, subPrice }: PricingPriceProps) => {
+ return (
+
+ {price}
+ {subPrice}
+
+ );
+};
+
+export interface PricingBuyButtonProps extends ButtonProps {}
+
+/**
+ * Displays a buy button within a pricing plan.
+ * @param children - The content of the button.
+ * @param props - Additional button props.
+ */
+PricingPlan.BuyButton = ({ children, ...props }: PricingBuyButtonProps) => {
+ return (
+
+ );
+};
+
+export interface PricingFeaturesProps {
+ children: React.ReactNode;
+}
+
+/**
+ * Displays a list of features within a pricing plan.
+ * @param children - The list of features.
+ */
+PricingPlan.Features = ({ children }: PricingFeaturesProps) => {
+ return (
+
+ {children}
+
+ );
+};
+
+export interface PricingFeatureLineProps {
+ children: React.ReactNode;
+}
+
+/**
+ * Displays a single feature line within a list of features.
+ * @param children - The content of the feature line.
+ */
+PricingPlan.FeatureLine = ({ children }: PricingFeatureLineProps) => {
+ return (
+
+
+ {children}
+
+ );
+};
diff --git a/packages/webapp/src/components/Subscriptions/index.tsx b/packages/webapp/src/components/Subscriptions/index.tsx
deleted file mode 100644
index 56f32b3e2..000000000
--- a/packages/webapp/src/components/Subscriptions/index.tsx
+++ /dev/null
@@ -1,136 +0,0 @@
-// @ts-nocheck
-import React from 'react';
-import classNames from 'classnames';
-
-import { T } from '@/components';
-import { saveInvoke } from '@/utils';
-
-import '@/style/pages/Subscription/PlanRadio.scss';
-import '@/style/pages/Subscription/PlanPeriodRadio.scss';
-
-export function SubscriptionPlans({ value, plans, onSelect }) {
- const handleSelect = (value) => {
- onSelect && onSelect(value);
- };
-
- return (
-
- {plans.map((plan) => (
-
- ))}
-
- );
-}
-
-export function SubscriptionPlan({
- name,
- description,
- price,
- currencyCode,
-
- value,
- selectedOption,
- onSelected,
-}) {
- const handlePlanClick = () => {
- saveInvoke(onSelected, value);
- };
- return (
-
-
-
-
-
- {description.map((line) => (
- - {line}
- ))}
-
-
-
-
-
- {price} {currencyCode}
-
-
-
-
-
-
- );
-}
-
-/**
- * Subscription periods.
- */
-export function SubscriptionPeriods({ periods, selectedPeriod, onPeriodSelect }) {
- const handleSelected = (value) => {
- saveInvoke(onPeriodSelect, value);
- };
-
- return (
-
- {periods.map((period) => (
-
- ))}
-
- );
-}
-
-/**
- * Billing period.
- */
-export function SubscriptionPeriod({
- // #ownProps
- label,
- selectedPeriod,
- onSelected,
- period,
- price,
- currencyCode,
-}) {
- const handlePeriodClick = () => {
- saveInvoke(onSelected, period);
- };
- return (
-
-
{label}
-
-
-
- {price} {currencyCode}
-
- {label}
-
-
- );
-}
diff --git a/packages/webapp/src/components/index.tsx b/packages/webapp/src/components/index.tsx
index 4a8478e3d..4a13add72 100644
--- a/packages/webapp/src/components/index.tsx
+++ b/packages/webapp/src/components/index.tsx
@@ -13,7 +13,6 @@ export * from './PdfPreview';
export * from './Details';
export * from './TotalLines/index';
export * from './Alert';
-export * from './Subscriptions';
export * from './Dashboard';
export * from './Drawer';
export * from './Forms';
diff --git a/packages/webapp/src/containers/Setup/SetupLeftSection.tsx b/packages/webapp/src/containers/Setup/SetupLeftSection.tsx
index d23a02926..300103ed7 100644
--- a/packages/webapp/src/containers/Setup/SetupLeftSection.tsx
+++ b/packages/webapp/src/containers/Setup/SetupLeftSection.tsx
@@ -54,7 +54,6 @@ function SetupLeftSectionHeader() {
-
diff --git a/packages/webapp/src/containers/Setup/SetupRightSection.tsx b/packages/webapp/src/containers/Setup/SetupRightSection.tsx
index a4c880252..1219c8a58 100644
--- a/packages/webapp/src/containers/Setup/SetupRightSection.tsx
+++ b/packages/webapp/src/containers/Setup/SetupRightSection.tsx
@@ -29,10 +29,7 @@ function SetupRightSection({
}) {
return (
);
diff --git a/packages/webapp/src/containers/Setup/SetupSteps.tsx b/packages/webapp/src/containers/Setup/SetupSteps.tsx
deleted file mode 100644
index e24019774..000000000
--- a/packages/webapp/src/containers/Setup/SetupSteps.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-// @ts-nocheck
-import React from 'react';
-
-export default function SetupSteps({ step, children }) {
- const activeStep = React.Children.toArray(children).filter(
- (child) => child.props.id === step.id,
- );
- return activeStep;
-}
diff --git a/packages/webapp/src/containers/Setup/SetupSubscription.tsx b/packages/webapp/src/containers/Setup/SetupSubscription.tsx
deleted file mode 100644
index 866ed0bcc..000000000
--- a/packages/webapp/src/containers/Setup/SetupSubscription.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-// @ts-nocheck
-import React from 'react';
-import { Formik } from 'formik';
-import * as R from 'ramda';
-
-import '@/style/pages/Setup/Subscription.scss';
-
-import SetupSubscriptionForm from './SetupSubscription/SetupSubscriptionForm';
-import { getSubscriptionFormSchema } from './SubscriptionForm.schema';
-import withSubscriptionPlansActions from '../Subscriptions/withSubscriptionPlansActions';
-import { useGetLemonSqueezyCheckout } from '@/hooks/query/subscriptions';
-
-/**
- * Subscription step of wizard setup.
- */
-function SetupSubscription({
- // #withSubscriptionPlansActions
- initSubscriptionPlans,
-}) {
- React.useEffect(() => {
- initSubscriptionPlans();
- }, [initSubscriptionPlans]);
-
- React.useEffect(() => {
- window.LemonSqueezy.Setup({
- eventHandler: (event) => {
- // Do whatever you want with this event data
- if (event.event === 'Checkout.Success') {
- }
- },
- });
- }, []);
-
- // Initial values.
- const initialValues = {
- plan_slug: 'essentials',
- period: 'month',
- license_code: '',
- };
- const { mutateAsync: getLemonCheckout } = useGetLemonSqueezyCheckout();
-
- // Handle form submit.
- const handleSubmit = (values) => {
- getLemonCheckout({ variantId: '337977' })
- .then((res) => {
- const checkoutUrl = res.data.data.attributes.url;
- window.LemonSqueezy.Url.Open(checkoutUrl);
- })
- .catch(() => {});
- };
-
- // Retrieve momerized subscription form schema.
- const SubscriptionFormSchema = React.useMemo(
- () => getSubscriptionFormSchema(),
- [],
- );
-
- return (
-
-
-
- );
-}
-
-export default R.compose(withSubscriptionPlansActions)(SetupSubscription);
diff --git a/packages/webapp/src/containers/Setup/SetupSubscription/SetupSubscription.module.scss b/packages/webapp/src/containers/Setup/SetupSubscription/SetupSubscription.module.scss
new file mode 100644
index 000000000..9fd5de410
--- /dev/null
+++ b/packages/webapp/src/containers/Setup/SetupSubscription/SetupSubscription.module.scss
@@ -0,0 +1,5 @@
+
+.root{
+ margin: 0 auto;
+ padding: 0 40px;
+}
diff --git a/packages/webapp/src/containers/Setup/SetupSubscription/SetupSubscription.tsx b/packages/webapp/src/containers/Setup/SetupSubscription/SetupSubscription.tsx
new file mode 100644
index 000000000..2ff52f26d
--- /dev/null
+++ b/packages/webapp/src/containers/Setup/SetupSubscription/SetupSubscription.tsx
@@ -0,0 +1,38 @@
+// @ts-nocheck
+import { useEffect } from 'react';
+import * as R from 'ramda';
+
+import { Box } from '@/components';
+import { SubscriptionPlansSection } from './SubscriptionPlansSection';
+import withSubscriptionPlansActions from '../../Subscriptions/withSubscriptionPlansActions';
+import styles from './SetupSubscription.module.scss';
+
+/**
+ * Subscription step of wizard setup.
+ */
+function SetupSubscription({
+ // #withSubscriptionPlansActions
+ initSubscriptionPlans,
+}) {
+ useEffect(() => {
+ initSubscriptionPlans();
+ }, [initSubscriptionPlans]);
+
+ useEffect(() => {
+ window.LemonSqueezy.Setup({
+ eventHandler: (event) => {
+ // Do whatever you want with this event data
+ if (event.event === 'Checkout.Success') {
+ }
+ },
+ });
+ }, []);
+
+ return (
+
+
+
+ );
+}
+
+export default R.compose(withSubscriptionPlansActions)(SetupSubscription);
diff --git a/packages/webapp/src/containers/Setup/SetupSubscription/SetupSubscriptionForm.tsx b/packages/webapp/src/containers/Setup/SetupSubscription/SetupSubscriptionForm.tsx
deleted file mode 100644
index 52eed3f5f..000000000
--- a/packages/webapp/src/containers/Setup/SetupSubscription/SetupSubscriptionForm.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-// @ts-nocheck
-import { Form } from 'formik';
-import SubscriptionPlansSection from './SubscriptionPlansSection';
-import SubscriptionPeriodsSection from './SubscriptionPeriodsSection';
-import { Button, Intent } from '@blueprintjs/core';
-import { T } from '@/components';
-
-function StepSubscriptionActions() {
- return (
-
-
-
- );
-}
-
-export default function SetupSubscriptionForm() {
- return (
-
- );
-}
diff --git a/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPaymentsMethodsSection.tsx b/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPaymentsMethodsSection.tsx
deleted file mode 100644
index 811d00f20..000000000
--- a/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPaymentsMethodsSection.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-// @ts-nocheck
-import React from 'react';
-import { T } from '@/components';
-
-import { PaymentMethodTabs } from '../../Subscriptions/SubscriptionTabs';
-
-export default ({ formik, title, description }) => {
- return (
-
- );
-};
diff --git a/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPeriodsSection.tsx b/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPeriodsSection.tsx
deleted file mode 100644
index 3a5e66a87..000000000
--- a/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPeriodsSection.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-// @ts-nocheck
-import React from 'react';
-import { Field } from 'formik';
-import * as R from 'ramda';
-
-import { T, SubscriptionPeriods } from '@/components';
-
-import withPlan from '../../Subscriptions/withPlan';
-
-const SubscriptionPeriodsEnhanced = R.compose(
- withPlan(({ plan }) => ({ plan })),
-)(({ plan, ...restProps }) => {
- // Can't continue if the current plan of the form not selected.
- if (!plan) {
- return null;
- }
- return ;
-});
-
-/**
- * Billing periods.
- */
-export default function SubscriptionPeriodsSection() {
- return (
-
-
-
-
-
-
-
- {({ form: { setFieldValue, values }, field: { value } }) => (
- {
- setFieldValue('period', period);
- }}
- />
- )}
-
-
- );
-}
diff --git a/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPlan.tsx b/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPlan.tsx
new file mode 100644
index 000000000..403ce8465
--- /dev/null
+++ b/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPlan.tsx
@@ -0,0 +1,78 @@
+// @ts-nocheck
+import { AppToaster, Group, T } from '@/components';
+import { useGetLemonSqueezyCheckout } from '@/hooks/query';
+import { Intent } from '@blueprintjs/core';
+import { PricingPlan } from '@/components/PricingPlan/PricingPlan';
+
+interface SubscriptionPricingProps {
+ slug: string;
+ label: string;
+ description: string;
+ features?: Array;
+ featured?: boolean;
+ price: string;
+ pricePeriod: string;
+}
+
+function SubscriptionPricing({
+ featured,
+ label,
+ description,
+ features,
+ price,
+ pricePeriod,
+}: SubscriptionPricingProps) {
+ const { mutateAsync: getLemonCheckout, isLoading } =
+ useGetLemonSqueezyCheckout();
+
+ const handleClick = () => {
+ getLemonCheckout({ variantId: '337977' })
+ .then((res) => {
+ const checkoutUrl = res.data.data.attributes.url;
+ window.LemonSqueezy.Url.Open(checkoutUrl);
+ })
+ .catch(() => {
+ AppToaster.show({
+ message: 'Something went wrong!',
+ intent: Intent.DANGER,
+ });
+ });
+ };
+
+ return (
+
+ {featured && Most Popular}
+
+
+
+
+ Subscribe
+
+
+
+ {features?.map((feature) => (
+ {feature}
+ ))}
+
+
+ );
+}
+
+export function SubscriptionPlans({ plans }) {
+ return (
+
+ {plans.map((plan, index) => (
+
+ ))}
+
+ );
+}
diff --git a/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPlansSection.tsx b/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPlansSection.tsx
index 14adf9b18..5ccd83fc2 100644
--- a/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPlansSection.tsx
+++ b/packages/webapp/src/containers/Setup/SetupSubscription/SubscriptionPlansSection.tsx
@@ -1,42 +1,25 @@
// @ts-nocheck
-import React from 'react';
-import { Field } from 'formik';
+import { T } from '@/components';
-import { T, SubscriptionPlans } from '@/components';
-
-import { compose } from '@/utils';
+import { SubscriptionPlans } from './SubscriptionPlan';
import withPlans from '../../Subscriptions/withPlans';
+import { compose } from '@/utils';
/**
* Billing plans.
*/
-function SubscriptionPlansSection({ plans }) {
+function SubscriptionPlansSectionRoot({ plans }) {
return (
-
-
-
-
-
+
+
+
+
-
- {({ form: { setFieldValue }, field: { value } }) => (
- {
- setFieldValue('plan_slug', value);
- }}
- />
- )}
-
+
);
}
-export default compose(withPlans(({ plans }) => ({ plans })))(
- SubscriptionPlansSection,
-);
+export const SubscriptionPlansSection = compose(
+ withPlans(({ plans }) => ({ plans })),
+)(SubscriptionPlansSectionRoot);
diff --git a/packages/webapp/src/containers/Setup/SetupWizardContent.module.scss b/packages/webapp/src/containers/Setup/SetupWizardContent.module.scss
new file mode 100644
index 000000000..b8c654451
--- /dev/null
+++ b/packages/webapp/src/containers/Setup/SetupWizardContent.module.scss
@@ -0,0 +1,3 @@
+.items {
+ padding: 40px 40px 20px;
+}
\ No newline at end of file
diff --git a/packages/webapp/src/containers/Setup/SetupWizardContent.tsx b/packages/webapp/src/containers/Setup/SetupWizardContent.tsx
index 57b162ccf..58d7726c1 100644
--- a/packages/webapp/src/containers/Setup/SetupWizardContent.tsx
+++ b/packages/webapp/src/containers/Setup/SetupWizardContent.tsx
@@ -1,30 +1,50 @@
// @ts-nocheck
import React from 'react';
-import SetupSteps from './SetupSteps';
-import WizardSetupSteps from './WizardSetupSteps';
-
-import SetupSubscription from './SetupSubscription';
+import SetupSubscription from './SetupSubscription/SetupSubscription';
import SetupOrganizationPage from './SetupOrganizationPage';
import SetupInitializingForm from './SetupInitializingForm';
import SetupCongratsPage from './SetupCongratsPage';
+import { Stepper } from '@/components/Stepper';
+import styles from './SetupWizardContent.module.scss';
+
+interface SetupWizardContentProps {
+ stepIndex: number;
+ stepId: string;
+}
/**
* Setup wizard content.
*/
-export default function SetupWizardContent({ setupStepIndex, setupStepId }) {
+export default function SetupWizardContent({
+ stepIndex,
+ stepId,
+}: SetupWizardContentProps) {
return (
-
+
+
+
+
-
-
-
+
+
+
+
+
+
+
-
-
+
+
);
}
diff --git a/packages/webapp/src/hooks/query/subscriptions.tsx b/packages/webapp/src/hooks/query/subscriptions.tsx
index c81e78cc6..b045428c3 100644
--- a/packages/webapp/src/hooks/query/subscriptions.tsx
+++ b/packages/webapp/src/hooks/query/subscriptions.tsx
@@ -45,7 +45,7 @@ export const useOrganizationSubscriptions = (props) => {
};
/**
- * Fetches the checkout url of the lemon squeezy.
+ * Fetches the checkout url of the Lemon Squeezy.
*/
export const useGetLemonSqueezyCheckout = (props = {}) => {
const apiRequest = useApiRequest();
diff --git a/packages/webapp/src/icons/CheckCircled.tsx b/packages/webapp/src/icons/CheckCircled.tsx
new file mode 100644
index 000000000..c763cf6c1
--- /dev/null
+++ b/packages/webapp/src/icons/CheckCircled.tsx
@@ -0,0 +1,26 @@
+import * as React from 'react';
+
+interface Props extends React.SVGProps {
+ height: number;
+ width: number;
+}
+
+export const CheckCircled = ({ width, height, ...props }: Props) => (
+
+);
diff --git a/packages/webapp/src/routes/dashboard.tsx b/packages/webapp/src/routes/dashboard.tsx
index 976c0d035..8f1122bae 100644
--- a/packages/webapp/src/routes/dashboard.tsx
+++ b/packages/webapp/src/routes/dashboard.tsx
@@ -1093,13 +1093,6 @@ export const getDashboardRoutes = () => [
subscriptionActive: [SUBSCRIPTION_TYPE.MAIN],
},
- // Subscription billing.
- {
- path: `/billing`,
- component: lazy(() => import('@/containers/Subscriptions/BillingForm')),
- breadcrumb: intl.get('new_billing'),
- subscriptionInactive: [SUBSCRIPTION_TYPE.MAIN],
- },
// Payment modes.
{
path: `/payment-mades/import`,
diff --git a/packages/webapp/src/store/organizations/withSetupWizard.tsx b/packages/webapp/src/store/organizations/withSetupWizard.tsx
index 7f39a2466..298a11c14 100644
--- a/packages/webapp/src/store/organizations/withSetupWizard.tsx
+++ b/packages/webapp/src/store/organizations/withSetupWizard.tsx
@@ -26,7 +26,7 @@ export default (mapState) => {
const mapped = {
...condits,
setupStepId: setupStep?.step,
- setupStepIndex: scenarios.indexOf(setupStep) + 1,
+ setupStepIndex: scenarios.indexOf(setupStep),
};
return mapState ? mapState(mapped, state, props) : mapped;
};
diff --git a/packages/webapp/src/store/plans/plans.reducer.tsx b/packages/webapp/src/store/plans/plans.reducer.tsx
index a5b3bb4bc..9f278de98 100644
--- a/packages/webapp/src/store/plans/plans.reducer.tsx
+++ b/packages/webapp/src/store/plans/plans.reducer.tsx
@@ -3,22 +3,13 @@ import { createReducer } from '@reduxjs/toolkit';
import intl from 'react-intl-universal';
import t from '@/store/types';
-const getSubscriptionPeriods = () => [
- {
- slug: 'month',
- label: intl.get('plan.monthly'),
- },
- {
- slug: 'year',
- label: intl.get('plan.yearly'),
- },
-];
-
const getSubscriptionPlans = () => [
{
name: intl.get('plan.capital_basic.title'),
slug: 'capital_basic',
- description: [
+ description:
+ 'Manage recurring and one-time billing, including subscriptions and invoices.',
+ features: [
intl.get('plan.feature.sales_invoices'),
intl.get('plan.feature.sales_estimates'),
intl.get('plan.feature.customers'),
@@ -27,25 +18,15 @@ const getSubscriptionPlans = () => [
intl.get('plan.feature.expenses_tracking'),
intl.get('plan.feature.basic_financial_reports'),
],
- price: '55',
- periods: [
- {
- slug: 'month',
- label: intl.get('plan.monthly'),
- price: '55',
- },
- {
- slug: 'year',
- label: intl.get('plan.yearly'),
- price: '595',
- },
- ],
- currencyCode: 'LYD',
+ price: '$29',
+ pricePeriod: 'Per Year',
},
{
name: intl.get('plan.capital_plus.title'),
slug: 'capital_plus',
- description: [
+ description:
+ 'Manage recurring and one-time billing, including subscriptions and invoices.',
+ features: [
intl.get('plan.feature.all_capital_basic'),
intl.get('plan.feature.predefined_user_roles'),
intl.get('plan.feature.custom_tables_views'),
@@ -53,25 +34,16 @@ const getSubscriptionPlans = () => [
intl.get('plan.feature.plus_financial_reports'),
intl.get('plan.feature.custom_fields_resources'),
],
- price: '75',
- periods: [
- {
- slug: 'month',
- label: intl.get('plan.monthly'),
- price: '75',
- },
- {
- slug: 'year',
- label: intl.get('plan.yearly'),
- price: '795',
- },
- ],
- currencyCode: 'LYD',
+ price: '$29',
+ pricePeriod: 'Per Year',
+ featured: true,
},
{
name: intl.get('plan.essential.title'),
slug: 'essentials',
- description: [
+ description:
+ 'Manage recurring and one-time billing, including subscriptions and invoices.',
+ features: [
intl.get('plan.feature.all_capital_plus'),
intl.get('plan.feature.sales_purchases_order'),
intl.get('plan.feature.purchase_invoices'),
@@ -81,47 +53,35 @@ const getSubscriptionPlans = () => [
intl.get('plan.feature.inventory_reports'),
intl.get('plan.feature.landed_cost'),
],
- price: '95',
- periods: [
- {
- slug: 'month',
- label: intl.get('plan.monthly'),
- price: '95',
- },
- {
- slug: 'year',
- label: intl.get('plan.yearly'),
- price: '995',
- },
- ],
- currencyCode: 'LYD',
- },
- {
- name: intl.get('plan.capital_enterprise.title'),
- slug: 'enterprise',
- description: [
- intl.get('plan.feature.all_capital_essential'),
- intl.get('plan.feature.multiply_branches'),
- intl.get('plan.feature.multiply_warehouses'),
- intl.get('plan.feature.accounting_dimensions'),
- intl.get('plan.feature.warehouses_reports'),
- intl.get('plan.feature.branches_reports'),
- ],
- price: '120',
- currencyCode: 'LYD',
- periods: [
- {
- slug: 'month',
- label: intl.get('plan.monthly'),
- price: '120',
- },
- {
- slug: 'year',
- label: intl.get('plan.yearly'),
- price: '1,195',
- },
- ],
+ price: '$29',
+ pricePeriod: 'Per Year',
},
+ // {
+ // name: intl.get('plan.capital_enterprise.title'),
+ // slug: 'enterprise',
+ // description: [
+ // intl.get('plan.feature.all_capital_essential'),
+ // intl.get('plan.feature.multiply_branches'),
+ // intl.get('plan.feature.multiply_warehouses'),
+ // intl.get('plan.feature.accounting_dimensions'),
+ // intl.get('plan.feature.warehouses_reports'),
+ // intl.get('plan.feature.branches_reports'),
+ // ],
+ // price: '120',
+ // currencyCode: 'LYD',
+ // periods: [
+ // {
+ // slug: 'month',
+ // label: intl.get('plan.monthly'),
+ // price: '120',
+ // },
+ // {
+ // slug: 'year',
+ // label: intl.get('plan.yearly'),
+ // price: '1,195',
+ // },
+ // ],
+ // },
];
const initialState = {
@@ -135,9 +95,7 @@ export default createReducer(initialState, {
*/
[t.INIT_SUBSCRIPTION_PLANS]: (state) => {
const plans = getSubscriptionPlans();
- const periods = getSubscriptionPeriods();
state.plans = plans;
- state.periods = periods;
},
});
diff --git a/packages/webapp/src/style/pages/Setup/SetupPage.scss b/packages/webapp/src/style/pages/Setup/SetupPage.scss
index 09dd37b00..9ef61f2e9 100644
--- a/packages/webapp/src/style/pages/Setup/SetupPage.scss
+++ b/packages/webapp/src/style/pages/Setup/SetupPage.scss
@@ -16,7 +16,7 @@
max-width: 600px;
min-width: 600px;
- @media only screen and (max-width: 1200px) {
+ @media only screen and (max-width: 1500px) {
min-width: 500px;
max-width: 500px;
}
@@ -54,7 +54,7 @@
top: 0;
width: 600px;
- @media only screen and (max-width: 1200px) {
+ @media only screen and (max-width: 1500px) {
width: 500px;
}
@media only screen and (max-width: 1024px) {
@@ -99,6 +99,7 @@
&__organization {
font-size: 16px;
opacity: 0.75;
+ margin-top: 2.4rem;
span>a {
text-decoration: underline;
@@ -108,17 +109,8 @@
}
}
- &__divider {
- height: 1px;
- width: 60%;
- background: rgba(255, 255, 255, 0.25);
- margin: 18px 0;
- }
-
&__footer {
margin-top: auto;
- border-top: 1px solid rgba(255, 255, 255, 0.25);
- padding-top: 20px;
}
&__links {
diff --git a/packages/webapp/src/style/pages/Setup/Subscription.scss b/packages/webapp/src/style/pages/Setup/Subscription.scss
index 3a8f0b5af..7a5385879 100644
--- a/packages/webapp/src/style/pages/Setup/Subscription.scss
+++ b/packages/webapp/src/style/pages/Setup/Subscription.scss
@@ -1,6 +1,5 @@
.setup-subscription-form{
margin: 0 auto;
- padding: 0 80px;
- margin-top: 40px;
+ padding: 0 40px;
}
diff --git a/packages/webapp/src/style/pages/Subscription/BillingPlans.scss b/packages/webapp/src/style/pages/Subscription/BillingPlans.scss
deleted file mode 100644
index 01bc82922..000000000
--- a/packages/webapp/src/style/pages/Subscription/BillingPlans.scss
+++ /dev/null
@@ -1,73 +0,0 @@
-
-.billing-plans{
- max-width: 753px;
- .paragraph{
- font-size: 15px;
- }
-
- &__section{
- margin-bottom: 40px;
-
- .title{
- font-size: 20px;
- font-weight: 600;
- color: #6b7382;
- margin-top: 0;
- margin-bottom: 12px;
- }
- .bp4-tab-list {
- border-bottom: 2px solid #e6e6e6;
- width: 95%;
-
- .bp4-tab-indicator-wrapper .bp4-tab-indicator{
- bottom: -2px;
- }
- }
- .bp4-tab-panel{
- margin-top: 26px;
- }
- .subscribe-button {
- .bp4-button {
- background-color: #0063ff;
- min-height: 41px;
- width: 240px;
- }
- }
- .plan-radios,
- .plan-periods{
- margin-top: 20px;
- }
- }
-
- .license-container {
-
- .bp4-button{
- margin-top: 14px;
- padding: 0 30px;
- }
- .form-group-license_code{
- margin-top: 20px;
- }
- .bp4-form-content {
- .bp4-input-group {
- display: block;
- position: relative;
- }
- .bp4-input {
- position: relative;
- width: 59%;
- height: 41px;
- }
- }
- h4 {
- font-size: 18px;
- font-weight: 400;
- color: #444444;
- }
- p {
- margin-top: 15px;
- font-size: 14px;
- }
- }
-
-}
diff --git a/packages/webapp/src/style/pages/Subscription/PlanPeriodRadio.scss b/packages/webapp/src/style/pages/Subscription/PlanPeriodRadio.scss
deleted file mode 100644
index 2332f71a6..000000000
--- a/packages/webapp/src/style/pages/Subscription/PlanPeriodRadio.scss
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-// Plan period radio component.
-// ---------------------
-.period-radios{
- display: flex;
-}
-.period-radio{
- display: inline-flex;
- background-color: #fcfdff;
- justify-content: space-between;
- align-items: center;
- width: 240px;
- height: 36px;
- border-radius: 5px;
- padding: 8px 10px;
- color: #000;
- border: 1px solid #dcdcdc;
- cursor: pointer;
- text-decoration: none;
-
- &.is-selected {
- border: 1px solid #0069ff;
- background-color: #fcfdff;
- }
- &:not(:first-child) {
- margin-left: 20px;
- }
- &__amount{
- font-weight: 600;
- }
- &__period{
- color: #2f3863;
- font-size: 14px;
- font-weight: 500;
-
- &::before {
- content: '/';
- display: inline-block;
- margin: 0 2px;
- }
- }
-}
diff --git a/packages/webapp/src/style/pages/Subscription/PlanRadio.scss b/packages/webapp/src/style/pages/Subscription/PlanRadio.scss
deleted file mode 100644
index bd0c714f3..000000000
--- a/packages/webapp/src/style/pages/Subscription/PlanRadio.scss
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-// Plan radio component.
-// ---------------------
-.plan-radios{
- display: flex;
-}
-.plan-radio {
- display: flex;
- flex-direction: column;
- width: 215px;
- min-height: 277px;
- border-radius: 5px;
- padding: 15px;
- border: 1px solid #dcdcdc;
- background: #fcfdff;
- text-decoration: none;
- color: #000;
- cursor: pointer;
-
- &.is-selected {
- border: 1px solid #0069ff;
- background-color: #fcfdff;
- }
- &:not(:first-child) {
- margin-left: 20px;
- }
- &__header {
- display: flex;
- justify-content: flex-start;
- }
- &__name {
- background: #3657ff;
- border-radius: 3px;
- padding: 2px 10px;
- font-size: 13px;
- color: #fff;
- margin-bottom: 18px;
- height: 21px;
- text-transform: uppercase;
- }
- &__description {
- font-size: 14px;
- font-weight: 400;
-
- ul {
- list-style: none;
-
- li{
- position: relative;
- padding-left: 12px;
- margin-bottom: 9px;
-
- &:before{
- content: '-';
- position: absolute;
- left: 0;
- opacity: 0.6;
- }
- }
- }
- }
- &__price {
- margin-top: auto;
- font-size: 15px;
- padding-top: 10px;
- }
- &__amount {
- font-weight: 600;
- }
- &__period {
- font-weight: 400;
- color: #2f3863;
-
- &::before {
- content: '/';
- display: inline-block;
- margin: 0 2px;
- }
- }
-}
\ No newline at end of file