diff --git a/admin/lib/app-providers.tsx b/admin/lib/app-providers.tsx index 64853c62d..c52b4455e 100644 --- a/admin/lib/app-providers.tsx +++ b/admin/lib/app-providers.tsx @@ -16,7 +16,6 @@ function initializeStore(initialData = {}) { // If your page has Next.js data fetching methods that use a Mobx store, it will // get hydrated here, check `pages/ssg.js` and `pages/ssr.js` for more details if (initialData) { - console.log("initialState", initialData); singletonRootStore.hydrate(initialData); } // For SSG and SSR always create a new store diff --git a/space/app/loading.tsx b/space/app/loading.tsx new file mode 100644 index 000000000..d35e42a76 --- /dev/null +++ b/space/app/loading.tsx @@ -0,0 +1,20 @@ +"use client"; +import Image from "next/image"; +import { useTheme } from "next-themes"; +// assets +import LogoSpinnerDark from "@/public/images/logo-spinner-dark.gif"; +import LogoSpinnerLight from "@/public/images/logo-spinner-light.gif"; + +export default function LogoSpinner() { + const { resolvedTheme } = useTheme(); + + const logoSrc = resolvedTheme === "dark" ? LogoSpinnerDark : LogoSpinnerLight; + + return ( +
+
+ logo +
+
+ ); +} diff --git a/space/app/page.tsx b/space/app/page.tsx index 5ac59d7e1..c8a0b7920 100644 --- a/space/app/page.tsx +++ b/space/app/page.tsx @@ -1,20 +1,27 @@ +"use client"; +import { observer } from "mobx-react-lite"; +import useSWR from "swr"; // components import { UserLoggedIn } from "@/components/accounts"; +import { LogoSpinner } from "@/components/common"; import { AuthView } from "@/components/views"; -// services -import { UserService } from "@/services/user.service"; +// hooks +import { useUser } from "@/hooks/store"; -const userServices = new UserService(); +function HomePage() { + const { fetchCurrentUser, isAuthenticated, isLoading } = useUser(); -export default async function HomePage() { - const user = await userServices - .currentUser() - .then((user) => ({ ...user, isAuthenticated: true })) - .catch(() => ({ isAuthenticated: false })); + useSWR("CURRENT_USER", () => fetchCurrentUser(), { errorRetryCount: 0 }); - if (user.isAuthenticated) { + if (isLoading) { + return ; + } + + if (isAuthenticated) { return ; } return ; } + +export default observer(HomePage); diff --git a/space/components/accounts/user-logged-in.tsx b/space/components/accounts/user-logged-in.tsx index 773d934ad..afd3016a6 100644 --- a/space/components/accounts/user-logged-in.tsx +++ b/space/components/accounts/user-logged-in.tsx @@ -11,6 +11,7 @@ export const UserLoggedIn = () => { const { data: user } = useUser(); if (!user) return null; + return (
diff --git a/space/components/common/index.ts b/space/components/common/index.ts index 36cc3c898..c4ea97f3c 100644 --- a/space/components/common/index.ts +++ b/space/components/common/index.ts @@ -1,2 +1,3 @@ export * from "./latest-feature-block"; export * from "./project-logo"; +export * from "./logo-spinner"; diff --git a/space/components/common/logo-spinner.tsx b/space/components/common/logo-spinner.tsx new file mode 100644 index 000000000..d3ec3cc2a --- /dev/null +++ b/space/components/common/logo-spinner.tsx @@ -0,0 +1,20 @@ +"use client"; +import Image from "next/image"; +import { useTheme } from "next-themes"; +// assets +import LogoSpinnerDark from "@/public/images/logo-spinner-dark.gif"; +import LogoSpinnerLight from "@/public/images/logo-spinner-light.gif"; + +export const LogoSpinner = () => { + const { resolvedTheme } = useTheme(); + + const logoSrc = resolvedTheme === "dark" ? LogoSpinnerDark : LogoSpinnerLight; + + return ( +
+
+ logo +
+
+ ); +}; diff --git a/space/components/issues/navbar/controls.tsx b/space/components/issues/navbar/controls.tsx index f344ef622..d2adcea40 100644 --- a/space/components/issues/navbar/controls.tsx +++ b/space/components/issues/navbar/controls.tsx @@ -1,8 +1,10 @@ "use client"; import { useEffect, FC } from "react"; +import { observer } from "mobx-react-lite"; import Link from "next/link"; import { useRouter, useParams, useSearchParams, usePathname } from "next/navigation"; +import useSWR from "swr"; // ui import { Avatar, Button } from "@plane/ui"; // components @@ -21,7 +23,7 @@ export type NavbarControlsProps = { projectSettings: any; }; -export const NavbarControls: FC = (props) => { +export const NavbarControls: FC = observer((props) => { const { workspaceSlug, projectId, projectSettings } = props; const { views } = projectSettings; // router @@ -34,7 +36,11 @@ export const NavbarControls: FC = (props) => { const { settings, activeLayout, hydrate, setActiveLayout } = useProject(); hydrate(projectSettings); - const { data: user } = useUser(); + const { data: user, fetchCurrentUser } = useUser(); + + useSWR("CURRENT_USER", () => fetchCurrentUser(), { errorRetryCount: 2 }); + + console.log("user", user); useEffect(() => { if (workspaceSlug && projectId && settings) { @@ -126,4 +132,4 @@ export const NavbarControls: FC = (props) => { )} ); -}; +}); diff --git a/space/components/issues/navbar/index.tsx b/space/components/issues/navbar/index.tsx index 4ce2d2691..c356230d4 100644 --- a/space/components/issues/navbar/index.tsx +++ b/space/components/issues/navbar/index.tsx @@ -1,7 +1,5 @@ "use client"; - import { FC } from "react"; -import { observer } from "mobx-react-lite"; import { Briefcase } from "lucide-react"; // components import { ProjectLogo } from "@/components/common"; @@ -13,7 +11,7 @@ type IssueNavbarProps = { projectId: string; }; -const IssueNavbar: FC = observer((props) => { +const IssueNavbar: FC = (props) => { const { projectSettings, workspaceSlug, projectId } = props; const { project_details } = projectSettings; @@ -40,6 +38,6 @@ const IssueNavbar: FC = observer((props) => {
); -}); +}; export default IssueNavbar; diff --git a/space/components/views/auth.tsx b/space/components/views/auth.tsx index 87ff8c366..0825683c6 100644 --- a/space/components/views/auth.tsx +++ b/space/components/views/auth.tsx @@ -4,12 +4,8 @@ import { observer } from "mobx-react-lite"; import Image from "next/image"; // ui import { useTheme } from "next-themes"; -import useSWR from "swr"; -import { Spinner } from "@plane/ui"; // components import { AuthRoot } from "@/components/accounts"; -// hooks -import { useUser } from "@/hooks/store"; // images import PlaneBackgroundPatternDark from "public/auth/background-pattern-dark.svg"; import PlaneBackgroundPattern from "public/auth/background-pattern.svg"; @@ -18,48 +14,27 @@ import BluePlaneLogoWithoutText from "public/plane-logos/blue-without-text-new.p export const AuthView = observer(() => { // hooks const { resolvedTheme } = useTheme(); - // store - const { fetchCurrentUser, isLoading } = useUser(); - - // fetching user information - const { isLoading: isSWRLoading } = useSWR("CURRENT_USER_DETAILS", () => fetchCurrentUser(), { - shouldRetryOnError: false, - revalidateOnFocus: false, - revalidateIfStale: false, - revalidateOnReconnect: true, - errorRetryCount: 1, - }); return ( - <> - {isLoading || isSWRLoading ? ( -
- -
- ) : ( - <> -
-
- Plane background pattern -
-
-
-
- Plane Logo - Plane -
-
-
- -
-
+
+
+ Plane background pattern +
+
+
+
+ Plane Logo + Plane
- - )} - +
+
+ +
+
+
); }); diff --git a/space/public/images/logo-spinner-dark.gif b/space/public/images/logo-spinner-dark.gif new file mode 100644 index 000000000..4e0a1deb7 Binary files /dev/null and b/space/public/images/logo-spinner-dark.gif differ diff --git a/space/public/images/logo-spinner-light.gif b/space/public/images/logo-spinner-light.gif new file mode 100644 index 000000000..7c9bfbe0e Binary files /dev/null and b/space/public/images/logo-spinner-light.gif differ diff --git a/space/services/api.service.ts b/space/services/api.service.ts index 28be5a131..e4f7c8631 100644 --- a/space/services/api.service.ts +++ b/space/services/api.service.ts @@ -4,13 +4,13 @@ import axios, { AxiosInstance } from "axios"; // import { rootStore } from "@/lib/store-context"; export abstract class APIService { - protected baseURL: string; + protected baseURL: string | undefined; private axiosInstance: AxiosInstance; - constructor(baseURL: string) { + constructor(baseURL: string | undefined) { this.baseURL = baseURL; this.axiosInstance = axios.create({ - baseURL, + baseURL: baseURL || "", withCredentials: true, }); diff --git a/space/store/user.store.ts b/space/store/user.store.ts index ee376e09f..37ce30732 100644 --- a/space/store/user.store.ts +++ b/space/store/user.store.ts @@ -37,7 +37,7 @@ export interface IUserStore { export class UserStore implements IUserStore { // observables isAuthenticated: boolean = false; - isLoading: boolean = false; + isLoading: boolean = true; error: TUserErrorStatus | undefined = undefined; data: IUser | undefined = undefined; // store observables