{ "version": 3, "sources": ["../../../quotes/quotes.ts"], "sourcesContent": ["// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-or-later\nimport {\n d,\n e as getElementById,\n get,\n PopStateHandlers,\n post,\n setLastLocation,\n} from \"@utils/utils.js\";\n\nfunction startQuotes() {\n const nextButton = getElementById(\"next\") as HTMLAnchorElement;\n const upvoteButton = getElementById(\"upvote\") as HTMLButtonElement;\n const downvoteButton = getElementById(\n \"downvote\",\n ) as HTMLButtonElement;\n const reportButton = getElementById(\"report\") as\n | HTMLAnchorElement\n | null;\n\n const thisQuoteId = [\n (getElementById(\"top\")!).getAttribute(\"quote-id\")!,\n ];\n const nextQuoteId = [nextButton.getAttribute(\"quote-id\")!];\n const params = location.search;\n\n const keys = (() => {\n const k = new URLSearchParams(params).get(\"keys\");\n if (!(k?.length)) {\n return \"WASD\";\n }\n // for vim-like set keys to khjl\n if (k.length === 4) {\n return k.toUpperCase();\n } else {\n alert(\"Invalid keys given, using default.\");\n return \"WASD\";\n }\n })(); // currently only letter keys are supported\n\n (getElementById(\"wasd\")!).innerText =\n `${keys[0]} (Witzig), ${keys[2]} (Nicht Witzig), ` +\n `${keys[1]} (Vorheriges) und ${keys[3]} (Nächstes)`;\n\n d.onkeydown = (event) => {\n switch (event.code) {\n case `Key${keys[0]}`:\n upvoteButton.click();\n break;\n case `Key${keys[1]}`:\n history.back();\n break;\n case `Key${keys[2]}`:\n downvoteButton.click();\n break;\n case `Key${keys[3]}`:\n nextButton.click();\n }\n };\n\n const shareButton = getElementById(\"share\") as HTMLAnchorElement;\n const downloadButton = getElementById(\n \"download\",\n ) as HTMLAnchorElement;\n\n const author = getElementById(\"author\") as HTMLAnchorElement;\n const quote = getElementById(\"quote\") as HTMLAnchorElement;\n const realAuthor = getElementById(\n \"real-author-name\",\n ) as HTMLAnchorElement;\n\n const ratingText = getElementById(\"rating-text\") as HTMLDivElement;\n const ratingImageContainer = getElementById(\n \"rating-img-container\",\n ) as HTMLDivElement;\n\n nextButton.removeAttribute(\"href\");\n\n function updateQuoteId(quoteId: string): void {\n shareButton.href = `/zitate/share/${quoteId}${params}`;\n downloadButton.href = `/zitate/${quoteId}.gif${params}`;\n const [q_id, a_id] = quoteId.split(\"-\", 2);\n quote.href = `/zitate/info/z/${q_id}${params}`;\n author.href = `/zitate/info/a/${a_id}${params}`;\n thisQuoteId[0] = quoteId;\n }\n\n function updateRating(rating: number | string) {\n rating = rating.toString();\n ratingText.innerText = rating;\n if ([\"---\", \"???\", \"0\"].includes(rating)) {\n ratingImageContainer.innerHTML = \"\";\n return;\n }\n const ratingNum = Number.parseInt(rating);\n const ratingImg = d.createElement(\"div\");\n ratingImg.className = \"rating-img\" + (\n ratingNum > 0 ? \" witzig\" : \" nicht-witzig\"\n );\n ratingImageContainer.innerHTML = (ratingImg.outerHTML + \" \")\n .repeat(\n Math.min(4, Math.abs(ratingNum)),\n )\n .trim();\n }\n\n function updateVote(vote: number | string): void {\n function update(\n btn: HTMLButtonElement,\n btn_vote: number,\n btn_vote_str: string,\n ) {\n btn.disabled = false;\n if (vote === btn_vote || vote === btn_vote_str) {\n // the vote of the button is active\n btn.setAttribute(\"voted\", btn_vote_str);\n btn.value = \"0\"; // if pressed again reset the vote\n } else {\n // the vote of the button isn't active\n btn.removeAttribute(\"voted\");\n btn.value = btn_vote_str; // if pressed, vote with the button\n }\n }\n // update the upvote button\n update(upvoteButton, 1, \"1\");\n // update the downvote button\n update(downvoteButton, -1, \"-1\");\n }\n\n interface API_DATA {\n // either this\n status: number | undefined;\n reason: string;\n // or the following\n id: string;\n rating: string;\n vote: number;\n quote: string;\n author: string;\n real_author: string;\n real_author_id: number;\n next: string;\n }\n\n function handleData(\n data: API_DATA,\n ): boolean {\n if (data.status) {\n console.error(data);\n if (data.status in [429, 420]) {\n // ratelimited\n alert(data.reason);\n }\n return false;\n } else if (data.id) {\n updateQuoteId(data.id);\n nextQuoteId[0] = data.next;\n quote.innerText = `»${data.quote}«`;\n author.innerText = `- ${data.author}`;\n realAuthor.innerText = data.real_author;\n realAuthor.href = `/zitate/info/a/${data.real_author_id}${params}`;\n if (reportButton?.href) {\n const reportHrefParams = new URLSearchParams(params);\n reportHrefParams.set(\n \"subject\",\n `Das falsche Zitat ${data.id} hat ein Problem`,\n );\n reportHrefParams.set(\n \"message\",\n `${quote.innerText} ${realAuthor.innerText}`,\n );\n reportButton.href = `/kontakt?${reportHrefParams.toString()}`;\n }\n updateRating(data.rating);\n updateVote(data.vote);\n return true;\n }\n return false;\n }\n\n PopStateHandlers[\"quotes\"] = (event: PopStateEvent) => {\n if (event.state) {\n handleData(event.state as API_DATA);\n }\n };\n\n interface POP_STATE_API_DATA extends API_DATA {\n stateType: string;\n url: string;\n }\n\n nextButton.onclick = () =>\n get(\n `/api/zitate/${nextQuoteId[0]}`,\n params,\n (data: POP_STATE_API_DATA) => {\n if (!handleData(data)) {\n return;\n }\n\n data.stateType = \"quotes\";\n data.url = `/zitate/${data.id}${params}`;\n history.pushState(data, \"Falsche Zitate\", data.url);\n setLastLocation(data.url);\n },\n );\n\n const vote = (vote: string): Promise =>\n post(\n `/api/zitate/${thisQuoteId[0]}`,\n { vote },\n (data: API_DATA) => void handleData(data),\n );\n\n for (const voteButton of [upvoteButton, downvoteButton]) {\n voteButton.type = \"button\";\n voteButton.onclick = () => {\n upvoteButton.disabled = true;\n downvoteButton.disabled = true;\n vote(voteButton.value)\n .then(() => {\n upvoteButton.disabled = false;\n downvoteButton.disabled = false;\n })\n .catch(() => {\n upvoteButton.disabled = false;\n downvoteButton.disabled = false;\n });\n };\n }\n}\n\nfor (\n const autoSubmitEl of (d.getElementsByClassName(\n \"auto-submit-element\",\n ) as HTMLCollectionOf)\n) {\n autoSubmitEl.onchange = () => {\n (autoSubmitEl.form!).submit();\n };\n}\n\nstartQuotes();\n"], "mappings": "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", "names": ["d", "getElementById", "get", "PopStateHandlers", "post", "setLastLocation", "startQuotes", "nextButton", "upvoteButton", "downvoteButton", "reportButton", "thisQuoteId", "nextQuoteId", "params", "keys", "k", "event", "shareButton", "downloadButton", "author", "quote", "realAuthor", "ratingText", "ratingImageContainer", "updateQuoteId", "quoteId", "q_id", "a_id", "updateRating", "rating", "ratingNum", "ratingImg", "updateVote", "vote", "update", "btn", "btn_vote", "btn_vote_str", "handleData", "data", "reportHrefParams", "voteButton", "autoSubmitEl"] }