From f95bf348da931605bbc9fe405f7d4f5cfdc35142 Mon Sep 17 00:00:00 2001
From: thuhole
Date: Fri, 19 Jun 2020 16:17:31 +0000
Subject: [PATCH] 200620001729
---
asset-manifest.json | 22 +++++++++----------
index.html | 2 +-
...nifest.7501062a9e1223f259e672b09c64909a.js | 22 -------------------
...nifest.c2328951b9e14ea9388cf4c0ac437c10.js | 22 +++++++++++++++++++
service-worker.js | 4 ++--
static/js/main.2e7207ce.chunk.js.map | 1 -
...7207ce.chunk.js => main.4eb8408b.chunk.js} | 4 ++--
static/js/main.4eb8408b.chunk.js.map | 1 +
...n.a9c024a1.js => runtime~main.47dca567.js} | 4 ++--
static/js/runtime~main.47dca567.js.map | 1 +
static/js/runtime~main.a9c024a1.js.map | 1 -
11 files changed, 42 insertions(+), 42 deletions(-)
delete mode 100644 precache-manifest.7501062a9e1223f259e672b09c64909a.js
create mode 100644 precache-manifest.c2328951b9e14ea9388cf4c0ac437c10.js
delete mode 100644 static/js/main.2e7207ce.chunk.js.map
rename static/js/{main.2e7207ce.chunk.js => main.4eb8408b.chunk.js} (98%)
create mode 100644 static/js/main.4eb8408b.chunk.js.map
rename static/js/{runtime~main.a9c024a1.js => runtime~main.47dca567.js} (55%)
create mode 100644 static/js/runtime~main.47dca567.js.map
delete mode 100644 static/js/runtime~main.a9c024a1.js.map
diff --git a/asset-manifest.json b/asset-manifest.json
index d368e8d..c6e99e8 100644
--- a/asset-manifest.json
+++ b/asset-manifest.json
@@ -1,15 +1,15 @@
{
"files": {
- "main.css": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/css/main.e52316e2.chunk.css",
- "main.js": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/main.2e7207ce.chunk.js",
- "main.js.map": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/main.2e7207ce.chunk.js.map",
- "runtime~main.js": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/runtime~main.a9c024a1.js",
- "runtime~main.js.map": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/runtime~main.a9c024a1.js.map",
- "static/js/2.688ae6b0.chunk.js": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/2.688ae6b0.chunk.js",
- "static/js/2.688ae6b0.chunk.js.map": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/2.688ae6b0.chunk.js.map",
- "index.html": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/index.html",
- "precache-manifest.7501062a9e1223f259e672b09c64909a.js": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/precache-manifest.7501062a9e1223f259e672b09c64909a.js",
- "service-worker.js": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/service-worker.js",
- "static/css/main.e52316e2.chunk.css.map": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/css/main.e52316e2.chunk.css.map"
+ "main.css": "./static/css/main.e52316e2.chunk.css",
+ "main.js": "./static/js/main.4eb8408b.chunk.js",
+ "main.js.map": "./static/js/main.4eb8408b.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.c2328951b9e14ea9388cf4c0ac437c10.js": "./precache-manifest.c2328951b9e14ea9388cf4c0ac437c10.js",
+ "service-worker.js": "./service-worker.js",
+ "static/css/main.e52316e2.chunk.css.map": "./static/css/main.e52316e2.chunk.css.map"
}
}
\ No newline at end of file
diff --git a/index.html b/index.html
index 39bd3d2..7a159cf 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.7501062a9e1223f259e672b09c64909a.js b/precache-manifest.7501062a9e1223f259e672b09c64909a.js
deleted file mode 100644
index a4723b3..0000000
--- a/precache-manifest.7501062a9e1223f259e672b09c64909a.js
+++ /dev/null
@@ -1,22 +0,0 @@
-self.__precacheManifest = (self.__precacheManifest || []).concat([
- {
- "revision": "5f527e6ed442b987dd8b12fe16fdd2f9",
- "url": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/index.html"
- },
- {
- "revision": "6e66d364c1a27070447e",
- "url": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/css/main.e52316e2.chunk.css"
- },
- {
- "revision": "8315e3f4741d4388f39f",
- "url": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/2.688ae6b0.chunk.js"
- },
- {
- "revision": "6e66d364c1a27070447e",
- "url": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/main.2e7207ce.chunk.js"
- },
- {
- "revision": "62bace3391c0c82c1116",
- "url": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/runtime~main.a9c024a1.js"
- }
-]);
\ No newline at end of file
diff --git a/precache-manifest.c2328951b9e14ea9388cf4c0ac437c10.js b/precache-manifest.c2328951b9e14ea9388cf4c0ac437c10.js
new file mode 100644
index 0000000..a793801
--- /dev/null
+++ b/precache-manifest.c2328951b9e14ea9388cf4c0ac437c10.js
@@ -0,0 +1,22 @@
+self.__precacheManifest = (self.__precacheManifest || []).concat([
+ {
+ "revision": "f52cb0225350c62f38f308d54d81a1e4",
+ "url": "./index.html"
+ },
+ {
+ "revision": "6a7c404ca07311e0a30e",
+ "url": "./static/css/main.e52316e2.chunk.css"
+ },
+ {
+ "revision": "8315e3f4741d4388f39f",
+ "url": "./static/js/2.688ae6b0.chunk.js"
+ },
+ {
+ "revision": "6a7c404ca07311e0a30e",
+ "url": "./static/js/main.4eb8408b.chunk.js"
+ },
+ {
+ "revision": "045e50cad03565bb401b",
+ "url": "./static/js/runtime~main.47dca567.js"
+ }
+]);
\ No newline at end of file
diff --git a/service-worker.js b/service-worker.js
index 9c5cd93..1ac4fde 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(
- "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/precache-manifest.7501062a9e1223f259e672b09c64909a.js"
+ "./precache-manifest.c2328951b9e14ea9388cf4c0ac437c10.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("//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/index.html"), {
+workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("./index.html"), {
blacklist: [/^\/_/,/\/[^/?]+\.[^/]+$/],
});
diff --git a/static/js/main.2e7207ce.chunk.js.map b/static/js/main.2e7207ce.chunk.js.map
deleted file mode 100644
index c561b14..0000000
--- a/static/js/main.2e7207ce.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/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","get_json","res","ok","Error","status","statusText","text","then","t","JSON","parse","e","console","error","trace","log","SyntaxError","substr","API_VERSION_PARAM","encodeURIComponent","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","THUHOLE_API_ROOT","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","process","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","inthu_flag","atob","ns","pop","Provider","isLocalhost","Boolean","hostname","match","registerValidSW","swUrl","register","onupdatefound","installingWorker","installing","onstatechange","controller","render","response","ready","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.2e7207ce.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/\n\nconst golden_ratio_conjugate=0.618033988749895;\n\nexport class ColorPicker {\n constructor() {\n this.names={};\n this.current_h=Math.random();\n }\n\n get(name) {\n name=name.toLowerCase();\n if(name==='洞主')\n return ['hsl(0,0%,97%)','hsl(0,0%,16%)'];\n\n if(!this.names[name]) {\n this.current_h+=golden_ratio_conjugate;\n this.current_h%=1;\n this.names[name]=[\n `hsl(${this.current_h*360}, 50%, 90%)`,\n `hsl(${this.current_h*360}, 60%, 20%)`,\n ];\n }\n return this.names[name];\n }\n}","// regexp should match the WHOLE segmented part\n// export const PID_RE=/(^|[^\\d\\u20e3\\ufe0e\\ufe0f])([2-9]\\d{4,5}|1\\d{4,6})(?![\\d\\u20e3\\ufe0e\\ufe0f])/g;\nexport const PID_RE=/(^|[^\\d\\u20e3\\ufe0e\\ufe0f])(#\\d{1,7})(?![\\d\\u20e3\\ufe0e\\ufe0f])/g;\n// TODO: fix this re\n// export const URL_PID_RE=/((?:https?:\\/\\/)?thuhole\\.com\\/?#(?:#|%23)([2-9]\\d{4,5}|1\\d{4,6}))(?!\\d|\\u20e3|\\ufe0e|\\ufe0f)/g;\nexport const URL_PID_RE=/((?:https?:\\/\\/)?thuhole\\.com\\/?#(?:#|%23)(\\d{1,7}))(?!\\d|\\u20e3|\\ufe0e|\\ufe0f)/g;\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;\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;\n\nexport function split_text(txt,rules) {\n // rules: [['name',/regex/],...]\n // return: [['name','part'],[null,'part'],...]\n\n txt=[[null,txt]];\n rules.forEach((rule)=>{\n let [name,regex]=rule;\n txt=[].concat.apply([],txt.map((part)=>{\n let [rule,content]=part;\n if(rule) // already tagged by previous rules\n return [part];\n else {\n return content\n .split(regex)\n .map((seg)=>(\n regex.test(seg) ? [name,seg] : [null,seg]\n ))\n .filter(([name,seg])=>(\n name!==null || seg\n ));\n }\n }));\n });\n return txt;\n}\n","export function get_json(res) {\n if(!res.ok) throw Error(`网络错误 ${res.status} ${res.statusText}`);\n return (\n res\n .text()\n .then((t)=>{\n try {\n return JSON.parse(t);\n } catch(e) {\n console.error('json parse error');\n console.trace(e);\n console.log(t);\n throw new SyntaxError('JSON Parse Error '+t.substr(0,50));\n }\n })\n );\n}\n\nexport function listen_darkmode(override) { // override: true/false/undefined\n function update_color_scheme() {\n if(override===undefined ? window.matchMedia('(prefers-color-scheme: dark)').matches : override)\n document.body.classList.add('root-dark-mode');\n else\n document.body.classList.remove('root-dark-mode');\n }\n\n update_color_scheme();\n window.matchMedia('(prefers-color-scheme: dark)').addListener(()=>{\n update_color_scheme();\n });\n}\n\nexport function API_VERSION_PARAM() {\n return '&PKUHelperAPI=3.0&jsapiver='+encodeURIComponent((process.env.REACT_APP_BUILD_INFO||'null')+'-'+(Math.floor(+new Date()/7200000)*2));\n}","import React, {Component, PureComponent} from 'react';\nimport ReactDOM from 'react-dom';\n\nimport TimeAgo from 'react-timeago';\nimport chineseStrings from 'react-timeago/lib/language-strings/zh-CN';\nimport buildFormatter from 'react-timeago/lib/formatters/buildFormatter';\n\nimport './global.css';\nimport './widgets.css';\n\nimport appicon_hole from './appicon/hole.png';\nimport appicon_imasugu from './appicon/imasugu.png';\nimport appicon_imasugu_rev from './appicon/imasugu_rev.png';\nimport appicon_syllabus from './appicon/syllabus.png';\nimport appicon_score from './appicon/score.png';\nimport appicon_course_survey from './appicon/course_survey.png';\nimport appicon_dropdown from './appicon/dropdown.png';\nimport appicon_dropdown_rev from './appicon/dropdown_rev.png';\nimport appicon_homepage from './appicon/homepage.png';\nimport {THUHOLE_API_ROOT} from './const';\nimport {get_json, API_VERSION_PARAM} from './functions';\n\nconst LOGIN_POPUP_ANCHOR_ID='pkuhelper_login_popup_anchor';\n\nfunction pad2(x) {\n return x<10 ? '0'+x : ''+x;\n}\nexport function format_time(time) {\n return `${time.getMonth()+1}-${pad2(time.getDate())} ${time.getHours()}:${pad2(time.getMinutes())}:${pad2(time.getSeconds())}`;\n}\nconst chinese_format=buildFormatter(chineseStrings);\nexport function Time(props) {\n const time=new Date(props.stamp*1000);\n return (\n \n \n \n {format_time(time)}\n \n );\n}\n\nexport function TitleLine(props) {\n return (\n \n {props.text} \n
\n )\n}\n\nexport function GlobalTitle(props) {\n return (\n \n );\n}\n\nconst FALLBACK_APPS={\n // id, text, url, icon_normal, icon_hover, new_tab\n bar: [\n ['hole', '树洞', '/hole', appicon_hole, null, false],\n ['imasugu', '教室', '/spare_classroom', appicon_imasugu, appicon_imasugu_rev, false],\n ['syllabus', '课表', '/syllabus', appicon_syllabus, null, false],\n ['score', '成绩', '/my_score', appicon_score, null, false],\n ],\n dropdown: [\n ['course_survey', '课程测评', 'https://courses.pinzhixiaoyuan.com/', appicon_course_survey, null, true],\n ['homepage', '客户端', '/', appicon_homepage, null, true],\n ],\n fix: {},\n};\n// const SWITCHER_DATA_VER='switcher_2';\n// const SWITCHER_DATA_URL=THUHOLE_API_ROOT+'web_static/appswitcher_items.json';\n\n// export class AppSwitcher extends Component {\n// constructor(props) {\n// super(props);\n// this.state={\n// apps: this.get_apps_from_localstorage(),\n// }\n// }\n//\n// get_apps_from_localstorage() {\n// let ret=FALLBACK_APPS;\n// if(localStorage['APPSWITCHER_ITEMS'])\n// try {\n// let content=JSON.parse(localStorage['APPSWITCHER_ITEMS'])[SWITCHER_DATA_VER];\n// if(!content || !content.bar)\n// throw new Error('content is empty');\n//\n// ret=content;\n// } catch(e) {\n// console.error('load appswitcher items from localstorage failed');\n// console.trace(e);\n// }\n//\n// return ret;\n// }\n//\n// check_fix() {\n// if(this.state.apps && this.state.apps.fix && this.state.apps.fix[this.props.appid])\n// setTimeout(()=>{\n// window.HOTFIX_CONTEXT={\n// build_info: process.env.REACT_APP_BUILD_INFO || '---',\n// build_env: process.env.NODE_ENV,\n// };\n// eval(this.state.apps.fix[this.props.appid]);\n// },1); // make it async so failures won't be critical\n// }\n//\n// componentDidMount() {\n// this.check_fix();\n// setTimeout(()=>{\n// fetch(SWITCHER_DATA_URL)\n// .then((res)=>{\n// if(!res.ok) throw Error(`网络错误 ${res.status} ${res.statusText}`);\n// return res.text();\n// })\n// .then((txt)=>{\n// if(txt!==localStorage['APPSWITCHER_ITEMS']) {\n// console.log('loaded new appswitcher items',txt);\n// localStorage['APPSWITCHER_ITEMS']=txt;\n//\n// this.setState({\n// apps: this.get_apps_from_localstorage(),\n// });\n// } else {\n// console.log('appswitcher items unchanged');\n// }\n// })\n// .catch((e)=>{\n// console.error('loading appswitcher items failed');\n// console.trace(e);\n// });\n// },500);\n// }\n//\n// componentDidUpdate(prevProps, prevState) {\n// if(this.state.apps!==prevState.apps)\n// this.check_fix();\n// }\n//\n// render() {\n// let cur_id=this.props.appid;\n//\n// function app_elem([id,title,url,icon_normal,icon_hover,new_tab],no_class=false,ref=null) {\n// return (\n// \n// {!!icon_normal && [\n// ,\n// \n// ]}\n// {title} \n// \n// );\n// }\n//\n// let dropdown_cur_app=null;\n// this.state.apps.dropdown.forEach((app)=>{\n// if(app[0]===cur_id)\n// dropdown_cur_app=app;\n// });\n//\n// //console.log(JSON.stringify(this.state.apps));\n//\n// return (\n// \n//
PKUHelper \n// {this.state.apps.bar.map((app)=>\n// app_elem(app)\n// )}\n// {!!this.state.apps.dropdown.length &&\n//
\n//
\n// {!!dropdown_cur_app ?\n// app_elem((()=>{\n// let [id,title,_url,icon_normal,icon_hover,_new_tab]=dropdown_cur_app;\n// return [id,title+'▾',null,icon_normal,icon_hover,false];\n// })(),true) :\n// app_elem(['-placeholder-elem','更多▾',null,appicon_dropdown,appicon_dropdown_rev,false],true)\n// }\n//
\n// {this.state.apps.dropdown.map((app)=>{\n// let ref=React.createRef();\n// return (\n//
{\n// if(!e.target.closest('a') && ref.current)\n// ref.current.click();\n// }}>\n// {app_elem(app,true,ref)}\n//
\n// );\n// })}\n//
\n// }\n//
网页版 \n//
\n// );\n// }\n// }\n\nclass LoginPopupSelf extends Component {\n constructor(props) {\n super(props);\n this.state={\n loading_status: 'idle',\n // excluded_scopes: [],\n };\n this.username_ref=React.createRef();\n this.password_ref=React.createRef();\n this.input_token_ref=React.createRef();\n\n this.popup_anchor=document.getElementById(LOGIN_POPUP_ANCHOR_ID);\n if(!this.popup_anchor) {\n this.popup_anchor=document.createElement('div');\n this.popup_anchor.id=LOGIN_POPUP_ANCHOR_ID;\n document.body.appendChild(this.popup_anchor);\n }\n }\n\n do_sendcode(type) {\n if(this.state.loading_status==='loading')\n return;\n\n this.setState({\n loading_status: 'loading',\n },()=>{\n fetch(\n THUHOLE_API_ROOT+'api_xmcp/login/send_code'\n +'?user='+encodeURIComponent(this.username_ref.current.value)\n +'&code_type='+encodeURIComponent(type)\n +API_VERSION_PARAM(), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n excluded_scopes: [],\n }),\n }\n )\n .then(get_json)\n .then((json)=>{\n console.log(json);\n if(!json.success)\n throw new Error(JSON.stringify(json));\n\n alert(json.msg);\n this.setState({\n loading_status: 'done',\n });\n })\n .catch((e)=>{\n console.error(e);\n alert('发送失败\\n'+e);\n this.setState({\n loading_status: 'done',\n });\n });\n\n });\n }\n\n do_login(set_token) {\n if(this.state.loading_status==='loading')\n return;\n\n this.setState({\n loading_status: 'loading',\n },()=>{\n fetch(\n THUHOLE_API_ROOT+'api_xmcp/login/login'\n +'?user='+encodeURIComponent(this.username_ref.current.value)\n +'&valid_code='+encodeURIComponent(this.password_ref.current.value)\n +API_VERSION_PARAM(), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n excluded_scopes: [],\n }),\n }\n )\n .then(get_json)\n .then((json)=>{\n if(json.code!==0) {\n if(json.msg) throw new Error(json.msg);\n throw new Error(JSON.stringify(json));\n }\n\n set_token(json.user_token);\n alert(`登录成功`);\n this.setState({\n loading_status: 'done',\n });\n this.props.on_close();\n })\n .catch((e)=>{\n console.error(e);\n alert('登录失败\\n'+e);\n this.setState({\n loading_status: 'done',\n });\n });\n });\n }\n\n do_input_token(set_token) {\n if(this.state.loading_status==='loading')\n return;\n\n let token=this.input_token_ref.current.value;\n this.setState({\n loading_status: 'loading',\n },()=>{\n fetch(THUHOLE_API_ROOT+'api_xmcp/hole/system_msg?user_token='+encodeURIComponent(token)+API_VERSION_PARAM())\n .then((res)=>res.json())\n .then((json)=>{\n if(json.error)\n throw new Error(json.error);\n if(json.result.length===0)\n throw new Error('result check failed');\n this.setState({\n loading_status: 'done',\n });\n set_token(token);\n this.props.on_close();\n })\n .catch((e)=>{\n alert('Token检验失败\\n'+e);\n this.setState({\n loading_status: 'done',\n });\n console.error(e);\n });\n });\n }\n\n // perm_alert() {\n // alert('如果你不需要 PKU Helper 的某项功能,可以取消相应权限。\\n其中【状态信息】包括你的网费、校园卡余额等。\\n该设置应用到你的【所有】设备,取消后如需再次启用相应功能需要重新登录。');\n // }\n\n render() {\n // let PERM_SCOPES=[\n // ['score','成绩查询'],\n // ['syllabus','课表查询'],\n // ['my_info','状态信息'],\n // ];\n\n return ReactDOM.createPortal(\n ,\n this.popup_anchor,\n );\n }\n}\n\nexport class LoginPopup extends Component {\n constructor(props) {\n super(props);\n this.state={\n popup_show: false,\n };\n this.on_popup_bound=this.on_popup.bind(this);\n this.on_close_bound=this.on_close.bind(this);\n }\n\n on_popup() {\n this.setState({\n popup_show: true,\n });\n }\n on_close() {\n this.setState({\n popup_show: false,\n });\n }\n\n render() {\n return (\n <>\n {this.props.children(this.on_popup_bound)}\n {this.state.popup_show &&\n \n }\n >\n );\n }\n}","const HOLE_CACHE_DB_NAME='hole_cache_db';\nconst CACHE_DB_VER=1;\nconst MAINTENANCE_STEP=150;\nconst MAINTENANCE_COUNT=1000;\n\nconst ENC_KEY=42;\n\nclass Cache {\n constructor() {\n this.db=null;\n this.added_items_since_maintenance=0;\n this.encrypt=this.encrypt.bind(this);\n this.decrypt=this.decrypt.bind(this);\n const open_req=indexedDB.open(HOLE_CACHE_DB_NAME,CACHE_DB_VER);\n open_req.onerror=console.error.bind(console);\n open_req.onupgradeneeded=(event)=>{\n console.log('comment cache db upgrade');\n const db=event.target.result;\n const store=db.createObjectStore('comment',{\n keyPath: 'pid',\n });\n store.createIndex('last_access','last_access',{unique: false});\n };\n open_req.onsuccess=(event)=>{\n console.log('comment cache db loaded');\n this.db=event.target.result;\n setTimeout(this.maintenance.bind(this),1);\n };\n }\n\n // use window.hole_cache.encrypt() only after cache is loaded!\n encrypt(pid,data) {\n let s=JSON.stringify(data);\n let o='';\n for(let i=0,key=(ENC_KEY^pid)%128;i{\n if(!this.db)\n return resolve(null);\n const tx=this.db.transaction(['comment'],'readwrite');\n const store=tx.objectStore('comment');\n const get_req=store.get(pid);\n get_req.onsuccess=()=>{\n let res=get_req.result;\n if(!res || !res.data_str) {\n //console.log('comment cache miss '+pid);\n resolve(null);\n } else if(target_version===res.version) { // hit\n console.log('comment cache hit',pid);\n res.last_access=(+new Date());\n store.put(res);\n let data=this.decrypt(pid,res.data_str);\n resolve(data); // obj or null\n } else { // expired\n console.log('comment cache expired',pid,': ver',res.version,'target',target_version);\n store.delete(pid);\n resolve(null);\n }\n };\n get_req.onerror=(e)=>{\n console.warn('comment cache indexeddb open failed');\n console.error(e);\n resolve(null);\n };\n });\n }\n\n put(pid,target_version,data) {\n pid=parseInt(pid);\n return new Promise((resolve,reject)=>{\n if(!this.db)\n return resolve();\n const tx=this.db.transaction(['comment'],'readwrite');\n const store=tx.objectStore('comment');\n store.put({\n pid: pid,\n version: target_version,\n data_str: this.encrypt(pid,data),\n last_access: +new Date(),\n });\n if(++this.added_items_since_maintenance===MAINTENANCE_STEP)\n setTimeout(this.maintenance.bind(this),1);\n });\n }\n\n delete(pid) {\n pid=parseInt(pid);\n return new Promise((resolve,reject)=>{\n if(!this.db)\n return resolve();\n const tx=this.db.transaction(['comment'],'readwrite');\n const store=tx.objectStore('comment');\n let req=store.delete(pid);\n //console.log('comment cache delete',pid);\n req.onerror=()=>{\n console.warn('comment cache delete failed ',pid);\n return resolve();\n };\n req.onsuccess=()=>resolve();\n });\n }\n\n maintenance() {\n if(!this.db)\n return;\n const tx=this.db.transaction(['comment'],'readwrite');\n const store=tx.objectStore('comment');\n let count_req=store.count();\n count_req.onsuccess=()=>{\n let count=count_req.result;\n if(count>MAINTENANCE_COUNT) {\n console.log('comment cache db maintenance',count);\n store.index('last_access').openKeyCursor().onsuccess=(e)=>{\n let cur=e.target.result;\n if(cur) {\n //console.log('maintenance: delete',cur);\n store.delete(cur.primaryKey);\n if(--count>MAINTENANCE_COUNT)\n cur.continue();\n }\n };\n } else {\n console.log('comment cache db no need to maintenance',count);\n }\n this.added_items_since_maintenance=0;\n };\n count_req.onerror=console.error.bind(console);\n }\n\n clear() {\n if(!this.db)\n return;\n indexedDB.deleteDatabase(HOLE_CACHE_DB_NAME);\n console.log('delete comment cache db');\n }\n};\n\nexport function cache() {\n if(!window.hole_cache)\n window.hole_cache=new Cache();\n return window.hole_cache;\n}","import {get_json, API_VERSION_PARAM} from './infrastructure/functions';\nimport {THUHOLE_API_ROOT} from './infrastructure/const';\nimport {API_BASE} from './Common';\nimport {cache} from './cache';\n\nexport {THUHOLE_API_ROOT, API_VERSION_PARAM};\n\nexport function token_param(token) {\n return API_VERSION_PARAM()+(token ? ('&user_token='+token) : '');\n}\n\nexport {get_json};\n\nconst SEARCH_PAGESIZE=50;\n\nexport const API={\n load_replies: (pid,token,color_picker,cache_version)=>{\n pid=parseInt(pid);\n return fetch(\n API_BASE+'/api.php?action=getcomment'+\n '&pid='+pid+\n token_param(token)\n )\n .then(get_json)\n .then((json)=>{\n if(json.code!==0) {\n if(json.msg) throw new Error(json.msg);\n else throw new Error(JSON.stringify(json));\n }\n\n cache().delete(pid).then(()=>{\n cache().put(pid,cache_version,json);\n });\n\n // also change load_replies_with_cache!\n json.data=json.data\n .sort((a,b)=>{\n return parseInt(a.cid,10)-parseInt(b.cid,10);\n })\n .map((info)=>{\n info._display_color=color_picker.get(info.name);\n info.variant={};\n return info;\n });\n\n return json;\n });\n },\n\n load_replies_with_cache: (pid,token,color_picker,cache_version)=> {\n pid=parseInt(pid);\n return cache().get(pid,cache_version)\n .then((json)=>{\n if(json) {\n // also change load_replies!\n json.data=json.data\n .sort((a,b)=>{\n return parseInt(a.cid,10)-parseInt(b.cid,10);\n })\n .map((info)=>{\n info._display_color=color_picker.get(info.name);\n info.variant={};\n return info;\n });\n\n return json;\n }\n else\n return API.load_replies(pid,token,color_picker,cache_version);\n });\n },\n\n set_attention: (pid,attention,token)=>{\n let data=new URLSearchParams();\n data.append('user_token',token);\n data.append('pid',pid);\n data.append('switch',attention ? '1' : '0');\n return fetch(API_BASE+'/api.php?action=attention'+token_param(token), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n })\n .then(get_json)\n .then((json)=>{\n cache().delete(pid);\n if(json.code!==0) {\n if(json.msg && json.msg==='已经关注过了') {}\n else {\n if(json.msg) alert(json.msg);\n throw new Error(JSON.stringify(json));\n }\n }\n return json;\n });\n },\n\n report: (pid,reason,token)=>{\n let data=new URLSearchParams();\n data.append('user_token',token);\n data.append('pid',pid);\n data.append('reason',reason);\n return fetch(API_BASE+'/api.php?action=report'+token_param(token), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n })\n .then(get_json)\n .then((json)=>{\n if(json.code!==0) {\n if(json.msg) alert(json.msg);\n throw new Error(JSON.stringify(json));\n }\n return json;\n });\n },\n\n get_list: (page,token)=>{\n return fetch(\n API_BASE+'/api.php?action=getlist'+\n '&p='+page+\n token_param(token)\n )\n .then(get_json)\n .then((json)=>{\n if(json.code!==0)\n throw new Error(JSON.stringify(json));\n return json;\n });\n },\n\n get_search: (page,keyword,token)=>{\n return fetch(\n API_BASE+'/api.php?action=search'+\n '&pagesize='+SEARCH_PAGESIZE+\n '&page='+page+\n '&keywords='+encodeURIComponent(keyword)+\n token_param(token)\n )\n .then(get_json)\n .then((json)=>{\n if(json.code!==0) {\n if(json.msg) throw new Error(json.msg);\n throw new Error(JSON.stringify(json));\n }\n return json;\n });\n },\n\n get_single: (pid,token)=>{\n return fetch(\n API_BASE+'/api.php?action=getone'+\n '&pid='+pid+\n token_param(token)\n )\n .then(get_json)\n .then((json)=>{\n if(json.code!==0) {\n if(json.msg) throw new Error(json.msg);\n else throw new Error(JSON.stringify(json));\n }\n return json;\n });\n },\n\n get_attention: (token)=>{\n return fetch(\n API_BASE+'/api.php?action=getattention'+\n token_param(token)\n )\n .then(get_json)\n .then((json)=>{\n if(json.code!==0) {\n if(json.msg) throw new Error(json.msg);\n throw new Error(JSON.stringify(json));\n }\n return json;\n });\n },\n};","import React, {Component, PureComponent} from 'react';\nimport {format_time,Time,TitleLine} from './infrastructure/widgets';\nimport {THUHOLE_API_ROOT} from './flows_api';\n\nimport './Common.css';\n\nexport {format_time,Time,TitleLine};\n\nexport const API_BASE=THUHOLE_API_ROOT+'services/thuhole';\n\n// https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\nfunction escape_regex(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\nexport function build_highlight_re(txt,split,option='g') {\n return txt ? new RegExp(`(${txt.split(split).filter((x)=>!!x).map(escape_regex).join('|')})`,option) : /^$/g;\n}\n\nexport function ColoredSpan(props) {\n return (\n {props.children} \n )\n}\n\nexport class HighlightedText extends PureComponent {\n render() {\n function normalize_url(url) {\n return /^https?:\\/\\//.test(url) ? url : 'http://'+url;\n }\n return (\n \n {this.props.parts.map((part,idx)=>{\n let [rule,p]=part;\n return (\n {\n rule==='url_pid' ? /## :\n rule==='url' ? {p} :\n rule==='pid' ? {e.preventDefault(); this.props.show_pid(p.substring(1));}}>{p} :\n rule==='nickname' ? {p} :\n rule==='search' ? {p} :\n p\n } \n );\n })}\n \n )\n }\n}\n\nwindow.TEXTAREA_BACKUP={};\n\nexport class SafeTextarea extends Component {\n constructor(props) {\n super(props);\n this.state={\n text: '',\n };\n this.on_change_bound=this.on_change.bind(this);\n this.on_keydown_bound=this.on_keydown.bind(this);\n this.clear=this.clear.bind(this);\n this.area_ref=React.createRef();\n this.change_callback=props.on_change||(()=>{});\n this.submit_callback=props.on_submit||(()=>{});\n }\n\n componentDidMount() {\n this.setState({\n text: window.TEXTAREA_BACKUP[this.props.id]||''\n },()=>{\n this.change_callback(this.state.text);\n });\n }\n\n componentWillUnmount() {\n window.TEXTAREA_BACKUP[this.props.id]=this.state.text;\n this.change_callback(this.state.text);\n }\n\n on_change(event) {\n this.setState({\n text: event.target.value,\n });\n this.change_callback(event.target.value);\n }\n on_keydown(event) {\n if(event.key==='Enter' && event.ctrlKey && !event.altKey) {\n event.preventDefault();\n this.submit_callback();\n }\n }\n\n clear() {\n this.setState({\n text: '',\n });\n }\n set(text) {\n this.change_callback(text);\n this.setState({\n text: text,\n });\n }\n get() {\n return this.state.text;\n }\n focus() {\n this.area_ref.current.focus();\n }\n\n render() {\n return (\n \n )\n }\n}\n\nlet pwa_prompt_event=null;\nwindow.addEventListener('beforeinstallprompt', (e) => {\n console.log('pwa: received before install prompt');\n pwa_prompt_event=e;\n});\n\nexport function PromotionBar(props) {\n let is_ios=/iPhone|iPad|iPod/i.test(window.navigator.userAgent);\n let is_installed=(window.matchMedia('(display-mode: standalone)').matches) || (window.navigator.standalone);\n\n if(is_installed)\n return null;\n\n if(is_ios)\n // noinspection JSConstructorReturnsPrimitive\n return !navigator.standalone ? (\n \n \n 用 Safari 把树洞 添加到主屏幕 更好用\n
\n ) : null;\n else\n // noinspection JSConstructorReturnsPrimitive\n return pwa_prompt_event ? (\n \n ) : null;\n}\n\nexport class ClickHandler extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n moved: true,\n init_y: 0,\n init_x: 0,\n };\n this.on_begin_bound=this.on_begin.bind(this);\n this.on_move_bound=this.on_move.bind(this);\n this.on_end_bound=this.on_end.bind(this);\n\n this.MOVE_THRESHOLD=3;\n this.last_fire=0;\n }\n\n on_begin(e) {\n //console.log('click',(e.touches?e.touches[0]:e).screenY,(e.touches?e.touches[0]:e).screenX);\n this.setState({\n moved: false,\n init_y: (e.touches?e.touches[0]:e).screenY,\n init_x: (e.touches?e.touches[0]:e).screenX,\n });\n }\n on_move(e) {\n if(!this.state.moved) {\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);\n //console.log('move',mvmt);\n if(mvmt>this.MOVE_THRESHOLD)\n this.setState({\n moved: true,\n });\n }\n }\n on_end(event) {\n //console.log('end');\n if(!this.state.moved)\n this.do_callback(event);\n this.setState({\n moved: true,\n });\n }\n\n do_callback(event) {\n if(this.last_fire+100>+new Date()) return;\n this.last_fire=+new Date();\n this.props.callback(event);\n }\n\n render() {\n return (\n \n {this.props.children}\n
\n )\n }\n}","export function on(el, eventName, callback, opts) {\n opts = opts || false;\n if (el.addEventListener) {\n el.addEventListener(eventName, callback, opts);\n } else if (el.attachEvent) {\n el.attachEvent(`on${eventName}`, (e) => {\n callback.call(el, e || window.event);\n });\n }\n}\n\nexport function off(el, eventName, callback, opts) {\n opts = opts || false;\n if (el.removeEventListener) {\n el.removeEventListener(eventName, callback, opts);\n } else if (el.detachEvent) {\n el.detachEvent(`on${eventName}`, callback);\n }\n}\n","/**\n * @fileOverview Find scroll parent\n */\n\nexport default (node) => {\n if (!(node instanceof HTMLElement)) {\n return document.documentElement;\n }\n\n const excludeStaticParent = node.style.position === 'absolute';\n const overflowRegex = /(scroll|auto)/;\n let parent = node;\n\n while (parent) {\n if (!parent.parentNode) {\n return node.ownerDocument || document.documentElement;\n }\n\n const style = window.getComputedStyle(parent);\n const position = style.position;\n const overflow = style.overflow;\n const overflowX = style['overflow-x'];\n const overflowY = style['overflow-y'];\n\n if (position === 'static' && excludeStaticParent) {\n parent = parent.parentNode;\n continue;\n }\n\n if (overflowRegex.test(overflow) && overflowRegex.test(overflowX) && overflowRegex.test(overflowY)) {\n return parent;\n }\n\n parent = parent.parentNode;\n }\n\n return node.ownerDocument || node.documentElement || document.documentElement;\n};\n","/**\n * react-lazyload\n */\nimport React, { Component, PureComponent } from 'react';\nimport ReactDom from 'react-dom';\nimport PropTypes from 'prop-types';\nimport { on, off } from './utils/event';\nimport scrollParent from './utils/scrollParent';\nimport debounce from './utils/debounce';\nimport throttle from './utils/throttle';\n\nconst defaultBoundingClientRect = { top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0 };\nconst LISTEN_FLAG = 'data-lazyload-listened';\nconst listeners = [];\nlet pending = [];\n\n// try to handle passive events\nlet passiveEventSupported = false;\ntry {\n const opts = Object.defineProperty({}, 'passive', {\n get() {\n passiveEventSupported = true;\n }\n });\n window.addEventListener('test', null, opts);\n}\ncatch (e) { }\n// if they are supported, setup the optional params\n// IMPORTANT: FALSE doubles as the default CAPTURE value!\nconst passiveEvent = passiveEventSupported ? { capture: false, passive: true } : false;\n\n\n/**\n * Check if `component` is visible in overflow container `parent`\n * @param {node} component React component\n * @param {node} parent component's scroll parent\n * @return {bool}\n */\nconst checkOverflowVisible = function checkOverflowVisible(component, parent) {\n const node = ReactDom.findDOMNode(component);\n\n let parentTop;\n let parentHeight;\n\n try {\n ({ top: parentTop, height: parentHeight } = parent.getBoundingClientRect());\n } catch (e) {\n ({ top: parentTop, height: parentHeight } = defaultBoundingClientRect);\n }\n\n const windowInnerHeight = window.innerHeight || document.documentElement.clientHeight;\n\n // calculate top and height of the intersection of the element's scrollParent and viewport\n const intersectionTop = Math.max(parentTop, 0); // intersection's top relative to viewport\n const intersectionHeight = Math.min(windowInnerHeight, parentTop + parentHeight) - intersectionTop; // height\n\n // check whether the element is visible in the intersection\n let top;\n let height;\n\n try {\n ({ top, height } = node.getBoundingClientRect());\n } catch (e) {\n ({ top, height } = defaultBoundingClientRect);\n }\n\n const offsetTop = top - intersectionTop; // element's top relative to intersection\n\n const offsets = Array.isArray(component.props.offset) ?\n component.props.offset :\n [component.props.offset, component.props.offset]; // Be compatible with previous API\n\n return (offsetTop - offsets[0] <= intersectionHeight) &&\n (offsetTop + height + offsets[1] >= 0);\n};\n\n/**\n * Check if `component` is visible in document\n * @param {node} component React component\n * @return {bool}\n */\nconst checkNormalVisible = function checkNormalVisible(component) {\n const node = ReactDom.findDOMNode(component);\n\n // If this element is hidden by css rules somehow, it's definitely invisible\n if (!(node.offsetWidth || node.offsetHeight || node.getClientRects().length)) return false;\n\n let top;\n let elementHeight;\n\n try {\n ({ top, height: elementHeight } = node.getBoundingClientRect());\n } catch (e) {\n ({ top, height: elementHeight } = defaultBoundingClientRect);\n }\n\n const windowInnerHeight = window.innerHeight || document.documentElement.clientHeight;\n\n const offsets = Array.isArray(component.props.offset) ?\n component.props.offset :\n [component.props.offset, component.props.offset]; // Be compatible with previous API\n\n return (top - offsets[0] <= windowInnerHeight) &&\n (top + elementHeight + offsets[1] >= 0);\n};\n\n\n/**\n * Detect if element is visible in viewport, if so, set `visible` state to true.\n * If `once` prop is provided true, remove component as listener after checkVisible\n *\n * @param {React} component React component that respond to scroll and resize\n */\nconst checkVisible = function checkVisible(component) {\n const node = ReactDom.findDOMNode(component);\n if (!(node instanceof HTMLElement)) {\n return;\n }\n\n const parent = scrollParent(node);\n const isOverflow = component.props.overflow &&\n parent !== node.ownerDocument &&\n parent !== document &&\n parent !== document.documentElement;\n const visible = isOverflow ?\n checkOverflowVisible(component, parent) :\n checkNormalVisible(component);\n if (visible) {\n // Avoid extra render if previously is visible\n if (!component.state.visible || component.state.hidden) {\n if (component.props.once) {\n pending.push(component);\n }\n\n //console.log('lazyload 1');\n component.setState({\n visible: true,\n hidden: false,\n });\n }\n } else if (!component.props.once) {\n if (component.props.unmountIfInvisible) {\n if(component.visible===true)\n component.setState({\n visible: false,\n });\n } else if(component.props.hiddenIfInvisible) {\n if(component.state.hidden===false) {\n //console.log('lazyload 3');\n component.setState({\n hidden: true,\n });\n }\n }\n }\n};\n\n\nconst purgePending = function purgePending() {\n pending.forEach((component) => {\n const index = listeners.indexOf(component);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n });\n\n pending = [];\n};\n\nconst lazyLoadHandler = () => {\n for (let i = 0; i < listeners.length; ++i) {\n const listener = listeners[i];\n checkVisible(listener);\n }\n // Remove `once` component in listeners\n purgePending();\n};\n\n// Depending on component's props\nlet delayType;\nlet finalLazyLoadHandler = null;\n\nconst isString = string => typeof string === 'string';\n\nclass LazyLoad extends PureComponent {\n constructor(props) {\n super(props);\n\n this.state={\n visible: false,\n hidden: false,\n };\n }\n\n componentDidMount() {\n // It's unlikely to change delay type on the fly, this is mainly\n // designed for tests\n let scrollport = window;\n const {\n scrollContainer,\n } = this.props;\n if (scrollContainer) {\n if (isString(scrollContainer)) {\n scrollport = scrollport.document.querySelector(scrollContainer);\n }\n }\n const needResetFinalLazyLoadHandler = (this.props.debounce !== undefined && delayType === 'throttle')\n || (delayType === 'debounce' && this.props.debounce === undefined);\n\n if (needResetFinalLazyLoadHandler) {\n off(scrollport, 'scroll', finalLazyLoadHandler, passiveEvent);\n off(window, 'resize', finalLazyLoadHandler, passiveEvent);\n finalLazyLoadHandler = null;\n }\n\n if (!finalLazyLoadHandler) {\n if (this.props.debounce !== undefined) {\n finalLazyLoadHandler = debounce(lazyLoadHandler, typeof this.props.debounce === 'number' ?\n this.props.debounce :\n 300);\n delayType = 'debounce';\n } else if (this.props.throttle !== undefined) {\n finalLazyLoadHandler = throttle(lazyLoadHandler, typeof this.props.throttle === 'number' ?\n this.props.throttle :\n 300);\n delayType = 'throttle';\n } else {\n finalLazyLoadHandler = lazyLoadHandler;\n }\n }\n\n if (this.props.overflow) {\n const parent = scrollParent(ReactDom.findDOMNode(this));\n if (parent && typeof parent.getAttribute === 'function') {\n const listenerCount = 1 + (+parent.getAttribute(LISTEN_FLAG));\n if (listenerCount === 1) {\n parent.addEventListener('scroll', finalLazyLoadHandler, passiveEvent);\n }\n parent.setAttribute(LISTEN_FLAG, listenerCount);\n }\n } else if (listeners.length === 0 || needResetFinalLazyLoadHandler) {\n const { scroll, resize } = this.props;\n\n if (scroll) {\n on(scrollport, 'scroll', finalLazyLoadHandler, passiveEvent);\n }\n\n if (resize) {\n on(window, 'resize', finalLazyLoadHandler, passiveEvent);\n }\n }\n\n listeners.push(this);\n checkVisible(this);\n }\n\n componentWillUnmount() {\n if (this.props.overflow) {\n const parent = scrollParent(ReactDom.findDOMNode(this));\n if (parent && typeof parent.getAttribute === 'function') {\n const listenerCount = (+parent.getAttribute(LISTEN_FLAG)) - 1;\n if (listenerCount === 0) {\n parent.removeEventListener('scroll', finalLazyLoadHandler, passiveEvent);\n parent.removeAttribute(LISTEN_FLAG);\n } else {\n parent.setAttribute(LISTEN_FLAG, listenerCount);\n }\n }\n }\n\n const index = listeners.indexOf(this);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length === 0 && typeof window !== 'undefined') {\n off(window, 'resize', finalLazyLoadHandler, passiveEvent);\n off(window, 'scroll', finalLazyLoadHandler, passiveEvent);\n }\n }\n\n render() {\n //console.log('lazyload render');\n if(this.state.visible) {\n if(this.props.hiddenIfInvisible)\n return this.state.hidden ?\n {this.props.children}
:\n {this.props.children}
;\n else\n return this.props.children;\n }\n else\n return this.props.placeholder ?\n this.props.placeholder :\n
;\n }\n}\n\nLazyLoad.propTypes = {\n once: PropTypes.bool,\n height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n offset: PropTypes.oneOfType([PropTypes.number, PropTypes.arrayOf(PropTypes.number)]),\n overflow: PropTypes.bool,\n resize: PropTypes.bool,\n scroll: PropTypes.bool,\n children: PropTypes.node,\n throttle: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\n debounce: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\n placeholder: PropTypes.node,\n scrollContainer: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n unmountIfInvisible: PropTypes.bool,\n hiddenIfInvisible: PropTypes.bool,\n};\n\nLazyLoad.defaultProps = {\n once: false,\n offset: 0,\n overflow: false,\n resize: false,\n scroll: true,\n unmountIfInvisible: false,\n hiddenIfInvisible: false,\n};\n\nconst getDisplayName = WrappedComponent => WrappedComponent.displayName || WrappedComponent.name || 'Component';\n\nconst decorator = (options = {}) => function lazyload(WrappedComponent) {\n return class LazyLoadDecorated extends Component {\n constructor() {\n super();\n this.displayName = `LazyLoad${getDisplayName(WrappedComponent)}`;\n }\n\n render() {\n return (\n \n \n \n );\n }\n };\n};\n\nexport { decorator as lazyload };\nexport default LazyLoad;\nexport { lazyLoadHandler as forceCheck };\n","export default function debounce(func, wait, immediate) {\n let timeout;\n let args;\n let context;\n let timestamp;\n let result;\n\n const later = function later() {\n const last = +(new Date()) - timestamp;\n\n if (last < wait && last >= 0) {\n timeout = setTimeout(later, wait - last);\n } else {\n timeout = null;\n if (!immediate) {\n result = func.apply(context, args);\n if (!timeout) {\n context = null;\n args = null;\n }\n }\n }\n };\n\n return function debounced() {\n context = this;\n args = arguments;\n timestamp = +(new Date());\n\n const callNow = immediate && !timeout;\n if (!timeout) {\n timeout = setTimeout(later, wait);\n }\n\n if (callNow) {\n result = func.apply(context, args);\n context = null;\n args = null;\n }\n\n return result;\n };\n}\n","/*eslint-disable */\nexport default function throttle(fn, threshhold, scope) {\n threshhold || (threshhold = 250);\n var last,\n deferTimer;\n return function () {\n var context = scope || this;\n\n var now = +new Date,\n args = arguments;\n if (last && now < last + threshhold) {\n // hold on to it\n clearTimeout(deferTimer);\n deferTimer = setTimeout(function () {\n last = now;\n fn.apply(context, args);\n }, threshhold);\n } else {\n last = now;\n fn.apply(context, args);\n }\n };\n}\n","import React, {Component} from 'react';\nimport load from 'load-script';\n\nwindow.audio_cache={};\n\nfunction load_amrnb() {\n return new Promise((resolve,reject)=>{\n if(window.AMR)\n resolve();\n else\n load('static/amr_all.min.js', (err)=>{\n if(err)\n reject(err);\n else\n resolve();\n });\n });\n}\n\nexport class AudioWidget extends Component {\n constructor(props) {\n super(props);\n this.state={\n url: this.props.src,\n state: 'waiting',\n data: null,\n };\n }\n\n load() {\n if(window.audio_cache[this.state.url]) {\n this.setState({\n state: 'loaded',\n data: window.audio_cache[this.state.url],\n });\n return;\n }\n\n console.log('fetching audio',this.state.url);\n this.setState({\n state: 'loading',\n });\n Promise.all([\n fetch(this.state.url),\n load_amrnb(),\n ])\n .then((res)=>{\n res[0].blob().then((blob)=>{\n const reader=new FileReader();\n reader.onload=(event)=>{\n const raw=new window.AMR().decode(event.target.result);\n if(!raw) {\n alert('audio decoding failed');\n return;\n }\n const wave=window.PCMData.encode({\n sampleRate: 8000,\n channelCount: 1,\n bytesPerSample: 2,\n data: raw\n });\n const binary_wave=new Uint8Array(wave.length);\n for(let i=0;i加载音频
);\n if(this.state.state==='loading')\n return (正在下载……
);\n else if(this.state.state==='decoding')\n return (正在解码……
);\n else if(this.state.state==='loaded')\n return (
);\n }\n}","import React, {Component, PureComponent} from 'react';\n\nimport './Config.css';\n\nconst BUILTIN_IMGS={\n 'static/bg/gbp.jpg': '寻觅繁星(默认)',\n 'static/bg/eriri.jpg': '平成著名画师',\n 'static/bg/yurucamp.jpg': '露营天下第一',\n 'static/bg/minecraft.jpg': '麦恩·库拉夫特',\n 'static/bg/cyberpunk.jpg': '赛博城市',\n 'static/bg/sif.jpg': '梦开始的地方',\n};\n\nconst DEFAULT_CONFIG={\n background_img: 'static/bg/gbp.jpg',\n background_color: '#113366',\n pressure: false,\n easter_egg: true,\n color_scheme: 'default',\n};\n\nexport function load_config() {\n let config=Object.assign({},DEFAULT_CONFIG);\n let loaded_config;\n try {\n loaded_config=JSON.parse(localStorage['hole_config']||'{}');\n } catch(e) {\n alert('设置加载失败,将重置为默认设置!\\n'+e);\n delete localStorage['hole_config'];\n loaded_config={};\n }\n\n // unrecognized configs are removed\n Object.keys(loaded_config).forEach((key)=>{\n if(config[key]!==undefined)\n config[key]=loaded_config[key];\n });\n\n console.log('config loaded',config);\n window.config=config;\n}\nexport function save_config() {\n localStorage['hole_config']=JSON.stringify(window.config);\n load_config();\n}\n\nexport function bgimg_style(img,color) {\n if(img===undefined) img=window.config.background_img;\n if(color===undefined) color=window.config.background_color;\n return {\n background: 'transparent center center',\n backgroundImage: img===null ? 'unset' : 'url(\"'+encodeURI(img)+'\")',\n backgroundColor: color,\n backgroundSize: 'cover',\n };\n}\n\nclass ConfigBackground extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n img: window.config.background_img,\n color: window.config.background_color,\n };\n }\n\n save_changes() {\n this.props.callback({\n background_img: this.state.img,\n background_color: this.state.color,\n });\n }\n\n on_select(e) {\n let value=e.target.value;\n this.setState({\n img: value==='##other' ? '' :\n value==='##color' ? null : value,\n },this.save_changes.bind(this));\n }\n on_change_img(e) {\n this.setState({\n img: e.target.value,\n },this.save_changes.bind(this));\n }\n on_change_color(e) {\n this.setState({\n color: e.target.value,\n },this.save_changes.bind(this));\n }\n\n render() {\n let img_select= this.state.img===null ? '##color' :\n Object.keys(BUILTIN_IMGS).indexOf(this.state.img)===-1 ? '##other' : this.state.img;\n return (\n \n );\n }\n}\n\nclass ConfigColorScheme extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n color_scheme: window.config.color_scheme,\n };\n }\n\n save_changes() {\n this.props.callback({\n color_scheme: this.state.color_scheme,\n });\n }\n\n on_select(e) {\n let value=e.target.value;\n this.setState({\n color_scheme: value,\n },this.save_changes.bind(this));\n }\n\n render() {\n return (\n \n
\n 夜间模式: \n \n 跟随系统 \n 始终浅色模式 \n 始终深色模式 \n \n #color_scheme \n
\n
\n 选择浅色或深色模式,深色模式下将会调暗图片亮度\n
\n
\n )\n }\n}\n\nclass ConfigSwitch extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n switch: window.config[this.props.id],\n };\n }\n\n on_change(e) {\n let val=e.target.checked;\n this.setState({\n switch: val,\n },()=>{\n this.props.callback({\n [this.props.id]: val,\n });\n });\n }\n\n render() {\n return (\n \n
\n \n \n {this.props.name} \n #{this.props.id} \n \n
\n
\n {this.props.description}\n
\n
\n );\n }\n}\n\nexport class ConfigUI extends PureComponent {\n constructor(props) {\n super(props);\n this.save_changes_bound=this.save_changes.bind(this);\n }\n\n save_changes(chg) {\n console.log(chg);\n Object.keys(chg).forEach((key)=>{\n window.config[key]=chg[key];\n });\n save_config();\n }\n\n reset_settings() {\n if(window.confirm('重置所有设置?')) {\n window.config={};\n save_config();\n window.location.reload();\n }\n }\n\n render() {\n return (\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n 新功能建议或问题反馈请在 \n GitHub \n 提出。\n
\n
\n
\n )\n }\n}","import React, {Component, PureComponent} from 'react';\nimport {THUHOLE_API_ROOT, get_json, API_VERSION_PARAM} from './flows_api';\nimport {Time} from './Common';\n\nexport class MessageViewer extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n loading_status: 'idle',\n msg: [],\n };\n }\n\n componentDidMount() {\n this.load();\n }\n\n load() {\n if(this.state.loading_status==='loading') return;\n this.setState({\n loading_status: 'loading',\n },()=>{\n fetch(THUHOLE_API_ROOT+'api_xmcp/hole/system_msg?user_token='+encodeURIComponent(this.props.token)+API_VERSION_PARAM())\n .then(get_json)\n .then((json)=>{\n if(json.error)\n throw new Error(json.error);\n else\n this.setState({\n loading_status: 'done',\n msg: json.result,\n });\n })\n .catch((err)=>{\n console.error(err);\n alert(''+err);\n this.setState({\n loading_status: 'failed',\n });\n })\n\n });\n }\n\n render() {\n if(this.state.loading_status==='loading')\n return (加载中……
);\n else if(this.state.loading_status==='failed')\n return ();\n else if(this.state.loading_status==='done')\n return this.state.msg.map((msg)=>(\n \n
\n \n {msg.title} \n
\n
\n
\n ));\n else\n return null;\n }\n}","import React, {Component, PureComponent} from 'react';\nimport {API_BASE, SafeTextarea, PromotionBar} from './Common';\nimport {MessageViewer} from './Message';\nimport {LoginPopup} from './infrastructure/widgets';\nimport {ConfigUI} from './Config';\nimport fixOrientation from 'fix-orientation';\nimport copy from 'copy-to-clipboard';\nimport {cache} from './cache';\nimport {API_VERSION_PARAM, THUHOLE_API_ROOT, API, get_json, token_param} from './flows_api';\n\nimport './UserAction.css';\n\nconst BASE64_RATE=4/3;\nconst MAX_IMG_DIAM=8000;\nconst MAX_IMG_PX=5000000;\nconst MAX_IMG_FILESIZE=450000*BASE64_RATE;\n\nexport const TokenCtx=React.createContext({\n value: null,\n set_value: ()=>{},\n});\n\n// class LifeInfoBox extends Component {\n// constructor(props) {\n// super(props);\n// if(!window._life_info_cache)\n// window._life_info_cache={};\n// this.CACHE_TIMEOUT_S=15;\n// this.state={\n// today_info: this.cache_get('today_info'),\n// card_balance: this.cache_get('card_balance'),\n// net_balance: this.cache_get('net_balance'),\n// mail_count: this.cache_get('mail_count'),\n// };\n// this.INTERNAL_NETWORK_FAILURE='_network_failure';\n// this.API_NAME={\n// today_info: 'hole/today_info',\n// card_balance: 'isop/card_balance',\n// net_balance: 'isop/net_balance',\n// mail_count: 'isop/mail_count',\n// };\n// }\n//\n// cache_get(key) {\n// let cache_item=window._life_info_cache[key];\n// if(!cache_item || (+new Date())-cache_item[0]>1000*this.CACHE_TIMEOUT_S)\n// return null;\n// else\n// return cache_item[1];\n// }\n// cache_set(key,value) {\n// if(!window._life_info_cache[key] || window._life_info_cache[key][1]!==value)\n// window._life_info_cache[key]=[+new Date(),value];\n// }\n//\n// load(state_key) {\n// this.setState({\n// [state_key]: null,\n// },()=>{\n// fetch(\n// PKUHELPER_ROOT+'api_xmcp/'+this.API_NAME[state_key]\n// +'?user_token='+encodeURIComponent(this.props.token)\n// +API_VERSION_PARAM()\n// )\n// .then(get_json)\n// .then((json)=>{\n// //console.log(json);\n// this.setState({\n// [state_key]: json,\n// });\n// })\n// .catch((e)=>{\n// this.setState({\n// [state_key]: {\n// errMsg: '网络错误 '+e,\n// errCode: this.INTERNAL_NETWORK_FAILURE,\n// success: false,\n// }\n// });\n// })\n// });\n// }\n//\n// componentDidMount() {\n// ['today_info','card_balance','net_balance','mail_count'].forEach((k)=>{\n// if(!this.state[k])\n// this.load(k);\n// });\n// }\n//\n// reload_all() {\n// ['today_info','card_balance','net_balance','mail_count'].forEach((k)=>{\n// this.load(k);\n// });\n// }\n//\n// render_line(state_key,title,value_fn,action,url_fn,do_login) {\n// let s=this.state[state_key];\n// if(!s)\n// return (\n// \n// {title} \n// 加载中…… \n// \n// \n// );\n// else if(!s.success) {\n// let type='加载失败';\n// if(s.errCode===this.INTERNAL_NETWORK_FAILURE)\n// type='网络错误';\n// else if(['E01','E02','E03'].indexOf(s.errCode)!==-1)\n// type='授权失效';\n//\n// let details=JSON.stringify(s);\n// if(s.errMsg)\n// details=s.errMsg;\n// else if(s.error)\n// details=s.error;\n//\n// return (\n// \n// {title} \n// \n// alert(details)}>{type} \n// \n// \n// {type==='授权失效' ?\n// \n// 重新登录\n// :\n// this.load(state_key)}>\n// 重试\n// \n// }\n// \n// \n// )\n// }\n// else {\n// this.cache_set(state_key,s);\n//\n// return (\n// \n// {title} \n// {value_fn(s)} \n// \n// \n// {action}\n// \n// \n// \n// );\n// }\n// }\n//\n// render() {\n// return (\n// {\n// this.props.set_token(t);\n// this.reload_all();\n// }}>{(do_login)=>(\n// \n//
\n// \n// {this.render_line(\n// 'today_info',\n// '今日',(s)=>s.info,\n// '校历',(s)=>s.schedule_url,\n// do_login,\n// )}\n// {this.render_line(\n// 'card_balance',\n// '校园卡',(s)=>`余额¥${s.balance.toFixed(2)}`,\n// '充值',()=>'https://virtualprod.alipay.com/educate/educatePcRecharge.htm?schoolCode=PKU&schoolName=',\n// do_login,\n// )}\n// {this.render_line(\n// 'net_balance',\n// '网费',(s)=>`余额¥${s.balance.toFixed(2)}`,\n// '充值',()=>'https://its.pku.edu.cn/epay.jsp',\n// do_login,\n// )}\n// {this.render_line(\n// 'mail_count',\n// '邮件',(s)=>`未读 ${s.count} 封`,\n// '查看',()=>'https://mail.pku.edu.cn/',\n// do_login,\n// )}\n// \n//
\n//
\n// )} \n// )\n// }\n// }\n\nexport function InfoSidebar(props) {\n return (\n \n );\n}\n\nclass ResetUsertokenWidget extends Component {\n constructor(props) {\n super(props);\n this.state={\n loading_status: 'done',\n };\n }\n\n do_reset() {\n if(window.confirm('您正在重置 UserToken!\\n您的账号将会在【所有设备】上注销,您需要手动重新登录!')) {\n let uid=window.prompt('您正在重置 UserToken!\\n请输入您的学号以确认身份:');\n if(uid)\n this.setState({\n loading_status: 'loading',\n },()=>{\n fetch(THUHOLE_API_ROOT+'api_xmcp/hole/reset_usertoken', {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n user_token: this.props.token,\n uid: uid,\n }),\n })\n .then(get_json)\n .then((json)=>{\n if(json.error)\n throw new Error(json.error);\n else\n alert('重置成功!您需要在所有设备上重新登录。');\n\n this.setState({\n loading_status: 'done',\n });\n })\n .catch((e)=>{\n alert('重置失败:'+e);\n this.setState({\n loading_status: 'done',\n });\n })\n });\n }\n }\n\n render() {\n if(this.state.loading_status==='done')\n return (重置 );\n else if(this.state.loading_status==='loading')\n return ( );\n }\n}\n\nexport class LoginForm extends Component {\n copy_token(token) {\n if(copy(token))\n alert('复制成功!\\n请一定不要泄露哦');\n }\n\n render() {\n return (\n {(token)=>\n \n {/*{!!token.value &&*/}\n {/*
*/}\n {/*}*/}\n
\n {token.value ?\n
:\n
{(do_popup)=>(\n \n
\n \n \n 登录\n \n
\n
\n T大树洞 面向清华大学学生,通过清华邮箱验证您的身份并提供服务。\n
\n
\n )} \n }\n
\n
\n } \n )\n }\n}\n\nexport class ReplyForm extends Component {\n constructor(props) {\n super(props);\n this.state={\n text: '',\n loading_status: 'done',\n };\n this.on_change_bound=this.on_change.bind(this);\n this.area_ref=this.props.area_ref||React.createRef();\n this.global_keypress_handler_bound=this.global_keypress_handler.bind(this);\n }\n\n global_keypress_handler(e) {\n if(e.code==='Enter' && !e.ctrlKey && !e.altKey && ['input','textarea'].indexOf(e.target.tagName.toLowerCase())===-1) {\n if(this.area_ref.current) {\n e.preventDefault();\n this.area_ref.current.focus();\n }\n }\n }\n componentDidMount() {\n document.addEventListener('keypress',this.global_keypress_handler_bound);\n }\n componentWillUnmount() {\n document.removeEventListener('keypress',this.global_keypress_handler_bound);\n }\n\n on_change(value) {\n this.setState({\n text: value,\n });\n }\n\n on_submit(event) {\n if(event) event.preventDefault();\n if(this.state.loading_status==='loading')\n return;\n this.setState({\n loading_status: 'loading',\n });\n\n let data=new URLSearchParams();\n data.append('pid',this.props.pid);\n data.append('text',this.state.text);\n data.append('user_token',this.props.token);\n fetch(API_BASE+'/api.php?action=docomment'+token_param(this.props.token), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n })\n .then(get_json)\n .then((json)=>{\n if(json.code!==0) {\n if(json.msg) alert(json.msg);\n throw new Error(JSON.stringify(json));\n }\n\n this.setState({\n loading_status: 'done',\n text: '',\n });\n this.area_ref.current.clear();\n this.props.on_complete();\n })\n .catch((e)=>{\n console.error(e);\n alert('回复失败');\n this.setState({\n loading_status: 'done',\n });\n });\n }\n\n render() {\n return (\n \n )\n }\n}\n\nexport class PostForm extends Component {\n constructor(props) {\n super(props);\n this.state={\n text: '',\n loading_status: 'done',\n img_tip: null,\n };\n this.img_ref=React.createRef();\n this.area_ref=React.createRef();\n this.on_change_bound=this.on_change.bind(this);\n this.on_img_change_bound=this.on_img_change.bind(this);\n }\n\n componentDidMount() {\n if(this.area_ref.current)\n this.area_ref.current.focus();\n }\n\n on_change(value) {\n this.setState({\n text: value,\n });\n }\n\n do_post(text,img) {\n let data=new URLSearchParams();\n data.append('text',this.state.text);\n data.append('type',img ? 'image' : 'text');\n data.append('user_token',this.props.token);\n if(img)\n data.append('data',img);\n\n fetch(API_BASE+'/api.php?action=dopost'+token_param(this.props.token), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n })\n .then(get_json)\n .then((json)=>{\n if(json.code!==0) {\n if(json.msg) alert(json.msg);\n throw new Error(JSON.stringify(json));\n }\n\n this.setState({\n loading_status: 'done',\n text: '',\n });\n this.area_ref.current.clear();\n this.props.on_complete();\n })\n .catch((e)=>{\n console.error(e);\n alert('发表失败');\n this.setState({\n loading_status: 'done',\n });\n });\n }\n\n proc_img(file) {\n return new Promise((resolve,reject)=>{\n function return_url(url) {\n const idx=url.indexOf(';base64,');\n if(idx===-1)\n throw new Error('img not base64 encoded');\n\n return url.substr(idx+8);\n }\n\n let reader=new FileReader();\n function on_got_img(url) {\n const image = new Image();\n image.onload=(()=>{\n let width=image.width;\n let height=image.height;\n let compressed=false;\n\n if(width>MAX_IMG_DIAM) {\n height=height*MAX_IMG_DIAM/width;\n width=MAX_IMG_DIAM;\n compressed=true;\n }\n if(height>MAX_IMG_DIAM) {\n width=width*MAX_IMG_DIAM/height;\n height=MAX_IMG_DIAM;\n compressed=true;\n }\n if(height*width>MAX_IMG_PX) {\n let rate=Math.sqrt(height*width/MAX_IMG_PX);\n height/=rate;\n width/=rate;\n compressed=true;\n }\n console.log('chosen img size',width,height);\n\n let canvas=document.createElement('canvas');\n let ctx=canvas.getContext('2d');\n canvas.width=width;\n canvas.height=height;\n ctx.drawImage(image,0,0,width,height);\n\n let quality_l=.1,quality_r=.9,quality,new_url;\n while(quality_r-quality_l>=.03) {\n quality=(quality_r+quality_l)/2;\n new_url=canvas.toDataURL('image/jpeg',quality);\n console.log(quality_l,quality_r,'trying quality',quality,'size',new_url.length);\n if(new_url.length<=MAX_IMG_FILESIZE)\n quality_l=quality;\n else\n quality_r=quality;\n }\n if(quality_l>=.101) {\n console.log('chosen img quality',quality);\n resolve({\n img: return_url(new_url),\n quality: quality,\n width: Math.round(width),\n height: Math.round(height),\n compressed: compressed,\n });\n } else {\n reject('图片过大,无法上传');\n }\n });\n image.src=url;\n }\n reader.onload=(event)=>{\n fixOrientation(event.target.result,{},(fixed_dataurl)=>{\n on_got_img(fixed_dataurl);\n });\n };\n reader.readAsDataURL(file);\n });\n }\n\n on_img_change() {\n if(this.img_ref.current && this.img_ref.current.files.length)\n this.setState({\n img_tip: '(正在处理图片……)'\n },()=>{\n this.proc_img(this.img_ref.current.files[0])\n .then((d)=>{\n this.setState({\n img_tip: `(${d.compressed?'压缩到':'尺寸'} ${d.width}*${d.height} / `+\n `质量 ${Math.floor(d.quality*100)}% / ${Math.floor(d.img.length/BASE64_RATE/1000)}KB)`,\n });\n })\n .catch((e)=>{\n this.setState({\n img_tip: `图片无效:${e}`,\n });\n });\n });\n else\n this.setState({\n img_tip: null,\n });\n }\n\n on_submit(event) {\n if(event) event.preventDefault();\n if(this.state.loading_status==='loading')\n return;\n if(this.img_ref.current.files.length) {\n this.setState({\n loading_status: 'processing',\n });\n this.proc_img(this.img_ref.current.files[0])\n .then((d)=>{\n this.setState({\n loading_status: 'loading',\n });\n this.do_post(this.state.text,d.img);\n })\n .catch((e)=>{\n alert(e);\n });\n } else {\n this.setState({\n loading_status: 'loading',\n });\n this.do_post(this.state.text,null);\n }\n }\n\n render() {\n return (\n \n )\n }\n}","import React, {Component, PureComponent} from 'react';\nimport copy from 'copy-to-clipboard';\nimport {ColorPicker} from './color_picker';\nimport {split_text, NICKNAME_RE, PID_RE, URL_RE, URL_PID_RE} from './text_splitter';\nimport {format_time, build_highlight_re, Time, TitleLine, HighlightedText, ClickHandler, ColoredSpan} from './Common';\nimport './Flows.css';\nimport LazyLoad from './react-lazyload/src';\nimport {AudioWidget} from './AudioWidget';\nimport {TokenCtx, ReplyForm} from './UserAction';\n\nimport {API, THUHOLE_API_ROOT} from './flows_api';\n\nconst IMAGE_BASE=THUHOLE_API_ROOT+'/images/';\nconst AUDIO_BASE=THUHOLE_API_ROOT+'services/thuhole/audios/';\n\nconst CLICKABLE_TAGS={a: true, audio: true};\nconst PREVIEW_REPLY_COUNT=10;\n// const QUOTE_BLACKLIST=['23333','233333','66666','666666','10086','10000','100000','99999','999999','55555','555555'];\nconst QUOTE_BLACKLIST=[];\n\nwindow.LATEST_POST_ID=parseInt(localStorage['_LATEST_POST_ID'],10)||0;\n\nconst DZ_NAME='洞主';\n\nfunction load_single_meta(show_sidebar,token) {\n return (pid,replace=false)=>{\n let color_picker=new ColorPicker();\n let title_elem='树洞 #'+pid;\n show_sidebar(\n title_elem,\n \n 正在加载 #{pid}\n
,\n replace?'replace':'push'\n );\n API.get_single(pid,token)\n .then((single)=>{\n single.data.variant={};\n return new Promise((resolve,reject)=>{\n API.load_replies_with_cache(pid,token,color_picker,parseInt(single.data.reply))\n .then((replies)=>{resolve([single,replies])})\n .catch(reject);\n });\n })\n .then((res)=>{\n let [single,replies]=res;\n show_sidebar(\n title_elem,\n ,\n 'replace'\n )\n })\n .catch((e)=>{\n console.error(e);\n show_sidebar(\n title_elem,\n ,\n 'replace'\n );\n })\n };\n}\n\nclass Reply extends PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n let parts=split_text(this.props.info.text,[\n ['url_pid',URL_PID_RE],\n ['url',URL_RE],\n ['pid',PID_RE],\n ['nickname',NICKNAME_RE],\n ]);\n\n return (\n \n
\n #{this.props.info.cid}
\n {!!this.props.do_filter_name &&\n {this.props.do_filter_name(this.props.info.name);}}>\n \n \n }\n \n {this.props.info.tag!==null &&\n \n {this.props.info.tag}\n \n }\n \n
\n
\n \n
\n
\n );\n }\n}\n\nclass FlowItem extends PureComponent {\n constructor(props) {\n super(props);\n }\n\n copy_link(event) {\n event.preventDefault();\n copy(\n `${event.target.href}${this.props.info.tag ? ' 【'+this.props.info.tag+'】' : ''}\\n`+\n `${this.props.info.text}${this.props.info.type==='image'?' [图片]':this.props.info.type==='audio'?' [语音]':''}\\n`+\n `(${format_time(new Date(this.props.info.timestamp*1000))} ${this.props.info.likenum}关注 ${this.props.info.reply}回复)\\n`+\n this.props.replies.map((r)=>(\n (r.tag ? '【'+r.tag+'】' : '')+\n r.text\n )).join('\\n')\n );\n }\n\n render() {\n let props=this.props;\n let parts=props.parts||split_text(props.info.text,[\n ['url_pid',URL_PID_RE],\n ['url',URL_RE],\n ['pid',PID_RE],\n ['nickname',NICKNAME_RE],\n ]);\n return (\n \n {!!props.is_quote &&\n
\n }\n
\n {!!window.LATEST_POST_ID && parseInt(props.info.pid,10)>window.LATEST_POST_ID &&\n
\n }\n
\n {!!this.props.do_filter_name &&\n
{this.props.do_filter_name(DZ_NAME);}}>\n \n \n }\n {!!parseInt(props.info.likenum,10) &&\n
\n {props.info.likenum} \n \n \n }\n {!!parseInt(props.info.reply,10) &&\n
\n {props.info.reply} \n \n \n }\n
#{props.info.pid}
\n \n {props.info.tag!==null &&\n
\n {props.info.tag}\n \n }\n
\n
\n
\n
\n {props.info.type==='image' &&\n
\n {props.img_clickable ?\n :\n \n }\n
\n }\n {props.info.type==='audio' &&
}\n
\n {!!(props.attention && props.info.variant.latest_reply) &&\n
最新回复
\n }\n
\n
\n );\n }\n}\n\nclass FlowSidebar extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n attention: props.attention,\n info: props.info,\n replies: props.replies,\n loading_status: 'done',\n error_msg: null,\n filter_name: null,\n rev: false,\n };\n this.color_picker=props.color_picker;\n this.syncState=props.sync_state||(()=>{});\n this.reply_ref=React.createRef();\n }\n\n set_variant(cid,variant) {\n this.setState((prev)=>{\n if(cid)\n return {\n replies: prev.replies.map((reply)=>{\n if(reply.cid===cid)\n return Object.assign({},reply,{variant: Object.assign({},reply.variant,variant)});\n else\n return reply;\n }),\n };\n else\n return {\n info: Object.assign({},prev.info,{variant: Object.assign({},prev.info.variant,variant)}),\n }\n },function() {\n this.syncState({\n info: this.state.info,\n replies: this.state.replies,\n });\n });\n }\n\n load_replies(update_count=true) {\n this.setState({\n loading_status: 'loading',\n error_msg: null,\n });\n API.load_replies(this.state.info.pid,this.props.token,this.color_picker,null)\n .then((json)=>{\n this.setState((prev,props)=>({\n replies: json.data,\n info: update_count ? Object.assign({}, prev.info, {\n reply: ''+json.data.length,\n }) : prev.info,\n attention: !!json.attention,\n loading_status: 'done',\n error_msg: null,\n }), ()=>{\n this.syncState({\n replies: this.state.replies,\n attention: this.state.attention,\n info: this.state.info,\n });\n if(this.state.replies.length)\n this.set_variant(null,{latest_reply: Math.max.apply(null,this.state.replies.map((r)=>parseInt(r.timestamp)))});\n });\n })\n .catch((e)=>{\n console.error(e);\n this.setState({\n replies: [],\n loading_status: 'done',\n error_msg: ''+e,\n });\n });\n }\n\n toggle_attention() {\n this.setState({\n loading_status: 'loading',\n });\n const next_attention=!this.state.attention;\n API.set_attention(this.state.info.pid,next_attention,this.props.token)\n .then((json)=>{\n this.setState({\n loading_status: 'done',\n attention: next_attention,\n });\n this.syncState({\n attention: next_attention,\n });\n })\n .catch((e)=>{\n this.setState({\n loading_status: 'done'\n });\n alert('设置关注失败');\n console.error(e);\n });\n }\n\n report() {\n let reason=prompt(`举报 #${this.state.info.pid} 的理由:`);\n if(reason!==null) {\n API.report(this.state.info.pid,reason,this.props.token)\n .then((json)=>{\n alert('举报成功');\n })\n .catch((e)=>{\n alert('举报失败');\n console.error(e);\n })\n }\n }\n\n set_filter_name(name) {\n this.setState((prevState)=>({\n filter_name: name===prevState.filter_name ? null : name,\n }));\n }\n\n toggle_rev() {\n this.setState((prevState)=>({\n rev: !prevState.rev,\n }));\n }\n\n show_reply_bar(name,event) {\n if(this.reply_ref.current && !event.target.closest('a, .clickable')) {\n let text=this.reply_ref.current.get();\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\n let should_text='Re '+name+': ';\n if(should_text===this.reply_ref.current.get())\n this.reply_ref.current.set('');\n else\n this.reply_ref.current.set(should_text);\n }\n }\n }\n\n render() {\n if(this.state.loading_status==='loading')\n return (加载中……
);\n\n let show_pid=load_single_meta(this.props.show_sidebar,this.props.token);\n\n let replies_to_show=this.state.filter_name ? this.state.replies.filter((r)=>r.name===this.state.filter_name) : this.state.replies.slice();\n if(this.state.rev) replies_to_show.reverse();\n\n // key for lazyload elem\n let view_mode_key=(this.state.rev ? 'y-' : 'n-')+(this.state.filter_name||'null');\n\n let replies_cnt={[DZ_NAME]:1};\n replies_to_show.forEach((r)=>{\n if(replies_cnt[r.name]===undefined)\n replies_cnt[r.name]=0;\n replies_cnt[r.name]++;\n });\n\n // hide main thread when filtered\n let main_thread_elem=(this.state.filter_name && this.state.filter_name!==DZ_NAME) ? null : (\n {this.show_reply_bar('',e);}}>\n {this.set_variant(null,variant);}}\n do_filter_name={replies_cnt[DZ_NAME]>1 ? this.set_filter_name.bind(this) : null}\n />\n \n );\n\n return (\n \n
\n {!!this.state.filter_name &&\n
\n }\n {!this.state.rev &&\n main_thread_elem\n }\n {!!this.state.error_msg &&\n
\n
回复加载失败
\n
{this.state.error_msg}
\n
\n }\n {(this.props.deletion_detect && parseInt(this.state.info.reply)>this.state.replies.length) && !!this.state.replies.length &&\n
\n {parseInt(this.state.info.reply)-this.state.replies.length} 条回复被删除\n
\n }\n {replies_to_show.map((reply)=>(\n
\n {this.show_reply_bar(reply.name,e);}}>\n {this.set_variant(reply.cid,variant);}}\n do_filter_name={replies_cnt[reply.name]>1 ? this.set_filter_name.bind(this) : null}\n />\n \n \n ))}\n {this.state.rev &&\n main_thread_elem\n }\n {!!this.props.token ?\n
:\n
登录后可以回复树洞
\n }\n
\n )\n }\n}\n\nclass FlowItemRow extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n replies: [],\n reply_status: 'done',\n reply_error: null,\n info: Object.assign({},props.info,{variant: {}}),\n attention: props.attention_override===null ? false : props.attention_override,\n };\n this.color_picker=new ColorPicker();\n }\n\n componentDidMount() {\n if(parseInt(this.state.info.reply,10)) {\n this.load_replies(null,/*update_count=*/false);\n }\n }\n\n load_replies(callback,update_count=true) {\n console.log('fetching reply',this.state.info.pid);\n this.setState({\n reply_status: 'loading',\n reply_error: null,\n });\n API.load_replies_with_cache(this.state.info.pid,this.props.token,this.color_picker,parseInt(this.state.info.reply))\n .then((json)=>{\n this.setState((prev,props)=>({\n replies: json.data,\n info: Object.assign({}, prev.info, {\n reply: update_count ? ''+json.data.length : prev.info.reply,\n variant: json.data.length ? {\n latest_reply: Math.max.apply(null,json.data.map((r)=>parseInt(r.timestamp))),\n } : {},\n }),\n attention: !!json.attention,\n reply_status: 'done',\n reply_error: null,\n }),callback);\n })\n .catch((e)=>{\n console.error(e);\n this.setState({\n replies: [],\n reply_status: 'failed',\n reply_error: ''+e,\n },callback);\n });\n }\n\n show_sidebar() {\n this.props.show_sidebar(\n '树洞 #'+this.state.info.pid,\n \n );\n }\n\n render() {\n let show_pid=load_single_meta(this.props.show_sidebar,this.props.token,[this.state.info.pid]);\n\n let hl_rules=[\n ['url_pid',URL_PID_RE],\n ['url',URL_RE],\n ['pid',PID_RE],\n ['nickname',NICKNAME_RE],\n ];\n if(this.props.search_param)\n hl_rules.push(['search',build_highlight_re(this.props.search_param,' ','gi')]);\n let parts=split_text(this.state.info.text,hl_rules);\n\n let quote_id=null;\n if(!this.props.is_quote)\n for(let [mode,content] of parts) {\n content = content.length > 0 ? content.substring(1) : content\n if(mode==='pid' && QUOTE_BLACKLIST.indexOf(content)===-1 && parseInt(content){\n if(!CLICKABLE_TAGS[event.target.tagName.toLowerCase()])\n this.show_sidebar();\n }}>\n \n \n {this.state.reply_status==='loading' &&
加载中
}\n {this.state.reply_status==='failed' &&\n
\n }\n {this.state.replies.slice(0,PREVIEW_REPLY_COUNT).map((reply)=>(\n
\n ))}\n {this.state.replies.length>PREVIEW_REPLY_COUNT &&\n
还有 {this.state.replies.length-PREVIEW_REPLY_COUNT} 条
\n }\n
\n \n );\n\n return quote_id ? (\n \n {res}\n \n
\n ) : res;\n }\n}\n\nclass FlowItemQuote extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n loading_status: 'empty',\n error_msg: null,\n info: null,\n };\n }\n\n componentDidMount() {\n this.load();\n }\n\n load() {\n this.setState({\n loading_status: 'loading',\n },()=>{\n API.get_single(this.props.pid,this.props.token)\n .then((json)=>{\n this.setState({\n loading_status: 'done',\n info: json.data,\n });\n })\n .catch((err)=>{\n if((''+err).indexOf('没有这条树洞')!==-1)\n this.setState({\n loading_status: 'empty',\n });\n else\n this.setState({\n loading_status: 'error',\n error_msg: ''+err,\n });\n });\n });\n }\n\n render() {\n if(this.state.loading_status==='empty')\n return null;\n else if(this.state.loading_status==='loading')\n return (\n \n
\n \n 提到了 #{this.props.pid}\n
\n
\n );\n else if(this.state.loading_status==='error')\n return (\n \n
\n
重新加载
\n
{this.state.error_msg}
\n
\n
\n );\n else // 'done'\n return (\n \n );\n }\n}\n\nfunction FlowChunk(props) {\n return (\n {({value: token})=>(\n \n {!!props.title &&
}\n {props.list.map((info,ind)=>(\n
\n \n {!!(props.deletion_detect && props.mode==='list' && ind && props.list[ind-1].pid-info.pid>1) &&\n
\n
\n {props.list[ind-1].pid-info.pid-1} 条被删除\n
\n
\n }\n
\n
\n \n ))}\n
\n )} \n );\n}\n\nexport class Flow extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n mode: props.mode,\n search_param: props.search_text,\n loaded_pages: 0,\n chunks: {\n title: '',\n data: [],\n },\n loading_status: 'done',\n error_msg: null,\n };\n this.on_scroll_bound=this.on_scroll.bind(this);\n window.LATEST_POST_ID=parseInt(localStorage['_LATEST_POST_ID'],10)||0;\n }\n\n load_page(page) {\n const failed=(err)=>{\n console.error(err);\n this.setState((prev,props)=>({\n loaded_pages: prev.loaded_pages-1,\n loading_status: 'failed',\n error_msg: ''+err,\n }));\n };\n\n if(page>this.state.loaded_pages+1)\n throw new Error('bad page');\n if(page===this.state.loaded_pages+1) {\n console.log('fetching page',page);\n if(this.state.mode==='list') {\n API.get_list(page,this.props.token)\n .then((json)=>{\n if(page===1 && json.data.length) { // update latest_post_id\n let max_id=-1;\n json.data.forEach((x)=>{\n if(parseInt(x.pid,10)>max_id)\n max_id=parseInt(x.pid,10);\n });\n localStorage['_LATEST_POST_ID']=''+max_id;\n }\n this.setState((prev,props)=>({\n chunks: {\n title: 'News Feed',\n data: prev.chunks.data.concat(json.data.filter((x)=>(\n prev.chunks.data.length===0 ||\n !(prev.chunks.data.slice(-100).some((p)=>p.pid===x.pid))\n ))),\n },\n loading_status: 'done',\n }));\n })\n .catch(failed);\n } else if(this.state.mode==='search') {\n API.get_search(page,this.state.search_param,this.props.token)\n .then((json)=>{\n const finished=json.data.length===0;\n this.setState((prev,props)=>({\n chunks: {\n title: 'Result for \"'+this.state.search_param+'\"',\n data: prev.chunks.data.concat(json.data.filter((x)=>(\n prev.chunks.data.length===0 ||\n !(prev.chunks.data.slice(-100).some((p)=>p.pid===x.pid))\n ))),\n },\n mode: finished ? 'search_finished' : 'search',\n loading_status: 'done',\n }));\n })\n .catch(failed);\n } else if(this.state.mode==='single') {\n const pid=parseInt(this.state.search_param.substr(1),10);\n API.get_single(pid,this.props.token)\n .then((json)=>{\n this.setState({\n chunks: {\n title: 'PID = '+pid,\n data: [json.data],\n },\n mode: 'single_finished',\n loading_status: 'done',\n });\n })\n .catch(failed);\n } else if(this.state.mode==='attention') {\n API.get_attention(this.props.token)\n .then((json)=>{\n this.setState({\n chunks: {\n title: 'Attention List',\n data: json.data,\n },\n mode: 'attention_finished',\n loading_status: 'done',\n });\n })\n .catch(failed);\n } else {\n console.log('nothing to load');\n return;\n }\n\n this.setState((prev,props)=>({\n loaded_pages: prev.loaded_pages+1,\n loading_status: 'loading',\n error_msg: null,\n }));\n }\n }\n\n on_scroll(event) {\n if(event.target===document) {\n const avail=document.body.scrollHeight-window.scrollY-window.innerHeight;\n if(avail\n \n {this.state.loading_status==='failed' &&\n \n }\n Loading... :\n '© thuhole'\n } />\n \n );\n }\n}","import React, {Component, PureComponent} from 'react';\n// import {AppSwitcher} from './infrastructure/widgets';\nimport {InfoSidebar, PostForm} from './UserAction';\nimport {TokenCtx} from './UserAction';\n\nimport './Title.css';\n\nconst flag_re=/^\\/\\/setflag ([a-zA-Z0-9_]+)=(.*)$/;\n\nclass ControlBar extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n search_text: '',\n };\n this.set_mode=props.set_mode;\n\n this.on_change_bound=this.on_change.bind(this);\n this.on_keypress_bound=this.on_keypress.bind(this);\n this.do_refresh_bound=this.do_refresh.bind(this);\n this.do_attention_bound=this.do_attention.bind(this);\n }\n\n componentDidMount() {\n if(window.location.hash) {\n let text=decodeURIComponent(window.location.hash).substr(1);\n if(text.lastIndexOf('?')!==-1)\n text=text.substr(0,text.lastIndexOf('?')); // fuck wechat '#param?nsukey=...'\n this.setState({\n search_text: text,\n }, ()=>{\n this.on_keypress({key: 'Enter'});\n });\n }\n }\n\n on_change(event) {\n this.setState({\n search_text: event.target.value,\n });\n }\n\n on_keypress(event) {\n if(event.key==='Enter') {\n let flag_res=flag_re.exec(this.state.search_text);\n if(flag_res) {\n if(flag_res[2]) {\n localStorage[flag_res[1]]=flag_res[2];\n alert('Set Flag '+flag_res[1]+'='+flag_res[2]+'\\nYou may need to refresh this webpage.');\n } else {\n delete localStorage[flag_res[1]];\n alert('Clear Flag '+flag_res[1]+'\\nYou may need to refresh this webpage.');\n }\n return;\n }\n\n const mode=this.state.search_text.startsWith('#') ? 'single' : 'search';\n this.set_mode(mode,this.state.search_text||'');\n }\n }\n\n do_refresh() {\n window.scrollTo(0,0);\n this.setState({\n search_text: '',\n });\n this.set_mode('list',null);\n }\n\n do_attention() {\n window.scrollTo(0,0);\n this.setState({\n search_text: '',\n });\n this.set_mode('attention',null);\n }\n\n render() {\n return (\n {({value: token})=>(\n \n )} \n )\n }\n}\n\nexport function Title(props) {\n return (\n \n {/*
*/}\n
\n
\n
\n props.show_sidebar(\n 'T大树洞',\n \n )}>\n T大树洞\n \n
\n
\n
\n
\n
\n )\n}","import React, {Component, PureComponent} from 'react';\nimport './Sidebar.css';\n\nexport class Sidebar extends PureComponent {\n constructor(props) {\n super(props);\n this.sidebar_ref=React.createRef();\n this.do_close_bound=this.do_close.bind(this);\n this.do_back_bound=this.do_back.bind(this);\n }\n\n componentDidUpdate(nextProps) {\n if(this.props.stack!==nextProps.stack) {\n //console.log('sidebar top');\n if(this.sidebar_ref.current)\n this.sidebar_ref.current.scrollTop=0;\n }\n }\n\n do_close() {\n this.props.show_sidebar(null,null,'clear');\n }\n do_back() {\n this.props.show_sidebar(null,null,'pop');\n }\n\n render() {\n let [cur_title,cur_content]=this.props.stack[this.props.stack.length-1];\n return (\n \n );\n\n return quote_id ? (\n \n {res}\n \n
\n ) : res;\n }\n}\n\nclass FlowItemQuote extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n loading_status: 'empty',\n error_msg: null,\n info: null,\n };\n }\n\n componentDidMount() {\n this.load();\n }\n\n load() {\n this.setState({\n loading_status: 'loading',\n },()=>{\n API.get_single(this.props.pid,this.props.token)\n .then((json)=>{\n this.setState({\n loading_status: 'done',\n info: json.data,\n });\n })\n .catch((err)=>{\n if((''+err).indexOf('没有这条树洞')!==-1)\n this.setState({\n loading_status: 'empty',\n });\n else\n this.setState({\n loading_status: 'error',\n error_msg: ''+err,\n });\n });\n });\n }\n\n render() {\n if(this.state.loading_status==='empty')\n return null;\n else if(this.state.loading_status==='loading')\n return (\n \n
\n \n 提到了 #{this.props.pid}\n
\n
\n );\n else if(this.state.loading_status==='error')\n return (\n \n
\n
重新加载
\n
{this.state.error_msg}
\n
\n
\n );\n else // 'done'\n return (\n \n );\n }\n}\n\nfunction FlowChunk(props) {\n return (\n {({value: token})=>(\n \n {!!props.title &&
}\n {props.list.map((info,ind)=>(\n
\n \n {!!(props.deletion_detect && props.mode==='list' && ind && props.list[ind-1].pid-info.pid>1) &&\n
\n
\n {props.list[ind-1].pid-info.pid-1} 条被删除\n
\n
\n }\n
\n
\n \n ))}\n
\n )} \n );\n}\n\nexport class Flow extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n mode: props.mode,\n search_param: props.search_text,\n loaded_pages: 0,\n chunks: {\n title: '',\n data: [],\n },\n loading_status: 'done',\n error_msg: null,\n };\n this.on_scroll_bound=this.on_scroll.bind(this);\n window.LATEST_POST_ID=parseInt(localStorage['_LATEST_POST_ID'],10)||0;\n }\n\n load_page(page) {\n const failed=(err)=>{\n console.error(err);\n this.setState((prev,props)=>({\n loaded_pages: prev.loaded_pages-1,\n loading_status: 'failed',\n error_msg: ''+err,\n }));\n };\n\n if(page>this.state.loaded_pages+1)\n throw new Error('bad page');\n if(page===this.state.loaded_pages+1) {\n console.log('fetching page',page);\n if(this.state.mode==='list') {\n API.get_list(page,this.props.token)\n .then((json)=>{\n if(page===1 && json.data.length) { // update latest_post_id\n let max_id=-1;\n json.data.forEach((x)=>{\n if(parseInt(x.pid,10)>max_id)\n max_id=parseInt(x.pid,10);\n });\n localStorage['_LATEST_POST_ID']=''+max_id;\n }\n this.setState((prev,props)=>({\n chunks: {\n title: 'News Feed',\n data: prev.chunks.data.concat(json.data.filter((x)=>(\n prev.chunks.data.length===0 ||\n !(prev.chunks.data.slice(-100).some((p)=>p.pid===x.pid))\n ))),\n },\n loading_status: 'done',\n }));\n })\n .catch(failed);\n } else if(this.state.mode==='search') {\n API.get_search(page,this.state.search_param,this.props.token)\n .then((json)=>{\n const finished=json.data.length===0;\n this.setState((prev,props)=>({\n chunks: {\n title: 'Result for \"'+this.state.search_param+'\"',\n data: prev.chunks.data.concat(json.data.filter((x)=>(\n prev.chunks.data.length===0 ||\n !(prev.chunks.data.slice(-100).some((p)=>p.pid===x.pid))\n ))),\n },\n mode: finished ? 'search_finished' : 'search',\n loading_status: 'done',\n }));\n })\n .catch(failed);\n } else if(this.state.mode==='single') {\n const pid=parseInt(this.state.search_param.substr(1),10);\n API.get_single(pid,this.props.token)\n .then((json)=>{\n this.setState({\n chunks: {\n title: 'PID = '+pid,\n data: [json.data],\n },\n mode: 'single_finished',\n loading_status: 'done',\n });\n })\n .catch(failed);\n } else if(this.state.mode==='attention') {\n API.get_attention(this.props.token)\n .then((json)=>{\n this.setState({\n chunks: {\n title: 'Attention List',\n data: json.data,\n },\n mode: 'attention_finished',\n loading_status: 'done',\n });\n })\n .catch(failed);\n } else {\n console.log('nothing to load');\n return;\n }\n\n this.setState((prev,props)=>({\n loaded_pages: prev.loaded_pages+1,\n loading_status: 'loading',\n error_msg: null,\n }));\n }\n }\n\n on_scroll(event) {\n if(event.target===document) {\n const avail=document.body.scrollHeight-window.scrollY-window.innerHeight;\n if(avail\n \n {this.state.loading_status==='failed' &&\n \n }\n Loading... :\n '© thuhole'\n } />\n \n );\n }\n}","import React, {Component, PureComponent} from 'react';\n// import {AppSwitcher} from './infrastructure/widgets';\nimport {InfoSidebar, PostForm} from './UserAction';\nimport {TokenCtx} from './UserAction';\n\nimport './Title.css';\n\nconst flag_re=/^\\/\\/setflag ([a-zA-Z0-9_]+)=(.*)$/;\n\nclass ControlBar extends PureComponent {\n constructor(props) {\n super(props);\n this.state={\n search_text: '',\n };\n this.set_mode=props.set_mode;\n\n this.on_change_bound=this.on_change.bind(this);\n this.on_keypress_bound=this.on_keypress.bind(this);\n this.do_refresh_bound=this.do_refresh.bind(this);\n this.do_attention_bound=this.do_attention.bind(this);\n }\n\n componentDidMount() {\n if(window.location.hash) {\n let text=decodeURIComponent(window.location.hash).substr(1);\n if(text.lastIndexOf('?')!==-1)\n text=text.substr(0,text.lastIndexOf('?')); // fuck wechat '#param?nsukey=...'\n this.setState({\n search_text: text,\n }, ()=>{\n this.on_keypress({key: 'Enter'});\n });\n }\n }\n\n on_change(event) {\n this.setState({\n search_text: event.target.value,\n });\n }\n\n on_keypress(event) {\n if(event.key==='Enter') {\n let flag_res=flag_re.exec(this.state.search_text);\n if(flag_res) {\n if(flag_res[2]) {\n localStorage[flag_res[1]]=flag_res[2];\n alert('Set Flag '+flag_res[1]+'='+flag_res[2]+'\\nYou may need to refresh this webpage.');\n } else {\n delete localStorage[flag_res[1]];\n alert('Clear Flag '+flag_res[1]+'\\nYou may need to refresh this webpage.');\n }\n return;\n }\n\n const mode=this.state.search_text.startsWith('#') ? 'single' : 'search';\n this.set_mode(mode,this.state.search_text||'');\n }\n }\n\n do_refresh() {\n window.scrollTo(0,0);\n this.setState({\n search_text: '',\n });\n this.set_mode('list',null);\n }\n\n do_attention() {\n window.scrollTo(0,0);\n this.setState({\n search_text: '',\n });\n this.set_mode('attention',null);\n }\n\n render() {\n return (\n {({value: token})=>(\n \n )} \n )\n }\n}\n\nexport function Title(props) {\n return (\n \n {/*
*/}\n
\n
\n
\n props.show_sidebar(\n 'T大树洞',\n \n )}>\n T大树洞\n \n
\n
\n
\n
\n
\n )\n}","import React, {Component, PureComponent} from 'react';\nimport './Sidebar.css';\n\nexport class Sidebar extends PureComponent {\n constructor(props) {\n super(props);\n this.sidebar_ref=React.createRef();\n this.do_close_bound=this.do_close.bind(this);\n this.do_back_bound=this.do_back.bind(this);\n }\n\n componentDidUpdate(nextProps) {\n if(this.props.stack!==nextProps.stack) {\n //console.log('sidebar top');\n if(this.sidebar_ref.current)\n this.sidebar_ref.current.scrollTop=0;\n }\n }\n\n do_close() {\n this.props.show_sidebar(null,null,'clear');\n }\n do_back() {\n this.props.show_sidebar(null,null,'pop');\n }\n\n render() {\n let [cur_title,cur_content]=this.props.stack[this.props.stack.length-1];\n return (\n \n
{e.preventDefault();e.target.click();}} />\n
\n {cur_content}\n
\n
\n
\n {this.props.stack.length>2 &&\n
\n }\n {cur_title}\n
\n
\n );\n }\n}","import React, {Component} from 'react';\nimport Pressure from 'pressure';\n\nimport './PressureHelper.css';\n\nconst THRESHOLD=.4;\nconst MULTIPLIER=25;\nconst BORDER_WIDTH=500; // also change css!\n\nexport class PressureHelper extends Component {\n constructor(props) {\n super(props);\n this.state={\n level: 0,\n fired: false,\n };\n this.callback=props.callback;\n this.esc_interval=null;\n }\n\n do_fire() {\n if(this.esc_interval) {\n clearInterval(this.esc_interval);\n this.esc_interval=null;\n }\n this.setState({\n level: 1,\n fired: true,\n });\n this.callback();\n window.setTimeout(()=>{\n this.setState({\n level: 0,\n fired: false,\n });\n },300);\n }\n\n componentDidMount() {\n if(window.config.pressure) {\n Pressure.set(document.body, {\n change: (force)=>{\n if(!this.state.fired) {\n if(force>=.999) {\n this.do_fire();\n }\n else\n this.setState({\n level: force,\n });\n }\n },\n end: ()=>{\n this.setState({\n level: 0,\n fired: false,\n });\n },\n }, {\n polyfill: false,\n only: 'touch',\n preventSelect: false,\n });\n\n document.addEventListener('keydown',(e)=>{\n if(!e.repeat && e.key==='Escape') {\n if(this.esc_interval)\n clearInterval(this.esc_interval);\n this.setState({\n level: THRESHOLD/2,\n },()=>{\n this.esc_interval=setInterval(()=>{\n let new_level=this.state.level+.1;\n if(new_level>=.999)\n this.do_fire();\n else\n this.setState({\n level: new_level,\n });\n },30);\n });\n }\n });\n document.addEventListener('keyup',(e)=>{\n if(e.key==='Escape') {\n if(this.esc_interval) {\n clearInterval(this.esc_interval);\n this.esc_interval=null;\n }\n this.setState({\n level: 0,\n });\n }\n });\n }\n }\n\n render() {\n const pad=MULTIPLIER*(this.state.level-THRESHOLD)-BORDER_WIDTH;\n return (\n
\n )\n }\n}","import React, {Component} from 'react';\nimport {Flow} from './Flows';\nimport {Title} from './Title';\nimport {Sidebar} from './Sidebar';\nimport {PressureHelper} from './PressureHelper';\nimport {TokenCtx} from './UserAction';\nimport {load_config,bgimg_style} from './Config';\nimport {listen_darkmode} from './infrastructure/functions';\nimport {LoginPopup, TitleLine} from './infrastructure/widgets';\n\nconst MAX_SIDEBAR_STACK_SIZE=10;\n\nfunction DeprecatedAlert(props) {\n return (\n
\n );\n}\n\nclass App extends Component {\n constructor(props) {\n super(props);\n load_config();\n listen_darkmode({default: undefined, light: false, dark: true}[window.config.color_scheme]);\n this.state={\n sidebar_stack: [[null,null]], // list of [status, content]\n mode: 'list', // list, single, search, attention\n search_text: null,\n flow_render_key: +new Date(),\n token: localStorage['TOKEN']||null,\n };\n this.show_sidebar_bound=this.show_sidebar.bind(this);\n this.set_mode_bound=this.set_mode.bind(this);\n this.on_pressure_bound=this.on_pressure.bind(this);\n // a silly self-deceptive approach to ban guests, enough to fool those muggles\n // document cookie 'pku_ip_flag=yes'\n this.inthu_flag=window[atob('ZG9jdW1lbnQ')][atob('Y29va2ll')].indexOf(atob('dGh1X2lwX2ZsYWc9eWVz'))!==-1;\n }\n\n static is_darkmode() {\n if(window.config.color_scheme==='dark') return true;\n if(window.config.color_scheme==='light') return false;\n else { // 'default'\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n }\n\n on_pressure() {\n if(this.state.sidebar_stack.length>1)\n this.show_sidebar(null,null,'clear');\n else\n this.set_mode('list',null);\n }\n\n show_sidebar(title,content,mode='push') {\n this.setState((prevState)=>{\n let ns=prevState.sidebar_stack.slice();\n if(mode==='push') {\n if(ns.length>MAX_SIDEBAR_STACK_SIZE)\n ns.splice(1,1);\n ns=ns.concat([[title,content]]);\n } else if(mode==='pop') {\n if(ns.length===1) return;\n ns.pop();\n } else if(mode==='replace') {\n ns.pop();\n ns=ns.concat([[title,content]]);\n } else if(mode==='clear') {\n ns=[[null,null]];\n } else\n throw new Error('bad show_sidebar mode');\n return {\n sidebar_stack: ns,\n };\n });\n }\n\n set_mode(mode,search_text) {\n this.setState({\n mode: mode,\n search_text: search_text,\n flow_render_key: +new Date(),\n });\n }\n\n render() {\n return (\n
{\n localStorage['TOKEN']=x||'';\n this.setState({\n token: x,\n });\n },\n }}>\n \n
\n \n {(token)=>(\n \n
\n {!token.value &&\n
\n }\n {this.inthu_flag||token.value||true ?\n
:\n
\n }\n
\n
\n )} \n \n \n );\n }\n}\n\nexport default App;\n","// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport default function register() {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Lets check if a service worker still exists or not.\n checkValidServiceWorker(swUrl);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://goo.gl/SC7cgQ'\n );\n });\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n console.log('New content is available; please refresh.');\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n if (\n response.status === 404 ||\n response.headers.get('content-type').indexOf('javascript') === -1\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\n//import {elevate} from './infrastructure/elevator';\nimport registerServiceWorker from './registerServiceWorker';\n\n//elevate();\n\nReactDOM.render(
, document.getElementById('root'));\nregisterServiceWorker();\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/static/js/runtime~main.a9c024a1.js b/static/js/runtime~main.47dca567.js
similarity index 55%
rename from static/js/runtime~main.a9c024a1.js
rename to static/js/runtime~main.47dca567.js
index 6f0be6a..70135d1 100644
--- a/static/js/runtime~main.a9c024a1.js
+++ b/static/js/runtime~main.47dca567.js
@@ -1,2 +1,2 @@
-!function(e){function r(r){for(var n,l,i=r[0],a=r[1],f=r[2],c=0,s=[];c