import * as React from "react" import { connect } from "react-redux" import { IState } from "./../State" require("./QuickInfo.less") // tslint:disable-line no-var-requires export interface IQuickInfoProps { visible: boolean wrap: boolean x: number y: number elements: JSX.Element[] } export class QuickInfo extends React.Component { public render(): null | JSX.Element { if (!this.props.elements || !this.props.elements.length) { return null } const containerStyle = { position: "absolute", top: this.props.y.toString() + "px", left: this.props.x.toString() + "px", } const innerStyle = { "position": "absolute", "bottom": "0px", "opacity": this.props.visible ? 1 : 0, "whiteSpace": this.props.wrap ? "normal" : "nowrap", "max-width": (document.body.offsetWidth - this.props.x - 40) + "px", } return
{this.props.elements}
} } export interface ITextProps { text: string } export class TextComponent extends React.Component { } export class QuickInfoTitle extends TextComponent { public render(): JSX.Element { return
{this.props.text}
} } export class QuickInfoDocumentation extends TextComponent { public render(): JSX.Element { return
{this.props.text}
} } export class Text extends TextComponent { public render(): JSX.Element { return {this.props.text} } } export class SelectedText extends TextComponent { public render(): JSX.Element { return {this.props.text} } } const mapStateToQuickInfoProps = (state: IState) => { if (!state.quickInfo) { return { wrap: true, visible: false, x: state.cursorPixelX, y: state.cursorPixelY - (state.fontPixelHeight), elements: [], } } else { return { wrap: true, visible: true, x: state.cursorPixelX, y: state.cursorPixelY - (state.fontPixelHeight), elements: [ , , ], } } } const mapStateToSignatureHelpProps = (state: IState) => { if (!state.signatureHelp) { return { wrap: false, visible: false, x: state.cursorPixelX, y: state.cursorPixelY - (state.fontPixelHeight), elements: [], } } else { const currentItem = state.signatureHelp.items[state.signatureHelp.selectedItemIndex] const parameters = currentItem.parameters.map((item, idx) => { // check state.signatureHelp to avoid "Object is possibly 'null'" error // even though we already checked it in the 'if' statement above if (state.signatureHelp && idx === state.signatureHelp.argumentIndex) { return } else { return } }) // insert ", " separator in between each parameter for (let i = currentItem.parameters.length - 1; i > 0; i -= 1) { parameters.splice(i, 0, ) } let elements = [] .concat(parameters) .concat([]) const selectedIndex = Math.min(currentItem.parameters.length, state.signatureHelp.argumentIndex) const selectedArgument = currentItem.parameters[selectedIndex] if (selectedArgument && selectedArgument.documentation) { elements.push() } return { wrap: false, visible: true, x: state.cursorPixelX, y: state.cursorPixelY - (state.fontPixelHeight), elements, } } } export const QuickInfoContainer = connect(mapStateToQuickInfoProps)(QuickInfo) export const SignatureHelpContainer = connect(mapStateToSignatureHelpProps)(QuickInfo)