Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • Do we have match for the current pages path?

    • If Yes, use corresponding flow id and prompt

    • If No, do we have match on the current domain?

      • If Yes, use corresponding flow id and prompt

      • If No, use the default launch flow id

Settings

In the settings schema we will have properties available for the following.

Code Block
"domainToFlow": {
        "example.org": "64a563f99c5e1200815a303e",
        "my.example.org/PRD": "64d306d9709d4f007e435c70",
        "dev.example.org": "64a563f99c5e1200815a303e",
        "tools.orbita-cs.com": "64d306d9709d4f007e435c70"
    },
    "pathToFlow": {
        "example.org/digital-medicine/connected-health/home-test-page": "64a626ad9c5e1200815a4974",
        "example.org/digitial_medicine/connected-health": "65a626ad9c5e1200815a4974",
        "example.org/digitial_medicine": "65a626ad9c5e1200815a4974",
    },
    "flow": {
        "launch": {
            "id": "64a563f99c5e1200815a303e"
        },
        .
        .
        .        
      }

Intents

We will use the Amazon.StartOverIntent. This will correctly process if the user types “start over” or “startover”.

Experience Designer Logic

Launch

...

Code Block
[
    {
        "id": "1c2dd752.655129",
        "type": "function",
        "z": "81b0fb3a.94e8d8",
        "name": "Get project context",
        "func": "const orbitaUtil = global.get(\"orbitaUtil\");\nconst projectId = orbitaUtil.getProjectId(node);\n\nconst establishDeferral = () => {\n    let deferred = null;\n    \n    const promise = new Promise((resolve, reject) => {\n        deferred = {\n            resolve,\n            reject\n        };\n    });\n    \n    promise.deferred = deferred;\n    \n    return promise;\n};\n\nlet projects = global.get(\"projects\");\n\nif (!projects) {\n    projects = {};\n    global.set(\"projects\", projects);\n}\n\nflow.set(\"project\", undefined);\n\nlet project = projects[projectId];\n\nif (!project || project.isStale) {\n    project = establishDeferral();\n    projects[projectId] = project;\n}\n\nPromise.resolve(project).then((resolvedProject) => {\n    flow.set(\"project\", resolvedProject);\n    \n    node.send(msg);\n});",
        "outputs": 1,
        "noerr": 0,
        "x": 290,
        "y": 140,
        "wires": [
            [
                "9292947b.0814e8"
            ]
        ]
    },
    {
        "id": "9292947b.0814e8",
        "type": "function",
        "z": "81b0fb3a.94e8d8",
        "name": "Dependencies",
        "func": "const project = flow.get(\"project\");\n\nproject.awaitDependencies([\"baseIntents\", \"settings\", \"utilities\"]).then((resolvedDependencies) => {\n    node.send(msg);\n}).catch((error) => {\n    const moduleName = ORBI.utils.getFlowName(node);\n\n    node.error(`${moduleName}: Dependency resolution failed: ${error}`);\n});",
        "outputs": 1,
        "noerr": 0,
        "x": 480,
        "y": 140,
        "wires": [
            [
                "c5606e97.f9751"
            ]
        ]
    },
    {
        "id": "c5606e97.f9751",
        "type": "function",
        "z": "81b0fb3a.94e8d8",
        "name": "Custom afterLaunch handler",
        "func": "const orbitaUtil = global.get(\"orbitaUtil\");\n\nconst project = flow.get(\"project\");\n\nconst { baseIntents, utilities } = project;\n\nconst CUSTOM_DATA_PATHS = {\n    ENTRY_POINT: \"payload.originalDetectIntentRequest.payload.customData.windowLocation.href\"\n};\n\nconst SETTINGS_PATHS = {\n    PATH_TO_FLOW: \"pathToFlow\",\n    DOMAIN_TO_FLOW: \"domainToFlow\"\n};\n\nbaseIntents.registerHandler(\"afterLaunch\", async (msg) => {\n    const { settings } = project;\n    \n    let entryPoint = utilities.object.get(msg, CUSTOM_DATA_PATHS.ENTRY_POINT, null);\n    \n    if (entryPoint) {\n        entryPoint = entryPoint.replace(/^http[s]?:\\/\\//i, \"\");\n        \n        const domain = entryPoint.split(\"/\")[0];\n        \n        const pathToFlow = utilities.object.get(settings, SETTINGS_PATHS.PATH_TO_FLOW, {});\n        const domainToFlow = utilities.object.get(settings, SETTINGS_PATHS.DOMAIN_TO_FLOW, {});\n        \n        let launchFlowIdOverride = null;\n        \n        for (const path in pathToFlow){\n            if (entryPoint.includes(path)) {\n                launchFlowIdOverride = pathToFlow[path];\n            }\n        }\n        \n        if(!launchFlowIdOverride && domainToFlow[domain]){\n            launchFlowIdOverride = domainToFlow[domain];\n        }\n        \n        if (launchFlowIdOverride) {\n            msg.launchFlowId = launchFlowIdOverride;\n        } else {\n            const _ = global.get('lodash');\n            msg.menu = _.get(msg, 'payload.originalDetectIntentRequest.payload.customData.menu',null);\n            if(msg.menu === 'unauthenticated'){\n                msg.launchFlowId = utilities.object.get(settings, \"flow.unauthenticated.id\", null);\n            } else if(msg.menu === 'authenticated'){\n                msg.launchFlowId = utilities.object.get(settings, \"flow.authenticated.id\", null);\n            }\n        }\n        \n        if(msg.payload.originalDetectIntentRequest.payload.language){\n            msg.orbita.session.language = msg.payload.originalDetectIntentRequest.payload.language;\n\n            msg.payload.session.language = msg.orbita.session.language;\n            msg.language = msg.orbita.session.language;\n            msg.analytics.attributes = {\n            'lang': msg.language\n            };\n        }\n        msg.orbita.session.visitID = orbitaUtil.uuid();\n    }\n    return msg;\n});",
        "outputs": 0,
        "noerr": 0,
        "x": 700,
        "y": 140,
        "wires": []
    },
    {
        "id": "4437498f.067e98",
        "type": "inject",
        "z": "81b0fb3a.94e8d8",
        "name": "",
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "x": 110,
        "y": 140,
        "wires": [
            [
                "1c2dd752.655129"
            ]
        ]
    },
    {
        "id": "slots",
        "type": "slots",
        "z": "",
        "slots": []
    }
]

