You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
2.3 KiB
TypeScript

import React from 'react';
import { connect } from 'react-redux';
import { TreeNodeNormal } from 'antd/lib/tree/Tree';
import FileManagerComponent, { Files } from 'components/file-manager/file-manager';
import { loadShareDataAsync } from 'actions/share-actions';
import {
ShareItem,
CombinedState,
} from 'reducers/interfaces';
interface OwnProps {
ref: any;
withRemote: boolean;
}
interface StateToProps {
treeData: TreeNodeNormal[];
}
interface DispatchToProps {
getTreeData(key: string, success: () => void, failure: () => void): void;
}
function mapStateToProps(state: CombinedState): StateToProps {
function convert(items: ShareItem[], path?: string): TreeNodeNormal[] {
return items.map((item): TreeNodeNormal => {
const isLeaf = item.type !== 'DIR';
const key = `${path}${item.name}${isLeaf ? '' : '/'}`;
return {
key,
isLeaf,
title: item.name || 'root',
children: convert(item.children, key),
};
});
}
const { root } = state.share;
return {
treeData: convert([root], ''),
};
}
function mapDispatchToProps(dispatch: any): DispatchToProps {
return {
getTreeData: (key: string, success: () => void, failure: () => void): void => {
dispatch(loadShareDataAsync(key, success, failure));
},
};
}
type Props = StateToProps & DispatchToProps & OwnProps;
export class FileManagerContainer extends React.PureComponent<Props> {
private managerComponentRef: any;
public getFiles(): Files {
return this.managerComponentRef.getFiles();
}
public reset(): Files {
return this.managerComponentRef.reset();
}
public render(): JSX.Element {
const {
treeData,
getTreeData,
withRemote,
} = this.props;
return (
<FileManagerComponent
treeData={treeData}
onLoadData={getTreeData}
withRemote={withRemote}
ref={(component): void => {
this.managerComponentRef = component;
}}
/>
);
}
}
export default connect(
mapStateToProps,
mapDispatchToProps,
null,
{ forwardRef: true },
)(FileManagerContainer);