--- template/app/src/landing-page/components/Examples/Auth.tsx +++ opensaas-sh/app/src/landing-page/components/Examples/Auth.tsx @@ -0,0 +1,155 @@ +import { type ComponentType, useState } from "react"; +import { FaDiscord, FaGithub, FaGoogle, FaSlack } from "react-icons/fa"; +import { Button } from "../../../client/components/ui/button"; +import { + Card, + CardContent, + CardHeader, +} from "../../../client/components/ui/card"; +import { Input } from "../../../client/components/ui/input"; +import { DocsUrl } from "../../../shared/common"; +import { HighlightedFeature } from "../HighlightedFeature"; + +const Provider = { + google: { displayName: "Google", icon: FaGoogle }, + github: { displayName: "GitHub", icon: FaGithub }, + discord: { displayName: "Discord", icon: FaDiscord }, + slack: { displayName: "Slack", icon: FaSlack }, +} as const satisfies Record< + string, + { displayName: string; icon: ComponentType<{ className?: string }> } +>; + +type AuthProvider = keyof typeof Provider; + +const providers = Object.entries(Provider) as (readonly [ + key: AuthProvider, + provider: (typeof Provider)[AuthProvider], +])[]; + +export function Auth() { + const [selectedProviders, setSelectedProviders] = useState< + readonly AuthProvider[] + >(["google", "github"]); + + const toggleProvider = (provider: AuthProvider) => { + setSelectedProviders((prev) => + prev.includes(provider) + ? prev.filter((p) => p !== provider) + : [...prev, provider], + ); + }; + + return ( + + } + highlightedComponent={ + + } + tilt="left" + className="h-100" + /> + ); +} + +function AuthPlayground({ + toggleProvider, + selectedProviders, +}: { + toggleProvider: (provider: AuthProvider) => void; + selectedProviders: readonly AuthProvider[]; +}) { + return ( +
+

+ Pre-configured full-stack Auth that you own. +

+
+ {providers.map(([key, provider]) => { + const IconComponent = provider.icon; + return ( + + ); + })} +
+
+ ); +} + +function Divider() { + return ( +
+
+

Or continue with

+
+
+ ); +} + +function AuthExample({ + selectedProviders, +}: { + selectedProviders: readonly AuthProvider[]; +}) { + return ( + + +

Log in to your account

+
+ +
+
+ {selectedProviders.length > 0 ? ( +

Log in with

+ ) : null} +
+ {selectedProviders.map((provider) => { + const { icon: IconComponent, displayName } = Provider[provider]; + return ( + + + + ); + })} +
+
+ {selectedProviders.length > 0 ? : null} +
+ + + +
+
+
+
+ ); +}