Skip to content

Commit

Permalink
Clean up front end code a bit
Browse files Browse the repository at this point in the history
  • Loading branch information
joelpurra committed Nov 24, 2017
1 parent 3c03714 commit d66d3a9
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 200 deletions.
173 changes: 67 additions & 106 deletions src/frontend/shared-frontend.js
Expand Up @@ -259,36 +259,33 @@ const addOptionsLinkClickHandlers = () => promiseTry(
);

const addVersionCssClasses = () => promiseTry(
() => {
return Promise.resolve()
.then(() => getBackgroundPage())
.then((background) => Promise.all([
background.isPremiumVersion(),
background.getSystemType(),
background.getOsType(),
]))
.then(([isPremiumVersion, systemType, osType]) => {
if (isPremiumVersion) {
document.body.classList.add("talkie-premium");
} else {
document.body.classList.add("talkie-free");
}
() => getBackgroundPage()
.then((background) => Promise.all([
background.isPremiumVersion(),
background.getSystemType(),
background.getOsType(),
]))
.then(([isPremiumVersion, systemType, osType]) => {
if (isPremiumVersion) {
document.body.classList.add("talkie-premium");
} else {
document.body.classList.add("talkie-free");
}

if (systemType === "chrome") {
document.body.classList.add("talkie-chrome");
} else {
document.body.classList.add("talkie-webextension");
}
if (systemType === "chrome") {
document.body.classList.add("talkie-chrome");
} else {
document.body.classList.add("talkie-webextension");
}

if (osType === "mac") {
document.body.classList.add("talkie-mac");
} else {
document.body.classList.add("talkie-non-mac");
}
if (osType === "mac") {
document.body.classList.add("talkie-mac");
} else {
document.body.classList.add("talkie-non-mac");
}

return undefined;
});
}
return undefined;
})
);

