diff --git a/app.rb b/app.rb index d62cb96..4913803 100644 --- a/app.rb +++ b/app.rb @@ -112,6 +112,7 @@ def table_name_from_user_id(user_id) @user_id = user_id @app = :app + @wakeup = params[:wakeup] == "1" erb :app, layout: :layout end @@ -126,7 +127,7 @@ def table_name_from_user_id(user_id) halt 400, "Bad Request: unrecognized sleep_type" if sleep_type.nil? DB[table_name_from_user_id(user_id)].insert(timezone: tz.name, start_at: start_at, end_at: end_at, sleep_type: sleep_type) - redirect "/me/#{user_id}" + redirect "/me/#{user_id}?wakeup=1" end get %r{\A/me/#{UUID_RE}/analytics} do |user_id| diff --git a/public/js/bundle.js b/public/js/bundle.js index c5faec1..c45e951 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -55,6 +55,9 @@ NoFrillsSleepTracker.renderAppAwake = function(rootNode, store, userId, sleepTab store.setItem("start-nap-at-epoch", new Date().getTime()); store.setItem("state", "napping"); + // remove any pending "wakeup=1" param from the URL + history.pushState(null, "", document.location.pathname); + // rerender the app's UI setTimeout(NoFrillsSleepTracker.renderApp.bind(window, rootNode, store, userId), 0); })); @@ -70,6 +73,9 @@ NoFrillsSleepTracker.renderAppAwake = function(rootNode, store, userId, sleepTab store.setItem("start-sleep-at-epoch", new Date().getTime()); store.setItem("state", "sleeping"); + // remove any pending "wakeup=1" param from the URL + history.pushState(null, "", document.location.pathname); + // rerender the app's UI setTimeout(NoFrillsSleepTracker.renderApp.bind(window, rootNode, store, userId), 0); })); @@ -108,8 +114,6 @@ NoFrillsSleepTracker.renderAppSleeping = function(rootNode, store, userId, sleep form.addEventListener("submit", function(ev) { clearInterval(timerId); form.appendChild(NoFrillsSleepTracker.createHiddenInput("end_at", new Date().getTime())); - store.setItem("state", "awake"); - store.removeItem("start-sleep-at-epoch"); }); form.appendChild(state); form.appendChild(NoFrillsSleepTracker.createSubmitButton("Wake up!")); @@ -143,8 +147,6 @@ NoFrillsSleepTracker.renderAppNapping = function(rootNode, store, userId) { form.addEventListener("submit", function(ev) { clearInterval(timerId); form.appendChild(NoFrillsSleepTracker.createHiddenInput("end_at", new Date().getTime())); - store.setItem("state", "awake"); - store.removeItem("start-nap-at-epoch"); }); form.appendChild(state); form.appendChild(NoFrillsSleepTracker.createSubmitButton("Wake from nap")); @@ -152,6 +154,12 @@ NoFrillsSleepTracker.renderAppNapping = function(rootNode, store, userId) { rootNode.appendChild(form); } +NoFrillsSleepTracker.wakeUp = function(store) { + store.setItem("state", "awake"); + store.removeItem("start-nap-at-epoch"); + store.removeItem("start-sleep-at-epoch"); +} + NoFrillsSleepTracker.renderApp = function(rootNode, store, userId, sleepTable) { var timezone = store.getItem("timezone") || "America/New_York"; var state = store.getItem("state") || "awake"; diff --git a/views/app.erb b/views/app.erb index 7bee7ae..714fb2b 100644 --- a/views/app.erb +++ b/views/app.erb @@ -15,6 +15,14 @@ if (params[0] === "timezone") NoFrillsSleepTracker.setTimezone(window.localStorage, param[1]); } + if (<%= @wakeup %>) { + // Reset state when the server tells us to do so + // Since we don't do 2 phase commit, or use an Ajax request to change the server's state, + // we have to wait until the server acknowledges the state change before resetting our + // localStorage state. + NoFrillsSleepTracker.wakeUp(window.localStorage); + } + NoFrillsSleepTracker.renderApp(document.getElementById("app"), window.localStorage, userId, <%= @last5.to_json %>); } else { NoFrillsSleepTracker.renderLocalStorageDisabled(document.getElementById("app"));