From 14efa09486ebb5aff43763e2ab75eab47d6be4c8 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Mon, 26 Feb 2024 21:13:47 +0800 Subject: [PATCH 1/3] :sparkles: Use dropdown nav --- pkg/server/startup.go | 4 +- pkg/view/bun.lockb | Bin 165626 -> 0 bytes pkg/view/src/components/AppShell.tsx | 136 ------------------ pkg/{view => views}/.eslintrc.cjs | 0 pkg/{view => views}/.gitignore | 0 pkg/{view => views}/README.md | 0 pkg/views/bun.lockb | Bin 0 -> 165996 bytes pkg/{view => views}/embed.go | 2 +- pkg/{view => views}/index.html | 0 pkg/{view => views}/package.json | 0 pkg/{view => views}/public/favicon.svg | 0 .../src/components/AppLoader.tsx | 0 pkg/views/src/components/AppShell.tsx | 95 ++++++++++++ .../src/components/NavigationMenu.tsx} | 100 +++---------- pkg/{view => views}/src/consts.tsx | 0 pkg/{view => views}/src/error.tsx | 0 pkg/{view => views}/src/index.css | 0 pkg/{view => views}/src/main.tsx | 0 .../src/pages/auth/sign-in.tsx | 0 .../src/pages/auth/sign-up.tsx | 0 pkg/{view => views}/src/pages/landing.tsx | 0 pkg/{view => views}/src/scripts/request.ts | 0 pkg/{view => views}/src/stores/userinfo.tsx | 0 pkg/{view => views}/src/stores/wellKnown.tsx | 0 pkg/{view => views}/src/theme.ts | 0 pkg/{view => views}/src/vite-env.d.ts | 0 pkg/{view => views}/tsconfig.json | 0 pkg/{view => views}/tsconfig.node.json | 0 pkg/{view => views}/uno.config.ts | 0 pkg/{view => views}/vite.config.ts | 0 30 files changed, 120 insertions(+), 217 deletions(-) delete mode 100755 pkg/view/bun.lockb delete mode 100644 pkg/view/src/components/AppShell.tsx rename pkg/{view => views}/.eslintrc.cjs (100%) rename pkg/{view => views}/.gitignore (100%) rename pkg/{view => views}/README.md (100%) create mode 100755 pkg/views/bun.lockb rename pkg/{view => views}/embed.go (79%) rename pkg/{view => views}/index.html (100%) rename pkg/{view => views}/package.json (100%) rename pkg/{view => views}/public/favicon.svg (100%) rename pkg/{view => views}/src/components/AppLoader.tsx (100%) create mode 100644 pkg/views/src/components/AppShell.tsx rename pkg/{view/src/components/NavigationDrawer.tsx => views/src/components/NavigationMenu.tsx} (50%) rename pkg/{view => views}/src/consts.tsx (100%) rename pkg/{view => views}/src/error.tsx (100%) rename pkg/{view => views}/src/index.css (100%) rename pkg/{view => views}/src/main.tsx (100%) rename pkg/{view => views}/src/pages/auth/sign-in.tsx (100%) rename pkg/{view => views}/src/pages/auth/sign-up.tsx (100%) rename pkg/{view => views}/src/pages/landing.tsx (100%) rename pkg/{view => views}/src/scripts/request.ts (100%) rename pkg/{view => views}/src/stores/userinfo.tsx (100%) rename pkg/{view => views}/src/stores/wellKnown.tsx (100%) rename pkg/{view => views}/src/theme.ts (100%) rename pkg/{view => views}/src/vite-env.d.ts (100%) rename pkg/{view => views}/tsconfig.json (100%) rename pkg/{view => views}/tsconfig.node.json (100%) rename pkg/{view => views}/uno.config.ts (100%) rename pkg/{view => views}/vite.config.ts (100%) diff --git a/pkg/server/startup.go b/pkg/server/startup.go index 6df4bbe..f465083 100644 --- a/pkg/server/startup.go +++ b/pkg/server/startup.go @@ -1,7 +1,7 @@ package server import ( - "code.smartsheep.studio/hydrogen/identity/pkg/view" + "code.smartsheep.studio/hydrogen/identity/pkg/views" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cache" "github.com/gofiber/fiber/v2/middleware/cors" @@ -92,7 +92,7 @@ func NewServer() { Expiration: 24 * time.Hour, CacheControl: true, }), filesystem.New(filesystem.Config{ - Root: http.FS(view.FS), + Root: http.FS(views.FS), PathPrefix: "dist", Index: "index.html", NotFoundFile: "dist/index.html", diff --git a/pkg/view/bun.lockb b/pkg/view/bun.lockb deleted file mode 100755 index 4f36ee3d406b7f40ad831de535746edff2346396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165626 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 J`2XqO{|EHwxc~qF diff --git a/pkg/view/src/components/AppShell.tsx b/pkg/view/src/components/AppShell.tsx deleted file mode 100644 index 1184bcc..0000000 --- a/pkg/view/src/components/AppShell.tsx +++ /dev/null @@ -1,136 +0,0 @@ -import { - Slide, - Toolbar, - Typography, - AppBar as MuiAppBar, - AppBarProps as MuiAppBarProps, - useScrollTrigger, - IconButton, - styled, - Box, - useMediaQuery, -} from "@mui/material"; -import { ReactElement, ReactNode, useEffect, useState } from "react"; -import { SITE_NAME } from "@/consts"; -import { Link } from "react-router-dom"; -import NavigationDrawer, { DRAWER_WIDTH, AppNavigationHeader, isMobileQuery } from "@/components/NavigationDrawer"; -import MenuIcon from "@mui/icons-material/Menu"; - -function HideOnScroll(props: { window?: () => Window; children: ReactElement }) { - const { children, window } = props; - const trigger = useScrollTrigger({ - target: window ? window() : undefined, - }); - - return ( - - {children} - - ); -} - -interface AppBarProps extends MuiAppBarProps { - open?: boolean; -} - -const ShellAppBar = styled(MuiAppBar, { - shouldForwardProp: (prop) => prop !== "open", -})(({ theme, open }) => { - const isMobile = useMediaQuery(isMobileQuery); - - return { - transition: theme.transitions.create(["margin", "width"], { - easing: theme.transitions.easing.sharp, - duration: theme.transitions.duration.leavingScreen, - }), - ...(!isMobile && - open && { - width: `calc(100% - ${DRAWER_WIDTH}px)`, - transition: theme.transitions.create(["margin", "width"], { - easing: theme.transitions.easing.easeOut, - duration: theme.transitions.duration.enteringScreen, - }), - marginRight: DRAWER_WIDTH, - }), - }; -}); - -const AppMain = styled("main", { shouldForwardProp: (prop) => prop !== "open" })<{ - open?: boolean; -}>(({ theme, open }) => { - const isMobile = useMediaQuery(isMobileQuery); - - return { - flexGrow: 1, - transition: theme.transitions.create("margin", { - easing: theme.transitions.easing.sharp, - duration: theme.transitions.duration.leavingScreen, - }), - marginRight: -DRAWER_WIDTH, - ...(!isMobile && - open && { - transition: theme.transitions.create("margin", { - easing: theme.transitions.easing.easeOut, - duration: theme.transitions.duration.enteringScreen, - }), - marginRight: 0, - }), - position: "relative", - }; -}); - -export default function AppShell({ children }: { children: ReactNode }) { - let documentWindow: Window; - - const isMobile = useMediaQuery(isMobileQuery); - const [open, setOpen] = useState(false); - - useEffect(() => { - documentWindow = window; - }); - - return ( - <> - documentWindow}> - - - - Logo - - - - {SITE_NAME} - - - setOpen(true)} - sx={{ width: 64, mr: 1, display: !isMobile && open ? "none" : "block" }} - > - - - - - - - - - - - {children} - - - setOpen(false)} /> - - - ); -} diff --git a/pkg/view/.eslintrc.cjs b/pkg/views/.eslintrc.cjs similarity index 100% rename from pkg/view/.eslintrc.cjs rename to pkg/views/.eslintrc.cjs diff --git a/pkg/view/.gitignore b/pkg/views/.gitignore similarity index 100% rename from pkg/view/.gitignore rename to pkg/views/.gitignore diff --git a/pkg/view/README.md b/pkg/views/README.md similarity index 100% rename from pkg/view/README.md rename to pkg/views/README.md diff --git a/pkg/views/bun.lockb b/pkg/views/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..20e87a6d5a753b7a3a7a5c84c5f4c9b6d3c0d28b GIT binary patch literal 165996 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 QWG*J(ju!?-jmMu}7oGd$XaE2J literal 0 HcmV?d00001 diff --git a/pkg/view/embed.go b/pkg/views/embed.go similarity index 79% rename from pkg/view/embed.go rename to pkg/views/embed.go index ec34587..bc04fa4 100644 --- a/pkg/view/embed.go +++ b/pkg/views/embed.go @@ -1,4 +1,4 @@ -package view +package views import "embed" diff --git a/pkg/view/index.html b/pkg/views/index.html similarity index 100% rename from pkg/view/index.html rename to pkg/views/index.html diff --git a/pkg/view/package.json b/pkg/views/package.json similarity index 100% rename from pkg/view/package.json rename to pkg/views/package.json diff --git a/pkg/view/public/favicon.svg b/pkg/views/public/favicon.svg similarity index 100% rename from pkg/view/public/favicon.svg rename to pkg/views/public/favicon.svg diff --git a/pkg/view/src/components/AppLoader.tsx b/pkg/views/src/components/AppLoader.tsx similarity index 100% rename from pkg/view/src/components/AppLoader.tsx rename to pkg/views/src/components/AppLoader.tsx diff --git a/pkg/views/src/components/AppShell.tsx b/pkg/views/src/components/AppShell.tsx new file mode 100644 index 0000000..e232f91 --- /dev/null +++ b/pkg/views/src/components/AppShell.tsx @@ -0,0 +1,95 @@ +import { + AppBar, + Avatar, + Box, + IconButton, + Slide, + Toolbar, + Typography, + useMediaQuery, + useScrollTrigger +} from "@mui/material"; +import { ReactElement, ReactNode, useEffect, useRef, useState } from "react"; +import { SITE_NAME } from "@/consts"; +import { Link } from "react-router-dom"; +import NavigationMenu, { AppNavigationHeader, isMobileQuery } from "@/components/NavigationMenu.tsx"; +import AccountCircleIcon from "@mui/icons-material/AccountCircleOutlined"; +import { useUserinfo } from "@/stores/userinfo.tsx"; + +function HideOnScroll(props: { window?: () => Window; children: ReactElement }) { + const { children, window } = props; + const trigger = useScrollTrigger({ + target: window ? window() : undefined + }); + + return ( + + {children} + + ); +} + +export default function AppShell({ children }: { children: ReactNode }) { + let documentWindow: Window; + + const { userinfo } = useUserinfo(); + + const isMobile = useMediaQuery(isMobileQuery); + const [open, setOpen] = useState(false); + + useEffect(() => { + documentWindow = window; + }, []); + + const container = useRef(null); + + return ( + <> + documentWindow}> + + + + Logo + + + + {SITE_NAME} + + + setOpen(true)} + sx={{ mr: 1 }} + > + + + + + + + + + + + + {children} + + + setOpen(false)} /> + + ); +} diff --git a/pkg/view/src/components/NavigationDrawer.tsx b/pkg/views/src/components/NavigationMenu.tsx similarity index 50% rename from pkg/view/src/components/NavigationDrawer.tsx rename to pkg/views/src/components/NavigationMenu.tsx index 34a128f..b00a387 100644 --- a/pkg/view/src/components/NavigationDrawer.tsx +++ b/pkg/views/src/components/NavigationMenu.tsx @@ -1,27 +1,15 @@ -import ChevronLeftIcon from "@mui/icons-material/ChevronLeft"; -import ChevronRightIcon from "@mui/icons-material/ChevronRight"; -import { - Box, - Collapse, - Divider, - Drawer, - IconButton, - List, - ListItemButton, - ListItemIcon, - ListItemText, - styled, - useMediaQuery -} from "@mui/material"; +import { Collapse, Divider, ListItemIcon, ListItemText, Menu, MenuItem, styled } from "@mui/material"; import { theme } from "@/theme"; import { Fragment, ReactNode, useState } from "react"; import HowToRegIcon from "@mui/icons-material/HowToReg"; import LoginIcon from "@mui/icons-material/Login"; import FaceIcon from "@mui/icons-material/Face"; -import LogoutIcon from "@mui/icons-material/Logout"; +import LogoutIcon from "@mui/icons-material/ExitToApp"; import ExpandLess from "@mui/icons-material/ExpandLess"; import ExpandMore from "@mui/icons-material/ExpandMore"; import { useUserinfo } from "@/stores/userinfo.tsx"; +import { PopoverProps } from "@mui/material/Popover"; +import { Link } from "react-router-dom"; export interface NavigationItem { icon?: ReactNode; @@ -51,32 +39,30 @@ export function AppNavigationSection({ items, depth }: { items: NavigationItem[] } else if (item.children) { return ( - setOpen(!open)} sx={{ pl: 2 + (depth ?? 0) * 2 }}> + setOpen(!open)} sx={{ pl: 2 + (depth ?? 0) * 2, width: 180 }}> {item.icon} {open ? : } - + - - - + ); } else { return ( - - + + {item.icon} - - + + ); } }); } -export function AppNavigation({ showClose, onClose }: { showClose?: boolean; onClose: () => void }) { +export function AppNavigation() { const { checkLoggedIn } = useUserinfo(); const nav: NavigationItem[] = [ @@ -94,61 +80,19 @@ export function AppNavigation({ showClose, onClose }: { showClose?: boolean; onC ) ]; - return ( - <> - - {showClose && ( - - {theme.direction === "rtl" ? : } - - )} - - - - - - - ); + return ; } export const isMobileQuery = theme.breakpoints.down("md"); -export default function NavigationDrawer({ open, onClose }: { open: boolean; onClose: () => void }) { - const isMobile = useMediaQuery(isMobileQuery); - - return isMobile ? ( - <> - - - - - - ) : ( - - - +export default function NavigationMenu({ anchorEl, open, onClose }: { + anchorEl: PopoverProps["anchorEl"]; + open: boolean; + onClose: () => void +}) { + return ( + + + ); } diff --git a/pkg/view/src/consts.tsx b/pkg/views/src/consts.tsx similarity index 100% rename from pkg/view/src/consts.tsx rename to pkg/views/src/consts.tsx diff --git a/pkg/view/src/error.tsx b/pkg/views/src/error.tsx similarity index 100% rename from pkg/view/src/error.tsx rename to pkg/views/src/error.tsx diff --git a/pkg/view/src/index.css b/pkg/views/src/index.css similarity index 100% rename from pkg/view/src/index.css rename to pkg/views/src/index.css diff --git a/pkg/view/src/main.tsx b/pkg/views/src/main.tsx similarity index 100% rename from pkg/view/src/main.tsx rename to pkg/views/src/main.tsx diff --git a/pkg/view/src/pages/auth/sign-in.tsx b/pkg/views/src/pages/auth/sign-in.tsx similarity index 100% rename from pkg/view/src/pages/auth/sign-in.tsx rename to pkg/views/src/pages/auth/sign-in.tsx diff --git a/pkg/view/src/pages/auth/sign-up.tsx b/pkg/views/src/pages/auth/sign-up.tsx similarity index 100% rename from pkg/view/src/pages/auth/sign-up.tsx rename to pkg/views/src/pages/auth/sign-up.tsx diff --git a/pkg/view/src/pages/landing.tsx b/pkg/views/src/pages/landing.tsx similarity index 100% rename from pkg/view/src/pages/landing.tsx rename to pkg/views/src/pages/landing.tsx diff --git a/pkg/view/src/scripts/request.ts b/pkg/views/src/scripts/request.ts similarity index 100% rename from pkg/view/src/scripts/request.ts rename to pkg/views/src/scripts/request.ts diff --git a/pkg/view/src/stores/userinfo.tsx b/pkg/views/src/stores/userinfo.tsx similarity index 100% rename from pkg/view/src/stores/userinfo.tsx rename to pkg/views/src/stores/userinfo.tsx diff --git a/pkg/view/src/stores/wellKnown.tsx b/pkg/views/src/stores/wellKnown.tsx similarity index 100% rename from pkg/view/src/stores/wellKnown.tsx rename to pkg/views/src/stores/wellKnown.tsx diff --git a/pkg/view/src/theme.ts b/pkg/views/src/theme.ts similarity index 100% rename from pkg/view/src/theme.ts rename to pkg/views/src/theme.ts diff --git a/pkg/view/src/vite-env.d.ts b/pkg/views/src/vite-env.d.ts similarity index 100% rename from pkg/view/src/vite-env.d.ts rename to pkg/views/src/vite-env.d.ts diff --git a/pkg/view/tsconfig.json b/pkg/views/tsconfig.json similarity index 100% rename from pkg/view/tsconfig.json rename to pkg/views/tsconfig.json diff --git a/pkg/view/tsconfig.node.json b/pkg/views/tsconfig.node.json similarity index 100% rename from pkg/view/tsconfig.node.json rename to pkg/views/tsconfig.node.json diff --git a/pkg/view/uno.config.ts b/pkg/views/uno.config.ts similarity index 100% rename from pkg/view/uno.config.ts rename to pkg/views/uno.config.ts diff --git a/pkg/view/vite.config.ts b/pkg/views/vite.config.ts similarity index 100% rename from pkg/view/vite.config.ts rename to pkg/views/vite.config.ts From e4ace4324a4a7503a59e1e9bdec5c607004daf38 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Wed, 28 Feb 2024 23:30:29 +0800 Subject: [PATCH 2/3] :recycle: Brand new user center --- pkg/models/accounts.go | 1 + pkg/models/profiles.go | 1 - pkg/server/accounts_api.go | 12 +- pkg/server/notifications_api.go | 14 +- pkg/views/package.json | 6 +- pkg/views/src/components/AppShell.tsx | 2 +- pkg/views/src/main.tsx | 41 ++- pkg/views/src/pages/users/dashboard.tsx | 35 +++ pkg/views/src/pages/users/layout.tsx | 65 +++++ pkg/views/src/pages/users/notifications.tsx | 87 +++++++ pkg/views/src/pages/users/personalize.tsx | 250 ++++++++++++++++++ pkg/views/src/pages/users/security.tsx | 267 ++++++++++++++++++++ pkg/views/src/stores/userinfo.tsx | 9 +- 13 files changed, 759 insertions(+), 31 deletions(-) create mode 100644 pkg/views/src/pages/users/dashboard.tsx create mode 100644 pkg/views/src/pages/users/layout.tsx create mode 100644 pkg/views/src/pages/users/notifications.tsx create mode 100644 pkg/views/src/pages/users/personalize.tsx create mode 100644 pkg/views/src/pages/users/security.tsx diff --git a/pkg/models/accounts.go b/pkg/models/accounts.go index 7464bd3..56f635f 100644 --- a/pkg/models/accounts.go +++ b/pkg/models/accounts.go @@ -12,6 +12,7 @@ type Account struct { Name string `json:"name" gorm:"uniqueIndex"` Nick string `json:"nick"` + Description string `json:"description"` Avatar string `json:"avatar"` Profile AccountProfile `json:"profile"` Sessions []AuthSession `json:"sessions"` diff --git a/pkg/models/profiles.go b/pkg/models/profiles.go index d2da447..8ff124f 100644 --- a/pkg/models/profiles.go +++ b/pkg/models/profiles.go @@ -6,7 +6,6 @@ type AccountProfile struct { BaseModel FirstName string `json:"first_name"` - MiddleName string `json:"middle_name"` LastName string `json:"last_name"` Experience uint64 `json:"experience"` Birthday *time.Time `json:"birthday"` diff --git a/pkg/server/accounts_api.go b/pkg/server/accounts_api.go index 7c199e1..30947ca 100644 --- a/pkg/server/accounts_api.go +++ b/pkg/server/accounts_api.go @@ -76,11 +76,11 @@ func editUserinfo(c *fiber.Ctx) error { user := c.Locals("principal").(models.Account) var data struct { - Nick string `json:"nick" validate:"required,min=4,max=24"` - FirstName string `json:"first_name"` - MiddleName string `json:"middle_name"` - LastName string `json:"last_name"` - Birthday time.Time `json:"birthday"` + Nick string `json:"nick" validate:"required,min=4,max=24"` + Description string `json:"description"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` + Birthday time.Time `json:"birthday"` } if err := BindAndValidate(c, &data); err != nil { @@ -96,8 +96,8 @@ func editUserinfo(c *fiber.Ctx) error { } account.Nick = data.Nick + account.Description = data.Description account.Profile.FirstName = data.FirstName - account.Profile.MiddleName = data.MiddleName account.Profile.LastName = data.LastName account.Profile.Birthday = &data.Birthday diff --git a/pkg/server/notifications_api.go b/pkg/server/notifications_api.go index d5bdb69..c8f9cdf 100644 --- a/pkg/server/notifications_api.go +++ b/pkg/server/notifications_api.go @@ -14,17 +14,21 @@ func getNotifications(c *fiber.Ctx) error { take := c.QueryInt("take", 0) offset := c.QueryInt("offset", 0) + only_unread := c.QueryBool("only_unread", true) + + tx := database.C.Where(&models.Notification{RecipientID: user.ID}).Model(&models.Notification{}) + if only_unread { + tx = tx.Where("read_at IS NULL") + } + var count int64 var notifications []models.Notification - if err := database.C. - Where(&models.Notification{RecipientID: user.ID}). - Model(&models.Notification{}). + if err := tx. Count(&count).Error; err != nil { return fiber.NewError(fiber.StatusInternalServerError, err.Error()) } - if err := database.C. - Where(&models.Notification{RecipientID: user.ID}). + if err := tx. Limit(take). Offset(offset). Order("read_at desc"). diff --git a/pkg/views/package.json b/pkg/views/package.json index 2c57de9..61e5ddc 100644 --- a/pkg/views/package.json +++ b/pkg/views/package.json @@ -14,14 +14,18 @@ "@emotion/styled": "^11.11.0", "@fontsource/roboto": "^5.0.8", "@mui/icons-material": "^5.15.10", + "@mui/lab": "^5.0.0-alpha.166", "@mui/material": "^5.15.10", + "@mui/x-data-grid": "^6.19.5", + "@mui/x-date-pickers": "^6.19.5", "@unocss/reset": "^0.58.5", + "dayjs": "^1.11.10", "localforage": "^1.10.0", "match-sorter": "^6.3.4", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.22.1", - "react-swipeable-views": "^0.14.0", + "react-transition-group": "^4.4.5", "sort-by": "^1.2.0", "universal-cookie": "^7.1.0", "use-debounce": "^10.0.0" diff --git a/pkg/views/src/components/AppShell.tsx b/pkg/views/src/components/AppShell.tsx index e232f91..1de91bc 100644 --- a/pkg/views/src/components/AppShell.tsx +++ b/pkg/views/src/components/AppShell.tsx @@ -74,7 +74,7 @@ export default function AppShell({ children }: { children: ReactNode }) { sx={{ width: 32, height: 32, bgcolor: "transparent" }} ref={container} alt={userinfo?.displayName} - src={userinfo?.profiles?.avatar} + src={`/api/avatar/${userinfo?.data?.avatar}`} > diff --git a/pkg/views/src/main.tsx b/pkg/views/src/main.tsx index 9f4f21d..942fdfb 100644 --- a/pkg/views/src/main.tsx +++ b/pkg/views/src/main.tsx @@ -1,6 +1,8 @@ import React from "react"; import ReactDOM from "react-dom/client"; import { createBrowserRouter, Outlet, RouterProvider } from "react-router-dom"; +import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs"; +import { LocalizationProvider } from "@mui/x-date-pickers"; import { CssBaseline, ThemeProvider } from "@mui/material"; import { theme } from "@/theme.ts"; @@ -14,8 +16,13 @@ import AppShell from "@/components/AppShell.tsx"; import LandingPage from "@/pages/landing.tsx"; import SignUpPage from "@/pages/auth/sign-up.tsx"; import SignInPage from "@/pages/auth/sign-in.tsx"; +import DashboardPage from "@/pages/users/dashboard.tsx"; import ErrorBoundary from "@/error.tsx"; import AppLoader from "@/components/AppLoader.tsx"; +import UserLayout from "@/pages/users/layout.tsx"; +import NotificationsPage from "@/pages/users/notifications.tsx"; +import PersonalizePage from "@/pages/users/personalize.tsx"; +import SecurityPage from "@/pages/users/security.tsx"; import { UserinfoProvider } from "@/stores/userinfo.tsx"; import { WellKnownProvider } from "@/stores/wellKnown.tsx"; @@ -36,7 +43,17 @@ const router = createBrowserRouter([ element: , errorElement: , children: [ - { path: "/", element: } + { path: "/", element: }, + { + path: "/users", + element: , + children: [ + { path: "/users", element: }, + { path: "/users/notifications", element: }, + { path: "/users/personalize", element: }, + { path: "/users/security", element: } + ] + } ] }, { path: "/auth/sign-up", element: , errorElement: }, @@ -45,16 +62,18 @@ const router = createBrowserRouter([ const element = ( - - - - - - - - - - + + + + + + + + + + + + ); diff --git a/pkg/views/src/pages/users/dashboard.tsx b/pkg/views/src/pages/users/dashboard.tsx new file mode 100644 index 0000000..f0e1dc6 --- /dev/null +++ b/pkg/views/src/pages/users/dashboard.tsx @@ -0,0 +1,35 @@ +import { Alert, Box, Card, CardContent, Container, Typography } from "@mui/material"; +import { useUserinfo } from "@/stores/userinfo.tsx"; + +export default function DashboardPage() { + const { userinfo } = useUserinfo(); + + return ( + + + Welcome, {userinfo?.displayName} + What can I help you today? + + + { + !userinfo?.profiles?.confirmed_at && + + Your account haven't confirmed yet. Go to your linked email + inbox and check out our registration confirm email. + + } + + + Frequently Asked Questions + + + + 没有人有问题。没有人敢有问题。鲁迅曾经说过: + 解决不了问题,就解决提问题的人。 —— 鲁迅 + 所以,我们的客诉率是 0% 哦~ + + + + + ); +} \ No newline at end of file diff --git a/pkg/views/src/pages/users/layout.tsx b/pkg/views/src/pages/users/layout.tsx new file mode 100644 index 0000000..df6147c --- /dev/null +++ b/pkg/views/src/pages/users/layout.tsx @@ -0,0 +1,65 @@ +import { Outlet, useLocation, useNavigate } from "react-router-dom"; +import { Box, Tab, Tabs, useMediaQuery } from "@mui/material"; +import { useEffect, useState } from "react"; +import { theme } from "@/theme.ts"; +import DashboardIcon from "@mui/icons-material/Dashboard"; +import InboxIcon from "@mui/icons-material/Inbox"; +import DrawIcon from "@mui/icons-material/Draw"; +import SecurityIcon from "@mui/icons-material/Security"; + +export default function UserLayout() { + const [focus, setFocus] = useState(0); + + const isMobile = useMediaQuery(theme.breakpoints.down("md")); + + const locations = ["/users", "/users/notifications", "/users/personalize", "/users/security"]; + const tabs = [ + { icon: , label: "Dashboard" }, + { icon: , label: "Notifications" }, + { icon: , label: "Personalize" }, + { icon: , label: "Security" } + ]; + + const location = useLocation(); + const navigate = useNavigate(); + + useEffect(() => { + const idx = locations.indexOf(location.pathname); + setFocus(idx); + }, []); + + function swap(idx: number) { + navigate(locations[idx]); + setFocus(idx); + } + + return ( + + + swap(val)} + sx={{ + borderRight: isMobile ? 0 : 1, + borderBottom: isMobile ? 1 : 0, + borderColor: "divider", + height: isMobile ? "fit-content" : "100%", + py: isMobile ? 0 : 1, + px: isMobile ? 1 : 0 + }} + > + {tabs.map((tab, idx) => ( + + ))} + + + + + + + + ); +} \ No newline at end of file diff --git a/pkg/views/src/pages/users/notifications.tsx b/pkg/views/src/pages/users/notifications.tsx new file mode 100644 index 0000000..16fafe0 --- /dev/null +++ b/pkg/views/src/pages/users/notifications.tsx @@ -0,0 +1,87 @@ +import { Alert, Box, Collapse, IconButton, LinearProgress, List, ListItem, ListItemText } from "@mui/material"; +import { useUserinfo } from "@/stores/userinfo.tsx"; +import { request } from "@/scripts/request.ts"; +import { useEffect, useState } from "react"; +import { TransitionGroup } from "react-transition-group"; +import MarkEmailReadIcon from "@mui/icons-material/MarkEmailRead"; + +export default function NotificationsPage() { + const { userinfo, readProfiles, getAtk } = useUserinfo(); + + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + const [notifications, setNotifications] = useState([]); + + async function readNotifications() { + const res = await request(`/api/notifications?take=100`, { + headers: { Authorization: `Bearer ${getAtk()}` } + }); + if (res.status !== 200) { + setError(await res.text()); + } else { + const data = await res.json(); + setNotifications(data["data"]); + setError(null); + } + } + + async function markNotifications(item: any) { + setLoading(true); + const res = await request(`/api/notifications/${item.id}/read`, { + method: "PUT", + headers: { Authorization: `Bearer ${getAtk()}` } + }); + if (res.status !== 200) { + setError(await res.text()); + } else { + readNotifications().then(() => readProfiles()); + setError(null); + } + setLoading(false); + } + + useEffect(() => { + readNotifications().then(() => setLoading(false)); + }, []); + + return ( + + + + + + + {error} + + + + You are done! There's no unread notifications for you. + + + + + {notifications.map((item, idx) => ( + + markNotifications(item)} + > + + + }> + + + + ))} + + + + ); +} \ No newline at end of file diff --git a/pkg/views/src/pages/users/personalize.tsx b/pkg/views/src/pages/users/personalize.tsx new file mode 100644 index 0000000..a024259 --- /dev/null +++ b/pkg/views/src/pages/users/personalize.tsx @@ -0,0 +1,250 @@ +import { + Alert, + Avatar, + Box, + Button, + Card, + CardContent, + CircularProgress, + Collapse, + Container, + Divider, + Grid, + LinearProgress, + Snackbar, + styled, + TextField, + Typography +} from "@mui/material"; +import { useUserinfo } from "@/stores/userinfo.tsx"; +import { ChangeEvent, FormEvent, useState } from "react"; +import { DatePicker } from "@mui/x-date-pickers"; +import { request } from "@/scripts/request.ts"; +import SaveIcon from "@mui/icons-material/Save"; +import PublishIcon from "@mui/icons-material/Publish"; +import NoAccountsIcon from "@mui/icons-material/NoAccounts"; +import dayjs from "dayjs"; + +const VisuallyHiddenInput = styled("input")({ + clip: "rect(0 0 0 0)", + clipPath: "inset(50%)", + height: 1, + overflow: "hidden", + position: "absolute", + bottom: 0, + left: 0, + whiteSpace: "nowrap", + width: 1 +}); + +export default function PersonalizePage() { + const { userinfo, readProfiles, getAtk } = useUserinfo(); + + const [done, setDone] = useState(false); + const [error, setError] = useState(null); + const [loading, setLoading] = useState(false); + + async function submit(evt: FormEvent) { + evt.preventDefault(); + + const data: any = Object.fromEntries(new FormData(evt.target as HTMLFormElement)); + if (data.birthday) data.birthday = new Date(data.birthday); + + setLoading(true); + const res = await request("/api/users/me", { + method: "PUT", + headers: { "Content-Type": "application/json", "Authorization": `Bearer ${getAtk()}` }, + body: JSON.stringify(data) + }); + if (res.status !== 200) { + setError(await res.text()); + } else { + await readProfiles(); + setDone(true); + setError(null); + } + setLoading(false); + } + + async function changeAvatar(evt: ChangeEvent) { + if (!evt.target.files) return; + + const file = evt.target.files[0]; + const payload = new FormData(); + payload.set("avatar", file); + + setLoading(true); + const res = await request("/api/avatar", { + method: "PUT", + headers: { "Authorization": `Bearer ${getAtk()}` }, + body: payload + }); + if (res.status !== 200) { + setError(await res.text()); + } else { + await readProfiles(); + setDone(true); + setError(null); + } + setLoading(false); + } + + function getBirthday() { + return userinfo?.data?.profile?.birthday ? dayjs(userinfo?.data?.profile?.birthday) : undefined; + } + + const basisForm = ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* @ts-ignore */} + + + + + ); + + return ( + + + Personalize + + Customize your appearance and name card across all Goatworks information. + + + + + {error} + + + + + + + + + + + Information + + The information for public. Let us and others better to know who you are. + + + + { + userinfo?.data != null ? basisForm : + + + + } + + + + + + setDone(false)} + message="Your profile has been updated. Some settings maybe need sometime to apply across site." + /> + + ); +} \ No newline at end of file diff --git a/pkg/views/src/pages/users/security.tsx b/pkg/views/src/pages/users/security.tsx new file mode 100644 index 0000000..166edc0 --- /dev/null +++ b/pkg/views/src/pages/users/security.tsx @@ -0,0 +1,267 @@ +import { + Alert, + Box, + Card, + CardContent, + Collapse, + Container, + Grid, + LinearProgress, + Tab, + Tabs, + Typography +} from "@mui/material"; +import { useUserinfo } from "@/stores/userinfo.tsx"; +import { TabContext, TabPanel } from "@mui/lab"; +import { useEffect, useState } from "react"; +import { DataGrid, GridActionsCellItem, GridColDef, GridRowParams, GridValueGetterParams } from "@mui/x-data-grid"; +import { request } from "@/scripts/request.ts"; +import ExitToAppIcon from "@mui/icons-material/ExitToApp"; + + +export default function SecurityPage() { + const dataDefinitions: { [id: string]: GridColDef[] } = { + challenges: [ + { field: "id", headerName: "ID", width: 64 }, + { field: "ip_address", headerName: "IP Address", minWidth: 128 }, + { field: "user_agent", headerName: "User Agent", minWidth: 320 }, + { + field: "created_at", + headerName: "Issued At", + minWidth: 160, + valueGetter: (params: GridValueGetterParams) => new Date(params.row.created_at).toLocaleString() + } + ], + sessions: [ + { field: "id", headerName: "ID", width: 64 }, + { + field: "audiences", + headerName: "Audiences", + minWidth: 128, + valueGetter: (params: GridValueGetterParams) => params.row.audiences.join(", ") + }, + { + field: "claims", + headerName: "Claims", + minWidth: 224, + valueGetter: (params: GridValueGetterParams) => params.row.claims.join(", ") + }, + { + field: "created_at", + headerName: "Issued At", + minWidth: 160, + valueGetter: (params: GridValueGetterParams) => new Date(params.row.created_at).toLocaleString() + }, + { + field: "actions", + type: "actions", + getActions: (params: GridRowParams) => [ + } + onClick={() => killSession(params.row)} + disabled={loading} + label="Sign Out" + /> + ] + } + ], + events: [ + { field: "id", headerName: "ID", width: 64 }, + { field: "type", headerName: "Type", minWidth: 128 }, + { field: "target", headerName: "Affected Object", minWidth: 128 }, + { field: "ip_address", headerName: "IP Address", minWidth: 128 }, + { field: "user_agent", headerName: "User Agent", minWidth: 128 }, + { + field: "created_at", + headerName: "Performed At", + minWidth: 160, + valueGetter: (params: GridValueGetterParams) => new Date(params.row.created_at).toLocaleString() + } + ] + }; + + const { getAtk } = useUserinfo(); + + const [challenges, setChallenges] = useState([]); + const [challengeCount, setChallengeCount] = useState(0); + const [sessions, setSessions] = useState([]); + const [sessionCount, setSessionCount] = useState(0); + const [events, setEvents] = useState([]); + const [eventCount, setEventCount] = useState(0); + + const [pagination, setPagination] = useState({ + challenges: { page: 0, pageSize: 5 }, + sessions: { page: 0, pageSize: 5 }, + events: { page: 0, pageSize: 5 } + }); + + const [error, setError] = useState(null); + const [loading, setLoading] = useState(false); + const [reverting] = useState({ + challenges: true, + sessions: true, + events: true + }); + + const [dataPane, setDataPane] = useState("challenges"); + + async function readChallenges() { + reverting.challenges = true; + const res = await request("/api/users/me/challenges?" + new URLSearchParams({ + take: pagination.challenges.pageSize.toString(), + offset: (pagination.challenges.page * pagination.challenges.pageSize).toString() + }), { + headers: { Authorization: `Bearer ${getAtk()}` } + }); + if (res.status !== 200) { + setError(await res.text()); + } else { + const data = await res.json(); + setChallenges(data["data"]); + setChallengeCount(data["count"]); + } + reverting.challenges = false; + } + + async function readSessions() { + reverting.sessions = true; + const res = await request("/api/users/me/sessions?" + new URLSearchParams({ + take: pagination.sessions.pageSize.toString(), + offset: (pagination.sessions.page * pagination.sessions.pageSize).toString() + }), { + headers: { Authorization: `Bearer ${getAtk()}` } + }); + if (res.status !== 200) { + setError(await res.text()); + } else { + const data = await res.json(); + setSessions(data["data"]); + setSessionCount(data["count"]); + } + reverting.sessions = false; + } + + async function readEvents() { + reverting.events = true; + const res = await request("/api/users/me/events?" + new URLSearchParams({ + take: pagination.events.pageSize.toString(), + offset: (pagination.events.page * pagination.events.pageSize).toString() + }), { + headers: { Authorization: `Bearer ${getAtk()}` } + }); + if (res.status !== 200) { + setError(await res.text()); + } else { + const data = await res.json(); + setEvents(data["data"]); + setEventCount(data["count"]); + } + reverting.events = false; + } + + async function killSession(item: any) { + setLoading(true); + const res = await request(`/api/users/me/sessions/${item.id}`, { + method: "DELETE", + headers: { Authorization: `Bearer ${getAtk()}` } + }); + if (res.status !== 200) { + setError(await res.text()); + } else { + await readSessions(); + setError(null); + } + setLoading(false); + } + + useEffect(() => { + readChallenges().then(() => console.log("Refreshed challenges list.")); + }, [pagination.challenges]); + + useEffect(() => { + readSessions().then(() => console.log("Refreshed sessions list.")); + }, [pagination.sessions]); + + useEffect(() => { + readEvents().then(() => console.log("Refreshed events list.")); + }, [pagination.events]); + + return ( + + + Security + + Overview and control all security details in your account. + + + + + {error} + + + + + + + + + + + + + setDataPane(val)}> + + + + + + + + + setPagination({ ...pagination, challenges: val })} + checkboxSelection + /> + + + setPagination({ ...pagination, sessions: val })} + checkboxSelection + /> + + + setPagination({ ...pagination, events: val })} + checkboxSelection + /> + + + + + + + + + ); +} \ No newline at end of file diff --git a/pkg/views/src/stores/userinfo.tsx b/pkg/views/src/stores/userinfo.tsx index 35d8f2c..e3400f7 100644 --- a/pkg/views/src/stores/userinfo.tsx +++ b/pkg/views/src/stores/userinfo.tsx @@ -5,15 +5,13 @@ import { createContext, useContext, useState } from "react"; export interface Userinfo { isLoggedIn: boolean, displayName: string, - profiles: any, - meta: any + data: any, } const defaultUserinfo: Userinfo = { isLoggedIn: false, displayName: "Citizen", - profiles: null, - meta: null + data: null, }; const UserinfoContext = createContext({ userinfo: defaultUserinfo }); @@ -46,8 +44,7 @@ export function UserinfoProvider(props: any) { setUserinfo({ isLoggedIn: true, displayName: data["nick"], - profiles: null, - meta: data + data: data }); } From 0a9369aba54b57b4721691d9027b0e305e36f50d Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Thu, 29 Feb 2024 22:14:22 +0800 Subject: [PATCH 3/3] :sparkles: OAuth & Auth Guard --- pkg/views/bun.lockb | Bin 165996 -> 166649 bytes pkg/views/src/main.tsx | 33 +++-- pkg/views/src/pages/auth/connect.tsx | 182 +++++++++++++++++++++++++++ pkg/views/src/pages/auth/layout.tsx | 12 ++ pkg/views/src/pages/auth/sign-in.tsx | 86 +++++++------ pkg/views/src/pages/auth/sign-up.tsx | 50 ++++---- pkg/views/src/pages/guard.tsx | 29 +++++ pkg/views/src/stores/userinfo.tsx | 14 ++- 8 files changed, 328 insertions(+), 78 deletions(-) create mode 100644 pkg/views/src/pages/auth/connect.tsx create mode 100644 pkg/views/src/pages/auth/layout.tsx create mode 100644 pkg/views/src/pages/guard.tsx diff --git a/pkg/views/bun.lockb b/pkg/views/bun.lockb index 20e87a6d5a753b7a3a7a5c84c5f4c9b6d3c0d28b..b20726d0f6073c9200167bf7a0af4e3102b00b7f 100755 GIT binary patch delta 32566 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 delta 31933 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 }, { - path: "/users", - element: , + path: "/", + element: , children: [ - { path: "/users", element: }, - { path: "/users/notifications", element: }, - { path: "/users/personalize", element: }, - { path: "/users/security", element: } + { + path: "/users", + element: , + children: [ + { path: "/users", element: }, + { path: "/users/notifications", element: }, + { path: "/users/personalize", element: }, + { path: "/users/security", element: } + ] + } ] } ] }, - { path: "/auth/sign-up", element: , errorElement: }, - { path: "/auth/sign-in", element: , errorElement: } + { + path: "/auth", + element: , + errorElement: , + children: [ + { path: "/auth/sign-up", element: , errorElement: }, + { path: "/auth/sign-in", element: , errorElement: }, + { path: "/auth/o/connect", element: , errorElement: } + ] + } ]); const element = ( diff --git a/pkg/views/src/pages/auth/connect.tsx b/pkg/views/src/pages/auth/connect.tsx new file mode 100644 index 0000000..567a3ed --- /dev/null +++ b/pkg/views/src/pages/auth/connect.tsx @@ -0,0 +1,182 @@ +import { useEffect, useState } from "react"; +import { + Alert, + Avatar, + Box, + Button, + Card, + CardContent, + Collapse, + Grid, + LinearProgress, + Typography +} from "@mui/material"; +import { request } from "@/scripts/request.ts"; +import { useUserinfo } from "@/stores/userinfo.tsx"; +import { useSearchParams } from "react-router-dom"; +import OutletIcon from "@mui/icons-material/Outlet"; +import WhatshotIcon from "@mui/icons-material/Whatshot"; + +export default function OauthConnectPage() { + const { getAtk } = useUserinfo(); + + const [panel, setPanel] = useState(0); + const [error, setError] = useState(null); + const [loading, setLoading] = useState(false); + + const [client, setClient] = useState(null); + + const [searchParams] = useSearchParams(); + + async function preconnect() { + const res = await request(`/api/auth/o/connect${location.search}`, { + headers: { "Authorization": `Bearer ${getAtk()}` } + }); + + if (res.status !== 200) { + setError(await res.text()); + } else { + const data = await res.json(); + + if (data["session"]) { + setPanel(1); + redirect(data["session"]); + } else { + setClient(data["client"]); + setLoading(false); + } + } + } + + useEffect(() => { + preconnect().then(() => console.log("Fetched metadata")); + }, []); + + function decline() { + if (window.history.length > 0) { + window.history.back(); + } else { + window.close(); + } + } + + async function approve() { + setLoading(true); + + const res = await request("/api/auth/o/connect?" + new URLSearchParams({ + client_id: searchParams.get("client_id") as string, + redirect_uri: encodeURIComponent(searchParams.get("redirect_uri") as string), + response_type: "code", + scope: searchParams.get("scope") as string + }), { + method: "POST", + headers: { "Authorization": `Bearer ${getAtk()}` } + }); + + if (res.status !== 200) { + setError(await res.text()); + setLoading(false); + } else { + const data = await res.json(); + setPanel(1); + setTimeout(() => redirect(data["session"]), 1850); + } + } + + function redirect(session: any) { + const url = `${searchParams.get("redirect_uri")}?code=${session["grant_token"]}&state=${searchParams.get("state")}`; + window.open(url, "_self"); + } + + const elements = [ + ( + <> + + + + + Sign in to {client?.name} + + + + + About this app + {client?.description} + + + Make you trust this app + + After you click Approve button, you will share your basic personal information to this application + developer. Some of them will leak your data. Think twice. + + + + + + + + + + + + ), + ( + <> + + + + + Authorized + + + + + Now Redirecting... + Hold on a second, we are going to redirect you to the target. + + + + + ) + ]; + + return ( + <> + {error && {error}} + + + + + + + + {elements[panel]} + + + + ); +} \ No newline at end of file diff --git a/pkg/views/src/pages/auth/layout.tsx b/pkg/views/src/pages/auth/layout.tsx new file mode 100644 index 0000000..f9dec4c --- /dev/null +++ b/pkg/views/src/pages/auth/layout.tsx @@ -0,0 +1,12 @@ +import { Box } from "@mui/material"; +import { Outlet } from "react-router-dom"; + +export default function AuthLayout() { + return ( + + + + + + ) +} \ No newline at end of file diff --git a/pkg/views/src/pages/auth/sign-in.tsx b/pkg/views/src/pages/auth/sign-in.tsx index 2173d10..22a62a7 100644 --- a/pkg/views/src/pages/auth/sign-in.tsx +++ b/pkg/views/src/pages/auth/sign-in.tsx @@ -277,51 +277,55 @@ export default function SignInPage() { } return ( - - - {error && {error}} + <> + {error && {error}} - - - - + + + You need sign in before take an action. After that, we will take you back to your work. + + - - {elements[panel]} - + + + + - - - - - Risk {challenge?.risk_level}  - Progress {challenge?.progress}/{challenge?.requirements} - - - - - - + + {elements[panel]} + - - - - Haven't an account? Sign up! - - + + + + + Risk {challenge?.risk_level}  + Progress {challenge?.progress}/{challenge?.requirements} + + + + + + + + + + + Haven't an account? Sign up! + - - + + ); } \ No newline at end of file diff --git a/pkg/views/src/pages/auth/sign-up.tsx b/pkg/views/src/pages/auth/sign-up.tsx index ba3dc8b..0af8031 100644 --- a/pkg/views/src/pages/auth/sign-up.tsx +++ b/pkg/views/src/pages/auth/sign-up.tsx @@ -166,35 +166,33 @@ export default function SignUpPage() { ]; return ( - - - {error && {error}} + <> + {error && {error}} - - - - + + + + - - {!done ? elements[0] : elements[1]} - - + + {!done ? elements[0] : elements[1]} + + - - - - Already have an account? Sign in! - - + + + + Already have an account? Sign in! + - - + + ); } \ No newline at end of file diff --git a/pkg/views/src/pages/guard.tsx b/pkg/views/src/pages/guard.tsx new file mode 100644 index 0000000..ce39a4c --- /dev/null +++ b/pkg/views/src/pages/guard.tsx @@ -0,0 +1,29 @@ +import { useEffect } from "react"; +import { Box, CircularProgress } from "@mui/material"; +import { Outlet, useLocation, useNavigate } from "react-router-dom"; +import { useUserinfo } from "@/stores/userinfo.tsx"; + +export default function AuthGuard() { + const { userinfo } = useUserinfo(); + + const navigate = useNavigate(); + const location = useLocation(); + + useEffect(() => { + console.log(userinfo) + if (userinfo?.isReady) { + if (!userinfo?.isLoggedIn) { + const callback = location.pathname + location.search; + navigate({ pathname: "/auth/sign-in", search: `redirect_uri=${callback}` }); + } + } + }, [userinfo]); + + return !userinfo?.isReady ? ( + + + + + + ) : ; +} \ No newline at end of file diff --git a/pkg/views/src/stores/userinfo.tsx b/pkg/views/src/stores/userinfo.tsx index e3400f7..4f70622 100644 --- a/pkg/views/src/stores/userinfo.tsx +++ b/pkg/views/src/stores/userinfo.tsx @@ -3,15 +3,17 @@ import { request } from "../scripts/request.ts"; import { createContext, useContext, useState } from "react"; export interface Userinfo { + isReady: boolean, isLoggedIn: boolean, displayName: string, data: any, } const defaultUserinfo: Userinfo = { + isReady: false, isLoggedIn: false, displayName: "Citizen", - data: null, + data: null }; const UserinfoContext = createContext({ userinfo: defaultUserinfo }); @@ -28,10 +30,15 @@ export function UserinfoProvider(props: any) { } async function readProfiles() { - if (!checkLoggedIn()) return; + if (!checkLoggedIn()) { + setUserinfo((data) => { + data.isReady = true; + return data; + }); + } const res = await request("/api/users/me", { - credentials: "include" + headers: { "Authorization": `Bearer ${getAtk()}` } }); if (res.status !== 200) { @@ -42,6 +49,7 @@ export function UserinfoProvider(props: any) { const data = await res.json(); setUserinfo({ + isReady: true, isLoggedIn: true, displayName: data["nick"], data: data