diff --git a/src/client/web/src/components/core_state.ts b/src/client/web/src/components/core_state.ts index 5bc2b01..acf0638 100644 --- a/src/client/web/src/components/core_state.ts +++ b/src/client/web/src/components/core_state.ts @@ -19,7 +19,6 @@ export interface MsgProps { } export interface UIProps { - // background: url("/static/img/textured_paper.png") repeat fixed center; wallpaper: string; repeat: string; position: string; @@ -63,7 +62,7 @@ export function initState(): ICoreState { }, panes: { displaying: "browser", - paneNames: Set(["settings", "login", "admin"]), + paneNames: Set([]), // "settings", "login", "admin" }, login: { userID: "", diff --git a/src/client/web/src/components/pane_login.tsx b/src/client/web/src/components/pane_login.tsx index 3864b38..03faac3 100644 --- a/src/client/web/src/components/pane_login.tsx +++ b/src/client/web/src/components/pane_login.tsx @@ -97,21 +97,6 @@ export class AuthPane extends React.Component { }); }; - logout = async () => { - return updater() - .logout() - .then((ok: boolean) => { - if (ok) { - this.update(updater().updateLogin); - } else { - alertMsg(this.props.msg.pkg.get("login.logout.fail")); - } - }) - .then(() => { - return this.refreshCaptcha(); - }); - }; - refreshCaptcha = async () => { return updater() .getCaptchaID() @@ -177,12 +162,6 @@ export class AuthPane extends React.Component { - - - - ); } diff --git a/src/client/web/src/components/panes.tsx b/src/client/web/src/components/panes.tsx index 5e5abee..2f90251 100644 --- a/src/client/web/src/components/panes.tsx +++ b/src/client/web/src/components/panes.tsx @@ -20,7 +20,7 @@ export interface Props { update?: (updater: (prevState: ICoreState) => ICoreState) => void; } -export interface State {} +export interface State { } export class Panes extends React.Component { constructor(p: Props) { super(p); @@ -35,55 +35,11 @@ export class Panes extends React.Component { render() { let displaying = this.props.panes.displaying; - - let panesMap: Map = Map({}); - const settingsPane = ( - - ); - const loginPane = ( - - ); - const adminPane = ( - - ); - - switch(this.props.login.userRole) { - case roleAdmin: - panesMap = panesMap.set("settings", settingsPane); - panesMap = panesMap.set("admin", adminPane); - panesMap = panesMap.set("login", loginPane); - break; - case roleUser: - panesMap = panesMap.set("settings", settingsPane); - panesMap = panesMap.set("login", loginPane); - break; - default: - panesMap = panesMap.set("login", loginPane); - break; - } - - const panes = panesMap.keySeq().map((paneName: string): JSX.Element => { - const isDisplay = displaying === paneName ? "" : "hidden"; - return ( -
- {panesMap.get(paneName)} -
- ); - }); - const btnClass = displaying === "login" ? "hidden" : ""; + const showSettings = this.props.panes.paneNames.get("settings") && displaying === "settings" ? "" : "hidden"; + const showLogin = this.props.panes.paneNames.get("login") && displaying === "login" ? "" : "hidden"; + const showAdmin = this.props.panes.paneNames.get("admin") && displaying === "admin" ? "" : "hidden"; + return (
@@ -102,7 +58,30 @@ export class Panes extends React.Component {
- {panes} +
+ +
+ +
+ +
+ +
+ +
+ ); diff --git a/src/client/web/src/components/root_frame.tsx b/src/client/web/src/components/root_frame.tsx index 50ca699..1442513 100644 --- a/src/client/web/src/components/root_frame.tsx +++ b/src/client/web/src/components/root_frame.tsx @@ -44,6 +44,7 @@ export class RootFrame extends React.Component { diff --git a/src/client/web/src/components/state_mgr.tsx b/src/client/web/src/components/state_mgr.tsx index f3d9f81..a0dbf9b 100644 --- a/src/client/web/src/components/state_mgr.tsx +++ b/src/client/web/src/components/state_mgr.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import { List } from "immutable"; +import { List, Set } from "immutable"; import { updater } from "./state_updater"; import { ICoreState, newState } from "./core_state"; @@ -9,8 +9,8 @@ import { UsersClient } from "../client/users"; import { IUsersClient, IFilesClient, roleAdmin, roleVisitor } from "../client"; import { alertMsg } from "../common/env"; -export interface Props {} -export interface State extends ICoreState {} +export interface Props { } +export interface State extends ICoreState { } export class StateMgr extends React.Component { private usersClient: IUsersClient = new UsersClient(""); @@ -62,16 +62,24 @@ export class StateMgr extends React.Component { if (updater().props.login.userRole === roleVisitor) { if (updater().props.browser.isSharing) { // sharing with visitor + updater().setPanes(Set(["login"])); updater().displayPane(""); return Promise.all([]); } // redirect to login + updater().setPanes(Set(["login"])); updater().displayPane("login"); return Promise.all([updater().getCaptchaID()]); } + if (updater().props.login.userRole === roleAdmin) { + updater().setPanes(Set(["login", "settings", "admin"])); + } else { + updater().setPanes(Set(["login", "settings"])); + } updater().displayPane(""); + return Promise.all([ updater().refreshUploadings(), updater().initUploads(), diff --git a/src/client/web/src/components/state_updater.ts b/src/client/web/src/components/state_updater.ts index 40c6219..057b0c3 100644 --- a/src/client/web/src/components/state_updater.ts +++ b/src/client/web/src/components/state_updater.ts @@ -12,6 +12,7 @@ import { UploadInfo, Quota, Response, + roleVisitor, } from "../client"; import { FilesClient } from "../client/files"; import { UsersClient } from "../client/users"; @@ -279,11 +280,15 @@ export class Updater { if (pane != null) { this.props.panes.displaying = paneName; } else { - alertMsg(`dialgos: pane (${paneName}) not found`); + alertMsg(`pane (${paneName}) not found`); } } }; + setPanes = (paneNames: Set) => { + this.props.panes.paneNames = paneNames; + }; + self = async (): Promise => { const resp = await this.usersClient.self(); if (resp.status === 200) { @@ -294,6 +299,7 @@ export class Updater { this.props.login.quota = resp.data.quota; return true; } + this.props.login.userRole = roleVisitor; return false; }; diff --git a/src/client/web/src/components/topbar.tsx b/src/client/web/src/components/topbar.tsx index bcdb42c..d33ef93 100644 --- a/src/client/web/src/components/topbar.tsx +++ b/src/client/web/src/components/topbar.tsx @@ -1,15 +1,17 @@ import * as React from "react"; import { List } from "immutable"; -import { RiGithubFill } from "@react-icons/all-files/ri/RiGithubFill"; +import { alertMsg } from "../common/env"; import { ICoreState, MsgProps } from "./core_state"; import { LoginProps } from "./pane_login"; +import { PanesProps } from "./panes"; import { updater } from "./state_updater"; import { Flexbox } from "./layout/flexbox"; -export interface State {} +export interface State { } export interface Props { login: LoginProps; + panes: PanesProps; msg: MsgProps; update?: (updater: (prevState: ICoreState) => ICoreState) => void; } @@ -40,17 +42,34 @@ export class TopBar extends React.Component { }); }; + logout = async () => { + return updater() + .logout() + .then((ok: boolean) => { + if (ok) { + this.props.update(updater().updateLogin); + } else { + alertMsg(this.props.msg.pkg.get("login.logout.fail")); + } + }) + .then(() => { + return this.refreshCaptcha(); + }); + }; + + refreshCaptcha = async () => { + return updater() + .getCaptchaID() + .then(() => { + this.props.update(updater().updateLogin); + }); + }; + render() { - const adminBtn = - this.props.login.userRole === "admin" ? ( - - ) : null; + const showUserInfo = this.props.login.authed ? "" : "hidden"; + const showLogin = this.props.login.authed ? "" : "hidden"; + const showSettings = this.props.panes.paneNames.get("settings") ? "" : "hidden"; + const showAdmin = this.props.panes.paneNames.get("admin") ? "" : "hidden"; return (
{ + {this.props.login.userName} @@ -81,13 +100,23 @@ export class TopBar extends React.Component { , - adminBtn, + , + + , ])} childrenStyles={List([{}, {}, {}, {}])} />, diff --git a/src/handlers/multiusers/handlers.go b/src/handlers/multiusers/handlers.go index 5eac582..22d90ee 100644 --- a/src/handlers/multiusers/handlers.go +++ b/src/handlers/multiusers/handlers.go @@ -111,6 +111,7 @@ func NewMultiUsersSvc(cfg gocfg.ICfg, deps *depidx.Deps) (*MultiUsersSvc, error) apiRuleCname(userstore.VisitorRole, "OPTIONS", "/v1/settings/health"): true, apiRuleCname(userstore.VisitorRole, "GET", "/v1/captchas/"): true, apiRuleCname(userstore.VisitorRole, "GET", "/v1/captchas/imgs"): true, + apiRuleCname(userstore.VisitorRole, "GET", "/v1/fs/sharings/exist"): true, } return &MultiUsersSvc{