feat: add more posthog analytics to the application

This commit is contained in:
Ephraim Atta-Duncan
2023-11-24 23:50:51 +00:00
parent e077c36fe4
commit fdf5b3908d
6 changed files with 34 additions and 8 deletions

View File

@ -63,7 +63,7 @@ export default async function DocumentsPage({ searchParams = {} }: DocumentsPage
return ( return (
<div className="mx-auto w-full max-w-screen-xl px-4 md:px-8"> <div className="mx-auto w-full max-w-screen-xl px-4 md:px-8">
<UploadDocument /> <UploadDocument userId={user.id} />
<div className="mt-12 flex flex-wrap items-center justify-between gap-x-4 gap-y-8"> <div className="mt-12 flex flex-wrap items-center justify-between gap-x-4 gap-y-8">
<h1 className="text-4xl font-semibold">Documents</h1> <h1 className="text-4xl font-semibold">Documents</h1>

View File

@ -8,6 +8,7 @@ import { useRouter } from 'next/navigation';
import { Loader } from 'lucide-react'; import { Loader } from 'lucide-react';
import { useLimits } from '@documenso/ee/server-only/limits/provider/client'; import { useLimits } from '@documenso/ee/server-only/limits/provider/client';
import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics';
import { createDocumentData } from '@documenso/lib/server-only/document-data/create-document-data'; import { createDocumentData } from '@documenso/lib/server-only/document-data/create-document-data';
import { putFile } from '@documenso/lib/universal/upload/put-file'; import { putFile } from '@documenso/lib/universal/upload/put-file';
import { TRPCClientError } from '@documenso/trpc/client'; import { TRPCClientError } from '@documenso/trpc/client';
@ -18,10 +19,12 @@ import { useToast } from '@documenso/ui/primitives/use-toast';
export type UploadDocumentProps = { export type UploadDocumentProps = {
className?: string; className?: string;
userId?: number;
}; };
export const UploadDocument = ({ className }: UploadDocumentProps) => { export const UploadDocument = ({ className, userId }: UploadDocumentProps) => {
const router = useRouter(); const router = useRouter();
const analytics = useAnalytics();
const { toast } = useToast(); const { toast } = useToast();
@ -53,6 +56,12 @@ export const UploadDocument = ({ className }: UploadDocumentProps) => {
duration: 5000, duration: 5000,
}); });
analytics.capture('App: Document Uploaded', {
userId,
documentId: id,
timestamp: new Date().toISOString(),
});
router.push(`/documents/${id}`); router.push(`/documents/${id}`);
} catch (error) { } catch (error) {
console.error(error); console.error(error);

View File

@ -7,9 +7,10 @@ import { useRouter } from 'next/navigation';
import { useSession } from 'next-auth/react'; import { useSession } from 'next-auth/react';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics';
import { completeDocumentWithToken } from '@documenso/lib/server-only/document/complete-document-with-token'; import { completeDocumentWithToken } from '@documenso/lib/server-only/document/complete-document-with-token';
import { sortFieldsByPosition, validateFieldsInserted } from '@documenso/lib/utils/fields'; import { sortFieldsByPosition, validateFieldsInserted } from '@documenso/lib/utils/fields';
import { Document, Field, Recipient } from '@documenso/prisma/client'; import type { Document, Field, Recipient } from '@documenso/prisma/client';
import { FieldToolTip } from '@documenso/ui/components/field/field-tooltip'; import { FieldToolTip } from '@documenso/ui/components/field/field-tooltip';
import { cn } from '@documenso/ui/lib/utils'; import { cn } from '@documenso/ui/lib/utils';
import { Button } from '@documenso/ui/primitives/button'; import { Button } from '@documenso/ui/primitives/button';
@ -29,6 +30,7 @@ export type SigningFormProps = {
export const SigningForm = ({ document, recipient, fields }: SigningFormProps) => { export const SigningForm = ({ document, recipient, fields }: SigningFormProps) => {
const router = useRouter(); const router = useRouter();
const analytics = useAnalytics();
const { data: session } = useSession(); const { data: session } = useSession();
const { fullName, signature, setFullName, setSignature } = useRequiredSigningContext(); const { fullName, signature, setFullName, setSignature } = useRequiredSigningContext();
@ -57,6 +59,12 @@ export const SigningForm = ({ document, recipient, fields }: SigningFormProps) =
documentId: document.id, documentId: document.id,
}); });
analytics.capture('App: Document Signing Complete', {
signerId: recipient.id,
documentId: document.id,
timestamp: new Date().toISOString(),
});
router.push(`/sign/${recipient.token}/complete`); router.push(`/sign/${recipient.token}/complete`);
}; };

