From 92f7b60ec6d250a90cccd667a8fe7e5c012ff733 Mon Sep 17 00:00:00 2001 From: Zai Shi Date: Sat, 2 Nov 2024 01:44:52 +0100 Subject: [PATCH] Added loading skeleton to components (#328) * added sign-in skeleton * added team switcher skeleton * improved style --- examples/docs-examples/src/app/loading.tsx | 2 +- examples/docs-examples/src/stack.tsx | 2 - .../stack-ui/src/components/ui/skeleton.tsx | 68 +++---------------- .../stack/src/components-page/auth-page.tsx | 40 +++++++++-- .../src/components/selected-team-switcher.tsx | 13 +++- packages/stack/src/components/user-button.tsx | 8 +-- 6 files changed, 59 insertions(+), 74 deletions(-) diff --git a/examples/docs-examples/src/app/loading.tsx b/examples/docs-examples/src/app/loading.tsx index 4349ac3a6..fc80ef063 100644 --- a/examples/docs-examples/src/app/loading.tsx +++ b/examples/docs-examples/src/app/loading.tsx @@ -1,3 +1,3 @@ export default function Loading() { - return null; + return
Loading...
; } diff --git a/examples/docs-examples/src/stack.tsx b/examples/docs-examples/src/stack.tsx index e5279bcd4..dda30b13e 100644 --- a/examples/docs-examples/src/stack.tsx +++ b/examples/docs-examples/src/stack.tsx @@ -5,7 +5,5 @@ import { StackServerApp } from "@stackframe/stack"; export const stackServerApp = new StackServerApp({ tokenStore: "nextjs-cookie", urls: { - signIn: "/signin", - signUp: "/signup", } }); diff --git a/packages/stack-ui/src/components/ui/skeleton.tsx b/packages/stack-ui/src/components/ui/skeleton.tsx index f31d78aea..9bbec7d48 100644 --- a/packages/stack-ui/src/components/ui/skeleton.tsx +++ b/packages/stack-ui/src/components/ui/skeleton.tsx @@ -3,64 +3,16 @@ import React from "react"; import { cn } from "../.."; -// TODO: add this to the generated global CSS -const styleSheet = ` -@keyframes animation-light { -0% { - filter: grayscale(1) contrast(0) brightness(0) invert(1) brightness(0.8); +function Skeleton({ + className, + ...props +}: React.HTMLAttributes) { + return ( +
+ ); } -100% { - filter: grayscale(1) contrast(0) brightness(0) invert(1) brightness(0.9); -} - -@keyframes animation-dark { -0% { - filter: grayscale(1) contrast(0) brightness(0) invert(1) brightness(0.2); -} -100% { - filter: grayscale(1) contrast(0) brightness(0) invert(1) brightness(0.1); -} - -.stack-skeleton[data-stack-state="activated"], -.stack-skeleton[data-stack-state="activated"] * { - pointer-events: none !important; - -webkit-user-select: none !important; - -moz-user-select: none !important; - user-select: none !important; - cursor: default !important; -} - -.stack-skeleton[data-stack-state="activated"] { - animation: animation-light 1s infinite alternate-reverse !important; -} - -html[data-stack-theme='dark'] .stack-skeleton[data-stack-state="activated"] { - animation: animation-dark 1s infinite alternate-reverse !important; -} - -html[data-stack-theme='dark'] .stack-skeleton[data-stack-state="activated"] { - animation: animation-dark 1s infinite alternate-reverse !important; -} -`; - -const Skeleton = React.forwardRef< - React.ElementRef<"span">, - React.ComponentPropsWithoutRef<"span"> & { deactivated?: boolean } ->( - (props, ref) => { - return ( - <> - - - - ); - } -); -Skeleton.displayName = "Skeleton"; export { Skeleton }; diff --git a/packages/stack/src/components-page/auth-page.tsx b/packages/stack/src/components-page/auth-page.tsx index bab5fca66..36f4d1d8a 100644 --- a/packages/stack/src/components-page/auth-page.tsx +++ b/packages/stack/src/components-page/auth-page.tsx @@ -1,8 +1,8 @@ 'use client'; import { runAsynchronously } from '@stackframe/stack-shared/dist/utils/promises'; -import { StyledLink, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from '@stackframe/stack-ui'; -import { useEffect } from 'react'; +import { Skeleton, StyledLink, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from '@stackframe/stack-ui'; +import { Suspense, useEffect } from 'react'; import { useStackApp, useUser } from '..'; import { CredentialSignIn } from '../components/credential-sign-in'; import { CredentialSignUp } from '../components/credential-sign-up'; @@ -11,10 +11,10 @@ import { SeparatorWithText } from '../components/elements/separator-with-text'; import { MagicLinkSignIn } from '../components/magic-link-sign-in'; import { PredefinedMessageCard } from '../components/message-cards/predefined-message-card'; import { OAuthButtonGroup } from '../components/oauth-button-group'; -import { useTranslation } from '../lib/translations'; import { PasskeyButton } from '../components/passkey-button'; +import { useTranslation } from '../lib/translations'; -export function AuthPage(props: { +type Props = { noPasswordRepeat?: boolean, firstTab?: 'magic-link' | 'password', fullPage?: boolean, @@ -32,7 +32,37 @@ export function AuthPage(props: { }[], }, }, -}) { +} + +export function AuthPage(props: Props) { + return }> + + ; +} + +function Fallback(props: Props) { + const { t } = useTranslation(); + + return ( + +
+
+ + + + + + + + + +
+
+
+ ); +} + +function Inner (props: Props) { const stackApp = useStackApp(); const user = useUser(); const projectFromHook = stackApp.useProject(); diff --git a/packages/stack/src/components/selected-team-switcher.tsx b/packages/stack/src/components/selected-team-switcher.tsx index 416416825..4d3b650e4 100644 --- a/packages/stack/src/components/selected-team-switcher.tsx +++ b/packages/stack/src/components/selected-team-switcher.tsx @@ -10,11 +10,12 @@ import { SelectSeparator, SelectTrigger, SelectValue, + Skeleton, Typography } from "@stackframe/stack-ui"; import { PlusCircle, Settings } from "lucide-react"; import { useRouter } from "next/navigation"; -import { useEffect, useMemo } from "react"; +import { Suspense, useEffect, useMemo } from "react"; import { Team, useStackApp, useUser } from ".."; import { useTranslation } from "../lib/translations"; import { TeamIcon } from "./team-icon"; @@ -26,6 +27,16 @@ type SelectedTeamSwitcherProps = { }; export function SelectedTeamSwitcher(props: SelectedTeamSwitcherProps) { + return }> + + ; +} + +function Fallback() { + return ; +} + +function Inner(props: SelectedTeamSwitcherProps) { const { t } = useTranslation(); const app = useStackApp(); const user = useUser(); diff --git a/packages/stack/src/components/user-button.tsx b/packages/stack/src/components/user-button.tsx index f18e968b7..bf0aa2314 100644 --- a/packages/stack/src/components/user-button.tsx +++ b/packages/stack/src/components/user-button.tsx @@ -31,13 +31,7 @@ type UserButtonProps = { export function UserButton(props: UserButtonProps) { return ( - - - - } - > + }> );