From 39cfada3e8067972fb65b56edcef8229cbb4d80f Mon Sep 17 00:00:00 2001 From: Darren Clarke Date: Fri, 26 Apr 2024 16:29:13 +0200 Subject: [PATCH] Display improvements --- .../@create/_components/Create.tsx | 27 ++++++++------ .../[...segment]/@edit/_components/Edit.tsx | 2 + apps/bridge-frontend/app/_actions/service.ts | 20 ++++++++-- apps/bridge-frontend/app/_lib/facebook.ts | 37 +++++++++++++++++++ apps/bridge-frontend/app/_lib/service.ts | 3 ++ apps/bridge-frontend/app/_lib/signal.ts | 15 ++++++-- apps/bridge-frontend/app/_lib/whatsapp.ts | 15 ++++++-- .../database/migrations/0006-add-webhooks.ts | 1 - packages/ui/components/DisplayTextField.tsx | 2 +- 9 files changed, 98 insertions(+), 24 deletions(-) diff --git a/apps/bridge-frontend/app/(main)/[...segment]/@create/_components/Create.tsx b/apps/bridge-frontend/app/(main)/[...segment]/@create/_components/Create.tsx index 37044b8..3c2fd28 100644 --- a/apps/bridge-frontend/app/(main)/[...segment]/@create/_components/Create.tsx +++ b/apps/bridge-frontend/app/(main)/[...segment]/@create/_components/Create.tsx @@ -39,18 +39,21 @@ export const Create: FC = ({ service }) => { formState={formState} > - {fields.map((field) => ( - - - - ))} + {fields.map( + (field) => + !field.hidden && ( + + + + ), + )} ); diff --git a/apps/bridge-frontend/app/(main)/[...segment]/@edit/_components/Edit.tsx b/apps/bridge-frontend/app/(main)/[...segment]/@edit/_components/Edit.tsx index 23d0b4f..4df53d4 100644 --- a/apps/bridge-frontend/app/(main)/[...segment]/@edit/_components/Edit.tsx +++ b/apps/bridge-frontend/app/(main)/[...segment]/@edit/_components/Edit.tsx @@ -46,6 +46,8 @@ export const Edit: FC = ({ service, row }) => { name={field.name} label={field.label} lines={field.lines ?? 1} + disabled={field.disabled ?? false} + refreshable={field.refreshable ?? false} required={field.required ?? false} formState={formState} helperText={field.helperText} diff --git a/apps/bridge-frontend/app/_actions/service.ts b/apps/bridge-frontend/app/_actions/service.ts index 516456b..f4a309b 100644 --- a/apps/bridge-frontend/app/_actions/service.ts +++ b/apps/bridge-frontend/app/_actions/service.ts @@ -3,6 +3,15 @@ import { revalidatePath } from "next/cache"; import { db, Database } from "@/app/_lib/database"; import { FieldDescription, Entity } from "@/app/_lib/service"; +import crypto from "crypto"; + +const generateToken = () => { + const length = 20; + const randomBytes = crypto.randomBytes(length); + const randomString = randomBytes.toString("hex").slice(0, length); + + return randomString; +}; type CreateActionArgs = { entity: Entity; @@ -20,8 +29,12 @@ export const createAction = async ({ formData, }: CreateActionArgs) => { const newRecord = fields.reduce( - (acc: Record, field: FieldDescription) => { - // @ts-expect-error + (acc: Record, field: FieldDescription) => { + if (field.autogenerated === "token") { + acc[field.name] = generateToken(); + return acc; + } + acc[field.name] = formData.get(field.name)?.toString() ?? null; return acc; }, @@ -56,8 +69,7 @@ export const updateAction = async ({ }: UpdateActionArgs) => { const id = currentState.values.id; const updatedRecord = fields.reduce( - (acc: Record, field: FieldDescription) => { - // @ts-expect-error + (acc: Record, field: FieldDescription) => { acc[field.name] = formData.get(field.name)?.toString() ?? null; return acc; }, diff --git a/apps/bridge-frontend/app/_lib/facebook.ts b/apps/bridge-frontend/app/_lib/facebook.ts index 9c6ab35..b3b9c57 100644 --- a/apps/bridge-frontend/app/_lib/facebook.ts +++ b/apps/bridge-frontend/app/_lib/facebook.ts @@ -26,6 +26,20 @@ export const facebookConfig: ServiceConfig = { label: "Page Access Token", required: true, }, + { + name: "token", + label: "Token", + hidden: true, + required: true, + autogenerated: "token", + }, + { + name: "verifyToken", + label: "Verify Token", + hidden: true, + required: true, + autogenerated: "token", + }, ], updateFields: [ { name: "name", label: "Name", required: true, size: 12 }, @@ -35,6 +49,18 @@ export const facebookConfig: ServiceConfig = { size: 12, lines: 3, }, + { + name: "token", + label: "Token", + disabled: true, + refreshable: true, + }, + { + name: "verifyToken", + label: "Verify Token", + disabled: true, + refreshable: true, + }, { name: "appId", label: "App ID", required: true }, { name: "appSecret", label: "App Secret", required: true }, { name: "pageId", label: "Page ID", required: true }, @@ -52,6 +78,17 @@ export const facebookConfig: ServiceConfig = { required: true, size: 12, }, + { + name: "token", + label: "Token", + copyable: true, + }, + { + name: "verifyToken", + label: "Verify Token", + copyable: true, + }, + { name: "appId", label: "App ID", required: true }, { name: "appSecret", label: "App Secret", required: true }, { diff --git a/apps/bridge-frontend/app/_lib/service.ts b/apps/bridge-frontend/app/_lib/service.ts index 2d317fd..6f2aa8d 100644 --- a/apps/bridge-frontend/app/_lib/service.ts +++ b/apps/bridge-frontend/app/_lib/service.ts @@ -16,9 +16,12 @@ export type Entity = (typeof entities)[number]; export type FieldDescription = { name: string; label: string; + autogenerated?: "token"; + hidden?: boolean; type?: string; lines?: number; copyable?: boolean; + refreshable?: boolean; defaultValue?: string; required?: boolean; disabled?: boolean; diff --git a/apps/bridge-frontend/app/_lib/signal.ts b/apps/bridge-frontend/app/_lib/signal.ts index 1bd06d8..c231545 100644 --- a/apps/bridge-frontend/app/_lib/signal.ts +++ b/apps/bridge-frontend/app/_lib/signal.ts @@ -23,13 +23,19 @@ export const signalConfig: ServiceConfig = { label: "phoneNumber", required: true, }, + { + name: "token", + label: "Token", + hidden: true, + required: true, + autogenerated: "token", + }, ], updateFields: [ { name: "name", label: "Name", required: true, size: 12 }, { name: "description", label: "Description", - required: true, size: 12, }, { @@ -43,13 +49,16 @@ export const signalConfig: ServiceConfig = { { name: "description", label: "Description", - required: true, size: 12, }, { name: "phoneNumber", label: "phoneNumber", - required: true, + }, + { + name: "token", + label: "Token", + copyable: true, }, ], listColumns: [ diff --git a/apps/bridge-frontend/app/_lib/whatsapp.ts b/apps/bridge-frontend/app/_lib/whatsapp.ts index 8c5df1e..35ae4c0 100644 --- a/apps/bridge-frontend/app/_lib/whatsapp.ts +++ b/apps/bridge-frontend/app/_lib/whatsapp.ts @@ -23,13 +23,19 @@ export const whatsappConfig: ServiceConfig = { label: "Phone Number", required: true, }, + { + name: "token", + label: "Token", + hidden: true, + required: true, + autogenerated: "token", + }, ], updateFields: [ { name: "name", label: "Name", required: true, size: 12 }, { name: "description", label: "Description", - required: true, size: 12, }, { @@ -43,13 +49,16 @@ export const whatsappConfig: ServiceConfig = { { name: "description", label: "Description", - required: true, size: 12, }, { name: "phoneNumber", label: "Phone Number", - required: true, + }, + { + name: "token", + label: "Token", + copyable: true, }, ], listColumns: [ diff --git a/apps/bridge-frontend/database/migrations/0006-add-webhooks.ts b/apps/bridge-frontend/database/migrations/0006-add-webhooks.ts index 455fccc..257db6e 100644 --- a/apps/bridge-frontend/database/migrations/0006-add-webhooks.ts +++ b/apps/bridge-frontend/database/migrations/0006-add-webhooks.ts @@ -10,7 +10,6 @@ export async function up(db: Kysely): Promise { .addColumn("description", "text") .addColumn("backend_type", "text", (col) => col.notNull()) .addColumn("backend_id", "uuid", (col) => col.notNull()) - .addColumn("name", "text", (col) => col.notNull()) .addColumn("endpoint_url", "text", (col) => col.notNull().check(sql`endpoint_url ~ '^https?://[^/]+'`), ) diff --git a/packages/ui/components/DisplayTextField.tsx b/packages/ui/components/DisplayTextField.tsx index 84c2519..80d6d3d 100644 --- a/packages/ui/components/DisplayTextField.tsx +++ b/packages/ui/components/DisplayTextField.tsx @@ -48,8 +48,8 @@ export const DisplayTextField: FC = ({ "& .MuiFormLabel-root": { fontSize: 18, color: darkGray, - minWidth: 0, }, + width: "100%", }} InputProps={{ endAdornment: copyable ? (