From 4cb5b2ed382347142114dee7a24b03f442539469 Mon Sep 17 00:00:00 2001 From: Axel Rindle Date: Mon, 2 Sep 2024 08:26:08 +0200 Subject: [PATCH 1/4] add files --- .../20240830100103221_user_profiles.ts | 29 +++ web/.gitignore | 24 +++ web/README.md | 50 +++++ web/bun.lockb | Bin 0 -> 146393 bytes web/components.json | 17 ++ web/index.html | 19 ++ web/package.json | 48 +++++ web/postcss.config.js | 6 + web/public/apple-touch-icon.png | Bin 0 -> 3934 bytes web/public/favicon.ico | Bin 0 -> 5238 bytes web/public/icon-192-maskable.png | Bin 0 -> 4372 bytes web/public/icon-192.png | Bin 0 -> 5878 bytes web/public/icon-512-maskable.png | Bin 0 -> 15591 bytes web/public/icon-512.png | Bin 0 -> 20498 bytes web/src/App.tsx | 23 ++ web/src/assets/react.svg | 1 + web/src/components/Container.tsx | 31 +++ web/src/components/DarkModeToggle.tsx | 48 +++++ web/src/components/supabase/Provider.tsx | 51 +++++ web/src/components/supabase/client.ts | 12 ++ web/src/components/ui/button.tsx | 57 +++++ web/src/components/ui/card.tsx | 76 +++++++ web/src/components/ui/dropdown-menu.tsx | 203 ++++++++++++++++++ web/src/components/ui/form.tsx | 176 +++++++++++++++ web/src/components/ui/input.tsx | 25 +++ web/src/components/ui/label.tsx | 24 +++ web/src/components/ui/tabs.tsx | 53 +++++ web/src/components/ui/toast.tsx | 127 +++++++++++ web/src/components/ui/toaster.tsx | 33 +++ web/src/components/ui/use-toast.ts | 192 +++++++++++++++++ web/src/index.css | 91 ++++++++ web/src/lib/utils.ts | 6 + web/src/main.tsx | 11 + web/src/pages/auth/PageAuth.tsx | 104 +++++++++ web/src/pages/auth/PageLogin.tsx | 88 ++++++++ web/src/pages/auth/PageRegister.tsx | 161 ++++++++++++++ web/src/pages/home/PageHome.tsx | 33 +++ web/src/vite-env.d.ts | 1 + web/tailwind.config.js | 77 +++++++ web/tsconfig.app.json | 34 +++ web/tsconfig.json | 19 ++ web/tsconfig.node.json | 22 ++ web/vite.config.ts | 13 ++ 43 files changed, 1985 insertions(+) create mode 100644 supabase/migrations/20240830100103221_user_profiles.ts create mode 100644 web/.gitignore create mode 100644 web/README.md create mode 100755 web/bun.lockb create mode 100644 web/components.json create mode 100644 web/index.html create mode 100644 web/package.json create mode 100644 web/postcss.config.js create mode 100644 web/public/apple-touch-icon.png create mode 100644 web/public/favicon.ico create mode 100644 web/public/icon-192-maskable.png create mode 100644 web/public/icon-192.png create mode 100644 web/public/icon-512-maskable.png create mode 100644 web/public/icon-512.png create mode 100644 web/src/App.tsx create mode 100644 web/src/assets/react.svg create mode 100644 web/src/components/Container.tsx create mode 100644 web/src/components/DarkModeToggle.tsx create mode 100644 web/src/components/supabase/Provider.tsx create mode 100644 web/src/components/supabase/client.ts create mode 100644 web/src/components/ui/button.tsx create mode 100644 web/src/components/ui/card.tsx create mode 100644 web/src/components/ui/dropdown-menu.tsx create mode 100644 web/src/components/ui/form.tsx create mode 100644 web/src/components/ui/input.tsx create mode 100644 web/src/components/ui/label.tsx create mode 100644 web/src/components/ui/tabs.tsx create mode 100644 web/src/components/ui/toast.tsx create mode 100644 web/src/components/ui/toaster.tsx create mode 100644 web/src/components/ui/use-toast.ts create mode 100644 web/src/index.css create mode 100644 web/src/lib/utils.ts create mode 100644 web/src/main.tsx create mode 100644 web/src/pages/auth/PageAuth.tsx create mode 100644 web/src/pages/auth/PageLogin.tsx create mode 100644 web/src/pages/auth/PageRegister.tsx create mode 100644 web/src/pages/home/PageHome.tsx create mode 100644 web/src/vite-env.d.ts create mode 100644 web/tailwind.config.js create mode 100644 web/tsconfig.app.json create mode 100644 web/tsconfig.json create mode 100644 web/tsconfig.node.json create mode 100644 web/vite.config.ts diff --git a/supabase/migrations/20240830100103221_user_profiles.ts b/supabase/migrations/20240830100103221_user_profiles.ts new file mode 100644 index 0000000..91de2c0 --- /dev/null +++ b/supabase/migrations/20240830100103221_user_profiles.ts @@ -0,0 +1,29 @@ +import type { ColumnDefinitions, MigrationBuilder } from 'node-pg-migrate' + +export const shorthands: ColumnDefinitions | undefined = undefined + +export async function up(pgm: MigrationBuilder): Promise { + pgm.createTable('profile', { + user_id: { + type: 'uuid', + notNull: true, + references: '"auth"."users"', + onUpdate: 'CASCADE', + onDelete: 'CASCADE', + }, + firstname: { + type: 'text', + notNull: true, + }, + lastname: { + type: 'text', + notNull: true, + }, + }) + pgm.createIndex('profile', 'user_id') +} + +export async function down(pgm: MigrationBuilder): Promise { + pgm.dropIndex('profile', 'user_id') + pgm.dropTable('profile') +} diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..74872fd --- /dev/null +++ b/web/README.md @@ -0,0 +1,50 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react' + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}) +``` diff --git a/web/bun.lockb b/web/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..74392063a5eed62fce4fb118cee6947cfd2aae49 GIT binary patch literal 146393 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 literal 0 HcmV?d00001 diff --git a/web/components.json b/web/components.json new file mode 100644 index 0000000..80ca630 --- /dev/null +++ b/web/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "stone", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..d7a6c5a --- /dev/null +++ b/web/index.html @@ -0,0 +1,19 @@ + + + + + + + + + + + @actcoding/supa-cli + + + +
+ + + + diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..d34f158 --- /dev/null +++ b/web/package.json @@ -0,0 +1,48 @@ +{ + "name": "web", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@hookform/resolvers": "^3.9.0", + "@radix-ui/react-dropdown-menu": "^2.1.1", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-tabs": "^1.1.0", + "@radix-ui/react-toast": "^1.2.1", + "@supabase/supabase-js": "^2.45.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-hook-form": "^7.53.0", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7", + "usehooks-ts": "^3.1.0", + "zod": "^3.23.8" + }, + "devDependencies": { + "@eslint/js": "^9.9.0", + "@types/node": "^22.5.1", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "eslint": "^9.9.0", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.9", + "globals": "^15.9.0", + "postcss": "^8.4.41", + "tailwindcss": "^3.4.10", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.1", + "vite": "^5.4.1" + } +} diff --git a/web/postcss.config.js b/web/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/web/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/web/public/apple-touch-icon.png b/web/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8baca2f992a79cf8a080db4058d518695e36c829 GIT binary patch literal 3934 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 XKw~3~udrP_%v8EshMHySwqgGP<0F4V literal 0 HcmV?d00001 diff --git a/web/public/favicon.ico b/web/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3497fde49f3634f7a7a209e0e702f87a4a2c798c GIT binary patch literal 5238 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 literal 0 HcmV?d00001 diff --git a/web/public/icon-192.png b/web/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..0d64cee8217962a3e58b9800788a9d7d98dc3c2d GIT binary patch literal 5878 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 Qz(3cNZz$zmv3UId08OuDNdN!< literal 0 HcmV?d00001 diff --git a/web/src/App.tsx b/web/src/App.tsx new file mode 100644 index 0000000..cf5fdc0 --- /dev/null +++ b/web/src/App.tsx @@ -0,0 +1,23 @@ +import SupabaseProvider, { useSupabase } from '@/components/supabase/Provider.tsx' +import { Toaster } from '@/components/ui/toaster.tsx' +import PageAuth from '@/pages/auth/PageAuth.tsx' +import PageHome from '@/pages/home/PageHome.tsx' + +export function Switch() { + const { session } = useSupabase() + + if (session) { + return + } + + return +} + +export default function App() { + return (<> + + + + + ) +} diff --git a/web/src/assets/react.svg b/web/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/web/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/components/Container.tsx b/web/src/components/Container.tsx new file mode 100644 index 0000000..09d9aac --- /dev/null +++ b/web/src/components/Container.tsx @@ -0,0 +1,31 @@ +import { cn } from '@/lib/utils.ts' +import { cva, VariantProps } from 'class-variance-authority' +import { HTMLAttributes, PropsWithChildren } from 'react' + +const containerVariants = cva( + 'container flex flex-col gap-y-6', + { + variants: { + variant: { + default: 'items-start', + centered: 'items-center', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +type Props = PropsWithChildren> & VariantProps + +export default function Container({ className, variant, children, ...props}: Props) { + return ( +
+ {children} +
+ ) +} diff --git a/web/src/components/DarkModeToggle.tsx b/web/src/components/DarkModeToggle.tsx new file mode 100644 index 0000000..5b28dfc --- /dev/null +++ b/web/src/components/DarkModeToggle.tsx @@ -0,0 +1,48 @@ +import { useTernaryDarkMode } from 'usehooks-ts' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu.tsx' +import { useEffect } from 'react' +import { MoonIcon, SunIcon } from '@radix-ui/react-icons' +import { Button } from '@/components/ui/button.tsx' + +export default function DarkModeToggle() { + const { isDarkMode, setTernaryDarkMode } = useTernaryDarkMode() + + useEffect(() => { + const html = document.querySelector('html') as HTMLHtmlElement + if (isDarkMode) { + html.classList.add('dark') + } else { + html.classList.remove('dark') + } + }, [isDarkMode]) + + return ( + + + + + + setTernaryDarkMode('light')}> + Hell + + setTernaryDarkMode('dark')}> + Dunkel + + setTernaryDarkMode('system')}> + System + + + + ) +} diff --git a/web/src/components/supabase/Provider.tsx b/web/src/components/supabase/Provider.tsx new file mode 100644 index 0000000..6a02230 --- /dev/null +++ b/web/src/components/supabase/Provider.tsx @@ -0,0 +1,51 @@ +import { supabase } from '@/components/supabase/client.ts' +import { Session } from '@supabase/supabase-js' +import { createContext, PropsWithChildren, useContext, useEffect, useMemo, useState } from 'react' + +type Props = PropsWithChildren +type Context = { + session: Session|null +} + +const SupabaseContext = createContext({} as Context) + +export default function SupabaseProvider(props: Props) { + const [session, setSession] = useState(null) + + const context = useMemo(() => ({ + session, + }), [session]) + + useEffect(() => { + supabase.auth.getSession().then(({ data: { session } }) => { + setSession(session) + }) + + const {data: { subscription }} = supabase.auth.onAuthStateChange( + (event, session) => { + if (import.meta.env.DEV) { + console.log(event) + } + + if (event === 'SIGNED_OUT') { + setSession(null) + } else if (session) { + setSession(session) + } + }) + + return () => { + subscription.unsubscribe() + } + }, [setSession]) + + return ( + + {props.children} + + ) +} + +export function useSupabase() { + return useContext(SupabaseContext) +} diff --git a/web/src/components/supabase/client.ts b/web/src/components/supabase/client.ts new file mode 100644 index 0000000..db69463 --- /dev/null +++ b/web/src/components/supabase/client.ts @@ -0,0 +1,12 @@ +import { createClient } from '@supabase/supabase-js' + +const url = import.meta.env.VITE_SUPABASE_URL! + +const isRemote = /^(?:https:\/\/)(?[\w]+)(?:\.supabase\.co)$/.test(url) + +const supabase = createClient( + url, + import.meta.env.VITE_SUPABASE_ANON_KEY!, +) + +export { supabase, isRemote } diff --git a/web/src/components/ui/button.tsx b/web/src/components/ui/button.tsx new file mode 100644 index 0000000..0270f64 --- /dev/null +++ b/web/src/components/ui/button.tsx @@ -0,0 +1,57 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/web/src/components/ui/card.tsx b/web/src/components/ui/card.tsx new file mode 100644 index 0000000..77e9fb7 --- /dev/null +++ b/web/src/components/ui/card.tsx @@ -0,0 +1,76 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/web/src/components/ui/dropdown-menu.tsx b/web/src/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..0e4dccf --- /dev/null +++ b/web/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,203 @@ +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { + CheckIcon, + ChevronRightIcon, + DotFilledIcon, +} from "@radix-ui/react-icons" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/web/src/components/ui/form.tsx b/web/src/components/ui/form.tsx new file mode 100644 index 0000000..f6afdaf --- /dev/null +++ b/web/src/components/ui/form.tsx @@ -0,0 +1,176 @@ +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { Slot } from "@radix-ui/react-slot" +import { + Controller, + ControllerProps, + FieldPath, + FieldValues, + FormProvider, + useFormContext, +} from "react-hook-form" + +import { cn } from "@/lib/utils" +import { Label } from "@/components/ui/label" + +const Form = FormProvider + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath +> = { + name: TName +} + +const FormFieldContext = React.createContext( + {} as FormFieldContextValue +) + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath +>({ + ...props +}: ControllerProps) => { + return ( + + + + ) +} + +const useFormField = () => { + const fieldContext = React.useContext(FormFieldContext) + const itemContext = React.useContext(FormItemContext) + const { getFieldState, formState } = useFormContext() + + const fieldState = getFieldState(fieldContext.name, formState) + + if (!fieldContext) { + throw new Error("useFormField should be used within ") + } + + const { id } = itemContext + + return { + id, + name: fieldContext.name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + } +} + +type FormItemContextValue = { + id: string +} + +const FormItemContext = React.createContext( + {} as FormItemContextValue +) + +const FormItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + const id = React.useId() + + return ( + +
+ + ) +}) +FormItem.displayName = "FormItem" + +const FormLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + const { error, formItemId } = useFormField() + + return ( +