forked from Kieran/snort
Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
8a5a089b4d
@ -1,5 +1,7 @@
|
||||
import React from "react";
|
||||
|
||||
import { trackEvent } from "@/Utils";
|
||||
|
||||
interface ErrorBoundaryState {
|
||||
hasError: boolean;
|
||||
errorMessage?: string;
|
||||
@ -21,6 +23,7 @@ export default class ErrorBoundary extends React.Component<ErrorBoundaryProps, E
|
||||
|
||||
componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
|
||||
console.error("Caught an error:", error, errorInfo);
|
||||
trackEvent("error", { error: error.message, errorInfo: JSON.stringify(errorInfo) });
|
||||
}
|
||||
|
||||
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 {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@ -86,17 +77,6 @@
|
||||
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 {
|
||||
background-color: unset !important;
|
||||
box-shadow: unset !important;
|
||||
|
@ -5,12 +5,10 @@ import { EventBuilder, EventKind, NostrLink, NostrPrefix, TaggedNostrEvent, tryP
|
||||
import classNames from "classnames";
|
||||
import { ClipboardEventHandler, DragEvent, useEffect } from "react";
|
||||
import { FormattedMessage, useIntl } from "react-intl";
|
||||
import { TagsInput } from "react-tag-input-component";
|
||||
|
||||
import AsyncButton from "@/Components/Button/AsyncButton";
|
||||
import { AsyncIcon } from "@/Components/Button/AsyncIcon";
|
||||
import CloseButton from "@/Components/Button/CloseButton";
|
||||
import { TrendingHashTagsLine } from "@/Components/Event/Create/TrendingHashTagsLine";
|
||||
import { sendEventToRelays } from "@/Components/Event/Create/util";
|
||||
import Note from "@/Components/Event/EventComponent";
|
||||
import Icon from "@/Components/Icons/Icon";
|
||||
@ -22,7 +20,7 @@ import ProfileImage from "@/Components/User/ProfileImage";
|
||||
import useEventPublisher from "@/Hooks/useEventPublisher";
|
||||
import useLogin from "@/Hooks/useLogin";
|
||||
import { useNoteCreator } from "@/State/NoteCreator";
|
||||
import { appendDedupe, openFile, trackEvent } from "@/Utils";
|
||||
import { openFile, trackEvent } from "@/Utils";
|
||||
import useFileUpload from "@/Utils/Upload";
|
||||
import { GetPowWorker } from "@/Utils/wasm";
|
||||
import { ZapTarget } from "@/Utils/Zapper";
|
||||
@ -636,7 +634,6 @@ export function NoteCreator() {
|
||||
onDragLeave={handleDragLeave}
|
||||
onDrop={handleDrop}
|
||||
autoFocus
|
||||
className={classNames("textarea", { "textarea--focused": note.active })}
|
||||
onChange={c => onChange(c)}
|
||||
value={note.note}
|
||||
onFocus={() => note.update(v => (v.active = true))}
|
||||
@ -648,23 +645,6 @@ export function NoteCreator() {
|
||||
/>
|
||||
{renderPollOptions()}
|
||||
</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} />}
|
||||
|
@ -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) {
|
||||
return;
|
||||
}
|
||||
setTimeout(() => {
|
||||
queueMicrotask(() => {
|
||||
const existing = profileTimestamps.get(ev.pubkey);
|
||||
if (existing) {
|
||||
if (existing > ev.created_at) {
|
||||
@ -42,7 +42,7 @@ export const addEventToFuzzySearch = ev => {
|
||||
};
|
||||
|
||||
export const addCachedMetadataToFuzzySearch = (profile: CachedMetadata) => {
|
||||
setTimeout(() => {
|
||||
queueMicrotask(() => {
|
||||
const existing = profileTimestamps.get(profile.pubkey);
|
||||
if (existing) {
|
||||
if (existing > profile.created) {
|
||||
|
@ -56,24 +56,26 @@ export default function Index() {
|
||||
const isStalker = !!stalker;
|
||||
|
||||
return (
|
||||
<div className="flex justify-center">
|
||||
<div className="w-full max-w-screen-xl">
|
||||
<div className="flex flex-row">
|
||||
<NavSidebar />
|
||||
<div className="flex flex-1 flex-col pb-footer-height md:pb-0 w-full md:w-1/3">
|
||||
{!shouldHideHeader && <Header />}
|
||||
<ErrorBoundary>
|
||||
<Outlet />
|
||||
</ErrorBoundary>
|
||||
<ErrorBoundary>
|
||||
<div className="flex justify-center">
|
||||
<div className="w-full max-w-screen-xl">
|
||||
<div className="flex flex-row">
|
||||
<NavSidebar />
|
||||
<div className="flex flex-1 flex-col pb-footer-height md:pb-0 w-full md:w-1/3">
|
||||
{!shouldHideHeader && <Header />}
|
||||
<ErrorBoundary>
|
||||
<Outlet />
|
||||
</ErrorBoundary>
|
||||
</div>
|
||||
<RightColumn />
|
||||
</div>
|
||||
<RightColumn />
|
||||
<Toaster />
|
||||
</div>
|
||||
<Toaster />
|
||||
<LoginUnlock />
|
||||
{isStalker && <StalkerModal id={id} />}
|
||||
{!shouldHideFooter && <Footer />}
|
||||
</div>
|
||||
<LoginUnlock />
|
||||
{isStalker && <StalkerModal id={id} />}
|
||||
{!shouldHideFooter && <Footer />}
|
||||
</div>
|
||||
</ErrorBoundary>
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -537,7 +537,11 @@ export function trackEvent(
|
||||
props?: Record<string, string | boolean>,
|
||||
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", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
|
@ -24,7 +24,7 @@
|
||||
"0Azlrb": "Hallitse",
|
||||
"0BUTMv": "Etsi...",
|
||||
"0HFX0T": "Käytä tarkkaa sijaintia",
|
||||
"0MndVW": "Generic LNDHub wallet (BTCPayServer / Alby / LNBits)",
|
||||
"0MndVW": "Tavallinen LNDHub-lompakko (BTCPayServer / Alby / LNBits)",
|
||||
"0jOEtS": "Virheellinen LNURL",
|
||||
"0mch2Y": "nimi sisältää sallimattomia merkkejä",
|
||||
"0siT4z": "Politiikka",
|
||||
@ -151,8 +151,8 @@
|
||||
"DrZqav": "Tietoja on oltava vähemmän kuin {limit} merkkiä",
|
||||
"DtYelJ": "Siirto",
|
||||
"Dx4ey3": "Vaihda kaikki",
|
||||
"E5ZIPD": "<big>{amount}</big> <small>sats</small>",
|
||||
"EHqHsu": "Invoice / Lightning Address",
|
||||
"E5ZIPD": "<big>{amount}</big> <small>satsia</small>",
|
||||
"EHqHsu": "Lasku / Lightning-osoite",
|
||||
"EJbFi7": "Etsi muistiinpanoja",
|
||||
"ELbg9p": "Datantoimittajat",
|
||||
"EQKRE4": "Näytä merkit profiilisivuilla",
|
||||
@ -230,7 +230,7 @@
|
||||
"LR1XjT": "Liian lyhyt tappi",
|
||||
"LXxsbk": "Nimetön",
|
||||
"LgbKvU": "Kommentoi",
|
||||
"LhLvRx": "Name must be between 8 and 15 characters",
|
||||
"LhLvRx": "Nimen tulee olla 8-15 merkkiä",
|
||||
"LmdPXO": "Nostr-osoitetta ei voida tarkistaa",
|
||||
"Lu5/Bj": "Avaa Zapstrissa",
|
||||
"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",
|
||||
"PCSt5T": "Asetukset",
|
||||
"PJeJFc": "Yhteenveto",
|
||||
"PXQ0z0": "Receiving to <b>{wallet}</b>",
|
||||
"PXQ0z0": "Vastaanotto osoitteeseen <b>{wallet}</b>",
|
||||
"PamNxw": "Tuntematon tiedostotunniste: {name}",
|
||||
"Pe0ogR": "Teema",
|
||||
"PrsIg7": "Reaktiot näytetään jokaisella sivulla, jos poistettu käytöstä reaktioita ei näytetä",
|
||||
@ -307,7 +307,7 @@
|
||||
"U1aPPi": "Lopeta kuunteleminen",
|
||||
"UDYlxu": "Odottavat tilaukset",
|
||||
"UJTWqI": "Poista releistäni",
|
||||
"ULXFfP": "Receive",
|
||||
"ULXFfP": "Vastaanota",
|
||||
"UNjfWJ": "Tarkista kaikki releiltä saadut tapahtuman allekirjoitukset",
|
||||
"UT7Nkj": "Uusi keskustelu",
|
||||
"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",
|
||||
"XECMfW": "Lähetä käyttötietoja",
|
||||
"XICsE8": "Tiedostojen isäntäpalvelut",
|
||||
"XPB8VV": "Alby wallet connection",
|
||||
"XPB8VV": "Alby-lompakon yhteys",
|
||||
"XQiFEl": "Seuraa välittäjän tila",
|
||||
"XXm7jJ": "Suositut tunnisteet",
|
||||
"XgWvGA": "Reaktiot",
|
||||
"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.",
|
||||
"XrSk2j": "Lunasta",
|
||||
"Y7FG5M": "Image not available",
|
||||
"Y7FG5M": "Kuva ei ole saatavilla",
|
||||
"YDURw6": "Palvelun URL",
|
||||
"YR2I9M": "Ei avaimia, ei {app}, Avaimia ei voi palauttaa, ellet tee niistä varmuuskopiota. Se vie vain minuutin.",
|
||||
"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",
|
||||
"ZKORll": "Aktivoi nyt",
|
||||
"ZLmyG9": "Avustajat",
|
||||
@ -355,8 +355,8 @@
|
||||
"a7TDNm": "Viestit striimautuvat reaaliajassa yleiseen ja viestit-välilehteen",
|
||||
"aHje0o": "Nimi tai nimimerkki",
|
||||
"aMaLBK": "Tuetut laajennukset",
|
||||
"aRex7h": "Paid {amount} sats, fee {fee} sats",
|
||||
"aSGz4J": "Connect to your own LND node with Lightning Node Connect",
|
||||
"aRex7h": "Maksettu {amount} satsia, maksu {fee} satsia",
|
||||
"aSGz4J": "Yhdistä omaan LND-solmuun Lightning Node Connectin avulla",
|
||||
"aWpBzj": "Näytä lisää",
|
||||
"b12Goz": "Mnemonic-lause",
|
||||
"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}",
|
||||
"c3g2hL": "Lähetä uudelleen",
|
||||
"cFbU1B": "Käytätkö Albya? Mene {link} saadaksesi NWC-asetuksesi!",
|
||||
"cG/bKQ": "Native nostr wallet connection",
|
||||
"cG/bKQ": "Natiivi nostr-lompakkoyhteys",
|
||||
"cHCwbF": "Valokuvaus",
|
||||
"cPIKU2": "Seuraa",
|
||||
"cQfLWb": "URL..",
|
||||
@ -389,7 +389,7 @@
|
||||
"dOQCL8": "Näyttönimi",
|
||||
"ddd3JX": "Suosittuja tunnisteita",
|
||||
"deEeEI": "Rekisteröi",
|
||||
"djLctd": "Amount in sats",
|
||||
"djLctd": "Määrä satseissa",
|
||||
"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}.",
|
||||
"e61Jf3": "Tulossa pian",
|
||||
@ -434,7 +434,7 @@
|
||||
"hniz8Z": "täällä",
|
||||
"hvFRBo": "Vuorovaikutus",
|
||||
"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})",
|
||||
"iEoXYx": "DeepL käännökset",
|
||||
"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",
|
||||
"iYc3Ld": "Maksut",
|
||||
"ieGrWo": "Seuraa",
|
||||
"ipHVx5": "Generate Invoice",
|
||||
"ipHVx5": "Luo lasku",
|
||||
"itPgxd": "Profiili",
|
||||
"izWS4J": "Lopeta seuraaminen",
|
||||
"j9xbzF": "Jo varmistettu",
|
||||
@ -498,7 +498,7 @@
|
||||
"pI+77w": "Ladattavat varmuuskopiot Snort-välittäjältä",
|
||||
"pRess9": "ZapPooli",
|
||||
"puLNUJ": "Kiinnitä",
|
||||
"pukxg/": "Payments",
|
||||
"pukxg/": "Maksut",
|
||||
"pzTOmv": "Seuraajat",
|
||||
"qD9EUF": "Sähköposti-silta Snort nostr-osoitteellesi",
|
||||
"qDwvZ4": "Tuntematon virhe",
|
||||
@ -529,7 +529,7 @@
|
||||
"tOdNiY": "Tumma",
|
||||
"th5lxp": "Lähetä viesti osajoukolle kirjoitusvälittäjiäsi",
|
||||
"thnRpU": "NIP-05-varmennuksen hankkiminen voi auttaa:",
|
||||
"tj6kdX": "{sign} {amount} sats",
|
||||
"tj6kdX": "{sign} {amount} satsia",
|
||||
"tjpYlr": "Välittäjämittarit",
|
||||
"ttxS0b": "Tukijamerkki",
|
||||
"u+LyXc": "Vuorovaikutukset",
|
||||
|
@ -51,7 +51,7 @@ export default class SocialGraph {
|
||||
if (event.kind !== 3) {
|
||||
return;
|
||||
}
|
||||
setTimeout(() => {
|
||||
queueMicrotask(() => {
|
||||
try {
|
||||
const author = ID(event.pubkey);
|
||||
const timestamp = event.created_at;
|
||||
@ -116,15 +116,6 @@ export default class SocialGraph {
|
||||
if (!this.usersByFollowDistance.has(distance)) {
|
||||
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);
|
||||
// remove from higher distances
|
||||
for (const d of this.usersByFollowDistance.keys()) {
|
||||
@ -166,13 +157,6 @@ export default class SocialGraph {
|
||||
}
|
||||
|
||||
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) {
|
||||
@ -236,7 +220,6 @@ export default class SocialGraph {
|
||||
if (includeSelf) {
|
||||
set.add(user);
|
||||
}
|
||||
//return PubSub.subscribe({ kinds: [3], authors: [user] }, callback);
|
||||
return set;
|
||||
}
|
||||
|
||||
@ -246,7 +229,6 @@ export default class SocialGraph {
|
||||
for (const id of this.followersByUser.get(userId) || []) {
|
||||
set.add(STR(id));
|
||||
}
|
||||
//return PubSub.subscribe({ kinds: [3], '#p': [address] }, callback); // TODO this doesn't fire when a user is unfollowed
|
||||
return set;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user