Upgrades:

- Profile Editor
- Categories
- FAQ
- Search
This commit is contained in:
2024-03-05 12:19:47 +00:00
parent 2e43b4ef8b
commit 5b718c5dcf
51 changed files with 1199 additions and 6591 deletions

View File

@ -1,15 +1,8 @@
module.exports = { module.exports = {
extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"], extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
parser: "@typescript-eslint/parser", parser: "@typescript-eslint/parser",
plugins: ["@typescript-eslint", "formatjs"], plugins: ["@typescript-eslint"],
rules: { rules: {},
"formatjs/enforce-id": [
"error",
{
idInterpolationPattern: "[sha512:contenthash:base64:6]",
},
],
},
root: true, root: true,
ignorePatterns: ["build/", "*.test.ts", "*.js"], ignorePatterns: ["build/", "*.test.ts", "*.js"],
env: { env: {

11
babel.config.json Normal file
View File

@ -0,0 +1,11 @@
{
"plugins": [
[
"formatjs",
{
"idInterpolationPattern": "[sha512:contenthash:base64:6]",
"ast": true
}
]
]
}

View File

@ -73,7 +73,6 @@
"devDependencies": { "devDependencies": {
"@cloudflare/workers-types": "^4.20231218.0", "@cloudflare/workers-types": "^4.20231218.0",
"@formatjs/cli": "^6.1.3", "@formatjs/cli": "^6.1.3",
"@formatjs/ts-transformer": "^3.13.3",
"@testing-library/dom": "^9.3.1", "@testing-library/dom": "^9.3.1",
"@types/node": "^20.10.3", "@types/node": "^20.10.3",
"@types/react": "^18.2.21", "@types/react": "^18.2.21",
@ -84,8 +83,8 @@
"@vitejs/plugin-react": "^4.2.0", "@vitejs/plugin-react": "^4.2.0",
"@webbtc/webln-types": "^1.0.12", "@webbtc/webln-types": "^1.0.12",
"autoprefixer": "^10.4.16", "autoprefixer": "^10.4.16",
"babel-plugin-formatjs": "^10.5.13",
"eslint": "^8.48.0", "eslint": "^8.48.0",
"eslint-plugin-formatjs": "^4.11.3",
"postcss": "^8.4.32", "postcss": "^8.4.32",
"prettier": "^2.8.8", "prettier": "^2.8.8",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",

View File

@ -125,5 +125,22 @@
<symbol id="bell-off" viewBox="0 0 24 24" fill="none"> <symbol id="bell-off" viewBox="0 0 24 24" fill="none">
<path d="M8.63306 3.03371C9.61959 2.3649 10.791 2 12 2C13.5913 2 15.1174 2.63214 16.2426 3.75736C17.3679 4.88258 18 6.4087 18 8C18 10.1008 18.2702 11.7512 18.6484 13.0324M6.25867 6.25724C6.08866 6.81726 6 7.40406 6 8C6 11.0902 5.22047 13.206 4.34966 14.6054C3.61513 15.7859 3.24786 16.3761 3.26132 16.5408C3.27624 16.7231 3.31486 16.7926 3.46178 16.9016C3.59446 17 4.19259 17 5.38885 17H17M9.35418 21C10.0593 21.6224 10.9856 22 12 22C13.0144 22 13.9407 21.6224 14.6458 21M21 21L3 3" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M8.63306 3.03371C9.61959 2.3649 10.791 2 12 2C13.5913 2 15.1174 2.63214 16.2426 3.75736C17.3679 4.88258 18 6.4087 18 8C18 10.1008 18.2702 11.7512 18.6484 13.0324M6.25867 6.25724C6.08866 6.81726 6 7.40406 6 8C6 11.0902 5.22047 13.206 4.34966 14.6054C3.61513 15.7859 3.24786 16.3761 3.26132 16.5408C3.27624 16.7231 3.31486 16.7926 3.46178 16.9016C3.59446 17 4.19259 17 5.38885 17H17M9.35418 21C10.0593 21.6224 10.9856 22 12 22C13.0144 22 13.9407 21.6224 14.6458 21M21 21L3 3" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</symbol> </symbol>
<symbol id="gaming-pad" viewBox="0 0 37 28" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.5099 0.666992H16.1997C14.0717 0.66698 12.3762 0.66697 11.0018 0.775829C9.59216 0.887489 8.38591 1.12102 7.26586 1.66186C5.45183 2.53779 3.94463 3.94117 2.94168 5.68818C2.32242 6.76685 2.00354 7.9534 1.79173 9.35154C1.58523 10.7146 1.46444 12.4058 1.31284 14.5284L0.897789 20.3391C0.627814 24.1187 3.6213 27.3337 7.41057 27.3337C9.34835 27.3337 11.186 26.4729 12.4266 24.9843L13.0518 24.234C13.6608 23.5032 13.8439 23.2924 14.0355 23.1292C14.4906 22.7416 15.0415 22.4836 15.6306 22.3821C15.8787 22.3393 16.1578 22.3337 17.1091 22.3337H20.6005C21.5518 22.3337 21.8309 22.3393 22.079 22.3821C22.6681 22.4836 23.219 22.7416 23.6741 23.1292C23.8657 23.2924 24.0488 23.5032 24.6578 24.234L25.283 24.9843C26.5236 26.4729 28.3613 27.3337 30.299 27.3337C34.0883 27.3337 37.0818 24.1187 36.8118 20.3391L36.3968 14.5283C36.2452 12.4057 36.1244 10.7146 35.9179 9.35154C35.7061 7.9534 35.3872 6.76685 34.7679 5.68818C33.765 3.94117 32.2578 2.53779 30.4438 1.66186C29.3237 1.12102 28.1175 0.887489 26.7078 0.775829C25.3335 0.66697 23.638 0.66698 21.5099 0.666992ZM13.8549 9.00033C13.8549 8.07985 13.1087 7.33366 12.1882 7.33366C11.2678 7.33366 10.5216 8.07985 10.5216 9.00033V10.667H8.8549C7.93442 10.667 7.18823 11.4132 7.18823 12.3337C7.18823 13.2541 7.93442 14.0003 8.8549 14.0003H10.5216V15.667C10.5216 16.5875 11.2678 17.3337 12.1882 17.3337C13.1087 17.3337 13.8549 16.5875 13.8549 15.667V14.0003H15.5216C16.442 14.0003 17.1882 13.2541 17.1882 12.3337C17.1882 11.4132 16.442 10.667 15.5216 10.667H13.8549V9.00033ZM22.1882 14.0003C22.1882 13.0799 22.9344 12.3337 23.8549 12.3337H23.8716C24.792 12.3337 25.5382 13.0799 25.5382 14.0003C25.5382 14.9208 24.792 15.667 23.8716 15.667H23.8549C22.9344 15.667 22.1882 14.9208 22.1882 14.0003ZM27.1882 10.667C27.1882 9.74652 27.9344 9.00033 28.8549 9.00033H28.8716C29.792 9.00033 30.5382 9.74652 30.5382 10.667C30.5382 11.5875 29.792 12.3337 28.8716 12.3337H28.8549C27.9344 12.3337 27.1882 11.5875 27.1882 10.667Z" fill="currentColor"/>
</symbol>
<symbol id="music" viewBox="0 0 34 34" fill="none">
<path d="M30.5657 3.9984C30.3354 4.01658 30.0182 4.06796 29.4548 4.16186L14.7881 6.60631C14.3675 6.6764 14.1433 6.7149 13.9836 6.75408L13.9673 6.75814L13.966 6.77482C13.9536 6.93879 13.9525 7.16636 13.9525 7.5927V27.0004L13.9525 27.0064C13.9492 30.6855 10.9657 33.667 7.28581 33.667C3.60391 33.667 0.619141 30.6822 0.619141 27.0003C0.619141 23.3184 3.60391 20.3337 7.28581 20.3337C8.5001 20.3337 9.63857 20.6583 10.6191 21.2255L10.6191 7.54533C10.6191 7.18514 10.6191 6.82875 10.6421 6.52345C10.6678 6.18388 10.7282 5.78915 10.9112 5.38122C11.1686 4.80743 11.583 4.31816 12.1067 3.96993C12.479 3.72235 12.8584 3.59795 13.1892 3.51679C13.4865 3.44383 13.8381 3.38528 14.1934 3.32611L28.9648 0.864195C29.4487 0.783497 29.9113 0.706348 30.3035 0.675395C30.7269 0.641978 31.2436 0.643885 31.7798 0.843043C32.5104 1.11441 33.1228 1.63321 33.5106 2.30926C33.7952 2.80542 33.882 3.31476 33.9186 3.7379C33.9526 4.12979 33.9525 4.59869 33.9525 5.08915L33.9525 23.667C33.9525 23.7598 33.9449 23.8507 33.9303 23.9393C33.7875 27.495 30.8598 30.3337 27.2691 30.3337C23.5872 30.3337 20.6025 27.3489 20.6025 23.667C20.6025 19.9851 23.5872 17.0003 27.2691 17.0003C28.4903 17.0003 29.6348 17.3287 30.6191 17.9019V5.14826C30.6191 4.57708 30.6177 4.25572 30.5977 4.02551L30.595 3.99626L30.5657 3.9984Z" fill="currentColor"/>
</symbol>
<symbol id="mic" viewBox="0 0 27 38" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.5716 0.666992C9.88972 0.666992 6.90495 3.65176 6.90495 7.33366V19.0003C6.90495 22.6822 9.88972 25.667 13.5716 25.667C17.2535 25.667 20.2383 22.6822 20.2383 19.0003V7.33366C20.2383 3.65176 17.2535 0.666992 13.5716 0.666992Z" fill="currentColor"/>
<path d="M3.57161 15.667C3.57161 14.7465 2.82542 14.0003 1.90495 14.0003C0.984473 14.0003 0.238281 14.7465 0.238281 15.667V19.0003C0.238281 25.8008 5.32937 31.4121 11.9081 32.2309C11.906 32.2649 11.9049 32.2991 11.9049 32.3337V34.0003H6.90495C5.98447 34.0003 5.23828 34.7465 5.23828 35.667C5.23828 36.5875 5.98447 37.3337 6.90495 37.3337H20.2383C21.1588 37.3337 21.9049 36.5875 21.9049 35.667C21.9049 34.7465 21.1588 34.0003 20.2383 34.0003H15.2383V32.3337C15.2383 32.2991 15.2372 32.2649 15.2352 32.2309C21.8139 31.4121 26.9049 25.8008 26.9049 19.0003V15.667C26.9049 14.7465 26.1588 14.0003 25.2383 14.0003C24.3178 14.0003 23.5716 14.7465 23.5716 15.667V19.0003C23.5716 24.5232 19.0945 29.0003 13.5716 29.0003C8.04877 29.0003 3.57161 24.5232 3.57161 19.0003V15.667Z" fill="currentColor"/>
</symbol>
<symbol id="art" viewBox="0 0 38 38" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.666992 19.0003C0.666992 8.87511 8.87511 0.666992 19.0003 0.666992C29.1255 0.666992 37.3337 8.87511 37.3337 19.0003C37.3337 22.6822 34.3489 25.667 30.667 25.667H29.8337C29.0066 25.667 28.7545 25.6706 28.5652 25.6955C27.0695 25.8924 25.8924 27.0695 25.6955 28.5652C25.6706 28.7545 25.667 29.0066 25.667 29.8337V30.667C25.667 34.3489 22.6822 37.3337 19.0003 37.3337C8.87511 37.3337 0.666992 29.1255 0.666992 19.0003ZM15.667 7.33366C13.826 7.33366 12.3337 8.82604 12.3337 10.667C12.3337 12.5079 13.826 14.0003 15.667 14.0003C17.5079 14.0003 19.0003 12.5079 19.0003 10.667C19.0003 8.82604 17.5079 7.33366 15.667 7.33366ZM22.3337 12.3337C22.3337 10.4927 23.826 9.00033 25.667 9.00033C27.5079 9.00033 29.0003 10.4927 29.0003 12.3337C29.0003 14.1746 27.5079 15.667 25.667 15.667C23.826 15.667 22.3337 14.1746 22.3337 12.3337ZM7.33366 19.0003C7.33366 17.1594 8.82604 15.667 10.667 15.667C12.5079 15.667 14.0003 17.1594 14.0003 19.0003C14.0003 20.8413 12.5079 22.3337 10.667 22.3337C8.82604 22.3337 7.33366 20.8413 7.33366 19.0003Z" fill="currentColor"/>
</symbol>
<symbol id="twitter" viewBox="0 0 24 20" fill="none">
<path d="M24 2.60005C23.1 3.00005 22.2 3.30005 21.2 3.40005C22.2 2.80005 23 1.80005 23.4 0.700049C22.4 1.30005 21.4 1.70005 20.3 1.90005C19.4 0.900049 18.1 0.300049 16.7 0.300049C14 0.300049 11.8 2.50005 11.8 5.20005C11.8 5.60005 11.8 6.00005 11.9 6.30005C7.7 6.10005 4.1 4.10005 1.7 1.10005C1.2 1.90005 1 2.70005 1 3.60005C1 5.30005 1.9 6.80005 3.2 7.70005C2.4 7.70005 1.6 7.50005 1 7.10005C1 7.10005 1 7.10005 1 7.20005C1 9.60005 2.7 11.6 4.9 12C4.5 12.1 4.1 12.2 3.6 12.2C3.3 12.2 3 12.2 2.7 12.1C3.3 14.1 5.1 15.5 7.3 15.5C5.6 16.8 3.5 17.6 1.2 17.6C0.8 17.6 0.4 17.6 0 17.5C2.2 18.9 4.8 19.7001 7.5 19.7001C16.6 19.7001 21.5 12.2 21.5 5.70005C21.5 5.50005 21.5 5.30005 21.5 5.10005C22.5 4.40005 23.3 3.50005 24 2.60005Z" fill="currentColor"/>
</symbol>
</defs> </defs>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

@ -0,0 +1,15 @@
import { ReactNode } from "react";
import { Link } from "react-router-dom";
import { Icon } from "./icon";
export default function CategoryLink({ id, name, icon }: { id: string; name: ReactNode; icon: string }) {
return (
<Link
to={`/category/${id}`}
key={id}
className="min-w-[10rem] flex items-center justify-between px-6 py-4 rounded-xl bg-layer-1">
{name}
<Icon name={icon} />
</Link>
);
}

View File

@ -1,5 +1,6 @@
import type { ReactNode } from "react"; import type { ReactNode } from "react";
import { Icon } from "./icon"; import { Icon } from "./icon";
import { Link } from "react-router-dom";
interface ExternalLinkProps { interface ExternalLinkProps {
href: string; href: string;
@ -8,9 +9,9 @@ interface ExternalLinkProps {
export function ExternalLink({ children, href }: ExternalLinkProps) { export function ExternalLink({ children, href }: ExternalLinkProps) {
return ( return (
<a href={href} rel="noopener noreferrer" target="_blank" className="text-primary"> <Link to={href} rel="noopener noreferrer" target="_blank" className="text-primary">
{children} {children}
</a> </Link>
); );
} }

View File

@ -1,6 +1,7 @@
import type { ReactNode } from "react"; import type { ReactNode } from "react";
import { NostrLink } from "./nostr-link"; import { NostrLink } from "./nostr-link";
import { MediaURL } from "./collapsible"; import { MediaURL } from "./collapsible";
import { ExternalLink } from "./external-link";
const FileExtensionRegex = /\.([\w]+)$/i; const FileExtensionRegex = /\.([\w]+)$/i;
@ -50,22 +51,16 @@ export function HyperText({ link, children }: HyperTextProps) {
); );
} }
default: default:
return <a href={url.toString()}>{children || url.toString()}</a>; return <ExternalLink href={url.toString()}>{children || url.toString()}</ExternalLink>;
} }
} else if (url.protocol === "nostr:" || url.protocol === "web+nostr:") { } else if (url.protocol === "nostr:" || url.protocol === "web+nostr:") {
return <NostrLink link={link} />; return <NostrLink link={link} />;
} else { } else {
<a href={link} target="_blank" rel="noreferrer"> <ExternalLink href={link}>{children}</ExternalLink>;
{children}
</a>;
} }
} catch (error) { } catch (error) {
console.error(error); console.error(error);
// Ignore the error. // Ignore the error.
} }
return ( return <ExternalLink href={link}>{children}</ExternalLink>;
<a href={link} target="_blank" rel="noreferrer">
{children}
</a>
);
} }

