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.
82 lines
1.6 KiB
TypeScript
82 lines
1.6 KiB
TypeScript
import React from 'react';
|
|
import classNames from 'classnames';
|
|
|
|
import { SessionIconType } from './icon/';
|
|
import {
|
|
SessionDropdownItem,
|
|
SessionDropDownItemType,
|
|
} from './SessionDropdownItem';
|
|
|
|
// THIS IS A FUTURE-PROOFING ELEMENT TO REPLACE ELECTRON CONTEXTMENUS IN PRELOAD.JS
|
|
|
|
interface State {
|
|
x: number;
|
|
y: number;
|
|
isVisible: boolean;
|
|
}
|
|
|
|
interface Props {
|
|
id?: string;
|
|
onClick?: any;
|
|
relativeTo: string | Array<number>;
|
|
items: Array<{
|
|
content: string;
|
|
id?: string;
|
|
icon?: SessionIconType | null;
|
|
type?: SessionDropDownItemType;
|
|
active?: boolean;
|
|
onClick?: any;
|
|
display?: boolean;
|
|
}>;
|
|
}
|
|
|
|
export class SessionDropdown extends React.Component<Props, State> {
|
|
constructor(props: any) {
|
|
super(props);
|
|
|
|
this.state = {
|
|
x: 0,
|
|
y: 0,
|
|
isVisible: false,
|
|
};
|
|
}
|
|
|
|
public show() {
|
|
this.setState({
|
|
isVisible: true,
|
|
});
|
|
}
|
|
|
|
public hide() {
|
|
this.setState({
|
|
isVisible: false,
|
|
});
|
|
}
|
|
|
|
public render() {
|
|
const { items } = this.props;
|
|
const { isVisible } = this.state;
|
|
|
|
return (
|
|
<div className={classNames('session-dropdown')}>
|
|
<ul>
|
|
{isVisible
|
|
? items.map((item: any) => {
|
|
return item.display ? (
|
|
<SessionDropdownItem
|
|
id={item.id}
|
|
content={item.content}
|
|
icon={item.icon}
|
|
type={item.type}
|
|
active={item.active}
|
|
onClick={item.onClick}
|
|
/>
|
|
) : null;
|
|
})
|
|
: null}
|
|
</ul>
|
|
</div>
|
|
);
|
|
}
|
|
}
|