Start Over

...

Code Block
[
    {
        "id": "c8319289.799db",
        "type": "alexa-http intent",
        "z": "34006a85.ab8eb6",
        "name": "",
        "skillConfig": "a765b69a.298f68",
        "url": "/alexa_test",
        "intent": "AMAZON.StartOverIntent",
        "lastIntent": "",
        "x": 340,
        "y": 1100,
        "wires": [
            [
                "b579c77c.7ba308"
            ]
        ]
    },
    {
        "id": "cf3bf50c.e93cb8",
        "type": "alexa-http intent",
        "z": "34006a85.ab8eb6",
        "name": "",
        "skillConfig": "a765b69a.298f68",
        "url": "/alexa_test",
        "intent": "AMAZON.StartOverIntent",
        "lastIntent": "anystate",
        "x": 300,
        "y": 1140,
        "wires": [
            [
                "b579c77c.7ba308"
            ]
        ]
    },
    {
        "id": "b579c77c.7ba308",
        "type": "function",
        "z": "34006a85.ab8eb6",
        "name": "Start Over Flow Picker",
        "func": "const orbitaUtil = global.get(\"orbitaUtil\");\n\nconst project = flow.get(\"project\");\n\nconst { baseIntents, utilities, settings, flowManager } = project;\n\nconst CUSTOM_DATA_PATHS = {\n    ENTRY_POINT: \"payload.originalDetectIntentRequest.payload.customData.windowLocation.href\"\n};\n\nconst SETTINGS_PATHS = {\n    PATH_TO_FLOW: \"pathToFlow\",\n    DOMAIN_TO_FLOW: \"domainToFlow\"\n};\n\nvar launchFlowId = utilities.object.get(settings, \"flow.launch.id\", null);   \n\n\nlet entryPoint = utilities.object.get(msg, CUSTOM_DATA_PATHS.ENTRY_POINT, null);\n    \nif (entryPoint) {\n    entryPoint = entryPoint.replace(/^http[s]?:\\/\\//i, \"\");\n    \n    const domain = entryPoint.split(\"/\")[0];\n    \n    const pathToFlow = utilities.object.get(settings, SETTINGS_PATHS.PATH_TO_FLOW, {});\n    const domainToFlow = utilities.object.get(settings, SETTINGS_PATHS.DOMAIN_TO_FLOW, {});\n    \n    let launchFlowIdOverride = null;\n    \n    for (const path in pathToFlow){\n        if (entryPoint.includes(path)) {\n            launchFlowIdOverride = pathToFlow[path];\n        }\n    }\n        \n    if(!launchFlowIdOverride && domainToFlow[domain]){\n        launchFlowIdOverride = domainToFlow[domain];\n    }\n        \n    if (launchFlowIdOverride) {\n        launchFlowId = launchFlowIdOverride;\n    } else {\n        const _ = global.get('lodash');\n        msg.menu = _.get(msg, 'payload.originalDetectIntentRequest.payload.customData.menu',null);\n        if(msg.menu === 'unauthenticated'){\n            launchFlowId = utilities.object.get(settings, \"flow.unauthenticated.id\", null);\n        } else if(msg.menu === 'authenticated'){\n            launchFlowId = utilities.object.get(settings, \"flow.authenticated.id\", null);\n        }\n    }\n        \n    if(msg.payload.originalDetectIntentRequest.payload.language){\n        msg.orbita.session.language = msg.payload.originalDetectIntentRequest.payload.language;\n\n        msg.payload.session.language = msg.orbita.session.language;\n        msg.language = msg.orbita.session.language;\n        msg.analytics.attributes = {\n        'lang': msg.language\n        };\n    }\n    msg.orbita.session.visitID = orbitaUtil.uuid();\n    node.warn('flowid: ' + launchFlowId)\n}\n    \nflowManager.changeFlow(msg, launchFlowId);\n\nreturn msg;\n",
        "outputs": 0,
        "noerr": 0,
        "x": 660,
        "y": 1120,
        "wires": []
    },
    {
        "id": "a765b69a.298f68",
        "type": "alexa-skill-config",
        "skillname": "Patient Access and Acquisition",
        "projectId": "647644399f8ae70079725b0e",
        "intents": "[]",
        "skillstate": "fromsession, flowManager, FPL, useSymptomChecker, escalation,flow, test,FlowStudio, testState, bill,escalation,confirm_escalation,help,emergency, Reminder, sanity, flow_stud,webWeight,fromSession,flowMngr,scheduleride,aMedication,Survey,whyhelpmessage,medication,callorcomeby,Januvia,survey2,glucose,faqquestion,DailySurveyInProgress,HeadacheSurveyInProgress,MonthlySurveyInProgress,FeedbackSurveyInProgress,AllReportsDone,AskedForChangeResponse,AskedForChangeTwice,MigraineTrackerQuestions1,MigraineTrackerQuestions2,MigraineTrackerQuestions3,StudyQuestions1,StudyQuestions2,StudyQuestions3,Help1,Help2,Help3,AskedForHeadacheStart,AskedForHeadacheStartYesterday,AskedForHeadacheStartTime,AskedForHeadacheEndTime,AskedForHeadacheTimeCorrectness,AskedForHeadacheChangeStartTime,AskedForHeadacheEndDate,InvalidHeadacheTime,AskedForContinuePartial,MaxRecognitionError,ServicePhoneNumber,ConfirmGoHome,ConfirmStop,ConfirmPause,ConfirmCancel,FORTESTING,testState,setup, startup, Survey,flowManager, survey, flowMngr,eventSurvey, whyhelpmessage, HeadacheSurveyInProgress, MonthlySurveyInProgress, FeedbackSurveyInProgress, AllReportsDone, AskedForChangeResponse, AskedForChangeTwice, MigraineTrackerQuestions1, MigraineTrackerQuestions2, MigraineTrackerQuestions3, StudyQuestions1, StudyQuestions2, StudyQuestions3, Help1, Help2, Help3, AskedForHeadacheStart, AskedForHeadacheStartYesterday, AskedForHeadacheStartTime, AskedForHeadacheEndTime, AskedForHeadacheTimeCorrectness, AskedForHeadacheChangeStartTime, AskedForHeadacheEndDate, InvalidHeadacheTime, AskedForContinuePartial, MaxRecognitionError, ServicePhoneNumber, ConfirmGoHome, ConfirmStop, ConfirmPause, ConfirmCancel,pain,dual,TreatmentSurgery,plateletsflow,password,changeappointmentList,MedicalHeart,chooseLocation,cancelAppointment,plateletsFlow, reminder, CheckUser, fromSession, plateletsFlow, cancelAppointment,PlateletsChangeOption,MedicalHemochromatosis, MedicalHeart,LifestyleSTD,setDateOrTimeIntent, FAQ,setTimelanding,setDatelanding,FAQ, fromsession, mayoKB, orbitaKB, askAnother, afterAssessment, phonePrompt, awaitingPhone, confirmPhone, finalPhonePrompt, inChunkedAnswer, appointmentPhonePrompt,reminder,CheckUser,Reminder,sanity,SymptomTriage,survey,LogHealthData,exampleCustomState,t0,t1,t2,t3, FAL, FAP,mayo,inFlow, mayo,flowStudio, resumePrompt,flow_stud",
        "disableLogging": false
    },
    {
        "id": "slots",
        "type": "slots",
        "z": "",
        "slots": []
    }
]