View File

@ -25,6 +25,7 @@ import { openFile } from "@/utils";
import { DefaultProvider, StreamProviderInfo } from "@/providers"; import { DefaultProvider, StreamProviderInfo } from "@/providers";
import { NostrStreamProvider } from "@/providers/zsz"; import { NostrStreamProvider } from "@/providers/zsz";
import { DefaultButton, Layer1Button } from "./buttons"; import { DefaultButton, Layer1Button } from "./buttons";
import { ExternalLink } from "./external-link";
enum Stage { enum Stage {
Login = 0, Login = 0,
@ -205,9 +206,9 @@ export function LoginSignup({ close }: { close: () => void }) {
id="Z8ZOEY" id="Z8ZOEY"
values={{ values={{
nostrlink: ( nostrlink: (
<a href=""> <ExternalLink href="">
<FormattedMessage defaultMessage="nostr signer extension" id="/EvlqN" /> <FormattedMessage defaultMessage="nostr signer extension" id="/EvlqN" />
</a> </ExternalLink>
), ),
}} }}
/> />

View File

@ -1,13 +1,12 @@
import { NostrPrefix, tryParseNostrLink } from "@snort/system"; import { NostrPrefix, tryParseNostrLink } from "@snort/system";
import { Mention } from "./mention"; import { Mention } from "./mention";
import { ExternalLink } from "./external-link";
export function NostrLink({ link }: { link: string }) { export function NostrLink({ link }: { link: string }) {
const nav = tryParseNostrLink(link); const nav = tryParseNostrLink(link);
if (nav?.type === NostrPrefix.PublicKey || nav?.type === NostrPrefix.Profile) { if (nav?.type === NostrPrefix.PublicKey || nav?.type === NostrPrefix.Profile) {
return <Mention pubkey={nav.id} relays={nav.relays} />; return <Mention pubkey={nav.id} relays={nav.relays} />;
} else { } else {
<a href={link} target="_blank" rel="noreferrer" className="ext"> <ExternalLink href={link}>{link}</ExternalLink>;
{link}
</a>;
} }
} }

View File

@ -0,0 +1,297 @@
import { useState, useEffect, useContext } from "react";
import { FormattedMessage, useIntl } from "react-intl";
import { LNURL, fetchNip05Pubkey } from "@snort/shared";
import { mapEventToProfile } from "@snort/system";
import { SnortContext, useUserProfile } from "@snort/system-react";
import { useLogin } from "@/hooks/login";
import { debounce, openFile } from "@/utils";
import { PrimaryButton } from "./buttons";
import { VoidApi } from "@void-cat/api";
const MaxUsernameLength = 100;
const MaxAboutLength = 500;
export function ProfileEditor({ onClose }: { onClose: () => void }) {
const login = useLogin();
const user = useUserProfile(login?.pubkey);
const { formatMessage } = useIntl();
const system = useContext(SnortContext);
const [error, setError] = useState<Error>();
const [name, setName] = useState<string>();
const [picture, setPicture] = useState<string>();
const [banner, setBanner] = useState<string>();
const [about, setAbout] = useState<string>();
const [website, setWebsite] = useState<string>();
const [nip05, setNip05] = useState<string>();
const [lud16, setLud16] = useState<string>();
const [nip05AddressValid, setNip05AddressValid] = useState<boolean>();
const [invalidNip05AddressMessage, setInvalidNip05AddressMessage] = useState<string>();
const [usernameValid, setUsernameValid] = useState<boolean>();
const [invalidUsernameMessage, setInvalidUsernameMessage] = useState<string>();
const [aboutValid, setAboutValid] = useState<boolean>();
const [invalidAboutMessage, setInvalidAboutMessage] = useState<string>();
const [lud16Valid, setLud16Valid] = useState<boolean>();
const [invalidLud16Message, setInvalidLud16Message] = useState<string>();
useEffect(() => {
if (user) {
setName(user.name);
setPicture(user.picture);
setBanner(user.banner);
setAbout(user.about);
setWebsite(user.website);
setNip05(user.nip05);
setLud16(user.lud16);
}
}, [user]);
useEffect(() => {
return debounce(500, async () => {
if (lud16) {
try {
await new LNURL(lud16).load();
setLud16Valid(true);
setInvalidLud16Message("");
} catch (e) {
setLud16Valid(false);
setInvalidLud16Message(
formatMessage({
defaultMessage: "Invalid lightning address",
})
);
}
} else {
setInvalidLud16Message("");
}
});
}, [formatMessage, lud16]);
useEffect(() => {
async function nip05NostrAddressVerification(nip05Domain: string | undefined, nip05Name: string | undefined) {
try {
const result = await fetchNip05Pubkey(nip05Name!, nip05Domain!);
if (result) {
if (result === login?.pubkey) {
setNip05AddressValid(true);
} else {
setInvalidNip05AddressMessage(
formatMessage({ defaultMessage: "Nostr address does not belong to you", id: "01iNut" })
);
}
} else {
setNip05AddressValid(false);
setInvalidNip05AddressMessage(
formatMessage({
defaultMessage: "Invalid nostr address",
})
);
}
} catch (e) {
setNip05AddressValid(false);
setInvalidNip05AddressMessage(
formatMessage({
defaultMessage: "Invalid nostr address",
})
);
}
}
return debounce(500, async () => {
const Nip05AddressElements = nip05?.split("@") ?? [];
if ((nip05?.length ?? 0) === 0) {
setNip05AddressValid(false);
setInvalidNip05AddressMessage("");
} else if (Nip05AddressElements.length < 2) {
setNip05AddressValid(false);
setInvalidNip05AddressMessage(
formatMessage({
defaultMessage: "Invalid nostr address",
})
);
} else if (Nip05AddressElements.length === 2) {
nip05NostrAddressVerification(Nip05AddressElements.pop(), Nip05AddressElements.pop());
} else {
setNip05AddressValid(false);
}
});
}, [formatMessage, login?.pubkey, nip05]);
async function uploadAvatar() {
const defaultError = formatMessage({
defaultMessage: "Avatar upload fialed",
id: "uTonxS",
});
setError(undefined);
try {
const file = await openFile();
if (file) {
const VoidCatHost = "https://void.cat";
const api = new VoidApi(VoidCatHost);
const uploader = api.getUploader(file);
const result = await uploader.upload({
"V-Strip-Metadata": "true",
});
console.debug(result);
if (result.ok) {
const resultUrl = result.file?.metadata?.url ?? `${VoidCatHost}/d/${result.file?.id}`;
setPicture(resultUrl);
} else {
setError(new Error(result.errorMessage ?? defaultError));
}
}
} catch {
setError(new Error(defaultError));
}
}
async function saveProfile() {
// copy user object and delete internal fields
const userCopy = {
...user,
name,
about,
picture,
banner,
website,
nip05,
lud16,
} as Record<string, string | number | undefined | boolean>;
delete userCopy["loaded"];
delete userCopy["created"];
delete userCopy["pubkey"];
delete userCopy["npub"];
delete userCopy["deleted"];
delete userCopy["zapService"];
delete userCopy["isNostrAddressValid"];
console.debug(userCopy);
const publisher = login?.publisher();
if (publisher) {
const ev = await publisher.metadata(userCopy);
system.BroadcastEvent(ev);
const newProfile = mapEventToProfile(ev);
if (newProfile) {
await system.profileLoader.cache.update(newProfile);
}
onClose();
}
}
async function onNip05Change(e: React.ChangeEvent<HTMLInputElement>) {
const Nip05Address = e.target.value.toLowerCase();
setNip05(Nip05Address);
}
async function onLimitCheck(val: string, field: string) {
if (field === "username") {
setName(val);
if (val?.length >= MaxUsernameLength) {
setUsernameValid(false);
setInvalidUsernameMessage(
formatMessage({
defaultMessage: "Username is too long",
})
);
} else {
setUsernameValid(true);
setInvalidUsernameMessage("");
}
} else if (field === "about") {
setAbout(val);
if (val?.length >= MaxAboutLength) {
setAboutValid(false);
setInvalidAboutMessage(
formatMessage({
defaultMessage: "About too long",
})
);
} else {
setAboutValid(true);
setInvalidAboutMessage("");
}
}
}
async function onLud16Change(address: string) {
setLud16(address);
}
function editor() {
if (!login?.pubkey) return;
return (
<div className="flex flex-col gap-4">
<div className="mx-auto relative flex items-center justify-center w-40 h-40 aspect-square rounded-full overflow-hidden">
<img className="absolute w-full h-full object-cover" src={picture} />
<div
className="flex items-center justify-center absolute w-full h-full opacity-0 hover:opacity-80 bg-foreground cursor-pointer"
onClick={() => uploadAvatar()}>
<FormattedMessage defaultMessage="Edit" />
</div>
</div>
<div className="flex flex-col w-full gap-2">
<h4>
<FormattedMessage defaultMessage="Name" />
</h4>
<input
className="w-full"
type="text"
value={name}
onChange={e => onLimitCheck(e.target.value, "username")}
maxLength={MaxUsernameLength}
/>
<div>{usernameValid === false ? <span className="text-delete">{invalidUsernameMessage}</span> : <></>}</div>
</div>
<div className="flex flex-col w-full gap-2">
<h4>
<FormattedMessage defaultMessage="About" />
</h4>
<textarea
className="w-full"
onChange={e => onLimitCheck(e.target.value, "about")}
value={about}
maxLength={MaxAboutLength}></textarea>
<div>{aboutValid === false ? <span className="text-delete">{invalidAboutMessage}</span> : <></>}</div>
</div>
<div className="flex flex-col w-full gap-2">
<h4>
<FormattedMessage defaultMessage="Website" />
</h4>
<input className="w-full" type="text" value={website} onChange={e => setWebsite(e.target.value)} />
</div>
<div className="flex flex-col w-full gap-2">
<h4>
<FormattedMessage defaultMessage="Nostr Address" />
</h4>
<div className="flex flex-col gap-2 w-full">
<input type="text" className="w-full" value={nip05} onChange={e => onNip05Change(e)} />
<div>{!nip05AddressValid && <span className="text-delete">{invalidNip05AddressMessage}</span>}</div>
<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." />
</small>
</div>
</div>
<div className="flex flex-col w-full gap-2">
<h4>
<FormattedMessage defaultMessage="Lightning Address" />
</h4>
<input
className="w-full"
type="text"
value={lud16}
onChange={e => onLud16Change(e.target.value.toLowerCase())}
/>
<div>{lud16Valid === false ? <span className="text-delete">{invalidLud16Message}</span> : <></>}</div>
</div>
{error && <b className="text-delete">{error.message}</b>}
<PrimaryButton onClick={() => saveProfile()}>
<FormattedMessage defaultMessage="Save" />
</PrimaryButton>
</div>
);
}
return editor();
}

View File

@ -59,7 +59,7 @@ export function ShareMenu({ ev }: { ev: NostrEvent }) {
menuClassName="ctx-menu" menuClassName="ctx-menu"
menuButton={ menuButton={
<DefaultButton> <DefaultButton>
<FormattedMessage defaultMessage="Share" id="OKhRC6" /> <FormattedMessage defaultMessage="Share" />
</DefaultButton> </DefaultButton>
}> }>
<MenuItem <MenuItem
@ -67,14 +67,24 @@ export function ShareMenu({ ev }: { ev: NostrEvent }) {
setShare("nostr"); setShare("nostr");
}}> }}>
<Icon name="nostrich" size={24} /> <Icon name="nostrich" size={24} />
<FormattedMessage defaultMessage="Broadcast on Nostr" id="wCIL7o" /> <FormattedMessage defaultMessage="Broadcast on Nostr" />
</MenuItem>
<MenuItem
onClick={() => {
window.open(
`https://twitter.com/intent/tweet?text=${encodeURIComponent(message)}&via=zap_stream`,
"_blank"
);
}}>
<Icon name="twitter" size={24} />
<FormattedMessage defaultMessage="Share on X" />
</MenuItem> </MenuItem>
</Menu> </Menu>
{share && ( {share && (
<Modal id="share" onClose={() => setShare(undefined)}> <Modal id="share" onClose={() => setShare(undefined)}>
<div className="flex flex-col gap-4"> <div className="flex flex-col gap-4">
<h2> <h2>
<FormattedMessage defaultMessage="Share" id="OKhRC6" /> <FormattedMessage defaultMessage="Share" />
</h2> </h2>
<Textarea <Textarea
emojis={[]} emojis={[]}

View File

@ -5,6 +5,7 @@ import { NostrEvent } from "@snort/system";
import { findTag, getTagValues } from "@/utils"; import { findTag, getTagValues } from "@/utils";
import { StreamState } from "@/const"; import { StreamState } from "@/const";
import Pill from "./pill"; import Pill from "./pill";
import { Link } from "react-router-dom";
export function Tags({ children, max, ev }: { children?: ReactNode; max?: number; ev: NostrEvent }) { export function Tags({ children, max, ev }: { children?: ReactNode; max?: number; ev: NostrEvent }) {
const status = findTag(ev, "status"); const status = findTag(ev, "status");
@ -18,9 +19,9 @@ export function Tags({ children, max, ev }: { children?: ReactNode; max?: number
<Pill>{status === StreamState.Planned ? <FormattedMessage defaultMessage="Starts " id="0hNxBy" /> : ""}</Pill> <Pill>{status === StreamState.Planned ? <FormattedMessage defaultMessage="Starts " id="0hNxBy" /> : ""}</Pill>
)} )}
{tags.map(a => ( {tags.map(a => (
<a href={`/t/${encodeURIComponent(a)}`} key={a}> <Link to={`/t/${encodeURIComponent(a)}`} key={a}>
<Pill>{a}</Pill> <Pill>{a}</Pill>
</a> </Link>
))} ))}
</> </>
); );

View File

@ -0,0 +1,87 @@
import { useLogin } from "@/hooks/login";
import { useLiveStreams } from "@/hooks/useLiveStreams";
import { getTagValues, getHost } from "@/utils";
import { NostrEvent, TaggedNostrEvent } from "@snort/system";
import { ReactNode, useCallback, useMemo } from "react";
import { FormattedMessage } from "react-intl";
import VideoGrid from "./video-grid";
import { VideoTile } from "./video-tile";
export default function VideoGridSorted({ evs }: { evs: Array<TaggedNostrEvent> }) {
const login = useLogin();
const mutedHosts = new Set(getTagValues(login?.muted.tags ?? [], "p"));
const tags = login?.follows.tags ?? [];
const followsHost = useCallback(
(ev: NostrEvent) => {
return tags.find(t => t.at(1) === getHost(ev));
},
[tags]
);
const { live, planned, ended } = useLiveStreams(evs);
const hashtags = getTagValues(tags, "t");
const following = live.filter(followsHost);
const liveNow = live.filter(e => !following.includes(e));
const hasFollowingLive = following.length > 0;
const plannedEvents = planned.filter(e => !mutedHosts.has(getHost(e))).filter(followsHost);
const endedEvents = ended.filter(e => !mutedHosts.has(getHost(e)));
const liveByHashtag = useMemo(() => {
return hashtags
.map(t => ({
tag: t,
live: live
.filter(e => !mutedHosts.has(getHost(e)))
.filter(e => {
const evTags = getTagValues(e.tags, "t");
return evTags.includes(t);
}),
}))
.filter(t => t.live.length > 0);
}, [live, hashtags]);
return (
<div className="flex flex-col gap-6">
{hasFollowingLive && (
<GridSection header={<FormattedMessage defaultMessage="Following" id="cPIKU2" />} items={following} />
)}
{!hasFollowingLive && (
<VideoGrid>
{live
.filter(e => !mutedHosts.has(getHost(e)))
.map(e => (
<VideoTile ev={e} key={e.id} />
))}
</VideoGrid>
)}
{liveByHashtag.map(t => (
<GridSection header={`#${t.tag}`} items={t.live} />
))}
{hasFollowingLive && liveNow.length > 0 && (
<GridSection header={<FormattedMessage defaultMessage="Live" id="Dn82AL" />} items={liveNow} />
)}
{plannedEvents.length > 0 && (
<GridSection header={<FormattedMessage defaultMessage="Planned" id="kp0NPF" />} items={plannedEvents} />
)}
{endedEvents.length > 0 && (
<GridSection header={<FormattedMessage defaultMessage="Ended" id="TP/cMX" />} items={endedEvents} />
)}
</div>
);
}
function GridSection({ header, items }: { header: ReactNode; items: Array<TaggedNostrEvent> }) {
return (
<>
<h2 className="flex items-center gap-4">
{header}
<span className="h-[1px] bg-layer-1 w-full" />
</h2>
<VideoGrid>
{items.map(e => (
<VideoTile ev={e} key={e.id} />
))}
</VideoGrid>
</>
);
}

View File

@ -1,15 +0,0 @@
# FAQ
# Recommended Stream Settings
| Name | Value |
| ----------------- | ----- |
| Video Codec | h264 |
| Audio Codec | AAC |
| Max Video Bitrate | 7000k |
| Max Audio Bitrate | 320k |
| Keyframe Interval | 2s |
### Example settings in OBS (Apple M1 Mac):
![OBS Apple](https://void.cat/d/VQQ75R6tmbVQJ9eqiwJhoj.webp)

View File

@ -1,11 +1,7 @@
import { useMemo } from "react"; import { useMemo } from "react";
import { EventKind, RequestBuilder } from "@snort/system";
import { NostrEvent, RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react"; import { useRequestBuilder } from "@snort/system-react";
import { LIVE_STREAM, StreamState } from "@/const";
import { findTag, getHost } from "@/utils";
export function useStreamsFeed(tag?: string) { export function useStreamsFeed(tag?: string) {
const rb = useMemo(() => { const rb = useMemo(() => {
const rb = new RequestBuilder(tag ? `streams:${tag}` : "streams"); const rb = new RequestBuilder(tag ? `streams:${tag}` : "streams");
@ -15,71 +11,30 @@ export function useStreamsFeed(tag?: string) {
if (import.meta.env.VITE_SINGLE_PUBLISHER) { if (import.meta.env.VITE_SINGLE_PUBLISHER) {
if (tag) { if (tag) {
rb.withFilter() rb.withFilter()
.kinds([LIVE_STREAM]) .kinds([EventKind.LiveEvent])
.tag("t", [tag]) .tag("t", [tag])
.authors([import.meta.env.VITE_SINGLE_PUBLISHER]); .authors([import.meta.env.VITE_SINGLE_PUBLISHER]);
rb.withFilter() rb.withFilter()
.kinds([LIVE_STREAM]) .kinds([EventKind.LiveEvent])
.tag("t", [tag]) .tag("t", [tag])
.tag("p", [import.meta.env.VITE_SINGLE_PUBLISHER]); .tag("p", [import.meta.env.VITE_SINGLE_PUBLISHER]);
} else { } else {
rb.withFilter() rb.withFilter()
.kinds([LIVE_STREAM]) .kinds([EventKind.LiveEvent])
.authors([import.meta.env.VITE_SINGLE_PUBLISHER]); .authors([import.meta.env.VITE_SINGLE_PUBLISHER]);
rb.withFilter() rb.withFilter()
.kinds([LIVE_STREAM]) .kinds([EventKind.LiveEvent])
.tag("p", [import.meta.env.VITE_SINGLE_PUBLISHER]); .tag("p", [import.meta.env.VITE_SINGLE_PUBLISHER]);
} }
} else { } else {
if (tag) { if (tag) {
rb.withFilter().kinds([LIVE_STREAM]).tag("t", [tag]); rb.withFilter().kinds([EventKind.LiveEvent]).tag("t", [tag]);
} else { } else {
rb.withFilter().kinds([LIVE_STREAM]); rb.withFilter().kinds([EventKind.LiveEvent]);
} }
} }
return rb; return rb;
}, [tag]); }, [tag]);
function sortCreatedAt(a: NostrEvent, b: NostrEvent) { return useRequestBuilder(rb);
return b.created_at > a.created_at ? 1 : -1;
}
function sortStarts(a: NostrEvent, b: NostrEvent) {
const aStart = Number(findTag(a, "starts") ?? "0");
const bStart = Number(findTag(b, "starts") ?? "0");
return bStart > aStart ? 1 : -1;
}
const feed = useRequestBuilder(rb);
const feedSorted = useMemo(() => {
if (feed) {
return [...feed].filter(
a => !import.meta.env.VITE_SINGLE_PUBLISHER || import.meta.env.VITE_SINGLE_PUBLISHER === getHost(a)
);
}
return [];
}, [feed]);
const live = feedSorted
.filter(a => {
try {
return (
findTag(a, "status") === StreamState.Live &&
a.tags.some(a => a[0] === "streaming" && new URL(a[1]).pathname.includes(".m3u8"))
);
} catch {
return false;
}
})
.sort(sortStarts);
const planned = feedSorted.filter(a => findTag(a, "status") === StreamState.Planned).sort(sortStarts);
const ended = feedSorted
.filter(a => {
const hasEnded = findTag(a, "status") === StreamState.Ended;
const recording = findTag(a, "recording") ?? "";
return hasEnded && recording?.length > 0;
})
.sort(sortCreatedAt);
return { live, planned, ended };
} }

View File

@ -0,0 +1,48 @@
import { DAY, StreamState } from "@/const";
import { findTag, getHost } from "@/utils";
import { unixNow } from "@snort/shared";
import { NostrEvent, TaggedNostrEvent } from "@snort/system";
import { useMemo } from "react";
export function useLiveStreams(feed: Array<TaggedNostrEvent>) {
function sortCreatedAt(a: NostrEvent, b: NostrEvent) {
return b.created_at > a.created_at ? 1 : -1;
}
function sortStarts(a: NostrEvent, b: NostrEvent) {
const aStart = Number(findTag(a, "starts") ?? "0");
const bStart = Number(findTag(b, "starts") ?? "0");
return bStart > aStart ? 1 : -1;
}
const feedSorted = useMemo(() => {
if (feed) {
return feed
.filter(a => a.created_at > unixNow() - 7 * DAY)
.filter(a => !import.meta.env.VITE_SINGLE_PUBLISHER || import.meta.env.VITE_SINGLE_PUBLISHER === getHost(a));
}
return [];
}, [feed]);
const live = feedSorted
.filter(a => {
try {
return (
findTag(a, "status") === StreamState.Live &&
a.tags.some(a => a[0] === "streaming" && new URL(a[1]).pathname.includes(".m3u8"))
);
} catch {
return false;
}
})
.sort(sortStarts);
const planned = feedSorted.filter(a => findTag(a, "status") === StreamState.Planned).sort(sortStarts);
const ended = feedSorted
.filter(a => {
const hasEnded = findTag(a, "status") === StreamState.Ended;
const recording = findTag(a, "recording") ?? "";
return hasEnded && recording?.length > 0;
})
.sort(sortCreatedAt);
return { live, planned, ended };
}

View File

@ -134,3 +134,11 @@ select {
.overflow-wrap { .overflow-wrap {
overflow-wrap: anywhere; overflow-wrap: anywhere;
} }
table td,
table th {
@apply border border-layer-2 px-2;
}
table th {
@apply bg-layer-1;
}

View File

@ -15,7 +15,6 @@ import { LayoutPage } from "@/pages/layout";
import { ProfilePage } from "@/pages/profile-page"; import { ProfilePage } from "@/pages/profile-page";
import { StreamPageHandler } from "@/pages/stream-page"; import { StreamPageHandler } from "@/pages/stream-page";
import { ChatPopout } from "@/pages/chat-popout"; import { ChatPopout } from "@/pages/chat-popout";
import { StreamProvidersPage } from "@/pages/providers";
import { defaultRelays } from "@/const"; import { defaultRelays } from "@/const";
import { CatchAllRoutePage } from "@/pages/catch-all"; import { CatchAllRoutePage } from "@/pages/catch-all";
import { IntlProvider } from "@/intl"; import { IntlProvider } from "@/intl";
@ -23,8 +22,6 @@ import { WidgetsPage } from "@/pages/widgets";
import { AlertsPage } from "@/pages/alerts"; import { AlertsPage } from "@/pages/alerts";
import { StreamSummaryPage } from "@/pages/summary"; import { StreamSummaryPage } from "@/pages/summary";
import { EmbededPage } from "./pages/embed"; import { EmbededPage } from "./pages/embed";
import Markdown from "./element/markdown";
import { Async } from "./element/async-loader";
import { WasmOptimizer, WasmPath, wasmInit } from "./wasm"; import { WasmOptimizer, WasmPath, wasmInit } from "./wasm";
const DashboardPage = lazy(() => import("./pages/dashboard")); const DashboardPage = lazy(() => import("./pages/dashboard"));
import MockPage from "./pages/mock"; import MockPage from "./pages/mock";
@ -32,10 +29,12 @@ import { syncClock } from "./time-sync";
import SettingsPage from "./pages/settings"; import SettingsPage from "./pages/settings";
import AccountSettingsTab from "./pages/settings/account"; import AccountSettingsTab from "./pages/settings/account";
import { StreamSettingsTab } from "./pages/settings/stream"; import { StreamSettingsTab } from "./pages/settings/stream";
import Faq from "@/faq.md"; import SearchPage from "./pages/search";
import ProfileSettings from "./pages/settings/profile";
import CategoryPage from "./pages/category";
import { WorkerRelayInterface } from "@snort/worker-relay"; import { WorkerRelayInterface } from "@snort/worker-relay";
import WorkerVite from "@snort/worker-relay/src/worker?worker"; import WorkerVite from "@snort/worker-relay/src/worker?worker";
import FaqPage from "./pages/faq";
const hasWasm = "WebAssembly" in globalThis; const hasWasm = "WebAssembly" in globalThis;
const db = new SnortSystemDb(); const db = new SnortSystemDb();
@ -65,10 +64,7 @@ async function doInit() {
await wasmInit(WasmPath); await wasmInit(WasmPath);
} }
try { try {
await workerRelay.debug("*");
await workerRelay.init("relay.db"); await workerRelay.init("relay.db");
const stat = await workerRelay.summary();
console.log(stat);
} catch (e) { } catch (e) {
console.error(e); console.error(e);
} }
@ -105,10 +101,6 @@ const router = createBrowserRouter([
path: "/:id", path: "/:id",
element: <StreamPageHandler />, element: <StreamPageHandler />,
}, },
{
path: "/providers/:id?",
element: <StreamProvidersPage />,
},
{ {
path: "/settings", path: "/settings",
element: <SettingsPage />, element: <SettingsPage />,
@ -121,6 +113,10 @@ const router = createBrowserRouter([
path: "stream", path: "stream",
element: <StreamSettingsTab />, element: <StreamSettingsTab />,
}, },
{
path: "profile",
element: <ProfileSettings />,
},
], ],
}, },
{ {
@ -139,17 +135,17 @@ const router = createBrowserRouter([
</Suspense> </Suspense>
), ),
}, },
{
path: "/search/:term",
element: <SearchPage />,
},
{
path: "/category/:id?",
element: <CategoryPage />,
},
{ {
path: "/faq", path: "/faq",
element: ( element: <FaqPage />,
<Async
loader={async () => {
const req = await fetch(Faq);
return await req.text();
}}
then={v => <Markdown content={v} tags={[]} plainText={true} />}
/>
),
}, },
{ {
path: "*", path: "*",

View File

@ -6,22 +6,27 @@ import enMessages from "@/translations/en.json";
export const AllLocales = [ export const AllLocales = [
DefaultLocale, DefaultLocale,
"ar-SA",
"bg-BG",
"bn-BD",
"da-DK",
"de-DE", "de-DE",
"es-ES", "es-ES",
"th-TH",
"nl-NL",
"ja-JP",
"fa-IR", "fa-IR",
"sw-KE",
"sv-SE",
"bn-BD",
"bg-BG",
"zh-CN",
"zh-TW",
"fi-FI", "fi-FI",
"fr-FR", "fr-FR",
"hu-HU",
"it-IT",
"ja-JP",
"ko-KR",
"nl-NL",
"pt-BR", "pt-BR",
"ru-RU", "ru-RU",
"sv-SE",
"sw-KE",
"th-TH",
"zh-CN",
"zh-TW",
]; ];
function importLang(src: { default: Record<string, { defaultMessage: string }> }) { function importLang(src: { default: Record<string, { defaultMessage: string }> }) {
@ -34,52 +39,68 @@ const getMessages = (locale: string) => {
const matchLang = async (lng: string) => { const matchLang = async (lng: string) => {
switch (lng) { switch (lng) {
case "ar":
case "ar-SA":
return importLang(await import("@/translations/ar_SA.json"));
case "bg":
case "bg-BG":
return importLang(await import("@/translations/bg_BG.json"));
case "bn":
case "bn-BD":
return importLang(await import("@/translations/bn_BD.json"));
case "da":
case "da-DK":
return importLang(await import("@/translations/da_DK.json"));
case "de": case "de":
case "de-DE": case "de-DE":
return importLang(await import("@/translations/de_DE.json")); return importLang(await import("@/translations/de_DE.json"));
case "es": case "es":
case "es-ES": case "es-ES":
return importLang(await import("@/translations/es_ES.json")); return importLang(await import("@/translations/es_ES.json"));
case "th":
case "th-TH":
return importLang(await import("@/translations/th_TH.json"));
case "nl":
case "nl-NL":
return importLang(await import("@/translations/nl_NL.json"));
case "ja":
case "ja-JP":
return importLang(await import("@/translations/ja_JP.json"));
case "fa": case "fa":
case "fa-IR": case "fa-IR":
return importLang(await import("@/translations/fa_IR.json")); return importLang(await import("@/translations/fa_IR.json"));
case "sw":
case "sw-KE":
return importLang(await import("@/translations/sw_KE.json"));
case "sv":
case "sv-SE":
return importLang(await import("@/translations/sv_SE.json"));
case "bn":
case "bn-BD":
return importLang(await import("@/translations/bn_BD.json"));
case "bg":
case "bg-BG":
return importLang(await import("@/translations/bg_BG.json"));
case "zh":
case "zh-CN":
return importLang(await import("@/translations/zh_CN.json"));
case "zh-TW":
return importLang(await import("@/translations/zh_TW.json"));
case "fi": case "fi":
case "fi-FI": case "fi-FI":
return importLang(await import("@/translations/fi_FI.json")); return importLang(await import("@/translations/fi_FI.json"));
case "fr": case "fr":
case "fr-FR": case "fr-FR":
return importLang(await import("@/translations/fr_FR.json")); return importLang(await import("@/translations/fr_FR.json"));
case "hu":
case "hu-HU":
return importLang(await import("@/translations/hu_HU.json"));
case "it":
case "it-IT":
return importLang(await import("@/translations/it_IT.json"));
case "ja":
case "ja-JP":
return importLang(await import("@/translations/ja_JP.json"));
case "ko":
case "ko-KR":
return importLang(await import("@/translations/ja_JP.json"));
case "nl":
case "nl-NL":
return importLang(await import("@/translations/nl_NL.json"));
case "pt":
case "pt-BR": case "pt-BR":
return importLang(await import("@/translations/pt_BR.json")); return importLang(await import("@/translations/pt_BR.json"));
case "ru": case "ru":
case "ru-RU": case "ru-RU":
return importLang(await import("@/translations/ru_RU.json")); return importLang(await import("@/translations/ru_RU.json"));
case "sv":
case "sv-SE":
return importLang(await import("@/translations/sv_SE.json"));
case "sw":
case "sw-KE":
return importLang(await import("@/translations/sw_KE.json"));
case "th":
case "th-TH":
return importLang(await import("@/translations/th_TH.json"));
case "zh":
case "zh-CN":
return importLang(await import("@/translations/zh_CN.json"));
case "zh-TW":
return importLang(await import("@/translations/zh_TW.json"));
case DefaultLocale: case DefaultLocale:
case "en": case "en":
return enMessages; return enMessages;

View File

@ -119,6 +119,9 @@
"9a9+ww": { "9a9+ww": {
"defaultMessage": "Title" "defaultMessage": "Title"
}, },
"A1zT+z": {
"defaultMessage": "Search results: {term}"
},
"ALdW69": { "ALdW69": {
"defaultMessage": "Note by {name}" "defaultMessage": "Note by {name}"
}, },
@ -176,9 +179,6 @@
"GGaJMU": { "GGaJMU": {
"defaultMessage": "Top Chatters" "defaultMessage": "Top Chatters"
}, },
"Gmiwnd": {
"defaultMessage": "Refresh the page to use the latest version"
},
"Gq6x9o": { "Gq6x9o": {
"defaultMessage": "Cover Image" "defaultMessage": "Cover Image"
}, },
@ -284,9 +284,6 @@
"Qe1MJu": { "Qe1MJu": {
"defaultMessage": "{name} with {amount}" "defaultMessage": "{name} with {amount}"
}, },
"RJ2VxG": {
"defaultMessage": "A new version has been detected"
},
"RJOmzk": { "RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}." "defaultMessage": "I have read and agree with {provider}''s {terms}."
}, },
@ -320,12 +317,18 @@
"VA/Z1S": { "VA/Z1S": {
"defaultMessage": "Hide" "defaultMessage": "Hide"
}, },
"VKb1MS": {
"defaultMessage": "Categories"
},
"Vn2WiP": { "Vn2WiP": {
"defaultMessage": "Get Stream Key" "defaultMessage": "Get Stream Key"
}, },
"W7DNWx": { "W7DNWx": {
"defaultMessage": "Stream Forwarding" "defaultMessage": "Stream Forwarding"
}, },
"W8nHSd": {
"defaultMessage": "FAQ"
},
"W9355R": { "W9355R": {
"defaultMessage": "Unmute" "defaultMessage": "Unmute"
}, },
@ -507,9 +510,6 @@
"r2Jjms": { "r2Jjms": {
"defaultMessage": "Log In" "defaultMessage": "Log In"
}, },
"rELDbB": {
"defaultMessage": "Refresh"
},
"rWBFZA": { "rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!" "defaultMessage": "Sexually explicit material ahead!"
}, },
@ -570,6 +570,9 @@
"x82IOl": { "x82IOl": {
"defaultMessage": "Mute" "defaultMessage": "Mute"
}, },
"xmcVZ0": {
"defaultMessage": "Search"
},
"y867Vs": { "y867Vs": {
"defaultMessage": "Volume" "defaultMessage": "Volume"
}, },

75
src/pages/category.tsx Normal file
View File

@ -0,0 +1,75 @@
import { StreamState } from "@/const";
import CategoryLink from "@/element/category-link";
import VideoGridSorted from "@/element/video-grid-sorted";
import { extractStreamInfo } from "@/utils";
import { EventKind, RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { useMemo } from "react";
import { FormattedMessage } from "react-intl";
import { useParams } from "react-router-dom";
export const AllCategories = [
{
id: "irl",
name: <FormattedMessage defaultMessage="IRL" />,
icon: "face",
tags: ["irl"],
priority: 0,
},
{
id: "gaming",
name: <FormattedMessage defaultMessage="Gaming" />,
icon: "gaming-pad",
tags: ["gaming"],
priority: 0,
},
{
id: "music",
name: <FormattedMessage defaultMessage="Music" />,
icon: "music",
tags: ["music"],
priority: 0,
},
{
id: "talk",
name: <FormattedMessage defaultMessage="Talk" />,
icon: "mic",
tags: ["talk"],
priority: 0,
},
{
id: "art",
name: <FormattedMessage defaultMessage="Art" />,
icon: "art",
tags: ["art"],
priority: 0,
},
];
export default function Category() {
const { id } = useParams();
const cat = AllCategories.find(a => a.id === id);
const sub = useMemo(() => {
if (!cat) return;
const rb = new RequestBuilder(`category:${cat.id}`);
rb.withFilter().kinds([EventKind.LiveEvent]).tag("t", cat.tags);
return rb;
}, [cat]);
const results = useRequestBuilder(sub).filter(a => {
const { status } = extractStreamInfo(a);
return status === StreamState.Live;
});
return (
<div>
<div className="flex gap-4">
{AllCategories.map(a => (
<CategoryLink key={a.id} {...a} />
))}
</div>
<h1 className="uppercase my-4">{id}</h1>
<VideoGridSorted evs={results} />
</div>
);
}

129
src/pages/faq.tsx Normal file
View File

@ -0,0 +1,129 @@
import { FormattedMessage } from "react-intl";
export default function FaqPage() {
return (
<div className="flex flex-col gap-4 w-[35rem] mx-auto">
<h1>
<FormattedMessage defaultMessage="FAQ" description="Title: FAQ page" />
</h1>
<h2>
<FormattedMessage defaultMessage="How do i stream on zap.stream?" />
</h2>
<p>
<FormattedMessage defaultMessage="To start streaming on zap.stream, follow these steps:" />
</p>
<ol className="leading-6 list-inside list-decimal">
<li>
<FormattedMessage defaultMessage="Click on Log In" />
</li>
<li>
<FormattedMessage defaultMessage="Create a new account if you don't have one already." />
</li>
<li>
<FormattedMessage defaultMessage="If you already have an account, you can use a nostr extension to log in. If you already use a nostr extension, you will be automatically logged in. If you don't have a nostr extension set up, you can use nos2x or Alby." />
</li>
<li>
<FormattedMessage defaultMessage="Click the “Stream” button in the top right corner" />
</li>
<li>
<FormattedMessage defaultMessage="Here you have a few options, using our in-house hosting, or your own (such as Cloudflare)." />
</li>
<ol className="leading-6 list-inside list-decimal ml-6">
<li>
<FormattedMessage defaultMessage="For manual hosting all you need is the HLS URL for the Stream URL field. You should be ale to find this in your hosting setup." />
</li>
<li>
<FormattedMessage defaultMessage="If you use our in-house zap.stream hosting (cheapest and easiest), copy your stream URL and Stream Key to your OBS settings and you should be good to go." />
</li>
</ol>
</ol>
<h2>
<FormattedMessage defaultMessage="What is OBS?" />
</h2>
<p>
<FormattedMessage defaultMessage="OBS (Open Broadcaster Software) is a free and open source software for video recording and live streaming on Windows, Mac and Linux. It is a popular choice with streamers. You'll need to install this to capture your video, audio and anything else you'd like to add to your stream. Once installed and configured to preference, add your Stream URL and Stream Key from the Stream settings to OBS to form a connection with zap.stream." />
</p>
<h2>
<FormattedMessage defaultMessage="What does it cost to stream?" />
</h2>
<p>
<FormattedMessage defaultMessage="zap.stream is free up to 2 hours of hosting at high quality and up to 8 hours of “source” quality. After that you have an option to stream for 5 sats per minute or 10 sats per minute depending on your chosen quality. If you do not use zap.stream to host, pricing will depend on your chosen streaming provider." />
</p>
<h2>
<FormattedMessage defaultMessage="What are sats?" />
</h2>
<p>
<FormattedMessage defaultMessage="Sats are small units of Bitcoin. Sending sats on zap.stream is referred to as “zapping” or zaps." />
</p>
<h2>
<FormattedMessage defaultMessage="How do i get more sats?" />
</h2>
<p>
<FormattedMessage defaultMessage="We've put together a list of easy-to-use exchanges that will allow you to buy a small amount of bitcoin (sats) and to transfer them to your wallet of choice." />
</p>
<h2>
<FormattedMessage defaultMessage="What are zaps?" />
</h2>
<p>
<FormattedMessage defaultMessage="Zaps are lightning payments, which are published on nostr as receipts." />
</p>
<h2>
<FormattedMessage defaultMessage="What is a nostr extension?" />
</h2>
<p>
<FormattedMessage defaultMessage="A nostr extension simply saves your keys so you can safely log in without having to re-enter them every time. ZapStream uses the extension to authorize actions on your behalf without ever seeing your key information. This has a significant advantage over having to trust that websites handle your credentials safely." />
</p>
<h2>
<FormattedMessage defaultMessage="Recommended Stream Settings" />
</h2>
<table className="table-auto">
<thead>
<tr>
<th>
<FormattedMessage defaultMessage="Name" description="Config name column header" />
</th>
<th>
<FormattedMessage defaultMessage="Value" description="Config value column header" />
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<FormattedMessage defaultMessage="Video Codec" />
</td>
<td>h264</td>
</tr>
<tr>
<td>
<FormattedMessage defaultMessage="Audio Codec" />
</td>
<td>AAC</td>
</tr>
<tr>
<td>
<FormattedMessage defaultMessage="Max Video Bitrate" />
</td>
<td>7000k</td>
</tr>
<tr>
<td>
<FormattedMessage defaultMessage="Max Audio Bitrate" />
</td>
<td>320k</td>
</tr>
<tr>
<td>
<FormattedMessage defaultMessage="Keyframe Interval" />
</td>
<td>2s</td>
</tr>
</tbody>
</table>
<h3>
<FormattedMessage defaultMessage="Example settings in OBS (Apple M1 Mac)" />
</h3>
<img src="https://void.cat/d/VQQ75R6tmbVQJ9eqiwJhoj.webp" alt="OBS Mac settings" />
</div>
);
}

View File

@ -99,3 +99,18 @@
.fi-ru { .fi-ru {
background-image: url("flag-icons/flags/1x1/ru.svg"); background-image: url("flag-icons/flags/1x1/ru.svg");
} }
.fi-sa {
background-image: url("flag-icons/flags/1x1/sa.svg");
}
.fi-it {
background-image: url("flag-icons/flags/1x1/it.svg");
}
.fi-kr {
background-image: url("flag-icons/flags/1x1/kr.svg");
}
.fi-dk {
background-image: url("flag-icons/flags/1x1/dk.svg");
}
.fi-hu {
background-image: url("flag-icons/flags/1x1/hu.svg");
}

View File

@ -1,9 +1,9 @@
import "./layout.css"; import "./layout.css";
import { CSSProperties, useEffect, useState, useSyncExternalStore } from "react"; import { CSSProperties, useEffect, useState } from "react";
import { Link, Outlet, useLocation, useNavigate } from "react-router-dom"; import { Link, Outlet, useLocation, useNavigate, useParams } from "react-router-dom";
import { Helmet } from "react-helmet"; import { Helmet } from "react-helmet";
import { FormattedMessage } from "react-intl"; import { FormattedMessage, useIntl } from "react-intl";
import { Menu, MenuItem } from "@szhsin/react-menu"; import { Menu, MenuItem } from "@szhsin/react-menu";
import { hexToBech32 } from "@snort/shared"; import { hexToBech32 } from "@snort/shared";
@ -16,7 +16,7 @@ import { Login } from "@/login";
import { useLang } from "@/hooks/lang"; import { useLang } from "@/hooks/lang";
import { AllLocales } from "@/intl"; import { AllLocales } from "@/intl";
import { trackEvent } from "@/utils"; import { trackEvent } from "@/utils";
import { BorderButton, DefaultButton } from "@/element/buttons"; import { BorderButton } from "@/element/buttons";
import Modal from "@/element/modal"; import Modal from "@/element/modal";
import Logo from "@/element/logo"; import Logo from "@/element/logo";
@ -139,10 +139,19 @@ export function LayoutPage() {
<title>Home - zap.stream</title> <title>Home - zap.stream</title>
</Helmet> </Helmet>
<div className="flex justify-between mb-4"> <div className="flex justify-between mb-4">
<div <div className="flex gap-6 items-center">
className="bg-white text-black flex items-center cursor-pointer rounded-2xl aspect-square px-1" <div
onClick={() => navigate("/")}> className="bg-white text-black flex items-center cursor-pointer rounded-2xl aspect-square px-1"
<Logo width={40} height={40} /> onClick={() => navigate("/")}>
<Logo width={40} height={40} />
</div>
<SearchBar />
<Link to="/category">
<FormattedMessage defaultMessage="Categories" id="VKb1MS" />
</Link>
<Link to="/faq">
<FormattedMessage defaultMessage="FAQ" id="W8nHSd" />
</Link>
</div> </div>
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<Link <Link
@ -162,26 +171,29 @@ export function LayoutPage() {
); );
} }
function NewVersionBanner() { function SearchBar() {
const newVersion = useSyncExternalStore( const { term } = useParams();
c => NewVersion.hook(c), const { formatMessage } = useIntl();
() => NewVersion.snapshot() const navigate = useNavigate();
); const [search, setSearch] = useState(term ?? "");
if (!newVersion) return;
return ( return (
<div className="fixed top-0 left-0 w-max flex bg-slate-800 py-2 px-4 opacity-95"> <div className="bg-layer-2 rounded-xl pr-4 py-1 flex items-center">
<div className="grow"> <input
<h1> type="text"
<FormattedMessage defaultMessage="A new version has been detected" id="RJ2VxG" /> placeholder={formatMessage({
</h1> defaultMessage: "Search",
<p> id: "xmcVZ0",
<FormattedMessage defaultMessage="Refresh the page to use the latest version" id="Gmiwnd" /> })}
</p> value={search}
</div> onChange={e => setSearch(e.target.value)}
<DefaultButton onClick={() => window.location.reload()} className="btn"> onKeyDown={e => {
<FormattedMessage defaultMessage="Refresh" id="rELDbB" /> if (e.key === "Enter") {
</DefaultButton> navigate(`/search/${encodeURIComponent(search)}`);
}
}}
/>
<Icon name="search" className="text-layer-4" size={16} />
</div> </div>
); );
} }

View File

@ -1,31 +0,0 @@
.stream-providers-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
}
.stream-providers-grid > div {
display: flex;
flex-direction: column;
gap: 16px;
}
.stream-providers-grid > div img {
height: 64px;
}
.owncast-config {
display: flex;
gap: 16px;
padding: 40px;
}
.owncast-config > div {
flex: 1;
}
.owncast-config > div:nth-child(2) {
display: flex;
flex-direction: column;
gap: 16px;
}

View File

@ -1,70 +0,0 @@
import "./index.css";
import { useNavigate, useParams } from "react-router-dom";
import { StreamProviders } from "@/providers";
import Owncast from "@/owncast.png";
import Cloudflare from "@/cloudflare.png";
import { ConfigureOwncast } from "./owncast";
import { ConfigureNostrType } from "./nostr";
import { DefaultButton } from "@/element/buttons";
export function StreamProvidersPage() {
const navigate = useNavigate();
const { id } = useParams();
function mapName(p: StreamProviders) {
switch (p) {
case StreamProviders.Owncast:
return "Owncast";
case StreamProviders.Cloudflare:
return "Cloudflare";
case StreamProviders.NostrType:
return "Nostr Native";
}
return "Unknown";
}
function mapLogo(p: StreamProviders) {
switch (p) {
case StreamProviders.Owncast:
return <img src={Owncast} />;
case StreamProviders.Cloudflare:
return <img src={Cloudflare} />;
}
}
function providerLink(p: StreamProviders) {
return (
<div className="paper">
<h3>{mapName(p)}</h3>
{mapLogo(p)}
<DefaultButton onClick={() => navigate(p)}>+ Configure</DefaultButton>
</div>
);
}
function index() {
return (
<div className="stream-providers-page">
<h1>Providers</h1>
<p>Stream providers streamline the process of streaming on Nostr, some event accept lightning payments!</p>
<div className="stream-providers-grid">
{[StreamProviders.NostrType, StreamProviders.Owncast, StreamProviders.Cloudflare].map(v => providerLink(v))}
</div>
</div>
);
}
if (!id) {
return index();
} else {
switch (id) {
case StreamProviders.Owncast: {
return <ConfigureOwncast />;
}
case StreamProviders.NostrType: {
return <ConfigureNostrType />;
}
}
}
}

View File

@ -1,86 +0,0 @@
import { useState } from "react";
import { useNavigate } from "react-router-dom";
import { FormattedMessage } from "react-intl";
import { StatePill } from "@/element/state-pill";
import { StreamProviderInfo, StreamProviderStore } from "@/providers";
import { NostrStreamProvider } from "@/providers/zsz";
import { StreamState } from "@/const";
import { DefaultButton } from "@/element/buttons";
export function ConfigureNostrType() {
const [url, setUrl] = useState("");
const [info, setInfo] = useState<StreamProviderInfo>();
const navigate = useNavigate();
async function tryConnect() {
try {
const api = new NostrStreamProvider(new URL(url).host, url);
const inf = await api.info();
setInfo(inf);
} catch (e) {
console.error(e);
}
}
function status() {
if (!info) return;
return (
<>
<h3>Status</h3>
<div>
<StatePill state={info?.state ?? StreamState.Ended} />
</div>
<div>
<p>Name</p>
<div className="paper">{info?.name}</div>
</div>
{info?.summary && (
<div>
<p>Summary</p>
<div className="paper">{info?.summary}</div>
</div>
)}
{info?.viewers && (
<div>
<p>Viewers</p>
<div className="paper">{info?.viewers}</div>
</div>
)}
{info?.version && (
<div>
<p>Version</p>
<div className="paper">{info?.version}</div>
</div>
)}
<div>
<DefaultButton
onClick={() => {
StreamProviderStore.add(new NostrStreamProvider(new URL(url).host, url));
navigate("/");
}}>
<FormattedMessage defaultMessage="Save" id="jvo0vs" />
</DefaultButton>
</div>
</>
);
}
return (
<div className="owncast-config">
<div className="flex flex-col gap-3">
<div>
<p>Nostr streaming provider URL</p>
<div className="paper">
<input type="text" placeholder="https://" value={url} onChange={e => setUrl(e.target.value)} />
</div>
</div>
<DefaultButton onClick={tryConnect}>
<FormattedMessage defaultMessage="Connect" id="+vVZ/G" />
</DefaultButton>
</div>
<div>{status()}</div>
</div>
);
}

View File

@ -1,90 +0,0 @@
import { useState } from "react";
import { useNavigate } from "react-router-dom";
import { StatePill } from "@/element/state-pill";
import { StreamProviderInfo, StreamProviderStore } from "@/providers";
import { OwncastProvider } from "@/providers/owncast";
import { StreamState } from "@/const";
import { DefaultButton } from "@/element/buttons";
export function ConfigureOwncast() {
const [url, setUrl] = useState("");
const [token, setToken] = useState("");
const [info, setInfo] = useState<StreamProviderInfo>();
const navigate = useNavigate();
async function tryConnect() {
try {
const api = new OwncastProvider(url, token);
const i = await api.info();
setInfo(i);
} catch (e) {
console.debug(e);
}
}
function status() {
if (!info) return;
return (
<>
<h3>Status</h3>
<div>
<StatePill state={info?.state ?? StreamState.Ended} />
</div>
<div>
<p>Name</p>
<div className="paper">{info?.name}</div>
</div>
{info?.summary && (
<div>
<p>Summary</p>
<div className="paper">{info?.summary}</div>
</div>
)}
{info?.viewers && (
<div>
<p>Viewers</p>
<div className="paper">{info?.viewers}</div>
</div>
)}
{info?.version && (
<div>
<p>Version</p>
<div className="paper">{info?.version}</div>
</div>
)}
<div>
<DefaultButton
onClick={() => {
StreamProviderStore.add(new OwncastProvider(url, token));
navigate("/");
}}>
Save
</DefaultButton>
</div>
</>
);
}
return (
<div className="owncast-config">
<div className="flex flex-col gap-3">
<div>
<p>Owncast instance url</p>
<div className="paper">
<input type="text" placeholder="https://" value={url} onChange={e => setUrl(e.target.value)} />
</div>
</div>
<div>
<p>API token</p>
<div className="paper">
<input type="password" value={token} onChange={e => setToken(e.target.value)} />
</div>
</div>
<DefaultButton onClick={tryConnect}>Connect</DefaultButton>
</div>
<div>{status()}</div>
</div>
);
}

View File

@ -1,89 +1,19 @@
import { FormattedMessage } from "react-intl";
import { ReactNode, useCallback, useMemo } from "react";
import type { NostrEvent, TaggedNostrEvent } from "@snort/system";
import { VideoTile } from "@/element/video-tile";
import { useLogin } from "@/hooks/login";
import { getHost, getTagValues } from "@/utils";
import { useStreamsFeed } from "@/hooks/live-streams"; import { useStreamsFeed } from "@/hooks/live-streams";
import VideoGrid from "@/element/video-grid"; import CategoryLink from "@/element/category-link";
import VideoGridSorted from "@/element/video-grid-sorted";
import { AllCategories } from "./category";
export function RootPage() { export function RootPage() {
const login = useLogin(); const streams = useStreamsFeed();
const { live, planned, ended } = useStreamsFeed();
const mutedHosts = new Set(getTagValues(login?.muted.tags ?? [], "p"));
const tags = login?.follows.tags ?? [];
const followsHost = useCallback(
(ev: NostrEvent) => {
return tags.find(t => t.at(1) === getHost(ev));
},
[tags]
);
const hashtags = getTagValues(tags, "t");
const following = live.filter(followsHost);
const liveNow = live.filter(e => !following.includes(e));
const hasFollowingLive = following.length > 0;
const plannedEvents = planned.filter(e => !mutedHosts.has(getHost(e))).filter(followsHost);
const endedEvents = ended.filter(e => !mutedHosts.has(getHost(e)));
const liveByHashtag = useMemo(() => {
return hashtags
.map(t => ({
tag: t,
live: live
.filter(e => !mutedHosts.has(getHost(e)))
.filter(e => {
const evTags = getTagValues(e.tags, "t");
return evTags.includes(t);
}),
}))
.filter(t => t.live.length > 0);
}, [live, hashtags]);
return ( return (
<div className="flex flex-col gap-6"> <div className="flex flex-col gap-6">
{hasFollowingLive && ( <div className="flex gap-4">
<RootSection header={<FormattedMessage defaultMessage="Following" id="cPIKU2" />} items={following} /> {AllCategories.filter(a => a.priority === 0).map(a => (
)} <CategoryLink key={a.id} {...a} />
{!hasFollowingLive && ( ))}
<VideoGrid> </div>
{live <VideoGridSorted evs={streams} />
.filter(e => !mutedHosts.has(getHost(e)))
.map(e => (
<VideoTile ev={e} key={e.id} />
))}
</VideoGrid>
)}
{liveByHashtag.map(t => (
<RootSection header={`#${t.tag}`} items={t.live} />
))}
{hasFollowingLive && liveNow.length > 0 && (
<RootSection header={<FormattedMessage defaultMessage="Live" id="Dn82AL" />} items={liveNow} />
)}
{plannedEvents.length > 0 && (
<RootSection header={<FormattedMessage defaultMessage="Planned" id="kp0NPF" />} items={plannedEvents} />
)}
{endedEvents.length > 0 && (
<RootSection header={<FormattedMessage defaultMessage="Ended" id="TP/cMX" />} items={endedEvents} />
)}
</div> </div>
); );
} }
function RootSection({ header, items }: { header: ReactNode; items: Array<TaggedNostrEvent> }) {
return (
<>
<h2 className="flex items-center gap-4">
{header}
<span className="h-[1px] bg-layer-1 w-full" />
</h2>
<VideoGrid>
{items.map(e => (
<VideoTile ev={e} key={e.id} />
))}
</VideoGrid>
</>
);
}

47
src/pages/search.tsx Normal file
View File

@ -0,0 +1,47 @@
import VideoGrid from "@/element/video-grid";
import { VideoTile } from "@/element/video-tile";
import { EventKind, RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { useMemo } from "react";
import { FormattedMessage } from "react-intl";
import { useParams } from "react-router-dom";
export const SearchRelays = [
"wss://relay.nostr.band",
"wss://search.nos.today",
"wss://relay.noswhere.com",
"wss://saltivka.org",
];
export default function SearchPage() {
const { term } = useParams();
const sub = useMemo(() => {
if (!term) return;
const rb = new RequestBuilder(`search:${term}`);
rb.withOptions({
skipDiff: true,
});
rb.withFilter().relay(SearchRelays).kinds([EventKind.LiveEvent]).search(term).limit(50);
return rb;
}, [term]);
const results = useRequestBuilder(sub);
return (
<div>
<h2 className="mb-4">
<FormattedMessage
defaultMessage="Search results: {term}"
id="A1zT+z"
values={{
term,
}}
/>
</h2>
<VideoGrid>
{results.map(a => (
<VideoTile ev={a} key={a.id} />
))}
</VideoGrid>
</div>
);
}

View File

@ -4,13 +4,17 @@ import { Outlet, useNavigate } from "react-router-dom";
const Tabs = [ const Tabs = [
{ {
name: <FormattedMessage defaultMessage="Account" id="TwyMau" />, name: <FormattedMessage defaultMessage="Account" />,
path: "", path: "",
} as const, },
{ {
name: <FormattedMessage defaultMessage="Stream" id="uYw2LD" />, name: <FormattedMessage defaultMessage="Profile" />,
path: "profile",
},
{
name: <FormattedMessage defaultMessage="Stream" />,
path: "stream", path: "stream",
} as const, },
]; ];
export default function SettingsPage() { export default function SettingsPage() {
const naviage = useNavigate(); const naviage = useNavigate();
@ -19,7 +23,7 @@ export default function SettingsPage() {
<div className="rounded-2xl p-3 md:w-[700px] mx-auto w-full"> <div className="rounded-2xl p-3 md:w-[700px] mx-auto w-full">
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<h1> <h1>
<FormattedMessage defaultMessage="Settings" id="D3idYv" /> <FormattedMessage defaultMessage="Settings" />
</h1> </h1>
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<div className="flex gap-2"> <div className="flex gap-2">

View File

@ -0,0 +1,5 @@
import { ProfileEditor } from "@/element/profile-editor";
export default function ProfileSettings() {
return <ProfileEditor onClose={() => {}} />;
}

View File

@ -1,24 +1,19 @@
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import { unwrap } from "@snort/shared"; import { unwrap } from "@snort/shared";
import { VideoTile } from "@/element/video-tile";
import { FollowTagButton } from "@/element/follow-button"; import { FollowTagButton } from "@/element/follow-button";
import { useStreamsFeed } from "@/hooks/live-streams"; import { useStreamsFeed } from "@/hooks/live-streams";
import VideoGridSorted from "@/element/video-grid-sorted";
export function TagPage() { export function TagPage() {
const { tag } = useParams(); const { tag } = useParams();
const { live } = useStreamsFeed(tag); const streams = useStreamsFeed(tag);
return ( return (
<div className="tag-page"> <div>
<div className="tag-page-header"> <div className="flex items-center justify-between">
<h1>#{tag}</h1> <h1>#{tag}</h1>
<FollowTagButton tag={unwrap(tag)} /> <FollowTagButton tag={unwrap(tag)} />
</div> </div>
<div className="video-grid"> <VideoGridSorted evs={streams} />
{live.map(e => (
<VideoTile ev={e} key={e.id} />
))}
</div>
</div> </div>
); );
} }

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -39,6 +39,7 @@
"8YT6ja": "Insert text to speak", "8YT6ja": "Insert text to speak",
"9WRlF4": "Send", "9WRlF4": "Send",
"9a9+ww": "Title", "9a9+ww": "Title",
"A1zT+z": "Search results: {term}",
"ALdW69": "Note by {name}", "ALdW69": "Note by {name}",
"Atr2p4": "NSFW Content", "Atr2p4": "NSFW Content",
"AukrPM": "No viewer data available", "AukrPM": "No viewer data available",
@ -58,7 +59,6 @@
"Fodi9+": "Get paid by viewers", "Fodi9+": "Get paid by viewers",
"G/yZLu": "Remove", "G/yZLu": "Remove",
"GGaJMU": "Top Chatters", "GGaJMU": "Top Chatters",
"Gmiwnd": "Refresh the page to use the latest version",
"Gq6x9o": "Cover Image", "Gq6x9o": "Cover Image",
"Gvxoji": "Name is required", "Gvxoji": "Name is required",
"H/bNs9": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!", "H/bNs9": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!",
@ -94,7 +94,6 @@
"QWlMq9": "Stream key", "QWlMq9": "Stream key",
"QceMQZ": "Goal: {amount}", "QceMQZ": "Goal: {amount}",
"Qe1MJu": "{name} with {amount}", "Qe1MJu": "{name} with {amount}",
"RJ2VxG": "A new version has been detected",
"RJOmzk": "I have read and agree with {provider}''s {terms}.", "RJOmzk": "I have read and agree with {provider}''s {terms}.",
"RS6smY": "Raid Message", "RS6smY": "Raid Message",
"RXQdxR": "Please login to write messages!", "RXQdxR": "Please login to write messages!",
@ -106,8 +105,10 @@
"UJBFYK": "Add Card", "UJBFYK": "Add Card",
"UfSot5": "Past Streams", "UfSot5": "Past Streams",
"VA/Z1S": "Hide", "VA/Z1S": "Hide",
"VKb1MS": "Categories",
"Vn2WiP": "Get Stream Key", "Vn2WiP": "Get Stream Key",
"W7DNWx": "Stream Forwarding", "W7DNWx": "Stream Forwarding",
"W8nHSd": "FAQ",
"W9355R": "Unmute", "W9355R": "Unmute",
"X2PZ7D": "Create Goal", "X2PZ7D": "Create Goal",
"XMGfiA": "Recent Clips", "XMGfiA": "Recent Clips",
@ -168,7 +169,6 @@
"oZrFyI": "Stream type should be HLS", "oZrFyI": "Stream type should be HLS",
"q+zTWM": "<s>{person}</s> zapped <s>{amount}</s> sats", "q+zTWM": "<s>{person}</s> zapped <s>{amount}</s> sats",
"r2Jjms": "Log In", "r2Jjms": "Log In",
"rELDbB": "Refresh",
"rWBFZA": "Sexually explicit material ahead!", "rWBFZA": "Sexually explicit material ahead!",
"rgsbu9": "Current Viewers", "rgsbu9": "Current Viewers",
"s5ksS7": "Image Link", "s5ksS7": "Image Link",
@ -189,6 +189,7 @@
"wOy57k": "Add stream goal", "wOy57k": "Add stream goal",
"wzWWzV": "Top zappers", "wzWWzV": "Top zappers",
"x82IOl": "Mute", "x82IOl": "Mute",
"xmcVZ0": "Search",
"y867Vs": "Volume", "y867Vs": "Volume",
"yLxIgl": "Clips", "yLxIgl": "Clips",
"yzKwBQ": "eg. nsec1xyz", "yzKwBQ": "eg. nsec1xyz",

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -1,416 +0,0 @@
{
"+0zv6g": {
"defaultMessage": "Image"
},
"+AcVD+": {
"defaultMessage": "No emails, just awesomeness!"
},
"+vVZ/G": {
"defaultMessage": "Connect"
},
"/0TOL5": {
"defaultMessage": "Amount"
},
"/EvlqN": {
"defaultMessage": "nostr signer extension"
},
"/GCoTA": {
"defaultMessage": "Clear"
},
"04lmFi": {
"defaultMessage": "Save Key"
},
"0GfNiL": {
"defaultMessage": "Stream Zap Goals"
},
"0VV/sK": {
"defaultMessage": "Goal"
},
"1EYCdR": {
"defaultMessage": "Tags"
},
"1qsXCO": {
"defaultMessage": "eg. name@wallet.com"
},
"2/2yg+": {
"defaultMessage": "Add"
},
"2CGh/0": {
"defaultMessage": "live"
},
"3HwrQo": {
"defaultMessage": "Zap!"
},
"3adEeb": {
"defaultMessage": "{n} viewers"
},
"3df560": {
"defaultMessage": "Login with private key"
},
"47FYwb": {
"defaultMessage": "Cancel"
},
"4l69eO": {
"defaultMessage": "Hmm, your lightning address looks wrong"
},
"4l6vz1": {
"defaultMessage": "Copy"
},
"4uI538": {
"defaultMessage": "Resolutions"
},
"5JcXdV": {
"defaultMessage": "Create Account"
},
"5QYdPU": {
"defaultMessage": "Start Time"
},
"5kx+2v": {
"defaultMessage": "Server Url"
},
"6Z2pvJ": {
"defaultMessage": "Stream Providers"
},
"6pr6hJ": {
"defaultMessage": "Minimum amount for text to speech"
},
"8YT6ja": {
"defaultMessage": "Insert text to speak"
},
"9WRlF4": {
"defaultMessage": "Send"
},
"9a9+ww": {
"defaultMessage": "Title"
},
"9anxhq": {
"defaultMessage": "Starts"
},
"AIHaPH": {
"defaultMessage": "{person} zapped {amount} sats"
},
"Atr2p4": {
"defaultMessage": "NSFW Content"
},
"AukrPM": {
"defaultMessage": "No viewer data available"
},
"AyGauy": {
"defaultMessage": "Login"
},
"BGxpTN": {
"defaultMessage": "Stream Chat"
},
"Bep/gA": {
"defaultMessage": "Private key"
},
"C81/uG": {
"defaultMessage": "Logout"
},
"D3idYv": {
"defaultMessage": "Settings"
},
"DZKuuP": {
"defaultMessage": "Logged in as"
},
"Dn82AL": {
"defaultMessage": "Live"
},
"ESyhzp": {
"defaultMessage": "Your comment for {name}"
},
"FjDlus": {
"defaultMessage": "You can always replace it with your own address later."
},
"Fodi9+": {
"defaultMessage": "Get paid by viewers"
},
"G/yZLu": {
"defaultMessage": "Remove"
},
"Gq6x9o": {
"defaultMessage": "Cover Image"
},
"H/bNs9": {
"defaultMessage": "Save this and keep it safe! If you lose this key, you won't be able to access your account ever again. Yep, it's that serious!"
},
"H5+NAX": {
"defaultMessage": "Balance"
},
"HAlOn1": {
"defaultMessage": "Name"
},
"I/TubD": {
"defaultMessage": "Select a goal..."
},
"I1kjHI": {
"defaultMessage": "Supports {markdown}"
},
"IJDKz3": {
"defaultMessage": "Zap amount in {currency}"
},
"INlWvJ": {
"defaultMessage": "OR"
},
"JEsxDw": {
"defaultMessage": "Uploading..."
},
"Jq3FDz": {
"defaultMessage": "Content"
},
"K3r6DQ": {
"defaultMessage": "Delete"
},
"K3uH1C": {
"defaultMessage": "offline"
},
"K7AkdL": {
"defaultMessage": "Show"
},
"KkIL3s": {
"defaultMessage": "No, I am under 18"
},
"LknBsU": {
"defaultMessage": "Stream Key"
},
"My6HwN": {
"defaultMessage": "Ok, it's safe"
},
"O2Cy6m": {
"defaultMessage": "Yes, I am over 18"
},
"OEW7yJ": {
"defaultMessage": "Zaps"
},
"OKhRC6": {
"defaultMessage": "Share"
},
"OWgHbg": {
"defaultMessage": "Edit card"
},
"Oxqtyf": {
"defaultMessage": "We hooked you up with a lightning wallet so you can get paid by viewers right away!"
},
"Q3au2v": {
"defaultMessage": "About {estimate}"
},
"QRHNuF": {
"defaultMessage": "What are we steaming today?"
},
"QRRCp0": {
"defaultMessage": "Stream URL"
},
"QceMQZ": {
"defaultMessage": "Goal: {amount}"
},
"Qe1MJu": {
"defaultMessage": "{name} with {amount}"
},
"RJOmzk": {
"defaultMessage": "I have read and agree with {provider}''s {terms}."
},
"RXQdxR": {
"defaultMessage": "Please login to write messages!"
},
"RrCui3": {
"defaultMessage": "Summary"
},
"TP/cMX": {
"defaultMessage": "Ended"
},
"TaTRKo": {
"defaultMessage": "Start Stream"
},
"TwyMau": {
"defaultMessage": "Account"
},
"UJBFYK": {
"defaultMessage": "Add Card"
},
"UfSot5": {
"defaultMessage": "Past Streams"
},
"VA/Z1S": {
"defaultMessage": "Hide"
},
"W9355R": {
"defaultMessage": "Unmute"
},
"X2PZ7D": {
"defaultMessage": "Create Goal"
},
"Z8ZOEY": {
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
},
"ZmqxZs": {
"defaultMessage": "You can change this later"
},
"acrOoz": {
"defaultMessage": "Continue"
},
"cPIKU2": {
"defaultMessage": "Following"
},
"cvAsEh": {
"defaultMessage": "Streamed on {date}"
},
"cyR7Kh": {
"defaultMessage": "Back"
},
"d5zWyh": {
"defaultMessage": "Test voice"
},
"dVD/AR": {
"defaultMessage": "Top Zappers"
},
"ebmhes": {
"defaultMessage": "Nostr Extension"
},
"f6biFA": {
"defaultMessage": "Oh, and you have {n} sats of free streaming on us! 💜"
},
"fBI91o": {
"defaultMessage": "Zap"
},
"fc2iho": {
"defaultMessage": "Add File"
},
"feZ/kG": {
"defaultMessage": "Login with Private Key (insecure)"
},
"hGQqkW": {
"defaultMessage": "Schedule"
},
"heyxZL": {
"defaultMessage": "Enable text to speech"
},
"hpl4BP": {
"defaultMessage": "Chat Widget"
},
"ieGrWo": {
"defaultMessage": "Follow"
},
"itPgxd": {
"defaultMessage": "Profile"
},
"izWS4J": {
"defaultMessage": "Unfollow"
},
"jr4+vD": {
"defaultMessage": "Markdown"
},
"jvo0vs": {
"defaultMessage": "Save"
},
"k21gTS": {
"defaultMessage": "e.g. about me"
},
"kp0NPF": {
"defaultMessage": "Planned"
},
"lZpRMR": {
"defaultMessage": "Check here if this stream contains nudity or pornographic content."
},
"ljmS5P": {
"defaultMessage": "Endpoint"
},
"mnJYBQ": {
"defaultMessage": "Voice"
},
"mtNGwh": {
"defaultMessage": "A short description of the content"
},
"nBCvvJ": {
"defaultMessage": "Topup"
},
"nOaArs": {
"defaultMessage": "Setup Profile"
},
"nwA8Os": {
"defaultMessage": "Add card"
},
"oHPB8Q": {
"defaultMessage": "Zap {name}"
},
"oZrFyI": {
"defaultMessage": "Stream type should be HLS"
},
"pO/lPX": {
"defaultMessage": "Scheduled for {date}"
},
"r2Jjms": {
"defaultMessage": "Log In"
},
"rWBFZA": {
"defaultMessage": "Sexually explicit material ahead!"
},
"rbrahO": {
"defaultMessage": "Close"
},
"rfC1Zq": {
"defaultMessage": "Save card"
},
"rgsbu9": {
"defaultMessage": "Current Viewers"
},
"s5ksS7": {
"defaultMessage": "Image Link"
},
"s7V+5p": {
"defaultMessage": "Confirm your age"
},
"sInm1h": {
"defaultMessage": "Zap message"
},
"tG1ST3": {
"defaultMessage": "Incoming Zap"
},
"tM6fNW": {
"defaultMessage": "Amazing! Continue.."
},
"thsiMl": {
"defaultMessage": "terms and conditions"
},
"tzMNF3": {
"defaultMessage": "Status"
},
"u6uD94": {
"defaultMessage": "Create an Account"
},
"uYw2LD": {
"defaultMessage": "Stream"
},
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
"w0Xm2F": {
"defaultMessage": "Start typing"
},
"wCIL7o": {
"defaultMessage": "Broadcast on Nostr"
},
"wEQDC6": {
"defaultMessage": "Edit"
},
"wMKVFz": {
"defaultMessage": "Select voice..."
},
"wOy57k": {
"defaultMessage": "Add stream goal"
},
"wzWWzV": {
"defaultMessage": "Top zappers"
},
"x82IOl": {
"defaultMessage": "Mute"
},
"y867Vs": {
"defaultMessage": "Volume"
},
"yzKwBQ": {
"defaultMessage": "eg. nsec1xyz"
},
"zVDHAu": {
"defaultMessage": "Zap Alert"
}
}

View File

@ -24,13 +24,6 @@ export function findTag(e: NostrEvent | undefined, tag: string) {
return maybeTag && maybeTag[1]; return maybeTag && maybeTag[1];
} }
export function splitByUrl(str: string) {
const urlRegex =
/((?:http|ftp|https|nostr|web\+nostr|magnet):\/?\/?(?:[\w+?.\w+])+(?:[a-zA-Z0-9~!@#$%^&*()_\-=+\\/?.:;',]*)?(?:[-A-Za-z0-9+&@#/%=~()_|]))/i;
return str.split(urlRegex);
}
export function eventLink(ev: NostrEvent | TaggedNostrEvent) { export function eventLink(ev: NostrEvent | TaggedNostrEvent) {
return NostrLink.fromEvent(ev).encode(); return NostrLink.fromEvent(ev).encode();
} }
@ -83,6 +76,11 @@ export function getPlaceholder(id: string) {
return `https://robohash.v0l.io/${id}.png`; return `https://robohash.v0l.io/${id}.png`;
} }
export function debounce(time: number, fn: () => void): () => void {
const t = setTimeout(fn, time);
return () => clearTimeout(t);
}
interface StreamInfo { interface StreamInfo {
id?: string; id?: string;
title?: string; title?: string;

View File

@ -6,7 +6,11 @@ import { vitePluginVersionMark } from "vite-plugin-version-mark";
export default defineConfig({ export default defineConfig({
plugins: [ plugins: [
react(), react({
babel: {
configFile: true,
},
}),
VitePWA({ VitePWA({
strategies: "injectManifest", strategies: "injectManifest",
srcDir: "src", srcDir: "src",

438
yarn.lock
View File

@ -69,6 +69,36 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/compat-data@npm:^7.23.5":
version: 7.23.5
resolution: "@babel/compat-data@npm:7.23.5"
checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744
languageName: node
linkType: hard
"@babel/core@npm:^7.10.4":
version: 7.24.0
resolution: "@babel/core@npm:7.24.0"
dependencies:
"@ampproject/remapping": ^2.2.0
"@babel/code-frame": ^7.23.5
"@babel/generator": ^7.23.6
"@babel/helper-compilation-targets": ^7.23.6
"@babel/helper-module-transforms": ^7.23.3
"@babel/helpers": ^7.24.0
"@babel/parser": ^7.24.0
"@babel/template": ^7.24.0
"@babel/traverse": ^7.24.0
"@babel/types": ^7.24.0
convert-source-map: ^2.0.0
debug: ^4.1.0
gensync: ^1.0.0-beta.2
json5: ^2.2.3
semver: ^6.3.1
checksum: 3124a8a1c550f3818a55dc6f621af9c580b4959bc780cce7220f671088c404830f41870573f5acf7f837878f8aa82e84675ea148a9852c1b053533cb899300d3
languageName: node
linkType: hard
"@babel/core@npm:^7.11.1": "@babel/core@npm:^7.11.1":
version: 7.22.11 version: 7.22.11
resolution: "@babel/core@npm:7.22.11" resolution: "@babel/core@npm:7.22.11"
@ -139,6 +169,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/generator@npm:^7.23.6":
version: 7.23.6
resolution: "@babel/generator@npm:7.23.6"
dependencies:
"@babel/types": ^7.23.6
"@jridgewell/gen-mapping": ^0.3.2
"@jridgewell/trace-mapping": ^0.3.17
jsesc: ^2.5.1
checksum: 1a1a1c4eac210f174cd108d479464d053930a812798e09fee069377de39a893422df5b5b146199ead7239ae6d3a04697b45fc9ac6e38e0f6b76374390f91fc6c
languageName: node
linkType: hard
"@babel/helper-annotate-as-pure@npm:^7.22.5": "@babel/helper-annotate-as-pure@npm:^7.22.5":
version: 7.22.5 version: 7.22.5
resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" resolution: "@babel/helper-annotate-as-pure@npm:7.22.5"
@ -183,6 +225,19 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/helper-compilation-targets@npm:^7.23.6":
version: 7.23.6
resolution: "@babel/helper-compilation-targets@npm:7.23.6"
dependencies:
"@babel/compat-data": ^7.23.5
"@babel/helper-validator-option": ^7.23.5
browserslist: ^4.22.2
lru-cache: ^5.1.1
semver: ^6.3.1
checksum: c630b98d4527ac8fe2c58d9a06e785dfb2b73ec71b7c4f2ddf90f814b5f75b547f3c015f110a010fd31f76e3864daaf09f3adcd2f6acdbfb18a8de3a48717590
languageName: node
linkType: hard
"@babel/helper-create-class-features-plugin@npm:^7.22.11, @babel/helper-create-class-features-plugin@npm:^7.22.5": "@babel/helper-create-class-features-plugin@npm:^7.22.11, @babel/helper-create-class-features-plugin@npm:^7.22.5":
version: 7.22.11 version: 7.22.11
resolution: "@babel/helper-create-class-features-plugin@npm:7.22.11" resolution: "@babel/helper-create-class-features-plugin@npm:7.22.11"
@ -427,7 +482,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/helper-validator-option@npm:^7.22.15": "@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.23.5":
version: 7.23.5 version: 7.23.5
resolution: "@babel/helper-validator-option@npm:7.23.5" resolution: "@babel/helper-validator-option@npm:7.23.5"
checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e
@ -474,6 +529,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/helpers@npm:^7.24.0":
version: 7.24.0
resolution: "@babel/helpers@npm:7.24.0"
dependencies:
"@babel/template": ^7.24.0
"@babel/traverse": ^7.24.0
"@babel/types": ^7.24.0
checksum: 2c1d9547c7a6e5aa648d4f3959252f825d4176ee52ed5430d65e50e68a138776adfd87ff3c8f9719ea6cd36601e935936d006340770ad8282b8664770aca8e33
languageName: node
linkType: hard
"@babel/highlight@npm:^7.22.10": "@babel/highlight@npm:^7.22.10":
version: 7.22.10 version: 7.22.10
resolution: "@babel/highlight@npm:7.22.10" resolution: "@babel/highlight@npm:7.22.10"
@ -514,6 +580,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/parser@npm:^7.24.0":
version: 7.24.0
resolution: "@babel/parser@npm:7.24.0"
bin:
parser: ./bin/babel-parser.js
checksum: 4a6afec49487a212e7a27345b0c090b56905efb62c0b3a1499b0a57a5b3bf43d9d1e99e31b137080eacc24dee659a29699740d0a6289999117c0d8c5a04bd68f
languageName: node
linkType: hard
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.5": "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.5":
version: 7.22.5 version: 7.22.5
resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.22.5" resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.22.5"
@ -646,6 +721,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/plugin-syntax-jsx@npm:7":
version: 7.23.3
resolution: "@babel/plugin-syntax-jsx@npm:7.23.3"
dependencies:
"@babel/helper-plugin-utils": ^7.22.5
peerDependencies:
"@babel/core": ^7.0.0-0
checksum: 89037694314a74e7f0e7a9c8d3793af5bf6b23d80950c29b360db1c66859d67f60711ea437e70ad6b5b4b29affe17eababda841b6c01107c2b638e0493bafb4e
languageName: node
linkType: hard
"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": "@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4":
version: 7.10.4 version: 7.10.4
resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4"
@ -1498,6 +1584,35 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/template@npm:^7.24.0":
version: 7.24.0
resolution: "@babel/template@npm:7.24.0"
dependencies:
"@babel/code-frame": ^7.23.5
"@babel/parser": ^7.24.0
"@babel/types": ^7.24.0
checksum: f257b003c071a0cecdbfceca74185f18fe62c055469ab5c1d481aab12abeebed328e67e0a19fd978a2a8de97b28953fa4bc3da6d038a7345fdf37923b9fcdec8
languageName: node
linkType: hard
"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.0":
version: 7.24.0
resolution: "@babel/traverse@npm:7.24.0"
dependencies:
"@babel/code-frame": ^7.23.5
"@babel/generator": ^7.23.6
"@babel/helper-environment-visitor": ^7.22.20
"@babel/helper-function-name": ^7.23.0
"@babel/helper-hoist-variables": ^7.22.5
"@babel/helper-split-export-declaration": ^7.22.6
"@babel/parser": ^7.24.0
"@babel/types": ^7.24.0
debug: ^4.3.1
globals: ^11.1.0
checksum: 790cf14a6452575ceef767285bad0dd96d14b3640ed4e6a4ddb5b592e4e66020424bac21e4a4b965ac0d2fe9ed504fe3644748b1922fb8ac37c681cb435c3995
languageName: node
linkType: hard
"@babel/traverse@npm:^7.22.11": "@babel/traverse@npm:^7.22.11":
version: 7.22.11 version: 7.22.11
resolution: "@babel/traverse@npm:7.22.11" resolution: "@babel/traverse@npm:7.22.11"
@ -1545,6 +1660,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/types@npm:^7.12.11, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.0":
version: 7.24.0
resolution: "@babel/types@npm:7.24.0"
dependencies:
"@babel/helper-string-parser": ^7.23.4
"@babel/helper-validator-identifier": ^7.22.20
to-fast-properties: ^2.0.0
checksum: 4b574a37d490f621470ff36a5afaac6deca5546edcb9b5e316d39acbb20998e9c2be42f3fc0bf2b55906fc49ff2a5a6a097e8f5a726ee3f708a0b0ca93aed807
languageName: node
linkType: hard
"@babel/types@npm:^7.22.10, @babel/types@npm:^7.22.11, @babel/types@npm:^7.22.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": "@babel/types@npm:^7.22.10, @babel/types@npm:^7.22.11, @babel/types@npm:^7.22.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3":
version: 7.22.11 version: 7.22.11
resolution: "@babel/types@npm:7.22.11" resolution: "@babel/types@npm:7.22.11"
@ -1800,13 +1926,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@formatjs/ecma402-abstract@npm:1.18.0": "@formatjs/ecma402-abstract@npm:1.18.2":
version: 1.18.0 version: 1.18.2
resolution: "@formatjs/ecma402-abstract@npm:1.18.0" resolution: "@formatjs/ecma402-abstract@npm:1.18.2"
dependencies: dependencies:
"@formatjs/intl-localematcher": 0.5.2 "@formatjs/intl-localematcher": 0.5.4
tslib: ^2.4.0 tslib: ^2.4.0
checksum: 22be7f02397d565de621bba5d57135bf7a360b4f3f04e7d75194854f47c22fa8cc2e43ede2c6d1dea885d3cb5df6f58e82ea7ba457a7b3e208403372cd6b90f3 checksum: c664056ccab4e3407feabd5802276075eae2b614acb8c5979045ff5a70bfec4c04488188c30b311b6db0e0eb0b5c1ca328868d76472a14243c944bc0639e8a4d
languageName: node languageName: node
linkType: hard linkType: hard
@ -1830,14 +1956,14 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@formatjs/icu-messageformat-parser@npm:2.7.3": "@formatjs/icu-messageformat-parser@npm:2.7.6":
version: 2.7.3 version: 2.7.6
resolution: "@formatjs/icu-messageformat-parser@npm:2.7.3" resolution: "@formatjs/icu-messageformat-parser@npm:2.7.6"
dependencies: dependencies:
"@formatjs/ecma402-abstract": 1.18.0 "@formatjs/ecma402-abstract": 1.18.2
"@formatjs/icu-skeleton-parser": 1.7.0 "@formatjs/icu-skeleton-parser": 1.8.0
tslib: ^2.4.0 tslib: ^2.4.0
checksum: 3efd07e26dfd768cfb4ebee72787f150eb7c65849610d0b08b09ffd26f127ce2a7027dc901a3a2ee536597a26bce289bff3f3d9de8247c274e364c0666f685d6 checksum: d537253cbfe0515c0b72495b1133528a6643f23f978f6d9576defe5150dbb4b9b4e4b7028e2ff1bfaa4d104b05aa1119688d3fb7a4cf9b1b78ba8019a6adfeb1
languageName: node languageName: node
linkType: hard linkType: hard
@ -1851,13 +1977,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@formatjs/icu-skeleton-parser@npm:1.7.0": "@formatjs/icu-skeleton-parser@npm:1.8.0":
version: 1.7.0 version: 1.8.0
resolution: "@formatjs/icu-skeleton-parser@npm:1.7.0" resolution: "@formatjs/icu-skeleton-parser@npm:1.8.0"
dependencies: dependencies:
"@formatjs/ecma402-abstract": 1.18.0 "@formatjs/ecma402-abstract": 1.18.2
tslib: ^2.4.0 tslib: ^2.4.0
checksum: a461d95b0a39a52d2acb776cb60818188f32ca5d8be7d97440b892bb30564e852410c3fffe96c4c5e6793934f3f694958da8297bd7e3b0cbe114f11223a57013 checksum: 85ca45148a8535c61f2667d24d3e59ab97cd2b4accee8383594872a319e875effae7d54e070fd0d3926fc1407b04f5685f94336c1d0d587fcb1064bb498e5319
languageName: node languageName: node
linkType: hard linkType: hard
@ -1892,12 +2018,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@formatjs/intl-localematcher@npm:0.5.2": "@formatjs/intl-localematcher@npm:0.5.4":
version: 0.5.2 version: 0.5.4
resolution: "@formatjs/intl-localematcher@npm:0.5.2" resolution: "@formatjs/intl-localematcher@npm:0.5.4"
dependencies: dependencies:
tslib: ^2.4.0 tslib: ^2.4.0
checksum: a741d69e9d3b71bee19726484de4a296711d96dc27f588d995b9e2079d3bc5d06370b6e84136003197d558d45f9faf507321627a78d8cd986705b78ec701c016 checksum: a0af57874fcd163add5f7a0cb1c008e9b09feb1d24cbce1263379ae0393cddd6681197a7f2f512f351a97666fc8675ed52cc17d1834266ee8fc65e9edf3435f6
languageName: node languageName: node
linkType: hard linkType: hard
@ -1921,11 +2047,11 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@formatjs/ts-transformer@npm:3.13.9": "@formatjs/ts-transformer@npm:3.13.12":
version: 3.13.9 version: 3.13.12
resolution: "@formatjs/ts-transformer@npm:3.13.9" resolution: "@formatjs/ts-transformer@npm:3.13.12"
dependencies: dependencies:
"@formatjs/icu-messageformat-parser": 2.7.3 "@formatjs/icu-messageformat-parser": 2.7.6
"@types/json-stable-stringify": ^1.0.32 "@types/json-stable-stringify": ^1.0.32
"@types/node": 14 || 16 || 17 "@types/node": 14 || 16 || 17
chalk: ^4.0.0 chalk: ^4.0.0
@ -1937,27 +2063,7 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
ts-jest: ts-jest:
optional: true optional: true
checksum: c5e8380f31cecfb5383b869d85f71b87f27dad145ace1bf7121a3a8bf62158928d077c482b1553c0fa1991101656c595a5f5de579ba11f05b525e9916c97cebe checksum: fbdc1476021220f88612cb182ec35b2eca76a905225c480e7d5450e1684919f92b5860af6545e7a6d6a2d2b0d06b07b507707852de6680b6a360a3bd8f313d5a
languageName: node
linkType: hard
"@formatjs/ts-transformer@npm:^3.13.3":
version: 3.13.3
resolution: "@formatjs/ts-transformer@npm:3.13.3"
dependencies:
"@formatjs/icu-messageformat-parser": 2.6.0
"@types/json-stable-stringify": ^1.0.32
"@types/node": 14 || 16 || 17
chalk: ^4.0.0
json-stable-stringify: ^1.0.1
tslib: ^2.4.0
typescript: ^4.7 || 5
peerDependencies:
ts-jest: ">=27"
peerDependenciesMeta:
ts-jest:
optional: true
checksum: 083e49338204363d1eb992cea2b3d7a62dd92a7e6de235028647a6c187cc2c58a803975d6d92e65aa6f9fd61a9084715f9d6fd35518fa248aaaffdb004625edb
languageName: node languageName: node
linkType: hard linkType: hard
@ -2035,7 +2141,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14":
version: 1.4.15 version: 1.4.15
resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" resolution: "@jridgewell/sourcemap-codec@npm:1.4.15"
checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8
@ -2504,7 +2610,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/babel__core@npm:^7.20.4": "@types/babel__core@npm:*, @types/babel__core@npm:^7.1.7, @types/babel__core@npm:^7.20.4":
version: 7.20.5 version: 7.20.5
resolution: "@types/babel__core@npm:7.20.5" resolution: "@types/babel__core@npm:7.20.5"
dependencies: dependencies:
@ -2526,6 +2632,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/babel__helper-plugin-utils@npm:^7.10.0":
version: 7.10.3
resolution: "@types/babel__helper-plugin-utils@npm:7.10.3"
dependencies:
"@types/babel__core": "*"
checksum: eb27740adaad62f72f1c1eebafefc71efe8df05f3bf2c0a6ec9fad1907301c0129a1031998f37dcaf200a7a3883414dca667ed660fd8465f62b21c4cbace30e3
languageName: node
linkType: hard
"@types/babel__template@npm:*": "@types/babel__template@npm:*":
version: 7.4.4 version: 7.4.4
resolution: "@types/babel__template@npm:7.4.4" resolution: "@types/babel__template@npm:7.4.4"
@ -2545,6 +2660,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/babel__traverse@npm:^7.1.7":
version: 7.20.5
resolution: "@types/babel__traverse@npm:7.20.5"
dependencies:
"@babel/types": ^7.20.7
checksum: 608e0ab4fc31cd47011d98942e6241b34d461608c0c0e153377c5fd822c436c475f1ded76a56bfa76a1adf8d9266b727bbf9bfac90c4cb152c97f30dadc5b7e8
languageName: node
linkType: hard
"@types/d3-array@npm:^3.0.3": "@types/d3-array@npm:^3.0.3":
version: 3.2.1 version: 3.2.1
resolution: "@types/d3-array@npm:3.2.1" resolution: "@types/d3-array@npm:3.2.1"
@ -2614,23 +2738,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/eslint@npm:7 || 8":
version: 8.44.8
resolution: "@types/eslint@npm:8.44.8"
dependencies:
"@types/estree": "*"
"@types/json-schema": "*"
checksum: c3bc70166075e6e9f7fb43978882b9ac0b22596b519900b08dc8a1d761bbbddec4c48a60cc4eb674601266223c6f11db30f3fb6ceaae96c23c54b35ad88022bc
languageName: node
linkType: hard
"@types/estree@npm:*":
version: 1.0.5
resolution: "@types/estree@npm:1.0.5"
checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a
languageName: node
linkType: hard
"@types/estree@npm:0.0.39": "@types/estree@npm:0.0.39":
version: 0.0.39 version: 0.0.39
resolution: "@types/estree@npm:0.0.39" resolution: "@types/estree@npm:0.0.39"
@ -2648,13 +2755,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/json-schema@npm:*":
version: 7.0.15
resolution: "@types/json-schema@npm:7.0.15"
checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98
languageName: node
linkType: hard
"@types/json-schema@npm:^7.0.12": "@types/json-schema@npm:^7.0.12":
version: 7.0.12 version: 7.0.12
resolution: "@types/json-schema@npm:7.0.12" resolution: "@types/json-schema@npm:7.0.12"
@ -2692,13 +2792,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/picomatch@npm:^2.3.0":
version: 2.3.3
resolution: "@types/picomatch@npm:2.3.3"
checksum: 1bf1a1d80296a585d3310c97be87e67e16da6f5c168e01ce27eef835abfc5bcca8e395afd6ae8b2b73eb72540d1587da7a468e4dfe7277ea208cf43cae096854
languageName: node
linkType: hard
"@types/prop-types@npm:*": "@types/prop-types@npm:*":
version: 15.7.5 version: 15.7.5
resolution: "@types/prop-types@npm:15.7.5" resolution: "@types/prop-types@npm:15.7.5"
@ -2817,16 +2910,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/scope-manager@npm:6.13.1":
version: 6.13.1
resolution: "@typescript-eslint/scope-manager@npm:6.13.1"
dependencies:
"@typescript-eslint/types": 6.13.1
"@typescript-eslint/visitor-keys": 6.13.1
checksum: 109a213f82719e10f8c6a0168f2e105dc1369c7e0c075c1f30af137030fc866a3a585a77ff78a9a3538afc213061c8aedbb4462a91f26cbd90eefbab8b89ea10
languageName: node
linkType: hard
"@typescript-eslint/scope-manager@npm:6.4.1": "@typescript-eslint/scope-manager@npm:6.4.1":
version: 6.4.1 version: 6.4.1
resolution: "@typescript-eslint/scope-manager@npm:6.4.1" resolution: "@typescript-eslint/scope-manager@npm:6.4.1"
@ -2854,13 +2937,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/types@npm:6.13.1":
version: 6.13.1
resolution: "@typescript-eslint/types@npm:6.13.1"
checksum: bb1d52f1646bab9acd3ec874567ffbaaaf7fe4a5f79845bdacbfea46d15698e58d45797da05b08c23f9496a17229b7f2c1363d000fd89ce4e79874fd57ba1d4a
languageName: node
linkType: hard
"@typescript-eslint/types@npm:6.4.1": "@typescript-eslint/types@npm:6.4.1":
version: 6.4.1 version: 6.4.1
resolution: "@typescript-eslint/types@npm:6.4.1" resolution: "@typescript-eslint/types@npm:6.4.1"
@ -2868,24 +2944,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/typescript-estree@npm:6.13.1":
version: 6.13.1
resolution: "@typescript-eslint/typescript-estree@npm:6.13.1"
dependencies:
"@typescript-eslint/types": 6.13.1
"@typescript-eslint/visitor-keys": 6.13.1
debug: ^4.3.4
globby: ^11.1.0
is-glob: ^4.0.3
semver: ^7.5.4
ts-api-utils: ^1.0.1
peerDependenciesMeta:
typescript:
optional: true
checksum: 09aa0f5cbd60e84df4f58f3d479be352549600b24dbefe75c686ea89252526c52c1c06ce1ae56c0405dd7337002e741c2ba02b71fb1caa3b94a740a70fcc8699
languageName: node
linkType: hard
"@typescript-eslint/typescript-estree@npm:6.4.1": "@typescript-eslint/typescript-estree@npm:6.4.1":
version: 6.4.1 version: 6.4.1
resolution: "@typescript-eslint/typescript-estree@npm:6.4.1" resolution: "@typescript-eslint/typescript-estree@npm:6.4.1"
@ -2921,33 +2979,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/utils@npm:^6.5.0":
version: 6.13.1
resolution: "@typescript-eslint/utils@npm:6.13.1"
dependencies:
"@eslint-community/eslint-utils": ^4.4.0
"@types/json-schema": ^7.0.12
"@types/semver": ^7.5.0
"@typescript-eslint/scope-manager": 6.13.1
"@typescript-eslint/types": 6.13.1
"@typescript-eslint/typescript-estree": 6.13.1
semver: ^7.5.4
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
checksum: 14f64840869c8755af4d287cfc74abc424dc139559e87ca1a8b0e850f4fa56311d99dfb61a43dd4433eae5914be12b4b3390e55de1f236dce6701830d17e31c9
languageName: node
linkType: hard
"@typescript-eslint/visitor-keys@npm:6.13.1":
version: 6.13.1
resolution: "@typescript-eslint/visitor-keys@npm:6.13.1"
dependencies:
"@typescript-eslint/types": 6.13.1
eslint-visitor-keys: ^3.4.1
checksum: d15d362203a2fe995ea62a59d5b44c15c8fb1fb30ff59dd1542a980f75b3b62035303dfb781d83709921613f6ac8cc5bf57b70f6e20d820aec8b7911f07152e9
languageName: node
linkType: hard
"@typescript-eslint/visitor-keys@npm:6.4.1": "@typescript-eslint/visitor-keys@npm:6.4.1":
version: 6.4.1 version: 6.4.1
resolution: "@typescript-eslint/visitor-keys@npm:6.4.1" resolution: "@typescript-eslint/visitor-keys@npm:6.4.1"
@ -3253,6 +3284,25 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"babel-plugin-formatjs@npm:^10.5.13":
version: 10.5.13
resolution: "babel-plugin-formatjs@npm:10.5.13"
dependencies:
"@babel/core": ^7.10.4
"@babel/helper-plugin-utils": ^7.10.4
"@babel/plugin-syntax-jsx": 7
"@babel/traverse": 7
"@babel/types": ^7.12.11
"@formatjs/icu-messageformat-parser": 2.7.6
"@formatjs/ts-transformer": 3.13.12
"@types/babel__core": ^7.1.7
"@types/babel__helper-plugin-utils": ^7.10.0
"@types/babel__traverse": ^7.1.7
tslib: ^2.4.0
checksum: 23474d16edb9a646472aba4682a8af26dd1df76906a68c8d4e4ea406983b6404e0277ce8ad349faf3e32fd9006492ca4df9e58a7291220fc7dfefe1a26682525
languageName: node
linkType: hard
"babel-plugin-polyfill-corejs2@npm:^0.4.5": "babel-plugin-polyfill-corejs2@npm:^0.4.5":
version: 0.4.5 version: 0.4.5
resolution: "babel-plugin-polyfill-corejs2@npm:0.4.5" resolution: "babel-plugin-polyfill-corejs2@npm:0.4.5"
@ -3352,6 +3402,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"browserslist@npm:^4.22.2":
version: 4.23.0
resolution: "browserslist@npm:4.23.0"
dependencies:
caniuse-lite: ^1.0.30001587
electron-to-chromium: ^1.4.668
node-releases: ^2.0.14
update-browserslist-db: ^1.0.13
bin:
browserslist: cli.js
checksum: 436f49e796782ca751ebab7edc010cfc9c29f68536f387666cd70ea22f7105563f04dd62c6ff89cb24cc3254d17cba385f979eeeb3484d43e012412ff7e75def
languageName: node
linkType: hard
"buffer-from@npm:^1.0.0": "buffer-from@npm:^1.0.0":
version: 1.1.2 version: 1.1.2
resolution: "buffer-from@npm:1.1.2" resolution: "buffer-from@npm:1.1.2"
@ -3434,6 +3498,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"caniuse-lite@npm:^1.0.30001587":
version: 1.0.30001594
resolution: "caniuse-lite@npm:1.0.30001594"
checksum: 59e52b2213f34fa9317813037fbab4f9b163f9bfeaeeb53035a57046ee2366b69eafc257997eab22982dc061d0576d1f4ef97c29425e1989f6589a7b1d8ed2d5
languageName: node
linkType: hard
"chalk@npm:^2.4.2": "chalk@npm:^2.4.2":
version: 2.4.2 version: 2.4.2
resolution: "chalk@npm:2.4.2" resolution: "chalk@npm:2.4.2"
@ -3739,7 +3810,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": "debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4":
version: 4.3.4 version: 4.3.4
resolution: "debug@npm:4.3.4" resolution: "debug@npm:4.3.4"
dependencies: dependencies:
@ -3913,6 +3984,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"electron-to-chromium@npm:^1.4.668":
version: 1.4.692
resolution: "electron-to-chromium@npm:1.4.692"
checksum: 687e8d3833a32499c157c1d96eb11b840b7de71fa81369934ea51df01448d6408c6eed5f45406768b062fa2a45002795682e8e324bfba70528afd3241f79c049
languageName: node
linkType: hard
"emoji-mart@npm:^5.5.2": "emoji-mart@npm:^5.5.2":
version: 5.5.2 version: 5.5.2
resolution: "emoji-mart@npm:5.5.2" resolution: "emoji-mart@npm:5.5.2"
@ -3920,13 +3998,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"emoji-regex@npm:10.3.0, emoji-regex@npm:^10.2.1":
version: 10.3.0
resolution: "emoji-regex@npm:10.3.0"
checksum: 5da48edfeb9462fb1ae5495cff2d79129974c696853fb0ce952cbf560f29a2756825433bf51cfd5157ec7b9f93f46f31d712e896d63e3d8ac9c3832bdb45ab73
languageName: node
linkType: hard
"emoji-regex@npm:^8.0.0": "emoji-regex@npm:^8.0.0":
version: 8.0.0 version: 8.0.0
resolution: "emoji-regex@npm:8.0.0" resolution: "emoji-regex@npm:8.0.0"
@ -4155,27 +4226,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eslint-plugin-formatjs@npm:^4.11.3":
version: 4.11.3
resolution: "eslint-plugin-formatjs@npm:4.11.3"
dependencies:
"@formatjs/icu-messageformat-parser": 2.7.3
"@formatjs/ts-transformer": 3.13.9
"@types/eslint": 7 || 8
"@types/picomatch": ^2.3.0
"@typescript-eslint/utils": ^6.5.0
emoji-regex: ^10.2.1
magic-string: ^0.30.0
picomatch: ^2.3.1
tslib: 2.6.2
typescript: 5
unicode-emoji-utils: ^1.1.1
peerDependencies:
eslint: 7 || 8
checksum: 2840fef201bb8b0ba1bc0a37a4e1748279c0810d2d827f8dabe777347414ff3a758584b2e1788fcbdc59266de52d7ea7cdaacf95b7348e670e0e4602e0be689e
languageName: node
linkType: hard
"eslint-scope@npm:^7.2.2": "eslint-scope@npm:^7.2.2":
version: 7.2.2 version: 7.2.2
resolution: "eslint-scope@npm:7.2.2" resolution: "eslint-scope@npm:7.2.2"
@ -5576,15 +5626,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"magic-string@npm:^0.30.0":
version: 0.30.5
resolution: "magic-string@npm:0.30.5"
dependencies:
"@jridgewell/sourcemap-codec": ^1.4.15
checksum: da10fecff0c0a7d3faf756913ce62bd6d5e7b0402be48c3b27bfd651b90e29677e279069a63b764bcdc1b8ecdcdb898f29a5c5ec510f2323e8d62ee057a6eb18
languageName: node
linkType: hard
"make-fetch-happen@npm:^11.0.3": "make-fetch-happen@npm:^11.0.3":
version: 11.1.1 version: 11.1.1
resolution: "make-fetch-happen@npm:11.1.1" resolution: "make-fetch-happen@npm:11.1.1"
@ -5837,6 +5878,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"node-releases@npm:^2.0.14":
version: 2.0.14
resolution: "node-releases@npm:2.0.14"
checksum: 59443a2f77acac854c42d321bf1b43dea0aef55cd544c6a686e9816a697300458d4e82239e2d794ea05f7bbbc8a94500332e2d3ac3f11f52e4b16cbe638b3c41
languageName: node
linkType: hard
"nopt@npm:^6.0.0": "nopt@npm:^6.0.0":
version: 6.0.0 version: 6.0.0
resolution: "nopt@npm:6.0.0" resolution: "nopt@npm:6.0.0"
@ -7107,7 +7155,6 @@ __metadata:
"@emoji-mart/data": ^1.1.2 "@emoji-mart/data": ^1.1.2
"@emoji-mart/react": ^1.1.1 "@emoji-mart/react": ^1.1.1
"@formatjs/cli": ^6.1.3 "@formatjs/cli": ^6.1.3
"@formatjs/ts-transformer": ^3.13.3
"@noble/curves": ^1.2.0 "@noble/curves": ^1.2.0
"@scure/base": ^1.1.3 "@scure/base": ^1.1.3
"@snort/shared": ^1.0.14 "@snort/shared": ^1.0.14
@ -7131,11 +7178,11 @@ __metadata:
"@webbtc/webln-types": ^1.0.12 "@webbtc/webln-types": ^1.0.12
"@webscopeio/react-textarea-autocomplete": ^4.9.2 "@webscopeio/react-textarea-autocomplete": ^4.9.2
autoprefixer: ^10.4.16 autoprefixer: ^10.4.16
babel-plugin-formatjs: ^10.5.13
buffer: ^6.0.3 buffer: ^6.0.3
classnames: ^2.3.2 classnames: ^2.3.2
emoji-mart: ^5.5.2 emoji-mart: ^5.5.2
eslint: ^8.48.0 eslint: ^8.48.0
eslint-plugin-formatjs: ^4.11.3
flag-icons: ^6.11.0 flag-icons: ^6.11.0
hls.js: ^1.4.6 hls.js: ^1.4.6
marked: ^9.1.2 marked: ^9.1.2
@ -7497,7 +7544,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"tslib@npm:2.6.2, tslib@npm:^2.4.0": "tslib@npm:^2.4.0":
version: 2.6.2 version: 2.6.2
resolution: "tslib@npm:2.6.2" resolution: "tslib@npm:2.6.2"
checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad
@ -7591,7 +7638,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"typescript@npm:^4.7 || 5, typescript@npm:^5.2.2": "typescript@npm:^5.2.2":
version: 5.2.2 version: 5.2.2
resolution: "typescript@npm:5.2.2" resolution: "typescript@npm:5.2.2"
bin: bin:
@ -7611,7 +7658,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"typescript@patch:typescript@^4.7 || 5#~builtin<compat/typescript>, typescript@patch:typescript@^5.2.2#~builtin<compat/typescript>": "typescript@patch:typescript@^5.2.2#~builtin<compat/typescript>":
version: 5.2.2 version: 5.2.2
resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin<compat/typescript>::version=5.2.2&hash=f3b441" resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin<compat/typescript>::version=5.2.2&hash=f3b441"
bin: bin:
@ -7647,15 +7694,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"unicode-emoji-utils@npm:^1.1.1":
version: 1.2.0
resolution: "unicode-emoji-utils@npm:1.2.0"
dependencies:
emoji-regex: 10.3.0
checksum: a659831614f2d6c6942ff97ad63b8ba276af8b3e82c5aa07b8b4f42aa2428e7f2b4585750a0f10809f6bfa40514454463b491a6446078907c1160090fc1531b0
languageName: node
linkType: hard
"unicode-match-property-ecmascript@npm:^2.0.0": "unicode-match-property-ecmascript@npm:^2.0.0":
version: 2.0.0 version: 2.0.0
resolution: "unicode-match-property-ecmascript@npm:2.0.0" resolution: "unicode-match-property-ecmascript@npm:2.0.0"
@ -7735,6 +7773,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"update-browserslist-db@npm:^1.0.13":
version: 1.0.13
resolution: "update-browserslist-db@npm:1.0.13"
dependencies:
escalade: ^3.1.1
picocolors: ^1.0.0
peerDependencies:
browserslist: ">= 4.21.0"
bin:
update-browserslist-db: cli.js
checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322
languageName: node
linkType: hard
"uri-js@npm:^4.2.2": "uri-js@npm:^4.2.2":
version: 4.4.1 version: 4.4.1
resolution: "uri-js@npm:4.4.1" resolution: "uri-js@npm:4.4.1"