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

1 wiersz
16 KiB
Plaintext

{"version":3,"file":"handleUpload.1.min.js","sources":["modules/handleUpload.1.js"],"sourcesContent":["import loadEmbedScript from \"/js/modules/loadEmbedScript.min.js\";\r\nimport { fileInput, loadingAnimation, loadingText, introElement, resultsElement, userDescription, userAvatar, userInfo, userDataBreakdown, chartElement } from \"./handleUpload\";\r\n\r\nexport const 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>${userData.actor.name || userData.actor.preferredUsername}</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\">${attachment.name}: ${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\r\n\r\n\r\n\r\n\r\n\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 counter.reblogs++;\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\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 /*\r\n counter = {\r\n posts: 0,\r\n replies: 0,\r\n reblogs: 0,\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}\">${milestone.label}</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 const data = {\r\n labels: posts.map((post) => 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"],"names":["loadEmbedScript","fileInput","loadingAnimation","loadingText","introElement","resultsElement","userDescription","userAvatar","userInfo","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","recipients","post","to","cc","recipient","endsWith","url","id","isBoost","object","milestone","label","toLocaleString","push","type","inReplyTo","console","log","options","weekday","year","month","day","accountCreationDate","moment","published","timeAgo","diff","Date","toLocaleDateString","undefined","round","instanceURL","includes","format","postURL","uri","URL","err","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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"}