View File

@ -8,6 +8,7 @@ import { signIn } from 'next-auth/react';
import { Controller, useForm } from 'react-hook-form'; import { Controller, useForm } from 'react-hook-form';
import { z } from 'zod'; import { z } from 'zod';
import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics';
import { TRPCClientError } from '@documenso/trpc/client'; import { TRPCClientError } from '@documenso/trpc/client';
import { trpc } from '@documenso/trpc/react'; import { trpc } from '@documenso/trpc/react';
import { cn } from '@documenso/ui/lib/utils'; import { cn } from '@documenso/ui/lib/utils';
@ -33,6 +34,7 @@ export type SignUpFormProps = {
export const SignUpForm = ({ className }: SignUpFormProps) => { export const SignUpForm = ({ className }: SignUpFormProps) => {
const { toast } = useToast(); const { toast } = useToast();
const analytics = useAnalytics();
const [showPassword, setShowPassword] = useState(false); const [showPassword, setShowPassword] = useState(false);
const { const {
@ -61,6 +63,11 @@ export const SignUpForm = ({ className }: SignUpFormProps) => {
password, password,
callbackUrl: '/', callbackUrl: '/',
}); });
analytics.capture('App: User Sign Up', {
email,
timestamp: new Date().toISOString(),
});
} catch (err) { } catch (err) {
if (err instanceof TRPCClientError && err.data?.code === 'BAD_REQUEST') { if (err instanceof TRPCClientError && err.data?.code === 'BAD_REQUEST') {
toast({ toast({

View File

@ -1,4 +1,4 @@
import Stripe from 'stripe'; import type Stripe from 'stripe';
import { hashSync } from '@documenso/lib/server-only/auth/hash'; import { hashSync } from '@documenso/lib/server-only/auth/hash';
import { sealDocument } from '@documenso/lib/server-only/document/seal-document'; import { sealDocument } from '@documenso/lib/server-only/document/seal-document';

View File

@ -1,9 +1,7 @@
import { z } from 'zod'; import { z } from 'zod';
import { import type { TFeatureFlagValue } from '@documenso/lib/client-only/providers/feature-flag.types';
TFeatureFlagValue, import { ZFeatureFlagValueSchema } from '@documenso/lib/client-only/providers/feature-flag.types';
ZFeatureFlagValueSchema,
} from '@documenso/lib/client-only/providers/feature-flag.types';
import { APP_BASE_URL } from '@documenso/lib/constants/app'; import { APP_BASE_URL } from '@documenso/lib/constants/app';
import { LOCAL_FEATURE_FLAGS, isFeatureFlagEnabled } from '@documenso/lib/constants/feature-flags'; import { LOCAL_FEATURE_FLAGS, isFeatureFlagEnabled } from '@documenso/lib/constants/feature-flags';
@ -20,6 +18,10 @@ export const getFlag = async (
): Promise<TFeatureFlagValue> => { ): Promise<TFeatureFlagValue> => {
const requestHeaders = options?.requestHeaders ?? {}; const requestHeaders = options?.requestHeaders ?? {};
if (!LOCAL_FEATURE_FLAGS[flag]) {
return LOCAL_FEATURE_FLAGS[flag];
}
if (!isFeatureFlagEnabled()) { if (!isFeatureFlagEnabled()) {
return LOCAL_FEATURE_FLAGS[flag] ?? true; return LOCAL_FEATURE_FLAGS[flag] ?? true;
} }