diff --git a/packages/app/.eslintrc.cjs b/packages/app/.eslintrc.cjs index 01143548..333691e5 100644 --- a/packages/app/.eslintrc.cjs +++ b/packages/app/.eslintrc.cjs @@ -1,7 +1,15 @@ module.exports = { extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"], parser: "@typescript-eslint/parser", - plugins: ["@typescript-eslint"], + plugins: ["@typescript-eslint", "formatjs"], + rules: { + "formatjs/enforce-id": [ + "error", + { + "idInterpolationPattern": "[sha512:contenthash:base64:6]" + } + ] + }, root: true, ignorePatterns: ["build/", "*.test.ts", "*.js"], env: { diff --git a/packages/app/public/index.html b/packages/app/index.html similarity index 59% rename from packages/app/public/index.html rename to packages/app/index.html index 37804b7d..fd4cd482 100644 --- a/packages/app/public/index.html +++ b/packages/app/index.html @@ -5,15 +5,14 @@ - + - + - <%= htmlWebpackPlugin.options.templateParameters.appTitle %> +
+ diff --git a/packages/app/package.json b/packages/app/package.json index cf3bc1fe..454a4a60 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -48,8 +48,9 @@ "workbox-strategies": "^6.4.2" }, "scripts": { - "start": "webpack serve --node-env=development --mode=development", - "build": "webpack --node-env=production --mode=production", + "start": "vite", + "build": "yarn eslint --fix && vite build", + "serve": "vite preview", "test": "jest --runInBand", "intl-extract": "formatjs extract 'src/**/*.ts*' --ignore='**/*.d.ts' --out-file src/lang.json --flatten true", "intl-compile": "formatjs compile src/lang.json --out-file src/translations/en.json", @@ -83,6 +84,7 @@ "@formatjs/cli": "^6.1.3", "@formatjs/ts-transformer": "^3.13.3", "@jest/globals": "^29.6.1", + "@types/config": "^3.3.3", "@types/debug": "^4.1.8", "@types/jest": "^29.5.1", "@types/node": "^20.4.1", @@ -94,6 +96,7 @@ "@types/webtorrent": "^0.109.3", "@typescript-eslint/eslint-plugin": "^6.1.0", "@typescript-eslint/parser": "^6.1.0", + "@vitejs/plugin-react": "^4.2.0", "@webbtc/webln-types": "^1.0.10", "@webpack-cli/generators": "^3.0.4", "@webscopeio/react-textarea-autocomplete": "^4.9.2", @@ -104,6 +107,7 @@ "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^5.0.0", "eslint": "^8.48.0", + "eslint-plugin-formatjs": "^4.11.3", "eslint-webpack-plugin": "^4.0.1", "html-webpack-plugin": "^5.5.1", "jest": "^29.5.0", @@ -114,6 +118,7 @@ "postcss-preset-env": "^9.2.0", "prettier": "2.8.3", "prop-types": "^15.8.1", + "rollup-plugin-visualizer": "^5.9.2", "source-map-loader": "^4.0.1", "tailwindcss": "^3.3.3", "terser-webpack-plugin": "^5.3.9", @@ -121,6 +126,8 @@ "ts-jest": "^29.1.1", "ts-loader": "^9.4.4", "typescript": "^5.2.2", + "vite": "^5.0.0", + "vite-plugin-pwa": "^0.17.0", "webpack": "^5.88.2", "webpack-bundle-analyzer": "^4.8.0", "webpack-cli": "^5.1.4", diff --git a/packages/app/src/Cache/ChatCache.ts b/packages/app/src/Cache/ChatCache.ts index 48738386..a3c24cae 100644 --- a/packages/app/src/Cache/ChatCache.ts +++ b/packages/app/src/Cache/ChatCache.ts @@ -1,6 +1,6 @@ import { NostrEvent } from "@snort/system"; import { FeedCache } from "@snort/shared"; -import { db } from "Db"; +import { db } from "@/Db"; export class ChatCache extends FeedCache { constructor() { diff --git a/packages/app/src/Cache/EventInteractionCache.ts b/packages/app/src/Cache/EventInteractionCache.ts index 9d21c4a2..a1e5f600 100644 --- a/packages/app/src/Cache/EventInteractionCache.ts +++ b/packages/app/src/Cache/EventInteractionCache.ts @@ -1,7 +1,7 @@ import { FeedCache } from "@snort/shared"; -import { db, EventInteraction } from "Db"; -import { LoginStore } from "Login"; -import { sha256 } from "SnortUtils"; +import { db, EventInteraction } from "@/Db"; +import { LoginStore } from "@/Login"; +import { sha256 } from "@/SnortUtils"; export class EventInteractionCache extends FeedCache { constructor() { diff --git a/packages/app/src/Cache/FollowListCache.ts b/packages/app/src/Cache/FollowListCache.ts index ca4cdbf6..2c24659d 100644 --- a/packages/app/src/Cache/FollowListCache.ts +++ b/packages/app/src/Cache/FollowListCache.ts @@ -1,8 +1,8 @@ -import { db } from "Db"; +import { db } from "@/Db"; import { unixNowMs } from "@snort/shared"; import { EventKind, RequestBuilder, socialGraphInstance, TaggedNostrEvent } from "@snort/system"; import { RefreshFeedCache } from "./RefreshFeedCache"; -import { LoginSession } from "Login"; +import { LoginSession } from "@/Login"; export class FollowListCache extends RefreshFeedCache { constructor() { diff --git a/packages/app/src/Cache/FollowsFeed.ts b/packages/app/src/Cache/FollowsFeed.ts index a4e58136..dcc0d979 100644 --- a/packages/app/src/Cache/FollowsFeed.ts +++ b/packages/app/src/Cache/FollowsFeed.ts @@ -2,10 +2,10 @@ import debug from "debug"; import { EventKind, RequestBuilder, SystemInterface, TaggedNostrEvent } from "@snort/system"; import { unixNow, unixNowMs } from "@snort/shared"; -import { db } from "Db"; +import { db } from "@/Db"; import { RefreshFeedCache, TWithCreated } from "./RefreshFeedCache"; -import { LoginSession } from "Login"; -import { Day, Hour } from "Const"; +import { LoginSession } from "@/Login"; +import { Day, Hour } from "@/Const"; const WindowSize = Hour * 6; const MaxCacheWindow = Day * 7; diff --git a/packages/app/src/Cache/GiftWrapCache.ts b/packages/app/src/Cache/GiftWrapCache.ts index 25a3ee9f..0505e992 100644 --- a/packages/app/src/Cache/GiftWrapCache.ts +++ b/packages/app/src/Cache/GiftWrapCache.ts @@ -1,8 +1,8 @@ import { EventKind, EventPublisher, RequestBuilder, TaggedNostrEvent } from "@snort/system"; -import { UnwrappedGift, db } from "Db"; -import { findTag, unwrap } from "SnortUtils"; +import { UnwrappedGift, db } from "@/Db"; +import { findTag, unwrap } from "@/SnortUtils"; import { RefreshFeedCache } from "./RefreshFeedCache"; -import { LoginSession, LoginSessionType } from "Login"; +import { LoginSession, LoginSessionType } from "@/Login"; export class GiftWrapCache extends RefreshFeedCache { constructor() { diff --git a/packages/app/src/Cache/Notifications.ts b/packages/app/src/Cache/Notifications.ts index 15ef558a..58177a06 100644 --- a/packages/app/src/Cache/Notifications.ts +++ b/packages/app/src/Cache/Notifications.ts @@ -1,8 +1,8 @@ import { EventKind, NostrEvent, RequestBuilder, TaggedNostrEvent } from "@snort/system"; import { RefreshFeedCache, TWithCreated } from "./RefreshFeedCache"; -import { LoginSession } from "Login"; -import { NostrEventForSession, db } from "Db"; -import { Day } from "Const"; +import { LoginSession } from "@/Login"; +import { NostrEventForSession, db } from "@/Db"; +import { Day } from "@/Const"; import { unixNow } from "@snort/shared"; export class NotificationsCache extends RefreshFeedCache { diff --git a/packages/app/src/Cache/PaymentsCache.ts b/packages/app/src/Cache/PaymentsCache.ts index d0f6804d..928530bd 100644 --- a/packages/app/src/Cache/PaymentsCache.ts +++ b/packages/app/src/Cache/PaymentsCache.ts @@ -1,4 +1,4 @@ -import { Payment, db } from "Db"; +import { Payment, db } from "@/Db"; import { FeedCache } from "@snort/shared"; export class Payments extends FeedCache { diff --git a/packages/app/src/Cache/RefreshFeedCache.ts b/packages/app/src/Cache/RefreshFeedCache.ts index f1eb75d5..96de9f64 100644 --- a/packages/app/src/Cache/RefreshFeedCache.ts +++ b/packages/app/src/Cache/RefreshFeedCache.ts @@ -1,6 +1,6 @@ import { FeedCache } from "@snort/shared"; import { EventPublisher, RequestBuilder, TaggedNostrEvent } from "@snort/system"; -import { LoginSession } from "Login"; +import { LoginSession } from "@/Login"; export type TWithCreated = (T | Readonly) & { created_at: number }; diff --git a/packages/app/src/Element/AsyncButton.tsx b/packages/app/src/Element/AsyncButton.tsx index 5f97ac5a..862ca45f 100644 --- a/packages/app/src/Element/AsyncButton.tsx +++ b/packages/app/src/Element/AsyncButton.tsx @@ -1,7 +1,7 @@ import "./AsyncButton.css"; import React, { ForwardedRef } from "react"; import Spinner from "../Icons/Spinner"; -import useLoading from "Hooks/useLoading"; +import useLoading from "@/Hooks/useLoading"; import classNames from "classnames"; export interface AsyncButtonProps extends React.ButtonHTMLAttributes { diff --git a/packages/app/src/Element/AsyncIcon.tsx b/packages/app/src/Element/AsyncIcon.tsx index 503e0ca2..e0820461 100644 --- a/packages/app/src/Element/AsyncIcon.tsx +++ b/packages/app/src/Element/AsyncIcon.tsx @@ -1,6 +1,6 @@ -import Icon from "Icons/Icon"; -import useLoading from "Hooks/useLoading"; -import Spinner from "Icons/Spinner"; +import Icon from "@/Icons/Icon"; +import useLoading from "@/Hooks/useLoading"; +import Spinner from "@/Icons/Spinner"; export type AsyncIconProps = React.HTMLProps & { iconName: string; diff --git a/packages/app/src/Element/BackButton.tsx b/packages/app/src/Element/BackButton.tsx index 05186c64..41d990d9 100644 --- a/packages/app/src/Element/BackButton.tsx +++ b/packages/app/src/Element/BackButton.tsx @@ -1,7 +1,7 @@ import "./BackButton.css"; import { useIntl } from "react-intl"; -import Icon from "Icons/Icon"; +import Icon from "@/Icons/Icon"; import messages from "./messages"; diff --git a/packages/app/src/Element/Chat/ChatParticipant.tsx b/packages/app/src/Element/Chat/ChatParticipant.tsx index 77b696b2..9cd8bc0c 100644 --- a/packages/app/src/Element/Chat/ChatParticipant.tsx +++ b/packages/app/src/Element/Chat/ChatParticipant.tsx @@ -1,9 +1,9 @@ import { MetadataCache } from "@snort/system"; -import { ChatParticipant } from "chat"; +import { ChatParticipant } from "@/chat"; import NoteToSelf from "../User/NoteToSelf"; import ProfileImage from "../User/ProfileImage"; -import useLogin from "Hooks/useLogin"; +import useLogin from "@/Hooks/useLogin"; export function ChatParticipantProfile({ participant }: { participant: ChatParticipant }) { const { publicKey } = useLogin(s => ({ publicKey: s.publicKey })); diff --git a/packages/app/src/Element/Chat/DM.tsx b/packages/app/src/Element/Chat/DM.tsx index 17c592bc..831d7a66 100644 --- a/packages/app/src/Element/Chat/DM.tsx +++ b/packages/app/src/Element/Chat/DM.tsx @@ -3,11 +3,11 @@ import { useEffect, useState } from "react"; import { FormattedMessage, useIntl } from "react-intl"; import { useInView } from "react-intersection-observer"; -import useEventPublisher from "Hooks/useEventPublisher"; -import NoteTime from "Element/Event/NoteTime"; -import Text from "Element/Text"; -import useLogin from "Hooks/useLogin"; -import { Chat, ChatMessage, ChatType, setLastReadIn } from "chat"; +import useEventPublisher from "@/Hooks/useEventPublisher"; +import NoteTime from "@/Element/Event/NoteTime"; +import Text from "@/Element/Text"; +import useLogin from "@/Hooks/useLogin"; +import { Chat, ChatMessage, ChatType, setLastReadIn } from "@/chat"; import ProfileImage from "../User/ProfileImage"; import messages from "../messages"; @@ -61,7 +61,7 @@ export default function DM(props: DMProps) { {content ? ( ) : ( - + )}
diff --git a/packages/app/src/Element/Chat/DmWindow.tsx b/packages/app/src/Element/Chat/DmWindow.tsx index 5a46c1ae..c7c07062 100644 --- a/packages/app/src/Element/Chat/DmWindow.tsx +++ b/packages/app/src/Element/Chat/DmWindow.tsx @@ -1,11 +1,11 @@ import "./DmWindow.css"; import { useMemo } from "react"; -import ProfileImage from "Element/User/ProfileImage"; -import DM from "Element/Chat/DM"; -import useLogin from "Hooks/useLogin"; -import WriteMessage from "Element/Chat/WriteMessage"; -import { Chat, createEmptyChatObject, useChatSystem } from "chat"; +import ProfileImage from "@/Element/User/ProfileImage"; +import DM from "@/Element/Chat/DM"; +import useLogin from "@/Hooks/useLogin"; +import WriteMessage from "@/Element/Chat/WriteMessage"; +import { Chat, createEmptyChatObject, useChatSystem } from "@/chat"; import { FormattedMessage } from "react-intl"; import { ChatParticipantProfile } from "./ChatParticipant"; @@ -22,7 +22,7 @@ export default function DmWindow({ id }: { id: string }) { {chat.participants.map(v => ( ))} - {chat.title ?? } + {chat.title ?? }
); } diff --git a/packages/app/src/Element/Chat/WriteMessage.tsx b/packages/app/src/Element/Chat/WriteMessage.tsx index 0d6a34aa..b7d51189 100644 --- a/packages/app/src/Element/Chat/WriteMessage.tsx +++ b/packages/app/src/Element/Chat/WriteMessage.tsx @@ -1,11 +1,11 @@ import { useState } from "react"; import { NostrEvent, NostrLink, NostrPrefix } from "@snort/system"; -import useEventPublisher from "Hooks/useEventPublisher"; -import useFileUpload from "Upload"; -import { openFile } from "SnortUtils"; +import useEventPublisher from "@/Hooks/useEventPublisher"; +import useFileUpload from "@/Upload"; +import { openFile } from "@/SnortUtils"; import Textarea from "../Textarea"; -import { Chat } from "chat"; -import { AsyncIcon } from "Element/AsyncIcon"; +import { Chat } from "@/chat"; +import { AsyncIcon } from "@/Element/AsyncIcon"; export default function WriteMessage({ chat }: { chat: Chat }) { const [msg, setMsg] = useState(""); diff --git a/packages/app/src/Element/Collapsed.tsx b/packages/app/src/Element/Collapsed.tsx index fab534cb..a1d9aa15 100644 --- a/packages/app/src/Element/Collapsed.tsx +++ b/packages/app/src/Element/Collapsed.tsx @@ -1,8 +1,8 @@ import { useState, ReactNode } from "react"; import classNames from "classnames"; -import Icon from "Icons/Icon"; -import ShowMore from "Element/Event/ShowMore"; +import Icon from "@/Icons/Icon"; +import ShowMore from "@/Element/Event/ShowMore"; interface CollapsedProps { text?: string; diff --git a/packages/app/src/Element/Copy.tsx b/packages/app/src/Element/Copy.tsx index 897a815c..73a6ce93 100644 --- a/packages/app/src/Element/Copy.tsx +++ b/packages/app/src/Element/Copy.tsx @@ -1,7 +1,7 @@ import "./Copy.css"; import classNames from "classnames"; -import Icon from "Icons/Icon"; -import { useCopy } from "useCopy"; +import Icon from "@/Icons/Icon"; +import { useCopy } from "@/useCopy"; export interface CopyProps { text: string; diff --git a/packages/app/src/Element/Deck/Articles.tsx b/packages/app/src/Element/Deck/Articles.tsx index 7ada5d01..4cd8d6ca 100644 --- a/packages/app/src/Element/Deck/Articles.tsx +++ b/packages/app/src/Element/Deck/Articles.tsx @@ -1,11 +1,11 @@ import { NostrLink } from "@snort/system"; import { useReactions } from "@snort/system-react"; -import { useArticles } from "Feed/ArticlesFeed"; -import { orderDescending } from "SnortUtils"; +import { useArticles } from "@/Feed/ArticlesFeed"; +import { orderDescending } from "@/SnortUtils"; import Note from "../Event/Note"; import { useContext } from "react"; -import { DeckContext } from "Pages/DeckLayout"; +import { DeckContext } from "@/Pages/DeckLayout"; export default function Articles() { const data = useArticles(); diff --git a/packages/app/src/Element/Deck/Nav.tsx b/packages/app/src/Element/Deck/Nav.tsx index 0e0ba4fd..784caf2f 100644 --- a/packages/app/src/Element/Deck/Nav.tsx +++ b/packages/app/src/Element/Deck/Nav.tsx @@ -1,11 +1,11 @@ import { useUserProfile } from "@snort/system-react"; -import Avatar from "Element/User/Avatar"; -import useLogin from "Hooks/useLogin"; +import Avatar from "@/Element/User/Avatar"; +import useLogin from "@/Hooks/useLogin"; import "./Nav.css"; -import Icon from "Icons/Icon"; +import Icon from "@/Icons/Icon"; import { Link } from "react-router-dom"; -import { NoteCreatorButton } from "Element/Event/NoteCreatorButton"; -import { ProfileLink } from "Element/User/ProfileLink"; +import { NoteCreatorButton } from "@/Element/Event/NoteCreatorButton"; +import { ProfileLink } from "@/Element/User/ProfileLink"; export function DeckNav() { const { publicKey } = useLogin(); diff --git a/packages/app/src/Element/Embed/CashuNuts.tsx b/packages/app/src/Element/Embed/CashuNuts.tsx index 395fc941..597aa202 100644 --- a/packages/app/src/Element/Embed/CashuNuts.tsx +++ b/packages/app/src/Element/Embed/CashuNuts.tsx @@ -3,8 +3,8 @@ import { useEffect, useState } from "react"; import { FormattedMessage, FormattedNumber } from "react-intl"; import { useUserProfile } from "@snort/system-react"; -import useLogin from "Hooks/useLogin"; -import Icon from "Icons/Icon"; +import useLogin from "@/Hooks/useLogin"; +import Icon from "@/Icons/Icon"; interface Token { token: Array<{ @@ -107,7 +107,7 @@ export default function CashuNuts({ token }: { token: string }) {

{c}

, n: , @@ -116,7 +116,7 @@ export default function CashuNuts({ token }: { token: string }) { {c}, url: new URL(cashu.token[0].mint).hostname, @@ -129,7 +129,7 @@ export default function CashuNuts({ token }: { token: string }) { diff --git a/packages/app/src/Element/Embed/Invoice.tsx b/packages/app/src/Element/Embed/Invoice.tsx index fd1ddf06..14d69abc 100644 --- a/packages/app/src/Element/Embed/Invoice.tsx +++ b/packages/app/src/Element/Embed/Invoice.tsx @@ -5,9 +5,9 @@ import { useMemo } from "react"; import { decodeInvoice } from "@snort/shared"; import classNames from "classnames"; -import SendSats from "Element/SendSats"; -import Icon from "Icons/Icon"; -import { useWallet } from "Wallet"; +import SendSats from "@/Element/SendSats"; +import Icon from "@/Icons/Icon"; +import { useWallet } from "@/Wallet"; import messages from "../messages"; @@ -76,7 +76,7 @@ export default function Invoice(props: InvoiceProps) { {description &&

{description}

} {isPaid ? (
- +
) : ( diff --git a/packages/app/src/Element/Event/FileUpload.tsx b/packages/app/src/Element/Event/FileUpload.tsx index 0bfe283e..0fb7c4c1 100644 --- a/packages/app/src/Element/Event/FileUpload.tsx +++ b/packages/app/src/Element/Event/FileUpload.tsx @@ -1,5 +1,5 @@ -import Progress from "Element/Progress"; -import { UploadProgress } from "Upload"; +import Progress from "@/Element/Progress"; +import { UploadProgress } from "@/Upload"; export default function FileUploadProgress({ progress }: { progress: Array }) { return ( diff --git a/packages/app/src/Element/Event/HiddenNote.tsx b/packages/app/src/Element/Event/HiddenNote.tsx index f55f885c..50b380f4 100644 --- a/packages/app/src/Element/Event/HiddenNote.tsx +++ b/packages/app/src/Element/Event/HiddenNote.tsx @@ -10,7 +10,7 @@ const HiddenNote = ({ children }: { children: React.ReactNode }) => {

- +

diff --git a/packages/app/src/Element/Event/NoteContextMenu.tsx b/packages/app/src/Element/Event/NoteContextMenu.tsx index aebd54bc..61c18a38 100644 --- a/packages/app/src/Element/Event/NoteContextMenu.tsx +++ b/packages/app/src/Element/Event/NoteContextMenu.tsx @@ -3,15 +3,15 @@ import { FormattedMessage, useIntl } from "react-intl"; import { HexKey, NostrLink, NostrPrefix, TaggedNostrEvent } from "@snort/system"; import { Menu, MenuItem } from "@szhsin/react-menu"; -import Icon from "Icons/Icon"; -import { setPinned, setBookmarked } from "Login"; -import messages from "Element/messages"; -import useLogin from "Hooks/useLogin"; -import useModeration from "Hooks/useModeration"; -import useEventPublisher from "Hooks/useEventPublisher"; +import Icon from "@/Icons/Icon"; +import { setPinned, setBookmarked } from "@/Login"; +import messages from "@/Element/messages"; +import useLogin from "@/Hooks/useLogin"; +import useModeration from "@/Hooks/useModeration"; +import useEventPublisher from "@/Hooks/useEventPublisher"; import { ReBroadcaster } from "../ReBroadcaster"; -import SnortApi from "External/SnortApi"; -import { SubscriptionType, getCurrentSubscription } from "Subscription"; +import SnortApi from "@/External/SnortApi"; +import { SubscriptionType, getCurrentSubscription } from "@/Subscription"; export interface NoteTranslation { text: string; @@ -170,7 +170,7 @@ export function NoteContextMenu({ ev, ...props }: NosteContextMenuProps) { )} - + {ev.pubkey !== login.publicKey && !login.readonly && ( block(ev.pubkey)}> diff --git a/packages/app/src/Element/Event/NoteCreator.tsx b/packages/app/src/Element/Event/NoteCreator.tsx index 9a8bfa7d..f91623cd 100644 --- a/packages/app/src/Element/Event/NoteCreator.tsx +++ b/packages/app/src/Element/Event/NoteCreator.tsx @@ -4,28 +4,28 @@ import { EventKind, NostrPrefix, TaggedNostrEvent, EventBuilder, tryParseNostrLi import classNames from "classnames"; import { TagsInput } from "react-tag-input-component"; -import Icon from "Icons/Icon"; -import useEventPublisher from "Hooks/useEventPublisher"; -import { appendDedupe, openFile } from "SnortUtils"; -import Textarea from "Element/Textarea"; -import Modal from "Element/Modal"; -import ProfileImage from "Element/User/ProfileImage"; -import useFileUpload from "Upload"; -import Note from "Element/Event/Note"; +import Icon from "@/Icons/Icon"; +import useEventPublisher from "@/Hooks/useEventPublisher"; +import { appendDedupe, openFile } from "@/SnortUtils"; +import Textarea from "@/Element/Textarea"; +import Modal from "@/Element/Modal"; +import ProfileImage from "@/Element/User/ProfileImage"; +import useFileUpload from "@/Upload"; +import Note from "@/Element/Event/Note"; import { ClipboardEventHandler, DragEvent, useEffect, useState } from "react"; -import useLogin from "Hooks/useLogin"; -import { GetPowWorker } from "index"; -import AsyncButton from "Element/AsyncButton"; -import { AsyncIcon } from "Element/AsyncIcon"; +import useLogin from "@/Hooks/useLogin"; +import { GetPowWorker } from "@/index"; +import AsyncButton from "@/Element/AsyncButton"; +import { AsyncIcon } from "@/Element/AsyncIcon"; import { fetchNip05Pubkey } from "@snort/shared"; -import { ZapTarget } from "Zapper"; -import { useNoteCreator } from "State/NoteCreator"; +import { ZapTarget } from "@/Zapper"; +import { useNoteCreator } from "@/State/NoteCreator"; import { NoteBroadcaster } from "./NoteBroadcaster"; import FileUploadProgress from "./FileUpload"; -import { ToggleSwitch } from "Icons/Toggle"; -import NostrBandApi from "External/NostrBand"; -import { useLocale } from "IntlProvider"; +import { ToggleSwitch } from "@/Icons/Toggle"; +import NostrBandApi from "@/External/NostrBand"; +import { useLocale } from "@/IntlProvider"; export function NoteCreator() { const { formatMessage } = useIntl(); @@ -52,7 +52,7 @@ export function NoteCreator() { throw new Error( formatMessage( { - defaultMessage: "Failed to parse zap split: {input}", + defaultMessage: "Failed to parse zap split: {input}", id: 'sZQzjQ', }, { input: s.value, @@ -69,7 +69,7 @@ export function NoteCreator() { throw new Error( formatMessage( { - defaultMessage: "Failed to parse zap split: {input}", + defaultMessage: "Failed to parse zap split: {input}", id: 'sZQzjQ', }, { input: s.value, @@ -81,7 +81,7 @@ export function NoteCreator() { throw new Error( formatMessage( { - defaultMessage: "Invalid zap split: {input}", + defaultMessage: "Invalid zap split: {input}", id: '8Y6bZQ', }, { input: s.value, @@ -258,12 +258,12 @@ export function NoteCreator() { return ( <>

- +

{note.pollOptions?.map((a, i) => (
- +
changePollOption(i, e.target.value)} /> @@ -353,24 +353,24 @@ export function NoteCreator() { <>

- +

- +

{renderRelayCustomisation()}

- +

- +
{[...(note.zapSplits ?? [])].map((v, i, arr) => (

- +

(v.zapSplits = arr.map((vv, ii) => (ii === i ? { ...vv, value: e.target.value } : vv))), ) } - placeholder={formatMessage({ defaultMessage: "npub / nprofile / nostr address" })} + placeholder={formatMessage({ defaultMessage: "npub / nprofile / nostr address", id: 'WvGmZT' })} />

- +

note.update(v => (v.zapSplits = [...(v.zapSplits ?? []), { type: "pubkey", value: "", weight: 1 }])) }> - +
- +

- +

- + - +
@@ -473,7 +473,7 @@ export function NoteCreator() { className={classNames("note-creator-icon", { active: note.advanced })} /> - + loadPreview()} @@ -483,10 +483,10 @@ export function NoteCreator() {
- {note.replyTo ? : } + {note.replyTo ? : }
@@ -536,7 +536,7 @@ export function NoteCreator() { {note.replyTo && ( <>

- +

- +

note.update(s => (s.hashTags = e))} placeHolder={formatMessage({ - defaultMessage: "Add up to 4 hashtags", + defaultMessage: "Add up to 4 hashtags", id: 'AIgmDy', })} separators={["Enter", ","]} /> {note.hashTags.length > 4 && ( - + )} note.update(s => (s.hashTags = appendDedupe(s.hashTags, [t])))} /> @@ -652,7 +652,7 @@ function TrendingHashTagsLine(props: { onClick: (tag: string) => void }) { return (
- +
{hashtags.slice(0, 5).map(a => ( diff --git a/packages/app/src/Element/Event/NoteCreatorButton.tsx b/packages/app/src/Element/Event/NoteCreatorButton.tsx index 015e8520..cd16d59e 100644 --- a/packages/app/src/Element/Event/NoteCreatorButton.tsx +++ b/packages/app/src/Element/Event/NoteCreatorButton.tsx @@ -3,11 +3,11 @@ import { useRef, useMemo } from "react"; import { useLocation } from "react-router-dom"; import classNames from "classnames"; -import { isFormElement } from "SnortUtils"; -import useKeyboardShortcut from "Hooks/useKeyboardShortcut"; -import useLogin from "Hooks/useLogin"; -import Icon from "Icons/Icon"; -import { useNoteCreator } from "State/NoteCreator"; +import { isFormElement } from "@/SnortUtils"; +import useKeyboardShortcut from "@/Hooks/useKeyboardShortcut"; +import useLogin from "@/Hooks/useLogin"; +import Icon from "@/Icons/Icon"; +import { useNoteCreator } from "@/State/NoteCreator"; import { NoteCreator } from "./NoteCreator"; export const NoteCreatorButton = ({ className }: { className?: string }) => { diff --git a/packages/app/src/Element/Event/NoteFooter.tsx b/packages/app/src/Element/Event/NoteFooter.tsx index 4e6ff443..4e22bbbb 100644 --- a/packages/app/src/Element/Event/NoteFooter.tsx +++ b/packages/app/src/Element/Event/NoteFooter.tsx @@ -7,20 +7,20 @@ import { useUserProfile } from "@snort/system-react"; import { Menu, MenuItem } from "@szhsin/react-menu"; import classNames from "classnames"; -import { formatShort } from "Number"; -import useEventPublisher from "Hooks/useEventPublisher"; -import { delay, findTag, getDisplayName } from "SnortUtils"; -import SendSats from "Element/SendSats"; -import { ZapsSummary } from "Element/Event/Zap"; -import { AsyncIcon, AsyncIconProps } from "Element/AsyncIcon"; +import { formatShort } from "@/Number"; +import useEventPublisher from "@/Hooks/useEventPublisher"; +import { delay, findTag, getDisplayName } from "@/SnortUtils"; +import SendSats from "@/Element/SendSats"; +import { ZapsSummary } from "@/Element/Event/Zap"; +import { AsyncIcon, AsyncIconProps } from "@/Element/AsyncIcon"; -import { useWallet } from "Wallet"; -import useLogin from "Hooks/useLogin"; -import { useInteractionCache } from "Hooks/useInteractionCache"; -import { ZapPoolController } from "ZapPoolController"; -import { Zapper, ZapTarget } from "Zapper"; -import { useNoteCreator } from "State/NoteCreator"; -import Icon from "Icons/Icon"; +import { useWallet } from "@/Wallet"; +import useLogin from "@/Hooks/useLogin"; +import { useInteractionCache } from "@/Hooks/useInteractionCache"; +import { ZapPoolController } from "@/ZapPoolController"; +import { Zapper, ZapTarget } from "@/Zapper"; +import { useNoteCreator } from "@/State/NoteCreator"; +import Icon from "@/Icons/Icon"; import messages from "../messages"; @@ -187,7 +187,7 @@ export default function NoteFooter(props: NoteFooterProps) { const pow = findTag(ev, "nonce") ? countLeadingZeros(ev.id) : undefined; if (pow) { return ( - + ); } } @@ -199,7 +199,7 @@ export default function NoteFooter(props: NoteFooterProps) { fastZap(e)} @@ -217,7 +217,7 @@ export default function NoteFooter(props: NoteFooterProps) { } @@ -232,7 +232,7 @@ export default function NoteFooter(props: NoteFooterProps) {
repost()} disabled={hasReposted()}> - + @@ -243,7 +243,7 @@ export default function NoteFooter(props: NoteFooterProps) { }) }> - + ); @@ -258,7 +258,7 @@ export default function NoteFooter(props: NoteFooterProps) { { if (readonly) return; @@ -274,7 +274,7 @@ export default function NoteFooter(props: NoteFooterProps) { handleReplyButtonClick()} /> @@ -308,14 +308,15 @@ export default function NoteFooter(props: NoteFooterProps) { ); } -const AsyncFooterIcon = forwardRef((props: AsyncIconProps & { value: number }) => { +const AsyncFooterIcon = forwardRef((props: AsyncIconProps & { value: number }, ref) => { const mergedProps = { ...props, iconSize: 18, className: classNames("transition duration-200 ease-in-out reaction-pill", props.className), }; + return ( - + {props.value > 0 &&
{formatShort(props.value)}
}
); diff --git a/packages/app/src/Element/Event/NoteGhost.tsx b/packages/app/src/Element/Event/NoteGhost.tsx index fcdfac73..c5c5b81d 100644 --- a/packages/app/src/Element/Event/NoteGhost.tsx +++ b/packages/app/src/Element/Event/NoteGhost.tsx @@ -1,5 +1,5 @@ import "./Note.css"; -import ProfileImage from "Element/User/ProfileImage"; +import ProfileImage from "@/Element/User/ProfileImage"; interface NoteGhostProps { className?: string; diff --git a/packages/app/src/Element/Event/NoteInner.tsx b/packages/app/src/Element/Event/NoteInner.tsx index 36251127..ab00dcaa 100644 --- a/packages/app/src/Element/Event/NoteInner.tsx +++ b/packages/app/src/Element/Event/NoteInner.tsx @@ -6,26 +6,26 @@ import classNames from "classnames"; import { EventExt, EventKind, HexKey, NostrLink, NostrPrefix, TaggedNostrEvent } from "@snort/system"; import { useEventReactions } from "@snort/system-react"; -import { findTag, hexToBech32 } from "SnortUtils"; -import useModeration from "Hooks/useModeration"; -import useLogin from "Hooks/useLogin"; -import useEventPublisher from "Hooks/useEventPublisher"; +import { findTag, hexToBech32 } from "@/SnortUtils"; +import useModeration from "@/Hooks/useModeration"; +import useLogin from "@/Hooks/useLogin"; +import useEventPublisher from "@/Hooks/useEventPublisher"; import { NoteContextMenu, NoteTranslation } from "./NoteContextMenu"; -import { UserCache } from "Cache"; +import { UserCache } from "@/Cache"; import messages from "../messages"; -import { setBookmarked, setPinned } from "Login"; +import { setBookmarked, setPinned } from "@/Login"; import Text from "../Text"; import Reveal from "./Reveal"; import Poll from "./Poll"; import ProfileImage from "../User/ProfileImage"; -import Icon from "Icons/Icon"; +import Icon from "@/Icons/Icon"; import NoteTime from "./NoteTime"; import NoteFooter from "./NoteFooter"; import Reactions from "./Reactions"; import HiddenNote from "./HiddenNote"; import { NoteProps } from "./Note"; -import { chainKey } from "Hooks/useThreadContext"; -import { ProfileLink } from "Element/User/ProfileLink"; +import { chainKey } from "@/Hooks/useThreadContext"; +import { ProfileLink } from "@/Element/User/ProfileLink"; export function NoteInner(props: NoteProps) { const { data: ev, related, highlight, options: opt, ignoreModeration = false, className } = props; @@ -118,7 +118,7 @@ export function NoteInner(props: NoteProps) { message={ <> {c}, }} @@ -127,7 +127,7 @@ export function NoteInner(props: NoteProps) { <>   {c}, reason: contentWarning[1], @@ -136,7 +136,7 @@ export function NoteInner(props: NoteProps) { )}   - + }> {innerContent} diff --git a/packages/app/src/Element/Event/NoteQuote.tsx b/packages/app/src/Element/Event/NoteQuote.tsx index e2d7c418..4dd2b399 100644 --- a/packages/app/src/Element/Event/NoteQuote.tsx +++ b/packages/app/src/Element/Event/NoteQuote.tsx @@ -1,8 +1,8 @@ import { NostrLink } from "@snort/system"; import { useEventFeed } from "@snort/system-react"; -import Note from "Element/Event/Note"; -import PageSpinner from "Element/PageSpinner"; +import Note from "@/Element/Event/Note"; +import PageSpinner from "@/Element/PageSpinner"; export default function NoteQuote({ link, depth }: { link: NostrLink; depth?: number }) { const ev = useEventFeed(link); diff --git a/packages/app/src/Element/Event/NoteReaction.tsx b/packages/app/src/Element/Event/NoteReaction.tsx index e39194ef..f2738a06 100644 --- a/packages/app/src/Element/Event/NoteReaction.tsx +++ b/packages/app/src/Element/Event/NoteReaction.tsx @@ -3,11 +3,11 @@ import { Link } from "react-router-dom"; import { useMemo } from "react"; import { EventKind, NostrEvent, TaggedNostrEvent, NostrPrefix, EventExt } from "@snort/system"; -import Note from "Element/Event/Note"; -import { eventLink, hexToBech32, getDisplayName } from "SnortUtils"; -import useModeration from "Hooks/useModeration"; +import Note from "@/Element/Event/Note"; +import { eventLink, hexToBech32, getDisplayName } from "@/SnortUtils"; +import useModeration from "@/Hooks/useModeration"; import { FormattedMessage } from "react-intl"; -import Icon from "Icons/Icon"; +import Icon from "@/Icons/Icon"; import { useUserProfile } from "@snort/system-react"; import { useInView } from "react-intersection-observer"; @@ -79,7 +79,7 @@ export default function NoteReaction(props: NoteReactionProps) {
) diff --git a/packages/app/src/Element/Event/Reveal.tsx b/packages/app/src/Element/Event/Reveal.tsx index 62a38131..009ec9ac 100644 --- a/packages/app/src/Element/Event/Reveal.tsx +++ b/packages/app/src/Element/Event/Reveal.tsx @@ -1,4 +1,4 @@ -import { WarningNotice } from "Element/WarningNotice"; +import { WarningNotice } from "@/Element/WarningNotice"; import { useState } from "react"; interface RevealProps { diff --git a/packages/app/src/Element/Event/RevealMedia.tsx b/packages/app/src/Element/Event/RevealMedia.tsx index 3e2b85c2..15706b98 100644 --- a/packages/app/src/Element/Event/RevealMedia.tsx +++ b/packages/app/src/Element/Event/RevealMedia.tsx @@ -1,9 +1,9 @@ import { FormattedMessage } from "react-intl"; -import { FileExtensionRegex } from "Const"; -import Reveal from "Element/Event/Reveal"; -import useLogin from "Hooks/useLogin"; -import { MediaElement } from "Element/Embed/MediaElement"; +import { FileExtensionRegex } from "@/Const"; +import Reveal from "@/Element/Event/Reveal"; +import useLogin from "@/Hooks/useLogin"; +import { MediaElement } from "@/Element/Embed/MediaElement"; import { Link } from "react-router-dom"; interface RevealMediaProps { @@ -57,7 +57,7 @@ export default function RevealMedia(props: RevealMediaProps) { {i}, a: a => {a}, diff --git a/packages/app/src/Element/Event/ShowMore.tsx b/packages/app/src/Element/Event/ShowMore.tsx index 71fb1d5c..fc3369c0 100644 --- a/packages/app/src/Element/Event/ShowMore.tsx +++ b/packages/app/src/Element/Event/ShowMore.tsx @@ -14,7 +14,7 @@ const ShowMore = ({ text, onClick, className = "" }: ShowMoreProps) => { return (
); diff --git a/packages/app/src/Element/Event/Thread.tsx b/packages/app/src/Element/Event/Thread.tsx index 96392ec6..169b4ef6 100644 --- a/packages/app/src/Element/Event/Thread.tsx +++ b/packages/app/src/Element/Event/Thread.tsx @@ -5,12 +5,12 @@ import { useNavigate, useParams } from "react-router-dom"; import { TaggedNostrEvent, u256, NostrPrefix, EventExt, parseNostrLink, NostrLink } from "@snort/system"; import classNames from "classnames"; -import { getAllLinkReactions, getLinkReactions } from "SnortUtils"; -import BackButton from "Element/BackButton"; -import Note from "Element/Event/Note"; -import NoteGhost from "Element/Event/NoteGhost"; -import Collapsed from "Element/Collapsed"; -import { ThreadContext, ThreadContextWrapper, chainKey } from "Hooks/useThreadContext"; +import { getAllLinkReactions, getLinkReactions } from "@/SnortUtils"; +import BackButton from "@/Element/BackButton"; +import Note from "@/Element/Event/Note"; +import NoteGhost from "@/Element/Event/NoteGhost"; +import Collapsed from "@/Element/Collapsed"; +import { ThreadContext, ThreadContextWrapper, chainKey } from "@/Hooks/useThreadContext"; import messages from "../messages"; @@ -303,11 +303,11 @@ export function Thread(props: { onBack?: () => void; disableSpotlight?: boolean } const parentText = formatMessage({ - defaultMessage: "Parent", + defaultMessage: "Parent", id: 'ADmfQT', description: "Link to parent note in thread", }); const backText = formatMessage({ - defaultMessage: "Back", + defaultMessage: "Back", id: 'jfV8Wr', description: "Navigate back button on threads view", }); diff --git a/packages/app/src/Element/Event/Zap.tsx b/packages/app/src/Element/Event/Zap.tsx index d3e3d46c..56ac9b58 100644 --- a/packages/app/src/Element/Event/Zap.tsx +++ b/packages/app/src/Element/Event/Zap.tsx @@ -3,11 +3,11 @@ import { useMemo } from "react"; import { ParsedZap } from "@snort/system"; import { FormattedMessage, useIntl } from "react-intl"; -import { unwrap } from "SnortUtils"; -import { formatShort } from "Number"; -import Text from "Element/Text"; -import ProfileImage from "Element/User/ProfileImage"; -import useLogin from "Hooks/useLogin"; +import { unwrap } from "@/SnortUtils"; +import { formatShort } from "@/Number"; +import Text from "@/Element/Text"; +import ProfileImage from "@/Element/User/ProfileImage"; +import useLogin from "@/Hooks/useLogin"; import messages from "../messages"; @@ -60,7 +60,7 @@ export const ZapsSummary = ({ zaps }: ZapsSummaryProps) => { )} {restZaps.length > 0 ? ( diff --git a/packages/app/src/Element/Event/ZapButton.tsx b/packages/app/src/Element/Event/ZapButton.tsx index 873a72f8..c14dc88e 100644 --- a/packages/app/src/Element/Event/ZapButton.tsx +++ b/packages/app/src/Element/Event/ZapButton.tsx @@ -3,9 +3,9 @@ import { useState } from "react"; import { HexKey } from "@snort/system"; import { useUserProfile } from "@snort/system-react"; -import SendSats from "Element/SendSats"; -import Icon from "Icons/Icon"; -import { ZapTarget } from "Zapper"; +import SendSats from "@/Element/SendSats"; +import Icon from "@/Icons/Icon"; +import { ZapTarget } from "@/Zapper"; const ZapButton = ({ pubkey, diff --git a/packages/app/src/Element/Event/ZapGoal.tsx b/packages/app/src/Element/Event/ZapGoal.tsx index 108ef7eb..a6c54aca 100644 --- a/packages/app/src/Element/Event/ZapGoal.tsx +++ b/packages/app/src/Element/Event/ZapGoal.tsx @@ -1,13 +1,13 @@ import "./ZapGoal.css"; import { useState } from "react"; import { NostrEvent, NostrLink } from "@snort/system"; -import useZapsFeed from "Feed/ZapsFeed"; -import { formatShort } from "Number"; -import { findTag } from "SnortUtils"; -import Icon from "Icons/Icon"; +import useZapsFeed from "@/Feed/ZapsFeed"; +import { formatShort } from "@/Number"; +import { findTag } from "@/SnortUtils"; +import Icon from "@/Icons/Icon"; import SendSats from "../SendSats"; -import { Zapper } from "Zapper"; -import Progress from "Element/Progress"; +import { Zapper } from "@/Zapper"; +import Progress from "@/Element/Progress"; import { FormattedNumber } from "react-intl"; export function ZapGoal({ ev }: { ev: NostrEvent }) { diff --git a/packages/app/src/Element/Feed/Timeline.tsx b/packages/app/src/Element/Feed/Timeline.tsx index 5cd110fd..bdb20f17 100644 --- a/packages/app/src/Element/Feed/Timeline.tsx +++ b/packages/app/src/Element/Feed/Timeline.tsx @@ -3,10 +3,10 @@ import { FormattedMessage } from "react-intl"; import { useCallback, useMemo } from "react"; import { TaggedNostrEvent, EventKind } from "@snort/system"; -import { dedupeByPubkey, findTag } from "SnortUtils"; -import useTimelineFeed, { TimelineFeed, TimelineSubject } from "Feed/TimelineFeed"; -import useModeration from "Hooks/useModeration"; -import { LiveStreams } from "Element/LiveStreams"; +import { dedupeByPubkey, findTag } from "@/SnortUtils"; +import useTimelineFeed, { TimelineFeed, TimelineSubject } from "@/Feed/TimelineFeed"; +import useModeration from "@/Hooks/useModeration"; +import { LiveStreams } from "@/Element/LiveStreams"; import { TimelineRenderer } from "./TimelineFragment"; import { unixNow } from "@snort/shared"; @@ -84,7 +84,7 @@ const Timeline = (props: TimelineProps) => { {(props.loadMore === undefined || props.loadMore === true) && (
)} diff --git a/packages/app/src/Element/Feed/TimelineFollows.tsx b/packages/app/src/Element/Feed/TimelineFollows.tsx index 119bf4f4..bfd2c143 100644 --- a/packages/app/src/Element/Feed/TimelineFollows.tsx +++ b/packages/app/src/Element/Feed/TimelineFollows.tsx @@ -5,14 +5,14 @@ import { EventKind, NostrEvent, NostrLink, TaggedNostrEvent } from "@snort/syste import { unixNow } from "@snort/shared"; import { SnortContext, useReactions } from "@snort/system-react"; -import { dedupeByPubkey, findTag, orderDescending } from "SnortUtils"; -import useModeration from "Hooks/useModeration"; -import { FollowsFeed } from "Cache"; -import { LiveStreams } from "Element/LiveStreams"; -import useLogin from "Hooks/useLogin"; +import { dedupeByPubkey, findTag, orderDescending } from "@/SnortUtils"; +import useModeration from "@/Hooks/useModeration"; +import { FollowsFeed } from "@/Cache"; +import { LiveStreams } from "@/Element/LiveStreams"; +import useLogin from "@/Hooks/useLogin"; import { TimelineRenderer } from "./TimelineFragment"; -import useHashtagsFeed from "Feed/HashtagsFeed"; -import { ShowMoreInView } from "Element/Event/ShowMore"; +import useHashtagsFeed from "@/Feed/HashtagsFeed"; +import { ShowMoreInView } from "@/Element/Event/ShowMore"; export interface TimelineFollowsProps { postsOnly: boolean; diff --git a/packages/app/src/Element/Feed/TimelineFragment.tsx b/packages/app/src/Element/Feed/TimelineFragment.tsx index c98dbd0f..eed30e7f 100644 --- a/packages/app/src/Element/Feed/TimelineFragment.tsx +++ b/packages/app/src/Element/Feed/TimelineFragment.tsx @@ -3,10 +3,10 @@ import { FormattedMessage } from "react-intl"; import { useInView } from "react-intersection-observer"; import { TaggedNostrEvent } from "@snort/system"; -import Note from "Element/Event/Note"; -import ProfileImage from "Element/User/ProfileImage"; -import Icon from "Icons/Icon"; -import { findTag } from "SnortUtils"; +import Note from "@/Element/Event/Note"; +import ProfileImage from "@/Element/User/ProfileImage"; +import Icon from "@/Icons/Icon"; +import { findTag } from "@/SnortUtils"; export interface TimelineFragment { events: Array; @@ -39,7 +39,7 @@ export function TimelineRenderer(props: TimelineRendererProps) { return ; })} @@ -52,7 +52,7 @@ export function TimelineRenderer(props: TimelineRendererProps) { return ; })} diff --git a/packages/app/src/Element/HyperText.tsx b/packages/app/src/Element/HyperText.tsx index a0967536..61e12b52 100644 --- a/packages/app/src/Element/HyperText.tsx +++ b/packages/app/src/Element/HyperText.tsx @@ -11,18 +11,18 @@ import { AppleMusicRegex, NostrNestsRegex, WavlakeRegex, -} from "Const"; -import { magnetURIDecode } from "SnortUtils"; -import SoundCloudEmbed from "Element/Embed/SoundCloudEmded"; -import MixCloudEmbed from "Element/Embed/MixCloudEmbed"; -import SpotifyEmbed from "Element/Embed/SpotifyEmbed"; -import TidalEmbed from "Element/Embed/TidalEmbed"; -import TwitchEmbed from "Element/Embed/TwitchEmbed"; -import AppleMusicEmbed from "Element/Embed/AppleMusicEmbed"; -import WavlakeEmbed from "Element/Embed/WavlakeEmbed"; -import LinkPreview from "Element/Embed/LinkPreview"; -import NostrLink from "Element/Embed/NostrLink"; -import MagnetLink from "Element/Embed/MagnetLink"; +} from "@/Const"; +import { magnetURIDecode } from "@/SnortUtils"; +import SoundCloudEmbed from "@/Element/Embed/SoundCloudEmded"; +import MixCloudEmbed from "@/Element/Embed/MixCloudEmbed"; +import SpotifyEmbed from "@/Element/Embed/SpotifyEmbed"; +import TidalEmbed from "@/Element/Embed/TidalEmbed"; +import TwitchEmbed from "@/Element/Embed/TwitchEmbed"; +import AppleMusicEmbed from "@/Element/Embed/AppleMusicEmbed"; +import WavlakeEmbed from "@/Element/Embed/WavlakeEmbed"; +import LinkPreview from "@/Element/Embed/LinkPreview"; +import NostrLink from "@/Element/Embed/NostrLink"; +import MagnetLink from "@/Element/Embed/MagnetLink"; import { ReactNode } from "react"; interface HypeTextProps { diff --git a/packages/app/src/Element/IconButton.tsx b/packages/app/src/Element/IconButton.tsx index 95ed3027..d2373b0b 100644 --- a/packages/app/src/Element/IconButton.tsx +++ b/packages/app/src/Element/IconButton.tsx @@ -1,5 +1,5 @@ import classNames from "classnames"; -import Icon, { IconProps } from "Icons/Icon"; +import Icon, { IconProps } from "@/Icons/Icon"; import type { ReactNode } from "react"; interface IconButtonProps { diff --git a/packages/app/src/Element/IrisAccount/AccountName.tsx b/packages/app/src/Element/IrisAccount/AccountName.tsx index eaeef16a..5940f741 100644 --- a/packages/app/src/Element/IrisAccount/AccountName.tsx +++ b/packages/app/src/Element/IrisAccount/AccountName.tsx @@ -6,10 +6,10 @@ export default function AccountName({ name = "", link = true }) { return ( <>
- : {name} + : {name}
- :{" "} + :{" "} {link ? (
- : {name}@iris.to + : {name}@iris.to
); diff --git a/packages/app/src/Element/IrisAccount/ActiveAccount.tsx b/packages/app/src/Element/IrisAccount/ActiveAccount.tsx index 37b83986..f46c9add 100644 --- a/packages/app/src/Element/IrisAccount/ActiveAccount.tsx +++ b/packages/app/src/Element/IrisAccount/ActiveAccount.tsx @@ -2,9 +2,9 @@ import { mapEventToProfile } from "@snort/system"; import { useUserProfile } from "@snort/system-react"; import AccountName from "./AccountName"; -import useLogin from "Hooks/useLogin"; -import { UserCache } from "Cache"; -import useEventPublisher from "Hooks/useEventPublisher"; +import useLogin from "@/Hooks/useLogin"; +import { UserCache } from "@/Cache"; +import useEventPublisher from "@/Hooks/useEventPublisher"; import { FormattedMessage } from "react-intl"; export default function ActiveAccount({ name = "", setAsPrimary = () => {} }) { @@ -61,12 +61,12 @@ export default function ActiveAccount({ name = "", setAsPrimary = () => {} }) { return (
- : + :

diff --git a/packages/app/src/Element/IrisAccount/IrisAccount.tsx b/packages/app/src/Element/IrisAccount/IrisAccount.tsx index d37f351c..b2c95e43 100644 --- a/packages/app/src/Element/IrisAccount/IrisAccount.tsx +++ b/packages/app/src/Element/IrisAccount/IrisAccount.tsx @@ -1,14 +1,14 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { Component, FormEvent } from "react"; -import { LoginStore } from "Login"; +import { LoginStore } from "@/Login"; import AccountName from "./AccountName"; import ActiveAccount from "./ActiveAccount"; import ReservedAccount from "./ReservedAccount"; -import { ProfileLoader } from "index"; +import { ProfileLoader } from "@/index"; import { FormattedMessage } from "react-intl"; import { injectIntl } from "react-intl"; -import messages from "Element/messages"; +import messages from "@/Element/messages"; declare global { interface Window { @@ -71,7 +71,7 @@ class IrisAccount extends Component { view = (

- (iris.to/username) + (iris.to/username)

this.showChallenge(e)}>
@@ -83,14 +83,14 @@ class IrisAccount extends Component { onInput={e => this.onNewUserNameChange(e)} />
{this.state.newUserNameValid ? ( <> - + @@ -106,7 +106,7 @@ class IrisAccount extends Component { return ( <>

- +

{view}

diff --git a/packages/app/src/Element/IrisAccount/ReservedAccount.tsx b/packages/app/src/Element/IrisAccount/ReservedAccount.tsx index 6e69aa42..6b9478dd 100644 --- a/packages/app/src/Element/IrisAccount/ReservedAccount.tsx +++ b/packages/app/src/Element/IrisAccount/ReservedAccount.tsx @@ -6,19 +6,19 @@ export default function ReservedAccount({ name = "", enableReserved = () => {},

{s} }} />

diff --git a/packages/app/src/Element/LiveEvent.tsx b/packages/app/src/Element/LiveEvent.tsx index 0ae46f89..1540dde4 100644 --- a/packages/app/src/Element/LiveEvent.tsx +++ b/packages/app/src/Element/LiveEvent.tsx @@ -2,9 +2,9 @@ import { NostrEvent, NostrLink } from "@snort/system"; import { FormattedMessage } from "react-intl"; import { Link } from "react-router-dom"; -import { findTag } from "SnortUtils"; +import { findTag } from "@/SnortUtils"; import ProfileImage from "./User/ProfileImage"; -import Icon from "Icons/Icon"; +import Icon from "@/Icons/Icon"; export function LiveEvent({ ev }: { ev: NostrEvent }) { const title = findTag(ev, "title"); @@ -19,7 +19,7 @@ export function LiveEvent({ ev }: { ev: NostrEvent }) {
- +
); @@ -27,7 +27,7 @@ export function LiveEvent({ ev }: { ev: NostrEvent }) { case "ended": { return ( - + ); } @@ -50,7 +50,7 @@ export function LiveEvent({ ev }: { ev: NostrEvent }) { return ( ); @@ -60,7 +60,7 @@ export function LiveEvent({ ev }: { ev: NostrEvent }) { return ( ); diff --git a/packages/app/src/Element/LiveStreams.tsx b/packages/app/src/Element/LiveStreams.tsx index 74cb7657..3adeeab4 100644 --- a/packages/app/src/Element/LiveStreams.tsx +++ b/packages/app/src/Element/LiveStreams.tsx @@ -1,10 +1,10 @@ import "./LiveStreams.css"; import { NostrEvent, NostrLink } from "@snort/system"; -import { findTag } from "SnortUtils"; +import { findTag } from "@/SnortUtils"; import { CSSProperties, useMemo } from "react"; import { Link } from "react-router-dom"; -import useImgProxy from "Hooks/useImgProxy"; -import Icon from "Icons/Icon"; +import useImgProxy from "@/Hooks/useImgProxy"; +import Icon from "@/Icons/Icon"; export function LiveStreams({ evs }: { evs: Array }) { const streams = useMemo(() => { diff --git a/packages/app/src/Element/LogoutButton.tsx b/packages/app/src/Element/LogoutButton.tsx index edd0144a..b002d0c8 100644 --- a/packages/app/src/Element/LogoutButton.tsx +++ b/packages/app/src/Element/LogoutButton.tsx @@ -1,8 +1,8 @@ import { FormattedMessage } from "react-intl"; import { useNavigate } from "react-router-dom"; -import { logout } from "Login"; -import useLogin from "Hooks/useLogin"; +import { logout } from "@/Login"; +import useLogin from "@/Hooks/useLogin"; import messages from "./messages"; export default function LogoutButton() { diff --git a/packages/app/src/Element/Nip5Service.tsx b/packages/app/src/Element/Nip5Service.tsx index 08fa114f..96ad7290 100644 --- a/packages/app/src/Element/Nip5Service.tsx +++ b/packages/app/src/Element/Nip5Service.tsx @@ -3,8 +3,8 @@ import { useIntl, FormattedMessage } from "react-intl"; import { useNavigate } from "react-router-dom"; import { UserMetadata, mapEventToProfile } from "@snort/system"; -import { unwrap } from "SnortUtils"; -import { formatShort } from "Number"; +import { unwrap } from "@/SnortUtils"; +import { formatShort } from "@/Number"; import { ServiceProvider, ServiceConfig, @@ -13,16 +13,16 @@ import { ServiceErrorCode, HandleRegisterResponse, CheckRegisterResponse, -} from "Nip05/ServiceProvider"; -import AsyncButton from "Element/AsyncButton"; -import SendSats from "Element/SendSats"; -import Copy from "Element/Copy"; +} from "@/Nip05/ServiceProvider"; +import AsyncButton from "@/Element/AsyncButton"; +import SendSats from "@/Element/SendSats"; +import Copy from "@/Element/Copy"; import { useUserProfile } from "@snort/system-react"; -import useEventPublisher from "Hooks/useEventPublisher"; -import { debounce } from "SnortUtils"; -import useLogin from "Hooks/useLogin"; -import SnortServiceProvider from "Nip05/SnortServiceProvider"; -import { UserCache } from "Cache"; +import useEventPublisher from "@/Hooks/useEventPublisher"; +import { debounce } from "@/SnortUtils"; +import useLogin from "@/Hooks/useLogin"; +import SnortServiceProvider from "@/Nip05/SnortServiceProvider"; +import { UserCache } from "@/Cache"; import messages from "./messages"; @@ -283,7 +283,7 @@ export default function Nip5Service(props: Nip05ServiceProps) { : startBuy(handle, domain) }> {props.forSubscription ? ( - + ) : ( )} diff --git a/packages/app/src/Element/Offline.tsx b/packages/app/src/Element/Offline.tsx index 660737f3..eb5b8b97 100644 --- a/packages/app/src/Element/Offline.tsx +++ b/packages/app/src/Element/Offline.tsx @@ -1,4 +1,4 @@ -import Icon from "Icons/Icon"; +import Icon from "@/Icons/Icon"; import AsyncButton from "./AsyncButton"; import { FormattedMessage } from "react-intl"; import classNames from "classnames"; @@ -8,11 +8,11 @@ export function Offline({ onRetry, className }: { onRetry?: () => void | Promise
- +
{onRetry && ( - + )}
diff --git a/packages/app/src/Element/PageSpinner.tsx b/packages/app/src/Element/PageSpinner.tsx index af1a6077..feb1ea43 100644 --- a/packages/app/src/Element/PageSpinner.tsx +++ b/packages/app/src/Element/PageSpinner.tsx @@ -1,4 +1,4 @@ -import Spinner from "Icons/Spinner"; +import Spinner from "@/Icons/Spinner"; export default function PageSpinner() { return ( diff --git a/packages/app/src/Element/PinPrompt.tsx b/packages/app/src/Element/PinPrompt.tsx index d33ea647..2f2b2a25 100644 --- a/packages/app/src/Element/PinPrompt.tsx +++ b/packages/app/src/Element/PinPrompt.tsx @@ -1,15 +1,15 @@ -import useLogin from "Hooks/useLogin"; +import useLogin from "@/Hooks/useLogin"; import "./PinPrompt.css"; import { ReactNode, useRef, useState } from "react"; import { FormattedMessage, useIntl } from "react-intl"; import { unwrap } from "@snort/shared"; import { EventPublisher, InvalidPinError, PinEncrypted } from "@snort/system"; -import useEventPublisher from "Hooks/useEventPublisher"; -import { LoginStore, createPublisher, sessionNeedsPin } from "Login"; +import useEventPublisher from "@/Hooks/useEventPublisher"; +import { LoginStore, createPublisher, sessionNeedsPin } from "@/Login"; import Modal from "./Modal"; import AsyncButton from "./AsyncButton"; -import { GetPowWorker } from "index"; +import { GetPowWorker } from "@/index"; export function PinPrompt({ onResult, @@ -29,7 +29,7 @@ export function PinPrompt({ if (pin.length < 4) { setError( formatMessage({ - defaultMessage: "Pin too short", + defaultMessage: "Pin too short", id: 'LR1XjT', }), ); return; @@ -43,7 +43,7 @@ export function PinPrompt({ if (e instanceof InvalidPinError) { setError( formatMessage({ - defaultMessage: "Incorrect pin", + defaultMessage: "Incorrect pin", id: 'qz9fty', }), ); } else if (e instanceof Error) { @@ -65,7 +65,7 @@ export function PinPrompt({ }}>

- +

{subTitle ?
{subTitle}
: null} {error}}
submitPin()} type="submit"> - +
@@ -143,7 +143,7 @@ export function LoginUnlock() { subTitle={

- +

} onResult={unlockSession} diff --git a/packages/app/src/Element/ProxyImg.tsx b/packages/app/src/Element/ProxyImg.tsx index dc625e57..9c2699eb 100644 --- a/packages/app/src/Element/ProxyImg.tsx +++ b/packages/app/src/Element/ProxyImg.tsx @@ -1,7 +1,7 @@ -import useImgProxy from "Hooks/useImgProxy"; +import useImgProxy from "@/Hooks/useImgProxy"; import React, { useState } from "react"; import { FormattedMessage } from "react-intl"; -import { getUrlHostname } from "SnortUtils"; +import { getUrlHostname } from "@/SnortUtils"; interface ProxyImgProps extends React.DetailedHTMLProps, HTMLImageElement> { size?: number; @@ -24,7 +24,7 @@ export const ProxyImg = (props: ProxyImgProps) => { setBypass(true); }}> void; ev: TaggedNostrEvent }) { diff --git a/packages/app/src/Element/Relay/Relay.tsx b/packages/app/src/Element/Relay/Relay.tsx index ad6a1242..0cb3dbde 100644 --- a/packages/app/src/Element/Relay/Relay.tsx +++ b/packages/app/src/Element/Relay/Relay.tsx @@ -5,13 +5,13 @@ import { RelaySettings } from "@snort/system"; import { unixNowMs } from "@snort/shared"; import classNames from "classnames"; -import useRelayState from "Feed/RelayState"; +import useRelayState from "@/Feed/RelayState"; import { SnortContext } from "@snort/system-react"; -import { getRelayName, unwrap } from "SnortUtils"; -import useLogin from "Hooks/useLogin"; -import { removeRelay, setRelays } from "Login"; +import { getRelayName, unwrap } from "@/SnortUtils"; +import useLogin from "@/Hooks/useLogin"; +import { removeRelay, setRelays } from "@/Login"; import { RelayFavicon } from "./RelaysMetadata"; -import { AsyncIcon } from "Element/AsyncIcon"; +import { AsyncIcon } from "@/Element/AsyncIcon"; export interface RelayProps { addr: string; diff --git a/packages/app/src/Element/Relay/RelaysMetadata.tsx b/packages/app/src/Element/Relay/RelaysMetadata.tsx index c9ee02d2..14b73109 100644 --- a/packages/app/src/Element/Relay/RelaysMetadata.tsx +++ b/packages/app/src/Element/Relay/RelaysMetadata.tsx @@ -1,9 +1,9 @@ import "./RelaysMetadata.css"; -import Nostrich from "nostrich.webp"; +import Nostrich from "@/nostrich.webp"; import { useState } from "react"; import { FullRelaySettings } from "@snort/system"; -import Icon from "Icons/Icon"; +import Icon from "@/Icons/Icon"; export const RelayFavicon = ({ url }: { url: string }) => { const cleanUrl = url diff --git a/packages/app/src/Element/RootTabs.tsx b/packages/app/src/Element/RootTabs.tsx index b27a3fe4..af8c0346 100644 --- a/packages/app/src/Element/RootTabs.tsx +++ b/packages/app/src/Element/RootTabs.tsx @@ -4,8 +4,8 @@ import { useLocation, useNavigate } from "react-router-dom"; import { Menu, MenuItem } from "@szhsin/react-menu"; import { FormattedMessage } from "react-intl"; -import useLogin from "Hooks/useLogin"; -import Icon from "Icons/Icon"; +import useLogin from "@/Hooks/useLogin"; +import Icon from "@/Icons/Icon"; export type RootTab = | "following" @@ -30,7 +30,7 @@ export function RootTabs({ base }: { base?: string }) { element: ( <> - + ), }, @@ -41,7 +41,7 @@ export function RootTabs({ base }: { base?: string }) { element: ( <> - + ), }, @@ -52,7 +52,7 @@ export function RootTabs({ base }: { base?: string }) { element: ( <> - + ), }, @@ -63,7 +63,7 @@ export function RootTabs({ base }: { base?: string }) { element: ( <> - + ), }, @@ -74,7 +74,7 @@ export function RootTabs({ base }: { base?: string }) { element: ( <> - + ), }, @@ -85,7 +85,7 @@ export function RootTabs({ base }: { base?: string }) { element: ( <> - + ), }, @@ -96,7 +96,7 @@ export function RootTabs({ base }: { base?: string }) { element: ( <> - + ), }, @@ -107,7 +107,7 @@ export function RootTabs({ base }: { base?: string }) { element: ( <> - + ), }, @@ -157,6 +157,7 @@ export function RootTabs({ base }: { base?: string }) { .filter(a => a.show) .map(a => ( { navigate(a.path); }}> diff --git a/packages/app/src/Element/SearchBox.tsx b/packages/app/src/Element/SearchBox.tsx index 48354ad8..f7369693 100644 --- a/packages/app/src/Element/SearchBox.tsx +++ b/packages/app/src/Element/SearchBox.tsx @@ -116,7 +116,7 @@ export default function SearchBox() {
setActiveIndex(0)} onClick={() => navigate(`/search/${encodeURIComponent(search)}`, { state: { forceRefresh: true } })}> - : {search} + : {search}
{main?.slice(0, MAX_RESULTS).map((result, idx) => (

- {success?.description ?? } + {success?.description ?? }

{success.url && (

@@ -123,9 +123,9 @@ export default function SendSats(props: SendSatsProps) { <>

{zapper?.canZap() ? ( - + ) : ( - + )}

@@ -141,9 +141,9 @@ export default function SendSats(props: SendSatsProps) { {t.zap?.pubkey && }

{zapper?.canZap() ? ( - + ) : ( - + )}

@@ -156,9 +156,9 @@ export default function SendSats(props: SendSatsProps) {

{zapper?.canZap() ? ( - + ) : ( - + )}

@@ -330,7 +330,7 @@ function SendSatsInput(props: { diff --git a/packages/app/src/Element/SpotlightMedia.tsx b/packages/app/src/Element/SpotlightMedia.tsx index 4b5f1105..258e154c 100644 --- a/packages/app/src/Element/SpotlightMedia.tsx +++ b/packages/app/src/Element/SpotlightMedia.tsx @@ -1,8 +1,8 @@ import "./SpotlightMedia.css"; import { useEffect, useMemo, useState } from "react"; -import Modal from "Element/Modal"; -import Icon from "Icons/Icon"; -import { ProxyImg } from "Element/ProxyImg"; +import Modal from "@/Element/Modal"; +import Icon from "@/Icons/Icon"; +import { ProxyImg } from "@/Element/ProxyImg"; interface SpotlightMediaProps { images: Array; diff --git a/packages/app/src/Element/SuggestedProfiles.tsx b/packages/app/src/Element/SuggestedProfiles.tsx index 98b84b5c..2f6351b5 100644 --- a/packages/app/src/Element/SuggestedProfiles.tsx +++ b/packages/app/src/Element/SuggestedProfiles.tsx @@ -2,12 +2,12 @@ import { useEffect, useState } from "react"; import { HexKey, NostrPrefix } from "@snort/system"; import { FormattedMessage } from "react-intl"; -import FollowListBase from "Element/User/FollowListBase"; -import PageSpinner from "Element/PageSpinner"; -import NostrBandApi from "External/NostrBand"; -import SemisolDevApi from "External/SemisolDev"; -import useLogin from "Hooks/useLogin"; -import { hexToBech32 } from "SnortUtils"; +import FollowListBase from "@/Element/User/FollowListBase"; +import PageSpinner from "@/Element/PageSpinner"; +import NostrBandApi from "@/External/NostrBand"; +import SemisolDevApi from "@/External/SemisolDev"; +import useLogin from "@/Hooks/useLogin"; +import { hexToBech32 } from "@/SnortUtils"; import { ErrorOrOffline } from "./ErrorOrOffline"; enum Provider { @@ -57,7 +57,7 @@ export default function SuggestedProfiles() { return ( <>
- +

- +

{results.map(a => { diff --git a/packages/app/src/Pages/NetworkGraph.tsx b/packages/app/src/Pages/NetworkGraph.tsx index fdd5bd5a..e0fa4f10 100644 --- a/packages/app/src/Pages/NetworkGraph.tsx +++ b/packages/app/src/Pages/NetworkGraph.tsx @@ -4,8 +4,8 @@ import { MetadataCache, socialGraphInstance, STR, UID } from "@snort/system"; import { SnortContext } from "@snort/system-react"; import * as THREE from "three"; import { defaultAvatar } from "../SnortUtils"; -import { proxyImg } from "Hooks/useImgProxy"; -import { LoginStore } from "Login"; +import { proxyImg } from "@/Hooks/useImgProxy"; +import { LoginStore } from "@/Login"; interface GraphNode { id: UID; diff --git a/packages/app/src/Pages/NostrAddressPage.tsx b/packages/app/src/Pages/NostrAddressPage.tsx index 5fcf1723..d694a873 100644 --- a/packages/app/src/Pages/NostrAddressPage.tsx +++ b/packages/app/src/Pages/NostrAddressPage.tsx @@ -1,7 +1,7 @@ import { FormattedMessage } from "react-intl"; -import { ApiHost } from "Const"; -import Nip5Service from "Element/Nip5Service"; +import { ApiHost } from "@/Const"; +import Nip5Service from "@/Element/Nip5Service"; import messages from "./messages"; @@ -26,7 +26,7 @@ export default function NostrAddressPage() { return (

- +

diff --git a/packages/app/src/Pages/NostrLinkHandler.tsx b/packages/app/src/Pages/NostrLinkHandler.tsx index 2f81e7cf..be68c587 100644 --- a/packages/app/src/Pages/NostrLinkHandler.tsx +++ b/packages/app/src/Pages/NostrLinkHandler.tsx @@ -4,10 +4,10 @@ import { FormattedMessage } from "react-intl"; import { useLocation, useParams } from "react-router-dom"; import { fetchNip05Pubkey } from "@snort/shared"; -import Spinner from "Icons/Spinner"; -import ProfilePage from "Pages/Profile/ProfilePage"; -import { ThreadRoute } from "Element/Event/Thread"; -import { GenericFeed } from "Element/Feed/Generic"; +import Spinner from "@/Icons/Spinner"; +import ProfilePage from "@/Pages/Profile/ProfilePage"; +import { ThreadRoute } from "@/Element/Event/Thread"; +import { GenericFeed } from "@/Element/Feed/Generic"; export default function NostrLinkHandler() { const params = useParams(); @@ -61,7 +61,7 @@ export default function NostrLinkHandler() { ) : ( - + )}

diff --git a/packages/app/src/Pages/Notifications.tsx b/packages/app/src/Pages/Notifications.tsx index e334fdb5..282d6768 100644 --- a/packages/app/src/Pages/Notifications.tsx +++ b/packages/app/src/Pages/Notifications.tsx @@ -8,6 +8,7 @@ import { FormattedMessage, useIntl } from "react-intl"; import { useNavigate } from "react-router-dom"; import { Bar, BarChart, Tooltip, XAxis, YAxis } from "recharts"; +<<<<<<< HEAD import useLogin from "Hooks/useLogin"; import { markNotificationsRead } from "Login"; import { Notifications } from "Cache"; @@ -21,9 +22,24 @@ import { LiveEvent } from "Element/LiveEvent"; import ProfilePreview from "Element/User/ProfilePreview"; import { Day } from "Const"; import Tabs, { Tab } from "Element/Tabs"; +======= +import useLogin from "@/Hooks/useLogin"; +import { markNotificationsRead } from "@/Login"; +import { Notifications } from "@/Cache"; +import { dedupe, findTag, orderAscending, orderDescending, getDisplayName } from "@/SnortUtils"; +import Icon from "@/Icons/Icon"; +import ProfileImage from "@/Element/User/ProfileImage"; +import useModeration from "@/Hooks/useModeration"; +import Text from "@/Element/Text"; +import { formatShort } from "@/Number"; +import { LiveEvent } from "@/Element/LiveEvent"; +import ProfilePreview from "@/Element/User/ProfilePreview"; +import { Day } from "@/Const"; +import Tabs, { Tab } from "@/Element/Tabs"; +>>>>>>> 7ec02f9b (wip vite) import classNames from "classnames"; -import { AsyncIcon } from "Element/AsyncIcon"; -import { ShowMoreInView } from "Element/Event/ShowMore"; +import { AsyncIcon } from "@/Element/AsyncIcon"; +import { ShowMoreInView } from "@/Element/Event/ShowMore"; function notificationContext(ev: TaggedNostrEvent) { switch (ev.kind) { @@ -101,7 +117,7 @@ export default function NotificationsPage({ onClick }: { onClick?: (link: NostrL

- +

@@ -148,11 +164,11 @@ function NotificationSummary({ evs }: { evs: Array }) { const periodTabs = [ { value: NotificationSummaryPeriod.Daily, - text: , + text: , }, { value: NotificationSummaryPeriod.Weekly, - text: , + text: , }, ] as Array; @@ -221,7 +237,7 @@ function NotificationSummary({ evs }: { evs: Array }) {

- +

{filterIcon(NotificationSummaryFilter.Reactions, "heart-solid", "text-heart")} @@ -329,7 +345,7 @@ function NotificationGroup({ evs, onClick }: { evs: Array; onC case EventKind.Reaction: { return ( ; onC case EventKind.Repost: { return ( ; onC case EventKind.ZapReceipt: { return ( ; onC showUsername={kind === EventKind.TextNote} pubkey={v} size={40} - overrideUsername={v === "" ? formatMessage({ defaultMessage: "Anon" }) : undefined} + overrideUsername={v === "" ? formatMessage({ defaultMessage: "Anon", id: 'bfvyfs' }) : undefined} /> ))}
@@ -393,7 +409,7 @@ function NotificationGroup({ evs, onClick }: { evs: Array; onC {actionName( pubkeys.length - 1, firstPubkey === "anon" - ? formatMessage({ defaultMessage: "Anon" }) + ? formatMessage({ defaultMessage: "Anon", id: 'bfvyfs' }) : getDisplayName(firstPubkeyProfile, firstPubkey), )}
diff --git a/packages/app/src/Pages/Profile/ProfilePage.tsx b/packages/app/src/Pages/Profile/ProfilePage.tsx index cc2c2fc3..7e555029 100644 --- a/packages/app/src/Pages/Profile/ProfilePage.tsx +++ b/packages/app/src/Pages/Profile/ProfilePage.tsx @@ -15,37 +15,37 @@ import { import { LNURL, fetchNip05Pubkey } from "@snort/shared"; import { useUserProfile } from "@snort/system-react"; -import { findTag, getLinkReactions, unwrap } from "SnortUtils"; -import Note from "Element/Event/Note"; -import { Tab, TabElement } from "Element/Tabs"; -import Icon from "Icons/Icon"; -import useFollowsFeed from "Feed/FollowsFeed"; -import useProfileBadges from "Feed/BadgesFeed"; -import useModeration from "Hooks/useModeration"; -import FollowButton from "Element/User/FollowButton"; -import { parseId, hexToBech32 } from "SnortUtils"; -import Avatar from "Element/User/Avatar"; -import Timeline from "Element/Feed/Timeline"; -import Text from "Element/Text"; -import SendSats from "Element/SendSats"; -import Nip05 from "Element/User/Nip05"; -import Copy from "Element/Copy"; -import ProfileImage from "Element/User/ProfileImage"; -import BlockList from "Element/User/BlockList"; -import MutedList from "Element/User/MutedList"; -import FollowsList from "Element/User/FollowListBase"; -import IconButton from "Element/IconButton"; -import FollowsYou from "Element/User/FollowsYou"; -import QrCode from "Element/QrCode"; -import Modal from "Element/Modal"; -import BadgeList from "Element/User/BadgeList"; -import { ProxyImg } from "Element/ProxyImg"; -import useHorizontalScroll from "Hooks/useHorizontalScroll"; -import { EmailRegex } from "Const"; -import useLogin from "Hooks/useLogin"; -import { ZapTarget } from "Zapper"; -import { useStatusFeed } from "Feed/StatusFeed"; -import { SpotlightMediaModal } from "Element/SpotlightMedia"; +import { findTag, getLinkReactions, unwrap } from "@/SnortUtils"; +import Note from "@/Element/Event/Note"; +import { Tab, TabElement } from "@/Element/Tabs"; +import Icon from "@/Icons/Icon"; +import useFollowsFeed from "@/Feed/FollowsFeed"; +import useProfileBadges from "@/Feed/BadgesFeed"; +import useModeration from "@/Hooks/useModeration"; +import FollowButton from "@/Element/User/FollowButton"; +import { parseId, hexToBech32 } from "@/SnortUtils"; +import Avatar from "@/Element/User/Avatar"; +import Timeline from "@/Element/Feed/Timeline"; +import Text from "@/Element/Text"; +import SendSats from "@/Element/SendSats"; +import Nip05 from "@/Element/User/Nip05"; +import Copy from "@/Element/Copy"; +import ProfileImage from "@/Element/User/ProfileImage"; +import BlockList from "@/Element/User/BlockList"; +import MutedList from "@/Element/User/MutedList"; +import FollowsList from "@/Element/User/FollowListBase"; +import IconButton from "@/Element/IconButton"; +import FollowsYou from "@/Element/User/FollowsYou"; +import QrCode from "@/Element/QrCode"; +import Modal from "@/Element/Modal"; +import BadgeList from "@/Element/User/BadgeList"; +import { ProxyImg } from "@/Element/ProxyImg"; +import useHorizontalScroll from "@/Hooks/useHorizontalScroll"; +import { EmailRegex } from "@/Const"; +import useLogin from "@/Hooks/useLogin"; +import { ZapTarget } from "@/Zapper"; +import { useStatusFeed } from "@/Feed/StatusFeed"; +import { SpotlightMediaModal } from "@/Element/SpotlightMedia"; import ProfileTab, { BookMarksTab, FollowersTab, @@ -53,10 +53,10 @@ import ProfileTab, { ProfileTabType, RelaysTab, ZapsProfileTab, -} from "Pages/Profile/ProfileTab"; -import DisplayName from "Element/User/DisplayName"; -import { UserWebsiteLink } from "Element/User/UserWebsiteLink"; -import { useMuteList, usePinList } from "Hooks/useLists"; +} from "@/Pages/Profile/ProfileTab"; +import DisplayName from "@/Element/User/DisplayName"; +import { UserWebsiteLink } from "@/Element/User/UserWebsiteLink"; +import { useMuteList, usePinList } from "@/Hooks/useLists"; import messages from "../messages"; diff --git a/packages/app/src/Pages/Profile/ProfileTab.tsx b/packages/app/src/Pages/Profile/ProfileTab.tsx index 5d51fd3b..721dd273 100644 --- a/packages/app/src/Pages/Profile/ProfileTab.tsx +++ b/packages/app/src/Pages/Profile/ProfileTab.tsx @@ -2,18 +2,18 @@ import { FormattedMessage } from "react-intl"; import { HexKey, NostrLink, NostrPrefix } from "@snort/system"; import { useReactions } from "@snort/system-react"; -import useZapsFeed from "Feed/ZapsFeed"; -import { formatShort } from "Number"; -import useFollowersFeed from "Feed/FollowersFeed"; -import FollowsList from "Element/User/FollowListBase"; -import useFollowsFeed from "Feed/FollowsFeed"; -import useRelaysFeed from "Feed/RelaysFeed"; -import RelaysMetadata from "Element/Relay/RelaysMetadata"; -import Bookmarks from "Element/User/Bookmarks"; -import Icon from "Icons/Icon"; -import { Tab } from "Element/Tabs"; -import { default as ZapElement } from "Element/Event/Zap"; -import useCategorizedBookmarks from "Hooks/useLists"; +import useZapsFeed from "@/Feed/ZapsFeed"; +import { formatShort } from "@/Number"; +import useFollowersFeed from "@/Feed/FollowersFeed"; +import FollowsList from "@/Element/User/FollowListBase"; +import useFollowsFeed from "@/Feed/FollowsFeed"; +import useRelaysFeed from "@/Feed/RelaysFeed"; +import RelaysMetadata from "@/Element/Relay/RelaysMetadata"; +import Bookmarks from "@/Element/User/Bookmarks"; +import Icon from "@/Icons/Icon"; +import { Tab } from "@/Element/Tabs"; +import { default as ZapElement } from "@/Element/Event/Zap"; +import useCategorizedBookmarks from "@/Hooks/useLists"; import messages from "../messages"; @@ -70,7 +70,7 @@ const ProfileTab = { text: ( <> - + ), value: ProfileTabType.NOTES, @@ -79,7 +79,7 @@ const ProfileTab = { text: ( <> - + ), value: ProfileTabType.REACTIONS, @@ -88,7 +88,7 @@ const ProfileTab = { text: ( <> - + ), value: ProfileTabType.FOLLOWERS, @@ -97,7 +97,7 @@ const ProfileTab = { text: ( <> - + ), value: ProfileTabType.FOLLOWS, @@ -106,7 +106,7 @@ const ProfileTab = { text: ( <> - + ), value: ProfileTabType.ZAPS, @@ -115,7 +115,7 @@ const ProfileTab = { text: ( <> - + ), value: ProfileTabType.MUTED, @@ -124,7 +124,7 @@ const ProfileTab = { text: ( <> - + ), value: ProfileTabType.BLOCKED, @@ -133,7 +133,7 @@ const ProfileTab = { text: ( <> - + ), value: ProfileTabType.RELAYS, @@ -142,7 +142,7 @@ const ProfileTab = { text: ( <> - + ), value: ProfileTabType.BOOKMARKS, diff --git a/packages/app/src/Pages/Root.tsx b/packages/app/src/Pages/Root.tsx index 94eb637a..801ac517 100644 --- a/packages/app/src/Pages/Root.tsx +++ b/packages/app/src/Pages/Root.tsx @@ -5,21 +5,21 @@ import { unixNow } from "@snort/shared"; import { NostrLink } from "@snort/system"; import { SnortContext } from "@snort/system-react"; -import Timeline from "Element/Feed/Timeline"; -import { TimelineSubject } from "Feed/TimelineFeed"; -import { debounce, getRelayName, sha256 } from "SnortUtils"; -import useLogin from "Hooks/useLogin"; -import Discover from "Pages/Discover"; -import TrendingUsers from "Element/TrendingUsers"; -import TrendingNotes from "Element/TrendingPosts"; -import HashTagsPage from "Pages/HashTagsPage"; -import SuggestedProfiles from "Element/SuggestedProfiles"; -import { TaskList } from "Tasks/TaskList"; -import TimelineFollows from "Element/Feed/TimelineFollows"; -import { RootTabs } from "Element/RootTabs"; -import { DeckContext } from "Pages/DeckLayout"; +import Timeline from "@/Element/Feed/Timeline"; +import { TimelineSubject } from "@/Feed/TimelineFeed"; +import { debounce, getRelayName, sha256 } from "@/SnortUtils"; +import useLogin from "@/Hooks/useLogin"; +import Discover from "@/Pages/Discover"; +import TrendingUsers from "@/Element/TrendingUsers"; +import TrendingNotes from "@/Element/TrendingPosts"; +import HashTagsPage from "@/Pages/HashTagsPage"; +import SuggestedProfiles from "@/Element/SuggestedProfiles"; +import { TaskList } from "@/Tasks/TaskList"; +import TimelineFollows from "@/Element/Feed/TimelineFollows"; +import { RootTabs } from "@/Element/RootTabs"; +import { DeckContext } from "@/Pages/DeckLayout"; import { TopicsPage } from "./TopicsPage"; -import TrendingHashtags from "Element/TrendingHashtags"; +import TrendingHashtags from "@/Element/TrendingHashtags"; import messages from "./messages"; @@ -75,7 +75,7 @@ export const GlobalTab = () => { return (

- +

setSortPopular(e.target.value == "true")} value={sortPopular ? "true" : "false"}>
@@ -90,12 +90,12 @@ const SearchPage = () => {

- +

setSearch(e.target.value)} autoFocus={true} diff --git a/packages/app/src/Pages/SettingsPage.tsx b/packages/app/src/Pages/SettingsPage.tsx index 82370f7e..337f72c0 100644 --- a/packages/app/src/Pages/SettingsPage.tsx +++ b/packages/app/src/Pages/SettingsPage.tsx @@ -1,15 +1,15 @@ import { FormattedMessage } from "react-intl"; import { Outlet, RouteObject, useNavigate } from "react-router-dom"; -import SettingsIndex from "Pages/settings/Root"; -import Profile from "Pages/settings/Profile"; -import Relay from "Pages/settings/Relays"; -import Preferences from "Pages/settings/Preferences"; -import RelayInfo from "Pages/settings/RelayInfo"; -import AccountsPage from "Pages/settings/Accounts"; -import { WalletSettingsRoutes } from "Pages/settings/WalletSettings"; -import { ManageHandleRoutes } from "Pages/settings/handle"; -import ExportKeys from "Pages/settings/Keys"; -import { ModerationSettings } from "Pages/settings/Moderation"; +import SettingsIndex from "@/Pages/settings/Root"; +import Profile from "@/Pages/settings/Profile"; +import Relay from "@/Pages/settings/Relays"; +import Preferences from "@/Pages/settings/Preferences"; +import RelayInfo from "@/Pages/settings/RelayInfo"; +import AccountsPage from "@/Pages/settings/Accounts"; +import { WalletSettingsRoutes } from "@/Pages/settings/WalletSettings"; +import { ManageHandleRoutes } from "@/Pages/settings/handle"; +import ExportKeys from "@/Pages/settings/Keys"; +import { ModerationSettings } from "@/Pages/settings/Moderation"; import { CacheSettings } from "./settings/Cache"; import messages from "./messages"; diff --git a/packages/app/src/Pages/TopicsPage.tsx b/packages/app/src/Pages/TopicsPage.tsx index 00f9cc9b..bfe996e3 100644 --- a/packages/app/src/Pages/TopicsPage.tsx +++ b/packages/app/src/Pages/TopicsPage.tsx @@ -1,5 +1,5 @@ -import Timeline from "Element/Feed/Timeline"; -import useLogin from "Hooks/useLogin"; +import Timeline from "@/Element/Feed/Timeline"; +import useLogin from "@/Hooks/useLogin"; export function TopicsPage() { const { tags, pubKey } = useLogin(s => ({ tags: s.tags.item, pubKey: s.publicKey })); diff --git a/packages/app/src/Pages/WalletPage.tsx b/packages/app/src/Pages/WalletPage.tsx index c9756a75..360ddd45 100644 --- a/packages/app/src/Pages/WalletPage.tsx +++ b/packages/app/src/Pages/WalletPage.tsx @@ -4,12 +4,12 @@ import { useEffect, useState } from "react"; import { RouteObject, useNavigate } from "react-router-dom"; import { FormattedMessage, FormattedNumber, useIntl } from "react-intl"; -import NoteTime from "Element/Event/NoteTime"; -import { WalletInvoice, Sats, WalletInfo, WalletInvoiceState, useWallet, LNWallet, Wallets } from "Wallet"; -import AsyncButton from "Element/AsyncButton"; -import { unwrap } from "SnortUtils"; -import { WebLNWallet } from "Wallet/WebLN"; -import Icon from "Icons/Icon"; +import NoteTime from "@/Element/Event/NoteTime"; +import { WalletInvoice, Sats, WalletInfo, WalletInvoiceState, useWallet, LNWallet, Wallets } from "@/Wallet"; +import AsyncButton from "@/Element/AsyncButton"; +import { unwrap } from "@/SnortUtils"; +import { WebLNWallet } from "@/Wallet/WebLN"; +import Icon from "@/Icons/Icon"; export const WalletRoutes: RouteObject[] = [ { @@ -41,7 +41,7 @@ export default function WalletPage() { if (e instanceof Error) { setError((e as Error).message); } else { - setError(formatMessage({ defaultMessage: "Unknown error" })); + setError(formatMessage({ defaultMessage: "Unknown error", id: 'qDwvZ4' })); } } } @@ -83,14 +83,14 @@ export default function WalletPage() { return ( <>

- +

loginWallet(unwrap(walletPassword))} disabled={(walletPassword?.length ?? 0) < 8}> - +
@@ -110,14 +110,14 @@ export default function WalletPage() { if (walletState.configs.length === 0) { return ( ); } return (

- +

) : ( - + ) } /> @@ -93,17 +93,17 @@ export default function ZapPoolPage() { return (

- +

- +

- +

@@ -115,7 +115,7 @@ export default function ZapPoolPage() {

@@ -134,7 +134,7 @@ export default function ZapPoolPage() {

@@ -147,7 +147,7 @@ export default function ZapPoolPage() {

{wallet && ( ZapPoolController?.payout(wallet)}> - + )}

@@ -164,7 +164,7 @@ export default function ZapPoolPage() { />

- +

{relayConnections.map(a => (
@@ -182,7 +182,7 @@ export default function ZapPoolPage() {
))}

- +

{UploaderServices.map(a => (
@@ -200,7 +200,7 @@ export default function ZapPoolPage() {
))}

- +

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

- +

} /> @@ -35,7 +35,7 @@ export function Discover() { state, }) }> - +
); diff --git a/packages/app/src/Pages/onboarding/index.tsx b/packages/app/src/Pages/onboarding/index.tsx index 4f82523b..d51f6064 100644 --- a/packages/app/src/Pages/onboarding/index.tsx +++ b/packages/app/src/Pages/onboarding/index.tsx @@ -1,12 +1,12 @@ import "./index.css"; import { Outlet, RouteObject } from "react-router-dom"; import { SignIn, SignUp } from "./start"; -import { AllLanguageCodes } from "Pages/settings/Preferences"; -import Icon from "Icons/Icon"; +import { AllLanguageCodes } from "@/Pages/settings/Preferences"; +import Icon from "@/Icons/Icon"; import { Profile } from "./profile"; import { Topics } from "./topics"; import { Discover } from "./discover"; -import { useLocale } from "IntlProvider"; +import { useLocale } from "@/IntlProvider"; import { Moderation } from "./moderation"; export interface NewUserState { diff --git a/packages/app/src/Pages/onboarding/moderation.tsx b/packages/app/src/Pages/onboarding/moderation.tsx index 5b59d0f7..f99ace7c 100644 --- a/packages/app/src/Pages/onboarding/moderation.tsx +++ b/packages/app/src/Pages/onboarding/moderation.tsx @@ -3,11 +3,11 @@ import { FormattedMessage } from "react-intl"; import { useNavigate } from "react-router-dom"; import { unixNowMs } from "@snort/shared"; -import AsyncButton from "Element/AsyncButton"; -import { appendDedupe } from "SnortUtils"; -import { ToggleSwitch } from "Icons/Toggle"; -import { updateAppData } from "Login"; -import useLogin from "Hooks/useLogin"; +import AsyncButton from "@/Element/AsyncButton"; +import { appendDedupe } from "@/SnortUtils"; +import { ToggleSwitch } from "@/Icons/Toggle"; +import { updateAppData } from "@/Login"; +import useLogin from "@/Hooks/useLogin"; export const FixedModeration = { /*hateSpeech: { @@ -21,7 +21,7 @@ export const FixedModeration = { canEdit: false, },*/ nsfw: { - title: , + title: , words: [ "adult content", "explicit", @@ -48,7 +48,7 @@ export const FixedModeration = { canEdit: false, }, crypto: { - title: , + title: , words: [ "bitcoin", "btc", @@ -76,7 +76,7 @@ export const FixedModeration = { canEdit: false, }, politics: { - title: , + title: , words: [ "politics", "election", @@ -123,17 +123,17 @@ export function Moderation() {

- +

- +
- + - + {v.title}
{v.canEdit && (
- +
)}
- + - +
@@ -196,7 +196,7 @@ export function Moderation() { } navigate("/"); }}> - +
); diff --git a/packages/app/src/Pages/onboarding/profile.tsx b/packages/app/src/Pages/onboarding/profile.tsx index f57c928f..6cf15d16 100644 --- a/packages/app/src/Pages/onboarding/profile.tsx +++ b/packages/app/src/Pages/onboarding/profile.tsx @@ -1,13 +1,13 @@ -import AsyncButton from "Element/AsyncButton"; -import AvatarEditor from "Element/User/AvatarEditor"; +import AsyncButton from "@/Element/AsyncButton"; +import AvatarEditor from "@/Element/User/AvatarEditor"; import { useContext, useState } from "react"; import { FormattedMessage } from "react-intl"; import { useLocation, useNavigate } from "react-router-dom"; -import { generateNewLogin } from "Login"; +import { generateNewLogin } from "@/Login"; import { SnortContext } from "@snort/system-react"; import { NotEncrypted } from "@snort/system"; import { NewUserState } from "."; -import { trackEvent } from "SnortUtils"; +import { trackEvent } from "@/SnortUtils"; export function Profile() { const system = useContext(SnortContext); @@ -36,11 +36,11 @@ export function Profile() { return (

- +

setPicture(p)} /> makeRandomKey()}> - + {error && {error}}
diff --git a/packages/app/src/Pages/onboarding/start.tsx b/packages/app/src/Pages/onboarding/start.tsx index 8fac9be9..9ac3abe2 100644 --- a/packages/app/src/Pages/onboarding/start.tsx +++ b/packages/app/src/Pages/onboarding/start.tsx @@ -3,14 +3,14 @@ import { useState } from "react"; import { Link, useNavigate } from "react-router-dom"; import { unwrap } from "@snort/shared"; -import AsyncButton from "Element/AsyncButton"; -import Icon from "Icons/Icon"; +import AsyncButton from "@/Element/AsyncButton"; +import Icon from "@/Icons/Icon"; import { NewUserState } from "."; -import { LoginSessionType, LoginStore } from "Login"; -import useLoginHandler from "Hooks/useLoginHandler"; +import { LoginSessionType, LoginStore } from "@/Login"; +import useLoginHandler from "@/Hooks/useLoginHandler"; import { NotEncrypted } from "@snort/system"; import classNames from "classnames"; -import { trackEvent } from "SnortUtils"; +import { trackEvent } from "@/SnortUtils"; export function SignIn() { const navigate = useNavigate(); @@ -43,7 +43,7 @@ export function SignIn() { } else { setError( formatMessage({ - defaultMessage: "Unknown login error", + defaultMessage: "Unknown login error", id: 'OLEm6z', }), ); } @@ -57,9 +57,9 @@ export function SignIn() {

- +

- {nip7Login && } + {nip7Login && }
{hasNip7 && !useKey && ( @@ -68,13 +68,13 @@ export function SignIn() {
- + - + setUseKey(true)}> - + )} @@ -83,7 +83,7 @@ export function SignIn() { setKey(e.target.value)} @@ -91,15 +91,15 @@ export function SignIn() { /> {error && {error}} - + )}
- + navigate("/login/sign-up")}> - +
@@ -116,16 +116,16 @@ export function SignUp() {

- +

- +
setName(e.target.value)} @@ -141,13 +141,13 @@ export function SignUp() { } as NewUserState, }) }> - +
- + navigate("/login")}> - +
diff --git a/packages/app/src/Pages/onboarding/topics.tsx b/packages/app/src/Pages/onboarding/topics.tsx index 5712801e..ad3f53bb 100644 --- a/packages/app/src/Pages/onboarding/topics.tsx +++ b/packages/app/src/Pages/onboarding/topics.tsx @@ -1,15 +1,15 @@ import { ReactNode, useState } from "react"; import { FormattedMessage } from "react-intl"; import { useNavigate } from "react-router-dom"; -import AsyncButton from "Element/AsyncButton"; +import AsyncButton from "@/Element/AsyncButton"; import classNames from "classnames"; -import { appendDedupe } from "SnortUtils"; -import useEventPublisher from "Hooks/useEventPublisher"; +import { appendDedupe } from "@/SnortUtils"; +import useEventPublisher from "@/Hooks/useEventPublisher"; import { NostrHashtagLink } from "@snort/system"; export const FixedTopics = { life: { - text: , + text: , tags: [ "life", "lifestyle", @@ -44,7 +44,7 @@ export const FixedTopics = { ], }, science: { - text: , + text: , tags: [ "science", "research", @@ -79,7 +79,7 @@ export const FixedTopics = { ], }, nature: { - text: , + text: , tags: [ "nature", "wildlife", @@ -114,7 +114,7 @@ export const FixedTopics = { ], }, business: { - text: , + text: , tags: [ "business", "entrepreneurship", @@ -149,7 +149,7 @@ export const FixedTopics = { ], }, game: { - text: , + text: , tags: [ "gaming", "videogames", @@ -184,7 +184,7 @@ export const FixedTopics = { ], }, sport: { - text: , + text: , tags: [ "sports", "athletics", @@ -219,7 +219,7 @@ export const FixedTopics = { ], }, photography: { - text: , + text: , tags: [ "photography", "landscape", @@ -274,7 +274,7 @@ export function Topics() { return (

- +

{Object.entries(FixedTopics).map(([k, v]) => tab(k, v.text))}
- +
); diff --git a/packages/app/src/Pages/settings/Accounts.tsx b/packages/app/src/Pages/settings/Accounts.tsx index 690e0125..1ac28b2b 100644 --- a/packages/app/src/Pages/settings/Accounts.tsx +++ b/packages/app/src/Pages/settings/Accounts.tsx @@ -1,9 +1,9 @@ import { FormattedMessage } from "react-intl"; import { Link } from "react-router-dom"; -import ProfilePreview from "Element/User/ProfilePreview"; -import { LoginStore } from "Login"; -import { getActiveSubscriptions } from "Subscription"; +import ProfilePreview from "@/Element/User/ProfilePreview"; +import { LoginStore } from "@/Login"; +import { getActiveSubscriptions } from "@/Subscription"; export default function AccountsPage() { const logins = LoginStore.getSessions(); @@ -12,7 +12,7 @@ export default function AccountsPage() { return (

- +

{logins.map(a => (
@@ -24,10 +24,10 @@ export default function AccountsPage() { actions={
} @@ -38,7 +38,7 @@ export default function AccountsPage() { {sub && ( )} diff --git a/packages/app/src/Pages/settings/Cache.tsx b/packages/app/src/Pages/settings/Cache.tsx index 2a0fe105..58f9e654 100644 --- a/packages/app/src/Pages/settings/Cache.tsx +++ b/packages/app/src/Pages/settings/Cache.tsx @@ -9,8 +9,8 @@ import { RelayMetrics, UserCache, UserRelays, -} from "Cache"; -import AsyncButton from "Element/AsyncButton"; +} from "@/Cache"; +import AsyncButton from "@/Element/AsyncButton"; import { ReactNode, useSyncExternalStore } from "react"; import { FormattedMessage, FormattedNumber } from "react-intl"; @@ -18,17 +18,17 @@ export function CacheSettings() { return (

- +

- } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } />
); } @@ -45,7 +45,7 @@ function CacheDetails({ cache, name }: { cache: FeedCache; name: ReactNode {name} , count2: , @@ -55,7 +55,7 @@ function CacheDetails({ cache, name }: { cache: FeedCache; name: ReactNode
cache.clear()}> - +
diff --git a/packages/app/src/Pages/settings/Keys.tsx b/packages/app/src/Pages/settings/Keys.tsx index 5631bb26..2179c324 100644 --- a/packages/app/src/Pages/settings/Keys.tsx +++ b/packages/app/src/Pages/settings/Keys.tsx @@ -2,24 +2,24 @@ import "./Keys.css"; import { FormattedMessage } from "react-intl"; import { encodeTLV, KeyStorage, NostrPrefix } from "@snort/system"; -import Copy from "Element/Copy"; -import useLogin from "Hooks/useLogin"; -import { hexToMnemonic } from "nip6"; -import { hexToBech32 } from "SnortUtils"; +import Copy from "@/Element/Copy"; +import useLogin from "@/Hooks/useLogin"; +import { hexToMnemonic } from "@/nip6"; +import { hexToBech32 } from "@/SnortUtils"; export default function ExportKeys() { const { publicKey, privateKeyData, generatedEntropy } = useLogin(); return (

- +

{privateKeyData instanceof KeyStorage && ( <>

- +

@@ -27,7 +27,7 @@ export default function ExportKeys() { {generatedEntropy && ( <>

- +

{hexToMnemonic(generatedEntropy ?? "") diff --git a/packages/app/src/Pages/settings/Moderation.tsx b/packages/app/src/Pages/settings/Moderation.tsx index 973c8015..e3a5b787 100644 --- a/packages/app/src/Pages/settings/Moderation.tsx +++ b/packages/app/src/Pages/settings/Moderation.tsx @@ -1,7 +1,7 @@ import { unixNowMs } from "@snort/shared"; -import useLogin from "Hooks/useLogin"; -import { updateAppData } from "Login"; -import { appendDedupe } from "SnortUtils"; +import useLogin from "@/Hooks/useLogin"; +import { updateAppData } from "@/Login"; +import { appendDedupe } from "@/SnortUtils"; import { useState } from "react"; import { FormattedMessage } from "react-intl"; @@ -34,7 +34,7 @@ export function ModerationSettings() { return ( <>

- +

@@ -46,14 +46,14 @@ export function ModerationSettings() { onChange={e => setMuteWord(e.target.value.toLowerCase())} />
{login.appData.item.mutedWords.map(v => (
{v}
))} diff --git a/packages/app/src/Pages/settings/Preferences.tsx b/packages/app/src/Pages/settings/Preferences.tsx index 8c545357..6d7e0d33 100644 --- a/packages/app/src/Pages/settings/Preferences.tsx +++ b/packages/app/src/Pages/settings/Preferences.tsx @@ -1,11 +1,11 @@ import "./Preferences.css"; import { FormattedMessage, useIntl } from "react-intl"; -import useLogin from "Hooks/useLogin"; -import { updatePreferences, UserPreferences } from "Login"; -import { DefaultImgProxy } from "Const"; -import { unwrap } from "SnortUtils"; -import { useLocale } from "IntlProvider"; +import useLogin from "@/Hooks/useLogin"; +import { updatePreferences, UserPreferences } from "@/Login"; +import { DefaultImgProxy } from "@/Const"; +import { unwrap } from "@/SnortUtils"; +import { useLocale } from "@/IntlProvider"; import messages from "./messages"; @@ -46,7 +46,7 @@ const PreferencesPage = () => {

- +

{

- +

- +
@@ -251,10 +251,10 @@ const PreferencesPage = () => {

- +

- +
@@ -268,10 +268,10 @@ const PreferencesPage = () => {

- +

- +
@@ -316,7 +316,7 @@ const PreferencesPage = () => { type="text" value={perf.imgProxyConfig?.url} placeholder={formatMessage({ - defaultMessage: "URL..", + defaultMessage: "URL..", id: 'cQfLWb', description: "Placeholder text for imgproxy url textbox", })} onChange={e => @@ -340,7 +340,7 @@ const PreferencesPage = () => { type="password" value={perf.imgProxyConfig?.key} placeholder={formatMessage({ - defaultMessage: "Hex Key..", + defaultMessage: "Hex Key..", id: 'H+vHiz', description: "Hexidecimal 'key' input for improxy", })} onChange={e => @@ -364,7 +364,7 @@ const PreferencesPage = () => { type="password" value={perf.imgProxyConfig?.salt} placeholder={formatMessage({ - defaultMessage: "Hex Salt..", + defaultMessage: "Hex Salt..", id: 'TpgeGw', description: "Hexidecimal 'salt' input for imgproxy", })} onChange={e => diff --git a/packages/app/src/Pages/settings/Profile.tsx b/packages/app/src/Pages/settings/Profile.tsx index ad9f7b52..09e426ae 100644 --- a/packages/app/src/Pages/settings/Profile.tsx +++ b/packages/app/src/Pages/settings/Profile.tsx @@ -4,16 +4,16 @@ import { useNavigate } from "react-router-dom"; import { mapEventToProfile } from "@snort/system"; import { useUserProfile } from "@snort/system-react"; -import useEventPublisher from "Hooks/useEventPublisher"; -import { openFile } from "SnortUtils"; -import useFileUpload from "Upload"; -import AsyncButton from "Element/AsyncButton"; -import { UserCache } from "Cache"; -import useLogin from "Hooks/useLogin"; -import Icon from "Icons/Icon"; -import Avatar from "Element/User/Avatar"; +import useEventPublisher from "@/Hooks/useEventPublisher"; +import { openFile } from "@/SnortUtils"; +import useFileUpload from "@/Upload"; +import AsyncButton from "@/Element/AsyncButton"; +import { UserCache } from "@/Cache"; +import useLogin from "@/Hooks/useLogin"; +import Icon from "@/Icons/Icon"; +import Avatar from "@/Element/User/Avatar"; import { FormattedMessage } from "react-intl"; -import { ErrorOrOffline } from "Element/ErrorOrOffline"; +import { ErrorOrOffline } from "@/Element/ErrorOrOffline"; export interface ProfileSettingsProps { avatar?: boolean; @@ -117,7 +117,7 @@ export default function ProfileSettings(props: ProfileSettingsProps) {

- +

- +