#include "provisioning.h" #include "email_address_page.h" #include "home.h" #include "license_key_page.h" #include "logger/logger.h" #include "wifi_setup_page.h" namespace radiantwave::provisioning { // Push the page for a walkthrough step, or Home when the walkthrough is done. static void pushStep(AppState &state, Step step) { switch (step) { // case Step::Internet: // state.pages.push(state, std::make_unique()); // break; case Step::Email: state.pages.push(state, std::make_unique()); break; case Step::License: state.pages.push(state, std::make_unique()); break; case Step::Done: state.provisioningMode = false; state.pages.push(state, std::make_unique()); break; } } void begin(AppState &state) { // Without the database there is nowhere to persist email/license, so the // walkthrough would trap the user on pages that can never be completed. if (!state.db.isOpen()) { state.provisioningMode = false; state.pages.push(state, std::make_unique()); return; } const bool internetUp = state.network.hasInternet(); const bool hasEmail = !state.db.getKV(radiantwave::db::KV_EMAIL_ADDRESS).empty(); const bool hasLicense = !state.db.getKV(radiantwave::db::KV_LICENSE_KEY).empty(); if (indicatesFirstRun(internetUp, hasEmail, hasLicense)) { // Placeholder: a brand-new device. Later this flag will launch the // first-run welcome walkthrough (TOS, quick user guide, ...). state.firstRunWalkthrough = true; radiantwave::logger::Logger::instance().info( "Provisioning", "First-Run detected (no internet, no email, no license); " "first-run welcome walkthrough is not yet implemented"); } state.walkthroughInternetUp = internetUp; state.provisioningMode = true; pushStep(state, firstMissingStep(internetUp, hasEmail, hasLicense)); } void advance(AppState &state) { if (state.pages.depth() > 0) { state.pages.pop(state); } // Internet is the first prerequisite and never gets "un-reached" once // satisfied, so it is only re-probed when it was still missing (i.e. the // walkthrough is coming from the WiFi page). bool internetUp = state.walkthroughInternetUp; if (!internetUp) { internetUp = state.network.hasInternet(); state.walkthroughInternetUp = internetUp; } const bool hasEmail = !state.db.getKV(radiantwave::db::KV_EMAIL_ADDRESS).empty(); const bool hasLicense = !state.db.getKV(radiantwave::db::KV_LICENSE_KEY).empty(); state.provisioningMode = true; pushStep(state, firstMissingStep(internetUp, hasEmail, hasLicense)); } } // namespace radiantwave::provisioning