100 lines
2.6 KiB
TypeScript

import { actions, ContentRef, selectors } from "@nteract/core";
import React from "react";
import { connect } from "react-redux";
import { Dispatch } from "redux";
import { Action, ActionModifiers } from "../../../Shared/Telemetry/TelemetryConstants";
import * as cdbActions from "../NotebookComponent/actions";
import { CdbAppState } from "../NotebookComponent/types";
export interface PassedPromptProps {
id: string;
contentRef: ContentRef;
status?: string;
executionCount?: number;
isHovered?: boolean;
runCell?: () => void;
stopCell?: () => void;
}
interface ComponentProps {
id: string;
contentRef: ContentRef;
isHovered?: boolean;
children: (props: PassedPromptProps) => React.ReactNode;
}
interface StateProps {
status?: string;
executionCount?: number;
}
interface DispatchProps {
executeCell: () => void;
stopExecution: () => void;
}
type Props = StateProps & DispatchProps & ComponentProps;
export class PromptPure extends React.Component<Props> {
render() {
return (
<div className="nteract-cell-prompt">
{this.props.children({
id: this.props.id,
contentRef: this.props.contentRef,
status: this.props.status,
executionCount: this.props.executionCount,
runCell: this.props.executeCell,
stopCell: this.props.stopExecution,
isHovered: this.props.isHovered
})}
</div>
);
}
}
const makeMapStateToProps = (state: CdbAppState, ownProps: ComponentProps): ((state: CdbAppState) => StateProps) => {
const mapStateToProps = (state: CdbAppState) => {
const { contentRef, id } = ownProps;
const model = selectors.model(state, { contentRef });
let status;
let executionCount;
if (model && model.type === "notebook") {
status = model.transient.getIn(["cellMap", id, "status"]);
const cell = selectors.notebook.cellById(model, { id });
if (cell) {
executionCount = cell.get("execution_count", undefined);
}
}
const isHovered = state.cdb.hoveredCellId === id;
return {
status,
executionCount,
isHovered
};
};
return mapStateToProps;
};
const mapDispatchToProps = (
dispatch: Dispatch,
{ id, contentRef }: { id: string; contentRef: ContentRef }
): DispatchProps => ({
executeCell: () => {
dispatch(actions.executeCell({ id, contentRef }));
dispatch(
cdbActions.traceNotebookTelemetry({
action: Action.ExecuteCellPromptBtn,
actionModifier: ActionModifiers.Mark
})
);
},
stopExecution: () => dispatch(actions.interruptKernel({}))
});
export default connect(makeMapStateToProps, mapDispatchToProps)(PromptPure);