chore: cleanup / yarn sdks

This commit is contained in:
Kieran 2023-11-20 19:16:47 +00:00
parent e8bcba129e
commit 7c8fff97ce
Signed by: Kieran
GPG Key ID: DE71CEB3925BE941
73 changed files with 554 additions and 362 deletions

View File

@ -15,5 +15,5 @@
"typescript.tsdk": ".yarn/sdks/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true,
"eslint.nodePath": ".yarn/sdks",
"prettier.prettierPath": ".yarn/sdks/prettier/index.js"
"prettier.prettierPath": ".yarn/sdks/prettier/index.cjs"
}

View File

@ -0,0 +1,20 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire} = require(`module`);
const {resolve} = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint/use-at-your-own-risk
require(absPnpApiPath).setup();
}
}
// Defer to the real eslint/use-at-your-own-risk your application uses
module.exports = absRequire(`eslint/use-at-your-own-risk`);

View File

@ -1,6 +1,14 @@
{
"name": "eslint",
"version": "8.48.0-sdk",
"version": "8.53.0-sdk",
"main": "./lib/api.js",
"type": "commonjs"
"type": "commonjs",
"bin": {
"eslint": "./bin/eslint.js"
},
"exports": {
"./package.json": "./package.json",
".": "./lib/api.js",
"./use-at-your-own-risk": "./lib/unsupported-api.js"
}
}

20
.yarn/sdks/prettier/bin/prettier.cjs vendored Executable file
View File

@ -0,0 +1,20 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire} = require(`module`);
const {resolve} = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require prettier/bin/prettier.cjs
require(absPnpApiPath).setup();
}
}
// Defer to the real prettier/bin/prettier.cjs your application uses
module.exports = absRequire(`prettier/bin/prettier.cjs`);

0
.yarn/sdks/prettier/index.js → .yarn/sdks/prettier/index.cjs vendored Executable file → Normal file
View File

View File

@ -1,6 +1,7 @@
{
"name": "prettier",
"version": "3.0.3-sdk",
"main": "./index.js",
"type": "commonjs"
"version": "3.1.0-sdk",
"main": "./index.cjs",
"type": "commonjs",
"bin": "./bin/prettier.cjs"
}

View File

@ -11,10 +11,10 @@ const absRequire = createRequire(absPnpApiPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require typescript/lib/typescript.js
// Setup the environment to be able to require typescript
require(absPnpApiPath).setup();
}
}
// Defer to the real typescript/lib/typescript.js your application uses
module.exports = absRequire(`typescript/lib/typescript.js`);
// Defer to the real typescript your application uses
module.exports = absRequire(`typescript`);

View File

@ -2,5 +2,9 @@
"name": "typescript",
"version": "5.2.2-sdk",
"main": "./lib/typescript.js",
"type": "commonjs"
"type": "commonjs",
"bin": {
"tsc": "./bin/tsc",
"tsserver": "./bin/tsserver"
}
}

View File

@ -6,9 +6,9 @@ module.exports = {
"formatjs/enforce-id": [
"error",
{
"idInterpolationPattern": "[sha512:contenthash:base64:6]"
}
]
idInterpolationPattern: "[sha512:contenthash:base64:6]",
},
],
},
root: true,
ignorePatterns: ["build/", "*.test.ts", "*.js"],

View File

@ -5,7 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<meta name="theme-color" content="#000000" />
<meta name="description" content="Feature packed nostr client" />
<meta name="keywords" content="nostr snort fast decentralized social media censorship resistant open source software" />
<meta
name="keywords"
content="nostr snort fast decentralized social media censorship resistant open source software" />
<link rel="preconnect" href="https://imgproxy.snort.social" />
<link rel="apple-touch-icon" href="" />
<link rel="manifest" href="/manifest.json" />

View File

