diff --git a/package-lock.json b/package-lock.json index 07dba84b..a96a7061 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "frankerfacez", - "version": "4.20.14", + "version": "4.20.15", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1847,6 +1847,28 @@ "supports-color": "^5.3.0" } }, + "chartjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/chartjs/-/chartjs-0.3.24.tgz", + "integrity": "sha1-Ot3rWuNgaz6J40bCfVLKFYQW6T0=" + }, + "chartjs-plugin-waterfall": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chartjs-plugin-waterfall/-/chartjs-plugin-waterfall-1.0.3.tgz", + "integrity": "sha1-wcntwyyX913U4qYwdQoKlZM3B0o=", + "requires": { + "lodash.groupby": "^4.6.0", + "lodash.merge": "^4.6.0" + } + }, + "chartjs-plugin-zoom": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-0.7.7.tgz", + "integrity": "sha512-8fOHPPiZTT2+K0w278TQWYs/DtPg06s1OpTqdXxPpdfH7QQbl6Io/WuE1FjPehDWVCxpe3tSTts+dPbxgq2Z5g==", + "requires": { + "hammerjs": "^2.0.8" + } + }, "chokidar": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", @@ -4199,6 +4221,11 @@ "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.3.tgz", "integrity": "sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA==" }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -5173,6 +5200,16 @@ "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "lodash.tail": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", diff --git a/package.json b/package.json index ef45b622..d77a768d 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "frankerfacez", "author": "Dan Salvato LLC", - "version": "4.20.15", + "version": "4.20.16", "description": "FrankerFaceZ is a Twitch enhancement suite.", "license": "Apache-2.0", "scripts": { @@ -65,6 +65,9 @@ }, "dependencies": { "@ffz/icu-msgparser": "^1.0.2", + "chartjs": "^0.3.24", + "chartjs-plugin-waterfall": "^1.0.3", + "chartjs-plugin-zoom": "^0.7.7", "crypto-js": "^3.1.9-1", "dayjs": "^1.8.29", "displacejs": "^1.4.1", diff --git a/src/main.js b/src/main.js index 9f3c6f91..76d8faed 100644 --- a/src/main.js +++ b/src/main.js @@ -16,6 +16,7 @@ import {TranslationManager} from './i18n'; import SocketClient from './socket'; import Site from 'site'; import Vue from 'utilities/vue'; +//import Timing from 'utilities/timing'; class FrankerFaceZ extends Module { constructor() { @@ -29,6 +30,10 @@ class FrankerFaceZ extends Module { this.__state = 0; this.__modules.core = this; + // Timing + //this.inject('timing', Timing); + this.__time('instance'); + // ======================================================================== // Error Reporting and Logging // ======================================================================== diff --git a/src/modules/metadata.jsx b/src/modules/metadata.jsx index 217c1976..9c9f1ebc 100644 --- a/src/modules/metadata.jsx +++ b/src/modules/metadata.jsx @@ -18,6 +18,7 @@ export default class Metadata extends Module { this.inject('settings'); this.inject('i18n'); + this.inject('tooltips'); this.should_enable = true; this.definitions = {}; @@ -413,6 +414,43 @@ export default class Metadata extends Module { } } + onEnable() { + const md = this.tooltips.types.metadata = target => { + let el = target; + if ( el._ffz_stat ) + el = el._ffz_stat; + else if ( ! el.classList.contains('ffz-stat') ) { + el = target.closest('.ffz-stat'); + target._ffz_stat = el; + } + + if ( ! el ) + return; + + const key = el.dataset.key, + def = this.definitions[key]; + + return maybe_call(def.tooltip, this, el._ffz_data) + }; + + md.onShow = (target, tip) => { + const el = target._ffz_stat || target; + el.tip = tip; + }; + + md.onHide = target => { + const el = target._ffz_stat || target; + el.tip = null; + el.tip_content = null; + } + + md.popperConfig = (target, tip, opts) => { + opts.placement = 'bottom'; + opts.modifiers.flip = {behavior: ['bottom','top']}; + return opts; + } + } + get keys() { return Object.keys(this.definitions); @@ -518,7 +556,8 @@ export default class Metadata extends Module { tip_content={null} > {btn = ()} {popup = (