From f06c5f5a7dc7f8210059f8fbcdf3e071668ade4e Mon Sep 17 00:00:00 2001 From: hexxa Date: Sat, 22 Jan 2022 10:31:34 +0800 Subject: [PATCH] fix(fe): update query params and refactor initAll --- src/client/web/src/client/files.ts | 7 +- src/client/web/src/client/files_mock.ts | 39 ++-- src/client/web/src/client/settings_mock.ts | 8 +- .../web/src/components/panel_sharings.tsx | 3 +- .../web/src/components/state_updater.ts | 183 ++++++++++++------ src/handlers/fileshdr/handlers.go | 2 +- 6 files changed, 157 insertions(+), 85 deletions(-) diff --git a/src/client/web/src/client/files.ts b/src/client/web/src/client/files.ts index 4c72647..148e3dd 100644 --- a/src/client/web/src/client/files.ts +++ b/src/client/web/src/client/files.ts @@ -10,9 +10,10 @@ import { GetSharingDirResp, } from "./"; -const filePathQuery = "fp"; -const listDirQuery = "dp"; -const shareIDQuery = "sh"; +export const filePathQuery = "fp"; +export const listDirQuery = "dp"; +export const shareIDQuery = "shid"; +export const shareDirQuery = "shdir"; // TODO: get timeout from server function translateResp(resp: Response): Response { diff --git a/src/client/web/src/client/files_mock.ts b/src/client/web/src/client/files_mock.ts index d598553..4d25b67 100644 --- a/src/client/web/src/client/files_mock.ts +++ b/src/client/web/src/client/files_mock.ts @@ -10,6 +10,7 @@ import { } from "./"; import { makePromise } from "../test/helpers"; + export interface FilesClientResps { createMockRespID?: number; createMockResp?: Response; @@ -271,47 +272,47 @@ export class JestFilesClient { this.url = url; } - create = jest.fn().mockReturnValueOnce(makePromise(resps.createMockResp)); - delete = jest.fn().mockReturnValueOnce(makePromise(resps.deleteMockResp)); - metadata = jest.fn().mockReturnValueOnce(makePromise(resps.metadataMockResp)); - mkdir = jest.fn().mockReturnValueOnce(makePromise(resps.mkdirMockResp)); - move = jest.fn().mockReturnValueOnce(makePromise(resps.moveMockResp)); + create = jest.fn().mockReturnValue(makePromise(resps.createMockResp)); + delete = jest.fn().mockReturnValue(makePromise(resps.deleteMockResp)); + metadata = jest.fn().mockReturnValue(makePromise(resps.metadataMockResp)); + mkdir = jest.fn().mockReturnValue(makePromise(resps.mkdirMockResp)); + move = jest.fn().mockReturnValue(makePromise(resps.moveMockResp)); uploadChunk = jest .fn() - .mockReturnValueOnce(makePromise(resps.uploadChunkMockResp)); + .mockReturnValue(makePromise(resps.uploadChunkMockResp)); uploadStatus = jest .fn() - .mockReturnValueOnce(makePromise(resps.uploadStatusMockResp)); - list = jest.fn().mockReturnValueOnce(makePromise(resps.listMockResp)); - listHome = jest.fn().mockReturnValueOnce(makePromise(resps.listHomeMockResp)); + .mockReturnValue(makePromise(resps.uploadStatusMockResp)); + list = jest.fn().mockReturnValue(makePromise(resps.listMockResp)); + listHome = jest.fn().mockReturnValue(makePromise(resps.listHomeMockResp)); listUploadings = jest .fn() - .mockReturnValueOnce(makePromise(resps.listUploadingsMockResp)); + .mockReturnValue(makePromise(resps.listUploadingsMockResp)); deleteUploading = jest .fn() - .mockReturnValueOnce(makePromise(resps.deleteUploadingMockResp)); + .mockReturnValue(makePromise(resps.deleteUploadingMockResp)); addSharing = jest .fn() - .mockReturnValueOnce(makePromise(resps.addSharingMockResp)); + .mockReturnValue(makePromise(resps.addSharingMockResp)); deleteSharing = jest .fn() - .mockReturnValueOnce(makePromise(resps.deleteSharingMockResp)); + .mockReturnValue(makePromise(resps.deleteSharingMockResp)); isSharing = jest .fn() - .mockReturnValueOnce(makePromise(resps.isSharingMockResp)); + .mockReturnValue(makePromise(resps.isSharingMockResp)); listSharings = jest .fn() - .mockReturnValueOnce(makePromise(resps.listSharingsMockResp)); + .mockReturnValue(makePromise(resps.listSharingsMockResp)); listSharingIDs = jest .fn() - .mockReturnValueOnce(makePromise(resps.listSharingIDsMockResp)); + .mockReturnValue(makePromise(resps.listSharingIDsMockResp)); getSharingDir = jest .fn() - .mockReturnValueOnce(makePromise(resps.getSharingDirMockResp)); + .mockReturnValue(makePromise(resps.getSharingDirMockResp)); generateHash = jest .fn() - .mockReturnValueOnce(makePromise(resps.generateHashMockResp)); - download = jest.fn().mockReturnValueOnce(makePromise(resps.downloadMockResp)); + .mockReturnValue(makePromise(resps.generateHashMockResp)); + download = jest.fn().mockReturnValue(makePromise(resps.downloadMockResp)); } export const NewMockFilesClient = (url: string): IFilesClient => { diff --git a/src/client/web/src/client/settings_mock.ts b/src/client/web/src/client/settings_mock.ts index 60f404d..01f7799 100644 --- a/src/client/web/src/client/settings_mock.ts +++ b/src/client/web/src/client/settings_mock.ts @@ -75,16 +75,16 @@ export class JestSettingsClient { this.url = url; } - health = jest.fn().mockReturnValueOnce(makePromise(resps.healthMockResp)); + health = jest.fn().mockReturnValue(makePromise(resps.healthMockResp)); getClientCfg = jest .fn() - .mockReturnValueOnce(makePromise(resps.getClientCfgMockResp)); + .mockReturnValue(makePromise(resps.getClientCfgMockResp)); setClientCfg = jest .fn() - .mockReturnValueOnce(makePromise(resps.setClientCfgMockResp)); + .mockReturnValue(makePromise(resps.setClientCfgMockResp)); reportErrors = jest .fn() - .mockReturnValueOnce(makePromise(resps.reportErrorsMockResp)); + .mockReturnValue(makePromise(resps.reportErrorsMockResp)); } export const NewMockSettingsClient = (url: string): ISettingsClient => { diff --git a/src/client/web/src/components/panel_sharings.tsx b/src/client/web/src/components/panel_sharings.tsx index 35d087a..f8c43ce 100644 --- a/src/client/web/src/components/panel_sharings.tsx +++ b/src/client/web/src/components/panel_sharings.tsx @@ -14,6 +14,7 @@ import { LoginProps } from "./pane_login"; import { Flexbox } from "./layout/flexbox"; import { Container } from "./layout/container"; import { Rows, Row } from "./layout/rows"; +import { shareIDQuery } from "../client/files"; export interface SharingsProps { sharings: Map; @@ -63,7 +64,7 @@ export class SharingsPanel extends React.Component { const shareID = sharings.get(dirPath); const sharingURL = `${ document.location.href.split("?")[0] - }?sh=${shareID}`; + }?${shareIDQuery}=${shareID}`; const row1 = (
diff --git a/src/client/web/src/components/state_updater.ts b/src/client/web/src/components/state_updater.ts index 5503933..eddc0f7 100644 --- a/src/client/web/src/components/state_updater.ts +++ b/src/client/web/src/components/state_updater.ts @@ -14,12 +14,13 @@ import { Quota, Response, roleVisitor, + roleUser, roleAdmin, visitorID, ClientConfig, Preferences, } from "../client"; -import { FilesClient } from "../client/files"; +import { FilesClient, shareIDQuery, shareDirQuery } from "../client/files"; import { UsersClient } from "../client/users"; import { SettingsClient } from "../client/settings"; import { UploadEntry, UploadState } from "../worker/interface"; @@ -406,11 +407,75 @@ export class Updater { this.props.ui.control.options = newOptions.merge(leftOpts); }; - initStateForVisitor = async (): Promise => { - const statuses = await Promise.all([this.getClientCfg()]); + initClientCfg = async (): Promise => { + const status = await this.getClientCfg(); + if (status !== "") { + return status; + } + + return await this.syncLan(); + }; + + initCwd = async (shareDir: string): Promise => { + if (shareDir !== "") { + // in sharing mode + const dirPath = List(shareDir.split("/")); + this.props.ui.control.controls = this.props.ui.control.controls.set( + sharingCtrl, + ctrlOn + ); + this.props.filesInfo.dirPath = dirPath; + } else { + this.props.ui.control.controls = this.props.ui.control.controls.set( + sharingCtrl, + ctrlOff + ); + this.props.filesInfo.dirPath = List([]); + } + + return ""; + }; + + initFiles = async (shareDir: string): Promise => { + let status = await this.initCwd(shareDir); + if (status !== "") { + return status; + } + + status = await this.syncCwd(); + if (status !== "") { + return status; + } + + return await this.syncIsSharing(this.props.filesInfo.dirPath.join("/")); + }; + + initUploadings = async (): Promise => { + const status = await this.refreshUploadings(); + if (status !== "") { + return status; + } + this.initUploads(); + return ""; + }; + + initSharings = async (): Promise => { + return await this.listSharings(); + }; + + initAdmin = async (): Promise => { + const statuses = await Promise.all([this.listRoles(), this.listUsers()]); if (statuses.join("") !== "") { return statuses.join(";"); } + return ""; + }; + + initStateForVisitor = async (): Promise => { + const status = await this.getClientCfg(); + if (status !== "") { + return status; + } const syncLanStatus = await this.syncLan(); if (syncLanStatus !== "") { @@ -458,59 +523,40 @@ export class Updater { return ""; }; - getParamMap = async ( + initParams = async ( params: URLSearchParams ): Promise> => { let paramMap = Map(); - paramMap = paramMap.set("sh", ""); - paramMap = paramMap.set("dir", ""); + const paramKeys = [shareIDQuery, shareDirQuery]; + paramKeys.forEach((key) => { + const val = params.get(key); + paramMap = paramMap.set(key, val != null ? val : ""); + }); - let shareID = params.get("sh"); - if (shareID != null && shareID !== "") { - paramMap = paramMap.set("sh", shareID); + const shareID = paramMap.get(shareIDQuery); + if (shareID !== "") { const resp = await this.filesClient.getSharingDir(shareID); if (resp.status === 200) { - paramMap = paramMap.set("dir", resp.data.sharingDir); + paramMap = paramMap.set(shareDirQuery, resp.data.sharingDir); + } else { + ErrorLogger().error( + `initParams: unexpected response ${resp.status} ${resp.data}` + ); } - } else { - paramMap = paramMap.set("dir", params.get("dir")); } return paramMap; }; - initCwd = async (params: URLSearchParams): Promise => { - const paramMap = await this.getParamMap(params); - const dir = paramMap.get("dir", ""); - - if (dir != null && dir !== "") { - // in sharing mode - const dirPath = List(dir.split("/")); - this.props.ui.control.controls = this.props.ui.control.controls.set( - sharingCtrl, - ctrlOn - ); - this.props.filesInfo.dirPath = dirPath; - } else { - this.props.ui.control.controls = this.props.ui.control.controls.set( - sharingCtrl, - ctrlOff - ); - this.props.filesInfo.dirPath = List([]); - } - - return ""; - }; - - initAll = async (params: URLSearchParams): Promise => { + initAuth = async (): Promise => { const isAuthedStatus = await this.syncIsAuthed(); if (isAuthedStatus !== "") { return isAuthedStatus; } - const selfStatuses = await Promise.all([this.self(), this.initCwd(params)]); - if (selfStatuses.join("") !== "") { - return selfStatuses.join(";"); + const selfStatuses = await this.self(); + if (selfStatuses !== "") { + return selfStatuses; } const getCapStatus = await this.getCaptchaID(); @@ -518,35 +564,58 @@ export class Updater { return getCapStatus; } + return ""; + }; + + initAll = async (params: URLSearchParams): Promise => { + const paramMap = await this.initParams(params); + const authStatus = await this.initAuth(); + if (authStatus !== "") { + return authStatus; + } + + const initClientCfgStatus = await this.initClientCfg(); + if (initClientCfgStatus !== "") { + return initClientCfgStatus; + } + this.initUITree(); const isInSharingMode = this.props.ui.control.controls.get(sharingCtrl); if ( - this.props.login.userRole === roleVisitor && - isInSharingMode !== ctrlOn + (this.props.login.userRole === roleVisitor && + isInSharingMode !== ctrlOn) || + this.props.login.userRole === roleUser || + this.props.login.userRole === roleAdmin ) { - return this.initStateForVisitor(); + const shareDir = paramMap.get(shareDirQuery); + const initFilesStatus = await this.initFiles(shareDir); + if (initFilesStatus !== "") { + return initFilesStatus; + } } - const cwdStatus = await this.syncCwd(); - if (cwdStatus !== "") { - return cwdStatus; - } - - const isSharingStatus = await this.syncIsSharing( - this.props.filesInfo.dirPath.join("/") - ); - if (isSharingStatus !== "") { - return isSharingStatus; + if ( + this.props.login.userRole === roleUser || + this.props.login.userRole === roleAdmin + ) { + const statuses = await Promise.all([ + this.initUploadings(), + this.initSharings(), + ]); + if (statuses.join("") !== "") { + return statuses.join(";"); + } } if (this.props.login.userRole === roleAdmin) { - return this.initStateForAdmin(); - } else if (this.props.login.userRole === roleVisitor) { - // visitor under sharing mode - return this.initStateForVisitor(); + const status = await this.initAdmin(); + if (status !== "") { + return status; + } } - return this.initStateForAuthedUser(); + + return ""; }; resetUser = () => { diff --git a/src/handlers/fileshdr/handlers.go b/src/handlers/fileshdr/handlers.go index f3c9c05..73fadac 100644 --- a/src/handlers/fileshdr/handlers.go +++ b/src/handlers/fileshdr/handlers.go @@ -28,7 +28,7 @@ var ( // queries FilePathQuery = "fp" ListDirQuery = "dp" - ShareIDQuery = "sh" + ShareIDQuery = "shid" // headers rangeHeader = "Range"