diff --git a/package-lock.json b/package-lock.json index 896568d7..5a361361 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "devDependencies": { "@solidjs/testing-library": "^0.8.4", "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "@webbtc/webln-types": "^3.0.0", "eventsource": "^2.0.2", "git-cliff": "^1.4.0", "jsdom": "^22.1.0", @@ -1975,6 +1976,16 @@ "node": "^16.13 || >=18" } }, + "node_modules/@webbtc/webln-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@webbtc/webln-types/-/webln-types-3.0.0.tgz", + "integrity": "sha512-aXfTHLKz5lysd+6xTeWl+qHNh/p3qVYbeLo+yDN5cUDmhie2ZoGvkppfWxzbGkcFBzb6dJyQ2/i2cbmDHas+zQ==", + "dev": true, + "funding": { + "type": "lightning", + "url": "lightning:hello@getalby.com" + } + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", diff --git a/package.json b/package.json index 077bb913..84f5cb4a 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "devDependencies": { "@solidjs/testing-library": "^0.8.4", "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "@webbtc/webln-types": "^3.0.0", "eventsource": "^2.0.2", "git-cliff": "^1.4.0", "jsdom": "^22.1.0", diff --git a/src/Create.tsx b/src/Create.tsx index 5a959317..2db88139 100644 --- a/src/Create.tsx +++ b/src/Create.tsx @@ -88,7 +88,6 @@ const Create = () => { const createWeblnInvoice = async () => { enableWebln(async () => { const amount = Number(receiveAmount()); - // @ts-ignore const invoice = await window.webln.makeInvoice({ amount: amount }); validateAmount(); log.debug("created webln invoice", invoice); diff --git a/src/utils/wasmSupport.js b/src/utils/wasmSupport.ts similarity index 100% rename from src/utils/wasmSupport.js rename to src/utils/wasmSupport.ts diff --git a/src/utils/webln.js b/src/utils/webln.ts similarity index 69% rename from src/utils/webln.js rename to src/utils/webln.ts index 34b7094b..698d2c78 100644 --- a/src/utils/webln.js +++ b/src/utils/webln.ts @@ -1,34 +1,35 @@ import log from "loglevel"; -export function detectWebLNProvider(timeoutParam) { - const timeout = timeoutParam ?? 3000; +export const detectWebLNProvider = (timeout: number = 3000) => { const interval = 100; return new Promise((resolve) => { + const handleWebLn = () => { + resolve(window.webln !== undefined); + }; + if (window.webln) { - handleWebLN(); + handleWebLn(); } else { let i = 0; const checkInterval = setInterval(function () { if (window.webln || i >= timeout / interval) { - handleWebLN(); + handleWebLn(); clearInterval(checkInterval); } i++; }, interval); } - - function handleWebLN() { - resolve(window.webln !== undefined); - } }); -} +}; -export async function enableWebln(cb) { +export const enableWebln = async ( + cb: () => Promise | void, +): Promise => { try { await window.webln.enable(); await cb(); } catch (error) { log.error("webln call failed", error); } -} +}; diff --git a/src/webln-types.d.ts b/src/webln-types.d.ts new file mode 100644 index 00000000..6c1c34bf --- /dev/null +++ b/src/webln-types.d.ts @@ -0,0 +1 @@ +/// diff --git a/tests/utils/webln.spec.js b/tests/utils/webln.spec.ts similarity index 90% rename from tests/utils/webln.spec.js rename to tests/utils/webln.spec.ts index 50a1c35b..fed5240d 100644 --- a/tests/utils/webln.spec.js +++ b/tests/utils/webln.spec.ts @@ -1,5 +1,5 @@ import log from "loglevel"; -import { beforeEach, describe, expect, vitest } from "vitest"; +import { beforeEach, describe, expect, test, vitest } from "vitest"; import { detectWebLNProvider, enableWebln } from "../../src/utils/webln"; @@ -14,19 +14,19 @@ describe("WebLN", () => { }); test("should detect WebLN when provider is present", async () => { - window.webln = {}; + window.webln = {} as any; expect(await detectWebLNProvider()).toEqual(true); }); test("should detect WebLN when provider is present after 200ms", async () => { - setTimeout(() => (window.webln = {}), 1); + setTimeout(() => (window.webln = {} as any), 1); expect(await detectWebLNProvider()).toEqual(true); }); test("should call WebLN callback if enable call succeeds", async () => { window.webln = { enable: vitest.fn().mockResolvedValue(undefined), - }; + } as any; const cb = vitest.fn(); expect(await enableWebln(cb)); @@ -41,7 +41,7 @@ describe("WebLN", () => { test("should not call WebLN callback if enable call fails", async () => { window.webln = { enable: vitest.fn().mockRejectedValue("unauthorized"), - }; + } as any; const cb = vitest.fn(); expect(await enableWebln(cb));