From c43655978755103a5155081168875b96b8ac943d Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Thu, 22 Feb 2024 20:13:17 +0000 Subject: [PATCH 1/3] feat: create a banner with custom text by admin --- .../(dashboard)/admin/banner/banner-form.tsx | 119 ++++++++++++++++++ .../src/app/(dashboard)/admin/banner/page.tsx | 15 +++ apps/web/src/app/(dashboard)/admin/nav.tsx | 18 ++- apps/web/src/app/(dashboard)/layout.tsx | 3 + .../components/(dashboard)/layout/banner.tsx | 21 ++++ packages/lib/server-only/admin/update-user.ts | 2 +- packages/lib/server-only/banner/get-banner.ts | 11 ++ .../lib/server-only/banner/upsert-banner.ts | 28 +++++ .../migration.sql | 12 ++ .../20240222183231_banner_show/migration.sql | 2 + .../migration.sql | 8 ++ packages/prisma/schema.prisma | 27 ++-- packages/trpc/server/banner-router/router.ts | 27 ++++ packages/trpc/server/banner-router/schema.ts | 8 ++ packages/trpc/server/router.ts | 2 + 15 files changed, 291 insertions(+), 12 deletions(-) create mode 100644 apps/web/src/app/(dashboard)/admin/banner/banner-form.tsx create mode 100644 apps/web/src/app/(dashboard)/admin/banner/page.tsx create mode 100644 apps/web/src/components/(dashboard)/layout/banner.tsx create mode 100644 packages/lib/server-only/banner/get-banner.ts create mode 100644 packages/lib/server-only/banner/upsert-banner.ts create mode 100644 packages/prisma/migrations/20240222183156_display_banner/migration.sql create mode 100644 packages/prisma/migrations/20240222183231_banner_show/migration.sql create mode 100644 packages/prisma/migrations/20240222185936_remove_custom/migration.sql create mode 100644 packages/trpc/server/banner-router/router.ts create mode 100644 packages/trpc/server/banner-router/schema.ts diff --git a/apps/web/src/app/(dashboard)/admin/banner/banner-form.tsx b/apps/web/src/app/(dashboard)/admin/banner/banner-form.tsx new file mode 100644 index 000000000..ce7e3e181 --- /dev/null +++ b/apps/web/src/app/(dashboard)/admin/banner/banner-form.tsx @@ -0,0 +1,119 @@ +'use client'; + +import { useRouter } from 'next/navigation'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; + +import { TRPCClientError } from '@documenso/trpc/client'; +import { trpc as trpcReact } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@documenso/ui/primitives/form/form'; +import { Switch } from '@documenso/ui/primitives/switch'; +import { Textarea } from '@documenso/ui/primitives/textarea'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +const ZBannerSchema = z.object({ + text: z.string().optional(), + show: z.boolean().optional(), +}); + +type TBannerSchema = z.infer; + +export function BannerForm({ show, text }: TBannerSchema) { + const router = useRouter(); + const { toast } = useToast(); + + const form = useForm({ + resolver: zodResolver(ZBannerSchema), + defaultValues: { + show, + text, + }, + }); + + const { mutateAsync: updateBanner, isLoading: isUpdatingBanner } = + trpcReact.banner.updateBanner.useMutation(); + + const onBannerUpdate = async ({ show, text }: TBannerSchema) => { + try { + await updateBanner({ + show, + text, + }); + + toast({ + title: 'Banner Updated', + description: 'Your banner has been updated successfully.', + duration: 5000, + }); + + router.refresh(); + } catch (err) { + if (err instanceof TRPCClientError && err.data?.code === 'BAD_REQUEST') { + toast({ + title: 'An error occurred', + description: err.message, + variant: 'destructive', + }); + } else { + toast({ + title: 'An unknown error occurred', + variant: 'destructive', + description: + 'We encountered an unknown error while attempting to reset your password. Please try again later.', + }); + } + } + }; + + return ( +
+ + ( + +
+ Show Banner + Show a banner to the users by the admin +
+ + + +
+ )} + /> + + ( + + Banner Text + +