diff --git a/VoidCat/Controllers/UserController.cs b/VoidCat/Controllers/UserController.cs index fd5a34d..8e7b005 100644 --- a/VoidCat/Controllers/UserController.cs +++ b/VoidCat/Controllers/UserController.cs @@ -43,10 +43,12 @@ public class UserController : Controller var requestedId = isMe ? loggedUser!.Value : id.FromBase58Guid(); var user = await _store.Get(requestedId); - if (loggedUser != requestedId && !(user?.Flags.HasFlag(UserFlags.PublicProfile) ?? false)) + if (user == default) return NotFound(); + if (loggedUser != requestedId && !user.Flags.HasFlag(UserFlags.PublicProfile)) return NotFound(); - return Json(user!.ToApiUser(isMe)); + var isMyProfile = requestedId == user.Id; + return Json(user!.ToApiUser(isMyProfile)); } /// diff --git a/VoidCat/Services/Users/UserManager.cs b/VoidCat/Services/Users/UserManager.cs index 268e724..cad7edd 100644 --- a/VoidCat/Services/Users/UserManager.cs +++ b/VoidCat/Services/Users/UserManager.cs @@ -117,6 +117,7 @@ public class UserManager var users = await _store.ListUsers(new(0, 1)); if (users.TotalResults == 0) { + newUser.Flags |= UserFlags.EmailVerified; // force email as verified for admin user newUser.Roles.Add(new() { UserId = newUser.Id, diff --git a/VoidCat/spa/src/app/src/App.tsx b/VoidCat/spa/src/app/src/App.tsx index 47a68cf..15aa441 100644 --- a/VoidCat/spa/src/app/src/App.tsx +++ b/VoidCat/spa/src/app/src/App.tsx @@ -1,6 +1,6 @@ import './App.css'; -import {createBrowserRouter, Outlet, RouterProvider} from "react-router-dom"; +import {createBrowserRouter, LoaderFunctionArgs, Outlet, RouterProvider} from "react-router-dom"; import {Provider} from "react-redux"; import store from "./Store"; @@ -11,6 +11,8 @@ import {UserLogin} from "./Pages/UserLogin"; import {ProfilePage} from "./Pages/Profile"; import {Header} from "./Components/Shared/Header"; import {Donate} from "./Pages/Donate"; +import {VoidApi} from "@void-cat/api"; +import {ApiHost} from "./Const"; const router = createBrowserRouter([ @@ -27,6 +29,13 @@ const router = createBrowserRouter([ }, { path: "/u/:id", + loader: async ({params}: LoaderFunctionArgs) => { + const api = new VoidApi(ApiHost, store.getState().login.jwt); + if(params.id) { + return await api.getUser(params.id); + } + return null; + }, element: }, { diff --git a/VoidCat/spa/src/app/src/Pages/Profile.tsx b/VoidCat/spa/src/app/src/Pages/Profile.tsx index b8a63fd..81d6cdc 100644 --- a/VoidCat/spa/src/app/src/Pages/Profile.tsx +++ b/VoidCat/spa/src/app/src/Pages/Profile.tsx @@ -1,8 +1,8 @@ import "./Profile.css"; -import {Fragment, useEffect, useState} from "react"; +import {Fragment, useState} from "react"; import {useDispatch, useSelector} from "react-redux"; import {default as moment} from "moment"; -import {useParams} from "react-router-dom"; +import {useLoaderData} from "react-router-dom"; import {Profile} from "@void-cat/api"; import useApi from "Hooks/UseApi"; @@ -16,11 +16,10 @@ import ApiKeyList from "../Components/Profile/ApiKeyList"; export function ProfilePage() { const dispatch = useDispatch(); - const params = useParams(); + const loader = useLoaderData(); const Api = useApi(); - const [profile, setProfile] = useState(); - const [noProfile, setNoProfile] = useState(); + const [profile, setProfile] = useState(loader as Profile | null); const [emailCode, setEmailCode] = useState(""); const [emailCodeError, setEmailCodeError] = useState(""); const [newCodeSent, setNewCodeSent] = useState(false); @@ -31,17 +30,6 @@ export function ProfilePage() { const needsEmailVerify = canEdit && profile?.needsVerification === true; const cantEditProfile = canEdit && !needsEmailVerify; - - async function loadProfile(id: string) { - try { - let p = await Api.getUser(id); - setProfile(p); - } catch (e) { - console.error(e); - setNoProfile(true); - } - } - async function changeAvatar() { const res = await new Promise>((resolve) => { let i = document.createElement('input'); @@ -54,9 +42,7 @@ export function ProfilePage() { }); const file = res[0]; - const noop = (_: any) => { - }; - const uploader = Api.getUploader(file, noop, noop, noop); + const uploader = Api.getUploader(file); const rsp = await uploader.upload(); if (rsp.ok) { setProfile({ @@ -79,7 +65,6 @@ export function ProfilePage() { async function submitCode(id: string, code: string) { try { await Api.submitVerifyCode(id, code); - await loadProfile(id); } catch (e) { console.error(e); setEmailCodeError("Invalid or expired code."); @@ -157,12 +142,6 @@ export function ProfilePage() { ); } - useEffect(() => { - if (params.id) { - loadProfile(params.id).catch(console.error); - } - }, [params]); - if (profile) { let avatarUrl = profile.avatar ?? DefaultAvatar; if (!avatarUrl.startsWith("http")) { @@ -209,12 +188,6 @@ export function ProfilePage() { ); - } else if (noProfile) { - return ( -
-

No profile found :(

-
- ); } else { return (