Redirect to iOS app via overlay that opens universal link

This commit is contained in:
Ivan Grachev 2022-08-28 20:28:44 +03:00
parent bd2c72de59
commit 5e4b32adde
4 changed files with 99 additions and 3 deletions

View File

@ -15,6 +15,43 @@ function injectScript() {
scriptTag.textContent = request.responseText;
container.insertBefore(scriptTag, container.children[0]);
container.removeChild(scriptTag);
const styles = `
#tokenary-button {
position: absolute;
top: 50%;
left: 50%;
font-size: 50px;
font-weight: bold;
color: white;
background-color: #0093FF;
transform: translate(-50%,-50%);
height: 200pt;
border: none;
border-radius: 20pt;
-webkit-touch-callout: none;
-webkit-user-select: none;
user-select: none;
}
#tokenary-overlay {
position: fixed;
display: none;
width: 100%;
height: 100%;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0,0,0,0.5);
z-index: 2147483647;
cursor: pointer;
}
`;
const styleSheet = document.createElement("style");
styleSheet.innerText = styles;
container.insertBefore(styleSheet, container.children[0]);
} catch (error) {
console.error('Tokenary: Provider injection failed.', error);
}

File diff suppressed because one or more lines are too long

View File

@ -40,7 +40,11 @@ window.addEventListener("message", function(event) {
const response = event.data.response;
const id = event.data.id;
if ("latestConfigurations" in response) {
if ("overlayLink" in response) {
window.tokenary.overlayLink = response.overlayLink;
// TODO: use queue or map instead;
window.tokenary.showOverlay();
} else if ("latestConfigurations" in response) {
const name = "didLoadLatestConfiguration";
var remainingProviders = new Set(["ethereum", "solana", "near"]);
@ -101,3 +105,45 @@ function deliverResponseToSpecificProvider(id, response, provider) {
window.near.processTokenaryResponse(id, response);
}
}
// MARK: - Tokenary overlay for iOS
window.tokenary.overlayTapped = () => {
window.tokenary.hideOverlay();
};
window.tokenary.hideOverlay = () => {
document.getElementById("tokenary-overlay").style.display = "none";
// TODO: hide animated when button is tapped
};
window.tokenary.showOverlay = () => {
// TODO: show with animation
const overlay = document.getElementById("tokenary-overlay");
if (overlay) {
overlay.style.display = "block";
} else {
window.tokenary.createOverlay();
}
};
window.tokenary.createOverlay = () => {
const overlay = document.createElement("div");
overlay.setAttribute("id", "tokenary-overlay");
overlay.setAttribute("ontouchstart", `
event.stopPropagation();
if (event.target === event.currentTarget) {
window.tokenary.overlayTapped();
return false;
}
`);
overlay.innerHTML = `<button id="tokenary-button" onclick="window.tokenary.overlayButtonTapped();">Proceed in Tokenary</button>`;
document.body.appendChild(overlay);
overlay.style.display = "block";
};
window.tokenary.overlayButtonTapped = () => {
window.location.href = window.tokenary.overlayLink;
window.tokenary.hideOverlay();
};

View File

@ -17,6 +17,19 @@ function platformSpecificProcessMessage(message) {
if (message.provider == "ethereum" && (message.name == "switchEthereumChain" || message.name == "addEthereumChain")) {
return;
} else {
window.location.href = "tokenary://" + encodeURIComponent(JSON.stringify(message));
// TODO: вот тут, где раньше переходили по диплинку, теперь будем показывать оверлей
// передавать в inpage данные для оверлея:
// - universal link, который будем открывать
// - текст для кнопки
// - данные, достаточные для того, чтобы ответить на запрос ошибкой
// + если он inpage будет отвечать на запрос ошибкой, то мне нужно будет как-то подчищать тот запрос, который ушел extension handler-у
// или на iOS сделать так, чтобы запрос extension handler-у не уходил до того момента, пока он не нажал на overlay кнопку
const link = "https://tokenary.io/extension?query=" + encodeURIComponent(JSON.stringify(message));
const response = {overlayLink: link};
window.postMessage({direction: "from-content-script", response: response, id: message.id}, "*");
}
}