{"version":3,"sources":["icon/github.svg","js/makeid.js","js/event.js","js/localdb.js","js/markdown.js","js/octokit.js","js/files.js","js/api.js","components/Line/index.js","components/AppBar/index.js","components/Title/index.js","tabs/Addons/index.js","components/Loading/index.js","tabs/Archives/index.js","tabs/Push/index.js","tabs/Search/index.js","tabs/Settings/index.js","tabs/Sheets/index.js","components/Toolbar/index.js","addons/write-good/index.js","addons/conversion/index.js","addons/calculator/index.js","addons/links/index.js","components/Handy/index.js","components/Cover/index.js","components/Login/index.js","App.js","serviceWorker.js","index.js","assets/memo_logo_left_white.svg","assets/memo_logo_left.svg"],"names":["module","exports","__webpack_require__","p","makeid","length","text","possible","i","charAt","Math","floor","random","EventEmitter","require","defaultMaxListeners","Event","window","JsStoreWorker","connection","JsStore","_db","dataBase","this","getDataBaseSchema","initDb","ex","console","error","table","value","insert","into","values","where","order","limit","query","from","select","results","remove","rowsDeleted","set","update","in","rowsUpdated","count","rowsCounted","sheetsDeleted","linesDeleted","name","tables","columns","id","primaryKey","autoIncrement","title","notNull","dataType","active","created_at","accessed_at","sheet_id","line_key","date","pos","_md","sheetId","beautified","API","getSheet","sheet","sheetMarkdown","concat","currentDate","lines","forEach","line","file","fileMetadataYaml","content","split","fileContent","slice","join","fileMetadata","Number","LocalDB","localSheet","removeAddAction","delete","fileParagraphs","lineDate","linePos","j","includes","lineKey","newLineKey","filesArray","log","fileIdArray","filename","push","localSheets","sheetsToRemove","filter","files","Object","sort","a","b","saveMarkdownSheet","setData","removeCloudDeletedFiles","addToStaging","_gh","token","client","Octokit","auth","user","gist_id","setup","gists","getRevision","sha","then","_this","round","Date","getTime","getTheme","create","res","setGistId","data","sync","event","emit","get","gist","theme","currency","addons","Markdown","updateMarkdownSheets","_this2","getData","fetch","err","_this3","staging","stagedArray","staged","replace","memoGistId","_ref","asyncToGenerator","regenerator_default","mark","_callee2","currentClientTime","metadata","metadataHead","metadataFoot","metadataContent","stagedSheetId","markdownContent","wrap","_context2","prev","next","getSheetMarkdown","sent","abrupt","stop","_x2","apply","arguments","preference","updateTo","_this4","_ref2","_callee3","_context3","_x3","_files","dropTimer","root","document","getElementById","cover","ondragover","clearTimeout","setTimeout","className","ondragleave","ondragend","ondrop","e","preventDefault","dataTransfer","reader","FileReader","onload","endsWith","importFile","lastModified","target","result","added","alert","readAsText","fileName","unixTime","substr","by","type","newSheet","today","String","getDate","padStart","getMonth","getFullYear","Blob","markdownText","blob","saveAs","URL","DEVELOPMENT","VERSION","_api","classCallCheck","Analytics","initialize","development","version","online","navigator","onLine","analytics","logged","defaultAddons","loginInterval","initDB","method","credentials","json","session_id","Github","init","status","checkUpdate","Files","listenFileDrop","catch","offlineLogin","sheetCount","offlineFirstTime","offlineSetup","_this5","_this6","pageview","formattedTime","time","newAddedId","lastSheet","idSheet","sheets","first_line","line_count","term","like","action","hint",">=","-","setFound","whereCheck","+","toStatus","truncate","pref","to","isOnline","pushPreference","currentStaging","gistId","url","formData","FormData","append","body","key","localStorage","setItem","getItem","App","state","focused","pHeight","props","children","setState","refs","_lineText","scrollHeight","addEventListener","handleChange","onBlur","index","returnValue","focusOnRender","lineText","cursorPosition","focus","selectionStart","selectionEnd","newProps","tArea","renderedHeight","getHeight","pasted","clipboardData","add","topText","downText","restArray","onPaste","keyCode","onSplit","newItemTest","pop","rightOfCursor","textString","tailText","ordinarySplit","extraOrdinarySplit","nextLineText","onConcat","currentTextLength","textLength","onCursor","scrollTop","getBoundingClientRect","top","lineId","position","react_default","createElement","Fragment","ref","style","height","onFocus","handleFocus","handleBlur","onKeyDown","handleKeyDown","onChange","handlePaste","Component","maximized","win","remote","getCurrentWindow","onClick","minimize","maximize","unmaximize","close","process","spacer","platform","src","renderWindowsButtons","archived","archiveProgress","_title","shouldFocused","updateTitle","onTitleDown","exportFile","currentStatus","archiveUpdate","deleteSheet","placeholder","exportAction","viewBox","width","d","archiveAction","textAlign","deleteAction","slug","updatePreference","map","addon","toggleAddon","paddingTop","paddingBottom","display","checked","readOnly","description","quoteRand","spinning","on","statusText","quote","person","marginBottom","overflow","margin","renderQuote","noSheets","getSheets","Loading","renderSheets","syncText","syncAction","syncErrorAction","removeListener","startSync","xmlns","fill","cursor","fontWeight","location","reload","renderChanges","searchTerm","_searchInput","searchSheets","toggleUserOptions","changeTo","handle","username","email","changeTheme","changeCurrency","bind","curr","href","fontSize","avatar","toUpperCase","maxHeight","githubLogout","paddingLeft","archivedSheetCount","justifyContent","opacity","toggled","transition","currentTab","tabTransition","stagedAmount","tab","Addons","Archives","Push","Search","Settings","Sheets","visibility","left","renderTabContent","THROTTLE_LIMIT","lineFocusedAction","lineChangedAction","throttleCounter","writeGoodSuggestions","writeGood","s","reason","DEFAULT_CURRENCY","toLowerCase","DEFAULT_CURRENCY_SYMBOL","currencies","ticker","symbol","usdFactor","getConversions","conv","rates","toFixed","toArray","currency1","currency2","inArray","some","parseableArray","inText","RegExp","splittedParser","splittedSpace","trim","amount","numberString","isNaN","toText","conversion","c","parsed","parseConversion","calculatables","calculatable","calcable","fn","Function","evil","renderCalculated","match","link","rel","maxWidth","renderLinks","addons_write_good","addons_conversion","calculator","addons_links","headText","smallText","AUTH_URL","isRefresh","AUTH_URL_REFRESH","loginButtonText","forceLogout","userAgent","iframe","_authIframe","contentWindow","contentDocument","warn","githubLogin","alt","onLoad","handleIframeLoad","frameBorder","lineHeight","focusIndex","ctrlKey","metaKey","newTheme","sheetLoading","login","_textScroller","yesterday","setDate","lineIndex","updateLine","old_key","splice","textArray","direction","newIndex","lineArray","prevDate","l","dangerouslySetInnerHTML","__html","getDateIdentifier","Line","prevId","nextId","handleConcat","handleSplit","handleCursor","AppBar","Title","handleTitleDown","renderLines","Handy","focusLast","Toolbar","Login","renderApp","Cover","isLocalhost","Boolean","hostname","registerValidSW","swUrl","config","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","ReactDOM","render","src_App_0","origin","response","contentType","headers","indexOf","ready","unregister","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.3e181066.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/github.13ca91d2.svg\";","export default function makeid(length){\r\n var text = \"\";\r\n var possible = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\r\n\r\n for(var i=0; i < length; i++)\r\n {\r\n text += possible.charAt(Math.floor(Math.random() * possible.length));\r\n }\r\n\r\n return text;\r\n}\r\n","var EventEmitter = require('events').EventEmitter;\r\nEventEmitter.defaultMaxListeners = 40;\r\nlet Event = new EventEmitter();\r\n\r\nexport default Event;\r\n","import * as JsStore from 'jsstore';\r\nimport { IDataBase, DATA_TYPE, ITable } from 'jsstore';\r\nimport * as JsStoreWorker from \"jsstore/dist/jsstore.worker.commonjs2\";\r\nwindow['JsStoreWorker'] = JsStoreWorker;\r\n\r\nconst connection = new JsStore.Instance();\r\nconst DB_NAME ='memo_db';\r\n\r\nclass LocalDB {\r\n\r\n initDB(){\r\n try {\r\n const dataBase = this.getDataBaseSchema();\r\n return connection.initDb(dataBase);\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n }\r\n }\r\n\r\n getConnection(){\r\n return connection;\r\n }\r\n\r\n async insert(table, value){\r\n let noOfDataInserted = await connection.insert({\r\n into: table,\r\n values: [value]\r\n });\r\n\r\n if(noOfDataInserted > 0) {\r\n return true;\r\n }\r\n }\r\n\r\n async select(table, where, order, limit){\r\n let query = {\r\n from: table\r\n };\r\n if(where){\r\n query.where = where;\r\n }\r\n if(limit){\r\n query.limit = limit;\r\n }\r\n if(order){\r\n query.order = order;\r\n }\r\n let results = await connection.select(query);\r\n\r\n return results;\r\n }\r\n\r\n async delete(table, where, limit){\r\n let query = {\r\n from: table,\r\n where\r\n };\r\n\r\n if(limit){\r\n query.limit = limit;\r\n }\r\n\r\n let rowsDeleted = await connection.remove(query);\r\n return rowsDeleted;\r\n }\r\n\r\n async update(table, where, set, limit){\r\n let rowsUpdated = await connection.update({\r\n in: table,\r\n where,\r\n set,\r\n limit\r\n });\r\n\r\n return rowsUpdated;\r\n }\r\n\r\n async count(table, where){\r\n let rowsCounted = await connection.count({\r\n from: table,\r\n where\r\n });\r\n\r\n return rowsCounted;\r\n }\r\n\r\n async truncate(){\r\n let sheetsDeleted = await connection.remove({\r\n from: \"sheet\"\r\n });\r\n\r\n let linesDeleted = await connection.remove({\r\n from: \"line\"\r\n });\r\n\r\n return { sheetsDeleted, linesDeleted };\r\n }\r\n\r\n getDataBaseSchema() {\r\n const sheet = {\r\n name: 'sheet',\r\n columns: {\r\n id: { primaryKey: true, autoIncrement: true },\r\n title: { notNull: false, dataType: \"string\" },\r\n active: { notNull: true, dataType: \"number\" },\r\n created_at: { notNull: true, dataType: \"number\" },\r\n accessed_at: { notNull: true, dataType: \"number\" }\r\n }\r\n };\r\n const line = {\r\n name: 'line',\r\n columns: {\r\n id: { primaryKey: true, autoIncrement: true },\r\n sheet_id: { notNull: true, dataType: \"number\" },\r\n line_key: { notNull: true, dataType: \"string\" },\r\n date: { notNull: true, dataType: \"string\" },\r\n text: { notNull: false, dataType: \"string\" },\r\n pos: { notNull: true, dataType: \"number\" }\r\n }\r\n };\r\n const db = {\r\n name: DB_NAME,\r\n tables: [sheet, line]\r\n }\r\n return db;\r\n }\r\n\r\n}\r\n\r\nconst _db = new LocalDB();\r\nexport default _db;\r\n","import API from './api';\r\nimport LocalDB from './localdb';\r\nimport makeid from './makeid';\r\n\r\nclass Markdown {\r\n async getSheetMarkdown(sheetId, beautified){\r\n let sheet = await API.getSheet(sheetId);\r\n if(sheet == \"removed\"){\r\n return \"\";\r\n }\r\n\r\n let sheetMarkdown = \"\";\r\n\r\n if(beautified){\r\n sheetMarkdown = `# ${sheet.title}\r\n\r\n`;\r\n }else{\r\n sheetMarkdown = `---\r\nid: ${sheet.id}\r\ntitle: ${sheet.title}\r\nactive: ${sheet.active}\r\ncreated_at: ${sheet.created_at}\r\naccessed_at: ${sheet.accessed_at}\r\n---\r\n`;\r\n }\r\n\r\n let currentDate = \"\";\r\n sheet.lines.forEach(line => {\r\n if(currentDate != line.date){\r\n currentDate = line.date;\r\n\r\n if(beautified){\r\n sheetMarkdown += `${line.date}\r\n\r\n`;\r\n }else{\r\n sheetMarkdown += `{{date: ${line.date}}}\r\n\r\n`;\r\n }\r\n }\r\n sheetMarkdown += `${line.text}\r\n\r\n`;\r\n });\r\n if(beautified){\r\n return {\r\n title: sheet.title,\r\n text: sheetMarkdown\r\n };\r\n }else{\r\n return sheetMarkdown;\r\n }\r\n }\r\n\r\n // removes and adds a sheet if not valid\r\n async saveMarkdownSheet(file){\r\n let fileMetadataYaml = file.content.split(\"---\")[1];\r\n let fileContent = file.content.split(\"---\").slice(2).join(\"---\");\r\n\r\n let fileMetadata = {\r\n id: Number(fileMetadataYaml.split(\"id: \")[1].split(/\\n/)[0]),\r\n title: fileMetadataYaml.split(\"title: \")[1].split(/\\n/)[0],\r\n active: Number(fileMetadataYaml.split(\"active: \")[1].split(/\\n/)[0]),\r\n created_at: Number(fileMetadataYaml.split(\"created_at: \")[1].split(/\\n/)[0]),\r\n accessed_at: Number(fileMetadataYaml.split(\"accessed_at: \")[1].split(/\\n/)[0])\r\n };\r\n\r\n let localSheet = await LocalDB.select(\"sheet\", {id: fileMetadata.id }, 1);\r\n let removeAddAction = false;\r\n if(localSheet.length == 0) {\r\n removeAddAction = true;\r\n }else{\r\n if(localSheet[0].accessed_at != fileMetadata.accessed_at){\r\n removeAddAction = true;\r\n }\r\n }\r\n\r\n if(removeAddAction){\r\n //delete\r\n let ey = await LocalDB.delete(\"sheet\", {id: fileMetadata.id});\r\n await LocalDB.delete(\"line\", {sheet_id: fileMetadata.id});\r\n\r\n //insert\r\n let fileParagraphs = fileContent.split(/\\n\\n/);\r\n await LocalDB.insert(\"sheet\", {\r\n id: fileMetadata.id,\r\n title: fileMetadata.title,\r\n active: fileMetadata.active,\r\n created_at: fileMetadata.created_at,\r\n accessed_at: fileMetadata.accessed_at\r\n });\r\n\r\n let sheetId = fileMetadata.id;\r\n let lineDate = \"\";\r\n let linePos = 0;\r\n for (var j = 0; j < fileParagraphs.length; j++) {\r\n let p = fileParagraphs[j];\r\n\r\n if(p != \"\"){\r\n if(p.includes(\"{{date: \")){\r\n lineDate = p.split(\"{{date: \")[1].split(\"}}\")[0];\r\n }else{\r\n let lineKey = makeid(5);\r\n await LocalDB.insert(\"line\", {\r\n sheet_id: sheetId,\r\n line_key: lineKey,\r\n date: lineDate,\r\n text: p,\r\n pos: linePos\r\n });\r\n\r\n linePos++;\r\n }\r\n }\r\n }\r\n\r\n if(linePos == 0){\r\n let newLineKey = makeid(5);\r\n await LocalDB.insert(\"line\", {\r\n sheet_id: sheetId,\r\n line_key: newLineKey,\r\n date: lineDate,\r\n text: \"\",\r\n pos: 0\r\n });\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n async removeCloudDeletedFiles(filesArray){\r\n console.log(\"Removing cloud deleted files...\");\r\n let fileIdArray = []\r\n filesArray.forEach(file => {\r\n if(file.filename.includes(\"-\")){\r\n fileIdArray.push(Number(file.filename.split(\"-\")[1].split(\".\")[0]));\r\n }\r\n })\r\n\r\n let localSheets = await LocalDB.select(\"sheet\");\r\n\r\n let sheetsToRemove = localSheets.filter(sheet => {\r\n return !fileIdArray.includes(sheet.id);\r\n })\r\n\r\n for (var i = 0; i < sheetsToRemove.length; i++) {\r\n await LocalDB.delete(\"sheet\", {id: sheetsToRemove[i].id});\r\n await LocalDB.delete(\"line\", {sheet_id: sheetsToRemove[i].id});\r\n }\r\n }\r\n\r\n async updateMarkdownSheets(files){\r\n let filesArray = Object.values(files).sort((a,b) => {\r\n a = Number(a.filename.split(\".\")[0].split(\"-\")[1]);\r\n b = Number(b.filename.split(\".\")[0].split(\"-\")[1]);\r\n return (a > b) ? 1 : ((b > a) ? -1 : 0);\r\n });\r\n\r\n for (var i = 0; i < filesArray.length; i++) {\r\n let file = filesArray[i];\r\n\r\n if(file.filename != \"01_usememo.md\" && file.filename != \"02_metadata.md\"){\r\n await this.saveMarkdownSheet(file);\r\n }\r\n\r\n if(file.filename == \"02_metadata.md\"){\r\n // set the local update validator to the cloud one.\r\n let accessed_at = Number(file.content.split(\"accessed_at: \")[1].split(/\\n/)[0]);\r\n API.setData(\"updated_at\", accessed_at);\r\n }\r\n }\r\n\r\n\r\n let localSheetCount = await LocalDB.count(\"sheet\");\r\n // -2 for desc and metadata sheets\r\n if(localSheetCount != (filesArray.length - 2)){\r\n await this.removeCloudDeletedFiles(filesArray);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n async offlineSetup(){\r\n let file = {\r\n filename: \"sheet-1.md\",\r\n content: `---\r\nid: 1\r\ntitle: Welcome to Memo 👋\r\nactive: 1\r\ncreated_at: 1576786353\r\naccessed_at: 1576789529\r\n---\r\n{{date: 19/12/2019}}\r\n\r\nThis is so exciting.\r\nThank you for checking out memo!\r\n\r\nMemo has no bold, italic or subtitles, minimal and plain. Great for really focusing and creating your own formatting. It's totally free, and uses private Github Gists as cloud storage.\r\n\r\nLet me tell you about how memo works;\r\n\\t- There are separated paragraphs\r\n\\t- A double new line creates a paragraph\r\n\\t- Every paragraph has its own insights ✨\r\n\\t- Enable which insights you want in addons 🧩\r\n\\t- Use offline, push your changes to cloud later\r\n\r\nNow, archive or remove this sheet or create a new sheet from sidebar sheets tab and start taking notes.\r\n\r\nAlso if you see any bug, let's crush it together on GitHub!\r\nUsing this link: https://github.com/btk/memo\r\n\r\nAgain, welcome to memo! 😊`\r\n };\r\n API.addToStaging(1);\r\n return await this.saveMarkdownSheet(file);\r\n }\r\n}\r\n\r\nconst _md = new Markdown();\r\nexport default _md;\r\n","import Octokit from '@octokit/rest';\r\nimport API from './api';\r\nimport Markdown from './markdown';\r\n\r\nclass Github {\r\n async init(token){\r\n this.client = new Octokit({\r\n auth: \"token \"+token\r\n })\r\n\r\n if(!API.user.gist_id){\r\n return await this.setup();\r\n }else{\r\n return true;\r\n }\r\n }\r\n\r\n list(){\r\n return this.client.gists.getRevision({gist_id: API.user.gist_id, sha: \"eaf951983a50e774d9bfaa92673ac6d5c9bb6227\"}).then(gists => {\r\n return gists;\r\n });\r\n }\r\n\r\n setup(){\r\n // create an empty memo gist\r\n let files = {};\r\n files[\"01_usememo.md\"] = {\r\n filename: \"01_usememo.md\",\r\n content: `# Created by Memo App\r\n\r\nThis gist was created by note taking app; memo ([usememo.com](https://www.usememo.com)) and is not intended to be editted.\r\n\r\nTo read your notes and make changes, please go to [usememo.com](https://www.usememo.com) and use either our browser app or desktop app. Also you can see your notes in MD format in the following sub gists, by their sheet ids.\r\n`\r\n };\r\n\r\n files[\"02_metadata.md\"] = {\r\n filename: \"02_metadata.md\",\r\n content: `---\r\ncreated_at: ${Math.round((new Date()).getTime() / 1000)}\r\naccessed_at: ${Math.round((new Date()).getTime() / 1000)}\r\ntheme: ${API.getTheme()}\r\ncurrency: USD\r\naddons: |write-good||conversion||links||calculator|\r\n---\r\n\r\nPlease don't edit this file, as this is vital for cache validation and version control.\r\n`\r\n };\r\n\r\n files[\"sheet-1.md\"] = {\r\n filename: \"sheet-1.md\",\r\n content: `---\r\nid: 1\r\ntitle: Welcome to Memo 👋\r\nactive: 1\r\ncreated_at: 1576786353\r\naccessed_at: 1576789529\r\n---\r\n{{date: 19/12/2019}}\r\n\r\nThis is so exciting.\r\nThank you for checking out memo!\r\n\r\nMemo has no bold, italic or subtitles, minimal and plain. Great for really focusing and creating your own formatting. It's totally free, and uses private Github Gists as cloud storage.\r\n\r\nLet me tell you about how memo works;\r\n\\t- There are separated paragraphs\r\n\\t- A double new line creates a paragraph\r\n\\t- Every paragraph has its own insights ✨\r\n\\t- Enable which insights you want in addons 🧩\r\n\\t- Use offline, push your changes to cloud later\r\n\r\nNow, archive or remove this sheet or create a new sheet from sidebar sheets tab and start taking notes.\r\n\r\nAlso if you see any bug, let's crush it together on GitHub!\r\nUsing this link: https://github.com/btk/memo\r\n\r\nAgain, welcome to memo! 😊`\r\n };\r\n\r\n return this.client.gists.create({\r\n files\r\n }).then(res => {\r\n API.setGistId(res.data.id);\r\n return this.sync();\r\n })\r\n }\r\n\r\n fetch(){\r\n API.event.emit(\"fetching\");\r\n return this.client.gists.get({gist_id: API.user.gist_id}).then(gist => {\r\n let files = gist.data.files;\r\n\r\n //cloud stored preference data in effect on\r\n let theme = files[\"02_metadata.md\"].content.split(\"theme: \")[1].split(/\\n/)[0];\r\n API.setData(\"theme\", theme);\r\n API.event.emit(\"theme\", theme);\r\n\r\n let currency = files[\"02_metadata.md\"].content.split(\"currency: \")[1].split(/\\n/)[0];\r\n API.setData(\"currency\", currency);\r\n\r\n let addons = files[\"02_metadata.md\"].content.split(\"addons: \")[1].split(/\\n/)[0];\r\n API.setData(\"addons\", addons);\r\n API.event.emit(\"addons\", addons);\r\n\r\n\r\n return Markdown.updateMarkdownSheets(files).then(res => {\r\n API.addToStaging(\"flush\");\r\n API.event.emit(\"fetched\");\r\n return res;\r\n });\r\n })\r\n }\r\n\r\n checkUpdate(){\r\n API.event.emit(\"checkingUpdates\");\r\n\r\n return this.client.gists.get({gist_id: API.user.gist_id}).then(gist => {\r\n let files = gist.data.files;\r\n let accessed_at = Number(files[\"02_metadata.md\"].content.split(\"accessed_at: \")[1].split(/\\n/)[0]);\r\n if(accessed_at !== Number(API.getData(\"updated_at\"))){\r\n console.log(\"Local data is not valid, starting a forced fetch\");\r\n return this.fetch();\r\n }else{\r\n console.log(\"Gists and local data is already synced\");\r\n return true;\r\n }\r\n }, err => {\r\n console.log(\"Error: Gist is not valid, creating a new one.\");\r\n return this.setup().then(res => {\r\n return this.fetch();\r\n });\r\n })\r\n }\r\n\r\n sync(){\r\n let staging = API.getData(\"staging\");\r\n if(staging){\r\n\r\n let stagedArray = [];\r\n staging.split(\",\").forEach(staged => {\r\n stagedArray.push(Number(staged.replace(/\\|/g, \"\")));\r\n });\r\n\r\n let memoGistId = API.user.gist_id;\r\n\r\n return this.client.gists.get({gist_id: memoGistId}).then(async gist => {\r\n let files = gist.data.files;\r\n\r\n let currentClientTime = Math.round((new Date()).getTime() / 1000);\r\n API.setData(\"updated_at\", currentClientTime);\r\n\r\n let metadata = files[`02_metadata.md`].content;\r\n\r\n let metadataHead = metadata.split(\"accessed_at: \")[0];\r\n let metadataFoot = metadata.split(\"accessed_at: \")[1].split(/\\n/).slice(1).join(\"\\n\");\r\n\r\n let metadataContent = metadataHead + \"accessed_at: \" + currentClientTime + \"\\n\" + metadataFoot;\r\n\r\n files[`02_metadata.md`] = {\r\n filename: `02_metadata.md`,\r\n content: metadataContent\r\n };\r\n\r\n for (var i = 0; i < stagedArray.length; i++) {\r\n let stagedSheetId = stagedArray[i];\r\n let markdownContent = await Markdown.getSheetMarkdown(stagedSheetId);\r\n if(markdownContent === \"\"){\r\n if(files[`sheet-${stagedSheetId}.md`]){\r\n files[`sheet-${stagedSheetId}.md`] = {\r\n filename: `sheet-${stagedSheetId}.md`,\r\n content: \"\"\r\n };\r\n }\r\n }else{\r\n files[`sheet-${stagedSheetId}.md`] = {\r\n filename: `sheet-${stagedSheetId}.md`,\r\n content: markdownContent\r\n };\r\n }\r\n }\r\n\r\n return this.client.gists.update({\r\n gist_id: memoGistId,\r\n files: files\r\n });\r\n }, err => {\r\n API.event.emit(\"syncError\", err);\r\n return err;\r\n })\r\n\r\n }else {\r\n return \"no files on staging\";\r\n }\r\n }\r\n\r\n pushPreference(preference, updateTo){\r\n let memoGistId = API.user.gist_id;\r\n\r\n return this.client.gists.get({gist_id: memoGistId}).then(async gist => {\r\n let files = gist.data.files;\r\n\r\n let metadata = files[`02_metadata.md`].content;\r\n\r\n let metadataHead = metadata.split(preference+\": \")[0];\r\n let metadataFoot = metadata.split(preference+\": \")[1].split(/\\n/).slice(1).join(\"\\n\");\r\n\r\n let metadataContent = metadataHead + preference +\": \" + updateTo + \"\\n\" + metadataFoot;\r\n\r\n files[`02_metadata.md`] = {\r\n filename: `02_metadata.md`,\r\n content: metadataContent\r\n };\r\n\r\n return this.client.gists.update({\r\n gist_id: memoGistId,\r\n files: files\r\n });\r\n })\r\n }\r\n}\r\n\r\nconst _gh = new Github();\r\nexport default _gh;\r\n","import API from './api';\r\nimport LocalDB from './localdb';\r\nimport Markdown from './markdown';\r\nimport makeid from './makeid';\r\nimport { saveAs } from 'file-saver';\r\n\r\nclass Files {\r\n listenFileDrop(){\r\n let dropTimer = 0;\r\n let root = document.getElementById('root');\r\n let cover = document.getElementById('cover');\r\n\r\n root.ondragover = function() {\r\n clearTimeout(dropTimer);\r\n dropTimer = setTimeout(function() {\r\n cover.className = \"cover\";\r\n return false;\r\n }, 1000);\r\n\r\n if(cover.className != \"cover coverActive\"){\r\n cover.className = \"cover coverActive\";\r\n }\r\n return false;\r\n };\r\n\r\n cover.ondragleave = function() {\r\n clearTimeout(dropTimer);\r\n cover.className = \"cover\";\r\n return false;\r\n };\r\n\r\n root.ondragend = function() {\r\n clearTimeout(dropTimer);\r\n cover.className = \"cover\";\r\n return false;\r\n };\r\n\r\n root.ondrop = (e) => {\r\n clearTimeout(dropTimer);\r\n e.preventDefault();\r\n if(e.dataTransfer.files.length){\r\n var file = e.dataTransfer.files[0],\r\n reader = new FileReader();\r\n\r\n reader.onload = (event) => {\r\n API.event.emit(\"importStarted\", file.name);\r\n if(file.name.endsWith(\".txt\") || file.name.endsWith(\".md\") || file.name.endsWith(\".markdown\")){\r\n this.importFile(file.name, file.lastModified, event.target.result).then(added => {\r\n API.event.emit(\"sheet\", added);\r\n API.event.emit(\"importEnded\");\r\n cover.className = \"cover\";\r\n });\r\n }else{\r\n alert(\"File should be a plaintext format (.txt, .md or .markdown) in order to import in Memo\");\r\n cover.className = \"cover\";\r\n }\r\n };\r\n reader.readAsText(file);\r\n }\r\n return false;\r\n };\r\n\r\n }\r\n\r\n async importFile(fileName, unixTime, text){\r\n\r\n if(text[text.length - 1] == \"\\r\" || text[text.length - 1] == \"\\n\"){\r\n text = text.substr(0, text.length-1)\r\n }\r\n\r\n let fileParagraphs;\r\n // n+r is usually typed in a windows, n+n is default\r\n if(text.includes(\"\\n\\r\")){\r\n fileParagraphs = text.split(/\\n\\r/);\r\n }else{\r\n fileParagraphs = text.split(/\\n\\n/);\r\n }\r\n\r\n await LocalDB.insert(\"sheet\", {\r\n title: \"📃 \"+fileName,\r\n active: 1,\r\n created_at: Math.floor(unixTime / 1000),\r\n accessed_at: Math.round((new Date()).getTime() / 1000)\r\n });\r\n\r\n let newSheet = await LocalDB.select(\"sheet\", null, {\r\n by: \"id\",\r\n type: \"desc\"\r\n }, 1);\r\n\r\n let sheetId = newSheet[0].id;\r\n\r\n let today = new Date();\r\n let lineDate = String(today.getDate()).padStart(2, '0') + \"/\" + String(today.getMonth() + 1).padStart(2, '0') + \"/\" + today.getFullYear();\r\n\r\n let linePos = 0;\r\n for (var j = 0; j < fileParagraphs.length; j++) {\r\n let p = fileParagraphs[j];\r\n\r\n if(p[p.length - 1] == \"\\r\" || p[p.length - 1] == \"\\n\"){\r\n p = p.substr(0, p.length-1)\r\n }\r\n if(p[0] == \"\\r\" || p[0] == \"\\n\"){\r\n p = p.substr(1)\r\n }\r\n if(p != \"\"){\r\n let lineKey = makeid(5);\r\n await LocalDB.insert(\"line\", {\r\n sheet_id: sheetId,\r\n line_key: lineKey,\r\n date: lineDate,\r\n text: p,\r\n pos: linePos\r\n });\r\n linePos++;\r\n }\r\n }\r\n API.addToStaging(sheetId);\r\n return sheetId;\r\n }\r\n\r\n exportFile(sheetId) {\r\n try {\r\n var isFileSaverSupported = !!new Blob;\r\n } catch (e) {\r\n alert(\"Your device doesn't support file saver!\");\r\n }\r\n\r\n return Markdown.getSheetMarkdown(sheetId, true).then((sheet) => {\r\n let markdownText = sheet.text;\r\n\r\n var blob = new Blob([markdownText], {\r\n type: \"text/plain;charset=utf-8\"\r\n });\r\n\r\n saveAs(blob, sheet.title + '.md');\r\n });\r\n }\r\n\r\n}\r\n\r\nconst _files = new Files();\r\nexport default _files;\r\n","import makeid from './makeid';\r\nimport Event from './event';\r\nimport LocalDB from './localdb';\r\nimport Analytics from 'react-ga';\r\nimport Github from './octokit';\r\nimport Markdown from './markdown';\r\nimport Files from './files';\r\n\r\nconst URL = \"https://api.usememo.com/\";\r\nconst DEVELOPMENT = false;\r\nconst VERSION = \"0.6.4\";\r\n\r\nclass API {\r\n constructor(){\r\n Analytics.initialize('UA-138987685-1');\r\n this.development = DEVELOPMENT;\r\n\t\tthis.event = Event;\r\n this.version = VERSION;\r\n this.online = window.navigator.onLine;\r\n this.analytics = Analytics;\r\n this.logged = false;\r\n this.defaultAddons = \"|write-good||conversion||links||calculator|\";\r\n this.loginInterval = false;\r\n console.log(\"API: init\");\r\n\r\n LocalDB.initDB().then(res => {\r\n console.log(\"LocalDB: init\");\r\n });\r\n\r\n }\r\n\r\n isOnline(){\r\n return this.online;\r\n }\r\n\r\n githubLogin(){\r\n var url = URL + \"login/\" + (DEVELOPMENT ? \"development\": \"\");\r\n\r\n fetch(url, { method: 'GET', credentials: 'include'})\r\n .then(res => res.json())\r\n .then((res) => {\r\n if(res == null){\r\n console.log(\"NO_AUTH\");\r\n }\r\n if(res){\r\n if(res.session_id){\r\n console.log(\"Logged In\");\r\n this.logged = true;\r\n this.user = res;\r\n Github.init(this.user.token).then(status => {\r\n console.log(\"initing...\");\r\n Github.checkUpdate().then(res => {\r\n console.log(\"checked for updates...\");\r\n this.event.emit(\"sheet\", \"LAST_ACCESSED\");\r\n this.event.emit(\"login\", true);\r\n });\r\n });\r\n\r\n Files.listenFileDrop();\r\n }\r\n }\r\n }).catch(err => {\r\n console.log(err);\r\n this.offlineLogin();\r\n });\r\n }\r\n\r\n offlineLogin(){\r\n this.online = false;\r\n console.log(\"Logging in: Offline\");\r\n this.logged = true;\r\n return LocalDB.count(\"sheet\").then(sheetCount => {\r\n if(sheetCount == 0){\r\n this.offlineFirstTime();\r\n }else{\r\n this.event.emit(\"sheet\", \"LAST_ACCESSED\");\r\n this.event.emit(\"login\", true);\r\n }\r\n })\r\n\r\n Files.listenFileDrop();\r\n }\r\n\r\n offlineFirstTime(){\r\n Markdown.offlineSetup().then((status) => {\r\n console.log(\"Setting up first time offline\", status);\r\n if(status){\r\n this.event.emit(\"sheet\", \"LAST_ACCESSED\");\r\n this.event.emit(\"login\", true);\r\n }\r\n });\r\n }\r\n\r\n githubLogout(){\r\n var url = URL + \"logout/\" + (DEVELOPMENT ? \"development\": \"\");\r\n\r\n fetch(url, { method: 'GET'})\r\n .then(res => res.json())\r\n .then((res) => {\r\n this.event.emit(\"login\", false);\r\n });\r\n }\r\n\r\n sync(){\r\n Github.sync().then(res => {\r\n if(res.status == 200){\r\n this.addToStaging(\"flush\");\r\n }\r\n });\r\n }\r\n\r\n fetch(){\r\n Github.fetch().then(res => {\r\n if(res){\r\n this.addToStaging(\"flush\");\r\n this.event.emit(\"sheet\", \"LAST_ACCESSED\");\r\n }\r\n });\r\n }\r\n\r\n getTheme(){\r\n return this.getData(\"theme\") || \"light\";\r\n }\r\n\r\n getSheet(sheetId){\r\n this.analytics.pageview(\"/sheet/\"+sheetId);\r\n\r\n let today = new Date();\r\n let formattedTime = String(today.getDate()).padStart(2, '0') + \"/\" + String(today.getMonth() + 1).padStart(2, '0') + \"/\" + today.getFullYear();\r\n\r\n let id = sheetId;\r\n let time = Math.round((new Date()).getTime() / 1000);\r\n let where, order;\r\n let action = \"\";\r\n\r\n if(action == \"archive\"){\r\n // `sheet` SET `active` = 0 WHERE `id` = $id AND owner_id = $user_id\r\n return LocalDB.update(\"sheet\", {id}, {active: 0});\r\n }else if(action == \"active\"){\r\n return LocalDB.update(\"sheet\", {id}, {active: 1});\r\n }else if(action == \"rm\"){\r\n //DELETE FROM `sheet` WHERE `id` = $id AND owner_id = $user_id\r\n //DELETE FROM `line` WHERE `sheet_id` = $id\r\n return LocalDB.delete(\"sheet\", {id}).then((res) => {\r\n return LocalDB.delete(\"line\", {sheet_id: id});\r\n });\r\n }else{\r\n if(id == \"NEW_SHEET\"){\r\n // INTO `sheet` (`id`, `owner_id`, `title`, `active`, `created_at`, `accessed_at`) VALUES (NULL, '$user_id', 'Untitled Sheet', 1, '$time', '$time\r\n return LocalDB.insert(\"sheet\", {\r\n title: \"Untitled Sheet\",\r\n active: 1,\r\n created_at: time,\r\n accessed_at: time\r\n }).then(res => {\r\n if(res){\r\n //SELECT id FROM `sheet` WHERE owner_id = $user_id Order by accessed_at desc LIMIT 1\r\n return LocalDB.select(\"sheet\", null, {\r\n by: \"accessed_at\",\r\n type: \"desc\"\r\n }, 1).then(res => {\r\n let newAddedId = res[0].id;\r\n let newLineKey = makeid(5);\r\n //INSERT INTO `line` (`id`, `sheet_id`, `line_key`, `date`, `text`, `pos`) VALUES (NULL, '$id', '\".uniqid().\"', '$formatted_time', '', '0')\r\n return LocalDB.insert(\"line\", {\r\n sheet_id: newAddedId,\r\n line_key: newLineKey,\r\n date: formattedTime,\r\n text: \"\",\r\n pos: 0\r\n }).then(res => {\r\n return LocalDB.select(\"sheet\", {id: newAddedId}, null, 1).then((sheet) => {\r\n let newSheet = sheet[0];\r\n return LocalDB.select(\"line\", {sheet_id: newAddedId}, {by: \"pos\", type: \"asc\"}).then(lines => {\r\n newSheet.lines = lines;\r\n return newSheet;\r\n })\r\n })\r\n })\r\n });\r\n }\r\n })\r\n\r\n }else if(id == \"LAST_ACCESSED\"){\r\n\r\n return LocalDB.select(\"sheet\", {active: 1}, {\r\n by: \"accessed_at\",\r\n type: \"desc\"\r\n }, 1).then(res => {\r\n if(res[0]){\r\n let lastSheet = res[0];\r\n return LocalDB.select(\"line\", {sheet_id: lastSheet.id}, {by: \"pos\", type: \"asc\"}).then(lines => {\r\n lastSheet.lines = lines;\r\n LocalDB.update(\"sheet\", {id: lastSheet.id}, {accessed_at: time});\r\n return lastSheet;\r\n });\r\n }else{\r\n // Add a new sheet for the new user!\r\n\r\n return LocalDB.insert(\"sheet\", {\r\n title: \"Untitled Sheet\",\r\n active: 1,\r\n created_at: time,\r\n accessed_at: time\r\n }).then(res => {\r\n if(res){\r\n //SELECT id FROM `sheet` WHERE owner_id = $user_id Order by accessed_at desc LIMIT 1\r\n return LocalDB.select(\"sheet\", null, {\r\n by: \"accessed_at\",\r\n type: \"desc\"\r\n }, 1).then(res => {\r\n let newAddedId = res[0].id;\r\n let newLineKey = makeid(5);\r\n //INSERT INTO `line` (`id`, `sheet_id`, `line_key`, `date`, `text`, `pos`) VALUES (NULL, '$id', '\".uniqid().\"', '$formatted_time', '', '0')\r\n return LocalDB.insert(\"line\", {\r\n sheet_id: newAddedId,\r\n line_key: newLineKey,\r\n date: formattedTime,\r\n text: \"\",\r\n pos: 0\r\n }).then(res => {\r\n return LocalDB.select(\"sheet\", {id: newAddedId}).then((sheet) => {\r\n let newSheet = sheet[0];\r\n return LocalDB.select(\"line\", {sheet_id: newAddedId}, {by: \"pos\", type: \"asc\"}).then(lines => {\r\n newSheet.lines = lines;\r\n return newSheet;\r\n })\r\n })\r\n })\r\n });\r\n }\r\n });\r\n\r\n }\r\n })\r\n\r\n }else{\r\n // id is a Number\r\n return LocalDB.select(\"sheet\", {id}).then((sheet) => {\r\n let idSheet = sheet[0];\r\n if(idSheet){\r\n return LocalDB.select(\"line\", {sheet_id: idSheet.id}, {by: \"pos\", type: \"asc\"}).then(lines => {\r\n idSheet.lines = lines;\r\n LocalDB.update(\"sheet\", {id}, {accessed_at: time});\r\n return idSheet;\r\n });\r\n }else{\r\n return \"removed\";\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n getConversions(){\r\n return fetch(\"https://api.exchangeratesapi.io/latest?base=USD\")\r\n .then(res => res.json());\r\n }\r\n\r\n async getSheets(active, count){\r\n\r\n if(count){\r\n let sheetCount = await LocalDB.count(\"sheet\", {active: active});\r\n return sheetCount;\r\n }\r\n\r\n let sheets = await LocalDB.select(\"sheet\", {active: active}, {\r\n by: \"accessed_at\",\r\n type: \"desc\"\r\n });\r\n\r\n for (var i = 0; i < sheets.length; i++) {\r\n\r\n let sheet = sheets[i];\r\n let lines = await LocalDB.select(\"line\", {sheet_id: sheet.id}, {by: \"pos\", type: \"asc\"});\r\n if(lines[0]){\r\n sheets[i].first_line = lines[0].text.replace(/<[^>]*>|#/g, '');\r\n }else{\r\n sheets[i].first_line = \"\";\r\n }\r\n sheets[i].line_count = lines.length;\r\n }\r\n\r\n return sheets;\r\n }\r\n\r\n async searchSheets(term){\r\n let sheets = await LocalDB.select(\"sheet\", {title: {like: '%'+term+'%'}}, {\r\n by: \"accessed_at\",\r\n type: \"desc\"\r\n });\r\n\r\n for (var i = 0; i < sheets.length; i++) {\r\n let sheet = sheets[i];\r\n let lines = await LocalDB.select(\"line\", {sheet_id: sheet.id}, {by: \"pos\", type: \"asc\"});\r\n sheets[i].first_line = lines[0].text.replace(/<[^>]*>|#/g, '');\r\n sheets[i].line_count = lines.length;\r\n }\r\n\r\n return sheets;\r\n }\r\n\r\n updateLine(id, pos, text, action, hint){\r\n // pos, text, action, hint\r\n let date = id.split(\"-\")[0].split(\"!\")[1];\r\n let line_key = id.split(\"-\")[1];\r\n let sheet_id = Number(id.split(\"-\")[0].split(\"!\")[0]);\r\n this.addToStaging(sheet_id);\r\n\r\n if(action == \"rm\"){\r\n //DELETE FROM `line` WHERE `date` = '$date' AND `sheet_id` = '$sheetId' AND `pos` = '$pos\r\n //UPDATE `line` SET pos = pos-1 WHERE `pos` >= $pos AND sheet_id = $sheetId\r\n return LocalDB.delete(\"line\", {date, sheet_id, pos}).then(() => {\r\n return LocalDB.update(\"line\", {\r\n pos: {\r\n '>=': pos\r\n },\r\n sheet_id\r\n }, {\r\n pos: {\r\n '-': 1\r\n }\r\n });\r\n });\r\n }else{\r\n let setFound = {text};\r\n let whereCheck = {date, sheet_id, pos, line_key};\r\n if(action == \"key\"){\r\n setFound.line_key = line_key;\r\n whereCheck.line_key = hint;\r\n }\r\n\r\n //SELECT id FROM `line` WHERE `date` = '$date' AND `sheet_id` = '$sheetId' AND `pos` = '$pos' AND `line_key` = '$checkKey' LIMIT 1\r\n return LocalDB.select(\"line\", whereCheck, null, 1).then((line) => {\r\n if(line.length == 1){\r\n //UPDATE `line` SET `text` = '$text'$updateKey WHERE `id` = $lineId\r\n return LocalDB.update(\"line\", {id: line[0].id}, setFound);\r\n }else{\r\n //UPDATE `line` SET pos = pos+1 WHERE `pos` >= $pos AND sheet_id = $sheetId\r\n\r\n return LocalDB.select(\"line\", {\r\n pos: {\r\n '>=': pos\r\n },\r\n sheet_id\r\n }).then(res => {\r\n res.forEach(line => {\r\n LocalDB.update(\"line\", {\r\n id: line.id\r\n }, {\r\n pos: {\r\n '+': 1\r\n }\r\n })\r\n });\r\n //INSERT INTO `line` (`id`, `sheet_id`, `line_key`, `date`, `text`, `pos`) VALUES (NULL, '$sheetId', '$key', '$date', '$text', '$pos\r\n return LocalDB.insert(\"line\", {\r\n sheet_id,\r\n line_key,\r\n date,\r\n text,\r\n pos\r\n });\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n updateTitle(text, sheetId){\r\n this.addToStaging(sheetId);\r\n return LocalDB.update(\"sheet\", {\r\n id: sheetId\r\n }, {\r\n title: text\r\n });\r\n }\r\n\r\n // toStatus is true or false\r\n archiveUpdate(sheetId, toStatus){\r\n this.addToStaging(sheetId);\r\n return LocalDB.update(\"sheet\", {\r\n id: sheetId\r\n }, {\r\n active: toStatus ? 1 : 0\r\n });\r\n }\r\n\r\n deleteSheet(sheetId){\r\n this.addToStaging(sheetId);\r\n return LocalDB.delete(\"sheet\", {\r\n id: sheetId\r\n }).then(sheet => {\r\n return LocalDB.delete(\"line\", {sheet_id: sheetId});\r\n });\r\n }\r\n\r\n truncateDb(){\r\n return LocalDB.truncate();\r\n }\r\n\r\n updatePreference(pref, to){\r\n this.setData(pref, to);\r\n console.log(pref +\": \", to);\r\n if(this.isOnline()){\r\n Github.pushPreference(pref, to).then(res => {\r\n console.log(\"Cloud Preference Update: \", pref, to);\r\n });\r\n }\r\n }\r\n\r\n addToStaging(sheetId){\r\n if(sheetId == \"flush\"){\r\n this.setData(\"staging\", \"\");\r\n console.log(\"staging is flushed\");\r\n this.event.emit(\"sync\", \"flushed\");\r\n }else{\r\n let currentStaging = this.getData(\"staging\") || \"\";\r\n if(!currentStaging.includes(`|${sheetId}|`)){\r\n if(currentStaging){\r\n currentStaging += `,|${sheetId}|`;\r\n }else{\r\n currentStaging = `|${sheetId}|`;\r\n }\r\n this.setData(\"staging\", currentStaging);\r\n this.event.emit(\"sync\", currentStaging.split(\",\").length);\r\n console.log(\"Needs to sync: \", currentStaging);\r\n }\r\n }\r\n }\r\n\r\n setGistId(gistId){\r\n this.user.gist_id = gistId;\r\n var url = URL + \"user/\" + (DEVELOPMENT ? \"development\": \"\");\r\n var formData = new FormData();\r\n formData.append('gist_id', gistId);\r\n\r\n return fetch(url, { method: 'POST', credentials: 'include', body: formData })\r\n .then(res => res.json());\r\n }\r\n\r\n setData(key, data){\r\n\t\treturn localStorage.setItem(key, data);\r\n }\r\n\r\n getData(key){\r\n return localStorage.getItem(key);\r\n }\r\n}\r\n\r\nconst _api = new API();\r\nexport default _api;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\n\r\nimport API from '../../js/api';\r\nimport makeid from '../../js/makeid';\r\n\r\nclass App extends Component {\r\n\r\n state = {\r\n focused: false,\r\n pHeight: 0,\r\n text: this.props.children,\r\n }\r\n\r\n componentDidMount(){\r\n this.setState({\r\n pHeight: this.refs._lineText.scrollHeight\r\n });\r\n\r\n window.addEventListener('resize', (event) => {\r\n this.handleChange();\r\n });\r\n\r\n window.addEventListener('beforeunload', (event) => {\r\n if(this.state.focused && this.props.children != this.state.text){\r\n // Cancel the close/exit event and save the changes on this line if there is any\r\n this.props.onBlur(this.state.text, this.props.id, this.props.index);\r\n event.preventDefault();\r\n // Chrome requires returnValue to be set\r\n event.returnValue = '';\r\n }\r\n });\r\n\r\n if(this.props.focusOnRender){\r\n let lineText = this.refs._lineText;\r\n let cursorPosition = this.props.cursorPosition == \"end\" ? this.state.text.length : this.props.cursorPosition;\r\n lineText.focus();\r\n lineText.selectionStart = cursorPosition;\r\n lineText.selectionEnd = cursorPosition;\r\n }\r\n }\r\n\r\n componentWillReceiveProps(newProps){\r\n if(newProps.focusOnRender){\r\n let lineText = this.refs._lineText;\r\n let cursorPosition = newProps.cursorPosition == \"end\" ? this.state.text.length : newProps.cursorPosition;\r\n lineText.focus();\r\n lineText.selectionStart = cursorPosition;\r\n lineText.selectionEnd = cursorPosition;\r\n }\r\n }\r\n\r\n getHeight(text){\r\n let tArea = document.getElementById(\"dummyTextarea\");\r\n tArea.value = text;\r\n return tArea.scrollHeight;\r\n }\r\n\r\n handleChange(e){\r\n if(e){\r\n this.setState({text: e.target.value});\r\n API.event.emit(\"lineChanged\", e.target.value);\r\n //.replace(/(\\r\\n|\\n|\\r)/gm,\"\")\r\n }\r\n if(this.refs._lineText){\r\n let renderedHeight = this.getHeight(this.refs._lineText.value);\r\n\r\n if(renderedHeight != this.state.pHeight){\r\n this.setState({pHeight: renderedHeight});\r\n }\r\n }\r\n }\r\n\r\n handlePaste(e){\r\n let pasted = (e.clipboardData || window.clipboardData).getData('text');\r\n if(pasted.includes(\"\\n\\r\")){\r\n let add = pasted.split(\"\\n\\r\")[0];\r\n if(add[add.length - 1] == \"\\r\" || add[add.length - 1] == \"\\n\"){\r\n add = add.substr(0, add.length-1)\r\n }\r\n\r\n let selectionStart = this.refs._lineText.selectionStart;\r\n let selectionEnd = this.refs._lineText.selectionEnd;\r\n\r\n let topText = e.target.value.substr(0, selectionStart);\r\n let downText = e.target.value.substr(selectionEnd);\r\n this.setState({text: topText + add});\r\n setTimeout(() => {\r\n this.handleChange();\r\n }, 10);\r\n\r\n let restArray = pasted.split(\"\\n\\r\").slice(1);\r\n\r\n this.props.onPaste(this.props.id, restArray, this.props.index, downText);\r\n\r\n e.preventDefault();\r\n return false;\r\n }\r\n }\r\n\r\n handleKeyDown(e){\r\n if(e.keyCode == 13){ // 13 = \"\\n\"\r\n let selectionStart = this.refs._lineText.selectionStart;\r\n let selectionEnd = this.refs._lineText.selectionEnd;\r\n\r\n if(e.target.value == \"\"){\r\n this.props.onSplit(this.props.id, \"\", this.props.index);\r\n\r\n e.preventDefault();\r\n return false;\r\n }\r\n\r\n let newItemTest = e.target.value.substr(0, selectionStart).split(\"\\n\").pop();\r\n let rightOfCursor = e.target.value.substr(selectionStart).split(\"\\n\").slice(0, 1)[0];\r\n if(newItemTest.substr(0, 3) == \"\\t- \" && newItemTest != \"\\t- \"){\r\n let textString = e.target.value;\r\n let tailText = textString.substr(selectionEnd);\r\n if(tailText.substr(0, 1) == \" \"){\r\n // Space after the dash should merge\r\n tailText = tailText.substr(1);\r\n }\r\n\r\n this.setState({text: textString.substr(0, selectionStart) + '\\n\\t- ' + tailText});\r\n setTimeout(() => {\r\n this.refs._lineText.selectionStart = selectionStart + 4;\r\n this.refs._lineText.selectionEnd = selectionStart + 4;\r\n this.handleChange();\r\n }, 10);\r\n\r\n e.preventDefault();\r\n return false;\r\n }else if(newItemTest == \"\\t- \" && rightOfCursor == \"\"){\r\n let textString = e.target.value;\r\n this.setState({text: textString.substr(0, selectionStart - 4) + textString.substr(selectionEnd)});\r\n setTimeout(() => {\r\n this.refs._lineText.selectionStart = selectionStart - 3;\r\n this.refs._lineText.selectionEnd = selectionStart - 3;\r\n this.handleChange();\r\n }, 10);\r\n }else if(newItemTest == \"\\t- \" && rightOfCursor){\r\n\r\n let textString = e.target.value;\r\n this.setState({text: textString.substr(0, selectionStart - 3) + textString.substr(selectionEnd)});\r\n setTimeout(() => {\r\n this.refs._lineText.selectionStart = selectionStart - 3;\r\n this.refs._lineText.selectionEnd = selectionStart - 3;\r\n this.handleChange();\r\n }, 10);\r\n\r\n e.preventDefault();\r\n return false;\r\n }\r\n\r\n // Split the lines on double new line\r\n let ordinarySplit = e.target.value.substr(selectionStart-1, 1) == \"\\n\";\r\n let extraOrdinarySplit = e.target.value.substr(selectionStart, 1) == \"\\n\";\r\n if(ordinarySplit || extraOrdinarySplit){\r\n let nextLineText = e.target.value.substr(selectionEnd);\r\n\r\n if(ordinarySplit){\r\n this.setState({\r\n text: e.target.value.substr(0, selectionStart - 1)\r\n });\r\n this.props.onSplit(this.props.id, nextLineText, this.props.index);\r\n }else if(extraOrdinarySplit){\r\n this.setState({\r\n text: e.target.value.substr(0, selectionStart)\r\n });\r\n this.props.onSplit(this.props.id, nextLineText.substr(1), this.props.index);\r\n }\r\n\r\n setTimeout(() => {\r\n this.handleChange();\r\n }, 10);\r\n\r\n e.preventDefault();\r\n return false;\r\n }\r\n\r\n }else if(e.keyCode == 8){\r\n let selectionStart = this.refs._lineText.selectionStart;\r\n let selectionEnd = this.refs._lineText.selectionEnd;\r\n if(selectionStart == 0 && selectionEnd == 0 && this.props.index !== 0){\r\n\r\n this.props.onConcat(this.props.id, this.state.text, this.props.index, \"up\");\r\n e.preventDefault();\r\n return false;\r\n }else{\r\n let prevText = this.state.text.substr(selectionStart - 3, 3);\r\n if(prevText == \"\\t- \"){\r\n let textString = this.state.text;\r\n\r\n this.setState({text: textString.substr(0, selectionStart - 4) + textString.substr(selectionEnd)});\r\n setTimeout(() => {\r\n this.refs._lineText.selectionStart = selectionStart - 4;\r\n this.refs._lineText.selectionEnd = selectionStart - 4;\r\n this.handleChange();\r\n }, 10);\r\n\r\n e.preventDefault();\r\n return false;\r\n }\r\n }\r\n }else if(e.keyCode == 46){\r\n let selectionStart = this.refs._lineText.selectionStart;\r\n let selectionEnd = this.refs._lineText.selectionEnd;\r\n let currentTextLength = this.state.text.length;\r\n if(selectionStart == currentTextLength && selectionEnd == currentTextLength){\r\n\r\n this.props.onConcat(this.props.id, this.state.text, this.props.index, \"down\");\r\n e.preventDefault();\r\n return false;\r\n }\r\n }else if(e.keyCode == 39 || e.keyCode == 40){ // 37 38 = \"down\" \"right\"\r\n let selectionStart = this.refs._lineText.selectionStart;\r\n let selectionEnd = this.refs._lineText.selectionEnd;\r\n let textLength = this.state.text.length;\r\n\r\n if(selectionStart == textLength && selectionEnd == textLength){\r\n this.props.onCursor(e.keyCode, this.props.id, this.props.index);\r\n\r\n e.preventDefault();\r\n return false;\r\n }\r\n }else if(e.keyCode == 37 || e.keyCode == 38){ // 37 38 = \"up\" \"left\"\r\n let selectionStart = this.refs._lineText.selectionStart;\r\n let selectionEnd = this.refs._lineText.selectionEnd;\r\n\r\n if(selectionStart == 0 && selectionEnd == 0){\r\n this.props.onCursor(e.keyCode, this.props.id, this.props.index);\r\n\r\n e.preventDefault();\r\n return false;\r\n }\r\n }else if(e.keyCode == 9){ // 0 == \"\\t\"\r\n let selectionStart = this.refs._lineText.selectionStart;\r\n let selectionEnd = this.refs._lineText.selectionEnd;\r\n let textString = this.state.text;\r\n textString = textString.substr(0, selectionStart) + '\\t' + textString.substr(selectionEnd);\r\n this.setState({text: textString});\r\n\r\n setTimeout(() => {\r\n this.refs._lineText.selectionStart = selectionStart + 1;\r\n this.refs._lineText.selectionEnd = selectionStart + 1;\r\n }, 10);\r\n\r\n e.preventDefault();\r\n return false;\r\n\r\n }else if(e.keyCode == 189){ // 189 = \"-\"\r\n let selectionStart = this.refs._lineText.selectionStart;\r\n let selectionEnd = this.refs._lineText.selectionEnd;\r\n let textString = this.state.text;\r\n let prevText = this.state.text.substr(selectionStart - 1, 1);\r\n\r\n if(prevText === '\\n' || selectionStart === 0){\r\n let tailText = textString.substr(selectionEnd);\r\n if(tailText.substr(0, 1) == \" \"){\r\n // Space after the dash should merge\r\n tailText = tailText.substr(1);\r\n }\r\n this.setState({text: textString.substr(0, selectionStart) + '\\t- ' + tailText});\r\n setTimeout(() => {\r\n this.refs._lineText.selectionStart = selectionStart + 3;\r\n this.refs._lineText.selectionEnd = selectionStart + 3;\r\n }, 10);\r\n e.preventDefault();\r\n return false;\r\n }\r\n }else if(e.keyCode == 32){ // 32 = \" \"\r\n // Space after the dash should merge\r\n let selectionStart = this.refs._lineText.selectionStart;\r\n let selectionEnd = this.refs._lineText.selectionEnd;\r\n let prevText = this.state.text.substr(selectionStart - 2, 2);\r\n\r\n if(prevText === '- '){\r\n e.preventDefault();\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n handleFocus(){\r\n this.setState({focused: true});\r\n let pos = document.getElementById(\"content\").scrollTop + this.refs._lineText.getBoundingClientRect().top;\r\n API.event.emit(\"lineFocused\", {text: this.state.text, lineId: this.props.id, index: this.props.index, position: pos});\r\n }\r\n\r\n handleBlur(){\r\n this.setState({focused: false});\r\n this.props.onBlur(this.state.text, this.props.id, this.props.index);\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n
\r\n this.handleFocus()}\r\n onBlur={() => this.handleBlur()}\r\n onKeyDown={(event) => this.handleKeyDown(event)}\r\n onChange={(event) => this.handleChange(event)}\r\n onPaste={(event) => this.handlePaste(event)}>\r\n \r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\n\r\n\r\nclass App extends Component {\r\n\r\n state = {\r\n maximized: false\r\n }\r\n\r\n renderWindowsButtons(){\r\n const remote = window.require('electron').remote;\r\n let win = remote.getCurrentWindow();\r\n\r\n return (\r\n
\r\n
win.minimize()}>\r\n \r\n
\r\n {!this.state.maximized &&\r\n
{ this.setState({maximized: true}); win.maximize() }}>\r\n \r\n
\r\n }\r\n {this.state.maximized &&\r\n
{ this.setState({maximized: false}); win.unmaximize() }}>\r\n \r\n
\r\n }\r\n
win.close()}>\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n render() {\r\n if(window && window.process && window.process.type) {\r\n if(this.props.spacer){\r\n return (
);\r\n }else {\r\n return (\r\n
\r\n \r\n {window.process.platform != 'darwin' && this.renderWindowsButtons()}\r\n
\r\n );\r\n }\r\n }else{\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\n\r\nimport AppBar from '../AppBar'\r\n\r\nimport API from '../../js/api';\r\nimport Files from '../../js/files';\r\n\r\nclass App extends Component {\r\n\r\n state = {\r\n text: this.props.children,\r\n archived: !(this.props.sheet.active === 1),\r\n archiveProgress: false\r\n }\r\n\r\n componentDidMount(){\r\n if(this.state.text === \"Untitled Sheet\"){\r\n setTimeout(() => {\r\n this.refs._title.focus();\r\n },10);\r\n }\r\n }\r\n\r\n componentWillReceiveProps(newProps){\r\n if(this.props.shouldFocused !== newProps.shouldFocused && newProps.shouldFocused){\r\n setTimeout(() => {\r\n this.refs._title.focus();\r\n },10);\r\n }\r\n }\r\n\r\n handleChange(e){\r\n if(e){\r\n this.setState({text: e.target.value});\r\n //.replace(/(\\r\\n|\\n|\\r)/gm,\"\")\r\n }\r\n }\r\n\r\n handleBlur(e){\r\n let text = e.target.value;\r\n if(text !== this.props.sheet.title){\r\n if(!text){\r\n text = \"Untitled Sheet\";\r\n }\r\n document.title = text + \" | Memo\";\r\n API.updateTitle(text, this.props.sheet.id);\r\n }\r\n }\r\n\r\n handleKeyDown(e){\r\n let selectionStart = this.refs._title.selectionStart;\r\n let selectionEnd = this.refs._title.selectionEnd;\r\n\r\n if(e.keyCode === 13 || (selectionStart === selectionStart && e.keyCode === 39 && selectionStart === this.state.text.length) || e.keyCode === 40){\r\n this.props.onTitleDown();\r\n e.preventDefault();\r\n return false;\r\n }\r\n }\r\n\r\n exportAction(){\r\n Files.exportFile(this.props.sheet.id).then(res => {\r\n console.log(\"File export started\");\r\n });\r\n }\r\n\r\n archiveAction(){\r\n let currentStatus = this.state.archived;\r\n let toStatus = currentStatus;\r\n this.setState({\r\n archiveProgress: true\r\n })\r\n\r\n API.archiveUpdate(this.props.sheet.id, toStatus).then(() => {\r\n setTimeout(() => {\r\n this.setState({\r\n archived: !currentStatus,\r\n archiveProgress: false\r\n })\r\n }, 100);\r\n });\r\n }\r\n\r\n deleteAction(){\r\n API.deleteSheet(this.props.sheet.id);\r\n API.event.emit(\"sheet\", \"LAST_ACCESSED\");\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n
\r\n this.handleKeyDown(event)}\r\n onBlur={(event) => this.handleBlur(event)}\r\n onChange={(event) => this.handleChange(event)}/>\r\n\r\n
\r\n
this.exportAction()}>\r\n \r\n Export\r\n
\r\n
this.archiveAction()}>\r\n \r\n {!this.state.archiveProgress && {this.state.archived ? \"Unarchive\" : \"Archive\"}}\r\n {this.state.archiveProgress && · · ·}\r\n
\r\n
this.deleteAction()}>\r\n \r\n Delete\r\n
\r\n
\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\nimport API from '../../js/api';\r\n\r\nlet addons = [\r\n require('../../addons/write-good/addon.json'),\r\n require('../../addons/conversion/addon.json'),\r\n require('../../addons/links/addon.json'),\r\n require('../../addons/calculator/addon.json')\r\n]\r\n\r\n\r\nclass App extends Component {\r\n state = {\r\n addons: API.getData(\"addons\") != null ? API.getData(\"addons\") : API.defaultAddons\r\n }\r\n\r\n toggleAddon(slug){\r\n let addons = this.state.addons;\r\n if(addons.includes(\"|\" + slug + \"|\")){\r\n addons = addons.replace(\"|\" + slug + \"|\", \"\");\r\n }else{\r\n addons = addons + \"|\" +slug+ \"|\";\r\n }\r\n\r\n API.event.emit(\"addonsUpdated\", addons);\r\n this.setState({addons});\r\n API.updatePreference(\"addons\", addons);\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n

Addons

\r\n

Discover and add tools to customise your note taking experience.

\r\n {\r\n addons.map((addon, i) => {\r\n return (\r\n this.toggleAddon(addon.slug)}>\r\n
\r\n {addon.display}\r\n \r\n
\r\n
{addon.description}
\r\n
\r\n
\r\n )\r\n })\r\n }\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\nimport API from '../../js/api';\r\n\r\nconst quoteRand = Math.floor(Math.random() * (4 - 0 + 1) ) + 0;\r\n\r\nclass App extends Component {\r\n\r\n state = {\r\n spinning: true\r\n }\r\n\r\n componentDidMount(){\r\n API.event.on(\"loginButton\", () => {\r\n this.setState({spinning: false});\r\n });\r\n\r\n API.event.on(\"checkingUpdates\", () => {\r\n this.setState({statusText: \"Checking for updates...\"});\r\n });\r\n\r\n API.event.on(\"fetching\", () => {\r\n this.setState({statusText: \"Processing data from GitHub...\"});\r\n });\r\n\r\n API.event.on(\"fetched\", () => {\r\n this.setState({statusText: \"\"});\r\n });\r\n\r\n\r\n }\r\n\r\n renderQuote(){\r\n let quoteArray = [\r\n {\r\n person: \"Muhammed Ali\",\r\n quote: \"Wake up everyday, expecting resistance, and push through it!\"\r\n },\r\n {\r\n person: \"Bruce Lee\",\r\n quote: \"There are no limits. There are only plateaus, and you must not stay there, you must go beyond them.\"\r\n },\r\n {\r\n person: \"Walt Disney\",\r\n quote: \"When you believe in a thing, believe in it all the way, implicitly and unquestionable.\"\r\n },\r\n {\r\n person: \"Nelson Mandela\",\r\n quote: \"It always seems impossible until it's done.\"\r\n },\r\n {\r\n person: \"Kobe Bryant\",\r\n quote: \"If you’re afraid to fail, then you’re probably going to fail.\"\r\n }\r\n ];\r\n\r\n let quote = quoteArray[quoteRand];\r\n\r\n return (\r\n
\r\n

{quote.quote}

\r\n
\r\n {quote.person}\r\n
\r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n {this.props.quote && }\r\n {this.state.spinning &&\r\n <>\r\n
\r\n
\r\n
\r\n \r\n }\r\n
{this.props.children}
\r\n {this.props.quote && this.renderQuote()}\r\n {this.state.statusText &&
{this.state.statusText}
}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\n\r\nimport API from '../../js/api';\r\nimport Loading from '../../components/Loading';\r\n\r\nclass App extends Component {\r\n state = {\r\n sheets: [],\r\n noSheets: false\r\n }\r\n\r\n componentDidMount(){\r\n API.getSheets(0).then(sheets => {\r\n if(sheets.length){\r\n this.setState({sheets});\r\n }else{\r\n this.setState({noSheets: true});\r\n }\r\n });\r\n }\r\n\r\n renderSheets(sheets){\r\n if(sheets.length){\r\n return sheets.map(sheet => {\r\n let date = new Date(sheet.created_at * 1000);\r\n return (\r\n API.event.emit(\"sheet\", sheet.id)}>\r\n
\r\n {sheet.title}\r\n
{sheet.first_line ? sheet.first_line.substr(0, 50).replace(/-/g, \"\") + \"...\" : \"This sheet is as empty as it can be...\"}
\r\n\r\n
\r\n {date.getDate() + \"/\" + date.getMonth() + \"/\" + date.getFullYear()}\r\n {sheet.first_line &&\r\n {sheet.line_count} Line{sheet.line_count != 1 ? \"s\": \"\"}\r\n }\r\n {!sheet.first_line &&\r\n Blank\r\n }\r\n
\r\n
\r\n \r\n );\r\n });\r\n }else{\r\n if(this.state.noSheets){\r\n return (
You don't have any archived sheets!
);\r\n }else{\r\n return ();\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n

Archives

\r\n

See and manage your old and not-so-popular sheets.

\r\n
\r\n {this.renderSheets(this.state.sheets)}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\nimport API from '../../js/api';\r\nimport Loading from '../../components/Loading';\r\n\r\nclass App extends Component {\r\n\r\n state = {\r\n syncText: API.getData(\"staging\") ? \"Push Changes\" : \"No Local Changes\",\r\n staged: API.getData(\"staging\") ? API.getData(\"staging\") : \"\",\r\n error: \"\"\r\n }\r\n\r\n componentDidMount(){\r\n API.event.on(\"sync\", this.syncAction);\r\n API.event.on(\"syncError\", this.syncErrorAction);\r\n }\r\n\r\n componentWillUnmount(){\r\n API.event.removeListener(\"sync\", this.syncAction);\r\n API.event.removeListener(\"syncError\", this.syncErrorAction);\r\n }\r\n\r\n syncAction = (status) => {\r\n if(status == \"flushed\"){\r\n this.setState({syncText: \"No Local Changes\", staged: API.getData(\"staging\")});\r\n }else{\r\n this.setState({syncText: \"Push Changes\", staged: API.getData(\"staging\")});\r\n }\r\n }\r\n\r\n syncErrorAction = (err) => {\r\n this.setState({syncText: \"Error Occured!\", error: String(err)});\r\n }\r\n\r\n renderChanges(staging){\r\n if(staging){\r\n let staged = staging.split(\",\");\r\n return staged.map((sheet, i) => {\r\n let sheetId = Number(sheet.replace(/\\|/g, \"\"));\r\n return (\r\n API.event.emit(\"sheet\", sheetId)}>\r\n
Changed sheet with id {sheetId}
\r\n \r\n )\r\n })\r\n }else{\r\n return (
Your local sheets are in sync with the origin.
);\r\n }\r\n }\r\n\r\n startSync(){\r\n if(this.state.staged){\r\n this.setState({syncText: \"Syncing...\", staged: \"\"});\r\n API.sync();\r\n }else{\r\n console.log(\"Already Synced\");\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n

Push Changes

\r\n

You can push changes to your Gist and sync your data.

\r\n\r\n
\r\n {API.isOnline() &&\r\n this.startSync()}>\r\n \r\n \r\n \r\n {this.state.syncText}\r\n
\r\n }\r\n {(this.state.error != \"\") &&\r\n
{this.state.error}
Please try to login again by window.location.reload()}>restarting the app.
\r\n }\r\n {!API.isOnline() &&
You are in offline mode.
Please connect to internet and window.location.reload()}>restart the app.
}\r\n {(API.isOnline() && (this.state.error == \"\")) && this.renderChanges(this.state.staged)}\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\nimport API from '../../js/api';\r\nimport Loading from '../../components/Loading';\r\n\r\nclass App extends Component {\r\n\r\n state = {\r\n searchTerm: \"\",\r\n sheets: [],\r\n noSheets: false\r\n }\r\n\r\n componentDidMount(){\r\n setTimeout(() => {\r\n this.refs._searchInput.focus();\r\n\r\n }, 200);\r\n }\r\n\r\n handleChange(e){\r\n if(e){\r\n let searchTerm = e.target.value;\r\n this.setState({searchTerm});\r\n API.searchSheets(searchTerm).then(sheets => {\r\n\r\n let noSheets = (sheets.length === 0);\r\n this.setState({sheets, noSheets});\r\n })\r\n }\r\n }\r\n\r\n renderSheets(sheets){\r\n if(sheets.length){\r\n return sheets.map(sheet => {\r\n let date = new Date(sheet.created_at * 1000);\r\n return (\r\n API.event.emit(\"sheet\", sheet.id)}>\r\n
\r\n {sheet.title}\r\n
{sheet.first_line ? sheet.first_line.substr(0, 50).replace(/-/g, \"\") + \"...\" : \"This sheet is as empty as it can be...\"}
\r\n\r\n
\r\n {date.getDate() + \"/\" + (date.getMonth() + 1) + \"/\" + date.getFullYear()}\r\n {sheet.first_line &&\r\n {sheet.line_count} Line{sheet.line_count != 1 ? \"s\": \"\"}\r\n }\r\n {!sheet.first_line &&\r\n Blank\r\n }\r\n
\r\n
\r\n \r\n );\r\n });\r\n }else{\r\n if(this.state.noSheets){\r\n return (
No results with this term
);\r\n }else{\r\n return ();\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n
\r\n

Search

\r\n

Search for a term in title or content of your notes.

\r\n
\r\n this.handleChange(event)}/>\r\n\r\n
\r\n { this.state.searchTerm && this.renderSheets(this.state.sheets)}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\nimport API from \"../../js/api\"\r\n\r\nclass App extends Component {\r\n\r\n state = {\r\n theme: API.getTheme(),\r\n toggleUserOptions: false\r\n }\r\n\r\n changeTheme(changeTo){\r\n this.setState({theme: changeTo})\r\n API.event.emit(\"theme\", changeTo);\r\n }\r\n\r\n changeCurrency(event){\r\n API.updatePreference(\"currency\", event.target.value);\r\n }\r\n\r\n render() {\r\n let currencies = [\"CAD\", \"HKD\", \"ISK\", \"PHP\", \"DKK\", \"HUF\", \"CZK\", \"GBP\", \"RON\", \"SEK\", \"IDR\", \"INR\", \"BRL\", \"RUB\", \"HRK\", \"JPY\", \"THB\", \"CHF\", \"EUR\", \"MYR\", \"BGN\", \"TRY\", \"CNY\", \"NOK\", \"NZD\", \"ZAR\", \"USD\", \"MXN\", \"SGD\", \"AUD\", \"ILS\", \"KRW\", \"PLN\" ];\r\n let handle = API.user.username ? API.user.username : API.user.email.split(\"@\")[0];\r\n\r\n return (\r\n
\r\n

Settings

\r\n

Manage your preferences and access your account information.

\r\n
Choose Your Side
\r\n
\r\n
this.changeTheme(\"dark\")} className={this.state.theme == \"dark\" ? \"darkTheme themeActive\" : \"darkTheme\"}>\r\n
\r\n \r\n
\r\n
\r\n
\r\n
this.changeTheme(\"light\")} className={this.state.theme == \"light\" ? \"lightTheme themeActive\" : \"lightTheme\"}>\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
Currency Preference
\r\n

Choose your prefered currency that will be used for addons.

\r\n \r\n <>\r\n
Revision History
\r\n

In case of data loss, you can use your Gist revisions and see your change history.

\r\n {API.user &&\r\n \r\n
See Your Gist Revisions
\r\n
\r\n }\r\n \r\n {!API.user &&\r\n
Only Available Online
\r\n }\r\n

Memo App v{API.version} {API.version[0] == \"0\" && \"Beta\"}

\r\n
\r\n {API.isOnline() &&\r\n
\r\n
\r\n \r\n
\r\n
{API.user.name ? API.user.name : handle[0].toUpperCase() + handle.substr(1)}
\r\n
@{handle}
\r\n
\r\n
{\r\n let toggleUserOptions = this.state.toggleUserOptions;\r\n this.setState({toggleUserOptions: !toggleUserOptions});\r\n }}>\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n }\r\n {!API.isOnline() &&\r\n

\r\n You are in offline mode.\r\n
\r\n \r\n You can login the app when you have internet.
\r\n window.location.reload()}>Try to login?\r\n
\r\n

\r\n }\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\n\r\nimport API from '../../js/api';\r\nimport Loading from '../../components/Loading';\r\n\r\nclass App extends Component {\r\n state = {\r\n sheets: [],\r\n noSheets: false,\r\n archivedSheetCount: 0\r\n }\r\n\r\n componentDidMount(){\r\n API.getSheets(1).then(sheets => {\r\n if(sheets.length){\r\n this.setState({sheets});\r\n }else{\r\n this.setState({noSheets: true});\r\n }\r\n });\r\n\r\n API.getSheets(0, true).then(sheetCount => {\r\n this.setState({archivedSheetCount: sheetCount});\r\n });\r\n }\r\n\r\n renderSheets(sheets){\r\n if(sheets.length){\r\n return sheets.map(sheet => {\r\n let date = new Date(sheet.created_at * 1000);\r\n return (\r\n API.event.emit(\"sheet\", sheet.id)}>\r\n
\r\n {sheet.title}\r\n
{sheet.first_line ? sheet.first_line.substr(0, 50).replace(/-/g, \"\") + \"...\" : \"This sheet is as empty as it can be...\"}
\r\n\r\n
\r\n {date.getDate() + \"/\" + (date.getMonth() + 1) + \"/\" + date.getFullYear()}\r\n {sheet.first_line &&\r\n {sheet.line_count} Line{sheet.line_count != 1 ? \"s\": \"\"}\r\n }\r\n {!sheet.first_line &&\r\n Blank\r\n }\r\n
\r\n
\r\n \r\n );\r\n });\r\n }else{\r\n if(this.state.noSheets){\r\n return (
You don't have any active sheets, add a new one or check your archives!
);\r\n }else{\r\n return ();\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n

Sheets

\r\n

See and manage your most recently accessed sheets.

\r\n
\r\n API.event.emit(\"sheet\", \"NEW_SHEET\")}>\r\n \r\n Create New Sheet\r\n
\r\n {this.renderSheets(this.state.sheets)}\r\n {this.state.archivedSheetCount != 0 &&\r\n API.event.emit(\"toggle\", \"archives\")}>\r\n
You also have {this.state.archivedSheetCount} archived sheet{this.state.archivedSheetCount !== 1 ? \"s\" : \"\"}.
\r\n
\r\n }\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\n\r\nimport { Addons, Archives, Push, Search, Settings, Sheets } from '../../tabs'\r\n\r\nimport API from '../../js/api';\r\n\r\nclass App extends Component {\r\n state = {\r\n toggled: false,\r\n transition: 0,\r\n currentTab: false,\r\n tabTransition: 0,\r\n stagedAmount: API.getData(\"staging\") ? API.getData(\"staging\").split(\",\").length : 0\r\n }\r\n\r\n componentDidMount(){\r\n\r\n API.event.on(\"sync\", status => {\r\n if(status == \"flushed\"){\r\n this.setState({stagedAmount: 0});\r\n }else{\r\n this.setState({stagedAmount: status});\r\n }\r\n })\r\n\r\n API.event.on(\"toggle\", (tab) => {\r\n if(tab !== false){\r\n if(this.state.currentTab != tab){\r\n if(this.state.currentTab != false){\r\n this.setState({\r\n tabTransition: 0\r\n });\r\n setTimeout(() => {\r\n this.setState({\r\n currentTab: tab,\r\n tabTransition: 1\r\n });\r\n }, 200);\r\n }else{\r\n this.setState({\r\n currentTab: tab,\r\n tabTransition: 1\r\n });\r\n setTimeout(() => {\r\n this.setState({\r\n transition: 1\r\n });\r\n }, 10);\r\n }\r\n }\r\n }else{\r\n this.setState({\r\n transition: 0,\r\n tabTransition: 0\r\n });\r\n setTimeout(() => {\r\n this.setState({\r\n currentTab: false\r\n });\r\n }, 300);\r\n }\r\n });\r\n }\r\n\r\n renderTabContent(tab){\r\n switch (tab) {\r\n case \"addons\":\r\n return ;\r\n break;\r\n case \"archives\":\r\n return ;\r\n break;\r\n case \"push\":\r\n return ;\r\n break;\r\n case \"search\":\r\n return ;\r\n break;\r\n case \"settings\":\r\n return ;\r\n break;\r\n case \"sheets\":\r\n return ;\r\n break;\r\n default:\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n API.event.emit(\"toggle\", false)}>\r\n \r\n
\r\n\r\n {this.state.currentTab &&\r\n
\r\n
API.event.emit(\"toggle\", false)}>\r\n \r\n
\r\n
\r\n }\r\n
\r\n
\r\n
API.event.emit(\"toggle\", \"search\")}>\r\n
Search
\r\n \r\n
\r\n
API.event.emit(\"toggle\", \"sheets\")}>\r\n
Sheets
\r\n \r\n
\r\n
API.event.emit(\"toggle\", \"archives\")}>\r\n
Archives
\r\n \r\n
\r\n
\r\n
\r\n\r\n
API.event.emit(\"toggle\", \"push\")}>\r\n
Push
\r\n \r\n {this.state.stagedAmount == 0 && }\r\n {this.state.stagedAmount != 0 && }\r\n \r\n {this.state.stagedAmount != 0 &&
}\r\n
\r\n
API.event.emit(\"toggle\", \"addons\")}>\r\n
Addons
\r\n \r\n
\r\n
API.event.emit(\"toggle\", \"settings\")}>\r\n
Settings
\r\n \r\n
\r\n
\r\n
\r\n
\r\n {this.renderTabContent(this.state.currentTab)}\r\n
\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\nimport API from '../../js/api';\r\n\r\nimport writeGood from \"write-good\";\r\n\r\nconst THROTTLE_LIMIT = 5; // fire for every 5 changes\r\n\r\nclass App extends Component {\r\n state = {\r\n text: \"\"\r\n }\r\n\r\n componentDidMount(){\r\n this.throttleCounter = 0;\r\n API.event.on(\"lineFocused\", this.lineFocusedAction);\r\n API.event.on(\"lineChanged\", this.lineChangedAction);\r\n }\r\n\r\n componentWillUnmount(){\r\n API.event.removeListener(\"lineFocused\", this.lineFocusedAction);\r\n API.event.removeListener(\"lineChanged\", this.lineFocusedAction);\r\n }\r\n\r\n lineFocusedAction = (line) => {\r\n this.setState({\r\n text: line.text,\r\n lineId: line.lineId,\r\n index: line.index\r\n });\r\n }\r\n\r\n lineChangedAction = (text) => {\r\n if(this.throttleCounter === THROTTLE_LIMIT){\r\n this.setState({text});\r\n this.throttleCounter = 0;\r\n }\r\n this.throttleCounter++;\r\n }\r\n\r\n\r\n render() {\r\n if(this.state.text){\r\n let writeGoodSuggestions = writeGood(this.state.text);\r\n if(writeGoodSuggestions.length){\r\n return (\r\n <>\r\n
\r\n API.event.emit(\"toggle\", \"addons\")}>\r\n \r\n \r\n
Write-Good
\r\n
{writeGoodSuggestions.map((s, i) => {\r\n return (
{s.reason}
)\r\n })}
\r\n
\r\n \r\n );\r\n }else{\r\n return null;\r\n }\r\n }else{\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\nimport API from '../../js/api';\r\n\r\nconst addon = require(\"./addon.json\");\r\n\r\nlet DEFAULT_CURRENCY = API.getData(\"currency\") ? API.getData(\"currency\").toLowerCase() : \"usd\";\r\nlet DEFAULT_CURRENCY_SYMBOL = \"\";\r\nlet currencies = [\r\n {\r\n ticker: \"usd\",\r\n symbol: \"$\",\r\n usdFactor: 1\r\n },{\r\n ticker: \"eur\",\r\n symbol: \"€\",\r\n usdFactor: 0.91\r\n },\r\n {\r\n ticker: \"try\",\r\n symbol: \"₺\",\r\n usdFactor: 5.85\r\n },\r\n {\r\n ticker: \"gbp\",\r\n symbol: \"£\",\r\n usdFactor: 0.75\r\n },\r\n {\r\n ticker: \"cad\",\r\n symbol: \"c$\",\r\n usdFactor: 1.33\r\n }\r\n];\r\n\r\nlet defaultCurrency = currencies.filter(curr => curr.ticker === DEFAULT_CURRENCY);\r\nif(defaultCurrency.length === 1){\r\n DEFAULT_CURRENCY_SYMBOL = currencies.filter(curr => curr.ticker === DEFAULT_CURRENCY)[0].symbol;\r\n}\r\n\r\n// get live rates\r\nAPI.getConversions().then(conv => {\r\n currencies = [\r\n {\r\n ticker: \"usd\",\r\n symbol: \"$\",\r\n usdFactor: 1\r\n },{\r\n ticker: \"eur\",\r\n symbol: \"€\",\r\n usdFactor: Number(conv.rates[\"EUR\"]).toFixed(2)\r\n },\r\n {\r\n ticker: \"try\",\r\n symbol: \"₺\",\r\n usdFactor: Number(conv.rates[\"TRY\"]).toFixed(2)\r\n },\r\n {\r\n ticker: \"gbp\",\r\n symbol: \"£\",\r\n usdFactor: Number(conv.rates[\"GBP\"]).toFixed(2)\r\n },\r\n {\r\n ticker: \"cad\",\r\n symbol: \"c$\",\r\n usdFactor: Number(conv.rates[\"CAD\"]).toFixed(2)\r\n }\r\n ];\r\n\r\n\r\n let defaultCurrency = currencies.filter(curr => curr.ticker === DEFAULT_CURRENCY);\r\n if(defaultCurrency.length === 0){\r\n currencies.push({\r\n ticker: DEFAULT_CURRENCY,\r\n symbol: \"\",\r\n usdFactor: Number(conv.rates[DEFAULT_CURRENCY.toUpperCase()]).toFixed(2)\r\n });\r\n }\r\n});\r\n\r\n\r\nlet toArray = [];\r\ncurrencies.forEach(currency1 => {\r\n currencies.forEach(currency2 => {\r\n if(currency1 !== currency2){\r\n toArray.push(`${currency1.ticker} to ${currency2.ticker}`);\r\n }\r\n });\r\n});\r\n\r\nlet inArray = [];\r\ncurrencies.forEach(currency1 => {\r\n currencies.forEach(currency2 => {\r\n if(currency1 !== currency2){\r\n inArray.push(`${currency1.ticker} in ${currency2.ticker}`);\r\n }\r\n });\r\n});\r\n\r\nclass App extends Component {\r\n state = {\r\n text: \"\"\r\n }\r\n\r\n componentDidMount(){\r\n API.event.on(\"lineFocused\", this.lineFocusedAction);\r\n API.event.on(\"lineChanged\", this.lineChangedAction);\r\n }\r\n\r\n componentWillUnmount(){\r\n API.event.removeListener(\"lineFocused\", this.lineFocusedAction);\r\n API.event.removeListener(\"lineChanged\", this.lineFocusedAction);\r\n }\r\n\r\n lineFocusedAction = (line) => {\r\n this.setState({\r\n text: line.text,\r\n lineId: line.lineId,\r\n index: line.index\r\n });\r\n }\r\n\r\n lineChangedAction = (text) => {\r\n if(currencies.some((curr) => text.includes(curr.ticker) || text.includes(curr.symbol))){\r\n this.setState({text});\r\n }\r\n }\r\n\r\n parseConversion(text){\r\n if (text.length < 6){\r\n return;\r\n }\r\n let parseableArray = [];\r\n text = text.toLowerCase();\r\n inArray.forEach((inText, i) => {\r\n text = text.replace(new RegExp(inText, 'g'), toArray[i]);\r\n });\r\n\r\n let i = 0;\r\n while(i < toArray.length){\r\n if(text.includes(toArray[i])){\r\n let splittedParser = text.split(toArray[i]);\r\n let j = 0;\r\n while (j < splittedParser.length - 1) {\r\n\r\n let splittedSpace = splittedParser[j].trim().split(/\\s+/);\r\n let amount = 0;\r\n if(splittedSpace[splittedSpace.length - 1]){\r\n let numberString = splittedSpace[splittedSpace.length - 1].replace(\",\", \".\");\r\n\r\n if(numberString.split(\".\")[1]){\r\n if(numberString.split(\".\")[1].length === 3){\r\n numberString = numberString.replace(\".\", \"\");\r\n }\r\n }\r\n amount = Number(numberString);\r\n }else{\r\n let numberString = splittedSpace[splittedSpace.length - 2].replace(\",\", \".\");\r\n\r\n if(numberString.split(\".\")[1]){\r\n if(numberString.split(\".\")[1].length === 3){\r\n numberString = numberString.replace(\".\", \"\");\r\n }\r\n }\r\n amount = Number(numberString);\r\n }\r\n if(amount && !isNaN(amount) && amount !== 0){\r\n parseableArray.push({amount: amount, from: toArray[i].split(\" to \")[0].toLowerCase(), to: toArray[i].split(\" to \")[1].toLowerCase()});\r\n }\r\n\r\n j++;\r\n }\r\n }\r\n i++;\r\n }\r\n\r\n toArray.forEach((toText, i) => {\r\n text = text.replace(new RegExp(toText, 'g'), \"\");\r\n });\r\n i = 0;\r\n\r\n while(i < currencies.length){\r\n if(text.includes(currencies[i].ticker) && currencies[i].ticker !== DEFAULT_CURRENCY){\r\n let splittedParser = text.split(currencies[i].ticker);\r\n let j = 0;\r\n while (j < splittedParser.length - 1) {\r\n let splittedSpace = splittedParser[j].trim().split(/\\s+/);\r\n let amount = 0;\r\n if(splittedSpace[splittedSpace.length - 1]){\r\n let numberString = splittedSpace[splittedSpace.length - 1].replace(\",\", \".\");\r\n\r\n if(numberString.split(\".\")[1]){\r\n if(numberString.split(\".\")[1].length === 3){\r\n numberString = numberString.replace(\".\", \"\");\r\n }\r\n }\r\n amount = Number(numberString);\r\n }else{\r\n let numberString = splittedSpace[splittedSpace.length - 2].replace(\",\", \".\");\r\n\r\n if(numberString.split(\".\")[1]){\r\n if(numberString.split(\".\")[1].length === 3){\r\n numberString = numberString.replace(\".\", \"\");\r\n }\r\n }\r\n amount = Number(numberString);\r\n }\r\n if(amount && !isNaN(amount) && amount !== 0){\r\n parseableArray.push({amount: amount, from: currencies[i].ticker, to: DEFAULT_CURRENCY});\r\n }\r\n j++;\r\n }\r\n }\r\n i++;\r\n }\r\n\r\n i = 0;\r\n while(i < currencies.length){\r\n if(text.includes(currencies[i].symbol) && currencies[i].symbol !== DEFAULT_CURRENCY_SYMBOL){\r\n let splittedParser = text.split(currencies[i].symbol);\r\n let j = 1;\r\n while (j < splittedParser.length) {\r\n let splittedSpace = splittedParser[j].trim().split(/\\s+/);\r\n let amount = 0;\r\n if(splittedSpace[0]){\r\n let numberString = splittedSpace[0].replace(\",\", \".\");\r\n\r\n if(numberString.split(\".\")[1]){\r\n if(numberString.split(\".\")[1].length === 3){\r\n numberString = numberString.replace(\".\", \"\");\r\n }\r\n }\r\n amount = Number(numberString);\r\n }else if(splittedSpace[1]){\r\n let numberString = splittedSpace[1].replace(\",\", \".\");\r\n\r\n if(numberString.split(\".\")[1]){\r\n if(numberString.split(\".\")[1].length === 3){\r\n numberString = numberString.replace(\".\", \"\");\r\n }\r\n }\r\n amount = Number(numberString);\r\n }\r\n if(amount && !isNaN(amount) && amount !== 0){\r\n parseableArray.push({amount: amount, from: currencies[i].ticker, to: DEFAULT_CURRENCY});\r\n }\r\n j++;\r\n }\r\n }\r\n i++;\r\n }\r\n\r\n return parseableArray.map((conversion, i) => {\r\n return (\r\n
{String(conversion.amount).replace(\".\", \",\")} {conversion.from.toUpperCase()} = {(conversion.amount / currencies.filter(c => c.ticker === conversion.from)[0].usdFactor * currencies.filter(c => c.ticker === conversion.to)[0].usdFactor).toFixed(2).replace(/\\d(?=(\\d{3})+\\.)/g, '$&,')} {conversion.to.toUpperCase()}
\r\n );\r\n });\r\n }\r\n\r\n render() {\r\n if(this.state.text !== \"\"){\r\n let parsed = this.parseConversion(this.state.text);\r\n if(typeof parsed === \"object\"){\r\n if(parsed.length !== 0){\r\n return (\r\n <>\r\n
\r\n API.event.emit(\"toggle\", \"addons\")}>\r\n \r\n \r\n
{addon.display}
\r\n
{parsed}
\r\n
\r\n \r\n );\r\n }else{\r\n return null;\r\n }\r\n }else{\r\n return null;\r\n }\r\n }else{\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\nimport API from '../../js/api';\r\n\r\nconst addon = require(\"./addon.json\");\r\n\r\nfunction evil(fn) {\r\n try{\r\n return new Function('return ' + fn)();\r\n } catch(err){\r\n return \"NaN\";\r\n }\r\n}\r\n\r\nclass App extends Component {\r\n state = {\r\n text: \"\"\r\n }\r\n\r\n componentDidMount(){\r\n API.event.on(\"lineFocused\", this.lineFocusedAction);\r\n API.event.on(\"lineChanged\", this.lineChangedAction);\r\n }\r\n\r\n componentWillUnmount(){\r\n API.event.removeListener(\"lineFocused\", this.lineFocusedAction);\r\n API.event.removeListener(\"lineChanged\", this.lineFocusedAction);\r\n }\r\n\r\n lineFocusedAction = (line) => {\r\n this.setState({\r\n text: line.text,\r\n lineId: line.lineId,\r\n index: line.index\r\n });\r\n }\r\n\r\n lineChangedAction = (text) => {\r\n this.setState({text});\r\n }\r\n\r\n\r\n renderCalculated(text){\r\n text = text.replace(/\\) =/g, \")=\");\r\n if(text.includes(\")=\")){\r\n let calculatables = [];\r\n text.split(\")=\").forEach(calculatable => {\r\n if(calculatable.includes(\"(\")){\r\n calculatables.push(calculatable.split(\"(\").slice(1).join(\"(\"));\r\n }\r\n })\r\n return calculatables.map((calcable, i) => {\r\n return
[{i+1}] = {evil(calcable)}
\r\n });\r\n }else{\r\n return null;\r\n }\r\n }\r\n\r\n render() {\r\n if(this.state.text){\r\n let includes = this.state.text.replace(\") =\", \")=\").includes(\")=\");\r\n if(includes){\r\n return (\r\n <>\r\n
\r\n API.event.emit(\"toggle\", \"addons\")}>\r\n \r\n \r\n
{addon.display}
\r\n
{this.renderCalculated(this.state.text)}
\r\n
\r\n \r\n );\r\n }else{\r\n return null;\r\n }\r\n }else{\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\nimport API from '../../js/api';\r\n\r\nconst addon = require(\"./addon.json\");\r\n\r\nclass App extends Component {\r\n state = {\r\n text: \"\"\r\n }\r\n\r\n componentDidMount(){\r\n API.event.on(\"lineFocused\", this.lineFocusedAction);\r\n API.event.on(\"lineChanged\", this.lineChangedAction);\r\n }\r\n\r\n componentWillUnmount(){\r\n API.event.removeListener(\"lineFocused\", this.lineFocusedAction);\r\n API.event.removeListener(\"lineChanged\", this.lineFocusedAction);\r\n }\r\n\r\n lineFocusedAction = (line) => {\r\n this.setState({\r\n text: line.text,\r\n lineId: line.lineId,\r\n index: line.index\r\n });\r\n }\r\n\r\n lineChangedAction = (text) => {\r\n this.setState({text});\r\n }\r\n\r\n renderLinks(text){\r\n let links = text.match(/http[^\\s]*/g);\r\n return links.map((link, i) => {\r\n if(link.endsWith(\".png\") || link.endsWith(\".jpg\") || link.endsWith(\".gif\") || link.endsWith(\".svg\") || link.endsWith(\".JPG\") || link.endsWith(\".jpeg\") || link.endsWith(\".JPEG\")){\r\n return
\r\n }else{\r\n if(link.includes(\"//\")){\r\n return Link from {link.split(\"//\")[1].split(\"/\")[0]}\r\n }else{\r\n return null;\r\n }\r\n }\r\n });\r\n }\r\n\r\n render() {\r\n if(this.state.text){\r\n let includes = this.state.text.includes(\"http\");\r\n if(includes){\r\n return (\r\n <>\r\n
\r\n API.event.emit(\"toggle\", \"addons\")}>\r\n \r\n \r\n
{addon.display}
\r\n

{this.renderLinks(this.state.text)}

\r\n
\r\n \r\n );\r\n }else{\r\n return null;\r\n }\r\n }else{\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\nimport API from '../../js/api';\r\n\r\nimport WriteGood from '../../addons/write-good/';\r\nimport Conversion from '../../addons/conversion/';\r\nimport Calculator from '../../addons/calculator/';\r\nimport Links from '../../addons/links/';\r\n\r\nclass App extends Component {\r\n state = {\r\n addons: API.getData(\"addons\") != null ? API.getData(\"addons\") : API.defaultAddons,\r\n position: 0\r\n }\r\n\r\n componentDidMount(){\r\n\r\n API.event.on(\"lineFocused\", (line) => {\r\n this.setState({\r\n position: line.position\r\n });\r\n });\r\n\r\n API.event.on(\"sheet\", () => {\r\n this.setState({ position: 0 });\r\n });\r\n\r\n API.event.on(\"addonsUpdated\", (addons) => {\r\n this.setState({ addons });\r\n });\r\n\r\n }\r\n\r\n\r\n render() {\r\n let addons = this.state.addons;\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n {addons.includes(\"|write-good|\") && }\r\n {addons.includes(\"|conversion|\") && }\r\n {addons.includes(\"|calculator|\") && }\r\n {addons.includes(\"|links|\") && }\r\n
\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\n\r\nimport API from '../../js/api'\r\n\r\nclass App extends Component {\r\n\r\n state = {\r\n headText: \"Drop to Import your notes\",\r\n smallText: \"Only plaintext is supported!\"\r\n }\r\n\r\n componentDidMount(){\r\n API.event.on(\"importStarted\", fileName => {\r\n this.setState({\r\n headText: \"Processing...\",\r\n smallText: \"Please wait while processing \" + fileName + \"...\"\r\n })\r\n })\r\n\r\n API.event.on(\"importEnded\", () => {\r\n setTimeout(() => {\r\n this.setState({\r\n headText: \"Drop to Import your notes\",\r\n smallText: \"Only plaintext is supported!\"\r\n })\r\n }, 200);\r\n })\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n
\r\n
\r\n
\r\n \r\n
\r\n

{this.state.headText}

\r\n {this.state.smallText}\r\n
\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './style.css';\r\n\r\nimport API from '../../js/api';\r\n\r\nlet AUTH_URL = \"https://github.com/login/oauth/authorize?client_id=d63ed284bfb2c8e7a5d4&scope=gist&redirect_uri=https://api.usememo.com/github/\";\r\n\r\nif(API.development){\r\n AUTH_URL += \"?development=true\";\r\n}\r\n\r\nlet isRefresh = AUTH_URL.includes(\"?\") ? \"&refresh=true\" : \"?refresh=true\";\r\nlet AUTH_URL_REFRESH = AUTH_URL + isRefresh;\r\n\r\nclass App extends Component {\r\n\r\n state = {\r\n loginButtonText: \"Login with GitHub\"\r\n }\r\n\r\n componentDidMount(){\r\n if(this.props.forceLogout){\r\n console.log(\"forcing logout\");\r\n setTimeout(() => {\r\n API.event.emit(\"loginButton\");\r\n }, 1000);\r\n }\r\n\r\n if(window.navigator.userAgent.includes(\"Firefox\")){\r\n setTimeout(() => {\r\n API.event.emit(\"loginButton\");\r\n }, 1000);\r\n }\r\n }\r\n\r\n handleIframeLoad(e){\r\n let iframe = this.refs._authIframe;\r\n let isOnline = API.isOnline();\r\n if(iframe && isOnline){\r\n try{\r\n let iframeURL = (iframe.contentWindow||iframe.contentDocument).location.href;\r\n if(iframeURL){\r\n console.warn(\"Already authorized by GitHub!\");\r\n }\r\n API.githubLogin();\r\n } catch(err){\r\n console.log(err);\r\n console.warn(\"User haven't given authorization to Memo app on GitHub yet!\");\r\n API.githubLogin();\r\n setTimeout(() => {\r\n API.event.emit(\"loginButton\");\r\n }, 2000);\r\n }\r\n\r\n }\r\n if(!isOnline){\r\n API.offlineLogin();\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n
\r\n \r\n
this.setState({loginButtonText: \"Just a second...\"})}>\r\n \"GitHub\r\n {this.state.loginButtonText}\r\n
\r\n
\r\n {!this.props.forceLogout &&\r\n \r\n }\r\n
\r\n
API.offlineLogin()}>\r\n Use Offline\r\n
\r\n\r\n {this.props.forceLogout &&\r\n

You might also need to sign off from GitHub to login with another Account.

\r\n }\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React, { Component } from 'react';\r\nimport './App.css';\r\n\r\nimport Line from './components/Line';\r\nimport Title from './components/Title';\r\nimport Toolbar from './components/Toolbar';\r\nimport Handy from './components/Handy';\r\nimport Loading from './components/Loading';\r\nimport Cover from './components/Cover';\r\nimport AppBar from './components/AppBar';\r\nimport Login from './components/Login';\r\n\r\nimport makeid from './js/makeid';\r\n\r\nimport API from './js/api';\r\n\r\nclass App extends Component {\r\n\r\n state = {\r\n lines: \"\",\r\n focusIndex: null,\r\n cursorPosition: 0,\r\n logged: false,\r\n forceLogout: false,\r\n theme: API.getData(\"theme\") || \"light\"\r\n };\r\n\r\n componentDidMount(){\r\n\r\n window.addEventListener(\"keydown\", (e) => {\r\n if (e.keyCode === 114 || ((e.ctrlKey || e.metaKey) && e.keyCode === 70)) {\r\n API.event.emit(\"toggle\", \"search\");\r\n e.preventDefault();\r\n }else if ((e.ctrlKey || e.metaKey) && e.keyCode === 188) {\r\n API.event.emit(\"toggle\", \"settings\");\r\n e.preventDefault();\r\n }else if ((e.ctrlKey || e.metaKey) && e.keyCode === 83) {\r\n API.event.emit(\"toggle\", \"sheets\");\r\n e.preventDefault();\r\n }else if ((e.ctrlKey || e.metaKey) && e.keyCode === 85) {\r\n API.event.emit(\"toggle\", \"archives\");\r\n e.preventDefault();\r\n }else if ((e.ctrlKey || e.metaKey) && e.keyCode === 69) {\r\n API.event.emit(\"toggle\", \"addons\");\r\n e.preventDefault();\r\n }else if(e.keyCode === 27){\r\n API.event.emit(\"toggle\", false);\r\n e.preventDefault();\r\n }\r\n })\r\n\r\n API.event.on(\"login\", (status) => {\r\n this.setState({logged: status, forceLogout: (status === false)});\r\n })\r\n\r\n API.event.on(\"theme\", (newTheme) => {\r\n if(this.state.theme != newTheme){\r\n this.setState({theme: newTheme});\r\n API.updatePreference(\"theme\", newTheme);\r\n }\r\n })\r\n\r\n API.event.on(\"sheet\", (id) => {\r\n this.setState({sheetLoading: true, focusIndex: null});\r\n API.getSheet(id).then((sheet) => {\r\n if(sheet == \"NO_AUTH\"){\r\n console.log(\"NO_AUTH, retrying initiation\");\r\n API.login(\"refresh\", id);\r\n }else{\r\n document.title = sheet.title + \" | Memo\";\r\n this.setState({\r\n lines: sheet.lines,\r\n sheet: {\r\n id: sheet.id,\r\n title: sheet.title,\r\n active: sheet.active\r\n }\r\n });\r\n\r\n this.refs._textScroller.scrollTop = 0;\r\n setTimeout(() => {\r\n this.setState({\r\n sheetLoading: false\r\n });\r\n }, 50)\r\n }\r\n });\r\n API.event.emit(\"toggle\", false);\r\n })\r\n }\r\n\r\n getDateIdentifier(date){\r\n let today = new Date();\r\n let yesterday = new Date();\r\n yesterday.setDate(yesterday.getDate() - 1);\r\n today = String(today.getDate()).padStart(2, '0') + \"/\" + String(today.getMonth() + 1).padStart(2, '0') + \"/\" + today.getFullYear();\r\n yesterday = String(yesterday.getDate()).padStart(2, '0') + \"/\" + String(yesterday.getMonth() + 1).padStart(2, '0') + \"/\" + yesterday.getFullYear();\r\n\r\n if(date == today) {\r\n return \"· Today\";\r\n }else if(date == yesterday){\r\n return \"· Yesterday\"\r\n }else{\r\n return \"\";\r\n }\r\n }\r\n\r\n handleConcat(id, text, i, from){\r\n let lines = this.state.lines;\r\n let cursorPosition = 0;\r\n\r\n if((lines.length == i + 1) && from == \"down\"){\r\n return null;\r\n }\r\n\r\n let lineIndex = from == \"up\" ? i-1 : i+1;\r\n let focusIndex = from == \"up\" ? i-1 : i;\r\n if(lines[lineIndex]){\r\n API.updateLine(id, i, \"\", \"rm\");\r\n cursorPosition = lines[focusIndex].text.length;\r\n\r\n if(from == \"up\"){\r\n lines[lineIndex].text = lines[lineIndex].text + text;\r\n }else if(from == \"down\"){\r\n lines[lineIndex].text = text + lines[lineIndex].text;\r\n }\r\n lines[lineIndex].old_key = lines[lineIndex].line_key;\r\n lines[lineIndex].line_key = makeid(5);\r\n }\r\n lines.splice(i, 1);\r\n this.setState({focusIndex, cursorPosition, lines});\r\n }\r\n\r\n handleSplit(id, text, i){\r\n let keyToSplit = id.split(\"-\")[1];\r\n let lines = this.state.lines;\r\n let date = id.split(\"-\")[0].split(\"!\")[1];\r\n\r\n if(lines.length == i+1){\r\n let today = new Date();\r\n today = String(today.getDate()).padStart(2, '0') + \"/\" + String(today.getMonth() + 1).padStart(2, '0') + \"/\" + today.getFullYear();\r\n date = today\r\n }\r\n\r\n let newLineKey = makeid(5);\r\n lines.splice(i+1, 0, {\r\n \"line_key\": newLineKey,\r\n date,\r\n text\r\n });\r\n this.setState({focusIndex: i+1, cursorPosition: 0, lines});\r\n API.updateLine(id.split(\"!\")[0]+\"!\"+date+\"-\"+newLineKey, i+1, text);\r\n }\r\n\r\n async handlePaste(id, textArray, index, downText){\r\n let keyToSplit = id.split(\"-\")[1];\r\n let lines = this.state.lines;\r\n let date = id.split(\"-\")[0].split(\"!\")[1];\r\n let cursorPosition = \"end\";\r\n\r\n for (var i = 0; i < textArray.length; i++) {\r\n let text = textArray[i].replace(/^\\s+|\\s+$/g, \"\");\r\n if(downText){\r\n if(i == textArray.length - 1){\r\n cursorPosition = text.length;\r\n text = text + downText;\r\n }\r\n }\r\n let newLineKey = makeid(5);\r\n index = index + 1;\r\n lines.splice(index+1, 0, {\r\n \"line_key\": newLineKey,\r\n date,\r\n text\r\n });\r\n\r\n await API.updateLine(id.split(\"!\")[0]+\"!\"+date+\"-\"+newLineKey, index, text);\r\n }\r\n this.setState({focusIndex: index, cursorPosition, lines});\r\n }\r\n\r\n handleCursor(direction, id, i){\r\n let newIndex = 0;\r\n let cursorPosition = 0;\r\n if(direction == 37 || direction == 38){\r\n newIndex = i-1;\r\n }else if(direction == 39 || direction == 40){\r\n newIndex = i+1;\r\n }\r\n\r\n if(direction == 37 || ((direction == 40 || direction == 38) && false)){\r\n cursorPosition = \"end\";\r\n }\r\n\r\n if(i == 0 && (direction == 37 || direction == 38)){\r\n newIndex = \"title\";\r\n }\r\n\r\n this.setState({focusIndex: newIndex, cursorPosition});\r\n }\r\n\r\n handleBlur(text, lineId, i){\r\n let lines = this.state.lines;\r\n\r\n if(lines[i].text != text || lines[i].old_key){\r\n if(lines[i].old_key){\r\n API.updateLine(lineId, i, text, \"key\", lines[i].old_key);\r\n lines[i].old_key = \"\";\r\n }else{\r\n API.updateLine(lineId, i, text);\r\n }\r\n lines[i].text = text;\r\n this.setState({lines, focusIndex: null});\r\n }\r\n }\r\n\r\n handleTitleDown(){\r\n this.setState({focusIndex: 0, cursorPosition: 0});\r\n }\r\n\r\n focusLast(){\r\n this.setState({focusIndex: this.state.lines.length - 1, cursorPosition: \"end\"});\r\n }\r\n\r\n renderLines(lines){\r\n let lineArray = [];\r\n let prevDate = \"\";\r\n\r\n lines.forEach((l, i) => {\r\n if(prevDate !== l.date){\r\n lineArray.push(\r\n this.setState({focusIndex: i})}\r\n dangerouslySetInnerHTML={{__html: `${l.date} ${this.getDateIdentifier(l.date)}`}}>\r\n \r\n );\r\n prevDate = l.date;\r\n }\r\n\r\n lineArray.push(\r\n \r\n {l.text}\r\n \r\n );\r\n });\r\n\r\n return lineArray;\r\n }\r\n\r\n renderApp(){\r\n if(this.state.logged){\r\n return(\r\n
\r\n
\r\n \r\n
\r\n {this.state.sheet &&\r\n \r\n {this.state.sheet.title}\r\n \r\n }\r\n {this.state.sheet && this.renderLines(this.state.lines)}\r\n \r\n
this.focusLast()}>
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n }else{\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n {this.renderApp()}\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport './win.css';\r\nimport './fonts/font.css';\r\n\r\nimport App from './App';\r\nimport * as serviceWorker from './serviceWorker';\r\n\r\nReactDOM.render(, document.getElementById('root'));\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\n\r\nserviceWorker.register();\r\n","module.exports = __webpack_public_path__ + \"static/media/memo_logo_left_white.c7458878.svg\";","module.exports = __webpack_public_path__ + \"static/media/memo_logo_left.63768875.svg\";"],"sourceRoot":""}