forked from Asinphi/verizon-hackathon
-
Notifications
You must be signed in to change notification settings - Fork 1
/
website-sections.js
172 lines (157 loc) · 5.64 KB
/
website-sections.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
function sendMessage(msgObj) {
return chrome.tabs.query({active: true, lastFocusedWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, msgObj);
});
}
async function goToUrl(url) {
sendMessage({
destinationURL: url
});
}
async function execute(sectionName, funcName, args) {
console.log("Executing", funcName, "with args", args);
sendMessage({
section: sectionName,
execute: funcName,
args: args
});
}
async function sendBotMsg(msg) {
console.log("Sending bot msg", msg);
lastBotPrompt = msg;
sendMessage({
botMsg: msg
});
}
function addPromptedFunction(name, obj, callback) {
const now = new Date().getTime();
promptedFunctions[name] = {
obj: obj,
callback: callback,
time: now
}
setTimeout(() => {
if (promptedFunctions[name] && promptedFunctions[name].time === now) {
delete promptedFunctions[name];
}
}, 60 * 4 * 1000)
}
function addPromptedArg(obj, callback) {
const name = Object.keys(obj)[0];
const now = new Date().getTime();
promptedArguments[name] = {
obj: obj,
callback: callback,
time: now
}
setTimeout(() => {
if (promptedArguments[name] && promptedArguments[name].time === now) {
delete promptedArguments[name];
}
}, 60 * 4 * 1000)
}
const websiteSections = {
"Cart": "https://www.verizon.com/sales/prepaid/expresscart.html?promohub=true",
"Smartphones": "https://www.verizon.com/smartphones/prepaid/",
"Billing Information": {
url: "https://www.verizon.com/sales/prepaid/aboutyourself.html",
background: async () => {
await sendBotMsg("Tell us about yourself and join the Verizon family.");
}
},
"Accessories": {
url: "https://www.verizon.com/sales/prepaid/accessoryInterstitial.html",
background: async () => {
await sendBotMsg("Care for additional accessories?");
}
},
"Apple iPhone 14": {
url: "https://www.verizon.com/smartphones/apple-iphone-14-prepaid/",
background: async () => {
await sendBotMsg("Do you have a preferred phone color? Storage capacity?");
let colorSet = false;
let storageSet = false;
addPromptedArg({
"phone_color": {
type: "string",
enum: ["Starlight", "Yellow", "Purple", "Blue", "(PRODUCT)RED", "Midnight"]
}
}, async (color) => {
colorSet = true;
onReady();
await execute("Apple iPhone 14", "setColor", [color.charAt(0).toUpperCase() + color.slice(1)])
});
addPromptedArg({
"storage_capacity": {
type: "string",
enum: ["128GB", "256GB", "512GB"]
}
}, async (storage) => {
storageSet = true;
onReady();
await execute("Apple iPhone 14", "setStorage", [storage]);
});
const onReady = async () => {
if (colorSet && storageSet) {
colorSet = false; // Make sure it can't execute multiple times
await sleep(1000);
await sendBotMsg("Great choice! If you're ready to buy, just enter your zip code.");
await sleep(4000);
await execute("Apple iPhone 14", "addToCart")
}
}
},
foreground: {
setColor: (color) => {
document.querySelector(`input[aria-label='${color} color']`).click();
},
setStorage: (storage) => {
document.querySelector(`input[aria-label='${storage} storage']`).click();
},
addToCart: () => {
document.getElementById("ATC-Btn").click();
}
}
},
"Prepaid Plans": {
url: "https://www.verizon.com/plans/prepaid/",
background: async () => {
await sendBotMsg("What plan would you like? 15 GB data, Unlimited Data, or Unlimited Plus?")
addPromptedArg({
"num_phone_lines": {
type: "number",
description: "The number of phone lines the user wants to activate."
}
}, async (numLines) => {
await execute("Prepaid Plans", "setNumLines", [numLines]);
await sleep(2000);
await sendBotMsg("If you don't have a smartphone, you can buy one from Verizon to use with your plan. Would you like to check out our smartphones?");
});
},
foreground: {
setNumLines: async (numLines) => {
const addBtn = document.getElementById("overview-increment");
const subBtn = document.getElementById("overview-decrement");
const display = document.getElementById("overview-lines");
display.scrollIntoView({ behavior: 'smooth', block: 'center' });
await sleep (800);
while (display.innerText < numLines) {
addBtn.click();
await sleep(200);
}
while (display.innerText > numLines) {
subBtn.click();
await sleep(500);
}
}
}
}
};
const navigateToSection = async (sectionName) => {
const callback = websiteSections[sectionName];
if (typeof callback === "string")
return goToUrl(callback);
if (callback.url) {
await goToUrl(callback.url);
}
}