const loadVersion = () => promiseTry(
Expand Down Expand Up @@ -322,18 +319,12 @@ const reflow = () => promiseTry(

export const eventToPromise = (eventHandler, event) => promiseTry(
() => {
try {
dualLogger.dualLogDebug("Start", "eventToPromise", event.type, event);

Promise.resolve()
.then(() => eventHandler(event))
.then((result) => dualLogger.dualLogDebug("Done", "eventToPromise", event.type, event, result))
.catch((error) => dualLogger.dualLogError("eventToPromise", event.type, event, error));
} catch (error) {
dualLogger.dualLogError("eventToPromise", event.type, event, error);
dualLogger.dualLogDebug("Start", "eventToPromise", event && event.type, event);

throw error;
}
return Promise.resolve()
.then(() => eventHandler(event))
.then((result) => dualLogger.dualLogDebug("Done", "eventToPromise", event && event.type, event, result))
.catch((error) => dualLogger.dualLogError("eventToPromise", event && event.type, event, error));
}
);

Expand All @@ -347,51 +338,45 @@ const focusFirstLink = () => promiseTry(

const setTalkieStatusSpeaking = (speaking) => promiseTry(
() => {
return Promise.resolve()
.then(() => getBackgroundPage())
.then(() => {
if (speaking) {
document.body.classList.add("talkie-speaking");
} else {
document.body.classList.remove("talkie-speaking");
}
if (speaking) {
document.body.classList.add("talkie-speaking");
} else {
document.body.classList.remove("talkie-speaking");
}

return undefined;
});
return undefined;
}
);
const registerBroadcastListeners = (killSwitches) => promiseTry(
() => {
return getBackgroundPage()
.then((background) => {
return Promise.all([
background.broadcaster().registerListeningAction(knownEvents.beforeSpeaking, () => setTalkieStatusSpeaking(true))
.then((killSwitch) => killSwitches.push(killSwitch)),
background.broadcaster().registerListeningAction(knownEvents.afterSpeaking, () => setTalkieStatusSpeaking(false))
.then((killSwitch) => killSwitches.push(killSwitch)),
]);
});
}
() => getBackgroundPage()
.then((background) => {
return Promise.all([
background.broadcaster().registerListeningAction(knownEvents.beforeSpeaking, () => setTalkieStatusSpeaking(true))
.then((killSwitch) => killSwitches.push(killSwitch)),
background.broadcaster().registerListeningAction(knownEvents.beforeSpeakingPart, () => setTalkieStatusSpeaking(true))
.then((killSwitch) => killSwitches.push(killSwitch)),
background.broadcaster().registerListeningAction(knownEvents.afterSpeaking, () => setTalkieStatusSpeaking(false))
.then((killSwitch) => killSwitches.push(killSwitch)),
]);
})
);

export const startFrontend = (killSwitches) => promiseTry(
() => {
return Promise.resolve()
.then(() => Promise.all([
removeLoadingCssClass(),
addVersionCssClasses(),
configureWindowContents(),
translateWindowContents(),
]))
.then(() => Promise.all([
registerBroadcastListeners(killSwitches),
loadVersion(),
addLinkClickHandlers(),
addOptionsLinkClickHandlers(),
focusFirstLink(),
reflow(),
]));
}
() => Promise.resolve()
.then(() => Promise.all([
removeLoadingCssClass(),
addVersionCssClasses(),
configureWindowContents(),
translateWindowContents(),
]))
.then(() => Promise.all([
registerBroadcastListeners(killSwitches),
loadVersion(),
addLinkClickHandlers(),
addOptionsLinkClickHandlers(),
focusFirstLink(),
reflow(),
]))
);

export const stopFrontend = () => promiseTry(
Expand All @@ -401,40 +386,16 @@ export const stopFrontend = () => promiseTry(
);

export const startReactFrontend = () => promiseTry(
() => {
return Promise.resolve()
.then(() => Promise.all([
removeLoadingCssClass(),
addVersionCssClasses(),
]))
.then(() => reflow());
}
() => Promise.resolve()
.then(() => Promise.all([
removeLoadingCssClass(),
addVersionCssClasses(),
]))
.then(() => reflow())
);

export const stopReactFrontend = () => promiseTry(
() => {
// TODO: unregister listeners.
}
);

// https://stackoverflow.com/questions/1219860/html-encoding-lost-when-attribute-read-from-input-field
export const htmlEscape = (str) => {
return str
.replace(/&/g, "&")
.replace(/"/g, """)
.replace(/'/g, "'")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/\//g, "&#x2F;");
};

// https://stackoverflow.com/questions/1219860/html-encoding-lost-when-attribute-read-from-input-field
export const htmlUnescape = (str) => {
return str
.replace(/&quot;/g, "\"")
.replace(/&#39;/g, "'")
.replace(/&lt;/g, "<")
.replace(/&gt;/g, ">")
.replace(/&amp;/g, "&")
.replace(/&#x2F;/g, "/");
};
37 changes: 4 additions & 33 deletions src/options/options.js
Expand Up @@ -34,43 +34,14 @@ import {

import loadRoot from "./load-root.jsx";

import DualLogger from "../frontend/dual-log";

const dualLogger = new DualLogger("options.js");

const start = () => promiseTry(
() => {
dualLogger.dualLogDebug("Start", "start");

return Promise.resolve()
.then(() => startReactFrontend())
.then(() => loadRoot())
.then(() => {
dualLogger.dualLogDebug("Done", "start");

return undefined;
})
.catch((error) => {
dualLogger.dualLogError("Start", error);
});
}
() => Promise.resolve()
.then(() => startReactFrontend())
.then(() => loadRoot())
);

const stop = () => promiseTry(
() => {
dualLogger.dualLogDebug("Start", "stop");

return Promise.resolve()
.then(() => stopReactFrontend())
.then(() => {
dualLogger.dualLogDebug("Done", "stop");

return undefined;
})
.catch((error) => {
dualLogger.dualLogError("Stop", "Stop", error);
});
}
() => stopReactFrontend()
);

registerUnhandledRejectionHandler();
Expand Down
63 changes: 34 additions & 29 deletions src/popup/popup.js
Expand Up @@ -44,26 +44,10 @@ import DualLogger from "../frontend/dual-log";

const dualLogger = new DualLogger("popup.js");

const shouldPassClick = () => {
const containsBlockerString = document.location
&& typeof document.location.search === "string"
&& document.location.search.length > 0
&& document.location.search.includes("passclick=false");

return !containsBlockerString;
};

const passClickToBackground = () => promiseTry(
() => {
dualLogger.dualLogDebug("Start", "passClickToBackground");

// NOTE: provide a way to link to the popup without triggering the "click".
if (!shouldPassClick()) {
dualLogger.dualLogDebug("Skipped", "passClickToBackground");

return;
}

return getBackgroundPage()
.then((background) => background.iconClick())
.then(() => {
Expand All @@ -79,6 +63,28 @@ const passClickToBackground = () => promiseTry(
}
);

const shouldPassClickOnLoad = () => {
const containsBlockerString = document.location
&& typeof document.location.search === "string"
&& document.location.search.length > 0
&& document.location.search.includes("passclick=false");

return !containsBlockerString;
};

const passClickToBackgroundOnLoad = () => promiseTry(
() => {
// NOTE: provide a way to link to the popup without triggering the "click".
if (!shouldPassClickOnLoad()) {
dualLogger.dualLogDebug("Skipped", "passClickToBackgroundOnLoad");

return;
}

return passClickToBackground();
}
);

const registerStartStopButtonClickHandlers = () => promiseTry(
() => {
const startStopButtons = Array.from(document.querySelectorAll(":scope .start-stop-button"));
Expand Down Expand Up @@ -119,7 +125,11 @@ const executeKillSwitches = () => {
try {
killSwitch();
} catch (error) {
dualLogger.dualLogError("executeKillSwitches", error);
try {
dualLogger.dualLogError("executeKillSwitches", error);
} catch (ignored) {
// NOTE: ignoring error logging errors.
}
}
});
};
Expand All @@ -133,21 +143,16 @@ const registerBroadcastListeners = () => promiseTry(
);

const start = () => promiseTry(
() => {
return Promise.resolve()
.then(() => startFrontend(killSwitches))
.then(() => registerBroadcastListeners())
.then(() => registerStartStopButtonClickHandlers())
.then(() => passClickToBackground());
}
() => Promise.resolve()
.then(() => startFrontend(killSwitches))
.then(() => registerBroadcastListeners())
.then(() => registerStartStopButtonClickHandlers())
.then(() => passClickToBackgroundOnLoad())
);

const stop = () => promiseTry(
() => {
// NOTE: probably won't be correctly executed as unload doesn't allow asynchronous calls.
return Promise.resolve()
.then(() => stopFrontend());
}
// NOTE: probably won't be correctly executed as unload doesn't allow asynchronous calls.
() => stopFrontend()
);

registerUnhandledRejectionHandler();
Expand Down

0 comments on commit d66d3a9

Please sign in to comment.