diff --git a/packages/app-store/apps.browser.generated.tsx b/packages/app-store/apps.browser.generated.tsx index 8a16b698fb..637e206389 100644 --- a/packages/app-store/apps.browser.generated.tsx +++ b/packages/app-store/apps.browser.generated.tsx @@ -24,6 +24,7 @@ export const EventTypeAddonMap = { basecamp3: dynamic(() => import("./basecamp3/components/EventTypeAppCardInterface")), btcpayserver: dynamic(() => import("./btcpayserver/components/EventTypeAppCardInterface")), closecom: dynamic(() => import("./closecom/components/EventTypeAppCardInterface")), + databuddy: dynamic(() => import("./databuddy/components/EventTypeAppCardInterface")), fathom: dynamic(() => import("./fathom/components/EventTypeAppCardInterface")), ga4: dynamic(() => import("./ga4/components/EventTypeAppCardInterface")), giphy: dynamic(() => import("./giphy/components/EventTypeAppCardInterface")), @@ -56,6 +57,7 @@ export const EventTypeSettingsMap = { alby: dynamic(() => import("./alby/components/EventTypeAppSettingsInterface")), basecamp3: dynamic(() => import("./basecamp3/components/EventTypeAppSettingsInterface")), btcpayserver: dynamic(() => import("./btcpayserver/components/EventTypeAppSettingsInterface")), + databuddy: dynamic(() => import("./databuddy/components/EventTypeAppSettingsInterface")), fathom: dynamic(() => import("./fathom/components/EventTypeAppSettingsInterface")), ga4: dynamic(() => import("./ga4/components/EventTypeAppSettingsInterface")), giphy: dynamic(() => import("./giphy/components/EventTypeAppSettingsInterface")), diff --git a/packages/app-store/apps.keys-schemas.generated.ts b/packages/app-store/apps.keys-schemas.generated.ts index 9cf061a440..7c9ba1c9f6 100644 --- a/packages/app-store/apps.keys-schemas.generated.ts +++ b/packages/app-store/apps.keys-schemas.generated.ts @@ -7,6 +7,7 @@ import { appKeysSchema as basecamp3_zod_ts } from "./basecamp3/zod"; import { appKeysSchema as btcpayserver_zod_ts } from "./btcpayserver/zod"; import { appKeysSchema as closecom_zod_ts } from "./closecom/zod"; import { appKeysSchema as dailyvideo_zod_ts } from "./dailyvideo/zod"; +import { appKeysSchema as databuddy_zod_ts } from "./databuddy/zod"; import { appKeysSchema as dub_zod_ts } from "./dub/zod"; import { appKeysSchema as fathom_zod_ts } from "./fathom/zod"; import { appKeysSchema as feishucalendar_zod_ts } from "./feishucalendar/zod"; @@ -58,6 +59,7 @@ export const appKeysSchemas = { btcpayserver: btcpayserver_zod_ts, closecom: closecom_zod_ts, dailyvideo: dailyvideo_zod_ts, + databuddy: databuddy_zod_ts, dub: dub_zod_ts, fathom: fathom_zod_ts, feishucalendar: feishucalendar_zod_ts, diff --git a/packages/app-store/apps.metadata.generated.ts b/packages/app-store/apps.metadata.generated.ts index 2eec978348..97e29f6a35 100644 --- a/packages/app-store/apps.metadata.generated.ts +++ b/packages/app-store/apps.metadata.generated.ts @@ -18,6 +18,7 @@ import clic_config_json from "./clic/config.json"; import closecom_config_json from "./closecom/config.json"; import cron_config_json from "./cron/config.json"; import { metadata as dailyvideo__metadata_ts } from "./dailyvideo/_metadata"; +import databuddy_config_json from "./databuddy/config.json"; import deel_config_json from "./deel/config.json"; import demodesk_config_json from "./demodesk/config.json"; import dialpad_config_json from "./dialpad/config.json"; @@ -128,6 +129,7 @@ export const appStoreMetadata = { closecom: closecom_config_json, cron: cron_config_json, dailyvideo: dailyvideo__metadata_ts, + databuddy: databuddy_config_json, deel: deel_config_json, demodesk: demodesk_config_json, dialpad: dialpad_config_json, diff --git a/packages/app-store/apps.schemas.generated.ts b/packages/app-store/apps.schemas.generated.ts index f1cad4389f..be0e20e474 100644 --- a/packages/app-store/apps.schemas.generated.ts +++ b/packages/app-store/apps.schemas.generated.ts @@ -7,6 +7,7 @@ import { appDataSchema as basecamp3_zod_ts } from "./basecamp3/zod"; import { appDataSchema as btcpayserver_zod_ts } from "./btcpayserver/zod"; import { appDataSchema as closecom_zod_ts } from "./closecom/zod"; import { appDataSchema as dailyvideo_zod_ts } from "./dailyvideo/zod"; +import { appDataSchema as databuddy_zod_ts } from "./databuddy/zod"; import { appDataSchema as dub_zod_ts } from "./dub/zod"; import { appDataSchema as fathom_zod_ts } from "./fathom/zod"; import { appDataSchema as feishucalendar_zod_ts } from "./feishucalendar/zod"; @@ -58,6 +59,7 @@ export const appDataSchemas = { btcpayserver: btcpayserver_zod_ts, closecom: closecom_zod_ts, dailyvideo: dailyvideo_zod_ts, + databuddy: databuddy_zod_ts, dub: dub_zod_ts, fathom: fathom_zod_ts, feishucalendar: feishucalendar_zod_ts, diff --git a/packages/app-store/apps.server.generated.ts b/packages/app-store/apps.server.generated.ts index e9ed503560..2383fba643 100644 --- a/packages/app-store/apps.server.generated.ts +++ b/packages/app-store/apps.server.generated.ts @@ -18,6 +18,7 @@ export const apiHandlers = { clic: import("./clic/api"), closecom: import("./closecom/api"), cron: import("./cron/api"), + databuddy: import("./databuddy/api"), deel: import("./deel/api"), demodesk: import("./demodesk/api"), dialpad: import("./dialpad/api"), diff --git a/packages/app-store/bookerApps.metadata.generated.ts b/packages/app-store/bookerApps.metadata.generated.ts index c696da4f72..06ea3bf4e7 100644 --- a/packages/app-store/bookerApps.metadata.generated.ts +++ b/packages/app-store/bookerApps.metadata.generated.ts @@ -4,6 +4,7 @@ **/ import campfire_config_json from "./campfire/config.json"; import { metadata as dailyvideo__metadata_ts } from "./dailyvideo/_metadata"; +import databuddy_config_json from "./databuddy/config.json"; import demodesk_config_json from "./demodesk/config.json"; import dialpad_config_json from "./dialpad/config.json"; import discord_config_json from "./discord/config.json"; @@ -49,6 +50,7 @@ import { metadata as zoomvideo__metadata_ts } from "./zoomvideo/_metadata"; export const appStoreMetadata = { campfire: campfire_config_json, dailyvideo: dailyvideo__metadata_ts, + databuddy: databuddy_config_json, demodesk: demodesk_config_json, dialpad: dialpad_config_json, discord: discord_config_json, diff --git a/packages/app-store/databuddy/DESCRIPTION.md b/packages/app-store/databuddy/DESCRIPTION.md new file mode 100644 index 0000000000..4d678c2ea6 --- /dev/null +++ b/packages/app-store/databuddy/DESCRIPTION.md @@ -0,0 +1,8 @@ +--- +items: + - 1.png +--- + +Privacy-first web analytics for devs (Google Analytics alternative) + +Track users, not identities. Get fast, accurate insights with zero cookies and 100% GDPR compliance. diff --git a/packages/app-store/databuddy/api/add.ts b/packages/app-store/databuddy/api/add.ts new file mode 100644 index 0000000000..b998a36d08 --- /dev/null +++ b/packages/app-store/databuddy/api/add.ts @@ -0,0 +1,16 @@ +import type { AppDeclarativeHandler } from "@calcom/types/AppHandler"; + +import { createDefaultInstallation } from "../../_utils/installation"; +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/databuddy/api/index.ts b/packages/app-store/databuddy/api/index.ts new file mode 100644 index 0000000000..4c0d2ead01 --- /dev/null +++ b/packages/app-store/databuddy/api/index.ts @@ -0,0 +1 @@ +export { default as add } from "./add"; diff --git a/packages/app-store/databuddy/components/EventTypeAppCardInterface.tsx b/packages/app-store/databuddy/components/EventTypeAppCardInterface.tsx new file mode 100644 index 0000000000..4d483906f8 --- /dev/null +++ b/packages/app-store/databuddy/components/EventTypeAppCardInterface.tsx @@ -0,0 +1,39 @@ +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 type { appDataSchema } from "../zod"; +import EventTypeAppSettingsInterface from "./EventTypeAppSettingsInterface"; + +const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({ + app, + eventType, + onAppInstallSuccess, +}) { + const { getAppData, setAppData, disabled } = useAppContextWithSchema(); + + const { enabled, updateEnabled } = useIsAppEnabled(app); + + return ( + { + updateEnabled(e); + }} + switchChecked={enabled} + teamId={eventType.team?.id || undefined}> + + + ); +}; + +export default EventTypeAppCard; diff --git a/packages/app-store/databuddy/components/EventTypeAppSettingsInterface.tsx b/packages/app-store/databuddy/components/EventTypeAppSettingsInterface.tsx new file mode 100644 index 0000000000..d2da8f8cd1 --- /dev/null +++ b/packages/app-store/databuddy/components/EventTypeAppSettingsInterface.tsx @@ -0,0 +1,52 @@ +import type { EventTypeAppSettingsComponent } from "@calcom/app-store/types"; +import { TextField } from "@calcom/ui/components/form"; + +const EventTypeAppSettingsInterface: EventTypeAppSettingsComponent = ({ + getAppData, + setAppData, + disabled, + slug, +}) => { + const databuddy_script = getAppData("DATABUDDY_SCRIPT_URL"); + const databuddy_api = getAppData("DATABUDDY_API_URL"); + const client_id = getAppData("CLIENT_ID"); + + return ( +
+ { + setAppData("DATABUDDY_SCRIPT_URL", e.target.value); + }} + /> + { + setAppData("DATABUDDY_API_URL", e.target.value); + }} + /> + { + setAppData("CLIENT_ID", e.target.value); + }} + /> +
+ ); +}; + +export default EventTypeAppSettingsInterface; diff --git a/packages/app-store/databuddy/config.json b/packages/app-store/databuddy/config.json new file mode 100644 index 0000000000..b34429b782 --- /dev/null +++ b/packages/app-store/databuddy/config.json @@ -0,0 +1,29 @@ +{ + "/*": "Don't modify slug - If required, do it using cli edit command", + "name": "Databuddy", + "slug": "databuddy", + "type": "databuddy_analytics", + "logo": "icon.svg", + "url": "https://github.com/vachmara", + "variant": "analytics", + "categories": ["analytics"], + "publisher": "Valentin Chmara", + "email": "valentinchmara@gmail.com", + "extendsFeature": "EventType", + "appData": { + "tag": { + "scripts": [ + { + "src": "{DATABUDDY_SCRIPT_URL}", + "attrs": { + "data-client-id": "{CLIENT_ID}", + "data-api-url": "{DATABUDDY_API_URL}" + } + } + ] + } + }, + "description": "Privacy-first web analytics for devs (Google Analytics alternative) — 3 KB, GDPR-compliant", + "__createdUsingCli": true, + "isOAuth": false +} diff --git a/packages/app-store/databuddy/index.ts b/packages/app-store/databuddy/index.ts new file mode 100644 index 0000000000..d7f3602204 --- /dev/null +++ b/packages/app-store/databuddy/index.ts @@ -0,0 +1 @@ +export * as api from "./api"; diff --git a/packages/app-store/databuddy/package.json b/packages/app-store/databuddy/package.json new file mode 100644 index 0000000000..80dc81af35 --- /dev/null +++ b/packages/app-store/databuddy/package.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json.schemastore.org/package.json", + "private": true, + "name": "@calcom/databuddy", + "version": "0.0.0", + "main": "./index.ts", + "description": "Privacy-first web analytics for devs (Google Analytics alternative) — 3 KB, GDPR-compliant", + "dependencies": { + "@calcom/lib": "workspace:*" + }, + "devDependencies": { + "@calcom/types": "workspace:*" + } +} diff --git a/packages/app-store/databuddy/static/1.png b/packages/app-store/databuddy/static/1.png new file mode 100644 index 0000000000..9a4066c056 Binary files /dev/null and b/packages/app-store/databuddy/static/1.png differ diff --git a/packages/app-store/databuddy/static/icon.svg b/packages/app-store/databuddy/static/icon.svg new file mode 100644 index 0000000000..d66c9a3af6 --- /dev/null +++ b/packages/app-store/databuddy/static/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/app-store/databuddy/zod.ts b/packages/app-store/databuddy/zod.ts new file mode 100644 index 0000000000..71315dd1c9 --- /dev/null +++ b/packages/app-store/databuddy/zod.ts @@ -0,0 +1,17 @@ +import { z } from "zod"; + +import { eventTypeAppCardZod } from "../eventTypeAppCardZod"; + +export const appDataSchema = eventTypeAppCardZod.merge( + z.object({ + DATABUDDY_SCRIPT_URL: z + .string() + .optional() + .default("https://cdn.databuddy.cc/databuddy.js") + .or(z.undefined()), + DATABUDDY_API_URL: z.string().optional().default("https://basket.databuddy.cc").or(z.undefined()), + CLIENT_ID: z.string().default("").optional(), + }) +); + +export const appKeysSchema = z.object({});