From 727ba56d856998f7aeea3cac9bc842b46cbc798e Mon Sep 17 00:00:00 2001 From: Innei Date: Fri, 18 Oct 2024 15:23:52 +0800 Subject: [PATCH] feat: add Openpanel integration (#1014) * refactor: remove posthog to op Signed-off-by: Innei * update Signed-off-by: Innei * fix: $pageview Signed-off-by: Innei * fix: type Signed-off-by: Innei --------- Signed-off-by: Innei --- .env.example | 3 +- .github/workflows/build.yml | 3 +- .github/workflows/nightly.yml | 3 +- apps/main/package.json | 2 - apps/main/src/lib/posthog.ts | 17 - apps/main/src/tipc/tracker.ts | 9 - apps/main/src/updater/index.ts | 7 +- apps/renderer/package.json | 4 +- apps/renderer/src/App.tsx | 2 +- .../components/common/ImpressionTracker.tsx | 2 +- apps/renderer/src/hooks/biz/useAb.ts | 56 +- .../src/hooks/biz/useNavigateEntry.ts | 4 +- apps/renderer/src/hooks/biz/useSignOut.ts | 2 +- apps/renderer/src/initialize/analytics.ts | 45 ++ apps/renderer/src/initialize/firebase.ts | 19 + apps/renderer/src/initialize/helper.ts | 31 +- apps/renderer/src/initialize/index.ts | 6 +- apps/renderer/src/initialize/op.ts | 10 + apps/renderer/src/initialize/sentry.ts | 11 +- apps/renderer/src/modules/ab/hoc.tsx | 48 +- apps/renderer/src/modules/ab/providers.tsx | 138 ++-- .../entry-column/layouts/EntryListHeader.tsx | 6 +- .../src/modules/feed-column/auto-updater.tsx | 2 +- .../src/modules/feed-column/corner-player.tsx | 16 +- apps/renderer/src/modules/panel/cmdk.tsx | 2 +- apps/renderer/src/modules/panel/cmdn.tsx | 2 +- .../src/modules/settings/tabs/general.tsx | 8 +- apps/renderer/src/modules/wallet/hooks.ts | 2 +- .../src/providers/stable-router-provider.tsx | 16 +- apps/renderer/src/queries/feed.ts | 2 +- apps/renderer/src/queries/wallet.tsx | 4 +- packages/shared/src/env.ts | 5 +- pnpm-lock.yaml | 676 +++++++++++++++++- types/vite.d.ts | 3 +- vite.config.ts | 2 +- 35 files changed, 901 insertions(+), 267 deletions(-) delete mode 100644 apps/main/src/lib/posthog.ts create mode 100644 apps/renderer/src/initialize/analytics.ts create mode 100644 apps/renderer/src/initialize/firebase.ts create mode 100644 apps/renderer/src/initialize/op.ts diff --git a/.env.example b/.env.example index 5e74c8b1bd..fb4546e9a4 100644 --- a/.env.example +++ b/.env.example @@ -3,5 +3,6 @@ VITE_API_URL=http://localhost:3000 VITE_IMGPROXY_URL=http://localhost:2873 VITE_SENTRY_DSN= VITE_BUILD_TYPE=production -VITE_POSTHOG_KEY= VITE_INBOXES_EMAIL=@follow.re +VITE_OPENPANEL_CLIENT_ID= +VITE_OPENPANEL_API_URL= diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 250a75abe0..5f0cc05af3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,7 +20,8 @@ env: VITE_API_URL: ${{ vars.VITE_API_URL }} VITE_IMGPROXY_URL: ${{ vars.VITE_IMGPROXY_URL }} VITE_SENTRY_DSN: ${{ vars.VITE_SENTRY_DSN }} - VITE_POSTHOG_KEY: ${{ vars.VITE_POSTHOG_KEY }} + VITE_OPENPANEL_CLIENT_ID: ${{ vars.VITE_OPENPANEL_CLIENT_ID }} + VITE_OPENPANEL_API_URL: ${{ vars.VITE_OPENPANEL_API_URL }} VITE_FIREBASE_CONFIG: ${{ vars.VITE_FIREBASE_CONFIG }} NODE_OPTIONS: --max-old-space-size=8192 diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index de68a4c81b..a0ac8912cf 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -9,7 +9,8 @@ env: VITE_API_URL: ${{ vars.VITE_API_URL }} VITE_IMGPROXY_URL: ${{ vars.VITE_IMGPROXY_URL }} VITE_SENTRY_DSN: ${{ vars.VITE_SENTRY_DSN }} - VITE_POSTHOG_KEY: ${{ vars.VITE_POSTHOG_KEY }} + VITE_OPENPANEL_CLIENT_ID: ${{ vars.VITE_OPENPANEL_CLIENT_ID }} + VITE_OPENPANEL_API_URL: ${{ vars.VITE_OPENPANEL_API_URL }} VITE_FIREBASE_CONFIG: ${{ vars.VITE_FIREBASE_CONFIG }} NODE_OPTIONS: --max-old-space-size=8192 diff --git a/apps/main/package.json b/apps/main/package.json index 7040667f66..6cf3577c3f 100644 --- a/apps/main/package.json +++ b/apps/main/package.json @@ -44,8 +44,6 @@ "msedge-tts": "1.3.4", "nanoid": "5.0.7", "ofetch": "1.4.0", - "posthog-js": "1.165.0", - "posthog-node": "4.2.0", "semver": "7.6.3", "vscode-languagedetection": "npm:@vscode/vscode-languagedetection@^1.0.22" }, diff --git a/apps/main/src/lib/posthog.ts b/apps/main/src/lib/posthog.ts deleted file mode 100644 index 2c52e4b807..0000000000 --- a/apps/main/src/lib/posthog.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { env } from "@follow/shared/env" -import { PostHog } from "posthog-node" - -import { getUser } from "./user" - -export const initPosthog = () => { - if (env.VITE_POSTHOG_KEY === undefined) return - - return new PostHog(env.VITE_POSTHOG_KEY, {}) -} -export const posthog = initPosthog() - -export const trackEvent = (event: string, properties?: Record) => { - const userId = getUser()?.id - if (!userId) return - posthog?.capture({ event, properties, distinctId: userId }) -} diff --git a/apps/main/src/tipc/tracker.ts b/apps/main/src/tipc/tracker.ts index 27af0c5fc4..d11ac95516 100644 --- a/apps/main/src/tipc/tracker.ts +++ b/apps/main/src/tipc/tracker.ts @@ -1,6 +1,5 @@ import type { User } from "@auth/core/types" -import { posthog } from "../lib/posthog" import { setUser } from "../lib/user" import { t } from "./_instance" @@ -13,13 +12,5 @@ export const trackerRoute = { const { user } = input setUser(user) - posthog?.capture({ - event: "login", - distinctId: user.id ?? "", - properties: { - name: user.name, - handle: user.handle ?? "", - }, - }) }), } diff --git a/apps/main/src/updater/index.ts b/apps/main/src/updater/index.ts index 08876257f0..461ef2d68b 100644 --- a/apps/main/src/updater/index.ts +++ b/apps/main/src/updater/index.ts @@ -2,7 +2,6 @@ import { getRendererHandlers } from "@egoist/tipc/main" import { autoUpdater } from "electron-updater" import { channel, isDev } from "../env" -import { trackEvent } from "../lib/posthog" import { logger } from "../logger" import type { RendererHandlers } from "../renderer-handlers" import { destroyMainWindow, getMainWindow } from "../window" @@ -112,7 +111,7 @@ export const registerUpdater = async () => { autoUpdater.on("download-progress", (e) => { logger.info(`Download progress: ${e.percent}`) }) - autoUpdater.on("update-downloaded", (e) => { + autoUpdater.on("update-downloaded", () => { downloading = false logger.info("Update downloaded, ready to install") @@ -120,10 +119,6 @@ export const registerUpdater = async () => { if (!mainWindow) return const handlers = getRendererHandlers(mainWindow.webContents) - trackEvent("update_ready_to_install", { - version: e.version, - releaseVersion: e.releaseName, - }) handlers.updateDownloaded.send() }) autoUpdater.on("error", (e) => { diff --git a/apps/renderer/package.json b/apps/renderer/package.json index 1eb1f6944d..d966e710c2 100644 --- a/apps/renderer/package.json +++ b/apps/renderer/package.json @@ -20,6 +20,7 @@ "@lottiefiles/dotlottie-react": "0.9.0", "@microflash/remark-callout-directives": "4.3.1", "@mozilla/readability": "^0.5.0", + "@openpanel/web": "1.0.1", "@radix-ui/react-avatar": "1.1.0", "@radix-ui/react-checkbox": "1.1.1", "@radix-ui/react-context-menu": "2.2.1", @@ -55,6 +56,7 @@ "dexie": "4.0.8", "dnum": "^2.14.0", "electron-log": "5.2.0", + "firebase": "10.14.1", "foxact": "0.2.38", "framer-motion": "11.9.0", "franc-min": "6.2.0", @@ -72,7 +74,7 @@ "nanoid": "5.0.7", "ofetch": "1.4.0", "path-to-regexp": "8.2.0", - "posthog-js": "1.165.0", + "posthog-js": "1.169.1", "re-resizable": "6.10.0", "react-blurhash": "^0.3.0", "react-error-boundary": "4.0.13", diff --git a/apps/renderer/src/App.tsx b/apps/renderer/src/App.tsx index 58df2da90c..a7ae6fa9fa 100644 --- a/apps/renderer/src/App.tsx +++ b/apps/renderer/src/App.tsx @@ -70,7 +70,7 @@ const AppLayer = () => { useEffect(() => { const doneTime = Math.trunc(performance.now()) - window.posthog?.capture("ui_render_init", { + window.analytics?.capture("ui_render_init", { time: doneTime, }) appLog("App is ready", `${doneTime}ms`) diff --git a/apps/renderer/src/components/common/ImpressionTracker.tsx b/apps/renderer/src/components/common/ImpressionTracker.tsx index 90797f11ec..e372f14a86 100644 --- a/apps/renderer/src/components/common/ImpressionTracker.tsx +++ b/apps/renderer/src/components/common/ImpressionTracker.tsx @@ -26,7 +26,7 @@ const ImpressionViewImpl: Component = memo((props) => { } setImpression(true) - window.posthog?.capture(props.event, { + window.analytics?.capture(props.event, { impression: 1, ...props.properties, }) diff --git a/apps/renderer/src/hooks/biz/useAb.ts b/apps/renderer/src/hooks/biz/useAb.ts index 2d7db02ead..deccb5695d 100644 --- a/apps/renderer/src/hooks/biz/useAb.ts +++ b/apps/renderer/src/hooks/biz/useAb.ts @@ -1,37 +1,39 @@ -import { useAtomValue } from "jotai" -import PostHog from "posthog-js" -import { useFeatureFlagEnabled } from "posthog-js/react" +// import { useAtomValue } from "jotai" +// import PostHog from "posthog-js" +// import { useFeatureFlagEnabled } from "posthog-js/react" -import { jotaiStore } from "~/lib/jotai" -import type { FeatureKeys } from "~/modules/ab/atoms" -import { debugFeaturesAtom, enableDebugOverrideAtom, IS_DEBUG_ENV } from "~/modules/ab/atoms" -import { abPayloadFallback } from "~/modules/ab/fallback" +// import { jotaiStore } from "~/lib/jotai" +// import type { FeatureKeys } from "~/modules/ab/atoms" +// import { debugFeaturesAtom, enableDebugOverrideAtom, IS_DEBUG_ENV } from "~/modules/ab/atoms" +// import { abPayloadFallback } from "~/modules/ab/fallback" -export const useAb = (feature: FeatureKeys) => { - const isEnableDebugOverrides = useAtomValue(enableDebugOverrideAtom) - const debugFeatureOverrides = useAtomValue(debugFeaturesAtom) +// export const useAb = (feature: FeatureKeys) => { +// const isEnableDebugOverrides = useAtomValue(enableDebugOverrideAtom) +// const debugFeatureOverrides = useAtomValue(debugFeaturesAtom) - const isEnabled = useFeatureFlagEnabled(feature) +// const isEnabled = useFeatureFlagEnabled(feature) - if (IS_DEBUG_ENV && isEnableDebugOverrides) return debugFeatureOverrides[feature] +// if (IS_DEBUG_ENV && isEnableDebugOverrides) return debugFeatureOverrides[feature] - return isEnabled -} +// return isEnabled +// } -export const isAbEnabled = (feature: FeatureKeys) => { - const featureFlag = PostHog.getFeatureFlag(feature) - const enabled = typeof featureFlag === "boolean" ? featureFlag : featureFlag === "enabled" - const debugOverride = jotaiStore.get(debugFeaturesAtom) +// export const isAbEnabled = (feature: FeatureKeys) => { +// const featureFlag = PostHog.getFeatureFlag(feature) +// const enabled = typeof featureFlag === "boolean" ? featureFlag : featureFlag === "enabled" +// const debugOverride = jotaiStore.get(debugFeaturesAtom) - const isEnableOverride = jotaiStore.get(enableDebugOverrideAtom) +// const isEnableOverride = jotaiStore.get(enableDebugOverrideAtom) - if (isEnableOverride) { - return debugOverride[feature] - } +// if (isEnableOverride) { +// return debugOverride[feature] +// } - return enabled -} +// return enabled +// } -export const getAbValue = (feature: FeatureKeys) => { - return PostHog.getFeatureFlagPayload(feature) || abPayloadFallback[feature] -} +// export const getAbValue = (feature: FeatureKeys) => { +// return PostHog.getFeatureFlagPayload(feature) || abPayloadFallback[feature] +// } + +export {} diff --git a/apps/renderer/src/hooks/biz/useNavigateEntry.ts b/apps/renderer/src/hooks/biz/useNavigateEntry.ts index 48179805e6..e40e5bf8ba 100644 --- a/apps/renderer/src/hooks/biz/useNavigateEntry.ts +++ b/apps/renderer/src/hooks/biz/useNavigateEntry.ts @@ -58,8 +58,8 @@ export const navigateEntry = (options: NavigateEntryOptions) => { const finalView = nextSearchParams.get("view") - if (window.posthog) { - window.posthog.capture("Navigate Entry", { + if (window.analytics) { + window.analytics.capture("Navigate Entry", { feedId: finalFeedId, entryId, view: finalView ? Number.parseInt(finalView, 10) : FeedViewType.Articles, diff --git a/apps/renderer/src/hooks/biz/useSignOut.ts b/apps/renderer/src/hooks/biz/useSignOut.ts index 4545c81665..d9fe9f2338 100644 --- a/apps/renderer/src/hooks/biz/useSignOut.ts +++ b/apps/renderer/src/hooks/biz/useSignOut.ts @@ -17,7 +17,7 @@ export const useSignOut = () => // Clear local storage clearStorage() - window.posthog?.reset() + window.analytics?.reset() // clear local store data await Promise.allSettled([clearLocalPersistStoreData(), tipcClient?.cleanAuthSessionToken()]) // Sign out diff --git a/apps/renderer/src/initialize/analytics.ts b/apps/renderer/src/initialize/analytics.ts new file mode 100644 index 0000000000..03631b559a --- /dev/null +++ b/apps/renderer/src/initialize/analytics.ts @@ -0,0 +1,45 @@ +import { env } from "@follow/shared/env" +import type { TrackProperties } from "@openpanel/web" + +import { getGeneralSettings } from "~/atoms/settings/general" + +import { op } from "./op" +import { initPostHog } from "./posthog" + +declare global { + interface Window { + analytics?: { + capture: (event_name: string, properties?: TrackProperties | null) => void + reset: () => void + } + } +} +export const initAnalytics = () => { + // TODO remove this + initPostHog() + if (env.VITE_OPENPANEL_CLIENT_ID === undefined) return + + op.setGlobalProperties({ + build: ELECTRON ? "electron" : "web", + version: APP_VERSION, + hash: GIT_COMMIT_SHA, + }) + + window.analytics = { + reset: () => { + // op.clear() + + // TODO remove this if op ready + window.posthog?.reset() + }, + capture(event_name: string, properties?: TrackProperties | null) { + if (import.meta.env.DEV) return + if (!getGeneralSettings().sendAnonymousData) { + return + } + // TODO remove this if op ready + window.posthog?.capture(event_name, properties as TrackProperties) + op.track(event_name, properties as TrackProperties) + }, + } +} diff --git a/apps/renderer/src/initialize/firebase.ts b/apps/renderer/src/initialize/firebase.ts new file mode 100644 index 0000000000..3337597a9b --- /dev/null +++ b/apps/renderer/src/initialize/firebase.ts @@ -0,0 +1,19 @@ +import { getAnalytics } from "firebase/analytics" +import { initializeApp } from "firebase/app" + +// See: https://firebase.google.com/docs/web/learn-more#config-object +// For Firebase JavaScript SDK v7.20.0 and later, `measurementId` is an optional field +const firebaseConfig = { + apiKey: "AIzaSyDuM93019tp8VI7wsszJv8ChOs7b1EE5Hk", + authDomain: "follow-428106.firebaseapp.com", + projectId: "follow-428106", + storageBucket: "follow-428106.appspot.com", + messagingSenderId: "194977404578", + appId: "1:194977404578:web:1920bb0c9ea5e2373669fb", + measurementId: "G-SJE57D4F14", +} +// Initialize Firebase +const app = initializeApp(firebaseConfig) + +// Initialize Analytics and get a reference to the service +export const analytics = getAnalytics(app) diff --git a/apps/renderer/src/initialize/helper.ts b/apps/renderer/src/initialize/helper.ts index 6b83892939..dbecc940a6 100644 --- a/apps/renderer/src/initialize/helper.ts +++ b/apps/renderer/src/initialize/helper.ts @@ -1,15 +1,20 @@ import type { User } from "@auth/core/types" -export const setIntegrationIdentify = (user: User) => - Promise.all([ - import("@sentry/react").then(({ setTag }) => { - setTag("user_id", user.id) - setTag("user_name", user.name) - }), - import("posthog-js").then(({ default: posthog }) => { - posthog.identify(user.id, { - name: user.name, - handle: user.handle, - }) - }), - ]) +import { op } from "./op" + +export const setIntegrationIdentify = async (user: User) => { + op.identify({ + profileId: user.id, + email: user.email, + avatar: user.image, + lastName: user.name, + properties: { + handle: user.handle, + name: user.name, + }, + }) + await import("@sentry/react").then(({ setTag }) => { + setTag("user_id", user.id) + setTag("user_name", user.name) + }) +} diff --git a/apps/renderer/src/initialize/index.ts b/apps/renderer/src/initialize/index.ts index 55b4155092..c4b2252af0 100644 --- a/apps/renderer/src/initialize/index.ts +++ b/apps/renderer/src/initialize/index.ts @@ -19,9 +19,9 @@ import { CleanerService } from "~/services/cleaner" import { subscribeNetworkStatus } from "../atoms/network" import { getGeneralSettings, subscribeShouldUseIndexedDB } from "../atoms/settings/general" import { appLog } from "../lib/log" +import { initAnalytics } from "./analytics" import { hydrateDatabaseToStore, hydrateSettings, setHydrated } from "./hydrate" import { doMigration } from "./migrates" -import { initPostHog } from "./posthog" import { initSentry } from "./sentry" const cleanup = subscribeShouldUseIndexedDB((value) => { @@ -93,7 +93,7 @@ export const initializeApp = async () => { const { dataPersist: enabledDataPersist } = getGeneralSettings() initSentry() - initPostHog() + initAnalytics() await apm("i18n", initI18n) let dataHydratedTime: undefined | number @@ -106,7 +106,7 @@ export const initializeApp = async () => { const loadingTime = Date.now() - now appLog(`Initialize ${APP_NAME} done,`, `${loadingTime}ms`) - window.posthog?.capture("app_init", { + window.analytics?.capture("app_init", { electron: IN_ELECTRON, loading_time: loadingTime, using_indexed_db: enabledDataPersist, diff --git a/apps/renderer/src/initialize/op.ts b/apps/renderer/src/initialize/op.ts new file mode 100644 index 0000000000..210b589e09 --- /dev/null +++ b/apps/renderer/src/initialize/op.ts @@ -0,0 +1,10 @@ +import { env } from "@follow/shared/env" +import { OpenPanel } from "@openpanel/web" + +export const op = new OpenPanel({ + clientId: env.VITE_OPENPANEL_CLIENT_ID, + trackScreenViews: true, + trackOutgoingLinks: true, + trackAttributes: true, + apiUrl: env.VITE_OPENPANEL_API_URL, +}) diff --git a/apps/renderer/src/initialize/sentry.ts b/apps/renderer/src/initialize/sentry.ts index 850f1e2365..dc2b5f2d98 100644 --- a/apps/renderer/src/initialize/sentry.ts +++ b/apps/renderer/src/initialize/sentry.ts @@ -15,10 +15,7 @@ import { SentryConfig } from "../configs" export const initSentry = async () => { if (!window.SENTRY_RELEASE) return if (import.meta.env.DEV) return - const [Sentry, posthog] = await Promise.all([ - import("@sentry/react"), - import("posthog-js").then((module) => module.default), - ]) + const Sentry = await import("@sentry/react") Sentry.init({ dsn: env.VITE_SENTRY_DSN, environment: RELEASE_CHANNEL, @@ -35,12 +32,6 @@ export const initSentry = async () => { Sentry.captureConsoleIntegration({ levels: ["error"], }), - posthog.sentryIntegration({ - organization: "follow-rg", - - projectId: 4507570439979008, - severityAllowList: ["error", "info"], // optional: here is set to handle captureMessage (info) and captureException (error) - }), ], ...SentryConfig, }) diff --git a/apps/renderer/src/modules/ab/hoc.tsx b/apps/renderer/src/modules/ab/hoc.tsx index 823e9bfb90..93b882b205 100644 --- a/apps/renderer/src/modules/ab/hoc.tsx +++ b/apps/renderer/src/modules/ab/hoc.tsx @@ -1,30 +1,32 @@ -import type { FC } from "react" -import { forwardRef } from "react" +// import type { FC } from "react" +// import { forwardRef } from "react" -import { useAb } from "~/hooks/biz/useAb" +// import { useAb } from "~/hooks/biz/useAb" -import type { FeatureKeys } from "./atoms" +// import type { FeatureKeys } from "./atoms" -const Noop = () => null -export const withFeature = - (feature: FeatureKeys) => - ( - Component: FC, +// const Noop = () => null +// export const withFeature = +// (feature: FeatureKeys) => +// ( +// Component: FC, - FallbackComponent: any = Noop, - ) => { - // @ts-expect-error - const WithFeature = forwardRef((props: T, ref: any) => { - const isEnabled = useAb(feature) +// FallbackComponent: any = Noop, +// ) => { +// // @ts-expect-error +// const WithFeature = forwardRef((props: T, ref: any) => { +// const isEnabled = useAb(feature) - if (isEnabled === undefined) return null +// if (isEnabled === undefined) return null - return isEnabled ? ( - - ) : ( - - ) - }) +// return isEnabled ? ( +// +// ) : ( +// +// ) +// }) - return WithFeature - } +// return WithFeature +// } + +export {} diff --git a/apps/renderer/src/modules/ab/providers.tsx b/apps/renderer/src/modules/ab/providers.tsx index a53be3214c..09d71b1ff9 100644 --- a/apps/renderer/src/modules/ab/providers.tsx +++ b/apps/renderer/src/modules/ab/providers.tsx @@ -1,84 +1,72 @@ -import { useAtomValue, useSetAtom } from "jotai" - -import { Divider } from "~/components/ui/divider" -import { Label } from "~/components/ui/label" -import { useModalStack } from "~/components/ui/modal" -import { RootPortal } from "~/components/ui/portal" -import { Switch } from "~/components/ui/switch" - -import type { FeatureKeys } from "./atoms" -import { debugFeaturesAtom, enableDebugOverrideAtom, IS_DEBUG_ENV } from "./atoms" - export const FeatureFlagDebugger = () => { - if (IS_DEBUG_ENV) return - return null + // if (IS_DEBUG_ENV) return } -const DebugToggle = () => { - const { present } = useModalStack() - return ( - -
{ - present({ - title: "A/B", - content: ABModalContent, - }) - }} - className="fixed bottom-5 right-0 flex size-5 items-center justify-center opacity-40 duration-200 hover:opacity-100" - > - -
-
- ) -} +// const DebugToggle = () => { +// const { present } = useModalStack() +// return ( +// +//
{ +// present({ +// title: "A/B", +// content: ABModalContent, +// }) +// }} +// className="fixed bottom-5 right-0 flex size-5 items-center justify-center opacity-40 duration-200 hover:opacity-100" +// > +// +//
+//
+// ) +// } -const SwitchInternal = ({ Key }: { Key: FeatureKeys }) => { - const enabled = useAtomValue(debugFeaturesAtom)[Key] - const setDebugFeatures = useSetAtom(debugFeaturesAtom) - return ( - { - setDebugFeatures((prev) => ({ ...prev, [Key]: checked })) - }} - /> - ) -} +// const SwitchInternal = ({ Key }: { Key: FeatureKeys }) => { +// const enabled = useAtomValue(debugFeaturesAtom)[Key] +// const setDebugFeatures = useSetAtom(debugFeaturesAtom) +// return ( +// { +// setDebugFeatures((prev) => ({ ...prev, [Key]: checked })) +// }} +// /> +// ) +// } -const ABModalContent = () => { - const features = useAtomValue(debugFeaturesAtom) +// const ABModalContent = () => { +// const features = useAtomValue(debugFeaturesAtom) - const enableOverride = useAtomValue(enableDebugOverrideAtom) - const setEnableDebugOverride = useSetAtom(enableDebugOverrideAtom) - return ( -
- +// const enableOverride = useAtomValue(enableDebugOverrideAtom) +// const setEnableDebugOverride = useSetAtom(enableDebugOverrideAtom) +// return ( +//
+// - +// -
- {Object.keys(features).map((key) => { - return ( -
- -
- ) - })} -
-
- ) -} +//
+// {Object.keys(features).map((key) => { +// return ( +//
+// +//
+// ) +// })} +//
+//
+// ) +// } diff --git a/apps/renderer/src/modules/entry-column/layouts/EntryListHeader.tsx b/apps/renderer/src/modules/entry-column/layouts/EntryListHeader.tsx index d079cec840..c83375a7f6 100644 --- a/apps/renderer/src/modules/entry-column/layouts/EntryListHeader.tsx +++ b/apps/renderer/src/modules/entry-column/layouts/EntryListHeader.tsx @@ -171,7 +171,7 @@ const DailyReportButton: FC = () => { { present() - window.posthog?.capture("Daily Report Modal", { + window.analytics?.capture("Daily Report Modal", { click: 1, }) }} @@ -216,7 +216,7 @@ const SwitchToMasonryButton = () => { { setUISetting("pictureViewMasonry", !isMasonry) - window.posthog?.capture("Switch to Masonry", { + window.analytics?.capture("Switch to Masonry", { masonry: !isMasonry ? 1 : 0, click: 1, }) @@ -250,7 +250,7 @@ const WideModeButton = () => { setUISetting("wideMode", !isWideMode) // TODO: Remove this after useMeasure can get bounds in time window.dispatchEvent(new Event("resize")) - window.posthog?.capture("Switch to Wide Mode", { + window.analytics?.capture("Switch to Wide Mode", { wideMode: !isWideMode ? 1 : 0, click: 1, }) diff --git a/apps/renderer/src/modules/feed-column/auto-updater.tsx b/apps/renderer/src/modules/feed-column/auto-updater.tsx index c372eb3dd4..b03b6e3477 100644 --- a/apps/renderer/src/modules/feed-column/auto-updater.tsx +++ b/apps/renderer/src/modules/feed-column/auto-updater.tsx @@ -22,7 +22,7 @@ export const AutoUpdater = () => { const handleClick = useCallback(() => { setUpdaterStatus(false) - window.posthog?.capture("update_restart") + window.analytics?.capture("update_restart") tipcClient?.quitAndInstall() }, []) diff --git a/apps/renderer/src/modules/feed-column/corner-player.tsx b/apps/renderer/src/modules/feed-column/corner-player.tsx index 50838fa597..cf7b47d05c 100644 --- a/apps/renderer/src/modules/feed-column/corner-player.tsx +++ b/apps/renderer/src/modules/feed-column/corner-player.tsx @@ -68,15 +68,11 @@ const usePlayerTracker = () => { useEffect(() => { const handler = () => { const playerState = getAudioPlayerAtomValue() - window.posthog?.capture( - "player_open_duration", - { - duration: Date.now() - playerOpenAt, - status: playerState.status, - trigger: "beforeunload", - }, - { transport: "sendBeacon" }, - ) + window.analytics?.capture("player_open_duration", { + duration: Date.now() - playerOpenAt, + status: playerState.status, + trigger: "beforeunload", + }) } window.addEventListener("beforeunload", handler) @@ -86,7 +82,7 @@ const usePlayerTracker = () => { useEffect(() => { if (!show) { const playerState = getAudioPlayerAtomValue() - window.posthog?.capture("player_open_duration", { + window.analytics?.capture("player_open_duration", { duration: Date.now() - playerOpenAt, status: playerState.status, trigger: "manual", diff --git a/apps/renderer/src/modules/panel/cmdk.tsx b/apps/renderer/src/modules/panel/cmdk.tsx index a482f7b156..17b43df941 100644 --- a/apps/renderer/src/modules/panel/cmdk.tsx +++ b/apps/renderer/src/modules/panel/cmdk.tsx @@ -45,7 +45,7 @@ export const SearchCmdK: React.FC = () => { React.useEffect(() => { if (!open) return - window.posthog?.capture("search_open") + window.analytics?.capture("search_open") // Refresh data setPage(0) setSearchInstance(() => searchActions.createLocalDbSearch()) diff --git a/apps/renderer/src/modules/panel/cmdn.tsx b/apps/renderer/src/modules/panel/cmdn.tsx index 6873454f75..564ec4d04c 100644 --- a/apps/renderer/src/modules/panel/cmdn.tsx +++ b/apps/renderer/src/modules/panel/cmdn.tsx @@ -44,7 +44,7 @@ const CmdNPanel = () => { const defaultView = getSidebarActiveView() as FeedViewType - window.posthog?.capture("quick_add_feed", { url, defaultView }) + window.analytics?.capture("quick_add_feed", { url, defaultView }) present({ title: "Add Feed", diff --git a/apps/renderer/src/modules/settings/tabs/general.tsx b/apps/renderer/src/modules/settings/tabs/general.tsx index 6256a621f3..9a67a76f5c 100644 --- a/apps/renderer/src/modules/settings/tabs/general.tsx +++ b/apps/renderer/src/modules/settings/tabs/general.tsx @@ -27,7 +27,7 @@ import { } from "~/components/ui/select" import { useProxyValue, useSetProxy } from "~/hooks/common/useProxySetting" import { fallbackLanguage } from "~/i18n" -import { initPostHog } from "~/initialize/posthog" +import { initAnalytics } from "~/initialize/analytics" import { tipcClient } from "~/lib/client" import { cn } from "~/lib/utils" import { clearLocalPersistStoreData } from "~/store/utils/clear" @@ -125,10 +125,10 @@ export const SettingGeneral = () => { onChange(value) { setGeneralSetting("sendAnonymousData", value) if (value) { - initPostHog() + initAnalytics() } else { - window.posthog?.reset() - delete window.posthog + window.analytics?.reset() + delete window.analytics } }, }), diff --git a/apps/renderer/src/modules/wallet/hooks.ts b/apps/renderer/src/modules/wallet/hooks.ts index 8a8c797059..337f7a43c6 100644 --- a/apps/renderer/src/modules/wallet/hooks.ts +++ b/apps/renderer/src/modules/wallet/hooks.ts @@ -23,7 +23,7 @@ export const useTipModal = ({ toast.error("Invalid feed id or entry id") return } - window.posthog?.capture("tip_modal_opened", { entryId }) + window.analytics?.capture("tip_modal_opened", { entryId }) present({ title: t("tip_modal.tip_title"), content: () => createElement(TipModalContent, { userId, feedId, entryId }), diff --git a/apps/renderer/src/providers/stable-router-provider.tsx b/apps/renderer/src/providers/stable-router-provider.tsx index e35e314f03..9291a7e527 100644 --- a/apps/renderer/src/providers/stable-router-provider.tsx +++ b/apps/renderer/src/providers/stable-router-provider.tsx @@ -1,4 +1,4 @@ -import { useEffect, useLayoutEffect } from "react" +import { useLayoutEffect } from "react" import type { NavigateFunction } from "react-router-dom" import { useLocation, useNavigate, useParams, useSearchParams } from "react-router-dom" @@ -43,19 +43,5 @@ export const StableRouterProvider = () => { setNavigate({ fn: nav }) }, [searchParams, params, location, nav]) - // Posthog tracking - useEffect(() => { - const { pathname } = location - if (pathname && window.posthog) { - let url = window.origin + pathname - if (searchParams.toString()) { - url = `${url}?${searchParams.toString()}` - } - window.posthog.capture("$pageview", { - $current_url: url, - }) - } - }, [location, searchParams]) - return null } diff --git a/apps/renderer/src/queries/feed.ts b/apps/renderer/src/queries/feed.ts index a1a4f27bf4..33b5a28ed9 100644 --- a/apps/renderer/src/queries/feed.ts +++ b/apps/renderer/src/queries/feed.ts @@ -61,7 +61,7 @@ export const useClaimFeedMutation = (feedId: string) => toastFetchError(err) }, onSuccess() { - window.posthog?.capture("feed_claimed", { + window.analytics?.capture("feed_claimed", { feedId, }) }, diff --git a/apps/renderer/src/queries/wallet.tsx b/apps/renderer/src/queries/wallet.tsx index 89d24f9b29..ab1cd435b2 100644 --- a/apps/renderer/src/queries/wallet.tsx +++ b/apps/renderer/src/queries/wallet.tsx @@ -79,7 +79,7 @@ export const useClaimWalletDailyRewardMutation = () => { onSuccess() { wallet.get().invalidate() wallet.claimCheck().invalidate() - window.posthog?.capture("daily_reward_claimed") + window.analytics?.capture("daily_reward_claimed") toast(
navigate("/power")}> @@ -108,7 +108,7 @@ export const useWalletTipMutation = () => onSuccess(_, variables) { wallet.get().invalidate() wallet.transactions.get().invalidate() - window.posthog?.capture("tip_sent", { + window.analytics?.capture("tip_sent", { amount: variables.amount, entryId: variables.entryId, }) diff --git a/packages/shared/src/env.ts b/packages/shared/src/env.ts index ae29ed5102..a4954b6a5f 100644 --- a/packages/shared/src/env.ts +++ b/packages/shared/src/env.ts @@ -9,9 +9,12 @@ export const env = createEnv({ VITE_API_URL: z.string().url(), VITE_IMGPROXY_URL: z.string().url(), VITE_SENTRY_DSN: z.string().optional(), - VITE_POSTHOG_KEY: z.string().optional(), VITE_INBOXES_EMAIL: z.string().default("@follow.re"), VITE_FIREBASE_CONFIG: z.string().optional(), + VITE_OPENPANEL_CLIENT_ID: z.string(), + VITE_OPENPANEL_API_URL: z.string().url(), + + VITE_POSTHOG_KEY: z.string().optional(), }, emptyStringAsUndefined: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 68033b355c..fd3def1b5f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -284,12 +284,6 @@ importers: ofetch: specifier: 1.4.0 version: 1.4.0 - posthog-js: - specifier: 1.165.0 - version: 1.165.0 - posthog-node: - specifier: 4.2.0 - version: 4.2.0 semver: specifier: 7.6.3 version: 7.6.3 @@ -351,6 +345,9 @@ importers: '@mozilla/readability': specifier: ^0.5.0 version: 0.5.0(patch_hash=fgkvsbckled47trggkhdkimzbm) + '@openpanel/web': + specifier: 1.0.1 + version: 1.0.1 '@radix-ui/react-avatar': specifier: 1.1.0 version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -456,6 +453,9 @@ importers: electron-log: specifier: 5.2.0 version: 5.2.0 + firebase: + specifier: 10.14.1 + version: 10.14.1 foxact: specifier: 0.2.38 version: 0.2.38(react@18.3.1) @@ -508,8 +508,8 @@ importers: specifier: 8.2.0 version: 8.2.0 posthog-js: - specifier: 1.165.0 - version: 1.165.0 + specifier: 1.169.1 + version: 1.169.1 re-resizable: specifier: 6.10.0 version: 6.10.0(patch_hash=yitcmpfwcomg2fky72uc3lhk2i)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1907,6 +1907,200 @@ packages: '@essentials/request-timeout@1.3.0': resolution: {integrity: sha512-lKZPhKScNFnR1MBnk4+sxshk46fpvdN+Uh1LlKWFO5g1ocuz4EcknNIL7tm/rsCAs/+xMWiBTwbDUvm+pDNlXw==} + '@firebase/analytics-compat@0.2.14': + resolution: {integrity: sha512-unRVY6SvRqfNFIAA/kwl4vK+lvQAL2HVcgu9zTrUtTyYDmtIt/lOuHJynBMYEgLnKm39YKBDhtqdapP2e++ASw==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/analytics-types@0.8.2': + resolution: {integrity: sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==} + + '@firebase/analytics@0.10.8': + resolution: {integrity: sha512-CVnHcS4iRJPqtIDc411+UmFldk0ShSK3OB+D0bKD8Ck5Vro6dbK5+APZpkuWpbfdL359DIQUnAaMLE+zs/PVyA==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/app-check-compat@0.3.15': + resolution: {integrity: sha512-zFIvIFFNqDXpOT2huorz9cwf56VT3oJYRFjSFYdSbGYEJYEaXjLJbfC79lx/zjx4Fh+yuN8pry3TtvwaevrGbg==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/app-check-interop-types@0.3.2': + resolution: {integrity: sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==} + + '@firebase/app-check-types@0.5.2': + resolution: {integrity: sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==} + + '@firebase/app-check@0.8.8': + resolution: {integrity: sha512-O49RGF1xj7k6BuhxGpHmqOW5hqBIAEbt2q6POW0lIywx7emYtzPDeQI+ryQpC4zbKX646SoVZ711TN1DBLNSOQ==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/app-compat@0.2.43': + resolution: {integrity: sha512-HM96ZyIblXjAC7TzE8wIk2QhHlSvksYkQ4Ukh1GmEenzkucSNUmUX4QvoKrqeWsLEQ8hdcojABeCV8ybVyZmeg==} + + '@firebase/app-types@0.9.2': + resolution: {integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==} + + '@firebase/app@0.10.13': + resolution: {integrity: sha512-OZiDAEK/lDB6xy/XzYAyJJkaDqmQ+BCtOEPLqFvxWKUz5JbBmej7IiiRHdtiIOD/twW7O5AxVsfaaGA/V1bNsA==} + + '@firebase/auth-compat@0.5.14': + resolution: {integrity: sha512-2eczCSqBl1KUPJacZlFpQayvpilg3dxXLy9cSMTKtQMTQSmondUtPI47P3ikH3bQAXhzKLOE+qVxJ3/IRtu9pw==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/auth-interop-types@0.2.3': + resolution: {integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==} + + '@firebase/auth-types@0.12.2': + resolution: {integrity: sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + + '@firebase/auth@1.7.9': + resolution: {integrity: sha512-yLD5095kVgDw965jepMyUrIgDklD6qH/BZNHeKOgvu7pchOKNjVM+zQoOVYJIKWMWOWBq8IRNVU6NXzBbozaJg==} + peerDependencies: + '@firebase/app': 0.x + '@react-native-async-storage/async-storage': ^1.18.1 + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + + '@firebase/component@0.6.9': + resolution: {integrity: sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==} + + '@firebase/data-connect@0.1.0': + resolution: {integrity: sha512-vSe5s8dY13ilhLnfY0eYRmQsdTbH7PUFZtBbqU6JVX/j8Qp9A6G5gG6//ulbX9/1JFOF1IWNOne9c8S/DOCJaQ==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/database-compat@1.0.8': + resolution: {integrity: sha512-OpeWZoPE3sGIRPBKYnW9wLad25RaWbGyk7fFQe4xnJQKRzlynWeFBSRRAoLE2Old01WXwskUiucNqUUVlFsceg==} + + '@firebase/database-types@1.0.5': + resolution: {integrity: sha512-fTlqCNwFYyq/C6W7AJ5OCuq5CeZuBEsEwptnVxlNPkWCo5cTTyukzAHRSO/jaQcItz33FfYrrFk1SJofcu2AaQ==} + + '@firebase/database@1.0.8': + resolution: {integrity: sha512-dzXALZeBI1U5TXt6619cv0+tgEhJiwlUtQ55WNZY7vGAjv7Q1QioV969iYwt1AQQ0ovHnEW0YW9TiBfefLvErg==} + + '@firebase/firestore-compat@0.3.38': + resolution: {integrity: sha512-GoS0bIMMkjpLni6StSwRJarpu2+S5m346Na7gr9YZ/BZ/W3/8iHGNr9PxC+f0rNZXqS4fGRn88pICjrZEgbkqQ==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/firestore-types@3.0.2': + resolution: {integrity: sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + + '@firebase/firestore@4.7.3': + resolution: {integrity: sha512-NwVU+JPZ/3bhvNSJMCSzfcBZZg8SUGyzZ2T0EW3/bkUeefCyzMISSt/TTIfEHc8cdyXGlMqfGe3/62u9s74UEg==} + engines: {node: '>=10.10.0'} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/functions-compat@0.3.14': + resolution: {integrity: sha512-dZ0PKOKQFnOlMfcim39XzaXonSuPPAVuzpqA4ONTIdyaJK/OnBaIEVs/+BH4faa1a2tLeR+Jy15PKqDRQoNIJw==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/functions-types@0.6.2': + resolution: {integrity: sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==} + + '@firebase/functions@0.11.8': + resolution: {integrity: sha512-Lo2rTPDn96naFIlSZKVd1yvRRqqqwiJk7cf9TZhUerwnPKgBzXy+aHE22ry+6EjCaQusUoNai6mU6p+G8QZT1g==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/installations-compat@0.2.9': + resolution: {integrity: sha512-2lfdc6kPXR7WaL4FCQSQUhXcPbI7ol3wF+vkgtU25r77OxPf8F/VmswQ7sgIkBBWtymn5ZF20TIKtnOj9rjb6w==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/installations-types@0.5.2': + resolution: {integrity: sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==} + peerDependencies: + '@firebase/app-types': 0.x + + '@firebase/installations@0.6.9': + resolution: {integrity: sha512-hlT7AwCiKghOX3XizLxXOsTFiFCQnp/oj86zp1UxwDGmyzsyoxtX+UIZyVyH/oBF5+XtblFG9KZzZQ/h+dpy+Q==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/logger@0.4.2': + resolution: {integrity: sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==} + + '@firebase/messaging-compat@0.2.12': + resolution: {integrity: sha512-pKsiUVZrbmRgdImYqhBNZlkKJbqjlPkVdQRZGRbkTyX4OSGKR0F/oJeCt1a8jEg5UnBp4fdVwSWSp4DuCovvEQ==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/messaging-interop-types@0.2.2': + resolution: {integrity: sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==} + + '@firebase/messaging@0.12.12': + resolution: {integrity: sha512-6q0pbzYBJhZEtUoQx7hnPhZvAbuMNuBXKQXOx2YlWhSrlv9N1m0ZzlNpBbu/ItTzrwNKTibdYzUyaaxdWLg+4w==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/performance-compat@0.2.9': + resolution: {integrity: sha512-dNl95IUnpsu3fAfYBZDCVhXNkASE0uo4HYaEPd2/PKscfTvsgqFAOxfAXzBEDOnynDWiaGUnb5M1O00JQ+3FXA==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/performance-types@0.2.2': + resolution: {integrity: sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==} + + '@firebase/performance@0.6.9': + resolution: {integrity: sha512-PnVaak5sqfz5ivhua+HserxTJHtCar/7zM0flCX6NkzBNzJzyzlH4Hs94h2Il0LQB99roBqoE5QT1JqWqcLJHQ==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/remote-config-compat@0.2.9': + resolution: {integrity: sha512-AxzGpWfWFYejH2twxfdOJt5Cfh/ATHONegTd/a0p5flEzsD5JsxXgfkFToop+mypEL3gNwawxrxlZddmDoNxyA==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/remote-config-types@0.3.2': + resolution: {integrity: sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==} + + '@firebase/remote-config@0.4.9': + resolution: {integrity: sha512-EO1NLCWSPMHdDSRGwZ73kxEEcTopAxX1naqLJFNApp4hO8WfKfmEpmjxmP5TrrnypjIf2tUkYaKsfbEA7+AMmA==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/storage-compat@0.3.12': + resolution: {integrity: sha512-hA4VWKyGU5bWOll+uwzzhEMMYGu9PlKQc1w4DWxB3aIErWYzonrZjF0icqNQZbwKNIdh8SHjZlFeB2w6OSsjfg==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/storage-types@0.8.2': + resolution: {integrity: sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + + '@firebase/storage@0.13.2': + resolution: {integrity: sha512-fxuJnHshbhVwuJ4FuISLu+/76Aby2sh+44ztjF2ppoe0TELIDxPW6/r1KGlWYt//AD0IodDYYA8ZTN89q8YqUw==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/util@1.10.0': + resolution: {integrity: sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==} + + '@firebase/vertexai-preview@0.0.4': + resolution: {integrity: sha512-EBSqyu9eg8frQlVU9/HjKtHN7odqbh9MtAcVz3WwHj4gLCLOoN9F/o+oxlq3CxvFrd3CNTZwu6d2mZtVlEInng==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-types': 0.x + + '@firebase/webchannel-wrapper@1.0.1': + resolution: {integrity: sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==} + '@floating-ui/core@0.6.2': resolution: {integrity: sha512-jktYRmZwmau63adUG3GKOAVCofBXkk55S/zQ94XOorAHhwqFIOFAy1rSp2N0Wp6/tGbe9V3u/ExlGZypyY17rg==} @@ -1959,6 +2153,15 @@ packages: '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + '@grpc/grpc-js@1.9.15': + resolution: {integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==} + engines: {node: ^8.13.0 || >=10.10.0} + + '@grpc/proto-loader@0.7.13': + resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} + engines: {node: '>=6'} + hasBin: true + '@headlessui/react@2.1.8': resolution: {integrity: sha512-uajqVkAcVG/wHwG9Fh5PFMcFpf2VxM4vNRNKxRjuK009kePVur8LkuuygHfIE+2uZ7z7GnlTtYsyUe6glPpTLg==} engines: {node: '>=10'} @@ -2211,6 +2414,12 @@ packages: '@octokit/types@6.41.0': resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} + '@openpanel/sdk@1.0.0': + resolution: {integrity: sha512-FNmmfjdXoC/VHEjA+WkrQ4lyM5lxEmV7xDd57uj4E+lIS0sU3DLG2mV/dpS8AscnZbUvuMn3kPhiLCqYzuv/gg==} + + '@openpanel/web@1.0.1': + resolution: {integrity: sha512-cVZ7Kr9SicczJ/RDIfEtZs8+1iGDzwkabVA/j3NqSl8VSucsC8m1+LVbjmCDzCJNnK4yVn6tEcc9PJRi2rtllw==} + '@opentelemetry/api-logs@0.52.1': resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==} engines: {node: '>=14'} @@ -5338,6 +5547,10 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -5387,6 +5600,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + firebase@10.14.1: + resolution: {integrity: sha512-0KZxU+Ela9rUCULqFsUUOYYkjh7OM1EWdIfG6///MtXd0t2/uUIf0iNV5i0KariMhRQ5jve/OY985nrAXFaZeQ==} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -5806,6 +6022,9 @@ packages: http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} @@ -5854,6 +6073,9 @@ packages: idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -6266,6 +6488,9 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -7405,12 +7630,8 @@ packages: postgres-range@1.1.4: resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} - posthog-js@1.165.0: - resolution: {integrity: sha512-rUfRJobvOz3Q9Er+zwb32Eq2qs+ToBe/B4k4IoKzmyszI7240Rf4xVWRB0ky8LvmdZfCeYX5knS2Uv3pnn/d5A==} - - posthog-node@4.2.0: - resolution: {integrity: sha512-hgyCYMyzMvuF3qWMw6JvS8gT55v7Mtp5wKWcnDrw+nu39D0Tk9BXD7I0LOBp0lGlHEPaXCEVYUtviNKrhMALGA==} - engines: {node: '>=15.0.0'} + posthog-js@1.169.1: + resolution: {integrity: sha512-zyse2166QgptTXVMgRB5zsJuM2BWR4N+Vzl08ti7KU5gtQA5PSmsMYR6R2YR/LGQsJve4PBRpR8jRHOj1RZZrA==} postject@1.0.0-alpha.6: resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} @@ -7425,8 +7646,8 @@ packages: preact@10.11.3: resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} - preact@10.24.1: - resolution: {integrity: sha512-PnBAwFI3Yjxxcxw75n6VId/5TFxNW/81zexzWD9jn1+eSrOP84NdsS38H5IkF/UH3frqRPT+MvuCoVHjTDTnDw==} + preact@10.24.3: + resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -7908,9 +8129,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rusha@0.8.14: - resolution: {integrity: sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -8496,6 +8714,10 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici@6.19.7: + resolution: {integrity: sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==} + engines: {node: '>=18.17'} + undici@6.19.8: resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} engines: {node: '>=18.17'} @@ -8767,6 +8989,14 @@ packages: webpack-virtual-modules@0.5.0: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -10544,6 +10774,328 @@ snapshots: dependencies: '@essentials/raf': 1.2.0 + '@firebase/analytics-compat@0.2.14(@firebase/app-compat@0.2.43)(@firebase/app@0.10.13)': + dependencies: + '@firebase/analytics': 0.10.8(@firebase/app@0.10.13) + '@firebase/analytics-types': 0.8.2 + '@firebase/app-compat': 0.2.43 + '@firebase/component': 0.6.9 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + transitivePeerDependencies: + - '@firebase/app' + + '@firebase/analytics-types@0.8.2': {} + + '@firebase/analytics@0.10.8(@firebase/app@0.10.13)': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/component': 0.6.9 + '@firebase/installations': 0.6.9(@firebase/app@0.10.13) + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + + '@firebase/app-check-compat@0.3.15(@firebase/app-compat@0.2.43)(@firebase/app@0.10.13)': + dependencies: + '@firebase/app-check': 0.8.8(@firebase/app@0.10.13) + '@firebase/app-check-types': 0.5.2 + '@firebase/app-compat': 0.2.43 + '@firebase/component': 0.6.9 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + transitivePeerDependencies: + - '@firebase/app' + + '@firebase/app-check-interop-types@0.3.2': {} + + '@firebase/app-check-types@0.5.2': {} + + '@firebase/app-check@0.8.8(@firebase/app@0.10.13)': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/component': 0.6.9 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + + '@firebase/app-compat@0.2.43': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/component': 0.6.9 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + + '@firebase/app-types@0.9.2': {} + + '@firebase/app@0.10.13': + dependencies: + '@firebase/component': 0.6.9 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + idb: 7.1.1 + tslib: 2.7.0 + + '@firebase/auth-compat@0.5.14(@firebase/app-compat@0.2.43)(@firebase/app-types@0.9.2)(@firebase/app@0.10.13)': + dependencies: + '@firebase/app-compat': 0.2.43 + '@firebase/auth': 1.7.9(@firebase/app@0.10.13) + '@firebase/auth-types': 0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.10.0) + '@firebase/component': 0.6.9 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + undici: 6.19.7 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + - '@react-native-async-storage/async-storage' + + '@firebase/auth-interop-types@0.2.3': {} + + '@firebase/auth-types@0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.10.0)': + dependencies: + '@firebase/app-types': 0.9.2 + '@firebase/util': 1.10.0 + + '@firebase/auth@1.7.9(@firebase/app@0.10.13)': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/component': 0.6.9 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + undici: 6.19.7 + + '@firebase/component@0.6.9': + dependencies: + '@firebase/util': 1.10.0 + tslib: 2.7.0 + + '@firebase/data-connect@0.1.0(@firebase/app@0.10.13)': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/auth-interop-types': 0.2.3 + '@firebase/component': 0.6.9 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + + '@firebase/database-compat@1.0.8': + dependencies: + '@firebase/component': 0.6.9 + '@firebase/database': 1.0.8 + '@firebase/database-types': 1.0.5 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + + '@firebase/database-types@1.0.5': + dependencies: + '@firebase/app-types': 0.9.2 + '@firebase/util': 1.10.0 + + '@firebase/database@1.0.8': + dependencies: + '@firebase/app-check-interop-types': 0.3.2 + '@firebase/auth-interop-types': 0.2.3 + '@firebase/component': 0.6.9 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + faye-websocket: 0.11.4 + tslib: 2.7.0 + + '@firebase/firestore-compat@0.3.38(@firebase/app-compat@0.2.43)(@firebase/app-types@0.9.2)(@firebase/app@0.10.13)': + dependencies: + '@firebase/app-compat': 0.2.43 + '@firebase/component': 0.6.9 + '@firebase/firestore': 4.7.3(@firebase/app@0.10.13) + '@firebase/firestore-types': 3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.10.0) + '@firebase/util': 1.10.0 + tslib: 2.7.0 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + + '@firebase/firestore-types@3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.10.0)': + dependencies: + '@firebase/app-types': 0.9.2 + '@firebase/util': 1.10.0 + + '@firebase/firestore@4.7.3(@firebase/app@0.10.13)': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/component': 0.6.9 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + '@firebase/webchannel-wrapper': 1.0.1 + '@grpc/grpc-js': 1.9.15 + '@grpc/proto-loader': 0.7.13 + tslib: 2.7.0 + undici: 6.19.7 + + '@firebase/functions-compat@0.3.14(@firebase/app-compat@0.2.43)(@firebase/app@0.10.13)': + dependencies: + '@firebase/app-compat': 0.2.43 + '@firebase/component': 0.6.9 + '@firebase/functions': 0.11.8(@firebase/app@0.10.13) + '@firebase/functions-types': 0.6.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + transitivePeerDependencies: + - '@firebase/app' + + '@firebase/functions-types@0.6.2': {} + + '@firebase/functions@0.11.8(@firebase/app@0.10.13)': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/app-check-interop-types': 0.3.2 + '@firebase/auth-interop-types': 0.2.3 + '@firebase/component': 0.6.9 + '@firebase/messaging-interop-types': 0.2.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + undici: 6.19.7 + + '@firebase/installations-compat@0.2.9(@firebase/app-compat@0.2.43)(@firebase/app-types@0.9.2)(@firebase/app@0.10.13)': + dependencies: + '@firebase/app-compat': 0.2.43 + '@firebase/component': 0.6.9 + '@firebase/installations': 0.6.9(@firebase/app@0.10.13) + '@firebase/installations-types': 0.5.2(@firebase/app-types@0.9.2) + '@firebase/util': 1.10.0 + tslib: 2.7.0 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + + '@firebase/installations-types@0.5.2(@firebase/app-types@0.9.2)': + dependencies: + '@firebase/app-types': 0.9.2 + + '@firebase/installations@0.6.9(@firebase/app@0.10.13)': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/component': 0.6.9 + '@firebase/util': 1.10.0 + idb: 7.1.1 + tslib: 2.7.0 + + '@firebase/logger@0.4.2': + dependencies: + tslib: 2.7.0 + + '@firebase/messaging-compat@0.2.12(@firebase/app-compat@0.2.43)(@firebase/app@0.10.13)': + dependencies: + '@firebase/app-compat': 0.2.43 + '@firebase/component': 0.6.9 + '@firebase/messaging': 0.12.12(@firebase/app@0.10.13) + '@firebase/util': 1.10.0 + tslib: 2.7.0 + transitivePeerDependencies: + - '@firebase/app' + + '@firebase/messaging-interop-types@0.2.2': {} + + '@firebase/messaging@0.12.12(@firebase/app@0.10.13)': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/component': 0.6.9 + '@firebase/installations': 0.6.9(@firebase/app@0.10.13) + '@firebase/messaging-interop-types': 0.2.2 + '@firebase/util': 1.10.0 + idb: 7.1.1 + tslib: 2.7.0 + + '@firebase/performance-compat@0.2.9(@firebase/app-compat@0.2.43)(@firebase/app@0.10.13)': + dependencies: + '@firebase/app-compat': 0.2.43 + '@firebase/component': 0.6.9 + '@firebase/logger': 0.4.2 + '@firebase/performance': 0.6.9(@firebase/app@0.10.13) + '@firebase/performance-types': 0.2.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + transitivePeerDependencies: + - '@firebase/app' + + '@firebase/performance-types@0.2.2': {} + + '@firebase/performance@0.6.9(@firebase/app@0.10.13)': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/component': 0.6.9 + '@firebase/installations': 0.6.9(@firebase/app@0.10.13) + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + + '@firebase/remote-config-compat@0.2.9(@firebase/app-compat@0.2.43)(@firebase/app@0.10.13)': + dependencies: + '@firebase/app-compat': 0.2.43 + '@firebase/component': 0.6.9 + '@firebase/logger': 0.4.2 + '@firebase/remote-config': 0.4.9(@firebase/app@0.10.13) + '@firebase/remote-config-types': 0.3.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + transitivePeerDependencies: + - '@firebase/app' + + '@firebase/remote-config-types@0.3.2': {} + + '@firebase/remote-config@0.4.9(@firebase/app@0.10.13)': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/component': 0.6.9 + '@firebase/installations': 0.6.9(@firebase/app@0.10.13) + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + + '@firebase/storage-compat@0.3.12(@firebase/app-compat@0.2.43)(@firebase/app-types@0.9.2)(@firebase/app@0.10.13)': + dependencies: + '@firebase/app-compat': 0.2.43 + '@firebase/component': 0.6.9 + '@firebase/storage': 0.13.2(@firebase/app@0.10.13) + '@firebase/storage-types': 0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.10.0) + '@firebase/util': 1.10.0 + tslib: 2.7.0 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + + '@firebase/storage-types@0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.10.0)': + dependencies: + '@firebase/app-types': 0.9.2 + '@firebase/util': 1.10.0 + + '@firebase/storage@0.13.2(@firebase/app@0.10.13)': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/component': 0.6.9 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + undici: 6.19.7 + + '@firebase/util@1.10.0': + dependencies: + tslib: 2.7.0 + + '@firebase/vertexai-preview@0.0.4(@firebase/app-types@0.9.2)(@firebase/app@0.10.13)': + dependencies: + '@firebase/app': 0.10.13 + '@firebase/app-check-interop-types': 0.3.2 + '@firebase/app-types': 0.9.2 + '@firebase/component': 0.6.9 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.10.0 + tslib: 2.7.0 + + '@firebase/webchannel-wrapper@1.0.1': {} + '@floating-ui/core@0.6.2': {} '@floating-ui/core@1.6.7': @@ -10607,6 +11159,18 @@ snapshots: '@gar/promisify@1.1.3': {} + '@grpc/grpc-js@1.9.15': + dependencies: + '@grpc/proto-loader': 0.7.13 + '@types/node': 22.7.4 + + '@grpc/proto-loader@0.7.13': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.3 + protobufjs: 7.4.0 + yargs: 17.7.2 + '@headlessui/react@2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react': 0.26.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10941,6 +11505,12 @@ snapshots: dependencies: '@octokit/openapi-types': 12.11.0 + '@openpanel/sdk@1.0.0': {} + + '@openpanel/web@1.0.1': + dependencies: + '@openpanel/sdk': 1.0.0 + '@opentelemetry/api-logs@0.52.1': dependencies: '@opentelemetry/api': 1.9.0 @@ -14709,6 +15279,10 @@ snapshots: dependencies: reusify: 1.0.4 + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + fd-slicer@1.1.0: dependencies: pend: 1.2.0 @@ -14755,6 +15329,39 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + firebase@10.14.1: + dependencies: + '@firebase/analytics': 0.10.8(@firebase/app@0.10.13) + '@firebase/analytics-compat': 0.2.14(@firebase/app-compat@0.2.43)(@firebase/app@0.10.13) + '@firebase/app': 0.10.13 + '@firebase/app-check': 0.8.8(@firebase/app@0.10.13) + '@firebase/app-check-compat': 0.3.15(@firebase/app-compat@0.2.43)(@firebase/app@0.10.13) + '@firebase/app-compat': 0.2.43 + '@firebase/app-types': 0.9.2 + '@firebase/auth': 1.7.9(@firebase/app@0.10.13) + '@firebase/auth-compat': 0.5.14(@firebase/app-compat@0.2.43)(@firebase/app-types@0.9.2)(@firebase/app@0.10.13) + '@firebase/data-connect': 0.1.0(@firebase/app@0.10.13) + '@firebase/database': 1.0.8 + '@firebase/database-compat': 1.0.8 + '@firebase/firestore': 4.7.3(@firebase/app@0.10.13) + '@firebase/firestore-compat': 0.3.38(@firebase/app-compat@0.2.43)(@firebase/app-types@0.9.2)(@firebase/app@0.10.13) + '@firebase/functions': 0.11.8(@firebase/app@0.10.13) + '@firebase/functions-compat': 0.3.14(@firebase/app-compat@0.2.43)(@firebase/app@0.10.13) + '@firebase/installations': 0.6.9(@firebase/app@0.10.13) + '@firebase/installations-compat': 0.2.9(@firebase/app-compat@0.2.43)(@firebase/app-types@0.9.2)(@firebase/app@0.10.13) + '@firebase/messaging': 0.12.12(@firebase/app@0.10.13) + '@firebase/messaging-compat': 0.2.12(@firebase/app-compat@0.2.43)(@firebase/app@0.10.13) + '@firebase/performance': 0.6.9(@firebase/app@0.10.13) + '@firebase/performance-compat': 0.2.9(@firebase/app-compat@0.2.43)(@firebase/app@0.10.13) + '@firebase/remote-config': 0.4.9(@firebase/app@0.10.13) + '@firebase/remote-config-compat': 0.2.9(@firebase/app-compat@0.2.43)(@firebase/app@0.10.13) + '@firebase/storage': 0.13.2(@firebase/app@0.10.13) + '@firebase/storage-compat': 0.3.12(@firebase/app-compat@0.2.43)(@firebase/app-types@0.9.2)(@firebase/app@0.10.13) + '@firebase/util': 1.10.0 + '@firebase/vertexai-preview': 0.0.4(@firebase/app-types@0.9.2)(@firebase/app@0.10.13) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + flat-cache@4.0.1: dependencies: flatted: 3.3.1 @@ -15338,6 +15945,8 @@ snapshots: http-cache-semantics@4.1.1: {} + http-parser-js@0.5.8: {} + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 @@ -15390,6 +15999,8 @@ snapshots: idb-keyval@6.2.1: {} + idb@7.1.1: {} + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -15793,6 +16404,8 @@ snapshots: lodash-es@4.17.21: {} + lodash.camelcase@4.3.0: {} + lodash.castarray@4.4.0: {} lodash.debounce@4.0.8: {} @@ -17133,19 +17746,12 @@ snapshots: postgres-range@1.1.4: {} - posthog-js@1.165.0: + posthog-js@1.169.1: dependencies: fflate: 0.4.8 - preact: 10.24.1 + preact: 10.24.3 web-vitals: 4.2.3 - posthog-node@4.2.0: - dependencies: - axios: 1.7.7(debug@4.3.7) - rusha: 0.8.14 - transitivePeerDependencies: - - debug - postject@1.0.0-alpha.6: dependencies: commander: 9.5.0 @@ -17157,7 +17763,7 @@ snapshots: preact@10.11.3: {} - preact@10.24.1: {} + preact@10.24.3: {} prelude-ls@1.2.1: {} @@ -17745,8 +18351,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - rusha@0.8.14: {} - safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -18340,6 +18944,8 @@ snapshots: undici-types@6.19.8: {} + undici@6.19.7: {} + undici@6.19.8: {} unicode-canonical-property-names-ecmascript@2.0.0: {} @@ -18621,6 +19227,14 @@ snapshots: webpack-virtual-modules@0.5.0: {} + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 diff --git a/types/vite.d.ts b/types/vite.d.ts index 43f292ae00..0f06bfe90c 100644 --- a/types/vite.d.ts +++ b/types/vite.d.ts @@ -5,7 +5,8 @@ interface ImportMetaEnv { VITE_API_URL: string VITE_IMGPROXY_URL: string VITE_SENTRY_DSN: string - VITE_POSTHOG_KEY: string + VITE_OPENPANEL_CLIENT_ID: string + VITE_OPENPANEL_API_URL: string VITE_FIREBASE_CONFIG: string } diff --git a/vite.config.ts b/vite.config.ts index f640893790..af6f5e2fdf 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -135,7 +135,7 @@ export default ({ mode }) => { ], ["tldts"], ["shiki", "@shikijs/transformers"], - ["@sentry/react", "posthog-js"], + ["@sentry/react", "@openpanel/web"], ["zod", "react-hook-form", "@hookform/resolvers"], ["swiper"],