diff --git a/site-popup/template/src/backend/api/instance/api.ts b/site-popup/template/src/backend/api/instance/api.ts new file mode 100644 index 0000000..a2d126d --- /dev/null +++ b/site-popup/template/src/backend/api/instance/api.ts @@ -0,0 +1,14 @@ +import { auth } from "@wix/essentials"; +import { appInstances } from "@wix/app-management"; + +export async function GET() { + try { + const { instance: appInstance } = await auth.elevate( + appInstances.getAppInstance + )(); + + return Response.json(appInstance); + } catch (error) { + return new Response("Failed to fetch app instance", { status: 500 }); + } +} diff --git a/site-popup/template/src/components/activation-configuration.tsx b/site-popup/template/src/components/activation-configuration.tsx index e5ef4e6..9a9d3bc 100644 --- a/site-popup/template/src/components/activation-configuration.tsx +++ b/site-popup/template/src/components/activation-configuration.tsx @@ -6,15 +6,18 @@ import { DataRangePicker } from './date-range-picker.js'; interface Props { activationOptions: ActivationOptions; onChange: (activationOptions: ActivationOptions) => void; + disabled?: boolean; } export const ActivationConfiguration: FC = ({ onChange, activationOptions, + disabled = false, }) => { return ( = ({ {activationOptions.activationMode == 'timed' && ( void; + disabled?: boolean; } export const DataRangePicker: FC = ({ - onChange, startDate, endDate, + onChange, + disabled = false, }) => { return ( @@ -21,6 +23,7 @@ export const DataRangePicker: FC = ({ onChange?.(value.getTime(), endDate)} /> @@ -35,6 +38,7 @@ export const DataRangePicker: FC = ({ onChange?.(startDate, value.getTime()) diff --git a/site-popup/template/src/components/image-picker.tsx b/site-popup/template/src/components/image-picker.tsx index 785eec1..4607fbd 100644 --- a/site-popup/template/src/components/image-picker.tsx +++ b/site-popup/template/src/components/image-picker.tsx @@ -7,13 +7,15 @@ interface Props { imageUrl: string; imageTitle: string; onChange: (imageUrl: string, imageTitle: string) => void; + disabled?: boolean; } -export const ImagePicker: FC = ({ onChange, imageTitle }) => { +export const ImagePicker: FC = ({ onChange, imageTitle, disabled = false }) => { return ( } onClick={() => dashboard.openMediaManager().then((response) => { diff --git a/site-popup/template/src/components/site-popup-settings.tsx b/site-popup/template/src/components/site-popup-settings.tsx index 180ec7d..9554965 100644 --- a/site-popup/template/src/components/site-popup-settings.tsx +++ b/site-popup/template/src/components/site-popup-settings.tsx @@ -8,9 +8,11 @@ import { FormField, FormFieldProps, } from '@wix/design-system'; -import { SitePopupOptions } from '../types.js'; -import { ActivationConfiguration } from './activation-configuration.js'; -import { ImagePicker } from './image-picker.js'; +import { SitePopupOptions } from '../types'; +import { ActivationConfiguration } from './activation-configuration'; +import { ImagePicker } from './image-picker'; +import { SubscriptionBanner } from './subscription-banner'; +import { useAppInstance } from '../hooks/instance'; interface Props { options: SitePopupOptions; @@ -18,6 +20,8 @@ interface Props { } export const SitePopupSettings: FC = ({ options, onChange }) => { + const { data: appInstance } = useAppInstance(); + const getFieldStatus = ( field: keyof SitePopupOptions ): Partial => { @@ -43,7 +47,7 @@ export const SitePopupSettings: FC = ({ options, onChange }) => { /> - + = ({ options, onChange }) => { {...getFieldStatus('headline')} > @@ -72,6 +77,7 @@ export const SitePopupSettings: FC = ({ options, onChange }) => { {...getFieldStatus('text')} > @@ -84,6 +90,7 @@ export const SitePopupSettings: FC = ({ options, onChange }) => { = ({ options, onChange }) => { @@ -111,6 +119,9 @@ export const SitePopupSettings: FC = ({ options, onChange }) => { /> + + + diff --git a/site-popup/template/src/components/subscription-banner.tsx b/site-popup/template/src/components/subscription-banner.tsx new file mode 100644 index 0000000..891e4a0 --- /dev/null +++ b/site-popup/template/src/components/subscription-banner.tsx @@ -0,0 +1,61 @@ +import { Box, Button, MarketingLayout, SectionHelper } from '@wix/design-system'; +import React from 'react'; +import { useNavigateToPricingPage, useAppInstance } from '../hooks/instance'; +import { appInstances } from '@wix/app-management'; +import { formatDate } from '../utils/format-date'; + +export const SubscriptionBanner: React.FC = () => { + const {data: appInstance } = useAppInstance(); + const navigateToPricingPage = useNavigateToPricingPage(); + const { isFree, freeTrialAvailable, billing } = appInstance ?? {}; + const isFreeTrialInProgress = billing?.freeTrialInfo?.status === appInstances.FreeTrialStatus.IN_PROGRESS; + + const trialButtons = ( + +