From 10956f1fee044e958e6c9303b301b27c05380e1a Mon Sep 17 00:00:00 2001
From: undefined {{ _('ID') }}: {{ fdoc['_id'] }} {{ _('Userfile doc_id') }}: {{ ufid }} {{ _('MD5') }}: {{ fdoc['md5'] }} {{ _('Secret (keep it secret)') }}: {{ fdoc['metadata']['secret'] }} {{ _('URL') }}: {{ reverse_url('fs_get', domain_id=vj4.model.builtin.DOMAIN_ID_SYSTEM, secret=fdoc['metadata']['secret']) }} {{ _('Image Markdown') }}:  }})
{{ _('URL') }}: {{ model.file.url(fdoc) }}
{% endif %} {% endblock %} diff --git a/templates/home_file.html b/templates/home_file.html index e55b61c82..604f9bd91 100644 --- a/templates/home_file.html +++ b/templates/home_file.html @@ -4,8 +4,8 @@${message}
`).appendTo($dom); actionButtons.forEach((button) => { $(tpl``).appendTo($dom); }); diff --git a/ui/components/notification/notification.page.styl b/ui/components/notification/notification.page.styl index a5d6ba0d0..506a6cd59 100644 --- a/ui/components/notification/notification.page.styl +++ b/ui/components/notification/notification.page.styl @@ -14,6 +14,9 @@ box-shadow: 0 4px 10px rgba(#000, 0.4) min-width: rem(150px) + img + border-radius: 50% + &.hide opacity: 0 transform: translateY(20px) scale(0.9) diff --git a/ui/components/socket/index.js b/ui/components/socket/index.js new file mode 100644 index 000000000..b560cff02 --- /dev/null +++ b/ui/components/socket/index.js @@ -0,0 +1,42 @@ +import SockJS from 'sockjs-client'; +import Notification from 'vj/components/notification'; +import i18n from 'vj/utils/i18n'; + +export default class Sock { + constructor(url) { + this.url = url; + this.reconnect = false; + this.init(); + } + + init() { + this.sock = new SockJS(this.url); + this.sock.onopen = () => { + if (this.reconnect) Notification.warn(i18n('Reconnected to the server.')); + if (this.onopen) this.onopen(this.reconnect); + }; + this.sock.onclose = (code, reason) => { + console.warn('Connection closed, ', code, reason); + if (this.closed) { + if (this.onclose) this.onclose(code, reason); + return; + } + Notification.warn(i18n('Disconnected from the server. Reconnecting...')); + this.reconnect = setTimeout(() => { this.init(); }, 3000); + if (this.onclose) this.onclose(code, reason); + }; + this.sock.onmessage = (message) => { + if (process.env.NODE_ENV !== 'production') console.log('Sock.onmessage: ', message); + if (this.onmessage) this.onmessage(message); + }; + } + + send(data) { + this.sock.send(data); + } + + close() { + this.closed = true; + this.sock.close(); + } +} diff --git a/ui/pages/home_messages.page.js b/ui/pages/home_messages.page.js index 50d0f4091..c1bf6259f 100644 --- a/ui/pages/home_messages.page.js +++ b/ui/pages/home_messages.page.js @@ -23,7 +23,7 @@ const page = new NamedPage('home_messages', () => { } async function mountComponent() { - const { default: SockJs } = await import('sockjs-client'); + const { default: SockJs } = await import('../components/socket'); const { default: MessagePadApp } = await import('../components/messagepad'); const { default: MessagePadReducer } = await import('../components/messagepad/reducers'); const { diff --git a/ui/pages/judge_playground.page.js b/ui/pages/judge_playground.page.js index 334ce0cf3..35c6ca191 100644 --- a/ui/pages/judge_playground.page.js +++ b/ui/pages/judge_playground.page.js @@ -3,7 +3,7 @@ import { NamedPage } from 'vj/misc/PageLoader'; import * as recordEnum from 'vj/constant/record'; const page = new NamedPage('judge_playground', async () => { - const { default: SockJs } = await import('sockjs-client'); + const { default: SockJs } = await import('../components/socket'); const sock = new SockJs(`/judge/consume-conn?token=${UiContext.token}`); sock.onopen = () => { diff --git a/ui/pages/manage_dashboard.page.js b/ui/pages/manage_dashboard.page.js index d6feea14d..2924f9245 100644 --- a/ui/pages/manage_dashboard.page.js +++ b/ui/pages/manage_dashboard.page.js @@ -1,7 +1,7 @@ import { NamedPage } from 'vj/misc/PageLoader'; const page = new NamedPage('manage_dashboard', async () => { - const { default: SockJs } = await import('sockjs-client'); + const { default: SockJs } = await import('../components/socket'); const sock = new SockJs(Context.socketUrl); sock.onopen = () => { diff --git a/ui/pages/problem_detail.page.js b/ui/pages/problem_detail.page.js index bb67c186d..3fb80431e 100644 --- a/ui/pages/problem_detail.page.js +++ b/ui/pages/problem_detail.page.js @@ -160,7 +160,7 @@ const page = new NamedPage(['problem_detail', 'contest_detail_problem', 'homewor if (reactLoaded) return; $('.loader-container').show(); - const { default: SockJs } = await import('sockjs-client'); + const { default: SockJs } = await import('../components/socket'); const { default: ScratchpadApp } = await import('../components/scratchpad'); const { default: ScratchpadReducer } = await import('../components/scratchpad/reducers'); const { diff --git a/ui/pages/record_detail.page.js b/ui/pages/record_detail.page.js index 03723a466..6751f21e6 100644 --- a/ui/pages/record_detail.page.js +++ b/ui/pages/record_detail.page.js @@ -1,7 +1,7 @@ import { NamedPage } from 'vj/misc/PageLoader'; const page = new NamedPage('record_detail', async () => { - const { default: SockJs } = await import('sockjs-client'); + const { default: SockJs } = await import('../components/socket'); const { DiffDOM } = await import('diff-dom'); const sock = new SockJs(Context.socketUrl); diff --git a/ui/pages/record_main.page.js b/ui/pages/record_main.page.js index 7339d44f6..904a7bd1b 100644 --- a/ui/pages/record_main.page.js +++ b/ui/pages/record_main.page.js @@ -2,7 +2,7 @@ import { NamedPage } from 'vj/misc/PageLoader'; import UserSelectAutoComplete from 'vj/components/autocomplete/UserSelectAutoComplete'; const page = new NamedPage('record_main', async () => { - const { default: SockJs } = await import('sockjs-client'); + const { default: SockJs } = await import('../components/socket'); const { DiffDOM } = await import('diff-dom'); const sock = new SockJs(Context.socketUrl);