{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-eslint/src/components/widgets/lively-code-tip.js"],"names":["Morph","FileIndex","_","preferences","CodeTip","initialize","registerButtons","nextTipButton","style","background","cancelButton","setTitle","setupTipText","onResetButton","whackImg","addEventListener","moveImg","bind","startupCheckbox","checked","get","tips","tipIndex","Math","floor","random","length","generateTipText","onNextTipButton","incrementTipCounter","onCancelButton","showOnNextStartup","write","parentElement","remove","text","stats","avg","currentTime","title","windowTitle","focus","clearLog","s","codeOccurencesList","innerHTML","progressString","a","box","target","marginLeft","offsetWidth","toString","marginTop","offsetHeight","newLength","tapTimes","push","Date","getTime","setupTimer","display","splice","sum","i","parseInt","last","htmlElement","clearInterval","timer","setInterval","now","distance","seconds","milliseconds"],"mappings":"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","file":"lively-code-tip.js","sourcesContent":["import Morph from 'src/components/widgets/lively-morph.js';\nimport FileIndex from \"src/client/fileindex.js\";\nimport _ from 'src/external/lodash/lodash.js';\n\nimport preferences from 'src/client/preferences.js';\n\nexport default class CodeTip extends Morph {\n\n  initialize() {\n    this.registerButtons();\n    this.nextTipButton.style.background = \"#54ab5f\";\n    this.cancelButton.style.background = \"#be4441\";\n    this.setTitle(\"Tip of the Day\");\n\n    // TODO tidy up\n    this.setupTipText();\n\n    this.onResetButton();\n    this.whackImg.addEventListener(\"click\", this.moveImg.bind(this));\n\n    this.startupCheckbox.checked = preferences.get('TipOfTheDay');\n  }\n\n  setupTipText() {\n    this.tips = [\n      \"With 'Alt-Enter' you can access a powerful refactoring menu.\",\n      \"Press 'Next Tip' to get more advice!\",\n      \"Make your code simpler to understand with the extract method feature 'Alt+M'.\",\n      \"You can find many useful shortcuts under 'Right-click' --> 'Documentation'.\",\n      \"'that' can be used to reference the last component you used the 'halo-menu' (Alt+Click) on.\",\n      \"'Ctrl+Shift+F' opens the global text search (which is case sensitive!).\",\n      \"This could be your tip! Add new tips in lively-code-tip.js\",\n      \"Use 'Alt+P' to switch between markdown code and its visualization in the codemirror.\",\n      \"When editing a js file, press 'F7' to open the associated HTML file (if it exists) and vice versa.\"];\n    this.tipIndex = Math.floor(Math.random() * this.tips.length);\n    this.generateTipText();\n  }\n\n  onNextTipButton() {\n    this.incrementTipCounter();\n    this.generateTipText();\n  }\n\n  incrementTipCounter() {\n    this.tipIndex = (this.tipIndex + 1) % this.tips.length;\n  }\n\n  onCancelButton() {\n    const showOnNextStartup = this.startupCheckbox.checked;\n    preferences.write('TipOfTheDay', showOnNextStartup);\n    this.parentElement.remove();\n  }\n\n  get startupCheckbox() {\n    return this.get(\"#startupCheckbox\");\n  }\n\n  get cancelButton() {\n    return this.get(\"#cancelButton\");\n  }\n\n  get nextTipButton() {\n    return this.get(\"#nextTipButton\");\n  }\n\n  get text() {\n    return this.get(\"#text\");\n  }\n\n  get stats() {\n    return this.get(\"#stats\");\n  }\n\n  get avg() {\n    return this.get(\"#avg\");\n  }\n\n  get currentTime() {\n    return this.get(\"#current-time\");\n  }\n\n  get whackImg() {\n    return this.get(\"#whack-img\");\n  }\n\n  setTitle(title) {\n    this.windowTitle = title;\n  }\n\n  focus() {\n    //this.get(\"#searchInput\").focus();\n  }\n  clearLog(s) {\n    this.codeOccurencesList.innerHTML = \"\";\n  }\n\n  progressString() {\n    return `Tip: ${this.tipIndex + 1} / ${this.tips.length}`;\n  }\n\n  moveImg(a) {\n    const box = a.target;\n\n    box.style.marginLeft = (Math.random() * (box.parentElement.offsetWidth - box.offsetWidth)).toString() + \"px\";\n    box.style.marginTop = (Math.random() * (box.parentElement.offsetHeight - box.offsetHeight)).toString() + \"px\";\n\n    const newLength = this.tapTimes.push(new Date().getTime());\n    this.setupTimer(this.tapTimes[this.tapTimes.length - 1]);\n    if (newLength < 2) {\n      this.avg.innerHTML = \"-\";\n      this.stats.style.display = \"block\";\n      return;\n    } else if (newLength > 10) {\n      this.tapTimes = this.tapTimes.splice(1, 10);\n    }\n\n    let sum = 0;\n    for (let i = 0; i < this.tapTimes.length - 1; i++) {\n      sum += parseInt(this.tapTimes[i + 1]) - parseInt(this.tapTimes[i]);\n    }\n\n    this.avg.innerHTML = Math.floor(sum / this.tapTimes.length).toString() + \"ms\";\n  }\n\n  setupTimer(last) {\n    const htmlElement = this.currentTime;\n    clearInterval(this.timer);\n    this.timer = setInterval(function () {\n      const now = new Date().getTime();\n      const distance = now - last;\n\n      const seconds = Math.floor(distance % (1000 * 60) / 1000);\n      const milliseconds = distance % 1000;\n\n      htmlElement.innerHTML = seconds + \"s \" + milliseconds + \"ms\";\n\n      if (distance > 10000) {\n        htmlElement.innerHTML = \"Too slow!\";\n        clearInterval(this.timer);\n      }\n    }, 1);\n  }\n\n  onResetButton() {\n    this.tapTimes = [];\n    this.stats.style.display = \"none\";\n    this.avg.innerHTML = \"\";\n    this.whackImg.style.marginLeft = \"5px\";\n    this.whackImg.style.marginTop = \"5px\";\n    clearInterval(this.timer);\n  }\n\n  generateTipText() {\n    this.text.innerHTML = this.tips[this.tipIndex] + \"<br> \" + this.progressString();\n  }\n\n}"]}