Skip to content
This repository has been archived by the owner on Mar 15, 2024. It is now read-only.

Commit

Permalink
Fix issues from Typescript Refactor (#26)
Browse files Browse the repository at this point in the history
Bug Fixes:
- Fixes an issue where, during initial setup, the extension could cause the sync to happen before the properties have been set up in Mint.
- Fixes #22: The extension would sometimes fail to open the tabs used for syncing.
- Fixes #25: The inputs for the values received from Mint could not be found sometimes

New Features:
- "Debug Mode" setting that enables logging. This can be used to diagnose issues in the future. This will also prevent the tabs the extension uses for syncing from closing when they are finished.

Maintenance:
- Include prettier configuration
- Update release script
- Improve `waitForElement` utility
  • Loading branch information
pkmnct committed Jan 17, 2021
1 parent df76b28 commit 6366b3c
Show file tree
Hide file tree
Showing 10 changed files with 125 additions and 111 deletions.
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "robinhood-mint-sync-chrome",
"version": "3.1.0",
"version": "3.2.0",
"repository": {
"type": "git",
"url": "git+https://github.com/pkmnct/robinhood-mint-sync-chrome.git"
Expand Down Expand Up @@ -38,6 +38,7 @@
"clean": "rimraf dist",
"prerelease": "npm run clean",
"release": "npm run build",
"postrelease": "cd dist && cross-var bestzip ../$npm_package_name@$npm_package_version.zip * && cd .."
"zip": "cd dist && cross-var bestzip ../$npm_package_name@$npm_package_version.zip * && cd ..",
"postrelease": "rimraf *.zip && npm run zip"
}
}
2 changes: 1 addition & 1 deletion public/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

"name": "Robinhood Mint Sync for Chrome",
"description": "Automatically add your Robinhood portfolio to Mint",
"version": "3.1.0",
"version": "3.2.0",
"author": "George Walker",

"icons": {
Expand Down
5 changes: 5 additions & 0 deletions src/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"tabWidth": 2,
"useTabs": false,
"printWidth": 160
}
103 changes: 61 additions & 42 deletions src/background/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import { Debug } from "../utilities/debug";
const debug = new Debug("background", "Main");

// Need to be able to access this regardless of the message.
let mintTab;
let mintTab: undefined | number;
let newProperties = 0;
let newPropertiesComplete = 0;

