import Mixins from '../utils/mixins';
import Utils from '../utils/utils';
/* phenome-dts-imports
import { Sheet as SheetNamespace } from 'framework7/components/sheet/sheet';
*/
/* phenome-dts-instance
f7Sheet: SheetNamespace.Sheet
*/
export default {
name: 'f7-sheet',
props: {
id: [String, Number],
className: String, // phenome-react-line
style: Object, // phenome-react-line
opened: Boolean,
backdrop: Boolean,
closeByBackdropClick: Boolean,
closeByOutsideClick: Boolean,
...Mixins.colorProps,
},
render() {
const self = this;
const fixedList = [];
const staticList = [];
const props = self.props;
const {
id,
style,
className,
} = props;
let fixedTags;
// phenome-vue-next-line
fixedTags = ('navbar toolbar tabbar subnavbar searchbar messagebar fab list-index').split(' ');
// phenome-react-next-line
fixedTags = ('navbar toolbar tabbar subnavbar searchbar messagebar fab list-index').split(' ').map(tagName => `f7-${tagName}`);
const slotsDefault = self.slots.default;
if (slotsDefault && slotsDefault.length) {
slotsDefault.forEach((child) => {
if (typeof child === 'undefined') return;
let isFixedTag = false;
if (process.env.COMPILER === 'react') {
const tag = child.type && (child.type.displayName || child.type.name);
if (!tag) {
return;
}
if (fixedTags.indexOf(tag) >= 0) {
isFixedTag = true;
}
}
if (process.env.COMPILER === 'vue') {
const tag = child.tag;
if (!tag) {
return;
}
for (let j = 0; j < fixedTags.length; j += 1) {
if (tag.indexOf(fixedTags[j]) >= 0) {
isFixedTag = true;
}
}
}
if (isFixedTag) fixedList.push(child);
else staticList.push(child);
});
}
const innerEl = (
{staticList}
);
const classes = Utils.classNames(
className,
'sheet-modal',
Mixins.colorClasses(props),
);
return (
{fixedList}
{innerEl}
);
},
watch: {
'props.opened': function watchOpened(opened) {
const self = this;
if (!self.f7Sheet) return;
if (opened) {
self.f7Sheet.open();
} else {
self.f7Sheet.close();
}
},
},
componentDidMount() {
const self = this;
const el = self.refs.el;
if (!el) return;
self.onOpenBound = self.onOpen.bind(self);
self.onOpenedBound = self.onOpened.bind(self);
self.onCloseBound = self.onClose.bind(self);
self.onClosedBound = self.onClosed.bind(self);
el.addEventListener('sheet:open', self.onOpenBound);
el.addEventListener('sheet:opened', self.onOpenedBound);
el.addEventListener('sheet:close', self.onCloseBound);
el.addEventListener('sheet:closed', self.onClosedBound);
const props = self.props;
const {
opened,
backdrop,
closeByBackdropClick,
closeByOutsideClick,
} = props;
const sheetParams = {
el: self.refs.el,
};
let useDefaultBackdrop;
if (process.env.COMPILER === 'vue') {
useDefaultBackdrop = self.$options.propsData.backdrop === undefined;
if (typeof self.$options.propsData.closeByBackdropClick !== 'undefined') sheetParams.closeByBackdropClick = closeByBackdropClick;
if (typeof self.$options.propsData.closeByOutsideClick !== 'undefined') sheetParams.closeByOutsideClick = closeByOutsideClick;
}
if (process.env.COMPILER === 'react') {
useDefaultBackdrop = typeof backdrop === 'undefined';
if ('closeByBackdropClick' in props) sheetParams.closeByBackdropClick = closeByBackdropClick;
if ('closeByOutsideClick' in props) sheetParams.closeByOutsideClick = closeByOutsideClick;
}
self.$f7ready((f7) => {
if (useDefaultBackdrop) {
sheetParams.backdrop = f7.params.sheet && f7.params.sheet.backdrop !== undefined
? f7.params.sheet.backdrop
: self.$theme.md;
} else {
sheetParams.backdrop = backdrop;
}
self.f7Sheet = self.$f7.sheet.create(sheetParams);
if (opened) {
self.f7Sheet.open(false);
}
});
},
componentWillUnmount() {
const self = this;
if (self.f7Sheet) self.f7Sheet.destroy();
const el = self.refs.el;
if (!el) return;
el.removeEventListener('popup:open', self.onOpenBound);
el.removeEventListener('popup:opened', self.onOpenedBound);
el.removeEventListener('popup:close', self.onCloseBound);
el.removeEventListener('popup:closed', self.onClosedBound);
},
methods: {
onOpen(event) {
this.dispatchEvent('sheet:open sheetOpen', event);
},
onOpened(event) {
this.dispatchEvent('sheet:opened sheetOpened', event);
},
onClose(event) {
this.dispatchEvent('sheet:close sheetClose', event);
},
onClosed(event) {
this.dispatchEvent('sheet:closed sheetClosed', event);
},
open(animate) {
const self = this;
if (!self.$f7) return undefined;
return self.$f7.sheet.open(self.refs.el, animate);
},
close(animate) {
const self = this;
if (!self.$f7) return undefined;
return self.$f7.sheet.close(self.refs.el, animate);
},
},
};