@ -107,7 +107,8 @@ export default function CashuNuts({ token }: { token: string }) {
</defs>
</svg>
<FormattedMessage
defaultMessage="<h1>{n}</h1> Cashu sats" id="6/SF6e"
defaultMessage="<h1>{n}</h1> Cashu sats"
id="6/SF6e"
values={{
h1: c => <h1>{c}</h1>,
n: <FormattedNumber value={amount} />,
@ -116,7 +117,8 @@ export default function CashuNuts({ token }: { token: string }) {
</div>
<small className="xs w-max">
<FormattedMessage
defaultMessage="<b>Mint:</b> {url}" id="zwb6LR"
defaultMessage="<b>Mint:</b> {url}"
id="zwb6LR"
values={{
b: c => <b>{c}</b>,
url: new URL(cashu.token[0].mint).hostname,

View File

@ -42,7 +42,8 @@ export default function PubkeyList({ ev, className }: { ev: NostrEvent; classNam
Toastore.push({
element: (
<FormattedMessage
defaultMessage="Sent {n} sats to {name}" id="Ig9/a1"
defaultMessage="Sent {n} sats to {name}"
id="Ig9/a1"
values={{
n: amtSend,
name: getDisplayName(profile, pk),
@ -70,7 +71,8 @@ export default function PubkeyList({ ev, className }: { ev: NostrEvent; classNam
<>
<AsyncButton className="mr5 secondary" onClick={() => zapAll()}>
<FormattedMessage
defaultMessage="Zap all {n} sats" id="IVbtTS"
defaultMessage="Zap all {n} sats"
id="IVbtTS"
values={{
n: <FormattedNumber value={login.appData.item.preferences.defaultZapAmount * ids.length} />,
}}

View File

@ -93,7 +93,8 @@ export function LongFormText(props: LongFormTextProps) {
<div className="flex g8">
<div>
<FormattedMessage
defaultMessage="{n} mins to read" id="zm6qS1"
defaultMessage="{n} mins to read"
id="zm6qS1"
values={{
n: <FormattedNumber value={readTime().mins} />,
}}

View File

@ -26,7 +26,10 @@ export function NostrFileElement({ ev }: { ev: NostrEvent }) {
if (u && m) {
return (
<Reveal message={<FormattedMessage defaultMessage="Click to load content from {link}" id="lsNFM1" values={{ link: u }} />}>
<Reveal
message={
<FormattedMessage defaultMessage="Click to load content from {link}" id="lsNFM1" values={{ link: u }} />
}>
<MediaElement mime={m} url={u} sha256={x} magnet={magnet} blurHash={blurHash} />
</Reveal>
);

View File

@ -91,7 +91,8 @@ export function NoteBroadcaster({
onClick={() => retryPublish(r)}
className="p4 br-compact flex items-center secondary"
title={formatMessage({
defaultMessage: "Retry publishing", id: '9kSari',
defaultMessage: "Retry publishing",
id: "9kSari",
})}>
<Icon name="refresh-ccw-01" />
</AsyncButton>
@ -99,7 +100,8 @@ export function NoteBroadcaster({
onClick={() => removeRelayFromResult(r)}
className="p4 br-compact flex items-center secondary"
title={formatMessage({
defaultMessage: "Remove from my relays", id: 'UJTWqI',
defaultMessage: "Remove from my relays",
id: "UJTWqI",
})}>
<Icon name="trash-01" className="trash-icon" />
</AsyncButton>

View File

@ -52,7 +52,8 @@ export function NoteCreator() {
throw new Error(
formatMessage(
{
defaultMessage: "Failed to parse zap split: {input}", id: 'sZQzjQ',
defaultMessage: "Failed to parse zap split: {input}",
id: "sZQzjQ",
},
{
input: s.value,
@ -69,7 +70,8 @@ export function NoteCreator() {
throw new Error(
formatMessage(
{
defaultMessage: "Failed to parse zap split: {input}", id: 'sZQzjQ',
defaultMessage: "Failed to parse zap split: {input}",
id: "sZQzjQ",
},
{
input: s.value,
@ -81,7 +83,8 @@ export function NoteCreator() {
throw new Error(
formatMessage(
{
defaultMessage: "Invalid zap split: {input}", id: '8Y6bZQ',
defaultMessage: "Invalid zap split: {input}",
id: "8Y6bZQ",
},
{
input: s.value,
@ -380,7 +383,7 @@ export function NoteCreator() {
v => (v.zapSplits = arr.map((vv, ii) => (ii === i ? { ...vv, value: e.target.value } : vv))),
)
}
placeholder={formatMessage({ defaultMessage: "npub / nprofile / nostr address", id: 'WvGmZT' })}
placeholder={formatMessage({ defaultMessage: "npub / nprofile / nostr address", id: "WvGmZT" })}
/>
</div>
<div className="flex flex-col f-1 g4">
@ -419,14 +422,20 @@ export function NoteCreator() {
</button>
</div>
<span className="warning">
<FormattedMessage defaultMessage="Not all clients support this, you may still receive some zaps as if zap splits was not configured" id="6bgpn+" />
<FormattedMessage
defaultMessage="Not all clients support this, you may still receive some zaps as if zap splits was not configured"
id="6bgpn+"
/>
</span>
</div>
<div className="flex flex-col g8">
<h4>
<FormattedMessage defaultMessage="Sensitive Content" id="bQdA2k" />
</h4>
<FormattedMessage defaultMessage="Users must accept the content warning to show the content of your note." id="UUPFlt" />
<FormattedMessage
defaultMessage="Users must accept the content warning to show the content of your note."
id="UUPFlt"
/>
<input
className="w-max"
type="text"
@ -435,7 +444,8 @@ export function NoteCreator() {
maxLength={50}
minLength={1}
placeholder={formatMessage({
defaultMessage: "Reason", id: 'AkCxS/',
defaultMessage: "Reason",
id: "AkCxS/",
})}
/>
<span className="warning">
@ -486,7 +496,11 @@ export function NoteCreator() {
<FormattedMessage defaultMessage="Cancel" id="47FYwb" />
</button>
<AsyncButton onClick={onSubmit} className="primary">
{note.replyTo ? <FormattedMessage defaultMessage="Reply" id="9HU8vw" /> : <FormattedMessage defaultMessage="Send" id="9WRlF4" />}
{note.replyTo ? (
<FormattedMessage defaultMessage="Reply" id="9HU8vw" />
) : (
<FormattedMessage defaultMessage="Send" id="9WRlF4" />
)}
</AsyncButton>
</div>
</div>
@ -597,7 +611,8 @@ export function NoteCreator() {
value={note.hashTags}
onChange={e => note.update(s => (s.hashTags = e))}
placeHolder={formatMessage({
defaultMessage: "Add up to 4 hashtags", id: 'AIgmDy',
defaultMessage: "Add up to 4 hashtags",
id: "AIgmDy",
})}
separators={["Enter", ","]}
/>

View File

@ -187,7 +187,11 @@ export default function NoteFooter(props: NoteFooterProps) {
const pow = findTag(ev, "nonce") ? countLeadingZeros(ev.id) : undefined;
if (pow) {
return (
<AsyncFooterIcon title={formatMessage({ defaultMessage: "Proof of Work", id: 'grQ+mI' })} iconName="diamond" value={pow} />
<AsyncFooterIcon
title={formatMessage({ defaultMessage: "Proof of Work", id: "grQ+mI" })}
iconName="diamond"
value={pow}
/>
);
}
}
@ -199,7 +203,7 @@ export default function NoteFooter(props: NoteFooterProps) {
<AsyncFooterIcon
className={didZap ? "reacted text-nostr-orange" : "hover:text-nostr-orange"}
{...longPress()}
title={formatMessage({ defaultMessage: "Zap", id: 'fBI91o' })}
title={formatMessage({ defaultMessage: "Zap", id: "fBI91o" })}
iconName={canFastZap ? "zapFast" : "zap"}
value={zapTotal}
onClick={e => fastZap(e)}
@ -217,7 +221,7 @@ export default function NoteFooter(props: NoteFooterProps) {
<AsyncFooterIcon
className={hasReposted() ? "reacted text-nostr-blue" : "hover:text-nostr-blue"}
iconName="repeat"
title={formatMessage({ defaultMessage: "Repost", id: 'JeoS4y' })}
title={formatMessage({ defaultMessage: "Repost", id: "JeoS4y" })}
value={reposts.length}
/>
}
@ -258,7 +262,7 @@ export default function NoteFooter(props: NoteFooterProps) {
<AsyncFooterIcon
className={reacted ? "reacted text-nostr-red" : "hover:text-nostr-red"}
iconName={reacted ? "heart-solid" : "heart"}
title={formatMessage({ defaultMessage: "Like", id: 'qtWLmt' })}
title={formatMessage({ defaultMessage: "Like", id: "qtWLmt" })}
value={positive.length}
onClick={async () => {
if (readonly) return;
@ -274,7 +278,7 @@ export default function NoteFooter(props: NoteFooterProps) {
<AsyncFooterIcon
className={note.show ? "reacted text-nostr-purple" : "hover:text-nostr-purple"}
iconName="reply"
title={formatMessage({ defaultMessage: "Reply", id: '9HU8vw' })}
title={formatMessage({ defaultMessage: "Reply", id: "9HU8vw" })}
value={props.replies ?? 0}
onClick={async () => handleReplyButtonClick()}
/>

View File

@ -118,7 +118,8 @@ export function NoteInner(props: NoteProps) {
message={
<>
<FormattedMessage
defaultMessage="The author has marked this note as a <i>sensitive topic</i>" id="StKzTE"
defaultMessage="The author has marked this note as a <i>sensitive topic</i>"
id="StKzTE"
values={{
i: c => <i>{c}</i>,
}}
@ -127,7 +128,8 @@ export function NoteInner(props: NoteProps) {
<>
&nbsp;
<FormattedMessage
defaultMessage="Reason: <i>{reason}</i>" id="6OSOXl"
defaultMessage="Reason: <i>{reason}</i>"
id="6OSOXl"
values={{
i: c => <i>{c}</i>,
reason: contentWarning[1],

View File

@ -79,7 +79,8 @@ export default function NoteReaction(props: NoteReactionProps) {
<div className="flex g4">
<Icon name="repeat" size={18} />
<FormattedMessage
defaultMessage="{name} reposted" id="+xliwN"
defaultMessage="{name} reposted"
id="+xliwN"
values={{
name: getDisplayName(profile, ev.pubkey),
}}

View File

@ -51,7 +51,8 @@ export default function Poll(props: PollProps) {
throw new Error(
formatMessage(
{
defaultMessage: "Can't vote with {amount} sats, please set a different default zap amount", id: 'NepkXH',
defaultMessage: "Can't vote with {amount} sats, please set a different default zap amount",
id: "NepkXH",
},
{
amount,
@ -75,7 +76,8 @@ export default function Poll(props: PollProps) {
if (!svc.canZap) {
throw new Error(
formatMessage({
defaultMessage: "Can't vote because LNURL service does not support zaps", id: 'fOksnD',
defaultMessage: "Can't vote because LNURL service does not support zaps",
id: "fOksnD",
}),
);
}
@ -92,7 +94,8 @@ export default function Poll(props: PollProps) {
} else {
setError(
formatMessage({
defaultMessage: "Failed to send vote", id: 'g985Wp',
defaultMessage: "Failed to send vote",
id: "g985Wp",
}),
);
}
@ -115,7 +118,8 @@ export default function Poll(props: PollProps) {
<div className="flex justify-between p">
<small>
<FormattedMessage
defaultMessage="You are voting with {amount} sats" id="3qnJlS"
defaultMessage="You are voting with {amount} sats"
id="3qnJlS"
values={{
amount: formatShort(prefs.defaultZapAmount),
}}
@ -123,7 +127,8 @@ export default function Poll(props: PollProps) {
</small>
<button type="button" onClick={() => setTallyBy(s => (s !== "zaps" ? "zaps" : "pubkeys"))}>
<FormattedMessage
defaultMessage="Votes by {type}" id="xIcAOU"
defaultMessage="Votes by {type}"
id="xIcAOU"
values={{
type:
tallyBy === "zaps" ? (

View File

@ -105,7 +105,9 @@ const Reactions = ({ show, setShow, positive, negative, reposts, zaps }: Reactio
pubkey={z.anonZap ? "" : z.sender}
subHeader={<div title={z.content}>{z.content}</div>}
link={z.anonZap ? "" : undefined}
overrideUsername={z.anonZap ? formatMessage({ defaultMessage: "Anonymous", id: 'LXxsbk' }) : undefined}
overrideUsername={
z.anonZap ? formatMessage({ defaultMessage: "Anonymous", id: "LXxsbk" }) : undefined
}
/>
</div>
)

View File

@ -57,7 +57,8 @@ export default function RevealMedia(props: RevealMediaProps) {
<Reveal
message={
<FormattedMessage
defaultMessage="You don't follow this person, click here to load media from <i>{link}</i>, or update <a><i>your preferences</i></a> to always load media from everybody." id="HhcAVH"
defaultMessage="You don't follow this person, click here to load media from <i>{link}</i>, or update <a><i>your preferences</i></a> to always load media from everybody."
id="HhcAVH"
values={{
i: i => <i>{i}</i>,
a: a => <Link to="/settings/preferences">{a}</Link>,

View File

@ -303,11 +303,13 @@ export function Thread(props: { onBack?: () => void; disableSpotlight?: boolean
}
const parentText = formatMessage({
defaultMessage: "Parent", id: 'ADmfQT',
defaultMessage: "Parent",
id: "ADmfQT",
description: "Link to parent note in thread",
});
const backText = formatMessage({
defaultMessage: "Back", id: 'jfV8Wr',
defaultMessage: "Back",
id: "jfV8Wr",
description: "Navigate back button on threads view",
});

View File

@ -60,7 +60,7 @@ export const ZapsSummary = ({ zaps }: ZapsSummaryProps) => {
<ProfileImage
pubkey={anonZap ? "" : sender}
showFollowDistance={false}
overrideUsername={anonZap ? formatMessage({ defaultMessage: "Anonymous", id: 'LXxsbk' }) : undefined}
overrideUsername={anonZap ? formatMessage({ defaultMessage: "Anonymous", id: "LXxsbk" }) : undefined}
/>
)}
{restZaps.length > 0 ? (

View File

@ -39,7 +39,8 @@ export function TimelineRenderer(props: TimelineRendererProps) {
return <ProfileImage pubkey={p} showUsername={false} link={""} showFollowDistance={false} />;
})}
<FormattedMessage
defaultMessage="{n} new {n, plural, =1 {note} other {notes}}" id="3t3kok"
defaultMessage="{n} new {n, plural, =1 {note} other {notes}}"
id="3t3kok"
values={{ n: props.latest.length }}
/>
<Icon name="arrowUp" />
@ -52,7 +53,8 @@ export function TimelineRenderer(props: TimelineRendererProps) {
return <ProfileImage pubkey={p} showUsername={false} link={""} showFollowDistance={false} />;
})}
<FormattedMessage
defaultMessage="{n} new {n, plural, =1 {note} other {notes}}" id="3t3kok"
defaultMessage="{n} new {n, plural, =1 {note} other {notes}}"
id="3t3kok"
values={{ n: props.latest.length }}
/>
<Icon name="arrowUp" />

View File

@ -6,7 +6,8 @@ export default function ReservedAccount({ name = "", enableReserved = () => {},
<div>
<p className="success">
<FormattedMessage
defaultMessage="Username iris.to/<b>{name}</b> is reserved for you!" id="Zff6lu"
defaultMessage="Username iris.to/<b>{name}</b> is reserved for you!"
id="Zff6lu"
values={{ name, b: s => <b>{s}</b> }}
/>
</p>

View File

@ -29,7 +29,8 @@ export function PinPrompt({
if (pin.length < 4) {
setError(
formatMessage({
defaultMessage: "Pin too short", id: 'LR1XjT',
defaultMessage: "Pin too short",
id: "LR1XjT",
}),
);
return;
@ -43,7 +44,8 @@ export function PinPrompt({
if (e instanceof InvalidPinError) {
setError(
formatMessage({
defaultMessage: "Incorrect pin", id: 'qz9fty',
defaultMessage: "Incorrect pin",
id: "qz9fty",
}),
);
} else if (e instanceof Error) {
@ -143,7 +145,8 @@ export function LoginUnlock() {
subTitle={
<p>
<FormattedMessage
defaultMessage="Enter a pin to encrypt your private key, you must enter this pin every time you open {site}." id="SLZGPn"
defaultMessage="Enter a pin to encrypt your private key, you must enter this pin every time you open {site}."
id="SLZGPn"
values={{
site: CONFIG.appNameCapitalized,
}}

View File

@ -24,7 +24,8 @@ export const ProxyImg = (props: ProxyImgProps) => {
setBypass(true);
}}>
<FormattedMessage
defaultMessage="Failed to proxy image from {host}, click here to load directly" id="65BmHb"
defaultMessage="Failed to proxy image from {host}, click here to load directly"
id="65BmHb"
values={{
host: getUrlHostname(props.src),
}}

View File

@ -116,7 +116,7 @@ export default function SearchBox() {
<div className="search relative">
<input
type="text"
placeholder={formatMessage({ defaultMessage: "Search", id: 'xmcVZ0' })}
placeholder={formatMessage({ defaultMessage: "Search", id: "xmcVZ0" })}
className="w-max"
value={search}
onChange={handleChange}

View File

@ -368,7 +368,8 @@ function SendSatsZapTypeSelector({ zapType, setZapType }: { zapType: ZapType; se
<FormattedMessage defaultMessage="Zap Type" id="+aZY2h" />
</h3>
<div className="flex g8">
{!readonly && makeTab(ZapType.PublicZap, <FormattedMessage defaultMessage="Public" id="/PCavi" description="Public Zap" />)}
{!readonly &&
makeTab(ZapType.PublicZap, <FormattedMessage defaultMessage="Public" id="/PCavi" description="Public Zap" />)}
{/*makeTab(ZapType.PrivateZap, "Private")*/}
{makeTab(ZapType.AnonZap, <FormattedMessage defaultMessage="Anon" id="wWLwvh" description="Anonymous Zap" />)}
{makeTab(

View File

@ -55,7 +55,8 @@ export default function BadgeList({ badges }: { badges: TaggedNostrEvent[] }) {
<p>{description}</p>
<p>
<FormattedMessage
defaultMessage="By: {author}" id="RfhLwC"
defaultMessage="By: {author}"
id="RfhLwC"
values={{ author: <Username pubkey={pubkey} onLinkVisit={() => setShowModal(false)} /> }}
/>
</p>

View File

@ -1,103 +1,104 @@
import { defineMessages } from "react-intl";
export default defineMessages({
Cancel: { defaultMessage: "Cancel", id: '47FYwb' },
Reply: { defaultMessage: "Reply", id: '9HU8vw' },
Send: { defaultMessage: "Send", id: '9WRlF4' },
NotePlaceholder: { defaultMessage: "What's on your mind?", id: 'flnGvv' },
Back: { defaultMessage: "Back", id: 'cyR7Kh' },
Block: { defaultMessage: "Block", id: 'Up5U7K' },
Unblock: { defaultMessage: "Unblock", id: 'nDejmx' },
MuteCount: { defaultMessage: "{n} muted", id: 'VlJkSk' },
Mute: { defaultMessage: "Mute", id: 'x82IOl' },
MutedAuthor: { defaultMessage: "This author has been muted", id: 'ASRK0S' },
Others: { defaultMessage: ` & {n} {n, plural, =1 {other} other {others}}`, id: 'egib+2' },
Show: { defaultMessage: "Show", id: 'K7AkdL' },
Delete: { defaultMessage: "Delete", id: 'K3r6DQ' },
Deleted: { defaultMessage: "Deleted", id: 'KQvWvD' },
Unmute: { defaultMessage: "Unmute", id: 'W9355R' },
MuteAll: { defaultMessage: "Mute all", id: 'cWx9t8' },
BlockCount: { defaultMessage: "{n} blocked", id: 'nwZXeh' },
JustNow: { defaultMessage: "Just now", id: 'bxv59V' },
Follow: { defaultMessage: "Follow", id: 'ieGrWo' },
FollowAll: { defaultMessage: "Follow all", id: 'mKAr6h' },
Unfollow: { defaultMessage: "Unfollow", id: 'izWS4J' },
FollowerCount: { defaultMessage: "{n} followers", id: 'o7e+nJ' },
FollowingCount: { defaultMessage: "Follows {n}", id: '9SvQep' },
FollowsYou: { defaultMessage: "follows you", id: 'FmXUJg' },
Invoice: { defaultMessage: "Lightning Invoice", id: '9wO4wJ' },
PayInvoice: { defaultMessage: "Pay Invoice", id: 'lvlPhZ' },
Expired: { defaultMessage: "Expired", id: 'RahCRH' },
Pay: { defaultMessage: "Pay", id: 'lD3+8a' },
Loading: { defaultMessage: "Loading...", id: 'gjBiyj' },
Logout: { defaultMessage: "Logout", id: 'C81/uG' },
ShowMore: { defaultMessage: "Show more", id: 'aWpBzj' },
TranslateTo: { defaultMessage: "Translate to {lang}", id: 'Ebl/B2' },
TranslatedFrom: { defaultMessage: "Translated from {lang}", id: 'Cu/K85' },
TranslationFailed: { defaultMessage: "Translation failed", id: 'qmJ8kD' },
UnknownEventKind: { defaultMessage: "Unknown event kind: {kind}", id: 'KahimY' },
ConfirmDeletion: { defaultMessage: `Are you sure you want to delete {id}`, id: 'RhDAoS' },
ConfirmRepost: { defaultMessage: `Are you sure you want to repost: {id}`, id: '+D82kt' },
Reactions: { defaultMessage: "Reactions", id: 'XgWvGA' },
ReactionsCount: { defaultMessage: "Reactions ({n})", id: 'iCqGww' },
Share: { defaultMessage: "Share", id: 'OKhRC6' },
CopyID: { defaultMessage: "Copy ID", id: 'wtLjP6' },
CopyJSON: { defaultMessage: "Copy Event JSON", id: 'P61BTu' },
Dislike: { defaultMessage: "{n} Dislike", id: 'GspYR7' },
DislikeAction: { defaultMessage: "Dislike", id: '4OB335' },
Sats: { defaultMessage: `{n} {n, plural, =1 {sat} other {sats}}`, id: 'jA3OE/' },
Zapped: { defaultMessage: "zapped", id: 'B6+XJy' },
OthersZapped: { defaultMessage: `{n, plural, =0 {} =1 {zapped} other {zapped}}`, id: 'mKhgP9' },
Likes: { defaultMessage: "Likes ({n})", id: '6ewQqw' },
Zaps: { defaultMessage: "Zaps ({n})", id: 'JHEHCk' },
Dislikes: { defaultMessage: "Dislikes ({n})", id: '2k0Cv+' },
Reposts: { defaultMessage: "Reposts ({n})", id: '8/vBbP' },
NoteToSelf: { defaultMessage: "Note to Self", id: '4rYCjn' },
Read: { defaultMessage: "Read", id: 'filwqD' },
Write: { defaultMessage: "Write", id: 'k2veDA' },
Seconds: { defaultMessage: "{n} secs", id: '0yO7wF' },
Milliseconds: { defaultMessage: "{n} ms", id: '/n5KSF' },
ShowLatest: { defaultMessage: "Show latest {n} notes", id: 'DZzCem' },
LNURLFail: { defaultMessage: "Failed to load LNURL service", id: 'zonsdq' },
InvalidLNURL: { defaultMessage: "Invalid LNURL", id: '0jOEtS' },
InvoiceFail: { defaultMessage: "Failed to load invoice", id: 'CHTbO3' },
Custom: { defaultMessage: "Custom", id: 'Sjo1P4' },
Confirm: { defaultMessage: "Confirm", id: 'N2IrpM' },
Comment: { defaultMessage: "Comment", id: 'LgbKvU' },
SendZap: { defaultMessage: "Send zap", id: '5ykRmX' },
ShowReplies: { defaultMessage: "Show replies", id: 'hicxcO' },
TooShort: { defaultMessage: "name too short", id: 'B4C47Y' },
TooLong: { defaultMessage: "name too long", id: '8g2vyB' },
Regex: { defaultMessage: "name has disallowed characters", id: '0mch2Y' },
Registered: { defaultMessage: "name is registered", id: 'cuV2gK' },
Disallowed: { defaultMessage: "name is blocked", id: 'wih7iJ' },
DisalledLater: { defaultMessage: "name will be available later", id: 'HFls6j' },
BuyNow: { defaultMessage: "Buy Now", id: 'lCILNz' },
NotAvailable: { defaultMessage: "Not available:", id: 'MI2jkA' },
Buying: { defaultMessage: "Buying {item}", id: 'MzRYWH' },
OrderPaid: { defaultMessage: "Order Paid!", id: 'H6/kLh' },
NewNip: { defaultMessage: "Your new NIP-05 handle is:", id: '4L2vUY' },
ActivateNow: { defaultMessage: "Activate Now", id: 'ZKORll' },
AddToProfile: { defaultMessage: "Add to Profile", id: 'qkvYUb' },
AccountPage: { defaultMessage: "account page", id: 'lgg1KN' },
AccountSupport: { defaultMessage: "Account Support", id: '/JE/X+' },
GoTo: { defaultMessage: "Go to", id: 'xIoGG9' },
FindMore: { defaultMessage: "Find out more info about {service} at {link}", id: 'wqyN/i' },
Cancel: { defaultMessage: "Cancel", id: "47FYwb" },
Reply: { defaultMessage: "Reply", id: "9HU8vw" },
Send: { defaultMessage: "Send", id: "9WRlF4" },
NotePlaceholder: { defaultMessage: "What's on your mind?", id: "flnGvv" },
Back: { defaultMessage: "Back", id: "cyR7Kh" },
Block: { defaultMessage: "Block", id: "Up5U7K" },
Unblock: { defaultMessage: "Unblock", id: "nDejmx" },
MuteCount: { defaultMessage: "{n} muted", id: "VlJkSk" },
Mute: { defaultMessage: "Mute", id: "x82IOl" },
MutedAuthor: { defaultMessage: "This author has been muted", id: "ASRK0S" },
Others: { defaultMessage: ` & {n} {n, plural, =1 {other} other {others}}`, id: "egib+2" },
Show: { defaultMessage: "Show", id: "K7AkdL" },
Delete: { defaultMessage: "Delete", id: "K3r6DQ" },
Deleted: { defaultMessage: "Deleted", id: "KQvWvD" },
Unmute: { defaultMessage: "Unmute", id: "W9355R" },
MuteAll: { defaultMessage: "Mute all", id: "cWx9t8" },
BlockCount: { defaultMessage: "{n} blocked", id: "nwZXeh" },
JustNow: { defaultMessage: "Just now", id: "bxv59V" },
Follow: { defaultMessage: "Follow", id: "ieGrWo" },
FollowAll: { defaultMessage: "Follow all", id: "mKAr6h" },
Unfollow: { defaultMessage: "Unfollow", id: "izWS4J" },
FollowerCount: { defaultMessage: "{n} followers", id: "o7e+nJ" },
FollowingCount: { defaultMessage: "Follows {n}", id: "9SvQep" },
FollowsYou: { defaultMessage: "follows you", id: "FmXUJg" },
Invoice: { defaultMessage: "Lightning Invoice", id: "9wO4wJ" },
PayInvoice: { defaultMessage: "Pay Invoice", id: "lvlPhZ" },
Expired: { defaultMessage: "Expired", id: "RahCRH" },
Pay: { defaultMessage: "Pay", id: "lD3+8a" },
Loading: { defaultMessage: "Loading...", id: "gjBiyj" },
Logout: { defaultMessage: "Logout", id: "C81/uG" },
ShowMore: { defaultMessage: "Show more", id: "aWpBzj" },
TranslateTo: { defaultMessage: "Translate to {lang}", id: "Ebl/B2" },
TranslatedFrom: { defaultMessage: "Translated from {lang}", id: "Cu/K85" },
TranslationFailed: { defaultMessage: "Translation failed", id: "qmJ8kD" },
UnknownEventKind: { defaultMessage: "Unknown event kind: {kind}", id: "KahimY" },
ConfirmDeletion: { defaultMessage: `Are you sure you want to delete {id}`, id: "RhDAoS" },
ConfirmRepost: { defaultMessage: `Are you sure you want to repost: {id}`, id: "+D82kt" },
Reactions: { defaultMessage: "Reactions", id: "XgWvGA" },
ReactionsCount: { defaultMessage: "Reactions ({n})", id: "iCqGww" },
Share: { defaultMessage: "Share", id: "OKhRC6" },
CopyID: { defaultMessage: "Copy ID", id: "wtLjP6" },
CopyJSON: { defaultMessage: "Copy Event JSON", id: "P61BTu" },
Dislike: { defaultMessage: "{n} Dislike", id: "GspYR7" },
DislikeAction: { defaultMessage: "Dislike", id: "4OB335" },
Sats: { defaultMessage: `{n} {n, plural, =1 {sat} other {sats}}`, id: "jA3OE/" },
Zapped: { defaultMessage: "zapped", id: "B6+XJy" },
OthersZapped: { defaultMessage: `{n, plural, =0 {} =1 {zapped} other {zapped}}`, id: "mKhgP9" },
Likes: { defaultMessage: "Likes ({n})", id: "6ewQqw" },
Zaps: { defaultMessage: "Zaps ({n})", id: "JHEHCk" },
Dislikes: { defaultMessage: "Dislikes ({n})", id: "2k0Cv+" },
Reposts: { defaultMessage: "Reposts ({n})", id: "8/vBbP" },
NoteToSelf: { defaultMessage: "Note to Self", id: "4rYCjn" },
Read: { defaultMessage: "Read", id: "filwqD" },
Write: { defaultMessage: "Write", id: "k2veDA" },
Seconds: { defaultMessage: "{n} secs", id: "0yO7wF" },
Milliseconds: { defaultMessage: "{n} ms", id: "/n5KSF" },
ShowLatest: { defaultMessage: "Show latest {n} notes", id: "DZzCem" },
LNURLFail: { defaultMessage: "Failed to load LNURL service", id: "zonsdq" },
InvalidLNURL: { defaultMessage: "Invalid LNURL", id: "0jOEtS" },
InvoiceFail: { defaultMessage: "Failed to load invoice", id: "CHTbO3" },
Custom: { defaultMessage: "Custom", id: "Sjo1P4" },
Confirm: { defaultMessage: "Confirm", id: "N2IrpM" },
Comment: { defaultMessage: "Comment", id: "LgbKvU" },
SendZap: { defaultMessage: "Send zap", id: "5ykRmX" },
ShowReplies: { defaultMessage: "Show replies", id: "hicxcO" },
TooShort: { defaultMessage: "name too short", id: "B4C47Y" },
TooLong: { defaultMessage: "name too long", id: "8g2vyB" },
Regex: { defaultMessage: "name has disallowed characters", id: "0mch2Y" },
Registered: { defaultMessage: "name is registered", id: "cuV2gK" },
Disallowed: { defaultMessage: "name is blocked", id: "wih7iJ" },
DisalledLater: { defaultMessage: "name will be available later", id: "HFls6j" },
BuyNow: { defaultMessage: "Buy Now", id: "lCILNz" },
NotAvailable: { defaultMessage: "Not available:", id: "MI2jkA" },
Buying: { defaultMessage: "Buying {item}", id: "MzRYWH" },
OrderPaid: { defaultMessage: "Order Paid!", id: "H6/kLh" },
NewNip: { defaultMessage: "Your new NIP-05 handle is:", id: "4L2vUY" },
ActivateNow: { defaultMessage: "Activate Now", id: "ZKORll" },
AddToProfile: { defaultMessage: "Add to Profile", id: "qkvYUb" },
AccountPage: { defaultMessage: "account page", id: "lgg1KN" },
AccountSupport: { defaultMessage: "Account Support", id: "/JE/X+" },
GoTo: { defaultMessage: "Go to", id: "xIoGG9" },
FindMore: { defaultMessage: "Find out more info about {service} at {link}", id: "wqyN/i" },
SavePassword: {
defaultMessage: "Please make sure to save the following password in order to manage your handle in the future", id: '+vIQlC',
defaultMessage: "Please make sure to save the following password in order to manage your handle in the future",
id: "+vIQlC",
},
Handle: { defaultMessage: "Handle", id: 'iNWbVV' },
Pin: { defaultMessage: "Pin", id: 'puLNUJ' },
Pinned: { defaultMessage: "Pinned", id: 'fWZYP5' },
Bookmark: { defaultMessage: "Bookmark", id: 'Rs4kCE' },
Bookmarks: { defaultMessage: "Bookmarks", id: 'nGBrvw' },
BookmarksCount: { defaultMessage: "Bookmarks ({n})", id: 'GL8aXW' },
Bookmarked: { defaultMessage: "Saved", id: 'fsB/4p' },
All: { defaultMessage: "All", id: 'zQvVDJ' },
ConfirmUnbookmark: { defaultMessage: "Are you sure you want to remove this note from bookmarks?", id: '1Mo59U' },
ConfirmUnpin: { defaultMessage: "Are you sure you want to unpin this note?", id: 'IEwZvs' },
ReactionsLink: { defaultMessage: "{n} Reactions", id: 'jzgQ2z' },
ReBroadcast: { defaultMessage: "Broadcast Again", id: 'c3g2hL' },
IrisUserNameLengthError: { defaultMessage: "Name must be between 1 and 32 characters", id: '4MBtMa' },
IrisUserNameFormatError: { defaultMessage: "Username must only contain lowercase letters and numbers", id: 'RSr2uB' },
Handle: { defaultMessage: "Handle", id: "iNWbVV" },
Pin: { defaultMessage: "Pin", id: "puLNUJ" },
Pinned: { defaultMessage: "Pinned", id: "fWZYP5" },
Bookmark: { defaultMessage: "Bookmark", id: "Rs4kCE" },
Bookmarks: { defaultMessage: "Bookmarks", id: "nGBrvw" },
BookmarksCount: { defaultMessage: "Bookmarks ({n})", id: "GL8aXW" },
Bookmarked: { defaultMessage: "Saved", id: "fsB/4p" },
All: { defaultMessage: "All", id: "zQvVDJ" },
ConfirmUnbookmark: { defaultMessage: "Are you sure you want to remove this note from bookmarks?", id: "1Mo59U" },
ConfirmUnpin: { defaultMessage: "Are you sure you want to unpin this note?", id: "IEwZvs" },
ReactionsLink: { defaultMessage: "{n} Reactions", id: "jzgQ2z" },
ReBroadcast: { defaultMessage: "Broadcast Again", id: "c3g2hL" },
IrisUserNameLengthError: { defaultMessage: "Name must be between 1 and 32 characters", id: "4MBtMa" },
IrisUserNameFormatError: { defaultMessage: "Username must only contain lowercase letters and numbers", id: "RSr2uB" },
});

View File

@ -14,7 +14,8 @@ export default function useLoginHandler() {
async function doLogin(key: string, pin: (key: string) => Promise<KeyStorage>) {
const insecureMsg = formatMessage({
defaultMessage:
"Can't login with private key on an insecure connection, please use a Nostr key manager extension instead", id: 'iXPL0Z',
"Can't login with private key on an insecure connection, please use a Nostr key manager extension instead",
id: "iXPL0Z",
});
// private key logins
if (key.startsWith("nsec")) {

View File

@ -9,9 +9,9 @@ export default function Discover() {
const { formatMessage } = useIntl();
// tabs
const Tabs = {
Follows: { text: formatMessage({ defaultMessage: "Suggested Follows", id: 'C8HhVE' }), value: 0 },
Posts: { text: formatMessage({ defaultMessage: "Trending Notes", id: 'Ix8l+B' }), value: 1 },
Profiles: { text: formatMessage({ defaultMessage: "Trending People", id: 'CVWeJ6' }), value: 2 },
Follows: { text: formatMessage({ defaultMessage: "Suggested Follows", id: "C8HhVE" }), value: 0 },
Posts: { text: formatMessage({ defaultMessage: "Trending Notes", id: "Ix8l+B" }), value: 1 },
Profiles: { text: formatMessage({ defaultMessage: "Trending People", id: "CVWeJ6" }), value: 2 },
};
const [tab, setTab] = useState<Tab>(Tabs.Follows);

View File

@ -87,13 +87,15 @@ const DonatePage = () => {
<div className="main-content p">
<h2>
<FormattedMessage
defaultMessage="Help fund the development of {site}" id="yNBPJp"
defaultMessage="Help fund the development of {site}"
id="yNBPJp"
values={{ site: CONFIG.appNameCapitalized }}
/>
</h2>
<p>
<FormattedMessage
defaultMessage="{site} is an open source project built by passionate people in their free time" id="6TfgXX"
defaultMessage="{site} is an open source project built by passionate people in their free time"
id="6TfgXX"
values={{ site: CONFIG.appNameCapitalized }}
/>
</p>
@ -102,7 +104,8 @@ const DonatePage = () => {
</p>
<p>
<FormattedMessage
defaultMessage="Check out the code here: {link}" id="u4bHcR"
defaultMessage="Check out the code here: {link}"
id="u4bHcR"
values={{
link: (
<a className="highlight" href="https://git.v0l.io/Kieran/snort" rel="noreferrer" target="_blank">
@ -113,7 +116,10 @@ const DonatePage = () => {
/>
</p>
<p>
<FormattedMessage defaultMessage="Each contributor will get paid a percentage of all donations and NIP-05 orders, you can see the split amounts below" id="mH91FY" />
<FormattedMessage
defaultMessage="Each contributor will get paid a percentage of all donations and NIP-05 orders, you can see the split amounts below"
id="mH91FY"
/>
</p>
<div className="flex flex-col g12">
<div className="b br p">
@ -126,7 +132,8 @@ const DonatePage = () => {
{today && (
<small>
<FormattedMessage
defaultMessage="Total today (UTC): {amount} sats" id="P7nJT9"
defaultMessage="Total today (UTC): {amount} sats"
id="P7nJT9"
values={{ amount: today.donations.toLocaleString() }}
/>
</small>

View File

@ -71,7 +71,8 @@ export function HashTagHeader({ tag, events, className }: { tag: string; events?
{events && (
<small>
<FormattedMessage
defaultMessage="{n} notes" id="un1nGw"
defaultMessage="{n} notes"
id="un1nGw"
values={{
n: formatShort(events),
}}

View File

@ -12,7 +12,8 @@ export default function HelpPage() {
</h2>
<p>
<FormattedMessage
defaultMessage="If you have an enquiry about your NIP-05 order please DM {link}" id="c35bj2"
defaultMessage="If you have an enquiry about your NIP-05 order please DM {link}"
id="c35bj2"
values={{
link: (
<Link

View File

@ -88,7 +88,10 @@ export default function MessagesPage() {
{conversationIdent(cx)}
<div className="nowrap">
<small>
<NoteTime from={cx.lastMessage * 1000} fallback={formatMessage({ defaultMessage: "Just now", id: 'bxv59V' })} />
<NoteTime
from={cx.lastMessage * 1000}
fallback={formatMessage({ defaultMessage: "Just now", id: "bxv59V" })}
/>
</small>
{cx.unread > 0 && <UnreadCount unread={cx.unread} />}
</div>
@ -161,7 +164,11 @@ function ProfileDmActions({ id }: { id: string }) {
<div className="settings-row" onClick={() => (blocked ? unblock(pubkey) : block(pubkey))}>
<Icon name="block" />
{blocked ? <FormattedMessage defaultMessage="Unblock" id="nDejmx" /> : <FormattedMessage defaultMessage="Block" id="Up5U7K" />}
{blocked ? (
<FormattedMessage defaultMessage="Unblock" id="nDejmx" />
) : (
<FormattedMessage defaultMessage="Block" id="Up5U7K" />
)}
</div>
</>
);

View File

@ -8,25 +8,10 @@ import { FormattedMessage, useIntl } from "react-intl";
import { useNavigate } from "react-router-dom";
import { Bar, BarChart, Tooltip, XAxis, YAxis } from "recharts";
<<<<<<< HEAD
import useLogin from "Hooks/useLogin";
import { markNotificationsRead } from "Login";
import { Notifications } from "Cache";
import { dedupe, orderAscending, orderDescending, getDisplayName } from "SnortUtils";
import Icon from "Icons/Icon";
import ProfileImage from "Element/User/ProfileImage";
import useModeration from "Hooks/useModeration";
import Text from "Element/Text";
import { formatShort } from "Number";
import { LiveEvent } from "Element/LiveEvent";
import ProfilePreview from "Element/User/ProfilePreview";
import { Day } from "Const";
import Tabs, { Tab } from "Element/Tabs";
=======
import useLogin from "@/Hooks/useLogin";
import { markNotificationsRead } from "@/Login";
import { Notifications } from "@/Cache";
import { dedupe, findTag, orderAscending, orderDescending, getDisplayName } from "@/SnortUtils";
import { dedupe, orderAscending, orderDescending, getDisplayName } from "@/SnortUtils";
import Icon from "@/Icons/Icon";
import ProfileImage from "@/Element/User/ProfileImage";
import useModeration from "@/Hooks/useModeration";
@ -36,7 +21,6 @@ import { LiveEvent } from "@/Element/LiveEvent";
import ProfilePreview from "@/Element/User/ProfilePreview";
import { Day } from "@/Const";
import Tabs, { Tab } from "@/Element/Tabs";
>>>>>>> 7ec02f9b (wip vite)
import classNames from "classnames";
import { AsyncIcon } from "@/Element/AsyncIcon";
import { ShowMoreInView } from "@/Element/Event/ShowMore";
@ -345,7 +329,8 @@ function NotificationGroup({ evs, onClick }: { evs: Array<TaggedNostrEvent>; onC
case EventKind.Reaction: {
return (
<FormattedMessage
defaultMessage="{n,plural,=0{{name} liked} other{{name} & {n} others liked}}" id="kuPHYE"
defaultMessage="{n,plural,=0{{name} liked} other{{name} & {n} others liked}}"
id="kuPHYE"
values={{
n,
name,
@ -356,7 +341,8 @@ function NotificationGroup({ evs, onClick }: { evs: Array<TaggedNostrEvent>; onC
case EventKind.Repost: {
return (
<FormattedMessage
defaultMessage="{n,plural,=0{{name} reposted} other{{name} & {n} others reposted}}" id="kJYo0u"
defaultMessage="{n,plural,=0{{name} reposted} other{{name} & {n} others reposted}}"
id="kJYo0u"
values={{
n,
name,
@ -367,7 +353,8 @@ function NotificationGroup({ evs, onClick }: { evs: Array<TaggedNostrEvent>; onC
case EventKind.ZapReceipt: {
return (
<FormattedMessage
defaultMessage="{n,plural,=0{{name} zapped} other{{name} & {n} others zapped}}" id="Lw+I+J"
defaultMessage="{n,plural,=0{{name} zapped} other{{name} & {n} others zapped}}"
id="Lw+I+J"
values={{
n,
name,
@ -400,7 +387,7 @@ function NotificationGroup({ evs, onClick }: { evs: Array<TaggedNostrEvent>; onC
showUsername={kind === EventKind.TextNote}
pubkey={v}
size={40}
overrideUsername={v === "" ? formatMessage({ defaultMessage: "Anon", id: 'bfvyfs' }) : undefined}
overrideUsername={v === "" ? formatMessage({ defaultMessage: "Anon", id: "bfvyfs" }) : undefined}
/>
))}
</div>
@ -409,7 +396,7 @@ function NotificationGroup({ evs, onClick }: { evs: Array<TaggedNostrEvent>; onC
{actionName(
pubkeys.length - 1,
firstPubkey === "anon"
? formatMessage({ defaultMessage: "Anon", id: 'bfvyfs' })
? formatMessage({ defaultMessage: "Anon", id: "bfvyfs" })
: getDisplayName(firstPubkeyProfile, firstPubkey),
)}
</div>

View File

@ -75,7 +75,11 @@ export const GlobalTab = () => {
return (
<div className="flex items-center g8 justify-end nowrap">
<h3>
<FormattedMessage defaultMessage="Relay" id="KHK8B9" description="Label for reading global feed from specific relays" />
<FormattedMessage
defaultMessage="Relay"
id="KHK8B9"
description="Label for reading global feed from specific relays"
/>
</h3>
<select
className="f-ellipsis"

View File

@ -20,8 +20,8 @@ const SearchPage = () => {
const [sortPopular, setSortPopular] = useState<boolean>(true);
// tabs
const SearchTab = [
{ text: formatMessage({ defaultMessage: "Notes", id: '7+Domh' }), value: NOTES },
{ text: formatMessage({ defaultMessage: "People", id: 'Tpy00S' }), value: PROFILES },
{ text: formatMessage({ defaultMessage: "Notes", id: "7+Domh" }), value: NOTES },
{ text: formatMessage({ defaultMessage: "People", id: "Tpy00S" }), value: PROFILES },
];
const [tab, setTab] = useState<Tab>(SearchTab[0]);
@ -95,7 +95,7 @@ const SearchPage = () => {
<input
type="text"
className="w-max"
placeholder={formatMessage({ defaultMessage: "Search...", id: '0BUTMv' })}
placeholder={formatMessage({ defaultMessage: "Search...", id: "0BUTMv" })}
value={search}
onChange={e => setSearch(e.target.value)}
autoFocus={true}

View File

@ -41,7 +41,7 @@ export default function WalletPage() {
if (e instanceof Error) {
setError((e as Error).message);
} else {
setError(formatMessage({ defaultMessage: "Unknown error", id: 'qDwvZ4' }));
setError(formatMessage({ defaultMessage: "Unknown error", id: "qDwvZ4" }));
}
}
}
@ -90,7 +90,8 @@ export default function WalletPage() {
<input
type="password"
placeholder={formatMessage({
defaultMessage: "Wallet password", id: 'MP54GY',
defaultMessage: "Wallet password",
id: "MP54GY",
description: "Wallet password input placeholder",
})}
className="w-max"
@ -141,7 +142,7 @@ export default function WalletPage() {
{history?.map(a => (
<div className="card flex wallet-history-item" key={a.timestamp}>
<div className="grow flex-col">
<NoteTime from={a.timestamp * 1000} fallback={formatMessage({ defaultMessage: "now", id: 'kaaf1E' })} />
<NoteTime from={a.timestamp * 1000} fallback={formatMessage({ defaultMessage: "now", id: "kaaf1E" })} />
<div>{(a.memo ?? "").length === 0 ? <>&nbsp;</> : a.memo}</div>
</div>
<div
@ -159,7 +160,8 @@ export default function WalletPage() {
})()}`}>
{stateIcon(a.state)}
<FormattedMessage
defaultMessage="{amount} sats" id="vrTOHJ"
defaultMessage="{amount} sats"
id="vrTOHJ"
values={{
amount: <FormattedNumber value={a.amount / 1e3} />,
}}
@ -176,7 +178,8 @@ export default function WalletPage() {
return (
<small>
<FormattedMessage
defaultMessage="Balance: {amount} sats" id="VN0+Fz"
defaultMessage="Balance: {amount} sats"
id="VN0+Fz"
values={{
amount: <FormattedNumber value={balance ?? 0} />,
}}

View File

@ -96,14 +96,21 @@ export default function ZapPoolPage() {
<FormattedMessage defaultMessage="Zap Pool" id="i/dBAR" />
</h1>
<p>
<FormattedMessage defaultMessage="Fund the services that you use by splitting a portion of all your zaps into a pool of funds!" id="x/Fx2P" />
</p>
<p>
<FormattedMessage defaultMessage="Zap Pool only works if you use one of the supported wallet connections (WebLN, LNC, LNDHub or Nostr Wallet Connect)" id="QWhotP" />
<FormattedMessage
defaultMessage="Fund the services that you use by splitting a portion of all your zaps into a pool of funds!"
id="x/Fx2P"
/>
</p>
<p>
<FormattedMessage
defaultMessage="Your default zap amount is {number} sats, example values are calculated from this." id="Xopqkl"
defaultMessage="Zap Pool only works if you use one of the supported wallet connections (WebLN, LNC, LNDHub or Nostr Wallet Connect)"
id="QWhotP"
/>
</p>
<p>
<FormattedMessage
defaultMessage="Your default zap amount is {number} sats, example values are calculated from this."
id="Xopqkl"
values={{
number: (
<b>
@ -115,7 +122,8 @@ export default function ZapPoolPage() {
</p>
<p>
<FormattedMessage
defaultMessage="A single zap of {nIn} sats will allocate {nOut} sats to the zap pool." id="eSzf2G"
defaultMessage="A single zap of {nIn} sats will allocate {nOut} sats to the zap pool."
id="eSzf2G"
values={{
nIn: (
<b>
@ -134,7 +142,8 @@ export default function ZapPoolPage() {
</p>
<p>
<FormattedMessage
defaultMessage="You currently have {number} sats in your zap pool." id="Qxv0B2"
defaultMessage="You currently have {number} sats in your zap pool."
id="Qxv0B2"
values={{
number: (
<b>

View File

@ -1,45 +1,55 @@
import { defineMessages } from "react-intl";
export default defineMessages({
Login: { defaultMessage: "Login", id: 'AyGauy' },
Global: { defaultMessage: "Global", id: 'EWyQH5' },
NewUsers: { defaultMessage: "New users page", id: 'NndBJE' },
NoFollows: { defaultMessage: "Hmm nothing here.. Checkout {newUsersPage} to follow some recommended nostrich's!", id: 'NdOYJJ' },
Reactions: { defaultMessage: "Reactions", id: 'XgWvGA' },
Followers: { defaultMessage: "Followers", id: 'pzTOmv' },
FollowersCount: { defaultMessage: "{n} Followers", id: '3tVy+Z' },
Follows: { defaultMessage: "Following", id: 'cPIKU2' },
FollowsCount: { defaultMessage: "{n} Following", id: '1nYUGC' },
Zaps: { defaultMessage: "Zaps", id: 'OEW7yJ' },
ZapsCount: { defaultMessage: "{n} Zaps", id: 'FDguSC' },
Muted: { defaultMessage: "Muted", id: 'HOzFdo' },
MutedCount: { defaultMessage: "{n} Muted", id: 'CmZ9ls' },
Blocked: { defaultMessage: "Blocked", id: 'qUJTsT' },
BlockedCount: { defaultMessage: "{n} Blocked", id: 'W2PiAr' },
Sats: { defaultMessage: "{n} {n, plural, =1 {sat} other {sats}}", id: 'jA3OE/' },
Following: { defaultMessage: "Following {n}", id: 'lnaT9F' },
Settings: { defaultMessage: "Settings", id: 'D3idYv' },
Messages: { defaultMessage: "Messages", id: 'hMzcSq' },
MarkAllRead: { defaultMessage: "Mark All Read", id: 'e7qqly' },
GetVerified: { defaultMessage: "Get Verified", id: 'eJj8HD' },
Nip05: { defaultMessage: `NIP-05 is a DNS based verification spec which helps to validate you as a real user.`, id: 'vZ4quW' },
Nip05Pros: { defaultMessage: `Getting NIP-05 verified can help:`, id: 'thnRpU' },
AvoidImpersonators: { defaultMessage: "Prevent fake accounts from imitating you", id: 'iGT1eE' },
EasierToFind: { defaultMessage: "Make your profile easier to find and share", id: '/d6vEc' },
Funding: { defaultMessage: "Fund developers and platforms providing NIP-05 verification services", id: 'a5UPxh' },
Login: { defaultMessage: "Login", id: "AyGauy" },
Global: { defaultMessage: "Global", id: "EWyQH5" },
NewUsers: { defaultMessage: "New users page", id: "NndBJE" },
NoFollows: {
defaultMessage: "Hmm nothing here.. Checkout {newUsersPage} to follow some recommended nostrich's!",
id: "NdOYJJ",
},
Reactions: { defaultMessage: "Reactions", id: "XgWvGA" },
Followers: { defaultMessage: "Followers", id: "pzTOmv" },
FollowersCount: { defaultMessage: "{n} Followers", id: "3tVy+Z" },
Follows: { defaultMessage: "Following", id: "cPIKU2" },
FollowsCount: { defaultMessage: "{n} Following", id: "1nYUGC" },
Zaps: { defaultMessage: "Zaps", id: "OEW7yJ" },
ZapsCount: { defaultMessage: "{n} Zaps", id: "FDguSC" },
Muted: { defaultMessage: "Muted", id: "HOzFdo" },
MutedCount: { defaultMessage: "{n} Muted", id: "CmZ9ls" },
Blocked: { defaultMessage: "Blocked", id: "qUJTsT" },
BlockedCount: { defaultMessage: "{n} Blocked", id: "W2PiAr" },
Sats: { defaultMessage: "{n} {n, plural, =1 {sat} other {sats}}", id: "jA3OE/" },
Following: { defaultMessage: "Following {n}", id: "lnaT9F" },
Settings: { defaultMessage: "Settings", id: "D3idYv" },
Messages: { defaultMessage: "Messages", id: "hMzcSq" },
MarkAllRead: { defaultMessage: "Mark All Read", id: "e7qqly" },
GetVerified: { defaultMessage: "Get Verified", id: "eJj8HD" },
Nip05: {
defaultMessage: `NIP-05 is a DNS based verification spec which helps to validate you as a real user.`,
id: "vZ4quW",
},
Nip05Pros: { defaultMessage: `Getting NIP-05 verified can help:`, id: "thnRpU" },
AvoidImpersonators: { defaultMessage: "Prevent fake accounts from imitating you", id: "iGT1eE" },
EasierToFind: { defaultMessage: "Make your profile easier to find and share", id: "/d6vEc" },
Funding: { defaultMessage: "Fund developers and platforms providing NIP-05 verification services", id: "a5UPxh" },
SnortSocialNip: {
defaultMessage: `Our very own NIP-05 verification service, help support the development of this site and get a shiny special badge on our site!`, id: 'k7sKNy',
defaultMessage: `Our very own NIP-05 verification service, help support the development of this site and get a shiny special badge on our site!`,
id: "k7sKNy",
},
NostrPlebsNip: {
defaultMessage: `Nostr Plebs is one of the first NIP-05 providers in the space and offers a good collection of domains at reasonable prices`, id: '4Vmpt4',
defaultMessage: `Nostr Plebs is one of the first NIP-05 providers in the space and offers a good collection of domains at reasonable prices`,
id: "4Vmpt4",
},
Relays: {
defaultMessage: "Relays", id: 'RoOyAh',
defaultMessage: "Relays",
id: "RoOyAh",
},
RelaysCount: {
defaultMessage: "{n} Relays", id: 'QDFTjG',
defaultMessage: "{n} Relays",
id: "QDFTjG",
},
Bookmarks: { defaultMessage: "Bookmarks", id: 'nGBrvw' },
BookmarksCount: { defaultMessage: "{n} Bookmarks", id: '2a2YiP' },
KeyPlaceholder: { defaultMessage: "nsec, npub, nip-05, hex", id: 'B6H7eJ' },
Bookmarks: { defaultMessage: "Bookmarks", id: "nGBrvw" },
BookmarksCount: { defaultMessage: "{n} Bookmarks", id: "2a2YiP" },
KeyPlaceholder: { defaultMessage: "nsec, npub, nip-05, hex", id: "B6H7eJ" },
});

View File

@ -13,7 +13,8 @@ export function Discover() {
<div className="flex flex-col g24">
<h1 className="text-center">
<FormattedMessage
defaultMessage="{site} is more fun together!" id="h7jvCs"
defaultMessage="{site} is more fun together!"
id="h7jvCs"
values={{
site: CONFIG.appNameCapitalized,
}}

View File

@ -43,7 +43,8 @@ export function SignIn() {
} else {
setError(
formatMessage({
defaultMessage: "Unknown login error", id: 'OLEm6z',
defaultMessage: "Unknown login error",
id: "OLEm6z",
}),
);
}
@ -83,7 +84,8 @@ export function SignIn() {
<input
type="text"
placeholder={formatMessage({
defaultMessage: "nsec, npub, nip-05, hex, mnemonic", id: 'X7xU8J',
defaultMessage: "nsec, npub, nip-05, hex, mnemonic",
id: "X7xU8J",
})}
value={key}
onChange={e => setKey(e.target.value)}
@ -125,7 +127,8 @@ export function SignUp() {
type="text"
autoFocus={true}
placeholder={formatMessage({
defaultMessage: "Name or nym", id: 'aHje0o',
defaultMessage: "Name or nym",
id: "aHje0o",
})}
value={name}
onChange={e => setName(e.target.value)}

View File

@ -45,7 +45,8 @@ function CacheDetails<T>({ cache, name }: { cache: FeedCache<T>; name: ReactNode
{name}
<small>
<FormattedMessage
defaultMessage="{count} ({count2} in memory)" id="geppt8"
defaultMessage="{count} ({count2} in memory)"
id="geppt8"
values={{
count: <FormattedNumber value={cache.keysOnTable().length} />,
count2: <FormattedNumber value={snapshot.length} />,

View File

@ -316,7 +316,8 @@ const PreferencesPage = () => {
type="text"
value={perf.imgProxyConfig?.url}
placeholder={formatMessage({
defaultMessage: "URL..", id: 'cQfLWb',
defaultMessage: "URL..",
id: "cQfLWb",
description: "Placeholder text for imgproxy url textbox",
})}
onChange={e =>
@ -340,7 +341,8 @@ const PreferencesPage = () => {
type="password"
value={perf.imgProxyConfig?.key}
placeholder={formatMessage({
defaultMessage: "Hex Key..", id: 'H+vHiz',
defaultMessage: "Hex Key..",
id: "H+vHiz",
description: "Hexidecimal 'key' input for improxy",
})}
onChange={e =>
@ -364,7 +366,8 @@ const PreferencesPage = () => {
type="password"
value={perf.imgProxyConfig?.salt}
placeholder={formatMessage({
defaultMessage: "Hex Salt..", id: 'TpgeGw',
defaultMessage: "Hex Salt..",
id: "TpgeGw",
description: "Hexidecimal 'salt' input for imgproxy",
})}
onChange={e =>

View File

@ -162,7 +162,10 @@ export default function ProfileSettings(props: ProfileSettingsProps) {
disabled={readonly}
/>
<small>
<FormattedMessage defaultMessage="Usernames are not unique on Nostr. The nostr address is your unique human-readable address that is unique to you upon registration." id="5vMmmR" />
<FormattedMessage
defaultMessage="Usernames are not unique on Nostr. The nostr address is your unique human-readable address that is unique to you upon registration."
id="5vMmmR"
/>
</small>
<div className="flex g12">
<button className="flex items-center" type="button" onClick={() => navigate("/nostr-address")}>

View File

@ -124,7 +124,7 @@ export function CloseRelays() {
return (
<>
<h3>
<FormattedMessage defaultMessage="Recommended Relays" />
<FormattedMessage defaultMessage="Recommended Relays" id="VL900k" />
</h3>
{"geolocation" in navigator && (
<AsyncButton
@ -141,7 +141,7 @@ export function CloseRelays() {
console.error(e);
}
}}>
<FormattedMessage defaultMessage="Use Exact Location" />
<FormattedMessage defaultMessage="Use Exact Location" id="0HFX0T" />
</AsyncButton>
)}
{relays
@ -162,7 +162,7 @@ export function CloseRelays() {
unixNowMs(),
);
}}>
<FormattedMessage defaultMessage="Add" />
<FormattedMessage defaultMessage="Add" id="2/2yg+" />
</AsyncButton>
</div>
<div className="flex flex-col g8">
@ -170,6 +170,7 @@ export function CloseRelays() {
<small>
<FormattedMessage
defaultMessage="{n} km - {location}"
id="jTrbGf"
values={{
n: (a.distance / 1000).toFixed(0),
location: a.city ? `${a.city}, ${a.country}` : a.country,
@ -179,6 +180,7 @@ export function CloseRelays() {
<small>
<FormattedMessage
defaultMessage="{n} users"
id="1H4Keq"
values={{
n: formatShort(a.users),
}}

View File

@ -30,7 +30,8 @@ export default function LNForwardAddress({ handle }: { handle: ManageHandle }) {
} catch {
setError(
formatMessage({
defaultMessage: "Invalid LNURL", id: '0jOEtS',
defaultMessage: "Invalid LNURL",
id: "0jOEtS",
}),
);
return;
@ -49,14 +50,23 @@ export default function LNForwardAddress({ handle }: { handle: ManageHandle }) {
<FormattedMessage defaultMessage="Update Lightning Address" id="SOqbe9" />
</h4>
<p>
<FormattedMessage defaultMessage="Your handle will act like a lightning address and will redirect to your chosen LNURL or Lightning address" id="b5vAk0" />
<FormattedMessage
defaultMessage="Your handle will act like a lightning address and will redirect to your chosen LNURL or Lightning address"
id="b5vAk0"
/>
</p>
<p>
<small>
<FormattedMessage defaultMessage="Redirect issues HTTP redirect to the supplied lightning address" id="FcNSft" />
<FormattedMessage
defaultMessage="Redirect issues HTTP redirect to the supplied lightning address"
id="FcNSft"
/>
<br />
<FormattedMessage defaultMessage="Proxy uses HODL invoices to forward the payment, which hides the pubkey of your node" id="712i26" />
<FormattedMessage
defaultMessage="Proxy uses HODL invoices to forward the payment, which hides the pubkey of your node"
id="712i26"
/>
</small>
</p>
<div className="flex g8">
@ -64,7 +74,8 @@ export default function LNForwardAddress({ handle }: { handle: ManageHandle }) {
type="text"
className="w-max"
placeholder={formatMessage({
defaultMessage: "LNURL or Lightning Address", id: 'yCLnBC',
defaultMessage: "LNURL or Lightning Address",
id: "yCLnBC",
})}
value={newAddress}
onChange={e => setNewAddress(e.target.value)}

View File

@ -32,7 +32,8 @@ export default function ListHandles() {
<>
{handles.length === 0 && (
<FormattedMessage
defaultMessage="It looks like you dont have any, check {link} to buy one!" id="mErPop"
defaultMessage="It looks like you dont have any, check {link} to buy one!"
id="mErPop"
values={{
link: (
<Link to="/nostr-address">

View File

@ -39,7 +39,8 @@ export default function TransferHandle({ handle }: { handle: ManageHandle }) {
type="text"
className="w-max mr10"
placeholder={formatMessage({
defaultMessage: "Public key (npub/nprofile)", id: 'VR5eHw',
defaultMessage: "Public key (npub/nprofile)",
id: "VR5eHw",
})}
value={newKey}
onChange={e => setNewKey(e.target.value)}

View File

@ -1,64 +1,69 @@
import { defineMessages } from "react-intl";
export default defineMessages({
Profile: { defaultMessage: "Profile", id: 'itPgxd' },
Relays: { defaultMessage: "Relays", id: 'RoOyAh' },
Owner: { defaultMessage: "Owner", id: 'zINlao' },
Software: { defaultMessage: "Software", id: 'r3C4x/' },
Contact: { defaultMessage: "Contact", id: 'zFegDD' },
Supports: { defaultMessage: "Supports", id: 'hY4lzx' },
Remove: { defaultMessage: "Remove", id: 'G/yZLu' },
Preferences: { defaultMessage: "Preferences", id: 'PCSt5T' },
Donate: { defaultMessage: "Donate", id: '2IFGap' },
LogOut: { defaultMessage: "Log Out", id: 'H0JBH6' },
Theme: { defaultMessage: "Theme", id: 'Pe0ogR' },
System: { defaultMessage: "System (Default)", id: 'P7FD0F' },
Light: { defaultMessage: "Light", id: '3cc4Ct' },
Dark: { defaultMessage: "Dark", id: 'tOdNiY' },
DefaultRootTab: { defaultMessage: "Default Page", id: 'MWTx65' },
Conversations: { defaultMessage: "Conversations", id: '1udzha' },
Global: { defaultMessage: "Global", id: 'EWyQH5' },
AutoloadMedia: { defaultMessage: "Automatically load media", id: 'xbVgIm' },
Profile: { defaultMessage: "Profile", id: "itPgxd" },
Relays: { defaultMessage: "Relays", id: "RoOyAh" },
Owner: { defaultMessage: "Owner", id: "zINlao" },
Software: { defaultMessage: "Software", id: "r3C4x/" },
Contact: { defaultMessage: "Contact", id: "zFegDD" },
Supports: { defaultMessage: "Supports", id: "hY4lzx" },
Remove: { defaultMessage: "Remove", id: "G/yZLu" },
Preferences: { defaultMessage: "Preferences", id: "PCSt5T" },
Donate: { defaultMessage: "Donate", id: "2IFGap" },
LogOut: { defaultMessage: "Log Out", id: "H0JBH6" },
Theme: { defaultMessage: "Theme", id: "Pe0ogR" },
System: { defaultMessage: "System (Default)", id: "P7FD0F" },
Light: { defaultMessage: "Light", id: "3cc4Ct" },
Dark: { defaultMessage: "Dark", id: "tOdNiY" },
DefaultRootTab: { defaultMessage: "Default Page", id: "MWTx65" },
Conversations: { defaultMessage: "Conversations", id: "1udzha" },
Global: { defaultMessage: "Global", id: "EWyQH5" },
AutoloadMedia: { defaultMessage: "Automatically load media", id: "xbVgIm" },
AutoloadMediaHelp: {
defaultMessage: "Media in notes will automatically be shown for selected people, otherwise only the link will show", id: 'TDR5ge',
defaultMessage: "Media in notes will automatically be shown for selected people, otherwise only the link will show",
id: "TDR5ge",
},
None: { defaultMessage: "None", id: '450Fty' },
FollowsOnly: { defaultMessage: "Follows only", id: 'odFwjL' },
All: { defaultMessage: "All", id: 'zQvVDJ' },
ImgProxy: { defaultMessage: "Image proxy service", id: 'll3xBp' },
ImgProxyHelp: { defaultMessage: "Use imgproxy to compress images", id: '4Z3t5i' },
ServiceUrl: { defaultMessage: "Service URL", id: 'YDURw6' },
ServiceKey: { defaultMessage: "Key", id: 'EcglP9' },
ServiceSalt: { defaultMessage: "Salt", id: 'GFOoEE' },
EnableReactions: { defaultMessage: "Enable reactions", id: 'YXA3AH' },
None: { defaultMessage: "None", id: "450Fty" },
FollowsOnly: { defaultMessage: "Follows only", id: "odFwjL" },
All: { defaultMessage: "All", id: "zQvVDJ" },
ImgProxy: { defaultMessage: "Image proxy service", id: "ll3xBp" },
ImgProxyHelp: { defaultMessage: "Use imgproxy to compress images", id: "4Z3t5i" },
ServiceUrl: { defaultMessage: "Service URL", id: "YDURw6" },
ServiceKey: { defaultMessage: "Key", id: "EcglP9" },
ServiceSalt: { defaultMessage: "Salt", id: "GFOoEE" },
EnableReactions: { defaultMessage: "Enable reactions", id: "YXA3AH" },
EnableReactionsHelp: {
defaultMessage: "Reactions will be shown on every page, if disabled no reactions will be shown", id: 'PrsIg7',
defaultMessage: "Reactions will be shown on every page, if disabled no reactions will be shown",
id: "PrsIg7",
},
ConfirmReposts: { defaultMessage: "Confirm Reposts", id: '89q5wc' },
ConfirmRepostsHelp: { defaultMessage: "Reposts need to be manually confirmed", id: 'uSV4Ti' },
ShowLatest: { defaultMessage: "Automatically show latest notes", id: 'zvCDao' },
ShowLatestHelp: { defaultMessage: "Notes will stream in real time into global and notes tab", id: 'a7TDNm' },
FileUpload: { defaultMessage: "File upload service", id: 'mKh2HS' },
FileUploadHelp: { defaultMessage: "Pick which upload service you want to upload attachments to", id: 'VOjC1i' },
Default: { defaultMessage: "(Default)", id: 'rfuMjE' },
DebugMenus: { defaultMessage: "Debug Menus", id: 'M3Oirc' },
DebugMenusHelp: { defaultMessage: `Shows "Copy ID" and "Copy Event JSON" in the context menu on each message`, id: 'MBAYRO' },
EditProfile: { defaultMessage: "Edit Profile", id: 'usAvMr' },
About: { defaultMessage: "About", id: 'g5pX+a' },
LnAddress: { defaultMessage: "LN Address", id: 'd7d0/x' },
Avatar: { defaultMessage: "Avatar", id: 'VnXp8Z' },
Banner: { defaultMessage: "Banner", id: '25V4l1' },
Edit: { defaultMessage: "Edit", id: 'wEQDC6' },
PrivateKey: { defaultMessage: "Your Private Key Is (do not share this with anyone)", id: 'qdGuQo' },
Add: { defaultMessage: "Add", id: '2/2yg+' },
AddRelays: { defaultMessage: "Add Relays", id: 'rT14Ow' },
Name: { defaultMessage: "Name", id: 'HAlOn1' },
Website: { defaultMessage: "Website", id: 'JkLHGw' },
Save: { defaultMessage: "Save", id: 'jvo0vs' },
DisplayName: { defaultMessage: "Display name", id: 'dOQCL8' },
Buy: { defaultMessage: "Buy", id: 'EnCOBJ' },
Nip05: { defaultMessage: "NIP-05", id: '7hp70g' },
ReactionEmoji: { defaultMessage: "Reaction emoji", id: 'eHAneD' },
ReactionEmojiHelp: { defaultMessage: "Emoji to send when reactiong to a note", id: 'gDzDRs' },
SocialGraph: { defaultMessage: "Social Graph", id: 'CzHZoc' },
ConfirmReposts: { defaultMessage: "Confirm Reposts", id: "89q5wc" },
ConfirmRepostsHelp: { defaultMessage: "Reposts need to be manually confirmed", id: "uSV4Ti" },
ShowLatest: { defaultMessage: "Automatically show latest notes", id: "zvCDao" },
ShowLatestHelp: { defaultMessage: "Notes will stream in real time into global and notes tab", id: "a7TDNm" },
FileUpload: { defaultMessage: "File upload service", id: "mKh2HS" },
FileUploadHelp: { defaultMessage: "Pick which upload service you want to upload attachments to", id: "VOjC1i" },
Default: { defaultMessage: "(Default)", id: "rfuMjE" },
DebugMenus: { defaultMessage: "Debug Menus", id: "M3Oirc" },
DebugMenusHelp: {
defaultMessage: `Shows "Copy ID" and "Copy Event JSON" in the context menu on each message`,
id: "MBAYRO",
},
EditProfile: { defaultMessage: "Edit Profile", id: "usAvMr" },
About: { defaultMessage: "About", id: "g5pX+a" },
LnAddress: { defaultMessage: "LN Address", id: "d7d0/x" },
Avatar: { defaultMessage: "Avatar", id: "VnXp8Z" },
Banner: { defaultMessage: "Banner", id: "25V4l1" },
Edit: { defaultMessage: "Edit", id: "wEQDC6" },
PrivateKey: { defaultMessage: "Your Private Key Is (do not share this with anyone)", id: "qdGuQo" },
Add: { defaultMessage: "Add", id: "2/2yg+" },
AddRelays: { defaultMessage: "Add Relays", id: "rT14Ow" },
Name: { defaultMessage: "Name", id: "HAlOn1" },
Website: { defaultMessage: "Website", id: "JkLHGw" },
Save: { defaultMessage: "Save", id: "jvo0vs" },
DisplayName: { defaultMessage: "Display name", id: "dOQCL8" },
Buy: { defaultMessage: "Buy", id: "EnCOBJ" },
Nip05: { defaultMessage: "NIP-05", id: "7hp70g" },
ReactionEmoji: { defaultMessage: "Reaction emoji", id: "eHAneD" },
ReactionEmojiHelp: { defaultMessage: "Emoji to send when reactiong to a note", id: "gDzDRs" },
SocialGraph: { defaultMessage: "Social Graph", id: "CzHZoc" },
});

View File

@ -38,7 +38,8 @@ const ConnectCashu = () => {
} else {
setError(
formatMessage({
defaultMessage: "Unknown error", id: 'qDwvZ4',
defaultMessage: "Unknown error",
id: "qDwvZ4",
}),
);
}

View File

@ -31,7 +31,8 @@ const ConnectLNC = () => {
} else {
setError(
formatMessage({
defaultMessage: "Unknown error", id: 'qDwvZ4',
defaultMessage: "Unknown error",
id: "qDwvZ4",
}),
);
}
@ -60,7 +61,7 @@ const ConnectLNC = () => {
<div className="grow mr10">
<input
type="text"
placeholder={formatMessage({ defaultMessage: "Pairing phrase", id: '8v1NN+' })}
placeholder={formatMessage({ defaultMessage: "Pairing phrase", id: "8v1NN+" })}
className="w-max"
value={pairingPhrase}
onChange={e => setPairingPhrase(e.target.value)}
@ -81,7 +82,8 @@ const ConnectLNC = () => {
<div className="flex flex-col">
<h3>
<FormattedMessage
defaultMessage="Connected to: {node} 🎉" id="1c4YST"
defaultMessage="Connected to: {node} 🎉"
id="1c4YST"
values={{
node: walletInfo?.alias,
}}
@ -94,7 +96,7 @@ const ConnectLNC = () => {
<div className="grow mr10">
<input
type="password"
placeholder={formatMessage({ defaultMessage: "Wallet password", id: 'lTbT3s' })}
placeholder={formatMessage({ defaultMessage: "Wallet password", id: "lTbT3s" })}
className="w-max"
value={walletPassword}
onChange={e => setWalletPassword(e.target.value)}

View File

@ -36,7 +36,8 @@ const ConnectLNDHub = () => {
} else {
setError(
formatMessage({
defaultMessage: "Unknown error", id: 'qDwvZ4',
defaultMessage: "Unknown error",
id: "qDwvZ4",
}),
);
}

View File

@ -36,7 +36,8 @@ const ConnectNostrWallet = () => {
} else {
setError(
formatMessage({
defaultMessage: "Unknown error", id: 'qDwvZ4',
defaultMessage: "Unknown error",
id: "qDwvZ4",
}),
);
}
@ -65,7 +66,8 @@ const ConnectNostrWallet = () => {
{error && <b className="error p10">{error}</b>}
<p>
<FormattedMessage
defaultMessage="Using Alby? Go to {link} to get your NWC config!" id="cFbU1B"
defaultMessage="Using Alby? Go to {link} to get your NWC config!"
id="cFbU1B"
values={{
link: (
<Link to="https://nwc.getalby.com/" target="_blank">

View File

@ -53,7 +53,8 @@ export default function ManageSubscriptionPage() {
{subs.length === 0 && (
<p>
<FormattedMessage
defaultMessage="It looks like you dont have any subscriptions, you can get one {link}" id="W1yoZY"
defaultMessage="It looks like you dont have any subscriptions, you can get one {link}"
id="W1yoZY"
values={{
link: (
<Link to="/subscribe">

View File

@ -60,7 +60,8 @@ export function RenewSub({ sub: s }: { sub?: Subscription }) {
<AsyncButton onClick={() => renew(sub.id, months)}>
{sub.state === "expired" ? (
<FormattedMessage
defaultMessage="Renew {tier}" id="qZsKBR"
defaultMessage="Renew {tier}"
id="qZsKBR"
values={{
tier: mapPlanName(sub.type),
}}
@ -76,7 +77,8 @@ export function RenewSub({ sub: s }: { sub?: Subscription }) {
show={invoice !== ""}
onClose={() => setInvoice("")}
title={formatMessage({
defaultMessage: "Pay for subscription", id: 'Mrpkot',
defaultMessage: "Pay for subscription",
id: "Mrpkot",
})}
/>
{error && <b className="error">{mapSubscriptionErrorCode(error)}</b>}

View File

@ -60,7 +60,8 @@ export default function SubscriptionCard({ sub }: { sub: Subscription }) {
:&nbsp;
<time dateTime={expires.toISOString()}>
<FormattedMessage
defaultMessage="{n} days" id="rmdsT4"
defaultMessage="{n} days"
id="rmdsT4"
values={{
n: <FormattedNumber value={daysToExpire} maximumFractionDigits={0} />,
}}
@ -74,7 +75,8 @@ export default function SubscriptionCard({ sub }: { sub: Subscription }) {
:&nbsp;
<time dateTime={expires.toISOString()}>
<FormattedMessage
defaultMessage="{n} hours" id="2ukA4d"
defaultMessage="{n} hours"
id="2ukA4d"
values={{
n: <FormattedNumber value={hoursToExpire} maximumFractionDigits={0} />,
}}

View File

@ -37,7 +37,9 @@ export function mapFeatureName(k: LockedFeatures) {
case LockedFeatures.RelayBackup:
return <FormattedMessage defaultMessage="Downloadable backups from Snort relay" id="pI+77w" />;
case LockedFeatures.RelayAccess:
return <FormattedMessage defaultMessage="Write access to Snort relay, with 1 year of event retention" id="BGCM48" />;
return (
<FormattedMessage defaultMessage="Write access to Snort relay, with 1 year of event retention" id="BGCM48" />
);
case LockedFeatures.LNProxy:
return <FormattedMessage defaultMessage="LN Address Proxy" id="SYQtZ7" />;
case LockedFeatures.EmailBridge:
@ -52,7 +54,12 @@ export function mapSubscriptionErrorCode(c: SubscriptionError) {
case SubscriptionErrorCode.SubscriptionActive:
return <FormattedMessage defaultMessage="You subscription is still active, you can't renew yet" id="OQXnew" />;
case SubscriptionErrorCode.Duplicate:
return <FormattedMessage defaultMessage="You already have a subscription of this type, please renew or pay" id="NAuFNH" />;
return (
<FormattedMessage
defaultMessage="You already have a subscription of this type, please renew or pay"
id="NAuFNH"
/>
);
default:
return c.message;
}
@ -87,7 +94,8 @@ export function SubscribePage() {
<h2>{mapPlanName(a.id)}</h2>
<p>
<FormattedMessage
defaultMessage="Subscribe to {site_name} {plan} for {price} and receive the following rewards" id="JSx7y9"
defaultMessage="Subscribe to {site_name} {plan} for {price} and receive the following rewards"
id="JSx7y9"
values={{
site_name: CONFIG.appNameCapitalized,
plan: mapPlanName(a.id),
@ -103,7 +111,8 @@ export function SubscribePage() {
{lower.map(b => (
<li>
<FormattedMessage
defaultMessage="Everything in {plan}" id="l+ikU1"
defaultMessage="Everything in {plan}"
id="l+ikU1"
values={{
plan: mapPlanName(b.id),
}}

View File

@ -14,7 +14,8 @@ export class DonateTask extends BaseUITask {
<>
<p>
<FormattedMessage
defaultMessage="Thanks for using {site}, please consider donating if you can." id="fBlba3"
defaultMessage="Thanks for using {site}, please consider donating if you can."
id="fBlba3"
values={{ site: CONFIG.appNameCapitalized }}
/>
</p>

View File

@ -14,7 +14,8 @@ export class Nip5Task extends BaseUITask {
return (
<p>
<FormattedMessage
defaultMessage="Hey, it looks like you dont have a Nostr Address yet, you should get one! Check out {link}" id="ojzbwv"
defaultMessage="Hey, it looks like you dont have a Nostr Address yet, you should get one! Check out {link}"
id="ojzbwv"
values={{
link: (
<Link to="/nostr-address">

View File

@ -14,7 +14,8 @@ export class NoticeZapPoolDefault extends BaseUITask {
<>
<p>
<FormattedMessage
defaultMessage="A default Zap Pool split of {n} has been configured for {site} developers, you can disable it at any time in {link}" id="dmsiLv"
defaultMessage="A default Zap Pool split of {n} has been configured for {site} developers, you can disable it at any time in {link}"
id="dmsiLv"
values={{
site: CONFIG.appNameCapitalized,
n: (

View File

@ -19,7 +19,8 @@ export class RenewSubTask extends BaseUITask {
<>
<p>
<FormattedMessage
defaultMessage="Your {site_name} subscription is expired" id="jAmfGl"
defaultMessage="Your {site_name} subscription is expired"
id="jAmfGl"
values={{
site_name: CONFIG.appName,
}}

View File

@ -99,8 +99,8 @@ export default class LNDHubWallet implements LNWallet {
state: pRsp.payment_error
? WalletInvoiceState.Failed
: pRsp.payment_preimage
? WalletInvoiceState.Paid
: WalletInvoiceState.Pending,
? WalletInvoiceState.Paid
: WalletInvoiceState.Pending,
} as WalletInvoice;
}

View File

@ -21,7 +21,7 @@ import {
encodeTLVEntries,
socialGraphInstance,
} from "@snort/system";
import PowWorkerURL from '@snort/system/src/pow-worker.ts?worker&url';
import PowWorkerURL from "@snort/system/src/pow-worker.ts?worker&url";
import { SnortContext } from "@snort/system-react";
import { removeUndefined, throwIfOffline } from "@snort/shared";
@ -313,4 +313,4 @@ window.encodeTLV = encodeTLVEntries;
// Use react-helmet instead?
document.title = CONFIG.appTitle;
document.querySelector('link[rel="apple-touch-icon"]')?.setAttribute('href', CONFIG.appleTouchIconUrl);
document.querySelector('link[rel="apple-touch-icon"]')?.setAttribute("href", CONFIG.appleTouchIconUrl);

View File

@ -1047,6 +1047,9 @@
"eXT2QQ": {
"defaultMessage": "Group Chat"
},
"egib+2": {
"defaultMessage": "{n,plural,=1{& {n} other} other{& {n} others}}"
},
"fBI91o": {
"defaultMessage": "Zap"
},
@ -1421,9 +1424,6 @@
"vN5UH8": {
"defaultMessage": "Profile Image"
},
"vOKedj": {
"defaultMessage": "{n,plural,=1{& {n} other} other{& {n} others}}"
},
"vZ4quW": {
"defaultMessage": "NIP-05 is a DNS based verification spec which helps to validate you as a real user."
},

View File

@ -2,8 +2,8 @@
//import ServiceWorkerURL from "./service-worker?worker&url";
export function register() {
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
if ("serviceWorker" in navigator) {
window.addEventListener("load", () => {
//registerValidSW(ServiceWorkerURL);
});
}
@ -37,7 +37,7 @@ async function registerValidSW(swUrl: string) {
*/
export async function unregister() {
if ('serviceWorker' in navigator) {
if ("serviceWorker" in navigator) {
const registration = await navigator.serviceWorker.ready;
await registration.unregister();
}

View File

@ -344,6 +344,7 @@
"eJj8HD": "Get Verified",
"eSzf2G": "A single zap of {nIn} sats will allocate {nOut} sats to the zap pool.",
"eXT2QQ": "Group Chat",
"egib+2": "{n,plural,=1{& {n} other} other{& {n} others}}",
"fBI91o": "Zap",
"fBlba3": "Thanks for using {site}, please consider donating if you can.",
"fOksnD": "Can't vote because LNURL service does not support zaps",
@ -468,7 +469,6 @@
"v8lolG": "Start chat",
"vB3oQ/": "Must be a contact list or pubkey list",
"vN5UH8": "Profile Image",
"vOKedj": "{n,plural,=1{& {n} other} other{& {n} others}}",
"vZ4quW": "NIP-05 is a DNS based verification spec which helps to validate you as a real user.",
"vhlWFg": "Poll Options",
"vlbWtt": "Get a free one",

View File

@ -1,7 +1,7 @@
import react from '@vitejs/plugin-react';
import { VitePWA } from 'vite-plugin-pwa';
import { visualizer } from 'rollup-plugin-visualizer';
import { defineConfig, type PluginOption } from 'vite';
import react from "@vitejs/plugin-react";
import { VitePWA } from "vite-plugin-pwa";
import { visualizer } from "rollup-plugin-visualizer";
import { defineConfig } from "vite";
import appConfig from "config";
@ -9,24 +9,24 @@ export default defineConfig({
plugins: [
react(),
VitePWA({
strategies: 'injectManifest',
srcDir: 'src',
filename: 'service-worker.ts',
strategies: "injectManifest",
srcDir: "src",
filename: "service-worker.ts",
devOptions: {
enabled: true,
type: 'module',
}
type: "module",
},
}),
visualizer({
open: true,
gzipSize: true,
filename: 'dist/stats.html',
} as PluginOption),
filename: "dist/stats.html",
}),
],
assetsInclude: ['**/*.md'],
assetsInclude: ["**/*.md"],
resolve: {
alias: {
'@': '/src',
"@": "/src",
},
},
define: {

View File

@ -18,8 +18,8 @@ export class PowWorker implements PowMiner {
constructor(workerPath: string) {
this.#worker = new Worker(workerPath, {
type: 'module',
name: 'POW',
type: "module",
name: "POW",
});
this.#worker.onerror = ev => {
console.error(ev);