interface eventHandler {
message: any;
Expand All @@ -15,7 +17,7 @@ interface eventHandler {
const eventHandlers = {
// This event is emitted by the main Robinhood content script.
"robinhood-login-needed": ({ sender }: eventHandler) => {
debug.log("robinhood-login-needed event");
debug.log("robinhood-login-needed event");
chrome.tabs.sendMessage(mintTab, {
status: "You need to log in to Robinhood",
link: urls.robinhood.login,
Expand All @@ -27,7 +29,7 @@ const eventHandlers = {
},
// This event is emitted by the login Robinhood content script.
"robinhood-login-success": ({ sender }: eventHandler) => {
debug.log("robinhood-login-success event");
debug.log("robinhood-login-success event");

// Close the Robinhood tab logged in from
if (!debug.isEnabled()) chrome.tabs.remove(sender.tab.id);
Expand All @@ -36,7 +38,6 @@ const eventHandlers = {
chrome.tabs.create({
url: urls.robinhood.scrape,
active: false,
openerTabId: mintTab,
});

// Switch focus back to Mint
Expand All @@ -46,29 +47,31 @@ const eventHandlers = {
},
// This event is emitted by the main Robinhood content script.
"robinhood-portfolio-scraped": ({ sender, message }: eventHandler) => {
debug.log("robinhood-portfolio-scraped event");
debug.log("robinhood-portfolio-scraped event");
// Trigger the Mint portfolio update content script
chrome.tabs.create(
{
url: urls.mint.properties.update,
active: false,
openerTabId: sender.tab.id,
},
(tab) => {
debug.log("waiting for Mint tab to load")
debug.log("waiting for Mint tab to load");
const checkIfLoaded = () => {
chrome.tabs.get(tab.id, (tab) => {
if (!tab) {
clearInterval(sendMessageInterval);
debug.log("tab was not found. Clearing interval to prevent endless loop.");
}
if (tab.status === "complete") {
// Once the tab is loaded, pass the message to it
chrome.tabs.sendMessage(tab.id, message);
clearInterval(sendMessageInterval);
debug.log("Mint tab loaded");
}
});
if (!tab) {
clearInterval(sendMessageInterval);
debug.log(
"Unexpected: Tab was not found. Clearing interval to prevent endless loop. Did the tab get closed?"
);
} else {
chrome.tabs.get(tab.id, (tab) => {
if (tab.status === "complete") {
// Once the tab is loaded, pass the message to it
chrome.tabs.sendMessage(tab.id, message);
clearInterval(sendMessageInterval);
debug.log("Mint tab loaded");
}
});
}
};
const sendMessageInterval = setInterval(checkIfLoaded, 200);
}
Expand All @@ -77,49 +80,67 @@ const eventHandlers = {
},
// This event is emitted by the Mint main content script.
"mint-force-sync": () => {
debug.log("mint-force-sync event");
debug.log("mint-force-sync event");
// Trigger the main Robinhood sync script
chrome.tabs.create({
url: urls.robinhood.scrape,
active: false,
openerTabId: mintTab,
});
},
// This event is emitted by the Mint property create content script.
"mint-property-added": ({ sender }: eventHandler) => {
debug.log("mint-property-added event");
if (!debug.isEnabled()) chrome.tabs.remove(sender.tab.id);
},
// This event is emitted by the Mint property check content script.
"mint-property-setup-complete": ({ sender }: eventHandler) => {
debug.log("mint-property-setup-complete event");

chrome.storage.sync.set({
propertiesSetup: true,
needsOldPropertyRemoved: false,
});

debug.log("mint-property-added event");
newPropertiesComplete++;
if (!debug.isEnabled()) chrome.tabs.remove(sender.tab.id);

debug.log(`Setup ${newPropertiesComplete} of ${newProperties} properties.`);
if (newPropertiesComplete === newProperties) {
eventHandlers["setup-complete"]();
}
},
// This event is emitted by the mint-property-added and/or the mint-property-setup-complete event handlers
"setup-complete": () => {
debug.log("setup-complete event");
debug.log("setup-complete sending notification");
chrome.tabs.sendMessage(mintTab, {
status: "Setup complete! Initiating Sync.",
persistent: true,
});

debug.log("setup-complete opening Robinhood to scrape");
// Trigger the Robinood sync content script
chrome.tabs.create({
url: urls.robinhood.scrape,
active: false,
openerTabId: mintTab,
});

debug.log("setup-complete switching focus back to Mint");
// Switch focus back to Mint
chrome.tabs.update(mintTab, {
selected: true,
});
},
// This event is emitted by the Mint property check content script.
"mint-property-setup-complete": ({ sender, message }: eventHandler) => {
debug.log("mint-property-setup-complete event");

debug.log("mint-property-setup-complete setting storage");
chrome.storage.sync.set({
propertiesSetup: true,
needsOldPropertyRemoved: false,
});

if (!debug.isEnabled()) chrome.tabs.remove(sender.tab.id);

newProperties = parseInt(message.newProperties);
debug.log(`Setting up ${newProperties} properties.`);
if (newProperties === 0) {
eventHandlers["setup-complete"]();
}
},
// This event is emitted by the Mint property update content script.
"mint-sync-complete": () => {
debug.log("mint-sync-complete event");
debug.log("mint-sync-complete event");
chrome.storage.sync.set({ syncTime: new Date().toString() });
chrome.tabs.sendMessage(mintTab, {
status: "Sync Complete! Reload to see the change.",
Expand All @@ -130,7 +151,7 @@ const eventHandlers = {
},
// This event is emitted by the main Mint content script
"mint-opened": ({ sender }: eventHandler) => {
debug.log("mint-opened event");
debug.log("mint-opened event");
// Store a reference to the mint tab to be able to show the notifications
mintTab = sender.tab.id;

Expand All @@ -152,7 +173,6 @@ const eventHandlers = {
chrome.tabs.create({
url: urls.mint.properties.check,
active: false,
openerTabId: mintTab,
});
} else if (!propertiesSetup || !syncTime) {
// Sync has not been set up
Expand Down Expand Up @@ -182,7 +202,6 @@ const eventHandlers = {
chrome.tabs.create({
url: urls.robinhood.scrape,
active: false,
openerTabId: mintTab,
});
} else {
chrome.tabs.sendMessage(mintTab, {
Expand All @@ -197,16 +216,16 @@ const eventHandlers = {
);
},
// This event is emitted by the Mint property check content script.
"mint-create": ({ message, sender }: eventHandler) => {
debug.log("mint-create event");
"mint-create": ({ message }: eventHandler) => {
debug.log("mint-create event");
chrome.tabs.create({
url: urls.mint.properties.create + "&property=" + message.property,
active: false,
});
},
// This event is emitted by the Mint property check content script.
"mint-property-remove": ({ message, sender }: eventHandler) => {
debug.log("mint-property-remove event");
"mint-property-remove": ({ sender }: eventHandler) => {
debug.log("mint-property-remove event");
chrome.tabs.sendMessage(mintTab, {
status:
"Your account was set up prior to version 3 of this extension. Version 3 introduced separation of asset types when syncing. Please remove the old 'Robinhood Account' property from Mint to prevent duplication of your portfolio balance. Reload the overview to sync after removing the property.",
Expand Down
3 changes: 3 additions & 0 deletions src/content/mint/properties/check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,15 @@ const checkIfPropertyExists = (property) => {

window.addEventListener("load", () => {
waitForElement(".OtherPropertyView", null, () => {
let newProperties = 0;
robinhoodProperties.forEach((property) => {
if (!checkIfPropertyExists(property)) {
// Trigger setup of property
chrome.runtime.sendMessage({
event: "mint-create",
property,
});
newProperties++;
}
});
if (checkIfPropertyExists("Account")) {
Expand All @@ -48,6 +50,7 @@ window.addEventListener("load", () => {
} else {
chrome.runtime.sendMessage({
event: "mint-property-setup-complete",
newProperties,
});
}
});
Expand Down
54 changes: 24 additions & 30 deletions src/content/mint/properties/update.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,13 @@ import { waitForElement } from "../../../utilities/waitForElement";

const debug = new Debug("content", "Mint - Properties - Update");

new Overlay(
"Syncing Mint and Robinhood...",
"This window will automatically close when the sync is complete"
);
new Overlay("Updating Mint Properties...", "This window will automatically close when the sync is complete");

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
if (request.event === "robinhood-portfolio-scraped") {
debug.log("Waiting for Property Tab View to load");
waitForElement(".PropertyTabView", null, () => {
debug.log("Property Tab View loaded.");
waitForElement(".PropertyTabView", null, (propertyViewElement) => {
debug.log("Property Tab View loaded.", propertyViewElement);

let crypto = 0;
let stocks = 0;
Expand All @@ -38,7 +35,7 @@ chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
debug.log(`Fields updated. Attempting to save.`);
const saveButtons = document.querySelectorAll(".saveButton");
saveButtons.forEach((button) => {
debug.log(`Clicking save`);
debug.log(`Clicking save`, button);
button.removeAttribute("disabled");
(button as HTMLInputElement).click();
});
Expand All @@ -48,30 +45,27 @@ chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {

function setRobinhoodAmount(label, amount) {
debug.log(`Attempting to set ${label} to ${amount}`);
// Find the property that contains the label
const otherProperties = document.querySelectorAll(".OtherPropertyView");
let property;
otherProperties.forEach((thisProperty) => {
if ((thisProperty as HTMLElement).innerText.includes(label)) {
property = thisProperty;
return;
}
});

if (property) {
property.querySelector("span").click();

const robinhoodInputs = property.querySelectorAll("input");
waitForElement(".OtherPropertyView", `Robinhood ${label}`, (foundElement) => {
debug.log(`Expanding property ${label}`, foundElement);
foundElement.querySelector("span").click();

if (robinhoodInputs[0].value === `Robinhood ${label}`) {
debug.log(`Found ${label} input, setting amount`);
robinhoodInputs[1].value = amount;
syncedLabels.push(label);
callback();
}
} else {
setTimeout(() => setRobinhoodAmount(label, amount), 50);
}
waitForElement(
"input",
null,
() => {
const inputs = foundElement.querySelectorAll("input");
inputs.forEach((foundInput) => {
if (foundInput.getAttribute("name") === "value") {
debug.log(`Found ${label} input, setting amount`, foundInput);
foundInput.value = amount;
syncedLabels.push(label);
callback();
}
});
},
foundElement
);
});
}

if (request.uninvested_cash) {
Expand Down
Loading

0 comments on commit 6366b3c

Please sign in to comment.