diff --git a/app/components/client/devprogram-scripts.js b/app/components/client/devprogram-scripts.js
new file mode 100644
index 0000000..e58bdc7
--- /dev/null
+++ b/app/components/client/devprogram-scripts.js
@@ -0,0 +1,11 @@
+"use strict"; /* global document, send */
+
+
+
+document.getElementById("get-started").addEventListener("click", event => {
+ event.preventDefault();
+
+ send({
+ message: "auth me with github"
+ });
+});
diff --git a/app/components/client/playground-scripts.js b/app/components/client/playground-scripts.js
index 6173481..8b82406 100644
--- a/app/components/client/playground-scripts.js
+++ b/app/components/client/playground-scripts.js
@@ -111,7 +111,8 @@ function debounce(func, wait, immediate) {
const later = () => {
timeout = null;
- if (!immediate) func.apply(context, args);
+ if (!immediate)
+ func.apply(context, args);
};
const callNow = immediate && !timeout;
@@ -119,7 +120,8 @@ function debounce(func, wait, immediate) {
clearTimeout(timeout);
timeout = setTimeout(later, wait);
- if (callNow) func.apply(context, args);
+ if (callNow)
+ func.apply(context, args);
};
}
@@ -139,7 +141,8 @@ function initializePlayground() {
}
function fetchMetadata(exampleNumber, data) {
- if (!exampleNumber) return;
+ if (!exampleNumber)
+ return;
switch(exampleNumber) {
case 1:
diff --git a/app/dist/scripts/app.js b/app/dist/scripts/app.js
index 3528f98..3dc9a18 100755
--- a/app/dist/scripts/app.js
+++ b/app/dist/scripts/app.js
@@ -26,6 +26,9 @@ if (
// Smooth scroll
document.querySelectorAll("a[href^='#']").forEach(anchor => {
+ if (anchor.classList.contains("no-smooth")) // Ignore smooth scroll functionality
+ return;
+
anchor.addEventListener("click", event => {
event.preventDefault();
diff --git a/app/dist/scripts/plugins/jets.js b/app/dist/scripts/plugins/jets.js
index 0b1a750..23eca43 100644
--- a/app/dist/scripts/plugins/jets.js
+++ b/app/dist/scripts/plugins/jets.js
@@ -224,7 +224,7 @@
;(function(doc, proto) {
try {
doc.querySelector(":scope body");
- } catch (err) {
+ } catch(err) {
["querySelector", "querySelectorAll"].forEach(method => {
const nativ = proto[method];
diff --git a/app/dist/scripts/sockets.js b/app/dist/scripts/sockets.js
index 409bca8..1b7d302 100644
--- a/app/dist/scripts/sockets.js
+++ b/app/dist/scripts/sockets.js
@@ -12,22 +12,22 @@ document.addEventListener("DOMContentLoaded", () => {
let ws = null;
function checkWebSocketConnection() {
- if (!ws || ws.readyState === 3) initializeWebSocketConnection();
+ if (!ws || ws.readyState === 3)
+ initializeWebSocketConnection();
}
function initializeWebSocketConnection() {
ws = new WebSocket(location.origin.replace(/^http/, "ws"));
- ws.onopen = () => {
- console.log("WebSocket connection established"); // eslint-disable-line
- };
+ ws.onopen = () => console.log("WebSocket connection established"); // eslint-disable-line
ws.onmessage = socket => {
const data = JSON.parse(socket.data);
switch(true) {
case data.message === "show result":
- if (!data.example) return;
+ if (!data.example)
+ return;
document.querySelector(data.selector).innerHTML = data.html;
@@ -60,8 +60,8 @@ function initializeWebSocketConnection() {
}
if (data.example === 2) {
- detectLanguageAndUpdate(); // eslint-disable-line
- initCanvas(); // eslint-disable-line
+ detectLanguageAndUpdate(); // eslint-disable-line no-undef
+ initCanvas(); // eslint-disable-line no-undef
setTimeout(() => {
document.querySelector(".playground-content__meme__canvas__thumbnail").click();
@@ -94,25 +94,23 @@ function initializeWebSocketConnection() {
break;
default:
- console.log(data); // eslint-disable-line
+ console.log(data); // eslint-disable-line no-console
break;
}
};
- ws.onclose = () => {
- console.log("WebSocket connection lost"); // eslint-disable-line
- checkWebSocketConnection(); // reconnect now
- };
+ ws.onclose = () => checkWebSocketConnection(); // reconnect now
}
-function send(msg) { // eslint-disable-line
- socketReady(ws, () => ws.send(msg));
+function send(msg) { // eslint-disable-line no-unused-vars
+ socketReady(ws, () => ws.send(JSON.stringify(msg)));
}
function socketReady(socket, callback) {
setTimeout(() => {
if (socket && socket.readyState === 1) {
- if (callback !== undefined) callback();
+ if (callback !== undefined)
+ callback();
return;
}
diff --git a/app/helpers/fetch-metadata.js b/app/helpers/fetch-metadata.js
index 0ca2f34..0a885eb 100644
--- a/app/helpers/fetch-metadata.js
+++ b/app/helpers/fetch-metadata.js
@@ -11,16 +11,16 @@ import stringifyObject from "stringify-object";
// U T I L S
-import randomString from "./random-string";
import messageSlack from "./slack";
-
import publishMeme from "./publish-meme";
+import randomString from "./random-string";
+import { send } from "@socket";
import uploadImage from "./upload-image";
const allowedQueryMethods = [
+ "claim_tip",
"publish",
- "resolve",
- "claim_tip"
+ "resolve"
];
const approvedContentIdsForTipping = [
@@ -60,11 +60,11 @@ export default async(data, socket) => {
const resolveMethod = data.method;
if (allowedQueryMethods.indexOf(resolveMethod) < 0) {
- return socket.send(JSON.stringify({
+ return send(socket, {
details: "Unallowed resolve method for tutorial",
message: "notification",
type: "error"
- }));
+ });
}
body.authorization = process.env.LBRY_DAEMON_ACCESS_TOKEN;
@@ -77,7 +77,7 @@ export default async(data, socket) => {
// E X A M P L E
case resolveMethod === "claim_tip":
if (!approvedContentIdsForTipping.includes(claimAddress)) {
- return socket.send(JSON.stringify({
+ return send(socket, {
example: data.example,
html: raw(`
Response
@@ -85,7 +85,7 @@ export default async(data, socket) => {
`),
message: "show result",
selector: `#example${data.example}-result`
- }));
+ });
}
apiRequestMethod = "POST";
@@ -140,7 +140,7 @@ export default async(data, socket) => {
"json"
);
- return socket.send(JSON.stringify({
+ return send(socket, {
example: data.example,
html: raw(`
Response
@@ -149,15 +149,15 @@ export default async(data, socket) => {
`),
message: "show result",
selector: `#example${data.example}-result`
- }));
+ });
}
catch(memePublishError) {
- socket.send(JSON.stringify({
+ send(socket, {
details: "Meme publish failed",
message: "notification",
type: "error"
- }));
+ });
if (process.env.NODE_ENV !== "development") {
messageSlack({
@@ -172,11 +172,11 @@ export default async(data, socket) => {
}
catch(imageUploadError) {
- socket.send(JSON.stringify({
+ send(socket, {
details: "Image upload failed",
message: "notification",
type: "error"
- }));
+ });
if (process.env.NODE_ENV !== "development") {
messageSlack({
@@ -241,7 +241,7 @@ export default async(data, socket) => {
"json"
);
- return socket.send(JSON.stringify({
+ return send(socket, {
example: data.example,
html: raw(`
Response
@@ -250,7 +250,7 @@ export default async(data, socket) => {
`),
message: "show result",
selector: `#example${data.example}-result`
- }));
+ });
}
return response.body.result[Object.keys(response.body.result)[0]].claim;
diff --git a/app/helpers/github.js b/app/helpers/github.js
index 2beaf95..7e6ec59 100644
--- a/app/helpers/github.js
+++ b/app/helpers/github.js
@@ -336,6 +336,15 @@ function generateUrl(type, event) {
}
}
+function getGitHubUserToken() {
+ // const clientWithAuth = new Octokit({
+ // auth: `token ${GITHUB_APP_TOKEN}`
+ // });
+
+ // console.log(clientWithAuth);
+ // console.log("—————");
+}
+
function updateGithubFeed() {
octokit.activity.listPublicEventsForOrg({
org: "lbryio",
@@ -377,5 +386,6 @@ export {
generateEvent,
generateGitHubFeed,
generateUrl,
+ getGitHubUserToken,
updateGithubFeed
};
diff --git a/app/helpers/publish-meme.js b/app/helpers/publish-meme.js
index 358273d..57ab4c0 100644
--- a/app/helpers/publish-meme.js
+++ b/app/helpers/publish-meme.js
@@ -28,7 +28,7 @@ export default async(publishMetadata) => {
try {
const response = await got.put(queryUrl, options);
return response.body; // eslint-disable-line padding-line-between-statements
- } catch (error) {
+ } catch(error) {
return error;
}
};
diff --git a/app/helpers/upload-image.js b/app/helpers/upload-image.js
index 5239fe1..ccebd3a 100644
--- a/app/helpers/upload-image.js
+++ b/app/helpers/upload-image.js
@@ -28,7 +28,7 @@ export default async(imageSource) => {
try {
const response = await got.post(queryUrl, options);
return response.body; // eslint-disable-line padding-line-between-statements
- } catch (error) {
+ } catch(error) {
return error;
}
};
diff --git a/app/sockets.js b/app/sockets.js
index 6654f2a..f34c855 100644
--- a/app/sockets.js
+++ b/app/sockets.js
@@ -18,7 +18,10 @@ import messageSlack from "@helper/slack";
// P R O G R A M
export default (socket, action) => {
- if (typeof socket !== "object" && typeof action !== "object") return;
+ if (typeof socket !== "object" && typeof action !== "object")
+ return;
+
+ action = JSON.parse(action);
switch(true) {
case action.message === "fetch metadata":
@@ -27,31 +30,31 @@ export default (socket, action) => {
case action.message === "landed on homepage":
generateGitHubFeed(result => {
- socket.send(JSON.stringify({
+ send(socket, {
html: result,
message: "updated html",
selector: "#github-feed"
- }));
+ });
});
break;
case action.message === "landed on playground":
generateContent(1, result => {
- socket.send(JSON.stringify({
+ send(socket, {
html: result,
message: "updated html",
selector: "#playground-loader"
- }));
+ });
});
break;
case action.message === "request for playground, example 1":
generateContent(1, result => {
- socket.send(JSON.stringify({
+ send(socket, {
html: result,
message: "updated html",
selector: "#playground-loader"
- }));
+ });
});
break;
@@ -61,11 +64,11 @@ export default (socket, action) => {
case action.message === "request for playground, example 3":
generateContent(3, result => {
- socket.send(JSON.stringify({
+ send(socket, {
html: result,
message: "updated html",
selector: "#playground-loader"
- }));
+ });
});
break;
@@ -85,15 +88,19 @@ export default (socket, action) => {
function generateContent(exampleNumber, displayTrendingContent) {
if (exampleNumber === 1) {
return getTrendingContent().then(response => {
- if (!response || !response.success || response.success !== true || !response.data) return "";
+ if (!response || !response.success || response.success !== true || !response.data)
+ return "";
const rawContentCollection = [];
const renderedContentCollection = [];
const trendingContentData = response.data;
- for (const data of trendingContentData) {
- rawContentCollection.push(fetchMetadata({ claim: data.url, method: "resolve", example: exampleNumber }));
- }
+ for (const data of trendingContentData)
+ rawContentCollection.push(fetchMetadata({
+ claim: data.url,
+ example: exampleNumber,
+ method: "resolve"
+ }));
Promise.all(rawContentCollection).then(collection => {
for (const part of collection) {
@@ -116,7 +123,7 @@ function generateContent(exampleNumber, displayTrendingContent) {
`);
- } catch (err) {
+ } catch(err) {
return; // TODO: Return nice error message
}
}
@@ -315,19 +322,19 @@ function generateMemeCreator(socket) {
`;
- return socket.send(JSON.stringify({
+ return send(socket, {
example: 2,
html: memeCreator,
message: "updated html",
selector: "#playground-loader"
- }));
+ });
}
async function getTrendingContent() {
try {
const response = await got("https://api.lbry.io/file/list_trending");
return JSON.parse(response.body); // eslint-disable-line padding-line-between-statements
- } catch (error) {
+ } catch(error) {
return error;
}
}
@@ -344,22 +351,24 @@ function makeImageSourceSecure(url) {
async function newsletterSubscribe(data, socket) {
const email = data.email;
- if (!validateEmail(email)) return socket.send(JSON.stringify({
- class: "error",
- html: "Your email address is invalid",
- message: "updated html",
- selector: "#emailMessage"
- }));
+ if (!validateEmail(email)) {
+ send(socket, {
+ class: "error",
+ html: "Your email address is invalid",
+ message: "updated html",
+ selector: "#emailMessage"
+ });
+ }
try {
await got.post(`https://api.lbry.io/list/subscribe?email=${encodeURIComponent(email)}&tag=developer`);
- return socket.send(JSON.stringify({
+ return send(socket, {
html: "Thank you! Please confirm subscription in your inbox.",
message: "updated html",
selector: "#emailMessage"
- }));
- } catch (error) {
+ });
+ } catch(error) {
const response = JSON.parse(error.body);
if (!response.success) {
@@ -369,12 +378,12 @@ async function newsletterSubscribe(data, socket) {
`> _Cause: ${email} interacted with the form_\n`
);
- return socket.send(JSON.stringify({
+ return send(socket, {
class: "error",
html: response.error,
message: "updated html",
selector: "#emailMessage"
- }));
+ });
}
messageSlack(
@@ -383,15 +392,19 @@ async function newsletterSubscribe(data, socket) {
`> _Cause: ${email} interacted with the form_\n`
);
- return socket.send(JSON.stringify({
+ return send(socket, {
class: "error",
html: "Something is terribly wrong",
message: "updated html",
selector: "#emailMessage"
- }));
+ });
}
}
+export function send(transport, data) {
+ return transport.send(JSON.stringify(data));
+}
+
function validateEmail(email) {
const emailRegex = /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@(([^<>()[\].,;:\s@"]+\.)+[^<>()[\\.,;:\s@"]{2,})$/i;
return emailRegex.test(String(email)); // eslint-disable-line padding-line-between-statements
diff --git a/app/views/dev.js b/app/views/dev.js
index ce0c3cf..d41a15f 100644
--- a/app/views/dev.js
+++ b/app/views/dev.js
@@ -15,22 +15,27 @@ export default () => html`
-
+
-
...
+
When developing for LBRY, having LBC (LBRY credits) makes it easier to develop applications and interface with our APIs.
+
To qualify for free LBC you must:
+
+
+ - have a GitHub account, and
+ - have a public PR (pull request) in the past year
+
+
+
If this sounds like you, get started here!
+
+
+ If you have not downloaded our SDK yet, you should and generate a wallet address so we know where to send your LBC!
+
`;
-
-// TODO:
-// Provide flow where user logs in with GitHub:
-// - get access token
-// - show field for user to enter their wallet address
-// - send access token and wallet address to API
-// - parse response
diff --git a/app/views/home.js b/app/views/home.js
index 62899e4..fb8af66 100644
--- a/app/views/home.js
+++ b/app/views/home.js
@@ -96,9 +96,7 @@ export default () => html`
";
+ pageScript = renderClientScript("glossary-scripts");
break;
case partialPath === "overview":
- pageScript =
- "";
+ pageScript = renderClientScript("ecosystem-scripts");
break;
case partialPath === "playground":
- pageScript =
- "";
+ pageScript = renderClientScript("playground-scripts");
break;
default:
@@ -93,3 +87,15 @@ export default (state, emit) => { // eslint-disable-line
`;
};
+
+
+
+// H E L P E R
+
+function renderClientScript(clientScriptFileName) {
+ return `
+
+ `;
+}
diff --git a/documents/developer-program.md b/documents/developer-program.md
new file mode 100644
index 0000000..a19b1e8
--- /dev/null
+++ b/documents/developer-program.md
@@ -0,0 +1,14 @@
+---
+title: Developer Program
+---
+
+When developing for LBRY, having LBC (LBRY credits) makes it easier to develop applications and interface with our APIs.
+
+To qualify for free LBC you must:
+
+- have a GitHub account, and
+- have a public PR (pull request) in the past year
+
+If this sounds like you, get started here!
+
+If you have not downloaded our SDK yet, [you should]() and generate a wallet address so we know where to send your LBC!
diff --git a/package.json b/package.json
index dd6e952..2c5c00b 100755
--- a/package.json
+++ b/package.json
@@ -5,6 +5,7 @@
"@helper": "app/helpers",
"@module": "app/modules",
"@root": ".",
+ "@socket": "app/sockets.js",
"@view": "app/views"
},
"author": "LBRY Team",