import {
AppContextConsumerWrapper,
} from '../AppContextConsumerWrapper';
import {
bookmark as doBookmark,
} from '../../state/bookmark';
import classNames from 'classnames';
import {
getNormalizedAcceleratorConfig,
} from '../../configuration/getNormalizedAcceleratorConfig';
import {
getStructuredTags,
} from '../../tags/getStructuredTags';
import {
HistoryFilter,
} from '../../reducers/IHistoryFilter';
import {
IDispatchAware,
} from '../../interfaces/IDispatchAware';
import {
IPassageNamed,
} from '../../interfaces/IPassageNamed';
import {
IPassageRendererDispatchProps,
} from './IPassageRendererDispatchProps';
import {
IPassageRendererWrapperOwnProps,
} from './IPassageRendererWrapperOwnProps';
import {
IPassageRendererWrapperStateProps,
} from './IPassageRendererWrapperStateProps';
import {
IPassagesMap,
} from '../../passages/IPassagesMap';
import {
IState,
} from '../../state/IState';
import {
IStoryStateSetter,
} from '../../interfaces/IStoryStateSetter';
import {
MaybeReadonlyArray,
} from '../../typeAliases/MaybeReadonlyArray';
import {
mutateCurrentStoryStateInstanceWithPluginExecution,
} from '../../state/mutateCurrentStoryStateInstanceWithPluginExecution';
import {
navigate,
} from '../../state/navigate';
import {
connect,
MapDispatchToProps,
MapStateToProps,
} from 'react-redux';
import {
reset,
} from '../../state/reset';
import {
rewind as doRewind,
} from '../../state/rewind';
import {
Tag,
} from '../../tags/Tag';
import {
assert,
} from 'ts-assertions';
import * as React from 'react';
import builtIns from '../../../passages/_global-styles/built-ins.less';
export const strings = {
PASSAGE_NOT_FOUND:
'No passage named %NAME% could be found within the passages map.',
};
const {
rendererName,
...configWithoutRendererName
} = getNormalizedAcceleratorConfig();
export class PassageRendererWrapper extends React.PureComponent<
IPassageRendererWrapperOwnProps &
IPassageRendererWrapperStateProps &
IPassageRendererDispatchProps
> {
public readonly render = () => (
{({
PassageRendererComponent,
...contextWithoutRenderer
}) => (
)}
);
private readonly bookmark = () => doBookmark(this.props.dispatch);
private navigateTo(
passageName: IPassageNamed['passageName'],
tags?: MaybeReadonlyArray,
) {
const {
dispatch,
passagesMap: { [passageName]: passage },
} = this.props;
assert(
passage,
strings.PASSAGE_NOT_FOUND.replace(/%name%/gi, passageName),
);
navigate({
dispatch,
passage,
linkTags: tags || [],
});
};
private readonly restart = () => {
const {
dispatch,
lastLinkTags: unstructured,
passageObject,
plugins,
storyState,
} = this.props;
const lastLinkTags = getStructuredTags(unstructured);
reset({
dispatch,
lastLinkTags,
passageObject,
plugins,
storyState,
});
};
private readonly rewind = (filter?: HistoryFilter) => {
const {
dispatch,
history: {
present,
past,
},
} = this.props;
if (typeof filter === 'function') {
doRewind(dispatch, present, past, filter);
} else {
doRewind(dispatch, present, past);
}
};
private readonly setStoryState: IStoryStateSetter = (
updatedStateProps,
) => mutateCurrentStoryStateInstanceWithPluginExecution({
updatedStateProps,
dispatch: this.props.dispatch,
history: this.props.history,
passageObject: this.props.passageObject,
plugins: this.props.plugins,
});
}
export const mapStateToProps: MapStateToProps<
IPassageRendererWrapperStateProps,
{ passagesMap: IPassagesMap },
IState
> = ({
history,
history: {
present: {
lastLinkTags,
passageName,
storyState,
},
}
}, { passagesMap }) => ({
history,
lastLinkTags,
storyState,
passageObject: passagesMap[passageName],
});
export const mapDispatchToProps: MapDispatchToProps<
IDispatchAware,
{}
> = (dispatch) => ({ dispatch });
export const PassageRendererWrapperConnected = connect(
mapStateToProps,
mapDispatchToProps,
)(PassageRendererWrapper);