From 99607c66bc24daca536264e9e18b975db4ed47a4 Mon Sep 17 00:00:00 2001 From: hexxa Date: Wed, 25 Aug 2021 18:33:55 +0800 Subject: [PATCH] fix(ui/core_state): move userRole to login domain --- .../components/__test__/pane_login.test.tsx | 19 +---- .../src/components/__test__/panes.test.tsx | 1 - .../components/__test__/state_mgr.test.tsx | 6 +- src/client/web/src/components/core_state.ts | 2 +- src/client/web/src/components/pane_login.tsx | 69 ++++++++----------- .../web/src/components/pane_settings.tsx | 1 + src/client/web/src/components/panes.tsx | 4 +- src/client/web/src/components/root_frame.tsx | 2 +- src/client/web/src/components/state_mgr.tsx | 4 +- .../web/src/components/state_updater.ts | 2 +- src/client/web/src/components/topbar.tsx | 7 +- 11 files changed, 47 insertions(+), 70 deletions(-) diff --git a/src/client/web/src/components/__test__/pane_login.test.tsx b/src/client/web/src/components/__test__/pane_login.test.tsx index c88cc72..44c876b 100644 --- a/src/client/web/src/components/__test__/pane_login.test.tsx +++ b/src/client/web/src/components/__test__/pane_login.test.tsx @@ -16,6 +16,7 @@ describe("Login", () => { const coreState = newWithWorker(mockWorker); const pane = new AuthPane({ + userRole: coreState.login.userRole, authed: coreState.login.authed, captchaID: coreState.login.captchaID, update: (updater: (prevState: ICoreState) => ICoreState) => {}, @@ -32,31 +33,15 @@ describe("Login", () => { // login expect(updater().props.login).toEqual({ + userRole: "admin", authed: true, captchaID: "", }); // panes expect(updater().props.panes).toEqual({ - userRole: "admin", displaying: "", paneNames: Set(["settings", "login", "admin"]), }); - - // admin - let usersMap = Map({}); - usersResps.listUsersMockResp.data.users.forEach((user: User) => { - usersMap = usersMap.set(user.name, user); - }); - let roles = Set(); - Object.keys(usersResps.listRolesMockResp.data.roles).forEach( - (role: string) => { - roles = roles.add(role); - } - ); - expect(updater().props.admin).toEqual({ - users: usersMap, - roles: roles, - }); }); }); diff --git a/src/client/web/src/components/__test__/panes.test.tsx b/src/client/web/src/components/__test__/panes.test.tsx index 3d01916..63051e9 100644 --- a/src/client/web/src/components/__test__/panes.test.tsx +++ b/src/client/web/src/components/__test__/panes.test.tsx @@ -23,7 +23,6 @@ describe("Panes", () => { panes.closePane(); expect(updater().props.panes).toEqual({ - userRole: coreState.panes.userRole, displaying: "", paneNames: coreState.panes.paneNames, }); diff --git a/src/client/web/src/components/__test__/state_mgr.test.tsx b/src/client/web/src/components/__test__/state_mgr.test.tsx index 83fb6af..b20d085 100644 --- a/src/client/web/src/components/__test__/state_mgr.test.tsx +++ b/src/client/web/src/components/__test__/state_mgr.test.tsx @@ -43,14 +43,14 @@ describe("State Manager", () => { // panes expect(coreState.panes).toEqual({ - userRole: "admin", - displaying: "browser", + displaying: "", paneNames: Set(["settings", "login", "admin"]), }); // login expect(coreState.login).toEqual({ - authed: false, + userRole: "admin", + authed: true, captchaID: "mockCaptchaID", }); diff --git a/src/client/web/src/components/core_state.ts b/src/client/web/src/components/core_state.ts index 55a0dd7..2cd78e0 100644 --- a/src/client/web/src/components/core_state.ts +++ b/src/client/web/src/components/core_state.ts @@ -50,11 +50,11 @@ export function initState(): ICoreState { uploadFiles: List([]), }, panes: { - userRole: "", displaying: "browser", paneNames: Set(["settings", "login", "admin"]), }, login: { + userRole: "", authed: false, captchaID: "", }, diff --git a/src/client/web/src/components/pane_login.tsx b/src/client/web/src/components/pane_login.tsx index 5911710..72d1695 100644 --- a/src/client/web/src/components/pane_login.tsx +++ b/src/client/web/src/components/pane_login.tsx @@ -5,6 +5,7 @@ import { ICoreState } from "./core_state"; import { updater } from "./state_updater"; export interface Props { + userRole: string; authed: boolean; captchaID: string; update?: (updater: (prevState: ICoreState) => ICoreState) => void; @@ -48,63 +49,52 @@ export class AuthPane extends React.Component { this.props.captchaID, this.state.captchaInput ) - .then((ok: boolean) => { + .then((ok: boolean): Promise => { if (ok) { this.update(updater().updateLogin); - this.setState({ user: "", pwd: "" }); + this.setState({ user: "", pwd: "", captchaInput: "" }); // close all the panes updater().displayPane(""); this.update(updater().updatePanes); // refresh - return updater().setHomeItems(); + return Promise.all([ + updater().setHomeItems(), + updater().refreshUploadings(), + updater().isSharing(updater().props.browser.dirPath.join("/")), + updater().listSharings(), + updater().self(), + ]); } else { - this.setState({ user: "", pwd: "" }); + this.setState({ user: "", pwd: "", captchaInput: "" }); alert("Failed to login."); - } - }) - .then(() => { - return updater().refreshUploadings(); - }) - .then(() => { - return updater().isSharing( - updater().props.browser.dirPath.join("/") - ); - }) - .then(() => { - return updater().listSharings(); - }) - .then(() => { - return updater().self(); - }) - .then(() => { - // TODO: should rely on props to get userRole - if (updater().props.panes.userRole === "admin") { - // TODO: remove hardcode - return updater().listRoles(); + return updater().getCaptchaID(); } }) .then(() => { - // TODO: should rely on props to get userRole - if (updater().props.panes.userRole === "admin") { - // TODO: remove hardcode - return updater().listUsers(); - } - }) - .then((_: boolean) => { this.update(updater().updateBrowser); }); }; logout = () => { - updater().logout().then((ok: boolean) => { - if (ok) { - this.update(updater().updateLogin); - } else { - alert("Failed to logout."); - } - }); + updater() + .logout() + .then((ok: boolean) => { + if (ok) { + this.update(updater().updateLogin); + } else { + alert("Failed to logout."); + } + }); + }; + + refreshCaptcha = async () => { + return updater() + .getCaptchaID() + .then(() => { + this.props.update(updater().updateLogin); + }); }; render() { @@ -157,6 +147,7 @@ export class AuthPane extends React.Component {
diff --git a/src/client/web/src/components/pane_settings.tsx b/src/client/web/src/components/pane_settings.tsx index d816deb..d4ac9da 100644 --- a/src/client/web/src/components/pane_settings.tsx +++ b/src/client/web/src/components/pane_settings.tsx @@ -147,6 +147,7 @@ export class PaneSettings extends React.Component {
; } export interface Props { @@ -46,6 +45,7 @@ export class Panes extends React.Component { ), login: ( { ), }); - if (this.props.panes.userRole === "admin") { + if (this.props.login.userRole === "admin") { panesMap = panesMap.set( "admin", { update={this.props.update} /> - +
{ return updater().self(); }) .then(() => { - if (updater().props.panes.userRole === "admin") { + if (updater().props.login.userRole === "admin") { // TODO: remove hardcode return updater().listRoles(); } }) .then(() => { - if (updater().props.panes.userRole === "admin") { + if (updater().props.login.userRole === "admin") { // TODO: remove hardcode return updater().listUsers(); } diff --git a/src/client/web/src/components/state_updater.ts b/src/client/web/src/components/state_updater.ts index 7acde03..796aa66 100644 --- a/src/client/web/src/components/state_updater.ts +++ b/src/client/web/src/components/state_updater.ts @@ -202,7 +202,7 @@ export class Updater { self = async (): Promise => { const resp = await this.usersClient.self(); if (resp.status === 200) { - this.props.panes.userRole = resp.data.role; + this.props.login.userRole = resp.data.role; return true; } return false; diff --git a/src/client/web/src/components/topbar.tsx b/src/client/web/src/components/topbar.tsx index 13c51aa..3c0b355 100644 --- a/src/client/web/src/components/topbar.tsx +++ b/src/client/web/src/components/topbar.tsx @@ -1,10 +1,12 @@ import * as React from "react"; import { ICoreState } from "./core_state"; +import { Props as LoginProps } from "./pane_login"; import { updater } from "./state_updater"; export interface State {} export interface Props { + login: LoginProps; update?: (updater: (prevState: ICoreState) => ICoreState) => void; } @@ -22,11 +24,10 @@ export class TopBar extends React.Component { return updater() .self() .then(() => { - // TODO: use props instead // TODO: remove hardcode role if ( - updater().props.login.authed && - updater().props.panes.userRole === "admin" + this.props.login.authed && + this.props.login.userRole === "admin" ) { return Promise.all([updater().listRoles(), updater().listUsers()]); }