diff --git a/frontend/ui/src/lib/stores/issues.js b/frontend/ui/src/lib/stores/issues.js index 96fbb554..a6508fcb 100644 --- a/frontend/ui/src/lib/stores/issues.js +++ b/frontend/ui/src/lib/stores/issues.js @@ -30,22 +30,24 @@ function createIssuesStore() { } } + async function refreshFunc(cb=null, interval=null) { + if (refresh_interval_issues) + clearInterval(refresh_interval_issues); + if (interval === null) { + interval = Math.floor(Math.random() * 24000) + 32000; + } + if (stop_refresh) { + return; + } + refresh_interval_issues = setInterval(refreshFunc, interval); + + updateFunc(await fetch('issues.json', {headers: {'Accept': 'application/json'}}), cb); + } + return { subscribe, - refresh: async (cb=null, interval=null) => { - if (refresh_interval_issues) - clearInterval(refresh_interval_issues); - if (interval === null) { - interval = Math.floor(Math.random() * 24000) + 32000; - } - if (stop_refresh) { - return; - } - refresh_interval_issues = setInterval(refresh_issues, interval); - - updateFunc(await fetch('issues.json', {headers: {'Accept': 'application/json'}}), cb); - }, + refresh: refreshFunc, update: updateFunc, }; diff --git a/frontend/ui/src/lib/stores/my.js b/frontend/ui/src/lib/stores/my.js index ecf3b569..cfc7a352 100644 --- a/frontend/ui/src/lib/stores/my.js +++ b/frontend/ui/src/lib/stores/my.js @@ -40,22 +40,24 @@ function createMyStore() { } } + async function refreshFunc(cb=null, interval=null) { + if (refresh_interval_my) + clearInterval(refresh_interval_my); + if (interval === null) { + interval = Math.floor(Math.random() * 24000) + 24000; + } + if (stop_refresh) { + return; + } + refresh_interval_my = setInterval(refreshFunc, interval); + + updateFunc(await fetch('my.json', {headers: {'Accept': 'application/json'}}), cb); + } + return { subscribe, - refresh: async (cb=null, interval=null) => { - if (refresh_interval_my) - clearInterval(refresh_interval_my); - if (interval === null) { - interval = Math.floor(Math.random() * 24000) + 24000; - } - if (stop_refresh) { - return; - } - refresh_interval_my = setInterval(refresh_my, interval); - - updateFunc(await fetch('my.json', {headers: {'Accept': 'application/json'}}), cb); - }, + refresh: refreshFunc, update: updateFunc, }; diff --git a/frontend/ui/src/lib/stores/settings.js b/frontend/ui/src/lib/stores/settings.js index f7c920b6..bb1ebf43 100644 --- a/frontend/ui/src/lib/stores/settings.js +++ b/frontend/ui/src/lib/stores/settings.js @@ -1,6 +1,7 @@ import { readable, writable } from 'svelte/store'; import { stop_refresh } from './common'; +import { my } from './my'; let refresh_interval_settings = null; @@ -40,41 +41,43 @@ function createSettingsStore() { } } + async function refreshFunc(cb=null, interval=null) { + if (refresh_interval_settings) + clearInterval(refresh_interval_settings); + if (interval === null) { + interval = Math.floor(Math.random() * 24000) + 32000; + } + if (stop_refresh) { + return; + } + refresh_interval_settings = setInterval(refreshFunc, interval); + + if (!cb) { + // Before we start, update settings more frequently. + cb = function(stgs) { + const srv_cur = new Date(Date.now() + (stgs.currentTime - stgs.recvTime)); + + if (settings.start > srv_cur) { + const startIn = settings.start - srv_cur; + if (startIn > 15000) { + setTimeout(refreshFunc, Math.floor(Math.random() * 10000) + 2400) + } else if (startIn > 1500) { + setTimeout(refreshFunc, startIn - 1000 - Math.floor(Math.random() * 500)) + } else { + // On scheduled start time, refresh my.json file + setTimeout(my.refresh, startIn + Math.floor(Math.random() * 200)) + } + } + }; + } + + updateFunc(await fetch('settings.json', {headers: {'Accept': 'application/json'}}), cb); + }; + return { subscribe, - refresh: async (cb=null, interval=null) => { - if (refresh_interval_settings) - clearInterval(refresh_interval_settings); - if (interval === null) { - interval = Math.floor(Math.random() * 24000) + 32000; - } - if (stop_refresh) { - return; - } - refresh_interval_settings = setInterval(refresh_settings, interval); - - if (!cb) { - // Before we start, update settings more frequently. - cb = function(stgs) { - const srv_cur = new Date(Date.now() + (stgs.currentTime - stgs.recvTime)); - - if (settings.start > srv_cur) { - const startIn = settings.start - srv_cur; - if (startIn > 15000) { - setTimeout(refresh_settings, Math.floor(Math.random() * 10000) + 2400) - } else if (startIn > 1500) { - setTimeout(refresh_settings, startIn - 1000 - Math.floor(Math.random() * 500)) - } else { - // On scheduled start time, refresh my.json file - setTimeout(refresh_my, startIn + Math.floor(Math.random() * 200)) - } - } - }; - } - - updateFunc(await fetch('settings.json', {headers: {'Accept': 'application/json'}}), cb); - }, + refresh: refreshFunc, update: updateFunc, } diff --git a/frontend/ui/src/lib/stores/teams.js b/frontend/ui/src/lib/stores/teams.js index e4bed9a4..51c0e2b5 100644 --- a/frontend/ui/src/lib/stores/teams.js +++ b/frontend/ui/src/lib/stores/teams.js @@ -28,22 +28,24 @@ function createTeamsStore() { } } + async function refreshFunc(cb=null, interval=null) { + if (refresh_interval_teams) + clearInterval(refresh_interval_teams); + if (interval === null) { + interval = Math.floor(Math.random() * 24000) + 32000; + } + if (stop_refresh) { + return; + } + refresh_interval_teams = setInterval(refreshFunc, interval); + + updateFunc(await fetch('teams.json', {headers: {'Accept': 'application/json'}}), cb); + } + return { subscribe, - refresh: async (cb=null, interval=null) => { - if (refresh_interval_teams) - clearInterval(refresh_interval_teams); - if (interval === null) { - interval = Math.floor(Math.random() * 24000) + 32000; - } - if (stop_refresh) { - return; - } - refresh_interval_teams = setInterval(refresh_teams, interval); - - updateFunc(await fetch('teams.json', {headers: {'Accept': 'application/json'}}), cb); - }, + refresh: refreshFunc, update: updateFunc, }; diff --git a/frontend/ui/src/lib/stores/themes.js b/frontend/ui/src/lib/stores/themes.js index cb29550d..1ebaf204 100644 --- a/frontend/ui/src/lib/stores/themes.js +++ b/frontend/ui/src/lib/stores/themes.js @@ -50,22 +50,24 @@ function createThemesStore() { } } + async function refreshFunc(cb=null, interval=null) { + if (refresh_interval_themes) + clearInterval(refresh_interval_themes); + if (interval === null) { + interval = Math.floor(Math.random() * 24000) + 32000; + } + if (stop_refresh) { + return; + } + refresh_interval_themes = setInterval(refreshFunc, interval); + + await updateFunc(await fetch('themes.json', {headers: {'Accept': 'application/json'}}), cb); + } + return { subscribe, - refresh: async (cb=null, interval=null) => { - if (refresh_interval_themes) - clearInterval(refresh_interval_themes); - if (interval === null) { - interval = Math.floor(Math.random() * 24000) + 32000; - } - if (stop_refresh) { - return; - } - refresh_interval_themes = setInterval(refresh_themes, interval); - - await updateFunc(await fetch('themes.json', {headers: {'Accept': 'application/json'}}), cb); - }, + refresh: refreshFunc, update: updateFunc, }; diff --git a/frontend/ui/src/routes/+layout.js b/frontend/ui/src/routes/+layout.js index 2853b175..db1908ca 100644 --- a/frontend/ui/src/routes/+layout.js +++ b/frontend/ui/src/routes/+layout.js @@ -10,12 +10,12 @@ export const ssr = false; export async function load() { await challengeInfo.refresh(); await settings.refresh(); - await themes.refresh(); - teams.refresh(); + await themesStore.refresh(); + teamsStore.refresh(); my.refresh((my) => { if (my && my.team_id === 0) { stop_refresh = true; } }); - issues.refresh(); + issuesStore.refresh(); } diff --git a/frontend/ui/src/routes/+layout.svelte b/frontend/ui/src/routes/+layout.svelte index 560fb1ff..e6fda340 100644 --- a/frontend/ui/src/routes/+layout.svelte +++ b/frontend/ui/src/routes/+layout.svelte @@ -8,6 +8,9 @@ } from 'sveltestrap'; import Header from '$lib/components/Header.svelte'; + + import { challengeInfo } from '$lib/stores/challengeinfo'; + import { settings } from '$lib/stores/settings'; diff --git a/frontend/ui/src/routes/[theme]/+layout.svelte b/frontend/ui/src/routes/[theme]/+layout.svelte index c53957e4..1645772a 100644 --- a/frontend/ui/src/routes/[theme]/+layout.svelte +++ b/frontend/ui/src/routes/[theme]/+layout.svelte @@ -5,20 +5,20 @@ import { challengeInfo } from '$lib/stores/challengeinfo.js'; - export let theme; + export let data; - {theme?theme.name:""} - {$challengeInfo.title} + {data.theme?data.theme.name:""} - {$challengeInfo.title} -{#if theme} -