1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _babelHelperVueJsxMergeProps = require('babel-helper-vue-jsx-merge-props');
var _babelHelperVueJsxMergeProps2 = _interopRequireDefault(_babelHelperVueJsxMergeProps);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
exports['default'] = connect;
var _shallowequal = require('shallowequal');
var _shallowequal2 = _interopRequireDefault(_shallowequal);
var _omit = require('omit.js');
var _omit2 = _interopRequireDefault(_omit);
var _propsUtil = require('../props-util');
var _vueTypes = require('../vue-types');
var _vueTypes2 = _interopRequireDefault(_vueTypes);
var _proxyComponent = require('../proxyComponent');
var _proxyComponent2 = _interopRequireDefault(_proxyComponent);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function getDisplayName(WrappedComponent) {
return WrappedComponent.name || 'Component';
}
var defaultMapStateToProps = function defaultMapStateToProps() {
return {};
};
function connect(mapStateToProps) {
var shouldSubscribe = !!mapStateToProps;
var finnalMapStateToProps = mapStateToProps || defaultMapStateToProps;
return function wrapWithConnect(WrappedComponent) {
var tempProps = (0, _omit2['default'])(WrappedComponent.props || {}, ['store']);
var props = {
__propsSymbol__: _vueTypes2['default'].any
};
Object.keys(tempProps).forEach(function (k) {
props[k] = (0, _extends3['default'])({}, k, { required: false });
});
var Connect = {
name: 'Connect_' + getDisplayName(WrappedComponent),
props: props,
inject: {
storeContext: { 'default': function _default() {
return {};
} }
},
data: function data() {
this.store = this.storeContext.store;
this.preProps = (0, _omit2['default'])((0, _propsUtil.getOptionProps)(this), ['__propsSymbol__']);
return {
subscribed: finnalMapStateToProps(this.store.getState(), this.$props)
};
},
watch: {
__propsSymbol__: function __propsSymbol__() {
if (mapStateToProps && mapStateToProps.length === 2) {
this.subscribed = finnalMapStateToProps(this.store.getState(), this.$props);
}
}
},
mounted: function mounted() {
this.trySubscribe();
},
beforeDestroy: function beforeDestroy() {
this.tryUnsubscribe();
},
methods: {
handleChange: function handleChange() {
if (!this.unsubscribe) {
return;
}
var props = (0, _omit2['default'])((0, _propsUtil.getOptionProps)(this), ['__propsSymbol__']);
var nextSubscribed = finnalMapStateToProps(this.store.getState(), props);
if (!(0, _shallowequal2['default'])(this.preProps, props) || !(0, _shallowequal2['default'])(this.subscribed, nextSubscribed)) {
this.subscribed = nextSubscribed;
}
},
trySubscribe: function trySubscribe() {
if (shouldSubscribe) {
this.unsubscribe = this.store.subscribe(this.handleChange);
this.handleChange();
}
},
tryUnsubscribe: function tryUnsubscribe() {
if (this.unsubscribe) {
this.unsubscribe();
this.unsubscribe = null;
}
},
getWrappedInstance: function getWrappedInstance() {
return this.$refs.wrappedInstance;
}
},
render: function render() {
var h = arguments[0];
this.preProps = (0, _extends3['default'])({}, this.$props);
var $listeners = this.$listeners,
_$slots = this.$slots,
$slots = _$slots === undefined ? {} : _$slots,
$attrs = this.$attrs,
$scopedSlots = this.$scopedSlots,
subscribed = this.subscribed,
store = this.store;
var props = (0, _propsUtil.getOptionProps)(this);
this.preProps = (0, _extends3['default'])({}, (0, _omit2['default'])(props, ['__propsSymbol__']));
var wrapProps = {
props: (0, _extends3['default'])({}, props, subscribed, {
store: store
}),
on: $listeners,
attrs: $attrs,
scopedSlots: $scopedSlots
};
return h(
WrappedComponent,
(0, _babelHelperVueJsxMergeProps2['default'])([wrapProps, { ref: 'wrappedInstance' }]),
[Object.keys($slots).map(function (name) {
return h(
'template',
{ slot: name },
[$slots[name]]
);
})]
);
}
};
return (0, _proxyComponent2['default'])(Connect);
};
}