From 2ebf81c601a5ed0378dee0c45824e445f1fa5d8e Mon Sep 17 00:00:00 2001 From: Ivan Vasilov Date: Thu, 17 Apr 2025 14:57:09 +0200 Subject: [PATCH] feat: Add social login to the UI Library (#34803) * Add social login block. * Regen the registry. * Fix the nextjs social auth. * Add social auth blocks for RR, Tanstack and React. * Minor fixes. * Add docs. * Update the docs. * Minor fixes to the blocks. * Update the docs. * Fix various doc issues. * Fix the redirect in the password-based auth. * Fix note about supabase clients in docs. * Use with instead of assert in the registry imports. * Update all auth blocks to use /protected. * Update all docs for the password-based auth. * Add new label to social auth. * Fix docs issues. * Light mode fix * Smol fixes * Fix the origin in the login route. * Add social auth to the landing page. * Regenerate the registry. --------- Co-authored-by: Terry Sutton --- apps/ui-library/__registry__/index.tsx | 50 ++- apps/ui-library/app/(app)/page.tsx | 18 + .../example/social-auth/auth/login/page.tsx | 36 ++ .../app/example/social-auth/layout.tsx | 45 +++ apps/ui-library/components/command.tsx | 4 +- .../components/side-navigation-item.tsx | 11 +- apps/ui-library/config/docs.ts | 8 + .../docs/nextjs/password-based-auth.mdx | 4 +- .../content/docs/nextjs/social-auth.mdx | 67 ++++ .../docs/react-router/password-based-auth.mdx | 5 +- .../content/docs/react-router/social-auth.mdx | 65 ++++ .../docs/react/password-based-auth.mdx | 4 +- .../content/docs/react/social-auth.mdx | 57 +++ .../docs/tanstack/password-based-auth.mdx | 5 +- .../content/docs/tanstack/social-auth.mdx | 61 ++++ apps/ui-library/public/r/ai-editor-rules.json | 10 +- .../public/r/password-based-auth-nextjs.json | 2 +- .../public/r/password-based-auth-react.json | 4 +- .../r/password-based-auth-tanstack.json | 10 +- .../public/r/social-auth-nextjs.json | 72 ++++ .../public/r/social-auth-react-router.json | 65 ++++ .../public/r/social-auth-react.json | 26 ++ .../public/r/social-auth-tanstack.json | 67 ++++ apps/ui-library/registry.json | 181 +++++++++- apps/ui-library/registry/blocks.ts | 30 +- apps/ui-library/registry/clients.ts | 8 +- .../app/protected/page.tsx | 2 +- .../components/login-form.tsx | 2 +- .../components/update-password-form.tsx | 2 +- .../registry-item.json | 4 - .../components/login-form.tsx | 2 +- .../components/update-password-form.tsx | 2 +- .../registry-item.json | 4 +- .../routeTree.gen.ts | 42 ++- .../routes/_protected/protected.tsx | 16 + .../app/auth/error/page.tsx | 26 ++ .../app/auth/login/page.tsx | 11 + .../app/auth/oauth/route.ts | 30 ++ .../social-auth-nextjs/app/protected/page.tsx | 22 ++ .../components/login-form.tsx | 60 ++++ .../components/logout-button.tsx | 17 + .../blocks/social-auth-nextjs/middleware.ts | 19 + .../social-auth-nextjs/registry-item.json | 43 +++ .../social-auth-react-router/app/routes.ts | 4 + .../app/routes/auth.error.tsx | 29 ++ .../app/routes/auth.oauth.tsx | 20 ++ .../app/routes/login.tsx | 64 ++++ .../app/routes/logout.tsx | 16 + .../app/routes/protected.tsx | 29 ++ .../registry-item.json | 45 +++ .../components/login-form.tsx | 58 +++ .../social-auth-react/registry-item.json | 14 + .../components/login-form.tsx | 58 +++ .../lib/supabase/fetch-user-server-fn.ts | 19 + .../social-auth-tanstack/registry-item.json | 43 +++ .../social-auth-tanstack/routeTree.gen.ts | 338 ++++++++++++++++++ .../routes/_protected.tsx | 16 + .../routes/_protected/protected.tsx} | 0 .../routes/auth/error.tsx | 37 ++ .../social-auth-tanstack/routes/auth/oauth.ts | 62 ++++ .../social-auth-tanstack/routes/login.tsx | 16 + apps/ui-library/registry/index.ts | 2 +- apps/ui-library/types/nav.ts | 1 + 63 files changed, 2014 insertions(+), 76 deletions(-) create mode 100644 apps/ui-library/app/example/social-auth/auth/login/page.tsx create mode 100644 apps/ui-library/app/example/social-auth/layout.tsx create mode 100644 apps/ui-library/content/docs/nextjs/social-auth.mdx create mode 100644 apps/ui-library/content/docs/react-router/social-auth.mdx create mode 100644 apps/ui-library/content/docs/react/social-auth.mdx create mode 100644 apps/ui-library/content/docs/tanstack/social-auth.mdx create mode 100644 apps/ui-library/public/r/social-auth-nextjs.json create mode 100644 apps/ui-library/public/r/social-auth-react-router.json create mode 100644 apps/ui-library/public/r/social-auth-react.json create mode 100644 apps/ui-library/public/r/social-auth-tanstack.json create mode 100644 apps/ui-library/registry/default/blocks/password-based-auth-tanstack/routes/_protected/protected.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-nextjs/app/auth/error/page.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-nextjs/app/auth/login/page.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-nextjs/app/auth/oauth/route.ts create mode 100644 apps/ui-library/registry/default/blocks/social-auth-nextjs/app/protected/page.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-nextjs/components/login-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-nextjs/components/logout-button.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-nextjs/middleware.ts create mode 100644 apps/ui-library/registry/default/blocks/social-auth-nextjs/registry-item.json create mode 100644 apps/ui-library/registry/default/blocks/social-auth-react-router/app/routes.ts create mode 100644 apps/ui-library/registry/default/blocks/social-auth-react-router/app/routes/auth.error.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-react-router/app/routes/auth.oauth.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-react-router/app/routes/login.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-react-router/app/routes/logout.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-react-router/app/routes/protected.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-react-router/registry-item.json create mode 100644 apps/ui-library/registry/default/blocks/social-auth-react/components/login-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-react/registry-item.json create mode 100644 apps/ui-library/registry/default/blocks/social-auth-tanstack/components/login-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-tanstack/lib/supabase/fetch-user-server-fn.ts create mode 100644 apps/ui-library/registry/default/blocks/social-auth-tanstack/registry-item.json create mode 100644 apps/ui-library/registry/default/blocks/social-auth-tanstack/routeTree.gen.ts create mode 100644 apps/ui-library/registry/default/blocks/social-auth-tanstack/routes/_protected.tsx rename apps/ui-library/registry/default/blocks/{password-based-auth-tanstack/routes/_protected/info.tsx => social-auth-tanstack/routes/_protected/protected.tsx} (100%) create mode 100644 apps/ui-library/registry/default/blocks/social-auth-tanstack/routes/auth/error.tsx create mode 100644 apps/ui-library/registry/default/blocks/social-auth-tanstack/routes/auth/oauth.ts create mode 100644 apps/ui-library/registry/default/blocks/social-auth-tanstack/routes/login.tsx diff --git a/apps/ui-library/__registry__/index.tsx b/apps/ui-library/__registry__/index.tsx index 22be5c3260d..609d82bb2c3 100644 --- a/apps/ui-library/__registry__/index.tsx +++ b/apps/ui-library/__registry__/index.tsx @@ -49,7 +49,55 @@ export const Index: Record = { registryDependencies: ["button","card","input","label"], component: React.lazy(() => import("@/registry/default/blocks/password-based-auth-tanstack/routes/login.tsx")), source: "", - files: ["registry/default/blocks/password-based-auth-tanstack/routes/login.tsx","registry/default/blocks/password-based-auth-tanstack/routes/auth/error.tsx","registry/default/blocks/password-based-auth-tanstack/routes/_protected.tsx","registry/default/blocks/password-based-auth-tanstack/routes/_protected/info.tsx","registry/default/blocks/password-based-auth-tanstack/routes/auth/confirm.ts","registry/default/blocks/password-based-auth-tanstack/components/login-form.tsx","registry/default/blocks/password-based-auth-tanstack/routes/sign-up.tsx","registry/default/blocks/password-based-auth-tanstack/routes/sign-up-success.tsx","registry/default/blocks/password-based-auth-tanstack/components/sign-up-form.tsx","registry/default/blocks/password-based-auth-tanstack/routes/forgot-password.tsx","registry/default/blocks/password-based-auth-tanstack/routes/update-password.tsx","registry/default/blocks/password-based-auth-tanstack/components/forgot-password-form.tsx","registry/default/blocks/password-based-auth-tanstack/components/update-password-form.tsx","registry/default/blocks/password-based-auth-tanstack/lib/supabase/fetch-user-server-fn.ts","registry/default/clients/tanstack/lib/supabase/client.ts","registry/default/clients/tanstack/lib/supabase/server.ts"], + files: ["registry/default/blocks/password-based-auth-tanstack/routes/login.tsx","registry/default/blocks/password-based-auth-tanstack/routes/auth/error.tsx","registry/default/blocks/password-based-auth-tanstack/routes/_protected.tsx","registry/default/blocks/password-based-auth-tanstack/routes/_protected/protected.tsx","registry/default/blocks/password-based-auth-tanstack/routes/auth/confirm.ts","registry/default/blocks/password-based-auth-tanstack/components/login-form.tsx","registry/default/blocks/password-based-auth-tanstack/routes/sign-up.tsx","registry/default/blocks/password-based-auth-tanstack/routes/sign-up-success.tsx","registry/default/blocks/password-based-auth-tanstack/components/sign-up-form.tsx","registry/default/blocks/password-based-auth-tanstack/routes/forgot-password.tsx","registry/default/blocks/password-based-auth-tanstack/routes/update-password.tsx","registry/default/blocks/password-based-auth-tanstack/components/forgot-password-form.tsx","registry/default/blocks/password-based-auth-tanstack/components/update-password-form.tsx","registry/default/blocks/password-based-auth-tanstack/lib/supabase/fetch-user-server-fn.ts","registry/default/clients/tanstack/lib/supabase/client.ts","registry/default/clients/tanstack/lib/supabase/server.ts"], + category: "undefined", + subcategory: "undefined", + chunks: [] + } + , + "social-auth-nextjs": { + name: "social-auth-nextjs", + type: "registry:block", + registryDependencies: ["button","card"], + component: React.lazy(() => import("@/registry/default/blocks/social-auth-nextjs/app/auth/login/page.tsx")), + source: "", + files: ["registry/default/blocks/social-auth-nextjs/app/auth/login/page.tsx","registry/default/blocks/social-auth-nextjs/app/auth/error/page.tsx","registry/default/blocks/social-auth-nextjs/app/protected/page.tsx","registry/default/blocks/social-auth-nextjs/app/auth/oauth/route.ts","registry/default/blocks/social-auth-nextjs/components/login-form.tsx","registry/default/blocks/social-auth-nextjs/middleware.ts","registry/default/blocks/social-auth-nextjs/components/logout-button.tsx","registry/default/clients/nextjs/lib/supabase/client.ts","registry/default/clients/nextjs/lib/supabase/middleware.ts","registry/default/clients/nextjs/lib/supabase/server.ts"], + category: "undefined", + subcategory: "undefined", + chunks: [] + } + , + "social-auth-react": { + name: "social-auth-react", + type: "registry:block", + registryDependencies: ["button","card"], + component: React.lazy(() => import("@/registry/default/blocks/social-auth-react/components/login-form.tsx")), + source: "", + files: ["registry/default/blocks/social-auth-react/components/login-form.tsx","registry/default/clients/react/lib/supabase/client.ts"], + category: "undefined", + subcategory: "undefined", + chunks: [] + } + , + "social-auth-react-router": { + name: "social-auth-react-router", + type: "registry:block", + registryDependencies: ["button","card"], + component: React.lazy(() => import("@/registry/default/blocks/social-auth-react-router/app/routes/auth.error.tsx")), + source: "", + files: ["registry/default/blocks/social-auth-react-router/app/routes/auth.error.tsx","registry/default/blocks/social-auth-react-router/app/routes/auth.oauth.tsx","registry/default/blocks/social-auth-react-router/app/routes/login.tsx","registry/default/blocks/social-auth-react-router/app/routes/logout.tsx","registry/default/blocks/social-auth-react-router/app/routes/protected.tsx","registry/default/blocks/social-auth-react-router/app/routes.ts","registry/default/clients/react-router/lib/supabase/client.ts","registry/default/clients/react-router/lib/supabase/server.ts"], + category: "undefined", + subcategory: "undefined", + chunks: [] + } + , + "social-auth-tanstack": { + name: "social-auth-tanstack", + type: "registry:block", + registryDependencies: ["button","card"], + component: React.lazy(() => import("@/registry/default/blocks/social-auth-tanstack/components/login-form.tsx")), + source: "", + files: ["registry/default/blocks/social-auth-tanstack/components/login-form.tsx","registry/default/blocks/social-auth-tanstack/lib/supabase/fetch-user-server-fn.ts","registry/default/blocks/social-auth-tanstack/routes/_protected.tsx","registry/default/blocks/social-auth-tanstack/routes/_protected/protected.tsx","registry/default/blocks/social-auth-tanstack/routes/auth/error.tsx","registry/default/blocks/social-auth-tanstack/routes/auth/oauth.ts","registry/default/blocks/social-auth-tanstack/routes/login.tsx","registry/default/clients/tanstack/lib/supabase/client.ts","registry/default/clients/tanstack/lib/supabase/server.ts"], category: "undefined", subcategory: "undefined", chunks: [] diff --git a/apps/ui-library/app/(app)/page.tsx b/apps/ui-library/app/(app)/page.tsx index 773f8f2e164..68aad26adbc 100644 --- a/apps/ui-library/app/(app)/page.tsx +++ b/apps/ui-library/app/(app)/page.tsx @@ -69,6 +69,24 @@ export default function Home() { + {/* Social Authentication */} +
+ Social Authentication + + Go to block ➔ + +
+ +
+
+ +
+
+ + {/* Realtime Cursors */}
Realtime Cursors diff --git a/apps/ui-library/app/example/social-auth/auth/login/page.tsx b/apps/ui-library/app/example/social-auth/auth/login/page.tsx new file mode 100644 index 00000000000..1ccb3c723c7 --- /dev/null +++ b/apps/ui-library/app/example/social-auth/auth/login/page.tsx @@ -0,0 +1,36 @@ +import { Button } from '@/registry/default/components/ui/button' +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@/registry/default/components/ui/card' + +const SocialAuthDemo = () => { + const isLoading = false + const error = null + + return ( +
+ + + Welcome! + Sign in to your account to continue + + +
+
+ {error &&

{error}

} + +
+
+
+
+
+ ) +} + +export default SocialAuthDemo diff --git a/apps/ui-library/app/example/social-auth/layout.tsx b/apps/ui-library/app/example/social-auth/layout.tsx new file mode 100644 index 00000000000..301a5ced999 --- /dev/null +++ b/apps/ui-library/app/example/social-auth/layout.tsx @@ -0,0 +1,45 @@ +import { ThemeProvider } from '@/app/Providers' +import { Metadata } from 'next' +import { BaseInjector } from './../base-injector' + +export const metadata: Metadata = { + title: 'Social Auth Example', +} + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + +