fediverse-export-analyzer/public/js/modules/handleUpload.min.js.map

1 wiersz
18 KiB
Plaintext

{"version":3,"file":"handleUpload.min.js","sources":["modules/handleUpload.js"],"sourcesContent":["import sortArrayOfObjects from \"/js/modules/sortArrayOfObjects.min.js\";\r\nimport getDomain from \"/js/modules/getDomain.min.js\";\r\nimport loadEmbedScript from \"/js/modules/loadEmbedScript.min.js\";\r\nimport Cookie from \"/js/cookies/main.min.js\";\r\n\r\nconst cookieManager = new Cookie();\r\nconst fileInput = document.getElementById(\"file-input\");\r\nconst introElement = document.getElementById(\"intro\");\r\nconst loadingAnimation = document.getElementById(\"loading-animation\");\r\nconst loadingText = document.getElementById(\"loading-text\");\r\nconst resultsElement = document.getElementById(\"results\");\r\nconst userInfo = document.getElementById(\"user-info\");\r\nconst userAvatar = document.getElementById(\"user-avatar\");\r\nconst userDescription = document.getElementById(\"user-description\");\r\nconst userDataBreakdown = document.getElementById(\"user-data-breakdown\");\r\nconst chartElement = document.getElementById(\"chart\");\r\n\r\nconst handleUpload = () => {\r\n if (fileInput) {\r\n fileInput.addEventListener(\"change\", async (ev) => {\r\n loadingAnimation.classList.remove(\"d-none\");\r\n loadingText.classList.remove(\"d-none\");\r\n fileInput.disabled = true;\r\n const formData = new FormData();\r\n formData.set(\"archive\", fileInput.files[0]);\r\n\r\n const resp = await fetch(\"/extract-data\", {\r\n method: \"POST\",\r\n body: formData,\r\n });\r\n\r\n const response = await resp.json();\r\n\r\n if (response && response.data) {\r\n introElement.classList.add(\"d-none\");\r\n resultsElement.classList.remove(\"d-none\");\r\n const userData = response.data;\r\n\r\n // let userDomain = getDomain(userData.actor.id);\r\n let userDescriptionHTML = \"\";\r\n let userDataBreakdownHTML = \"\";\r\n\r\n if (userData.actor) {\r\n userDescriptionHTML += `\r\n <p class=\"mb-0\">\r\n <strong>${\r\n userData.actor.name || userData.actor.preferredUsername\r\n }</strong>\r\n </p>\r\n ${userData.actor.summary.replaceAll('class=\"invisible\"', \"\")}\r\n `;\r\n\r\n if (userData.actor.attachment) {\r\n userDescriptionHTML += `\r\n <ul class=\"list-group\">\r\n ${userData.actor.attachment\r\n .map(\r\n (attachment) => `\r\n <li class=\"list-group-item\">${\r\n attachment.name\r\n }: ${attachment.value.replace('class=\"invisible\"', \"\")}</li>\r\n `\r\n )\r\n .join(\"\")}\r\n </ul>\r\n `;\r\n }\r\n\r\n userDescription.innerHTML = `<div>${userDescriptionHTML}</div>`;\r\n\r\n if (userData.avatar_url) {\r\n userAvatar.innerHTML = `\r\n <img class=\"img-thumbnail\" width=\"64\" height=\"64\" src=\"${userData.avatar_url}\">\r\n `;\r\n } else if (userData.avatar) {\r\n userAvatar.innerHTML = `\r\n <img class=\"img-thumbnail\" width=\"64\" height=\"64\" src=\"data:image/jpg;base64,${userData.avatar}\">\r\n `;\r\n }\r\n } else {\r\n userInfo.remove();\r\n userDescription.remove();\r\n }\r\n\r\n let posts = [];\r\n let firstPost;\r\n let postCount = 0;\r\n\r\n if (userData?.outbox?.orderedItems) {\r\n posts = userData.outbox.orderedItems;\r\n } else if (userData?.outbox) {\r\n posts = userData.outbox;\r\n }\r\n\r\n postCount = posts.length;\r\n let milestones = [];\r\n\r\n let counter = {\r\n posts: 0,\r\n replies: 0,\r\n reblogs: 0,\r\n total: 0,\r\n };\r\n\r\n if (postCount) {\r\n // posts = sortArrayOfObjects(posts, key, desc)\r\n const maxRoot = Math.ceil(Math.pow(posts.length, 1 / 10));\r\n let index = 0;\r\n firstPost = posts[0];\r\n\r\n posts.forEach((post) => {\r\n let isSemiPublic = false;\r\n const recipients = [...post.to, ...post.cc];\r\n\r\n recipients.forEach((recipient) => {\r\n if (recipient.endsWith(\"/followers\")) {\r\n isSemiPublic = true;\r\n }\r\n });\r\n\r\n if (isSemiPublic) {\r\n index++;\r\n if (posts.length >= 10 && index <= maxRoot) {\r\n const post = posts[Math.pow(10, index)];\r\n const url = post.id.replace(\"/activity\", \"\");\r\n\r\n let milestone = {};\r\n let isBoost = false;\r\n\r\n if (!post.object.id) {\r\n isBoost = true;\r\n }\r\n\r\n milestone = {\r\n label: [`${Math.pow(10, index).toLocaleString()}th post`],\r\n url,\r\n isBoost,\r\n };\r\n\r\n milestones.push(milestone);\r\n }\r\n counter.total++;\r\n if (post.type === \"Create\") {\r\n if (post.object.inReplyTo) {\r\n counter.replies++;\r\n } else {\r\n counter.posts++;\r\n }\r\n } else {\r\n try {\r\n if (\r\n post.id &&\r\n post.object &&\r\n post.id.split(\"/users/\")[0] ===\r\n post.object.split(\"/users/\")[0]\r\n ) {\r\n console.log(post);\r\n counter.posts++;\r\n counter.total++;\r\n } else {\r\n counter.reblogs++;\r\n }\r\n } catch (err) {\r\n /*noop*/\r\n }\r\n }\r\n } else {\r\n // console.log(post.id.replace(\"users/\", \"@\").replace(\"statuses/\", \"\").replace(\"/activity\", \"\"), recipients);\r\n // console.log(recipients);\r\n // if (recipients.length === 0){\r\n // console.log(post.id.replace(\"users/\", \"@\").replace(\"statuses/\", \"\").replace(\"/activity\", \"\"));\r\n // }\r\n }\r\n });\r\n // console.log({ counter });\r\n }\r\n\r\n const options = {\r\n weekday: \"long\",\r\n year: \"numeric\",\r\n month: \"long\",\r\n day: \"numeric\",\r\n };\r\n\r\n if (userData.actor) {\r\n const accountCreationDate = moment(userData.actor.published);\r\n const today = moment();\r\n const timeAgo = today.diff(accountCreationDate, \"days\");\r\n\r\n userDataBreakdownHTML += `\r\n <p>\r\n You created your account on <strong>${new Date(\r\n userData.actor.published\r\n ).toLocaleDateString(\r\n undefined,\r\n options\r\n )}</strong>, which is <strong>${timeAgo.toLocaleString()} day(s) ago</strong>. Since then, you posted <strong>${counter.total.toLocaleString()} times</strong>, or about ${Math.round(\r\n counter.total / timeAgo\r\n ).toLocaleString()} time(s) a day on average.\r\n </p>\r\n `;\r\n }\r\n\r\n if (counter.reblogs > 0 || counter.replies > 0) {\r\n userDataBreakdownHTML += `\r\n <p>\r\n You have reblogged <strong>${counter.reblogs.toLocaleString()} post(s)</strong>, replied <strong>${counter.replies.toLocaleString()} time(s)</strong>, and posted <strong>${counter.posts.toLocaleString()} new post(s)</strong>.\r\n </p>\r\n `;\r\n }\r\n\r\n let instanceURL;\r\n\r\n if (firstPost) {\r\n let postURL;\r\n let url;\r\n\r\n if ([\"firefish\", \"calckey\", \"misskey\"].includes(userData.format)) {\r\n // Export file doesn't contain server name.\r\n } else {\r\n postURL = firstPost?.uri || firstPost?.object?.id || firstPost?.id;\r\n\r\n try {\r\n url = new URL(postURL);\r\n } catch (err) {\r\n console.log(\"error parsing data file\", err);\r\n }\r\n\r\n if (url && url.protocol && url.hostname) {\r\n instanceURL = `${url.protocol}//${url.hostname}`;\r\n }\r\n\r\n userDataBreakdownHTML += `\r\n <p>\r\n Here's your <a href=\"${postURL}\" target=\"_blank\">first post</a>!\r\n </p>\r\n `;\r\n\r\n if (userData.format === \"mastodon\") {\r\n userDataBreakdownHTML += `\r\n <iframe\r\n src=\"${postURL}/embed\"\r\n class=\"mastodon-embed\"\r\n style=\"max-width: 100%; border: 0\" width=\"400\"\r\n allowfullscreen=\"allowfullscreen\"></iframe>\r\n `;\r\n }\r\n\r\n if (milestones && milestones.length) {\r\n userDataBreakdownHTML += `\r\n <p class=\"mt-3\">\r\n Here are more of your milestones:\r\n </p>\r\n <ul>\r\n ${milestones\r\n .map(\r\n (milestone) => `\r\n <li>\r\n <a target=\"_blanlk\" href=\"${milestone.url}\">${\r\n milestone.label\r\n }</a>${milestone.isBoost ? ` (boost)` : \"\"}\r\n </li>\r\n `\r\n )\r\n .join(\"\")}\r\n </ul>\r\n `;\r\n }\r\n\r\n userDataBreakdownHTML += `\r\n <p class=\"mt-4\">\r\n And this is what your posting history looks like.\r\n </p>\r\n `;\r\n }\r\n }\r\n\r\n userDataBreakdown.innerHTML = userDataBreakdownHTML;\r\n\r\n if (userData.format === \"mastodon\") {\r\n loadEmbedScript(instanceURL);\r\n }\r\n\r\n // chartOptions.options.legend = {\r\n // display: false\r\n // };\r\n\r\n const data = {\r\n labels: posts.map((post) =>\r\n moment(post.published || post.createdAt || post.created)\r\n ),\r\n datasets: [\r\n {\r\n label: \"Your posts in time\",\r\n data: posts.map((post, index) => {\r\n return {\r\n x: moment(post.published || post.createdAt || post.created),\r\n // y: (new Date(post.published || post.createdAt)).getHour() + 1,\r\n y: new Date(\r\n post.published || post.createdAt || post.created\r\n ).getHours(),\r\n };\r\n }),\r\n backgroundColor: [\"#ff6384\"],\r\n },\r\n ],\r\n };\r\n\r\n new Chart(chartElement, {\r\n type: \"scatter\",\r\n data: data,\r\n options: {\r\n scales: {\r\n x: {\r\n type: \"time\",\r\n position: \"bottom\",\r\n ticks: {\r\n beginAtZero: false,\r\n stepSize: 10,\r\n },\r\n },\r\n y: {\r\n ticks: {\r\n beginAtZero: false,\r\n display: false,\r\n },\r\n scaleLabel: {\r\n display: false,\r\n // labelString: chartEl.dataset.axisLabelData\r\n // labelString: chartEl.dataset.sourceId ? window.ftfDataviz[parseInt( chartEl.dataset.sourceId )].axis_label_title : ''\r\n // labelString: 'Day of the month'\r\n },\r\n minorTickInterval: null,\r\n },\r\n },\r\n plugins: {\r\n tooltip: {\r\n callbacks: {\r\n // label: (ctx) => ctx.label\r\n label: (ctx) => {\r\n // console.log(ctx);\r\n // console.log(posts[ctx.dataIndex].object.content);\r\n return ctx.label;\r\n },\r\n },\r\n },\r\n },\r\n },\r\n });\r\n } else {\r\n loadingAnimation.classList.add(\"d-none\");\r\n loadingText.classList.add(\"d-none\");\r\n fileInput.disabled = false;\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport default handleUpload;\r\n"],"names":["sortArrayOfObjects","getDomain","loadEmbedScript","Cookie","cookieManager","fileInput","document","getElementById","introElement","loadingAnimation","loadingText","resultsElement","userInfo","userAvatar","userDescription","userDataBreakdown","chartElement","handleUpload","addEventListener","async","ev","classList","remove","disabled","formData","FormData","set","files","response","await","fetch","method","body","json","data","add","userData","let","userDescriptionHTML","userDataBreakdownHTML","posts","actor","name","preferredUsername","summary","replaceAll","attachment","map","value","replace","join","innerHTML","avatar_url","avatar","firstPost","outbox","orderedItems","postCount","length","milestones","counter","replies","reblogs","total","maxRoot","Math","ceil","pow","index","forEach","isSemiPublic","post","to","cc","recipient","endsWith","url","id","isBoost","object","milestone","label","toLocaleString","push","type","inReplyTo","split","console","log","err","options","weekday","year","month","day","accountCreationDate","moment","published","timeAgo","diff","Date","toLocaleDateString","undefined","round","instanceURL","includes","format","postURL","uri","URL","protocol","hostname","labels","createdAt","created","datasets","x","y","getHours","backgroundColor","Chart","scales","position","ticks","beginAtZero","stepSize","display","scaleLabel","minorTickInterval","plugins","tooltip","callbacks","ctx"],"mappings":"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"}