diff --git a/packages/app-store/apps.browser.generated.tsx b/packages/app-store/apps.browser.generated.tsx index c8da389854..ae5d69c244 100644 --- a/packages/app-store/apps.browser.generated.tsx +++ b/packages/app-store/apps.browser.generated.tsx @@ -45,6 +45,7 @@ export const EventTypeAddonMap = { "event-type-app-card": dynamic(() => import("./templates/event-type-app-card/components/EventTypeAppCardInterface") ), + twipla: dynamic(() => import("./twipla/components/EventTypeAppCardInterface")), "zoho-bigin": dynamic(() => import("./zoho-bigin/components/EventTypeAppCardInterface")), zohocrm: dynamic(() => import("./zohocrm/components/EventTypeAppCardInterface")), }; diff --git a/packages/app-store/apps.keys-schemas.generated.ts b/packages/app-store/apps.keys-schemas.generated.ts index a0ff0351c8..3b45ab4a62 100644 --- a/packages/app-store/apps.keys-schemas.generated.ts +++ b/packages/app-store/apps.keys-schemas.generated.ts @@ -36,6 +36,7 @@ import { appKeysSchema as stripepayment_zod_ts } from "./stripepayment/zod"; import { appKeysSchema as tandemvideo_zod_ts } from "./tandemvideo/zod"; import { appKeysSchema as booking_pages_tag_zod_ts } from "./templates/booking-pages-tag/zod"; import { appKeysSchema as event_type_app_card_zod_ts } from "./templates/event-type-app-card/zod"; +import { appKeysSchema as twipla_zod_ts } from "./twipla/zod"; import { appKeysSchema as vital_zod_ts } from "./vital/zod"; import { appKeysSchema as webex_zod_ts } from "./webex/zod"; import { appKeysSchema as wordpress_zod_ts } from "./wordpress/zod"; @@ -80,6 +81,7 @@ export const appKeysSchemas = { tandemvideo: tandemvideo_zod_ts, "booking-pages-tag": booking_pages_tag_zod_ts, "event-type-app-card": event_type_app_card_zod_ts, + twipla: twipla_zod_ts, vital: vital_zod_ts, webex: webex_zod_ts, wordpress: wordpress_zod_ts, diff --git a/packages/app-store/apps.metadata.generated.ts b/packages/app-store/apps.metadata.generated.ts index 3d50e9d954..407d824b50 100644 --- a/packages/app-store/apps.metadata.generated.ts +++ b/packages/app-store/apps.metadata.generated.ts @@ -75,6 +75,7 @@ import event_type_app_card_config_json from "./templates/event-type-app-card/con import event_type_location_video_static_config_json from "./templates/event-type-location-video-static/config.json"; import general_app_settings_config_json from "./templates/general-app-settings/config.json"; import link_as_an_app_config_json from "./templates/link-as-an-app/config.json"; +import twipla_config_json from "./twipla/config.json"; import typeform_config_json from "./typeform/config.json"; import vimcal_config_json from "./vimcal/config.json"; import { metadata as vital__metadata_ts } from "./vital/_metadata"; @@ -164,6 +165,7 @@ export const appStoreMetadata = { "event-type-location-video-static": event_type_location_video_static_config_json, "general-app-settings": general_app_settings_config_json, "link-as-an-app": link_as_an_app_config_json, + twipla: twipla_config_json, typeform: typeform_config_json, vimcal: vimcal_config_json, vital: vital__metadata_ts, diff --git a/packages/app-store/apps.schemas.generated.ts b/packages/app-store/apps.schemas.generated.ts index 8dc309c1f2..ab725ddb25 100644 --- a/packages/app-store/apps.schemas.generated.ts +++ b/packages/app-store/apps.schemas.generated.ts @@ -36,6 +36,7 @@ import { appDataSchema as stripepayment_zod_ts } from "./stripepayment/zod"; import { appDataSchema as tandemvideo_zod_ts } from "./tandemvideo/zod"; import { appDataSchema as booking_pages_tag_zod_ts } from "./templates/booking-pages-tag/zod"; import { appDataSchema as event_type_app_card_zod_ts } from "./templates/event-type-app-card/zod"; +import { appDataSchema as twipla_zod_ts } from "./twipla/zod"; import { appDataSchema as vital_zod_ts } from "./vital/zod"; import { appDataSchema as webex_zod_ts } from "./webex/zod"; import { appDataSchema as wordpress_zod_ts } from "./wordpress/zod"; @@ -80,6 +81,7 @@ export const appDataSchemas = { tandemvideo: tandemvideo_zod_ts, "booking-pages-tag": booking_pages_tag_zod_ts, "event-type-app-card": event_type_app_card_zod_ts, + twipla: twipla_zod_ts, vital: vital_zod_ts, webex: webex_zod_ts, wordpress: wordpress_zod_ts, diff --git a/packages/app-store/apps.server.generated.ts b/packages/app-store/apps.server.generated.ts index 39080ff8aa..14aa4a5884 100644 --- a/packages/app-store/apps.server.generated.ts +++ b/packages/app-store/apps.server.generated.ts @@ -75,6 +75,7 @@ export const apiHandlers = { "event-type-location-video-static": import("./templates/event-type-location-video-static/api"), "general-app-settings": import("./templates/general-app-settings/api"), "link-as-an-app": import("./templates/link-as-an-app/api"), + twipla: import("./twipla/api"), typeform: import("./typeform/api"), vimcal: import("./vimcal/api"), vital: import("./vital/api"), diff --git a/packages/app-store/bookerApps.metadata.generated.ts b/packages/app-store/bookerApps.metadata.generated.ts index 0fb4826358..5c226e0a8a 100644 --- a/packages/app-store/bookerApps.metadata.generated.ts +++ b/packages/app-store/bookerApps.metadata.generated.ts @@ -35,6 +35,7 @@ import { metadata as tandemvideo__metadata_ts } from "./tandemvideo/_metadata"; import telegram_config_json from "./telegram/config.json"; import booking_pages_tag_config_json from "./templates/booking-pages-tag/config.json"; import event_type_location_video_static_config_json from "./templates/event-type-location-video-static/config.json"; +import twipla_config_json from "./twipla/config.json"; import webex_config_json from "./webex/config.json"; import whatsapp_config_json from "./whatsapp/config.json"; import whereby_config_json from "./whereby/config.json"; @@ -74,6 +75,7 @@ export const appStoreMetadata = { telegram: telegram_config_json, "booking-pages-tag": booking_pages_tag_config_json, "event-type-location-video-static": event_type_location_video_static_config_json, + twipla: twipla_config_json, webex: webex_config_json, whatsapp: whatsapp_config_json, whereby: whereby_config_json, diff --git a/packages/app-store/twipla/DESCRIPTION.md b/packages/app-store/twipla/DESCRIPTION.md new file mode 100644 index 0000000000..d07280ea4c --- /dev/null +++ b/packages/app-store/twipla/DESCRIPTION.md @@ -0,0 +1,6 @@ +--- +items: + - 1.png +--- + +{DESCRIPTION} diff --git a/packages/app-store/twipla/api/add.ts b/packages/app-store/twipla/api/add.ts new file mode 100644 index 0000000000..7603de54da --- /dev/null +++ b/packages/app-store/twipla/api/add.ts @@ -0,0 +1,16 @@ +import { createDefaultInstallation } from "@calcom/app-store/_utils/installation"; +import type { AppDeclarativeHandler } from "@calcom/types/AppHandler"; + +import appConfig from "../config.json"; + +const handler: AppDeclarativeHandler = { + appType: appConfig.type, + variant: appConfig.variant, + slug: appConfig.slug, + supportsMultipleInstalls: false, + handlerType: "add", + createCredential: ({ appType, user, slug, teamId }) => + createDefaultInstallation({ appType, user: user, slug, key: {}, teamId }), +}; + +export default handler; diff --git a/packages/app-store/twipla/api/index.ts b/packages/app-store/twipla/api/index.ts new file mode 100644 index 0000000000..4c0d2ead01 --- /dev/null +++ b/packages/app-store/twipla/api/index.ts @@ -0,0 +1 @@ +export { default as add } from "./add"; diff --git a/packages/app-store/twipla/components/EventTypeAppCardInterface.tsx b/packages/app-store/twipla/components/EventTypeAppCardInterface.tsx new file mode 100644 index 0000000000..286cf1e2f2 --- /dev/null +++ b/packages/app-store/twipla/components/EventTypeAppCardInterface.tsx @@ -0,0 +1,35 @@ +import { useAppContextWithSchema } from "@calcom/app-store/EventTypeAppContext"; +import AppCard from "@calcom/app-store/_components/AppCard"; +import useIsAppEnabled from "@calcom/app-store/_utils/useIsAppEnabled"; +import type { EventTypeAppCardComponent } from "@calcom/app-store/types"; +import { TextField } from "@calcom/ui"; + +import type { appDataSchema } from "../zod"; + +const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({ app, eventType }) { + const { getAppData, setAppData, disabled } = useAppContextWithSchema(); + const siteId = getAppData("SITE_ID"); + const { enabled, updateEnabled } = useIsAppEnabled(app); + + return ( + { + updateEnabled(e); + }} + switchChecked={enabled} + teamId={eventType.team?.id || undefined}> + { + setAppData("SITE_ID", e.target.value); + }} + /> + + ); +}; + +export default EventTypeAppCard; diff --git a/packages/app-store/twipla/config.json b/packages/app-store/twipla/config.json new file mode 100644 index 0000000000..41af295064 --- /dev/null +++ b/packages/app-store/twipla/config.json @@ -0,0 +1,25 @@ +{ + "name": "Twipla", + "slug": "twipla", + "type": "twipla_analytics", + "logo": "icon.svg", + "url": "https://cal.com/", + "variant": "analytics", + "categories": ["analytics"], + "publisher": "Cal.com, Inc.", + "email": "help@cal.com", + "description": "Twipla.com, formerly known as Visitor Analytics, is a website intelligence platform that helps you understand how visitors interact with your website.", + "extendsFeature": "EventType", + "appData": { + "tag": { + "scripts": [ + { + "content": "(function(v, i, s, a, t) {\n v[t] = v[t] || function() {\n (v[t].v = v[t].v || []).push(arguments);\n };\n if (!v._visaSettings) {\n v._visaSettings = {};\n }\n v._visaSettings[a] = {\n v: '1.0',\n s: a,\n a: '1',\n t: t\n };\n var b = i.getElementsByTagName('body')[0];\n var p = i.createElement('script');\n p.defer = 1;\n p.async = 1;\n p.src = s + '?s=' + a;\n b.appendChild(p);\n})(window, document, '//app-worker.visitor-analytics.io/main.js', '{SITE_ID}', 'va');" + } + ] + } + }, + "isTemplate": false, + "__createdUsingCli": true, + "__template": "booking-pages-tag" +} diff --git a/packages/app-store/twipla/index.ts b/packages/app-store/twipla/index.ts new file mode 100644 index 0000000000..d7f3602204 --- /dev/null +++ b/packages/app-store/twipla/index.ts @@ -0,0 +1 @@ +export * as api from "./api"; diff --git a/packages/app-store/twipla/package.json b/packages/app-store/twipla/package.json new file mode 100644 index 0000000000..b29a9ae653 --- /dev/null +++ b/packages/app-store/twipla/package.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json.schemastore.org/package.json", + "private": true, + "name": "@calcom/twipla", + "version": "0.0.0", + "main": "./index.ts", + "dependencies": { + "@calcom/lib": "*" + }, + "devDependencies": { + "@calcom/types": "*" + }, + "description": "Twipla.com, formerly known as Visitor Analytics, is a website intelligence platform that helps you understand how visitors interact with your website." +} diff --git a/packages/app-store/twipla/static/1.png b/packages/app-store/twipla/static/1.png new file mode 100644 index 0000000000..bc29949c3d Binary files /dev/null and b/packages/app-store/twipla/static/1.png differ diff --git a/packages/app-store/twipla/static/icon.svg b/packages/app-store/twipla/static/icon.svg new file mode 100644 index 0000000000..6f44ef5e8e --- /dev/null +++ b/packages/app-store/twipla/static/icon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/app-store/twipla/zod.ts b/packages/app-store/twipla/zod.ts new file mode 100644 index 0000000000..3339ccae14 --- /dev/null +++ b/packages/app-store/twipla/zod.ts @@ -0,0 +1,11 @@ +import { z } from "zod"; + +import { eventTypeAppCardZod } from "@calcom/app-store/eventTypeAppCardZod"; + +export const appDataSchema = eventTypeAppCardZod.merge( + z.object({ + SITE_ID: z.string().optional(), + }) +); + +export const appKeysSchema = z.object({});