Merge remote-tracking branch 'origin/main'
Some checks reported errors
continuous-integration/drone/push Build encountered an error
Some checks reported errors
continuous-integration/drone/push Build encountered an error
This commit is contained in:
commit
8a5a089b4d
@ -1,5 +1,7 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
|
import { trackEvent } from "@/Utils";
|
||||||
|
|
||||||
interface ErrorBoundaryState {
|
interface ErrorBoundaryState {
|
||||||
hasError: boolean;
|
hasError: boolean;
|
||||||
errorMessage?: string;
|
errorMessage?: string;
|
||||||
@ -21,6 +23,7 @@ export default class ErrorBoundary extends React.Component<ErrorBoundaryProps, E
|
|||||||
|
|
||||||
componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
|
componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
|
||||||
console.error("Caught an error:", error, errorInfo);
|
console.error("Caught an error:", error, errorInfo);
|
||||||
|
trackEvent("error", { error: error.message, errorInfo: JSON.stringify(errorInfo) });
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
@ -1,12 +1,3 @@
|
|||||||
.note-creator {
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: 12px;
|
|
||||||
box-shadow: 0px 0px 6px 1px rgba(182, 108, 156, 0.3);
|
|
||||||
background:
|
|
||||||
linear-gradient(var(--gray-superdark), var(--gray-superdark)) padding-box,
|
|
||||||
linear-gradient(90deg, #ef9644, #fd7c49, #ff5e58, #ff3b70, #ff088e, #eb00b1, #c31ed5, #7b41f6) border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
.note-creator-modal .modal-body > div {
|
.note-creator-modal .modal-body > div {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@ -86,17 +77,6 @@
|
|||||||
height: 32px;
|
height: 32px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.light .note-creator textarea {
|
|
||||||
background-color: var(--gray-superdark);
|
|
||||||
}
|
|
||||||
|
|
||||||
.light .note-creator {
|
|
||||||
box-shadow: 0px 0px 6px 1px rgba(182, 108, 156, 0.3);
|
|
||||||
background:
|
|
||||||
linear-gradient(var(--gray-superdark), var(--gray-superdark)) padding-box,
|
|
||||||
linear-gradient(90deg, #ef9644, #fd7c49, #ff5e58, #ff3b70, #ff088e, #eb00b1, #c31ed5, #7b41f6) border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
.note-creator-modal .rti--container {
|
.note-creator-modal .rti--container {
|
||||||
background-color: unset !important;
|
background-color: unset !important;
|
||||||
box-shadow: unset !important;
|
box-shadow: unset !important;
|
||||||
|
@ -5,12 +5,10 @@ import { EventBuilder, EventKind, NostrLink, NostrPrefix, TaggedNostrEvent, tryP
|
|||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { ClipboardEventHandler, DragEvent, useEffect } from "react";
|
import { ClipboardEventHandler, DragEvent, useEffect } from "react";
|
||||||
import { FormattedMessage, useIntl } from "react-intl";
|
import { FormattedMessage, useIntl } from "react-intl";
|
||||||
import { TagsInput } from "react-tag-input-component";
|
|
||||||
|
|
||||||
import AsyncButton from "@/Components/Button/AsyncButton";
|
import AsyncButton from "@/Components/Button/AsyncButton";
|
||||||
import { AsyncIcon } from "@/Components/Button/AsyncIcon";
|
import { AsyncIcon } from "@/Components/Button/AsyncIcon";
|
||||||
import CloseButton from "@/Components/Button/CloseButton";
|
import CloseButton from "@/Components/Button/CloseButton";
|
||||||
import { TrendingHashTagsLine } from "@/Components/Event/Create/TrendingHashTagsLine";
|
|
||||||
import { sendEventToRelays } from "@/Components/Event/Create/util";
|
import { sendEventToRelays } from "@/Components/Event/Create/util";
|
||||||
import Note from "@/Components/Event/EventComponent";
|
import Note from "@/Components/Event/EventComponent";
|
||||||
import Icon from "@/Components/Icons/Icon";
|
import Icon from "@/Components/Icons/Icon";
|
||||||
@ -22,7 +20,7 @@ import ProfileImage from "@/Components/User/ProfileImage";
|
|||||||
import useEventPublisher from "@/Hooks/useEventPublisher";
|
import useEventPublisher from "@/Hooks/useEventPublisher";
|
||||||
import useLogin from "@/Hooks/useLogin";
|
import useLogin from "@/Hooks/useLogin";
|
||||||
import { useNoteCreator } from "@/State/NoteCreator";
|
import { useNoteCreator } from "@/State/NoteCreator";
|
||||||
import { appendDedupe, openFile, trackEvent } from "@/Utils";
|
import { openFile, trackEvent } from "@/Utils";
|
||||||
import useFileUpload from "@/Utils/Upload";
|
import useFileUpload from "@/Utils/Upload";
|
||||||
import { GetPowWorker } from "@/Utils/wasm";
|
import { GetPowWorker } from "@/Utils/wasm";
|
||||||
import { ZapTarget } from "@/Utils/Zapper";
|
import { ZapTarget } from "@/Utils/Zapper";
|
||||||
@ -636,7 +634,6 @@ export function NoteCreator() {
|
|||||||
onDragLeave={handleDragLeave}
|
onDragLeave={handleDragLeave}
|
||||||
onDrop={handleDrop}
|
onDrop={handleDrop}
|
||||||
autoFocus
|
autoFocus
|
||||||
className={classNames("textarea", { "textarea--focused": note.active })}
|
|
||||||
onChange={c => onChange(c)}
|
onChange={c => onChange(c)}
|
||||||
value={note.note}
|
value={note.note}
|
||||||
onFocus={() => note.update(v => (v.active = true))}
|
onFocus={() => note.update(v => (v.active = true))}
|
||||||
@ -648,23 +645,6 @@ export function NoteCreator() {
|
|||||||
/>
|
/>
|
||||||
{renderPollOptions()}
|
{renderPollOptions()}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col g4">
|
|
||||||
<TagsInput
|
|
||||||
value={note.hashTags}
|
|
||||||
onChange={e => note.update(s => (s.hashTags = e))}
|
|
||||||
placeHolder={formatMessage({
|
|
||||||
defaultMessage: "Add up to 4 hashtags",
|
|
||||||
id: "AIgmDy",
|
|
||||||
})}
|
|
||||||
separators={["Enter", ","]}
|
|
||||||
/>
|
|
||||||
{note.hashTags.length > 4 && (
|
|
||||||
<small className="warning">
|
|
||||||
<FormattedMessage defaultMessage="Try to use less than 5 hashtags to stay on topic 🙏" id="d8gpCh" />
|
|
||||||
</small>
|
|
||||||
)}
|
|
||||||
<TrendingHashTagsLine onClick={t => note.update(s => (s.hashTags = appendDedupe(s.hashTags, [t])))} />
|
|
||||||
</div>
|
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
{uploader.progress.length > 0 && <FileUploadProgress progress={uploader.progress} />}
|
{uploader.progress.length > 0 && <FileUploadProgress progress={uploader.progress} />}
|
||||||
|
@ -1,37 +0,0 @@
|
|||||||
import { FormattedMessage } from "react-intl";
|
|
||||||
|
|
||||||
import { ErrorOrOffline } from "@/Components/ErrorOrOffline";
|
|
||||||
import NostrBandApi from "@/External/NostrBand";
|
|
||||||
import useCachedFetch from "@/Hooks/useCachedFetch";
|
|
||||||
import { useLocale } from "@/IntlProvider";
|
|
||||||
|
|
||||||
export function TrendingHashTagsLine(props: { onClick: (tag: string) => void }) {
|
|
||||||
const { lang } = useLocale();
|
|
||||||
const api = new NostrBandApi();
|
|
||||||
const trendingHashtagsUrl = api.trendingHashtagsUrl(lang);
|
|
||||||
const storageKey = `nostr-band-${trendingHashtagsUrl}`;
|
|
||||||
|
|
||||||
const { data: hashtags, isLoading, error } = useCachedFetch(trendingHashtagsUrl, storageKey, data => data.hashtags);
|
|
||||||
|
|
||||||
if (error && !hashtags) return <ErrorOrOffline error={error} className="p" />;
|
|
||||||
|
|
||||||
if (isLoading || hashtags.length === 0) return null;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="flex flex-col g4">
|
|
||||||
<small>
|
|
||||||
<FormattedMessage defaultMessage="Popular Hashtags" id="ddd3JX" />
|
|
||||||
</small>
|
|
||||||
<div className="flex g4 flex-wrap">
|
|
||||||
{hashtags.slice(0, 5).map(a => (
|
|
||||||
<span
|
|
||||||
key={a.hashtag}
|
|
||||||
className="px-2 py-1 bg-dark rounded-full pointer nowrap"
|
|
||||||
onClick={() => props.onClick(a.hashtag)}>
|
|
||||||
#{a.hashtag}
|
|
||||||
</span>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
@ -20,7 +20,7 @@ export const addEventToFuzzySearch = ev => {
|
|||||||
if (ev.kind !== 0) {
|
if (ev.kind !== 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setTimeout(() => {
|
queueMicrotask(() => {
|
||||||
const existing = profileTimestamps.get(ev.pubkey);
|
const existing = profileTimestamps.get(ev.pubkey);
|
||||||
if (existing) {
|
if (existing) {
|
||||||
if (existing > ev.created_at) {
|
if (existing > ev.created_at) {
|
||||||
@ -42,7 +42,7 @@ export const addEventToFuzzySearch = ev => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const addCachedMetadataToFuzzySearch = (profile: CachedMetadata) => {
|
export const addCachedMetadataToFuzzySearch = (profile: CachedMetadata) => {
|
||||||
setTimeout(() => {
|
queueMicrotask(() => {
|
||||||
const existing = profileTimestamps.get(profile.pubkey);
|
const existing = profileTimestamps.get(profile.pubkey);
|
||||||
if (existing) {
|
if (existing) {
|
||||||
if (existing > profile.created) {
|
if (existing > profile.created) {
|
||||||
|
@ -56,24 +56,26 @@ export default function Index() {
|
|||||||
const isStalker = !!stalker;
|
const isStalker = !!stalker;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex justify-center">
|
<ErrorBoundary>
|
||||||
<div className="w-full max-w-screen-xl">
|
<div className="flex justify-center">
|
||||||
<div className="flex flex-row">
|
<div className="w-full max-w-screen-xl">
|
||||||
<NavSidebar />
|
<div className="flex flex-row">
|
||||||
<div className="flex flex-1 flex-col pb-footer-height md:pb-0 w-full md:w-1/3">
|
<NavSidebar />
|
||||||
{!shouldHideHeader && <Header />}
|
<div className="flex flex-1 flex-col pb-footer-height md:pb-0 w-full md:w-1/3">
|
||||||
<ErrorBoundary>
|
{!shouldHideHeader && <Header />}
|
||||||
<Outlet />
|
<ErrorBoundary>
|
||||||
</ErrorBoundary>
|
<Outlet />
|
||||||
|
</ErrorBoundary>
|
||||||
|
</div>
|
||||||
|
<RightColumn />
|
||||||
</div>
|
</div>
|
||||||
<RightColumn />
|
<Toaster />
|
||||||
</div>
|
</div>
|
||||||
<Toaster />
|
<LoginUnlock />
|
||||||
|
{isStalker && <StalkerModal id={id} />}
|
||||||
|
{!shouldHideFooter && <Footer />}
|
||||||
</div>
|
</div>
|
||||||
<LoginUnlock />
|
</ErrorBoundary>
|
||||||
{isStalker && <StalkerModal id={id} />}
|
|
||||||
{!shouldHideFooter && <Footer />}
|
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,7 +537,11 @@ export function trackEvent(
|
|||||||
props?: Record<string, string | boolean>,
|
props?: Record<string, string | boolean>,
|
||||||
e?: { destination?: { url: string } },
|
e?: { destination?: { url: string } },
|
||||||
) {
|
) {
|
||||||
if (CONFIG.features.analytics && (LoginStore.snapshot().appData.item.preferences.telemetry ?? true)) {
|
if (
|
||||||
|
!import.meta.env.DEV &&
|
||||||
|
CONFIG.features.analytics &&
|
||||||
|
(LoginStore.snapshot().appData.item.preferences.telemetry ?? true)
|
||||||
|
) {
|
||||||
fetch("https://analytics.v0l.io/api/event", {
|
fetch("https://analytics.v0l.io/api/event", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
"0Azlrb": "Hallitse",
|
"0Azlrb": "Hallitse",
|
||||||
"0BUTMv": "Etsi...",
|
"0BUTMv": "Etsi...",
|
||||||
"0HFX0T": "Käytä tarkkaa sijaintia",
|
"0HFX0T": "Käytä tarkkaa sijaintia",
|
||||||
"0MndVW": "Generic LNDHub wallet (BTCPayServer / Alby / LNBits)",
|
"0MndVW": "Tavallinen LNDHub-lompakko (BTCPayServer / Alby / LNBits)",
|
||||||
"0jOEtS": "Virheellinen LNURL",
|
"0jOEtS": "Virheellinen LNURL",
|
||||||
"0mch2Y": "nimi sisältää sallimattomia merkkejä",
|
"0mch2Y": "nimi sisältää sallimattomia merkkejä",
|
||||||
"0siT4z": "Politiikka",
|
"0siT4z": "Politiikka",
|
||||||
@ -151,8 +151,8 @@
|
|||||||
"DrZqav": "Tietoja on oltava vähemmän kuin {limit} merkkiä",
|
"DrZqav": "Tietoja on oltava vähemmän kuin {limit} merkkiä",
|
||||||
"DtYelJ": "Siirto",
|
"DtYelJ": "Siirto",
|
||||||
"Dx4ey3": "Vaihda kaikki",
|
"Dx4ey3": "Vaihda kaikki",
|
||||||
"E5ZIPD": "<big>{amount}</big> <small>sats</small>",
|
"E5ZIPD": "<big>{amount}</big> <small>satsia</small>",
|
||||||
"EHqHsu": "Invoice / Lightning Address",
|
"EHqHsu": "Lasku / Lightning-osoite",
|
||||||
"EJbFi7": "Etsi muistiinpanoja",
|
"EJbFi7": "Etsi muistiinpanoja",
|
||||||
"ELbg9p": "Datantoimittajat",
|
"ELbg9p": "Datantoimittajat",
|
||||||
"EQKRE4": "Näytä merkit profiilisivuilla",
|
"EQKRE4": "Näytä merkit profiilisivuilla",
|
||||||
@ -230,7 +230,7 @@
|
|||||||
"LR1XjT": "Liian lyhyt tappi",
|
"LR1XjT": "Liian lyhyt tappi",
|
||||||
"LXxsbk": "Nimetön",
|
"LXxsbk": "Nimetön",
|
||||||
"LgbKvU": "Kommentoi",
|
"LgbKvU": "Kommentoi",
|
||||||
"LhLvRx": "Name must be between 8 and 15 characters",
|
"LhLvRx": "Nimen tulee olla 8-15 merkkiä",
|
||||||
"LmdPXO": "Nostr-osoitetta ei voida tarkistaa",
|
"LmdPXO": "Nostr-osoitetta ei voida tarkistaa",
|
||||||
"Lu5/Bj": "Avaa Zapstrissa",
|
"Lu5/Bj": "Avaa Zapstrissa",
|
||||||
"Lw+I+J": "{n,plural,=0{{name} zappasi} other{{name} & {n} muuta zappasivat}}",
|
"Lw+I+J": "{n,plural,=0{{name} zappasi} other{{name} & {n} muuta zappasivat}}",
|
||||||
@ -267,7 +267,7 @@
|
|||||||
"P7nJT9": "Tänään yhteensä (UTC): {amount} satsia",
|
"P7nJT9": "Tänään yhteensä (UTC): {amount} satsia",
|
||||||
"PCSt5T": "Asetukset",
|
"PCSt5T": "Asetukset",
|
||||||
"PJeJFc": "Yhteenveto",
|
"PJeJFc": "Yhteenveto",
|
||||||
"PXQ0z0": "Receiving to <b>{wallet}</b>",
|
"PXQ0z0": "Vastaanotto osoitteeseen <b>{wallet}</b>",
|
||||||
"PamNxw": "Tuntematon tiedostotunniste: {name}",
|
"PamNxw": "Tuntematon tiedostotunniste: {name}",
|
||||||
"Pe0ogR": "Teema",
|
"Pe0ogR": "Teema",
|
||||||
"PrsIg7": "Reaktiot näytetään jokaisella sivulla, jos poistettu käytöstä reaktioita ei näytetä",
|
"PrsIg7": "Reaktiot näytetään jokaisella sivulla, jos poistettu käytöstä reaktioita ei näytetä",
|
||||||
@ -307,7 +307,7 @@
|
|||||||
"U1aPPi": "Lopeta kuunteleminen",
|
"U1aPPi": "Lopeta kuunteleminen",
|
||||||
"UDYlxu": "Odottavat tilaukset",
|
"UDYlxu": "Odottavat tilaukset",
|
||||||
"UJTWqI": "Poista releistäni",
|
"UJTWqI": "Poista releistäni",
|
||||||
"ULXFfP": "Receive",
|
"ULXFfP": "Vastaanota",
|
||||||
"UNjfWJ": "Tarkista kaikki releiltä saadut tapahtuman allekirjoitukset",
|
"UNjfWJ": "Tarkista kaikki releiltä saadut tapahtuman allekirjoitukset",
|
||||||
"UT7Nkj": "Uusi keskustelu",
|
"UT7Nkj": "Uusi keskustelu",
|
||||||
"UUPFlt": "Käyttäjien täytyy hyväksyä sisältövaroitus nähdäkseen viestisi sisällön.",
|
"UUPFlt": "Käyttäjien täytyy hyväksyä sisältövaroitus nähdäkseen viestisi sisällön.",
|
||||||
@ -332,19 +332,19 @@
|
|||||||
"X7xU8J": "nsec, npub, nip-05, hex, mnemonic",
|
"X7xU8J": "nsec, npub, nip-05, hex, mnemonic",
|
||||||
"XECMfW": "Lähetä käyttötietoja",
|
"XECMfW": "Lähetä käyttötietoja",
|
||||||
"XICsE8": "Tiedostojen isäntäpalvelut",
|
"XICsE8": "Tiedostojen isäntäpalvelut",
|
||||||
"XPB8VV": "Alby wallet connection",
|
"XPB8VV": "Alby-lompakon yhteys",
|
||||||
"XQiFEl": "Seuraa välittäjän tila",
|
"XQiFEl": "Seuraa välittäjän tila",
|
||||||
"XXm7jJ": "Suositut tunnisteet",
|
"XXm7jJ": "Suositut tunnisteet",
|
||||||
"XgWvGA": "Reaktiot",
|
"XgWvGA": "Reaktiot",
|
||||||
"XhpBfA": "{site} on avoimen lähdekoodin projekti, jota intohimoiset ihmiset rakentavat vapaa-ajallaan, lahjoituksia arvostetaan suuresti",
|
"XhpBfA": "{site} on avoimen lähdekoodin projekti, jota intohimoiset ihmiset rakentavat vapaa-ajallaan, lahjoituksia arvostetaan suuresti",
|
||||||
"Xnimz0": "Sending from <b>{wallet}</b>",
|
"Xnimz0": "Lähettäminen osoitteesta <b>{wallet}</b>",
|
||||||
"Xopqkl": "Oletus zap-määräsi on {number} satsia, esimerkit on laskettu tämän mukaan.",
|
"Xopqkl": "Oletus zap-määräsi on {number} satsia, esimerkit on laskettu tämän mukaan.",
|
||||||
"XrSk2j": "Lunasta",
|
"XrSk2j": "Lunasta",
|
||||||
"Y7FG5M": "Image not available",
|
"Y7FG5M": "Kuva ei ole saatavilla",
|
||||||
"YDURw6": "Palvelun URL",
|
"YDURw6": "Palvelun URL",
|
||||||
"YR2I9M": "Ei avaimia, ei {app}, Avaimia ei voi palauttaa, ellet tee niistä varmuuskopiota. Se vie vain minuutin.",
|
"YR2I9M": "Ei avaimia, ei {app}, Avaimia ei voi palauttaa, ellet tee niistä varmuuskopiota. Se vie vain minuutin.",
|
||||||
"YXA3AH": "Ota reaktiot käyttöön",
|
"YXA3AH": "Ota reaktiot käyttöön",
|
||||||
"Yf3DwC": "Connect a wallet to send instant payments",
|
"Yf3DwC": "Yhdistä lompakko välittömien maksujen lähettämistä varten",
|
||||||
"Z4BMCZ": "Anna pariliitoslause",
|
"Z4BMCZ": "Anna pariliitoslause",
|
||||||
"ZKORll": "Aktivoi nyt",
|
"ZKORll": "Aktivoi nyt",
|
||||||
"ZLmyG9": "Avustajat",
|
"ZLmyG9": "Avustajat",
|
||||||
@ -355,8 +355,8 @@
|
|||||||
"a7TDNm": "Viestit striimautuvat reaaliajassa yleiseen ja viestit-välilehteen",
|
"a7TDNm": "Viestit striimautuvat reaaliajassa yleiseen ja viestit-välilehteen",
|
||||||
"aHje0o": "Nimi tai nimimerkki",
|
"aHje0o": "Nimi tai nimimerkki",
|
||||||
"aMaLBK": "Tuetut laajennukset",
|
"aMaLBK": "Tuetut laajennukset",
|
||||||
"aRex7h": "Paid {amount} sats, fee {fee} sats",
|
"aRex7h": "Maksettu {amount} satsia, maksu {fee} satsia",
|
||||||
"aSGz4J": "Connect to your own LND node with Lightning Node Connect",
|
"aSGz4J": "Yhdistä omaan LND-solmuun Lightning Node Connectin avulla",
|
||||||
"aWpBzj": "Näytä lisää",
|
"aWpBzj": "Näytä lisää",
|
||||||
"b12Goz": "Mnemonic-lause",
|
"b12Goz": "Mnemonic-lause",
|
||||||
"b5vAk0": "Käyttäjätunnuksesi toimii kuin lightning-osoite ja uudelleenohjaa valitsemaasi LNURLiin tai lightning-osoitteeseen",
|
"b5vAk0": "Käyttäjätunnuksesi toimii kuin lightning-osoite ja uudelleenohjaa valitsemaasi LNURLiin tai lightning-osoitteeseen",
|
||||||
@ -373,7 +373,7 @@
|
|||||||
"c35bj2": "Jos sinulla on kysymyksiä NIP-05-tilauksestasi, lähetä yksityisviesti {link}",
|
"c35bj2": "Jos sinulla on kysymyksiä NIP-05-tilauksestasi, lähetä yksityisviesti {link}",
|
||||||
"c3g2hL": "Lähetä uudelleen",
|
"c3g2hL": "Lähetä uudelleen",
|
||||||
"cFbU1B": "Käytätkö Albya? Mene {link} saadaksesi NWC-asetuksesi!",
|
"cFbU1B": "Käytätkö Albya? Mene {link} saadaksesi NWC-asetuksesi!",
|
||||||
"cG/bKQ": "Native nostr wallet connection",
|
"cG/bKQ": "Natiivi nostr-lompakkoyhteys",
|
||||||
"cHCwbF": "Valokuvaus",
|
"cHCwbF": "Valokuvaus",
|
||||||
"cPIKU2": "Seuraa",
|
"cPIKU2": "Seuraa",
|
||||||
"cQfLWb": "URL..",
|
"cQfLWb": "URL..",
|
||||||
@ -389,7 +389,7 @@
|
|||||||
"dOQCL8": "Näyttönimi",
|
"dOQCL8": "Näyttönimi",
|
||||||
"ddd3JX": "Suosittuja tunnisteita",
|
"ddd3JX": "Suosittuja tunnisteita",
|
||||||
"deEeEI": "Rekisteröi",
|
"deEeEI": "Rekisteröi",
|
||||||
"djLctd": "Amount in sats",
|
"djLctd": "Määrä satseissa",
|
||||||
"djNL6D": "Vain luku",
|
"djNL6D": "Vain luku",
|
||||||
"dmsiLv": "{site} kehittäjille on määritetty oletusarvoinen Zap Poolin jako {n} , voit poistaa sen käytöstä milloin tahansa osoitteessa {link}.",
|
"dmsiLv": "{site} kehittäjille on määritetty oletusarvoinen Zap Poolin jako {n} , voit poistaa sen käytöstä milloin tahansa osoitteessa {link}.",
|
||||||
"e61Jf3": "Tulossa pian",
|
"e61Jf3": "Tulossa pian",
|
||||||
@ -434,7 +434,7 @@
|
|||||||
"hniz8Z": "täällä",
|
"hniz8Z": "täällä",
|
||||||
"hvFRBo": "Vuorovaikutus",
|
"hvFRBo": "Vuorovaikutus",
|
||||||
"i/dBAR": "Zap-pooli",
|
"i/dBAR": "Zap-pooli",
|
||||||
"i5gBFz": "Your sent and received payments will show up here.",
|
"i5gBFz": "Lähetetyt ja vastaanotetut maksut näkyvät täällä.",
|
||||||
"iCqGww": "Reaktioita ({n})",
|
"iCqGww": "Reaktioita ({n})",
|
||||||
"iEoXYx": "DeepL käännökset",
|
"iEoXYx": "DeepL käännökset",
|
||||||
"iGT1eE": "Estä väärennettyjä tilejä jäljittelemästä sinua",
|
"iGT1eE": "Estä väärennettyjä tilejä jäljittelemästä sinua",
|
||||||
@ -443,7 +443,7 @@
|
|||||||
"iXPL0Z": "Ei voi kirjautua yksityisavaimella epäturvallisella yhteydellä, käytä Nostr-avainhallintaohjelmalaajennusta",
|
"iXPL0Z": "Ei voi kirjautua yksityisavaimella epäturvallisella yhteydellä, käytä Nostr-avainhallintaohjelmalaajennusta",
|
||||||
"iYc3Ld": "Maksut",
|
"iYc3Ld": "Maksut",
|
||||||
"ieGrWo": "Seuraa",
|
"ieGrWo": "Seuraa",
|
||||||
"ipHVx5": "Generate Invoice",
|
"ipHVx5": "Luo lasku",
|
||||||
"itPgxd": "Profiili",
|
"itPgxd": "Profiili",
|
||||||
"izWS4J": "Lopeta seuraaminen",
|
"izWS4J": "Lopeta seuraaminen",
|
||||||
"j9xbzF": "Jo varmistettu",
|
"j9xbzF": "Jo varmistettu",
|
||||||
@ -498,7 +498,7 @@
|
|||||||
"pI+77w": "Ladattavat varmuuskopiot Snort-välittäjältä",
|
"pI+77w": "Ladattavat varmuuskopiot Snort-välittäjältä",
|
||||||
"pRess9": "ZapPooli",
|
"pRess9": "ZapPooli",
|
||||||
"puLNUJ": "Kiinnitä",
|
"puLNUJ": "Kiinnitä",
|
||||||
"pukxg/": "Payments",
|
"pukxg/": "Maksut",
|
||||||
"pzTOmv": "Seuraajat",
|
"pzTOmv": "Seuraajat",
|
||||||
"qD9EUF": "Sähköposti-silta Snort nostr-osoitteellesi",
|
"qD9EUF": "Sähköposti-silta Snort nostr-osoitteellesi",
|
||||||
"qDwvZ4": "Tuntematon virhe",
|
"qDwvZ4": "Tuntematon virhe",
|
||||||
@ -529,7 +529,7 @@
|
|||||||
"tOdNiY": "Tumma",
|
"tOdNiY": "Tumma",
|
||||||
"th5lxp": "Lähetä viesti osajoukolle kirjoitusvälittäjiäsi",
|
"th5lxp": "Lähetä viesti osajoukolle kirjoitusvälittäjiäsi",
|
||||||
"thnRpU": "NIP-05-varmennuksen hankkiminen voi auttaa:",
|
"thnRpU": "NIP-05-varmennuksen hankkiminen voi auttaa:",
|
||||||
"tj6kdX": "{sign} {amount} sats",
|
"tj6kdX": "{sign} {amount} satsia",
|
||||||
"tjpYlr": "Välittäjämittarit",
|
"tjpYlr": "Välittäjämittarit",
|
||||||
"ttxS0b": "Tukijamerkki",
|
"ttxS0b": "Tukijamerkki",
|
||||||
"u+LyXc": "Vuorovaikutukset",
|
"u+LyXc": "Vuorovaikutukset",
|
||||||
|
@ -51,7 +51,7 @@ export default class SocialGraph {
|
|||||||
if (event.kind !== 3) {
|
if (event.kind !== 3) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setTimeout(() => {
|
queueMicrotask(() => {
|
||||||
try {
|
try {
|
||||||
const author = ID(event.pubkey);
|
const author = ID(event.pubkey);
|
||||||
const timestamp = event.created_at;
|
const timestamp = event.created_at;
|
||||||
@ -116,15 +116,6 @@ export default class SocialGraph {
|
|||||||
if (!this.usersByFollowDistance.has(distance)) {
|
if (!this.usersByFollowDistance.has(distance)) {
|
||||||
this.usersByFollowDistance.set(distance, new Set());
|
this.usersByFollowDistance.set(distance, new Set());
|
||||||
}
|
}
|
||||||
if (distance <= 2) {
|
|
||||||
/*
|
|
||||||
let unsub;
|
|
||||||
// get also profile events for profile search indexing
|
|
||||||
// eslint-disable-next-line prefer-const
|
|
||||||
unsub = PubSub.subscribe({ authors: [STR(user)], kinds: [0] }, () => unsub?.(), true);
|
|
||||||
// TODO subscribe once param?
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
this.usersByFollowDistance.get(distance)?.add(user);
|
this.usersByFollowDistance.get(distance)?.add(user);
|
||||||
// remove from higher distances
|
// remove from higher distances
|
||||||
for (const d of this.usersByFollowDistance.keys()) {
|
for (const d of this.usersByFollowDistance.keys()) {
|
||||||
@ -166,13 +157,6 @@ export default class SocialGraph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.followedByUser.get(follower)?.add(followedUser);
|
this.followedByUser.get(follower)?.add(followedUser);
|
||||||
if (this.followedByUser.get(this.root)?.has(follower)) {
|
|
||||||
/*
|
|
||||||
setTimeout(() => {
|
|
||||||
PubSub.subscribe({ authors: [STR(followedUser)], kinds: [0, 3] }, undefined, true);
|
|
||||||
}, 0);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
removeFollower(unfollowedUser: UID, follower: UID) {
|
removeFollower(unfollowedUser: UID, follower: UID) {
|
||||||
@ -236,7 +220,6 @@ export default class SocialGraph {
|
|||||||
if (includeSelf) {
|
if (includeSelf) {
|
||||||
set.add(user);
|
set.add(user);
|
||||||
}
|
}
|
||||||
//return PubSub.subscribe({ kinds: [3], authors: [user] }, callback);
|
|
||||||
return set;
|
return set;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,7 +229,6 @@ export default class SocialGraph {
|
|||||||
for (const id of this.followersByUser.get(userId) || []) {
|
for (const id of this.followersByUser.get(userId) || []) {
|
||||||
set.add(STR(id));
|
set.add(STR(id));
|
||||||
}
|
}
|
||||||
//return PubSub.subscribe({ kinds: [3], '#p': [address] }, callback); // TODO this doesn't fire when a user is unfollowed
|
|
||||||
return set;
|
return set;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user