feat(extension): autofill support
This commit is contained in:
parent
0a81bf5bbc
commit
6c7809f853
4 changed files with 151 additions and 15 deletions
|
@ -8,6 +8,8 @@
|
||||||
--error: orange;
|
--error: orange;
|
||||||
--accent: #f9027a;
|
--accent: #f9027a;
|
||||||
--accent-dim: hsl(331, 50%, 49%);
|
--accent-dim: hsl(331, 50%, 49%);
|
||||||
|
--confirm: #82f1b1;
|
||||||
|
--warning: #fb7185;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
@ -252,3 +254,38 @@ td.code-bad {
|
||||||
font-weight: 900;
|
font-weight: 900;
|
||||||
font-size: 2em;
|
font-size: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.button-container {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
width: 100%;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-container .button {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
border: none;
|
||||||
|
padding: 8px;
|
||||||
|
border-radius: 8px;
|
||||||
|
cursor: pointer;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: initial;
|
||||||
|
color: black;
|
||||||
|
transition: filter 200ms ease;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button.confirm {
|
||||||
|
background-color: var(--confirm);
|
||||||
|
}
|
||||||
|
|
||||||
|
.button.warning {
|
||||||
|
background-color: var(--warning);
|
||||||
|
}
|
||||||
|
|
|
@ -88,10 +88,19 @@ function interceptCode(details) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleMessage(message) {
|
function handleMessage(message, sender) {
|
||||||
if (message['type'] === 'link-activity-details') {
|
if (message['type'] === 'link-activity-details') {
|
||||||
const { activityId, date, time, name, space } = message;
|
const { activityId, date, time, name, space } = message;
|
||||||
attachActivityDetails(activityId, date, time, name, space);
|
attachActivityDetails(activityId, date, time, name, space);
|
||||||
|
} else if (message['type'] === 'create-popup') {
|
||||||
|
const create = message['create'];
|
||||||
|
create.url += '&tabId=' + sender.tab.id;
|
||||||
|
browser.windows.create(create);
|
||||||
|
} else if (message['type'] === 'autofill-code') {
|
||||||
|
browser.tabs.sendMessage(message['tabId'], {
|
||||||
|
type: 'autofill-code',
|
||||||
|
code: message['code'],
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
console.warn('recieved unknown message:', message);
|
console.warn('recieved unknown message:', message);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ console.log('hello');
|
||||||
const time = section.querySelector('.row:nth-child(1) > .col-md-4').innerText;
|
const time = section.querySelector('.row:nth-child(1) > .col-md-4').innerText;
|
||||||
const name = section.querySelector('.row:nth-child(2) > .col-md-4').innerText;
|
const name = section.querySelector('.row:nth-child(2) > .col-md-4').innerText;
|
||||||
const space = section.querySelector('.row:nth-child(4) > .col-md-4').innerText;
|
const space = section.querySelector('.row:nth-child(4) > .col-md-4').innerText;
|
||||||
|
|
||||||
browser.runtime.sendMessage({
|
browser.runtime.sendMessage({
|
||||||
type: 'link-activity-details',
|
type: 'link-activity-details',
|
||||||
activityId,
|
activityId,
|
||||||
|
@ -16,5 +17,41 @@ console.log('hello');
|
||||||
name,
|
name,
|
||||||
space,
|
space,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const submitButton = section.querySelector('.selfregistration-changestatus');
|
||||||
|
submitButton.addEventListener('click', async function(event) {
|
||||||
|
const params = new URLSearchParams({
|
||||||
|
date,
|
||||||
|
time,
|
||||||
|
activity: name,
|
||||||
|
space,
|
||||||
|
});
|
||||||
|
browser.runtime.sendMessage({
|
||||||
|
type: 'create-popup',
|
||||||
|
create: {
|
||||||
|
url: browser.runtime.getURL('src/popup.html') + '#' + params.toString(),
|
||||||
|
width: 360,
|
||||||
|
height: 480,
|
||||||
|
type: 'popup',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
function autofillCode(code) {
|
||||||
|
const input = document.querySelector('#notie-input-field');
|
||||||
|
if (input.value === '') {
|
||||||
|
input.value = code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMessage(message) {
|
||||||
|
if (message['type'] === 'autofill-code') {
|
||||||
|
console.log('i am autofill', message);
|
||||||
|
const { code } = message;
|
||||||
|
autofillCode(code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
browser.runtime.onMessage.addListener(handleMessage);
|
||||||
|
|
|
@ -40,10 +40,39 @@
|
||||||
details.innerHTML += '<br>';
|
details.innerHTML += '<br>';
|
||||||
details.innerHTML += dataRow('Location', activity.space).innerHTML;
|
details.innerHTML += dataRow('Location', activity.space).innerHTML;
|
||||||
root.appendChild(details);
|
root.appendChild(details);
|
||||||
|
activity.codes.sort(code => -code.score);
|
||||||
root.appendChild(codeTable(activity.codes));
|
root.appendChild(codeTable(activity.codes));
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function simpleButton(text, clickHandler, type) {
|
||||||
|
const button = document.createElement('button');
|
||||||
|
button.onclick = clickHandler;
|
||||||
|
button.classList.add('button');
|
||||||
|
button.classList.add(type);
|
||||||
|
button.innerText = text;
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
function submitButtons(code, tabId) {
|
||||||
|
const buttonContainer = document.createElement('div');
|
||||||
|
buttonContainer.classList.add('button-container');
|
||||||
|
const cancelButton = simpleButton('Cancel', function() {
|
||||||
|
window.close();
|
||||||
|
}, 'warning');
|
||||||
|
const submitButton = simpleButton(`Autofill ${code}`, function () {
|
||||||
|
browser.runtime.sendMessage({
|
||||||
|
type: 'autofill-code',
|
||||||
|
code,
|
||||||
|
tabId,
|
||||||
|
});
|
||||||
|
window.close();
|
||||||
|
}, 'confirm');
|
||||||
|
buttonContainer.appendChild(cancelButton);
|
||||||
|
buttonContainer.appendChild(submitButton);
|
||||||
|
return buttonContainer;
|
||||||
|
}
|
||||||
|
|
||||||
function message(message, error = false) {
|
function message(message, error = false) {
|
||||||
const ele = document.createElement('p');
|
const ele = document.createElement('p');
|
||||||
if (error) {
|
if (error) {
|
||||||
|
@ -57,21 +86,45 @@
|
||||||
root.appendChild(ele);
|
root.appendChild(ele);
|
||||||
}
|
}
|
||||||
|
|
||||||
const res = await fetch(SERVER_URL + '/api/codes').catch((e) => {
|
if (window.location.hash.length >= 2) {
|
||||||
message(`Something went wrong: ` + e);
|
const query = window.location.hash.substring(1);
|
||||||
console.error(e);
|
const queryParams = new URLSearchParams(query);
|
||||||
});
|
const res = await fetch(SERVER_URL + '/api/codes/query?' + query).catch((e) => {
|
||||||
if (!res.ok) {
|
message(`Something went wrong: ${e}`);
|
||||||
message('Server returned error code ' + res.status + ': ' + res.statusText, true);
|
console.error(e);
|
||||||
return;
|
});
|
||||||
}
|
if (!res.ok) {
|
||||||
const { activities } = await res.json();
|
message('Server returned error code ' + res.status + ': ' + res.statusText, true);
|
||||||
if (activities.length === 0) {
|
return;
|
||||||
message('No codes are available right now :/');
|
}
|
||||||
} else {
|
const activity = await res.json();
|
||||||
activities.sort(activity => activity.time);
|
if (activity.codes.length === 0) {
|
||||||
for (const activity of activities) {
|
message('No codes are available right now :/');
|
||||||
|
} else {
|
||||||
root.appendChild(activityEle(activity));
|
root.appendChild(activityEle(activity));
|
||||||
|
|
||||||
|
const topCode = activity.codes[0];
|
||||||
|
if (topCode.score >= -1) {
|
||||||
|
root.appendChild(submitButtons(topCode.code, parseInt(queryParams.get('tabId'))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const res = await fetch(SERVER_URL + '/api/codes').catch((e) => {
|
||||||
|
message(`Something went wrong: ${e}`);
|
||||||
|
console.error(e);
|
||||||
|
});
|
||||||
|
if (!res.ok) {
|
||||||
|
message('Server returned error code ' + res.status + ': ' + res.statusText, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const { activities } = await res.json();
|
||||||
|
if (activities.length === 0) {
|
||||||
|
message('No codes are available right now :/');
|
||||||
|
} else {
|
||||||
|
activities.sort(activity => activity.time);
|
||||||
|
for (const activity of activities) {
|
||||||
|
root.appendChild(activityEle(activity));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
Loading…
Reference in a new issue