aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/src/models/Tab.js
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files/src/models/Tab.js')
-rw-r--r--apps/files/src/models/Tab.js128
1 files changed, 128 insertions, 0 deletions
diff --git a/apps/files/src/models/Tab.js b/apps/files/src/models/Tab.js
new file mode 100644
index 00000000000..b67d51f277f
--- /dev/null
+++ b/apps/files/src/models/Tab.js
@@ -0,0 +1,128 @@
+/**
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import DOMPurify from 'dompurify'
+
+export default class Tab {
+
+ _id
+ _name
+ _icon
+ _iconSvgSanitized
+ _mount
+ _setIsActive
+ _update
+ _destroy
+ _enabled
+ _scrollBottomReached
+
+ /**
+ * Create a new tab instance
+ *
+ * @param {object} options destructuring object
+ * @param {string} options.id the unique id of this tab
+ * @param {string} options.name the translated tab name
+ * @param {?string} options.icon the icon css class
+ * @param {?string} options.iconSvg the icon in svg format
+ * @param {Function} options.mount function to mount the tab
+ * @param {Function} [options.setIsActive] function to forward the active state of the tab
+ * @param {Function} options.update function to update the tab
+ * @param {Function} options.destroy function to destroy the tab
+ * @param {Function} [options.enabled] define conditions whether this tab is active. Must returns a boolean
+ * @param {Function} [options.scrollBottomReached] executed when the tab is scrolled to the bottom
+ */
+ constructor({ id, name, icon, iconSvg, mount, setIsActive, update, destroy, enabled, scrollBottomReached } = {}) {
+ if (enabled === undefined) {
+ enabled = () => true
+ }
+ if (scrollBottomReached === undefined) {
+ scrollBottomReached = () => { }
+ }
+
+ // Sanity checks
+ if (typeof id !== 'string' || id.trim() === '') {
+ throw new Error('The id argument is not a valid string')
+ }
+ if (typeof name !== 'string' || name.trim() === '') {
+ throw new Error('The name argument is not a valid string')
+ }
+ if ((typeof icon !== 'string' || icon.trim() === '') && typeof iconSvg !== 'string') {
+ throw new Error('Missing valid string for icon or iconSvg argument')
+ }
+ if (typeof mount !== 'function') {
+ throw new Error('The mount argument should be a function')
+ }
+ if (setIsActive !== undefined && typeof setIsActive !== 'function') {
+ throw new Error('The setIsActive argument should be a function')
+ }
+ if (typeof update !== 'function') {
+ throw new Error('The update argument should be a function')
+ }
+ if (typeof destroy !== 'function') {
+ throw new Error('The destroy argument should be a function')
+ }
+ if (typeof enabled !== 'function') {
+ throw new Error('The enabled argument should be a function')
+ }
+ if (typeof scrollBottomReached !== 'function') {
+ throw new Error('The scrollBottomReached argument should be a function')
+ }
+
+ this._id = id
+ this._name = name
+ this._icon = icon
+ this._mount = mount
+ this._setIsActive = setIsActive
+ this._update = update
+ this._destroy = destroy
+ this._enabled = enabled
+ this._scrollBottomReached = scrollBottomReached
+
+ if (typeof iconSvg === 'string') {
+ this._iconSvgSanitized = DOMPurify.sanitize(iconSvg)
+ }
+
+ }
+
+ get id() {
+ return this._id
+ }
+
+ get name() {
+ return this._name
+ }
+
+ get icon() {
+ return this._icon
+ }
+
+ get iconSvg() {
+ return this._iconSvgSanitized
+ }
+
+ get mount() {
+ return this._mount
+ }
+
+ get setIsActive() {
+ return this._setIsActive || (() => undefined)
+ }
+
+ get update() {
+ return this._update
+ }
+
+ get destroy() {
+ return this._destroy
+ }
+
+ get enabled() {
+ return this._enabled
+ }
+
+ get scrollBottomReached() {
+ return this._scrollBottomReached
+ }
+
+}