@@ -83,6 +83,8 @@ NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID=
|
|||||||
NEXT_PUBLIC_POSTHOG_KEY=""
|
NEXT_PUBLIC_POSTHOG_KEY=""
|
||||||
# OPTIONAL: Leave blank to disable billing.
|
# OPTIONAL: Leave blank to disable billing.
|
||||||
NEXT_PUBLIC_FEATURE_BILLING_ENABLED=
|
NEXT_PUBLIC_FEATURE_BILLING_ENABLED=
|
||||||
|
# OPTIONAL: Leave blank to allow users to signup through /signup page.
|
||||||
|
NEXT_PUBLIC_DISABLE_SIGNUP=
|
||||||
|
|
||||||
# This is only required for the marketing site
|
# This is only required for the marketing site
|
||||||
# [[REDIS]]
|
# [[REDIS]]
|
||||||
|
|||||||
@@ -13,12 +13,14 @@ export default function SignInPage() {
|
|||||||
|
|
||||||
<SignInForm className="mt-4" />
|
<SignInForm className="mt-4" />
|
||||||
|
|
||||||
<p className="text-muted-foreground mt-6 text-center text-sm">
|
{process.env.NEXT_PUBLIC_DISABLE_SIGNUP !== 'true' && (
|
||||||
Don't have an account?{' '}
|
<p className="text-muted-foreground mt-6 text-center text-sm">
|
||||||
<Link href="/signup" className="text-primary duration-200 hover:opacity-70">
|
Don't have an account?{' '}
|
||||||
Sign up
|
<Link href="/signup" className="text-primary duration-200 hover:opacity-70">
|
||||||
</Link>
|
Sign up
|
||||||
</p>
|
</Link>
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
|
||||||
<p className="mt-2.5 text-center">
|
<p className="mt-2.5 text-center">
|
||||||
<Link
|
<Link
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
|
import { redirect } from 'next/navigation';
|
||||||
|
|
||||||
import { SignUpForm } from '~/components/forms/signup';
|
import { SignUpForm } from '~/components/forms/signup';
|
||||||
|
|
||||||
export default function SignUpPage() {
|
export default function SignUpPage() {
|
||||||
|
if (process.env.NEXT_PUBLIC_DISABLE_SIGNUP === 'true') {
|
||||||
|
redirect('/signin');
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-4xl font-semibold">Create a new account</h1>
|
<h1 className="text-4xl font-semibold">Create a new account</h1>
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ services:
|
|||||||
- SMTP_MAIL_USER=username
|
- SMTP_MAIL_USER=username
|
||||||
- SMTP_MAIL_PASSWORD=password
|
- SMTP_MAIL_PASSWORD=password
|
||||||
- MAIL_FROM=admin@example.com
|
- MAIL_FROM=admin@example.com
|
||||||
- NEXT_PUBLIC_ALLOW_SIGNUP=true
|
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
volumes:
|
volumes:
|
||||||
|
|||||||
@@ -162,5 +162,17 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = {
|
|||||||
|
|
||||||
return session;
|
return session;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async signIn({ user }) {
|
||||||
|
// We do this to stop OAuth providers from creating an account
|
||||||
|
// when signups are disabled
|
||||||
|
if (process.env.NEXT_PUBLIC_DISABLE_SIGNUP === 'true') {
|
||||||
|
const userData = await getUserByEmail({ email: user.email! });
|
||||||
|
|
||||||
|
return !!userData;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,6 +11,13 @@ import { ZSignUpMutationSchema, ZVerifyPasswordMutationSchema } from './schema';
|
|||||||
export const authRouter = router({
|
export const authRouter = router({
|
||||||
signup: procedure.input(ZSignUpMutationSchema).mutation(async ({ input }) => {
|
signup: procedure.input(ZSignUpMutationSchema).mutation(async ({ input }) => {
|
||||||
try {
|
try {
|
||||||
|
if (process.env.NEXT_PUBLIC_DISABLE_SIGNUP === 'true') {
|
||||||
|
throw new TRPCError({
|
||||||
|
code: 'BAD_REQUEST',
|
||||||
|
message: 'Signups are disabled.',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const { name, email, password, signature } = input;
|
const { name, email, password, signature } = input;
|
||||||
|
|
||||||
const user = await createUser({ name, email, password, signature });
|
const user = await createUser({ name, email, password, signature });
|
||||||
|
|||||||
2
packages/tsconfig/process-env.d.ts
vendored
2
packages/tsconfig/process-env.d.ts
vendored
@@ -53,6 +53,8 @@ declare namespace NodeJS {
|
|||||||
NEXT_PRIVATE_SMTP_FROM_NAME?: string;
|
NEXT_PRIVATE_SMTP_FROM_NAME?: string;
|
||||||
NEXT_PRIVATE_SMTP_FROM_ADDRESS?: string;
|
NEXT_PRIVATE_SMTP_FROM_ADDRESS?: string;
|
||||||
|
|
||||||
|
NEXT_PUBLIC_DISABLE_SIGNUP?: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Vercel environment variables
|
* Vercel environment variables
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -42,6 +42,8 @@
|
|||||||
"NEXT_PUBLIC_POSTHOG_KEY",
|
"NEXT_PUBLIC_POSTHOG_KEY",
|
||||||
"NEXT_PUBLIC_FEATURE_BILLING_ENABLED",
|
"NEXT_PUBLIC_FEATURE_BILLING_ENABLED",
|
||||||
"NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID",
|
"NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID",
|
||||||
|
"NEXT_PUBLIC_STRIPE_FREE_PLAN_ID",
|
||||||
|
"NEXT_PUBLIC_DISABLE_SIGNUP",
|
||||||
"NEXT_PRIVATE_DATABASE_URL",
|
"NEXT_PRIVATE_DATABASE_URL",
|
||||||
"NEXT_PRIVATE_DIRECT_DATABASE_URL",
|
"NEXT_PRIVATE_DIRECT_DATABASE_URL",
|
||||||
"NEXT_PRIVATE_GOOGLE_CLIENT_ID",
|
"NEXT_PRIVATE_GOOGLE_CLIENT_ID",
|
||||||
|
|||||||
Reference in New Issue
Block a user