From 2a448fe06d29d4a98bbada9d4c373d3ade1c210e Mon Sep 17 00:00:00 2001 From: Ashraf Date: Wed, 20 Dec 2023 17:08:09 +0800 Subject: [PATCH 01/55] fix: fixed the recipients viewing issue on touch screens --- .../app/(dashboard)/documents/[id]/page.tsx | 6 +- .../app/(dashboard)/documents/data-table.tsx | 6 +- .../avatar/stack-avatars-component.tsx | 71 +++++++++++++ .../avatar/stack-avatars-with-tooltip.tsx | 99 ------------------- .../avatar/stack-avatars-with-ui.tsx | 51 ++++++++++ 5 files changed, 127 insertions(+), 106 deletions(-) create mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars-component.tsx delete mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx create mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars-with-ui.tsx diff --git a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx index b26b6308c..ce18f27b8 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx @@ -11,7 +11,7 @@ import { DocumentStatus as InternalDocumentStatus } from '@documenso/prisma/clie import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; import { EditDocumentForm } from '~/app/(dashboard)/documents/[id]/edit-document'; -import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; +import { StackAvatarsWithUI } from '~/components/(dashboard)/avatar/stack-avatars-with-ui'; import { DocumentStatus } from '~/components/formatter/document-status'; export type DocumentPageProps = { @@ -71,9 +71,9 @@ export default async function DocumentPage({ params }: DocumentPageProps) {
- + {recipients.length} Recipient(s) - +
)} diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index c8adb1422..a0cc4b8e8 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -12,7 +12,7 @@ import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-documen import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; -import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; +import { StackAvatarsWithUI } from '~/components/(dashboard)/avatar/stack-avatars-with-ui'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; @@ -64,9 +64,7 @@ export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { { header: 'Recipient', accessorKey: 'recipient', - cell: ({ row }) => { - return ; - }, + cell: ({ row }) => , }, { header: 'Status', diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars-component.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars-component.tsx new file mode 100644 index 000000000..d7f3106e6 --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars-component.tsx @@ -0,0 +1,71 @@ +import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; +import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; +import type { Recipient } from '@documenso/prisma/client'; + +import { AvatarWithRecipient } from './avatar-with-recipient'; +import { StackAvatar } from './stack-avatar'; + +export const StackAvatarsComponent = ({ recipients }: { recipients: Recipient[] }) => { + const waitingRecipients = recipients.filter( + (recipient) => getRecipientType(recipient) === 'waiting', + ); + + const openedRecipients = recipients.filter( + (recipient) => getRecipientType(recipient) === 'opened', + ); + + const completedRecipients = recipients.filter( + (recipient) => getRecipientType(recipient) === 'completed', + ); + + const uncompletedRecipients = recipients.filter( + (recipient) => getRecipientType(recipient) === 'unsigned', + ); + return ( +
+ {completedRecipients.length > 0 && ( +
+

Completed

+ {completedRecipients.map((recipient: Recipient) => ( +
+ + {recipient.email} +
+ ))} +
+ )} + + {waitingRecipients.length > 0 && ( +
+

Waiting

+ {waitingRecipients.map((recipient: Recipient) => ( + + ))} +
+ )} + + {openedRecipients.length > 0 && ( +
+

Opened

+ {openedRecipients.map((recipient: Recipient) => ( + + ))} +
+ )} + + {uncompletedRecipients.length > 0 && ( +
+

Uncompleted

+ {uncompletedRecipients.map((recipient: Recipient) => ( + + ))} +
+ )} +
+ ); +}; diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx deleted file mode 100644 index 7429d8ee5..000000000 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; -import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; -import type { Recipient } from '@documenso/prisma/client'; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from '@documenso/ui/primitives/tooltip'; - -import { AvatarWithRecipient } from './avatar-with-recipient'; -import { StackAvatar } from './stack-avatar'; -import { StackAvatars } from './stack-avatars'; - -export type StackAvatarsWithTooltipProps = { - recipients: Recipient[]; - position?: 'top' | 'bottom'; - children?: React.ReactNode; -}; - -export const StackAvatarsWithTooltip = ({ - recipients, - position, - children, -}: StackAvatarsWithTooltipProps) => { - const waitingRecipients = recipients.filter( - (recipient) => getRecipientType(recipient) === 'waiting', - ); - - const openedRecipients = recipients.filter( - (recipient) => getRecipientType(recipient) === 'opened', - ); - - const completedRecipients = recipients.filter( - (recipient) => getRecipientType(recipient) === 'completed', - ); - - const uncompletedRecipients = recipients.filter( - (recipient) => getRecipientType(recipient) === 'unsigned', - ); - - return ( - - - - {children || } - - - -
- {completedRecipients.length > 0 && ( -
-

Completed

- {completedRecipients.map((recipient: Recipient) => ( -
- - {recipient.email} -
- ))} -
- )} - - {waitingRecipients.length > 0 && ( -
-

Waiting

- {waitingRecipients.map((recipient: Recipient) => ( - - ))} -
- )} - - {openedRecipients.length > 0 && ( -
-

Opened

- {openedRecipients.map((recipient: Recipient) => ( - - ))} -
- )} - - {uncompletedRecipients.length > 0 && ( -
-

Uncompleted

- {uncompletedRecipients.map((recipient: Recipient) => ( - - ))} -
- )} -
-
-
-
- ); -}; diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-ui.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-ui.tsx new file mode 100644 index 000000000..5d5f24413 --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-ui.tsx @@ -0,0 +1,51 @@ +'use client'; + +import { useWindowSize } from '@documenso/lib/client-only/hooks/use-window-size'; +import type { Recipient } from '@documenso/prisma/client'; +import { Popover, PopoverContent, PopoverTrigger } from '@documenso/ui/primitives/popover'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@documenso/ui/primitives/tooltip'; + +import { StackAvatars } from './stack-avatars'; +import { StackAvatarsComponent } from './stack-avatars-component'; + +export type StackAvatarsWithUIProps = { + recipients: Recipient[]; + position?: 'top' | 'bottom'; + children?: React.ReactNode; +}; + +export const StackAvatarsWithUI = ({ recipients, position, children }: StackAvatarsWithUIProps) => { + const size = useWindowSize(); + return ( + <> + {size.width > 1050 ? ( + + + + {children || } + + + + + + + + ) : ( + + + {children || } + + + + + + + )} + + ); +}; From ce67de9a1cb1ddb5db8092814c08de8f644fe65d Mon Sep 17 00:00:00 2001 From: Ashraf Date: Fri, 29 Dec 2023 19:29:13 +0800 Subject: [PATCH 02/55] refactor: changed component name for better readability --- apps/web/src/app/(dashboard)/documents/[id]/page.tsx | 6 +++--- apps/web/src/app/(dashboard)/documents/data-table.tsx | 4 ++-- .../{stack-avatars-with-ui.tsx => stack-avatars-ui.tsx} | 5 +++-- 3 files changed, 8 insertions(+), 7 deletions(-) rename apps/web/src/components/(dashboard)/avatar/{stack-avatars-with-ui.tsx => stack-avatars-ui.tsx} (91%) diff --git a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx index ce18f27b8..708746af1 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx @@ -11,7 +11,7 @@ import { DocumentStatus as InternalDocumentStatus } from '@documenso/prisma/clie import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; import { EditDocumentForm } from '~/app/(dashboard)/documents/[id]/edit-document'; -import { StackAvatarsWithUI } from '~/components/(dashboard)/avatar/stack-avatars-with-ui'; +import { StackAvatarsUI } from '~/components/(dashboard)/avatar/stack-avatars-ui'; import { DocumentStatus } from '~/components/formatter/document-status'; export type DocumentPageProps = { @@ -71,9 +71,9 @@ export default async function DocumentPage({ params }: DocumentPageProps) {
- + {recipients.length} Recipient(s) - +
)} diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index a0cc4b8e8..ca2da02d3 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -12,7 +12,7 @@ import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-documen import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; -import { StackAvatarsWithUI } from '~/components/(dashboard)/avatar/stack-avatars-with-ui'; +import { StackAvatarsUI } from '~/components/(dashboard)/avatar/stack-avatars-ui'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; @@ -64,7 +64,7 @@ export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { { header: 'Recipient', accessorKey: 'recipient', - cell: ({ row }) => , + cell: ({ row }) => , }, { header: 'Status', diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-ui.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars-ui.tsx similarity index 91% rename from apps/web/src/components/(dashboard)/avatar/stack-avatars-with-ui.tsx rename to apps/web/src/components/(dashboard)/avatar/stack-avatars-ui.tsx index 5d5f24413..c1c44836a 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-ui.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars-ui.tsx @@ -13,14 +13,15 @@ import { import { StackAvatars } from './stack-avatars'; import { StackAvatarsComponent } from './stack-avatars-component'; -export type StackAvatarsWithUIProps = { +export type StackAvatarsUIProps = { recipients: Recipient[]; position?: 'top' | 'bottom'; children?: React.ReactNode; }; -export const StackAvatarsWithUI = ({ recipients, position, children }: StackAvatarsWithUIProps) => { +export const StackAvatarsUI = ({ recipients, position, children }: StackAvatarsUIProps) => { const size = useWindowSize(); + return ( <> {size.width > 1050 ? ( From 98667dac15235a937d9effbce218aa2a50466108 Mon Sep 17 00:00:00 2001 From: Gautam-Hegde Date: Mon, 22 Jan 2024 12:03:14 +0530 Subject: [PATCH 03/55] chore: code tidy --- .../src/components/(dashboard)/layout/verify-email-banner.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx b/apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx index 24e47c186..43eab21c5 100644 --- a/apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx +++ b/apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx @@ -4,7 +4,7 @@ import { useEffect, useState } from 'react'; import { AlertTriangle } from 'lucide-react'; -import { ONE_SECOND } from '@documenso/lib/constants/time'; +import { ONE_DAY, ONE_SECOND } from '@documenso/lib/constants/time'; import { trpc } from '@documenso/trpc/react'; import { Button } from '@documenso/ui/primitives/button'; import { @@ -65,7 +65,7 @@ export const VerifyEmailBanner = ({ email }: VerifyEmailBannerProps) => { if (emailVerificationDialogLastShown) { const lastShownTimestamp = parseInt(emailVerificationDialogLastShown); - if (Date.now() - lastShownTimestamp < 24 * 60 * 60 * 1000) { + if (Date.now() - lastShownTimestamp < ONE_DAY) { return; } } From 6e22eff5a14905a337fdf5b51aa2a0fe88708fb8 Mon Sep 17 00:00:00 2001 From: Gautam-Hegde Date: Tue, 23 Jan 2024 00:02:04 +0530 Subject: [PATCH 04/55] feat: command grp border --- packages/ui/primitives/command.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/ui/primitives/command.tsx b/packages/ui/primitives/command.tsx index cbc306c66..5f1ebe2e4 100644 --- a/packages/ui/primitives/command.tsx +++ b/packages/ui/primitives/command.tsx @@ -96,7 +96,10 @@ const CommandGroup = React.forwardRef< className, )} {...props} - /> + > +
+ {props.children} + )); CommandGroup.displayName = CommandPrimitive.Group.displayName; From 58f4b729398d5a9f21769c8857ae445fe21bf8a4 Mon Sep 17 00:00:00 2001 From: apoorv taneja Date: Thu, 8 Feb 2024 13:31:38 +0530 Subject: [PATCH 05/55] added fixed width for status col --- apps/web/src/app/(dashboard)/documents/data-table.tsx | 1 + packages/ui/primitives/data-table.tsx | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index c8adb1422..a1bc76b1d 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -72,6 +72,7 @@ export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { header: 'Status', accessorKey: 'status', cell: ({ row }) => , + size: 140, }, { header: 'Actions', diff --git a/packages/ui/primitives/data-table.tsx b/packages/ui/primitives/data-table.tsx index 9cc14a684..55895e08f 100644 --- a/packages/ui/primitives/data-table.tsx +++ b/packages/ui/primitives/data-table.tsx @@ -115,7 +115,12 @@ export function DataTable({ table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( - + {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} From d694f4a17bf5b8b978d3ab223f0aae163473877b Mon Sep 17 00:00:00 2001 From: Rohit Saluja Date: Thu, 7 Mar 2024 18:48:23 +0530 Subject: [PATCH 06/55] fix: show close icon on notification inmobile --- packages/ui/primitives/toast.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/primitives/toast.tsx b/packages/ui/primitives/toast.tsx index b42cadc27..bddf33165 100644 --- a/packages/ui/primitives/toast.tsx +++ b/packages/ui/primitives/toast.tsx @@ -79,7 +79,7 @@ const ToastClose = React.forwardRef< Date: Fri, 8 Mar 2024 10:20:58 +0200 Subject: [PATCH 07/55] docs: add article about public api --- apps/marketing/content/blog/public-api.mdx | 301 ++++++++++++++++++ .../public/blog/api-implementation.webp | Bin 0 -> 56982 bytes apps/marketing/public/blog/api-package.webp | Bin 0 -> 19380 bytes .../public/blog/blog-author-catalin.webp | Bin 0 -> 18814 bytes apps/marketing/public/blog/docs.webp | Bin 0 -> 135304 bytes 5 files changed, 301 insertions(+) create mode 100644 apps/marketing/content/blog/public-api.mdx create mode 100644 apps/marketing/public/blog/api-implementation.webp create mode 100644 apps/marketing/public/blog/api-package.webp create mode 100644 apps/marketing/public/blog/blog-author-catalin.webp create mode 100644 apps/marketing/public/blog/docs.webp diff --git a/apps/marketing/content/blog/public-api.mdx b/apps/marketing/content/blog/public-api.mdx new file mode 100644 index 000000000..dd9a0b174 --- /dev/null +++ b/apps/marketing/content/blog/public-api.mdx @@ -0,0 +1,301 @@ +--- +title: 'Building the Documenso Public API - The Why and How' +description: 'This article talks about the need for the public API and the process of building it. It also discusses the requirements we had to meet and the constraints we had to work within.' +authorName: 'Catalin' +authorImage: '/blog/blog-author-catalin.webp' +authorRole: 'Developer' +date: 2024-03-08 +tags: + - Development + - API +--- + +This article covers the process of building the public API for Documenso. It starts by explaining why the API was needed for a digital document signing company in the first place. Then, it'll dive into the steps we took to build it. Lastly, it'll present the requirements we had to meet and the constraints we had to work within. + +## Why the public API + +We decided to build the public API to open a new way of interacting with Documenso. While the web app does the job well, there are use cases where it's not enough. In those cases, the users might want to interact with the platform programmatically. Usually, that's for integrating Documenso with other applications. + +The new public API enables them to do that. The users can integrate Documenso's functionalities within other applications to automate tasks, create custom solutions, and build custom workflows, to name just a few. + +The API provides 12 endpoints at the time of writing this article: + +- (GET) `/api/v1/documents` - retrieve all the documents +- (POST) `/api/v1/documents` - upload a new document and getting a presigned URL +- (GET) `/api/v1/documents/{id}` - fetch a specific document +- (DELETE) `/api/v1/documents/{id}` - delete a specific document +- (POST) `/api/v1/templates/{templateId}/create-document` - create a new document from an existing template +- (POST) `/api/v1/documents/{id}/send` - send a document for signing +- (POST) `/api/v1/documents/{id}/recipients` - create a document recipient +- (PATCH) `/api/v1/documents/{id}/recipients/{recipientId}` - update the details of a document recipient +- (DELETE) `/api/v1/documents/{id}/recipients/{recipientId}` - delete a specific recipient from a document +- (POST) `/api/v1/documents/{id}/fields` - create a field for a document +- (PATCH) `/api/v1/documents/{id}/fields` - update the details of a document field +- (DELETE) `/api/v1/documents/{id}/fields` - delete a field from a document + +> Check out the [API documentation](https://app.documenso.com/api/v1/openapi). + +Moreover, it also enables us to enhance the platform by bringing other integrations to Documenso, such as Zapier. + +In conclusion, the new public API extends Documenso's capabilities, provides more flexibility for users, and opens up a broader world of possibilities. + +## Picking the right approach & tech + +Once we decided to build the API, we had to choose the approach and technologies to use. There were 2 options: + +1. Build an additional application +2. Launch the API in the existing codebase + +### 1. Build an additional application + +That would mean creating a new codebase and building the API from scratch. Having a separate app for the API would result in benefits such as: + +- lower latency responses +- supporting larger field uploads +- separation between the apps (Documenso and the API) +- customizability and flexibility +- easier testing and debugging + +This approach has significant benefits. However, one major drawback is that it requires additional resources. + +We'd have to spend a lot of time just on the core stuff, such as building and configuring the basic server. After that, we'd spend time implementing the endpoints and authorization, among other things. + +When the building is done, there will be another application to deploy and manage. + +All of this would stretch our already limited resources. + +So, we asked ourselves if there is another way of doing it without sacrificing the API quality and the developer experience. + +### 2. Launch the API in the existing codebase + +The other option was to launch the API in the existing codebase. Rather than writing everything from scratch, we could use most of our existing code. + +Since we're using tRPC for our internal API (backend), we looked for solutions that work well with tRPC. We narrowed down the choices to: + +- [trpc-openapi](https://github.com/jlalmes/trpc-openapi) +- [ts-rest](https://ts-rest.com/) + +Both technologies allow you to build public APIs. The `trpc-openapi` technology allows you to easily turn tRPC procedures into REST endpoints. It's more like a plugin for tRPC. + +On the other hand, `ts-rest` is more of a standalone solution. `ts-rest` enables you to create a contract for the API, which can be used both on the client and server. You can consume and implement the contract in your application, thus providing end-to-end type safety and RPC-like client. + +> You can see a [comparison between trpc-openapi and ts-rest](https://catalins.tech/public-api-trpc/) here. + +So, the main difference between the 2 is that `trpc-openapi` is like a plugin that extends tRPC's capabilities, whereas `ts-rest` provides the tools for building a standalone API. + +### Our choice + +After analyzing and comparing the 2 options, we decided to go with `ts-rest` because of its benefits. + +Here's a paragraph from the `ts-rest` documentation that hits the nail on the head: + +> tRPC has many plugins to solve this issue by mapping the API implementation to a REST-like API, however, these approaches are often a bit clunky and reduce the safety of the system overall, ts-rest does this heavy lifting in the client and server implementations rather than requiring a second layer of abstraction and API endpoint(s) to be defined. + +## API Requirements + +We defined the following requirements for the API: + +- The API should use path-based versioning (e.g. `/v1`) +- The system should use bearer tokens for API authentication + - The API token should be a random string of 32 to 40 characters +- The system should encrypt the token and store the encrypted value +- The system should only display the API token when it's created +- The API should have self-generated documentation like Swagger +- Users should be able to create an API key + - Users should be able to choose a token name + - Users should be able to choose an expiration date for the token + - User should be able to choose between 7 days, 1 month, 3 months, 6 months, 12 months, never +- System should display all the user's tokens in the settings page + - System should display the token name, creation date, expiration date and a delete button +- Users should be able to delete an API key +- Users should be able to retrieve all the documents from their account +- Users should be able to upload a new document + - Users should receive an S3 pre-signed URL after a successful upload +- Users should be able to retrieve a specific document from their account by its id +- Users should be able to delete a specific document from their account by its id +- Users should be able to create a new document from an existing document template +- Users should be able to send a document for signing to 1 or more recipients +- Users should be able to create a recipient for a document +- Users should be able to update the details of a recipient +- Users should be able to delete a recipient from a document +- Users should be able to create a field (e.g. signature, email, name, date) for a document +- Users should be able to update a field for a document +- Users should be able to delete a field from a document + +## Constraints + +We also faced the following constraints while developing the API: + +1. Resources + +Limited resources were one of the main constraints. We're a new startup with a relatively small team. Building and maintaining an additional application would strain our limited resources. + +2. Technology stack + +Another constraint was the technology stack. Our tech stack includes TypeScript, Prisma, and tRPC, among others. We also use Vercel for hosting. + +As a result, we wanted to use technologies we are comfortable with. This allowed us to leverage our existing knowledge and ensured consistency across our applications. + +Using familiar technologies also meant we could develop the API faster, as we didn't have to spend time learning new technologies. We could also leverage existing code and tools used in our main application. + +It's worth mentioning that this is not a permanent decision. We're open to moving the API to another codebase/tech stack when it makes sense (e.g. API is heavily used and needs better performance). + +3. File uploads + +Due to our current architecture, we support file uploads with a maximum size of 50 MB. To circumvent this, we created an additional step for uploading documents. + +Users make a POST request to the `/api/v1/documents` endpoint and the API responds with an S3 pre-signed URL. The users then make a 2nd request to the pre-signed URL with their document. + +## How we built the API + +![API package diagram](api-package.webp) + +Our codebase is a monorepo, so we created a new API package in the `packages` directory. It contains both the API implementation and its documentation. + +The main 2 blocks of the implementation consist of the API contract and the code for the API endpoints. + +![API implementation diagram](api-implementation.webp) + +In a few words, the API contract defines the API structure, the format of the requests and responses, how to authenticate API calls, the available endpoints and their associated HTTP verbs. You can explore the [API contract](https://github.com/documenso/documenso/blob/main/packages/api/v1/contract.ts) on GitHub. + +Then, there's the implementation part, which is the actual code for each endpoint defined in the API contract. The implementation is where the API contract is brought to life and made functional. + +Let's take the endpoint `/api/v1/documents` as an example. + +```ts +export const ApiContractV1 = c.router( + { + getDocuments: { + method: 'GET', + path: '/api/v1/documents', + query: ZGetDocumentsQuerySchema, + responses: { + 200: ZSuccessfulResponseSchema, + 401: ZUnsuccessfulResponseSchema, + 404: ZUnsuccessfulResponseSchema, + }, + summary: 'Get all documents', + }, + ... + } +); +``` + +The API contract specifies the following things for `getDocuments`: + +- the allowed HTTP request method is GET, so trying to make a POST request, for example, results in an error +- the path is `/api/v1/documents` +- the query parameters the user can pass with the request + - in this case - `page` and `perPage` +- the allowed responses and their schema + - `200` returns an object containing an array of all documents and a field `totalPages`, which is self-explanatory + - `401` returns an object with a message such as "Unauthorized" + - `404` returns an object with a message such as "Not found" + +The implementation of this endpoint needs to match the contract completely; otherwise, `ts-rest` will complain, and your API might not work as intended. + +The `getDocuments` function from the `implementation.ts` file runs when the user hits the endpoint. + +```ts +export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { + getDocuments: authenticatedMiddleware(async (args, user, team) => { + const page = Number(args.query.page) || 1; + const perPage = Number(args.query.perPage) || 10; + + const { data: documents, totalPages } = await findDocuments({ + page, + perPage, + userId: user.id, + teamId: team?.id, + }); + + return { + status: 200, + body: { + documents, + totalPages, + }, + }; + }), + ... +}); +``` + +There is a middleware, too, `authenticatedMiddleware`, that handles the authentication for API requests. It ensures that the API token exists and the token used has the appropriate privileges for the resource it accesses. + +So, that's how the other endpoints work as well. The code differs, but the principles are the same. You can explore the [API implementation](https://github.com/documenso/documenso/blob/main/packages/api/v1/implementation.ts) and the [middleware code](https://github.com/documenso/documenso/blob/main/packages/api/v1/middleware/authenticated.ts) on GitHub. + +### Documentation + +For the documentation, we decided to use Swagger UI, which automatically generates the documentation from the OpenAPI specification. + +The OpenAPI specification describes an API containing the available endpoints and their HTTP request methods, authentication methods, and so on. Its purpose is to help both machines and humans understand the API without having to look at the code. + +The Documenso OpenAPI specification is live [here](https://documenso.com/api/v1/openapi.json). + +Thankfully, `ts-rest` makes it seamless to generate the OpenAPI specification. + +```ts +import { generateOpenApi } from '@ts-rest/open-api'; + +import { ApiContractV1 } from './contract'; + +export const OpenAPIV1 = generateOpenApi( + ApiContractV1, + { + info: { + title: 'Documenso API', + version: '1.0.0', + description: 'The Documenso API for retrieving, creating, updating and deleting documents.', + }, + }, + { + setOperationId: true, + }, +); +``` + +Then, the Swagger UI takes the OpenAPI specification as a prop and generates the documentation. The code below shows the component responsible for generating the documentation. + +```ts +'use client'; + +import SwaggerUI from 'swagger-ui-react'; +import 'swagger-ui-react/swagger-ui.css'; + +import { OpenAPIV1 } from '@documenso/api/v1/openapi'; + +export const OpenApiDocsPage = () => { + return ; +}; + +export default OpenApiDocsPage; +``` + +Lastly, we create an API endpoint to display the Swagger documentation. The code below dynamically imports the `OpenApiDocsPage` component and displays it. + +```ts +'use client'; + +import dynamic from 'next/dynamic'; + +const Docs = dynamic(async () => import('@documenso/api/v1/api-documentation'), { + ssr: false, +}); + +export default function OpenApiDocsPage() { + return ; +} +``` + +You can access and play around with the documentation at [documenso.com/api/v1/openapi](https://documenso.com/api/v1/openapi). You should see a page like the one shown in the screenshot below. + +![The documentation for the Documenso API](docs.webp) + +> This article shows how to [generate Swagger documentation for a Next.js API](https://catalins.tech/generate-swagger-documentation-next-js-api/). + +So, that's how we went about building the first iteration of the public API after taking into consideration all the constraints and the current needs. The [GitHub pull request for the API](https://github.com/documenso/documenso/pull/674) is publicly available on GitHub. You can go through it at your own pace. + +## Conclusion + +The current architecture and approach work well for our current stage and needs. However, as we continue to grow and evolve, our architecture and approach will likely need to adapt. We monitor API usage and performance regularly and collect feedback from users. This enables us to find areas for improvement, understand our users' needs, and make informed decisions about the next steps. diff --git a/apps/marketing/public/blog/api-implementation.webp b/apps/marketing/public/blog/api-implementation.webp new file mode 100644 index 0000000000000000000000000000000000000000..575df5dab95ab53bc3cfae13c26745897c89cac2 GIT binary patch literal 56982 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%0DNY?b$G>x{Ng{mc#hw~!KFDu z?Y7vb$e;&wv<~!>RO05Rb4(ZS5ev{d%^Bea1>%Taw-xL%6@)){fM#DOkIKKDccJth zx7OeZ=?VA<>=cRKaG%boWo!8p1rhD=?i|&)hDH8L7sh^jx6tp02E(VnU{Em6T_jSn zh%Q}leG*A>xr)DEzscb@s^c~vk^;PlCxk9H%=#c`8iFTyh*(1DG|>3Fb9>fS&)ytQMRu8v(#2nJBHyGQf^xx7E@ z@s6fVa^1JXY+^2v`jsuI@rLcx7BP={U+0Aa&53-YuW z8fkZ_-@+zkSr1Me1ZxWelH76tMvUtqogv>H4<~H*CmJXQL0~m=O_VK~Bgn99gBx@l zmb%`FJM>;WKZ4zVa5{PY5)Vct~^2a+#V7_ z)qvIvknTTl>lpil{ea`N*ktZ%^2|fp(myug7Z>|$$MG`7%!}o6M51n)Se_QBar8%Q+b*nZ-3(*4GWejS=_RL|r>O&wAVi8r&EH(Npk*70~ z#vCC!;T`?`6tHuH_2A*=gVP_DF4|d2JPD^8Rx(}m7i_) z>vOihG={V>Y zehAmA8C-c65YzNxdvQPA^^vW?+>S(J?mqrIp7!I6YIVG=Jae$U2q{S*0z`bhhY{lx z`ly2N{fj&c+Es=F4ig@1t5$n-G*Q1$Aq@0gJJ0atr7-{-;{1N~nSCRl{hJG3#65bJ z5f6_!sG_deB-1AIW7sCnZN~$B3x5vG6)W+F*oijqaxgn|1@s#X%JS9Wn=54yJs5Jr zi!Epy^bf|wVrr6x(IsFZ-e@w9;r*NpSTG4y@&&NAp2i?Y$x8#4ZRR|2KLhEOTwKF2RjC53{m0``nRm}EdrH34Inb`)sgGvpNnk$HZ7*Q zau}hkB=^azjd{v7AEYa-?QZWmjG>kZ!Q)+7&cojp%0DNU;|0(lT9PXZuk#aRZK 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 WkO^c0nZW-e@H(-Sp}Q*50d)t(H_|fz literal 0 HcmV?d00001 diff --git a/apps/marketing/public/blog/blog-author-catalin.webp b/apps/marketing/public/blog/blog-author-catalin.webp new file mode 100644 index 0000000000000000000000000000000000000000..19803d87d3421590c0c31afbe6eee3ec95bea7f5 GIT binary patch literal 18814 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 Ar2qf` literal 0 HcmV?d00001 diff --git a/apps/marketing/public/blog/docs.webp b/apps/marketing/public/blog/docs.webp new file mode 100644 index 0000000000000000000000000000000000000000..466b560b27fadbe4d349ab2b6d09fb778056723a GIT binary patch literal 135304 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 literal 0 HcmV?d00001 From 41843691e807b59efe1dd3ac1fec2b34e80fd1df Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Fri, 8 Mar 2024 13:44:25 +0200 Subject: [PATCH 08/55] feat: add website cta --- apps/marketing/contentlayer.config.ts | 1 + .../src/app/(marketing)/blog/[post]/page.tsx | 4 +++ .../src/components/(marketing)/CTA.tsx | 26 +++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 apps/marketing/src/components/(marketing)/CTA.tsx diff --git a/apps/marketing/contentlayer.config.ts b/apps/marketing/contentlayer.config.ts index f1ba82b89..10999a408 100644 --- a/apps/marketing/contentlayer.config.ts +++ b/apps/marketing/contentlayer.config.ts @@ -12,6 +12,7 @@ export const BlogPost = defineDocumentType(() => ({ authorName: { type: 'string', required: true }, authorImage: { type: 'string', required: false }, authorRole: { type: 'string', required: true }, + cta: { type: 'boolean', required: false, default: true }, }, computedFields: { href: { type: 'string', resolve: (post) => `/${post._raw.flattenedPath}` }, diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx index 14b8b2d8f..240e8576f 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx @@ -7,6 +7,8 @@ import { ChevronLeft } from 'lucide-react'; import type { MDXComponents } from 'mdx/types'; import { useMDXComponent } from 'next-contentlayer/hooks'; +import CTA from '~/components/(marketing)/CTA'; + export const dynamic = 'force-dynamic'; export const generateMetadata = ({ params }: { params: { post: string } }) => { @@ -89,6 +91,8 @@ export default function BlogPostPage({ params }: { params: { post: string } }) { Back to all posts + + {post.cta && } ); } diff --git a/apps/marketing/src/components/(marketing)/CTA.tsx b/apps/marketing/src/components/(marketing)/CTA.tsx new file mode 100644 index 000000000..b1b1e8603 --- /dev/null +++ b/apps/marketing/src/components/(marketing)/CTA.tsx @@ -0,0 +1,26 @@ +import Link from 'next/link'; + +import { Button } from '@documenso/ui/primitives/button'; + +// import { cn } from '@documenso/ui/lib/utils'; + +export default function CTA() { + return ( +

+

+ Join the Open Document Signing Movement +

+ +

+ Create your account and start using state-of-the-art document signing. Open and beautiful + signing is within your grasp. +

+ + +
+ ); +} From 61ca34eee17074d7025e00eea865d41f46c4686a Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Fri, 8 Mar 2024 13:46:22 +0200 Subject: [PATCH 09/55] removed unused cn --- apps/marketing/src/components/(marketing)/CTA.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/marketing/src/components/(marketing)/CTA.tsx b/apps/marketing/src/components/(marketing)/CTA.tsx index b1b1e8603..92198a0f1 100644 --- a/apps/marketing/src/components/(marketing)/CTA.tsx +++ b/apps/marketing/src/components/(marketing)/CTA.tsx @@ -2,8 +2,6 @@ import Link from 'next/link'; import { Button } from '@documenso/ui/primitives/button'; -// import { cn } from '@documenso/ui/lib/utils'; - export default function CTA() { return (
From 32b0b1bcdaee01cdee9b6ce1b494211263ae487f Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Fri, 8 Mar 2024 12:21:32 +0000 Subject: [PATCH 10/55] fix: revert api change and use mouseenter/mouseleave --- .../app/(dashboard)/documents/[id]/page.tsx | 6 +- .../app/(dashboard)/documents/data-table.tsx | 4 +- .../avatar/stack-avatars-component.tsx | 71 --------- .../(dashboard)/avatar/stack-avatars-ui.tsx | 52 ------- .../avatar/stack-avatars-with-tooltip.tsx | 140 ++++++++++++++++++ 5 files changed, 145 insertions(+), 128 deletions(-) delete mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars-component.tsx delete mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars-ui.tsx create mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx diff --git a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx index bf58ae36a..44f3991d8 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx @@ -13,7 +13,7 @@ import { DocumentStatus as InternalDocumentStatus } from '@documenso/prisma/clie import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; import { EditDocumentForm } from '~/app/(dashboard)/documents/[id]/edit-document'; -import { StackAvatarsUI } from '~/components/(dashboard)/avatar/stack-avatars-ui'; +import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; import { DocumentStatus } from '~/components/formatter/document-status'; export type DocumentPageProps = { @@ -90,9 +90,9 @@ export default async function DocumentPage({ params }: DocumentPageProps) {
- + {recipients.length} Recipient(s) - +
)}
diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index ca2da02d3..72787714f 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -12,7 +12,7 @@ import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-documen import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; -import { StackAvatarsUI } from '~/components/(dashboard)/avatar/stack-avatars-ui'; +import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; @@ -64,7 +64,7 @@ export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { { header: 'Recipient', accessorKey: 'recipient', - cell: ({ row }) => , + cell: ({ row }) => , }, { header: 'Status', diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars-component.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars-component.tsx deleted file mode 100644 index d7f3106e6..000000000 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars-component.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; -import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; -import type { Recipient } from '@documenso/prisma/client'; - -import { AvatarWithRecipient } from './avatar-with-recipient'; -import { StackAvatar } from './stack-avatar'; - -export const StackAvatarsComponent = ({ recipients }: { recipients: Recipient[] }) => { - const waitingRecipients = recipients.filter( - (recipient) => getRecipientType(recipient) === 'waiting', - ); - - const openedRecipients = recipients.filter( - (recipient) => getRecipientType(recipient) === 'opened', - ); - - const completedRecipients = recipients.filter( - (recipient) => getRecipientType(recipient) === 'completed', - ); - - const uncompletedRecipients = recipients.filter( - (recipient) => getRecipientType(recipient) === 'unsigned', - ); - return ( -
- {completedRecipients.length > 0 && ( -
-

Completed

- {completedRecipients.map((recipient: Recipient) => ( -
- - {recipient.email} -
- ))} -
- )} - - {waitingRecipients.length > 0 && ( -
-

Waiting

- {waitingRecipients.map((recipient: Recipient) => ( - - ))} -
- )} - - {openedRecipients.length > 0 && ( -
-

Opened

- {openedRecipients.map((recipient: Recipient) => ( - - ))} -
- )} - - {uncompletedRecipients.length > 0 && ( -
-

Uncompleted

- {uncompletedRecipients.map((recipient: Recipient) => ( - - ))} -
- )} -
- ); -}; diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars-ui.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars-ui.tsx deleted file mode 100644 index c1c44836a..000000000 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars-ui.tsx +++ /dev/null @@ -1,52 +0,0 @@ -'use client'; - -import { useWindowSize } from '@documenso/lib/client-only/hooks/use-window-size'; -import type { Recipient } from '@documenso/prisma/client'; -import { Popover, PopoverContent, PopoverTrigger } from '@documenso/ui/primitives/popover'; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from '@documenso/ui/primitives/tooltip'; - -import { StackAvatars } from './stack-avatars'; -import { StackAvatarsComponent } from './stack-avatars-component'; - -export type StackAvatarsUIProps = { - recipients: Recipient[]; - position?: 'top' | 'bottom'; - children?: React.ReactNode; -}; - -export const StackAvatarsUI = ({ recipients, position, children }: StackAvatarsUIProps) => { - const size = useWindowSize(); - - return ( - <> - {size.width > 1050 ? ( - - - - {children || } - - - - - - - - ) : ( - - - {children || } - - - - - - - )} - - ); -}; diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx new file mode 100644 index 000000000..51fd9c8cd --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx @@ -0,0 +1,140 @@ +import { useRef, useState } from 'react'; + +import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; +import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; +import type { Recipient } from '@documenso/prisma/client'; +import { Popover, PopoverContent, PopoverTrigger } from '@documenso/ui/primitives/popover'; + +import { AvatarWithRecipient } from './avatar-with-recipient'; +import { StackAvatar } from './stack-avatar'; +import { StackAvatars } from './stack-avatars'; + +export type StackAvatarsWithTooltipProps = { + recipients: Recipient[]; + position?: 'top' | 'bottom'; + children?: React.ReactNode; +}; + +export const StackAvatarsWithTooltip = ({ + recipients, + position, + children, +}: StackAvatarsWithTooltipProps) => { + const [open, setOpen] = useState(false); + + const isControlled = useRef(false); + const isMouseOverTimeout = useRef(null); + + const waitingRecipients = recipients.filter( + (recipient) => getRecipientType(recipient) === 'waiting', + ); + + const openedRecipients = recipients.filter( + (recipient) => getRecipientType(recipient) === 'opened', + ); + + const completedRecipients = recipients.filter( + (recipient) => getRecipientType(recipient) === 'completed', + ); + + const uncompletedRecipients = recipients.filter( + (recipient) => getRecipientType(recipient) === 'unsigned', + ); + + const onMouseEnter = () => { + if (isMouseOverTimeout.current) { + clearTimeout(isMouseOverTimeout.current); + } + + if (isControlled.current) { + return; + } + + isMouseOverTimeout.current = setTimeout(() => { + setOpen((o) => (!o ? true : o)); + }, 200); + }; + + const onMouseLeave = () => { + if (isMouseOverTimeout.current) { + clearTimeout(isMouseOverTimeout.current); + } + + if (isControlled.current) { + return; + } + + setTimeout(() => { + setOpen((o) => (o ? false : o)); + }, 200); + }; + + const onOpenChange = (newOpen: boolean) => { + isControlled.current = newOpen; + + setOpen(newOpen); + }; + + return ( + + + {children || } + + + + {completedRecipients.length > 0 && ( +
+

Completed

+ {completedRecipients.map((recipient: Recipient) => ( +
+ + {recipient.email} +
+ ))} +
+ )} + + {waitingRecipients.length > 0 && ( +
+

Waiting

+ {waitingRecipients.map((recipient: Recipient) => ( + + ))} +
+ )} + + {openedRecipients.length > 0 && ( +
+

Opened

+ {openedRecipients.map((recipient: Recipient) => ( + + ))} +
+ )} + + {uncompletedRecipients.length > 0 && ( +
+

Uncompleted

+ {uncompletedRecipients.map((recipient: Recipient) => ( + + ))} +
+ )} +
+
+ ); +}; From 40343d1c7241861ccc59788fef3f47c3b0680f27 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Fri, 8 Mar 2024 12:34:49 +0000 Subject: [PATCH 11/55] fix: add use client directive --- .../(dashboard)/avatar/stack-avatars-with-tooltip.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx index 0e6aa0ac8..10f7d1e6a 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx @@ -1,3 +1,5 @@ +'use client'; + import { useRef, useState } from 'react'; import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; From 0fdb7f7a8d6f80f74cada410c825b4bc000dc5fe Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Fri, 8 Mar 2024 15:30:08 +0200 Subject: [PATCH 12/55] fix: changed to card component --- .../src/components/(marketing)/CTA.tsx | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/apps/marketing/src/components/(marketing)/CTA.tsx b/apps/marketing/src/components/(marketing)/CTA.tsx index 92198a0f1..d7ce572e1 100644 --- a/apps/marketing/src/components/(marketing)/CTA.tsx +++ b/apps/marketing/src/components/(marketing)/CTA.tsx @@ -1,24 +1,26 @@ import Link from 'next/link'; +import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { Button } from '@documenso/ui/primitives/button'; +import { Card, CardContent } from '@documenso/ui/primitives/card'; export default function CTA() { return ( -
-

- Join the Open Document Signing Movement -

+ + +

Join the Open Signing Movement

-

- Create your account and start using state-of-the-art document signing. Open and beautiful - signing is within your grasp. -

+

+ Create your account and start using state-of-the-art document signing. Open and beautiful + signing is within your grasp. +

- -
+ + + ); } From e8b209eb822e9c8280be689599f2ec1ec624adf1 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Fri, 8 Mar 2024 15:46:44 +0200 Subject: [PATCH 13/55] fix: fixed cta component --- .../src/app/(marketing)/blog/[post]/page.tsx | 81 +++---- .../src/app/(marketing)/open/page.tsx | 212 +++++++++--------- .../src/components/(marketing)/CTA.tsx | 8 +- 3 files changed, 153 insertions(+), 148 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx index 240e8576f..917045e5a 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx @@ -44,55 +44,56 @@ export default function BlogPostPage({ params }: { params: { post: string } }) { const MDXContent = useMDXComponent(post.body.code); return ( -
-
- +
+
+
+ -

{post.title}

+

{post.title}

-
-
- {post.authorImage && ( - {`Image - )} -
+
+
+ {post.authorImage && ( + {`Image + )} +
-
-

{post.authorName}

-

{post.authorRole}

+
+

{post.authorName}

+

{post.authorRole}

+
-
- + - {post.tags.length > 0 && ( -
    - {post.tags.map((tag, i) => ( -
  • - {tag} -
  • - ))} -
- )} + {post.tags.length > 0 && ( +
    + {post.tags.map((tag, i) => ( +
  • + {tag} +
  • + ))} +
+ )} -
- - - - Back to all posts - +
+ + + Back to all posts + +
{post.cta && } -
+ ); } diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx index 8fef81134..842d91ff8 100644 --- a/apps/marketing/src/app/(marketing)/open/page.tsx +++ b/apps/marketing/src/app/(marketing)/open/page.tsx @@ -7,6 +7,7 @@ import { getUserMonthlyGrowth } from '@documenso/lib/server-only/user/get-user-m import { FUNDING_RAISED } from '~/app/(marketing)/open/data'; import { MetricCard } from '~/app/(marketing)/open/metric-card'; import { SalaryBands } from '~/app/(marketing)/open/salary-bands'; +import CTA from '~/components/(marketing)/CTA'; import { BarMetric } from './bar-metrics'; import { CapTable } from './cap-table'; @@ -141,114 +142,117 @@ export default async function OpenPage() { const MONTHLY_USERS = await getUserMonthlyGrowth(); return ( -
-
-

Open Startup

+
+
+
+

Open Startup

-

- All our metrics, finances, and learnings are public. We believe in transparency and want - to share our journey with you. You can read more about why here:{' '} - - Announcing Open Metrics - -

-
- -
-
- - - - -
- - - - - - - - - - - data={EARLY_ADOPTERS_DATA} - metricKey="earlyAdopters" - title="Early Adopters" - label="Early Adopters" - className="col-span-12 lg:col-span-6" - extraInfo={} - /> - - - data={STARGAZERS_DATA} - metricKey="stars" - title="Github: Total Stars" - label="Stars" - className="col-span-12 lg:col-span-6" - /> - - - data={STARGAZERS_DATA} - metricKey="mergedPRs" - title="Github: Total Merged PRs" - label="Merged PRs" - chartHeight={300} - className="col-span-12 lg:col-span-6" - /> - - - data={STARGAZERS_DATA} - metricKey="forks" - title="Github: Total Forks" - label="Forks" - chartHeight={300} - className="col-span-12 lg:col-span-6" - /> - - - data={STARGAZERS_DATA} - metricKey="openIssues" - title="Github: Total Open Issues" - label="Open Issues" - chartHeight={300} - className="col-span-12 lg:col-span-6" - /> - - - - - - -
-

Where's the rest?

- -

- We're still working on getting all our metrics together. We'll update this page as soon - as we have more to share. +

+ All our metrics, finances, and learnings are public. We believe in transparency and want + to share our journey with you. You can read more about why here:{' '} + + Announcing Open Metrics +

+ +
+
+ + + + +
+ + + + + + + + + + + data={EARLY_ADOPTERS_DATA} + metricKey="earlyAdopters" + title="Early Adopters" + label="Early Adopters" + className="col-span-12 lg:col-span-6" + extraInfo={} + /> + + + data={STARGAZERS_DATA} + metricKey="stars" + title="Github: Total Stars" + label="Stars" + className="col-span-12 lg:col-span-6" + /> + + + data={STARGAZERS_DATA} + metricKey="mergedPRs" + title="Github: Total Merged PRs" + label="Merged PRs" + chartHeight={300} + className="col-span-12 lg:col-span-6" + /> + + + data={STARGAZERS_DATA} + metricKey="forks" + title="Github: Total Forks" + label="Forks" + chartHeight={300} + className="col-span-12 lg:col-span-6" + /> + + + data={STARGAZERS_DATA} + metricKey="openIssues" + title="Github: Total Open Issues" + label="Open Issues" + chartHeight={300} + className="col-span-12 lg:col-span-6" + /> + + + + + + +
+

Where's the rest?

+ +

+ We're still working on getting all our metrics together. We'll update this page as + soon as we have more to share. +

+
+
+
); } diff --git a/apps/marketing/src/components/(marketing)/CTA.tsx b/apps/marketing/src/components/(marketing)/CTA.tsx index d7ce572e1..dee5e5fae 100644 --- a/apps/marketing/src/components/(marketing)/CTA.tsx +++ b/apps/marketing/src/components/(marketing)/CTA.tsx @@ -6,16 +6,16 @@ import { Card, CardContent } from '@documenso/ui/primitives/card'; export default function CTA() { return ( - - + +

Join the Open Signing Movement

-

+

Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp.

-
- + setEnteredUsername('')}> @@ -103,17 +109,44 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp , along with all of your completed documents, signatures, and all other resources belonging to your Account. + {!hasTwoFactorAuthentication && ( + + Please type {username} to confirm. + + )} + {!hasTwoFactorAuthentication && ( +
+ setEnteredUsername(e.target.value)} + onPaste={(e) => e.preventDefault()} + /> +
+ )} - + {!hasTwoFactorAuthentication && ( + + )}
From b4332257627b442929d43bc41d1975ee1784d370 Mon Sep 17 00:00:00 2001 From: Gautam Hegde <85569489+Gautam-Hegde@users.noreply.github.com> Date: Fri, 8 Mar 2024 22:12:05 +0530 Subject: [PATCH 16/55] Update command.tsx --- packages/ui/primitives/command.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/ui/primitives/command.tsx b/packages/ui/primitives/command.tsx index a36ae8fdc..89777d417 100644 --- a/packages/ui/primitives/command.tsx +++ b/packages/ui/primitives/command.tsx @@ -96,10 +96,7 @@ const CommandGroup = React.forwardRef< className, )} {...props} - > -
- {props.children} - + /> )); CommandGroup.displayName = CommandPrimitive.Group.displayName; From 415f79f82184ab21e6cbcc64cdd5541e3ccc3145 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sun, 10 Mar 2024 11:13:05 +1100 Subject: [PATCH 17/55] fix: update docker docs and compose files --- .env.example | 10 ++++++++++ docker/README.md | 16 +++++++++++++++- docker/production/compose.yml | 3 +++ docker/testing/compose.yml | 2 ++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index c482c128e..20e1ae2ae 100644 --- a/.env.example +++ b/.env.example @@ -27,6 +27,16 @@ E2E_TEST_AUTHENTICATE_USERNAME="Test User" E2E_TEST_AUTHENTICATE_USER_EMAIL="testuser@mail.com" E2E_TEST_AUTHENTICATE_USER_PASSWORD="test_Password123" +# [[SIGNING]] +# OPTIONAL: Defines the signing transport to use. Available options: local (default) +NEXT_PRIVATE_SIGNING_TRANSPORT="local" +# OPTIONAL: Defines the passphrase for the signing certificate. +NEXT_PRIVATE_SIGNING_PASSPHRASE= +# OPTIONAL: Defines the file contents for the signing certificate as a base64 encoded string. +NEXT_PRIVATE_SIGNING_LOCAL_FILE_CONTENTS= +# OPTIONAL: Defines the file path for the signing certificate. defaults to ./example/cert.p12 +NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH= + # [[STORAGE]] # OPTIONAL: Defines the storage transport to use. Available options: database (default) | s3 NEXT_PUBLIC_UPLOAD_TRANSPORT="database" diff --git a/docker/README.md b/docker/README.md index ba942ac1c..bda1638a2 100644 --- a/docker/README.md +++ b/docker/README.md @@ -29,7 +29,16 @@ NEXT_PRIVATE_SMTP_USERNAME="" NEXT_PRIVATE_SMTP_PASSWORD="" ``` -4. Run the following command to start the containers: +4. Update the volume binding for the cert file in the `compose.yml` file to point to your own key file: + +Since the `cert.p12` file is required for signing and encrypting documents, you will need to provide your own key file. Update the volume binding in the `compose.yml` file to point to your key file: + +```yaml +volumes: + - /path/to/your/keyfile.p12:/opt/documenso/cert.p12 +``` + +1. Run the following command to start the containers: ``` docker-compose --env-file ./.env -d up @@ -70,6 +79,7 @@ docker run -d \ -e NEXT_PRIVATE_SMTP_TRANSPORT="" -e NEXT_PRIVATE_SMTP_FROM_NAME="" -e NEXT_PRIVATE_SMTP_FROM_ADDRESS="" + -v /path/to/your/keyfile.p12:/opt/documenso/cert.p12 documenso/documenso ``` @@ -99,6 +109,10 @@ Here's a markdown table documenting all the provided environment variables: | `NEXT_PUBLIC_WEBAPP_URL` | The URL for the web application. | | `NEXT_PRIVATE_DATABASE_URL` | The URL for the primary database connection (with connection pooling). | | `NEXT_PRIVATE_DIRECT_DATABASE_URL` | The URL for the direct database connection (without connection pooling). | +| `NEXT_PRIVATE_SIGNING_TRANSPORT` | The signing transport to use. Available options: local (default) | +| `NEXT_PRIVATE_SIGNING_PASSPHRASE` | The passphrase for the key file. | +| `NEXT_PRIVATE_SIGNING_LOCAL_FILE_CONTENTS` | The base64-encoded contents of the key file, will be used instead of file path. | +| `NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH` | The path to the key file, default `/opt/documenso/cert.p12`. | | `NEXT_PUBLIC_UPLOAD_TRANSPORT` | The transport to use for file uploads (database or s3). | | `NEXT_PRIVATE_UPLOAD_ENDPOINT` | The endpoint for the S3 storage transport (for third-party S3-compatible providers). | | `NEXT_PRIVATE_UPLOAD_REGION` | The region for the S3 storage transport (defaults to us-east-1). | diff --git a/docker/production/compose.yml b/docker/production/compose.yml index 08abcf050..02acc655d 100644 --- a/docker/production/compose.yml +++ b/docker/production/compose.yml @@ -57,8 +57,11 @@ services: - NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT=${NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT} - NEXT_PUBLIC_POSTHOG_KEY=${NEXT_PUBLIC_POSTHOG_KEY} - NEXT_PUBLIC_DISABLE_SIGNUP=${NEXT_PUBLIC_DISABLE_SIGNUP} + - NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH=${NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH?:-/opt/documenso/cert.p12} ports: - ${PORT:-3000}:${PORT:-3000} + volumes: + - /opt/documenso/cert.p12:/opt/documenso/cert.p12 volumes: database: diff --git a/docker/testing/compose.yml b/docker/testing/compose.yml index cecb5bf14..de4a71fea 100644 --- a/docker/testing/compose.yml +++ b/docker/testing/compose.yml @@ -49,3 +49,5 @@ services: - NEXT_PRIVATE_SMTP_FROM_ADDRESS=noreply@documenso.com ports: - 3000:3000 + volumes: + - ../../apps/web/example/cert.p12:/opt/documenso/cert.p12 From 608e622f69a7520a1d70941b2f47547e3a384634 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sun, 10 Mar 2024 13:48:09 +1100 Subject: [PATCH 18/55] fix: update testing compose config --- docker/testing/compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/testing/compose.yml b/docker/testing/compose.yml index de4a71fea..28ec055c1 100644 --- a/docker/testing/compose.yml +++ b/docker/testing/compose.yml @@ -47,6 +47,7 @@ services: - NEXT_PRIVATE_SMTP_PASSWORD=password - NEXT_PRIVATE_SMTP_FROM_NAME="No Reply @ Documenso" - NEXT_PRIVATE_SMTP_FROM_ADDRESS=noreply@documenso.com + - NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH=/opt/documenso/cert.p12 ports: - 3000:3000 volumes: From 9e1b2e5cc3ca51e96fee68578675ee9e483a23c5 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sun, 10 Mar 2024 13:48:25 +1100 Subject: [PATCH 19/55] fix: update sharp dependency --- apps/marketing/package.json | 2 +- apps/web/package.json | 2 +- package-lock.json | 121 ++++++++++++------------------------ 3 files changed, 43 insertions(+), 82 deletions(-) diff --git a/apps/marketing/package.json b/apps/marketing/package.json index 1cfb7337f..f6af3a9ff 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -36,7 +36,7 @@ "react-hook-form": "^7.43.9", "react-icons": "^4.11.0", "recharts": "^2.7.2", - "sharp": "0.33.1", + "sharp": "^0.33.1", "typescript": "5.2.2", "zod": "^3.22.4" }, diff --git a/apps/web/package.json b/apps/web/package.json index 41caec804..e72f4898a 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -43,7 +43,7 @@ "react-icons": "^4.11.0", "react-rnd": "^10.4.1", "remeda": "^1.27.1", - "sharp": "0.33.1", + "sharp": "^0.33.1", "ts-pattern": "^5.0.5", "ua-parser-js": "^1.0.37", "uqr": "^0.1.2", diff --git a/package-lock.json b/package-lock.json index 72d06b98a..d7615e179 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,7 @@ "react-hook-form": "^7.43.9", "react-icons": "^4.11.0", "recharts": "^2.7.2", - "sharp": "0.33.1", + "sharp": "^0.33.1", "typescript": "5.2.2", "zod": "^3.22.4" }, @@ -74,45 +74,6 @@ "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==", "dev": true }, - "apps/marketing/node_modules/sharp": { - "version": "0.33.1", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.1.tgz", - "integrity": "sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==", - "hasInstallScript": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "semver": "^7.5.4" - }, - "engines": { - "libvips": ">=8.15.0", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.1", - "@img/sharp-darwin-x64": "0.33.1", - "@img/sharp-libvips-darwin-arm64": "1.0.0", - "@img/sharp-libvips-darwin-x64": "1.0.0", - "@img/sharp-libvips-linux-arm": "1.0.0", - "@img/sharp-libvips-linux-arm64": "1.0.0", - "@img/sharp-libvips-linux-s390x": "1.0.0", - "@img/sharp-libvips-linux-x64": "1.0.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.0", - "@img/sharp-libvips-linuxmusl-x64": "1.0.0", - "@img/sharp-linux-arm": "0.33.1", - "@img/sharp-linux-arm64": "0.33.1", - "@img/sharp-linux-s390x": "0.33.1", - "@img/sharp-linux-x64": "0.33.1", - "@img/sharp-linuxmusl-arm64": "0.33.1", - "@img/sharp-linuxmusl-x64": "0.33.1", - "@img/sharp-wasm32": "0.33.1", - "@img/sharp-win32-ia32": "0.33.1", - "@img/sharp-win32-x64": "0.33.1" - } - }, "apps/marketing/node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -159,7 +120,7 @@ "react-icons": "^4.11.0", "react-rnd": "^10.4.1", "remeda": "^1.27.1", - "sharp": "0.33.1", + "sharp": "^0.33.1", "ts-pattern": "^5.0.5", "ua-parser-js": "^1.0.37", "uqr": "^0.1.2", @@ -182,45 +143,6 @@ "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==", "dev": true }, - "apps/web/node_modules/sharp": { - "version": "0.33.1", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.1.tgz", - "integrity": "sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==", - "hasInstallScript": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "semver": "^7.5.4" - }, - "engines": { - "libvips": ">=8.15.0", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.1", - "@img/sharp-darwin-x64": "0.33.1", - "@img/sharp-libvips-darwin-arm64": "1.0.0", - "@img/sharp-libvips-darwin-x64": "1.0.0", - "@img/sharp-libvips-linux-arm": "1.0.0", - "@img/sharp-libvips-linux-arm64": "1.0.0", - "@img/sharp-libvips-linux-s390x": "1.0.0", - "@img/sharp-libvips-linux-x64": "1.0.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.0", - "@img/sharp-libvips-linuxmusl-x64": "1.0.0", - "@img/sharp-linux-arm": "0.33.1", - "@img/sharp-linux-arm64": "0.33.1", - "@img/sharp-linux-s390x": "0.33.1", - "@img/sharp-linux-x64": "0.33.1", - "@img/sharp-linuxmusl-arm64": "0.33.1", - "@img/sharp-linuxmusl-x64": "0.33.1", - "@img/sharp-wasm32": "0.33.1", - "@img/sharp-win32-ia32": "0.33.1", - "@img/sharp-win32-x64": "0.33.1" - } - }, "apps/web/node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -18560,6 +18482,45 @@ "sha.js": "bin.js" } }, + "node_modules/sharp": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.1.tgz", + "integrity": "sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "semver": "^7.5.4" + }, + "engines": { + "libvips": ">=8.15.0", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.1", + "@img/sharp-darwin-x64": "0.33.1", + "@img/sharp-libvips-darwin-arm64": "1.0.0", + "@img/sharp-libvips-darwin-x64": "1.0.0", + "@img/sharp-libvips-linux-arm": "1.0.0", + "@img/sharp-libvips-linux-arm64": "1.0.0", + "@img/sharp-libvips-linux-s390x": "1.0.0", + "@img/sharp-libvips-linux-x64": "1.0.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.0", + "@img/sharp-libvips-linuxmusl-x64": "1.0.0", + "@img/sharp-linux-arm": "0.33.1", + "@img/sharp-linux-arm64": "0.33.1", + "@img/sharp-linux-s390x": "0.33.1", + "@img/sharp-linux-x64": "0.33.1", + "@img/sharp-linuxmusl-arm64": "0.33.1", + "@img/sharp-linuxmusl-x64": "0.33.1", + "@img/sharp-wasm32": "0.33.1", + "@img/sharp-win32-ia32": "0.33.1", + "@img/sharp-win32-x64": "0.33.1" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", From f646fa29d7c1c9240810e50d9d8e72e255958be3 Mon Sep 17 00:00:00 2001 From: Brayden Brayden Date: Sun, 10 Mar 2024 07:01:18 +0000 Subject: [PATCH 20/55] fix: ensure password input is cleared when 2fa enable dialog is closed --- .../forms/2fa/enable-authenticator-app-dialog.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx b/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx index 27560c073..e3120141a 100644 --- a/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx +++ b/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx @@ -197,7 +197,14 @@ export const EnableAuthenticatorAppDialog = ({ /> - From 6f958b9320a389f92fc9c16dc7244d666752db4f Mon Sep 17 00:00:00 2001 From: Brayden Brayden Date: Sun, 10 Mar 2024 09:28:08 +0000 Subject: [PATCH 21/55] fix: update the dialog cancel to reset --- .../forms/2fa/enable-authenticator-app-dialog.tsx | 2 +- .../components/forms/2fa/view-recovery-codes-dialog.tsx | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx b/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx index e3120141a..487ebfc32 100644 --- a/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx +++ b/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx @@ -202,7 +202,7 @@ export const EnableAuthenticatorAppDialog = ({ variant="secondary" onClick={() => { onOpenChange(false); - setupTwoFactorAuthenticationForm.setValue('password', ''); + setupTwoFactorAuthenticationForm.reset(); }} > Cancel diff --git a/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx b/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx index 376a8939c..649cbd11c 100644 --- a/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx +++ b/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx @@ -138,7 +138,14 @@ export const ViewRecoveryCodesDialog = ({ open, onOpenChange }: ViewRecoveryCode /> - From afe99e5ec90dd1cc781280c2ad2b702be24e13fc Mon Sep 17 00:00:00 2001 From: Brayden Brayden Date: Sun, 10 Mar 2024 09:36:54 +0000 Subject: [PATCH 22/55] fix: revert reset changes, reset on open state change instead --- .../2fa/enable-authenticator-app-dialog.tsx | 16 +++++++--------- .../forms/2fa/view-recovery-codes-dialog.tsx | 16 +++++++--------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx b/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx index 487ebfc32..cb4cd60e1 100644 --- a/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx +++ b/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx @@ -1,4 +1,4 @@ -import { useMemo } from 'react'; +import { useEffect, useMemo } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; @@ -149,6 +149,11 @@ export const EnableAuthenticatorAppDialog = ({ } }; + useEffect(() => { + // Reset the form when the Dialog open state changes + setupTwoFactorAuthenticationForm.reset(); + }, [open, setupTwoFactorAuthenticationForm]); + return ( @@ -197,14 +202,7 @@ export const EnableAuthenticatorAppDialog = ({ /> - diff --git a/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx b/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx index 649cbd11c..2a83e6499 100644 --- a/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx +++ b/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx @@ -1,4 +1,4 @@ -import { useMemo } from 'react'; +import { useEffect, useMemo } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; @@ -92,6 +92,11 @@ export const ViewRecoveryCodesDialog = ({ open, onOpenChange }: ViewRecoveryCode } }; + useEffect(() => { + // Reset the form when the Dialog open state changes + viewRecoveryCodesForm.reset(); + }, [open, viewRecoveryCodesForm]); + return ( @@ -138,14 +143,7 @@ export const ViewRecoveryCodesDialog = ({ open, onOpenChange }: ViewRecoveryCode /> - From c744482b844e8d8068489267b9256b3e321cf495 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Mon, 11 Mar 2024 10:55:46 +1100 Subject: [PATCH 23/55] fix: add conditional to useEffects --- .../forms/2fa/enable-authenticator-app-dialog.tsx | 6 ++++-- .../src/components/forms/2fa/view-recovery-codes-dialog.tsx | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx b/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx index cb4cd60e1..d7a8f6553 100644 --- a/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx +++ b/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx @@ -150,8 +150,10 @@ export const EnableAuthenticatorAppDialog = ({ }; useEffect(() => { - // Reset the form when the Dialog open state changes - setupTwoFactorAuthenticationForm.reset(); + // Reset the form when the Dialog closes + if (!open) { + setupTwoFactorAuthenticationForm.reset(); + } }, [open, setupTwoFactorAuthenticationForm]); return ( diff --git a/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx b/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx index 2a83e6499..48e343e8d 100644 --- a/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx +++ b/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx @@ -93,8 +93,10 @@ export const ViewRecoveryCodesDialog = ({ open, onOpenChange }: ViewRecoveryCode }; useEffect(() => { - // Reset the form when the Dialog open state changes - viewRecoveryCodesForm.reset(); + // Reset the form when the Dialog closes + if (!open) { + viewRecoveryCodesForm.reset(); + } }, [open, viewRecoveryCodesForm]); return ( From 7f31ab1ce39f6fa8a150b0484d8f9c85dbee8ca0 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Mon, 11 Mar 2024 00:52:56 +0000 Subject: [PATCH 24/55] fix: add scrollbar gutter property --- packages/ui/primitives/data-table.tsx | 2 +- packages/ui/styles/theme.css | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/ui/primitives/data-table.tsx b/packages/ui/primitives/data-table.tsx index 55895e08f..0d8556d89 100644 --- a/packages/ui/primitives/data-table.tsx +++ b/packages/ui/primitives/data-table.tsx @@ -118,7 +118,7 @@ export function DataTable({ {flexRender(cell.column.columnDef.cell, cell.getContext())} diff --git a/packages/ui/styles/theme.css b/packages/ui/styles/theme.css index 8e488ad95..70a06ad15 100644 --- a/packages/ui/styles/theme.css +++ b/packages/ui/styles/theme.css @@ -81,7 +81,7 @@ --ring: 95.08 71.08% 67.45%; --radius: 0.5rem; - + --warning: 54 96% 45%; } } @@ -91,6 +91,11 @@ @apply border-border; } + html, + body { + scrollbar-gutter: stable; + } + body { @apply bg-background text-foreground; font-feature-settings: 'rlig' 1, 'calt' 1; From c2cf25b13835fe8260444a34c0337d8d775343eb Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Mon, 11 Mar 2024 01:46:19 +0000 Subject: [PATCH 25/55] fix: templates incorrectly linking when in a team --- .../templates/data-table-templates.tsx | 6 +++++- .../(dashboard)/templates/data-table-title.tsx | 18 +++++++++++++++--- .../lib/server-only/template/find-templates.ts | 6 ++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx b/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx index e878d8df2..cb00ef6f6 100644 --- a/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx +++ b/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx @@ -25,7 +25,11 @@ type TemplateWithRecipient = Template & { }; type TemplatesDataTableProps = { - templates: TemplateWithRecipient[]; + templates: Array< + TemplateWithRecipient & { + team: { id: number; url: string } | null; + } + >; perPage: number; page: number; totalPages: number; diff --git a/apps/web/src/app/(dashboard)/templates/data-table-title.tsx b/apps/web/src/app/(dashboard)/templates/data-table-title.tsx index 31e1011be..69855ca1e 100644 --- a/apps/web/src/app/(dashboard)/templates/data-table-title.tsx +++ b/apps/web/src/app/(dashboard)/templates/data-table-title.tsx @@ -1,23 +1,35 @@ +'use client'; + import Link from 'next/link'; import { useSession } from 'next-auth/react'; -import { Template } from '@documenso/prisma/client'; +import { formatTemplatesPath } from '@documenso/lib/utils/teams'; +import type { Template } from '@documenso/prisma/client'; + +import { useOptionalCurrentTeam } from '~/providers/team'; export type DataTableTitleProps = { - row: Template; + row: Template & { + team: { id: number; url: string } | null; + }; }; export const DataTableTitle = ({ row }: DataTableTitleProps) => { const { data: session } = useSession(); + const team = useOptionalCurrentTeam(); if (!session) { return null; } + const isCurrentTeamTemplate = team?.url && row.team?.url === team?.url; + + const templatesPath = formatTemplatesPath(isCurrentTeamTemplate ? team?.url : undefined); + return ( {row.title} diff --git a/packages/lib/server-only/template/find-templates.ts b/packages/lib/server-only/template/find-templates.ts index 69b43f9b9..9252d32ea 100644 --- a/packages/lib/server-only/template/find-templates.ts +++ b/packages/lib/server-only/template/find-templates.ts @@ -37,6 +37,12 @@ export const findTemplates = async ({ where: whereFilter, include: { templateDocumentData: true, + team: { + select: { + id: true, + url: true, + }, + }, Field: true, Recipient: true, }, From bbcb90d8a5c08c5337d2ae774b277cb4d9f3fff4 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Mon, 11 Mar 2024 15:00:58 +0530 Subject: [PATCH 26/55] chore: updated url regex Signed-off-by: Adithya Krishna --- packages/lib/constants/url-regex.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lib/constants/url-regex.ts b/packages/lib/constants/url-regex.ts index 259ce070d..1dfb70ad3 100644 --- a/packages/lib/constants/url-regex.ts +++ b/packages/lib/constants/url-regex.ts @@ -1,2 +1,2 @@ export const URL_REGEX = - /^(https?):\/\/(?:www\.)?[a-zA-Z0-9-]+\.[a-zA-Z0-9()]{2,}(?:\/[a-zA-Z0-9-._?&=/]*)?$/i; + /^(https?):\/\/(?:www\.)?(?:[a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[a-zA-Z0-9()]{2,}(?:\/[a-zA-Z0-9-._?&=/]*)?$/i; From efb90ca5fb6748c6aa409516c2e6a669b495f220 Mon Sep 17 00:00:00 2001 From: Gautam-Hegde Date: Mon, 11 Mar 2024 23:17:11 +0530 Subject: [PATCH 27/55] chore: use email confirmation --- .../settings/profile/delete-account-dialog.tsx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx index 2cb60f4a7..72a61d5ed 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx +++ b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx @@ -30,9 +30,9 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp const { toast } = useToast(); const hasTwoFactorAuthentication = user.twoFactorEnabled; - const username = user.name!; + const userEmail = user.email; - const [enteredUsername, setEnteredUsername] = useState(''); + const [enteredEmail, setEnteredEmail] = useState(''); const { mutateAsync: deleteAccount, isLoading: isDeletingAccount } = trpc.profile.deleteAccount.useMutation(); @@ -82,7 +82,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp
- setEnteredUsername('')}> + setEnteredEmail('')}> @@ -111,7 +111,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp {!hasTwoFactorAuthentication && ( - Please type {username} to confirm. + Please type {userEmail} to confirm. )} @@ -120,9 +120,8 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp
setEnteredUsername(e.target.value)} - onPaste={(e) => e.preventDefault()} + value={enteredEmail} + onChange={(e) => setEnteredEmail(e.target.value)} />
)} @@ -133,7 +132,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp onClick={onDeleteAccount} loading={isDeletingAccount} variant="outline" - disabled={hasTwoFactorAuthentication || enteredUsername !== username} + disabled={hasTwoFactorAuthentication || enteredEmail !== userEmail} > {isDeletingAccount ? ( 'Deleting account...' From f6c2b6c1c5a439199585198b4fce2245483f9e58 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Tue, 12 Mar 2024 01:52:16 +0000 Subject: [PATCH 28/55] fix: minor updates --- .../src/app/(marketing)/blog/[post]/page.tsx | 5 +++-- apps/marketing/src/app/(marketing)/open/page.tsx | 5 +++-- .../(marketing)/{CTA.tsx => call-to-action.tsx} | 13 +++++++++---- 3 files changed, 15 insertions(+), 8 deletions(-) rename apps/marketing/src/components/(marketing)/{CTA.tsx => call-to-action.tsx} (77%) diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx index 917045e5a..bd5fdb2da 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx @@ -7,7 +7,7 @@ import { ChevronLeft } from 'lucide-react'; import type { MDXComponents } from 'mdx/types'; import { useMDXComponent } from 'next-contentlayer/hooks'; -import CTA from '~/components/(marketing)/CTA'; +import { CallToAction } from '~/components/(marketing)/call-to-action'; export const dynamic = 'force-dynamic'; @@ -93,7 +93,8 @@ export default function BlogPostPage({ params }: { params: { post: string } }) { Back to all posts - {post.cta && } + + {post.cta && }
); } diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx index 842d91ff8..10ab71aa7 100644 --- a/apps/marketing/src/app/(marketing)/open/page.tsx +++ b/apps/marketing/src/app/(marketing)/open/page.tsx @@ -7,7 +7,7 @@ import { getUserMonthlyGrowth } from '@documenso/lib/server-only/user/get-user-m import { FUNDING_RAISED } from '~/app/(marketing)/open/data'; import { MetricCard } from '~/app/(marketing)/open/metric-card'; import { SalaryBands } from '~/app/(marketing)/open/salary-bands'; -import CTA from '~/components/(marketing)/CTA'; +import { CallToAction } from '~/components/(marketing)/call-to-action'; import { BarMetric } from './bar-metrics'; import { CapTable } from './cap-table'; @@ -252,7 +252,8 @@ export default async function OpenPage() {
- + + ); } diff --git a/apps/marketing/src/components/(marketing)/CTA.tsx b/apps/marketing/src/components/(marketing)/call-to-action.tsx similarity index 77% rename from apps/marketing/src/components/(marketing)/CTA.tsx rename to apps/marketing/src/components/(marketing)/call-to-action.tsx index dee5e5fae..3d1f51b23 100644 --- a/apps/marketing/src/components/(marketing)/CTA.tsx +++ b/apps/marketing/src/components/(marketing)/call-to-action.tsx @@ -4,9 +4,14 @@ import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { Button } from '@documenso/ui/primitives/button'; import { Card, CardContent } from '@documenso/ui/primitives/card'; -export default function CTA() { +type CallToActionProps = { + className?: string; + utmSource?: string; +}; + +export const CallToAction = ({ className, utmSource = 'generic-cta' }: CallToActionProps) => { return ( - +

Join the Open Signing Movement

@@ -16,11 +21,11 @@ export default function CTA() {

); -} +}; From d3f4e20f1cb76da91a68590e6de3880cd923fb2a Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Tue, 12 Mar 2024 02:57:22 +0000 Subject: [PATCH 29/55] fix: update styling and e2e test --- .../profile/delete-account-dialog.tsx | 44 ++++++++----------- .../app-tests/e2e/test-delete-user.spec.ts | 2 + 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx index 72a61d5ed..2e1087380 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx +++ b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx @@ -19,6 +19,7 @@ import { DialogTrigger, } from '@documenso/ui/primitives/dialog'; import { Input } from '@documenso/ui/primitives/input'; +import { Label } from '@documenso/ui/primitives/label'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type DeleteAccountDialogProps = { @@ -30,7 +31,6 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp const { toast } = useToast(); const hasTwoFactorAuthentication = user.twoFactorEnabled; - const userEmail = user.email; const [enteredEmail, setEnteredEmail] = useState(''); @@ -86,6 +86,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp + Delete Account @@ -109,43 +110,34 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp , along with all of your completed documents, signatures, and all other resources belonging to your Account. - {!hasTwoFactorAuthentication && ( - - Please type {userEmail} to confirm. - - )} {!hasTwoFactorAuthentication && (
+ + setEnteredEmail(e.target.value)} />
)} - {!hasTwoFactorAuthentication && ( - - )} +
diff --git a/packages/app-tests/e2e/test-delete-user.spec.ts b/packages/app-tests/e2e/test-delete-user.spec.ts index beae6eb09..6eb72bad9 100644 --- a/packages/app-tests/e2e/test-delete-user.spec.ts +++ b/packages/app-tests/e2e/test-delete-user.spec.ts @@ -16,6 +16,8 @@ test('delete user', async ({ page }) => { }); await page.getByRole('button', { name: 'Delete Account' }).click(); + await page.getByLabel('Confirm Email').fill(user.email); + await expect(page.getByRole('button', { name: 'Confirm Deletion' })).not.toBeDisabled(); await page.getByRole('button', { name: 'Confirm Deletion' }).click(); await page.waitForURL(`${WEBAPP_BASE_URL}/signin`); From 27a69819f9b925119cac61518a0c5bb761593512 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Wed, 13 Mar 2024 09:49:31 +0530 Subject: [PATCH 30/55] feat: added custom styling for swagger ui Signed-off-by: Adithya Krishna --- packages/api/v1/api-documentation.css | 101 ++++++++++++++++++++++++++ packages/api/v1/api-documentation.tsx | 4 + 2 files changed, 105 insertions(+) create mode 100644 packages/api/v1/api-documentation.css diff --git a/packages/api/v1/api-documentation.css b/packages/api/v1/api-documentation.css new file mode 100644 index 000000000..6e2884cbb --- /dev/null +++ b/packages/api/v1/api-documentation.css @@ -0,0 +1,101 @@ +#swagger-ui.api-platform .wrapper { + padding: 0 60px; +} + +#swagger-ui.api-platform .information-container.wrapper { + margin: 0 0 30px; + padding: 10px 0 0; + width: 100%; + max-width: 100%; + background-color: white; + border-bottom: 1px solid #ccc; +} + +#swagger-ui.api-platform .info, #formats { + width: 100%; + max-width: 1460px; + padding: 0 50px; + margin: 0 auto; +} + +#swagger-ui.api-platform .opblock .opblock-summary-method, +#swagger-ui.api-platform .btn.execute { + transition: all ease 0.3s; + background-color: #3CAAB5; + border-color: #3CAAB5; +} + +#swagger-ui.api-platform .opblock .opblock-summary-method:hover, +#swagger-ui.api-platform .btn.execute:hover { + background-color: #288690; + border-color: #288690; +} + +#swagger-ui.api-platform .opblock-summary { + padding: 0; +} + +#swagger-ui.api-platform .opblock-tag:hover { + background-color: rgba(0, 0, 0, .1); + transform: scale(1.01); +} + +#swagger-ui.api-platform .opblock.opblock-get, +#swagger-ui.api-platform .opblock-section-header, +#swagger-ui.api-platform .opblock-summary { + background-color: rgba(60, 170, 181, 0.1); + border-color: #3CAAB5; +} + +#swagger-ui.api-platform .opblock-summary-method { + border-radius: 0; + padding: 10px; +} + +#swagger-ui.api-platform .opblock-tag, .swagger-ui .table-container tr th, +.swagger-ui .table-container tr td { + padding: 5px 0; + margin: 0 0 10px; +} + +#swagger-ui.api-platform .btn-group .btn, #swagger-ui.api-platform .execute-wrapper .btn { + padding: 10px 40px; +} + +#swagger-ui.api-platform .btn { + transition: all ease 0.2s; + box-shadow: none; + background-color: #f7f7f7; +} + +#swagger-ui.api-platform .btn:hover, #swagger-ui.api-platform .btn.cancel:hover, +#swagger-ui.api-platform .btn.authorize:hover { + background-color: rgba(65, 68, 78, 0.1); + border-color: transparent; +} + +#swagger-ui.api-platform select, #swagger-ui.api-platform input:focus, +#swagger-ui.api-platform select:focus, #swagger-ui.api-platform textarea:focus, +#swagger-ui.api-platform button:focus { + box-shadow: none; + cursor: pointer; + outline: none; +} + +.swagger-ui .markdown p, .swagger-ui .markdown pre, +.swagger-ui .renderedMarkdown p, .swagger-ui .renderedMarkdown pre { + margin: 0; +} + +::placeholder, :-moz-placeholder, ::-moz-placeholder, :-ms-input-placeholder { + color: #fff; +} + +:disabled::placeholder, :disabled:-moz-placeholder, +:disabled::-moz-placeholder, :disabled:-ms-input-placeholder { + color: #fafafa; +} + +#swagger-ui .topbar { + display: none; +} diff --git a/packages/api/v1/api-documentation.tsx b/packages/api/v1/api-documentation.tsx index fe394e603..0ecdc4b39 100644 --- a/packages/api/v1/api-documentation.tsx +++ b/packages/api/v1/api-documentation.tsx @@ -5,6 +5,10 @@ import 'swagger-ui-react/swagger-ui.css'; import { OpenAPIV1 } from '@documenso/api/v1/openapi'; +// Custom CSS for the Swagger UI +// eslint-disable-next-line prettier/prettier +import './api-documentation.css'; + export const OpenApiDocsPage = () => { return ; }; From 52afae331e6dfaf907894aff446d8f732bb04a2c Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Wed, 13 Mar 2024 09:50:37 +0530 Subject: [PATCH 31/55] chore: updated to send email to doc owners Signed-off-by: Adithya Krishna --- .../server-only/document/send-completed-email.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/lib/server-only/document/send-completed-email.ts b/packages/lib/server-only/document/send-completed-email.ts index 812e54ba3..2ef1da851 100644 --- a/packages/lib/server-only/document/send-completed-email.ts +++ b/packages/lib/server-only/document/send-completed-email.ts @@ -10,6 +10,7 @@ import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import type { RequestMetadata } from '../../universal/extract-request-metadata'; import { getFile } from '../../universal/upload/get-file'; import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; +import { getUserById } from '../user/get-user-by-id'; export interface SendDocumentOptions { documentId: number; @@ -40,6 +41,7 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo await Promise.all( document.Recipient.map(async (recipient) => { const { email, name, token } = recipient; + const user = await getUserById({ id: document.userId }); const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; @@ -52,10 +54,16 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo await prisma.$transaction( async (tx) => { await mailer.sendMail({ - to: { - address: email, - name, - }, + to: [ + { + address: email, + name, + }, + { + address: user.email, + name: user.name!, + }, + ], from: { name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso', address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com', From e5497efe7c9f74f93e10557fda22aa3cd67c611f Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Wed, 13 Mar 2024 12:38:56 +0530 Subject: [PATCH 32/55] chore: updated dark mode styling Signed-off-by: Adithya Krishna --- packages/api/v1/api-documentation.css | 110 +++----------------------- packages/api/v1/api-documentation.tsx | 2 +- 2 files changed, 10 insertions(+), 102 deletions(-) diff --git a/packages/api/v1/api-documentation.css b/packages/api/v1/api-documentation.css index 6e2884cbb..9edb85748 100644 --- a/packages/api/v1/api-documentation.css +++ b/packages/api/v1/api-documentation.css @@ -1,101 +1,9 @@ -#swagger-ui.api-platform .wrapper { - padding: 0 60px; -} - -#swagger-ui.api-platform .information-container.wrapper { - margin: 0 0 30px; - padding: 10px 0 0; - width: 100%; - max-width: 100%; - background-color: white; - border-bottom: 1px solid #ccc; -} - -#swagger-ui.api-platform .info, #formats { - width: 100%; - max-width: 1460px; - padding: 0 50px; - margin: 0 auto; -} - -#swagger-ui.api-platform .opblock .opblock-summary-method, -#swagger-ui.api-platform .btn.execute { - transition: all ease 0.3s; - background-color: #3CAAB5; - border-color: #3CAAB5; -} - -#swagger-ui.api-platform .opblock .opblock-summary-method:hover, -#swagger-ui.api-platform .btn.execute:hover { - background-color: #288690; - border-color: #288690; -} - -#swagger-ui.api-platform .opblock-summary { - padding: 0; -} - -#swagger-ui.api-platform .opblock-tag:hover { - background-color: rgba(0, 0, 0, .1); - transform: scale(1.01); -} - -#swagger-ui.api-platform .opblock.opblock-get, -#swagger-ui.api-platform .opblock-section-header, -#swagger-ui.api-platform .opblock-summary { - background-color: rgba(60, 170, 181, 0.1); - border-color: #3CAAB5; -} - -#swagger-ui.api-platform .opblock-summary-method { - border-radius: 0; - padding: 10px; -} - -#swagger-ui.api-platform .opblock-tag, .swagger-ui .table-container tr th, -.swagger-ui .table-container tr td { - padding: 5px 0; - margin: 0 0 10px; -} - -#swagger-ui.api-platform .btn-group .btn, #swagger-ui.api-platform .execute-wrapper .btn { - padding: 10px 40px; -} - -#swagger-ui.api-platform .btn { - transition: all ease 0.2s; - box-shadow: none; - background-color: #f7f7f7; -} - -#swagger-ui.api-platform .btn:hover, #swagger-ui.api-platform .btn.cancel:hover, -#swagger-ui.api-platform .btn.authorize:hover { - background-color: rgba(65, 68, 78, 0.1); - border-color: transparent; -} - -#swagger-ui.api-platform select, #swagger-ui.api-platform input:focus, -#swagger-ui.api-platform select:focus, #swagger-ui.api-platform textarea:focus, -#swagger-ui.api-platform button:focus { - box-shadow: none; - cursor: pointer; - outline: none; -} - -.swagger-ui .markdown p, .swagger-ui .markdown pre, -.swagger-ui .renderedMarkdown p, .swagger-ui .renderedMarkdown pre { - margin: 0; -} - -::placeholder, :-moz-placeholder, ::-moz-placeholder, :-ms-input-placeholder { - color: #fff; -} - -:disabled::placeholder, :disabled:-moz-placeholder, -:disabled::-moz-placeholder, :disabled:-ms-input-placeholder { - color: #fafafa; -} - -#swagger-ui .topbar { - display: none; -} +/* Custom CSS for dark mode */ +@media (prefers-color-scheme: dark) { + .swagger-ui { + filter: invert(85%) hue-rotate(180deg); + } + .swagger-ui .microlight { + filter: invert(100%) hue-rotate(180deg); + } +} \ No newline at end of file diff --git a/packages/api/v1/api-documentation.tsx b/packages/api/v1/api-documentation.tsx index 0ecdc4b39..b7c36fa8b 100644 --- a/packages/api/v1/api-documentation.tsx +++ b/packages/api/v1/api-documentation.tsx @@ -5,7 +5,7 @@ import 'swagger-ui-react/swagger-ui.css'; import { OpenAPIV1 } from '@documenso/api/v1/openapi'; -// Custom CSS for the Swagger UI +// Custom Dark Mode CSS for the Swagger UI // eslint-disable-next-line prettier/prettier import './api-documentation.css'; From 025af6e9f46f5e1683f607928fa73c341b68ba43 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Wed, 13 Mar 2024 12:41:08 +0530 Subject: [PATCH 33/55] chore: added eol Signed-off-by: Adithya Krishna --- packages/api/v1/api-documentation.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/v1/api-documentation.css b/packages/api/v1/api-documentation.css index 9edb85748..9deba27ea 100644 --- a/packages/api/v1/api-documentation.css +++ b/packages/api/v1/api-documentation.css @@ -6,4 +6,4 @@ .swagger-ui .microlight { filter: invert(100%) hue-rotate(180deg); } -} \ No newline at end of file +} From cc483016d8d6732b8a47365181dc31cee4323888 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Wed, 13 Mar 2024 13:24:09 +0530 Subject: [PATCH 34/55] chore: updated styling Signed-off-by: Adithya Krishna --- packages/api/v1/api-documentation.css | 9 --------- packages/api/v1/api-documentation.tsx | 23 +++++++++++++++++++---- packages/ui/styles/theme.css | 9 +++++++++ 3 files changed, 28 insertions(+), 13 deletions(-) delete mode 100644 packages/api/v1/api-documentation.css diff --git a/packages/api/v1/api-documentation.css b/packages/api/v1/api-documentation.css deleted file mode 100644 index 9deba27ea..000000000 --- a/packages/api/v1/api-documentation.css +++ /dev/null @@ -1,9 +0,0 @@ -/* Custom CSS for dark mode */ -@media (prefers-color-scheme: dark) { - .swagger-ui { - filter: invert(85%) hue-rotate(180deg); - } - .swagger-ui .microlight { - filter: invert(100%) hue-rotate(180deg); - } -} diff --git a/packages/api/v1/api-documentation.tsx b/packages/api/v1/api-documentation.tsx index b7c36fa8b..98bdd7095 100644 --- a/packages/api/v1/api-documentation.tsx +++ b/packages/api/v1/api-documentation.tsx @@ -1,15 +1,30 @@ 'use client'; +import { useEffect } from 'react'; + +import { useTheme } from 'next-themes'; import SwaggerUI from 'swagger-ui-react'; import 'swagger-ui-react/swagger-ui.css'; import { OpenAPIV1 } from '@documenso/api/v1/openapi'; -// Custom Dark Mode CSS for the Swagger UI -// eslint-disable-next-line prettier/prettier -import './api-documentation.css'; - export const OpenApiDocsPage = () => { + const { theme } = useTheme(); + + useEffect(() => { + const body = document.body; + + if (theme === 'dark') { + body.classList.add('swagger-dark-theme'); + } else { + body.classList.remove('swagger-dark-theme'); + } + + return () => { + body.classList.remove('swagger-dark-theme'); + }; + }, [theme]); + return ; }; diff --git a/packages/ui/styles/theme.css b/packages/ui/styles/theme.css index 70a06ad15..de1927f73 100644 --- a/packages/ui/styles/theme.css +++ b/packages/ui/styles/theme.css @@ -129,3 +129,12 @@ .custom-scrollbar::-webkit-scrollbar-thumb:hover { background: rgb(100 116 139 / 0.5); } + + /* Custom Swagger Dark Theme */ +.swagger-dark-theme .swagger-ui { + filter: invert(88%) hue-rotate(180deg); +} + +.swagger-dark-theme .swagger-ui .microlight { + filter: invert(100%) hue-rotate(180deg); +} \ No newline at end of file From 0488442652fdac10f68587f36fd9244351501226 Mon Sep 17 00:00:00 2001 From: Gautam-Hegde Date: Wed, 13 Mar 2024 13:45:10 +0530 Subject: [PATCH 35/55] fix: pagination discrepancy --- packages/ui/primitives/data-table-pagination.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/ui/primitives/data-table-pagination.tsx b/packages/ui/primitives/data-table-pagination.tsx index feebf6c54..a143960b4 100644 --- a/packages/ui/primitives/data-table-pagination.tsx +++ b/packages/ui/primitives/data-table-pagination.tsx @@ -20,6 +20,9 @@ export function DataTablePagination({ table, additionalInformation = 'VisibleCount', }: DataTablePaginationProps) { + const pageCount = table.getPageCount(); + const isEmptyTable = pageCount === 0; + return (
@@ -65,7 +68,9 @@ export function DataTablePagination({
- Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()} + {isEmptyTable + ? 'Page 1 of 1' + : `Page ${table.getState().pagination.pageIndex + 1} of ${pageCount}`}
@@ -99,7 +104,7 @@ export function DataTablePagination({
); } From d6c8a3d32c5939536f8c87e4b6938f03d35744f8 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 09:20:01 +0000 Subject: [PATCH 41/55] fix: what happens if we use a dynamic import? --- .../src/app/(marketing)/blog/[post]/opengraph/route.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx index 906ee18cd..6f16b5092 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx @@ -1,12 +1,8 @@ import { ImageResponse } from 'next/og'; import { NextResponse } from 'next/server'; -import { allBlogPosts } from 'contentlayer/generated'; - export const runtime = 'edge'; -const contentType = 'image/png'; - const IMAGE_SIZE = { width: 1200, height: 630, @@ -17,6 +13,8 @@ type BlogPostOpenGraphImageProps = { }; export async function GET(_request: Request, { params }: BlogPostOpenGraphImageProps) { + const { allBlogPosts } = await import('contentlayer/generated'); + const blogPost = allBlogPosts.find((post) => post._raw.flattenedPath === `blog/${params.post}`); if (!blogPost) { From 4926b6de509b7b5942a16238030507faf7098f74 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 09:40:26 +0000 Subject: [PATCH 42/55] fix: boring sign/verify approach --- .../blog/[post]/opengraph/route.tsx | 22 +++++++++++-------- .../src/app/(marketing)/blog/[post]/page.tsx | 18 +++++++++++++-- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx index 6f16b5092..f17a7931a 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx @@ -1,6 +1,8 @@ import { ImageResponse } from 'next/og'; import { NextResponse } from 'next/server'; +import { verify } from '@documenso/lib/server-only/crypto/verify'; + export const runtime = 'edge'; const IMAGE_SIZE = { @@ -8,16 +10,18 @@ const IMAGE_SIZE = { height: 630, }; -type BlogPostOpenGraphImageProps = { - params: { post: string }; -}; +export async function GET(_request: Request) { + const url = new URL(_request.url); -export async function GET(_request: Request, { params }: BlogPostOpenGraphImageProps) { - const { allBlogPosts } = await import('contentlayer/generated'); + const signature = url.searchParams.get('sig'); + const title = url.searchParams.get('title'); + const author = url.searchParams.get('author'); - const blogPost = allBlogPosts.find((post) => post._raw.flattenedPath === `blog/${params.post}`); + if (!title || !author || !signature) { + return NextResponse.json({ error: 'Not found' }, { status: 404 }); + } - if (!blogPost) { + if (!verify({ title, author }, signature)) { return NextResponse.json({ error: 'Not found' }, { status: 404 }); } @@ -48,10 +52,10 @@ export async function GET(_request: Request, { params }: BlogPostOpenGraphImageP logo

- {blogPost.title} + {title}

-

Written by {blogPost.authorName}

+

Written by {author}

), { diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx index fc65d9772..d8ef587c4 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx @@ -7,6 +7,8 @@ import { ChevronLeft } from 'lucide-react'; import type { MDXComponents } from 'mdx/types'; import { useMDXComponent } from 'next-contentlayer/hooks'; +import { sign } from '@documenso/lib/server-only/crypto/sign'; + import { CallToAction } from '~/components/(marketing)/call-to-action'; export const dynamic = 'force-dynamic'; @@ -20,16 +22,28 @@ export const generateMetadata = ({ params }: { params: { post: string } }) => { }; } + const signature = sign({ + title: blogPost.title, + author: blogPost.authorName, + }); + + // Use the url constructor to ensure that things are escaped as they should be + const openGraphImageUrl = new URL(`${blogPost.href}/opengraph`); + + openGraphImageUrl.searchParams.set('title', blogPost.title); + openGraphImageUrl.searchParams.set('author', blogPost.authorName); + openGraphImageUrl.searchParams.set('sig', signature); + return { title: { absolute: `${blogPost.title} - Documenso Blog`, }, description: blogPost.description, openGraph: { - images: [`${blogPost.href}/opengraph`], + images: [openGraphImageUrl.toString()], }, twitter: { - images: [`${blogPost.href}/opengraph`], + images: [openGraphImageUrl.toString()], }, }; }; From f5967e28c3fa751b54e1c9ad79bbb04ee52641b9 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 10:02:09 +0000 Subject: [PATCH 43/55] fix: without protection? --- .../blog/[post]/opengraph-image.tsx | 76 ------------------- .../blog/[post]/opengraph/route.tsx | 9 +-- 2 files changed, 1 insertion(+), 84 deletions(-) delete mode 100644 apps/marketing/src/app/(marketing)/blog/[post]/opengraph-image.tsx diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph-image.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph-image.tsx deleted file mode 100644 index 4c01967d2..000000000 --- a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph-image.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { ImageResponse } from 'next/og'; - -import { allBlogPosts } from 'contentlayer/generated'; - -export const runtime = 'edge'; - -export const contentType = 'image/png'; - -export const IMAGE_SIZE = { - width: 1200, - height: 630, -}; - -type BlogPostOpenGraphImageProps = { - params: { post: string }; -}; - -export default async function BlogPostOpenGraphImage({ params }: BlogPostOpenGraphImageProps) { - const blogPost = allBlogPosts.find((post) => post._raw.flattenedPath === `blog/${params.post}`); - - if (!blogPost) { - return null; - } - - // The long urls are needed for a compiler optimisation on the Next.js side, lifting this up - // to a constant will break og image generation. - const [interBold, interRegular, backgroundImage, logoImage] = await Promise.all([ - fetch(new URL('@documenso/assets/fonts/inter-bold.ttf', import.meta.url)).then(async (res) => - res.arrayBuffer(), - ), - fetch(new URL('@documenso/assets/fonts/inter-regular.ttf', import.meta.url)).then(async (res) => - res.arrayBuffer(), - ), - fetch(new URL('@documenso/assets/images/background-blog-og.png', import.meta.url)).then( - async (res) => res.arrayBuffer(), - ), - fetch(new URL('@documenso/assets/logo.png', import.meta.url)).then(async (res) => - res.arrayBuffer(), - ), - ]); - - return new ImageResponse( - ( -
- {/* @ts-expect-error Lack of typing from ImageResponse */} - og-background - - {/* @ts-expect-error Lack of typing from ImageResponse */} - logo - -

- {blogPost.title} -

- -

Written by {blogPost.authorName}

-
- ), - { - ...IMAGE_SIZE, - fonts: [ - { - name: 'Inter', - data: interRegular, - style: 'normal', - weight: 400, - }, - { - name: 'Inter', - data: interBold, - style: 'normal', - weight: 700, - }, - ], - }, - ); -} diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx index f17a7931a..70233bbdd 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx @@ -1,8 +1,6 @@ import { ImageResponse } from 'next/og'; import { NextResponse } from 'next/server'; -import { verify } from '@documenso/lib/server-only/crypto/verify'; - export const runtime = 'edge'; const IMAGE_SIZE = { @@ -13,15 +11,10 @@ const IMAGE_SIZE = { export async function GET(_request: Request) { const url = new URL(_request.url); - const signature = url.searchParams.get('sig'); const title = url.searchParams.get('title'); const author = url.searchParams.get('author'); - if (!title || !author || !signature) { - return NextResponse.json({ error: 'Not found' }, { status: 404 }); - } - - if (!verify({ title, author }, signature)) { + if (!title || !author) { return NextResponse.json({ error: 'Not found' }, { status: 404 }); } From 0db2e6643dd8678283eb3b1ab3ab499bfe62a0fc Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 10:39:48 +0000 Subject: [PATCH 44/55] fix: final final v2 --- .../src/app/(marketing)/blog/[post]/page.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx index d8ef587c4..b0d59edc1 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx @@ -28,11 +28,11 @@ export const generateMetadata = ({ params }: { params: { post: string } }) => { }); // Use the url constructor to ensure that things are escaped as they should be - const openGraphImageUrl = new URL(`${blogPost.href}/opengraph`); - - openGraphImageUrl.searchParams.set('title', blogPost.title); - openGraphImageUrl.searchParams.set('author', blogPost.authorName); - openGraphImageUrl.searchParams.set('sig', signature); + const searchParams = new URLSearchParams({ + title: blogPost.title, + author: blogPost.authorName, + sig: signature, + }); return { title: { @@ -40,10 +40,10 @@ export const generateMetadata = ({ params }: { params: { post: string } }) => { }, description: blogPost.description, openGraph: { - images: [openGraphImageUrl.toString()], + images: [`${blogPost.href}/opengraph?${searchParams.toString()}`], }, twitter: { - images: [openGraphImageUrl.toString()], + images: [`${blogPost.href}/opengraph?${searchParams.toString()}`], }, }; }; From 524a7918d55754a7c26e107f268db298cd7a3eb3 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 10:41:59 +0000 Subject: [PATCH 45/55] fix: toss the signature --- apps/marketing/src/app/(marketing)/blog/[post]/page.tsx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx index b0d59edc1..3e50f8305 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx @@ -7,8 +7,6 @@ import { ChevronLeft } from 'lucide-react'; import type { MDXComponents } from 'mdx/types'; import { useMDXComponent } from 'next-contentlayer/hooks'; -import { sign } from '@documenso/lib/server-only/crypto/sign'; - import { CallToAction } from '~/components/(marketing)/call-to-action'; export const dynamic = 'force-dynamic'; @@ -22,16 +20,10 @@ export const generateMetadata = ({ params }: { params: { post: string } }) => { }; } - const signature = sign({ - title: blogPost.title, - author: blogPost.authorName, - }); - // Use the url constructor to ensure that things are escaped as they should be const searchParams = new URLSearchParams({ title: blogPost.title, author: blogPost.authorName, - sig: signature, }); return { From d5c4885c67a0a71aabf0c370b5a19e77da4de119 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 12:39:09 +0000 Subject: [PATCH 46/55] fix: update signup form to handle password managers better --- apps/web/src/app/(unauthenticated)/layout.tsx | 2 +- .../src/app/(unauthenticated)/signup/page.tsx | 2 +- apps/web/src/components/forms/v2/signup.tsx | 32 ++++++++----------- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/apps/web/src/app/(unauthenticated)/layout.tsx b/apps/web/src/app/(unauthenticated)/layout.tsx index 03a73278f..05055d508 100644 --- a/apps/web/src/app/(unauthenticated)/layout.tsx +++ b/apps/web/src/app/(unauthenticated)/layout.tsx @@ -10,7 +10,7 @@ type UnauthenticatedLayoutProps = { export default function UnauthenticatedLayout({ children }: UnauthenticatedLayoutProps) { return ( -
+
diff --git a/apps/web/src/components/forms/v2/signup.tsx b/apps/web/src/components/forms/v2/signup.tsx index a7e33a759..b3b502993 100644 --- a/apps/web/src/components/forms/v2/signup.tsx +++ b/apps/web/src/components/forms/v2/signup.tsx @@ -108,17 +108,6 @@ export const SignUpFormV2 = ({ const name = form.watch('name'); const url = form.watch('url'); - // To continue we need to make sure name, email, password and signature are valid - const canContinue = - form.formState.dirtyFields.name && - form.formState.errors.name === undefined && - form.formState.dirtyFields.email && - form.formState.errors.email === undefined && - form.formState.dirtyFields.password && - form.formState.errors.password === undefined && - form.formState.dirtyFields.signature && - form.formState.errors.signature === undefined; - const { mutateAsync: signup } = trpc.auth.signup.useMutation(); const onFormSubmit = async ({ name, email, password, signature, url }: TSignUpFormV2Schema) => { @@ -169,6 +158,14 @@ export const SignUpFormV2 = ({ } }; + const onNextClick = async () => { + const valid = await form.trigger(['name', 'email', 'password', 'signature']); + + if (valid) { + setStep('CLAIM_USERNAME'); + } + }; + const onSignUpWithGoogleClick = async () => { try { await signIn('google', { callbackUrl: SIGN_UP_REDIRECT_PATH }); @@ -224,7 +221,7 @@ export const SignUpFormV2 = ({
-
+
{step === 'BASIC_DETAILS' && (

Create a new account

@@ -257,8 +254,8 @@ export const SignUpFormV2 = ({ {step === 'BASIC_DETAILS' && (
@@ -360,8 +357,8 @@ export const SignUpFormV2 = ({ {step === 'CLAIM_USERNAME' && (
@@ -431,9 +428,8 @@ export const SignUpFormV2 = ({ type="button" size="lg" className="flex-1 disabled:cursor-not-allowed" - disabled={!canContinue} loading={form.formState.isSubmitting} - onClick={() => setStep('CLAIM_USERNAME')} + onClick={onNextClick} > Next From fd4d5468cfc331f221d4e2d1a74ae60ac6af7fb4 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 23:52:49 +1100 Subject: [PATCH 47/55] fix: use gif for readme --- README.md | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 93c6d9f95..b83df450a 100644 --- a/README.md +++ b/README.md @@ -30,17 +30,8 @@ Contributor Covenant

-
- - - - - +
+
## About this project From 17c6a4bd55e16f6f7544f85f7166ccc46b7ba1ff Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Fri, 15 Mar 2024 09:18:51 +0530 Subject: [PATCH 48/55] chore: updated focus state of menu switcher Signed-off-by: Adithya Krishna --- .../(dashboard)/layout/menu-switcher.tsx | 2 +- packages/ui/styles/theme.css | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx b/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx index 6e3a4c015..e7959322a 100644 --- a/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx +++ b/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx @@ -93,7 +93,7 @@ export const MenuSwitcher = ({ user, teams: initialTeamsData }: MenuSwitcherProp