From 26d9f05a2d592e6a4b1c9a6dc634a39e96438f6d Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Fri, 11 Mar 2022 16:59:47 -0700 Subject: [PATCH 01/16] feat(connectors): add raspiblitz --- src/app/router/connectorRoutes.tsx | 2 + .../screens/Onboard/ChooseConnector/index.tsx | 11 +- .../Onboard/ConnectRaspiBlitz/index.tsx | 214 ++++++++++++++++++ static/assets/icons/raspiblitz.png | Bin 0 -> 9922 bytes 4 files changed, 225 insertions(+), 2 deletions(-) create mode 100644 src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx create mode 100644 static/assets/icons/raspiblitz.png diff --git a/src/app/router/connectorRoutes.tsx b/src/app/router/connectorRoutes.tsx index 2a207deee2..df80992bdc 100644 --- a/src/app/router/connectorRoutes.tsx +++ b/src/app/router/connectorRoutes.tsx @@ -3,6 +3,7 @@ import ConnectLndHub from "../screens/Onboard/ConnectLndHub"; import ConnectLnbits from "../screens/Onboard/ConnectLnbits"; import ConnectEclair from "../screens/Onboard/ConnectEclair"; import NewWallet from "../screens/Onboard/NewWallet"; +import ConnectRaspiBlitz from "../screens/Onboard/ConnectRaspiBlitz"; export default [ { path: "lnd", element: }, @@ -10,4 +11,5 @@ export default [ { path: "lnbits", element: }, { path: "eclair", element: }, { path: "create-wallet", element: }, + { path: "raspiblitz", element: }, ]; diff --git a/src/app/screens/Onboard/ChooseConnector/index.tsx b/src/app/screens/Onboard/ChooseConnector/index.tsx index 118481c2a8..7396f481d1 100644 --- a/src/app/screens/Onboard/ChooseConnector/index.tsx +++ b/src/app/screens/Onboard/ChooseConnector/index.tsx @@ -5,6 +5,7 @@ import lndhub from "/static/assets/icons/lndhub.png"; import lnd from "/static/assets/icons/lnd.png"; import eclair from "/static/assets/icons/eclair.jpg"; import alby from "/static/assets/icons/alby.png"; +import raspiblitz from "/static/assets/icons/raspiblitz.png"; type Props = { title: string; @@ -43,10 +44,16 @@ export default function ChooseConnector({ title, description }: Props) { description: "We create and manage a lightning wallet for you", logo: alby, }, + { + to: "raspiblitz", + title: "RaspiBlitz", + description: "Connect to your RaspiBlitz", + logo: raspiblitz, + }, ]; return ( -
+

{title}

@@ -56,7 +63,7 @@ export default function ChooseConnector({ title, description }: Props) {

)}
-
+
{connectors.map(({ to, title, description, logo }) => ( (null); + const [loading, setLoading] = useState(false); + + function handleChange(event: React.ChangeEvent) { + setFormData({ + ...formData, + [event.target.name]: event.target.value.trim(), + }); + } + + function getConnectorType() { + if (formData.url.match(/\.onion/i)) { + return "nativelnd"; + } + // default to LND + return "lnd"; + } + + async function handleSubmit(event: React.FormEvent) { + event.preventDefault(); + setLoading(true); + const { url, macaroon } = formData; + const account = { + name: "RaspiBlitz", + config: { + macaroon, + url, + }, + connector: getConnectorType(), + }; + + try { + let validation; + // TODO: for native connectors we currently skip the validation because it is too slow (booting up Tor etc.) + if (account.connector === "nativelnd") { + validation = { valid: true, error: "" }; + } else { + validation = await utils.call("validateAccount", account); + } + + if (validation.valid) { + const addResult = await utils.call("addAccount", account); + if (addResult.accountId) { + await utils.call("selectAccount", { + id: addResult.accountId, + }); + navigate("/test-connection"); + } + } else { + alert(` + Connection failed. Are your RaspiBlitz credentials correct? \n\n(${validation.error})`); + } + } catch (e) { + console.error(e); + let message = + "Connection failed. Are your RaspiBlitz credentials correct?"; + if (e instanceof Error) { + message += `\n\n${e.message}`; + } + alert(message); + } + setLoading(false); + } + + function dropHandler(event: React.DragEvent) { + event.preventDefault(); + if ( + event.dataTransfer.items && + event.dataTransfer.items[0].kind === "file" + ) { + const file = event.dataTransfer.items[0].getAsFile(); + if (file) { + const extension = file.name.split(".").pop(); + if (extension === "macaroon") readFile(file); + } + } + if (isDragging) setDragging(false); + } + + function readFile(file: File) { + const reader = new FileReader(); + reader.onload = function (evt) { + if (evt.target?.result) { + const macaroon = utils.bytesToHexString( + new Uint8Array(evt.target.result as ArrayBuffer) + ); + if (macaroon) { + setFormData({ + ...formData, + macaroon, + }); + } + } + }; + reader.readAsArrayBuffer(file); + } + + function dragOverHandler(event: React.DragEvent) { + event.preventDefault(); + if (!isDragging) setDragging(true); + } + + function dragLeaveHandler(event: React.DragEvent) { + if (isDragging) setDragging(false); + } + + return ( +
+
+
+

+ Connect to your RaspiBlitz node +

+

+ You need your node URL and a macaroon with read and send permissions + (e.g. admin.macaroon) +

+
+
+ +
+ {formData.url.match(/\.onion/i) && } +
+
+ +
+

OR

+
{ + if (hiddenFileInput?.current) hiddenFileInput.current.click(); + }} + > + +

+ Drag and drop your macaroon here or{" "} + browse +

+ { + if (event.target.files) { + const file = event.target.files[0]; + readFile(file); + } + }} + type="file" + accept=".macaroon" + hidden + /> +
+
+
+
+
+
+ sat +
+
+
+
+
+
+ ); +} diff --git a/static/assets/icons/raspiblitz.png b/static/assets/icons/raspiblitz.png new file mode 100644 index 0000000000000000000000000000000000000000..02d44e57b7d16318196164368baafbddbb80e1bf GIT binary patch literal 9922 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 literal 0 HcmV?d00001 From da20da1ac568fc9f44f5bc944a80bc4fa27e15b7 Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Thu, 17 Mar 2022 19:18:35 -0600 Subject: [PATCH 02/16] feat: add instructions --- .../screens/Onboard/ChooseConnector/index.tsx | 4 ++-- .../Onboard/ConnectRaspiBlitz/index.tsx | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/app/screens/Onboard/ChooseConnector/index.tsx b/src/app/screens/Onboard/ChooseConnector/index.tsx index 7396f481d1..07ebb0e9cc 100644 --- a/src/app/screens/Onboard/ChooseConnector/index.tsx +++ b/src/app/screens/Onboard/ChooseConnector/index.tsx @@ -53,7 +53,7 @@ export default function ChooseConnector({ title, description }: Props) { ]; return ( -

+

{title}

@@ -63,7 +63,7 @@ export default function ChooseConnector({ title, description }: Props) {

)}
-
+
{connectors.map(({ to, title, description, logo }) => (

You need your node URL and a macaroon with read and send permissions - (e.g. admin.macaroon) + (e.g. admin.macaroon). +
+
+ SSH into your RaspiBlitz.
+ Run the command sudo cat /mnt/hdd/tor/lndrest8080/hostname. +
+ Copy your .onion address. +
+ Add https:// at the beginning and :800 at the end. +
+ Paste the URL in the input below.

@@ -144,6 +154,13 @@ export default function ConnectRaspiBlitz() {
{formData.url.match(/\.onion/i) && }
+

+ Select CONNECT.
+ Select EXPORT.
+ Select HEX.
+ Copy the adminMacaroon.
+ Paste the macaroon in the input below. +

Date: Fri, 18 Mar 2022 10:45:00 -0600 Subject: [PATCH 03/16] refactor: remove upload macaroon, update port, update textfield --- .../Onboard/ConnectRaspiBlitz/index.tsx | 83 ++----------------- 1 file changed, 5 insertions(+), 78 deletions(-) diff --git a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx index 7f3492d3d7..f41e81ce7f 100644 --- a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx +++ b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx @@ -1,5 +1,4 @@ -import { SendIcon } from "@bitcoin-design/bitcoin-icons-react/filled"; -import { useRef, useState } from "react"; +import { useState } from "react"; import { useNavigate } from "react-router-dom"; import utils from "../../../../common/lib/utils"; import Button from "../../../components/Button"; @@ -14,8 +13,6 @@ const initialFormData = Object.freeze({ export default function ConnectRaspiBlitz() { const navigate = useNavigate(); const [formData, setFormData] = useState(initialFormData); - const [isDragging, setDragging] = useState(false); - const hiddenFileInput = useRef(null); const [loading, setLoading] = useState(false); function handleChange(event: React.ChangeEvent) { @@ -79,48 +76,6 @@ export default function ConnectRaspiBlitz() { setLoading(false); } - function dropHandler(event: React.DragEvent) { - event.preventDefault(); - if ( - event.dataTransfer.items && - event.dataTransfer.items[0].kind === "file" - ) { - const file = event.dataTransfer.items[0].getAsFile(); - if (file) { - const extension = file.name.split(".").pop(); - if (extension === "macaroon") readFile(file); - } - } - if (isDragging) setDragging(false); - } - - function readFile(file: File) { - const reader = new FileReader(); - reader.onload = function (evt) { - if (evt.target?.result) { - const macaroon = utils.bytesToHexString( - new Uint8Array(evt.target.result as ArrayBuffer) - ); - if (macaroon) { - setFormData({ - ...formData, - macaroon, - }); - } - } - }; - reader.readAsArrayBuffer(file); - } - - function dragOverHandler(event: React.DragEvent) { - event.preventDefault(); - if (!isDragging) setDragging(true); - } - - function dragLeaveHandler(event: React.DragEvent) { - if (isDragging) setDragging(false); - } - return (
@@ -138,7 +93,7 @@ export default function ConnectRaspiBlitz() {
Copy your .onion address.
- Add https:// at the beginning and :800 at the end. + Add https:// at the beginning and :8080 at the end.
Paste the URL in the input below.

@@ -147,7 +102,9 @@ export default function ConnectRaspiBlitz() { @@ -170,36 +127,6 @@ export default function ConnectRaspiBlitz() { required />
-

OR

-
{ - if (hiddenFileInput?.current) hiddenFileInput.current.click(); - }} - > - -

- Drag and drop your macaroon here or{" "} - browse -

- { - if (event.target.files) { - const file = event.target.files[0]; - readFile(file); - } - }} - type="file" - accept=".macaroon" - hidden - /> -
From 6128c80cb8c168a6c288f5d9fc87022474e8972a Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Sun, 20 Mar 2022 18:18:23 -0600 Subject: [PATCH 04/16] feat: add https and port for user automatically --- src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx index f41e81ce7f..0308bdba57 100644 --- a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx +++ b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx @@ -18,7 +18,7 @@ export default function ConnectRaspiBlitz() { function handleChange(event: React.ChangeEvent) { setFormData({ ...formData, - [event.target.name]: event.target.value.trim(), + [event.target.name]: `https://${event.target.value.trim()}:8080`, }); } @@ -93,16 +93,14 @@ export default function ConnectRaspiBlitz() {
Copy your .onion address.
- Add https:// at the beginning and :8080 at the end. -
Paste the URL in the input below.

Date: Mon, 21 Mar 2022 12:42:29 -0600 Subject: [PATCH 05/16] fix: update input pattern regex and message, add conditional to onChange --- .../Onboard/ConnectRaspiBlitz/index.tsx | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx index 0308bdba57..e3c0c78ea3 100644 --- a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx +++ b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx @@ -16,10 +16,17 @@ export default function ConnectRaspiBlitz() { const [loading, setLoading] = useState(false); function handleChange(event: React.ChangeEvent) { - setFormData({ - ...formData, - [event.target.name]: `https://${event.target.value.trim()}:8080`, - }); + if (event.target.name === "url") { + setFormData({ + ...formData, + [event.target.name]: `https://${event.target.value.trim()}:8080`, + }); + } else { + setFormData({ + ...formData, + [event.target.name]: event.target.value.trim(), + }); + } } function getConnectorType() { @@ -101,8 +108,8 @@ export default function ConnectRaspiBlitz() { id="url" label="REST API host" placeholder="your-node-url" - pattern="https://.+" - title="https://your-node-url:8080" + pattern="^[A-Za-z0-9]*\.onion$" + title="your-node-url.onion" onChange={handleChange} required /> From 150a8f0a2db109b44d69ada1f65072d05f0b4e8d Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Mon, 21 Mar 2022 13:27:15 -0600 Subject: [PATCH 06/16] fix: change URL references to .onion address --- src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx index e3c0c78ea3..32c383421e 100644 --- a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx +++ b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx @@ -91,25 +91,23 @@ export default function ConnectRaspiBlitz() { Connect to your RaspiBlitz node

- You need your node URL and a macaroon with read and send permissions - (e.g. admin.macaroon). + You need your node onion address and a macaroon with read and send + permissions (e.g. admin.macaroon).

SSH into your RaspiBlitz.
Run the command sudo cat /mnt/hdd/tor/lndrest8080/hostname.
- Copy your .onion address. -
- Paste the URL in the input below. + Copy and paste the .onion address in the input below.

From 035413990be8a0f6b7439182c1bd8867d87a094c Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Tue, 22 Mar 2022 22:07:43 -0600 Subject: [PATCH 07/16] refactor: make 2 functions for change and remove onion validation --- .../Onboard/ConnectRaspiBlitz/index.tsx | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx index 32c383421e..e09b3b343b 100644 --- a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx +++ b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx @@ -15,18 +15,18 @@ export default function ConnectRaspiBlitz() { const [formData, setFormData] = useState(initialFormData); const [loading, setLoading] = useState(false); - function handleChange(event: React.ChangeEvent) { - if (event.target.name === "url") { - setFormData({ - ...formData, - [event.target.name]: `https://${event.target.value.trim()}:8080`, - }); - } else { - setFormData({ - ...formData, - [event.target.name]: event.target.value.trim(), - }); - } + function handleUrl(event: React.ChangeEvent) { + setFormData({ + ...formData, + [event.target.name]: `https://${event.target.value.trim()}:8080`, + }); + } + + function handleMacaroon(event: React.ChangeEvent) { + setFormData({ + ...formData, + [event.target.name]: event.target.value.trim(), + }); } function getConnectorType() { @@ -106,9 +106,7 @@ export default function ConnectRaspiBlitz() { id="url" label="REST API host" placeholder="your-node-onion-address" - pattern="^[A-Za-z0-9]*\.onion$" - title="your-node-address.onion" - onChange={handleChange} + onChange={handleUrl} required />
@@ -126,7 +124,7 @@ export default function ConnectRaspiBlitz() { id="macaroon" label="Macaroon (HEX format)" value={formData.macaroon} - onChange={handleChange} + onChange={handleMacaroon} required />
From ff06931f81f2092389702348f867bf488dcb71c8 Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Wed, 23 Mar 2022 14:47:59 -0600 Subject: [PATCH 08/16] refactor: make port configurable --- src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx index e09b3b343b..972b0080e1 100644 --- a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx +++ b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx @@ -18,7 +18,7 @@ export default function ConnectRaspiBlitz() { function handleUrl(event: React.ChangeEvent) { setFormData({ ...formData, - [event.target.name]: `https://${event.target.value.trim()}:8080`, + [event.target.name]: `https://${event.target.value.trim()}`, }); } @@ -91,21 +91,26 @@ export default function ConnectRaspiBlitz() { Connect to your RaspiBlitz node

- You need your node onion address and a macaroon with read and send - permissions (e.g. admin.macaroon). + You need your node onion address, port, and a macaroon with read and + send permissions (e.g. admin.macaroon).

SSH into your RaspiBlitz.
Run the command sudo cat /mnt/hdd/tor/lndrest8080/hostname.
Copy and paste the .onion address in the input below. +
+ Add your port after the onion address, the default port is{" "} + :8080. +
+ You do not need to add https://

From d7f1aacef105489adb8c34b2abe648101086835f Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Fri, 1 Apr 2022 21:38:05 -0600 Subject: [PATCH 09/16] feat: check for http and add if not present --- .../screens/Onboard/ConnectRaspiBlitz/index.tsx | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx index 972b0080e1..b3101a47e5 100644 --- a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx +++ b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx @@ -16,10 +16,17 @@ export default function ConnectRaspiBlitz() { const [loading, setLoading] = useState(false); function handleUrl(event: React.ChangeEvent) { - setFormData({ - ...formData, - [event.target.name]: `https://${event.target.value.trim()}`, - }); + if (event.target.value.substring(0, 4) === "http") { + setFormData({ + ...formData, + [event.target.name]: event.target.value.trim(), + }); + } else { + setFormData({ + ...formData, + [event.target.name]: `https://${event.target.value.trim()}`, + }); + } } function handleMacaroon(event: React.ChangeEvent) { @@ -102,8 +109,6 @@ export default function ConnectRaspiBlitz() {
Add your port after the onion address, the default port is{" "} :8080. -
- You do not need to add https://

From 206d1f7d1a56e3906b1926ff26255d9ef0bf191a Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Tue, 5 Apr 2022 14:32:58 -0600 Subject: [PATCH 10/16] refactor: use bumi suggestion to dry handleUrl function --- .../screens/Onboard/ConnectRaspiBlitz/index.tsx | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx index b3101a47e5..f8f01715b9 100644 --- a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx +++ b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx @@ -16,17 +16,14 @@ export default function ConnectRaspiBlitz() { const [loading, setLoading] = useState(false); function handleUrl(event: React.ChangeEvent) { - if (event.target.value.substring(0, 4) === "http") { - setFormData({ - ...formData, - [event.target.name]: event.target.value.trim(), - }); - } else { - setFormData({ - ...formData, - [event.target.name]: `https://${event.target.value.trim()}`, - }); + let url = event.target.value.trim(); + if (event.target.value.substring(0, 4) !== "http") { + url = `https://${url}`; } + setFormData({ + ...formData, + [event.target.name]: url, + }); } function handleMacaroon(event: React.ChangeEvent) { From 3a819ad9f026924a6c053647a107d3600b374940 Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Tue, 5 Apr 2022 15:05:28 -0600 Subject: [PATCH 11/16] fix: add raspiblitz back in after merge --- src/app/router/connectorRoutes.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/app/router/connectorRoutes.tsx b/src/app/router/connectorRoutes.tsx index 45347486cc..95a31b4c1b 100644 --- a/src/app/router/connectorRoutes.tsx +++ b/src/app/router/connectorRoutes.tsx @@ -9,6 +9,7 @@ import umbrel from "/static/assets/icons/umbrel.png"; import start9 from "/static/assets/icons/start9.png"; import citadel from "/static/assets/icons/citadel.png"; import mynode from "/static/assets/icons/mynode.png"; +import raspiblitz from "/static/assets/icons/raspiblitz.png"; import ConnectLnd from "../screens/connectors/ConnectLnd"; import ConnectLndHub from "../screens/connectors/ConnectLndHub"; @@ -17,6 +18,7 @@ import ConnectGaloy, { galoyUrls } from "../screens/connectors/ConnectGaloy"; import ConnectEclair from "../screens/connectors/ConnectEclair"; import ConnectCitadel from "../screens/connectors/ConnectCitadel"; import NewWallet from "../screens/connectors/NewWallet"; +import ConnectRaspiBlitz from "../screens/Onboard/ConnectRaspiBlitz"; import ConnectUmbrel from "../screens/connectors/ConnectUmbrel"; import ConnectStart9 from "../screens/connectors/ConnectStart9"; import ConnectMyNode from "../screens/connectors/ConnectMyNode"; @@ -90,6 +92,13 @@ export default [ description: "Connect to your Embassy", logo: start9, }, + { + path: "raspiblitz", + element: , + title: "RaspiBlitz", + description: "Connect to your RaspiBlitz", + logo: raspiblitz, + }, { path: galoyPaths.bitcoinBeach, element: , From 304eb52286b15ca3ce5f3d638b59c1e542329997 Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Tue, 5 Apr 2022 15:05:51 -0600 Subject: [PATCH 12/16] fix: delete unused code --- .../screens/Onboard/ChooseConnector/index.tsx | 121 ------------------ 1 file changed, 121 deletions(-) delete mode 100644 src/app/screens/Onboard/ChooseConnector/index.tsx diff --git a/src/app/screens/Onboard/ChooseConnector/index.tsx b/src/app/screens/Onboard/ChooseConnector/index.tsx deleted file mode 100644 index 94e8db8bdf..0000000000 --- a/src/app/screens/Onboard/ChooseConnector/index.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import LinkButton from "../../../components/LinkButton"; - -import lnbits from "/static/assets/icons/lnbits.png"; -import lndhub from "/static/assets/icons/lndhub.png"; -import lnd from "/static/assets/icons/lnd.png"; -import galoyBitcoinBeach from "/static/assets/icons/galoy_bitcoin_beach.jpg"; -import galoyBitcoinJungle from "/static/assets/icons/galoy_bitcoin_jungle.png"; -import eclair from "/static/assets/icons/eclair.jpg"; -import alby from "/static/assets/icons/alby.png"; -import raspiblitz from "/static/assets/icons/raspiblitz.png"; -import umbrel from "/static/assets/icons/umbrel.png"; -import start9 from "/static/assets/icons/start9.png"; -import citadel from "/static/assets/icons/citadel.png"; -import mynode from "/static/assets/icons/mynode.png"; - -type Props = { - title: string; - description?: string; -}; - -export default function ChooseConnector({ title, description }: Props) { - const connectors = [ - { - to: "create-wallet", - title: "Create a new wallet", - description: "We create and manage a lightning wallet for you", - logo: alby, - }, - { - to: "lnd", - title: "LND", - description: "Connect to your LND node", - logo: lnd, - }, - { - to: "lnd-hub", - title: "LNDHub (Bluewallet)", - description: "Connect to your Bluewallet mobile wallet", - logo: lndhub, - }, - { - to: "lnbits", - title: "LNbits", - description: "Connect to your LNbits account", - logo: lnbits, - }, - { - to: "eclair", - title: "Eclair", - description: "Connect to your Eclair node", - logo: eclair, - }, - { - to: "citadel", - title: "Citadel", - description: "Connect to your local Citadel", - logo: citadel, - }, - { - to: "umbrel", - title: "Umbrel", - description: "Connect to your Umbrel", - logo: umbrel, - }, - { - to: "mynode", - title: "myNode", - description: "Connect to your myNode", - logo: mynode, - }, - { - to: "start9", - title: "Start9", - description: "Connect to your Embassy", - logo: start9, - }, - { - to: "raspiblitz", - title: "RaspiBlitz", - description: "Connect to your RaspiBlitz", - logo: raspiblitz, - }, - { to: "galoy-bitcoin-beach", - title: "Bitcoin Beach Wallet", - description: "Create or connect to a Bitcoin Beach (Galoy) account", - logo: galoyBitcoinBeach, - }, - { - to: "galoy-bitcoin-jungle", - title: "Bitcoin Jungle Wallet", - description: "Create or connect to a Bitcoin Jungle (Galoy) account", - logo: galoyBitcoinJungle, - }, - ]; - - return ( -
-
-
-

{title}

- {description && ( -

- {description} -

- )} -
-
- {connectors.map(({ to, title, description, logo }) => ( - - ))} -
-
-
- ); -} From e9a41f465c37b0ea3d63a1eb300ec2783a87a95e Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Tue, 5 Apr 2022 15:06:04 -0600 Subject: [PATCH 13/16] fix: filepath --- src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx index f8f01715b9..f0bb2342b2 100644 --- a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx +++ b/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx @@ -2,7 +2,7 @@ import { useState } from "react"; import { useNavigate } from "react-router-dom"; import utils from "../../../../common/lib/utils"; import Button from "../../../components/Button"; -import TextField from "../../../components/Form/TextField"; +import TextField from "../../../components/form/TextField"; import CompanionDownloadInfo from "../../../components/CompanionDownloadInfo"; const initialFormData = Object.freeze({ From 7361805b0391fcb91473b816c9c6e6bc9f1bd68b Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Tue, 5 Apr 2022 15:27:13 -0600 Subject: [PATCH 14/16] refactor: move to new folder structure --- src/app/router/connectorRoutes.tsx | 2 +- .../screens/{Onboard => connectors}/ConnectRaspiBlitz/index.tsx | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/app/screens/{Onboard => connectors}/ConnectRaspiBlitz/index.tsx (100%) diff --git a/src/app/router/connectorRoutes.tsx b/src/app/router/connectorRoutes.tsx index 95a31b4c1b..411f72f344 100644 --- a/src/app/router/connectorRoutes.tsx +++ b/src/app/router/connectorRoutes.tsx @@ -18,7 +18,7 @@ import ConnectGaloy, { galoyUrls } from "../screens/connectors/ConnectGaloy"; import ConnectEclair from "../screens/connectors/ConnectEclair"; import ConnectCitadel from "../screens/connectors/ConnectCitadel"; import NewWallet from "../screens/connectors/NewWallet"; -import ConnectRaspiBlitz from "../screens/Onboard/ConnectRaspiBlitz"; +import ConnectRaspiBlitz from "../screens/connectors/ConnectRaspiBlitz"; import ConnectUmbrel from "../screens/connectors/ConnectUmbrel"; import ConnectStart9 from "../screens/connectors/ConnectStart9"; import ConnectMyNode from "../screens/connectors/ConnectMyNode"; diff --git a/src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx b/src/app/screens/connectors/ConnectRaspiBlitz/index.tsx similarity index 100% rename from src/app/screens/Onboard/ConnectRaspiBlitz/index.tsx rename to src/app/screens/connectors/ConnectRaspiBlitz/index.tsx From 0c901b165ca45cb38207112e6f6b92aa01a33d0d Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Wed, 13 Apr 2022 18:08:21 -0600 Subject: [PATCH 15/16] refactor: add url variable instead of event --- src/app/screens/connectors/ConnectRaspiBlitz/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/screens/connectors/ConnectRaspiBlitz/index.tsx b/src/app/screens/connectors/ConnectRaspiBlitz/index.tsx index f0bb2342b2..e31b7f8ced 100644 --- a/src/app/screens/connectors/ConnectRaspiBlitz/index.tsx +++ b/src/app/screens/connectors/ConnectRaspiBlitz/index.tsx @@ -17,7 +17,7 @@ export default function ConnectRaspiBlitz() { function handleUrl(event: React.ChangeEvent) { let url = event.target.value.trim(); - if (event.target.value.substring(0, 4) !== "http") { + if (url.substring(0, 4) !== "http") { url = `https://${url}`; } setFormData({ From 9fb75287049364ecbbf189ea21131f3c201ba71a Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Wed, 13 Apr 2022 18:28:30 -0600 Subject: [PATCH 16/16] refactor: update to use new connectorform component --- .../connectors/ConnectRaspiBlitz/index.tsx | 123 +++++++----------- 1 file changed, 50 insertions(+), 73 deletions(-) diff --git a/src/app/screens/connectors/ConnectRaspiBlitz/index.tsx b/src/app/screens/connectors/ConnectRaspiBlitz/index.tsx index e31b7f8ced..1a9e818fb3 100644 --- a/src/app/screens/connectors/ConnectRaspiBlitz/index.tsx +++ b/src/app/screens/connectors/ConnectRaspiBlitz/index.tsx @@ -1,9 +1,9 @@ import { useState } from "react"; import { useNavigate } from "react-router-dom"; import utils from "../../../../common/lib/utils"; -import Button from "../../../components/Button"; import TextField from "../../../components/form/TextField"; import CompanionDownloadInfo from "../../../components/CompanionDownloadInfo"; +import ConnectorForm from "../../../components/ConnectorForm"; const initialFormData = Object.freeze({ url: "", @@ -88,79 +88,56 @@ export default function ConnectRaspiBlitz() { } return ( - -
-
-

- Connect to your RaspiBlitz node -

-

- You need your node onion address, port, and a macaroon with read and - send permissions (e.g. admin.macaroon). -
-
- SSH into your RaspiBlitz.
- Run the command sudo cat /mnt/hdd/tor/lndrest8080/hostname. -
- Copy and paste the .onion address in the input below. -
- Add your port after the onion address, the default port is{" "} - :8080. -

-
-
- -
- {formData.url.match(/\.onion/i) && } -
-

- Select CONNECT.
- Select EXPORT.
- Select HEX.
- Copy the adminMacaroon.
- Paste the macaroon in the input below. -

-
- -
-
-
-
-
-
- sat -
-
-
-
-