diff --git a/opensaas-sh/app_diff/main.wasp.diff b/opensaas-sh/app_diff/main.wasp.diff index 1b97a55..8bd56be 100644 --- a/opensaas-sh/app_diff/main.wasp.diff +++ b/opensaas-sh/app_diff/main.wasp.diff @@ -47,25 +47,25 @@ clientRoute: EmailVerificationRoute, @@ -44,16 +44,14 @@ }, - userSignupFields: import { getEmailUserFields } from "@src/server/auth/userSignupFields", + userSignupFields: import { getEmailUserFields } from "@src/auth/userSignupFields", }, - // Uncomment to enable Google Auth (check https://wasp-lang.dev/docs/auth/social-auth/google for setup instructions): - // google: { // Guide for setting up Auth via Google -- // userSignupFields: import { getGoogleUserFields } from "@src/server/auth/userSignupFields", -- // configFn: import { getGoogleAuthConfig } from "@src/server/auth/userSignupFields", +- // userSignupFields: import { getGoogleUserFields } from "@src/auth/userSignupFields", +- // configFn: import { getGoogleAuthConfig } from "@src/auth/userSignupFields", - // }, - // Uncomment to enable GitHub Auth (check https://wasp-lang.dev/docs/auth/social-auth/github for setup instructions): - // gitHub: { -- // userSignupFields: import { getGitHubUserFields } from "@src/server/auth/userSignupFields", -- // configFn: import { getGitHubAuthConfig } from "@src/server/auth/userSignupFields", +- // userSignupFields: import { getGitHubUserFields } from "@src/auth/userSignupFields", +- // configFn: import { getGitHubAuthConfig } from "@src/auth/userSignupFields", - // }, + google: { -+ userSignupFields: import { getGoogleUserFields } from "@src/server/auth/userSignupFields", -+ configFn: import { getGoogleAuthConfig } from "@src/server/auth/userSignupFields", ++ userSignupFields: import { getGoogleUserFields } from "@src/auth/userSignupFields", ++ configFn: import { getGoogleAuthConfig } from "@src/auth/userSignupFields", + }, + gitHub: { -+ userSignupFields: import { getGitHubUserFields } from "@src/server/auth/userSignupFields", -+ configFn: import { getGitHubAuthConfig } from "@src/server/auth/userSignupFields", ++ userSignupFields: import { getGitHubUserFields } from "@src/auth/userSignupFields", ++ configFn: import { getGitHubAuthConfig } from "@src/auth/userSignupFields", + }, }, onAuthFailedRedirectTo: "/login", diff --git a/opensaas-sh/app_diff/src/client/auth/LoginPage.tsx.diff b/opensaas-sh/app_diff/src/auth/LoginPage.tsx.diff similarity index 67% rename from opensaas-sh/app_diff/src/client/auth/LoginPage.tsx.diff rename to opensaas-sh/app_diff/src/auth/LoginPage.tsx.diff index 3f40c01..cc8f419 100644 --- a/opensaas-sh/app_diff/src/client/auth/LoginPage.tsx.diff +++ b/opensaas-sh/app_diff/src/auth/LoginPage.tsx.diff @@ -1,14 +1,13 @@ ---- template/app/src/client/auth/LoginPage.tsx -+++ opensaas-sh/app/src/client/auth/LoginPage.tsx -@@ -1,8 +1,15 @@ --import { LoginForm } from 'wasp/client/auth'; +--- template/app/src/auth/LoginPage.tsx ++++ opensaas-sh/app/src/auth/LoginPage.tsx +@@ -1,8 +1,14 @@ -import { Link } from 'react-router-dom'; -+import { LoginForm, useAuth } from 'wasp/client/auth'; +-import { LoginForm } from 'wasp/client/auth'; +import { Redirect, Link } from 'react-router-dom'; - import { AuthWrapper } from './authWrapper'; ++import { LoginForm, useAuth } from 'wasp/client/auth'; + import { AuthPageLayout } from './AuthPageLayout'; export default function Login() { -+ + const { data: user } = useAuth(); + + if (user) { @@ -16,5 +15,5 @@ + } + return ( - + diff --git a/opensaas-sh/blog/src/content/docs/guides/authentication.md b/opensaas-sh/blog/src/content/docs/guides/authentication.md index c054c67..8751a77 100644 --- a/opensaas-sh/blog/src/content/docs/guides/authentication.md +++ b/opensaas-sh/blog/src/content/docs/guides/authentication.md @@ -20,7 +20,7 @@ Setting up your app's authentication is easy with Wasp. In fact, it's already se }, ``` -The great part is, by defining your auth config in the `main.wasp` file, Wasp manages most of the Auth process for you, including the auth-related database entities for user credentials and sessions, as well as auto-generated client components for your app on the fly (aka AuthUI -- you can see them in the `src/client/auth` folder). +The great part is, by defining your auth config in the `main.wasp` file, Wasp manages most of the Auth process for you, including the auth-related database entities for user credentials and sessions, as well as auto-generated client components for your app on the fly (aka AuthUI -- you can see them in use in the `src/auth` folder). ## Email Verified Auth diff --git a/opensaas-sh/blog/src/content/docs/start/guided-tour.md b/opensaas-sh/blog/src/content/docs/start/guided-tour.md index 57eaae2..bf42293 100644 --- a/opensaas-sh/blog/src/content/docs/start/guided-tour.md +++ b/opensaas-sh/blog/src/content/docs/start/guided-tour.md @@ -62,6 +62,7 @@ If you are using a version of the OpenSaaS template with Wasp `v0.11.x` or below │   ├── client/ # Your client code (React) goes here. │   ├── server/ # Your server code (NodeJS) goes here. │   ├── shared/ # Your shared (runtime independent) code goes here. +│   ├── auth/ # All auth-related pages/components and logic. │   ├── file-upload/ # Logic for uploading files to S3. │   └── .waspignore ├── .env.server # Dev environment variables for your server code. @@ -109,7 +110,6 @@ The `src/client` folder contains the code that runs in the browser. It's a stand └── client    ├── admin # Admin dashboard pages and components   ├── app # Your user-facing app that sits behind the paywall/login. -   ├── auth # All auth-related pages and components.   ├── components # Your shared React components.   ├── hooks # Your shared React hooks.    ├── landing-page # Landing page related code @@ -127,7 +127,6 @@ All you have to do is define your server-side functions in the `main.wasp` file, ```sh └── server -    ├── auth # Some small auth-related functions to customize the auth flow.   ├── payments # Payments utility functions.   ├── scripts # Scripts to run via Wasp, e.g. database seeding.   ├── webhooks # The webhook handler for Stripe. diff --git a/template/app/main.wasp b/template/app/main.wasp index 7a74f5c..f96d95d 100644 --- a/template/app/main.wasp +++ b/template/app/main.wasp @@ -36,23 +36,23 @@ app OpenSaaS { }, emailVerification: { clientRoute: EmailVerificationRoute, - getEmailContentFn: import { getVerificationEmailContent } from "@src/server/auth/email", + getEmailContentFn: import { getVerificationEmailContent } from "@src/auth/email-and-pass/emails", }, passwordReset: { clientRoute: PasswordResetRoute, - getEmailContentFn: import { getPasswordResetEmailContent } from "@src/server/auth/email", + getEmailContentFn: import { getPasswordResetEmailContent } from "@src/auth/email-and-pass/emails", }, - userSignupFields: import { getEmailUserFields } from "@src/server/auth/userSignupFields", + userSignupFields: import { getEmailUserFields } from "@src/auth/userSignupFields", }, // Uncomment to enable Google Auth (check https://wasp-lang.dev/docs/auth/social-auth/google for setup instructions): // google: { // Guide for setting up Auth via Google - // userSignupFields: import { getGoogleUserFields } from "@src/server/auth/userSignupFields", - // configFn: import { getGoogleAuthConfig } from "@src/server/auth/userSignupFields", + // userSignupFields: import { getGoogleUserFields } from "@src/auth/userSignupFields", + // configFn: import { getGoogleAuthConfig } from "@src/auth/userSignupFields", // }, // Uncomment to enable GitHub Auth (check https://wasp-lang.dev/docs/auth/social-auth/github for setup instructions): // gitHub: { - // userSignupFields: import { getGitHubUserFields } from "@src/server/auth/userSignupFields", - // configFn: import { getGitHubAuthConfig } from "@src/server/auth/userSignupFields", + // userSignupFields: import { getGitHubUserFields } from "@src/auth/userSignupFields", + // configFn: import { getGitHubAuthConfig } from "@src/auth/userSignupFields", // }, }, onAuthFailedRedirectTo: "/login", @@ -197,27 +197,27 @@ page LandingPage { //#region Auth Pages route LoginRoute { path: "/login", to: LoginPage } page LoginPage { - component: import Login from "@src/client/auth/LoginPage" + component: import Login from "@src/auth/LoginPage" } route SignupRoute { path: "/signup", to: SignupPage } page SignupPage { - component: import { Signup } from "@src/client/auth/SignupPage" + component: import { Signup } from "@src/auth/SignupPage" } route RequestPasswordResetRoute { path: "/request-password-reset", to: RequestPasswordResetPage } page RequestPasswordResetPage { - component: import { RequestPasswordReset } from "@src/client/auth/RequestPasswordReset", + component: import { RequestPasswordResetPage } from "@src/auth/email-and-pass/RequestPasswordResetPage", } route PasswordResetRoute { path: "/password-reset", to: PasswordResetPage } page PasswordResetPage { - component: import { PasswordReset } from "@src/client/auth/PasswordReset", + component: import { PasswordResetPage } from "@src/auth/email-and-pass/PasswordResetPage", } route EmailVerificationRoute { path: "/email-verification", to: EmailVerificationPage } page EmailVerificationPage { - component: import { EmailVerification } from "@src/client/auth/EmailVerification", + component: import { EmailVerificationPage } from "@src/auth/email-and-pass/EmailVerificationPage", } //#endregion diff --git a/template/app/src/client/auth/authWrapper.tsx b/template/app/src/auth/AuthPageLayout.tsx similarity index 86% rename from template/app/src/client/auth/authWrapper.tsx rename to template/app/src/auth/AuthPageLayout.tsx index be6506d..6381aa7 100644 --- a/template/app/src/client/auth/authWrapper.tsx +++ b/template/app/src/auth/AuthPageLayout.tsx @@ -1,6 +1,6 @@ import { ReactNode } from 'react'; -export function AuthWrapper({children} : {children: ReactNode }) { +export function AuthPageLayout({children} : {children: ReactNode }) { return (
diff --git a/template/app/src/client/auth/LoginPage.tsx b/template/app/src/auth/LoginPage.tsx similarity index 87% rename from template/app/src/client/auth/LoginPage.tsx rename to template/app/src/auth/LoginPage.tsx index 276dddc..288f4ef 100644 --- a/template/app/src/client/auth/LoginPage.tsx +++ b/template/app/src/auth/LoginPage.tsx @@ -1,10 +1,10 @@ -import { LoginForm } from 'wasp/client/auth'; import { Link } from 'react-router-dom'; -import { AuthWrapper } from './authWrapper'; +import { LoginForm } from 'wasp/client/auth'; +import { AuthPageLayout } from './AuthPageLayout'; export default function Login() { return ( - +
@@ -22,6 +22,6 @@ export default function Login() { . -
+ ); } diff --git a/template/app/src/client/auth/SignupPage.tsx b/template/app/src/auth/SignupPage.tsx similarity index 80% rename from template/app/src/client/auth/SignupPage.tsx rename to template/app/src/auth/SignupPage.tsx index 107c272..7c6297a 100644 --- a/template/app/src/client/auth/SignupPage.tsx +++ b/template/app/src/auth/SignupPage.tsx @@ -1,10 +1,10 @@ -import { SignupForm } from 'wasp/client/auth'; import { Link } from 'react-router-dom'; -import { AuthWrapper } from './authWrapper'; +import { SignupForm } from 'wasp/client/auth'; +import { AuthPageLayout } from './AuthPageLayout'; export function Signup() { return ( - +
@@ -15,6 +15,6 @@ export function Signup() { ).
-
+ ); } diff --git a/template/app/src/client/auth/EmailVerification.tsx b/template/app/src/auth/email-and-pass/EmailVerificationPage.tsx similarity index 69% rename from template/app/src/client/auth/EmailVerification.tsx rename to template/app/src/auth/email-and-pass/EmailVerificationPage.tsx index f6cf1a2..6066bfd 100644 --- a/template/app/src/client/auth/EmailVerification.tsx +++ b/template/app/src/auth/email-and-pass/EmailVerificationPage.tsx @@ -1,15 +1,15 @@ -import { VerifyEmailForm } from 'wasp/client/auth'; import { Link } from 'react-router-dom'; -import { AuthWrapper } from './authWrapper'; +import { VerifyEmailForm } from 'wasp/client/auth'; +import { AuthPageLayout } from '../AuthPageLayout'; -export function EmailVerification() { +export function EmailVerificationPage() { return ( - +
If everything is okay, go to login -
+ ); } diff --git a/template/app/src/client/auth/PasswordReset.tsx b/template/app/src/auth/email-and-pass/PasswordResetPage.tsx similarity index 68% rename from template/app/src/client/auth/PasswordReset.tsx rename to template/app/src/auth/email-and-pass/PasswordResetPage.tsx index f0f94df..a4d4afb 100644 --- a/template/app/src/client/auth/PasswordReset.tsx +++ b/template/app/src/auth/email-and-pass/PasswordResetPage.tsx @@ -1,15 +1,15 @@ -import { ResetPasswordForm } from 'wasp/client/auth'; import { Link } from 'react-router-dom'; -import { AuthWrapper } from './authWrapper'; +import { ResetPasswordForm } from 'wasp/client/auth'; +import { AuthPageLayout } from '../AuthPageLayout'; -export function PasswordReset() { +export function PasswordResetPage() { return ( - +
If everything is okay, go to login -
+ ); } diff --git a/template/app/src/auth/email-and-pass/RequestPasswordResetPage.tsx b/template/app/src/auth/email-and-pass/RequestPasswordResetPage.tsx new file mode 100644 index 0000000..ebc7484 --- /dev/null +++ b/template/app/src/auth/email-and-pass/RequestPasswordResetPage.tsx @@ -0,0 +1,10 @@ +import { ForgotPasswordForm } from 'wasp/client/auth'; +import { AuthPageLayout } from '../AuthPageLayout'; + +export function RequestPasswordResetPage() { + return ( + + + + ); +} diff --git a/template/app/src/server/auth/email.ts b/template/app/src/auth/email-and-pass/emails.ts similarity index 94% rename from template/app/src/server/auth/email.ts rename to template/app/src/auth/email-and-pass/emails.ts index 1d089e5..6f99828 100644 --- a/template/app/src/server/auth/email.ts +++ b/template/app/src/auth/email-and-pass/emails.ts @@ -1,4 +1,4 @@ -import { type GetVerificationEmailContentFn, type GetPasswordResetEmailContentFn } from "wasp/server/auth"; +import { type GetVerificationEmailContentFn, type GetPasswordResetEmailContentFn } from 'wasp/server/auth'; export const getVerificationEmailContent: GetVerificationEmailContentFn = ({ verificationLink }) => ({ subject: 'Verify your email', @@ -16,4 +16,4 @@ export const getPasswordResetEmailContent: GetPasswordResetEmailContentFn = ({ p

Click the link below to reset your password

Reset password `, -}); \ No newline at end of file +}); diff --git a/template/app/src/server/auth/userSignupFields.ts b/template/app/src/auth/userSignupFields.ts similarity index 100% rename from template/app/src/server/auth/userSignupFields.ts rename to template/app/src/auth/userSignupFields.ts index b05f0de..431542a 100644 --- a/template/app/src/server/auth/userSignupFields.ts +++ b/template/app/src/auth/userSignupFields.ts @@ -1,5 +1,5 @@ -import { defineUserSignupFields } from 'wasp/auth/providers/types'; import { z } from 'zod'; +import { defineUserSignupFields } from 'wasp/auth/providers/types'; const adminEmails = process.env.ADMIN_EMAILS?.split(',') || []; diff --git a/template/app/src/client/auth/RequestPasswordReset.tsx b/template/app/src/client/auth/RequestPasswordReset.tsx deleted file mode 100644 index 0f6df72..0000000 --- a/template/app/src/client/auth/RequestPasswordReset.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { ForgotPasswordForm } from 'wasp/client/auth'; -import { AuthWrapper } from './authWrapper'; - -export function RequestPasswordReset() { - return ( - - - - ); -}