feat: setup posthog

This commit is contained in:
Nathnael
2026-07-16 08:52:29 +00:00
parent 6dde17fa4d
commit 318af79962
19 changed files with 513 additions and 190 deletions

View File

@@ -7,6 +7,7 @@ import {
type ReactNode,
} from "react";
import { useIdentify } from "@/lib/posthog";
import { getMeRequest, loginRequest, verifyMfaRequest } from "./api";
import {
AUTH_TOKEN_COOKIE,
@@ -69,6 +70,9 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => {
const [loading, setLoading] = useState(true);
const mfaEmailRef = useRef<string | null>(null);
// Attribute replays and exceptions to the signed-in user (id/org only).
useIdentify(user);
const loadCurrentUser = async () => {
const currentUser = await getMeRequest();
setUser(currentUser);

View File

@@ -5,6 +5,7 @@ import {
emitApiError,
extractApiErrorPayload,
} from "@/components/errors/ApiErrorModal";
import { captureApiError } from "@/lib/posthog";
import {
AUTH_TOKEN_COOKIE,
REFRESH_TOKEN_COOKIE,
@@ -82,6 +83,14 @@ api.interceptors.response.use(
async (error) => {
const originalRequest = error.config as RetriableRequest | undefined;
// Report the failure to PostHog. Hooked here rather than inside
// `emitApiError`, which stays silent on suppressed paths (warehouse /
// mile / onboarding) — those failures still need reporting.
// 401s are skipped: an expired session is refreshed below, not a defect.
if (!error.response || error.response.status !== 401) {
captureApiError(error);
}
if (
error.response?.status !== 401 ||
!originalRequest ||