From 5aaccd881ce784c9e703faf75ba49e90fc61ed15 Mon Sep 17 00:00:00 2001
From: thuhole
Date: Fri, 19 Jun 2020 10:36:31 +0800
Subject: [PATCH] Updates
---
asset-manifest.json | 22 +++++++++----------
index.html | 2 +-
...nifest.52751ac2c82082371a7bc87c012d9bf7.js | 22 -------------------
...nifest.bacfa72a1df23be3a7b75027dd726add.js | 22 +++++++++++++++++++
service-worker.js | 4 ++--
static/js/main.8fc3b68f.chunk.js | 2 ++
static/js/main.8fc3b68f.chunk.js.map | 1 +
static/js/main.e91b9a8b.chunk.js | 2 --
static/js/main.e91b9a8b.chunk.js.map | 1 -
...n.47dca567.js => runtime~main.2e7320a3.js} | 4 ++--
static/js/runtime~main.2e7320a3.js.map | 1 +
static/js/runtime~main.47dca567.js.map | 1 -
12 files changed, 42 insertions(+), 42 deletions(-)
delete mode 100644 precache-manifest.52751ac2c82082371a7bc87c012d9bf7.js
create mode 100644 precache-manifest.bacfa72a1df23be3a7b75027dd726add.js
create mode 100644 static/js/main.8fc3b68f.chunk.js
create mode 100644 static/js/main.8fc3b68f.chunk.js.map
delete mode 100644 static/js/main.e91b9a8b.chunk.js
delete mode 100644 static/js/main.e91b9a8b.chunk.js.map
rename static/js/{runtime~main.47dca567.js => runtime~main.2e7320a3.js} (59%)
create mode 100644 static/js/runtime~main.2e7320a3.js.map
delete mode 100644 static/js/runtime~main.47dca567.js.map
diff --git a/asset-manifest.json b/asset-manifest.json
index 0743037..efb47cd 100644
--- a/asset-manifest.json
+++ b/asset-manifest.json
@@ -1,15 +1,15 @@
{
"files": {
- "main.css": "./static/css/main.54f9c368.chunk.css",
- "main.js": "./static/js/main.e91b9a8b.chunk.js",
- "main.js.map": "./static/js/main.e91b9a8b.chunk.js.map",
- "runtime~main.js": "./static/js/runtime~main.47dca567.js",
- "runtime~main.js.map": "./static/js/runtime~main.47dca567.js.map",
- "static/js/2.688ae6b0.chunk.js": "./static/js/2.688ae6b0.chunk.js",
- "static/js/2.688ae6b0.chunk.js.map": "./static/js/2.688ae6b0.chunk.js.map",
- "index.html": "./index.html",
- "precache-manifest.52751ac2c82082371a7bc87c012d9bf7.js": "./precache-manifest.52751ac2c82082371a7bc87c012d9bf7.js",
- "service-worker.js": "./service-worker.js",
- "static/css/main.54f9c368.chunk.css.map": "./static/css/main.54f9c368.chunk.css.map"
+ "main.css": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/static/css/main.54f9c368.chunk.css",
+ "main.js": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/static/js/main.8fc3b68f.chunk.js",
+ "main.js.map": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/static/js/main.8fc3b68f.chunk.js.map",
+ "runtime~main.js": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/static/js/runtime~main.2e7320a3.js",
+ "runtime~main.js.map": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/static/js/runtime~main.2e7320a3.js.map",
+ "static/js/2.688ae6b0.chunk.js": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/static/js/2.688ae6b0.chunk.js",
+ "static/js/2.688ae6b0.chunk.js.map": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/static/js/2.688ae6b0.chunk.js.map",
+ "index.html": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/index.html",
+ "precache-manifest.bacfa72a1df23be3a7b75027dd726add.js": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/precache-manifest.bacfa72a1df23be3a7b75027dd726add.js",
+ "service-worker.js": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/service-worker.js",
+ "static/css/main.54f9c368.chunk.css.map": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/static/css/main.54f9c368.chunk.css.map"
}
}
\ No newline at end of file
diff --git a/index.html b/index.html
index adc32fe..05443a9 100644
--- a/index.html
+++ b/index.html
@@ -1 +1 @@
-T大树洞
\ No newline at end of file
+T大树洞
\ No newline at end of file
diff --git a/precache-manifest.52751ac2c82082371a7bc87c012d9bf7.js b/precache-manifest.52751ac2c82082371a7bc87c012d9bf7.js
deleted file mode 100644
index effd393..0000000
--- a/precache-manifest.52751ac2c82082371a7bc87c012d9bf7.js
+++ /dev/null
@@ -1,22 +0,0 @@
-self.__precacheManifest = (self.__precacheManifest || []).concat([
- {
- "revision": "382722f9f35ef3834f5d45eeb0253446",
- "url": "./index.html"
- },
- {
- "revision": "0f778a7fa921e57bc8e2",
- "url": "./static/css/main.54f9c368.chunk.css"
- },
- {
- "revision": "8315e3f4741d4388f39f",
- "url": "./static/js/2.688ae6b0.chunk.js"
- },
- {
- "revision": "0f778a7fa921e57bc8e2",
- "url": "./static/js/main.e91b9a8b.chunk.js"
- },
- {
- "revision": "045e50cad03565bb401b",
- "url": "./static/js/runtime~main.47dca567.js"
- }
-]);
\ No newline at end of file
diff --git a/precache-manifest.bacfa72a1df23be3a7b75027dd726add.js b/precache-manifest.bacfa72a1df23be3a7b75027dd726add.js
new file mode 100644
index 0000000..375b922
--- /dev/null
+++ b/precache-manifest.bacfa72a1df23be3a7b75027dd726add.js
@@ -0,0 +1,22 @@
+self.__precacheManifest = (self.__precacheManifest || []).concat([
+ {
+ "revision": "c09e770b40ac2875e73bc7b5ac826809",
+ "url": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/index.html"
+ },
+ {
+ "revision": "15df0914e4911ffcc1c3",
+ "url": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/static/css/main.54f9c368.chunk.css"
+ },
+ {
+ "revision": "8315e3f4741d4388f39f",
+ "url": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/static/js/2.688ae6b0.chunk.js"
+ },
+ {
+ "revision": "15df0914e4911ffcc1c3",
+ "url": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/static/js/main.8fc3b68f.chunk.js"
+ },
+ {
+ "revision": "175ae865ef43eb620339",
+ "url": "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/static/js/runtime~main.2e7320a3.js"
+ }
+]);
\ No newline at end of file
diff --git a/service-worker.js b/service-worker.js
index 22c1627..91814f1 100644
--- a/service-worker.js
+++ b/service-worker.js
@@ -14,7 +14,7 @@
importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
importScripts(
- "./precache-manifest.52751ac2c82082371a7bc87c012d9bf7.js"
+ "//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/precache-manifest.bacfa72a1df23be3a7b75027dd726add.js"
);
self.addEventListener('message', (event) => {
@@ -33,7 +33,7 @@ workbox.core.clientsClaim();
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
-workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("./index.html"), {
+workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io/index.html"), {
blacklist: [/^\/_/,/\/[^/?]+\.[^/]+$/],
});
diff --git a/static/js/main.8fc3b68f.chunk.js b/static/js/main.8fc3b68f.chunk.js
new file mode 100644
index 0000000..b90dda8
--- /dev/null
+++ b/static/js/main.8fc3b68f.chunk.js
@@ -0,0 +1,2 @@
+(window.webpackJsonpwebhole=window.webpackJsonpwebhole||[]).push([[0],[,,,,,,,,,,,,,,,function(e,t){e.exports="data:image/png;base64,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"},function(e,t){e.exports="data:image/png;base64,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"},function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAFn0lEQVR42q1XbUidZRh+z/FjavYjGLFFFASrFREx1ikE6Ye50QZ5lBUO/ZEnhMyfWbSQQGxQofu1MGooKGjaNCTRpiu3+ZH+Muc8X87j0ZPf39/f2nWd7keenalHSeHifXzf53nu67nv677v5xgjIyOGjtHR0Z0nMT4+bpqYmAgZHh4O8/l8YYODg/7n2NhYKN6b8HxkTeB+wWDsRwBGTTBm9PX1GTBmzM7OGjMzM/4nvhler9c/5/+Q2NUwNxwaGvI/NzY2iNNbW1vvbW9vfwRkApfxv2V9fT1qcnLSIElF5LAkHjs9wZMtLS0ZMPQOUAx0An2AD/gH6AecQA1gA8EnSASkD01ix6haQFevrq5GYuOvgV5gAHADPcBDQY+88wipX+CRl8RzhyKxM+AinlyM/wAMAXYx5Nrc3GxbW1u7he91OPE9GOwmETwfCMkmjE/zANTHoT3ARcvLy3T7VzQuG/fAWFNLS8s3KSkpH1oslovAu3FxcckFBQVXML8a89xChqH5DfOfoiZ0YQYlgIGJ/2CDt3habGgHenDa2oyMjMuxsbEvFBYWRhcVFYUQGEfk5uaeiImJiYOhG5jr0kh8Oj09veOFYCT8TDl5fn6eBK5zE25Il6elpSXl5+cf4ybcVMfc3JxRVVVlwCOvLy4uUgMPSRrrm+GFpwcGBgylhX0JIGbm/v5+ptozWPyXbOLp7OzMycvLC2feYyMTSQbAxG/FxcVGdna2lSEDmBkePC+KB0wH8UAoqhsJxFJwJAB0lpaWnuV7ZVzfSI35fmpqyqivr49GuCqZNVhLQX62sLBgYL0pmBc4KYwuxaJELO4DPHD/7xDSk/ulkxIu8t8EbxkIA9O2Xwh8x5CqYhZMhGEcwAMfsNgIiSooPERtsJcbpWqaqXqs/4LpKATyqZEDEcDpQ51OJ09yXlzI4nMXLj2u0inQC0rd/EY3S9W8jrWskAMgkyPED6QBdjoSeZWxZwaIkC7ICcyB6aTG1AdJImQUcCtrAp5ekLK1t7dTH6agWUA1U0iVlZXRaC6VUl5Z93+FF6IlnUJ4ogDQ9WatePn7A0jcb2xsPNPb28tWbhyEgF/JdXV1Rltb28dyehYVL2MJElE8JTMCT57YLGNVOVOlXDsYQqR1AdI3SrXsoCFQsWQNz8rKehab3hQvKBI/g9DbeB+1srJiEBQomw++XZXG5JK+4YHR9I6ODn99YYiC3RV2BkzF5uZmw2q1noeIGiUMigQNVEulvAaUAh3ShBzy3SFkWqEJC4sbQW+x1O9F4pGcZijKysrCbTbbJXS+Gq0NO7X7gE/i7da+d8nYLt8oSCuInGV3VZVzt4x6zCUsrxUVFZGo8efsdvs1bHJHPKGMKThgpB3pewOkP5d5ymvq7uCSu8Ip6TnmQBK7lleGo6GhwZyQkHAqPj7+Egh9CdF9j+JSggpXgk1+bGpqugpPpYHoGcw7npOTkwIS97RwOMRz9Nhd3hV2I7FniSUJTqytrQ2FoRMw9Irlv783gNdSU1Ofy8zMjOrq6mIRM9LT0yOQyp+IUadGoFu0QhIvB5LYs8SShMoOhsXtdhutra1+dHd3+wnSML/zek6xoXC9CEN/a2np0kh4dU+oq9ue+amHhALi7wM2HoIG+U5vzxQwOmgkRFcixuxiXCdBgd5RVzeW6gPd25RHdOhKVgR4QUFoziGN/5Ba4tBIuDQSf0Ivz/MOeuhfMvsRlAwKx/0xESRuC4lAT/CuOQx8y/lHQkAnwRJcXl5+LDk5OQmnvC1Xe52EXdK1mi37SAmocPBkJIFwJIJEvZBwiHF6wAcdlHDukREIJEFPSFVNQjhuyak9ShtIbxtvUkdKQL+sKBLQRAT6ixVp+xOI1CBLbqLzXsFvi5NH7oFAIrzQCIlQFK83gfeBC8BJ3heYiv8CA3isy4IxUaYAAAAASUVORK5CYII="},function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFdklEQVR42sVW+VNTVxS+f4Od9oeW0RmlU8dOcRx3BEHbqiio3dtfamds+0N1bGe62emirYpSLRYDguAWJQihLZBAEkgKgbCHgIBAXbBTtgSykhAQEL/ecyWtwwMHx9DemS/vvXvv+c73zj3n5DEAjHBodJz9MD7BvuP3KVbb0xqV1p6lzENzS9u7Y3zOVWNittXPMmvMWmaNjZgeW8OZY91i1pSbzSqcg6y01Lj7V7UOap3Bma9WhyiKtEyh0bGsQg0L+P3n5talDNZ5LpWZCwqYqqYxJk9TggK1Bkpza7pWrWNdsZHM/uKymZ1Pgvb07ohiel0Jy7VcO1ug0iCfc+WbW7fUa0vYrUw5u6G8IhXglR1l/qR45tu/l9WeTo5XGqvxS3k1tPmF+t6Y8MXOVYui+3ZEb+ROHoq+HVEb3WtCo23bIhZrCwoNuZyHuKpTU474v/2M+dOSmDdDJhVgzUxn1oQDcd7w59C5+00oqxqgsLTBnHAIQ8vnoy9uPbiDWYH2kk1dwmFkWdqRU2nG9V2vw8e5rScOx/ZnX5YK6Dvw6Z6+VzYMepY8hT8++ZALMONKfQuqkxLhWf88rNvCZy2A54KwqTp1UnCQgPZ9H8Cz5ElYX93gsR38/COpgO3r5bata+FYHYrKve8jp7EDuW23USRLQveKhXDERc5agCMuAt0rF6JQdkpw5DS1o3LPbsFti1nLIxQplx7BljVyO3fSExUG/YYVyFMVIa/lOvLfewcdyxbAvTNq1gJobzu3Ue16G3nNnCNfDUP0cvRELwX5IF9SAbERchtftO+MRsOKUKjXhUG9JRJlSxegm4fUvn32OUB7ycYYNh/qzRFQh4cJTuK23Y+kVED/1nA5BxycwMZxbWUoml4IQdemVXBujwStPQpc3KZr8yo0hYWglXMRJ3FPrksF2F57Sc4BK4f9jZfhfmuzgPPNTWLO9oggG7IN8BDnAzxSAaWL5sk58C+emMS8x8S0PFIBjQf3yznwH0EqwAfIOTAThqZgpjXf7CAV4PAMyjkwFXa3R1xHx+9i4h4wzn/o6r8zKtb6XW4MjdwBnxLw+ofF3HRcD2D2AlxeH5yDXpgsjdBWmFBcVY3S2jr0DTiEKN/wCFpu3ERReQUM1TW4+VcXfFxQ0AQMDvmFiPQcJb5PTkHi+Qs4cEqGo2fS0dndCxrFlVX4OvEkvvjxOCrMDSISQRMQgM3pgtXhFPd0lV3OxOmsKyICdByd3T04xkVVNFhw994cCPDwSIyMjQtyGhVms4hIt61fPA/wcz+WnjF3Alw8DygKvXYHbvf0IlmhgDy/QCQdCeviQuZUAL04kX/1UyK++TkJB2XJ+JMLIWd0DHMugEqNMrysrh6GmlocP3ceOlMlhkfHRA7MuYCByXoPDD0vucOnU2HlR0IOe/oHRBJSuU4EswoCjYjelOqeGhENpVaHhIyzounQcPNSjU87g/qWVvF83zYIAty+IdGI1GVGXCpQ4Te9ARnKXHx5/AQqLU3CWUNbu5g7kpomypOaFdmQ7WMLoPKjClCo1Dh54SJSMhVIy85BbXMLRnhUKNzUGU+cPYdsjRYpiixc4tVBzcsz9AgCXF7vQ3OAOiJlO139PBfG7k4IJ5Qb9Ka0RiUZ2PPQkua+JAKcfJIvzGhEZxwAOZ7aIzwPrLunrE/z3zLN90Brh9zu8vCmMsY3DIozDCYcHJTIlNTNHdelAorLTPG1lmbYuUrfCA/nsB+D/uDA679/fBSBWstVaPTGIxIBXX22EH151UVdqQn1V1sF6ppagoIAX6mpBhpD+YUSY9Uz0s/ygQFWXtPA1MXGjzUGo4Fv1HCoggRNkcGoLykz7fvdVMP0HBIB/xf+Bi8VajXQRja5AAAAAElFTkSuQmCC"},function(e,t){e.exports="data:image/png;base64,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"},function(e,t){e.exports="data:image/png;base64,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"},function(e,t){e.exports="data:image/png;base64,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"},,,,function(e,t,n){e.exports=n(53)},,,,,function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAG2klEQVR42pVXaUxVRxSee+8DRNlEEA1qBGVLS8XIFllKqiBqUcQispgWLKgFFRsMmxuCiGgA/dM2VdvfJjbpkjRpUrv8aRrTdE2Tpqtt05q0tZVa68aj3zc583J98Cz8+N69983MmbN858wZdeTIEeXG4cOHNfh+4MAB59ChQ8FDQ0Pq+PHjqqKiInTRokV1juO8ppT6FrgGjALf479LGHtm8+bNsZw7MjKijh49GtTd3e0x8szTjQmbm+fBgwedY8eO6W9svCw+Pv5UUFDQZ5Zl/WXb9i3gHjAGeOX9NsZGg4ODv8LcF4qLi/M7Ozu14jDCCaTEpJtjgX3ixAm1ffv2OAh7DhbeAManiTtRUVEXysvLk/v7+1VPT48NuROUuO8PTuBELigoKNgAIT9RGCwzQn+NjIy8sHz58qb8/PziLVu2ZACP5OXlPZaTk/NUbGzsecz5wU+R66mpqTsRTtXb26v8lZiwOWKmUlJS9vht/GNycvKehoaGGI7TrfTQwMCABt8JymhqagrLzs6u9Xg8n3MtuKFlLFy48CTCSl5YbiXuczstT0pK2i0L7/EJq85i4zkcE07QlQ6E8WkJ9H8c6+vr00q1tLSELliwoMctC0qM0BMw1DFK6B8KowVw63pM9GLBHS5ISEho40RuTlLyfTIy+fFHz6Ui2EhlZWVVQdZNyLxLmfSkyLO1B+BSst0C4eYwxmQ1Jy5evLiNQuAyB1prK7GJMxVAsI0NLL4PDg4q8KNcPDGG520Q8yF6qaury6HGwdQ0Li7ueUMcuP0cLeHmjBvJwwX4nhJoIZXnWijjYehgUIfhVUhIyKV9+/bRQx41PDysNm3a9DAG/wHGMOHn+vr6CAixGC8KbG1tDcnMzGyYN29eF9AOZTsnA8Y6OCctLa1l165ds6m4GOBAhgIxP4R8etgLoq5nsdKMnj9//pCxfunSpbtNjAw3VqxYsXO6dQBeHKYCEg6b+4BjazBGQnrDwsLeoOdpfThi8wX/BK6C8ZF0GUNAhtP1RUVFG8RD3ilszjl3kMqtDAMU0GlHZdra2uiFj2TOn2VlZXMVUqOGxYKLw8PDLzDPQR7LnAnUkv+h4CxDSV4LlEDpNQFQgvFSIKe9vV2Hz8ghifmN1OylAgxFdHR0i4L1r+PjFv9EhXuaFjON3CnGhYzX6dOn1ZkzZx4IM4fWm1w3qU7ZpaWljwoZ6YVPFU8ypJ7OUZZXxhzks/09gIXZq1atehwoBdYGAMfWAYVguS0cMB6wyIOampokhsgVTnUN2jA/vZWVlRniAUvKs9Ya58ITzJDpkBAVtYNcIgnFAzqVq6qqojH+u5R5Gq6uuxRIdytgsoChmW4WIB0HxQOWnwJRGP/NrcAVfOgQ8FQTBXwhYPzhTk9GRkYVUnQP0Ay0BEAzzxLMrd+xY0eY+/TjkyGorq5OYDX0hQAkfIfNhBSHbbTYn4QUxK6IRWuqMKnsanB0SqMM57pI+B3TcKe0VboEi+W+NDQHTV1dXSzSKw1IAVIDgGNpSNl41HlNYLOeXuWZg8OoXdJwHGnYzUI0F8Xha3HJlcbGxlB3IaLbSkpKCpgtoijxdwCMSk25ijDUiBzLhHL//v0KLdv7stcNFKJEHRcQ5qwhD8putUlF05qlp6c/O10SonN6kZuyR6AsuN9CemZK/MdwIL2rj2MWDgzkSW6OofH8srm5OQiFhAstFhQQKhoVrB+Kvgycw8FzPgDOYfwlYAShSKAHyH42IKwlqP9vGvLB0G3kim6d2b3OmjXrotEejWgP4wftPQwFlSARp3ocE1IDNKHpZZymtYZ8CPknOB2DMM/DpsDDCWDnEsZFmoZxLKhkMwEhjtQFe4qwpG2zsM5DK1evXp0Fmf+a1gwVt0gaEo/voKASYGijdC6sCzfRyVTQElhvuWvDZP29353CNt017ge5sPoX3h0oG0f/SZln+5pS0xGzAUFannI3komJiR1wl84GOd0caUItyRTlbkw5h9Yx5qwrNERyfnzmzJmv7N27l7zy3RHua8vZMpM07F65wPSHiNkHcNs6nufkBjODCpm23LzTW0w1uHwlGw4xxGx+EeQOlWZnYltulKC76QlcJloZN3dqQZHLuP/14WQsqq2tTdq6dWs0MBsnXCI4tBJrOmbMmPGe1HjfOmTQSViu/Def9Grmvh2hSGVA87cC5Do3+YMHi+T2hDkoOpcLCwuLKds0qZNezQL09w7dyu41Nze3LCIi4lW5DfMyqrtbPl3vXsnxUSj9NrLoSaYawyO8efDl1F8JgncG1gl2Q/zeuHHj3JiYmGZs8rH0B3cFfP8GY52Ys4QymH5s6//vev4fhVL/4/SeszAAAAAASUVORK5CYII="},function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAFfklEQVR42qWXWWicVRiG/39mUim4NRq88MZWXIpLe+FS6lYKtZsW0UrRUmyllUIXpQiN3hXBC1sxdyom6q2lVRGhUqvFClURUVFUsu+ZmD2TTDKTycTn/fudcPzNJJMaeDOTnHO+7z3ffoLm5uagFFpaWpJ8LmloaAgaGxuD3t7epePj49unpqbeLhQKn4EvwQVwjv+dYm1fOp2u0t76+vqgqampAhmp+XTMqxwB0XcUr8pmsydQ8jPK0oYe0G3f+8AgGGDPn+x9t7+//8HW1taIODKSiyWQ0MGurq4bEKbbjoEZUATTYApMgglDrnDpp2j7hPzk5ORJyN9qJBLlEoiUDw4ObkNIhydQ6JHQ4eHhF1jfgLlXg7v5vn5oaGj3xMTE++xpjZ0ZyWQy+7Fo4Cw6H4GENnLgcExIu/6HRa7XugjOBcno7Oy8EjI7ccVvOstnJIP4OG4kwlIEopuj6JAdlElnuFUtiq/Tmt1ApkwiTJ+hIWF+TmiP9nZ0dChgj/my+LtGJPyYcAHnzL5VfuRAXgfGxsZe1rrWLCOCcuAHMO7agazs1CUWM7KkyYtiwm0OdUuL7KJTLiFAt/VvWQ4SdiYpZbjkCbOEAjhHYN7hLiWWS8QEU7/jfM73Ov3PlAfOrEZoQbi9Zu6UvnOhaic/n89/3dbWFq1FBQNGd7IwbinWiTWuRkjolLe3t1+BKZ8nJV8FRyH4ylxgrVp7RkdHDxIDyxwJXQQZARb4wSxcxCpbpTtiy6E3HTuYHnI+crGB8v2xrFgQEHrLBa0XYxtdvcjlcp9HMcDtr4LZr8Ysze2v8fI11MGBgYFtZqFiGcq1J0+wvWRyQnNnILOj6yfb8zc/VQGp8RR/9Mr8sDppfgtjUR1QcFZBdjN4FGwsAa1tAverDMcKT5Si6HvNKmmGorZbjGrFRqwx9d65Uk4H5a/FIF71nBv6+voesdKt/nEq4NcX1lByKq9+jvoW4OB9NJjHwCawuQS0tgU8jLkTMRKRO3t6em5ReVZ1Bd+KwFfW1bKq7UYgjPWF7ZYhZQchMVDtVc7AlXB0VJpy9YwzInDeCpAI3OUT8LJg72KzgMx6ww9Cj8C1rLeBFkfgrOeC9XEXWPSmRkZGdpCih8EBcLAEDqiXsHePmlI8DswFy9E1rHoDLioIP+JLvyKT4rCrVBBqKvqfQRjaVLXGglA6zyot9lhEFl0Jjqeh0N3dXcXhleA2cHsJaG0lZr7R0vlfWaCeg4WOWhqOkYYvilEVVvjLikMbplsaL0RE9UPms1FDpgRGLcLTuOHZeCFSbUDXBQvoIQrRTa4U17rgIeCe8eIgCkKEHVlsEHK792KlOOQi95j5p2lI56NSLH+x8IAKkRZg+AeNpILDUUuVEKxSiateh+iHoE6jVwnUsf4BqMGyy72OGHVVKu0ZV8656K6oGWl0lmlYPO2l0DFzQcqZ73LghhNL5Z2uV3DJX+iOumRKG1IWnTcrMGxoEMOn3UjtDSTlwO1VO0+Zhe/V9OxGM9J9nbk5FZ8H99nkop1Z0vJJu00YL88LjGSz8YPyNVZpC2bd407nf4ZS+Qlfn/AHSU0ymCv0htKkd9PAS9toZHMTkWSprugizu8E3seSpfiacyy3m4pEjdfbReY7zLbFxqiSY7lLNW69VgOHnXXKT2tSduRKPkwcCQ0U9uqZTS2E/ah+Tmdcp64GKsEysIIYWqsGhKJvrNDMntObQCNZXPmCTzOErkbg2di0U7CUVeHpstdTxpRO+1OTCDNNbXCZFFc+7+PUjdQyO758HJN+apNTxh6iae9xOmBVUBYbhvQ5sug5pdrlPk79B0aFUsleyVUUG/WOT8D39jS/CH7XJ2tH2LNCe60hJRd6nv8Dwj5T3q96iTAAAAAASUVORK5CYII="},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,,,,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n.r(t);var a=n(0),o=n.n(a),i=n(8),r=n.n(i),s=(n(30),n(1)),l=n(2),c=n(4),u=n(3),h=n(6),d=n(5),p=n(9),m=n(7),f=n(10),g=n.n(f),b=function(){function e(){Object(s.a)(this,e),this.names={},this.current_h=Math.random()}return Object(l.a)(e,[{key:"get",value:function(e){return"\u6d1e\u4e3b"===(e=e.toLowerCase())?["hsl(0,0%,97%)","hsl(0,0%,16%)"]:(this.names[e]||(this.current_h+=.618033988749895,this.current_h%=1,this.names[e]=["hsl(".concat(360*this.current_h,", 50%, 90%)"),"hsl(".concat(360*this.current_h,", 60%, 20%)")]),this.names[e])}}]),e}(),v=/(^|[^\d\u20e3\ufe0e\ufe0f])(#\d{1,7})(?![\d\u20e3\ufe0e\ufe0f])/g,E=/((?:https?:\/\/)?thuhole\.tech\/?#(?:#|%23)(\d{1,7}))(?!\d|\u20e3|\ufe0e|\ufe0f)/g,_=/(^|[^A-Za-z])((?:(?:Angry|Baby|Crazy|Diligent|Excited|Fat|Greedy|Hungry|Interesting|Jolly|Kind|Little|Magic|Na\xefve|Old|Powerful|Quiet|Rich|Superman|THU|Undefined|Valuable|Wifeless|Xiangbuchulai|Young|Zombie)\s)?(?:Alice|Bob|Carol|Dave|Eve|Francis|Grace|Hans|Isabella|Jason|Kate|Louis|Margaret|Nathan|Olivia|Paul|Queen|Richard|Susan|Thomas|Uma|Vivian|Winnie|Xander|Yasmine|Zach)|You Win(?: \d+)?|\u6d1e\u4e3b)(?![A-Za-z])/gi,A=/(^|[^.@a-zA-Z0-9_])((?:https?:\/\/)?(?:(?:[\w-]+\.)+[a-zA-Z]{2,3}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::\d{1,5})?(?:\/[\w~!@#$%^&*()\-_=+[\]{};:,./?|]*)?)(?![a-zA-Z0-9])/gi;function w(e,t){return e=[[null,e]],t.forEach(function(t){var n=Object(m.a)(t,2),a=n[0],o=n[1];e=[].concat.apply([],e.map(function(e){var t=Object(m.a)(e,2),n=t[0],i=t[1];return n?[e]:i.split(o).map(function(e){return o.test(e)?[a,e]:[null,e]}).filter(function(e){var t=Object(m.a)(e,2),n=t[0],a=t[1];return null!==n||a})}))}),e}var k=n(12),y=n.n(k),O=n(13),j=n.n(O),C=n(14),N=n.n(C),S=(n(34),n(35),n(15)),x=n.n(S),I=n(16),D=n.n(I),U=n(17),R=n.n(U),H=n(18),L=n.n(H),T=n(19),M=n.n(T),Q=n(20),P=n.n(Q),G=(n(36),n(37),n(21)),X=n.n(G),B="//api.thuhole.tech/";function F(e){if(!e.ok)throw Error("\u7f51\u7edc\u9519\u8bef ".concat(e.status," ").concat(e.statusText));return e.text().then(function(e){try{return JSON.parse(e)}catch(t){throw console.error("json parse error"),console.trace(t),console.log(e),new SyntaxError("JSON Parse Error "+e.substr(0,50))}})}function V(){return"&PKUHelperAPI=3.0&jsapiver="+encodeURIComponent((Object({NODE_ENV:"production",PUBLIC_URL:"//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io"}).REACT_APP_BUILD_INFO||"null")+"-"+2*Math.floor(+new Date/72e5))}var W="pkuhelper_login_popup_anchor";function Y(e){return e<10?"0"+e:""+e}function K(e){return"".concat(e.getMonth()+1,"-").concat(Y(e.getDate())," ").concat(e.getHours(),":").concat(Y(e.getMinutes()),":").concat(Y(e.getSeconds()))}var z=N()(j.a);function q(e){var t=new Date(1e3*e.stamp);return o.a.createElement("span",null,o.a.createElement(y.a,{date:t,formatter:z,title:t.toLocaleString("zh-CN",{timeZone:"Asia/Shanghai",hour12:!1})}),"\xa0",K(t))}function Z(e){return o.a.createElement("p",{className:"centered-line title-line aux-margin"},o.a.createElement("span",{className:"black-outline"},e.text))}x.a,D.a,R.a,L.a,M.a,P.a,X.a;var J=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={loading_status:"idle"},n.username_ref=o.a.createRef(),n.password_ref=o.a.createRef(),n.input_token_ref=o.a.createRef(),n.popup_anchor=document.getElementById(W),n.popup_anchor||(n.popup_anchor=document.createElement("div"),n.popup_anchor.id=W,document.body.appendChild(n.popup_anchor)),n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"do_sendcode",value:function(e){var t=this;"loading"!==this.state.loading_status&&this.setState({loading_status:"loading"},function(){fetch(B+"api_xmcp/login/send_code?user="+encodeURIComponent(t.username_ref.current.value)+"&code_type="+encodeURIComponent(e)+V(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({excluded_scopes:[]})}).then(F).then(function(e){if(console.log(e),!e.success)throw new Error(JSON.stringify(e));alert(e.msg),t.setState({loading_status:"done"})}).catch(function(e){console.error(e),alert("\u53d1\u9001\u5931\u8d25\n"+e),t.setState({loading_status:"done"})})})}},{key:"do_login",value:function(e){var t=this;"loading"!==this.state.loading_status&&this.setState({loading_status:"loading"},function(){fetch(B+"api_xmcp/login/login?user="+encodeURIComponent(t.username_ref.current.value)+"&valid_code="+encodeURIComponent(t.password_ref.current.value)+V(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({excluded_scopes:[]})}).then(F).then(function(n){if(0!==n.code){if(n.msg)throw new Error(n.msg);throw new Error(JSON.stringify(n))}e(n.user_token),alert("\u767b\u5f55\u6210\u529f"),t.setState({loading_status:"done"}),t.props.on_close()}).catch(function(e){console.error(e),alert("\u767b\u5f55\u5931\u8d25\n"+e),t.setState({loading_status:"done"})})})}},{key:"do_input_token",value:function(e){var t=this;if("loading"!==this.state.loading_status){var n=this.input_token_ref.current.value;this.setState({loading_status:"loading"},function(){fetch(B+"api_xmcp/hole/system_msg?user_token="+encodeURIComponent(n)+V()).then(function(e){return e.json()}).then(function(a){if(a.error)throw new Error(a.error);if(0===a.result.length)throw new Error("result check failed");t.setState({loading_status:"done"}),e(n),t.props.on_close()}).catch(function(e){alert("Token\u68c0\u9a8c\u5931\u8d25\n"+e),t.setState({loading_status:"done"}),console.error(e)})})}}},{key:"render",value:function(){var e=this;return r.a.createPortal(o.a.createElement("div",null,o.a.createElement("div",{className:"pkuhelper-login-popup-shadow"}),o.a.createElement("div",{className:"pkuhelper-login-popup"},o.a.createElement("p",null,o.a.createElement("b",null,"\u63a5\u6536\u9a8c\u8bc1\u7801\u6765\u767b\u5f55 T\u5927\u6811\u6d1e")),o.a.createElement("p",null,o.a.createElement("label",null,"\u3000\u90ae\u7bb1\xa0",o.a.createElement("input",{ref:this.username_ref,type:"email",autoFocus:!0,defaultValue:"@mails.tsinghua.edu.cn"})),o.a.createElement("span",{className:"pkuhelper-login-type"},o.a.createElement("a",{onClick:function(t){return e.do_sendcode("mail")}},"\xa0\u53d1\u9001\u90ae\u4ef6\xa0"))),o.a.createElement("p",null,o.a.createElement("label",null,"\u9a8c\u8bc1\u7801\xa0",o.a.createElement("input",{ref:this.password_ref,type:"tel"})),o.a.createElement("button",{type:"button",disabled:"loading"===this.state.loading_status,onClick:function(t){return e.do_login(e.props.token_callback)}},"\u767b\u5f55")),o.a.createElement("hr",null),o.a.createElement("p",null,o.a.createElement("b",null,"\u4ece\u5176\u4ed6\u8bbe\u5907\u5bfc\u5165\u767b\u5f55\u72b6\u6001")),o.a.createElement("p",null,o.a.createElement("input",{ref:this.input_token_ref,placeholder:"User Token"}),o.a.createElement("button",{type:"button",disabled:"loading"===this.state.loading_status,onClick:function(t){return e.do_input_token(e.props.token_callback)}},"\u5bfc\u5165")),o.a.createElement("hr",null),o.a.createElement("p",null,o.a.createElement("button",{onClick:this.props.on_close},"\u53d6\u6d88")))),this.popup_anchor)}}]),t}(a.Component),$=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={popup_show:!1},n.on_popup_bound=n.on_popup.bind(Object(h.a)(n)),n.on_close_bound=n.on_close.bind(Object(h.a)(n)),n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"on_popup",value:function(){this.setState({popup_show:!0})}},{key:"on_close",value:function(){this.setState({popup_show:!1})}},{key:"render",value:function(){return o.a.createElement(o.a.Fragment,null,this.props.children(this.on_popup_bound),this.state.popup_show&&o.a.createElement(J,{token_callback:this.props.token_callback,on_close:this.on_close_bound}))}}]),t}(a.Component),ee="hole_cache_db",te=1,ne=function(){function e(){var t=this;Object(s.a)(this,e),this.db=null,this.added_items_since_maintenance=0,this.encrypt=this.encrypt.bind(this),this.decrypt=this.decrypt.bind(this);var n=indexedDB.open(ee,te);n.onerror=console.error.bind(console),n.onupgradeneeded=function(e){console.log("comment cache db upgrade"),e.target.result.createObjectStore("comment",{keyPath:"pid"}).createIndex("last_access","last_access",{unique:!1})},n.onsuccess=function(e){console.log("comment cache db loaded"),t.db=e.target.result,setTimeout(t.maintenance.bind(t),1)}}return Object(l.a)(e,[{key:"encrypt",value:function(e,t){for(var n=JSON.stringify(t),a="",o=0,i=(42^e)%128;o1e3?(console.log("comment cache db maintenance",a),t.index("last_access").openKeyCursor().onsuccess=function(e){var n=e.target.result;n&&(t.delete(n.primaryKey),--a>1e3&&n.continue())}):console.log("comment cache db no need to maintenance",a),e.added_items_since_maintenance=0},n.onerror=console.error.bind(console)}}},{key:"clear",value:function(){this.db&&(indexedDB.deleteDatabase(ee),console.log("delete comment cache db"))}}]),e}();function ae(){return window.hole_cache||(window.hole_cache=new ne),window.hole_cache}function oe(e){return V()+(e?"&user_token="+e:"")}var ie={load_replies:function(e,t,n,a){return e=parseInt(e),fetch(re+"/api.php?action=getcomment&pid="+e+oe(t)).then(F).then(function(t){if(0!==t.code)throw t.msg?new Error(t.msg):new Error(JSON.stringify(t));return ae().delete(e).then(function(){ae().put(e,a,t)}),t.data=t.data.sort(function(e,t){return parseInt(e.cid,10)-parseInt(t.cid,10)}).map(function(e){return e._display_color=n.get(e.name),e.variant={},e}),t})},load_replies_with_cache:function(e,t,n,a){return e=parseInt(e),ae().get(e,a).then(function(o){return o?(o.data=o.data.sort(function(e,t){return parseInt(e.cid,10)-parseInt(t.cid,10)}).map(function(e){return e._display_color=n.get(e.name),e.variant={},e}),o):ie.load_replies(e,t,n,a)})},set_attention:function(e,t,n){var a=new URLSearchParams;return a.append("user_token",n),a.append("pid",e),a.append("switch",t?"1":"0"),fetch(re+"/api.php?action=attention"+oe(n),{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:a}).then(F).then(function(t){if(ae().delete(e),0!==t.code&&(!t.msg||"\u5df2\u7ecf\u5173\u6ce8\u8fc7\u4e86"!==t.msg))throw t.msg&&alert(t.msg),new Error(JSON.stringify(t));return t})},report:function(e,t,n){var a=new URLSearchParams;return a.append("user_token",n),a.append("pid",e),a.append("reason",t),fetch(re+"/api.php?action=report"+oe(n),{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:a}).then(F).then(function(e){if(0!==e.code)throw e.msg&&alert(e.msg),new Error(JSON.stringify(e));return e})},get_list:function(e,t){return fetch(re+"/api.php?action=getlist&p="+e+oe(t)).then(F).then(function(e){if(0!==e.code)throw new Error(JSON.stringify(e));return e})},get_search:function(e,t,n){return fetch(re+"/api.php?action=search&pagesize=50&page="+e+"&keywords="+encodeURIComponent(t)+oe(n)).then(F).then(function(e){if(0!==e.code){if(e.msg)throw new Error(e.msg);throw new Error(JSON.stringify(e))}return e})},get_single:function(e,t){return fetch(re+"/api.php?action=getone&pid="+e+oe(t)).then(F).then(function(e){if(0!==e.code)throw e.msg?new Error(e.msg):new Error(JSON.stringify(e));return e})},get_attention:function(e){return fetch(re+"/api.php?action=getattention"+oe(e)).then(F).then(function(e){if(0!==e.code){if(e.msg)throw new Error(e.msg);throw new Error(JSON.stringify(e))}return e})}},re=(n(38),B+"services/thuhole");function se(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function le(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"g";return e?new RegExp("(".concat(e.split(t).filter(function(e){return!!e}).map(se).join("|"),")"),n):/^$/g}function ce(e){return o.a.createElement("span",{className:"colored-span",style:{"--coloredspan-bgcolor-light":e.colors[0],"--coloredspan-bgcolor-dark":e.colors[1]}},e.children)}var ue=function(e){function t(){return Object(s.a)(this,t),Object(c.a)(this,Object(u.a)(t).apply(this,arguments))}return Object(d.a)(t,e),Object(l.a)(t,[{key:"render",value:function(){var e=this;return o.a.createElement("pre",null,this.props.parts.map(function(t,n){var a,i=Object(m.a)(t,2),r=i[0],s=i[1];return o.a.createElement("span",{key:n},"url_pid"===r?o.a.createElement("span",{className:"url-pid-link",title:s},"/##"):"url"===r?o.a.createElement("a",{href:(a=s,/^https?:\/\//.test(a)?a:"http://"+a),target:"_blank",rel:"noopener"},s):"pid"===r?o.a.createElement("a",{href:"#"+s,onClick:function(t){t.preventDefault(),e.props.show_pid(s.substring(1))}},s):"nickname"===r?o.a.createElement(ce,{colors:e.props.color_picker.get(s)},s):"search"===r?o.a.createElement("span",{className:"search-query-highlight"},s):s)}))}}]),t}(a.PureComponent);window.TEXTAREA_BACKUP={};var he=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={text:""},n.on_change_bound=n.on_change.bind(Object(h.a)(n)),n.on_keydown_bound=n.on_keydown.bind(Object(h.a)(n)),n.clear=n.clear.bind(Object(h.a)(n)),n.area_ref=o.a.createRef(),n.change_callback=e.on_change||function(){},n.submit_callback=e.on_submit||function(){},n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"componentDidMount",value:function(){var e=this;this.setState({text:window.TEXTAREA_BACKUP[this.props.id]||""},function(){e.change_callback(e.state.text)})}},{key:"componentWillUnmount",value:function(){window.TEXTAREA_BACKUP[this.props.id]=this.state.text,this.change_callback(this.state.text)}},{key:"on_change",value:function(e){this.setState({text:e.target.value}),this.change_callback(e.target.value)}},{key:"on_keydown",value:function(e){"Enter"===e.key&&e.ctrlKey&&!e.altKey&&(e.preventDefault(),this.submit_callback())}},{key:"clear",value:function(){this.setState({text:""})}},{key:"set",value:function(e){this.change_callback(e),this.setState({text:e})}},{key:"get",value:function(){return this.state.text}},{key:"focus",value:function(){this.area_ref.current.focus()}},{key:"render",value:function(){return o.a.createElement("textarea",{ref:this.area_ref,onChange:this.on_change_bound,value:this.state.text,onKeyDown:this.on_keydown_bound})}}]),t}(a.Component),de=null;function pe(e){var t=/iPhone|iPad|iPod/i.test(window.navigator.userAgent);return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone?null:t?navigator.standalone?null:o.a.createElement("div",{className:"box promotion-bar"},o.a.createElement("span",{className:"icon icon-about"}),"\xa0 \u7528 Safari \u628a\u6811\u6d1e ",o.a.createElement("b",null,"\u6dfb\u52a0\u5230\u4e3b\u5c4f\u5e55")," \u66f4\u597d\u7528"):de?o.a.createElement("div",{className:"box promotion-bar"},o.a.createElement("span",{className:"icon icon-about"}),"\xa0 \u628a\u7f51\u9875\u7248\u6811\u6d1e ",o.a.createElement("b",null,o.a.createElement("a",{onClick:function(){de&&de.prompt()}},"\u5b89\u88c5\u5230\u684c\u9762"))," \u66f4\u597d\u7528"):null}window.addEventListener("beforeinstallprompt",function(e){console.log("pwa: received before install prompt"),de=e});var me=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={moved:!0,init_y:0,init_x:0},n.on_begin_bound=n.on_begin.bind(Object(h.a)(n)),n.on_move_bound=n.on_move.bind(Object(h.a)(n)),n.on_end_bound=n.on_end.bind(Object(h.a)(n)),n.MOVE_THRESHOLD=3,n.last_fire=0,n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"on_begin",value:function(e){this.setState({moved:!1,init_y:(e.touches?e.touches[0]:e).screenY,init_x:(e.touches?e.touches[0]:e).screenX})}},{key:"on_move",value:function(e){this.state.moved||Math.abs((e.touches?e.touches[0]:e).screenY-this.state.init_y)+Math.abs((e.touches?e.touches[0]:e).screenX-this.state.init_x)>this.MOVE_THRESHOLD&&this.setState({moved:!0})}},{key:"on_end",value:function(e){this.state.moved||this.do_callback(e),this.setState({moved:!0})}},{key:"do_callback",value:function(e){this.last_fire+100>+new Date||(this.last_fire=+new Date,this.props.callback(e))}},{key:"render",value:function(){return o.a.createElement("div",{onTouchStart:this.on_begin_bound,onMouseDown:this.on_begin_bound,onTouchMove:this.on_move_bound,onMouseMove:this.on_move_bound,onClick:this.on_end_bound},this.props.children)}}]),t}(a.PureComponent);n(39);function fe(e,t,n,a){a=a||!1,e.addEventListener?e.addEventListener(t,n,a):e.attachEvent&&e.attachEvent("on".concat(t),function(t){n.call(e,t||window.event)})}function ge(e,t,n,a){a=a||!1,e.removeEventListener?e.removeEventListener(t,n,a):e.detachEvent&&e.detachEvent("on".concat(t),n)}var be=function(e){if(!(e instanceof HTMLElement))return document.documentElement;for(var t="absolute"===e.style.position,n=/(scroll|auto)/,a=e;a;){if(!a.parentNode)return e.ownerDocument||document.documentElement;var o=window.getComputedStyle(a),i=o.position,r=o.overflow,s=o["overflow-x"],l=o["overflow-y"];if("static"===i&&t)a=a.parentNode;else{if(n.test(r)&&n.test(s)&&n.test(l))return a;a=a.parentNode}}return e.ownerDocument||e.documentElement||document.documentElement};var ve=0,Ee=0,_e="data-lazyload-listened",Ae=[],we=[],ke=!1;try{var ye=Object.defineProperty({},"passive",{get:function(){ke=!0}});window.addEventListener("test",null,ye)}catch(wt){}var Oe,je=!!ke&&{capture:!1,passive:!0},Ce=function(e){var t=r.a.findDOMNode(e);if(t instanceof HTMLElement){var n=be(t);(e.props.overflow&&n!==t.ownerDocument&&n!==document&&n!==document.documentElement?function(e,t){var n,a,o=r.a.findDOMNode(e);try{var i=t.getBoundingClientRect();n=i.top,a=i.height}catch(wt){n=ve,a=Ee}var s,l,c=window.innerHeight||document.documentElement.clientHeight,u=Math.max(n,0),h=Math.min(c,n+a)-u;try{var d=o.getBoundingClientRect();s=d.top,l=d.height}catch(wt){s=ve,l=Ee}var p=s-u,m=Array.isArray(e.props.offset)?e.props.offset:[e.props.offset,e.props.offset];return p-m[0]<=h&&p+l+m[1]>=0}(e,n):function(e){var t,n,a=r.a.findDOMNode(e);if(!(a.offsetWidth||a.offsetHeight||a.getClientRects().length))return!1;try{var o=a.getBoundingClientRect();t=o.top,n=o.height}catch(wt){t=ve,n=Ee}var i=window.innerHeight||document.documentElement.clientHeight,s=Array.isArray(e.props.offset)?e.props.offset:[e.props.offset,e.props.offset];return t-s[0]<=i&&t+n+s[1]>=0}(e))?e.state.visible&&!e.state.hidden||(e.props.once&&we.push(e),e.setState({visible:!0,hidden:!1})):e.props.once||(e.props.unmountIfInvisible?!0===e.visible&&e.setState({visible:!1}):e.props.hiddenIfInvisible&&!1===e.state.hidden&&e.setState({hidden:!0}))}},Ne=function(){for(var e=0;e=0?a=setTimeout(l,t-c):(a=null,n||(s=e.apply(i,o),a||(i=null,o=null)))};return function(){i=this,o=arguments,r=+new Date;var c=n&&!a;return a||(a=setTimeout(l,t)),c&&(s=e.apply(i,o),i=null,o=null),s}}(Ne,"number"===typeof this.props.debounce?this.props.debounce:300),Oe="debounce"):void 0!==this.props.throttle?(Se=function(e,t,n){var a,o;return t||(t=250),function(){var i=n||this,r=+new Date,s=arguments;a&&rWe&&(i=i*We/e,e=We,r=!0),i>We&&(e=e*We/i,i=We,r=!0),i*e>Ye){var s=Math.sqrt(i*e/Ye);i/=s,e/=s,r=!0}console.log("chosen img size",e,i);var l=document.createElement("canvas"),c=l.getContext("2d");l.width=e,l.height=i,c.drawImage(o,0,0,e,i);for(var u,h,d=.1,p=.9;p-d>=.03;)u=(p+d)/2,h=l.toDataURL("image/jpeg",u),console.log(d,p,"trying quality",u,"size",h.length),h.length<=Ke?d=u:p=u;d>=.101?(console.log("chosen img quality",u),t({img:a(h),quality:u,width:Math.round(e),height:Math.round(i),compressed:r})):n("\u56fe\u7247\u8fc7\u5927\uff0c\u65e0\u6cd5\u4e0a\u4f20")},o.src=e}(e)})},o.readAsDataURL(e)})}},{key:"on_img_change",value:function(){var e=this;this.img_ref.current&&this.img_ref.current.files.length?this.setState({img_tip:"\uff08\u6b63\u5728\u5904\u7406\u56fe\u7247\u2026\u2026\uff09"},function(){e.proc_img(e.img_ref.current.files[0]).then(function(t){e.setState({img_tip:"\uff08".concat(t.compressed?"\u538b\u7f29\u5230":"\u5c3a\u5bf8"," ").concat(t.width,"*").concat(t.height," / ")+"\u8d28\u91cf ".concat(Math.floor(100*t.quality),"% / ").concat(Math.floor(t.img.length/(4/3)/1e3),"KB\uff09")})}).catch(function(t){e.setState({img_tip:"\u56fe\u7247\u65e0\u6548\uff1a".concat(t)})})}):this.setState({img_tip:null})}},{key:"on_submit",value:function(e){var t=this;e&&e.preventDefault(),"loading"!==this.state.loading_status&&(this.img_ref.current.files.length?(this.setState({loading_status:"processing"}),this.proc_img(this.img_ref.current.files[0]).then(function(e){t.setState({loading_status:"loading"}),t.do_post(t.state.text,e.img)}).catch(function(e){alert(e)})):(this.setState({loading_status:"loading"}),this.do_post(this.state.text,null)))}},{key:"render",value:function(){var e=this;return o.a.createElement("form",{onSubmit:this.on_submit.bind(this),className:"post-form box"},o.a.createElement("div",{className:"post-form-bar"},o.a.createElement("label",null,"\u56fe\u7247",o.a.createElement("input",{ref:this.img_ref,type:"file",accept:"image/*",disabled:"done"!==this.state.loading_status,onChange:this.on_img_change_bound})),"done"!==this.state.loading_status?o.a.createElement("button",{disabled:"disabled"},o.a.createElement("span",{className:"icon icon-loading"}),"\xa0\u6b63\u5728","processing"===this.state.loading_status?"\u5904\u7406":"\u4e0a\u4f20"):o.a.createElement("button",{type:"submit"},o.a.createElement("span",{className:"icon icon-send"}),"\xa0\u53d1\u8868")),!!this.state.img_tip&&o.a.createElement("p",{className:"post-form-img-tip"},o.a.createElement("a",{onClick:function(){e.img_ref.current.value="",e.on_img_change()}},"\u5220\u9664\u56fe\u7247"),this.state.img_tip),o.a.createElement(he,{ref:this.area_ref,id:"new_post",on_change:this.on_change_bound,on_submit:this.on_submit.bind(this)}),o.a.createElement("p",null,o.a.createElement("small",null,"\u8bf7\u9075\u5b88",o.a.createElement("a",{href:"http://pkuhelper.pku.edu.cn/treehole_rules.html",target:"_blank"},"\u6811\u6d1e\u7ba1\u7406\u89c4\u8303"),"\uff0c\u6587\u660e\u53d1\u8a00")))}}]),t}(a.Component),et=B+"/images/",tt={a:!0,audio:!0},nt=[];window.LATEST_POST_ID=parseInt(localStorage._LATEST_POST_ID,10)||0;function at(e,t){return function(n){var a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=new b,r="\u6811\u6d1e #"+n;e(r,o.a.createElement("div",{className:"box box-tip"},"\u6b63\u5728\u52a0\u8f7d #",n),a?"replace":"push"),ie.get_single(n,t).then(function(e){return e.data.variant={},new Promise(function(a,o){ie.load_replies_with_cache(n,t,i,parseInt(e.data.reply)).then(function(t){a([e,t])}).catch(o)})}).then(function(n){var a=Object(m.a)(n,2),s=a[0],l=a[1];e(r,o.a.createElement(rt,{key:+new Date,info:s.data,replies:l.data,attention:l.attention,token:t,show_sidebar:e,color_picker:i,deletion_detect:"on"===localStorage.DELETION_DETECT}),"replace")}).catch(function(a){console.error(a),e(r,o.a.createElement("div",{className:"box box-tip"},o.a.createElement("p",null,o.a.createElement("a",{onClick:function(){return at(e,t)(n,!0)}},"\u91cd\u65b0\u52a0\u8f7d")),o.a.createElement("p",null,""+a)),"replace")})}}var ot=function(e){function t(e){return Object(s.a)(this,t),Object(c.a)(this,Object(u.a)(t).call(this,e))}return Object(d.a)(t,e),Object(l.a)(t,[{key:"render",value:function(){var e=this,t=w(this.props.info.text,[["url_pid",E],["url",A],["pid",v],["nickname",_]]);return o.a.createElement("div",{className:"flow-reply box",style:this.props.info._display_color?{"--box-bgcolor-light":this.props.info._display_color[0],"--box-bgcolor-dark":this.props.info._display_color[1]}:null},o.a.createElement("div",{className:"box-header"},o.a.createElement("code",{className:"box-id"},"#",this.props.info.cid),!!this.props.do_filter_name&&o.a.createElement("span",{className:"reply-header-badge clickable",onClick:function(){e.props.do_filter_name(e.props.info.name)}},o.a.createElement("span",{className:"icon icon-locate"})),"\xa0",null!==this.props.info.tag&&o.a.createElement("span",{className:"box-header-tag"},this.props.info.tag),o.a.createElement(q,{stamp:this.props.info.timestamp})),o.a.createElement("div",{className:"box-content"},o.a.createElement(ue,{parts:t,color_picker:this.props.color_picker,show_pid:this.props.show_pid})))}}]),t}(a.PureComponent),it=function(e){function t(e){return Object(s.a)(this,t),Object(c.a)(this,Object(u.a)(t).call(this,e))}return Object(d.a)(t,e),Object(l.a)(t,[{key:"copy_link",value:function(e){e.preventDefault(),g()("".concat(e.target.href).concat(this.props.info.tag?" \u3010"+this.props.info.tag+"\u3011":"","\n")+"".concat(this.props.info.text).concat("image"===this.props.info.type?" [\u56fe\u7247]":"audio"===this.props.info.type?" [\u8bed\u97f3]":"","\n")+"\uff08".concat(K(new Date(1e3*this.props.info.timestamp))," ").concat(this.props.info.likenum,"\u5173\u6ce8 ").concat(this.props.info.reply,"\u56de\u590d\uff09\n")+this.props.replies.map(function(e){return(e.tag?"\u3010"+e.tag+"\u3011":"")+e.text}).join("\n"))}},{key:"render",value:function(){var e=this,t=this.props,n=t.parts||w(t.info.text,[["url_pid",E],["url",A],["pid",v],["nickname",_]]);return o.a.createElement("div",{className:"flow-item"+(t.is_quote?" flow-item-quote":"")},!!t.is_quote&&o.a.createElement("div",{className:"quote-tip black-outline"},o.a.createElement("div",null,o.a.createElement("span",{className:"icon icon-quote"})),o.a.createElement("div",null,o.a.createElement("small",null,"\u63d0\u5230"))),o.a.createElement("div",{className:"box"},!!window.LATEST_POST_ID&&parseInt(t.info.pid,10)>window.LATEST_POST_ID&&o.a.createElement("div",{className:"flow-item-dot"}),o.a.createElement("div",{className:"box-header"},!!this.props.do_filter_name&&o.a.createElement("span",{className:"reply-header-badge clickable",onClick:function(){e.props.do_filter_name("\u6d1e\u4e3b")}},o.a.createElement("span",{className:"icon icon-locate"})),!!parseInt(t.info.likenum,10)&&o.a.createElement("span",{className:"box-header-badge"},t.info.likenum,"\xa0",o.a.createElement("span",{className:"icon icon-"+(t.attention?"star-ok":"star")})),!!parseInt(t.info.reply,10)&&o.a.createElement("span",{className:"box-header-badge"},t.info.reply,"\xa0",o.a.createElement("span",{className:"icon icon-reply"})),o.a.createElement("code",{className:"box-id"},o.a.createElement("a",{href:"##"+t.info.pid,onClick:this.copy_link.bind(this)},"#",t.info.pid)),"\xa0",null!==t.info.tag&&o.a.createElement("span",{className:"box-header-tag"},t.info.tag),o.a.createElement(q,{stamp:t.info.timestamp})),o.a.createElement("div",{className:"box-content"},o.a.createElement(ue,{parts:n,color_picker:t.color_picker,show_pid:t.show_pid}),"image"===t.info.type&&o.a.createElement("p",{className:"img"},t.img_clickable?o.a.createElement("a",{className:"no-underline",href:et+t.info.url,target:"_blank"},o.a.createElement("img",{src:et+t.info.url})):o.a.createElement("img",{src:et+t.info.url})),"audio"===t.info.type&&o.a.createElement(Re,{src:"//api.thuhole.tech/services/thuhole/audios/"+t.info.url})),!(!t.attention||!t.info.variant.latest_reply)&&o.a.createElement("p",{className:"box-footer"},"\u6700\u65b0\u56de\u590d ",o.a.createElement(q,{stamp:t.info.variant.latest_reply}))))}}]),t}(a.PureComponent),rt=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={attention:e.attention,info:e.info,replies:e.replies,loading_status:"done",error_msg:null,filter_name:null,rev:!1},n.color_picker=e.color_picker,n.syncState=e.sync_state||function(){},n.reply_ref=o.a.createRef(),n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"set_variant",value:function(e,t){this.setState(function(n){return e?{replies:n.replies.map(function(n){return n.cid===e?Object.assign({},n,{variant:Object.assign({},n.variant,t)}):n})}:{info:Object.assign({},n.info,{variant:Object.assign({},n.info.variant,t)})}},function(){this.syncState({info:this.state.info,replies:this.state.replies})})}},{key:"load_replies",value:function(){var e=this,t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.setState({loading_status:"loading",error_msg:null}),ie.load_replies(this.state.info.pid,this.props.token,this.color_picker,null).then(function(n){e.setState(function(e,a){return{replies:n.data,info:t?Object.assign({},e.info,{reply:""+n.data.length}):e.info,attention:!!n.attention,loading_status:"done",error_msg:null}},function(){e.syncState({replies:e.state.replies,attention:e.state.attention,info:e.state.info}),e.state.replies.length&&e.set_variant(null,{latest_reply:Math.max.apply(null,e.state.replies.map(function(e){return parseInt(e.timestamp)}))})})}).catch(function(t){console.error(t),e.setState({replies:[],loading_status:"done",error_msg:""+t})})}},{key:"toggle_attention",value:function(){var e=this;this.setState({loading_status:"loading"});var t=!this.state.attention;ie.set_attention(this.state.info.pid,t,this.props.token).then(function(n){e.setState({loading_status:"done",attention:t}),e.syncState({attention:t})}).catch(function(t){e.setState({loading_status:"done"}),alert("\u8bbe\u7f6e\u5173\u6ce8\u5931\u8d25"),console.error(t)})}},{key:"report",value:function(){var e=prompt("\u4e3e\u62a5 #".concat(this.state.info.pid," \u7684\u7406\u7531\uff1a"));null!==e&&ie.report(this.state.info.pid,e,this.props.token).then(function(e){alert("\u4e3e\u62a5\u6210\u529f")}).catch(function(e){alert("\u4e3e\u62a5\u5931\u8d25"),console.error(e)})}},{key:"set_filter_name",value:function(e){this.setState(function(t){return{filter_name:e===t.filter_name?null:e}})}},{key:"toggle_rev",value:function(){this.setState(function(e){return{rev:!e.rev}})}},{key:"show_reply_bar",value:function(e,t){if(this.reply_ref.current&&!t.target.closest("a, .clickable")){var n=this.reply_ref.current.get();if(/^\s*(?:Re (?:|\u6d1e\u4e3b|(?:[A-Z][a-z]+ )?(?:[A-Z][a-z]+)|You Win(?: \d+)?):)?\s*$/.test(n)){var a="Re "+e+": ";a===this.reply_ref.current.get()?this.reply_ref.current.set(""):this.reply_ref.current.set(a)}}}},{key:"render",value:function(){var e=this;if("loading"===this.state.loading_status)return o.a.createElement("p",{className:"box box-tip"},"\u52a0\u8f7d\u4e2d\u2026\u2026");var t=at(this.props.show_sidebar,this.props.token),n=this.state.filter_name?this.state.replies.filter(function(t){return t.name===e.state.filter_name}):this.state.replies.slice();this.state.rev&&n.reverse();var a=(this.state.rev?"y-":"n-")+(this.state.filter_name||"null"),i=Object(p.a)({},"\u6d1e\u4e3b",1);n.forEach(function(e){void 0===i[e.name]&&(i[e.name]=0),i[e.name]++});var r=this.state.filter_name&&"\u6d1e\u4e3b"!==this.state.filter_name?null:o.a.createElement(me,{callback:function(t){e.show_reply_bar("",t)}},o.a.createElement(it,{info:this.state.info,attention:this.state.attention,img_clickable:!0,color_picker:this.color_picker,show_pid:t,replies:this.state.replies,set_variant:function(t){e.set_variant(null,t)},do_filter_name:i["\u6d1e\u4e3b"]>1?this.set_filter_name.bind(this):null}));return o.a.createElement("div",{className:"flow-item-row sidebar-flow-item"},o.a.createElement("div",{className:"box box-tip"},!!this.props.token&&o.a.createElement("span",null,o.a.createElement("a",{onClick:this.report.bind(this)},o.a.createElement("span",{className:"icon icon-flag"}),o.a.createElement("label",null,"\u4e3e\u62a5")),"\xa0\xa0"),o.a.createElement("a",{onClick:this.load_replies.bind(this)},o.a.createElement("span",{className:"icon icon-refresh"}),o.a.createElement("label",null,"\u5237\u65b0")),(this.state.replies.length>=1||this.state.rev)&&o.a.createElement("span",null,"\xa0\xa0",o.a.createElement("a",{onClick:this.toggle_rev.bind(this)},o.a.createElement("span",{className:"icon icon-order-rev"}),o.a.createElement("label",null,this.state.rev?"\u8fd8\u539f":"\u9006\u5e8f"))),!!this.props.token&&o.a.createElement("span",null,"\xa0\xa0",o.a.createElement("a",{onClick:function(){e.toggle_attention()}},this.state.attention?o.a.createElement("span",null,o.a.createElement("span",{className:"icon icon-star-ok"}),o.a.createElement("label",null,"\u5df2\u5173\u6ce8")):o.a.createElement("span",null,o.a.createElement("span",{className:"icon icon-star"}),o.a.createElement("label",null,"\u672a\u5173\u6ce8"))))),!!this.state.filter_name&&o.a.createElement("div",{className:"box box-tip flow-item filter-name-bar"},o.a.createElement("p",null,o.a.createElement("span",{style:{float:"left"}},o.a.createElement("a",{onClick:function(){e.set_filter_name(null)}},"\u8fd8\u539f")),o.a.createElement("span",{className:"icon icon-locate"}),"\xa0\u5f53\u524d\u53ea\u770b\xa0",o.a.createElement(ce,{colors:this.color_picker.get(this.state.filter_name)},this.state.filter_name))),!this.state.rev&&r,!!this.state.error_msg&&o.a.createElement("div",{className:"box box-tip flow-item"},o.a.createElement("p",null,"\u56de\u590d\u52a0\u8f7d\u5931\u8d25"),o.a.createElement("p",null,this.state.error_msg)),this.props.deletion_detect&&parseInt(this.state.info.reply)>this.state.replies.length&&!!this.state.replies.length&&o.a.createElement("div",{className:"box box-tip flow-item box-danger"},parseInt(this.state.info.reply)-this.state.replies.length," \u6761\u56de\u590d\u88ab\u5220\u9664"),n.map(function(n){return o.a.createElement(Ie,{key:n.cid+a,offset:1500,height:"5em",overflow:!0,once:!0},o.a.createElement(me,{callback:function(t){e.show_reply_bar(n.name,t)}},o.a.createElement(ot,{info:n,color_picker:e.color_picker,show_pid:t,set_variant:function(t){e.set_variant(n.cid,t)},do_filter_name:i[n.name]>1?e.set_filter_name.bind(e):null})))}),this.state.rev&&r,this.props.token?o.a.createElement(Je,{pid:this.state.info.pid,token:this.props.token,area_ref:this.reply_ref,on_complete:this.load_replies.bind(this)}):o.a.createElement("div",{className:"box box-tip flow-item"},"\u767b\u5f55\u540e\u53ef\u4ee5\u56de\u590d\u6811\u6d1e"))}}]),t}(a.PureComponent),st=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={replies:[],reply_status:"done",reply_error:null,info:Object.assign({},e.info,{variant:{}}),attention:null!==e.attention_override&&e.attention_override},n.color_picker=new b,n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"componentDidMount",value:function(){parseInt(this.state.info.reply,10)&&this.load_replies(null,!1)}},{key:"load_replies",value:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];console.log("fetching reply",this.state.info.pid),this.setState({reply_status:"loading",reply_error:null}),ie.load_replies_with_cache(this.state.info.pid,this.props.token,this.color_picker,parseInt(this.state.info.reply)).then(function(a){t.setState(function(e,t){return{replies:a.data,info:Object.assign({},e.info,{reply:n?""+a.data.length:e.info.reply,variant:a.data.length?{latest_reply:Math.max.apply(null,a.data.map(function(e){return parseInt(e.timestamp)}))}:{}}),attention:!!a.attention,reply_status:"done",reply_error:null}},e)}).catch(function(n){console.error(n),t.setState({replies:[],reply_status:"failed",reply_error:""+n},e)})}},{key:"show_sidebar",value:function(){this.props.show_sidebar("\u6811\u6d1e #"+this.state.info.pid,o.a.createElement(rt,{key:+new Date,info:this.state.info,replies:this.state.replies,attention:this.state.attention,sync_state:this.setState.bind(this),token:this.props.token,show_sidebar:this.props.show_sidebar,color_picker:this.color_picker,deletion_detect:this.props.deletion_detect}))}},{key:"render",value:function(){var e=this,t=at(this.props.show_sidebar,this.props.token,this.state.info.pid),n=[["url_pid",E],["url",A],["pid",v],["nickname",_]];this.props.search_param&&n.push(["search",le(this.props.search_param," ","gi")]);var a=w(this.state.info.text,n),i=null;if(!this.props.is_quote){var r=!0,s=!1,l=void 0;try{for(var c,u=a[Symbol.iterator]();!(r=(c=u.next()).done);r=!0){var h=c.value,d=Object(m.a)(h,2),p=d[0],f=d[1];if(f=f.length>0?f.substring(1):f,"pid"===p&&-1===nt.indexOf(f)&&parseInt(f)10&&o.a.createElement("div",{className:"box box-tip"},"\u8fd8\u6709 ",this.state.replies.length-10," \u6761")));return i?o.a.createElement("div",null,g,o.a.createElement(lt,{pid:i,show_sidebar:this.props.show_sidebar,token:this.props.token,deletion_detect:this.props.deletion_detect})):g}}]),t}(a.PureComponent),lt=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={loading_status:"empty",error_msg:null,info:null},n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"componentDidMount",value:function(){this.load()}},{key:"load",value:function(){var e=this;this.setState({loading_status:"loading"},function(){ie.get_single(e.props.pid,e.props.token).then(function(t){e.setState({loading_status:"done",info:t.data})}).catch(function(t){-1!==(""+t).indexOf("\u6ca1\u6709\u8fd9\u6761\u6811\u6d1e")?e.setState({loading_status:"empty"}):e.setState({loading_status:"error",error_msg:""+t})})})}},{key:"render",value:function(){return"empty"===this.state.loading_status?null:"loading"===this.state.loading_status?o.a.createElement("div",{className:"aux-margin"},o.a.createElement("div",{className:"box box-tip"},o.a.createElement("span",{className:"icon icon-loading"}),"\u63d0\u5230\u4e86 #",this.props.pid)):"error"===this.state.loading_status?o.a.createElement("div",{className:"aux-margin"},o.a.createElement("div",{className:"box box-tip"},o.a.createElement("p",null,o.a.createElement("a",{onClick:this.load.bind(this)},"\u91cd\u65b0\u52a0\u8f7d")),o.a.createElement("p",null,this.state.error_msg))):o.a.createElement(st,{info:this.state.info,show_sidebar:this.props.show_sidebar,token:this.props.token,is_quote:!0,deletion_detect:this.props.deletion_detect})}}]),t}(a.PureComponent);function ct(e){return o.a.createElement(ze.Consumer,null,function(t){var n=t.value;return o.a.createElement("div",{className:"flow-chunk"},!!e.title&&o.a.createElement(Z,{text:e.title}),e.list.map(function(t,a){return o.a.createElement(Ie,{key:t.pid,offset:1500,height:"15em",hiddenIfInvisible:!0},o.a.createElement("div",null,!!(e.deletion_detect&&"list"===e.mode&&a&&e.list[a-1].pid-t.pid>1)&&o.a.createElement("div",{className:"flow-item-row"},o.a.createElement("div",{className:"box box-tip flow-item box-danger"},e.list[a-1].pid-t.pid-1," \u6761\u88ab\u5220\u9664")),o.a.createElement(st,{info:t,show_sidebar:e.show_sidebar,token:n,attention_override:"attention_finished"===e.mode||null,deletion_detect:e.deletion_detect,search_param:e.search_param})))}))})}var ut=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={mode:e.mode,search_param:e.search_text,loaded_pages:0,chunks:{title:"",data:[]},loading_status:"done",error_msg:null},n.on_scroll_bound=n.on_scroll.bind(Object(h.a)(n)),window.LATEST_POST_ID=parseInt(localStorage._LATEST_POST_ID,10)||0,n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"load_page",value:function(e){var t=this,n=function(e){console.error(e),t.setState(function(t,n){return{loaded_pages:t.loaded_pages-1,loading_status:"failed",error_msg:""+e}})};if(e>this.state.loaded_pages+1)throw new Error("bad page");if(e===this.state.loaded_pages+1){if(console.log("fetching page",e),"list"===this.state.mode)ie.get_list(e,this.props.token).then(function(n){if(1===e&&n.data.length){var a=-1;n.data.forEach(function(e){parseInt(e.pid,10)>a&&(a=parseInt(e.pid,10))}),localStorage._LATEST_POST_ID=""+a}t.setState(function(e,t){return{chunks:{title:"News Feed",data:e.chunks.data.concat(n.data.filter(function(t){return 0===e.chunks.data.length||!e.chunks.data.slice(-100).some(function(e){return e.pid===t.pid})}))},loading_status:"done"}})}).catch(n);else if("search"===this.state.mode)ie.get_search(e,this.state.search_param,this.props.token).then(function(e){var n=0===e.data.length;t.setState(function(a,o){return{chunks:{title:'Result for "'+t.state.search_param+'"',data:a.chunks.data.concat(e.data.filter(function(e){return 0===a.chunks.data.length||!a.chunks.data.slice(-100).some(function(t){return t.pid===e.pid})}))},mode:n?"search_finished":"search",loading_status:"done"}})}).catch(n);else if("single"===this.state.mode){var a=parseInt(this.state.search_param.substr(1),10);ie.get_single(a,this.props.token).then(function(e){t.setState({chunks:{title:"PID = "+a,data:[e.data]},mode:"single_finished",loading_status:"done"})}).catch(n)}else{if("attention"!==this.state.mode)return void console.log("nothing to load");ie.get_attention(this.props.token).then(function(e){t.setState({chunks:{title:"Attention List",data:e.data},mode:"attention_finished",loading_status:"done"})}).catch(n)}this.setState(function(e,t){return{loaded_pages:e.loaded_pages+1,loading_status:"loading",error_msg:null}})}}},{key:"on_scroll",value:function(e){e.target===document&&(document.body.scrollHeight-window.scrollY-window.innerHeight2&&o.a.createElement("a",{className:"no-underline",onClick:this.do_back_bound},"\xa0",o.a.createElement("span",{className:"icon icon-back"}),"\xa0"),t))}}]),t}(a.PureComponent),ft=n(24),gt=n.n(ft),bt=(n(52),function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={level:0,fired:!1},n.callback=e.callback,n.esc_interval=null,n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"do_fire",value:function(){var e=this;this.esc_interval&&(clearInterval(this.esc_interval),this.esc_interval=null),this.setState({level:1,fired:!0}),this.callback(),window.setTimeout(function(){e.setState({level:0,fired:!1})},300)}},{key:"componentDidMount",value:function(){var e=this;window.config.pressure&&(gt.a.set(document.body,{change:function(t){e.state.fired||(t>=.999?e.do_fire():e.setState({level:t}))},end:function(){e.setState({level:0,fired:!1})}},{polyfill:!1,only:"touch",preventSelect:!1}),document.addEventListener("keydown",function(t){t.repeat||"Escape"!==t.key||(e.esc_interval&&clearInterval(e.esc_interval),e.setState({level:.2},function(){e.esc_interval=setInterval(function(){var t=e.state.level+.1;t>=.999?e.do_fire():e.setState({level:t})},30)}))}),document.addEventListener("keyup",function(t){"Escape"===t.key&&(e.esc_interval&&(clearInterval(e.esc_interval),e.esc_interval=null),e.setState({level:0}))}))}},{key:"render",value:function(){var e=25*(this.state.level-.4)-500;return o.a.createElement("div",{className:"pressure-box"+(this.state.fired?" pressure-box-fired":"")+(this.state.level<=1e-4?" pressure-box-empty":""),style:{left:e,right:e,top:e,bottom:e}})}}]),t}(a.Component));function vt(e){return o.a.createElement("div",{id:"global-hint-container",style:{display:"none"}})}var Et=function(e){function t(e){var n;return Object(s.a)(this,t),n=Object(c.a)(this,Object(u.a)(t).call(this,e)),Te(),function(e){function t(){(void 0===e?window.matchMedia("(prefers-color-scheme: dark)").matches:e)?document.body.classList.add("root-dark-mode"):document.body.classList.remove("root-dark-mode")}t(),window.matchMedia("(prefers-color-scheme: dark)").addListener(function(){t()})}({default:void 0,light:!1,dark:!0}[window.config.color_scheme]),n.state={sidebar_stack:[[null,null]],mode:"list",search_text:null,flow_render_key:+new Date,token:localStorage.TOKEN||null},n.show_sidebar_bound=n.show_sidebar.bind(Object(h.a)(n)),n.set_mode_bound=n.set_mode.bind(Object(h.a)(n)),n.on_pressure_bound=n.on_pressure.bind(Object(h.a)(n)),n.inpku_flag=-1!==window[atob("ZG9jdW1lbnQ")][atob("Y29va2ll")].indexOf(atob("cGt1X2lwX2ZsYWc9eWVz")),n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"on_pressure",value:function(){this.state.sidebar_stack.length>1?this.show_sidebar(null,null,"clear"):this.set_mode("list",null)}},{key:"show_sidebar",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"push";this.setState(function(a){var o=a.sidebar_stack.slice();if("push"===n)o.length>10&&o.splice(1,1),o=o.concat([[e,t]]);else if("pop"===n){if(1===o.length)return;o.pop()}else if("replace"===n)o.pop(),o=o.concat([[e,t]]);else{if("clear"!==n)throw new Error("bad show_sidebar mode");o=[[null,null]]}return{sidebar_stack:o}})}},{key:"set_mode",value:function(e,t){this.setState({mode:e,search_text:t,flow_render_key:+new Date})}},{key:"render",value:function(){var e=this;return o.a.createElement(ze.Provider,{value:{value:this.state.token,set_value:function(t){localStorage.TOKEN=t||"",e.setState({token:t})}}},o.a.createElement(bt,{callback:this.on_pressure_bound}),o.a.createElement("div",{className:"bg-img",style:Qe()}),o.a.createElement(pt,{show_sidebar:this.show_sidebar_bound,set_mode:this.set_mode_bound}),o.a.createElement(ze.Consumer,null,function(t){return o.a.createElement("div",{className:"left-container"},o.a.createElement(vt,{token:t.value}),!t.value&&o.a.createElement("div",{className:"flow-item-row aux-margin"},o.a.createElement("div",{className:"box box-tip"},o.a.createElement("p",null,o.a.createElement($,{token_callback:t.set_value},function(e){return o.a.createElement("a",{onClick:e},o.a.createElement("span",{className:"icon icon-login"}),"\xa0\u767b\u5f55\u5230 T\u5927\u6811\u6d1e")})))),(e.inpku_flag||t.value,o.a.createElement(ut,{key:e.state.flow_render_key,show_sidebar:e.show_sidebar_bound,mode:e.state.mode,search_text:e.state.search_text,token:t.value})),o.a.createElement("br",null))}),o.a.createElement(mt,{show_sidebar:this.show_sidebar_bound,stack:this.state.sidebar_stack}))}}],[{key:"is_darkmode",value:function(){return"dark"===window.config.color_scheme||"light"!==window.config.color_scheme&&window.matchMedia("(prefers-color-scheme: dark)").matches}}]),t}(a.Component),_t=Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));function At(e){navigator.serviceWorker.register(e).then(function(e){e.onupdatefound=function(){var t=e.installing;t.onstatechange=function(){"installed"===t.state&&(navigator.serviceWorker.controller?console.log("New content is available; please refresh."):console.log("Content is cached for offline use."))}}}).catch(function(e){console.error("Error during service worker registration:",e)})}r.a.render(o.a.createElement(Et,null),document.getElementById("root")),function(){if("serviceWorker"in navigator){if(new URL("//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io",window.location).origin!==window.location.origin)return;window.addEventListener("load",function(){var e="".concat("//cdn.jsdelivr.net/gh/thuhole/thuhole.github.io","/service-worker.js");_t?(!function(e){fetch(e).then(function(t){404===t.status||-1===t.headers.get("content-type").indexOf("javascript")?navigator.serviceWorker.ready.then(function(e){e.unregister().then(function(){window.location.reload()})}):At(e)}).catch(function(){console.log("No internet connection found. App is running in offline mode.")})}(e),navigator.serviceWorker.ready.then(function(){console.log("This web app is being served cache-first by a service worker. To learn more, visit https://goo.gl/SC7cgQ")})):At(e)})}}()}],[[25,1,2]]]);
+//# sourceMappingURL=main.8fc3b68f.chunk.js.map
\ No newline at end of file
diff --git a/static/js/main.8fc3b68f.chunk.js.map b/static/js/main.8fc3b68f.chunk.js.map
new file mode 100644
index 0000000..15bc1ee
--- /dev/null
+++ b/static/js/main.8fc3b68f.chunk.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["infrastructure/appicon/hole.png","infrastructure/appicon/imasugu.png","infrastructure/appicon/imasugu_rev.png","infrastructure/appicon/syllabus.png","infrastructure/appicon/score.png","infrastructure/appicon/course_survey.png","infrastructure/appicon/homepage.png","infrastructure/appicon/dropdown.png","infrastructure/appicon/dropdown_rev.png","color_picker.js","text_splitter.js","infrastructure/const.js","infrastructure/functions.js","infrastructure/widgets.js","cache.js","flows_api.js","Common.js","react-lazyload/src/utils/event.js","react-lazyload/src/utils/scrollParent.js","react-lazyload/src/index.jsx","react-lazyload/src/utils/debounce.js","react-lazyload/src/utils/throttle.js","AudioWidget.js","Config.js","Message.js","UserAction.js","Flows.js","Title.js","Sidebar.js","PressureHelper.js","App.js","registerServiceWorker.js","index.js"],"names":["module","exports","ColorPicker","this","names","current_h","Math","random","name","toLowerCase","PID_RE","URL_PID_RE","NICKNAME_RE","URL_RE","split_text","txt","rules","forEach","rule","regex","concat","apply","map","part","content","split","seg","test","filter","THUHOLE_API_ROOT","get_json","res","ok","Error","status","statusText","text","then","t","JSON","parse","e","console","error","trace","log","SyntaxError","substr","API_VERSION_PARAM","encodeURIComponent","process","REACT_APP_BUILD_INFO","floor","Date","LOGIN_POPUP_ANCHOR_ID","pad2","x","format_time","time","getMonth","getDate","getHours","getMinutes","getSeconds","chinese_format","buildFormatter","chineseStrings","Time","props","stamp","date","formatter","title","toLocaleString","timeZone","hour12","TitleLine","className","appicon_hole","appicon_imasugu","appicon_imasugu_rev","appicon_syllabus","appicon_score","appicon_course_survey","appicon_homepage","LoginPopupSelf","state","loading_status","username_ref","React","createRef","password_ref","input_token_ref","popup_anchor","document","getElementById","createElement","id","body","appendChild","type","setState","fetch","current","value","method","headers","stringify","excluded_scopes","json","success","alert","msg","catch","set_token","code","user_token","on_close","token","result","length","ReactDOM","createPortal","ref","autoFocus","defaultValue","onClick","do_sendcode","disabled","do_login","token_callback","placeholder","do_input_token","Component","LoginPopup","popup_show","on_popup_bound","on_popup","bind","on_close_bound","children","HOLE_CACHE_DB_NAME","CACHE_DB_VER","Cache","db","added_items_since_maintenance","encrypt","decrypt","open_req","indexedDB","open","onerror","onupgradeneeded","event","target","createObjectStore","keyPath","createIndex","unique","onsuccess","setTimeout","maintenance","pid","data","s","o","i","key","new_key","charCodeAt","String","fromCharCode","c","target_version","parseInt","Promise","resolve","reject","store","transaction","objectStore","get_req","get","data_str","version","last_access","put","delete","warn","req","count_req","count","index","openKeyCursor","cur","primaryKey","continue","deleteDatabase","cache","window","hole_cache","token_param","API","load_replies","color_picker","cache_version","API_BASE","sort","a","b","cid","info","_display_color","variant","load_replies_with_cache","set_attention","attention","URLSearchParams","append","report","reason","get_list","page","get_search","keyword","get_single","get_attention","escape_regex","string","replace","build_highlight_re","option","RegExp","join","ColoredSpan","style","colors","HighlightedText","parts","idx","url","p","href","rel","preventDefault","show_pid","substring","PureComponent","TEXTAREA_BACKUP","SafeTextarea","on_change_bound","on_change","on_keydown_bound","on_keydown","clear","area_ref","change_callback","submit_callback","on_submit","ctrlKey","altKey","focus","onChange","onKeyDown","pwa_prompt_event","PromotionBar","is_ios","navigator","userAgent","matchMedia","matches","standalone","prompt","addEventListener","ClickHandler","moved","init_y","init_x","on_begin_bound","on_begin","on_move_bound","on_move","on_end_bound","on_end","MOVE_THRESHOLD","last_fire","touches","screenY","screenX","abs","do_callback","callback","onTouchStart","onMouseDown","onTouchMove","onMouseMove","on","el","eventName","opts","attachEvent","call","off","removeEventListener","detachEvent","node","HTMLElement","documentElement","excludeStaticParent","position","overflowRegex","parent","parentNode","ownerDocument","getComputedStyle","overflow","overflowX","overflowY","defaultBoundingClientRect","LISTEN_FLAG","listeners","pending","passiveEventSupported","Object","defineProperty","delayType","passiveEvent","capture","passive","checkVisible","component","ReactDom","findDOMNode","scrollParent","parentTop","parentHeight","getBoundingClientRect","top","height","windowInnerHeight","innerHeight","clientHeight","intersectionTop","max","intersectionHeight","min","offsetTop","offsets","Array","isArray","offset","checkOverflowVisible","elementHeight","offsetWidth","offsetHeight","getClientRects","checkNormalVisible","visible","hidden","once","push","unmountIfInvisible","hiddenIfInvisible","lazyLoadHandler","listener","indexOf","splice","finalLazyLoadHandler","LazyLoad","scrollport","scrollContainer","querySelector","needResetFinalLazyLoadHandler","undefined","debounce","func","wait","immediate","timeout","args","context","timestamp","later","last","arguments","callNow","throttle","fn","threshhold","scope","deferTimer","now","clearTimeout","getAttribute","listenerCount","setAttribute","scroll","resize","removeAttribute","visibility","defaultProps","audio_cache","AudioWidget","src","all","AMR","load","err","blob","reader","FileReader","onload","raw","decode","wave","PCMData","encode","sampleRate","channelCount","bytesPerSample","binary_wave","Uint8Array","objurl","URL","createObjectURL","Blob","readAsBinaryString","controls","BUILTIN_IMGS","DEFAULT_CONFIG","background_img","background_color","pressure","easter_egg","color_scheme","load_config","loaded_config","config","assign","localStorage","keys","save_config","bgimg_style","img","color","background","backgroundImage","encodeURI","backgroundColor","backgroundSize","ConfigBackground","save_changes","img_select","on_select","on_change_img","on_change_color","ConfigColorScheme","ConfigSwitch","switch","val","checked","description","ConfigUI","save_changes_bound","chg","confirm","location","reload","reset_settings","MAX_IMG_DIAM","MAX_IMG_PX","MAX_IMG_FILESIZE","TokenCtx","createContext","set_value","InfoSidebar","show_sidebar","serviceWorker","getRegistrations","registrations","registration","unregister","LoginForm","copy","Consumer","copy_token","do_popup","ReplyForm","global_keypress_handler_bound","global_keypress_handler","tagName","on_complete","onSubmit","PostForm","img_tip","img_ref","on_img_change_bound","on_img_change","file","return_url","fixOrientation","fixed_dataurl","image","Image","width","compressed","rate","sqrt","canvas","ctx","getContext","drawImage","quality","new_url","quality_l","quality_r","toDataURL","round","on_got_img","readAsDataURL","files","proc_img","d","do_post","accept","IMAGE_BASE","CLICKABLE_TAGS","audio","QUOTE_BLACKLIST","LATEST_POST_ID","load_single_meta","title_elem","single","reply","replies","deletion_detect","Reply","do_filter_name","tag","FlowItem","likenum","r","is_quote","copy_link","img_clickable","latest_reply","FlowSidebar","error_msg","filter_name","rev","syncState","sync_state","reply_ref","prev","update_count","set_variant","next_attention","prevState","closest","should_text","set","replies_to_show","slice","reverse","view_mode_key","replies_cnt","main_thread_elem","show_reply_bar","set_filter_name","toggle_rev","toggle_attention","float","FlowItemRow","reply_status","reply_error","attention_override","hl_rules","search_param","quote_id","mode","FlowItemQuote","FlowChunk","list","ind","Flow","search_text","loaded_pages","chunks","on_scroll_bound","on_scroll","failed","max_id","some","finished","scrollHeight","scrollY","load_page","should_deletion_detect","flag_re","ControlBar","set_mode","on_keypress_bound","on_keypress","do_refresh_bound","do_refresh","do_attention_bound","do_attention","hash","decodeURIComponent","lastIndexOf","flag_res","exec","startsWith","scrollTo","onKeyPress","Title","Sidebar","sidebar_ref","do_close_bound","do_close","do_back_bound","do_back","nextProps","stack","scrollTop","cur_title","cur_content","onTouchEnd","click","PressureHelper","level","fired","esc_interval","clearInterval","Pressure","change","force","do_fire","end","polyfill","only","preventSelect","repeat","THRESHOLD","setInterval","new_level","pad","left","right","bottom","DeprecatedAlert","display","App","override","update_color_scheme","classList","add","remove","addListener","listen_darkmode","default","light","dark","sidebar_stack","flow_render_key","show_sidebar_bound","set_mode_bound","on_pressure_bound","on_pressure","inpku_flag","atob","ns","pop","Provider","isLocalhost","Boolean","hostname","match","registerValidSW","swUrl","register","onupdatefound","installingWorker","installing","onstatechange","controller","render","origin","response","ready","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.8fc3b68f.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFdklEQVR42sVW+VNTVxS+f4Od9oeW0RmlU8dOcRx3BEHbqiio3dtfamds+0N1bGe62emirYpSLRYDguAWJQihLZBAEkgKgbCHgIBAXbBTtgSykhAQEL/ecyWtwwMHx9DemS/vvXvv+c73zj3n5DEAjHBodJz9MD7BvuP3KVbb0xqV1p6lzENzS9u7Y3zOVWNittXPMmvMWmaNjZgeW8OZY91i1pSbzSqcg6y01Lj7V7UOap3Bma9WhyiKtEyh0bGsQg0L+P3n5talDNZ5LpWZCwqYqqYxJk9TggK1Bkpza7pWrWNdsZHM/uKymZ1Pgvb07ohiel0Jy7VcO1ug0iCfc+WbW7fUa0vYrUw5u6G8IhXglR1l/qR45tu/l9WeTo5XGqvxS3k1tPmF+t6Y8MXOVYui+3ZEb+ROHoq+HVEb3WtCo23bIhZrCwoNuZyHuKpTU474v/2M+dOSmDdDJhVgzUxn1oQDcd7w59C5+00oqxqgsLTBnHAIQ8vnoy9uPbiDWYH2kk1dwmFkWdqRU2nG9V2vw8e5rScOx/ZnX5YK6Dvw6Z6+VzYMepY8hT8++ZALMONKfQuqkxLhWf88rNvCZy2A54KwqTp1UnCQgPZ9H8Cz5ElYX93gsR38/COpgO3r5bata+FYHYrKve8jp7EDuW23USRLQveKhXDERc5agCMuAt0rF6JQdkpw5DS1o3LPbsFti1nLIxQplx7BljVyO3fSExUG/YYVyFMVIa/lOvLfewcdyxbAvTNq1gJobzu3Ue16G3nNnCNfDUP0cvRELwX5IF9SAbERchtftO+MRsOKUKjXhUG9JRJlSxegm4fUvn32OUB7ycYYNh/qzRFQh4cJTuK23Y+kVED/1nA5BxycwMZxbWUoml4IQdemVXBujwStPQpc3KZr8yo0hYWglXMRJ3FPrksF2F57Sc4BK4f9jZfhfmuzgPPNTWLO9oggG7IN8BDnAzxSAaWL5sk58C+emMS8x8S0PFIBjQf3yznwH0EqwAfIOTAThqZgpjXf7CAV4PAMyjkwFXa3R1xHx+9i4h4wzn/o6r8zKtb6XW4MjdwBnxLw+ofF3HRcD2D2AlxeH5yDXpgsjdBWmFBcVY3S2jr0DTiEKN/wCFpu3ERReQUM1TW4+VcXfFxQ0AQMDvmFiPQcJb5PTkHi+Qs4cEqGo2fS0dndCxrFlVX4OvEkvvjxOCrMDSISQRMQgM3pgtXhFPd0lV3OxOmsKyICdByd3T04xkVVNFhw994cCPDwSIyMjQtyGhVms4hIt61fPA/wcz+WnjF3Alw8DygKvXYHbvf0IlmhgDy/QCQdCeviQuZUAL04kX/1UyK++TkJB2XJ+JMLIWd0DHMugEqNMrysrh6GmlocP3ceOlMlhkfHRA7MuYCByXoPDD0vucOnU2HlR0IOe/oHRBJSuU4EswoCjYjelOqeGhENpVaHhIyzounQcPNSjU87g/qWVvF83zYIAty+IdGI1GVGXCpQ4Te9ARnKXHx5/AQqLU3CWUNbu5g7kpomypOaFdmQ7WMLoPKjClCo1Dh54SJSMhVIy85BbXMLRnhUKNzUGU+cPYdsjRYpiixc4tVBzcsz9AgCXF7vQ3OAOiJlO139PBfG7k4IJ5Qb9Ka0RiUZ2PPQkua+JAKcfJIvzGhEZxwAOZ7aIzwPrLunrE/z3zLN90Brh9zu8vCmMsY3DIozDCYcHJTIlNTNHdelAorLTPG1lmbYuUrfCA/nsB+D/uDA679/fBSBWstVaPTGIxIBXX22EH151UVdqQn1V1sF6ppagoIAX6mpBhpD+YUSY9Uz0s/ygQFWXtPA1MXGjzUGo4Fv1HCoggRNkcGoLykz7fvdVMP0HBIB/xf+Bi8VajXQRja5AAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAFfklEQVR42qWXWWicVRiG/39mUim4NRq88MZWXIpLe+FS6lYKtZsW0UrRUmyllUIXpQiN3hXBC1sxdyom6q2lVRGhUqvFClURUVFUsu+ZmD2TTDKTycTn/fudcPzNJJMaeDOTnHO+7z3ffoLm5uagFFpaWpJ8LmloaAgaGxuD3t7epePj49unpqbeLhQKn4EvwQVwjv+dYm1fOp2u0t76+vqgqampAhmp+XTMqxwB0XcUr8pmsydQ8jPK0oYe0G3f+8AgGGDPn+x9t7+//8HW1taIODKSiyWQ0MGurq4bEKbbjoEZUATTYApMgglDrnDpp2j7hPzk5ORJyN9qJBLlEoiUDw4ObkNIhydQ6JHQ4eHhF1jfgLlXg7v5vn5oaGj3xMTE++xpjZ0ZyWQy+7Fo4Cw6H4GENnLgcExIu/6HRa7XugjOBcno7Oy8EjI7ccVvOstnJIP4OG4kwlIEopuj6JAdlElnuFUtiq/Tmt1ApkwiTJ+hIWF+TmiP9nZ0dChgj/my+LtGJPyYcAHnzL5VfuRAXgfGxsZe1rrWLCOCcuAHMO7agazs1CUWM7KkyYtiwm0OdUuL7KJTLiFAt/VvWQ4SdiYpZbjkCbOEAjhHYN7hLiWWS8QEU7/jfM73Ov3PlAfOrEZoQbi9Zu6UvnOhaic/n89/3dbWFq1FBQNGd7IwbinWiTWuRkjolLe3t1+BKZ8nJV8FRyH4ylxgrVp7RkdHDxIDyxwJXQQZARb4wSxcxCpbpTtiy6E3HTuYHnI+crGB8v2xrFgQEHrLBa0XYxtdvcjlcp9HMcDtr4LZr8Ysze2v8fI11MGBgYFtZqFiGcq1J0+wvWRyQnNnILOj6yfb8zc/VQGp8RR/9Mr8sDppfgtjUR1QcFZBdjN4FGwsAa1tAverDMcKT5Si6HvNKmmGorZbjGrFRqwx9d65Uk4H5a/FIF71nBv6+voesdKt/nEq4NcX1lByKq9+jvoW4OB9NJjHwCawuQS0tgU8jLkTMRKRO3t6em5ReVZ1Bd+KwFfW1bKq7UYgjPWF7ZYhZQchMVDtVc7AlXB0VJpy9YwzInDeCpAI3OUT8LJg72KzgMx6ww9Cj8C1rLeBFkfgrOeC9XEXWPSmRkZGdpCih8EBcLAEDqiXsHePmlI8DswFy9E1rHoDLioIP+JLvyKT4rCrVBBqKvqfQRjaVLXGglA6zyot9lhEFl0Jjqeh0N3dXcXhleA2cHsJaG0lZr7R0vlfWaCeg4WOWhqOkYYvilEVVvjLikMbplsaL0RE9UPms1FDpgRGLcLTuOHZeCFSbUDXBQvoIQrRTa4U17rgIeCe8eIgCkKEHVlsEHK792KlOOQi95j5p2lI56NSLH+x8IAKkRZg+AeNpILDUUuVEKxSiateh+iHoE6jVwnUsf4BqMGyy72OGHVVKu0ZV8656K6oGWl0lmlYPO2l0DFzQcqZ73LghhNL5Z2uV3DJX+iOumRKG1IWnTcrMGxoEMOn3UjtDSTlwO1VO0+Zhe/V9OxGM9J9nbk5FZ8H99nkop1Z0vJJu00YL88LjGSz8YPyNVZpC2bd407nf4ZS+Qlfn/AHSU0ymCv0htKkd9PAS9toZHMTkWSprugizu8E3seSpfiacyy3m4pEjdfbReY7zLbFxqiSY7lLNW69VgOHnXXKT2tSduRKPkwcCQ0U9uqZTS2E/ah+Tmdcp64GKsEysIIYWqsGhKJvrNDMntObQCNZXPmCTzOErkbg2di0U7CUVeHpstdTxpRO+1OTCDNNbXCZFFc+7+PUjdQyO758HJN+apNTxh6iae9xOmBVUBYbhvQ5sug5pdrlPk79B0aFUsleyVUUG/WOT8D39jS/CH7XJ2tH2LNCe60hJRd6nv8Dwj5T3q96iTAAAAAASUVORK5CYII=\"","// https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/\r\n\r\nconst golden_ratio_conjugate=0.618033988749895;\r\n\r\nexport class ColorPicker {\r\n constructor() {\r\n this.names={};\r\n this.current_h=Math.random();\r\n }\r\n\r\n get(name) {\r\n name=name.toLowerCase();\r\n if(name==='洞主')\r\n return ['hsl(0,0%,97%)','hsl(0,0%,16%)'];\r\n\r\n if(!this.names[name]) {\r\n this.current_h+=golden_ratio_conjugate;\r\n this.current_h%=1;\r\n this.names[name]=[\r\n `hsl(${this.current_h*360}, 50%, 90%)`,\r\n `hsl(${this.current_h*360}, 60%, 20%)`,\r\n ];\r\n }\r\n return this.names[name];\r\n }\r\n}","// regexp should match the WHOLE segmented part\r\n// export const PID_RE=/(^|[^\\d\\u20e3\\ufe0e\\ufe0f])([2-9]\\d{4,5}|1\\d{4,6})(?![\\d\\u20e3\\ufe0e\\ufe0f])/g;\r\nexport const PID_RE=/(^|[^\\d\\u20e3\\ufe0e\\ufe0f])(#\\d{1,7})(?![\\d\\u20e3\\ufe0e\\ufe0f])/g;\r\n// TODO: fix this re\r\n// export const URL_PID_RE=/((?:https?:\\/\\/)?thuhole\\.tech\\/?#(?:#|%23)([2-9]\\d{4,5}|1\\d{4,6}))(?!\\d|\\u20e3|\\ufe0e|\\ufe0f)/g;\r\nexport const URL_PID_RE=/((?:https?:\\/\\/)?thuhole\\.tech\\/?#(?:#|%23)(\\d{1,7}))(?!\\d|\\u20e3|\\ufe0e|\\ufe0f)/g;\r\nexport const NICKNAME_RE=/(^|[^A-Za-z])((?:(?:Angry|Baby|Crazy|Diligent|Excited|Fat|Greedy|Hungry|Interesting|Jolly|Kind|Little|Magic|Naïve|Old|Powerful|Quiet|Rich|Superman|THU|Undefined|Valuable|Wifeless|Xiangbuchulai|Young|Zombie)\\s)?(?:Alice|Bob|Carol|Dave|Eve|Francis|Grace|Hans|Isabella|Jason|Kate|Louis|Margaret|Nathan|Olivia|Paul|Queen|Richard|Susan|Thomas|Uma|Vivian|Winnie|Xander|Yasmine|Zach)|You Win(?: \\d+)?|洞主)(?![A-Za-z])/gi;\r\nexport const URL_RE=/(^|[^.@a-zA-Z0-9_])((?:https?:\\/\\/)?(?:(?:[\\w-]+\\.)+[a-zA-Z]{2,3}|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})(?::\\d{1,5})?(?:\\/[\\w~!@#$%^&*()\\-_=+[\\]{};:,./?|]*)?)(?![a-zA-Z0-9])/gi;\r\n\r\nexport function split_text(txt,rules) {\r\n // rules: [['name',/regex/],...]\r\n // return: [['name','part'],[null,'part'],...]\r\n\r\n txt=[[null,txt]];\r\n rules.forEach((rule)=>{\r\n let [name,regex]=rule;\r\n txt=[].concat.apply([],txt.map((part)=>{\r\n let [rule,content]=part;\r\n if(rule) // already tagged by previous rules\r\n return [part];\r\n else {\r\n return content\r\n .split(regex)\r\n .map((seg)=>(\r\n regex.test(seg) ? [name,seg] : [null,seg]\r\n ))\r\n .filter(([name,seg])=>(\r\n name!==null || seg\r\n ));\r\n }\r\n }));\r\n });\r\n return txt;\r\n}\r\n","// export const THUHOLE_API_ROOT='//localhost:3001/';\r\nexport const THUHOLE_API_ROOT='//api.thuhole.tech/';\r\n","export function get_json(res) {\r\n if(!res.ok) throw Error(`网络错误 ${res.status} ${res.statusText}`);\r\n return (\r\n res\r\n .text()\r\n .then((t)=>{\r\n try {\r\n return JSON.parse(t);\r\n } catch(e) {\r\n console.error('json parse error');\r\n console.trace(e);\r\n console.log(t);\r\n throw new SyntaxError('JSON Parse Error '+t.substr(0,50));\r\n }\r\n })\r\n );\r\n}\r\n\r\nexport function listen_darkmode(override) { // override: true/false/undefined\r\n function update_color_scheme() {\r\n if(override===undefined ? window.matchMedia('(prefers-color-scheme: dark)').matches : override)\r\n document.body.classList.add('root-dark-mode');\r\n else\r\n document.body.classList.remove('root-dark-mode');\r\n }\r\n\r\n update_color_scheme();\r\n window.matchMedia('(prefers-color-scheme: dark)').addListener(()=>{\r\n update_color_scheme();\r\n });\r\n}\r\n\r\nexport function API_VERSION_PARAM() {\r\n return '&PKUHelperAPI=3.0&jsapiver='+encodeURIComponent((process.env.REACT_APP_BUILD_INFO||'null')+'-'+(Math.floor(+new Date()/7200000)*2));\r\n}","import React, {Component, PureComponent} from 'react';\r\nimport ReactDOM from 'react-dom';\r\n\r\nimport TimeAgo from 'react-timeago';\r\nimport chineseStrings from 'react-timeago/lib/language-strings/zh-CN';\r\nimport buildFormatter from 'react-timeago/lib/formatters/buildFormatter';\r\n\r\nimport './global.css';\r\nimport './widgets.css';\r\n\r\nimport appicon_hole from './appicon/hole.png';\r\nimport appicon_imasugu from './appicon/imasugu.png';\r\nimport appicon_imasugu_rev from './appicon/imasugu_rev.png';\r\nimport appicon_syllabus from './appicon/syllabus.png';\r\nimport appicon_score from './appicon/score.png';\r\nimport appicon_course_survey from './appicon/course_survey.png';\r\nimport appicon_dropdown from './appicon/dropdown.png';\r\nimport appicon_dropdown_rev from './appicon/dropdown_rev.png';\r\nimport appicon_homepage from './appicon/homepage.png';\r\nimport {THUHOLE_API_ROOT} from './const';\r\nimport {get_json, API_VERSION_PARAM} from './functions';\r\n\r\nconst LOGIN_POPUP_ANCHOR_ID='pkuhelper_login_popup_anchor';\r\n\r\nfunction pad2(x) {\r\n return x<10 ? '0'+x : ''+x;\r\n}\r\nexport function format_time(time) {\r\n return `${time.getMonth()+1}-${pad2(time.getDate())} ${time.getHours()}:${pad2(time.getMinutes())}:${pad2(time.getSeconds())}`;\r\n}\r\nconst chinese_format=buildFormatter(chineseStrings);\r\nexport function Time(props) {\r\n const time=new Date(props.stamp*1000);\r\n return (\r\n \r\n \r\n \r\n {format_time(time)}\r\n \r\n );\r\n}\r\n\r\nexport function TitleLine(props) {\r\n return (\r\n \r\n {props.text} \r\n
\r\n )\r\n}\r\n\r\nexport function GlobalTitle(props) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nconst FALLBACK_APPS={\r\n // id, text, url, icon_normal, icon_hover, new_tab\r\n bar: [\r\n ['hole', '树洞', '/hole', appicon_hole, null, false],\r\n ['imasugu', '教室', '/spare_classroom', appicon_imasugu, appicon_imasugu_rev, false],\r\n ['syllabus', '课表', '/syllabus', appicon_syllabus, null, false],\r\n ['score', '成绩', '/my_score', appicon_score, null, false],\r\n ],\r\n dropdown: [\r\n ['course_survey', '课程测评', 'https://courses.pinzhixiaoyuan.com/', appicon_course_survey, null, true],\r\n ['homepage', '客户端', '/', appicon_homepage, null, true],\r\n ],\r\n fix: {},\r\n};\r\n// const SWITCHER_DATA_VER='switcher_2';\r\n// const SWITCHER_DATA_URL=THUHOLE_API_ROOT+'web_static/appswitcher_items.json';\r\n\r\n// export class AppSwitcher extends Component {\r\n// constructor(props) {\r\n// super(props);\r\n// this.state={\r\n// apps: this.get_apps_from_localstorage(),\r\n// }\r\n// }\r\n//\r\n// get_apps_from_localstorage() {\r\n// let ret=FALLBACK_APPS;\r\n// if(localStorage['APPSWITCHER_ITEMS'])\r\n// try {\r\n// let content=JSON.parse(localStorage['APPSWITCHER_ITEMS'])[SWITCHER_DATA_VER];\r\n// if(!content || !content.bar)\r\n// throw new Error('content is empty');\r\n//\r\n// ret=content;\r\n// } catch(e) {\r\n// console.error('load appswitcher items from localstorage failed');\r\n// console.trace(e);\r\n// }\r\n//\r\n// return ret;\r\n// }\r\n//\r\n// check_fix() {\r\n// if(this.state.apps && this.state.apps.fix && this.state.apps.fix[this.props.appid])\r\n// setTimeout(()=>{\r\n// window.HOTFIX_CONTEXT={\r\n// build_info: process.env.REACT_APP_BUILD_INFO || '---',\r\n// build_env: process.env.NODE_ENV,\r\n// };\r\n// eval(this.state.apps.fix[this.props.appid]);\r\n// },1); // make it async so failures won't be critical\r\n// }\r\n//\r\n// componentDidMount() {\r\n// this.check_fix();\r\n// setTimeout(()=>{\r\n// fetch(SWITCHER_DATA_URL)\r\n// .then((res)=>{\r\n// if(!res.ok) throw Error(`网络错误 ${res.status} ${res.statusText}`);\r\n// return res.text();\r\n// })\r\n// .then((txt)=>{\r\n// if(txt!==localStorage['APPSWITCHER_ITEMS']) {\r\n// console.log('loaded new appswitcher items',txt);\r\n// localStorage['APPSWITCHER_ITEMS']=txt;\r\n//\r\n// this.setState({\r\n// apps: this.get_apps_from_localstorage(),\r\n// });\r\n// } else {\r\n// console.log('appswitcher items unchanged');\r\n// }\r\n// })\r\n// .catch((e)=>{\r\n// console.error('loading appswitcher items failed');\r\n// console.trace(e);\r\n// });\r\n// },500);\r\n// }\r\n//\r\n// componentDidUpdate(prevProps, prevState) {\r\n// if(this.state.apps!==prevState.apps)\r\n// this.check_fix();\r\n// }\r\n//\r\n// render() {\r\n// let cur_id=this.props.appid;\r\n//\r\n// function app_elem([id,title,url,icon_normal,icon_hover,new_tab],no_class=false,ref=null) {\r\n// return (\r\n// \r\n// {!!icon_normal && [\r\n// ,\r\n// \r\n// ]}\r\n// {title} \r\n// \r\n// );\r\n// }\r\n//\r\n// let dropdown_cur_app=null;\r\n// this.state.apps.dropdown.forEach((app)=>{\r\n// if(app[0]===cur_id)\r\n// dropdown_cur_app=app;\r\n// });\r\n//\r\n// //console.log(JSON.stringify(this.state.apps));\r\n//\r\n// return (\r\n// \r\n//
PKUHelper \r\n// {this.state.apps.bar.map((app)=>\r\n// app_elem(app)\r\n// )}\r\n// {!!this.state.apps.dropdown.length &&\r\n//
\r\n//
\r\n// {!!dropdown_cur_app ?\r\n// app_elem((()=>{\r\n// let [id,title,_url,icon_normal,icon_hover,_new_tab]=dropdown_cur_app;\r\n// return [id,title+'▾',null,icon_normal,icon_hover,false];\r\n// })(),true) :\r\n// app_elem(['-placeholder-elem','更多▾',null,appicon_dropdown,appicon_dropdown_rev,false],true)\r\n// }\r\n//
\r\n// {this.state.apps.dropdown.map((app)=>{\r\n// let ref=React.createRef();\r\n// return (\r\n//
{\r\n// if(!e.target.closest('a') && ref.current)\r\n// ref.current.click();\r\n// }}>\r\n// {app_elem(app,true,ref)}\r\n//
\r\n// );\r\n// })}\r\n//
\r\n// }\r\n//
网页版 \r\n//
\r\n// );\r\n// }\r\n// }\r\n\r\nclass LoginPopupSelf extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n loading_status: 'idle',\r\n // excluded_scopes: [],\r\n };\r\n this.username_ref=React.createRef();\r\n this.password_ref=React.createRef();\r\n this.input_token_ref=React.createRef();\r\n\r\n this.popup_anchor=document.getElementById(LOGIN_POPUP_ANCHOR_ID);\r\n if(!this.popup_anchor) {\r\n this.popup_anchor=document.createElement('div');\r\n this.popup_anchor.id=LOGIN_POPUP_ANCHOR_ID;\r\n document.body.appendChild(this.popup_anchor);\r\n }\r\n }\r\n\r\n do_sendcode(type) {\r\n if(this.state.loading_status==='loading')\r\n return;\r\n\r\n this.setState({\r\n loading_status: 'loading',\r\n },()=>{\r\n fetch(\r\n THUHOLE_API_ROOT+'api_xmcp/login/send_code'\r\n +'?user='+encodeURIComponent(this.username_ref.current.value)\r\n +'&code_type='+encodeURIComponent(type)\r\n +API_VERSION_PARAM(), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n excluded_scopes: [],\r\n }),\r\n }\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n console.log(json);\r\n if(!json.success)\r\n throw new Error(JSON.stringify(json));\r\n\r\n alert(json.msg);\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n alert('发送失败\\n'+e);\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n });\r\n\r\n });\r\n }\r\n\r\n do_login(set_token) {\r\n if(this.state.loading_status==='loading')\r\n return;\r\n\r\n this.setState({\r\n loading_status: 'loading',\r\n },()=>{\r\n fetch(\r\n THUHOLE_API_ROOT+'api_xmcp/login/login'\r\n +'?user='+encodeURIComponent(this.username_ref.current.value)\r\n +'&valid_code='+encodeURIComponent(this.password_ref.current.value)\r\n +API_VERSION_PARAM(), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n excluded_scopes: [],\r\n }),\r\n }\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) throw new Error(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n\r\n set_token(json.user_token);\r\n alert(`登录成功`);\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n this.props.on_close();\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n alert('登录失败\\n'+e);\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n });\r\n });\r\n }\r\n\r\n do_input_token(set_token) {\r\n if(this.state.loading_status==='loading')\r\n return;\r\n\r\n let token=this.input_token_ref.current.value;\r\n this.setState({\r\n loading_status: 'loading',\r\n },()=>{\r\n fetch(THUHOLE_API_ROOT+'api_xmcp/hole/system_msg?user_token='+encodeURIComponent(token)+API_VERSION_PARAM())\r\n .then((res)=>res.json())\r\n .then((json)=>{\r\n if(json.error)\r\n throw new Error(json.error);\r\n if(json.result.length===0)\r\n throw new Error('result check failed');\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n set_token(token);\r\n this.props.on_close();\r\n })\r\n .catch((e)=>{\r\n alert('Token检验失败\\n'+e);\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n console.error(e);\r\n });\r\n });\r\n }\r\n\r\n // perm_alert() {\r\n // alert('如果你不需要 PKU Helper 的某项功能,可以取消相应权限。\\n其中【状态信息】包括你的网费、校园卡余额等。\\n该设置应用到你的【所有】设备,取消后如需再次启用相应功能需要重新登录。');\r\n // }\r\n\r\n render() {\r\n // let PERM_SCOPES=[\r\n // ['score','成绩查询'],\r\n // ['syllabus','课表查询'],\r\n // ['my_info','状态信息'],\r\n // ];\r\n\r\n return ReactDOM.createPortal(\r\n ,\r\n this.popup_anchor,\r\n );\r\n }\r\n}\r\n\r\nexport class LoginPopup extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n popup_show: false,\r\n };\r\n this.on_popup_bound=this.on_popup.bind(this);\r\n this.on_close_bound=this.on_close.bind(this);\r\n }\r\n\r\n on_popup() {\r\n this.setState({\r\n popup_show: true,\r\n });\r\n }\r\n on_close() {\r\n this.setState({\r\n popup_show: false,\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n {this.props.children(this.on_popup_bound)}\r\n {this.state.popup_show &&\r\n \r\n }\r\n >\r\n );\r\n }\r\n}","const HOLE_CACHE_DB_NAME='hole_cache_db';\r\nconst CACHE_DB_VER=1;\r\nconst MAINTENANCE_STEP=150;\r\nconst MAINTENANCE_COUNT=1000;\r\n\r\nconst ENC_KEY=42;\r\n\r\nclass Cache {\r\n constructor() {\r\n this.db=null;\r\n this.added_items_since_maintenance=0;\r\n this.encrypt=this.encrypt.bind(this);\r\n this.decrypt=this.decrypt.bind(this);\r\n const open_req=indexedDB.open(HOLE_CACHE_DB_NAME,CACHE_DB_VER);\r\n open_req.onerror=console.error.bind(console);\r\n open_req.onupgradeneeded=(event)=>{\r\n console.log('comment cache db upgrade');\r\n const db=event.target.result;\r\n const store=db.createObjectStore('comment',{\r\n keyPath: 'pid',\r\n });\r\n store.createIndex('last_access','last_access',{unique: false});\r\n };\r\n open_req.onsuccess=(event)=>{\r\n console.log('comment cache db loaded');\r\n this.db=event.target.result;\r\n setTimeout(this.maintenance.bind(this),1);\r\n };\r\n }\r\n\r\n // use window.hole_cache.encrypt() only after cache is loaded!\r\n encrypt(pid,data) {\r\n let s=JSON.stringify(data);\r\n let o='';\r\n for(let i=0,key=(ENC_KEY^pid)%128;i{\r\n if(!this.db)\r\n return resolve(null);\r\n const tx=this.db.transaction(['comment'],'readwrite');\r\n const store=tx.objectStore('comment');\r\n const get_req=store.get(pid);\r\n get_req.onsuccess=()=>{\r\n let res=get_req.result;\r\n if(!res || !res.data_str) {\r\n //console.log('comment cache miss '+pid);\r\n resolve(null);\r\n } else if(target_version===res.version) { // hit\r\n console.log('comment cache hit',pid);\r\n res.last_access=(+new Date());\r\n store.put(res);\r\n let data=this.decrypt(pid,res.data_str);\r\n resolve(data); // obj or null\r\n } else { // expired\r\n console.log('comment cache expired',pid,': ver',res.version,'target',target_version);\r\n store.delete(pid);\r\n resolve(null);\r\n }\r\n };\r\n get_req.onerror=(e)=>{\r\n console.warn('comment cache indexeddb open failed');\r\n console.error(e);\r\n resolve(null);\r\n };\r\n });\r\n }\r\n\r\n put(pid,target_version,data) {\r\n pid=parseInt(pid);\r\n return new Promise((resolve,reject)=>{\r\n if(!this.db)\r\n return resolve();\r\n const tx=this.db.transaction(['comment'],'readwrite');\r\n const store=tx.objectStore('comment');\r\n store.put({\r\n pid: pid,\r\n version: target_version,\r\n data_str: this.encrypt(pid,data),\r\n last_access: +new Date(),\r\n });\r\n if(++this.added_items_since_maintenance===MAINTENANCE_STEP)\r\n setTimeout(this.maintenance.bind(this),1);\r\n });\r\n }\r\n\r\n delete(pid) {\r\n pid=parseInt(pid);\r\n return new Promise((resolve,reject)=>{\r\n if(!this.db)\r\n return resolve();\r\n const tx=this.db.transaction(['comment'],'readwrite');\r\n const store=tx.objectStore('comment');\r\n let req=store.delete(pid);\r\n //console.log('comment cache delete',pid);\r\n req.onerror=()=>{\r\n console.warn('comment cache delete failed ',pid);\r\n return resolve();\r\n };\r\n req.onsuccess=()=>resolve();\r\n });\r\n }\r\n\r\n maintenance() {\r\n if(!this.db)\r\n return;\r\n const tx=this.db.transaction(['comment'],'readwrite');\r\n const store=tx.objectStore('comment');\r\n let count_req=store.count();\r\n count_req.onsuccess=()=>{\r\n let count=count_req.result;\r\n if(count>MAINTENANCE_COUNT) {\r\n console.log('comment cache db maintenance',count);\r\n store.index('last_access').openKeyCursor().onsuccess=(e)=>{\r\n let cur=e.target.result;\r\n if(cur) {\r\n //console.log('maintenance: delete',cur);\r\n store.delete(cur.primaryKey);\r\n if(--count>MAINTENANCE_COUNT)\r\n cur.continue();\r\n }\r\n };\r\n } else {\r\n console.log('comment cache db no need to maintenance',count);\r\n }\r\n this.added_items_since_maintenance=0;\r\n };\r\n count_req.onerror=console.error.bind(console);\r\n }\r\n\r\n clear() {\r\n if(!this.db)\r\n return;\r\n indexedDB.deleteDatabase(HOLE_CACHE_DB_NAME);\r\n console.log('delete comment cache db');\r\n }\r\n};\r\n\r\nexport function cache() {\r\n if(!window.hole_cache)\r\n window.hole_cache=new Cache();\r\n return window.hole_cache;\r\n}","import {get_json, API_VERSION_PARAM} from './infrastructure/functions';\r\nimport {THUHOLE_API_ROOT} from './infrastructure/const';\r\nimport {API_BASE} from './Common';\r\nimport {cache} from './cache';\r\n\r\nexport {THUHOLE_API_ROOT, API_VERSION_PARAM};\r\n\r\nexport function token_param(token) {\r\n return API_VERSION_PARAM()+(token ? ('&user_token='+token) : '');\r\n}\r\n\r\nexport {get_json};\r\n\r\nconst SEARCH_PAGESIZE=50;\r\n\r\nexport const API={\r\n load_replies: (pid,token,color_picker,cache_version)=>{\r\n pid=parseInt(pid);\r\n return fetch(\r\n API_BASE+'/api.php?action=getcomment'+\r\n '&pid='+pid+\r\n token_param(token)\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) throw new Error(json.msg);\r\n else throw new Error(JSON.stringify(json));\r\n }\r\n\r\n cache().delete(pid).then(()=>{\r\n cache().put(pid,cache_version,json);\r\n });\r\n\r\n // also change load_replies_with_cache!\r\n json.data=json.data\r\n .sort((a,b)=>{\r\n return parseInt(a.cid,10)-parseInt(b.cid,10);\r\n })\r\n .map((info)=>{\r\n info._display_color=color_picker.get(info.name);\r\n info.variant={};\r\n return info;\r\n });\r\n\r\n return json;\r\n });\r\n },\r\n\r\n load_replies_with_cache: (pid,token,color_picker,cache_version)=> {\r\n pid=parseInt(pid);\r\n return cache().get(pid,cache_version)\r\n .then((json)=>{\r\n if(json) {\r\n // also change load_replies!\r\n json.data=json.data\r\n .sort((a,b)=>{\r\n return parseInt(a.cid,10)-parseInt(b.cid,10);\r\n })\r\n .map((info)=>{\r\n info._display_color=color_picker.get(info.name);\r\n info.variant={};\r\n return info;\r\n });\r\n\r\n return json;\r\n }\r\n else\r\n return API.load_replies(pid,token,color_picker,cache_version);\r\n });\r\n },\r\n\r\n set_attention: (pid,attention,token)=>{\r\n let data=new URLSearchParams();\r\n data.append('user_token',token);\r\n data.append('pid',pid);\r\n data.append('switch',attention ? '1' : '0');\r\n return fetch(API_BASE+'/api.php?action=attention'+token_param(token), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n body: data,\r\n })\r\n .then(get_json)\r\n .then((json)=>{\r\n cache().delete(pid);\r\n if(json.code!==0) {\r\n if(json.msg && json.msg==='已经关注过了') {}\r\n else {\r\n if(json.msg) alert(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n }\r\n return json;\r\n });\r\n },\r\n\r\n report: (pid,reason,token)=>{\r\n let data=new URLSearchParams();\r\n data.append('user_token',token);\r\n data.append('pid',pid);\r\n data.append('reason',reason);\r\n return fetch(API_BASE+'/api.php?action=report'+token_param(token), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n body: data,\r\n })\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) alert(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n return json;\r\n });\r\n },\r\n\r\n get_list: (page,token)=>{\r\n return fetch(\r\n API_BASE+'/api.php?action=getlist'+\r\n '&p='+page+\r\n token_param(token)\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0)\r\n throw new Error(JSON.stringify(json));\r\n return json;\r\n });\r\n },\r\n\r\n get_search: (page,keyword,token)=>{\r\n return fetch(\r\n API_BASE+'/api.php?action=search'+\r\n '&pagesize='+SEARCH_PAGESIZE+\r\n '&page='+page+\r\n '&keywords='+encodeURIComponent(keyword)+\r\n token_param(token)\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) throw new Error(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n return json;\r\n });\r\n },\r\n\r\n get_single: (pid,token)=>{\r\n return fetch(\r\n API_BASE+'/api.php?action=getone'+\r\n '&pid='+pid+\r\n token_param(token)\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) throw new Error(json.msg);\r\n else throw new Error(JSON.stringify(json));\r\n }\r\n return json;\r\n });\r\n },\r\n\r\n get_attention: (token)=>{\r\n return fetch(\r\n API_BASE+'/api.php?action=getattention'+\r\n token_param(token)\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) throw new Error(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n return json;\r\n });\r\n },\r\n};","import React, {Component, PureComponent} from 'react';\r\nimport {format_time,Time,TitleLine} from './infrastructure/widgets';\r\nimport {THUHOLE_API_ROOT} from './flows_api';\r\n\r\nimport './Common.css';\r\n\r\nexport {format_time,Time,TitleLine};\r\n\r\nexport const API_BASE=THUHOLE_API_ROOT+'services/thuhole';\r\n\r\n// https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\r\nfunction escape_regex(string) {\r\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\r\n}\r\n\r\nexport function build_highlight_re(txt,split,option='g') {\r\n return txt ? new RegExp(`(${txt.split(split).filter((x)=>!!x).map(escape_regex).join('|')})`,option) : /^$/g;\r\n}\r\n\r\nexport function ColoredSpan(props) {\r\n return (\r\n {props.children} \r\n )\r\n}\r\n\r\nexport class HighlightedText extends PureComponent {\r\n render() {\r\n function normalize_url(url) {\r\n return /^https?:\\/\\//.test(url) ? url : 'http://'+url;\r\n }\r\n return (\r\n \r\n {this.props.parts.map((part,idx)=>{\r\n let [rule,p]=part;\r\n return (\r\n {\r\n rule==='url_pid' ? /## :\r\n rule==='url' ? {p} :\r\n rule==='pid' ? {e.preventDefault(); this.props.show_pid(p.substring(1));}}>{p} :\r\n rule==='nickname' ? {p} :\r\n rule==='search' ? {p} :\r\n p\r\n } \r\n );\r\n })}\r\n \r\n )\r\n }\r\n}\r\n\r\nwindow.TEXTAREA_BACKUP={};\r\n\r\nexport class SafeTextarea extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n text: '',\r\n };\r\n this.on_change_bound=this.on_change.bind(this);\r\n this.on_keydown_bound=this.on_keydown.bind(this);\r\n this.clear=this.clear.bind(this);\r\n this.area_ref=React.createRef();\r\n this.change_callback=props.on_change||(()=>{});\r\n this.submit_callback=props.on_submit||(()=>{});\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({\r\n text: window.TEXTAREA_BACKUP[this.props.id]||''\r\n },()=>{\r\n this.change_callback(this.state.text);\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n window.TEXTAREA_BACKUP[this.props.id]=this.state.text;\r\n this.change_callback(this.state.text);\r\n }\r\n\r\n on_change(event) {\r\n this.setState({\r\n text: event.target.value,\r\n });\r\n this.change_callback(event.target.value);\r\n }\r\n on_keydown(event) {\r\n if(event.key==='Enter' && event.ctrlKey && !event.altKey) {\r\n event.preventDefault();\r\n this.submit_callback();\r\n }\r\n }\r\n\r\n clear() {\r\n this.setState({\r\n text: '',\r\n });\r\n }\r\n set(text) {\r\n this.change_callback(text);\r\n this.setState({\r\n text: text,\r\n });\r\n }\r\n get() {\r\n return this.state.text;\r\n }\r\n focus() {\r\n this.area_ref.current.focus();\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nlet pwa_prompt_event=null;\r\nwindow.addEventListener('beforeinstallprompt', (e) => {\r\n console.log('pwa: received before install prompt');\r\n pwa_prompt_event=e;\r\n});\r\n\r\nexport function PromotionBar(props) {\r\n let is_ios=/iPhone|iPad|iPod/i.test(window.navigator.userAgent);\r\n let is_installed=(window.matchMedia('(display-mode: standalone)').matches) || (window.navigator.standalone);\r\n\r\n if(is_installed)\r\n return null;\r\n\r\n if(is_ios)\r\n // noinspection JSConstructorReturnsPrimitive\r\n return !navigator.standalone ? (\r\n \r\n \r\n 用 Safari 把树洞 添加到主屏幕 更好用\r\n
\r\n ) : null;\r\n else\r\n // noinspection JSConstructorReturnsPrimitive\r\n return pwa_prompt_event ? (\r\n \r\n ) : null;\r\n}\r\n\r\nexport class ClickHandler extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n moved: true,\r\n init_y: 0,\r\n init_x: 0,\r\n };\r\n this.on_begin_bound=this.on_begin.bind(this);\r\n this.on_move_bound=this.on_move.bind(this);\r\n this.on_end_bound=this.on_end.bind(this);\r\n\r\n this.MOVE_THRESHOLD=3;\r\n this.last_fire=0;\r\n }\r\n\r\n on_begin(e) {\r\n //console.log('click',(e.touches?e.touches[0]:e).screenY,(e.touches?e.touches[0]:e).screenX);\r\n this.setState({\r\n moved: false,\r\n init_y: (e.touches?e.touches[0]:e).screenY,\r\n init_x: (e.touches?e.touches[0]:e).screenX,\r\n });\r\n }\r\n on_move(e) {\r\n if(!this.state.moved) {\r\n let mvmt=Math.abs((e.touches?e.touches[0]:e).screenY-this.state.init_y)+Math.abs((e.touches?e.touches[0]:e).screenX-this.state.init_x);\r\n //console.log('move',mvmt);\r\n if(mvmt>this.MOVE_THRESHOLD)\r\n this.setState({\r\n moved: true,\r\n });\r\n }\r\n }\r\n on_end(event) {\r\n //console.log('end');\r\n if(!this.state.moved)\r\n this.do_callback(event);\r\n this.setState({\r\n moved: true,\r\n });\r\n }\r\n\r\n do_callback(event) {\r\n if(this.last_fire+100>+new Date()) return;\r\n this.last_fire=+new Date();\r\n this.props.callback(event);\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n {this.props.children}\r\n
\r\n )\r\n }\r\n}","export function on(el, eventName, callback, opts) {\r\n opts = opts || false;\r\n if (el.addEventListener) {\r\n el.addEventListener(eventName, callback, opts);\r\n } else if (el.attachEvent) {\r\n el.attachEvent(`on${eventName}`, (e) => {\r\n callback.call(el, e || window.event);\r\n });\r\n }\r\n}\r\n\r\nexport function off(el, eventName, callback, opts) {\r\n opts = opts || false;\r\n if (el.removeEventListener) {\r\n el.removeEventListener(eventName, callback, opts);\r\n } else if (el.detachEvent) {\r\n el.detachEvent(`on${eventName}`, callback);\r\n }\r\n}\r\n","/**\r\n * @fileOverview Find scroll parent\r\n */\r\n\r\nexport default (node) => {\r\n if (!(node instanceof HTMLElement)) {\r\n return document.documentElement;\r\n }\r\n\r\n const excludeStaticParent = node.style.position === 'absolute';\r\n const overflowRegex = /(scroll|auto)/;\r\n let parent = node;\r\n\r\n while (parent) {\r\n if (!parent.parentNode) {\r\n return node.ownerDocument || document.documentElement;\r\n }\r\n\r\n const style = window.getComputedStyle(parent);\r\n const position = style.position;\r\n const overflow = style.overflow;\r\n const overflowX = style['overflow-x'];\r\n const overflowY = style['overflow-y'];\r\n\r\n if (position === 'static' && excludeStaticParent) {\r\n parent = parent.parentNode;\r\n continue;\r\n }\r\n\r\n if (overflowRegex.test(overflow) && overflowRegex.test(overflowX) && overflowRegex.test(overflowY)) {\r\n return parent;\r\n }\r\n\r\n parent = parent.parentNode;\r\n }\r\n\r\n return node.ownerDocument || node.documentElement || document.documentElement;\r\n};\r\n","/**\r\n * react-lazyload\r\n */\r\nimport React, { Component, PureComponent } from 'react';\r\nimport ReactDom from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { on, off } from './utils/event';\r\nimport scrollParent from './utils/scrollParent';\r\nimport debounce from './utils/debounce';\r\nimport throttle from './utils/throttle';\r\n\r\nconst defaultBoundingClientRect = { top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0 };\r\nconst LISTEN_FLAG = 'data-lazyload-listened';\r\nconst listeners = [];\r\nlet pending = [];\r\n\r\n// try to handle passive events\r\nlet passiveEventSupported = false;\r\ntry {\r\n const opts = Object.defineProperty({}, 'passive', {\r\n get() {\r\n passiveEventSupported = true;\r\n }\r\n });\r\n window.addEventListener('test', null, opts);\r\n}\r\ncatch (e) { }\r\n// if they are supported, setup the optional params\r\n// IMPORTANT: FALSE doubles as the default CAPTURE value!\r\nconst passiveEvent = passiveEventSupported ? { capture: false, passive: true } : false;\r\n\r\n\r\n/**\r\n * Check if `component` is visible in overflow container `parent`\r\n * @param {node} component React component\r\n * @param {node} parent component's scroll parent\r\n * @return {bool}\r\n */\r\nconst checkOverflowVisible = function checkOverflowVisible(component, parent) {\r\n const node = ReactDom.findDOMNode(component);\r\n\r\n let parentTop;\r\n let parentHeight;\r\n\r\n try {\r\n ({ top: parentTop, height: parentHeight } = parent.getBoundingClientRect());\r\n } catch (e) {\r\n ({ top: parentTop, height: parentHeight } = defaultBoundingClientRect);\r\n }\r\n\r\n const windowInnerHeight = window.innerHeight || document.documentElement.clientHeight;\r\n\r\n // calculate top and height of the intersection of the element's scrollParent and viewport\r\n const intersectionTop = Math.max(parentTop, 0); // intersection's top relative to viewport\r\n const intersectionHeight = Math.min(windowInnerHeight, parentTop + parentHeight) - intersectionTop; // height\r\n\r\n // check whether the element is visible in the intersection\r\n let top;\r\n let height;\r\n\r\n try {\r\n ({ top, height } = node.getBoundingClientRect());\r\n } catch (e) {\r\n ({ top, height } = defaultBoundingClientRect);\r\n }\r\n\r\n const offsetTop = top - intersectionTop; // element's top relative to intersection\r\n\r\n const offsets = Array.isArray(component.props.offset) ?\r\n component.props.offset :\r\n [component.props.offset, component.props.offset]; // Be compatible with previous API\r\n\r\n return (offsetTop - offsets[0] <= intersectionHeight) &&\r\n (offsetTop + height + offsets[1] >= 0);\r\n};\r\n\r\n/**\r\n * Check if `component` is visible in document\r\n * @param {node} component React component\r\n * @return {bool}\r\n */\r\nconst checkNormalVisible = function checkNormalVisible(component) {\r\n const node = ReactDom.findDOMNode(component);\r\n\r\n // If this element is hidden by css rules somehow, it's definitely invisible\r\n if (!(node.offsetWidth || node.offsetHeight || node.getClientRects().length)) return false;\r\n\r\n let top;\r\n let elementHeight;\r\n\r\n try {\r\n ({ top, height: elementHeight } = node.getBoundingClientRect());\r\n } catch (e) {\r\n ({ top, height: elementHeight } = defaultBoundingClientRect);\r\n }\r\n\r\n const windowInnerHeight = window.innerHeight || document.documentElement.clientHeight;\r\n\r\n const offsets = Array.isArray(component.props.offset) ?\r\n component.props.offset :\r\n [component.props.offset, component.props.offset]; // Be compatible with previous API\r\n\r\n return (top - offsets[0] <= windowInnerHeight) &&\r\n (top + elementHeight + offsets[1] >= 0);\r\n};\r\n\r\n\r\n/**\r\n * Detect if element is visible in viewport, if so, set `visible` state to true.\r\n * If `once` prop is provided true, remove component as listener after checkVisible\r\n *\r\n * @param {React} component React component that respond to scroll and resize\r\n */\r\nconst checkVisible = function checkVisible(component) {\r\n const node = ReactDom.findDOMNode(component);\r\n if (!(node instanceof HTMLElement)) {\r\n return;\r\n }\r\n\r\n const parent = scrollParent(node);\r\n const isOverflow = component.props.overflow &&\r\n parent !== node.ownerDocument &&\r\n parent !== document &&\r\n parent !== document.documentElement;\r\n const visible = isOverflow ?\r\n checkOverflowVisible(component, parent) :\r\n checkNormalVisible(component);\r\n if (visible) {\r\n // Avoid extra render if previously is visible\r\n if (!component.state.visible || component.state.hidden) {\r\n if (component.props.once) {\r\n pending.push(component);\r\n }\r\n\r\n //console.log('lazyload 1');\r\n component.setState({\r\n visible: true,\r\n hidden: false,\r\n });\r\n }\r\n } else if (!component.props.once) {\r\n if (component.props.unmountIfInvisible) {\r\n if(component.visible===true)\r\n component.setState({\r\n visible: false,\r\n });\r\n } else if(component.props.hiddenIfInvisible) {\r\n if(component.state.hidden===false) {\r\n //console.log('lazyload 3');\r\n component.setState({\r\n hidden: true,\r\n });\r\n }\r\n }\r\n }\r\n};\r\n\r\n\r\nconst purgePending = function purgePending() {\r\n pending.forEach((component) => {\r\n const index = listeners.indexOf(component);\r\n if (index !== -1) {\r\n listeners.splice(index, 1);\r\n }\r\n });\r\n\r\n pending = [];\r\n};\r\n\r\nconst lazyLoadHandler = () => {\r\n for (let i = 0; i < listeners.length; ++i) {\r\n const listener = listeners[i];\r\n checkVisible(listener);\r\n }\r\n // Remove `once` component in listeners\r\n purgePending();\r\n};\r\n\r\n// Depending on component's props\r\nlet delayType;\r\nlet finalLazyLoadHandler = null;\r\n\r\nconst isString = string => typeof string === 'string';\r\n\r\nclass LazyLoad extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state={\r\n visible: false,\r\n hidden: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n // It's unlikely to change delay type on the fly, this is mainly\r\n // designed for tests\r\n let scrollport = window;\r\n const {\r\n scrollContainer,\r\n } = this.props;\r\n if (scrollContainer) {\r\n if (isString(scrollContainer)) {\r\n scrollport = scrollport.document.querySelector(scrollContainer);\r\n }\r\n }\r\n const needResetFinalLazyLoadHandler = (this.props.debounce !== undefined && delayType === 'throttle')\r\n || (delayType === 'debounce' && this.props.debounce === undefined);\r\n\r\n if (needResetFinalLazyLoadHandler) {\r\n off(scrollport, 'scroll', finalLazyLoadHandler, passiveEvent);\r\n off(window, 'resize', finalLazyLoadHandler, passiveEvent);\r\n finalLazyLoadHandler = null;\r\n }\r\n\r\n if (!finalLazyLoadHandler) {\r\n if (this.props.debounce !== undefined) {\r\n finalLazyLoadHandler = debounce(lazyLoadHandler, typeof this.props.debounce === 'number' ?\r\n this.props.debounce :\r\n 300);\r\n delayType = 'debounce';\r\n } else if (this.props.throttle !== undefined) {\r\n finalLazyLoadHandler = throttle(lazyLoadHandler, typeof this.props.throttle === 'number' ?\r\n this.props.throttle :\r\n 300);\r\n delayType = 'throttle';\r\n } else {\r\n finalLazyLoadHandler = lazyLoadHandler;\r\n }\r\n }\r\n\r\n if (this.props.overflow) {\r\n const parent = scrollParent(ReactDom.findDOMNode(this));\r\n if (parent && typeof parent.getAttribute === 'function') {\r\n const listenerCount = 1 + (+parent.getAttribute(LISTEN_FLAG));\r\n if (listenerCount === 1) {\r\n parent.addEventListener('scroll', finalLazyLoadHandler, passiveEvent);\r\n }\r\n parent.setAttribute(LISTEN_FLAG, listenerCount);\r\n }\r\n } else if (listeners.length === 0 || needResetFinalLazyLoadHandler) {\r\n const { scroll, resize } = this.props;\r\n\r\n if (scroll) {\r\n on(scrollport, 'scroll', finalLazyLoadHandler, passiveEvent);\r\n }\r\n\r\n if (resize) {\r\n on(window, 'resize', finalLazyLoadHandler, passiveEvent);\r\n }\r\n }\r\n\r\n listeners.push(this);\r\n checkVisible(this);\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this.props.overflow) {\r\n const parent = scrollParent(ReactDom.findDOMNode(this));\r\n if (parent && typeof parent.getAttribute === 'function') {\r\n const listenerCount = (+parent.getAttribute(LISTEN_FLAG)) - 1;\r\n if (listenerCount === 0) {\r\n parent.removeEventListener('scroll', finalLazyLoadHandler, passiveEvent);\r\n parent.removeAttribute(LISTEN_FLAG);\r\n } else {\r\n parent.setAttribute(LISTEN_FLAG, listenerCount);\r\n }\r\n }\r\n }\r\n\r\n const index = listeners.indexOf(this);\r\n if (index !== -1) {\r\n listeners.splice(index, 1);\r\n }\r\n\r\n if (listeners.length === 0 && typeof window !== 'undefined') {\r\n off(window, 'resize', finalLazyLoadHandler, passiveEvent);\r\n off(window, 'scroll', finalLazyLoadHandler, passiveEvent);\r\n }\r\n }\r\n\r\n render() {\r\n //console.log('lazyload render');\r\n if(this.state.visible) {\r\n if(this.props.hiddenIfInvisible)\r\n return this.state.hidden ?\r\n {this.props.children}
:\r\n {this.props.children}
;\r\n else\r\n return this.props.children;\r\n }\r\n else\r\n return this.props.placeholder ?\r\n this.props.placeholder :\r\n
;\r\n }\r\n}\r\n\r\nLazyLoad.propTypes = {\r\n once: PropTypes.bool,\r\n height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\r\n offset: PropTypes.oneOfType([PropTypes.number, PropTypes.arrayOf(PropTypes.number)]),\r\n overflow: PropTypes.bool,\r\n resize: PropTypes.bool,\r\n scroll: PropTypes.bool,\r\n children: PropTypes.node,\r\n throttle: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\r\n debounce: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\r\n placeholder: PropTypes.node,\r\n scrollContainer: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n unmountIfInvisible: PropTypes.bool,\r\n hiddenIfInvisible: PropTypes.bool,\r\n};\r\n\r\nLazyLoad.defaultProps = {\r\n once: false,\r\n offset: 0,\r\n overflow: false,\r\n resize: false,\r\n scroll: true,\r\n unmountIfInvisible: false,\r\n hiddenIfInvisible: false,\r\n};\r\n\r\nconst getDisplayName = WrappedComponent => WrappedComponent.displayName || WrappedComponent.name || 'Component';\r\n\r\nconst decorator = (options = {}) => function lazyload(WrappedComponent) {\r\n return class LazyLoadDecorated extends Component {\r\n constructor() {\r\n super();\r\n this.displayName = `LazyLoad${getDisplayName(WrappedComponent)}`;\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n };\r\n};\r\n\r\nexport { decorator as lazyload };\r\nexport default LazyLoad;\r\nexport { lazyLoadHandler as forceCheck };\r\n","export default function debounce(func, wait, immediate) {\r\n let timeout;\r\n let args;\r\n let context;\r\n let timestamp;\r\n let result;\r\n\r\n const later = function later() {\r\n const last = +(new Date()) - timestamp;\r\n\r\n if (last < wait && last >= 0) {\r\n timeout = setTimeout(later, wait - last);\r\n } else {\r\n timeout = null;\r\n if (!immediate) {\r\n result = func.apply(context, args);\r\n if (!timeout) {\r\n context = null;\r\n args = null;\r\n }\r\n }\r\n }\r\n };\r\n\r\n return function debounced() {\r\n context = this;\r\n args = arguments;\r\n timestamp = +(new Date());\r\n\r\n const callNow = immediate && !timeout;\r\n if (!timeout) {\r\n timeout = setTimeout(later, wait);\r\n }\r\n\r\n if (callNow) {\r\n result = func.apply(context, args);\r\n context = null;\r\n args = null;\r\n }\r\n\r\n return result;\r\n };\r\n}\r\n","/*eslint-disable */\r\nexport default function throttle(fn, threshhold, scope) {\r\n threshhold || (threshhold = 250);\r\n var last,\r\n deferTimer;\r\n return function () {\r\n var context = scope || this;\r\n\r\n var now = +new Date,\r\n args = arguments;\r\n if (last && now < last + threshhold) {\r\n // hold on to it\r\n clearTimeout(deferTimer);\r\n deferTimer = setTimeout(function () {\r\n last = now;\r\n fn.apply(context, args);\r\n }, threshhold);\r\n } else {\r\n last = now;\r\n fn.apply(context, args);\r\n }\r\n };\r\n}\r\n","import React, {Component} from 'react';\r\nimport load from 'load-script';\r\n\r\nwindow.audio_cache={};\r\n\r\nfunction load_amrnb() {\r\n return new Promise((resolve,reject)=>{\r\n if(window.AMR)\r\n resolve();\r\n else\r\n load('static/amr_all.min.js', (err)=>{\r\n if(err)\r\n reject(err);\r\n else\r\n resolve();\r\n });\r\n });\r\n}\r\n\r\nexport class AudioWidget extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n url: this.props.src,\r\n state: 'waiting',\r\n data: null,\r\n };\r\n }\r\n\r\n load() {\r\n if(window.audio_cache[this.state.url]) {\r\n this.setState({\r\n state: 'loaded',\r\n data: window.audio_cache[this.state.url],\r\n });\r\n return;\r\n }\r\n\r\n console.log('fetching audio',this.state.url);\r\n this.setState({\r\n state: 'loading',\r\n });\r\n Promise.all([\r\n fetch(this.state.url),\r\n load_amrnb(),\r\n ])\r\n .then((res)=>{\r\n res[0].blob().then((blob)=>{\r\n const reader=new FileReader();\r\n reader.onload=(event)=>{\r\n const raw=new window.AMR().decode(event.target.result);\r\n if(!raw) {\r\n alert('audio decoding failed');\r\n return;\r\n }\r\n const wave=window.PCMData.encode({\r\n sampleRate: 8000,\r\n channelCount: 1,\r\n bytesPerSample: 2,\r\n data: raw\r\n });\r\n const binary_wave=new Uint8Array(wave.length);\r\n for(let i=0;i加载音频
);\r\n if(this.state.state==='loading')\r\n return (正在下载……
);\r\n else if(this.state.state==='decoding')\r\n return (正在解码……
);\r\n else if(this.state.state==='loaded')\r\n return (
);\r\n }\r\n}","import React, {Component, PureComponent} from 'react';\r\n\r\nimport './Config.css';\r\n\r\nconst BUILTIN_IMGS={\r\n 'static/bg/gbp.jpg': '寻觅繁星(默认)',\r\n 'static/bg/eriri.jpg': '平成著名画师',\r\n 'static/bg/yurucamp.jpg': '露营天下第一',\r\n 'static/bg/minecraft.jpg': '麦恩·库拉夫特',\r\n 'static/bg/cyberpunk.jpg': '赛博城市',\r\n 'static/bg/sif.jpg': '梦开始的地方',\r\n};\r\n\r\nconst DEFAULT_CONFIG={\r\n background_img: 'static/bg/gbp.jpg',\r\n background_color: '#113366',\r\n pressure: false,\r\n easter_egg: true,\r\n color_scheme: 'default',\r\n};\r\n\r\nexport function load_config() {\r\n let config=Object.assign({},DEFAULT_CONFIG);\r\n let loaded_config;\r\n try {\r\n loaded_config=JSON.parse(localStorage['hole_config']||'{}');\r\n } catch(e) {\r\n alert('设置加载失败,将重置为默认设置!\\n'+e);\r\n delete localStorage['hole_config'];\r\n loaded_config={};\r\n }\r\n\r\n // unrecognized configs are removed\r\n Object.keys(loaded_config).forEach((key)=>{\r\n if(config[key]!==undefined)\r\n config[key]=loaded_config[key];\r\n });\r\n\r\n console.log('config loaded',config);\r\n window.config=config;\r\n}\r\nexport function save_config() {\r\n localStorage['hole_config']=JSON.stringify(window.config);\r\n load_config();\r\n}\r\n\r\nexport function bgimg_style(img,color) {\r\n if(img===undefined) img=window.config.background_img;\r\n if(color===undefined) color=window.config.background_color;\r\n return {\r\n background: 'transparent center center',\r\n backgroundImage: img===null ? 'unset' : 'url(\"'+encodeURI(img)+'\")',\r\n backgroundColor: color,\r\n backgroundSize: 'cover',\r\n };\r\n}\r\n\r\nclass ConfigBackground extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n img: window.config.background_img,\r\n color: window.config.background_color,\r\n };\r\n }\r\n\r\n save_changes() {\r\n this.props.callback({\r\n background_img: this.state.img,\r\n background_color: this.state.color,\r\n });\r\n }\r\n\r\n on_select(e) {\r\n let value=e.target.value;\r\n this.setState({\r\n img: value==='##other' ? '' :\r\n value==='##color' ? null : value,\r\n },this.save_changes.bind(this));\r\n }\r\n on_change_img(e) {\r\n this.setState({\r\n img: e.target.value,\r\n },this.save_changes.bind(this));\r\n }\r\n on_change_color(e) {\r\n this.setState({\r\n color: e.target.value,\r\n },this.save_changes.bind(this));\r\n }\r\n\r\n render() {\r\n let img_select= this.state.img===null ? '##color' :\r\n Object.keys(BUILTIN_IMGS).indexOf(this.state.img)===-1 ? '##other' : this.state.img;\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nclass ConfigColorScheme extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n color_scheme: window.config.color_scheme,\r\n };\r\n }\r\n\r\n save_changes() {\r\n this.props.callback({\r\n color_scheme: this.state.color_scheme,\r\n });\r\n }\r\n\r\n on_select(e) {\r\n let value=e.target.value;\r\n this.setState({\r\n color_scheme: value,\r\n },this.save_changes.bind(this));\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n
\r\n 夜间模式: \r\n \r\n 跟随系统 \r\n 始终浅色模式 \r\n 始终深色模式 \r\n \r\n #color_scheme \r\n
\r\n
\r\n 选择浅色或深色模式,深色模式下将会调暗图片亮度\r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nclass ConfigSwitch extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n switch: window.config[this.props.id],\r\n };\r\n }\r\n\r\n on_change(e) {\r\n let val=e.target.checked;\r\n this.setState({\r\n switch: val,\r\n },()=>{\r\n this.props.callback({\r\n [this.props.id]: val,\r\n });\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n
\r\n \r\n \r\n {this.props.name} \r\n #{this.props.id} \r\n \r\n
\r\n
\r\n {this.props.description}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport class ConfigUI extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.save_changes_bound=this.save_changes.bind(this);\r\n }\r\n\r\n save_changes(chg) {\r\n console.log(chg);\r\n Object.keys(chg).forEach((key)=>{\r\n window.config[key]=chg[key];\r\n });\r\n save_config();\r\n }\r\n\r\n reset_settings() {\r\n if(window.confirm('重置所有设置?')) {\r\n window.config={};\r\n save_config();\r\n window.location.reload();\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
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n 新功能建议或问题反馈请在 \r\n GitHub \r\n 提出。\r\n
\r\n
\r\n
\r\n )\r\n }\r\n}","import React, {Component, PureComponent} from 'react';\r\nimport {THUHOLE_API_ROOT, get_json, API_VERSION_PARAM} from './flows_api';\r\nimport {Time} from './Common';\r\n\r\nexport class MessageViewer extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n loading_status: 'idle',\r\n msg: [],\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.load();\r\n }\r\n\r\n load() {\r\n if(this.state.loading_status==='loading') return;\r\n this.setState({\r\n loading_status: 'loading',\r\n },()=>{\r\n fetch(THUHOLE_API_ROOT+'api_xmcp/hole/system_msg?user_token='+encodeURIComponent(this.props.token)+API_VERSION_PARAM())\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.error)\r\n throw new Error(json.error);\r\n else\r\n this.setState({\r\n loading_status: 'done',\r\n msg: json.result,\r\n });\r\n })\r\n .catch((err)=>{\r\n console.error(err);\r\n alert(''+err);\r\n this.setState({\r\n loading_status: 'failed',\r\n });\r\n })\r\n\r\n });\r\n }\r\n\r\n render() {\r\n if(this.state.loading_status==='loading')\r\n return (加载中……
);\r\n else if(this.state.loading_status==='failed')\r\n return ();\r\n else if(this.state.loading_status==='done')\r\n return this.state.msg.map((msg)=>(\r\n \r\n
\r\n \r\n {msg.title} \r\n
\r\n
\r\n
\r\n ));\r\n else\r\n return null;\r\n }\r\n}","import React, {Component, PureComponent} from 'react';\r\nimport {API_BASE, SafeTextarea, PromotionBar} from './Common';\r\nimport {MessageViewer} from './Message';\r\nimport {LoginPopup} from './infrastructure/widgets';\r\nimport {ConfigUI} from './Config';\r\nimport fixOrientation from 'fix-orientation';\r\nimport copy from 'copy-to-clipboard';\r\nimport {cache} from './cache';\r\nimport {API_VERSION_PARAM, THUHOLE_API_ROOT, API, get_json, token_param} from './flows_api';\r\n\r\nimport './UserAction.css';\r\n\r\nconst BASE64_RATE=4/3;\r\nconst MAX_IMG_DIAM=8000;\r\nconst MAX_IMG_PX=5000000;\r\nconst MAX_IMG_FILESIZE=450000*BASE64_RATE;\r\n\r\nexport const TokenCtx=React.createContext({\r\n value: null,\r\n set_value: ()=>{},\r\n});\r\n\r\n// class LifeInfoBox extends Component {\r\n// constructor(props) {\r\n// super(props);\r\n// if(!window._life_info_cache)\r\n// window._life_info_cache={};\r\n// this.CACHE_TIMEOUT_S=15;\r\n// this.state={\r\n// today_info: this.cache_get('today_info'),\r\n// card_balance: this.cache_get('card_balance'),\r\n// net_balance: this.cache_get('net_balance'),\r\n// mail_count: this.cache_get('mail_count'),\r\n// };\r\n// this.INTERNAL_NETWORK_FAILURE='_network_failure';\r\n// this.API_NAME={\r\n// today_info: 'hole/today_info',\r\n// card_balance: 'isop/card_balance',\r\n// net_balance: 'isop/net_balance',\r\n// mail_count: 'isop/mail_count',\r\n// };\r\n// }\r\n//\r\n// cache_get(key) {\r\n// let cache_item=window._life_info_cache[key];\r\n// if(!cache_item || (+new Date())-cache_item[0]>1000*this.CACHE_TIMEOUT_S)\r\n// return null;\r\n// else\r\n// return cache_item[1];\r\n// }\r\n// cache_set(key,value) {\r\n// if(!window._life_info_cache[key] || window._life_info_cache[key][1]!==value)\r\n// window._life_info_cache[key]=[+new Date(),value];\r\n// }\r\n//\r\n// load(state_key) {\r\n// this.setState({\r\n// [state_key]: null,\r\n// },()=>{\r\n// fetch(\r\n// PKUHELPER_ROOT+'api_xmcp/'+this.API_NAME[state_key]\r\n// +'?user_token='+encodeURIComponent(this.props.token)\r\n// +API_VERSION_PARAM()\r\n// )\r\n// .then(get_json)\r\n// .then((json)=>{\r\n// //console.log(json);\r\n// this.setState({\r\n// [state_key]: json,\r\n// });\r\n// })\r\n// .catch((e)=>{\r\n// this.setState({\r\n// [state_key]: {\r\n// errMsg: '网络错误 '+e,\r\n// errCode: this.INTERNAL_NETWORK_FAILURE,\r\n// success: false,\r\n// }\r\n// });\r\n// })\r\n// });\r\n// }\r\n//\r\n// componentDidMount() {\r\n// ['today_info','card_balance','net_balance','mail_count'].forEach((k)=>{\r\n// if(!this.state[k])\r\n// this.load(k);\r\n// });\r\n// }\r\n//\r\n// reload_all() {\r\n// ['today_info','card_balance','net_balance','mail_count'].forEach((k)=>{\r\n// this.load(k);\r\n// });\r\n// }\r\n//\r\n// render_line(state_key,title,value_fn,action,url_fn,do_login) {\r\n// let s=this.state[state_key];\r\n// if(!s)\r\n// return (\r\n// \r\n// {title} \r\n// 加载中…… \r\n// \r\n// \r\n// );\r\n// else if(!s.success) {\r\n// let type='加载失败';\r\n// if(s.errCode===this.INTERNAL_NETWORK_FAILURE)\r\n// type='网络错误';\r\n// else if(['E01','E02','E03'].indexOf(s.errCode)!==-1)\r\n// type='授权失效';\r\n//\r\n// let details=JSON.stringify(s);\r\n// if(s.errMsg)\r\n// details=s.errMsg;\r\n// else if(s.error)\r\n// details=s.error;\r\n//\r\n// return (\r\n// \r\n// {title} \r\n// \r\n// alert(details)}>{type} \r\n// \r\n// \r\n// {type==='授权失效' ?\r\n// \r\n// 重新登录\r\n// :\r\n// this.load(state_key)}>\r\n// 重试\r\n// \r\n// }\r\n// \r\n// \r\n// )\r\n// }\r\n// else {\r\n// this.cache_set(state_key,s);\r\n//\r\n// return (\r\n// \r\n// {title} \r\n// {value_fn(s)} \r\n// \r\n// \r\n// {action}\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.props.set_token(t);\r\n// this.reload_all();\r\n// }}>{(do_login)=>(\r\n// \r\n//
\r\n// \r\n// {this.render_line(\r\n// 'today_info',\r\n// '今日',(s)=>s.info,\r\n// '校历',(s)=>s.schedule_url,\r\n// do_login,\r\n// )}\r\n// {this.render_line(\r\n// 'card_balance',\r\n// '校园卡',(s)=>`余额¥${s.balance.toFixed(2)}`,\r\n// '充值',()=>'https://virtualprod.alipay.com/educate/educatePcRecharge.htm?schoolCode=PKU&schoolName=',\r\n// do_login,\r\n// )}\r\n// {this.render_line(\r\n// 'net_balance',\r\n// '网费',(s)=>`余额¥${s.balance.toFixed(2)}`,\r\n// '充值',()=>'https://its.pku.edu.cn/epay.jsp',\r\n// do_login,\r\n// )}\r\n// {this.render_line(\r\n// 'mail_count',\r\n// '邮件',(s)=>`未读 ${s.count} 封`,\r\n// '查看',()=>'https://mail.pku.edu.cn/',\r\n// do_login,\r\n// )}\r\n// \r\n//
\r\n//
\r\n// )} \r\n// )\r\n// }\r\n// }\r\n\r\nexport function InfoSidebar(props) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nclass ResetUsertokenWidget extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n loading_status: 'done',\r\n };\r\n }\r\n\r\n do_reset() {\r\n if(window.confirm('您正在重置 UserToken!\\n您的账号将会在【所有设备】上注销,您需要手动重新登录!')) {\r\n let uid=window.prompt('您正在重置 UserToken!\\n请输入您的学号以确认身份:');\r\n if(uid)\r\n this.setState({\r\n loading_status: 'loading',\r\n },()=>{\r\n fetch(THUHOLE_API_ROOT+'api_xmcp/hole/reset_usertoken', {\r\n method: 'post',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n user_token: this.props.token,\r\n uid: uid,\r\n }),\r\n })\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.error)\r\n throw new Error(json.error);\r\n else\r\n alert('重置成功!您需要在所有设备上重新登录。');\r\n\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n })\r\n .catch((e)=>{\r\n alert('重置失败:'+e);\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n })\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n if(this.state.loading_status==='done')\r\n return (重置 );\r\n else if(this.state.loading_status==='loading')\r\n return ( );\r\n }\r\n}\r\n\r\nexport class LoginForm extends Component {\r\n copy_token(token) {\r\n if(copy(token))\r\n alert('复制成功!\\n请一定不要泄露哦');\r\n }\r\n\r\n render() {\r\n return (\r\n {(token)=>\r\n \r\n {/*{!!token.value &&*/}\r\n {/*
*/}\r\n {/*}*/}\r\n
\r\n {token.value ?\r\n
:\r\n
{(do_popup)=>(\r\n \r\n
\r\n \r\n \r\n 登录\r\n \r\n
\r\n
\r\n T大树洞 面向清华大学学生,通过清华邮箱验证您的身份并提供服务。\r\n
\r\n
\r\n )} \r\n }\r\n
\r\n
\r\n } \r\n )\r\n }\r\n}\r\n\r\nexport class ReplyForm extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n text: '',\r\n loading_status: 'done',\r\n };\r\n this.on_change_bound=this.on_change.bind(this);\r\n this.area_ref=this.props.area_ref||React.createRef();\r\n this.global_keypress_handler_bound=this.global_keypress_handler.bind(this);\r\n }\r\n\r\n global_keypress_handler(e) {\r\n if(e.code==='Enter' && !e.ctrlKey && !e.altKey && ['input','textarea'].indexOf(e.target.tagName.toLowerCase())===-1) {\r\n if(this.area_ref.current) {\r\n e.preventDefault();\r\n this.area_ref.current.focus();\r\n }\r\n }\r\n }\r\n componentDidMount() {\r\n document.addEventListener('keypress',this.global_keypress_handler_bound);\r\n }\r\n componentWillUnmount() {\r\n document.removeEventListener('keypress',this.global_keypress_handler_bound);\r\n }\r\n\r\n on_change(value) {\r\n this.setState({\r\n text: value,\r\n });\r\n }\r\n\r\n on_submit(event) {\r\n if(event) event.preventDefault();\r\n if(this.state.loading_status==='loading')\r\n return;\r\n this.setState({\r\n loading_status: 'loading',\r\n });\r\n\r\n let data=new URLSearchParams();\r\n data.append('pid',this.props.pid);\r\n data.append('text',this.state.text);\r\n data.append('user_token',this.props.token);\r\n fetch(API_BASE+'/api.php?action=docomment'+token_param(this.props.token), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n body: data,\r\n })\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) alert(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n\r\n this.setState({\r\n loading_status: 'done',\r\n text: '',\r\n });\r\n this.area_ref.current.clear();\r\n this.props.on_complete();\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n alert('回复失败');\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nexport class PostForm extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n text: '',\r\n loading_status: 'done',\r\n img_tip: null,\r\n };\r\n this.img_ref=React.createRef();\r\n this.area_ref=React.createRef();\r\n this.on_change_bound=this.on_change.bind(this);\r\n this.on_img_change_bound=this.on_img_change.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n if(this.area_ref.current)\r\n this.area_ref.current.focus();\r\n }\r\n\r\n on_change(value) {\r\n this.setState({\r\n text: value,\r\n });\r\n }\r\n\r\n do_post(text,img) {\r\n let data=new URLSearchParams();\r\n data.append('text',this.state.text);\r\n data.append('type',img ? 'image' : 'text');\r\n data.append('user_token',this.props.token);\r\n if(img)\r\n data.append('data',img);\r\n\r\n fetch(API_BASE+'/api.php?action=dopost'+token_param(this.props.token), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n body: data,\r\n })\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) alert(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n\r\n this.setState({\r\n loading_status: 'done',\r\n text: '',\r\n });\r\n this.area_ref.current.clear();\r\n this.props.on_complete();\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n alert('发表失败');\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n });\r\n }\r\n\r\n proc_img(file) {\r\n return new Promise((resolve,reject)=>{\r\n function return_url(url) {\r\n const idx=url.indexOf(';base64,');\r\n if(idx===-1)\r\n throw new Error('img not base64 encoded');\r\n\r\n return url.substr(idx+8);\r\n }\r\n\r\n let reader=new FileReader();\r\n function on_got_img(url) {\r\n const image = new Image();\r\n image.onload=(()=>{\r\n let width=image.width;\r\n let height=image.height;\r\n let compressed=false;\r\n\r\n if(width>MAX_IMG_DIAM) {\r\n height=height*MAX_IMG_DIAM/width;\r\n width=MAX_IMG_DIAM;\r\n compressed=true;\r\n }\r\n if(height>MAX_IMG_DIAM) {\r\n width=width*MAX_IMG_DIAM/height;\r\n height=MAX_IMG_DIAM;\r\n compressed=true;\r\n }\r\n if(height*width>MAX_IMG_PX) {\r\n let rate=Math.sqrt(height*width/MAX_IMG_PX);\r\n height/=rate;\r\n width/=rate;\r\n compressed=true;\r\n }\r\n console.log('chosen img size',width,height);\r\n\r\n let canvas=document.createElement('canvas');\r\n let ctx=canvas.getContext('2d');\r\n canvas.width=width;\r\n canvas.height=height;\r\n ctx.drawImage(image,0,0,width,height);\r\n\r\n let quality_l=.1,quality_r=.9,quality,new_url;\r\n while(quality_r-quality_l>=.03) {\r\n quality=(quality_r+quality_l)/2;\r\n new_url=canvas.toDataURL('image/jpeg',quality);\r\n console.log(quality_l,quality_r,'trying quality',quality,'size',new_url.length);\r\n if(new_url.length<=MAX_IMG_FILESIZE)\r\n quality_l=quality;\r\n else\r\n quality_r=quality;\r\n }\r\n if(quality_l>=.101) {\r\n console.log('chosen img quality',quality);\r\n resolve({\r\n img: return_url(new_url),\r\n quality: quality,\r\n width: Math.round(width),\r\n height: Math.round(height),\r\n compressed: compressed,\r\n });\r\n } else {\r\n reject('图片过大,无法上传');\r\n }\r\n });\r\n image.src=url;\r\n }\r\n reader.onload=(event)=>{\r\n fixOrientation(event.target.result,{},(fixed_dataurl)=>{\r\n on_got_img(fixed_dataurl);\r\n });\r\n };\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n\r\n on_img_change() {\r\n if(this.img_ref.current && this.img_ref.current.files.length)\r\n this.setState({\r\n img_tip: '(正在处理图片……)'\r\n },()=>{\r\n this.proc_img(this.img_ref.current.files[0])\r\n .then((d)=>{\r\n this.setState({\r\n img_tip: `(${d.compressed?'压缩到':'尺寸'} ${d.width}*${d.height} / `+\r\n `质量 ${Math.floor(d.quality*100)}% / ${Math.floor(d.img.length/BASE64_RATE/1000)}KB)`,\r\n });\r\n })\r\n .catch((e)=>{\r\n this.setState({\r\n img_tip: `图片无效:${e}`,\r\n });\r\n });\r\n });\r\n else\r\n this.setState({\r\n img_tip: null,\r\n });\r\n }\r\n\r\n on_submit(event) {\r\n if(event) event.preventDefault();\r\n if(this.state.loading_status==='loading')\r\n return;\r\n if(this.img_ref.current.files.length) {\r\n this.setState({\r\n loading_status: 'processing',\r\n });\r\n this.proc_img(this.img_ref.current.files[0])\r\n .then((d)=>{\r\n this.setState({\r\n loading_status: 'loading',\r\n });\r\n this.do_post(this.state.text,d.img);\r\n })\r\n .catch((e)=>{\r\n alert(e);\r\n });\r\n } else {\r\n this.setState({\r\n loading_status: 'loading',\r\n });\r\n this.do_post(this.state.text,null);\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n}","import React, {Component, PureComponent} from 'react';\r\nimport copy from 'copy-to-clipboard';\r\nimport {ColorPicker} from './color_picker';\r\nimport {split_text, NICKNAME_RE, PID_RE, URL_RE, URL_PID_RE} from './text_splitter';\r\nimport {format_time, build_highlight_re, Time, TitleLine, HighlightedText, ClickHandler, ColoredSpan} from './Common';\r\nimport './Flows.css';\r\nimport LazyLoad from './react-lazyload/src';\r\nimport {AudioWidget} from './AudioWidget';\r\nimport {TokenCtx, ReplyForm} from './UserAction';\r\n\r\nimport {API, THUHOLE_API_ROOT} from './flows_api';\r\n\r\nconst IMAGE_BASE=THUHOLE_API_ROOT+'/images/';\r\nconst AUDIO_BASE=THUHOLE_API_ROOT+'services/thuhole/audios/';\r\n\r\nconst CLICKABLE_TAGS={a: true, audio: true};\r\nconst PREVIEW_REPLY_COUNT=10;\r\n// const QUOTE_BLACKLIST=['23333','233333','66666','666666','10086','10000','100000','99999','999999','55555','555555'];\r\nconst QUOTE_BLACKLIST=[];\r\n\r\nwindow.LATEST_POST_ID=parseInt(localStorage['_LATEST_POST_ID'],10)||0;\r\n\r\nconst DZ_NAME='洞主';\r\n\r\nfunction load_single_meta(show_sidebar,token) {\r\n return (pid,replace=false)=>{\r\n let color_picker=new ColorPicker();\r\n let title_elem='树洞 #'+pid;\r\n show_sidebar(\r\n title_elem,\r\n \r\n 正在加载 #{pid}\r\n
,\r\n replace?'replace':'push'\r\n );\r\n API.get_single(pid,token)\r\n .then((single)=>{\r\n single.data.variant={};\r\n return new Promise((resolve,reject)=>{\r\n API.load_replies_with_cache(pid,token,color_picker,parseInt(single.data.reply))\r\n .then((replies)=>{resolve([single,replies])})\r\n .catch(reject);\r\n });\r\n })\r\n .then((res)=>{\r\n let [single,replies]=res;\r\n show_sidebar(\r\n title_elem,\r\n ,\r\n 'replace'\r\n )\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n show_sidebar(\r\n title_elem,\r\n ,\r\n 'replace'\r\n );\r\n })\r\n };\r\n}\r\n\r\nclass Reply extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n let parts=split_text(this.props.info.text,[\r\n ['url_pid',URL_PID_RE],\r\n ['url',URL_RE],\r\n ['pid',PID_RE],\r\n ['nickname',NICKNAME_RE],\r\n ]);\r\n\r\n return (\r\n \r\n
\r\n #{this.props.info.cid}
\r\n {!!this.props.do_filter_name &&\r\n {this.props.do_filter_name(this.props.info.name);}}>\r\n \r\n \r\n }\r\n \r\n {this.props.info.tag!==null &&\r\n \r\n {this.props.info.tag}\r\n \r\n }\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass FlowItem extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n copy_link(event) {\r\n event.preventDefault();\r\n copy(\r\n `${event.target.href}${this.props.info.tag ? ' 【'+this.props.info.tag+'】' : ''}\\n`+\r\n `${this.props.info.text}${this.props.info.type==='image'?' [图片]':this.props.info.type==='audio'?' [语音]':''}\\n`+\r\n `(${format_time(new Date(this.props.info.timestamp*1000))} ${this.props.info.likenum}关注 ${this.props.info.reply}回复)\\n`+\r\n this.props.replies.map((r)=>(\r\n (r.tag ? '【'+r.tag+'】' : '')+\r\n r.text\r\n )).join('\\n')\r\n );\r\n }\r\n\r\n render() {\r\n let props=this.props;\r\n let parts=props.parts||split_text(props.info.text,[\r\n ['url_pid',URL_PID_RE],\r\n ['url',URL_RE],\r\n ['pid',PID_RE],\r\n ['nickname',NICKNAME_RE],\r\n ]);\r\n return (\r\n \r\n {!!props.is_quote &&\r\n
\r\n }\r\n
\r\n {!!window.LATEST_POST_ID && parseInt(props.info.pid,10)>window.LATEST_POST_ID &&\r\n
\r\n }\r\n
\r\n {!!this.props.do_filter_name &&\r\n
{this.props.do_filter_name(DZ_NAME);}}>\r\n \r\n \r\n }\r\n {!!parseInt(props.info.likenum,10) &&\r\n
\r\n {props.info.likenum} \r\n \r\n \r\n }\r\n {!!parseInt(props.info.reply,10) &&\r\n
\r\n {props.info.reply} \r\n \r\n \r\n }\r\n
#{props.info.pid}
\r\n \r\n {props.info.tag!==null &&\r\n
\r\n {props.info.tag}\r\n \r\n }\r\n
\r\n
\r\n
\r\n
\r\n {props.info.type==='image' &&\r\n
\r\n {props.img_clickable ?\r\n :\r\n \r\n }\r\n
\r\n }\r\n {props.info.type==='audio' &&
}\r\n
\r\n {!!(props.attention && props.info.variant.latest_reply) &&\r\n
最新回复
\r\n }\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass FlowSidebar extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n attention: props.attention,\r\n info: props.info,\r\n replies: props.replies,\r\n loading_status: 'done',\r\n error_msg: null,\r\n filter_name: null,\r\n rev: false,\r\n };\r\n this.color_picker=props.color_picker;\r\n this.syncState=props.sync_state||(()=>{});\r\n this.reply_ref=React.createRef();\r\n }\r\n\r\n set_variant(cid,variant) {\r\n this.setState((prev)=>{\r\n if(cid)\r\n return {\r\n replies: prev.replies.map((reply)=>{\r\n if(reply.cid===cid)\r\n return Object.assign({},reply,{variant: Object.assign({},reply.variant,variant)});\r\n else\r\n return reply;\r\n }),\r\n };\r\n else\r\n return {\r\n info: Object.assign({},prev.info,{variant: Object.assign({},prev.info.variant,variant)}),\r\n }\r\n },function() {\r\n this.syncState({\r\n info: this.state.info,\r\n replies: this.state.replies,\r\n });\r\n });\r\n }\r\n\r\n load_replies(update_count=true) {\r\n this.setState({\r\n loading_status: 'loading',\r\n error_msg: null,\r\n });\r\n API.load_replies(this.state.info.pid,this.props.token,this.color_picker,null)\r\n .then((json)=>{\r\n this.setState((prev,props)=>({\r\n replies: json.data,\r\n info: update_count ? Object.assign({}, prev.info, {\r\n reply: ''+json.data.length,\r\n }) : prev.info,\r\n attention: !!json.attention,\r\n loading_status: 'done',\r\n error_msg: null,\r\n }), ()=>{\r\n this.syncState({\r\n replies: this.state.replies,\r\n attention: this.state.attention,\r\n info: this.state.info,\r\n });\r\n if(this.state.replies.length)\r\n this.set_variant(null,{latest_reply: Math.max.apply(null,this.state.replies.map((r)=>parseInt(r.timestamp)))});\r\n });\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n this.setState({\r\n replies: [],\r\n loading_status: 'done',\r\n error_msg: ''+e,\r\n });\r\n });\r\n }\r\n\r\n toggle_attention() {\r\n this.setState({\r\n loading_status: 'loading',\r\n });\r\n const next_attention=!this.state.attention;\r\n API.set_attention(this.state.info.pid,next_attention,this.props.token)\r\n .then((json)=>{\r\n this.setState({\r\n loading_status: 'done',\r\n attention: next_attention,\r\n });\r\n this.syncState({\r\n attention: next_attention,\r\n });\r\n })\r\n .catch((e)=>{\r\n this.setState({\r\n loading_status: 'done'\r\n });\r\n alert('设置关注失败');\r\n console.error(e);\r\n });\r\n }\r\n\r\n report() {\r\n let reason=prompt(`举报 #${this.state.info.pid} 的理由:`);\r\n if(reason!==null) {\r\n API.report(this.state.info.pid,reason,this.props.token)\r\n .then((json)=>{\r\n alert('举报成功');\r\n })\r\n .catch((e)=>{\r\n alert('举报失败');\r\n console.error(e);\r\n })\r\n }\r\n }\r\n\r\n set_filter_name(name) {\r\n this.setState((prevState)=>({\r\n filter_name: name===prevState.filter_name ? null : name,\r\n }));\r\n }\r\n\r\n toggle_rev() {\r\n this.setState((prevState)=>({\r\n rev: !prevState.rev,\r\n }));\r\n }\r\n\r\n show_reply_bar(name,event) {\r\n if(this.reply_ref.current && !event.target.closest('a, .clickable')) {\r\n let text=this.reply_ref.current.get();\r\n if(/^\\s*(?:Re (?:|洞主|(?:[A-Z][a-z]+ )?(?:[A-Z][a-z]+)|You Win(?: \\d+)?):)?\\s*$/.test(text)) {// text is nearly empty so we can replace it\r\n let should_text='Re '+name+': ';\r\n if(should_text===this.reply_ref.current.get())\r\n this.reply_ref.current.set('');\r\n else\r\n this.reply_ref.current.set(should_text);\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n if(this.state.loading_status==='loading')\r\n return (加载中……
);\r\n\r\n let show_pid=load_single_meta(this.props.show_sidebar,this.props.token);\r\n\r\n let replies_to_show=this.state.filter_name ? this.state.replies.filter((r)=>r.name===this.state.filter_name) : this.state.replies.slice();\r\n if(this.state.rev) replies_to_show.reverse();\r\n\r\n // key for lazyload elem\r\n let view_mode_key=(this.state.rev ? 'y-' : 'n-')+(this.state.filter_name||'null');\r\n\r\n let replies_cnt={[DZ_NAME]:1};\r\n replies_to_show.forEach((r)=>{\r\n if(replies_cnt[r.name]===undefined)\r\n replies_cnt[r.name]=0;\r\n replies_cnt[r.name]++;\r\n });\r\n\r\n // hide main thread when filtered\r\n let main_thread_elem=(this.state.filter_name && this.state.filter_name!==DZ_NAME) ? null : (\r\n {this.show_reply_bar('',e);}}>\r\n {this.set_variant(null,variant);}}\r\n do_filter_name={replies_cnt[DZ_NAME]>1 ? this.set_filter_name.bind(this) : null}\r\n />\r\n \r\n );\r\n\r\n return (\r\n \r\n
\r\n {!!this.state.filter_name &&\r\n
\r\n }\r\n {!this.state.rev &&\r\n main_thread_elem\r\n }\r\n {!!this.state.error_msg &&\r\n
\r\n
回复加载失败
\r\n
{this.state.error_msg}
\r\n
\r\n }\r\n {(this.props.deletion_detect && parseInt(this.state.info.reply)>this.state.replies.length) && !!this.state.replies.length &&\r\n
\r\n {parseInt(this.state.info.reply)-this.state.replies.length} 条回复被删除\r\n
\r\n }\r\n {replies_to_show.map((reply)=>(\r\n
\r\n {this.show_reply_bar(reply.name,e);}}>\r\n {this.set_variant(reply.cid,variant);}}\r\n do_filter_name={replies_cnt[reply.name]>1 ? this.set_filter_name.bind(this) : null}\r\n />\r\n \r\n \r\n ))}\r\n {this.state.rev &&\r\n main_thread_elem\r\n }\r\n {!!this.props.token ?\r\n
:\r\n
登录后可以回复树洞
\r\n }\r\n
\r\n )\r\n }\r\n}\r\n\r\nclass FlowItemRow extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n replies: [],\r\n reply_status: 'done',\r\n reply_error: null,\r\n info: Object.assign({},props.info,{variant: {}}),\r\n attention: props.attention_override===null ? false : props.attention_override,\r\n };\r\n this.color_picker=new ColorPicker();\r\n }\r\n\r\n componentDidMount() {\r\n if(parseInt(this.state.info.reply,10)) {\r\n this.load_replies(null,/*update_count=*/false);\r\n }\r\n }\r\n\r\n load_replies(callback,update_count=true) {\r\n console.log('fetching reply',this.state.info.pid);\r\n this.setState({\r\n reply_status: 'loading',\r\n reply_error: null,\r\n });\r\n API.load_replies_with_cache(this.state.info.pid,this.props.token,this.color_picker,parseInt(this.state.info.reply))\r\n .then((json)=>{\r\n this.setState((prev,props)=>({\r\n replies: json.data,\r\n info: Object.assign({}, prev.info, {\r\n reply: update_count ? ''+json.data.length : prev.info.reply,\r\n variant: json.data.length ? {\r\n latest_reply: Math.max.apply(null,json.data.map((r)=>parseInt(r.timestamp))),\r\n } : {},\r\n }),\r\n attention: !!json.attention,\r\n reply_status: 'done',\r\n reply_error: null,\r\n }),callback);\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n this.setState({\r\n replies: [],\r\n reply_status: 'failed',\r\n reply_error: ''+e,\r\n },callback);\r\n });\r\n }\r\n\r\n show_sidebar() {\r\n this.props.show_sidebar(\r\n '树洞 #'+this.state.info.pid,\r\n \r\n );\r\n }\r\n\r\n render() {\r\n let show_pid=load_single_meta(this.props.show_sidebar,this.props.token,[this.state.info.pid]);\r\n\r\n let hl_rules=[\r\n ['url_pid',URL_PID_RE],\r\n ['url',URL_RE],\r\n ['pid',PID_RE],\r\n ['nickname',NICKNAME_RE],\r\n ];\r\n if(this.props.search_param)\r\n hl_rules.push(['search',build_highlight_re(this.props.search_param,' ','gi')]);\r\n let parts=split_text(this.state.info.text,hl_rules);\r\n\r\n let quote_id=null;\r\n if(!this.props.is_quote)\r\n for(let [mode,content] of parts) {\r\n content = content.length > 0 ? content.substring(1) : content\r\n if(mode==='pid' && QUOTE_BLACKLIST.indexOf(content)===-1 && parseInt(content){\r\n if(!CLICKABLE_TAGS[event.target.tagName.toLowerCase()])\r\n this.show_sidebar();\r\n }}>\r\n \r\n \r\n {this.state.reply_status==='loading' &&
加载中
}\r\n {this.state.reply_status==='failed' &&\r\n
\r\n }\r\n {this.state.replies.slice(0,PREVIEW_REPLY_COUNT).map((reply)=>(\r\n
\r\n ))}\r\n {this.state.replies.length>PREVIEW_REPLY_COUNT &&\r\n
还有 {this.state.replies.length-PREVIEW_REPLY_COUNT} 条
\r\n }\r\n
\r\n \r\n );\r\n\r\n return quote_id ? (\r\n \r\n {res}\r\n \r\n
\r\n ) : res;\r\n }\r\n}\r\n\r\nclass FlowItemQuote extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n loading_status: 'empty',\r\n error_msg: null,\r\n info: null,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.load();\r\n }\r\n\r\n load() {\r\n this.setState({\r\n loading_status: 'loading',\r\n },()=>{\r\n API.get_single(this.props.pid,this.props.token)\r\n .then((json)=>{\r\n this.setState({\r\n loading_status: 'done',\r\n info: json.data,\r\n });\r\n })\r\n .catch((err)=>{\r\n if((''+err).indexOf('没有这条树洞')!==-1)\r\n this.setState({\r\n loading_status: 'empty',\r\n });\r\n else\r\n this.setState({\r\n loading_status: 'error',\r\n error_msg: ''+err,\r\n });\r\n });\r\n });\r\n }\r\n\r\n render() {\r\n if(this.state.loading_status==='empty')\r\n return null;\r\n else if(this.state.loading_status==='loading')\r\n return (\r\n \r\n
\r\n \r\n 提到了 #{this.props.pid}\r\n
\r\n
\r\n );\r\n else if(this.state.loading_status==='error')\r\n return (\r\n \r\n
\r\n
重新加载
\r\n
{this.state.error_msg}
\r\n
\r\n
\r\n );\r\n else // 'done'\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nfunction FlowChunk(props) {\r\n return (\r\n {({value: token})=>(\r\n \r\n {!!props.title &&
}\r\n {props.list.map((info,ind)=>(\r\n
\r\n \r\n {!!(props.deletion_detect && props.mode==='list' && ind && props.list[ind-1].pid-info.pid>1) &&\r\n
\r\n
\r\n {props.list[ind-1].pid-info.pid-1} 条被删除\r\n
\r\n
\r\n }\r\n
\r\n
\r\n \r\n ))}\r\n
\r\n )} \r\n );\r\n}\r\n\r\nexport class Flow extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n mode: props.mode,\r\n search_param: props.search_text,\r\n loaded_pages: 0,\r\n chunks: {\r\n title: '',\r\n data: [],\r\n },\r\n loading_status: 'done',\r\n error_msg: null,\r\n };\r\n this.on_scroll_bound=this.on_scroll.bind(this);\r\n window.LATEST_POST_ID=parseInt(localStorage['_LATEST_POST_ID'],10)||0;\r\n }\r\n\r\n load_page(page) {\r\n const failed=(err)=>{\r\n console.error(err);\r\n this.setState((prev,props)=>({\r\n loaded_pages: prev.loaded_pages-1,\r\n loading_status: 'failed',\r\n error_msg: ''+err,\r\n }));\r\n };\r\n\r\n if(page>this.state.loaded_pages+1)\r\n throw new Error('bad page');\r\n if(page===this.state.loaded_pages+1) {\r\n console.log('fetching page',page);\r\n if(this.state.mode==='list') {\r\n API.get_list(page,this.props.token)\r\n .then((json)=>{\r\n if(page===1 && json.data.length) { // update latest_post_id\r\n let max_id=-1;\r\n json.data.forEach((x)=>{\r\n if(parseInt(x.pid,10)>max_id)\r\n max_id=parseInt(x.pid,10);\r\n });\r\n localStorage['_LATEST_POST_ID']=''+max_id;\r\n }\r\n this.setState((prev,props)=>({\r\n chunks: {\r\n title: 'News Feed',\r\n data: prev.chunks.data.concat(json.data.filter((x)=>(\r\n prev.chunks.data.length===0 ||\r\n !(prev.chunks.data.slice(-100).some((p)=>p.pid===x.pid))\r\n ))),\r\n },\r\n loading_status: 'done',\r\n }));\r\n })\r\n .catch(failed);\r\n } else if(this.state.mode==='search') {\r\n API.get_search(page,this.state.search_param,this.props.token)\r\n .then((json)=>{\r\n const finished=json.data.length===0;\r\n this.setState((prev,props)=>({\r\n chunks: {\r\n title: 'Result for \"'+this.state.search_param+'\"',\r\n data: prev.chunks.data.concat(json.data.filter((x)=>(\r\n prev.chunks.data.length===0 ||\r\n !(prev.chunks.data.slice(-100).some((p)=>p.pid===x.pid))\r\n ))),\r\n },\r\n mode: finished ? 'search_finished' : 'search',\r\n loading_status: 'done',\r\n }));\r\n })\r\n .catch(failed);\r\n } else if(this.state.mode==='single') {\r\n const pid=parseInt(this.state.search_param.substr(1),10);\r\n API.get_single(pid,this.props.token)\r\n .then((json)=>{\r\n this.setState({\r\n chunks: {\r\n title: 'PID = '+pid,\r\n data: [json.data],\r\n },\r\n mode: 'single_finished',\r\n loading_status: 'done',\r\n });\r\n })\r\n .catch(failed);\r\n } else if(this.state.mode==='attention') {\r\n API.get_attention(this.props.token)\r\n .then((json)=>{\r\n this.setState({\r\n chunks: {\r\n title: 'Attention List',\r\n data: json.data,\r\n },\r\n mode: 'attention_finished',\r\n loading_status: 'done',\r\n });\r\n })\r\n .catch(failed);\r\n } else {\r\n console.log('nothing to load');\r\n return;\r\n }\r\n\r\n this.setState((prev,props)=>({\r\n loaded_pages: prev.loaded_pages+1,\r\n loading_status: 'loading',\r\n error_msg: null,\r\n }));\r\n }\r\n }\r\n\r\n on_scroll(event) {\r\n if(event.target===document) {\r\n const avail=document.body.scrollHeight-window.scrollY-window.innerHeight;\r\n if(avail\r\n \r\n {this.state.loading_status==='failed' &&\r\n \r\n }\r\n Loading... :\r\n '© thuhole'\r\n } />\r\n \r\n );\r\n }\r\n}","import React, {Component, PureComponent} from 'react';\r\n// import {AppSwitcher} from './infrastructure/widgets';\r\nimport {InfoSidebar, PostForm} from './UserAction';\r\nimport {TokenCtx} from './UserAction';\r\n\r\nimport './Title.css';\r\n\r\nconst flag_re=/^\\/\\/setflag ([a-zA-Z0-9_]+)=(.*)$/;\r\n\r\nclass ControlBar extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n search_text: '',\r\n };\r\n this.set_mode=props.set_mode;\r\n\r\n this.on_change_bound=this.on_change.bind(this);\r\n this.on_keypress_bound=this.on_keypress.bind(this);\r\n this.do_refresh_bound=this.do_refresh.bind(this);\r\n this.do_attention_bound=this.do_attention.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n if(window.location.hash) {\r\n let text=decodeURIComponent(window.location.hash).substr(1);\r\n if(text.lastIndexOf('?')!==-1)\r\n text=text.substr(0,text.lastIndexOf('?')); // fuck wechat '#param?nsukey=...'\r\n this.setState({\r\n search_text: text,\r\n }, ()=>{\r\n this.on_keypress({key: 'Enter'});\r\n });\r\n }\r\n }\r\n\r\n on_change(event) {\r\n this.setState({\r\n search_text: event.target.value,\r\n });\r\n }\r\n\r\n on_keypress(event) {\r\n if(event.key==='Enter') {\r\n let flag_res=flag_re.exec(this.state.search_text);\r\n if(flag_res) {\r\n if(flag_res[2]) {\r\n localStorage[flag_res[1]]=flag_res[2];\r\n alert('Set Flag '+flag_res[1]+'='+flag_res[2]+'\\nYou may need to refresh this webpage.');\r\n } else {\r\n delete localStorage[flag_res[1]];\r\n alert('Clear Flag '+flag_res[1]+'\\nYou may need to refresh this webpage.');\r\n }\r\n return;\r\n }\r\n\r\n const mode=this.state.search_text.startsWith('#') ? 'single' : 'search';\r\n this.set_mode(mode,this.state.search_text||'');\r\n }\r\n }\r\n\r\n do_refresh() {\r\n window.scrollTo(0,0);\r\n this.setState({\r\n search_text: '',\r\n });\r\n this.set_mode('list',null);\r\n }\r\n\r\n do_attention() {\r\n window.scrollTo(0,0);\r\n this.setState({\r\n search_text: '',\r\n });\r\n this.set_mode('attention',null);\r\n }\r\n\r\n render() {\r\n return (\r\n {({value: token})=>(\r\n \r\n )} \r\n )\r\n }\r\n}\r\n\r\nexport function Title(props) {\r\n return (\r\n \r\n {/*
*/}\r\n
\r\n
\r\n
\r\n props.show_sidebar(\r\n 'T大树洞',\r\n \r\n )}>\r\n T大树洞\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n}","import React, {Component, PureComponent} from 'react';\r\nimport './Sidebar.css';\r\n\r\nexport class Sidebar extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.sidebar_ref=React.createRef();\r\n this.do_close_bound=this.do_close.bind(this);\r\n this.do_back_bound=this.do_back.bind(this);\r\n }\r\n\r\n componentDidUpdate(nextProps) {\r\n if(this.props.stack!==nextProps.stack) {\r\n //console.log('sidebar top');\r\n if(this.sidebar_ref.current)\r\n this.sidebar_ref.current.scrollTop=0;\r\n }\r\n }\r\n\r\n do_close() {\r\n this.props.show_sidebar(null,null,'clear');\r\n }\r\n do_back() {\r\n this.props.show_sidebar(null,null,'pop');\r\n }\r\n\r\n render() {\r\n let [cur_title,cur_content]=this.props.stack[this.props.stack.length-1];\r\n return (\r\n \r\n
{e.preventDefault();e.target.click();}} />\r\n
\r\n {cur_content}\r\n
\r\n
\r\n
\r\n {this.props.stack.length>2 &&\r\n
\r\n }\r\n {cur_title}\r\n
\r\n
\r\n );\r\n }\r\n}","import React, {Component} from 'react';\r\nimport Pressure from 'pressure';\r\n\r\nimport './PressureHelper.css';\r\n\r\nconst THRESHOLD=.4;\r\nconst MULTIPLIER=25;\r\nconst BORDER_WIDTH=500; // also change css!\r\n\r\nexport class PressureHelper extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n level: 0,\r\n fired: false,\r\n };\r\n this.callback=props.callback;\r\n this.esc_interval=null;\r\n }\r\n\r\n do_fire() {\r\n if(this.esc_interval) {\r\n clearInterval(this.esc_interval);\r\n this.esc_interval=null;\r\n }\r\n this.setState({\r\n level: 1,\r\n fired: true,\r\n });\r\n this.callback();\r\n window.setTimeout(()=>{\r\n this.setState({\r\n level: 0,\r\n fired: false,\r\n });\r\n },300);\r\n }\r\n\r\n componentDidMount() {\r\n if(window.config.pressure) {\r\n Pressure.set(document.body, {\r\n change: (force)=>{\r\n if(!this.state.fired) {\r\n if(force>=.999) {\r\n this.do_fire();\r\n }\r\n else\r\n this.setState({\r\n level: force,\r\n });\r\n }\r\n },\r\n end: ()=>{\r\n this.setState({\r\n level: 0,\r\n fired: false,\r\n });\r\n },\r\n }, {\r\n polyfill: false,\r\n only: 'touch',\r\n preventSelect: false,\r\n });\r\n\r\n document.addEventListener('keydown',(e)=>{\r\n if(!e.repeat && e.key==='Escape') {\r\n if(this.esc_interval)\r\n clearInterval(this.esc_interval);\r\n this.setState({\r\n level: THRESHOLD/2,\r\n },()=>{\r\n this.esc_interval=setInterval(()=>{\r\n let new_level=this.state.level+.1;\r\n if(new_level>=.999)\r\n this.do_fire();\r\n else\r\n this.setState({\r\n level: new_level,\r\n });\r\n },30);\r\n });\r\n }\r\n });\r\n document.addEventListener('keyup',(e)=>{\r\n if(e.key==='Escape') {\r\n if(this.esc_interval) {\r\n clearInterval(this.esc_interval);\r\n this.esc_interval=null;\r\n }\r\n this.setState({\r\n level: 0,\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const pad=MULTIPLIER*(this.state.level-THRESHOLD)-BORDER_WIDTH;\r\n return (\r\n
\r\n )\r\n }\r\n}","import React, {Component} from 'react';\r\nimport {Flow} from './Flows';\r\nimport {Title} from './Title';\r\nimport {Sidebar} from './Sidebar';\r\nimport {PressureHelper} from './PressureHelper';\r\nimport {TokenCtx} from './UserAction';\r\nimport {load_config,bgimg_style} from './Config';\r\nimport {listen_darkmode} from './infrastructure/functions';\r\nimport {LoginPopup, TitleLine} from './infrastructure/widgets';\r\n\r\nconst MAX_SIDEBAR_STACK_SIZE=10;\r\n\r\nfunction DeprecatedAlert(props) {\r\n return (\r\n
\r\n );\r\n}\r\n\r\nclass App extends Component {\r\n constructor(props) {\r\n super(props);\r\n load_config();\r\n listen_darkmode({default: undefined, light: false, dark: true}[window.config.color_scheme]);\r\n this.state={\r\n sidebar_stack: [[null,null]], // list of [status, content]\r\n mode: 'list', // list, single, search, attention\r\n search_text: null,\r\n flow_render_key: +new Date(),\r\n token: localStorage['TOKEN']||null,\r\n };\r\n this.show_sidebar_bound=this.show_sidebar.bind(this);\r\n this.set_mode_bound=this.set_mode.bind(this);\r\n this.on_pressure_bound=this.on_pressure.bind(this);\r\n // a silly self-deceptive approach to ban guests, enough to fool those muggles\r\n // document cookie 'pku_ip_flag=yes'\r\n this.inpku_flag=window[atob('ZG9jdW1lbnQ')][atob('Y29va2ll')].indexOf(atob('cGt1X2lwX2ZsYWc9eWVz'))!==-1;\r\n }\r\n\r\n static is_darkmode() {\r\n if(window.config.color_scheme==='dark') return true;\r\n if(window.config.color_scheme==='light') return false;\r\n else { // 'default'\r\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n }\r\n }\r\n\r\n on_pressure() {\r\n if(this.state.sidebar_stack.length>1)\r\n this.show_sidebar(null,null,'clear');\r\n else\r\n this.set_mode('list',null);\r\n }\r\n\r\n show_sidebar(title,content,mode='push') {\r\n this.setState((prevState)=>{\r\n let ns=prevState.sidebar_stack.slice();\r\n if(mode==='push') {\r\n if(ns.length>MAX_SIDEBAR_STACK_SIZE)\r\n ns.splice(1,1);\r\n ns=ns.concat([[title,content]]);\r\n } else if(mode==='pop') {\r\n if(ns.length===1) return;\r\n ns.pop();\r\n } else if(mode==='replace') {\r\n ns.pop();\r\n ns=ns.concat([[title,content]]);\r\n } else if(mode==='clear') {\r\n ns=[[null,null]];\r\n } else\r\n throw new Error('bad show_sidebar mode');\r\n return {\r\n sidebar_stack: ns,\r\n };\r\n });\r\n }\r\n\r\n set_mode(mode,search_text) {\r\n this.setState({\r\n mode: mode,\r\n search_text: search_text,\r\n flow_render_key: +new Date(),\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n
{\r\n localStorage['TOKEN']=x||'';\r\n this.setState({\r\n token: x,\r\n });\r\n },\r\n }}>\r\n \r\n
\r\n \r\n {(token)=>(\r\n \r\n
\r\n {!token.value &&\r\n
\r\n }\r\n {this.inpku_flag||token.value||true ?\r\n
:\r\n
\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","// In production, we register a service worker to serve assets from local cache.\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 the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\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 default function register() {\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);\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/facebookincubator/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. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\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://goo.gl/SC7cgQ'\r\n );\r\n });\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\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 }\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) {\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 if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').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);\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 App from './App';\r\n//import {elevate} from './infrastructure/elevator';\r\nimport registerServiceWorker from './registerServiceWorker';\r\n\r\n//elevate();\r\n\r\nReactDOM.render(
, document.getElementById('root'));\r\nregisterServiceWorker();\r\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/static/js/main.e91b9a8b.chunk.js b/static/js/main.e91b9a8b.chunk.js
deleted file mode 100644
index bead014..0000000
--- a/static/js/main.e91b9a8b.chunk.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(window.webpackJsonpwebhole=window.webpackJsonpwebhole||[]).push([[0],[,,,,,,,,,,,,,,,function(e,t){e.exports="data:image/png;base64,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"},function(e,t){e.exports="data:image/png;base64,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"},function(e,t){e.exports="data:image/png;base64,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"},function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFdklEQVR42sVW+VNTVxS+f4Od9oeW0RmlU8dOcRx3BEHbqiio3dtfamds+0N1bGe62emirYpSLRYDguAWJQihLZBAEkgKgbCHgIBAXbBTtgSykhAQEL/ecyWtwwMHx9DemS/vvXvv+c73zj3n5DEAjHBodJz9MD7BvuP3KVbb0xqV1p6lzENzS9u7Y3zOVWNittXPMmvMWmaNjZgeW8OZY91i1pSbzSqcg6y01Lj7V7UOap3Bma9WhyiKtEyh0bGsQg0L+P3n5talDNZ5LpWZCwqYqqYxJk9TggK1Bkpza7pWrWNdsZHM/uKymZ1Pgvb07ohiel0Jy7VcO1ug0iCfc+WbW7fUa0vYrUw5u6G8IhXglR1l/qR45tu/l9WeTo5XGqvxS3k1tPmF+t6Y8MXOVYui+3ZEb+ROHoq+HVEb3WtCo23bIhZrCwoNuZyHuKpTU474v/2M+dOSmDdDJhVgzUxn1oQDcd7w59C5+00oqxqgsLTBnHAIQ8vnoy9uPbiDWYH2kk1dwmFkWdqRU2nG9V2vw8e5rScOx/ZnX5YK6Dvw6Z6+VzYMepY8hT8++ZALMONKfQuqkxLhWf88rNvCZy2A54KwqTp1UnCQgPZ9H8Cz5ElYX93gsR38/COpgO3r5bata+FYHYrKve8jp7EDuW23USRLQveKhXDERc5agCMuAt0rF6JQdkpw5DS1o3LPbsFti1nLIxQplx7BljVyO3fSExUG/YYVyFMVIa/lOvLfewcdyxbAvTNq1gJobzu3Ue16G3nNnCNfDUP0cvRELwX5IF9SAbERchtftO+MRsOKUKjXhUG9JRJlSxegm4fUvn32OUB7ycYYNh/qzRFQh4cJTuK23Y+kVED/1nA5BxycwMZxbWUoml4IQdemVXBujwStPQpc3KZr8yo0hYWglXMRJ3FPrksF2F57Sc4BK4f9jZfhfmuzgPPNTWLO9oggG7IN8BDnAzxSAaWL5sk58C+emMS8x8S0PFIBjQf3yznwH0EqwAfIOTAThqZgpjXf7CAV4PAMyjkwFXa3R1xHx+9i4h4wzn/o6r8zKtb6XW4MjdwBnxLw+ofF3HRcD2D2AlxeH5yDXpgsjdBWmFBcVY3S2jr0DTiEKN/wCFpu3ERReQUM1TW4+VcXfFxQ0AQMDvmFiPQcJb5PTkHi+Qs4cEqGo2fS0dndCxrFlVX4OvEkvvjxOCrMDSISQRMQgM3pgtXhFPd0lV3OxOmsKyICdByd3T04xkVVNFhw994cCPDwSIyMjQtyGhVms4hIt61fPA/wcz+WnjF3Alw8DygKvXYHbvf0IlmhgDy/QCQdCeviQuZUAL04kX/1UyK++TkJB2XJ+JMLIWd0DHMugEqNMrysrh6GmlocP3ceOlMlhkfHRA7MuYCByXoPDD0vucOnU2HlR0IOe/oHRBJSuU4EswoCjYjelOqeGhENpVaHhIyzounQcPNSjU87g/qWVvF83zYIAty+IdGI1GVGXCpQ4Te9ARnKXHx5/AQqLU3CWUNbu5g7kpomypOaFdmQ7WMLoPKjClCo1Dh54SJSMhVIy85BbXMLRnhUKNzUGU+cPYdsjRYpiixc4tVBzcsz9AgCXF7vQ3OAOiJlO139PBfG7k4IJ5Qb9Ka0RiUZ2PPQkua+JAKcfJIvzGhEZxwAOZ7aIzwPrLunrE/z3zLN90Brh9zu8vCmMsY3DIozDCYcHJTIlNTNHdelAorLTPG1lmbYuUrfCA/nsB+D/uDA679/fBSBWstVaPTGIxIBXX22EH151UVdqQn1V1sF6ppagoIAX6mpBhpD+YUSY9Uz0s/ygQFWXtPA1MXGjzUGo4Fv1HCoggRNkcGoLykz7fvdVMP0HBIB/xf+Bi8VajXQRja5AAAAAElFTkSuQmCC"},function(e,t){e.exports="data:image/png;base64,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"},function(e,t){e.exports="data:image/png;base64,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"},function(e,t){e.exports="data:image/png;base64,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"},,,,function(e,t,n){e.exports=n(53)},,,,,function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t){e.exports="data:image/png;base64,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"},function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAFfklEQVR42qWXWWicVRiG/39mUim4NRq88MZWXIpLe+FS6lYKtZsW0UrRUmyllUIXpQiN3hXBC1sxdyom6q2lVRGhUqvFClURUVFUsu+ZmD2TTDKTycTn/fudcPzNJJMaeDOTnHO+7z3ffoLm5uagFFpaWpJ8LmloaAgaGxuD3t7epePj49unpqbeLhQKn4EvwQVwjv+dYm1fOp2u0t76+vqgqampAhmp+XTMqxwB0XcUr8pmsydQ8jPK0oYe0G3f+8AgGGDPn+x9t7+//8HW1taIODKSiyWQ0MGurq4bEKbbjoEZUATTYApMgglDrnDpp2j7hPzk5ORJyN9qJBLlEoiUDw4ObkNIhydQ6JHQ4eHhF1jfgLlXg7v5vn5oaGj3xMTE++xpjZ0ZyWQy+7Fo4Cw6H4GENnLgcExIu/6HRa7XugjOBcno7Oy8EjI7ccVvOstnJIP4OG4kwlIEopuj6JAdlElnuFUtiq/Tmt1ApkwiTJ+hIWF+TmiP9nZ0dChgj/my+LtGJPyYcAHnzL5VfuRAXgfGxsZe1rrWLCOCcuAHMO7agazs1CUWM7KkyYtiwm0OdUuL7KJTLiFAt/VvWQ4SdiYpZbjkCbOEAjhHYN7hLiWWS8QEU7/jfM73Ov3PlAfOrEZoQbi9Zu6UvnOhaic/n89/3dbWFq1FBQNGd7IwbinWiTWuRkjolLe3t1+BKZ8nJV8FRyH4ylxgrVp7RkdHDxIDyxwJXQQZARb4wSxcxCpbpTtiy6E3HTuYHnI+crGB8v2xrFgQEHrLBa0XYxtdvcjlcp9HMcDtr4LZr8Ysze2v8fI11MGBgYFtZqFiGcq1J0+wvWRyQnNnILOj6yfb8zc/VQGp8RR/9Mr8sDppfgtjUR1QcFZBdjN4FGwsAa1tAverDMcKT5Si6HvNKmmGorZbjGrFRqwx9d65Uk4H5a/FIF71nBv6+voesdKt/nEq4NcX1lByKq9+jvoW4OB9NJjHwCawuQS0tgU8jLkTMRKRO3t6em5ReVZ1Bd+KwFfW1bKq7UYgjPWF7ZYhZQchMVDtVc7AlXB0VJpy9YwzInDeCpAI3OUT8LJg72KzgMx6ww9Cj8C1rLeBFkfgrOeC9XEXWPSmRkZGdpCih8EBcLAEDqiXsHePmlI8DswFy9E1rHoDLioIP+JLvyKT4rCrVBBqKvqfQRjaVLXGglA6zyot9lhEFl0Jjqeh0N3dXcXhleA2cHsJaG0lZr7R0vlfWaCeg4WOWhqOkYYvilEVVvjLikMbplsaL0RE9UPms1FDpgRGLcLTuOHZeCFSbUDXBQvoIQrRTa4U17rgIeCe8eIgCkKEHVlsEHK792KlOOQi95j5p2lI56NSLH+x8IAKkRZg+AeNpILDUUuVEKxSiateh+iHoE6jVwnUsf4BqMGyy72OGHVVKu0ZV8656K6oGWl0lmlYPO2l0DFzQcqZ73LghhNL5Z2uV3DJX+iOumRKG1IWnTcrMGxoEMOn3UjtDSTlwO1VO0+Zhe/V9OxGM9J9nbk5FZ8H99nkop1Z0vJJu00YL88LjGSz8YPyNVZpC2bd407nf4ZS+Qlfn/AHSU0ymCv0htKkd9PAS9toZHMTkWSprugizu8E3seSpfiacyy3m4pEjdfbReY7zLbFxqiSY7lLNW69VgOHnXXKT2tSduRKPkwcCQ0U9uqZTS2E/ah+Tmdcp64GKsEysIIYWqsGhKJvrNDMntObQCNZXPmCTzOErkbg2di0U7CUVeHpstdTxpRO+1OTCDNNbXCZFFc+7+PUjdQyO758HJN+apNTxh6iae9xOmBVUBYbhvQ5sug5pdrlPk79B0aFUsleyVUUG/WOT8D39jS/CH7XJ2tH2LNCe60hJRd6nv8Dwj5T3q96iTAAAAAASUVORK5CYII="},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,,,,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n.r(t);var a=n(0),o=n.n(a),i=n(8),r=n.n(i),s=(n(30),n(1)),l=n(2),c=n(4),u=n(3),h=n(6),d=n(5),p=n(9),m=n(7),f=n(10),g=n.n(f),b=function(){function e(){Object(s.a)(this,e),this.names={},this.current_h=Math.random()}return Object(l.a)(e,[{key:"get",value:function(e){return"\u6d1e\u4e3b"===(e=e.toLowerCase())?["hsl(0,0%,97%)","hsl(0,0%,16%)"]:(this.names[e]||(this.current_h+=.618033988749895,this.current_h%=1,this.names[e]=["hsl(".concat(360*this.current_h,", 50%, 90%)"),"hsl(".concat(360*this.current_h,", 60%, 20%)")]),this.names[e])}}]),e}(),v=/(^|[^\d\u20e3\ufe0e\ufe0f])(#\d{1,7})(?![\d\u20e3\ufe0e\ufe0f])/g,E=/((?:https?:\/\/)?thuhole\.tech\/?#(?:#|%23)(\d{1,7}))(?!\d|\u20e3|\ufe0e|\ufe0f)/g,_=/(^|[^A-Za-z])((?:(?:Angry|Baby|Crazy|Diligent|Excited|Fat|Greedy|Hungry|Interesting|Jolly|Kind|Little|Magic|Na\xefve|Old|Powerful|Quiet|Rich|Superman|THU|Undefined|Valuable|Wifeless|Xiangbuchulai|Young|Zombie)\s)?(?:Alice|Bob|Carol|Dave|Eve|Francis|Grace|Hans|Isabella|Jason|Kate|Louis|Margaret|Nathan|Olivia|Paul|Queen|Richard|Susan|Thomas|Uma|Vivian|Winnie|Xander|Yasmine|Zach)|You Win(?: \d+)?|\u6d1e\u4e3b)(?![A-Za-z])/gi,A=/(^|[^.@a-zA-Z0-9_])((?:https?:\/\/)?(?:(?:[\w-]+\.)+[a-zA-Z]{2,3}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::\d{1,5})?(?:\/[\w~!@#$%^&*()\-_=+[\]{};:,./?|]*)?)(?![a-zA-Z0-9])/gi;function w(e,t){return e=[[null,e]],t.forEach(function(t){var n=Object(m.a)(t,2),a=n[0],o=n[1];e=[].concat.apply([],e.map(function(e){var t=Object(m.a)(e,2),n=t[0],i=t[1];return n?[e]:i.split(o).map(function(e){return o.test(e)?[a,e]:[null,e]}).filter(function(e){var t=Object(m.a)(e,2),n=t[0],a=t[1];return null!==n||a})}))}),e}var k=n(12),y=n.n(k),O=n(13),C=n.n(O),j=n(14),N=n.n(j),S=(n(34),n(35),n(15)),x=n.n(S),I=n(16),D=n.n(I),U=n(17),R=n.n(U),H=n(18),L=n.n(H),T=n(19),M=n.n(T),Q=n(20),P=n.n(Q),G=(n(36),n(37),n(21)),X=n.n(G),B="//api.thuhole.tech/";function F(e){if(!e.ok)throw Error("\u7f51\u7edc\u9519\u8bef ".concat(e.status," ").concat(e.statusText));return e.text().then(function(e){try{return JSON.parse(e)}catch(t){throw console.error("json parse error"),console.trace(t),console.log(e),new SyntaxError("JSON Parse Error "+e.substr(0,50))}})}function V(){return"&PKUHelperAPI=3.0&jsapiver="+encodeURIComponent((Object({NODE_ENV:"production",PUBLIC_URL:"."}).REACT_APP_BUILD_INFO||"null")+"-"+2*Math.floor(+new Date/72e5))}var W="pkuhelper_login_popup_anchor";function Y(e){return e<10?"0"+e:""+e}function K(e){return"".concat(e.getMonth()+1,"-").concat(Y(e.getDate())," ").concat(e.getHours(),":").concat(Y(e.getMinutes()),":").concat(Y(e.getSeconds()))}var z=N()(C.a);function q(e){var t=new Date(1e3*e.stamp);return o.a.createElement("span",null,o.a.createElement(y.a,{date:t,formatter:z,title:t.toLocaleString("zh-CN",{timeZone:"Asia/Shanghai",hour12:!1})}),"\xa0",K(t))}function Z(e){return o.a.createElement("p",{className:"centered-line title-line aux-margin"},o.a.createElement("span",{className:"black-outline"},e.text))}x.a,D.a,R.a,L.a,M.a,P.a,X.a;var J=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={loading_status:"idle"},n.username_ref=o.a.createRef(),n.password_ref=o.a.createRef(),n.input_token_ref=o.a.createRef(),n.popup_anchor=document.getElementById(W),n.popup_anchor||(n.popup_anchor=document.createElement("div"),n.popup_anchor.id=W,document.body.appendChild(n.popup_anchor)),n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"do_sendcode",value:function(e){var t=this;"loading"!==this.state.loading_status&&this.setState({loading_status:"loading"},function(){fetch(B+"api_xmcp/login/send_code?user="+encodeURIComponent(t.username_ref.current.value)+"&code_type="+encodeURIComponent(e)+V(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({excluded_scopes:[]})}).then(F).then(function(e){if(console.log(e),!e.success)throw new Error(JSON.stringify(e));alert(e.msg),t.setState({loading_status:"done"})}).catch(function(e){console.error(e),alert("\u53d1\u9001\u5931\u8d25\n"+e),t.setState({loading_status:"done"})})})}},{key:"do_login",value:function(e){var t=this;"loading"!==this.state.loading_status&&this.setState({loading_status:"loading"},function(){fetch(B+"api_xmcp/login/login?user="+encodeURIComponent(t.username_ref.current.value)+"&valid_code="+encodeURIComponent(t.password_ref.current.value)+V(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({excluded_scopes:[]})}).then(F).then(function(n){if(0!==n.code){if(n.msg)throw new Error(n.msg);throw new Error(JSON.stringify(n))}e(n.user_token),alert("\u767b\u5f55\u6210\u529f"),t.setState({loading_status:"done"}),t.props.on_close()}).catch(function(e){console.error(e),alert("\u767b\u5f55\u5931\u8d25\n"+e),t.setState({loading_status:"done"})})})}},{key:"do_input_token",value:function(e){var t=this;if("loading"!==this.state.loading_status){var n=this.input_token_ref.current.value;this.setState({loading_status:"loading"},function(){fetch(B+"api_xmcp/hole/system_msg?user_token="+encodeURIComponent(n)+V()).then(function(e){return e.json()}).then(function(a){if(a.error)throw new Error(a.error);if(0===a.result.length)throw new Error("result check failed");t.setState({loading_status:"done"}),e(n),t.props.on_close()}).catch(function(e){alert("Token\u68c0\u9a8c\u5931\u8d25\n"+e),t.setState({loading_status:"done"}),console.error(e)})})}}},{key:"render",value:function(){var e=this;return r.a.createPortal(o.a.createElement("div",null,o.a.createElement("div",{className:"pkuhelper-login-popup-shadow"}),o.a.createElement("div",{className:"pkuhelper-login-popup"},o.a.createElement("p",null,o.a.createElement("b",null,"\u63a5\u6536\u9a8c\u8bc1\u7801\u6765\u767b\u5f55 T\u5927\u6811\u6d1e")),o.a.createElement("p",null,o.a.createElement("label",null,"\u3000\u90ae\u7bb1\xa0",o.a.createElement("input",{ref:this.username_ref,type:"email",autoFocus:!0,defaultValue:"@mails.tsinghua.edu.cn"})),o.a.createElement("span",{className:"pkuhelper-login-type"},o.a.createElement("a",{onClick:function(t){return e.do_sendcode("mail")}},"\xa0\u53d1\u9001\u90ae\u4ef6\xa0"))),o.a.createElement("p",null,o.a.createElement("label",null,"\u9a8c\u8bc1\u7801\xa0",o.a.createElement("input",{ref:this.password_ref,type:"tel"})),o.a.createElement("button",{type:"button",disabled:"loading"===this.state.loading_status,onClick:function(t){return e.do_login(e.props.token_callback)}},"\u767b\u5f55")),o.a.createElement("hr",null),o.a.createElement("p",null,o.a.createElement("b",null,"\u4ece\u5176\u4ed6\u8bbe\u5907\u5bfc\u5165\u767b\u5f55\u72b6\u6001")),o.a.createElement("p",null,o.a.createElement("input",{ref:this.input_token_ref,placeholder:"User Token"}),o.a.createElement("button",{type:"button",disabled:"loading"===this.state.loading_status,onClick:function(t){return e.do_input_token(e.props.token_callback)}},"\u5bfc\u5165")),o.a.createElement("hr",null),o.a.createElement("p",null,o.a.createElement("button",{onClick:this.props.on_close},"\u53d6\u6d88")))),this.popup_anchor)}}]),t}(a.Component),$=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={popup_show:!1},n.on_popup_bound=n.on_popup.bind(Object(h.a)(n)),n.on_close_bound=n.on_close.bind(Object(h.a)(n)),n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"on_popup",value:function(){this.setState({popup_show:!0})}},{key:"on_close",value:function(){this.setState({popup_show:!1})}},{key:"render",value:function(){return o.a.createElement(o.a.Fragment,null,this.props.children(this.on_popup_bound),this.state.popup_show&&o.a.createElement(J,{token_callback:this.props.token_callback,on_close:this.on_close_bound}))}}]),t}(a.Component),ee="hole_cache_db",te=1,ne=function(){function e(){var t=this;Object(s.a)(this,e),this.db=null,this.added_items_since_maintenance=0,this.encrypt=this.encrypt.bind(this),this.decrypt=this.decrypt.bind(this);var n=indexedDB.open(ee,te);n.onerror=console.error.bind(console),n.onupgradeneeded=function(e){console.log("comment cache db upgrade"),e.target.result.createObjectStore("comment",{keyPath:"pid"}).createIndex("last_access","last_access",{unique:!1})},n.onsuccess=function(e){console.log("comment cache db loaded"),t.db=e.target.result,setTimeout(t.maintenance.bind(t),1)}}return Object(l.a)(e,[{key:"encrypt",value:function(e,t){for(var n=JSON.stringify(t),a="",o=0,i=(42^e)%128;o
1e3?(console.log("comment cache db maintenance",a),t.index("last_access").openKeyCursor().onsuccess=function(e){var n=e.target.result;n&&(t.delete(n.primaryKey),--a>1e3&&n.continue())}):console.log("comment cache db no need to maintenance",a),e.added_items_since_maintenance=0},n.onerror=console.error.bind(console)}}},{key:"clear",value:function(){this.db&&(indexedDB.deleteDatabase(ee),console.log("delete comment cache db"))}}]),e}();function ae(){return window.hole_cache||(window.hole_cache=new ne),window.hole_cache}function oe(e){return V()+(e?"&user_token="+e:"")}var ie={load_replies:function(e,t,n,a){return e=parseInt(e),fetch(re+"/api.php?action=getcomment&pid="+e+oe(t)).then(F).then(function(t){if(0!==t.code)throw t.msg?new Error(t.msg):new Error(JSON.stringify(t));return ae().delete(e).then(function(){ae().put(e,a,t)}),t.data=t.data.sort(function(e,t){return parseInt(e.cid,10)-parseInt(t.cid,10)}).map(function(e){return e._display_color=n.get(e.name),e.variant={},e}),t})},load_replies_with_cache:function(e,t,n,a){return e=parseInt(e),ae().get(e,a).then(function(o){return o?(o.data=o.data.sort(function(e,t){return parseInt(e.cid,10)-parseInt(t.cid,10)}).map(function(e){return e._display_color=n.get(e.name),e.variant={},e}),o):ie.load_replies(e,t,n,a)})},set_attention:function(e,t,n){var a=new URLSearchParams;return a.append("user_token",n),a.append("pid",e),a.append("switch",t?"1":"0"),fetch(re+"/api.php?action=attention"+oe(n),{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:a}).then(F).then(function(t){if(ae().delete(e),0!==t.code&&(!t.msg||"\u5df2\u7ecf\u5173\u6ce8\u8fc7\u4e86"!==t.msg))throw t.msg&&alert(t.msg),new Error(JSON.stringify(t));return t})},report:function(e,t,n){var a=new URLSearchParams;return a.append("user_token",n),a.append("pid",e),a.append("reason",t),fetch(re+"/api.php?action=report"+oe(n),{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:a}).then(F).then(function(e){if(0!==e.code)throw e.msg&&alert(e.msg),new Error(JSON.stringify(e));return e})},get_list:function(e,t){return fetch(re+"/api.php?action=getlist&p="+e+oe(t)).then(F).then(function(e){if(0!==e.code)throw new Error(JSON.stringify(e));return e})},get_search:function(e,t,n){return fetch(re+"/api.php?action=search&pagesize=50&page="+e+"&keywords="+encodeURIComponent(t)+oe(n)).then(F).then(function(e){if(0!==e.code){if(e.msg)throw new Error(e.msg);throw new Error(JSON.stringify(e))}return e})},get_single:function(e,t){return fetch(re+"/api.php?action=getone&pid="+e+oe(t)).then(F).then(function(e){if(0!==e.code)throw e.msg?new Error(e.msg):new Error(JSON.stringify(e));return e})},get_attention:function(e){return fetch(re+"/api.php?action=getattention"+oe(e)).then(F).then(function(e){if(0!==e.code){if(e.msg)throw new Error(e.msg);throw new Error(JSON.stringify(e))}return e})}},re=(n(38),B+"services/thuhole");function se(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function le(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"g";return e?new RegExp("(".concat(e.split(t).filter(function(e){return!!e}).map(se).join("|"),")"),n):/^$/g}function ce(e){return o.a.createElement("span",{className:"colored-span",style:{"--coloredspan-bgcolor-light":e.colors[0],"--coloredspan-bgcolor-dark":e.colors[1]}},e.children)}var ue=function(e){function t(){return Object(s.a)(this,t),Object(c.a)(this,Object(u.a)(t).apply(this,arguments))}return Object(d.a)(t,e),Object(l.a)(t,[{key:"render",value:function(){var e=this;return o.a.createElement("pre",null,this.props.parts.map(function(t,n){var a,i=Object(m.a)(t,2),r=i[0],s=i[1];return o.a.createElement("span",{key:n},"url_pid"===r?o.a.createElement("span",{className:"url-pid-link",title:s},"/##"):"url"===r?o.a.createElement("a",{href:(a=s,/^https?:\/\//.test(a)?a:"http://"+a),target:"_blank",rel:"noopener"},s):"pid"===r?o.a.createElement("a",{href:"#"+s,onClick:function(t){t.preventDefault(),e.props.show_pid(s.substring(1))}},s):"nickname"===r?o.a.createElement(ce,{colors:e.props.color_picker.get(s)},s):"search"===r?o.a.createElement("span",{className:"search-query-highlight"},s):s)}))}}]),t}(a.PureComponent);window.TEXTAREA_BACKUP={};var he=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={text:""},n.on_change_bound=n.on_change.bind(Object(h.a)(n)),n.on_keydown_bound=n.on_keydown.bind(Object(h.a)(n)),n.clear=n.clear.bind(Object(h.a)(n)),n.area_ref=o.a.createRef(),n.change_callback=e.on_change||function(){},n.submit_callback=e.on_submit||function(){},n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"componentDidMount",value:function(){var e=this;this.setState({text:window.TEXTAREA_BACKUP[this.props.id]||""},function(){e.change_callback(e.state.text)})}},{key:"componentWillUnmount",value:function(){window.TEXTAREA_BACKUP[this.props.id]=this.state.text,this.change_callback(this.state.text)}},{key:"on_change",value:function(e){this.setState({text:e.target.value}),this.change_callback(e.target.value)}},{key:"on_keydown",value:function(e){"Enter"===e.key&&e.ctrlKey&&!e.altKey&&(e.preventDefault(),this.submit_callback())}},{key:"clear",value:function(){this.setState({text:""})}},{key:"set",value:function(e){this.change_callback(e),this.setState({text:e})}},{key:"get",value:function(){return this.state.text}},{key:"focus",value:function(){this.area_ref.current.focus()}},{key:"render",value:function(){return o.a.createElement("textarea",{ref:this.area_ref,onChange:this.on_change_bound,value:this.state.text,onKeyDown:this.on_keydown_bound})}}]),t}(a.Component),de=null;function pe(e){var t=/iPhone|iPad|iPod/i.test(window.navigator.userAgent);return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone?null:t?navigator.standalone?null:o.a.createElement("div",{className:"box promotion-bar"},o.a.createElement("span",{className:"icon icon-about"}),"\xa0 \u7528 Safari \u628a\u6811\u6d1e ",o.a.createElement("b",null,"\u6dfb\u52a0\u5230\u4e3b\u5c4f\u5e55")," \u66f4\u597d\u7528"):de?o.a.createElement("div",{className:"box promotion-bar"},o.a.createElement("span",{className:"icon icon-about"}),"\xa0 \u628a\u7f51\u9875\u7248\u6811\u6d1e ",o.a.createElement("b",null,o.a.createElement("a",{onClick:function(){de&&de.prompt()}},"\u5b89\u88c5\u5230\u684c\u9762"))," \u66f4\u597d\u7528"):null}window.addEventListener("beforeinstallprompt",function(e){console.log("pwa: received before install prompt"),de=e});var me=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={moved:!0,init_y:0,init_x:0},n.on_begin_bound=n.on_begin.bind(Object(h.a)(n)),n.on_move_bound=n.on_move.bind(Object(h.a)(n)),n.on_end_bound=n.on_end.bind(Object(h.a)(n)),n.MOVE_THRESHOLD=3,n.last_fire=0,n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"on_begin",value:function(e){this.setState({moved:!1,init_y:(e.touches?e.touches[0]:e).screenY,init_x:(e.touches?e.touches[0]:e).screenX})}},{key:"on_move",value:function(e){this.state.moved||Math.abs((e.touches?e.touches[0]:e).screenY-this.state.init_y)+Math.abs((e.touches?e.touches[0]:e).screenX-this.state.init_x)>this.MOVE_THRESHOLD&&this.setState({moved:!0})}},{key:"on_end",value:function(e){this.state.moved||this.do_callback(e),this.setState({moved:!0})}},{key:"do_callback",value:function(e){this.last_fire+100>+new Date||(this.last_fire=+new Date,this.props.callback(e))}},{key:"render",value:function(){return o.a.createElement("div",{onTouchStart:this.on_begin_bound,onMouseDown:this.on_begin_bound,onTouchMove:this.on_move_bound,onMouseMove:this.on_move_bound,onClick:this.on_end_bound},this.props.children)}}]),t}(a.PureComponent);n(39);function fe(e,t,n,a){a=a||!1,e.addEventListener?e.addEventListener(t,n,a):e.attachEvent&&e.attachEvent("on".concat(t),function(t){n.call(e,t||window.event)})}function ge(e,t,n,a){a=a||!1,e.removeEventListener?e.removeEventListener(t,n,a):e.detachEvent&&e.detachEvent("on".concat(t),n)}var be=function(e){if(!(e instanceof HTMLElement))return document.documentElement;for(var t="absolute"===e.style.position,n=/(scroll|auto)/,a=e;a;){if(!a.parentNode)return e.ownerDocument||document.documentElement;var o=window.getComputedStyle(a),i=o.position,r=o.overflow,s=o["overflow-x"],l=o["overflow-y"];if("static"===i&&t)a=a.parentNode;else{if(n.test(r)&&n.test(s)&&n.test(l))return a;a=a.parentNode}}return e.ownerDocument||e.documentElement||document.documentElement};var ve=0,Ee=0,_e="data-lazyload-listened",Ae=[],we=[],ke=!1;try{var ye=Object.defineProperty({},"passive",{get:function(){ke=!0}});window.addEventListener("test",null,ye)}catch(wt){}var Oe,Ce=!!ke&&{capture:!1,passive:!0},je=function(e){var t=r.a.findDOMNode(e);if(t instanceof HTMLElement){var n=be(t);(e.props.overflow&&n!==t.ownerDocument&&n!==document&&n!==document.documentElement?function(e,t){var n,a,o=r.a.findDOMNode(e);try{var i=t.getBoundingClientRect();n=i.top,a=i.height}catch(wt){n=ve,a=Ee}var s,l,c=window.innerHeight||document.documentElement.clientHeight,u=Math.max(n,0),h=Math.min(c,n+a)-u;try{var d=o.getBoundingClientRect();s=d.top,l=d.height}catch(wt){s=ve,l=Ee}var p=s-u,m=Array.isArray(e.props.offset)?e.props.offset:[e.props.offset,e.props.offset];return p-m[0]<=h&&p+l+m[1]>=0}(e,n):function(e){var t,n,a=r.a.findDOMNode(e);if(!(a.offsetWidth||a.offsetHeight||a.getClientRects().length))return!1;try{var o=a.getBoundingClientRect();t=o.top,n=o.height}catch(wt){t=ve,n=Ee}var i=window.innerHeight||document.documentElement.clientHeight,s=Array.isArray(e.props.offset)?e.props.offset:[e.props.offset,e.props.offset];return t-s[0]<=i&&t+n+s[1]>=0}(e))?e.state.visible&&!e.state.hidden||(e.props.once&&we.push(e),e.setState({visible:!0,hidden:!1})):e.props.once||(e.props.unmountIfInvisible?!0===e.visible&&e.setState({visible:!1}):e.props.hiddenIfInvisible&&!1===e.state.hidden&&e.setState({hidden:!0}))}},Ne=function(){for(var e=0;e=0?a=setTimeout(l,t-c):(a=null,n||(s=e.apply(i,o),a||(i=null,o=null)))};return function(){i=this,o=arguments,r=+new Date;var c=n&&!a;return a||(a=setTimeout(l,t)),c&&(s=e.apply(i,o),i=null,o=null),s}}(Ne,"number"===typeof this.props.debounce?this.props.debounce:300),Oe="debounce"):void 0!==this.props.throttle?(Se=function(e,t,n){var a,o;return t||(t=250),function(){var i=n||this,r=+new Date,s=arguments;a&&rWe&&(i=i*We/e,e=We,r=!0),i>We&&(e=e*We/i,i=We,r=!0),i*e>Ye){var s=Math.sqrt(i*e/Ye);i/=s,e/=s,r=!0}console.log("chosen img size",e,i);var l=document.createElement("canvas"),c=l.getContext("2d");l.width=e,l.height=i,c.drawImage(o,0,0,e,i);for(var u,h,d=.1,p=.9;p-d>=.03;)u=(p+d)/2,h=l.toDataURL("image/jpeg",u),console.log(d,p,"trying quality",u,"size",h.length),h.length<=Ke?d=u:p=u;d>=.101?(console.log("chosen img quality",u),t({img:a(h),quality:u,width:Math.round(e),height:Math.round(i),compressed:r})):n("\u56fe\u7247\u8fc7\u5927\uff0c\u65e0\u6cd5\u4e0a\u4f20")},o.src=e}(e)})},o.readAsDataURL(e)})}},{key:"on_img_change",value:function(){var e=this;this.img_ref.current&&this.img_ref.current.files.length?this.setState({img_tip:"\uff08\u6b63\u5728\u5904\u7406\u56fe\u7247\u2026\u2026\uff09"},function(){e.proc_img(e.img_ref.current.files[0]).then(function(t){e.setState({img_tip:"\uff08".concat(t.compressed?"\u538b\u7f29\u5230":"\u5c3a\u5bf8"," ").concat(t.width,"*").concat(t.height," / ")+"\u8d28\u91cf ".concat(Math.floor(100*t.quality),"% / ").concat(Math.floor(t.img.length/(4/3)/1e3),"KB\uff09")})}).catch(function(t){e.setState({img_tip:"\u56fe\u7247\u65e0\u6548\uff1a".concat(t)})})}):this.setState({img_tip:null})}},{key:"on_submit",value:function(e){var t=this;e&&e.preventDefault(),"loading"!==this.state.loading_status&&(this.img_ref.current.files.length?(this.setState({loading_status:"processing"}),this.proc_img(this.img_ref.current.files[0]).then(function(e){t.setState({loading_status:"loading"}),t.do_post(t.state.text,e.img)}).catch(function(e){alert(e)})):(this.setState({loading_status:"loading"}),this.do_post(this.state.text,null)))}},{key:"render",value:function(){var e=this;return o.a.createElement("form",{onSubmit:this.on_submit.bind(this),className:"post-form box"},o.a.createElement("div",{className:"post-form-bar"},o.a.createElement("label",null,"\u56fe\u7247",o.a.createElement("input",{ref:this.img_ref,type:"file",accept:"image/*",disabled:"done"!==this.state.loading_status,onChange:this.on_img_change_bound})),"done"!==this.state.loading_status?o.a.createElement("button",{disabled:"disabled"},o.a.createElement("span",{className:"icon icon-loading"}),"\xa0\u6b63\u5728","processing"===this.state.loading_status?"\u5904\u7406":"\u4e0a\u4f20"):o.a.createElement("button",{type:"submit"},o.a.createElement("span",{className:"icon icon-send"}),"\xa0\u53d1\u8868")),!!this.state.img_tip&&o.a.createElement("p",{className:"post-form-img-tip"},o.a.createElement("a",{onClick:function(){e.img_ref.current.value="",e.on_img_change()}},"\u5220\u9664\u56fe\u7247"),this.state.img_tip),o.a.createElement(he,{ref:this.area_ref,id:"new_post",on_change:this.on_change_bound,on_submit:this.on_submit.bind(this)}),o.a.createElement("p",null,o.a.createElement("small",null,"\u8bf7\u9075\u5b88",o.a.createElement("a",{href:"http://pkuhelper.pku.edu.cn/treehole_rules.html",target:"_blank"},"\u6811\u6d1e\u7ba1\u7406\u89c4\u8303"),"\uff0c\u6587\u660e\u53d1\u8a00")))}}]),t}(a.Component),et=B+"/images/",tt={a:!0,audio:!0},nt=[];window.LATEST_POST_ID=parseInt(localStorage._LATEST_POST_ID,10)||0;function at(e,t){return function(n){var a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=new b,r="\u6811\u6d1e #"+n;e(r,o.a.createElement("div",{className:"box box-tip"},"\u6b63\u5728\u52a0\u8f7d #",n),a?"replace":"push"),ie.get_single(n,t).then(function(e){return e.data.variant={},new Promise(function(a,o){ie.load_replies_with_cache(n,t,i,parseInt(e.data.reply)).then(function(t){a([e,t])}).catch(o)})}).then(function(n){var a=Object(m.a)(n,2),s=a[0],l=a[1];e(r,o.a.createElement(rt,{key:+new Date,info:s.data,replies:l.data,attention:l.attention,token:t,show_sidebar:e,color_picker:i,deletion_detect:"on"===localStorage.DELETION_DETECT}),"replace")}).catch(function(a){console.error(a),e(r,o.a.createElement("div",{className:"box box-tip"},o.a.createElement("p",null,o.a.createElement("a",{onClick:function(){return at(e,t)(n,!0)}},"\u91cd\u65b0\u52a0\u8f7d")),o.a.createElement("p",null,""+a)),"replace")})}}var ot=function(e){function t(e){return Object(s.a)(this,t),Object(c.a)(this,Object(u.a)(t).call(this,e))}return Object(d.a)(t,e),Object(l.a)(t,[{key:"render",value:function(){var e=this,t=w(this.props.info.text,[["url_pid",E],["url",A],["pid",v],["nickname",_]]);return o.a.createElement("div",{className:"flow-reply box",style:this.props.info._display_color?{"--box-bgcolor-light":this.props.info._display_color[0],"--box-bgcolor-dark":this.props.info._display_color[1]}:null},o.a.createElement("div",{className:"box-header"},o.a.createElement("code",{className:"box-id"},"#",this.props.info.cid),!!this.props.do_filter_name&&o.a.createElement("span",{className:"reply-header-badge clickable",onClick:function(){e.props.do_filter_name(e.props.info.name)}},o.a.createElement("span",{className:"icon icon-locate"})),"\xa0",null!==this.props.info.tag&&o.a.createElement("span",{className:"box-header-tag"},this.props.info.tag),o.a.createElement(q,{stamp:this.props.info.timestamp})),o.a.createElement("div",{className:"box-content"},o.a.createElement(ue,{parts:t,color_picker:this.props.color_picker,show_pid:this.props.show_pid})))}}]),t}(a.PureComponent),it=function(e){function t(e){return Object(s.a)(this,t),Object(c.a)(this,Object(u.a)(t).call(this,e))}return Object(d.a)(t,e),Object(l.a)(t,[{key:"copy_link",value:function(e){e.preventDefault(),g()("".concat(e.target.href).concat(this.props.info.tag?" \u3010"+this.props.info.tag+"\u3011":"","\n")+"".concat(this.props.info.text).concat("image"===this.props.info.type?" [\u56fe\u7247]":"audio"===this.props.info.type?" [\u8bed\u97f3]":"","\n")+"\uff08".concat(K(new Date(1e3*this.props.info.timestamp))," ").concat(this.props.info.likenum,"\u5173\u6ce8 ").concat(this.props.info.reply,"\u56de\u590d\uff09\n")+this.props.replies.map(function(e){return(e.tag?"\u3010"+e.tag+"\u3011":"")+e.text}).join("\n"))}},{key:"render",value:function(){var e=this,t=this.props,n=t.parts||w(t.info.text,[["url_pid",E],["url",A],["pid",v],["nickname",_]]);return o.a.createElement("div",{className:"flow-item"+(t.is_quote?" flow-item-quote":"")},!!t.is_quote&&o.a.createElement("div",{className:"quote-tip black-outline"},o.a.createElement("div",null,o.a.createElement("span",{className:"icon icon-quote"})),o.a.createElement("div",null,o.a.createElement("small",null,"\u63d0\u5230"))),o.a.createElement("div",{className:"box"},!!window.LATEST_POST_ID&&parseInt(t.info.pid,10)>window.LATEST_POST_ID&&o.a.createElement("div",{className:"flow-item-dot"}),o.a.createElement("div",{className:"box-header"},!!this.props.do_filter_name&&o.a.createElement("span",{className:"reply-header-badge clickable",onClick:function(){e.props.do_filter_name("\u6d1e\u4e3b")}},o.a.createElement("span",{className:"icon icon-locate"})),!!parseInt(t.info.likenum,10)&&o.a.createElement("span",{className:"box-header-badge"},t.info.likenum,"\xa0",o.a.createElement("span",{className:"icon icon-"+(t.attention?"star-ok":"star")})),!!parseInt(t.info.reply,10)&&o.a.createElement("span",{className:"box-header-badge"},t.info.reply,"\xa0",o.a.createElement("span",{className:"icon icon-reply"})),o.a.createElement("code",{className:"box-id"},o.a.createElement("a",{href:"##"+t.info.pid,onClick:this.copy_link.bind(this)},"#",t.info.pid)),"\xa0",null!==t.info.tag&&o.a.createElement("span",{className:"box-header-tag"},t.info.tag),o.a.createElement(q,{stamp:t.info.timestamp})),o.a.createElement("div",{className:"box-content"},o.a.createElement(ue,{parts:n,color_picker:t.color_picker,show_pid:t.show_pid}),"image"===t.info.type&&o.a.createElement("p",{className:"img"},t.img_clickable?o.a.createElement("a",{className:"no-underline",href:et+t.info.url,target:"_blank"},o.a.createElement("img",{src:et+t.info.url})):o.a.createElement("img",{src:et+t.info.url})),"audio"===t.info.type&&o.a.createElement(Re,{src:"//api.thuhole.tech/services/thuhole/audios/"+t.info.url})),!(!t.attention||!t.info.variant.latest_reply)&&o.a.createElement("p",{className:"box-footer"},"\u6700\u65b0\u56de\u590d ",o.a.createElement(q,{stamp:t.info.variant.latest_reply}))))}}]),t}(a.PureComponent),rt=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={attention:e.attention,info:e.info,replies:e.replies,loading_status:"done",error_msg:null,filter_name:null,rev:!1},n.color_picker=e.color_picker,n.syncState=e.sync_state||function(){},n.reply_ref=o.a.createRef(),n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"set_variant",value:function(e,t){this.setState(function(n){return e?{replies:n.replies.map(function(n){return n.cid===e?Object.assign({},n,{variant:Object.assign({},n.variant,t)}):n})}:{info:Object.assign({},n.info,{variant:Object.assign({},n.info.variant,t)})}},function(){this.syncState({info:this.state.info,replies:this.state.replies})})}},{key:"load_replies",value:function(){var e=this,t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.setState({loading_status:"loading",error_msg:null}),ie.load_replies(this.state.info.pid,this.props.token,this.color_picker,null).then(function(n){e.setState(function(e,a){return{replies:n.data,info:t?Object.assign({},e.info,{reply:""+n.data.length}):e.info,attention:!!n.attention,loading_status:"done",error_msg:null}},function(){e.syncState({replies:e.state.replies,attention:e.state.attention,info:e.state.info}),e.state.replies.length&&e.set_variant(null,{latest_reply:Math.max.apply(null,e.state.replies.map(function(e){return parseInt(e.timestamp)}))})})}).catch(function(t){console.error(t),e.setState({replies:[],loading_status:"done",error_msg:""+t})})}},{key:"toggle_attention",value:function(){var e=this;this.setState({loading_status:"loading"});var t=!this.state.attention;ie.set_attention(this.state.info.pid,t,this.props.token).then(function(n){e.setState({loading_status:"done",attention:t}),e.syncState({attention:t})}).catch(function(t){e.setState({loading_status:"done"}),alert("\u8bbe\u7f6e\u5173\u6ce8\u5931\u8d25"),console.error(t)})}},{key:"report",value:function(){var e=prompt("\u4e3e\u62a5 #".concat(this.state.info.pid," \u7684\u7406\u7531\uff1a"));null!==e&&ie.report(this.state.info.pid,e,this.props.token).then(function(e){alert("\u4e3e\u62a5\u6210\u529f")}).catch(function(e){alert("\u4e3e\u62a5\u5931\u8d25"),console.error(e)})}},{key:"set_filter_name",value:function(e){this.setState(function(t){return{filter_name:e===t.filter_name?null:e}})}},{key:"toggle_rev",value:function(){this.setState(function(e){return{rev:!e.rev}})}},{key:"show_reply_bar",value:function(e,t){if(this.reply_ref.current&&!t.target.closest("a, .clickable")){var n=this.reply_ref.current.get();if(/^\s*(?:Re (?:|\u6d1e\u4e3b|(?:[A-Z][a-z]+ )?(?:[A-Z][a-z]+)|You Win(?: \d+)?):)?\s*$/.test(n)){var a="Re "+e+": ";a===this.reply_ref.current.get()?this.reply_ref.current.set(""):this.reply_ref.current.set(a)}}}},{key:"render",value:function(){var e=this;if("loading"===this.state.loading_status)return o.a.createElement("p",{className:"box box-tip"},"\u52a0\u8f7d\u4e2d\u2026\u2026");var t=at(this.props.show_sidebar,this.props.token),n=this.state.filter_name?this.state.replies.filter(function(t){return t.name===e.state.filter_name}):this.state.replies.slice();this.state.rev&&n.reverse();var a=(this.state.rev?"y-":"n-")+(this.state.filter_name||"null"),i=Object(p.a)({},"\u6d1e\u4e3b",1);n.forEach(function(e){void 0===i[e.name]&&(i[e.name]=0),i[e.name]++});var r=this.state.filter_name&&"\u6d1e\u4e3b"!==this.state.filter_name?null:o.a.createElement(me,{callback:function(t){e.show_reply_bar("",t)}},o.a.createElement(it,{info:this.state.info,attention:this.state.attention,img_clickable:!0,color_picker:this.color_picker,show_pid:t,replies:this.state.replies,set_variant:function(t){e.set_variant(null,t)},do_filter_name:i["\u6d1e\u4e3b"]>1?this.set_filter_name.bind(this):null}));return o.a.createElement("div",{className:"flow-item-row sidebar-flow-item"},o.a.createElement("div",{className:"box box-tip"},!!this.props.token&&o.a.createElement("span",null,o.a.createElement("a",{onClick:this.report.bind(this)},o.a.createElement("span",{className:"icon icon-flag"}),o.a.createElement("label",null,"\u4e3e\u62a5")),"\xa0\xa0"),o.a.createElement("a",{onClick:this.load_replies.bind(this)},o.a.createElement("span",{className:"icon icon-refresh"}),o.a.createElement("label",null,"\u5237\u65b0")),(this.state.replies.length>=1||this.state.rev)&&o.a.createElement("span",null,"\xa0\xa0",o.a.createElement("a",{onClick:this.toggle_rev.bind(this)},o.a.createElement("span",{className:"icon icon-order-rev"}),o.a.createElement("label",null,this.state.rev?"\u8fd8\u539f":"\u9006\u5e8f"))),!!this.props.token&&o.a.createElement("span",null,"\xa0\xa0",o.a.createElement("a",{onClick:function(){e.toggle_attention()}},this.state.attention?o.a.createElement("span",null,o.a.createElement("span",{className:"icon icon-star-ok"}),o.a.createElement("label",null,"\u5df2\u5173\u6ce8")):o.a.createElement("span",null,o.a.createElement("span",{className:"icon icon-star"}),o.a.createElement("label",null,"\u672a\u5173\u6ce8"))))),!!this.state.filter_name&&o.a.createElement("div",{className:"box box-tip flow-item filter-name-bar"},o.a.createElement("p",null,o.a.createElement("span",{style:{float:"left"}},o.a.createElement("a",{onClick:function(){e.set_filter_name(null)}},"\u8fd8\u539f")),o.a.createElement("span",{className:"icon icon-locate"}),"\xa0\u5f53\u524d\u53ea\u770b\xa0",o.a.createElement(ce,{colors:this.color_picker.get(this.state.filter_name)},this.state.filter_name))),!this.state.rev&&r,!!this.state.error_msg&&o.a.createElement("div",{className:"box box-tip flow-item"},o.a.createElement("p",null,"\u56de\u590d\u52a0\u8f7d\u5931\u8d25"),o.a.createElement("p",null,this.state.error_msg)),this.props.deletion_detect&&parseInt(this.state.info.reply)>this.state.replies.length&&!!this.state.replies.length&&o.a.createElement("div",{className:"box box-tip flow-item box-danger"},parseInt(this.state.info.reply)-this.state.replies.length," \u6761\u56de\u590d\u88ab\u5220\u9664"),n.map(function(n){return o.a.createElement(Ie,{key:n.cid+a,offset:1500,height:"5em",overflow:!0,once:!0},o.a.createElement(me,{callback:function(t){e.show_reply_bar(n.name,t)}},o.a.createElement(ot,{info:n,color_picker:e.color_picker,show_pid:t,set_variant:function(t){e.set_variant(n.cid,t)},do_filter_name:i[n.name]>1?e.set_filter_name.bind(e):null})))}),this.state.rev&&r,this.props.token?o.a.createElement(Je,{pid:this.state.info.pid,token:this.props.token,area_ref:this.reply_ref,on_complete:this.load_replies.bind(this)}):o.a.createElement("div",{className:"box box-tip flow-item"},"\u767b\u5f55\u540e\u53ef\u4ee5\u56de\u590d\u6811\u6d1e"))}}]),t}(a.PureComponent),st=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={replies:[],reply_status:"done",reply_error:null,info:Object.assign({},e.info,{variant:{}}),attention:null!==e.attention_override&&e.attention_override},n.color_picker=new b,n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"componentDidMount",value:function(){parseInt(this.state.info.reply,10)&&this.load_replies(null,!1)}},{key:"load_replies",value:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];console.log("fetching reply",this.state.info.pid),this.setState({reply_status:"loading",reply_error:null}),ie.load_replies_with_cache(this.state.info.pid,this.props.token,this.color_picker,parseInt(this.state.info.reply)).then(function(a){t.setState(function(e,t){return{replies:a.data,info:Object.assign({},e.info,{reply:n?""+a.data.length:e.info.reply,variant:a.data.length?{latest_reply:Math.max.apply(null,a.data.map(function(e){return parseInt(e.timestamp)}))}:{}}),attention:!!a.attention,reply_status:"done",reply_error:null}},e)}).catch(function(n){console.error(n),t.setState({replies:[],reply_status:"failed",reply_error:""+n},e)})}},{key:"show_sidebar",value:function(){this.props.show_sidebar("\u6811\u6d1e #"+this.state.info.pid,o.a.createElement(rt,{key:+new Date,info:this.state.info,replies:this.state.replies,attention:this.state.attention,sync_state:this.setState.bind(this),token:this.props.token,show_sidebar:this.props.show_sidebar,color_picker:this.color_picker,deletion_detect:this.props.deletion_detect}))}},{key:"render",value:function(){var e=this,t=at(this.props.show_sidebar,this.props.token,this.state.info.pid),n=[["url_pid",E],["url",A],["pid",v],["nickname",_]];this.props.search_param&&n.push(["search",le(this.props.search_param," ","gi")]);var a=w(this.state.info.text,n),i=null;if(!this.props.is_quote){var r=!0,s=!1,l=void 0;try{for(var c,u=a[Symbol.iterator]();!(r=(c=u.next()).done);r=!0){var h=c.value,d=Object(m.a)(h,2),p=d[0],f=d[1];if(f=f.length>0?f.substring(1):f,"pid"===p&&-1===nt.indexOf(f)&&parseInt(f)10&&o.a.createElement("div",{className:"box box-tip"},"\u8fd8\u6709 ",this.state.replies.length-10," \u6761")));return i?o.a.createElement("div",null,g,o.a.createElement(lt,{pid:i,show_sidebar:this.props.show_sidebar,token:this.props.token,deletion_detect:this.props.deletion_detect})):g}}]),t}(a.PureComponent),lt=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={loading_status:"empty",error_msg:null,info:null},n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"componentDidMount",value:function(){this.load()}},{key:"load",value:function(){var e=this;this.setState({loading_status:"loading"},function(){ie.get_single(e.props.pid,e.props.token).then(function(t){e.setState({loading_status:"done",info:t.data})}).catch(function(t){-1!==(""+t).indexOf("\u6ca1\u6709\u8fd9\u6761\u6811\u6d1e")?e.setState({loading_status:"empty"}):e.setState({loading_status:"error",error_msg:""+t})})})}},{key:"render",value:function(){return"empty"===this.state.loading_status?null:"loading"===this.state.loading_status?o.a.createElement("div",{className:"aux-margin"},o.a.createElement("div",{className:"box box-tip"},o.a.createElement("span",{className:"icon icon-loading"}),"\u63d0\u5230\u4e86 #",this.props.pid)):"error"===this.state.loading_status?o.a.createElement("div",{className:"aux-margin"},o.a.createElement("div",{className:"box box-tip"},o.a.createElement("p",null,o.a.createElement("a",{onClick:this.load.bind(this)},"\u91cd\u65b0\u52a0\u8f7d")),o.a.createElement("p",null,this.state.error_msg))):o.a.createElement(st,{info:this.state.info,show_sidebar:this.props.show_sidebar,token:this.props.token,is_quote:!0,deletion_detect:this.props.deletion_detect})}}]),t}(a.PureComponent);function ct(e){return o.a.createElement(ze.Consumer,null,function(t){var n=t.value;return o.a.createElement("div",{className:"flow-chunk"},!!e.title&&o.a.createElement(Z,{text:e.title}),e.list.map(function(t,a){return o.a.createElement(Ie,{key:t.pid,offset:1500,height:"15em",hiddenIfInvisible:!0},o.a.createElement("div",null,!!(e.deletion_detect&&"list"===e.mode&&a&&e.list[a-1].pid-t.pid>1)&&o.a.createElement("div",{className:"flow-item-row"},o.a.createElement("div",{className:"box box-tip flow-item box-danger"},e.list[a-1].pid-t.pid-1," \u6761\u88ab\u5220\u9664")),o.a.createElement(st,{info:t,show_sidebar:e.show_sidebar,token:n,attention_override:"attention_finished"===e.mode||null,deletion_detect:e.deletion_detect,search_param:e.search_param})))}))})}var ut=function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={mode:e.mode,search_param:e.search_text,loaded_pages:0,chunks:{title:"",data:[]},loading_status:"done",error_msg:null},n.on_scroll_bound=n.on_scroll.bind(Object(h.a)(n)),window.LATEST_POST_ID=parseInt(localStorage._LATEST_POST_ID,10)||0,n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"load_page",value:function(e){var t=this,n=function(e){console.error(e),t.setState(function(t,n){return{loaded_pages:t.loaded_pages-1,loading_status:"failed",error_msg:""+e}})};if(e>this.state.loaded_pages+1)throw new Error("bad page");if(e===this.state.loaded_pages+1){if(console.log("fetching page",e),"list"===this.state.mode)ie.get_list(e,this.props.token).then(function(n){if(1===e&&n.data.length){var a=-1;n.data.forEach(function(e){parseInt(e.pid,10)>a&&(a=parseInt(e.pid,10))}),localStorage._LATEST_POST_ID=""+a}t.setState(function(e,t){return{chunks:{title:"News Feed",data:e.chunks.data.concat(n.data.filter(function(t){return 0===e.chunks.data.length||!e.chunks.data.slice(-100).some(function(e){return e.pid===t.pid})}))},loading_status:"done"}})}).catch(n);else if("search"===this.state.mode)ie.get_search(e,this.state.search_param,this.props.token).then(function(e){var n=0===e.data.length;t.setState(function(a,o){return{chunks:{title:'Result for "'+t.state.search_param+'"',data:a.chunks.data.concat(e.data.filter(function(e){return 0===a.chunks.data.length||!a.chunks.data.slice(-100).some(function(t){return t.pid===e.pid})}))},mode:n?"search_finished":"search",loading_status:"done"}})}).catch(n);else if("single"===this.state.mode){var a=parseInt(this.state.search_param.substr(1),10);ie.get_single(a,this.props.token).then(function(e){t.setState({chunks:{title:"PID = "+a,data:[e.data]},mode:"single_finished",loading_status:"done"})}).catch(n)}else{if("attention"!==this.state.mode)return void console.log("nothing to load");ie.get_attention(this.props.token).then(function(e){t.setState({chunks:{title:"Attention List",data:e.data},mode:"attention_finished",loading_status:"done"})}).catch(n)}this.setState(function(e,t){return{loaded_pages:e.loaded_pages+1,loading_status:"loading",error_msg:null}})}}},{key:"on_scroll",value:function(e){e.target===document&&(document.body.scrollHeight-window.scrollY-window.innerHeight2&&o.a.createElement("a",{className:"no-underline",onClick:this.do_back_bound},"\xa0",o.a.createElement("span",{className:"icon icon-back"}),"\xa0"),t))}}]),t}(a.PureComponent),ft=n(24),gt=n.n(ft),bt=(n(52),function(e){function t(e){var n;return Object(s.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).state={level:0,fired:!1},n.callback=e.callback,n.esc_interval=null,n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"do_fire",value:function(){var e=this;this.esc_interval&&(clearInterval(this.esc_interval),this.esc_interval=null),this.setState({level:1,fired:!0}),this.callback(),window.setTimeout(function(){e.setState({level:0,fired:!1})},300)}},{key:"componentDidMount",value:function(){var e=this;window.config.pressure&&(gt.a.set(document.body,{change:function(t){e.state.fired||(t>=.999?e.do_fire():e.setState({level:t}))},end:function(){e.setState({level:0,fired:!1})}},{polyfill:!1,only:"touch",preventSelect:!1}),document.addEventListener("keydown",function(t){t.repeat||"Escape"!==t.key||(e.esc_interval&&clearInterval(e.esc_interval),e.setState({level:.2},function(){e.esc_interval=setInterval(function(){var t=e.state.level+.1;t>=.999?e.do_fire():e.setState({level:t})},30)}))}),document.addEventListener("keyup",function(t){"Escape"===t.key&&(e.esc_interval&&(clearInterval(e.esc_interval),e.esc_interval=null),e.setState({level:0}))}))}},{key:"render",value:function(){var e=25*(this.state.level-.4)-500;return o.a.createElement("div",{className:"pressure-box"+(this.state.fired?" pressure-box-fired":"")+(this.state.level<=1e-4?" pressure-box-empty":""),style:{left:e,right:e,top:e,bottom:e}})}}]),t}(a.Component));function vt(e){return o.a.createElement("div",{id:"global-hint-container",style:{display:"none"}})}var Et=function(e){function t(e){var n;return Object(s.a)(this,t),n=Object(c.a)(this,Object(u.a)(t).call(this,e)),Te(),function(e){function t(){(void 0===e?window.matchMedia("(prefers-color-scheme: dark)").matches:e)?document.body.classList.add("root-dark-mode"):document.body.classList.remove("root-dark-mode")}t(),window.matchMedia("(prefers-color-scheme: dark)").addListener(function(){t()})}({default:void 0,light:!1,dark:!0}[window.config.color_scheme]),n.state={sidebar_stack:[[null,null]],mode:"list",search_text:null,flow_render_key:+new Date,token:localStorage.TOKEN||null},n.show_sidebar_bound=n.show_sidebar.bind(Object(h.a)(n)),n.set_mode_bound=n.set_mode.bind(Object(h.a)(n)),n.on_pressure_bound=n.on_pressure.bind(Object(h.a)(n)),n.inpku_flag=-1!==window[atob("ZG9jdW1lbnQ")][atob("Y29va2ll")].indexOf(atob("cGt1X2lwX2ZsYWc9eWVz")),n}return Object(d.a)(t,e),Object(l.a)(t,[{key:"on_pressure",value:function(){this.state.sidebar_stack.length>1?this.show_sidebar(null,null,"clear"):this.set_mode("list",null)}},{key:"show_sidebar",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"push";this.setState(function(a){var o=a.sidebar_stack.slice();if("push"===n)o.length>10&&o.splice(1,1),o=o.concat([[e,t]]);else if("pop"===n){if(1===o.length)return;o.pop()}else if("replace"===n)o.pop(),o=o.concat([[e,t]]);else{if("clear"!==n)throw new Error("bad show_sidebar mode");o=[[null,null]]}return{sidebar_stack:o}})}},{key:"set_mode",value:function(e,t){this.setState({mode:e,search_text:t,flow_render_key:+new Date})}},{key:"render",value:function(){var e=this;return o.a.createElement(ze.Provider,{value:{value:this.state.token,set_value:function(t){localStorage.TOKEN=t||"",e.setState({token:t})}}},o.a.createElement(bt,{callback:this.on_pressure_bound}),o.a.createElement("div",{className:"bg-img",style:Qe()}),o.a.createElement(pt,{show_sidebar:this.show_sidebar_bound,set_mode:this.set_mode_bound}),o.a.createElement(ze.Consumer,null,function(t){return o.a.createElement("div",{className:"left-container"},o.a.createElement(vt,{token:t.value}),!t.value&&o.a.createElement("div",{className:"flow-item-row aux-margin"},o.a.createElement("div",{className:"box box-tip"},o.a.createElement("p",null,o.a.createElement($,{token_callback:t.set_value},function(e){return o.a.createElement("a",{onClick:e},o.a.createElement("span",{className:"icon icon-login"}),"\xa0\u767b\u5f55\u5230 T\u5927\u6811\u6d1e")})))),(e.inpku_flag||t.value,o.a.createElement(ut,{key:e.state.flow_render_key,show_sidebar:e.show_sidebar_bound,mode:e.state.mode,search_text:e.state.search_text,token:t.value})),o.a.createElement("br",null))}),o.a.createElement(mt,{show_sidebar:this.show_sidebar_bound,stack:this.state.sidebar_stack}))}}],[{key:"is_darkmode",value:function(){return"dark"===window.config.color_scheme||"light"!==window.config.color_scheme&&window.matchMedia("(prefers-color-scheme: dark)").matches}}]),t}(a.Component),_t=Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));function At(e){navigator.serviceWorker.register(e).then(function(e){e.onupdatefound=function(){var t=e.installing;t.onstatechange=function(){"installed"===t.state&&(navigator.serviceWorker.controller?console.log("New content is available; please refresh."):console.log("Content is cached for offline use."))}}}).catch(function(e){console.error("Error during service worker registration:",e)})}r.a.render(o.a.createElement(Et,null),document.getElementById("root")),function(){if("serviceWorker"in navigator){if(new URL(".",window.location).origin!==window.location.origin)return;window.addEventListener("load",function(){var e="".concat(".","/service-worker.js");_t?(!function(e){fetch(e).then(function(t){404===t.status||-1===t.headers.get("content-type").indexOf("javascript")?navigator.serviceWorker.ready.then(function(e){e.unregister().then(function(){window.location.reload()})}):At(e)}).catch(function(){console.log("No internet connection found. App is running in offline mode.")})}(e),navigator.serviceWorker.ready.then(function(){console.log("This web app is being served cache-first by a service worker. To learn more, visit https://goo.gl/SC7cgQ")})):At(e)})}}()}],[[25,1,2]]]);
-//# sourceMappingURL=main.e91b9a8b.chunk.js.map
\ No newline at end of file
diff --git a/static/js/main.e91b9a8b.chunk.js.map b/static/js/main.e91b9a8b.chunk.js.map
deleted file mode 100644
index 6fb8fba..0000000
--- a/static/js/main.e91b9a8b.chunk.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["infrastructure/appicon/hole.png","infrastructure/appicon/imasugu.png","infrastructure/appicon/imasugu_rev.png","infrastructure/appicon/syllabus.png","infrastructure/appicon/score.png","infrastructure/appicon/course_survey.png","infrastructure/appicon/homepage.png","infrastructure/appicon/dropdown.png","infrastructure/appicon/dropdown_rev.png","color_picker.js","text_splitter.js","infrastructure/const.js","infrastructure/functions.js","infrastructure/widgets.js","cache.js","flows_api.js","Common.js","react-lazyload/src/utils/event.js","react-lazyload/src/utils/scrollParent.js","react-lazyload/src/index.jsx","react-lazyload/src/utils/debounce.js","react-lazyload/src/utils/throttle.js","AudioWidget.js","Config.js","Message.js","UserAction.js","Flows.js","Title.js","Sidebar.js","PressureHelper.js","App.js","registerServiceWorker.js","index.js"],"names":["module","exports","ColorPicker","this","names","current_h","Math","random","name","toLowerCase","PID_RE","URL_PID_RE","NICKNAME_RE","URL_RE","split_text","txt","rules","forEach","rule","regex","concat","apply","map","part","content","split","seg","test","filter","THUHOLE_API_ROOT","get_json","res","ok","Error","status","statusText","text","then","t","JSON","parse","e","console","error","trace","log","SyntaxError","substr","API_VERSION_PARAM","encodeURIComponent","process","REACT_APP_BUILD_INFO","floor","Date","LOGIN_POPUP_ANCHOR_ID","pad2","x","format_time","time","getMonth","getDate","getHours","getMinutes","getSeconds","chinese_format","buildFormatter","chineseStrings","Time","props","stamp","date","formatter","title","toLocaleString","timeZone","hour12","TitleLine","className","appicon_hole","appicon_imasugu","appicon_imasugu_rev","appicon_syllabus","appicon_score","appicon_course_survey","appicon_homepage","LoginPopupSelf","state","loading_status","username_ref","React","createRef","password_ref","input_token_ref","popup_anchor","document","getElementById","createElement","id","body","appendChild","type","setState","fetch","current","value","method","headers","stringify","excluded_scopes","json","success","alert","msg","catch","set_token","code","user_token","on_close","token","result","length","ReactDOM","createPortal","ref","autoFocus","defaultValue","onClick","do_sendcode","disabled","do_login","token_callback","placeholder","do_input_token","Component","LoginPopup","popup_show","on_popup_bound","on_popup","bind","on_close_bound","children","HOLE_CACHE_DB_NAME","CACHE_DB_VER","Cache","db","added_items_since_maintenance","encrypt","decrypt","open_req","indexedDB","open","onerror","onupgradeneeded","event","target","createObjectStore","keyPath","createIndex","unique","onsuccess","setTimeout","maintenance","pid","data","s","o","i","key","new_key","charCodeAt","String","fromCharCode","c","target_version","parseInt","Promise","resolve","reject","store","transaction","objectStore","get_req","get","data_str","version","last_access","put","delete","warn","req","count_req","count","index","openKeyCursor","cur","primaryKey","continue","deleteDatabase","cache","window","hole_cache","token_param","API","load_replies","color_picker","cache_version","API_BASE","sort","a","b","cid","info","_display_color","variant","load_replies_with_cache","set_attention","attention","URLSearchParams","append","report","reason","get_list","page","get_search","keyword","get_single","get_attention","escape_regex","string","replace","build_highlight_re","option","RegExp","join","ColoredSpan","style","colors","HighlightedText","parts","idx","url","p","href","rel","preventDefault","show_pid","substring","PureComponent","TEXTAREA_BACKUP","SafeTextarea","on_change_bound","on_change","on_keydown_bound","on_keydown","clear","area_ref","change_callback","submit_callback","on_submit","ctrlKey","altKey","focus","onChange","onKeyDown","pwa_prompt_event","PromotionBar","is_ios","navigator","userAgent","matchMedia","matches","standalone","prompt","addEventListener","ClickHandler","moved","init_y","init_x","on_begin_bound","on_begin","on_move_bound","on_move","on_end_bound","on_end","MOVE_THRESHOLD","last_fire","touches","screenY","screenX","abs","do_callback","callback","onTouchStart","onMouseDown","onTouchMove","onMouseMove","on","el","eventName","opts","attachEvent","call","off","removeEventListener","detachEvent","node","HTMLElement","documentElement","excludeStaticParent","position","overflowRegex","parent","parentNode","ownerDocument","getComputedStyle","overflow","overflowX","overflowY","defaultBoundingClientRect","LISTEN_FLAG","listeners","pending","passiveEventSupported","Object","defineProperty","delayType","passiveEvent","capture","passive","checkVisible","component","ReactDom","findDOMNode","scrollParent","parentTop","parentHeight","getBoundingClientRect","top","height","windowInnerHeight","innerHeight","clientHeight","intersectionTop","max","intersectionHeight","min","offsetTop","offsets","Array","isArray","offset","checkOverflowVisible","elementHeight","offsetWidth","offsetHeight","getClientRects","checkNormalVisible","visible","hidden","once","push","unmountIfInvisible","hiddenIfInvisible","lazyLoadHandler","listener","indexOf","splice","finalLazyLoadHandler","LazyLoad","scrollport","scrollContainer","querySelector","needResetFinalLazyLoadHandler","undefined","debounce","func","wait","immediate","timeout","args","context","timestamp","later","last","arguments","callNow","throttle","fn","threshhold","scope","deferTimer","now","clearTimeout","getAttribute","listenerCount","setAttribute","scroll","resize","removeAttribute","visibility","defaultProps","audio_cache","AudioWidget","src","all","AMR","load","err","blob","reader","FileReader","onload","raw","decode","wave","PCMData","encode","sampleRate","channelCount","bytesPerSample","binary_wave","Uint8Array","objurl","URL","createObjectURL","Blob","readAsBinaryString","controls","BUILTIN_IMGS","DEFAULT_CONFIG","background_img","background_color","pressure","easter_egg","color_scheme","load_config","loaded_config","config","assign","localStorage","keys","save_config","bgimg_style","img","color","background","backgroundImage","encodeURI","backgroundColor","backgroundSize","ConfigBackground","save_changes","img_select","on_select","on_change_img","on_change_color","ConfigColorScheme","ConfigSwitch","switch","val","checked","description","ConfigUI","save_changes_bound","chg","confirm","location","reload","reset_settings","MAX_IMG_DIAM","MAX_IMG_PX","MAX_IMG_FILESIZE","TokenCtx","createContext","set_value","InfoSidebar","show_sidebar","serviceWorker","getRegistrations","registrations","registration","unregister","LoginForm","copy","Consumer","copy_token","do_popup","ReplyForm","global_keypress_handler_bound","global_keypress_handler","tagName","on_complete","onSubmit","PostForm","img_tip","img_ref","on_img_change_bound","on_img_change","file","return_url","fixOrientation","fixed_dataurl","image","Image","width","compressed","rate","sqrt","canvas","ctx","getContext","drawImage","quality","new_url","quality_l","quality_r","toDataURL","round","on_got_img","readAsDataURL","files","proc_img","d","do_post","accept","IMAGE_BASE","CLICKABLE_TAGS","audio","QUOTE_BLACKLIST","LATEST_POST_ID","load_single_meta","title_elem","single","reply","replies","deletion_detect","Reply","do_filter_name","tag","FlowItem","likenum","r","is_quote","copy_link","img_clickable","latest_reply","FlowSidebar","error_msg","filter_name","rev","syncState","sync_state","reply_ref","prev","update_count","set_variant","next_attention","prevState","closest","should_text","set","replies_to_show","slice","reverse","view_mode_key","replies_cnt","main_thread_elem","show_reply_bar","set_filter_name","toggle_rev","toggle_attention","float","FlowItemRow","reply_status","reply_error","attention_override","hl_rules","search_param","quote_id","mode","FlowItemQuote","FlowChunk","list","ind","Flow","search_text","loaded_pages","chunks","on_scroll_bound","on_scroll","failed","max_id","some","finished","scrollHeight","scrollY","load_page","should_deletion_detect","flag_re","ControlBar","set_mode","on_keypress_bound","on_keypress","do_refresh_bound","do_refresh","do_attention_bound","do_attention","hash","decodeURIComponent","lastIndexOf","flag_res","exec","startsWith","scrollTo","onKeyPress","Title","Sidebar","sidebar_ref","do_close_bound","do_close","do_back_bound","do_back","nextProps","stack","scrollTop","cur_title","cur_content","onTouchEnd","click","PressureHelper","level","fired","esc_interval","clearInterval","Pressure","change","force","do_fire","end","polyfill","only","preventSelect","repeat","THRESHOLD","setInterval","new_level","pad","left","right","bottom","DeprecatedAlert","display","App","override","update_color_scheme","classList","add","remove","addListener","listen_darkmode","default","light","dark","sidebar_stack","flow_render_key","show_sidebar_bound","set_mode_bound","on_pressure_bound","on_pressure","inpku_flag","atob","ns","pop","Provider","isLocalhost","Boolean","hostname","match","registerValidSW","swUrl","register","onupdatefound","installingWorker","installing","onstatechange","controller","render","origin","response","ready","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.e91b9a8b.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAIoElEQVR42rVWaWwU5xn+dqGHVPCPQhMRsGXjIAKp1ASp0KhJo6qlTQq2fDYipN7d0ewcHV8CO8gHbh2wfGp3vTOZmTUWBArFXHUjFGiROewa0kNqkiJRUkUkMQ2lXD4SQ/DOfG/f75u1GwjmUNMfr2a11/O8z/s87/cR0zTJfZdhEAOLPeOWSU7XN8w+Lfxydudtnz3Ifz4YOD4tXScdlk1ONm2aSQPCIZol/26wbPPMji2Wj31mpL77xRPASnXoj5oWuV5RKkNABMhUYHxZ5c+jCQ7sN/4vCqTktQzDF7Es39831j8CkvBPGpIcd7HqwEPyhTOBhvkRroLhe5BR3D9blDdmWf6eSIRQSYyDIgISSNJFSpLOV4EuVF7taY6SmG362Xe/UAVS3fs7bJucr3l5BYjCDapKLgTDLn1Udd1MzYWH5RtDubVPoRfQJ/c/inuDp4zXjtKf3Lx5BoihPipLAErYgZBE6SKV0nTVcbM0gHnhY4OVm2a0s1HEU4b8nwikZo/lx9mT8Yqyn0FYACojuCq6SACQALgLNNfNUpPwiAyfLF8XiCYs/hvDvLcX7tk9+4MO7P7duto5CH4OwSlI4SSo+JxSQKM0E1XIVCnMU95/N1A3l8XS1I17qnDX7lnFTMvHjRcWWhAcpUfjyTKlKr4OhgE9AG46VqbCSCRpugJutty+uzmCpjV95j0ScdelY2PsWu0EGard8C2c/RhVJAdYSSEkIlDKR6AALNAoZGASMtGQWRqL5ccf5tc+2brVJlYcY3mX5XRX6bF7/4FIh89RpIO8e1lKgizSIa2OjmmVqIDIFRjJUuHcIlQgQ2WFKqjgZKlvHHgl4uexNKYfxbTd49PXaZjkenlpETce61wW3DG1ApbVnISm6l0AgSBAtgYbnlAg/bsyjCxENTI06mRpSZgnw/jyip/GLexcn16FaWPXYid8A01NaSj9GQSnGD0kEKIjaiVdUvtHqK/eAzQYQgU0KH9ChjlPy3BtoUIZATdDYbGk9GH5bH9Fc1rLVnvaWN7ReHi6+XbGYuSmpjSAJAKfu4Ku52MQ4Z2yzXCp9GVUoAQVUOHiQhX+8pgClPkgQwM+CkwFna/Ap0tLG3e2RUnnNIa802nna8GN92FtzWIQgiPYvYuzdxk4V0LBJSSh9HIIDqmt8Jsn16EJUfp0DZPA0sB8wEkwQ7owVxr9oKBuSQs3pP65UdzBeKavt72doPF2p4zndY/g6AGuAHvfUTV4Zv0b8PizVXAzQ+bgLAnAwD0SzJAON2S2tre3sZ2dE5/bDbdeNHTdzy4X18u159F4jhe7sDsp/WWtCq4rZagANyVUVuwA8TtVuAdkDvwJpuHf2SkSPJa4IXEUaEh3fEX5qk6bH2r+z56WtxivzbZ9A81NX0Pwt7jUuHIpn71AxxH4ezX90LZ+pzcCJQyfCircWIxgCxAUO63HNCx9SuZEUA3qjYOfE7gh5bf7K5tntXXfakgyua9xa/l3xiJkQpXXe9Ljup2auQCjaiU8WvdnqKreP0UAMAWQjeZboHEC4WUKpD0jwfBCjxAbC6rgbUgkefObWvWvolESndoNBipgsBHoJGLYZGhDTSZuuUue8fDAYXs/5X5G6mR5G+AS4oQYgQNaO+xatg4ojoAZ7xweTMeWTCXBA+fJ4Cq4ME+6PJRflx1N2ByTYRPD0okdsXyt+zrI+a7gNliL61ULJ/mho0hepwpXBIu53zOio6rwdNUhWIomnEAT0kkTpmsegUxuxkkS1MnG0/LrGvxtjbyjYXeUdMUsn84UQEPMMKMWiZ3Rnt1xoWBivE50oERyqcryz7pnJLyiiszNRyUeSaip2AZlK6qmFHAQ0OGgqcpIRTMLYzpXda99W3XE3wYnpENV30/ETaLjkU2Mlm6fcbhhljGaMxgdLoRtHxUlr8Sw05cwdmEEUsNTBP6rhKeKg4dRcpFnwknAVNe8HGZGZtC5Kj33vAKh18XkTwZEyB146VTjrk2z7E7bxwgQfajkufhIHhiXi5Kx4UK382ohvH14LXXKREYEQGQdT5Lx/ADsdSjMT0OXyY63Y7yaYbee+QDviTBHg5voi95qieYeF2BVv+AW9YnJnBNBCPVpz3VHthCit3X5jL76NGMk79fxK4VgXi5y9KuFTttYAez8oJi+11NCJ9aL/OzH0QAIWGGmBr+UgosALAVs4cA8rG9gPYTxfFyFQVGi2n6R/vBNAfKPC05Rn+DkHRNQgUDPxj2NaZ4CFq7H9i5iHKn/Unw0N6IP54N+uZgRmWBqtI8WwvbzxfTUwIv0oy0BGN8YAqc8pQgSolkqH8HNxQoML1fgdLEMr70iUbFXpCtPYdcDrGthovAoSn88BHmDgc6GnsYvJzoTRDd1L4Ysj0bMJsbeZqK/H1yrj+Wc168UIQlOhI8FFaEdo4XUvlREd6EyB8++AAf/ugbaukWo7w5D6T6RvnBEpD8eFOjKNwW6msl9VExiQT7Wqj+UXAj+Xitpfa2N2HErtX/4IjI9EhhHI5rwGVacGIPV81EJXR/NHTWGC9AbnAidHA+a1YmOFrjN14rcnD8F3R9hl6sHQk7eCZT5qOgU94mUdZyHHef0Bz4uGAi8Wr2/PkPH/2ay6ylwbxGZ5hQbEy8Pho5bKoLy7EM1zqqP6RfWtCKRf+hoUp2RuVKMIyoCC/0SvVgML54IQcEREQqPCjApc05/EFYPlLy3pk9u1w6vW9q6vZUk4mz5mH7jM+C33QfYgZR6WniDidl+A4kYtk70U1Wz9XPCD/QLa3+B4+nFxLxljuUOdVzN/1fhqZKLq04EzqOx3skdLHl9bZ/SKB4pXVnbW5cWR1UTnTZKbjNg3+3g09yIUmqwp63jJcKcaXR0EbNpmzem/c3E2NNKzL0tPr2n5Sut29q/ijUDi7RubyMWEt4a6SbMZOy3ujUJbNwCPFn/Abg0oqXmwyKAAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFdklEQVR42sVW+VNTVxS+f4Od9oeW0RmlU8dOcRx3BEHbqiio3dtfamds+0N1bGe62emirYpSLRYDguAWJQihLZBAEkgKgbCHgIBAXbBTtgSykhAQEL/ecyWtwwMHx9DemS/vvXvv+c73zj3n5DEAjHBodJz9MD7BvuP3KVbb0xqV1p6lzENzS9u7Y3zOVWNittXPMmvMWmaNjZgeW8OZY91i1pSbzSqcg6y01Lj7V7UOap3Bma9WhyiKtEyh0bGsQg0L+P3n5talDNZ5LpWZCwqYqqYxJk9TggK1Bkpza7pWrWNdsZHM/uKymZ1Pgvb07ohiel0Jy7VcO1ug0iCfc+WbW7fUa0vYrUw5u6G8IhXglR1l/qR45tu/l9WeTo5XGqvxS3k1tPmF+t6Y8MXOVYui+3ZEb+ROHoq+HVEb3WtCo23bIhZrCwoNuZyHuKpTU474v/2M+dOSmDdDJhVgzUxn1oQDcd7w59C5+00oqxqgsLTBnHAIQ8vnoy9uPbiDWYH2kk1dwmFkWdqRU2nG9V2vw8e5rScOx/ZnX5YK6Dvw6Z6+VzYMepY8hT8++ZALMONKfQuqkxLhWf88rNvCZy2A54KwqTp1UnCQgPZ9H8Cz5ElYX93gsR38/COpgO3r5bata+FYHYrKve8jp7EDuW23USRLQveKhXDERc5agCMuAt0rF6JQdkpw5DS1o3LPbsFti1nLIxQplx7BljVyO3fSExUG/YYVyFMVIa/lOvLfewcdyxbAvTNq1gJobzu3Ue16G3nNnCNfDUP0cvRELwX5IF9SAbERchtftO+MRsOKUKjXhUG9JRJlSxegm4fUvn32OUB7ycYYNh/qzRFQh4cJTuK23Y+kVED/1nA5BxycwMZxbWUoml4IQdemVXBujwStPQpc3KZr8yo0hYWglXMRJ3FPrksF2F57Sc4BK4f9jZfhfmuzgPPNTWLO9oggG7IN8BDnAzxSAaWL5sk58C+emMS8x8S0PFIBjQf3yznwH0EqwAfIOTAThqZgpjXf7CAV4PAMyjkwFXa3R1xHx+9i4h4wzn/o6r8zKtb6XW4MjdwBnxLw+ofF3HRcD2D2AlxeH5yDXpgsjdBWmFBcVY3S2jr0DTiEKN/wCFpu3ERReQUM1TW4+VcXfFxQ0AQMDvmFiPQcJb5PTkHi+Qs4cEqGo2fS0dndCxrFlVX4OvEkvvjxOCrMDSISQRMQgM3pgtXhFPd0lV3OxOmsKyICdByd3T04xkVVNFhw994cCPDwSIyMjQtyGhVms4hIt61fPA/wcz+WnjF3Alw8DygKvXYHbvf0IlmhgDy/QCQdCeviQuZUAL04kX/1UyK++TkJB2XJ+JMLIWd0DHMugEqNMrysrh6GmlocP3ceOlMlhkfHRA7MuYCByXoPDD0vucOnU2HlR0IOe/oHRBJSuU4EswoCjYjelOqeGhENpVaHhIyzounQcPNSjU87g/qWVvF83zYIAty+IdGI1GVGXCpQ4Te9ARnKXHx5/AQqLU3CWUNbu5g7kpomypOaFdmQ7WMLoPKjClCo1Dh54SJSMhVIy85BbXMLRnhUKNzUGU+cPYdsjRYpiixc4tVBzcsz9AgCXF7vQ3OAOiJlO139PBfG7k4IJ5Qb9Ka0RiUZ2PPQkua+JAKcfJIvzGhEZxwAOZ7aIzwPrLunrE/z3zLN90Brh9zu8vCmMsY3DIozDCYcHJTIlNTNHdelAorLTPG1lmbYuUrfCA/nsB+D/uDA679/fBSBWstVaPTGIxIBXX22EH151UVdqQn1V1sF6ppagoIAX6mpBhpD+YUSY9Uz0s/ygQFWXtPA1MXGjzUGo4Fv1HCoggRNkcGoLykz7fvdVMP0HBIB/xf+Bi8VajXQRja5AAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAFfklEQVR42qWXWWicVRiG/39mUim4NRq88MZWXIpLe+FS6lYKtZsW0UrRUmyllUIXpQiN3hXBC1sxdyom6q2lVRGhUqvFClURUVFUsu+ZmD2TTDKTycTn/fudcPzNJJMaeDOTnHO+7z3ffoLm5uagFFpaWpJ8LmloaAgaGxuD3t7epePj49unpqbeLhQKn4EvwQVwjv+dYm1fOp2u0t76+vqgqampAhmp+XTMqxwB0XcUr8pmsydQ8jPK0oYe0G3f+8AgGGDPn+x9t7+//8HW1taIODKSiyWQ0MGurq4bEKbbjoEZUATTYApMgglDrnDpp2j7hPzk5ORJyN9qJBLlEoiUDw4ObkNIhydQ6JHQ4eHhF1jfgLlXg7v5vn5oaGj3xMTE++xpjZ0ZyWQy+7Fo4Cw6H4GENnLgcExIu/6HRa7XugjOBcno7Oy8EjI7ccVvOstnJIP4OG4kwlIEopuj6JAdlElnuFUtiq/Tmt1ApkwiTJ+hIWF+TmiP9nZ0dChgj/my+LtGJPyYcAHnzL5VfuRAXgfGxsZe1rrWLCOCcuAHMO7agazs1CUWM7KkyYtiwm0OdUuL7KJTLiFAt/VvWQ4SdiYpZbjkCbOEAjhHYN7hLiWWS8QEU7/jfM73Ov3PlAfOrEZoQbi9Zu6UvnOhaic/n89/3dbWFq1FBQNGd7IwbinWiTWuRkjolLe3t1+BKZ8nJV8FRyH4ylxgrVp7RkdHDxIDyxwJXQQZARb4wSxcxCpbpTtiy6E3HTuYHnI+crGB8v2xrFgQEHrLBa0XYxtdvcjlcp9HMcDtr4LZr8Ysze2v8fI11MGBgYFtZqFiGcq1J0+wvWRyQnNnILOj6yfb8zc/VQGp8RR/9Mr8sDppfgtjUR1QcFZBdjN4FGwsAa1tAverDMcKT5Si6HvNKmmGorZbjGrFRqwx9d65Uk4H5a/FIF71nBv6+voesdKt/nEq4NcX1lByKq9+jvoW4OB9NJjHwCawuQS0tgU8jLkTMRKRO3t6em5ReVZ1Bd+KwFfW1bKq7UYgjPWF7ZYhZQchMVDtVc7AlXB0VJpy9YwzInDeCpAI3OUT8LJg72KzgMx6ww9Cj8C1rLeBFkfgrOeC9XEXWPSmRkZGdpCih8EBcLAEDqiXsHePmlI8DswFy9E1rHoDLioIP+JLvyKT4rCrVBBqKvqfQRjaVLXGglA6zyot9lhEFl0Jjqeh0N3dXcXhleA2cHsJaG0lZr7R0vlfWaCeg4WOWhqOkYYvilEVVvjLikMbplsaL0RE9UPms1FDpgRGLcLTuOHZeCFSbUDXBQvoIQrRTa4U17rgIeCe8eIgCkKEHVlsEHK792KlOOQi95j5p2lI56NSLH+x8IAKkRZg+AeNpILDUUuVEKxSiateh+iHoE6jVwnUsf4BqMGyy72OGHVVKu0ZV8656K6oGWl0lmlYPO2l0DFzQcqZ73LghhNL5Z2uV3DJX+iOumRKG1IWnTcrMGxoEMOn3UjtDSTlwO1VO0+Zhe/V9OxGM9J9nbk5FZ8H99nkop1Z0vJJu00YL88LjGSz8YPyNVZpC2bd407nf4ZS+Qlfn/AHSU0ymCv0htKkd9PAS9toZHMTkWSprugizu8E3seSpfiacyy3m4pEjdfbReY7zLbFxqiSY7lLNW69VgOHnXXKT2tSduRKPkwcCQ0U9uqZTS2E/ah+Tmdcp64GKsEysIIYWqsGhKJvrNDMntObQCNZXPmCTzOErkbg2di0U7CUVeHpstdTxpRO+1OTCDNNbXCZFFc+7+PUjdQyO758HJN+apNTxh6iae9xOmBVUBYbhvQ5sug5pdrlPk79B0aFUsleyVUUG/WOT8D39jS/CH7XJ2tH2LNCe60hJRd6nv8Dwj5T3q96iTAAAAAASUVORK5CYII=\"","// https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/\r\n\r\nconst golden_ratio_conjugate=0.618033988749895;\r\n\r\nexport class ColorPicker {\r\n constructor() {\r\n this.names={};\r\n this.current_h=Math.random();\r\n }\r\n\r\n get(name) {\r\n name=name.toLowerCase();\r\n if(name==='洞主')\r\n return ['hsl(0,0%,97%)','hsl(0,0%,16%)'];\r\n\r\n if(!this.names[name]) {\r\n this.current_h+=golden_ratio_conjugate;\r\n this.current_h%=1;\r\n this.names[name]=[\r\n `hsl(${this.current_h*360}, 50%, 90%)`,\r\n `hsl(${this.current_h*360}, 60%, 20%)`,\r\n ];\r\n }\r\n return this.names[name];\r\n }\r\n}","// regexp should match the WHOLE segmented part\r\n// export const PID_RE=/(^|[^\\d\\u20e3\\ufe0e\\ufe0f])([2-9]\\d{4,5}|1\\d{4,6})(?![\\d\\u20e3\\ufe0e\\ufe0f])/g;\r\nexport const PID_RE=/(^|[^\\d\\u20e3\\ufe0e\\ufe0f])(#\\d{1,7})(?![\\d\\u20e3\\ufe0e\\ufe0f])/g;\r\n// TODO: fix this re\r\n// export const URL_PID_RE=/((?:https?:\\/\\/)?thuhole\\.tech\\/?#(?:#|%23)([2-9]\\d{4,5}|1\\d{4,6}))(?!\\d|\\u20e3|\\ufe0e|\\ufe0f)/g;\r\nexport const URL_PID_RE=/((?:https?:\\/\\/)?thuhole\\.tech\\/?#(?:#|%23)(\\d{1,7}))(?!\\d|\\u20e3|\\ufe0e|\\ufe0f)/g;\r\nexport const NICKNAME_RE=/(^|[^A-Za-z])((?:(?:Angry|Baby|Crazy|Diligent|Excited|Fat|Greedy|Hungry|Interesting|Jolly|Kind|Little|Magic|Naïve|Old|Powerful|Quiet|Rich|Superman|THU|Undefined|Valuable|Wifeless|Xiangbuchulai|Young|Zombie)\\s)?(?:Alice|Bob|Carol|Dave|Eve|Francis|Grace|Hans|Isabella|Jason|Kate|Louis|Margaret|Nathan|Olivia|Paul|Queen|Richard|Susan|Thomas|Uma|Vivian|Winnie|Xander|Yasmine|Zach)|You Win(?: \\d+)?|洞主)(?![A-Za-z])/gi;\r\nexport const URL_RE=/(^|[^.@a-zA-Z0-9_])((?:https?:\\/\\/)?(?:(?:[\\w-]+\\.)+[a-zA-Z]{2,3}|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})(?::\\d{1,5})?(?:\\/[\\w~!@#$%^&*()\\-_=+[\\]{};:,./?|]*)?)(?![a-zA-Z0-9])/gi;\r\n\r\nexport function split_text(txt,rules) {\r\n // rules: [['name',/regex/],...]\r\n // return: [['name','part'],[null,'part'],...]\r\n\r\n txt=[[null,txt]];\r\n rules.forEach((rule)=>{\r\n let [name,regex]=rule;\r\n txt=[].concat.apply([],txt.map((part)=>{\r\n let [rule,content]=part;\r\n if(rule) // already tagged by previous rules\r\n return [part];\r\n else {\r\n return content\r\n .split(regex)\r\n .map((seg)=>(\r\n regex.test(seg) ? [name,seg] : [null,seg]\r\n ))\r\n .filter(([name,seg])=>(\r\n name!==null || seg\r\n ));\r\n }\r\n }));\r\n });\r\n return txt;\r\n}\r\n","// export const THUHOLE_API_ROOT='//localhost:3001/';\r\nexport const THUHOLE_API_ROOT='//api.thuhole.tech/';\r\n","export function get_json(res) {\r\n if(!res.ok) throw Error(`网络错误 ${res.status} ${res.statusText}`);\r\n return (\r\n res\r\n .text()\r\n .then((t)=>{\r\n try {\r\n return JSON.parse(t);\r\n } catch(e) {\r\n console.error('json parse error');\r\n console.trace(e);\r\n console.log(t);\r\n throw new SyntaxError('JSON Parse Error '+t.substr(0,50));\r\n }\r\n })\r\n );\r\n}\r\n\r\nexport function listen_darkmode(override) { // override: true/false/undefined\r\n function update_color_scheme() {\r\n if(override===undefined ? window.matchMedia('(prefers-color-scheme: dark)').matches : override)\r\n document.body.classList.add('root-dark-mode');\r\n else\r\n document.body.classList.remove('root-dark-mode');\r\n }\r\n\r\n update_color_scheme();\r\n window.matchMedia('(prefers-color-scheme: dark)').addListener(()=>{\r\n update_color_scheme();\r\n });\r\n}\r\n\r\nexport function API_VERSION_PARAM() {\r\n return '&PKUHelperAPI=3.0&jsapiver='+encodeURIComponent((process.env.REACT_APP_BUILD_INFO||'null')+'-'+(Math.floor(+new Date()/7200000)*2));\r\n}","import React, {Component, PureComponent} from 'react';\r\nimport ReactDOM from 'react-dom';\r\n\r\nimport TimeAgo from 'react-timeago';\r\nimport chineseStrings from 'react-timeago/lib/language-strings/zh-CN';\r\nimport buildFormatter from 'react-timeago/lib/formatters/buildFormatter';\r\n\r\nimport './global.css';\r\nimport './widgets.css';\r\n\r\nimport appicon_hole from './appicon/hole.png';\r\nimport appicon_imasugu from './appicon/imasugu.png';\r\nimport appicon_imasugu_rev from './appicon/imasugu_rev.png';\r\nimport appicon_syllabus from './appicon/syllabus.png';\r\nimport appicon_score from './appicon/score.png';\r\nimport appicon_course_survey from './appicon/course_survey.png';\r\nimport appicon_dropdown from './appicon/dropdown.png';\r\nimport appicon_dropdown_rev from './appicon/dropdown_rev.png';\r\nimport appicon_homepage from './appicon/homepage.png';\r\nimport {THUHOLE_API_ROOT} from './const';\r\nimport {get_json, API_VERSION_PARAM} from './functions';\r\n\r\nconst LOGIN_POPUP_ANCHOR_ID='pkuhelper_login_popup_anchor';\r\n\r\nfunction pad2(x) {\r\n return x<10 ? '0'+x : ''+x;\r\n}\r\nexport function format_time(time) {\r\n return `${time.getMonth()+1}-${pad2(time.getDate())} ${time.getHours()}:${pad2(time.getMinutes())}:${pad2(time.getSeconds())}`;\r\n}\r\nconst chinese_format=buildFormatter(chineseStrings);\r\nexport function Time(props) {\r\n const time=new Date(props.stamp*1000);\r\n return (\r\n \r\n \r\n \r\n {format_time(time)}\r\n \r\n );\r\n}\r\n\r\nexport function TitleLine(props) {\r\n return (\r\n \r\n {props.text} \r\n
\r\n )\r\n}\r\n\r\nexport function GlobalTitle(props) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nconst FALLBACK_APPS={\r\n // id, text, url, icon_normal, icon_hover, new_tab\r\n bar: [\r\n ['hole', '树洞', '/hole', appicon_hole, null, false],\r\n ['imasugu', '教室', '/spare_classroom', appicon_imasugu, appicon_imasugu_rev, false],\r\n ['syllabus', '课表', '/syllabus', appicon_syllabus, null, false],\r\n ['score', '成绩', '/my_score', appicon_score, null, false],\r\n ],\r\n dropdown: [\r\n ['course_survey', '课程测评', 'https://courses.pinzhixiaoyuan.com/', appicon_course_survey, null, true],\r\n ['homepage', '客户端', '/', appicon_homepage, null, true],\r\n ],\r\n fix: {},\r\n};\r\n// const SWITCHER_DATA_VER='switcher_2';\r\n// const SWITCHER_DATA_URL=THUHOLE_API_ROOT+'web_static/appswitcher_items.json';\r\n\r\n// export class AppSwitcher extends Component {\r\n// constructor(props) {\r\n// super(props);\r\n// this.state={\r\n// apps: this.get_apps_from_localstorage(),\r\n// }\r\n// }\r\n//\r\n// get_apps_from_localstorage() {\r\n// let ret=FALLBACK_APPS;\r\n// if(localStorage['APPSWITCHER_ITEMS'])\r\n// try {\r\n// let content=JSON.parse(localStorage['APPSWITCHER_ITEMS'])[SWITCHER_DATA_VER];\r\n// if(!content || !content.bar)\r\n// throw new Error('content is empty');\r\n//\r\n// ret=content;\r\n// } catch(e) {\r\n// console.error('load appswitcher items from localstorage failed');\r\n// console.trace(e);\r\n// }\r\n//\r\n// return ret;\r\n// }\r\n//\r\n// check_fix() {\r\n// if(this.state.apps && this.state.apps.fix && this.state.apps.fix[this.props.appid])\r\n// setTimeout(()=>{\r\n// window.HOTFIX_CONTEXT={\r\n// build_info: process.env.REACT_APP_BUILD_INFO || '---',\r\n// build_env: process.env.NODE_ENV,\r\n// };\r\n// eval(this.state.apps.fix[this.props.appid]);\r\n// },1); // make it async so failures won't be critical\r\n// }\r\n//\r\n// componentDidMount() {\r\n// this.check_fix();\r\n// setTimeout(()=>{\r\n// fetch(SWITCHER_DATA_URL)\r\n// .then((res)=>{\r\n// if(!res.ok) throw Error(`网络错误 ${res.status} ${res.statusText}`);\r\n// return res.text();\r\n// })\r\n// .then((txt)=>{\r\n// if(txt!==localStorage['APPSWITCHER_ITEMS']) {\r\n// console.log('loaded new appswitcher items',txt);\r\n// localStorage['APPSWITCHER_ITEMS']=txt;\r\n//\r\n// this.setState({\r\n// apps: this.get_apps_from_localstorage(),\r\n// });\r\n// } else {\r\n// console.log('appswitcher items unchanged');\r\n// }\r\n// })\r\n// .catch((e)=>{\r\n// console.error('loading appswitcher items failed');\r\n// console.trace(e);\r\n// });\r\n// },500);\r\n// }\r\n//\r\n// componentDidUpdate(prevProps, prevState) {\r\n// if(this.state.apps!==prevState.apps)\r\n// this.check_fix();\r\n// }\r\n//\r\n// render() {\r\n// let cur_id=this.props.appid;\r\n//\r\n// function app_elem([id,title,url,icon_normal,icon_hover,new_tab],no_class=false,ref=null) {\r\n// return (\r\n// \r\n// {!!icon_normal && [\r\n// ,\r\n// \r\n// ]}\r\n// {title} \r\n// \r\n// );\r\n// }\r\n//\r\n// let dropdown_cur_app=null;\r\n// this.state.apps.dropdown.forEach((app)=>{\r\n// if(app[0]===cur_id)\r\n// dropdown_cur_app=app;\r\n// });\r\n//\r\n// //console.log(JSON.stringify(this.state.apps));\r\n//\r\n// return (\r\n// \r\n//
PKUHelper \r\n// {this.state.apps.bar.map((app)=>\r\n// app_elem(app)\r\n// )}\r\n// {!!this.state.apps.dropdown.length &&\r\n//
\r\n//
\r\n// {!!dropdown_cur_app ?\r\n// app_elem((()=>{\r\n// let [id,title,_url,icon_normal,icon_hover,_new_tab]=dropdown_cur_app;\r\n// return [id,title+'▾',null,icon_normal,icon_hover,false];\r\n// })(),true) :\r\n// app_elem(['-placeholder-elem','更多▾',null,appicon_dropdown,appicon_dropdown_rev,false],true)\r\n// }\r\n//
\r\n// {this.state.apps.dropdown.map((app)=>{\r\n// let ref=React.createRef();\r\n// return (\r\n//
{\r\n// if(!e.target.closest('a') && ref.current)\r\n// ref.current.click();\r\n// }}>\r\n// {app_elem(app,true,ref)}\r\n//
\r\n// );\r\n// })}\r\n//
\r\n// }\r\n//
网页版 \r\n//
\r\n// );\r\n// }\r\n// }\r\n\r\nclass LoginPopupSelf extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n loading_status: 'idle',\r\n // excluded_scopes: [],\r\n };\r\n this.username_ref=React.createRef();\r\n this.password_ref=React.createRef();\r\n this.input_token_ref=React.createRef();\r\n\r\n this.popup_anchor=document.getElementById(LOGIN_POPUP_ANCHOR_ID);\r\n if(!this.popup_anchor) {\r\n this.popup_anchor=document.createElement('div');\r\n this.popup_anchor.id=LOGIN_POPUP_ANCHOR_ID;\r\n document.body.appendChild(this.popup_anchor);\r\n }\r\n }\r\n\r\n do_sendcode(type) {\r\n if(this.state.loading_status==='loading')\r\n return;\r\n\r\n this.setState({\r\n loading_status: 'loading',\r\n },()=>{\r\n fetch(\r\n THUHOLE_API_ROOT+'api_xmcp/login/send_code'\r\n +'?user='+encodeURIComponent(this.username_ref.current.value)\r\n +'&code_type='+encodeURIComponent(type)\r\n +API_VERSION_PARAM(), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n excluded_scopes: [],\r\n }),\r\n }\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n console.log(json);\r\n if(!json.success)\r\n throw new Error(JSON.stringify(json));\r\n\r\n alert(json.msg);\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n alert('发送失败\\n'+e);\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n });\r\n\r\n });\r\n }\r\n\r\n do_login(set_token) {\r\n if(this.state.loading_status==='loading')\r\n return;\r\n\r\n this.setState({\r\n loading_status: 'loading',\r\n },()=>{\r\n fetch(\r\n THUHOLE_API_ROOT+'api_xmcp/login/login'\r\n +'?user='+encodeURIComponent(this.username_ref.current.value)\r\n +'&valid_code='+encodeURIComponent(this.password_ref.current.value)\r\n +API_VERSION_PARAM(), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n excluded_scopes: [],\r\n }),\r\n }\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) throw new Error(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n\r\n set_token(json.user_token);\r\n alert(`登录成功`);\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n this.props.on_close();\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n alert('登录失败\\n'+e);\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n });\r\n });\r\n }\r\n\r\n do_input_token(set_token) {\r\n if(this.state.loading_status==='loading')\r\n return;\r\n\r\n let token=this.input_token_ref.current.value;\r\n this.setState({\r\n loading_status: 'loading',\r\n },()=>{\r\n fetch(THUHOLE_API_ROOT+'api_xmcp/hole/system_msg?user_token='+encodeURIComponent(token)+API_VERSION_PARAM())\r\n .then((res)=>res.json())\r\n .then((json)=>{\r\n if(json.error)\r\n throw new Error(json.error);\r\n if(json.result.length===0)\r\n throw new Error('result check failed');\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n set_token(token);\r\n this.props.on_close();\r\n })\r\n .catch((e)=>{\r\n alert('Token检验失败\\n'+e);\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n console.error(e);\r\n });\r\n });\r\n }\r\n\r\n // perm_alert() {\r\n // alert('如果你不需要 PKU Helper 的某项功能,可以取消相应权限。\\n其中【状态信息】包括你的网费、校园卡余额等。\\n该设置应用到你的【所有】设备,取消后如需再次启用相应功能需要重新登录。');\r\n // }\r\n\r\n render() {\r\n // let PERM_SCOPES=[\r\n // ['score','成绩查询'],\r\n // ['syllabus','课表查询'],\r\n // ['my_info','状态信息'],\r\n // ];\r\n\r\n return ReactDOM.createPortal(\r\n ,\r\n this.popup_anchor,\r\n );\r\n }\r\n}\r\n\r\nexport class LoginPopup extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n popup_show: false,\r\n };\r\n this.on_popup_bound=this.on_popup.bind(this);\r\n this.on_close_bound=this.on_close.bind(this);\r\n }\r\n\r\n on_popup() {\r\n this.setState({\r\n popup_show: true,\r\n });\r\n }\r\n on_close() {\r\n this.setState({\r\n popup_show: false,\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n {this.props.children(this.on_popup_bound)}\r\n {this.state.popup_show &&\r\n \r\n }\r\n >\r\n );\r\n }\r\n}","const HOLE_CACHE_DB_NAME='hole_cache_db';\r\nconst CACHE_DB_VER=1;\r\nconst MAINTENANCE_STEP=150;\r\nconst MAINTENANCE_COUNT=1000;\r\n\r\nconst ENC_KEY=42;\r\n\r\nclass Cache {\r\n constructor() {\r\n this.db=null;\r\n this.added_items_since_maintenance=0;\r\n this.encrypt=this.encrypt.bind(this);\r\n this.decrypt=this.decrypt.bind(this);\r\n const open_req=indexedDB.open(HOLE_CACHE_DB_NAME,CACHE_DB_VER);\r\n open_req.onerror=console.error.bind(console);\r\n open_req.onupgradeneeded=(event)=>{\r\n console.log('comment cache db upgrade');\r\n const db=event.target.result;\r\n const store=db.createObjectStore('comment',{\r\n keyPath: 'pid',\r\n });\r\n store.createIndex('last_access','last_access',{unique: false});\r\n };\r\n open_req.onsuccess=(event)=>{\r\n console.log('comment cache db loaded');\r\n this.db=event.target.result;\r\n setTimeout(this.maintenance.bind(this),1);\r\n };\r\n }\r\n\r\n // use window.hole_cache.encrypt() only after cache is loaded!\r\n encrypt(pid,data) {\r\n let s=JSON.stringify(data);\r\n let o='';\r\n for(let i=0,key=(ENC_KEY^pid)%128;i{\r\n if(!this.db)\r\n return resolve(null);\r\n const tx=this.db.transaction(['comment'],'readwrite');\r\n const store=tx.objectStore('comment');\r\n const get_req=store.get(pid);\r\n get_req.onsuccess=()=>{\r\n let res=get_req.result;\r\n if(!res || !res.data_str) {\r\n //console.log('comment cache miss '+pid);\r\n resolve(null);\r\n } else if(target_version===res.version) { // hit\r\n console.log('comment cache hit',pid);\r\n res.last_access=(+new Date());\r\n store.put(res);\r\n let data=this.decrypt(pid,res.data_str);\r\n resolve(data); // obj or null\r\n } else { // expired\r\n console.log('comment cache expired',pid,': ver',res.version,'target',target_version);\r\n store.delete(pid);\r\n resolve(null);\r\n }\r\n };\r\n get_req.onerror=(e)=>{\r\n console.warn('comment cache indexeddb open failed');\r\n console.error(e);\r\n resolve(null);\r\n };\r\n });\r\n }\r\n\r\n put(pid,target_version,data) {\r\n pid=parseInt(pid);\r\n return new Promise((resolve,reject)=>{\r\n if(!this.db)\r\n return resolve();\r\n const tx=this.db.transaction(['comment'],'readwrite');\r\n const store=tx.objectStore('comment');\r\n store.put({\r\n pid: pid,\r\n version: target_version,\r\n data_str: this.encrypt(pid,data),\r\n last_access: +new Date(),\r\n });\r\n if(++this.added_items_since_maintenance===MAINTENANCE_STEP)\r\n setTimeout(this.maintenance.bind(this),1);\r\n });\r\n }\r\n\r\n delete(pid) {\r\n pid=parseInt(pid);\r\n return new Promise((resolve,reject)=>{\r\n if(!this.db)\r\n return resolve();\r\n const tx=this.db.transaction(['comment'],'readwrite');\r\n const store=tx.objectStore('comment');\r\n let req=store.delete(pid);\r\n //console.log('comment cache delete',pid);\r\n req.onerror=()=>{\r\n console.warn('comment cache delete failed ',pid);\r\n return resolve();\r\n };\r\n req.onsuccess=()=>resolve();\r\n });\r\n }\r\n\r\n maintenance() {\r\n if(!this.db)\r\n return;\r\n const tx=this.db.transaction(['comment'],'readwrite');\r\n const store=tx.objectStore('comment');\r\n let count_req=store.count();\r\n count_req.onsuccess=()=>{\r\n let count=count_req.result;\r\n if(count>MAINTENANCE_COUNT) {\r\n console.log('comment cache db maintenance',count);\r\n store.index('last_access').openKeyCursor().onsuccess=(e)=>{\r\n let cur=e.target.result;\r\n if(cur) {\r\n //console.log('maintenance: delete',cur);\r\n store.delete(cur.primaryKey);\r\n if(--count>MAINTENANCE_COUNT)\r\n cur.continue();\r\n }\r\n };\r\n } else {\r\n console.log('comment cache db no need to maintenance',count);\r\n }\r\n this.added_items_since_maintenance=0;\r\n };\r\n count_req.onerror=console.error.bind(console);\r\n }\r\n\r\n clear() {\r\n if(!this.db)\r\n return;\r\n indexedDB.deleteDatabase(HOLE_CACHE_DB_NAME);\r\n console.log('delete comment cache db');\r\n }\r\n};\r\n\r\nexport function cache() {\r\n if(!window.hole_cache)\r\n window.hole_cache=new Cache();\r\n return window.hole_cache;\r\n}","import {get_json, API_VERSION_PARAM} from './infrastructure/functions';\r\nimport {THUHOLE_API_ROOT} from './infrastructure/const';\r\nimport {API_BASE} from './Common';\r\nimport {cache} from './cache';\r\n\r\nexport {THUHOLE_API_ROOT, API_VERSION_PARAM};\r\n\r\nexport function token_param(token) {\r\n return API_VERSION_PARAM()+(token ? ('&user_token='+token) : '');\r\n}\r\n\r\nexport {get_json};\r\n\r\nconst SEARCH_PAGESIZE=50;\r\n\r\nexport const API={\r\n load_replies: (pid,token,color_picker,cache_version)=>{\r\n pid=parseInt(pid);\r\n return fetch(\r\n API_BASE+'/api.php?action=getcomment'+\r\n '&pid='+pid+\r\n token_param(token)\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) throw new Error(json.msg);\r\n else throw new Error(JSON.stringify(json));\r\n }\r\n\r\n cache().delete(pid).then(()=>{\r\n cache().put(pid,cache_version,json);\r\n });\r\n\r\n // also change load_replies_with_cache!\r\n json.data=json.data\r\n .sort((a,b)=>{\r\n return parseInt(a.cid,10)-parseInt(b.cid,10);\r\n })\r\n .map((info)=>{\r\n info._display_color=color_picker.get(info.name);\r\n info.variant={};\r\n return info;\r\n });\r\n\r\n return json;\r\n });\r\n },\r\n\r\n load_replies_with_cache: (pid,token,color_picker,cache_version)=> {\r\n pid=parseInt(pid);\r\n return cache().get(pid,cache_version)\r\n .then((json)=>{\r\n if(json) {\r\n // also change load_replies!\r\n json.data=json.data\r\n .sort((a,b)=>{\r\n return parseInt(a.cid,10)-parseInt(b.cid,10);\r\n })\r\n .map((info)=>{\r\n info._display_color=color_picker.get(info.name);\r\n info.variant={};\r\n return info;\r\n });\r\n\r\n return json;\r\n }\r\n else\r\n return API.load_replies(pid,token,color_picker,cache_version);\r\n });\r\n },\r\n\r\n set_attention: (pid,attention,token)=>{\r\n let data=new URLSearchParams();\r\n data.append('user_token',token);\r\n data.append('pid',pid);\r\n data.append('switch',attention ? '1' : '0');\r\n return fetch(API_BASE+'/api.php?action=attention'+token_param(token), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n body: data,\r\n })\r\n .then(get_json)\r\n .then((json)=>{\r\n cache().delete(pid);\r\n if(json.code!==0) {\r\n if(json.msg && json.msg==='已经关注过了') {}\r\n else {\r\n if(json.msg) alert(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n }\r\n return json;\r\n });\r\n },\r\n\r\n report: (pid,reason,token)=>{\r\n let data=new URLSearchParams();\r\n data.append('user_token',token);\r\n data.append('pid',pid);\r\n data.append('reason',reason);\r\n return fetch(API_BASE+'/api.php?action=report'+token_param(token), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n body: data,\r\n })\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) alert(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n return json;\r\n });\r\n },\r\n\r\n get_list: (page,token)=>{\r\n return fetch(\r\n API_BASE+'/api.php?action=getlist'+\r\n '&p='+page+\r\n token_param(token)\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0)\r\n throw new Error(JSON.stringify(json));\r\n return json;\r\n });\r\n },\r\n\r\n get_search: (page,keyword,token)=>{\r\n return fetch(\r\n API_BASE+'/api.php?action=search'+\r\n '&pagesize='+SEARCH_PAGESIZE+\r\n '&page='+page+\r\n '&keywords='+encodeURIComponent(keyword)+\r\n token_param(token)\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) throw new Error(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n return json;\r\n });\r\n },\r\n\r\n get_single: (pid,token)=>{\r\n return fetch(\r\n API_BASE+'/api.php?action=getone'+\r\n '&pid='+pid+\r\n token_param(token)\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) throw new Error(json.msg);\r\n else throw new Error(JSON.stringify(json));\r\n }\r\n return json;\r\n });\r\n },\r\n\r\n get_attention: (token)=>{\r\n return fetch(\r\n API_BASE+'/api.php?action=getattention'+\r\n token_param(token)\r\n )\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) throw new Error(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n return json;\r\n });\r\n },\r\n};","import React, {Component, PureComponent} from 'react';\r\nimport {format_time,Time,TitleLine} from './infrastructure/widgets';\r\nimport {THUHOLE_API_ROOT} from './flows_api';\r\n\r\nimport './Common.css';\r\n\r\nexport {format_time,Time,TitleLine};\r\n\r\nexport const API_BASE=THUHOLE_API_ROOT+'services/thuhole';\r\n\r\n// https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\r\nfunction escape_regex(string) {\r\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\r\n}\r\n\r\nexport function build_highlight_re(txt,split,option='g') {\r\n return txt ? new RegExp(`(${txt.split(split).filter((x)=>!!x).map(escape_regex).join('|')})`,option) : /^$/g;\r\n}\r\n\r\nexport function ColoredSpan(props) {\r\n return (\r\n {props.children} \r\n )\r\n}\r\n\r\nexport class HighlightedText extends PureComponent {\r\n render() {\r\n function normalize_url(url) {\r\n return /^https?:\\/\\//.test(url) ? url : 'http://'+url;\r\n }\r\n return (\r\n \r\n {this.props.parts.map((part,idx)=>{\r\n let [rule,p]=part;\r\n return (\r\n {\r\n rule==='url_pid' ? /## :\r\n rule==='url' ? {p} :\r\n rule==='pid' ? {e.preventDefault(); this.props.show_pid(p.substring(1));}}>{p} :\r\n rule==='nickname' ? {p} :\r\n rule==='search' ? {p} :\r\n p\r\n } \r\n );\r\n })}\r\n \r\n )\r\n }\r\n}\r\n\r\nwindow.TEXTAREA_BACKUP={};\r\n\r\nexport class SafeTextarea extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n text: '',\r\n };\r\n this.on_change_bound=this.on_change.bind(this);\r\n this.on_keydown_bound=this.on_keydown.bind(this);\r\n this.clear=this.clear.bind(this);\r\n this.area_ref=React.createRef();\r\n this.change_callback=props.on_change||(()=>{});\r\n this.submit_callback=props.on_submit||(()=>{});\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({\r\n text: window.TEXTAREA_BACKUP[this.props.id]||''\r\n },()=>{\r\n this.change_callback(this.state.text);\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n window.TEXTAREA_BACKUP[this.props.id]=this.state.text;\r\n this.change_callback(this.state.text);\r\n }\r\n\r\n on_change(event) {\r\n this.setState({\r\n text: event.target.value,\r\n });\r\n this.change_callback(event.target.value);\r\n }\r\n on_keydown(event) {\r\n if(event.key==='Enter' && event.ctrlKey && !event.altKey) {\r\n event.preventDefault();\r\n this.submit_callback();\r\n }\r\n }\r\n\r\n clear() {\r\n this.setState({\r\n text: '',\r\n });\r\n }\r\n set(text) {\r\n this.change_callback(text);\r\n this.setState({\r\n text: text,\r\n });\r\n }\r\n get() {\r\n return this.state.text;\r\n }\r\n focus() {\r\n this.area_ref.current.focus();\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nlet pwa_prompt_event=null;\r\nwindow.addEventListener('beforeinstallprompt', (e) => {\r\n console.log('pwa: received before install prompt');\r\n pwa_prompt_event=e;\r\n});\r\n\r\nexport function PromotionBar(props) {\r\n let is_ios=/iPhone|iPad|iPod/i.test(window.navigator.userAgent);\r\n let is_installed=(window.matchMedia('(display-mode: standalone)').matches) || (window.navigator.standalone);\r\n\r\n if(is_installed)\r\n return null;\r\n\r\n if(is_ios)\r\n // noinspection JSConstructorReturnsPrimitive\r\n return !navigator.standalone ? (\r\n \r\n \r\n 用 Safari 把树洞 添加到主屏幕 更好用\r\n
\r\n ) : null;\r\n else\r\n // noinspection JSConstructorReturnsPrimitive\r\n return pwa_prompt_event ? (\r\n \r\n ) : null;\r\n}\r\n\r\nexport class ClickHandler extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n moved: true,\r\n init_y: 0,\r\n init_x: 0,\r\n };\r\n this.on_begin_bound=this.on_begin.bind(this);\r\n this.on_move_bound=this.on_move.bind(this);\r\n this.on_end_bound=this.on_end.bind(this);\r\n\r\n this.MOVE_THRESHOLD=3;\r\n this.last_fire=0;\r\n }\r\n\r\n on_begin(e) {\r\n //console.log('click',(e.touches?e.touches[0]:e).screenY,(e.touches?e.touches[0]:e).screenX);\r\n this.setState({\r\n moved: false,\r\n init_y: (e.touches?e.touches[0]:e).screenY,\r\n init_x: (e.touches?e.touches[0]:e).screenX,\r\n });\r\n }\r\n on_move(e) {\r\n if(!this.state.moved) {\r\n let mvmt=Math.abs((e.touches?e.touches[0]:e).screenY-this.state.init_y)+Math.abs((e.touches?e.touches[0]:e).screenX-this.state.init_x);\r\n //console.log('move',mvmt);\r\n if(mvmt>this.MOVE_THRESHOLD)\r\n this.setState({\r\n moved: true,\r\n });\r\n }\r\n }\r\n on_end(event) {\r\n //console.log('end');\r\n if(!this.state.moved)\r\n this.do_callback(event);\r\n this.setState({\r\n moved: true,\r\n });\r\n }\r\n\r\n do_callback(event) {\r\n if(this.last_fire+100>+new Date()) return;\r\n this.last_fire=+new Date();\r\n this.props.callback(event);\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n {this.props.children}\r\n
\r\n )\r\n }\r\n}","export function on(el, eventName, callback, opts) {\r\n opts = opts || false;\r\n if (el.addEventListener) {\r\n el.addEventListener(eventName, callback, opts);\r\n } else if (el.attachEvent) {\r\n el.attachEvent(`on${eventName}`, (e) => {\r\n callback.call(el, e || window.event);\r\n });\r\n }\r\n}\r\n\r\nexport function off(el, eventName, callback, opts) {\r\n opts = opts || false;\r\n if (el.removeEventListener) {\r\n el.removeEventListener(eventName, callback, opts);\r\n } else if (el.detachEvent) {\r\n el.detachEvent(`on${eventName}`, callback);\r\n }\r\n}\r\n","/**\r\n * @fileOverview Find scroll parent\r\n */\r\n\r\nexport default (node) => {\r\n if (!(node instanceof HTMLElement)) {\r\n return document.documentElement;\r\n }\r\n\r\n const excludeStaticParent = node.style.position === 'absolute';\r\n const overflowRegex = /(scroll|auto)/;\r\n let parent = node;\r\n\r\n while (parent) {\r\n if (!parent.parentNode) {\r\n return node.ownerDocument || document.documentElement;\r\n }\r\n\r\n const style = window.getComputedStyle(parent);\r\n const position = style.position;\r\n const overflow = style.overflow;\r\n const overflowX = style['overflow-x'];\r\n const overflowY = style['overflow-y'];\r\n\r\n if (position === 'static' && excludeStaticParent) {\r\n parent = parent.parentNode;\r\n continue;\r\n }\r\n\r\n if (overflowRegex.test(overflow) && overflowRegex.test(overflowX) && overflowRegex.test(overflowY)) {\r\n return parent;\r\n }\r\n\r\n parent = parent.parentNode;\r\n }\r\n\r\n return node.ownerDocument || node.documentElement || document.documentElement;\r\n};\r\n","/**\r\n * react-lazyload\r\n */\r\nimport React, { Component, PureComponent } from 'react';\r\nimport ReactDom from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { on, off } from './utils/event';\r\nimport scrollParent from './utils/scrollParent';\r\nimport debounce from './utils/debounce';\r\nimport throttle from './utils/throttle';\r\n\r\nconst defaultBoundingClientRect = { top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0 };\r\nconst LISTEN_FLAG = 'data-lazyload-listened';\r\nconst listeners = [];\r\nlet pending = [];\r\n\r\n// try to handle passive events\r\nlet passiveEventSupported = false;\r\ntry {\r\n const opts = Object.defineProperty({}, 'passive', {\r\n get() {\r\n passiveEventSupported = true;\r\n }\r\n });\r\n window.addEventListener('test', null, opts);\r\n}\r\ncatch (e) { }\r\n// if they are supported, setup the optional params\r\n// IMPORTANT: FALSE doubles as the default CAPTURE value!\r\nconst passiveEvent = passiveEventSupported ? { capture: false, passive: true } : false;\r\n\r\n\r\n/**\r\n * Check if `component` is visible in overflow container `parent`\r\n * @param {node} component React component\r\n * @param {node} parent component's scroll parent\r\n * @return {bool}\r\n */\r\nconst checkOverflowVisible = function checkOverflowVisible(component, parent) {\r\n const node = ReactDom.findDOMNode(component);\r\n\r\n let parentTop;\r\n let parentHeight;\r\n\r\n try {\r\n ({ top: parentTop, height: parentHeight } = parent.getBoundingClientRect());\r\n } catch (e) {\r\n ({ top: parentTop, height: parentHeight } = defaultBoundingClientRect);\r\n }\r\n\r\n const windowInnerHeight = window.innerHeight || document.documentElement.clientHeight;\r\n\r\n // calculate top and height of the intersection of the element's scrollParent and viewport\r\n const intersectionTop = Math.max(parentTop, 0); // intersection's top relative to viewport\r\n const intersectionHeight = Math.min(windowInnerHeight, parentTop + parentHeight) - intersectionTop; // height\r\n\r\n // check whether the element is visible in the intersection\r\n let top;\r\n let height;\r\n\r\n try {\r\n ({ top, height } = node.getBoundingClientRect());\r\n } catch (e) {\r\n ({ top, height } = defaultBoundingClientRect);\r\n }\r\n\r\n const offsetTop = top - intersectionTop; // element's top relative to intersection\r\n\r\n const offsets = Array.isArray(component.props.offset) ?\r\n component.props.offset :\r\n [component.props.offset, component.props.offset]; // Be compatible with previous API\r\n\r\n return (offsetTop - offsets[0] <= intersectionHeight) &&\r\n (offsetTop + height + offsets[1] >= 0);\r\n};\r\n\r\n/**\r\n * Check if `component` is visible in document\r\n * @param {node} component React component\r\n * @return {bool}\r\n */\r\nconst checkNormalVisible = function checkNormalVisible(component) {\r\n const node = ReactDom.findDOMNode(component);\r\n\r\n // If this element is hidden by css rules somehow, it's definitely invisible\r\n if (!(node.offsetWidth || node.offsetHeight || node.getClientRects().length)) return false;\r\n\r\n let top;\r\n let elementHeight;\r\n\r\n try {\r\n ({ top, height: elementHeight } = node.getBoundingClientRect());\r\n } catch (e) {\r\n ({ top, height: elementHeight } = defaultBoundingClientRect);\r\n }\r\n\r\n const windowInnerHeight = window.innerHeight || document.documentElement.clientHeight;\r\n\r\n const offsets = Array.isArray(component.props.offset) ?\r\n component.props.offset :\r\n [component.props.offset, component.props.offset]; // Be compatible with previous API\r\n\r\n return (top - offsets[0] <= windowInnerHeight) &&\r\n (top + elementHeight + offsets[1] >= 0);\r\n};\r\n\r\n\r\n/**\r\n * Detect if element is visible in viewport, if so, set `visible` state to true.\r\n * If `once` prop is provided true, remove component as listener after checkVisible\r\n *\r\n * @param {React} component React component that respond to scroll and resize\r\n */\r\nconst checkVisible = function checkVisible(component) {\r\n const node = ReactDom.findDOMNode(component);\r\n if (!(node instanceof HTMLElement)) {\r\n return;\r\n }\r\n\r\n const parent = scrollParent(node);\r\n const isOverflow = component.props.overflow &&\r\n parent !== node.ownerDocument &&\r\n parent !== document &&\r\n parent !== document.documentElement;\r\n const visible = isOverflow ?\r\n checkOverflowVisible(component, parent) :\r\n checkNormalVisible(component);\r\n if (visible) {\r\n // Avoid extra render if previously is visible\r\n if (!component.state.visible || component.state.hidden) {\r\n if (component.props.once) {\r\n pending.push(component);\r\n }\r\n\r\n //console.log('lazyload 1');\r\n component.setState({\r\n visible: true,\r\n hidden: false,\r\n });\r\n }\r\n } else if (!component.props.once) {\r\n if (component.props.unmountIfInvisible) {\r\n if(component.visible===true)\r\n component.setState({\r\n visible: false,\r\n });\r\n } else if(component.props.hiddenIfInvisible) {\r\n if(component.state.hidden===false) {\r\n //console.log('lazyload 3');\r\n component.setState({\r\n hidden: true,\r\n });\r\n }\r\n }\r\n }\r\n};\r\n\r\n\r\nconst purgePending = function purgePending() {\r\n pending.forEach((component) => {\r\n const index = listeners.indexOf(component);\r\n if (index !== -1) {\r\n listeners.splice(index, 1);\r\n }\r\n });\r\n\r\n pending = [];\r\n};\r\n\r\nconst lazyLoadHandler = () => {\r\n for (let i = 0; i < listeners.length; ++i) {\r\n const listener = listeners[i];\r\n checkVisible(listener);\r\n }\r\n // Remove `once` component in listeners\r\n purgePending();\r\n};\r\n\r\n// Depending on component's props\r\nlet delayType;\r\nlet finalLazyLoadHandler = null;\r\n\r\nconst isString = string => typeof string === 'string';\r\n\r\nclass LazyLoad extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state={\r\n visible: false,\r\n hidden: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n // It's unlikely to change delay type on the fly, this is mainly\r\n // designed for tests\r\n let scrollport = window;\r\n const {\r\n scrollContainer,\r\n } = this.props;\r\n if (scrollContainer) {\r\n if (isString(scrollContainer)) {\r\n scrollport = scrollport.document.querySelector(scrollContainer);\r\n }\r\n }\r\n const needResetFinalLazyLoadHandler = (this.props.debounce !== undefined && delayType === 'throttle')\r\n || (delayType === 'debounce' && this.props.debounce === undefined);\r\n\r\n if (needResetFinalLazyLoadHandler) {\r\n off(scrollport, 'scroll', finalLazyLoadHandler, passiveEvent);\r\n off(window, 'resize', finalLazyLoadHandler, passiveEvent);\r\n finalLazyLoadHandler = null;\r\n }\r\n\r\n if (!finalLazyLoadHandler) {\r\n if (this.props.debounce !== undefined) {\r\n finalLazyLoadHandler = debounce(lazyLoadHandler, typeof this.props.debounce === 'number' ?\r\n this.props.debounce :\r\n 300);\r\n delayType = 'debounce';\r\n } else if (this.props.throttle !== undefined) {\r\n finalLazyLoadHandler = throttle(lazyLoadHandler, typeof this.props.throttle === 'number' ?\r\n this.props.throttle :\r\n 300);\r\n delayType = 'throttle';\r\n } else {\r\n finalLazyLoadHandler = lazyLoadHandler;\r\n }\r\n }\r\n\r\n if (this.props.overflow) {\r\n const parent = scrollParent(ReactDom.findDOMNode(this));\r\n if (parent && typeof parent.getAttribute === 'function') {\r\n const listenerCount = 1 + (+parent.getAttribute(LISTEN_FLAG));\r\n if (listenerCount === 1) {\r\n parent.addEventListener('scroll', finalLazyLoadHandler, passiveEvent);\r\n }\r\n parent.setAttribute(LISTEN_FLAG, listenerCount);\r\n }\r\n } else if (listeners.length === 0 || needResetFinalLazyLoadHandler) {\r\n const { scroll, resize } = this.props;\r\n\r\n if (scroll) {\r\n on(scrollport, 'scroll', finalLazyLoadHandler, passiveEvent);\r\n }\r\n\r\n if (resize) {\r\n on(window, 'resize', finalLazyLoadHandler, passiveEvent);\r\n }\r\n }\r\n\r\n listeners.push(this);\r\n checkVisible(this);\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this.props.overflow) {\r\n const parent = scrollParent(ReactDom.findDOMNode(this));\r\n if (parent && typeof parent.getAttribute === 'function') {\r\n const listenerCount = (+parent.getAttribute(LISTEN_FLAG)) - 1;\r\n if (listenerCount === 0) {\r\n parent.removeEventListener('scroll', finalLazyLoadHandler, passiveEvent);\r\n parent.removeAttribute(LISTEN_FLAG);\r\n } else {\r\n parent.setAttribute(LISTEN_FLAG, listenerCount);\r\n }\r\n }\r\n }\r\n\r\n const index = listeners.indexOf(this);\r\n if (index !== -1) {\r\n listeners.splice(index, 1);\r\n }\r\n\r\n if (listeners.length === 0 && typeof window !== 'undefined') {\r\n off(window, 'resize', finalLazyLoadHandler, passiveEvent);\r\n off(window, 'scroll', finalLazyLoadHandler, passiveEvent);\r\n }\r\n }\r\n\r\n render() {\r\n //console.log('lazyload render');\r\n if(this.state.visible) {\r\n if(this.props.hiddenIfInvisible)\r\n return this.state.hidden ?\r\n {this.props.children}
:\r\n {this.props.children}
;\r\n else\r\n return this.props.children;\r\n }\r\n else\r\n return this.props.placeholder ?\r\n this.props.placeholder :\r\n
;\r\n }\r\n}\r\n\r\nLazyLoad.propTypes = {\r\n once: PropTypes.bool,\r\n height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\r\n offset: PropTypes.oneOfType([PropTypes.number, PropTypes.arrayOf(PropTypes.number)]),\r\n overflow: PropTypes.bool,\r\n resize: PropTypes.bool,\r\n scroll: PropTypes.bool,\r\n children: PropTypes.node,\r\n throttle: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\r\n debounce: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\r\n placeholder: PropTypes.node,\r\n scrollContainer: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n unmountIfInvisible: PropTypes.bool,\r\n hiddenIfInvisible: PropTypes.bool,\r\n};\r\n\r\nLazyLoad.defaultProps = {\r\n once: false,\r\n offset: 0,\r\n overflow: false,\r\n resize: false,\r\n scroll: true,\r\n unmountIfInvisible: false,\r\n hiddenIfInvisible: false,\r\n};\r\n\r\nconst getDisplayName = WrappedComponent => WrappedComponent.displayName || WrappedComponent.name || 'Component';\r\n\r\nconst decorator = (options = {}) => function lazyload(WrappedComponent) {\r\n return class LazyLoadDecorated extends Component {\r\n constructor() {\r\n super();\r\n this.displayName = `LazyLoad${getDisplayName(WrappedComponent)}`;\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n };\r\n};\r\n\r\nexport { decorator as lazyload };\r\nexport default LazyLoad;\r\nexport { lazyLoadHandler as forceCheck };\r\n","export default function debounce(func, wait, immediate) {\r\n let timeout;\r\n let args;\r\n let context;\r\n let timestamp;\r\n let result;\r\n\r\n const later = function later() {\r\n const last = +(new Date()) - timestamp;\r\n\r\n if (last < wait && last >= 0) {\r\n timeout = setTimeout(later, wait - last);\r\n } else {\r\n timeout = null;\r\n if (!immediate) {\r\n result = func.apply(context, args);\r\n if (!timeout) {\r\n context = null;\r\n args = null;\r\n }\r\n }\r\n }\r\n };\r\n\r\n return function debounced() {\r\n context = this;\r\n args = arguments;\r\n timestamp = +(new Date());\r\n\r\n const callNow = immediate && !timeout;\r\n if (!timeout) {\r\n timeout = setTimeout(later, wait);\r\n }\r\n\r\n if (callNow) {\r\n result = func.apply(context, args);\r\n context = null;\r\n args = null;\r\n }\r\n\r\n return result;\r\n };\r\n}\r\n","/*eslint-disable */\r\nexport default function throttle(fn, threshhold, scope) {\r\n threshhold || (threshhold = 250);\r\n var last,\r\n deferTimer;\r\n return function () {\r\n var context = scope || this;\r\n\r\n var now = +new Date,\r\n args = arguments;\r\n if (last && now < last + threshhold) {\r\n // hold on to it\r\n clearTimeout(deferTimer);\r\n deferTimer = setTimeout(function () {\r\n last = now;\r\n fn.apply(context, args);\r\n }, threshhold);\r\n } else {\r\n last = now;\r\n fn.apply(context, args);\r\n }\r\n };\r\n}\r\n","import React, {Component} from 'react';\r\nimport load from 'load-script';\r\n\r\nwindow.audio_cache={};\r\n\r\nfunction load_amrnb() {\r\n return new Promise((resolve,reject)=>{\r\n if(window.AMR)\r\n resolve();\r\n else\r\n load('static/amr_all.min.js', (err)=>{\r\n if(err)\r\n reject(err);\r\n else\r\n resolve();\r\n });\r\n });\r\n}\r\n\r\nexport class AudioWidget extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n url: this.props.src,\r\n state: 'waiting',\r\n data: null,\r\n };\r\n }\r\n\r\n load() {\r\n if(window.audio_cache[this.state.url]) {\r\n this.setState({\r\n state: 'loaded',\r\n data: window.audio_cache[this.state.url],\r\n });\r\n return;\r\n }\r\n\r\n console.log('fetching audio',this.state.url);\r\n this.setState({\r\n state: 'loading',\r\n });\r\n Promise.all([\r\n fetch(this.state.url),\r\n load_amrnb(),\r\n ])\r\n .then((res)=>{\r\n res[0].blob().then((blob)=>{\r\n const reader=new FileReader();\r\n reader.onload=(event)=>{\r\n const raw=new window.AMR().decode(event.target.result);\r\n if(!raw) {\r\n alert('audio decoding failed');\r\n return;\r\n }\r\n const wave=window.PCMData.encode({\r\n sampleRate: 8000,\r\n channelCount: 1,\r\n bytesPerSample: 2,\r\n data: raw\r\n });\r\n const binary_wave=new Uint8Array(wave.length);\r\n for(let i=0;i加载音频 );\r\n if(this.state.state==='loading')\r\n return (正在下载……
);\r\n else if(this.state.state==='decoding')\r\n return (正在解码……
);\r\n else if(this.state.state==='loaded')\r\n return (
);\r\n }\r\n}","import React, {Component, PureComponent} from 'react';\r\n\r\nimport './Config.css';\r\n\r\nconst BUILTIN_IMGS={\r\n 'static/bg/gbp.jpg': '寻觅繁星(默认)',\r\n 'static/bg/eriri.jpg': '平成著名画师',\r\n 'static/bg/yurucamp.jpg': '露营天下第一',\r\n 'static/bg/minecraft.jpg': '麦恩·库拉夫特',\r\n 'static/bg/cyberpunk.jpg': '赛博城市',\r\n 'static/bg/sif.jpg': '梦开始的地方',\r\n};\r\n\r\nconst DEFAULT_CONFIG={\r\n background_img: 'static/bg/gbp.jpg',\r\n background_color: '#113366',\r\n pressure: false,\r\n easter_egg: true,\r\n color_scheme: 'default',\r\n};\r\n\r\nexport function load_config() {\r\n let config=Object.assign({},DEFAULT_CONFIG);\r\n let loaded_config;\r\n try {\r\n loaded_config=JSON.parse(localStorage['hole_config']||'{}');\r\n } catch(e) {\r\n alert('设置加载失败,将重置为默认设置!\\n'+e);\r\n delete localStorage['hole_config'];\r\n loaded_config={};\r\n }\r\n\r\n // unrecognized configs are removed\r\n Object.keys(loaded_config).forEach((key)=>{\r\n if(config[key]!==undefined)\r\n config[key]=loaded_config[key];\r\n });\r\n\r\n console.log('config loaded',config);\r\n window.config=config;\r\n}\r\nexport function save_config() {\r\n localStorage['hole_config']=JSON.stringify(window.config);\r\n load_config();\r\n}\r\n\r\nexport function bgimg_style(img,color) {\r\n if(img===undefined) img=window.config.background_img;\r\n if(color===undefined) color=window.config.background_color;\r\n return {\r\n background: 'transparent center center',\r\n backgroundImage: img===null ? 'unset' : 'url(\"'+encodeURI(img)+'\")',\r\n backgroundColor: color,\r\n backgroundSize: 'cover',\r\n };\r\n}\r\n\r\nclass ConfigBackground extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n img: window.config.background_img,\r\n color: window.config.background_color,\r\n };\r\n }\r\n\r\n save_changes() {\r\n this.props.callback({\r\n background_img: this.state.img,\r\n background_color: this.state.color,\r\n });\r\n }\r\n\r\n on_select(e) {\r\n let value=e.target.value;\r\n this.setState({\r\n img: value==='##other' ? '' :\r\n value==='##color' ? null : value,\r\n },this.save_changes.bind(this));\r\n }\r\n on_change_img(e) {\r\n this.setState({\r\n img: e.target.value,\r\n },this.save_changes.bind(this));\r\n }\r\n on_change_color(e) {\r\n this.setState({\r\n color: e.target.value,\r\n },this.save_changes.bind(this));\r\n }\r\n\r\n render() {\r\n let img_select= this.state.img===null ? '##color' :\r\n Object.keys(BUILTIN_IMGS).indexOf(this.state.img)===-1 ? '##other' : this.state.img;\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nclass ConfigColorScheme extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n color_scheme: window.config.color_scheme,\r\n };\r\n }\r\n\r\n save_changes() {\r\n this.props.callback({\r\n color_scheme: this.state.color_scheme,\r\n });\r\n }\r\n\r\n on_select(e) {\r\n let value=e.target.value;\r\n this.setState({\r\n color_scheme: value,\r\n },this.save_changes.bind(this));\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n
\r\n 夜间模式: \r\n \r\n 跟随系统 \r\n 始终浅色模式 \r\n 始终深色模式 \r\n \r\n #color_scheme \r\n
\r\n
\r\n 选择浅色或深色模式,深色模式下将会调暗图片亮度\r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nclass ConfigSwitch extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n switch: window.config[this.props.id],\r\n };\r\n }\r\n\r\n on_change(e) {\r\n let val=e.target.checked;\r\n this.setState({\r\n switch: val,\r\n },()=>{\r\n this.props.callback({\r\n [this.props.id]: val,\r\n });\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n
\r\n \r\n \r\n {this.props.name} \r\n #{this.props.id} \r\n \r\n
\r\n
\r\n {this.props.description}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport class ConfigUI extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.save_changes_bound=this.save_changes.bind(this);\r\n }\r\n\r\n save_changes(chg) {\r\n console.log(chg);\r\n Object.keys(chg).forEach((key)=>{\r\n window.config[key]=chg[key];\r\n });\r\n save_config();\r\n }\r\n\r\n reset_settings() {\r\n if(window.confirm('重置所有设置?')) {\r\n window.config={};\r\n save_config();\r\n window.location.reload();\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
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n 新功能建议或问题反馈请在 \r\n GitHub \r\n 提出。\r\n
\r\n
\r\n
\r\n )\r\n }\r\n}","import React, {Component, PureComponent} from 'react';\r\nimport {THUHOLE_API_ROOT, get_json, API_VERSION_PARAM} from './flows_api';\r\nimport {Time} from './Common';\r\n\r\nexport class MessageViewer extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n loading_status: 'idle',\r\n msg: [],\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.load();\r\n }\r\n\r\n load() {\r\n if(this.state.loading_status==='loading') return;\r\n this.setState({\r\n loading_status: 'loading',\r\n },()=>{\r\n fetch(THUHOLE_API_ROOT+'api_xmcp/hole/system_msg?user_token='+encodeURIComponent(this.props.token)+API_VERSION_PARAM())\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.error)\r\n throw new Error(json.error);\r\n else\r\n this.setState({\r\n loading_status: 'done',\r\n msg: json.result,\r\n });\r\n })\r\n .catch((err)=>{\r\n console.error(err);\r\n alert(''+err);\r\n this.setState({\r\n loading_status: 'failed',\r\n });\r\n })\r\n\r\n });\r\n }\r\n\r\n render() {\r\n if(this.state.loading_status==='loading')\r\n return (加载中……
);\r\n else if(this.state.loading_status==='failed')\r\n return ();\r\n else if(this.state.loading_status==='done')\r\n return this.state.msg.map((msg)=>(\r\n \r\n
\r\n \r\n {msg.title} \r\n
\r\n
\r\n
\r\n ));\r\n else\r\n return null;\r\n }\r\n}","import React, {Component, PureComponent} from 'react';\r\nimport {API_BASE, SafeTextarea, PromotionBar} from './Common';\r\nimport {MessageViewer} from './Message';\r\nimport {LoginPopup} from './infrastructure/widgets';\r\nimport {ConfigUI} from './Config';\r\nimport fixOrientation from 'fix-orientation';\r\nimport copy from 'copy-to-clipboard';\r\nimport {cache} from './cache';\r\nimport {API_VERSION_PARAM, THUHOLE_API_ROOT, API, get_json, token_param} from './flows_api';\r\n\r\nimport './UserAction.css';\r\n\r\nconst BASE64_RATE=4/3;\r\nconst MAX_IMG_DIAM=8000;\r\nconst MAX_IMG_PX=5000000;\r\nconst MAX_IMG_FILESIZE=450000*BASE64_RATE;\r\n\r\nexport const TokenCtx=React.createContext({\r\n value: null,\r\n set_value: ()=>{},\r\n});\r\n\r\n// class LifeInfoBox extends Component {\r\n// constructor(props) {\r\n// super(props);\r\n// if(!window._life_info_cache)\r\n// window._life_info_cache={};\r\n// this.CACHE_TIMEOUT_S=15;\r\n// this.state={\r\n// today_info: this.cache_get('today_info'),\r\n// card_balance: this.cache_get('card_balance'),\r\n// net_balance: this.cache_get('net_balance'),\r\n// mail_count: this.cache_get('mail_count'),\r\n// };\r\n// this.INTERNAL_NETWORK_FAILURE='_network_failure';\r\n// this.API_NAME={\r\n// today_info: 'hole/today_info',\r\n// card_balance: 'isop/card_balance',\r\n// net_balance: 'isop/net_balance',\r\n// mail_count: 'isop/mail_count',\r\n// };\r\n// }\r\n//\r\n// cache_get(key) {\r\n// let cache_item=window._life_info_cache[key];\r\n// if(!cache_item || (+new Date())-cache_item[0]>1000*this.CACHE_TIMEOUT_S)\r\n// return null;\r\n// else\r\n// return cache_item[1];\r\n// }\r\n// cache_set(key,value) {\r\n// if(!window._life_info_cache[key] || window._life_info_cache[key][1]!==value)\r\n// window._life_info_cache[key]=[+new Date(),value];\r\n// }\r\n//\r\n// load(state_key) {\r\n// this.setState({\r\n// [state_key]: null,\r\n// },()=>{\r\n// fetch(\r\n// PKUHELPER_ROOT+'api_xmcp/'+this.API_NAME[state_key]\r\n// +'?user_token='+encodeURIComponent(this.props.token)\r\n// +API_VERSION_PARAM()\r\n// )\r\n// .then(get_json)\r\n// .then((json)=>{\r\n// //console.log(json);\r\n// this.setState({\r\n// [state_key]: json,\r\n// });\r\n// })\r\n// .catch((e)=>{\r\n// this.setState({\r\n// [state_key]: {\r\n// errMsg: '网络错误 '+e,\r\n// errCode: this.INTERNAL_NETWORK_FAILURE,\r\n// success: false,\r\n// }\r\n// });\r\n// })\r\n// });\r\n// }\r\n//\r\n// componentDidMount() {\r\n// ['today_info','card_balance','net_balance','mail_count'].forEach((k)=>{\r\n// if(!this.state[k])\r\n// this.load(k);\r\n// });\r\n// }\r\n//\r\n// reload_all() {\r\n// ['today_info','card_balance','net_balance','mail_count'].forEach((k)=>{\r\n// this.load(k);\r\n// });\r\n// }\r\n//\r\n// render_line(state_key,title,value_fn,action,url_fn,do_login) {\r\n// let s=this.state[state_key];\r\n// if(!s)\r\n// return (\r\n// \r\n// {title} \r\n// 加载中…… \r\n// \r\n// \r\n// );\r\n// else if(!s.success) {\r\n// let type='加载失败';\r\n// if(s.errCode===this.INTERNAL_NETWORK_FAILURE)\r\n// type='网络错误';\r\n// else if(['E01','E02','E03'].indexOf(s.errCode)!==-1)\r\n// type='授权失效';\r\n//\r\n// let details=JSON.stringify(s);\r\n// if(s.errMsg)\r\n// details=s.errMsg;\r\n// else if(s.error)\r\n// details=s.error;\r\n//\r\n// return (\r\n// \r\n// {title} \r\n// \r\n// alert(details)}>{type} \r\n// \r\n// \r\n// {type==='授权失效' ?\r\n// \r\n// 重新登录\r\n// :\r\n// this.load(state_key)}>\r\n// 重试\r\n// \r\n// }\r\n// \r\n// \r\n// )\r\n// }\r\n// else {\r\n// this.cache_set(state_key,s);\r\n//\r\n// return (\r\n// \r\n// {title} \r\n// {value_fn(s)} \r\n// \r\n// \r\n// {action}\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.props.set_token(t);\r\n// this.reload_all();\r\n// }}>{(do_login)=>(\r\n// \r\n//
\r\n// \r\n// {this.render_line(\r\n// 'today_info',\r\n// '今日',(s)=>s.info,\r\n// '校历',(s)=>s.schedule_url,\r\n// do_login,\r\n// )}\r\n// {this.render_line(\r\n// 'card_balance',\r\n// '校园卡',(s)=>`余额¥${s.balance.toFixed(2)}`,\r\n// '充值',()=>'https://virtualprod.alipay.com/educate/educatePcRecharge.htm?schoolCode=PKU&schoolName=',\r\n// do_login,\r\n// )}\r\n// {this.render_line(\r\n// 'net_balance',\r\n// '网费',(s)=>`余额¥${s.balance.toFixed(2)}`,\r\n// '充值',()=>'https://its.pku.edu.cn/epay.jsp',\r\n// do_login,\r\n// )}\r\n// {this.render_line(\r\n// 'mail_count',\r\n// '邮件',(s)=>`未读 ${s.count} 封`,\r\n// '查看',()=>'https://mail.pku.edu.cn/',\r\n// do_login,\r\n// )}\r\n// \r\n//
\r\n//
\r\n// )} \r\n// )\r\n// }\r\n// }\r\n\r\nexport function InfoSidebar(props) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nclass ResetUsertokenWidget extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n loading_status: 'done',\r\n };\r\n }\r\n\r\n do_reset() {\r\n if(window.confirm('您正在重置 UserToken!\\n您的账号将会在【所有设备】上注销,您需要手动重新登录!')) {\r\n let uid=window.prompt('您正在重置 UserToken!\\n请输入您的学号以确认身份:');\r\n if(uid)\r\n this.setState({\r\n loading_status: 'loading',\r\n },()=>{\r\n fetch(THUHOLE_API_ROOT+'api_xmcp/hole/reset_usertoken', {\r\n method: 'post',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n user_token: this.props.token,\r\n uid: uid,\r\n }),\r\n })\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.error)\r\n throw new Error(json.error);\r\n else\r\n alert('重置成功!您需要在所有设备上重新登录。');\r\n\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n })\r\n .catch((e)=>{\r\n alert('重置失败:'+e);\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n })\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n if(this.state.loading_status==='done')\r\n return (重置 );\r\n else if(this.state.loading_status==='loading')\r\n return ( );\r\n }\r\n}\r\n\r\nexport class LoginForm extends Component {\r\n copy_token(token) {\r\n if(copy(token))\r\n alert('复制成功!\\n请一定不要泄露哦');\r\n }\r\n\r\n render() {\r\n return (\r\n {(token)=>\r\n \r\n {/*{!!token.value &&*/}\r\n {/*
*/}\r\n {/*}*/}\r\n
\r\n {token.value ?\r\n
:\r\n
{(do_popup)=>(\r\n \r\n
\r\n \r\n \r\n 登录\r\n \r\n
\r\n
\r\n T大树洞 面向清华大学学生,通过清华邮箱验证您的身份并提供服务。\r\n
\r\n
\r\n )} \r\n }\r\n
\r\n
\r\n } \r\n )\r\n }\r\n}\r\n\r\nexport class ReplyForm extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n text: '',\r\n loading_status: 'done',\r\n };\r\n this.on_change_bound=this.on_change.bind(this);\r\n this.area_ref=this.props.area_ref||React.createRef();\r\n this.global_keypress_handler_bound=this.global_keypress_handler.bind(this);\r\n }\r\n\r\n global_keypress_handler(e) {\r\n if(e.code==='Enter' && !e.ctrlKey && !e.altKey && ['input','textarea'].indexOf(e.target.tagName.toLowerCase())===-1) {\r\n if(this.area_ref.current) {\r\n e.preventDefault();\r\n this.area_ref.current.focus();\r\n }\r\n }\r\n }\r\n componentDidMount() {\r\n document.addEventListener('keypress',this.global_keypress_handler_bound);\r\n }\r\n componentWillUnmount() {\r\n document.removeEventListener('keypress',this.global_keypress_handler_bound);\r\n }\r\n\r\n on_change(value) {\r\n this.setState({\r\n text: value,\r\n });\r\n }\r\n\r\n on_submit(event) {\r\n if(event) event.preventDefault();\r\n if(this.state.loading_status==='loading')\r\n return;\r\n this.setState({\r\n loading_status: 'loading',\r\n });\r\n\r\n let data=new URLSearchParams();\r\n data.append('pid',this.props.pid);\r\n data.append('text',this.state.text);\r\n data.append('user_token',this.props.token);\r\n fetch(API_BASE+'/api.php?action=docomment'+token_param(this.props.token), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n body: data,\r\n })\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) alert(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n\r\n this.setState({\r\n loading_status: 'done',\r\n text: '',\r\n });\r\n this.area_ref.current.clear();\r\n this.props.on_complete();\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n alert('回复失败');\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nexport class PostForm extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n text: '',\r\n loading_status: 'done',\r\n img_tip: null,\r\n };\r\n this.img_ref=React.createRef();\r\n this.area_ref=React.createRef();\r\n this.on_change_bound=this.on_change.bind(this);\r\n this.on_img_change_bound=this.on_img_change.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n if(this.area_ref.current)\r\n this.area_ref.current.focus();\r\n }\r\n\r\n on_change(value) {\r\n this.setState({\r\n text: value,\r\n });\r\n }\r\n\r\n do_post(text,img) {\r\n let data=new URLSearchParams();\r\n data.append('text',this.state.text);\r\n data.append('type',img ? 'image' : 'text');\r\n data.append('user_token',this.props.token);\r\n if(img)\r\n data.append('data',img);\r\n\r\n fetch(API_BASE+'/api.php?action=dopost'+token_param(this.props.token), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n body: data,\r\n })\r\n .then(get_json)\r\n .then((json)=>{\r\n if(json.code!==0) {\r\n if(json.msg) alert(json.msg);\r\n throw new Error(JSON.stringify(json));\r\n }\r\n\r\n this.setState({\r\n loading_status: 'done',\r\n text: '',\r\n });\r\n this.area_ref.current.clear();\r\n this.props.on_complete();\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n alert('发表失败');\r\n this.setState({\r\n loading_status: 'done',\r\n });\r\n });\r\n }\r\n\r\n proc_img(file) {\r\n return new Promise((resolve,reject)=>{\r\n function return_url(url) {\r\n const idx=url.indexOf(';base64,');\r\n if(idx===-1)\r\n throw new Error('img not base64 encoded');\r\n\r\n return url.substr(idx+8);\r\n }\r\n\r\n let reader=new FileReader();\r\n function on_got_img(url) {\r\n const image = new Image();\r\n image.onload=(()=>{\r\n let width=image.width;\r\n let height=image.height;\r\n let compressed=false;\r\n\r\n if(width>MAX_IMG_DIAM) {\r\n height=height*MAX_IMG_DIAM/width;\r\n width=MAX_IMG_DIAM;\r\n compressed=true;\r\n }\r\n if(height>MAX_IMG_DIAM) {\r\n width=width*MAX_IMG_DIAM/height;\r\n height=MAX_IMG_DIAM;\r\n compressed=true;\r\n }\r\n if(height*width>MAX_IMG_PX) {\r\n let rate=Math.sqrt(height*width/MAX_IMG_PX);\r\n height/=rate;\r\n width/=rate;\r\n compressed=true;\r\n }\r\n console.log('chosen img size',width,height);\r\n\r\n let canvas=document.createElement('canvas');\r\n let ctx=canvas.getContext('2d');\r\n canvas.width=width;\r\n canvas.height=height;\r\n ctx.drawImage(image,0,0,width,height);\r\n\r\n let quality_l=.1,quality_r=.9,quality,new_url;\r\n while(quality_r-quality_l>=.03) {\r\n quality=(quality_r+quality_l)/2;\r\n new_url=canvas.toDataURL('image/jpeg',quality);\r\n console.log(quality_l,quality_r,'trying quality',quality,'size',new_url.length);\r\n if(new_url.length<=MAX_IMG_FILESIZE)\r\n quality_l=quality;\r\n else\r\n quality_r=quality;\r\n }\r\n if(quality_l>=.101) {\r\n console.log('chosen img quality',quality);\r\n resolve({\r\n img: return_url(new_url),\r\n quality: quality,\r\n width: Math.round(width),\r\n height: Math.round(height),\r\n compressed: compressed,\r\n });\r\n } else {\r\n reject('图片过大,无法上传');\r\n }\r\n });\r\n image.src=url;\r\n }\r\n reader.onload=(event)=>{\r\n fixOrientation(event.target.result,{},(fixed_dataurl)=>{\r\n on_got_img(fixed_dataurl);\r\n });\r\n };\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n\r\n on_img_change() {\r\n if(this.img_ref.current && this.img_ref.current.files.length)\r\n this.setState({\r\n img_tip: '(正在处理图片……)'\r\n },()=>{\r\n this.proc_img(this.img_ref.current.files[0])\r\n .then((d)=>{\r\n this.setState({\r\n img_tip: `(${d.compressed?'压缩到':'尺寸'} ${d.width}*${d.height} / `+\r\n `质量 ${Math.floor(d.quality*100)}% / ${Math.floor(d.img.length/BASE64_RATE/1000)}KB)`,\r\n });\r\n })\r\n .catch((e)=>{\r\n this.setState({\r\n img_tip: `图片无效:${e}`,\r\n });\r\n });\r\n });\r\n else\r\n this.setState({\r\n img_tip: null,\r\n });\r\n }\r\n\r\n on_submit(event) {\r\n if(event) event.preventDefault();\r\n if(this.state.loading_status==='loading')\r\n return;\r\n if(this.img_ref.current.files.length) {\r\n this.setState({\r\n loading_status: 'processing',\r\n });\r\n this.proc_img(this.img_ref.current.files[0])\r\n .then((d)=>{\r\n this.setState({\r\n loading_status: 'loading',\r\n });\r\n this.do_post(this.state.text,d.img);\r\n })\r\n .catch((e)=>{\r\n alert(e);\r\n });\r\n } else {\r\n this.setState({\r\n loading_status: 'loading',\r\n });\r\n this.do_post(this.state.text,null);\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n}","import React, {Component, PureComponent} from 'react';\r\nimport copy from 'copy-to-clipboard';\r\nimport {ColorPicker} from './color_picker';\r\nimport {split_text, NICKNAME_RE, PID_RE, URL_RE, URL_PID_RE} from './text_splitter';\r\nimport {format_time, build_highlight_re, Time, TitleLine, HighlightedText, ClickHandler, ColoredSpan} from './Common';\r\nimport './Flows.css';\r\nimport LazyLoad from './react-lazyload/src';\r\nimport {AudioWidget} from './AudioWidget';\r\nimport {TokenCtx, ReplyForm} from './UserAction';\r\n\r\nimport {API, THUHOLE_API_ROOT} from './flows_api';\r\n\r\nconst IMAGE_BASE=THUHOLE_API_ROOT+'/images/';\r\nconst AUDIO_BASE=THUHOLE_API_ROOT+'services/thuhole/audios/';\r\n\r\nconst CLICKABLE_TAGS={a: true, audio: true};\r\nconst PREVIEW_REPLY_COUNT=10;\r\n// const QUOTE_BLACKLIST=['23333','233333','66666','666666','10086','10000','100000','99999','999999','55555','555555'];\r\nconst QUOTE_BLACKLIST=[];\r\n\r\nwindow.LATEST_POST_ID=parseInt(localStorage['_LATEST_POST_ID'],10)||0;\r\n\r\nconst DZ_NAME='洞主';\r\n\r\nfunction load_single_meta(show_sidebar,token) {\r\n return (pid,replace=false)=>{\r\n let color_picker=new ColorPicker();\r\n let title_elem='树洞 #'+pid;\r\n show_sidebar(\r\n title_elem,\r\n \r\n 正在加载 #{pid}\r\n
,\r\n replace?'replace':'push'\r\n );\r\n API.get_single(pid,token)\r\n .then((single)=>{\r\n single.data.variant={};\r\n return new Promise((resolve,reject)=>{\r\n API.load_replies_with_cache(pid,token,color_picker,parseInt(single.data.reply))\r\n .then((replies)=>{resolve([single,replies])})\r\n .catch(reject);\r\n });\r\n })\r\n .then((res)=>{\r\n let [single,replies]=res;\r\n show_sidebar(\r\n title_elem,\r\n ,\r\n 'replace'\r\n )\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n show_sidebar(\r\n title_elem,\r\n ,\r\n 'replace'\r\n );\r\n })\r\n };\r\n}\r\n\r\nclass Reply extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n let parts=split_text(this.props.info.text,[\r\n ['url_pid',URL_PID_RE],\r\n ['url',URL_RE],\r\n ['pid',PID_RE],\r\n ['nickname',NICKNAME_RE],\r\n ]);\r\n\r\n return (\r\n \r\n
\r\n #{this.props.info.cid}
\r\n {!!this.props.do_filter_name &&\r\n {this.props.do_filter_name(this.props.info.name);}}>\r\n \r\n \r\n }\r\n \r\n {this.props.info.tag!==null &&\r\n \r\n {this.props.info.tag}\r\n \r\n }\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass FlowItem extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n copy_link(event) {\r\n event.preventDefault();\r\n copy(\r\n `${event.target.href}${this.props.info.tag ? ' 【'+this.props.info.tag+'】' : ''}\\n`+\r\n `${this.props.info.text}${this.props.info.type==='image'?' [图片]':this.props.info.type==='audio'?' [语音]':''}\\n`+\r\n `(${format_time(new Date(this.props.info.timestamp*1000))} ${this.props.info.likenum}关注 ${this.props.info.reply}回复)\\n`+\r\n this.props.replies.map((r)=>(\r\n (r.tag ? '【'+r.tag+'】' : '')+\r\n r.text\r\n )).join('\\n')\r\n );\r\n }\r\n\r\n render() {\r\n let props=this.props;\r\n let parts=props.parts||split_text(props.info.text,[\r\n ['url_pid',URL_PID_RE],\r\n ['url',URL_RE],\r\n ['pid',PID_RE],\r\n ['nickname',NICKNAME_RE],\r\n ]);\r\n return (\r\n \r\n {!!props.is_quote &&\r\n
\r\n }\r\n
\r\n {!!window.LATEST_POST_ID && parseInt(props.info.pid,10)>window.LATEST_POST_ID &&\r\n
\r\n }\r\n
\r\n {!!this.props.do_filter_name &&\r\n
{this.props.do_filter_name(DZ_NAME);}}>\r\n \r\n \r\n }\r\n {!!parseInt(props.info.likenum,10) &&\r\n
\r\n {props.info.likenum} \r\n \r\n \r\n }\r\n {!!parseInt(props.info.reply,10) &&\r\n
\r\n {props.info.reply} \r\n \r\n \r\n }\r\n
#{props.info.pid}
\r\n \r\n {props.info.tag!==null &&\r\n
\r\n {props.info.tag}\r\n \r\n }\r\n
\r\n
\r\n
\r\n
\r\n {props.info.type==='image' &&\r\n
\r\n {props.img_clickable ?\r\n :\r\n \r\n }\r\n
\r\n }\r\n {props.info.type==='audio' &&
}\r\n
\r\n {!!(props.attention && props.info.variant.latest_reply) &&\r\n
最新回复
\r\n }\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass FlowSidebar extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n attention: props.attention,\r\n info: props.info,\r\n replies: props.replies,\r\n loading_status: 'done',\r\n error_msg: null,\r\n filter_name: null,\r\n rev: false,\r\n };\r\n this.color_picker=props.color_picker;\r\n this.syncState=props.sync_state||(()=>{});\r\n this.reply_ref=React.createRef();\r\n }\r\n\r\n set_variant(cid,variant) {\r\n this.setState((prev)=>{\r\n if(cid)\r\n return {\r\n replies: prev.replies.map((reply)=>{\r\n if(reply.cid===cid)\r\n return Object.assign({},reply,{variant: Object.assign({},reply.variant,variant)});\r\n else\r\n return reply;\r\n }),\r\n };\r\n else\r\n return {\r\n info: Object.assign({},prev.info,{variant: Object.assign({},prev.info.variant,variant)}),\r\n }\r\n },function() {\r\n this.syncState({\r\n info: this.state.info,\r\n replies: this.state.replies,\r\n });\r\n });\r\n }\r\n\r\n load_replies(update_count=true) {\r\n this.setState({\r\n loading_status: 'loading',\r\n error_msg: null,\r\n });\r\n API.load_replies(this.state.info.pid,this.props.token,this.color_picker,null)\r\n .then((json)=>{\r\n this.setState((prev,props)=>({\r\n replies: json.data,\r\n info: update_count ? Object.assign({}, prev.info, {\r\n reply: ''+json.data.length,\r\n }) : prev.info,\r\n attention: !!json.attention,\r\n loading_status: 'done',\r\n error_msg: null,\r\n }), ()=>{\r\n this.syncState({\r\n replies: this.state.replies,\r\n attention: this.state.attention,\r\n info: this.state.info,\r\n });\r\n if(this.state.replies.length)\r\n this.set_variant(null,{latest_reply: Math.max.apply(null,this.state.replies.map((r)=>parseInt(r.timestamp)))});\r\n });\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n this.setState({\r\n replies: [],\r\n loading_status: 'done',\r\n error_msg: ''+e,\r\n });\r\n });\r\n }\r\n\r\n toggle_attention() {\r\n this.setState({\r\n loading_status: 'loading',\r\n });\r\n const next_attention=!this.state.attention;\r\n API.set_attention(this.state.info.pid,next_attention,this.props.token)\r\n .then((json)=>{\r\n this.setState({\r\n loading_status: 'done',\r\n attention: next_attention,\r\n });\r\n this.syncState({\r\n attention: next_attention,\r\n });\r\n })\r\n .catch((e)=>{\r\n this.setState({\r\n loading_status: 'done'\r\n });\r\n alert('设置关注失败');\r\n console.error(e);\r\n });\r\n }\r\n\r\n report() {\r\n let reason=prompt(`举报 #${this.state.info.pid} 的理由:`);\r\n if(reason!==null) {\r\n API.report(this.state.info.pid,reason,this.props.token)\r\n .then((json)=>{\r\n alert('举报成功');\r\n })\r\n .catch((e)=>{\r\n alert('举报失败');\r\n console.error(e);\r\n })\r\n }\r\n }\r\n\r\n set_filter_name(name) {\r\n this.setState((prevState)=>({\r\n filter_name: name===prevState.filter_name ? null : name,\r\n }));\r\n }\r\n\r\n toggle_rev() {\r\n this.setState((prevState)=>({\r\n rev: !prevState.rev,\r\n }));\r\n }\r\n\r\n show_reply_bar(name,event) {\r\n if(this.reply_ref.current && !event.target.closest('a, .clickable')) {\r\n let text=this.reply_ref.current.get();\r\n if(/^\\s*(?:Re (?:|洞主|(?:[A-Z][a-z]+ )?(?:[A-Z][a-z]+)|You Win(?: \\d+)?):)?\\s*$/.test(text)) {// text is nearly empty so we can replace it\r\n let should_text='Re '+name+': ';\r\n if(should_text===this.reply_ref.current.get())\r\n this.reply_ref.current.set('');\r\n else\r\n this.reply_ref.current.set(should_text);\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n if(this.state.loading_status==='loading')\r\n return (加载中……
);\r\n\r\n let show_pid=load_single_meta(this.props.show_sidebar,this.props.token);\r\n\r\n let replies_to_show=this.state.filter_name ? this.state.replies.filter((r)=>r.name===this.state.filter_name) : this.state.replies.slice();\r\n if(this.state.rev) replies_to_show.reverse();\r\n\r\n // key for lazyload elem\r\n let view_mode_key=(this.state.rev ? 'y-' : 'n-')+(this.state.filter_name||'null');\r\n\r\n let replies_cnt={[DZ_NAME]:1};\r\n replies_to_show.forEach((r)=>{\r\n if(replies_cnt[r.name]===undefined)\r\n replies_cnt[r.name]=0;\r\n replies_cnt[r.name]++;\r\n });\r\n\r\n // hide main thread when filtered\r\n let main_thread_elem=(this.state.filter_name && this.state.filter_name!==DZ_NAME) ? null : (\r\n {this.show_reply_bar('',e);}}>\r\n {this.set_variant(null,variant);}}\r\n do_filter_name={replies_cnt[DZ_NAME]>1 ? this.set_filter_name.bind(this) : null}\r\n />\r\n \r\n );\r\n\r\n return (\r\n \r\n
\r\n {!!this.state.filter_name &&\r\n
\r\n }\r\n {!this.state.rev &&\r\n main_thread_elem\r\n }\r\n {!!this.state.error_msg &&\r\n
\r\n
回复加载失败
\r\n
{this.state.error_msg}
\r\n
\r\n }\r\n {(this.props.deletion_detect && parseInt(this.state.info.reply)>this.state.replies.length) && !!this.state.replies.length &&\r\n
\r\n {parseInt(this.state.info.reply)-this.state.replies.length} 条回复被删除\r\n
\r\n }\r\n {replies_to_show.map((reply)=>(\r\n
\r\n {this.show_reply_bar(reply.name,e);}}>\r\n {this.set_variant(reply.cid,variant);}}\r\n do_filter_name={replies_cnt[reply.name]>1 ? this.set_filter_name.bind(this) : null}\r\n />\r\n \r\n \r\n ))}\r\n {this.state.rev &&\r\n main_thread_elem\r\n }\r\n {!!this.props.token ?\r\n
:\r\n
登录后可以回复树洞
\r\n }\r\n
\r\n )\r\n }\r\n}\r\n\r\nclass FlowItemRow extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n replies: [],\r\n reply_status: 'done',\r\n reply_error: null,\r\n info: Object.assign({},props.info,{variant: {}}),\r\n attention: props.attention_override===null ? false : props.attention_override,\r\n };\r\n this.color_picker=new ColorPicker();\r\n }\r\n\r\n componentDidMount() {\r\n if(parseInt(this.state.info.reply,10)) {\r\n this.load_replies(null,/*update_count=*/false);\r\n }\r\n }\r\n\r\n load_replies(callback,update_count=true) {\r\n console.log('fetching reply',this.state.info.pid);\r\n this.setState({\r\n reply_status: 'loading',\r\n reply_error: null,\r\n });\r\n API.load_replies_with_cache(this.state.info.pid,this.props.token,this.color_picker,parseInt(this.state.info.reply))\r\n .then((json)=>{\r\n this.setState((prev,props)=>({\r\n replies: json.data,\r\n info: Object.assign({}, prev.info, {\r\n reply: update_count ? ''+json.data.length : prev.info.reply,\r\n variant: json.data.length ? {\r\n latest_reply: Math.max.apply(null,json.data.map((r)=>parseInt(r.timestamp))),\r\n } : {},\r\n }),\r\n attention: !!json.attention,\r\n reply_status: 'done',\r\n reply_error: null,\r\n }),callback);\r\n })\r\n .catch((e)=>{\r\n console.error(e);\r\n this.setState({\r\n replies: [],\r\n reply_status: 'failed',\r\n reply_error: ''+e,\r\n },callback);\r\n });\r\n }\r\n\r\n show_sidebar() {\r\n this.props.show_sidebar(\r\n '树洞 #'+this.state.info.pid,\r\n \r\n );\r\n }\r\n\r\n render() {\r\n let show_pid=load_single_meta(this.props.show_sidebar,this.props.token,[this.state.info.pid]);\r\n\r\n let hl_rules=[\r\n ['url_pid',URL_PID_RE],\r\n ['url',URL_RE],\r\n ['pid',PID_RE],\r\n ['nickname',NICKNAME_RE],\r\n ];\r\n if(this.props.search_param)\r\n hl_rules.push(['search',build_highlight_re(this.props.search_param,' ','gi')]);\r\n let parts=split_text(this.state.info.text,hl_rules);\r\n\r\n let quote_id=null;\r\n if(!this.props.is_quote)\r\n for(let [mode,content] of parts) {\r\n content = content.length > 0 ? content.substring(1) : content\r\n if(mode==='pid' && QUOTE_BLACKLIST.indexOf(content)===-1 && parseInt(content){\r\n if(!CLICKABLE_TAGS[event.target.tagName.toLowerCase()])\r\n this.show_sidebar();\r\n }}>\r\n \r\n \r\n {this.state.reply_status==='loading' &&
加载中
}\r\n {this.state.reply_status==='failed' &&\r\n
\r\n }\r\n {this.state.replies.slice(0,PREVIEW_REPLY_COUNT).map((reply)=>(\r\n
\r\n ))}\r\n {this.state.replies.length>PREVIEW_REPLY_COUNT &&\r\n
还有 {this.state.replies.length-PREVIEW_REPLY_COUNT} 条
\r\n }\r\n
\r\n \r\n );\r\n\r\n return quote_id ? (\r\n \r\n {res}\r\n \r\n
\r\n ) : res;\r\n }\r\n}\r\n\r\nclass FlowItemQuote extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n loading_status: 'empty',\r\n error_msg: null,\r\n info: null,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.load();\r\n }\r\n\r\n load() {\r\n this.setState({\r\n loading_status: 'loading',\r\n },()=>{\r\n API.get_single(this.props.pid,this.props.token)\r\n .then((json)=>{\r\n this.setState({\r\n loading_status: 'done',\r\n info: json.data,\r\n });\r\n })\r\n .catch((err)=>{\r\n if((''+err).indexOf('没有这条树洞')!==-1)\r\n this.setState({\r\n loading_status: 'empty',\r\n });\r\n else\r\n this.setState({\r\n loading_status: 'error',\r\n error_msg: ''+err,\r\n });\r\n });\r\n });\r\n }\r\n\r\n render() {\r\n if(this.state.loading_status==='empty')\r\n return null;\r\n else if(this.state.loading_status==='loading')\r\n return (\r\n \r\n
\r\n \r\n 提到了 #{this.props.pid}\r\n
\r\n
\r\n );\r\n else if(this.state.loading_status==='error')\r\n return (\r\n \r\n
\r\n
重新加载
\r\n
{this.state.error_msg}
\r\n
\r\n
\r\n );\r\n else // 'done'\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nfunction FlowChunk(props) {\r\n return (\r\n {({value: token})=>(\r\n \r\n {!!props.title &&
}\r\n {props.list.map((info,ind)=>(\r\n
\r\n \r\n {!!(props.deletion_detect && props.mode==='list' && ind && props.list[ind-1].pid-info.pid>1) &&\r\n
\r\n
\r\n {props.list[ind-1].pid-info.pid-1} 条被删除\r\n
\r\n
\r\n }\r\n
\r\n
\r\n \r\n ))}\r\n
\r\n )} \r\n );\r\n}\r\n\r\nexport class Flow extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n mode: props.mode,\r\n search_param: props.search_text,\r\n loaded_pages: 0,\r\n chunks: {\r\n title: '',\r\n data: [],\r\n },\r\n loading_status: 'done',\r\n error_msg: null,\r\n };\r\n this.on_scroll_bound=this.on_scroll.bind(this);\r\n window.LATEST_POST_ID=parseInt(localStorage['_LATEST_POST_ID'],10)||0;\r\n }\r\n\r\n load_page(page) {\r\n const failed=(err)=>{\r\n console.error(err);\r\n this.setState((prev,props)=>({\r\n loaded_pages: prev.loaded_pages-1,\r\n loading_status: 'failed',\r\n error_msg: ''+err,\r\n }));\r\n };\r\n\r\n if(page>this.state.loaded_pages+1)\r\n throw new Error('bad page');\r\n if(page===this.state.loaded_pages+1) {\r\n console.log('fetching page',page);\r\n if(this.state.mode==='list') {\r\n API.get_list(page,this.props.token)\r\n .then((json)=>{\r\n if(page===1 && json.data.length) { // update latest_post_id\r\n let max_id=-1;\r\n json.data.forEach((x)=>{\r\n if(parseInt(x.pid,10)>max_id)\r\n max_id=parseInt(x.pid,10);\r\n });\r\n localStorage['_LATEST_POST_ID']=''+max_id;\r\n }\r\n this.setState((prev,props)=>({\r\n chunks: {\r\n title: 'News Feed',\r\n data: prev.chunks.data.concat(json.data.filter((x)=>(\r\n prev.chunks.data.length===0 ||\r\n !(prev.chunks.data.slice(-100).some((p)=>p.pid===x.pid))\r\n ))),\r\n },\r\n loading_status: 'done',\r\n }));\r\n })\r\n .catch(failed);\r\n } else if(this.state.mode==='search') {\r\n API.get_search(page,this.state.search_param,this.props.token)\r\n .then((json)=>{\r\n const finished=json.data.length===0;\r\n this.setState((prev,props)=>({\r\n chunks: {\r\n title: 'Result for \"'+this.state.search_param+'\"',\r\n data: prev.chunks.data.concat(json.data.filter((x)=>(\r\n prev.chunks.data.length===0 ||\r\n !(prev.chunks.data.slice(-100).some((p)=>p.pid===x.pid))\r\n ))),\r\n },\r\n mode: finished ? 'search_finished' : 'search',\r\n loading_status: 'done',\r\n }));\r\n })\r\n .catch(failed);\r\n } else if(this.state.mode==='single') {\r\n const pid=parseInt(this.state.search_param.substr(1),10);\r\n API.get_single(pid,this.props.token)\r\n .then((json)=>{\r\n this.setState({\r\n chunks: {\r\n title: 'PID = '+pid,\r\n data: [json.data],\r\n },\r\n mode: 'single_finished',\r\n loading_status: 'done',\r\n });\r\n })\r\n .catch(failed);\r\n } else if(this.state.mode==='attention') {\r\n API.get_attention(this.props.token)\r\n .then((json)=>{\r\n this.setState({\r\n chunks: {\r\n title: 'Attention List',\r\n data: json.data,\r\n },\r\n mode: 'attention_finished',\r\n loading_status: 'done',\r\n });\r\n })\r\n .catch(failed);\r\n } else {\r\n console.log('nothing to load');\r\n return;\r\n }\r\n\r\n this.setState((prev,props)=>({\r\n loaded_pages: prev.loaded_pages+1,\r\n loading_status: 'loading',\r\n error_msg: null,\r\n }));\r\n }\r\n }\r\n\r\n on_scroll(event) {\r\n if(event.target===document) {\r\n const avail=document.body.scrollHeight-window.scrollY-window.innerHeight;\r\n if(avail\r\n \r\n {this.state.loading_status==='failed' &&\r\n \r\n }\r\n Loading... :\r\n '© thuhole'\r\n } />\r\n \r\n );\r\n }\r\n}","import React, {Component, PureComponent} from 'react';\r\n// import {AppSwitcher} from './infrastructure/widgets';\r\nimport {InfoSidebar, PostForm} from './UserAction';\r\nimport {TokenCtx} from './UserAction';\r\n\r\nimport './Title.css';\r\n\r\nconst flag_re=/^\\/\\/setflag ([a-zA-Z0-9_]+)=(.*)$/;\r\n\r\nclass ControlBar extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n search_text: '',\r\n };\r\n this.set_mode=props.set_mode;\r\n\r\n this.on_change_bound=this.on_change.bind(this);\r\n this.on_keypress_bound=this.on_keypress.bind(this);\r\n this.do_refresh_bound=this.do_refresh.bind(this);\r\n this.do_attention_bound=this.do_attention.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n if(window.location.hash) {\r\n let text=decodeURIComponent(window.location.hash).substr(1);\r\n if(text.lastIndexOf('?')!==-1)\r\n text=text.substr(0,text.lastIndexOf('?')); // fuck wechat '#param?nsukey=...'\r\n this.setState({\r\n search_text: text,\r\n }, ()=>{\r\n this.on_keypress({key: 'Enter'});\r\n });\r\n }\r\n }\r\n\r\n on_change(event) {\r\n this.setState({\r\n search_text: event.target.value,\r\n });\r\n }\r\n\r\n on_keypress(event) {\r\n if(event.key==='Enter') {\r\n let flag_res=flag_re.exec(this.state.search_text);\r\n if(flag_res) {\r\n if(flag_res[2]) {\r\n localStorage[flag_res[1]]=flag_res[2];\r\n alert('Set Flag '+flag_res[1]+'='+flag_res[2]+'\\nYou may need to refresh this webpage.');\r\n } else {\r\n delete localStorage[flag_res[1]];\r\n alert('Clear Flag '+flag_res[1]+'\\nYou may need to refresh this webpage.');\r\n }\r\n return;\r\n }\r\n\r\n const mode=this.state.search_text.startsWith('#') ? 'single' : 'search';\r\n this.set_mode(mode,this.state.search_text||'');\r\n }\r\n }\r\n\r\n do_refresh() {\r\n window.scrollTo(0,0);\r\n this.setState({\r\n search_text: '',\r\n });\r\n this.set_mode('list',null);\r\n }\r\n\r\n do_attention() {\r\n window.scrollTo(0,0);\r\n this.setState({\r\n search_text: '',\r\n });\r\n this.set_mode('attention',null);\r\n }\r\n\r\n render() {\r\n return (\r\n {({value: token})=>(\r\n \r\n )} \r\n )\r\n }\r\n}\r\n\r\nexport function Title(props) {\r\n return (\r\n \r\n {/*
*/}\r\n
\r\n
\r\n
\r\n props.show_sidebar(\r\n 'T大树洞',\r\n \r\n )}>\r\n T大树洞\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n}","import React, {Component, PureComponent} from 'react';\r\nimport './Sidebar.css';\r\n\r\nexport class Sidebar extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.sidebar_ref=React.createRef();\r\n this.do_close_bound=this.do_close.bind(this);\r\n this.do_back_bound=this.do_back.bind(this);\r\n }\r\n\r\n componentDidUpdate(nextProps) {\r\n if(this.props.stack!==nextProps.stack) {\r\n //console.log('sidebar top');\r\n if(this.sidebar_ref.current)\r\n this.sidebar_ref.current.scrollTop=0;\r\n }\r\n }\r\n\r\n do_close() {\r\n this.props.show_sidebar(null,null,'clear');\r\n }\r\n do_back() {\r\n this.props.show_sidebar(null,null,'pop');\r\n }\r\n\r\n render() {\r\n let [cur_title,cur_content]=this.props.stack[this.props.stack.length-1];\r\n return (\r\n \r\n
{e.preventDefault();e.target.click();}} />\r\n
\r\n {cur_content}\r\n
\r\n
\r\n
\r\n {this.props.stack.length>2 &&\r\n
\r\n }\r\n {cur_title}\r\n
\r\n
\r\n );\r\n }\r\n}","import React, {Component} from 'react';\r\nimport Pressure from 'pressure';\r\n\r\nimport './PressureHelper.css';\r\n\r\nconst THRESHOLD=.4;\r\nconst MULTIPLIER=25;\r\nconst BORDER_WIDTH=500; // also change css!\r\n\r\nexport class PressureHelper extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n level: 0,\r\n fired: false,\r\n };\r\n this.callback=props.callback;\r\n this.esc_interval=null;\r\n }\r\n\r\n do_fire() {\r\n if(this.esc_interval) {\r\n clearInterval(this.esc_interval);\r\n this.esc_interval=null;\r\n }\r\n this.setState({\r\n level: 1,\r\n fired: true,\r\n });\r\n this.callback();\r\n window.setTimeout(()=>{\r\n this.setState({\r\n level: 0,\r\n fired: false,\r\n });\r\n },300);\r\n }\r\n\r\n componentDidMount() {\r\n if(window.config.pressure) {\r\n Pressure.set(document.body, {\r\n change: (force)=>{\r\n if(!this.state.fired) {\r\n if(force>=.999) {\r\n this.do_fire();\r\n }\r\n else\r\n this.setState({\r\n level: force,\r\n });\r\n }\r\n },\r\n end: ()=>{\r\n this.setState({\r\n level: 0,\r\n fired: false,\r\n });\r\n },\r\n }, {\r\n polyfill: false,\r\n only: 'touch',\r\n preventSelect: false,\r\n });\r\n\r\n document.addEventListener('keydown',(e)=>{\r\n if(!e.repeat && e.key==='Escape') {\r\n if(this.esc_interval)\r\n clearInterval(this.esc_interval);\r\n this.setState({\r\n level: THRESHOLD/2,\r\n },()=>{\r\n this.esc_interval=setInterval(()=>{\r\n let new_level=this.state.level+.1;\r\n if(new_level>=.999)\r\n this.do_fire();\r\n else\r\n this.setState({\r\n level: new_level,\r\n });\r\n },30);\r\n });\r\n }\r\n });\r\n document.addEventListener('keyup',(e)=>{\r\n if(e.key==='Escape') {\r\n if(this.esc_interval) {\r\n clearInterval(this.esc_interval);\r\n this.esc_interval=null;\r\n }\r\n this.setState({\r\n level: 0,\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const pad=MULTIPLIER*(this.state.level-THRESHOLD)-BORDER_WIDTH;\r\n return (\r\n
\r\n )\r\n }\r\n}","import React, {Component} from 'react';\r\nimport {Flow} from './Flows';\r\nimport {Title} from './Title';\r\nimport {Sidebar} from './Sidebar';\r\nimport {PressureHelper} from './PressureHelper';\r\nimport {TokenCtx} from './UserAction';\r\nimport {load_config,bgimg_style} from './Config';\r\nimport {listen_darkmode} from './infrastructure/functions';\r\nimport {LoginPopup, TitleLine} from './infrastructure/widgets';\r\n\r\nconst MAX_SIDEBAR_STACK_SIZE=10;\r\n\r\nfunction DeprecatedAlert(props) {\r\n return (\r\n
\r\n );\r\n}\r\n\r\nclass App extends Component {\r\n constructor(props) {\r\n super(props);\r\n load_config();\r\n listen_darkmode({default: undefined, light: false, dark: true}[window.config.color_scheme]);\r\n this.state={\r\n sidebar_stack: [[null,null]], // list of [status, content]\r\n mode: 'list', // list, single, search, attention\r\n search_text: null,\r\n flow_render_key: +new Date(),\r\n token: localStorage['TOKEN']||null,\r\n };\r\n this.show_sidebar_bound=this.show_sidebar.bind(this);\r\n this.set_mode_bound=this.set_mode.bind(this);\r\n this.on_pressure_bound=this.on_pressure.bind(this);\r\n // a silly self-deceptive approach to ban guests, enough to fool those muggles\r\n // document cookie 'pku_ip_flag=yes'\r\n this.inpku_flag=window[atob('ZG9jdW1lbnQ')][atob('Y29va2ll')].indexOf(atob('cGt1X2lwX2ZsYWc9eWVz'))!==-1;\r\n }\r\n\r\n static is_darkmode() {\r\n if(window.config.color_scheme==='dark') return true;\r\n if(window.config.color_scheme==='light') return false;\r\n else { // 'default'\r\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n }\r\n }\r\n\r\n on_pressure() {\r\n if(this.state.sidebar_stack.length>1)\r\n this.show_sidebar(null,null,'clear');\r\n else\r\n this.set_mode('list',null);\r\n }\r\n\r\n show_sidebar(title,content,mode='push') {\r\n this.setState((prevState)=>{\r\n let ns=prevState.sidebar_stack.slice();\r\n if(mode==='push') {\r\n if(ns.length>MAX_SIDEBAR_STACK_SIZE)\r\n ns.splice(1,1);\r\n ns=ns.concat([[title,content]]);\r\n } else if(mode==='pop') {\r\n if(ns.length===1) return;\r\n ns.pop();\r\n } else if(mode==='replace') {\r\n ns.pop();\r\n ns=ns.concat([[title,content]]);\r\n } else if(mode==='clear') {\r\n ns=[[null,null]];\r\n } else\r\n throw new Error('bad show_sidebar mode');\r\n return {\r\n sidebar_stack: ns,\r\n };\r\n });\r\n }\r\n\r\n set_mode(mode,search_text) {\r\n this.setState({\r\n mode: mode,\r\n search_text: search_text,\r\n flow_render_key: +new Date(),\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n
{\r\n localStorage['TOKEN']=x||'';\r\n this.setState({\r\n token: x,\r\n });\r\n },\r\n }}>\r\n \r\n
\r\n \r\n {(token)=>(\r\n \r\n
\r\n {!token.value &&\r\n
\r\n }\r\n {this.inpku_flag||token.value||true ?\r\n
:\r\n
\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","// In production, we register a service worker to serve assets from local cache.\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 the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\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 default function register() {\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);\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/facebookincubator/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. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\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://goo.gl/SC7cgQ'\r\n );\r\n });\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\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 }\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) {\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 if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').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);\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 App from './App';\r\n//import {elevate} from './infrastructure/elevator';\r\nimport registerServiceWorker from './registerServiceWorker';\r\n\r\n//elevate();\r\n\r\nReactDOM.render(
, document.getElementById('root'));\r\nregisterServiceWorker();\r\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/static/js/runtime~main.47dca567.js b/static/js/runtime~main.2e7320a3.js
similarity index 59%
rename from static/js/runtime~main.47dca567.js
rename to static/js/runtime~main.2e7320a3.js
index 70135d1..a7abed4 100644
--- a/static/js/runtime~main.47dca567.js
+++ b/static/js/runtime~main.2e7320a3.js
@@ -1,2 +1,2 @@
-!function(e){function r(r){for(var n,l,f=r[0],i=r[1],a=r[2],c=0,s=[];c