From 59f980c182b55bbbbe666a289db856631358464f Mon Sep 17 00:00:00 2001 From: chasprowebdev <70908289+chasprowebdev@users.noreply.github.com> Date: Mon, 22 Sep 2025 11:35:26 -0400 Subject: [PATCH 01/23] chore: upgrade db package version (#1558) --- apps/api/package.json | 2 +- apps/app/package.json | 2 +- apps/app/trigger.config.ts | 2 +- apps/portal/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index c7630a538..833329e77 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -11,7 +11,7 @@ "@nestjs/core": "^11.0.1", "@nestjs/platform-express": "^11.1.5", "@nestjs/swagger": "^11.2.0", - "@trycompai/db": "^1.3.4", + "@trycompai/db": "^1.3.6", "archiver": "^7.0.1", "axios": "^1.12.2", "class-transformer": "^0.5.1", diff --git a/apps/app/package.json b/apps/app/package.json index 40535ae9d..714985ec5 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -46,7 +46,7 @@ "@tiptap/extension-table-row": "^3.4.4", "@trigger.dev/react-hooks": "4.0.0", "@trigger.dev/sdk": "4.0.0", - "@trycompai/db": "^1.3.4", + "@trycompai/db": "^1.3.6", "@trycompai/email": "workspace:*", "@types/canvas-confetti": "^1.9.0", "@types/three": "^0.180.0", diff --git a/apps/app/trigger.config.ts b/apps/app/trigger.config.ts index 8bd336d62..08ccb221f 100644 --- a/apps/app/trigger.config.ts +++ b/apps/app/trigger.config.ts @@ -13,7 +13,7 @@ export default defineConfig({ extensions: [ prismaExtension({ version: '6.13.0', - dbPackageVersion: '^1.3.0', // Version of @trycompai/db package with compiled JS + dbPackageVersion: '^1.3.6', // Version of @trycompai/db package with compiled JS }), puppeteer(), syncVercelEnvVars(), diff --git a/apps/portal/package.json b/apps/portal/package.json index ee39f6402..3097a2d23 100644 --- a/apps/portal/package.json +++ b/apps/portal/package.json @@ -9,7 +9,7 @@ "@react-email/render": "^1.1.2", "@t3-oss/env-nextjs": "^0.13.8", "@trycompai/analytics": "workspace:*", - "@trycompai/db": "^1.3.4", + "@trycompai/db": "^1.3.6", "@trycompai/email": "workspace:*", "@trycompai/kv": "workspace:*", "@trycompai/ui": "workspace:*", From 227a0fcd56ed6d7a67021097399cfd5cc2546e3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 13:29:36 -0400 Subject: [PATCH 02/23] chore(deps): bump lucide-react from 0.534.0 to 0.544.0 (#1543) Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 0.534.0 to 0.544.0. - [Release notes](https://github.com/lucide-icons/lucide/releases) - [Commits](https://github.com/lucide-icons/lucide/commits/0.544.0/packages/lucide-react) --- updated-dependencies: - dependency-name: lucide-react dependency-version: 0.544.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/app/package.json | 2 +- packages/ui/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/app/package.json b/apps/app/package.json index 714985ec5..280e43332 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -62,7 +62,7 @@ "framer-motion": "^12.18.1", "geist": "^1.3.1", "jspdf": "^3.0.2", - "lucide-react": "^0.534.0", + "lucide-react": "^0.544.0", "motion": "^12.9.2", "next": "^15.4.6", "next-safe-action": "^8.0.3", diff --git a/packages/ui/package.json b/packages/ui/package.json index 38409ec0d..78d29c8c5 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -64,7 +64,7 @@ "embla-carousel-react": "8.6.0", "input-otp": "1.4.2", "jsonfile": "^6.1.0", - "lucide-react": "^0.534.0", + "lucide-react": "^0.544.0", "react-day-picker": "8.10.1", "react-dropzone": "^14.3.5", "react-icons": "^5.3.0", From 3d7ee5fd37f40258b11615a48d57e330567ae7fc Mon Sep 17 00:00:00 2001 From: Dhanus Date: Wed, 24 Sep 2025 19:18:55 +0530 Subject: [PATCH 03/23] feat(portal): display policies with PDF format (#1559) Co-authored-by: Mariano Fuentes --- apps/app/.env.example | 2 +- apps/portal/.env.example | 8 ++- .../[orgId]/components/policy/PolicyCard.tsx | 18 ++--- .../components/policy/PortalPdfViewer.tsx | 72 +++++++++++++++++++ .../policy/[policyId]/PolicyViewer.tsx | 33 +++------ .../(home)/[orgId]/policy/[policyId]/page.tsx | 6 +- .../(app)/(home)/actions/getPolicyPdfUrl.ts | 56 +++++++++++++++ 7 files changed, 158 insertions(+), 37 deletions(-) create mode 100644 apps/portal/src/app/(app)/(home)/[orgId]/components/policy/PortalPdfViewer.tsx create mode 100644 apps/portal/src/app/(app)/(home)/actions/getPolicyPdfUrl.ts diff --git a/apps/app/.env.example b/apps/app/.env.example index 4ebce08b5..883e586e4 100644 --- a/apps/app/.env.example +++ b/apps/app/.env.example @@ -7,7 +7,7 @@ REVALIDATION_SECRET="" # openssl rand -base64 32 NEXT_PUBLIC_PORTAL_URL="http://localhost:3002" # The employee portal uses port 3002 by default # Recommended -# Store attachemnts in any S3 compatible bucket, we use AWS +# Store attachments in any S3 compatible bucket, we use AWS APP_AWS_ACCESS_KEY_ID="" # AWS Access Key ID APP_AWS_SECRET_ACCESS_KEY="" # AWS Secret Access Key APP_AWS_REGION="" # AWS Region diff --git a/apps/portal/.env.example b/apps/portal/.env.example index 9008c6b5e..66398093a 100644 --- a/apps/portal/.env.example +++ b/apps/portal/.env.example @@ -8,4 +8,10 @@ RESEND_DOMAIN="" # ex. mail.trycomp.ai DATABASE_URL="" # Format: postgresql://user:password@host:port/database # Public -NEXT_PUBLIC_BETTER_AUTH_URL="" # http://localhost:30001 \ No newline at end of file +NEXT_PUBLIC_BETTER_AUTH_URL="" # http://localhost:30001 + +# AWS +APP_AWS_ACCESS_KEY_ID="" # AWS Access Key ID +APP_AWS_SECRET_ACCESS_KEY="" # AWS Secret Access Key +APP_AWS_REGION="" # AWS Region +APP_AWS_BUCKET_NAME="" # AWS Bucket Name \ No newline at end of file diff --git a/apps/portal/src/app/(app)/(home)/[orgId]/components/policy/PolicyCard.tsx b/apps/portal/src/app/(app)/(home)/[orgId]/components/policy/PolicyCard.tsx index 355fa0d26..c3f88ffb7 100644 --- a/apps/portal/src/app/(app)/(home)/[orgId]/components/policy/PolicyCard.tsx +++ b/apps/portal/src/app/(app)/(home)/[orgId]/components/policy/PolicyCard.tsx @@ -14,6 +14,7 @@ import type { JSONContent } from '@tiptap/react'; import { ArrowRight, Check } from 'lucide-react'; import { useState } from 'react'; import { PolicyEditor } from './PolicyEditor'; +import { PortalPdfViewer } from './PortalPdfViewer'; interface PolicyCardProps { policy: Policy; @@ -24,14 +25,7 @@ interface PolicyCardProps { isLastPolicy?: boolean; } -export function PolicyCard({ - policy, - onNext, - onComplete, - onClick, - member, - isLastPolicy, -}: PolicyCardProps) { +export function PolicyCard({ policy, onNext, onComplete, member, isLastPolicy }: PolicyCardProps) { const [isAccepted, setIsAccepted] = useState(policy.signedBy.includes(member.id)); const handleAccept = () => { @@ -39,6 +33,8 @@ export function PolicyCard({ onComplete?.(); }; + const isPdfPolicy = policy.displayFormat === 'PDF'; + return ( {isAccepted && ( @@ -68,7 +64,11 @@ export function PolicyCard({
- + {isPdfPolicy ? ( + + ) : ( + + )}

Status: {policy.status}{' '} diff --git a/apps/portal/src/app/(app)/(home)/[orgId]/components/policy/PortalPdfViewer.tsx b/apps/portal/src/app/(app)/(home)/[orgId]/components/policy/PortalPdfViewer.tsx new file mode 100644 index 000000000..cb50d6bc7 --- /dev/null +++ b/apps/portal/src/app/(app)/(home)/[orgId]/components/policy/PortalPdfViewer.tsx @@ -0,0 +1,72 @@ +'use client'; + +import { Card, CardContent } from '@comp/ui/card'; +import { FileText, Loader2 } from 'lucide-react'; +import { useAction } from 'next-safe-action/hooks'; +import { useEffect, useState } from 'react'; +import { toast } from 'sonner'; +import { getPolicyPdfUrl } from '../../../actions/getPolicyPdfUrl'; + +interface PortalPdfViewerProps { + policyId: string; + s3Key?: string | null; +} + +export function PortalPdfViewer({ policyId, s3Key }: PortalPdfViewerProps) { + const [signedUrl, setSignedUrl] = useState(null); + const [isLoading, setIsLoading] = useState(true); + + const { execute: getUrl } = useAction(getPolicyPdfUrl, { + onSuccess: (result) => { + const url = result?.data?.data ?? null; + if (result?.data?.success && url) { + setSignedUrl(url); + } else { + setSignedUrl(null); + toast.error('Could not load the policy document.'); + } + }, + onError: () => toast.error('An error occurred while loading the policy.'), + onSettled: () => setIsLoading(false), + }); + + useEffect(() => { + if (s3Key) { + getUrl({ policyId }); + } else { + setIsLoading(false); + } + }, [s3Key, policyId, getUrl]); + + if (isLoading) { + return ( +

+ +
+ ); + } + + if (signedUrl) { + return ( +