diff --git a/apps/web/.env.development.example b/.env.example similarity index 87% rename from apps/web/.env.development.example rename to .env.example index a1c9eb0..a616a61 100644 --- a/apps/web/.env.development.example +++ b/.env.example @@ -1,5 +1,5 @@ # Development environment (.env.local) -# Copy this file to apps/web/.env.local +# Copy this file to .env.local in the root directory # Drizzle / libSQL (local sqlite) DATABASE_URL=file:./local.db @@ -36,3 +36,6 @@ STORAGE_USESSL=false STORAGE_ACCESS_KEY=formbase STORAGE_SECRET_KEY=password STORAGE_BUCKET=formbase + +# Redis (for webhook queue) +REDIS_URL=redis://localhost:6379 diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 7e59b46..0636f62 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,6 +1,12 @@ /** @type {import('eslint').Linter.Config} */ const config = { - ignorePatterns: ['apps/**', 'packages/**', 'tests/playwright-report/**', 'tests/test-results/**', '**/.eslintrc.cjs'], + ignorePatterns: [ + 'apps/**', + 'packages/**', + 'tests/playwright-report/**', + 'tests/test-results/**', + '**/.eslintrc.cjs', + ], extends: ['formbase/base'], }; diff --git a/apps/web/next.config.js b/apps/web/next.config.js index 07ce97b..de0d631 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -20,7 +20,7 @@ const nextConfig = { '@formbase/env', '@formbase/ui', '@formbase/utils', - "@formbase/tailwind", + '@formbase/tailwind', ], serverExternalPackages: ['libsql', '@libsql/client'], typescript: { diff --git a/apps/web/package.json b/apps/web/package.json index 83b999f..8a2aac6 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -4,10 +4,10 @@ "private": true, "type": "module", "scripts": { - "build": "next build", - "dev": "next dev -p 3000", + "build": "dotenv -e ../../.env.local -- next build", + "dev": "dotenv -e ../../.env.local -- next dev -p 3000", "lint": "eslint . --cache --max-warnings 0", - "start": "next start", + "start": "dotenv -e ../../.env.local -- next start", "typecheck": "tsc --noEmit --tsBuildInfoFile .tsbuildinfo" }, "dependencies": { @@ -16,6 +16,7 @@ "@formbase/db": "workspace:*", "@formbase/email": "workspace:*", "@formbase/env": "workspace:*", + "@formbase/queue": "workspace:*", "@formbase/ui": "workspace:*", "@formbase/utils": "workspace:*", "@hookform/resolvers": "^3.4.2", @@ -57,6 +58,7 @@ "@types/react": "^18.3.2", "@types/react-dom": "^18.3.0", "dotenv": "^16.4.5", + "dotenv-cli": "^7.4.2", "eslint-config-formbase": "workspace:*", "postcss": "^8.4.38", "shiki": "^1.6.3", diff --git a/apps/web/src/app/(auth)/login/login.tsx b/apps/web/src/app/(auth)/login/login.tsx index 1613406..f367b5c 100644 --- a/apps/web/src/app/(auth)/login/login.tsx +++ b/apps/web/src/app/(auth)/login/login.tsx @@ -9,8 +9,6 @@ import type { FormEvent } from 'react'; import { IconBrandGithub, IconBrandGoogleFilled } from '@tabler/icons-react'; import { signIn } from '@formbase/auth/client'; - -import { Logo } from '../_components/logo'; import { Button } from '@formbase/ui/primitives/button'; import { Input } from '@formbase/ui/primitives/input'; import { Label } from '@formbase/ui/primitives/label'; @@ -20,6 +18,8 @@ import { LoadingButton } from '~/components/loading-button'; import { PasswordInput } from '~/components/password-input'; import { useSocialAuth } from '~/lib/hooks/use-social-auth'; +import { Logo } from '../_components/logo'; + export function Login() { const router = useRouter(); const [formError, setFormError] = useState(null); diff --git a/apps/web/src/app/(auth)/reset-password/[token]/page.tsx b/apps/web/src/app/(auth)/reset-password/[token]/page.tsx index 948281f..59cdf2e 100644 --- a/apps/web/src/app/(auth)/reset-password/[token]/page.tsx +++ b/apps/web/src/app/(auth)/reset-password/[token]/page.tsx @@ -1,7 +1,6 @@ import Link from 'next/link'; import { Logo } from '../../_components/logo'; - import { ResetPassword } from './reset-password'; export const metadata = { diff --git a/apps/web/src/app/(auth)/reset-password/page.tsx b/apps/web/src/app/(auth)/reset-password/page.tsx index e8ef369..8710183 100644 --- a/apps/web/src/app/(auth)/reset-password/page.tsx +++ b/apps/web/src/app/(auth)/reset-password/page.tsx @@ -4,7 +4,6 @@ import { redirect } from 'next/navigation'; import { getSession } from '@formbase/auth/server'; import { Logo } from '../_components/logo'; - import { SendResetEmail } from './send-reset-email'; export const metadata = { diff --git a/apps/web/src/app/(auth)/reset-password/send-reset-email.tsx b/apps/web/src/app/(auth)/reset-password/send-reset-email.tsx index 0a7ca5e..345e3ea 100644 --- a/apps/web/src/app/(auth)/reset-password/send-reset-email.tsx +++ b/apps/web/src/app/(auth)/reset-password/send-reset-email.tsx @@ -1,8 +1,10 @@ 'use client'; -import { type FormEvent, useState } from 'react'; +import { useState } from 'react'; import { useRouter } from 'next/navigation'; +import type { FormEvent } from 'react'; + import { toast } from 'sonner'; import { authClient } from '@formbase/auth/client'; @@ -46,10 +48,7 @@ export function SendResetEmail() { return (
-