diff --git a/inventory-countdown/template/package.json.ejs b/inventory-countdown/template/package.json.ejs index 7d7091a..e792615 100644 --- a/inventory-countdown/template/package.json.ejs +++ b/inventory-countdown/template/package.json.ejs @@ -5,8 +5,11 @@ to: package.json "name": "<%= packageName %>", "version": "1.0.0", "dependencies": { + "@tanstack/react-query": "^4.36.1", + "@wix/app-management": "^1.0.0", "@wix/dashboard": "^1.3.21", "@wix/design-system": "^1.0.0", + "@wix/essentials": "^0.1.4", "@wix/editor": "^1.308.0", "@wix/site-window": "^1.19.0", "@wix/stores": "^1.0.239", diff --git a/inventory-countdown/template/src/backend/api/instance/api.ts b/inventory-countdown/template/src/backend/api/instance/api.ts new file mode 100644 index 0000000..e1f287f --- /dev/null +++ b/inventory-countdown/template/src/backend/api/instance/api.ts @@ -0,0 +1,15 @@ +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) { + console.error("Failed to fetch app instance:", error); + return new Response("Failed to fetch app instance", { status: 500 }); + } +} diff --git a/inventory-countdown/template/src/hooks/instance.ts b/inventory-countdown/template/src/hooks/instance.ts new file mode 100644 index 0000000..4061f4f --- /dev/null +++ b/inventory-countdown/template/src/hooks/instance.ts @@ -0,0 +1,40 @@ +import { useCallback } from 'react'; +import { appInstances } from '@wix/app-management'; +import { useQuery } from '@tanstack/react-query'; +import { httpClient } from '@wix/essentials'; + +/* + This is the URL to the pricing page of the app. + This url looks like this: + https://www.wix.com/apps/upgrade/APPIDHERE?appInstanceId=INSTANCEIDHERE + + You can find more information about this here: + https://dev.wix.com/docs/build-apps/launch-your-app/pricing-and-billing/set-up-a-freemium-business-model#step-4--create-an-upgrade-entry-point-to-your-pricing-page +*/ +const getPricingPage = (instanceId: string) => `https://www.wix.com/apps/upgrade/<%= devCenter.appId %>?appInstanceId=${instanceId}` + +export const QUERY_INSTANCE = 'queryInstance'; + +export function useAppInstance() { + return useQuery({ + queryKey: [QUERY_INSTANCE], + queryFn: async () => { + try { + const response = await httpClient.fetchWithAuth( + `${import.meta.env.BASE_API_URL}/instance` + ); + return response.json(); + } catch (error) { + console.log("Error fetching instance:", error); + } + }, + }); +} + +export function useNavigateToPricingPage(instance: appInstances.AppInstance): () => void { + return useCallback(() => { + if (instance?.instanceId) { + window.open(getPricingPage(instance?.instanceId), "_blank"); + } + }, [instance?.instanceId]); +} diff --git a/inventory-countdown/template/src/site/plugins/custom-elements/stock-counter/components/banner.tsx b/inventory-countdown/template/src/site/plugins/custom-elements/stock-counter/components/banner.tsx new file mode 100644 index 0000000..d85b5d9 --- /dev/null +++ b/inventory-countdown/template/src/site/plugins/custom-elements/stock-counter/components/banner.tsx @@ -0,0 +1,42 @@ +import { Box, Text, Button, SectionHelper, SectionHelperAppearance, ButtonSkin } from '@wix/design-system'; +import React from 'react'; + +export interface BannerProps { + appearance?: SectionHelperAppearance; + title: string; + description: string; + action?: string; + actionSkin?: ButtonSkin; + onActionClick?: () => void; +} + +export const Banner: React.FC = ({ + appearance, + title, + description, + action, + actionSkin, + onActionClick +}) => { + return ( + + + + {description} + {action && ( +