Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: update default bots folder #1548

Merged
merged 13 commits into from
Nov 19, 2019
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,18 @@ import path from 'path';
import { jsx } from '@emotion/core';
import { Fragment, useEffect, useState, useContext, useRef } from 'react';

import storage from '../../utils/storage';

import { FileSelector } from './FileSelector';
import { StoreContext } from './../../store';
import { FileTypes } from './../../constants';

const NEW_BOT_LOCATION_KEY = 'newBotLocation';

export function LocationSelectContent(props) {
const { state, actions } = useContext(StoreContext);
const { storages, focusedStorageFolder, storageFileLoadingStatus } = state;
const { onOpen, onChange, allowOpeningBot = true } = props;

const { fetchFolderItemsByPath } = actions;
const currentStorageIndex = useRef(0);
const [currentPath, setCurrentPath] = useState(storage.get(NEW_BOT_LOCATION_KEY, ''));
const [currentPath, setCurrentPath] = useState('');
const currentStorageId = storages[currentStorageIndex.current] ? storages[currentStorageIndex.current].id : 'default';

useEffect(() => {
Expand All @@ -39,6 +35,7 @@ export function LocationSelectContent(props) {
// const formatedPath = path.normalize(newPath.replace(/\\/g, '/'));
const formatedPath = path.normalize(newPath);
await fetchFolderItemsByPath(storageId, formatedPath);
await actions.updateCurrentPath(formatedPath);
setCurrentPath(formatedPath);
}
};
Expand All @@ -48,7 +45,7 @@ export function LocationSelectContent(props) {
let path = currentPath;
let id = '';
if (storages[index]) {
path = path || storages[index].path;
path = storages[index].path;
id = storages[index].id;
}
updateCurrentPath(path, id);
Expand All @@ -58,7 +55,6 @@ export function LocationSelectContent(props) {
if (onChange) {
onChange(currentPath);
}
storage.set(NEW_BOT_LOCATION_KEY, currentPath);
}, [currentPath]);

const onSelectionChanged = item => {
Expand Down
4 changes: 4 additions & 0 deletions Composer/packages/client/src/store/action/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,3 +93,7 @@ export const fetchFolderItemsByPath: ActionCreator = async ({ dispatch }, id, pa
});
}
};

export const updateCurrentPath: ActionCreator = async ({ dispatch }, path) => {
await httpClient.put(`/storages/currentPath`, { path: path });
};
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ jest.mock('../../src/store/store', () => {
name: 'This PC',
type: 'LocalDisk',
path: '.',
defaultPath: '.',
},
],
recentBotProjects: [] as any[],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ jest.mock('../../src/store/store', () => {
name: 'This PC',
type: 'LocalDisk',
path: '.',
defaultPath: '.',
},
];
return {
Expand Down
6 changes: 6 additions & 0 deletions Composer/packages/server/src/controllers/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ function createStorageConnection(req: Request, res: Response) {
res.status(200).json(StorageService.getStorageConnections());
}

function updateCurrentPath(req: Request, res: Response) {
StorageService.updateCurrentPath(req.body.path);
res.status(200).json('success');
}

async function getBlob(req: Request, res: Response) {
const storageId = req.params.storageId;
const reqpath = decodeURI(req.params.path);
Expand All @@ -34,4 +39,5 @@ export const StorageController = {
getStorageConnections,
createStorageConnection,
getBlob,
updateCurrentPath,
};
1 change: 1 addition & 0 deletions Composer/packages/server/src/router/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ router.post('/projects/opened/project/saveAs', ProjectController.saveProjectAs);
router.get('/projects/recent', ProjectController.getRecentProjects);

// storages
router.put('/storages/currentPath', StorageController.updateCurrentPath);
router.get('/storages', StorageController.getStorageConnections);
router.post('/storages', StorageController.createStorageConnection);
router.get('/storages/:storageId/blobs/:path(*)', StorageController.getBlob);
Expand Down
30 changes: 28 additions & 2 deletions Composer/packages/server/src/services/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class StorageService {

constructor() {
this.storageConnections = Store.get(this.STORE_KEY);
this.ensureDefaultBotFoldersExist();
}

public getStorageClient = (storageId: string): IFileStorage => {
Expand All @@ -39,11 +40,18 @@ class StorageService {
};

public getStorageConnections = (): StorageConnection[] => {
return this.storageConnections.map(s => {
const connections = this.storageConnections.map(s => {
const temp = Object.assign({}, s);
temp.path = Path.resolve(s.path); // resolve path if path is relative, and change it to unix pattern
// if the last accessed path exist
if (fs.existsSync(s.path)) {
temp.path = Path.resolve(s.path); // resolve path if path is relative, and change it to unix pattern
} else {
temp.path = Path.resolve(s.defaultPath);
}
return temp;
});
this.ensureDefaultBotFoldersExist();
return connections;
};

public checkBlob = async (storageId: string, filePath: string): Promise<boolean> => {
Expand Down Expand Up @@ -85,6 +93,17 @@ class StorageService {
}
};

public updateCurrentPath = (path: string) => {
this.storageConnections[0].path = path;
Store.set(this.STORE_KEY, this.storageConnections);
};

private ensureDefaultBotFoldersExist = () => {
this.storageConnections.forEach(s => {
this.createFolderRecurively(s.defaultPath);
});
};

private isBotFolder = (path: string) => {
// locate Main.dialog
const mainPath = Path.join(path, 'ComposerDialogs/Main', 'Main.dialog');
Expand Down Expand Up @@ -119,6 +138,13 @@ class StorageService {
const result = await Promise.all(children);
return result.filter(item => !!item);
};

private createFolderRecurively = (path: string) => {
if (!fs.existsSync(path)) {
this.createFolderRecurively(Path.dirname(path));
fs.mkdirSync(path);
}
};
}

const service = new StorageService();
Expand Down
4 changes: 3 additions & 1 deletion Composer/packages/server/src/store/data.template.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@
// Licensed under the MIT License.

import path from 'path';
import os from 'os';

export default {
storageConnections: [
{
id: 'default',
name: 'This PC',
type: 'LocalDisk',
path: path.resolve(__dirname, '../../../../../MyBots'),
path: '', // this is used as last accessed path, if it is invalid, use defaultPath
defaultPath: path.join(os.homedir(), 'Documents', 'Composer'),
},
],
recentBotProjects: [],
Expand Down