Fix broken quote repost in drawer

reorganize providers
This commit is contained in:
hzrd149 2023-12-28 08:54:13 -06:00
parent 58317916ed
commit 59821df735
198 changed files with 459 additions and 425 deletions
src
app.tsx
components
helpers/nostr
hooks
index.tsx
providers
views

@ -5,7 +5,6 @@ import { css, Global } from "@emotion/react";
import { ErrorBoundary } from "./components/error-boundary";
import Layout from "./components/layout";
import { PageProviders } from "./providers";
import DrawerSubViewProvider from "./providers/drawer-sub-view-provider";
import useSetColorMode from "./hooks/use-set-color-mode";
@ -79,6 +78,7 @@ import DVMFeedView from "./views/dvm-feed/feed";
import TransformNoteView from "./views/tools/transform-note";
import SatelliteCDNView from "./views/tools/satellite-cdn";
import OtherStuffView from "./views/other-stuff";
import { RouteProviders } from "./providers/route";
const UserTracksTab = lazy(() => import("./views/user/tracks"));
const ToolsHomeView = lazy(() => import("./views/tools"));
@ -133,24 +133,24 @@ const RootPage = () => {
useSetColorMode();
return (
<PageProviders>
<RouteProviders>
<Layout>
<ScrollRestoration />
<Suspense fallback={<Spinner />}>
<Outlet />
</Suspense>
</Layout>
</PageProviders>
</RouteProviders>
);
};
const NoLayoutPage = () => {
return (
<PageProviders>
<RouteProviders>
<ScrollRestoration />
<Suspense fallback={<Spinner />}>
<Outlet />
</Suspense>
</PageProviders>
</RouteProviders>
);
};
@ -183,17 +183,17 @@ const router = createHashRouter([
{
path: "streams/moderation",
element: (
<PageProviders>
<RouteProviders>
<StreamModerationView />
</PageProviders>
</RouteProviders>
),
},
{
path: "streams/:naddr",
element: (
<PageProviders>
<RouteProviders>
<StreamView />
</PageProviders>
</RouteProviders>
),
},
{

@ -1,7 +1,7 @@
import { MenuItem } from "@chakra-ui/react";
import { NostrEvent } from "../../types/nostr-event";
import { useDeleteEventContext } from "../../providers/delete-event-provider";
import { useDeleteEventContext } from "../../providers/route/delete-event-provider";
import useCurrentAccount from "../../hooks/use-current-account";
import { TrashIcon } from "../icons";

@ -3,7 +3,7 @@ import { MenuItem } from "@chakra-ui/react";
import { NostrEvent } from "../../types/nostr-event";
import useCurrentAccount from "../../hooks/use-current-account";
import { MuteIcon, UnmuteIcon } from "../icons";
import { useMuteModalContext } from "../../providers/mute-modal-provider";
import { useMuteModalContext } from "../../providers/route/mute-modal-provider";
import useUserMuteFunctions from "../../hooks/use-user-mute-functions";
export default function MuteUserMenuItem({ event }: { event: NostrEvent }) {

@ -3,7 +3,7 @@ import { MenuItem, useToast } from "@chakra-ui/react";
import dayjs from "dayjs";
import useCurrentAccount from "../../hooks/use-current-account";
import { useSigningContext } from "../../providers/signing-provider";
import { useSigningContext } from "../../providers/global/signing-provider";
import useUserPinList from "../../hooks/use-user-pin-list";
import { DraftNostrEvent, NostrEvent, isETag } from "../../types/nostr-event";
import { PIN_LIST_KIND, listAddEvent, listRemoveEvent } from "../../helpers/nostr/lists";

@ -1,7 +1,7 @@
import { Card, CardBody, CardHeader, CardProps, LinkBox, Text } from "@chakra-ui/react";
import { NostrEvent } from "../../../types/nostr-event";
import { TrustProvider } from "../../../providers/trust";
import { TrustProvider } from "../../../providers/local/trust";
import UserAvatarLink from "../../user-avatar-link";
import UserLink from "../../user-link";
import Timestamp from "../../timestamp";

@ -9,7 +9,7 @@ import { UserDnsIdentityIcon } from "../../user-dns-identity-icon";
import useSubject from "../../../hooks/use-subject";
import appSettings from "../../../services/settings/app-settings";
import EventVerificationIcon from "../../event-verification-icon";
import { TrustProvider } from "../../../providers/trust";
import { TrustProvider } from "../../../providers/local/trust";
import { NoteLink } from "../../note-link";
import Timestamp from "../../timestamp";
import { getSharableEventAddress } from "../../../helpers/nip19";

@ -1,7 +1,7 @@
import { Card, CardProps, Flex, LinkBox, Spacer, Text } from "@chakra-ui/react";
import { NostrEvent } from "../../../types/nostr-event";
import { TrustProvider } from "../../../providers/trust";
import { TrustProvider } from "../../../providers/local/trust";
import UserAvatarLink from "../../user-avatar-link";
import UserLink from "../../user-link";
import Timestamp from "../../timestamp";

@ -8,7 +8,7 @@ import UserLink from "../../user-link";
import UserAvatar from "../../user-avatar";
import useEventNaddr from "../../../hooks/use-event-naddr";
import Timestamp from "../../timestamp";
import { useBreakpointValue } from "../../../providers/breakpoint-provider";
import { useBreakpointValue } from "../../../providers/global/breakpoint-provider";
export default function EmbeddedStream({ event, ...props }: Omit<CardProps, "children"> & { event: NostrEvent }) {
const stream = parseStreamEvent(event);

@ -7,7 +7,7 @@ import UserLink from "../../user-link";
import useSubject from "../../../hooks/use-subject";
import appSettings from "../../../services/settings/app-settings";
import EventVerificationIcon from "../../event-verification-icon";
import { TrustProvider } from "../../../providers/trust";
import { TrustProvider } from "../../../providers/local/trust";
import Timestamp from "../../timestamp";
import { getNeventForEventId } from "../../../helpers/nip19";
import { CompactNoteContent } from "../../compact-note-content";

@ -2,7 +2,7 @@ import { MouseEventHandler, MutableRefObject, forwardRef, useCallback, useMemo,
import { Image, ImageProps, Link, LinkProps } from "@chakra-ui/react";
import appSettings from "../../services/settings/app-settings";
import { useTrusted } from "../../providers/trust";
import { useTrusted } from "../../providers/local/trust";
import { EmbedableContent, defaultGetLocation } from "../../helpers/embeds";
import { getMatchLink } from "../../helpers/regexp";
import { useRegisterSlide } from "../lightbox-provider";
@ -10,7 +10,7 @@ import { isImageURL } from "../../helpers/url";
import PhotoGallery, { PhotoWithoutSize } from "../photo-gallery";
import { NostrEvent } from "../../types/nostr-event";
import useAppSettings from "../../hooks/use-app-settings";
import { useBreakpointValue } from "../../providers/breakpoint-provider";
import { useBreakpointValue } from "../../providers/global/breakpoint-provider";
import useElementBlur from "../../hooks/use-element-blur";
export type TrustImageProps = ImageProps;

@ -2,7 +2,7 @@ import styled from "@emotion/styled";
import { isVideoURL } from "../../helpers/url";
import useAppSettings from "../../hooks/use-app-settings";
import useElementBlur from "../../hooks/use-element-blur";
import { useTrusted } from "../../providers/trust";
import { useTrusted } from "../../providers/local/trust";
const StyledVideo = styled.video`
max-width: 30rem;

@ -3,7 +3,7 @@ import { useToast } from "@chakra-ui/react";
import { ReactionGroup, draftEventReaction } from "../../helpers/nostr/reactions";
import useCurrentAccount from "../../hooks/use-current-account";
import { useSigningContext } from "../../providers/signing-provider";
import { useSigningContext } from "../../providers/global/signing-provider";
import { NostrEvent } from "../../types/nostr-event";
import clientRelaysService from "../../services/client-relays";
import NostrPublishAction from "../../classes/nostr-publish-action";

@ -7,7 +7,7 @@ import useCurrentAccount from "../../hooks/use-current-account";
import AccountSwitcher from "./account-switcher";
import PublishLog from "../publish-log";
import NavItems from "./nav-items";
import { PostModalContext } from "../../providers/post-modal-provider";
import { PostModalContext } from "../../providers/route/post-modal-provider";
import { WritingIcon } from "../icons";
const hideScrollbar = css`

@ -9,7 +9,7 @@ import MobileBottomNav from "./mobile-bottom-nav";
import useSubject from "../../hooks/use-subject";
import accountService from "../../services/account";
import GhostToolbar from "./ghost-toolbar";
import { useBreakpointValue } from "../../providers/breakpoint-provider";
import { useBreakpointValue } from "../../providers/global/breakpoint-provider";
import SearchModal from "../search-modal";
import { useLocation } from "react-router-dom";

@ -3,7 +3,7 @@ import { useContext, useEffect } from "react";
import { useLocation, useNavigate } from "react-router-dom";
import useCurrentAccount from "../../hooks/use-current-account";
import { PostModalContext } from "../../providers/post-modal-provider";
import { PostModalContext } from "../../providers/route/post-modal-provider";
import { DirectMessagesIcon, NotesIcon, NotificationsIcon, PlusCircleIcon, SearchIcon } from "../icons";
import UserAvatar from "../user-avatar";
import MobileSideDrawer from "./mobile-side-drawer";

@ -9,8 +9,8 @@ import "@webscopeio/react-textarea-autocomplete/style.css";
import { nip19 } from "nostr-tools";
import { matchSorter } from "match-sorter/dist/match-sorter.esm.js";
import { Emoji, useContextEmojis } from "../providers/emoji-provider";
import { useUserSearchDirectoryContext } from "../providers/user-directory-provider";
import { Emoji, useContextEmojis } from "../providers/global/emoji-provider";
import { useUserSearchDirectoryContext } from "../providers/global/user-directory-provider";
import UserAvatar from "./user-avatar";
import { UserDnsIdentityIcon } from "./user-dns-identity-icon";

@ -4,7 +4,7 @@ import useCurrentAccount from "../hooks/use-current-account";
import { NostrEvent } from "../types/nostr-event";
import UserAvatar from "./user-avatar";
import MessageBubble, { MessageBubbleProps } from "./message-bubble";
import { useThreadsContext } from "../providers/thread-provider";
import { useThreadsContext } from "../providers/local/thread-provider";
import ThreadButton from "../views/dms/components/thread-button";
function MessageBubbleWithThread({ message, showThreadButton = true, ...props }: MessageBubbleProps) {

@ -2,7 +2,7 @@ import { ReactNode, useRef } from "react";
import { ButtonGroup, Card, CardBody, CardFooter, CardHeader, CardProps } from "@chakra-ui/react";
import { NostrEvent } from "../types/nostr-event";
import { useRegisterIntersectionEntity } from "../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../providers/local/intersection-observer";
import { getEventUID } from "../helpers/nostr/events";
import Timestamp from "./timestamp";
import NoteZapButton from "./note/note-zap-button";

@ -12,7 +12,7 @@ import {
} from "@chakra-ui/react";
import useEventReactions from "../../../hooks/use-event-reactions";
import { useSigningContext } from "../../../providers/signing-provider";
import { useSigningContext } from "../../../providers/global/signing-provider";
import clientRelaysService from "../../../services/client-relays";
import eventReactionsService from "../../../services/event-reactions";
import { NostrEvent } from "../../../types/nostr-event";

@ -15,7 +15,7 @@ import {
import dayjs from "dayjs";
import useCurrentAccount from "../../../hooks/use-current-account";
import { useSigningContext } from "../../../providers/signing-provider";
import { useSigningContext } from "../../../providers/global/signing-provider";
import useUserLists from "../../../hooks/use-user-lists";
import {
NOTE_LIST_KIND,

@ -4,7 +4,7 @@ import { NostrEvent } from "../../../types/nostr-event";
import AddReactionButton from "./add-reaction-button";
import EventReactionButtons from "../../event-reactions/event-reactions";
import useEventReactions from "../../../hooks/use-event-reactions";
import { useBreakpointValue } from "../../../providers/breakpoint-provider";
import { useBreakpointValue } from "../../../providers/global/breakpoint-provider";
export default function NoteReactions({ event, ...props }: Omit<ButtonGroupProps, "children"> & { event: NostrEvent }) {
const reactions = useEventReactions(event.id) ?? [];

@ -3,7 +3,7 @@ import { ButtonProps, IconButton } from "@chakra-ui/react";
import { NostrEvent } from "../../../types/nostr-event";
import { QuoteRepostIcon } from "../../icons";
import { PostModalContext } from "../../../providers/post-modal-provider";
import { PostModalContext } from "../../../providers/route/post-modal-provider";
import { getSharableEventAddress } from "../../../helpers/nip19";
export type QuoteRepostButtonProps = Omit<ButtonProps, "children" | "onClick"> & {

@ -21,7 +21,7 @@ import { DraftNostrEvent, NostrEvent } from "../../../types/nostr-event";
import { EmbedEvent } from "../../embed-event";
import NostrPublishAction from "../../../classes/nostr-publish-action";
import clientRelaysService from "../../../services/client-relays";
import { useSigningContext } from "../../../providers/signing-provider";
import { useSigningContext } from "../../../providers/global/signing-provider";
import { ChevronDownIcon, ChevronUpIcon, ExternalLinkIcon } from "../../icons";
import useUserCommunitiesList from "../../../hooks/use-user-communities-list";
import useCurrentAccount from "../../../hooks/use-current-account";

@ -22,7 +22,7 @@ import NoteMenu from "./note-menu";
import UserLink from "../user-link";
import { UserDnsIdentityIcon } from "../user-dns-identity-icon";
import NoteZapButton from "./note-zap-button";
import { ExpandProvider } from "../../providers/expanded";
import { ExpandProvider } from "../../providers/local/expanded";
import useSubject from "../../hooks/use-subject";
import appSettings from "../../services/settings/app-settings";
import EventVerificationIcon from "../event-verification-icon";
@ -30,8 +30,8 @@ import RepostButton from "./components/repost-button";
import QuoteRepostButton from "./components/quote-repost-button";
import { ReplyIcon } from "../icons";
import NoteContentWithWarning from "./note-content-with-warning";
import { TrustProvider } from "../../providers/trust";
import { useRegisterIntersectionEntity } from "../../providers/intersection-observer";
import { TrustProvider } from "../../providers/local/trust";
import { useRegisterIntersectionEntity } from "../../providers/local/intersection-observer";
import BookmarkButton from "./components/bookmark-button";
import useCurrentAccount from "../../hooks/use-current-account";
import NoteReactions from "./components/note-reactions";
@ -40,7 +40,7 @@ import { getReferences } from "../../helpers/nostr/events";
import Timestamp from "../timestamp";
import OpenInDrawerButton from "../open-in-drawer-button";
import { getSharableEventAddress } from "../../helpers/nip19";
import { useBreakpointValue } from "../../providers/breakpoint-provider";
import { useBreakpointValue } from "../../providers/global/breakpoint-provider";
import HoverLinkOverlay from "../hover-link-overlay";
import NoteCommunityMetadata from "./note-community-metadata";
import useSingleEvent from "../../hooks/use-single-event";

@ -1,7 +1,7 @@
import { NostrEvent } from "../../types/nostr-event";
import { NoteContents } from "./text-note-contents";
import { useExpand } from "../../providers/expanded";
import { useExpand } from "../../providers/local/expanded";
import SensitiveContentWarning from "../sensitive-content-warning";
import useAppSettings from "../../hooks/use-app-settings";

@ -5,7 +5,7 @@ import { NostrEvent } from "../../types/nostr-event";
import useSubject from "../../hooks/use-subject";
import { RelayIconStack, RelayIconStackProps } from "../relay-icon-stack";
import { getEventUID } from "../../helpers/nostr/events";
import { useBreakpointValue } from "../../providers/breakpoint-provider";
import { useBreakpointValue } from "../../providers/global/breakpoint-provider";
export type NoteRelaysProps = {
event: NostrEvent;

@ -3,7 +3,7 @@ import { forwardRef } from "react";
import { useAsync } from "react-use";
import { nip19 } from "nostr-tools";
import { useUserSearchDirectoryContext } from "../providers/user-directory-provider";
import { useUserSearchDirectoryContext } from "../providers/global/user-directory-provider";
import userMetadataService from "../services/user-metadata";
import { getUserDisplayName } from "../helpers/user-metadata";

@ -12,7 +12,7 @@ import {
Text,
} from "@chakra-ui/react";
import useOpenGraphData from "../hooks/use-open-graph-data";
import { useBreakpointValue } from "../providers/breakpoint-provider";
import { useBreakpointValue } from "../providers/global/breakpoint-provider";
export default function OpenGraphCard({ url, ...props }: { url: URL } & Omit<CardProps, "children">) {
const { value: data } = useOpenGraphData(url);

@ -9,7 +9,7 @@ import {
MenuOptionGroup,
} from "@chakra-ui/react";
import { usePeopleListContext } from "../../providers/people-list-provider";
import { usePeopleListContext } from "../../providers/local/people-list-provider";
import useUserLists from "../../hooks/use-user-lists";
import useCurrentAccount from "../../hooks/use-current-account";
import { PEOPLE_LIST_KIND, getListName } from "../../helpers/nostr/lists";

@ -25,10 +25,10 @@ import { Kind } from "nostr-tools";
import { ChevronDownIcon, ChevronUpIcon, UploadImageIcon } from "../icons";
import NostrPublishAction from "../../classes/nostr-publish-action";
import { useWriteRelayUrls } from "../../hooks/use-client-relays";
import { useSigningContext } from "../../providers/signing-provider";
import { useSigningContext } from "../../providers/global/signing-provider";
import { NoteContents } from "../note/text-note-contents";
import { PublishDetails } from "../publish-details";
import { TrustProvider } from "../../providers/trust";
import { TrustProvider } from "../../providers/local/trust";
import {
correctContentMentions,
createEmojiTags,
@ -39,13 +39,13 @@ import {
} from "../../helpers/nostr/post";
import { UserAvatarStack } from "../compact-user-stack";
import MagicTextArea, { RefType } from "../magic-textarea";
import { useContextEmojis } from "../../providers/emoji-provider";
import { useContextEmojis } from "../../providers/global/emoji-provider";
import CommunitySelect from "./community-select";
import ZapSplitCreator, { fillRemainingPercent } from "./zap-split-creator";
import { EventSplit } from "../../helpers/nostr/zaps";
import useCurrentAccount from "../../hooks/use-current-account";
import useCacheForm from "../../hooks/use-cache-form";
import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import { useTextAreaUploadFileWithForm } from "../../hooks/use-textarea-upload-file";
import { useThrottle } from "react-use";

@ -1,7 +1,7 @@
import { Button, ButtonProps, useDisclosure } from "@chakra-ui/react";
import { RelayIcon } from "../icons";
import { useRelaySelectionContext } from "../../providers/relay-selection-provider";
import { useRelaySelectionContext } from "../../providers/local/relay-selection-provider";
import RelaySelectionModal from "./relay-selection-modal";
export default function RelaySelectionButton({ ...props }: ButtonProps) {

@ -5,7 +5,7 @@ import { useAsync, useThrottle } from "react-use";
import { matchSorter } from "match-sorter";
import { nip19 } from "nostr-tools";
import { useUserSearchDirectoryContext } from "../../providers/user-directory-provider";
import { useUserSearchDirectoryContext } from "../../providers/global/user-directory-provider";
import UserAvatar from "../user-avatar";
import { useUserMetadata } from "../../hooks/use-user-metadata";
import { getUserDisplayName } from "../../helpers/user-metadata";

@ -1,7 +1,7 @@
import { Alert, AlertDescription, AlertIcon, AlertProps, AlertTitle, Button, Spacer } from "@chakra-ui/react";
import { useExpand } from "../providers/expanded";
import { useBreakpointValue } from "../providers/breakpoint-provider";
import { useExpand } from "../providers/local/expanded";
import { useBreakpointValue } from "../providers/global/breakpoint-provider";
export default function SensitiveContentWarning({ description }: { description?: string } & AlertProps) {
const expand = useExpand();

@ -3,7 +3,7 @@ import { Box } from "@chakra-ui/react";
import { NostrEvent } from "../../../types/nostr-event";
import EmbeddedArticle from "../../embed-event/event-types/embedded-article";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import { getEventUID } from "../../../helpers/nostr/events";
function ArticleNote({ article }: { article: NostrEvent }) {

@ -10,7 +10,7 @@ import ArticleNote from "./article-note";
import StreamNote from "./stream-note";
import RelayRecommendation from "./relay-recommendation";
import BadgeAwardCard from "../../../views/badges/components/badge-award-card";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import { getEventUID, isReply } from "../../../helpers/nostr/events";
import { STREAM_KIND } from "../../../helpers/nostr/stream";
import { NostrEvent } from "../../../types/nostr-event";

@ -8,7 +8,10 @@ import useSubject from "../../../hooks/use-subject";
import TimelineLoader from "../../../classes/timeline-loader";
import { NostrEvent } from "../../../types/nostr-event";
import { getEventUID } from "../../../helpers/nostr/events";
import { ExtendedIntersectionObserverEntry, useIntersectionObserver } from "../../../providers/intersection-observer";
import {
ExtendedIntersectionObserverEntry,
useIntersectionObserver,
} from "../../../providers/local/intersection-observer";
import GenericTimelineNote from "./generic-timeline-note";
const NOTE_BUFFER = 5;

@ -6,7 +6,7 @@ import UserAvatar from "../../user-avatar";
import UserLink from "../../user-link";
import RelayCard from "../../../views/relays/components/relay-card";
import { safeRelayUrl } from "../../../helpers/url";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
export default function RelayRecommendation({ event }: { event: NostrEvent }) {
const safeUrl = safeRelayUrl(event.content);

@ -1,7 +1,7 @@
import { memo, useRef } from "react";
import { NostrEvent } from "../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import Note from "../../note";
function ReplyNote({ event }: { event: NostrEvent }) {

@ -9,9 +9,9 @@ import NoteMenu from "../../note/note-menu";
import UserAvatar from "../../user-avatar";
import { UserDnsIdentityIcon } from "../../user-dns-identity-icon";
import UserLink from "../../user-link";
import { TrustProvider } from "../../../providers/trust";
import { TrustProvider } from "../../../providers/local/trust";
import { useReadRelayUrls } from "../../../hooks/use-client-relays";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import useSingleEvent from "../../../hooks/use-single-event";
import { EmbedEvent } from "../../embed-event";
import useUserMuteFilter from "../../../hooks/use-user-mute-filter";

@ -19,7 +19,7 @@ import { Link as RouterLink } from "react-router-dom";
import { NostrEvent } from "../../../types/nostr-event";
import { parseStreamEvent } from "../../../helpers/nostr/stream";
import useEventNaddr from "../../../hooks/use-event-naddr";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import UserAvatar from "../../user-avatar";
import UserLink from "../../user-link";
import StreamStatusBadge from "../../../views/streams/components/status-badge";

@ -2,7 +2,7 @@ import { useCallback } from "react";
import { Flex, FlexProps } from "@chakra-ui/react";
import { useSearchParams } from "react-router-dom";
import IntersectionObserverProvider from "../../providers/intersection-observer";
import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import GenericNoteTimeline from "./generic-note-timeline";
import MediaTimeline from "./media-timeline";
import TimelineLoader from "../../classes/timeline-loader";

@ -8,12 +8,12 @@ import { getMatchLink } from "../../../helpers/regexp";
import { LightboxProvider } from "../../lightbox-provider";
import { isImageURL } from "../../../helpers/url";
import { EmbeddedImageProps, GalleryImage } from "../../embed-types";
import { TrustProvider } from "../../../providers/trust";
import { TrustProvider } from "../../../providers/local/trust";
import PhotoGallery, { PhotoWithoutSize } from "../../photo-gallery";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import { NostrEvent } from "../../../types/nostr-event";
import { getEventUID } from "../../../helpers/nostr/events";
import { useBreakpointValue } from "../../../providers/breakpoint-provider";
import { useBreakpointValue } from "../../../providers/global/breakpoint-provider";
function CustomGalleryImage({ event, ...props }: EmbeddedImageProps & { event: NostrEvent }) {
const ref = useRef<HTMLImageElement | null>(null);

@ -19,7 +19,7 @@ import TimelineLoader from "../../../classes/timeline-loader";
import useSubject from "../../../hooks/use-subject";
import { getEventRelays, handleEventFromRelay } from "../../../services/event-relays";
import { NostrEvent } from "../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import { RelayFavicon } from "../../relay-favicon";
import { NoteLink } from "../../note-link";
import NostrPublishAction from "../../../classes/nostr-publish-action";

@ -26,7 +26,7 @@ import {
isPubkeyInList,
} from "../helpers/nostr/lists";
import { getEventCoordinate } from "../helpers/nostr/events";
import { useSigningContext } from "../providers/signing-provider";
import { useSigningContext } from "../providers/global/signing-provider";
import NostrPublishAction from "../classes/nostr-publish-action";
import clientRelaysService from "../services/client-relays";
import useUserContactList from "../hooks/use-user-contact-list";
@ -34,7 +34,7 @@ import replaceableEventLoaderService from "../services/replaceable-event-request
import useAsyncErrorHandler from "../hooks/use-async-error-handler";
import NewListModal from "../views/lists/components/new-list-modal";
import useUserMuteFunctions from "../hooks/use-user-mute-functions";
import { useMuteModalContext } from "../providers/mute-modal-provider";
import { useMuteModalContext } from "../providers/route/mute-modal-provider";
function UsersLists({ pubkey }: { pubkey: string }) {
const toast = useToast();

@ -2,7 +2,7 @@ import { DraftNostrEvent, NostrEvent, Tag } from "../../types/nostr-event";
import { getMatchEmoji, getMatchHashtag } from "../regexp";
import { getReferences } from "./events";
import { getPubkeyFromDecodeResult, safeDecode } from "../nip19";
import { Emoji } from "../../providers/emoji-provider";
import { Emoji } from "../../providers/global/emoji-provider";
import { EventSplit } from "./zaps";
import { unique } from "../array";
import relayHintService from "../../services/event-relay-hint";

@ -3,7 +3,7 @@ import { useToast } from "@chakra-ui/react";
import { nostrBuildUploadImage } from "../helpers/nostr-build";
import { RefType } from "../components/magic-textarea";
import { useSigningContext } from "../providers/signing-provider";
import { useSigningContext } from "../providers/global/signing-provider";
import { UseFormGetValues, UseFormSetValue } from "react-hook-form";
export function useTextAreaUploadFileWithForm(

@ -1,6 +1,6 @@
import { useInterval } from "react-use";
import TimelineLoader from "../classes/timeline-loader";
import { useIntersectionMapCallback } from "../providers/intersection-observer";
import { useIntersectionMapCallback } from "../providers/local/intersection-observer";
import { NostrEvent } from "../types/nostr-event";
export function useTimelineCurserIntersectionCallback(timeline: TimelineLoader) {

@ -7,7 +7,7 @@ import {
muteListRemovePubkey,
pruneExpiredPubkeys,
} from "../helpers/nostr/mute-list";
import { useSigningContext } from "../providers/signing-provider";
import { useSigningContext } from "../providers/global/signing-provider";
import clientRelaysService from "../services/client-relays";
import replaceableEventLoaderService from "../services/replaceable-event-requester";
import useAsyncErrorHandler from "./use-async-error-handler";

@ -1,7 +1,7 @@
import "./polyfill";
import { createRoot } from "react-dom/client";
import { App } from "./app";
import { GlobalProviders } from "./providers";
import { GlobalProviders } from "./providers/global";
// setup dayjs
import dayjs from "dayjs";

@ -28,8 +28,8 @@ import { Location, RouteObject, RouterProvider, To, createMemoryRouter, useNavig
import { ErrorBoundary } from "../components/error-boundary";
import ThreadView from "../views/thread";
import { ChevronLeftIcon, ChevronRightIcon, ExternalLinkIcon } from "../components/icons";
import { PageProviders } from ".";
import { logger } from "../helpers/debug";
import { RouteProviders } from "./route";
const TorrentDetailsView = lazy(() => import("../views/torrents/torrent"));
@ -68,17 +68,15 @@ function DrawerSubView({
<DrawerBody px="2" pb="2" pt="0">
<ErrorBoundary>
<IsInDrawerContext.Provider value={true}>
<PageProviders>
<Suspense
fallback={
<Heading size="md" mx="auto" my="4">
<Spinner /> Loading page
</Heading>
}
>
<RouterProvider router={router} />
</Suspense>
</PageProviders>
<Suspense
fallback={
<Heading size="md" mx="auto" my="4">
<Spinner /> Loading page
</Heading>
}
>
<RouterProvider router={router} />
</Suspense>
</IsInDrawerContext.Provider>
</ErrorBoundary>
</DrawerBody>
@ -90,11 +88,19 @@ function DrawerSubView({
const routes: RouteObject[] = [
{
path: "/n/:id",
element: <ThreadView />,
element: (
<RouteProviders>
<ThreadView />
</RouteProviders>
),
},
{
path: "/torrents/:id",
element: <TorrentDetailsView />,
element: (
<RouteProviders>
<TorrentDetailsView />
</RouteProviders>
),
},
];

@ -1,10 +1,10 @@
import { PropsWithChildren, createContext, useCallback, useContext, useMemo, useRef } from "react";
import { nanoid } from "nanoid";
import Subject from "../classes/subject";
import Subject from "../../classes/subject";
import { useSigningContext } from "./signing-provider";
import useSubject from "../hooks/use-subject";
import createDefer, { Deferred } from "../classes/deferred";
import useSubject from "../../hooks/use-subject";
import createDefer, { Deferred } from "../../classes/deferred";
class DecryptionContainer {
id = nanoid();

@ -1,11 +1,11 @@
import { PropsWithChildren, createContext, useContext } from "react";
import { lib } from "emojilib";
import useReplaceableEvents from "../hooks/use-replaceable-events";
import useCurrentAccount from "../hooks/use-current-account";
import { isEmojiTag } from "../types/nostr-event";
import useFavoriteEmojiPacks from "../hooks/use-favorite-emoji-packs";
import { getPackCordsFromFavorites } from "../helpers/nostr/emoji-packs";
import useReplaceableEvents from "../../hooks/use-replaceable-events";
import useCurrentAccount from "../../hooks/use-current-account";
import { isEmojiTag } from "../../types/nostr-event";
import useFavoriteEmojiPacks from "../../hooks/use-favorite-emoji-packs";
import { getPackCordsFromFavorites } from "../../helpers/nostr/emoji-packs";
const defaultEmojis = Object.entries(lib).map(([name, emojiObject]) => ({
...emojiObject,

@ -0,0 +1,38 @@
import React, { PropsWithChildren, useMemo } from "react";
import { ChakraProvider, localStorageManager } from "@chakra-ui/react";
import { SigningProvider } from "./signing-provider";
import buildTheme from "../../theme";
import useAppSettings from "../../hooks/use-app-settings";
import NotificationTimelineProvider from "./notification-timeline";
import { DefaultEmojiProvider, UserEmojiProvider } from "./emoji-provider";
import { AllUserSearchDirectoryProvider } from "./user-directory-provider";
import BreakpointProvider from "./breakpoint-provider";
import DecryptionProvider from "./dycryption-provider";
// Top level providers, should be render as close to the root as possible
export const GlobalProviders = ({ children }: { children: React.ReactNode }) => {
const { theme: themeName, primaryColor, maxPageWidth } = useAppSettings();
const theme = useMemo(
() => buildTheme(themeName, primaryColor, maxPageWidth !== "none" ? maxPageWidth : undefined),
[themeName, primaryColor, maxPageWidth],
);
return (
<ChakraProvider theme={theme} colorModeManager={localStorageManager}>
<BreakpointProvider>
<SigningProvider>
<DecryptionProvider>
<NotificationTimelineProvider>
<DefaultEmojiProvider>
<UserEmojiProvider>
<AllUserSearchDirectoryProvider>{children}</AllUserSearchDirectoryProvider>
</UserEmojiProvider>
</DefaultEmojiProvider>
</NotificationTimelineProvider>
</DecryptionProvider>
</SigningProvider>
</BreakpointProvider>
</ChakraProvider>
);
};

@ -1,13 +1,13 @@
import { PropsWithChildren, createContext, useCallback, useContext, useMemo } from "react";
import { Kind } from "nostr-tools";
import { useReadRelayUrls } from "../hooks/use-client-relays";
import useCurrentAccount from "../hooks/use-current-account";
import TimelineLoader from "../classes/timeline-loader";
import { NostrEvent } from "../types/nostr-event";
import useClientSideMuteFilter from "../hooks/use-client-side-mute-filter";
import useTimelineLoader from "../hooks/use-timeline-loader";
import { TORRENT_COMMENT_KIND } from "../helpers/nostr/torrents";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import useCurrentAccount from "../../hooks/use-current-account";
import TimelineLoader from "../../classes/timeline-loader";
import { NostrEvent } from "../../types/nostr-event";
import useClientSideMuteFilter from "../../hooks/use-client-side-mute-filter";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { TORRENT_COMMENT_KIND } from "../../helpers/nostr/torrents";
type NotificationTimelineContextType = {
timeline?: TimelineLoader;

@ -1,9 +1,9 @@
import { useToast } from "@chakra-ui/react";
import React, { useCallback, useContext, useMemo } from "react";
import useSubject from "../hooks/use-subject";
import accountService from "../services/account";
import signingService from "../services/signing";
import { DraftNostrEvent, NostrEvent } from "../types/nostr-event";
import useSubject from "../../hooks/use-subject";
import accountService from "../../services/account";
import signingService from "../../services/signing";
import { DraftNostrEvent, NostrEvent } from "../../types/nostr-event";
export type SigningContextType = {
requestSignature: (draft: DraftNostrEvent) => Promise<NostrEvent>;

@ -1,6 +1,6 @@
import { PropsWithChildren, createContext, useCallback, useContext } from "react";
import db from "../services/db";
import db from "../../services/db";
export type UserDirectory = { pubkey: string; names: [] }[];
export type GetDirectoryFn = () => Promise<UserDirectory> | UserDirectory;

@ -1,57 +0,0 @@
import React, { useMemo } from "react";
import { ChakraProvider, localStorageManager } from "@chakra-ui/react";
import { SigningProvider } from "./signing-provider";
import buildTheme from "../theme";
import useAppSettings from "../hooks/use-app-settings";
import DeleteEventProvider from "./delete-event-provider";
import { InvoiceModalProvider } from "./invoice-modal";
import NotificationTimelineProvider from "./notification-timeline";
import PostModalProvider from "./post-modal-provider";
import { DefaultEmojiProvider, UserEmojiProvider } from "./emoji-provider";
import { AllUserSearchDirectoryProvider } from "./user-directory-provider";
import MuteModalProvider from "./mute-modal-provider";
import BreakpointProvider from "./breakpoint-provider";
import DecryptionProvider from "./dycryption-provider";
// Top level providers, should be render as close to the root as possible
export const GlobalProviders = ({ children }: { children: React.ReactNode }) => {
const { theme: themeName, primaryColor, maxPageWidth } = useAppSettings();
const theme = useMemo(
() => buildTheme(themeName, primaryColor, maxPageWidth !== "none" ? maxPageWidth : undefined),
[themeName, primaryColor, maxPageWidth],
);
return (
<ChakraProvider theme={theme} colorModeManager={localStorageManager}>
{children}
</ChakraProvider>
);
};
/** Providers that provider functionality to pages (needs to be rendered under a router) */
export function PageProviders({ children }: { children: React.ReactNode }) {
return (
<BreakpointProvider>
<SigningProvider>
<DecryptionProvider>
<DeleteEventProvider>
<MuteModalProvider>
<InvoiceModalProvider>
<NotificationTimelineProvider>
<DefaultEmojiProvider>
<UserEmojiProvider>
<AllUserSearchDirectoryProvider>
<PostModalProvider>{children}</PostModalProvider>
</AllUserSearchDirectoryProvider>
</UserEmojiProvider>
</DefaultEmojiProvider>
</NotificationTimelineProvider>
</InvoiceModalProvider>
</MuteModalProvider>
</DeleteEventProvider>
</DecryptionProvider>
</SigningProvider>
</BreakpointProvider>
);
}

@ -1,6 +1,6 @@
import React, { useContext } from "react";
import { unique } from "../helpers/array";
import { safeRelayUrl } from "../helpers/url";
import { unique } from "../../helpers/array";
import { safeRelayUrl } from "../../helpers/url";
export const RelayContext = React.createContext<string[]>([]);

@ -11,7 +11,7 @@ import {
} from "react";
import { useMount, useUnmount } from "react-use";
import Subject from "../classes/subject";
import Subject from "../../classes/subject";
export type ExtendedIntersectionObserverEntry = { entry: IntersectionObserverEntry; id: string | undefined };
export type ExtendedIntersectionObserverCallback = (

@ -1,12 +1,12 @@
import { PropsWithChildren, createContext, useCallback, useContext, useMemo } from "react";
import { Kind } from "nostr-tools";
import useCurrentAccount from "../hooks/use-current-account";
import { getPubkeysFromList } from "../helpers/nostr/lists";
import useReplaceableEvent from "../hooks/use-replaceable-event";
import { NostrEvent } from "../types/nostr-event";
import { NostrQuery } from "../types/nostr-query";
import useRouteSearchValue from "../hooks/use-route-search-value";
import useCurrentAccount from "../../hooks/use-current-account";
import { getPubkeysFromList } from "../../helpers/nostr/lists";
import useReplaceableEvent from "../../hooks/use-replaceable-event";
import { NostrEvent } from "../../types/nostr-event";
import { NostrQuery } from "../../types/nostr-query";
import useRouteSearchValue from "../../hooks/use-route-search-value";
export type ListId = "following" | "global" | string;
export type Person = { pubkey: string; relay?: string };

@ -1,8 +1,8 @@
import { PropsWithChildren, createContext, useCallback, useContext, useMemo } from "react";
import { useLocation, useNavigate } from "react-router-dom";
import { useReadRelayUrls } from "../hooks/use-client-relays";
import { unique } from "../helpers/array";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import { unique } from "../../helpers/array";
type RelaySelectionContextType = {
relays: string[];

@ -1,8 +1,8 @@
import { PropsWithChildren, createContext, useCallback, useContext, useMemo } from "react";
import TimelineLoader from "../classes/timeline-loader";
import { NostrEvent } from "../types/nostr-event";
import useSubject from "../hooks/use-subject";
import TimelineLoader from "../../classes/timeline-loader";
import { NostrEvent } from "../../types/nostr-event";
import useSubject from "../../hooks/use-subject";
export type Thread = {
root?: NostrEvent;

@ -1,8 +1,8 @@
import React, { PropsWithChildren, useContext } from "react";
import { NostrEvent } from "../types/nostr-event";
import useCurrentAccount from "../hooks/use-current-account";
import useUserContactList from "../hooks/use-user-contact-list";
import { getPubkeysFromList } from "../helpers/nostr/lists";
import { NostrEvent } from "../../types/nostr-event";
import useCurrentAccount from "../../hooks/use-current-account";
import useUserContactList from "../../hooks/use-user-contact-list";
import { getPubkeysFromList } from "../../helpers/nostr/lists";
const TrustContext = React.createContext<boolean>(false);

@ -23,18 +23,18 @@ import {
import { Event, Kind } from "nostr-tools";
import dayjs from "dayjs";
import useCurrentAccount from "../hooks/use-current-account";
import signingService from "../services/signing";
import createDefer, { Deferred } from "../classes/deferred";
import useEventRelays from "../hooks/use-event-relays";
import { useWriteRelayUrls } from "../hooks/use-client-relays";
import { RelayFavicon } from "../components/relay-favicon";
import { ExternalLinkIcon } from "../components/icons";
import { getEventCoordinate, getEventUID, isReplaceable } from "../helpers/nostr/events";
import NostrPublishAction from "../classes/nostr-publish-action";
import { Tag } from "../types/nostr-event";
import deleteEventService from "../services/delete-events";
import { EmbedEvent } from "../components/embed-event";
import useCurrentAccount from "../../hooks/use-current-account";
import signingService from "../../services/signing";
import createDefer, { Deferred } from "../../classes/deferred";
import useEventRelays from "../../hooks/use-event-relays";
import { useWriteRelayUrls } from "../../hooks/use-client-relays";
import { RelayFavicon } from "../../components/relay-favicon";
import { ExternalLinkIcon } from "../../components/icons";
import { getEventCoordinate, getEventUID, isReplaceable } from "../../helpers/nostr/events";
import NostrPublishAction from "../../classes/nostr-publish-action";
import { Tag } from "../../types/nostr-event";
import deleteEventService from "../../services/delete-events";
import { EmbedEvent } from "../../components/embed-event";
type DeleteEventContextType = {
isLoading: boolean;

@ -0,0 +1,17 @@
import DeleteEventProvider from "./delete-event-provider";
import InvoiceModalProvider from "./invoice-modal";
import MuteModalProvider from "./mute-modal-provider";
import PostModalProvider from "./post-modal-provider";
/** Providers that provider functionality to pages (needs to be rendered under a router) */
export function RouteProviders({ children }: { children: React.ReactNode }) {
return (
<DeleteEventProvider>
<MuteModalProvider>
<InvoiceModalProvider>
<PostModalProvider>{children}</PostModalProvider>
</InvoiceModalProvider>
</MuteModalProvider>
</DeleteEventProvider>
);
}

@ -1,7 +1,7 @@
import React, { useCallback, useContext, useState } from "react";
import InvoiceModal from "../components/invoice-modal";
import createDefer, { Deferred } from "../classes/deferred";
import appSettings from "../services/settings/app-settings";
import InvoiceModal from "../../components/invoice-modal";
import createDefer, { Deferred } from "../../classes/deferred";
import appSettings from "../../services/settings/app-settings";
export type InvoiceModalContext = {
requestPay: (invoice: string) => Promise<void>;
@ -17,7 +17,7 @@ export function useInvoiceModalContext() {
return useContext(InvoiceModalContext);
}
export const InvoiceModalProvider = ({ children }: { children: React.ReactNode }) => {
export default function InvoiceModalProvider({ children }: { children: React.ReactNode }) {
const [invoice, setInvoice] = useState<string>();
const [defer, setDefer] = useState<Deferred<void>>();
@ -60,4 +60,4 @@ export const InvoiceModalProvider = ({ children }: { children: React.ReactNode }
{invoice && <InvoiceModal isOpen onClose={handleClose} invoice={invoice} onPaid={handlePaid} />}
</InvoiceModalContext.Provider>
);
};
}

@ -21,26 +21,26 @@ import { PropsWithChildren, createContext, useCallback, useContext, useMemo, use
import dayjs from "dayjs";
import { useInterval } from "react-use";
import { getUserDisplayName } from "../helpers/user-metadata";
import { useUserMetadata } from "../hooks/use-user-metadata";
import useCurrentAccount from "../hooks/use-current-account";
import { getUserDisplayName } from "../../helpers/user-metadata";
import { useUserMetadata } from "../../hooks/use-user-metadata";
import useCurrentAccount from "../../hooks/use-current-account";
import {
createEmptyMuteList,
getPubkeysExpiration,
muteListAddPubkey,
muteListRemovePubkey,
pruneExpiredPubkeys,
} from "../helpers/nostr/mute-list";
import { cloneList } from "../helpers/nostr/lists";
import { useSigningContext } from "./signing-provider";
import NostrPublishAction from "../classes/nostr-publish-action";
import clientRelaysService from "../services/client-relays";
import replaceableEventLoaderService from "../services/replaceable-event-requester";
import useUserMuteList from "../hooks/use-user-mute-list";
import { DraftNostrEvent } from "../types/nostr-event";
import UserAvatar from "../components/user-avatar";
import UserLink from "../components/user-link";
import { ChevronDownIcon } from "../components/icons";
} from "../../helpers/nostr/mute-list";
import { cloneList } from "../../helpers/nostr/lists";
import { useSigningContext } from "../global/signing-provider";
import NostrPublishAction from "../../classes/nostr-publish-action";
import clientRelaysService from "../../services/client-relays";
import replaceableEventLoaderService from "../../services/replaceable-event-requester";
import useUserMuteList from "../../hooks/use-user-mute-list";
import { DraftNostrEvent } from "../../types/nostr-event";
import UserAvatar from "../../components/user-avatar";
import UserLink from "../../components/user-link";
import { ChevronDownIcon } from "../../components/icons";
type MuteModalContextType = {
openModal: (pubkey: string) => void;

@ -1,7 +1,7 @@
import React, { PropsWithChildren, useCallback, useMemo, useState } from "react";
import { useDisclosure } from "@chakra-ui/react";
import { ErrorBoundary } from "../components/error-boundary";
import PostModal, { PostModalProps } from "../components/post-modal";
import { ErrorBoundary } from "../../components/error-boundary";
import PostModal, { PostModalProps } from "../../components/post-modal";
export type PostModalContextType = {
openModal: (props?: PostModalProps) => void;

@ -1,9 +1,8 @@
import { Link, useLocation } from "react-router-dom";
import useSubject from "../hooks/use-subject";
import accountService from "../services/account";
import useSubject from "../../hooks/use-subject";
import accountService from "../../services/account";
import { Button, Flex, Heading, Spinner, Text } from "@chakra-ui/react";
import { deleteDatabase } from "../services/db";
import { ExternalLinkIcon } from "../components/icons";
import { deleteDatabase } from "../../services/db";
export default function RequireCurrentAccount({ children }: { children: JSX.Element }) {
let location = useLocation();

@ -23,7 +23,7 @@ import { getBadgeAwardPubkeys, getBadgeDescription, getBadgeImage, getBadgeName
import BadgeMenu from "./components/badge-menu";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import IntersectionObserverProvider from "../../providers/intersection-observer";
import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import useSubject from "../../hooks/use-subject";
import { NostrEvent } from "../../types/nostr-event";

@ -1,11 +1,11 @@
import { Flex, SimpleGrid } from "@chakra-ui/react";
import { Kind } from "nostr-tools";
import PeopleListProvider, { usePeopleListContext } from "../../providers/people-list-provider";
import PeopleListProvider, { usePeopleListContext } from "../../providers/local/people-list-provider";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import IntersectionObserverProvider from "../../providers/intersection-observer";
import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import useSubject from "../../hooks/use-subject";
import { getEventUID } from "../../helpers/nostr/events";

@ -5,7 +5,7 @@ import { Link as RouterLink } from "react-router-dom";
import { getBadgeAwardBadge, getBadgeAwardPubkeys, getBadgeImage, getBadgeName } from "../../../helpers/nostr/badges";
import useReplaceableEvent from "../../../hooks/use-replaceable-event";
import { NostrEvent } from "../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import { getEventUID } from "../../../helpers/nostr/events";
import { getSharableEventAddress } from "../../../helpers/nip19";
import UserLink from "../../../components/user-link";

@ -6,7 +6,7 @@ import UserAvatarLink from "../../../components/user-avatar-link";
import UserLink from "../../../components/user-link";
import { getSharableEventAddress } from "../../../helpers/nip19";
import { NostrEvent } from "../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import { getEventCoordinate, getEventUID } from "../../../helpers/nostr/events";
import BadgeMenu from "./badge-menu";
import { getBadgeImage, getBadgeName } from "../../../helpers/nostr/badges";

@ -5,7 +5,7 @@ import { CustomMenuIconButton, MenuIconButtonProps } from "../../../components/m
import useCurrentAccount from "../../../hooks/use-current-account";
import NoteDebugModal from "../../../components/debug-modals/note-debug-modal";
import { CodeIcon, TrashIcon } from "../../../components/icons";
import { useDeleteEventContext } from "../../../providers/delete-event-provider";
import { useDeleteEventContext } from "../../../providers/route/delete-event-provider";
import OpenInAppMenuItem from "../../../components/common-menu-items/open-in-app";
import CopyEmbedCodeMenuItem from "../../../components/common-menu-items/copy-embed-code";

@ -6,11 +6,11 @@ import { Kind } from "nostr-tools";
import { ExternalLinkIcon } from "../../components/icons";
import VerticalPageLayout from "../../components/vertical-page-layout";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import PeopleListProvider, { usePeopleListContext } from "../../providers/people-list-provider";
import PeopleListProvider, { usePeopleListContext } from "../../providers/local/people-list-provider";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import useSubject from "../../hooks/use-subject";
import IntersectionObserverProvider from "../../providers/intersection-observer";
import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import BadgeAwardCard from "./components/badge-award-card";
import { ErrorBoundary } from "../../components/error-boundary";

@ -7,7 +7,7 @@ import useSingleEvent from "../../hooks/use-single-event";
import { ErrorBoundary } from "../../components/error-boundary";
import { NostrEvent } from "../../types/nostr-event";
import useChannelMetadata from "../../hooks/use-channel-metadata";
import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/relay-selection-provider";
import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/local/relay-selection-provider";
import { ChevronLeftIcon } from "../../components/icons";
import RelaySelectionButton from "../../components/relay-selection/relay-selection-button";
import ChannelMetadataDrawer from "./components/channel-metadata-drawer";
@ -16,8 +16,8 @@ import ChannelMenu from "./components/channel-menu";
import useClientSideMuteFilter from "../../hooks/use-client-side-mute-filter";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import IntersectionObserverProvider from "../../providers/intersection-observer";
import ThreadsProvider from "../../providers/thread-provider";
import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import ThreadsProvider from "../../providers/local/thread-provider";
import TimelineLoader from "../../classes/timeline-loader";
import useSubject from "../../hooks/use-subject";
import { groupMessages } from "../../helpers/nostr/dms";

@ -18,7 +18,7 @@ import {
import useChannelMetadata from "../../../hooks/use-channel-metadata";
import { NostrEvent } from "../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import HoverLinkOverlay from "../../../components/hover-link-overlay";
import UserAvatarLink from "../../../components/user-avatar-link";
import UserLink from "../../../components/user-link";

@ -5,7 +5,7 @@ import { Button, ButtonProps, useToast } from "@chakra-ui/react";
import { DraftNostrEvent, NostrEvent } from "../../../types/nostr-event";
import useCurrentAccount from "../../../hooks/use-current-account";
import { CHANNELS_LIST_KIND, listAddEvent, listRemoveEvent } from "../../../helpers/nostr/lists";
import { useSigningContext } from "../../../providers/signing-provider";
import { useSigningContext } from "../../../providers/global/signing-provider";
import NostrPublishAction from "../../../classes/nostr-publish-action";
import clientRelaysService from "../../../services/client-relays";
import useUserChannelsList from "../../../hooks/use-user-channels-list";

@ -2,7 +2,7 @@ import { memo, useMemo } from "react";
import { Box, BoxProps } from "@chakra-ui/react";
import { NostrEvent } from "../../../types/nostr-event";
import { TrustProvider } from "../../../providers/trust";
import { TrustProvider } from "../../../providers/local/trust";
import { EmbedableContent, embedUrls } from "../../../helpers/embeds";
import {
embedCashuTokens,

@ -21,11 +21,11 @@ import useChannelMetadata from "../../../hooks/use-channel-metadata";
import useTimelineLoader from "../../../hooks/use-timeline-loader";
import useSubject from "../../../hooks/use-subject";
import { useTimelineCurserIntersectionCallback } from "../../../hooks/use-timeline-cursor-intersection-callback";
import IntersectionObserverProvider from "../../../providers/intersection-observer";
import IntersectionObserverProvider from "../../../providers/local/intersection-observer";
import UserLink from "../../../components/user-link";
import HoverLinkOverlay from "../../../components/hover-link-overlay";
import UserAvatar from "../../../components/user-avatar";
import { useRelaySelectionContext } from "../../../providers/relay-selection-provider";
import { useRelaySelectionContext } from "../../../providers/local/relay-selection-provider";
import { UserDnsIdentityIcon } from "../../../components/user-dns-identity-icon";
import ChannelJoinButton from "./channel-join-button";
import { ExternalLinkIcon } from "../../../components/icons";

@ -4,14 +4,14 @@ import dayjs from "dayjs";
import { Kind } from "nostr-tools";
import { Button, Flex, FlexProps, Heading, useToast } from "@chakra-ui/react";
import { useSigningContext } from "../../../providers/signing-provider";
import { useSigningContext } from "../../../providers/global/signing-provider";
import MagicTextArea, { RefType } from "../../../components/magic-textarea";
import { useTextAreaUploadFileWithForm } from "../../../hooks/use-textarea-upload-file";
import clientRelaysService from "../../../services/client-relays";
import { DraftNostrEvent, NostrEvent } from "../../../types/nostr-event";
import NostrPublishAction from "../../../classes/nostr-publish-action";
import { createEmojiTags, ensureNotifyPubkeys, getContentMentions } from "../../../helpers/nostr/post";
import { useContextEmojis } from "../../../providers/emoji-provider";
import { useContextEmojis } from "../../../providers/global/emoji-provider";
export default function ChannelMessageForm({
channel,

@ -3,17 +3,17 @@ import { Box, Card, CardBody, CardHeader, Flex, LinkBox, Text } from "@chakra-ui
import { Link as RouterLink } from "react-router-dom";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/relay-selection-provider";
import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/local/relay-selection-provider";
import useSubject from "../../hooks/use-subject";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import VerticalPageLayout from "../../components/vertical-page-layout";
import IntersectionObserverProvider from "../../providers/intersection-observer";
import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import { NostrEvent } from "../../types/nostr-event";
import { ErrorBoundary } from "../../components/error-boundary";
import RelaySelectionButton from "../../components/relay-selection/relay-selection-button";
import { useCallback, useRef } from "react";
import useClientSideMuteFilter from "../../hooks/use-client-side-mute-filter";
import PeopleListProvider, { usePeopleListContext } from "../../providers/people-list-provider";
import PeopleListProvider, { usePeopleListContext } from "../../providers/local/people-list-provider";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
import ChannelCard from "./components/channel-card";

@ -16,7 +16,7 @@ import {
} from "@chakra-ui/react";
import { NostrEvent } from "../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import { getEventUID } from "../../../helpers/nostr/events";
import { getCommunityImage, getCommunityName } from "../../../helpers/nostr/communities";
import UserAvatarLink from "../../../components/user-avatar-link";

@ -34,7 +34,7 @@ import UserLink from "../../../components/user-link";
import { TrashIcon } from "../../../components/icons";
import Upload01 from "../../../components/icons/upload-01";
import { nostrBuildUploadImage } from "../../../helpers/nostr-build";
import { useSigningContext } from "../../../providers/signing-provider";
import { useSigningContext } from "../../../providers/global/signing-provider";
import { RelayUrlInput } from "../../../components/relay-url-input";
import { safeRelayUrl } from "../../../helpers/url";
import { RelayFavicon } from "../../../components/relay-favicon";

@ -8,7 +8,7 @@ import useCurrentAccount from "../../../hooks/use-current-account";
import { getCommunityName } from "../../../helpers/nostr/communities";
import { COMMUNITIES_LIST_KIND, listAddCoordinate, listRemoveCoordinate } from "../../../helpers/nostr/lists";
import { getEventCoordinate } from "../../../helpers/nostr/events";
import { useSigningContext } from "../../../providers/signing-provider";
import { useSigningContext } from "../../../providers/global/signing-provider";
import NostrPublishAction from "../../../classes/nostr-publish-action";
import clientRelaysService from "../../../services/client-relays";

@ -1,7 +1,7 @@
import { useMemo } from "react";
import { AvatarGroup, Button, Flex, SimpleGrid, Switch, useDisclosure } from "@chakra-ui/react";
import PeopleListProvider, { usePeopleListContext } from "../../providers/people-list-provider";
import PeopleListProvider, { usePeopleListContext } from "../../providers/local/people-list-provider";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
import { PointerCommunityCard } from "./components/community-card";
import VerticalPageLayout from "../../components/vertical-page-layout";

@ -29,7 +29,7 @@ import useUserCommunitiesList from "../../hooks/use-user-communities-list";
import useCurrentAccount from "../../hooks/use-current-account";
import CommunityCard from "./components/community-card";
import CommunityCreateModal, { FormValues } from "./components/community-create-modal";
import { useSigningContext } from "../../providers/signing-provider";
import { useSigningContext } from "../../providers/global/signing-provider";
import { DraftNostrEvent } from "../../types/nostr-event";
import {
COMMUNITY_APPROVAL_KIND,
@ -50,7 +50,7 @@ import useUserMuteFilter from "../../hooks/use-user-mute-filter";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import useReplaceableEvents from "../../hooks/use-replaceable-events";
import { getEventCoordinate, sortByDate } from "../../helpers/nostr/events";
import IntersectionObserverProvider from "../../providers/intersection-observer";
import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import ApprovedEvent from "../community/components/community-approved-post";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";

@ -15,19 +15,19 @@ import { NostrEvent } from "../../types/nostr-event";
import VerticalPageLayout from "../../components/vertical-page-layout";
import UserAvatarLink from "../../components/user-avatar-link";
import UserLink from "../../components/user-link";
import { AdditionalRelayProvider } from "../../providers/additional-relay-context";
import { AdditionalRelayProvider } from "../../providers/local/additional-relay-context";
import TrendUp01 from "../../components/icons/trend-up-01";
import Clock from "../../components/icons/clock";
import Hourglass03 from "../../components/icons/hourglass-03";
import VerticalCommunityDetails from "./components/vertical-community-details";
import { useBreakpointValue } from "../../providers/breakpoint-provider";
import { useBreakpointValue } from "../../providers/global/breakpoint-provider";
import HorizontalCommunityDetails from "./components/horizonal-community-details";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { getEventCoordinate, getEventUID } from "../../helpers/nostr/events";
import { WritingIcon } from "../../components/icons";
import { PostModalContext } from "../../providers/post-modal-provider";
import { PostModalContext } from "../../providers/route/post-modal-provider";
import CommunityEditModal from "./components/community-edit-modal";
import TimelineLoader from "../../classes/timeline-loader";
import useSubject from "../../hooks/use-subject";

@ -3,7 +3,7 @@ import { ModalProps, useToast } from "@chakra-ui/react";
import dayjs from "dayjs";
import { DraftNostrEvent, NostrEvent } from "../../../types/nostr-event";
import { useSigningContext } from "../../../providers/signing-provider";
import { useSigningContext } from "../../../providers/global/signing-provider";
import {
COMMUNITY_DEFINITION_KIND,
getCommunityDescription,

@ -18,7 +18,7 @@ import { useReadRelayUrls } from "../../../hooks/use-client-relays";
import { getCommunityRelays } from "../../../helpers/nostr/communities";
import { getEventCoordinate } from "../../../helpers/nostr/events";
import { COMMUNITIES_LIST_KIND } from "../../../helpers/nostr/lists";
import IntersectionObserverProvider from "../../../providers/intersection-observer";
import IntersectionObserverProvider from "../../../providers/local/intersection-observer";
import useSubject from "../../../hooks/use-subject";
import { useTimelineCurserIntersectionCallback } from "../../../hooks/use-timeline-cursor-intersection-callback";
import TimelineActionAndStatus from "../../../components/timeline-page/timeline-action-and-status";

@ -22,7 +22,7 @@ import { useNavigateInDrawer } from "../../../providers/drawer-sub-view-provider
import { getSharableEventAddress } from "../../../helpers/nip19";
import HoverLinkOverlay from "../../../components/hover-link-overlay";
import { CompactNoteContent } from "../../../components/compact-note-content";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import { getEventUID, parseHardcodedNoteContent } from "../../../helpers/nostr/events";
import UserLink from "../../../components/user-link";
import UserAvatarLink from "../../../components/user-avatar-link";

@ -3,7 +3,7 @@ import { Card, CardProps, IconButton, Text, useToast } from "@chakra-ui/react";
import useCurrentAccount from "../../../hooks/use-current-account";
import useEventReactions from "../../../hooks/use-event-reactions";
import { useSigningContext } from "../../../providers/signing-provider";
import { useSigningContext } from "../../../providers/global/signing-provider";
import { draftEventReaction, groupReactions } from "../../../helpers/nostr/reactions";
import clientRelaysService from "../../../services/client-relays";
import { getCommunityPostVote } from "../../../helpers/nostr/communities";
@ -12,7 +12,7 @@ import eventReactionsService from "../../../services/event-reactions";
import NostrPublishAction from "../../../classes/nostr-publish-action";
import { ChevronDownIcon, ChevronUpIcon } from "../../../components/icons";
import { NostrEvent } from "../../../types/nostr-event";
import { useAdditionalRelayContext } from "../../../providers/additional-relay-context";
import { useAdditionalRelayContext } from "../../../providers/local/additional-relay-context";
export default function PostVoteButtons({ event, ...props }: Omit<CardProps, "children"> & { event: NostrEvent }) {
const account = useCurrentAccount();

@ -8,7 +8,7 @@ import useTimelineLoader from "../../hooks/use-timeline-loader";
import { NostrEvent } from "../../types/nostr-event";
import useSubject from "../../hooks/use-subject";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import IntersectionObserverProvider from "../../providers/intersection-observer";
import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import VerticalPageLayout from "../../components/vertical-page-layout";
import CommunityCard from "../communities/components/community-card";
import { getEventUID } from "../../helpers/nostr/events";

@ -3,7 +3,7 @@ import { useOutletContext } from "react-router-dom";
import { COMMUNITY_APPROVAL_KIND, buildApprovalMap, getCommunityMods } from "../../../helpers/nostr/communities";
import useSubject from "../../../hooks/use-subject";
import { useTimelineCurserIntersectionCallback } from "../../../hooks/use-timeline-cursor-intersection-callback";
import IntersectionObserverProvider from "../../../providers/intersection-observer";
import IntersectionObserverProvider from "../../../providers/local/intersection-observer";
import TimelineActionAndStatus from "../../../components/timeline-page/timeline-action-and-status";
import useUserMuteFilter from "../../../hooks/use-user-mute-filter";
import ApprovedEvent from "../components/community-approved-post";

@ -12,11 +12,13 @@ import {
getCommunityRelays,
} from "../../../helpers/nostr/communities";
import useSubject from "../../../hooks/use-subject";
import IntersectionObserverProvider, { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import IntersectionObserverProvider, {
useRegisterIntersectionEntity,
} from "../../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../../hooks/use-timeline-cursor-intersection-callback";
import TimelineActionAndStatus from "../../../components/timeline-page/timeline-action-and-status";
import { CheckIcon } from "../../../components/icons";
import { useSigningContext } from "../../../providers/signing-provider";
import { useSigningContext } from "../../../providers/global/signing-provider";
import useCurrentAccount from "../../../hooks/use-current-account";
import NostrPublishAction from "../../../classes/nostr-publish-action";
import { useWriteRelayUrls } from "../../../hooks/use-client-relays";

@ -10,7 +10,7 @@ import {
} from "../../../helpers/nostr/communities";
import useSubject from "../../../hooks/use-subject";
import { useTimelineCurserIntersectionCallback } from "../../../hooks/use-timeline-cursor-intersection-callback";
import IntersectionObserverProvider from "../../../providers/intersection-observer";
import IntersectionObserverProvider from "../../../providers/local/intersection-observer";
import TimelineActionAndStatus from "../../../components/timeline-page/timeline-action-and-status";
import useUserMuteFilter from "../../../hooks/use-user-mute-filter";
import useEventsReactions from "../../../hooks/use-events-reactions";

@ -8,19 +8,19 @@ import UserAvatar from "../../components/user-avatar";
import UserLink from "../../components/user-link";
import { isHexKey } from "../../helpers/nip19";
import useSubject from "../../hooks/use-subject";
import RequireCurrentAccount from "../../providers/require-current-account";
import RequireCurrentAccount from "../../providers/route/require-current-account";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import useCurrentAccount from "../../hooks/use-current-account";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import IntersectionObserverProvider from "../../providers/intersection-observer";
import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
import { UserDnsIdentityIcon } from "../../components/user-dns-identity-icon";
import { useDecryptionContext } from "../../providers/dycryption-provider";
import { useDecryptionContext } from "../../providers/global/dycryption-provider";
import SendMessageForm from "./components/send-message-form";
import { groupMessages } from "../../helpers/nostr/dms";
import ThreadDrawer from "./components/thread-drawer";
import ThreadsProvider from "../../providers/thread-provider";
import ThreadsProvider from "../../providers/local/thread-provider";
import { useRouterMarker } from "../../providers/drawer-sub-view-provider";
import TimelineLoader from "../../classes/timeline-loader";
import DirectMessageBlock from "./components/direct-message-block";

@ -2,7 +2,7 @@ import { useState } from "react";
import { Alert, AlertDescription, AlertIcon, Button, ButtonProps } from "@chakra-ui/react";
import { UnlockIcon } from "../../../components/icons";
import { useDecryptionContainer } from "../../../providers/dycryption-provider";
import { useDecryptionContainer } from "../../../providers/global/dycryption-provider";
import useCurrentAccount from "../../../hooks/use-current-account";
import { getDMRecipient, getDMSender } from "../../../helpers/nostr/dms";
import { NostrEvent } from "../../../types/nostr-event";

Some files were not shown because too many files have changed in this diff Show More