var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
};
|
import { SuperComponent, wxComponent } from '../common/src/index';
|
import config from '../common/config';
|
import { MessageType } from './message.interface';
|
import props from './props';
|
import { unitConvert } from '../common/utils';
|
const SHOW_DURATION = 400;
|
const { prefix } = config;
|
const name = `${prefix}-message`;
|
let Message = class Message extends SuperComponent {
|
constructor() {
|
super(...arguments);
|
this.options = {
|
multipleSlots: true,
|
};
|
this.properties = Object.assign({}, props);
|
this.data = {
|
prefix,
|
classPrefix: name,
|
messageList: [],
|
};
|
this.index = 0;
|
this.instances = [];
|
this.gap = 12;
|
this.observers = {};
|
this.pageLifetimes = {
|
show() {
|
this.hideAll();
|
},
|
};
|
this.lifetimes = {
|
ready() {
|
this.memoInitialData();
|
},
|
};
|
}
|
memoInitialData() {
|
this.initialData = Object.assign(Object.assign({}, this.properties), this.data);
|
}
|
setMessage(msg, theme = MessageType.info) {
|
let id = `${name}_${this.index}`;
|
if (msg.single) {
|
id = name;
|
}
|
this.gap = unitConvert(msg.gap || this.gap);
|
const msgObj = Object.assign(Object.assign({}, msg), { theme,
|
id, gap: this.gap });
|
const instanceIndex = this.instances.findIndex((x) => x.id === id);
|
if (instanceIndex < 0) {
|
this.addMessage(msgObj);
|
}
|
else {
|
const instance = this.instances[instanceIndex];
|
const offsetHeight = this.getOffsetHeight(instanceIndex);
|
instance.resetData(() => {
|
instance.setData(msgObj, instance.show.bind(instance, offsetHeight));
|
instance.onHide = () => {
|
this.close(id);
|
};
|
});
|
}
|
}
|
addMessage(msgObj) {
|
const list = [...this.data.messageList, { id: msgObj.id }];
|
this.setData({
|
messageList: list,
|
}, () => {
|
const offsetHeight = this.getOffsetHeight();
|
const instance = this.showMessageItem(msgObj, msgObj.id, offsetHeight);
|
if (this.instances) {
|
this.instances.push(instance);
|
this.index += 1;
|
}
|
});
|
}
|
getOffsetHeight(index = -1) {
|
let offsetHeight = 0;
|
let len = index;
|
if (len === -1 || len > this.instances.length) {
|
len = this.instances.length;
|
}
|
for (let i = 0; i < len; i += 1) {
|
const instance = this.instances[i];
|
offsetHeight += instance.data.height + instance.data.gap;
|
}
|
return offsetHeight;
|
}
|
showMessageItem(options, id, offsetHeight) {
|
const instance = this.selectComponent(`#${id}`);
|
if (instance) {
|
instance.resetData(() => {
|
instance.setData(options, instance.show.bind(instance, offsetHeight));
|
instance.onHide = () => {
|
this.close(id);
|
};
|
});
|
return instance;
|
}
|
console.error('未找到组件,请确认 selector && context 是否正确');
|
}
|
close(id) {
|
setTimeout(() => {
|
this.removeMsg(id);
|
}, SHOW_DURATION);
|
this.removeInstance(id);
|
}
|
hide(id) {
|
if (!id) {
|
this.hideAll();
|
}
|
const instance = this.instances.find((x) => x.id === id);
|
if (instance) {
|
instance.hide();
|
}
|
}
|
hideAll() {
|
for (let i = 0; i < this.instances.length;) {
|
const instance = this.instances[i];
|
instance.hide();
|
}
|
}
|
removeInstance(id) {
|
const index = this.instances.findIndex((x) => x.id === id);
|
if (index < 0)
|
return;
|
const instance = this.instances[index];
|
const removedHeight = instance.data.height;
|
this.instances.splice(index, 1);
|
for (let i = index; i < this.instances.length; i += 1) {
|
const instance = this.instances[i];
|
instance.setData({
|
wrapTop: instance.data.wrapTop - removedHeight - instance.data.gap,
|
});
|
}
|
}
|
removeMsg(id) {
|
const msgIndex = this.data.messageList.findIndex((x) => x.id === id);
|
if (msgIndex > -1) {
|
this.data.messageList.splice(msgIndex, 1);
|
this.setData({
|
messageList: this.data.messageList,
|
});
|
}
|
}
|
handleClose() {
|
this.triggerEvent('close-btn-click');
|
}
|
handleLinkClick() {
|
this.triggerEvent('link-click');
|
}
|
};
|
Message = __decorate([
|
wxComponent()
|
], Message);
|
export default Message;
|