diff --git a/asset-manifest.json b/asset-manifest.json index 7b874e9..6bab735 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,14 +1,14 @@ { "files": { "main.css": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/css/main.54f9c368.chunk.css", - "main.js": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/main.577ef5c8.chunk.js", - "main.js.map": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/main.577ef5c8.chunk.js.map", + "main.js": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/main.95f77d5e.chunk.js", + "main.js.map": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/js/main.95f77d5e.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.228208e1c75db49dab4e2c7284dd6474.js": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/precache-manifest.228208e1c75db49dab4e2c7284dd6474.js", + "precache-manifest.b73112ae9f2decad8fa16a7594d9bce5.js": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/precache-manifest.b73112ae9f2decad8fa16a7594d9bce5.js", "service-worker.js": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/service-worker.js", "static/css/main.54f9c368.chunk.css.map": "//cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/css/main.54f9c368.chunk.css.map" } diff --git a/index.html b/index.html index 36e6591..dd110d0 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -
\r\n {props.text}\r\n
\r\n )\r\n}\r\n\r\nexport function GlobalTitle(props) {\r\n return (\r\n{props.text}
\r\n\r\n// {!!dropdown_cur_app ?\r\n// app_elem((()=>{\r\n// let [id,title,_url,icon_normal,icon_hover,_new_tab]=dropdown_cur_app;\r\n// return [id,title+'▾',null,icon_normal,icon_hover,false];\r\n// })(),true) :\r\n// app_elem(['-placeholder-elem','更多▾',null,appicon_dropdown,appicon_dropdown_rev,false],true)\r\n// }\r\n//
\r\n// {this.state.apps.dropdown.map((app)=>{\r\n// let ref=React.createRef();\r\n// return (\r\n//{\r\n// if(!e.target.closest('a') && ref.current)\r\n// ref.current.click();\r\n// }}>\r\n// {app_elem(app,true,ref)}\r\n//
\r\n// );\r\n// })}\r\n//\r\n 接收验证码来登录 T大树洞\r\n
\r\n\r\n \r\n \r\n {/*this.do_sendcode('sms')}>*/}\r\n {/* 短信 */}\r\n {/**/}\r\n {/*/*/}\r\n this.do_sendcode('mail')}>\r\n 发送邮件 \r\n \r\n \r\n
\r\n\r\n \r\n \r\n
\r\n\r\n 从其他设备导入登录状态\r\n
\r\n\r\n \r\n \r\n
\r\n\r\n \r\n
\r\n\r\n {this.props.parts.map((part,idx)=>{\r\n let [rule,p]=part;\r\n return (\r\n {\r\n rule==='url_pid' ? /## :\r\n rule==='url' ? {p} :\r\n rule==='pid' ? {e.preventDefault(); this.props.show_pid(p.substring(1));}}>{p} :\r\n rule==='nickname' ? {p} :\r\n rule==='search' ? {p} :\r\n p\r\n }\r\n );\r\n })}\r\n
\r\n )\r\n }\r\n}\r\n\r\nwindow.TEXTAREA_BACKUP={};\r\n\r\nexport class SafeTextarea extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n text: '',\r\n };\r\n this.on_change_bound=this.on_change.bind(this);\r\n this.on_keydown_bound=this.on_keydown.bind(this);\r\n this.clear=this.clear.bind(this);\r\n this.area_ref=React.createRef();\r\n this.change_callback=props.on_change||(()=>{});\r\n this.submit_callback=props.on_submit||(()=>{});\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({\r\n text: window.TEXTAREA_BACKUP[this.props.id]||''\r\n },()=>{\r\n this.change_callback(this.state.text);\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n window.TEXTAREA_BACKUP[this.props.id]=this.state.text;\r\n this.change_callback(this.state.text);\r\n }\r\n\r\n on_change(event) {\r\n this.setState({\r\n text: event.target.value,\r\n });\r\n this.change_callback(event.target.value);\r\n }\r\n on_keydown(event) {\r\n if(event.key==='Enter' && event.ctrlKey && !event.altKey) {\r\n event.preventDefault();\r\n this.submit_callback();\r\n }\r\n }\r\n\r\n clear() {\r\n this.setState({\r\n text: '',\r\n });\r\n }\r\n set(text) {\r\n this.change_callback(text);\r\n this.setState({\r\n text: text,\r\n });\r\n }\r\n get() {\r\n return this.state.text;\r\n }\r\n focus() {\r\n this.area_ref.current.focus();\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nlet pwa_prompt_event=null;\r\nwindow.addEventListener('beforeinstallprompt', (e) => {\r\n console.log('pwa: received before install prompt');\r\n pwa_prompt_event=e;\r\n});\r\n\r\nexport function PromotionBar(props) {\r\n let is_ios=/iPhone|iPad|iPod/i.test(window.navigator.userAgent);\r\n let is_installed=(window.matchMedia('(display-mode: standalone)').matches) || (window.navigator.standalone);\r\n\r\n if(is_installed)\r\n return null;\r\n\r\n if(is_ios)\r\n // noinspection JSConstructorReturnsPrimitive\r\n return !navigator.standalone ? (\r\n 正在下载……
);\r\n else if(this.state.state==='decoding')\r\n return (正在解码……
);\r\n else if(this.state.state==='loaded')\r\n return ();\r\n }\r\n}","import React, {Component, PureComponent} from 'react';\r\n\r\nimport './Config.css';\r\n\r\nconst BUILTIN_IMGS={\r\n 'static/bg/gbp.jpg': '寻觅繁星(默认)',\r\n 'static/bg/eriri.jpg': '平成著名画师',\r\n 'static/bg/yurucamp.jpg': '露营天下第一',\r\n 'static/bg/minecraft.jpg': '麦恩·库拉夫特',\r\n 'static/bg/cyberpunk.jpg': '赛博城市',\r\n 'static/bg/sif.jpg': '梦开始的地方',\r\n};\r\n\r\nconst DEFAULT_CONFIG={\r\n background_img: 'static/bg/gbp.jpg',\r\n background_color: '#113366',\r\n pressure: false,\r\n easter_egg: true,\r\n color_scheme: 'default',\r\n};\r\n\r\nexport function load_config() {\r\n let config=Object.assign({},DEFAULT_CONFIG);\r\n let loaded_config;\r\n try {\r\n loaded_config=JSON.parse(localStorage['hole_config']||'{}');\r\n } catch(e) {\r\n alert('设置加载失败,将重置为默认设置!\\n'+e);\r\n delete localStorage['hole_config'];\r\n loaded_config={};\r\n }\r\n\r\n // unrecognized configs are removed\r\n Object.keys(loaded_config).forEach((key)=>{\r\n if(config[key]!==undefined)\r\n config[key]=loaded_config[key];\r\n });\r\n\r\n console.log('config loaded',config);\r\n window.config=config;\r\n}\r\nexport function save_config() {\r\n localStorage['hole_config']=JSON.stringify(window.config);\r\n load_config();\r\n}\r\n\r\nexport function bgimg_style(img,color) {\r\n if(img===undefined) img=window.config.background_img;\r\n if(color===undefined) color=window.config.background_color;\r\n return {\r\n background: 'transparent center center',\r\n backgroundImage: img===null ? 'unset' : 'url(\"'+encodeURI(img)+'\")',\r\n backgroundColor: color,\r\n backgroundSize: 'cover',\r\n };\r\n}\r\n\r\nclass ConfigBackground extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n img: window.config.background_img,\r\n color: window.config.background_color,\r\n };\r\n }\r\n\r\n save_changes() {\r\n this.props.callback({\r\n background_img: this.state.img,\r\n background_color: this.state.color,\r\n });\r\n }\r\n\r\n on_select(e) {\r\n let value=e.target.value;\r\n this.setState({\r\n img: value==='##other' ? '' :\r\n value==='##color' ? null : value,\r\n },this.save_changes.bind(this));\r\n }\r\n on_change_img(e) {\r\n this.setState({\r\n img: e.target.value,\r\n },this.save_changes.bind(this));\r\n }\r\n on_change_color(e) {\r\n this.setState({\r\n color: e.target.value,\r\n },this.save_changes.bind(this));\r\n }\r\n\r\n render() {\r\n let img_select= this.state.img===null ? '##color' :\r\n Object.keys(BUILTIN_IMGS).indexOf(this.state.img)===-1 ? '##other' : this.state.img;\r\n return (\r\n\r\n 背景图片:\r\n \r\n \r\n {img_select==='##other' &&\r\n \r\n }\r\n {img_select==='##color' &&\r\n \r\n }\r\n
\r\n \r\n\r\n 夜间模式:\r\n \r\n #color_scheme\r\n
\r\n\r\n 选择浅色或深色模式,深色模式下将会调暗图片亮度\r\n
\r\n\r\n \r\n
\r\n\r\n {this.props.description}\r\n
\r\n这些功能仍在测试,可能不稳定(全部重置)
\r\n修改设置后 {window.location.reload()}}>刷新页面 方可生效
\r\n加载中……
);\r\n else if(this.state.loading_status==='failed')\r\n return ();\r\n else if(this.state.loading_status==='done')\r\n return this.state.msg.map((msg)=>(\r\n{msg.content}\r\n
\r\n T大树洞 网页版 by @thuhole,\r\n 基于 \r\n GPLv3\r\n 协议在 GitHub 开源\r\n
\r\n\r\n T大树洞 网页版的诞生离不开 \r\n P大树洞\r\n 、\r\n React\r\n 、\r\n IcoMoon\r\n 等开源项目\r\n
\r\n\r\n {\r\n if('serviceWorker' in navigator) {\r\n navigator.serviceWorker.getRegistrations()\r\n .then((registrations)=>{\r\n for(let registration of registrations) {\r\n console.log('unregister',registration);\r\n registration.unregister();\r\n }\r\n });\r\n }\r\n cache().clear();\r\n setTimeout(()=>{\r\n window.location.reload(true);\r\n },200);\r\n }}>强制检查更新\r\n ({process.env.REACT_APP_BUILD_INFO||'---'} {process.env.NODE_ENV} 会自动在后台检查更新并在下次访问时更新)\r\n
\r\n\r\n This program is free software: you can redistribute it and/or modify\r\n it under the terms of the GNU General Public License as published by\r\n the Free Software Foundation, either version 3 of the License, or\r\n (at your option) any later version.\r\n
\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \r\n GNU General Public License\r\n for more details.\r\n
\r\n\r\n 您已登录。\r\n \r\n
\r\n
*/}\r\n {/*根据计算中心要求,访问授权三个月内有效,过期需重新登录。*/}\r\n {/*T大树洞将会单向加密(i.e. 哈希散列)您的邮箱后再存入数据库,因此您的发帖具有较强的匿名性。具体可见我们的后端开源代码。*/}\r\n {/*
*/}\r\n {/**/}\r\n {/* {this.props.show_sidebar(*/}\r\n {/* '系统消息',*/}\r\n {/*
*/}\r\n {/* /!*当您发送的内容违规时,我们将用系统消息提示您*!/*/}\r\n {/*
\r\n 复制 User Token
\r\n User Token 用于迁移登录状态,切勿告知他人{/*,若怀疑被盗号请尽快
\r\n \r\n
\r\n\r\n T大树洞 面向清华大学学生,通过清华邮箱验证您的身份并提供服务。\r\n
\r\nload_single_meta(show_sidebar,token)(pid,true)}>重新加载
\r\n{''+e}
\r\n#{this.props.info.cid}
\r\n {!!this.props.do_filter_name &&\r\n {this.props.do_filter_name(this.props.info.name);}}>\r\n \r\n \r\n }\r\n \r\n {this.props.info.tag!==null &&\r\n \r\n {this.props.info.tag}\r\n \r\n }\r\n \r\n #{props.info.pid}
\r\n \r\n {props.info.tag!==null &&\r\n \r\n {props.info.tag}\r\n \r\n }\r\n \r\n \r\n {props.img_clickable ?\r\n :\r\n
\r\n }\r\n
最新回复
\r\n }\r\n加载中……
);\r\n\r\n let show_pid=load_single_meta(this.props.show_sidebar,this.props.token);\r\n\r\n let replies_to_show=this.state.filter_name ? this.state.replies.filter((r)=>r.name===this.state.filter_name) : this.state.replies.slice();\r\n if(this.state.rev) replies_to_show.reverse();\r\n\r\n // key for lazyload elem\r\n let view_mode_key=(this.state.rev ? 'y-' : 'n-')+(this.state.filter_name||'null');\r\n\r\n let replies_cnt={[DZ_NAME]:1};\r\n replies_to_show.forEach((r)=>{\r\n if(replies_cnt[r.name]===undefined)\r\n replies_cnt[r.name]=0;\r\n replies_cnt[r.name]++;\r\n });\r\n\r\n // hide main thread when filtered\r\n let main_thread_elem=(this.state.filter_name && this.state.filter_name!==DZ_NAME) ? null : (\r\n\r\n {this.set_filter_name(null)}}>还原\r\n 当前只看 \r\n
回复加载失败
\r\n{this.state.error_msg}
\r\n{this.state.reply_error}
\r\n{this.state.error_msg}
\r\n{this.load_page(this.state.loaded_pages+1)}}>重新加载
\r\n{this.state.error_msg}
\r\n\r\n props.show_sidebar(\r\n 'T大树洞',\r\n
\r\n
\r\n {props.text}\r\n
\r\n )\r\n}\r\n\r\nexport function GlobalTitle(props) {\r\n return (\r\n{props.text}
\r\n\r\n// {!!dropdown_cur_app ?\r\n// app_elem((()=>{\r\n// let [id,title,_url,icon_normal,icon_hover,_new_tab]=dropdown_cur_app;\r\n// return [id,title+'▾',null,icon_normal,icon_hover,false];\r\n// })(),true) :\r\n// app_elem(['-placeholder-elem','更多▾',null,appicon_dropdown,appicon_dropdown_rev,false],true)\r\n// }\r\n//
\r\n// {this.state.apps.dropdown.map((app)=>{\r\n// let ref=React.createRef();\r\n// return (\r\n//{\r\n// if(!e.target.closest('a') && ref.current)\r\n// ref.current.click();\r\n// }}>\r\n// {app_elem(app,true,ref)}\r\n//
\r\n// );\r\n// })}\r\n//\r\n 接收验证码来登录 T大树洞\r\n
\r\n\r\n \r\n \r\n {/*this.do_sendcode('sms')}>*/}\r\n {/* 短信 */}\r\n {/**/}\r\n {/*/*/}\r\n this.do_sendcode('mail')}>\r\n 发送邮件 \r\n \r\n \r\n
\r\n\r\n \r\n \r\n
\r\n\r\n 从其他设备导入登录状态\r\n
\r\n\r\n \r\n \r\n
\r\n\r\n \r\n
\r\n\r\n {this.props.parts.map((part,idx)=>{\r\n let [rule,p]=part;\r\n return (\r\n {\r\n rule==='url_pid' ? /## :\r\n rule==='url' ? {p} :\r\n rule==='pid' ? {e.preventDefault(); this.props.show_pid(p.substring(1));}}>{p} :\r\n rule==='nickname' ? {p} :\r\n rule==='search' ? {p} :\r\n p\r\n }\r\n );\r\n })}\r\n
\r\n )\r\n }\r\n}\r\n\r\nwindow.TEXTAREA_BACKUP={};\r\n\r\nexport class SafeTextarea extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n text: '',\r\n };\r\n this.on_change_bound=this.on_change.bind(this);\r\n this.on_keydown_bound=this.on_keydown.bind(this);\r\n this.clear=this.clear.bind(this);\r\n this.area_ref=React.createRef();\r\n this.change_callback=props.on_change||(()=>{});\r\n this.submit_callback=props.on_submit||(()=>{});\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({\r\n text: window.TEXTAREA_BACKUP[this.props.id]||''\r\n },()=>{\r\n this.change_callback(this.state.text);\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n window.TEXTAREA_BACKUP[this.props.id]=this.state.text;\r\n this.change_callback(this.state.text);\r\n }\r\n\r\n on_change(event) {\r\n this.setState({\r\n text: event.target.value,\r\n });\r\n this.change_callback(event.target.value);\r\n }\r\n on_keydown(event) {\r\n if(event.key==='Enter' && event.ctrlKey && !event.altKey) {\r\n event.preventDefault();\r\n this.submit_callback();\r\n }\r\n }\r\n\r\n clear() {\r\n this.setState({\r\n text: '',\r\n });\r\n }\r\n set(text) {\r\n this.change_callback(text);\r\n this.setState({\r\n text: text,\r\n });\r\n }\r\n get() {\r\n return this.state.text;\r\n }\r\n focus() {\r\n this.area_ref.current.focus();\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nlet pwa_prompt_event=null;\r\nwindow.addEventListener('beforeinstallprompt', (e) => {\r\n console.log('pwa: received before install prompt');\r\n pwa_prompt_event=e;\r\n});\r\n\r\nexport function PromotionBar(props) {\r\n let is_ios=/iPhone|iPad|iPod/i.test(window.navigator.userAgent);\r\n let is_installed=(window.matchMedia('(display-mode: standalone)').matches) || (window.navigator.standalone);\r\n\r\n if(is_installed)\r\n return null;\r\n\r\n if(is_ios)\r\n // noinspection JSConstructorReturnsPrimitive\r\n return !navigator.standalone ? (\r\n 正在下载……
);\r\n else if(this.state.state==='decoding')\r\n return (正在解码……
);\r\n else if(this.state.state==='loaded')\r\n return ();\r\n }\r\n}","import React, {Component, PureComponent} from 'react';\r\n\r\nimport './Config.css';\r\n\r\nconst BUILTIN_IMGS={\r\n 'static/bg/gbp.jpg': '寻觅繁星(默认)',\r\n 'static/bg/eriri.jpg': '平成著名画师',\r\n 'static/bg/yurucamp.jpg': '露营天下第一',\r\n 'static/bg/minecraft.jpg': '麦恩·库拉夫特',\r\n 'static/bg/cyberpunk.jpg': '赛博城市',\r\n 'static/bg/sif.jpg': '梦开始的地方',\r\n};\r\n\r\nconst DEFAULT_CONFIG={\r\n background_img: 'static/bg/gbp.jpg',\r\n background_color: '#113366',\r\n pressure: false,\r\n easter_egg: true,\r\n color_scheme: 'default',\r\n};\r\n\r\nexport function load_config() {\r\n let config=Object.assign({},DEFAULT_CONFIG);\r\n let loaded_config;\r\n try {\r\n loaded_config=JSON.parse(localStorage['hole_config']||'{}');\r\n } catch(e) {\r\n alert('设置加载失败,将重置为默认设置!\\n'+e);\r\n delete localStorage['hole_config'];\r\n loaded_config={};\r\n }\r\n\r\n // unrecognized configs are removed\r\n Object.keys(loaded_config).forEach((key)=>{\r\n if(config[key]!==undefined)\r\n config[key]=loaded_config[key];\r\n });\r\n\r\n console.log('config loaded',config);\r\n window.config=config;\r\n}\r\nexport function save_config() {\r\n localStorage['hole_config']=JSON.stringify(window.config);\r\n load_config();\r\n}\r\n\r\nexport function bgimg_style(img,color) {\r\n if(img===undefined) img=window.config.background_img;\r\n if(color===undefined) color=window.config.background_color;\r\n return {\r\n background: 'transparent center center',\r\n backgroundImage: img===null ? 'unset' : 'url(\"'+encodeURI(img)+'\")',\r\n backgroundColor: color,\r\n backgroundSize: 'cover',\r\n };\r\n}\r\n\r\nclass ConfigBackground extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state={\r\n img: window.config.background_img,\r\n color: window.config.background_color,\r\n };\r\n }\r\n\r\n save_changes() {\r\n this.props.callback({\r\n background_img: this.state.img,\r\n background_color: this.state.color,\r\n });\r\n }\r\n\r\n on_select(e) {\r\n let value=e.target.value;\r\n this.setState({\r\n img: value==='##other' ? '' :\r\n value==='##color' ? null : value,\r\n },this.save_changes.bind(this));\r\n }\r\n on_change_img(e) {\r\n this.setState({\r\n img: e.target.value,\r\n },this.save_changes.bind(this));\r\n }\r\n on_change_color(e) {\r\n this.setState({\r\n color: e.target.value,\r\n },this.save_changes.bind(this));\r\n }\r\n\r\n render() {\r\n let img_select= this.state.img===null ? '##color' :\r\n Object.keys(BUILTIN_IMGS).indexOf(this.state.img)===-1 ? '##other' : this.state.img;\r\n return (\r\n\r\n 背景图片:\r\n \r\n \r\n {img_select==='##other' &&\r\n \r\n }\r\n {img_select==='##color' &&\r\n \r\n }\r\n
\r\n \r\n\r\n 夜间模式:\r\n \r\n #color_scheme\r\n
\r\n\r\n 选择浅色或深色模式,深色模式下将会调暗图片亮度\r\n
\r\n\r\n \r\n
\r\n\r\n {this.props.description}\r\n
\r\n这些功能仍在测试,可能不稳定(全部重置)
\r\n修改设置后 {window.location.reload()}}>刷新页面 方可生效
\r\n加载中……
);\r\n else if(this.state.loading_status==='failed')\r\n return ();\r\n else if(this.state.loading_status==='done')\r\n return this.state.msg.map((msg)=>(\r\n{msg.content}\r\n
\r\n T大树洞 网页版 by @thuhole,\r\n 基于 \r\n GPLv3\r\n 协议在 GitHub 开源\r\n
\r\n\r\n T大树洞 网页版的诞生离不开 \r\n P大树洞\r\n 、\r\n React\r\n 、\r\n IcoMoon\r\n 等开源项目\r\n
\r\n\r\n {\r\n if('serviceWorker' in navigator) {\r\n navigator.serviceWorker.getRegistrations()\r\n .then((registrations)=>{\r\n for(let registration of registrations) {\r\n console.log('unregister',registration);\r\n registration.unregister();\r\n }\r\n });\r\n }\r\n cache().clear();\r\n setTimeout(()=>{\r\n window.location.reload(true);\r\n },200);\r\n }}>强制检查更新\r\n ({process.env.REACT_APP_BUILD_INFO||'---'} {process.env.NODE_ENV} 会自动在后台检查更新并在下次访问时更新)\r\n
\r\n\r\n This program is free software: you can redistribute it and/or modify\r\n it under the terms of the GNU General Public License as published by\r\n the Free Software Foundation, either version 3 of the License, or\r\n (at your option) any later version.\r\n
\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \r\n GNU General Public License\r\n for more details.\r\n
\r\n\r\n 您已登录。\r\n \r\n
\r\n
*/}\r\n {/*根据计算中心要求,访问授权三个月内有效,过期需重新登录。*/}\r\n {/*T大树洞将会单向加密(i.e. 哈希散列)您的邮箱后再存入数据库,因此您的发帖具有较强的匿名性。具体可见我们的后端开源代码。*/}\r\n {/*
*/}\r\n {/**/}\r\n {/* {this.props.show_sidebar(*/}\r\n {/* '系统消息',*/}\r\n {/*
*/}\r\n {/* /!*当您发送的内容违规时,我们将用系统消息提示您*!/*/}\r\n {/*
\r\n 复制 User Token
\r\n User Token 用于迁移登录状态,切勿告知他人{/*,若怀疑被盗号请尽快
\r\n \r\n
\r\n\r\n T大树洞 面向清华大学学生,通过清华邮箱验证您的身份并提供服务。\r\n
\r\nload_single_meta(show_sidebar,token)(pid,true)}>重新加载
\r\n{''+e}
\r\n#{this.props.info.cid}
\r\n {!!this.props.do_filter_name &&\r\n {this.props.do_filter_name(this.props.info.name);}}>\r\n \r\n \r\n }\r\n \r\n {this.props.info.tag!==null &&\r\n \r\n {this.props.info.tag}\r\n \r\n }\r\n \r\n #{props.info.pid}
\r\n \r\n {props.info.tag!==null &&\r\n \r\n {props.info.tag}\r\n \r\n }\r\n \r\n \r\n {props.img_clickable ?\r\n :\r\n
\r\n }\r\n
最新回复
\r\n }\r\n加载中……
);\r\n\r\n let show_pid=load_single_meta(this.props.show_sidebar,this.props.token);\r\n\r\n let replies_to_show=this.state.filter_name ? this.state.replies.filter((r)=>r.name===this.state.filter_name) : this.state.replies.slice();\r\n if(this.state.rev) replies_to_show.reverse();\r\n\r\n // key for lazyload elem\r\n let view_mode_key=(this.state.rev ? 'y-' : 'n-')+(this.state.filter_name||'null');\r\n\r\n let replies_cnt={[DZ_NAME]:1};\r\n replies_to_show.forEach((r)=>{\r\n if(replies_cnt[r.name]===undefined)\r\n replies_cnt[r.name]=0;\r\n replies_cnt[r.name]++;\r\n });\r\n\r\n // hide main thread when filtered\r\n let main_thread_elem=(this.state.filter_name && this.state.filter_name!==DZ_NAME) ? null : (\r\n\r\n {this.set_filter_name(null)}}>还原\r\n 当前只看 \r\n
回复加载失败
\r\n{this.state.error_msg}
\r\n{this.state.reply_error}
\r\n{this.state.error_msg}
\r\n{this.load_page(this.state.loaded_pages+1)}}>重新加载
\r\n{this.state.error_msg}
\r\n\r\n props.show_sidebar(\r\n 'T大树洞',\r\n
\r\n