e.stopPropagation()} target="_blank" rel="noreferrer" className="ext">
- {preview?.image && }
+ {preview?.image && }
{preview?.title}
{preview?.description && (
<>
- {preview?.description}
+ {preview.description.slice(0, 160)}
>
)}
diff --git a/packages/app/src/Element/Note.css b/packages/app/src/Element/Note.css
index 2be8075e..61d60077 100644
--- a/packages/app/src/Element/Note.css
+++ b/packages/app/src/Element/Note.css
@@ -263,26 +263,3 @@
.close-menu-container {
position: absolute;
}
-
-.link-preview-container {
- border: 1px solid var(--gray);
- border-radius: 10px;
- text-align: center;
-}
-
-.link-preview-container:hover {
- cursor: pointer;
-}
-
-.link-preview-title {
- padding: 0 10px 10px 10px;
-}
-
-.link-preview-title > small {
- color: var(--font-secondary-color);
- font-size: small;
-}
-
-.link-preview-image {
- margin: 0 0 15px 0 !important;
-}
diff --git a/packages/app/src/Element/ProxyImg.tsx b/packages/app/src/Element/ProxyImg.tsx
index d20074a2..84200fef 100644
--- a/packages/app/src/Element/ProxyImg.tsx
+++ b/packages/app/src/Element/ProxyImg.tsx
@@ -12,9 +12,8 @@ export const ProxyImg = (props: ProxyImgProps) => {
useEffect(() => {
if (src) {
- proxy(src, size)
- .then(a => setUrl(a))
- .catch(console.warn);
+ const url = proxy(src, size);
+ setUrl(url);
}
}, [src]);
diff --git a/packages/app/src/Hooks/useImgProxy.ts b/packages/app/src/Hooks/useImgProxy.ts
index 901a1b96..ca41e386 100644
--- a/packages/app/src/Hooks/useImgProxy.ts
+++ b/packages/app/src/Hooks/useImgProxy.ts
@@ -17,8 +17,8 @@ export default function useImgProxy() {
return s.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
}
- async function signUrl(u: string) {
- const result = await hmacSha256(
+ function signUrl(u: string) {
+ const result = hmacSha256(
secp.utils.hexToBytes(unwrap(settings).key),
secp.utils.hexToBytes(unwrap(settings).salt),
te.encode(u)
@@ -27,13 +27,13 @@ export default function useImgProxy() {
}
return {
- proxy: async (url: string, resize?: number) => {
+ proxy: (url: string, resize?: number) => {
if (!settings) return url;
const opt = resize ? `rs:fit:${resize}:${resize}/dpr:${window.devicePixelRatio}` : "";
const urlBytes = te.encode(url);
const urlEncoded = urlSafe(base64.encode(urlBytes, 0, urlBytes.byteLength));
const path = `/${opt}/${urlEncoded}`;
- const sig = await signUrl(path);
+ const sig = signUrl(path);
return `${new URL(settings.url).toString()}${sig}${path}`;
},
};
diff --git a/packages/app/src/Pages/Login.tsx b/packages/app/src/Pages/Login.tsx
index 0586586e..b2ff78d9 100644
--- a/packages/app/src/Pages/Login.tsx
+++ b/packages/app/src/Pages/Login.tsx
@@ -85,7 +85,8 @@ export default function LoginPage() {
useEffect(() => {
const ret = unwrap(Artwork.at(Artwork.length * Math.random()));
- proxy(ret.link).then(a => setArt({ ...ret, link: a }));
+ const url = proxy(ret.link);
+ setArt({ ...ret, link: url });
}, []);
async function doLogin() {
diff --git a/packages/app/src/SnortApi.ts b/packages/app/src/SnortApi.ts
index f7625796..404e7d78 100644
--- a/packages/app/src/SnortApi.ts
+++ b/packages/app/src/SnortApi.ts
@@ -41,6 +41,12 @@ export class SubscriptionError extends Error {
}
}
+export interface LinkPreviewData {
+ title?: string;
+ description?: string;
+ image?: string;
+}
+
export default class SnortApi {
#url: string;
#publisher?: EventPublisher;
@@ -74,6 +80,10 @@ export default class SnortApi {
return this.#getJsonAuthd>("api/v1/subscription");
}
+ linkPreview(url: string) {
+ return this.#getJson(`api/v1/preview?url=${encodeURIComponent(url)}`);
+ }
+
async #getJsonAuthd(
path: string,
method?: "GET" | string,
diff --git a/packages/app/src/Util.ts b/packages/app/src/Util.ts
index 2aee55e6..59f0bb31 100644
--- a/packages/app/src/Util.ts
+++ b/packages/app/src/Util.ts
@@ -473,12 +473,8 @@ export function findTag(e: TaggedRawEvent, tag: string) {
return maybeTag && maybeTag[1];
}
-export async function hmacSha256(key: Uint8Array, ...messages: Uint8Array[]) {
- if (window.crypto.subtle) {
- return await secp.utils.hmacSha256(key, ...messages);
- } else {
- return hmac(hash, key, secp.utils.concatBytes(...messages));
- }
+export function hmacSha256(key: Uint8Array, ...messages: Uint8Array[]) {
+ return hmac(hash, key, secp.utils.concatBytes(...messages));
}
export function getRelayName(url: string) {