diff --git a/src/app.tsx b/src/app.tsx
index 98862fa99..c07db22ca 100644
--- a/src/app.tsx
+++ b/src/app.tsx
@@ -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 (
-
+
}>
-
+
);
};
const NoLayoutPage = () => {
return (
-
+
}>
-
+
);
};
@@ -183,17 +183,17 @@ const router = createHashRouter([
{
path: "streams/moderation",
element: (
-
+
-
+
),
},
{
path: "streams/:naddr",
element: (
-
+
-
+
),
},
{
diff --git a/src/components/common-menu-items/delete-event.tsx b/src/components/common-menu-items/delete-event.tsx
index 8b62db3ab..d2518e54f 100644
--- a/src/components/common-menu-items/delete-event.tsx
+++ b/src/components/common-menu-items/delete-event.tsx
@@ -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";
diff --git a/src/components/common-menu-items/mute-user.tsx b/src/components/common-menu-items/mute-user.tsx
index b7eb2de16..af3be9100 100644
--- a/src/components/common-menu-items/mute-user.tsx
+++ b/src/components/common-menu-items/mute-user.tsx
@@ -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 }) {
diff --git a/src/components/common-menu-items/pin-note.tsx b/src/components/common-menu-items/pin-note.tsx
index aeaacd2e3..426acb81d 100644
--- a/src/components/common-menu-items/pin-note.tsx
+++ b/src/components/common-menu-items/pin-note.tsx
@@ -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";
diff --git a/src/components/embed-event/event-types/embedded-dm.tsx b/src/components/embed-event/event-types/embedded-dm.tsx
index 8cb2ef565..4fdf06736 100644
--- a/src/components/embed-event/event-types/embedded-dm.tsx
+++ b/src/components/embed-event/event-types/embedded-dm.tsx
@@ -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";
diff --git a/src/components/embed-event/event-types/embedded-note.tsx b/src/components/embed-event/event-types/embedded-note.tsx
index 807aeed32..1b7089515 100644
--- a/src/components/embed-event/event-types/embedded-note.tsx
+++ b/src/components/embed-event/event-types/embedded-note.tsx
@@ -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";
diff --git a/src/components/embed-event/event-types/embedded-reaction.tsx b/src/components/embed-event/event-types/embedded-reaction.tsx
index 6cd3eea81..469b6a2fe 100644
--- a/src/components/embed-event/event-types/embedded-reaction.tsx
+++ b/src/components/embed-event/event-types/embedded-reaction.tsx
@@ -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";
diff --git a/src/components/embed-event/event-types/embedded-stream.tsx b/src/components/embed-event/event-types/embedded-stream.tsx
index d9a8b024f..5720f8c58 100644
--- a/src/components/embed-event/event-types/embedded-stream.tsx
+++ b/src/components/embed-event/event-types/embedded-stream.tsx
@@ -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 & { event: NostrEvent }) {
const stream = parseStreamEvent(event);
diff --git a/src/components/embed-event/event-types/embedded-torrent-comment.tsx b/src/components/embed-event/event-types/embedded-torrent-comment.tsx
index 632dfcbd8..b0775d9e3 100644
--- a/src/components/embed-event/event-types/embedded-torrent-comment.tsx
+++ b/src/components/embed-event/event-types/embedded-torrent-comment.tsx
@@ -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";
diff --git a/src/components/embed-types/image.tsx b/src/components/embed-types/image.tsx
index a863ac813..4a7c0f640 100644
--- a/src/components/embed-types/image.tsx
+++ b/src/components/embed-types/image.tsx
@@ -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;
diff --git a/src/components/embed-types/video.tsx b/src/components/embed-types/video.tsx
index fdb597b8f..266fbdadf 100644
--- a/src/components/embed-types/video.tsx
+++ b/src/components/embed-types/video.tsx
@@ -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;
diff --git a/src/components/event-reactions/common-hooks.tsx b/src/components/event-reactions/common-hooks.tsx
index 76d2042a6..dba210604 100644
--- a/src/components/event-reactions/common-hooks.tsx
+++ b/src/components/event-reactions/common-hooks.tsx
@@ -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";
diff --git a/src/components/layout/desktop-side-nav.tsx b/src/components/layout/desktop-side-nav.tsx
index da0f2fdd5..f9123b021 100644
--- a/src/components/layout/desktop-side-nav.tsx
+++ b/src/components/layout/desktop-side-nav.tsx
@@ -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`
diff --git a/src/components/layout/index.tsx b/src/components/layout/index.tsx
index a9d7c19f7..b0ac07a6c 100644
--- a/src/components/layout/index.tsx
+++ b/src/components/layout/index.tsx
@@ -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";
diff --git a/src/components/layout/mobile-bottom-nav.tsx b/src/components/layout/mobile-bottom-nav.tsx
index f90e96f86..320d54b90 100644
--- a/src/components/layout/mobile-bottom-nav.tsx
+++ b/src/components/layout/mobile-bottom-nav.tsx
@@ -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";
diff --git a/src/components/magic-textarea.tsx b/src/components/magic-textarea.tsx
index 588905fee..b06ceacfc 100644
--- a/src/components/magic-textarea.tsx
+++ b/src/components/magic-textarea.tsx
@@ -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";
diff --git a/src/components/message-block.tsx b/src/components/message-block.tsx
index 3134ad802..bba9ed44b 100644
--- a/src/components/message-block.tsx
+++ b/src/components/message-block.tsx
@@ -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) {
diff --git a/src/components/message-bubble.tsx b/src/components/message-bubble.tsx
index 707252ed3..fe5f91e1b 100644
--- a/src/components/message-bubble.tsx
+++ b/src/components/message-bubble.tsx
@@ -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";
diff --git a/src/components/note/components/add-reaction-button.tsx b/src/components/note/components/add-reaction-button.tsx
index 7c8b4ee2c..2c9495d9f 100644
--- a/src/components/note/components/add-reaction-button.tsx
+++ b/src/components/note/components/add-reaction-button.tsx
@@ -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";
diff --git a/src/components/note/components/bookmark-button.tsx b/src/components/note/components/bookmark-button.tsx
index 06508225c..8077a9a80 100644
--- a/src/components/note/components/bookmark-button.tsx
+++ b/src/components/note/components/bookmark-button.tsx
@@ -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,
diff --git a/src/components/note/components/note-reactions.tsx b/src/components/note/components/note-reactions.tsx
index 22bbcde14..799e29c77 100644
--- a/src/components/note/components/note-reactions.tsx
+++ b/src/components/note/components/note-reactions.tsx
@@ -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 & { event: NostrEvent }) {
const reactions = useEventReactions(event.id) ?? [];
diff --git a/src/components/note/components/quote-repost-button.tsx b/src/components/note/components/quote-repost-button.tsx
index ac012ca64..82ad8d287 100644
--- a/src/components/note/components/quote-repost-button.tsx
+++ b/src/components/note/components/quote-repost-button.tsx
@@ -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 & {
diff --git a/src/components/note/components/repost-modal.tsx b/src/components/note/components/repost-modal.tsx
index 04fafb358..9a3f582ed 100644
--- a/src/components/note/components/repost-modal.tsx
+++ b/src/components/note/components/repost-modal.tsx
@@ -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";
diff --git a/src/components/note/index.tsx b/src/components/note/index.tsx
index 80e5123f3..3b8968c7d 100644
--- a/src/components/note/index.tsx
+++ b/src/components/note/index.tsx
@@ -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";
diff --git a/src/components/note/note-content-with-warning.tsx b/src/components/note/note-content-with-warning.tsx
index 3c6605c1d..d70a3c6d2 100644
--- a/src/components/note/note-content-with-warning.tsx
+++ b/src/components/note/note-content-with-warning.tsx
@@ -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";
diff --git a/src/components/note/note-relays.tsx b/src/components/note/note-relays.tsx
index 4f3d1ebac..3ca3479c8 100644
--- a/src/components/note/note-relays.tsx
+++ b/src/components/note/note-relays.tsx
@@ -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;
diff --git a/src/components/npub-autocomplete.tsx b/src/components/npub-autocomplete.tsx
index 9e13880cf..6d829f99f 100644
--- a/src/components/npub-autocomplete.tsx
+++ b/src/components/npub-autocomplete.tsx
@@ -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";
diff --git a/src/components/open-graph-card.tsx b/src/components/open-graph-card.tsx
index 151192446..dec2bf136 100644
--- a/src/components/open-graph-card.tsx
+++ b/src/components/open-graph-card.tsx
@@ -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) {
const { value: data } = useOpenGraphData(url);
diff --git a/src/components/people-list-selection/people-list-selection.tsx b/src/components/people-list-selection/people-list-selection.tsx
index 86bdcf68e..8578c96a3 100644
--- a/src/components/people-list-selection/people-list-selection.tsx
+++ b/src/components/people-list-selection/people-list-selection.tsx
@@ -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";
diff --git a/src/components/post-modal/index.tsx b/src/components/post-modal/index.tsx
index 61ed3a010..e7f359389 100644
--- a/src/components/post-modal/index.tsx
+++ b/src/components/post-modal/index.tsx
@@ -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";
diff --git a/src/components/relay-selection/relay-selection-button.tsx b/src/components/relay-selection/relay-selection-button.tsx
index 620924ca6..edc8350cf 100644
--- a/src/components/relay-selection/relay-selection-button.tsx
+++ b/src/components/relay-selection/relay-selection-button.tsx
@@ -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) {
diff --git a/src/components/search-modal/index.tsx b/src/components/search-modal/index.tsx
index 4734ad34a..0f842b64e 100644
--- a/src/components/search-modal/index.tsx
+++ b/src/components/search-modal/index.tsx
@@ -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";
diff --git a/src/components/sensitive-content-warning.tsx b/src/components/sensitive-content-warning.tsx
index f64e74f75..a66a56f43 100644
--- a/src/components/sensitive-content-warning.tsx
+++ b/src/components/sensitive-content-warning.tsx
@@ -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();
diff --git a/src/components/timeline-page/generic-note-timeline/article-note.tsx b/src/components/timeline-page/generic-note-timeline/article-note.tsx
index e4a729214..6f981cf03 100644
--- a/src/components/timeline-page/generic-note-timeline/article-note.tsx
+++ b/src/components/timeline-page/generic-note-timeline/article-note.tsx
@@ -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 }) {
diff --git a/src/components/timeline-page/generic-note-timeline/generic-timeline-note.tsx b/src/components/timeline-page/generic-note-timeline/generic-timeline-note.tsx
index 65b6a540e..6986e7ca7 100644
--- a/src/components/timeline-page/generic-note-timeline/generic-timeline-note.tsx
+++ b/src/components/timeline-page/generic-note-timeline/generic-timeline-note.tsx
@@ -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";
diff --git a/src/components/timeline-page/generic-note-timeline/index.tsx b/src/components/timeline-page/generic-note-timeline/index.tsx
index 4b7553f53..04478bc90 100644
--- a/src/components/timeline-page/generic-note-timeline/index.tsx
+++ b/src/components/timeline-page/generic-note-timeline/index.tsx
@@ -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;
diff --git a/src/components/timeline-page/generic-note-timeline/relay-recommendation.tsx b/src/components/timeline-page/generic-note-timeline/relay-recommendation.tsx
index fd7ef3c4a..2ff600889 100644
--- a/src/components/timeline-page/generic-note-timeline/relay-recommendation.tsx
+++ b/src/components/timeline-page/generic-note-timeline/relay-recommendation.tsx
@@ -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);
diff --git a/src/components/timeline-page/generic-note-timeline/reply-note.tsx b/src/components/timeline-page/generic-note-timeline/reply-note.tsx
index e1891cb73..fbc8fcc7c 100644
--- a/src/components/timeline-page/generic-note-timeline/reply-note.tsx
+++ b/src/components/timeline-page/generic-note-timeline/reply-note.tsx
@@ -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 }) {
diff --git a/src/components/timeline-page/generic-note-timeline/repost-note.tsx b/src/components/timeline-page/generic-note-timeline/repost-note.tsx
index de8979146..baa4372df 100644
--- a/src/components/timeline-page/generic-note-timeline/repost-note.tsx
+++ b/src/components/timeline-page/generic-note-timeline/repost-note.tsx
@@ -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";
diff --git a/src/components/timeline-page/generic-note-timeline/stream-note.tsx b/src/components/timeline-page/generic-note-timeline/stream-note.tsx
index 588dbfd45..35beca7f9 100644
--- a/src/components/timeline-page/generic-note-timeline/stream-note.tsx
+++ b/src/components/timeline-page/generic-note-timeline/stream-note.tsx
@@ -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";
diff --git a/src/components/timeline-page/index.tsx b/src/components/timeline-page/index.tsx
index 722428187..07a387963 100644
--- a/src/components/timeline-page/index.tsx
+++ b/src/components/timeline-page/index.tsx
@@ -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";
diff --git a/src/components/timeline-page/media-timeline/index.tsx b/src/components/timeline-page/media-timeline/index.tsx
index b85e5fac1..d4670e4e0 100644
--- a/src/components/timeline-page/media-timeline/index.tsx
+++ b/src/components/timeline-page/media-timeline/index.tsx
@@ -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(null);
diff --git a/src/components/timeline-page/timeline-health/index.tsx b/src/components/timeline-page/timeline-health/index.tsx
index 1cad79b0d..64ee3a532 100644
--- a/src/components/timeline-page/timeline-health/index.tsx
+++ b/src/components/timeline-page/timeline-health/index.tsx
@@ -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";
diff --git a/src/components/user-follow-button.tsx b/src/components/user-follow-button.tsx
index 9c7eac846..07f57f1c8 100644
--- a/src/components/user-follow-button.tsx
+++ b/src/components/user-follow-button.tsx
@@ -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();
diff --git a/src/helpers/nostr/post.ts b/src/helpers/nostr/post.ts
index 486c3e8b9..7039fd9df 100644
--- a/src/helpers/nostr/post.ts
+++ b/src/helpers/nostr/post.ts
@@ -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";
diff --git a/src/hooks/use-textarea-upload-file.ts b/src/hooks/use-textarea-upload-file.ts
index a8ae01a18..87366561f 100644
--- a/src/hooks/use-textarea-upload-file.ts
+++ b/src/hooks/use-textarea-upload-file.ts
@@ -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(
diff --git a/src/hooks/use-timeline-cursor-intersection-callback.ts b/src/hooks/use-timeline-cursor-intersection-callback.ts
index 2c8ed3f89..d4014472f 100644
--- a/src/hooks/use-timeline-cursor-intersection-callback.ts
+++ b/src/hooks/use-timeline-cursor-intersection-callback.ts
@@ -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) {
diff --git a/src/hooks/use-user-mute-functions.ts b/src/hooks/use-user-mute-functions.ts
index 41bb7e144..11d0976ec 100644
--- a/src/hooks/use-user-mute-functions.ts
+++ b/src/hooks/use-user-mute-functions.ts
@@ -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";
diff --git a/src/index.tsx b/src/index.tsx
index 4cb9eb773..b48d20d68 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -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";
diff --git a/src/providers/drawer-sub-view-provider.tsx b/src/providers/drawer-sub-view-provider.tsx
index 2dde85453..53b6ad322 100644
--- a/src/providers/drawer-sub-view-provider.tsx
+++ b/src/providers/drawer-sub-view-provider.tsx
@@ -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({
-
-
- Loading page
-
- }
- >
-
-
-
+
+ Loading page
+
+ }
+ >
+
+
@@ -90,11 +88,19 @@ function DrawerSubView({
const routes: RouteObject[] = [
{
path: "/n/:id",
- element: ,
+ element: (
+
+
+
+ ),
},
{
path: "/torrents/:id",
- element: ,
+ element: (
+
+
+
+ ),
},
];
diff --git a/src/providers/breakpoint-provider.tsx b/src/providers/global/breakpoint-provider.tsx
similarity index 100%
rename from src/providers/breakpoint-provider.tsx
rename to src/providers/global/breakpoint-provider.tsx
diff --git a/src/providers/dycryption-provider.tsx b/src/providers/global/dycryption-provider.tsx
similarity index 96%
rename from src/providers/dycryption-provider.tsx
rename to src/providers/global/dycryption-provider.tsx
index a6653a2b0..3e767f9fa 100644
--- a/src/providers/dycryption-provider.tsx
+++ b/src/providers/global/dycryption-provider.tsx
@@ -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();
diff --git a/src/providers/emoji-provider.tsx b/src/providers/global/emoji-provider.tsx
similarity index 81%
rename from src/providers/emoji-provider.tsx
rename to src/providers/global/emoji-provider.tsx
index 7c25d2aed..d5dfcdd2d 100644
--- a/src/providers/emoji-provider.tsx
+++ b/src/providers/global/emoji-provider.tsx
@@ -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,
diff --git a/src/providers/global/index.tsx b/src/providers/global/index.tsx
new file mode 100644
index 000000000..810cedbd4
--- /dev/null
+++ b/src/providers/global/index.tsx
@@ -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 (
+
+
+
+
+
+
+
+ {children}
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/providers/notification-timeline.tsx b/src/providers/global/notification-timeline.tsx
similarity index 75%
rename from src/providers/notification-timeline.tsx
rename to src/providers/global/notification-timeline.tsx
index 8bb9aaf85..a9216f5d9 100644
--- a/src/providers/notification-timeline.tsx
+++ b/src/providers/global/notification-timeline.tsx
@@ -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;
diff --git a/src/providers/signing-provider.tsx b/src/providers/global/signing-provider.tsx
similarity index 89%
rename from src/providers/signing-provider.tsx
rename to src/providers/global/signing-provider.tsx
index c2320e7a5..575e518f7 100644
--- a/src/providers/signing-provider.tsx
+++ b/src/providers/global/signing-provider.tsx
@@ -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;
diff --git a/src/providers/user-directory-provider.tsx b/src/providers/global/user-directory-provider.tsx
similarity index 98%
rename from src/providers/user-directory-provider.tsx
rename to src/providers/global/user-directory-provider.tsx
index c46dc991a..69452ad19 100644
--- a/src/providers/user-directory-provider.tsx
+++ b/src/providers/global/user-directory-provider.tsx
@@ -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;
diff --git a/src/providers/index.tsx b/src/providers/index.tsx
deleted file mode 100644
index 8055b115b..000000000
--- a/src/providers/index.tsx
+++ /dev/null
@@ -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 (
-
- {children}
-
- );
-};
-
-/** Providers that provider functionality to pages (needs to be rendered under a router) */
-export function PageProviders({ children }: { children: React.ReactNode }) {
- return (
-
-
-
-
-
-
-
-
-
-
- {children}
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/src/providers/additional-relay-context.tsx b/src/providers/local/additional-relay-context.tsx
similarity index 86%
rename from src/providers/additional-relay-context.tsx
rename to src/providers/local/additional-relay-context.tsx
index 2ae0fd927..30130423c 100644
--- a/src/providers/additional-relay-context.tsx
+++ b/src/providers/local/additional-relay-context.tsx
@@ -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([]);
diff --git a/src/providers/expanded.tsx b/src/providers/local/expanded.tsx
similarity index 100%
rename from src/providers/expanded.tsx
rename to src/providers/local/expanded.tsx
diff --git a/src/providers/intersection-observer.tsx b/src/providers/local/intersection-observer.tsx
similarity index 98%
rename from src/providers/intersection-observer.tsx
rename to src/providers/local/intersection-observer.tsx
index d186efb0b..3f76d5ed0 100644
--- a/src/providers/intersection-observer.tsx
+++ b/src/providers/local/intersection-observer.tsx
@@ -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 = (
diff --git a/src/providers/people-list-provider.tsx b/src/providers/local/people-list-provider.tsx
similarity index 85%
rename from src/providers/people-list-provider.tsx
rename to src/providers/local/people-list-provider.tsx
index d30340429..38d6807ba 100644
--- a/src/providers/people-list-provider.tsx
+++ b/src/providers/local/people-list-provider.tsx
@@ -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 };
diff --git a/src/providers/relay-selection-provider.tsx b/src/providers/local/relay-selection-provider.tsx
similarity index 93%
rename from src/providers/relay-selection-provider.tsx
rename to src/providers/local/relay-selection-provider.tsx
index 8a93bc5e2..849963f7e 100644
--- a/src/providers/relay-selection-provider.tsx
+++ b/src/providers/local/relay-selection-provider.tsx
@@ -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[];
diff --git a/src/providers/thread-provider.tsx b/src/providers/local/thread-provider.tsx
similarity index 90%
rename from src/providers/thread-provider.tsx
rename to src/providers/local/thread-provider.tsx
index 931167717..487f4836e 100644
--- a/src/providers/thread-provider.tsx
+++ b/src/providers/local/thread-provider.tsx
@@ -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;
diff --git a/src/providers/trust.tsx b/src/providers/local/trust.tsx
similarity index 76%
rename from src/providers/trust.tsx
rename to src/providers/local/trust.tsx
index 1fc627f9b..40dfee0ef 100644
--- a/src/providers/trust.tsx
+++ b/src/providers/local/trust.tsx
@@ -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(false);
diff --git a/src/providers/delete-event-provider.tsx b/src/providers/route/delete-event-provider.tsx
similarity index 87%
rename from src/providers/delete-event-provider.tsx
rename to src/providers/route/delete-event-provider.tsx
index a5fc1e490..08bc2acda 100644
--- a/src/providers/delete-event-provider.tsx
+++ b/src/providers/route/delete-event-provider.tsx
@@ -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;
diff --git a/src/providers/route/index.tsx b/src/providers/route/index.tsx
new file mode 100644
index 000000000..b035c5ef7
--- /dev/null
+++ b/src/providers/route/index.tsx
@@ -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 (
+
+
+
+ {children}
+
+
+
+ );
+}
diff --git a/src/providers/invoice-modal.tsx b/src/providers/route/invoice-modal.tsx
similarity index 84%
rename from src/providers/invoice-modal.tsx
rename to src/providers/route/invoice-modal.tsx
index 40ee52133..837747498 100644
--- a/src/providers/invoice-modal.tsx
+++ b/src/providers/route/invoice-modal.tsx
@@ -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;
@@ -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();
const [defer, setDefer] = useState>();
@@ -60,4 +60,4 @@ export const InvoiceModalProvider = ({ children }: { children: React.ReactNode }
{invoice && }
);
-};
+}
diff --git a/src/providers/mute-modal-provider.tsx b/src/providers/route/mute-modal-provider.tsx
similarity index 92%
rename from src/providers/mute-modal-provider.tsx
rename to src/providers/route/mute-modal-provider.tsx
index 805bd1f30..32784eddf 100644
--- a/src/providers/mute-modal-provider.tsx
+++ b/src/providers/route/mute-modal-provider.tsx
@@ -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;
diff --git a/src/providers/post-modal-provider.tsx b/src/providers/route/post-modal-provider.tsx
similarity index 88%
rename from src/providers/post-modal-provider.tsx
rename to src/providers/route/post-modal-provider.tsx
index 75e206caa..be31d8617 100644
--- a/src/providers/post-modal-provider.tsx
+++ b/src/providers/route/post-modal-provider.tsx
@@ -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;
diff --git a/src/providers/require-current-account.tsx b/src/providers/route/require-current-account.tsx
similarity index 84%
rename from src/providers/require-current-account.tsx
rename to src/providers/route/require-current-account.tsx
index f164b9a63..afadd19ec 100644
--- a/src/providers/require-current-account.tsx
+++ b/src/providers/route/require-current-account.tsx
@@ -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();
diff --git a/src/views/badges/badge-details.tsx b/src/views/badges/badge-details.tsx
index 45ebb9662..e66f8962d 100644
--- a/src/views/badges/badge-details.tsx
+++ b/src/views/badges/badge-details.tsx
@@ -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";
diff --git a/src/views/badges/browse.tsx b/src/views/badges/browse.tsx
index ac5115368..d0f216a94 100644
--- a/src/views/badges/browse.tsx
+++ b/src/views/badges/browse.tsx
@@ -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";
diff --git a/src/views/badges/components/badge-award-card.tsx b/src/views/badges/components/badge-award-card.tsx
index 3f30781a8..eaee74962 100644
--- a/src/views/badges/components/badge-award-card.tsx
+++ b/src/views/badges/components/badge-award-card.tsx
@@ -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";
diff --git a/src/views/badges/components/badge-card.tsx b/src/views/badges/components/badge-card.tsx
index 61f78abdb..9c98a1249 100644
--- a/src/views/badges/components/badge-card.tsx
+++ b/src/views/badges/components/badge-card.tsx
@@ -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";
diff --git a/src/views/badges/components/badge-menu.tsx b/src/views/badges/components/badge-menu.tsx
index 00071137e..5dff69f00 100644
--- a/src/views/badges/components/badge-menu.tsx
+++ b/src/views/badges/components/badge-menu.tsx
@@ -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";
diff --git a/src/views/badges/index.tsx b/src/views/badges/index.tsx
index aa74d6cae..6cb57a5fd 100644
--- a/src/views/badges/index.tsx
+++ b/src/views/badges/index.tsx
@@ -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";
diff --git a/src/views/channels/channel.tsx b/src/views/channels/channel.tsx
index 742c34787..596a82950 100644
--- a/src/views/channels/channel.tsx
+++ b/src/views/channels/channel.tsx
@@ -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";
diff --git a/src/views/channels/components/channel-card.tsx b/src/views/channels/components/channel-card.tsx
index 31baaa503..2e0f0729f 100644
--- a/src/views/channels/components/channel-card.tsx
+++ b/src/views/channels/components/channel-card.tsx
@@ -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";
diff --git a/src/views/channels/components/channel-join-button.tsx b/src/views/channels/components/channel-join-button.tsx
index 559bd286b..90d2571d5 100644
--- a/src/views/channels/components/channel-join-button.tsx
+++ b/src/views/channels/components/channel-join-button.tsx
@@ -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";
diff --git a/src/views/channels/components/channel-message-content.tsx b/src/views/channels/components/channel-message-content.tsx
index 128709305..fe4e0eb0e 100644
--- a/src/views/channels/components/channel-message-content.tsx
+++ b/src/views/channels/components/channel-message-content.tsx
@@ -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,
diff --git a/src/views/channels/components/channel-metadata-drawer.tsx b/src/views/channels/components/channel-metadata-drawer.tsx
index cf9ed81f4..682ef0052 100644
--- a/src/views/channels/components/channel-metadata-drawer.tsx
+++ b/src/views/channels/components/channel-metadata-drawer.tsx
@@ -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";
diff --git a/src/views/channels/components/send-message-form.tsx b/src/views/channels/components/send-message-form.tsx
index 73b8a3364..a154e5893 100644
--- a/src/views/channels/components/send-message-form.tsx
+++ b/src/views/channels/components/send-message-form.tsx
@@ -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,
diff --git a/src/views/channels/index.tsx b/src/views/channels/index.tsx
index dadd1ac22..9725526b0 100644
--- a/src/views/channels/index.tsx
+++ b/src/views/channels/index.tsx
@@ -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";
diff --git a/src/views/communities/components/community-card.tsx b/src/views/communities/components/community-card.tsx
index 96a64aa3b..3a92ed003 100644
--- a/src/views/communities/components/community-card.tsx
+++ b/src/views/communities/components/community-card.tsx
@@ -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";
diff --git a/src/views/communities/components/community-create-modal.tsx b/src/views/communities/components/community-create-modal.tsx
index 5f4634710..36c589080 100644
--- a/src/views/communities/components/community-create-modal.tsx
+++ b/src/views/communities/components/community-create-modal.tsx
@@ -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";
diff --git a/src/views/communities/components/community-join-button.tsx b/src/views/communities/components/community-join-button.tsx
index bff4b0353..3dab022f9 100644
--- a/src/views/communities/components/community-join-button.tsx
+++ b/src/views/communities/components/community-join-button.tsx
@@ -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";
diff --git a/src/views/communities/explore.tsx b/src/views/communities/explore.tsx
index 425ceeae6..f1140b37f 100644
--- a/src/views/communities/explore.tsx
+++ b/src/views/communities/explore.tsx
@@ -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";
diff --git a/src/views/communities/index.tsx b/src/views/communities/index.tsx
index f306829de..bc377192c 100644
--- a/src/views/communities/index.tsx
+++ b/src/views/communities/index.tsx
@@ -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";
diff --git a/src/views/community/community-home.tsx b/src/views/community/community-home.tsx
index c7e8b02ec..15444c523 100644
--- a/src/views/community/community-home.tsx
+++ b/src/views/community/community-home.tsx
@@ -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";
diff --git a/src/views/community/components/community-edit-modal.tsx b/src/views/community/components/community-edit-modal.tsx
index aa991bd25..8ce5944a0 100644
--- a/src/views/community/components/community-edit-modal.tsx
+++ b/src/views/community/components/community-edit-modal.tsx
@@ -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,
diff --git a/src/views/community/components/community-members-modal.tsx b/src/views/community/components/community-members-modal.tsx
index 32c41d926..a11869d0b 100644
--- a/src/views/community/components/community-members-modal.tsx
+++ b/src/views/community/components/community-members-modal.tsx
@@ -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";
diff --git a/src/views/community/components/community-post.tsx b/src/views/community/components/community-post.tsx
index 1c6f629dd..77a76f7a6 100644
--- a/src/views/community/components/community-post.tsx
+++ b/src/views/community/components/community-post.tsx
@@ -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";
diff --git a/src/views/community/components/post-vote-buttions.tsx b/src/views/community/components/post-vote-buttions.tsx
index 8aadcd52c..1c3278768 100644
--- a/src/views/community/components/post-vote-buttions.tsx
+++ b/src/views/community/components/post-vote-buttions.tsx
@@ -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 & { event: NostrEvent }) {
const account = useCurrentAccount();
diff --git a/src/views/community/find-by-name.tsx b/src/views/community/find-by-name.tsx
index e6392318f..0c1443ba1 100644
--- a/src/views/community/find-by-name.tsx
+++ b/src/views/community/find-by-name.tsx
@@ -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";
diff --git a/src/views/community/views/newest.tsx b/src/views/community/views/newest.tsx
index 37eaa6221..abf56751d 100644
--- a/src/views/community/views/newest.tsx
+++ b/src/views/community/views/newest.tsx
@@ -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";
diff --git a/src/views/community/views/pending.tsx b/src/views/community/views/pending.tsx
index a4e16b7f3..11694cb90 100644
--- a/src/views/community/views/pending.tsx
+++ b/src/views/community/views/pending.tsx
@@ -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";
diff --git a/src/views/community/views/trending.tsx b/src/views/community/views/trending.tsx
index a71f0e67a..623da1527 100644
--- a/src/views/community/views/trending.tsx
+++ b/src/views/community/views/trending.tsx
@@ -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";
diff --git a/src/views/dms/chat.tsx b/src/views/dms/chat.tsx
index c49de36b5..4607eab2e 100644
--- a/src/views/dms/chat.tsx
+++ b/src/views/dms/chat.tsx
@@ -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";
diff --git a/src/views/dms/components/decrypt-placeholder.tsx b/src/views/dms/components/decrypt-placeholder.tsx
index 1f9880e08..0878c712d 100644
--- a/src/views/dms/components/decrypt-placeholder.tsx
+++ b/src/views/dms/components/decrypt-placeholder.tsx
@@ -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";
diff --git a/src/views/dms/components/direct-message-content.tsx b/src/views/dms/components/direct-message-content.tsx
index 0a07adc21..a972c9707 100644
--- a/src/views/dms/components/direct-message-content.tsx
+++ b/src/views/dms/components/direct-message-content.tsx
@@ -19,7 +19,7 @@ import {
renderWavlakeUrl,
renderYoutubeUrl,
} from "../../../components/embed-types";
-import { TrustProvider } from "../../../providers/trust";
+import { TrustProvider } from "../../../providers/local/trust";
import { LightboxProvider } from "../../../components/lightbox-provider";
export default function DirectMessageContent({
diff --git a/src/views/dms/components/send-message-form.tsx b/src/views/dms/components/send-message-form.tsx
index 1762d3d34..14583d2bb 100644
--- a/src/views/dms/components/send-message-form.tsx
+++ b/src/views/dms/components/send-message-form.tsx
@@ -4,7 +4,7 @@ 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";
@@ -13,7 +13,7 @@ import { DraftNostrEvent } from "../../../types/nostr-event";
import NostrPublishAction from "../../../classes/nostr-publish-action";
import { useUserRelays } from "../../../hooks/use-user-relays";
import { RelayMode } from "../../../classes/relay";
-import { useDecryptionContext } from "../../../providers/dycryption-provider";
+import { useDecryptionContext } from "../../../providers/global/dycryption-provider";
export default function SendMessageForm({
pubkey,
diff --git a/src/views/dms/components/thread-button.tsx b/src/views/dms/components/thread-button.tsx
index 7f22f66f3..0fbe4219c 100644
--- a/src/views/dms/components/thread-button.tsx
+++ b/src/views/dms/components/thread-button.tsx
@@ -2,7 +2,7 @@ import { Button, IconButton } from "@chakra-ui/react";
import { useLocation, useNavigate } from "react-router-dom";
import UserAvatar from "../../../components/user-avatar";
-import { Thread } from "../../../providers/thread-provider";
+import { Thread } from "../../../providers/local/thread-provider";
import { ChevronRightIcon, ThreadIcon } from "../../../components/icons";
import { IconButtonProps } from "yet-another-react-lightbox";
import { NostrEvent } from "../../../types/nostr-event";
diff --git a/src/views/dms/components/thread-drawer.tsx b/src/views/dms/components/thread-drawer.tsx
index 97d41199c..b8e39553c 100644
--- a/src/views/dms/components/thread-drawer.tsx
+++ b/src/views/dms/components/thread-drawer.tsx
@@ -23,11 +23,11 @@ import UserAvatar from "../../../components/user-avatar";
import UserLink from "../../../components/user-link";
import DecryptPlaceholder from "./decrypt-placeholder";
import Timestamp from "../../../components/timestamp";
-import { Thread, useThreadsContext } from "../../../providers/thread-provider";
+import { Thread, useThreadsContext } from "../../../providers/local/thread-provider";
import ThreadButton from "./thread-button";
import SendMessageForm from "./send-message-form";
import { groupMessages } from "../../../helpers/nostr/dms";
-import { useDecryptionContext } from "../../../providers/dycryption-provider";
+import { useDecryptionContext } from "../../../providers/global/dycryption-provider";
import DirectMessageBlock from "./direct-message-block";
function MessagePreview({ message, ...props }: { message: NostrEvent } & Omit) {
diff --git a/src/views/dms/index.tsx b/src/views/dms/index.tsx
index d91270fb2..84468c7c7 100644
--- a/src/views/dms/index.tsx
+++ b/src/views/dms/index.tsx
@@ -9,10 +9,10 @@ import { getUserDisplayName } from "../../helpers/user-metadata";
import useSubject from "../../hooks/use-subject";
import { useUserMetadata } from "../../hooks/use-user-metadata";
import directMessagesService from "../../services/direct-messages";
-import RequireCurrentAccount from "../../providers/require-current-account";
+import RequireCurrentAccount from "../../providers/route/require-current-account";
import Timestamp from "../../components/timestamp";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
-import PeopleListProvider, { usePeopleListContext } from "../../providers/people-list-provider";
+import PeopleListProvider, { usePeopleListContext } from "../../providers/local/people-list-provider";
function ContactCard({ pubkey }: { pubkey: string }) {
const subject = useMemo(() => directMessagesService.getUserMessages(pubkey), [pubkey]);
diff --git a/src/views/dvm-feed/components/feed-status.tsx b/src/views/dvm-feed/components/feed-status.tsx
index 60355eb9f..84bc3a0dd 100644
--- a/src/views/dvm-feed/components/feed-status.tsx
+++ b/src/views/dvm-feed/components/feed-status.tsx
@@ -9,7 +9,7 @@ import {
} from "../../../helpers/nostr/dvm";
import { InlineInvoiceCard } from "../../../components/inline-invoice-card";
import NostrPublishAction from "../../../classes/nostr-publish-action";
-import { useSigningContext } from "../../../providers/signing-provider";
+import { useSigningContext } from "../../../providers/global/signing-provider";
import { DraftNostrEvent } from "../../../types/nostr-event";
import { unique } from "../../../helpers/array";
import clientRelaysService from "../../../services/client-relays";
diff --git a/src/views/dvm-feed/feed.tsx b/src/views/dvm-feed/feed.tsx
index e26f6d51b..fcc42046a 100644
--- a/src/views/dvm-feed/feed.tsx
+++ b/src/views/dvm-feed/feed.tsx
@@ -32,9 +32,9 @@ import useSubject from "../../hooks/use-subject";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import { useUserRelays } from "../../hooks/use-user-relays";
-import { useSigningContext } from "../../providers/signing-provider";
+import { useSigningContext } from "../../providers/global/signing-provider";
import useCurrentAccount from "../../hooks/use-current-account";
-import RequireCurrentAccount from "../../providers/require-current-account";
+import RequireCurrentAccount from "../../providers/route/require-current-account";
import { CodeIcon } from "../../components/icons";
import { unique } from "../../helpers/array";
import DebugChains from "./components/debug-chains";
diff --git a/src/views/dvm-feed/index.tsx b/src/views/dvm-feed/index.tsx
index 5795a0673..4c447f4a0 100644
--- a/src/views/dvm-feed/index.tsx
+++ b/src/views/dvm-feed/index.tsx
@@ -6,7 +6,7 @@ import { DVM_CONTENT_DISCOVERY_JOB_KIND } from "../../helpers/nostr/dvm";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import useSubject from "../../hooks/use-subject";
-import RequireCurrentAccount from "../../providers/require-current-account";
+import RequireCurrentAccount from "../../providers/route/require-current-account";
import { getEventCoordinate } from "../../helpers/nostr/events";
function DVMFeedHomePage() {
diff --git a/src/views/emoji-packs/browse.tsx b/src/views/emoji-packs/browse.tsx
index 3959f92c0..dbaa75546 100644
--- a/src/views/emoji-packs/browse.tsx
+++ b/src/views/emoji-packs/browse.tsx
@@ -1,12 +1,12 @@
import { useCallback } from "react";
import { 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 useTimelineLoader from "../../hooks/use-timeline-loader";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import { NostrEvent } from "../../types/nostr-event";
-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 EmojiPackCard from "./components/emoji-pack-card";
diff --git a/src/views/emoji-packs/components/create-modal.tsx b/src/views/emoji-packs/components/create-modal.tsx
index 7a41a5dc2..1a14be4ea 100644
--- a/src/views/emoji-packs/components/create-modal.tsx
+++ b/src/views/emoji-packs/components/create-modal.tsx
@@ -19,7 +19,7 @@ import dayjs from "dayjs";
import { EMOJI_PACK_KIND } from "../../../helpers/nostr/emoji-packs";
import { DraftNostrEvent } from "../../../types/nostr-event";
-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 replaceableEventLoaderService from "../../../services/replaceable-event-requester";
diff --git a/src/views/emoji-packs/components/emoji-pack-card.tsx b/src/views/emoji-packs/components/emoji-pack-card.tsx
index c4067731c..c2c97f70f 100644
--- a/src/views/emoji-packs/components/emoji-pack-card.tsx
+++ b/src/views/emoji-packs/components/emoji-pack-card.tsx
@@ -17,7 +17,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 EmojiPackFavoriteButton from "./emoji-pack-favorite-button";
import { getEventUID } from "../../../helpers/nostr/events";
import { getEmojisFromPack, getPackName } from "../../../helpers/nostr/emoji-packs";
diff --git a/src/views/emoji-packs/components/emoji-pack-favorite-button.tsx b/src/views/emoji-packs/components/emoji-pack-favorite-button.tsx
index f1a7eda01..ac29eb5bc 100644
--- a/src/views/emoji-packs/components/emoji-pack-favorite-button.tsx
+++ b/src/views/emoji-packs/components/emoji-pack-favorite-button.tsx
@@ -5,7 +5,7 @@ import dayjs from "dayjs";
import { DraftNostrEvent, NostrEvent } from "../../../types/nostr-event";
import { StarEmptyIcon, StarFullIcon } from "../../../components/icons";
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 replaceableEventLoaderService from "../../../services/replaceable-event-requester";
diff --git a/src/views/emoji-packs/emoji-pack.tsx b/src/views/emoji-packs/emoji-pack.tsx
index 08f0ccb41..b66e48409 100644
--- a/src/views/emoji-packs/emoji-pack.tsx
+++ b/src/views/emoji-packs/emoji-pack.tsx
@@ -22,12 +22,12 @@ import {
import UserLink from "../../components/user-link";
import { ChevronLeftIcon } from "../../components/icons";
import useCurrentAccount from "../../hooks/use-current-account";
-import { useDeleteEventContext } from "../../providers/delete-event-provider";
+import { useDeleteEventContext } from "../../providers/route/delete-event-provider";
import useReplaceableEvent from "../../hooks/use-replaceable-event";
import EmojiPackMenu from "./components/emoji-pack-menu";
import EmojiPackFavoriteButton from "./components/emoji-pack-favorite-button";
import { EMOJI_PACK_KIND, getEmojisFromPack, getPackName } from "../../helpers/nostr/emoji-packs";
-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 replaceableEventLoaderService from "../../services/replaceable-event-requester";
diff --git a/src/views/files/index.tsx b/src/views/files/index.tsx
index 5e45424ec..91c927085 100644
--- a/src/views/files/index.tsx
+++ b/src/views/files/index.tsx
@@ -7,10 +7,10 @@ import { NostrEvent } from "../../types/nostr-event";
import { FILE_KIND, IMAGE_TYPES, VIDEO_TYPES, getFileUrl, parseImageFile } from "../../helpers/nostr/files";
import { ErrorBoundary } from "../../components/error-boundary";
import useAppSettings from "../../hooks/use-app-settings";
-import { TrustProvider, useTrusted } from "../../providers/trust";
+import { TrustProvider, useTrusted } from "../../providers/local/trust";
import BlurredImage from "../../components/blured-image";
-import PeopleListProvider, { usePeopleListContext } from "../../providers/people-list-provider";
-import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/relay-selection-provider";
+import PeopleListProvider, { usePeopleListContext } from "../../providers/local/people-list-provider";
+import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/local/relay-selection-provider";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
import RelaySelectionButton from "../../components/relay-selection/relay-selection-button";
import { UserAvatarLink } from "../../components/user-avatar-link";
@@ -20,7 +20,9 @@ import TimelineActionAndStatus from "../../components/timeline-page/timeline-act
import VerticalPageLayout from "../../components/vertical-page-layout";
import Timestamp from "../../components/timestamp";
import NoteZapButton from "../../components/note/note-zap-button";
-import IntersectionObserverProvider, { useRegisterIntersectionEntity } from "../../providers/intersection-observer";
+import IntersectionObserverProvider, {
+ useRegisterIntersectionEntity,
+} from "../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
function ImageFile({ event }: { event: NostrEvent }) {
diff --git a/src/views/goals/browse.tsx b/src/views/goals/browse.tsx
index ea02ab3da..c05d6810d 100644
--- a/src/views/goals/browse.tsx
+++ b/src/views/goals/browse.tsx
@@ -2,11 +2,11 @@ import { useCallback } from "react";
import { Flex, SimpleGrid, Switch, useDisclosure } from "@chakra-ui/react";
import dayjs from "dayjs";
-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 GoalCard from "./components/goal-card";
diff --git a/src/views/goals/components/goal-card.tsx b/src/views/goals/components/goal-card.tsx
index a30d111bb..811f800da 100644
--- a/src/views/goals/components/goal-card.tsx
+++ b/src/views/goals/components/goal-card.tsx
@@ -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 { getEventUID } from "../../../helpers/nostr/events";
import { getGoalClosedDate, getGoalName } from "../../../helpers/nostr/goal";
import GoalMenu from "./goal-menu";
diff --git a/src/views/hashtag/index.tsx b/src/views/hashtag/index.tsx
index 83b86827b..9f6287d6c 100644
--- a/src/views/hashtag/index.tsx
+++ b/src/views/hashtag/index.tsx
@@ -19,12 +19,12 @@ import { isReply, isRepost } from "../../helpers/nostr/events";
import { CheckIcon, EditIcon } from "../../components/icons";
import { NostrEvent } from "../../types/nostr-event";
import RelaySelectionButton from "../../components/relay-selection/relay-selection-button";
-import RelaySelectionProvider, { useRelaySelectionRelays } from "../../providers/relay-selection-provider";
+import RelaySelectionProvider, { useRelaySelectionRelays } from "../../providers/local/relay-selection-provider";
import useRelaysChanged from "../../hooks/use-relays-changed";
import TimelinePage, { useTimelinePageEventFilter } from "../../components/timeline-page";
import TimelineViewTypeButtons from "../../components/timeline-page/timeline-view-type";
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 NoteFilterTypeButtons from "../../components/note-filter-type-buttons";
import { useRouteStateBoolean } from "../../hooks/use-route-state-value";
diff --git a/src/views/home/index.tsx b/src/views/home/index.tsx
index c9b4c90f8..02444c8a2 100644
--- a/src/views/home/index.tsx
+++ b/src/views/home/index.tsx
@@ -9,8 +9,8 @@ import TimelinePage, { useTimelinePageEventFilter } from "../../components/timel
import TimelineViewTypeButtons from "../../components/timeline-page/timeline-view-type";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
import RelaySelectionButton from "../../components/relay-selection/relay-selection-button";
-import PeopleListProvider, { usePeopleListContext } from "../../providers/people-list-provider";
-import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/relay-selection-provider";
+import PeopleListProvider, { usePeopleListContext } from "../../providers/local/people-list-provider";
+import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/local/relay-selection-provider";
import useClientSideMuteFilter from "../../hooks/use-client-side-mute-filter";
import NoteFilterTypeButtons from "../../components/note-filter-type-buttons";
diff --git a/src/views/lists/browse.tsx b/src/views/lists/browse.tsx
index e140a0e65..e01c2b1b4 100644
--- a/src/views/lists/browse.tsx
+++ b/src/views/lists/browse.tsx
@@ -1,6 +1,6 @@
import { Flex, Select, 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 useTimelineLoader from "../../hooks/use-timeline-loader";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
@@ -14,7 +14,7 @@ import {
} from "../../helpers/nostr/lists";
import { useCallback, useState } from "react";
import { NostrEvent } from "../../types/nostr-event";
-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 ListCard from "./components/list-card";
diff --git a/src/views/lists/components/list-card.tsx b/src/views/lists/components/list-card.tsx
index abdc86d20..202161ae8 100644
--- a/src/views/lists/components/list-card.tsx
+++ b/src/views/lists/components/list-card.tsx
@@ -30,7 +30,7 @@ import { getSharableEventAddress } from "../../../helpers/nip19";
import { NostrEvent } from "../../../types/nostr-event";
import useReplaceableEvent from "../../../hooks/use-replaceable-event";
import { createCoordinate } from "../../../services/replaceable-event-requester";
-import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
+import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import ListFavoriteButton from "./list-favorite-button";
import { getEventUID } from "../../../helpers/nostr/events";
import ListMenu from "./list-menu";
diff --git a/src/views/lists/components/list-favorite-button.tsx b/src/views/lists/components/list-favorite-button.tsx
index 46bde396e..2d63e3446 100644
--- a/src/views/lists/components/list-favorite-button.tsx
+++ b/src/views/lists/components/list-favorite-button.tsx
@@ -5,7 +5,7 @@ import dayjs from "dayjs";
import { DraftNostrEvent, NostrEvent } from "../../../types/nostr-event";
import { StarEmptyIcon, StarFullIcon } from "../../../components/icons";
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 replaceableEventLoaderService from "../../../services/replaceable-event-requester";
diff --git a/src/views/lists/components/new-list-modal.tsx b/src/views/lists/components/new-list-modal.tsx
index bfebc0ea7..939e12455 100644
--- a/src/views/lists/components/new-list-modal.tsx
+++ b/src/views/lists/components/new-list-modal.tsx
@@ -19,7 +19,7 @@ import dayjs from "dayjs";
import { NOTE_LIST_KIND, PEOPLE_LIST_KIND } from "../../../helpers/nostr/lists";
import { DraftNostrEvent, NostrEvent } from "../../../types/nostr-event";
-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";
diff --git a/src/views/lists/components/user-card.tsx b/src/views/lists/components/user-card.tsx
index 50168ff2e..c45a4a295 100644
--- a/src/views/lists/components/user-card.tsx
+++ b/src/views/lists/components/user-card.tsx
@@ -9,7 +9,7 @@ import { UserDnsIdentityIcon } from "../../../components/user-dns-identity-icon"
import { NostrEvent } from "../../../types/nostr-event";
import useAsyncErrorHandler from "../../../hooks/use-async-error-handler";
import { listRemovePerson } 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 useCurrentAccount from "../../../hooks/use-current-account";
diff --git a/src/views/lists/list/index.tsx b/src/views/lists/list/index.tsx
index 1f904c1fb..c4ed1efc4 100644
--- a/src/views/lists/list/index.tsx
+++ b/src/views/lists/list/index.tsx
@@ -6,7 +6,7 @@ import { Box, Button, Flex, Heading, SimpleGrid, Spacer, Spinner, Text } from "@
import UserLink from "../../../components/user-link";
import { ChevronLeftIcon } from "../../../components/icons";
import useCurrentAccount from "../../../hooks/use-current-account";
-import { useDeleteEventContext } from "../../../providers/delete-event-provider";
+import { useDeleteEventContext } from "../../../providers/route/delete-event-provider";
import {
getEventsFromList,
getListDescription,
@@ -19,7 +19,7 @@ import {
import useReplaceableEvent from "../../../hooks/use-replaceable-event";
import UserCard from "../components/user-card";
import OpenGraphCard from "../../../components/open-graph-card";
-import { TrustProvider } from "../../../providers/trust";
+import { TrustProvider } from "../../../providers/local/trust";
import ListMenu from "../components/list-menu";
import ListFavoriteButton from "../components/list-favorite-button";
import ListFeedButton from "../components/list-feed-button";
diff --git a/src/views/notifications/index.tsx b/src/views/notifications/index.tsx
index a39af76c4..087bb0e48 100644
--- a/src/views/notifications/index.tsx
+++ b/src/views/notifications/index.tsx
@@ -3,14 +3,16 @@ import { Button, ButtonGroup, Flex, useDisclosure } from "@chakra-ui/react";
import { Kind } from "nostr-tools";
import { Link as RouterLink } from "react-router-dom";
-import RequireCurrentAccount from "../../providers/require-current-account";
+import RequireCurrentAccount from "../../providers/route/require-current-account";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
-import IntersectionObserverProvider, { useRegisterIntersectionEntity } from "../../providers/intersection-observer";
+import IntersectionObserverProvider, {
+ useRegisterIntersectionEntity,
+} from "../../providers/local/intersection-observer";
import useSubject from "../../hooks/use-subject";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-import { useNotificationTimeline } from "../../providers/notification-timeline";
+import { useNotificationTimeline } from "../../providers/global/notification-timeline";
import { getEventUID, isReply } from "../../helpers/nostr/events";
-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 VerticalPageLayout from "../../components/vertical-page-layout";
import NotificationItem from "./notification-item";
diff --git a/src/views/notifications/notification-item.tsx b/src/views/notifications/notification-item.tsx
index 37a076e5a..0067b1df1 100644
--- a/src/views/notifications/notification-item.tsx
+++ b/src/views/notifications/notification-item.tsx
@@ -4,14 +4,14 @@ import { Kind, nip18, nip25 } from "nostr-tools";
import useCurrentAccount from "../../hooks/use-current-account";
import { NostrEvent, isATag, isETag } from "../../types/nostr-event";
-import { useRegisterIntersectionEntity } from "../../providers/intersection-observer";
+import { useRegisterIntersectionEntity } from "../../providers/local/intersection-observer";
import { parseZapEvent } from "../../helpers/nostr/zaps";
import { readablizeSats } from "../../helpers/bolt11";
import { getEventUID, getReferences, isMentionedInContent, parseCoordinate } from "../../helpers/nostr/events";
import { EmbedEvent, EmbedEventPointer } from "../../components/embed-event";
import EmbeddedUnknown from "../../components/embed-event/event-types/embedded-unknown";
import { ErrorBoundary } from "../../components/error-boundary";
-import { TrustProvider } from "../../providers/trust";
+import { TrustProvider } from "../../providers/local/trust";
import Heart from "../../components/icons/heart";
import UserAvatarLink from "../../components/user-avatar-link";
import { AtIcon, ChevronDownIcon, ChevronUpIcon, LightningIcon, ReplyIcon, RepostIcon } from "../../components/icons";
diff --git a/src/views/notifications/threads.tsx b/src/views/notifications/threads.tsx
index ac08e5da5..4cdf0ec76 100644
--- a/src/views/notifications/threads.tsx
+++ b/src/views/notifications/threads.tsx
@@ -3,12 +3,12 @@ import { Kind } from "nostr-tools";
import { Link as RouterLink, useNavigate } from "react-router-dom";
import useCurrentAccount from "../../hooks/use-current-account";
-import PeopleListProvider, { usePeopleListContext } from "../../providers/people-list-provider";
-import RequireCurrentAccount from "../../providers/require-current-account";
+import PeopleListProvider, { usePeopleListContext } from "../../providers/local/people-list-provider";
+import RequireCurrentAccount from "../../providers/route/require-current-account";
import VerticalPageLayout from "../../components/vertical-page-layout";
import useSubject from "../../hooks/use-subject";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-import { useNotificationTimeline } from "../../providers/notification-timeline";
+import { useNotificationTimeline } from "../../providers/global/notification-timeline";
import { TORRENT_COMMENT_KIND } from "../../helpers/nostr/torrents";
import { groupByRoot } from "../../helpers/notification";
import { NostrEvent } from "../../types/nostr-event";
@@ -23,7 +23,9 @@ import Timestamp from "../../components/timestamp";
import HoverLinkOverlay from "../../components/hover-link-overlay";
import { getSharableEventAddress } from "../../helpers/nip19";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
-import IntersectionObserverProvider, { useRegisterIntersectionEntity } from "../../providers/intersection-observer";
+import IntersectionObserverProvider, {
+ useRegisterIntersectionEntity,
+} from "../../providers/local/intersection-observer";
import { getEventUID } from "../../helpers/nostr/events";
import { useNavigateInDrawer } from "../../providers/drawer-sub-view-provider";
diff --git a/src/views/profile/index.tsx b/src/views/profile/index.tsx
index b212d9f0b..3f1a4c7e7 100644
--- a/src/views/profile/index.tsx
+++ b/src/views/profile/index.tsx
@@ -1,4 +1,4 @@
-import RequireCurrentAccount from "../../providers/require-current-account";
+import RequireCurrentAccount from "../../providers/route/require-current-account";
import { ProfileEditView } from "./edit";
export default function ProfileView() {
diff --git a/src/views/relays/components/relay-review-note.tsx b/src/views/relays/components/relay-review-note.tsx
index d68c9b2f4..0d5d65d9a 100644
--- a/src/views/relays/components/relay-review-note.tsx
+++ b/src/views/relays/components/relay-review-note.tsx
@@ -8,7 +8,7 @@ import { UserDnsIdentityIcon } from "../../../components/user-dns-identity-icon"
import StarRating from "../../../components/star-rating";
import { safeJson } from "../../../helpers/parse";
import { NostrEvent } from "../../../types/nostr-event";
-import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
+import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import { NoteContents } from "../../../components/note/text-note-contents";
import { Metadata } from "./relay-card";
import { getEventUID } from "../../../helpers/nostr/events";
diff --git a/src/views/relays/components/relay-share-button.tsx b/src/views/relays/components/relay-share-button.tsx
index ebd2945b8..56c2f5caf 100644
--- a/src/views/relays/components/relay-share-button.tsx
+++ b/src/views/relays/components/relay-share-button.tsx
@@ -2,7 +2,7 @@ import { useCallback } from "react";
import dayjs from "dayjs";
import { IconButton, IconButtonProps, useToast } from "@chakra-ui/react";
-import { useSigningContext } from "../../../providers/signing-provider";
+import { useSigningContext } from "../../../providers/global/signing-provider";
import clientRelaysService from "../../../services/client-relays";
import { DraftNostrEvent } from "../../../types/nostr-event";
import NostrPublishAction from "../../../classes/nostr-publish-action";
diff --git a/src/views/relays/popular.tsx b/src/views/relays/popular.tsx
index 08c579711..054a046ae 100644
--- a/src/views/relays/popular.tsx
+++ b/src/views/relays/popular.tsx
@@ -20,7 +20,7 @@ import { useClientRelays, useReadRelayUrls } from "../../hooks/use-client-relays
import useCurrentAccount from "../../hooks/use-current-account";
import useSubjects from "../../hooks/use-subjects";
import useUserContactList from "../../hooks/use-user-contact-list";
-import RequireCurrentAccount from "../../providers/require-current-account";
+import RequireCurrentAccount from "../../providers/route/require-current-account";
import userRelaysService from "../../services/user-relays";
import { NostrEvent } from "../../types/nostr-event";
import { RelayFavicon } from "../../components/relay-favicon";
diff --git a/src/views/relays/relay/index.tsx b/src/views/relays/relay/index.tsx
index 64513147e..895d9208b 100644
--- a/src/views/relays/relay/index.tsx
+++ b/src/views/relays/relay/index.tsx
@@ -21,7 +21,7 @@ import { ExternalLinkIcon } from "../../../components/icons";
import RelayReviewForm from "./relay-review-form";
import RelayReviews from "./relay-reviews";
import RelayNotes from "./relay-notes";
-import PeopleListProvider from "../../../providers/people-list-provider";
+import PeopleListProvider from "../../../providers/local/people-list-provider";
import PeopleListSelection from "../../../components/people-list-selection/people-list-selection";
import { RelayFavicon } from "../../../components/relay-favicon";
import VerticalPageLayout from "../../../components/vertical-page-layout";
diff --git a/src/views/relays/relay/relay-notes.tsx b/src/views/relays/relay/relay-notes.tsx
index c89344f00..e8eedbc3d 100644
--- a/src/views/relays/relay/relay-notes.tsx
+++ b/src/views/relays/relay/relay-notes.tsx
@@ -9,7 +9,7 @@ import { NostrEvent } from "../../../types/nostr-event";
import TimelinePage, { useTimelinePageEventFilter } from "../../../components/timeline-page";
import TimelineViewTypeButtons from "../../../components/timeline-page/timeline-view-type";
import PeopleListSelection from "../../../components/people-list-selection/people-list-selection";
-import { usePeopleListContext } from "../../../providers/people-list-provider";
+import { usePeopleListContext } from "../../../providers/local/people-list-provider";
import { NostrRequestFilter } from "../../../types/nostr-query";
import useClientSideMuteFilter from "../../../hooks/use-client-side-mute-filter";
import NoteFilterTypeButtons from "../../../components/note-filter-type-buttons";
diff --git a/src/views/relays/relay/relay-review-form.tsx b/src/views/relays/relay/relay-review-form.tsx
index e9a080eab..5e2c660ac 100644
--- a/src/views/relays/relay/relay-review-form.tsx
+++ b/src/views/relays/relay/relay-review-form.tsx
@@ -6,7 +6,7 @@ import { useWriteRelayUrls } from "../../../hooks/use-client-relays";
import StarRating from "../../../components/star-rating";
import { DraftNostrEvent } from "../../../types/nostr-event";
import { RELAY_REVIEW_LABEL, RELAY_REVIEW_LABEL_NAMESPACE, REVIEW_KIND } from "../../../helpers/nostr/reviews";
-import { useSigningContext } from "../../../providers/signing-provider";
+import { useSigningContext } from "../../../providers/global/signing-provider";
import NostrPublishAction from "../../../classes/nostr-publish-action";
export default function RelayReviewForm({
diff --git a/src/views/relays/relay/relay-reviews.tsx b/src/views/relays/relay/relay-reviews.tsx
index 96c085370..eca249b77 100644
--- a/src/views/relays/relay/relay-reviews.tsx
+++ b/src/views/relays/relay/relay-reviews.tsx
@@ -6,7 +6,7 @@ import useSubject from "../../../hooks/use-subject";
import useTimelineLoader from "../../../hooks/use-timeline-loader";
import RelayReviewNote from "../components/relay-review-note";
import { useAppTitle } from "../../../hooks/use-app-title";
-import { usePeopleListContext } from "../../../providers/people-list-provider";
+import { usePeopleListContext } from "../../../providers/local/people-list-provider";
export default function RelayReviews({ relay }: { relay: string }) {
useAppTitle(`${relay} - Reviews`);
diff --git a/src/views/relays/reviews.tsx b/src/views/relays/reviews.tsx
index 4f17ba1d0..cd0e808dc 100644
--- a/src/views/relays/reviews.tsx
+++ b/src/views/relays/reviews.tsx
@@ -6,8 +6,8 @@ import useTimelineLoader from "../../hooks/use-timeline-loader";
import useSubject from "../../hooks/use-subject";
import RelayReviewNote from "./components/relay-review-note";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-import IntersectionObserverProvider from "../../providers/intersection-observer";
-import PeopleListProvider, { usePeopleListContext } from "../../providers/people-list-provider";
+import IntersectionObserverProvider from "../../providers/local/intersection-observer";
+import PeopleListProvider, { usePeopleListContext } from "../../providers/local/people-list-provider";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
import VerticalPageLayout from "../../components/vertical-page-layout";
import { ChevronLeftIcon } from "../../components/icons";
diff --git a/src/views/search/article-results.tsx b/src/views/search/article-results.tsx
index e579f0599..896a30f22 100644
--- a/src/views/search/article-results.tsx
+++ b/src/views/search/article-results.tsx
@@ -1,11 +1,11 @@
import { Kind } from "nostr-tools";
-import { useRelaySelectionRelays } from "../../providers/relay-selection-provider";
+import { useRelaySelectionRelays } from "../../providers/local/relay-selection-provider";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-import IntersectionObserverProvider from "../../providers/intersection-observer";
+import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import GenericNoteTimeline from "../../components/timeline-page/generic-note-timeline";
-import { usePeopleListContext } from "../../providers/people-list-provider";
+import { usePeopleListContext } from "../../providers/local/people-list-provider";
export default function ArticleSearchResults({ search }: { search: string }) {
const searchRelays = useRelaySelectionRelays();
diff --git a/src/views/search/community-results.tsx b/src/views/search/community-results.tsx
index 2a0b84f4a..b5e1a5bcc 100644
--- a/src/views/search/community-results.tsx
+++ b/src/views/search/community-results.tsx
@@ -1,14 +1,16 @@
-import { useRelaySelectionRelays } from "../../providers/relay-selection-provider";
+import { useRelaySelectionRelays } from "../../providers/local/relay-selection-provider";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-import IntersectionObserverProvider, { useRegisterIntersectionEntity } from "../../providers/intersection-observer";
+import IntersectionObserverProvider, {
+ useRegisterIntersectionEntity,
+} from "../../providers/local/intersection-observer";
import { COMMUNITY_DEFINITION_KIND } from "../../helpers/nostr/communities";
import { useRef } from "react";
import { getEventUID } from "../../helpers/nostr/events";
import { NostrEvent } from "../../types/nostr-event";
import CommunityCard from "../communities/components/community-card";
import useSubject from "../../hooks/use-subject";
-import { usePeopleListContext } from "../../providers/people-list-provider";
+import { usePeopleListContext } from "../../providers/local/people-list-provider";
function CommunityResult({ community }: { community: NostrEvent }) {
const ref = useRef(null);
diff --git a/src/views/search/index.tsx b/src/views/search/index.tsx
index e6f36f054..a9ee77d21 100644
--- a/src/views/search/index.tsx
+++ b/src/views/search/index.tsx
@@ -8,7 +8,7 @@ import { getMatchHashtag } from "../../helpers/regexp";
import { CommunityIcon, CopyToClipboardIcon, NotesIcon, QrCodeIcon } from "../../components/icons";
import QrScannerModal from "../../components/qr-scanner-modal";
import RelaySelectionButton from "../../components/relay-selection/relay-selection-button";
-import RelaySelectionProvider from "../../providers/relay-selection-provider";
+import RelaySelectionProvider from "../../providers/local/relay-selection-provider";
import VerticalPageLayout from "../../components/vertical-page-layout";
import User01 from "../../components/icons/user-01";
import Feather from "../../components/icons/feather";
@@ -16,7 +16,7 @@ import ProfileSearchResults from "./profile-results";
import NoteSearchResults from "./note-results";
import ArticleSearchResults from "./article-results";
import CommunitySearchResults from "./community-results";
-import PeopleListProvider from "../../providers/people-list-provider";
+import PeopleListProvider from "../../providers/local/people-list-provider";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
import useRouteSearchValue from "../../hooks/use-route-search-value";
diff --git a/src/views/search/note-results.tsx b/src/views/search/note-results.tsx
index 545790ce8..3737f9807 100644
--- a/src/views/search/note-results.tsx
+++ b/src/views/search/note-results.tsx
@@ -1,11 +1,11 @@
import { Kind } from "nostr-tools";
-import { useRelaySelectionRelays } from "../../providers/relay-selection-provider";
+import { useRelaySelectionRelays } from "../../providers/local/relay-selection-provider";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-import IntersectionObserverProvider from "../../providers/intersection-observer";
+import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import GenericNoteTimeline from "../../components/timeline-page/generic-note-timeline";
-import { usePeopleListContext } from "../../providers/people-list-provider";
+import { usePeopleListContext } from "../../providers/local/people-list-provider";
export default function NoteSearchResults({ search }: { search: string }) {
const searchRelays = useRelaySelectionRelays();
diff --git a/src/views/search/profile-results.tsx b/src/views/search/profile-results.tsx
index 27e2fc2fa..2f4ec3e2e 100644
--- a/src/views/search/profile-results.tsx
+++ b/src/views/search/profile-results.tsx
@@ -11,14 +11,14 @@ import { UserDnsIdentityIcon } from "../../components/user-dns-identity-icon";
import { embedNostrLinks, renderGenericUrl } from "../../components/embed-types";
import UserLink from "../../components/user-link";
import trustedUserStatsService, { NostrBandUserStats } from "../../services/trusted-user-stats";
-import { useRelaySelectionRelays } from "../../providers/relay-selection-provider";
+import { useRelaySelectionRelays } from "../../providers/local/relay-selection-provider";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { Kind } from "nostr-tools";
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 { usePeopleListContext } from "../../providers/people-list-provider";
+import { usePeopleListContext } from "../../providers/local/people-list-provider";
function ProfileResult({ profile }: { profile: NostrEvent }) {
const metadata = parseKind0Event(profile);
diff --git a/src/views/settings/display-settings.tsx b/src/views/settings/display-settings.tsx
index 8c730e697..809ad8d62 100644
--- a/src/views/settings/display-settings.tsx
+++ b/src/views/settings/display-settings.tsx
@@ -28,7 +28,7 @@ import { matchSorter } from "match-sorter";
import { AppSettings } from "../../services/settings/migrations";
import { AppearanceIcon, EditIcon } from "../../components/icons";
-import { useContextEmojis } from "../../providers/emoji-provider";
+import { useContextEmojis } from "../../providers/global/emoji-provider";
export default function DisplaySettings() {
const { register, setValue, getValues, watch } = useFormContext();
diff --git a/src/views/streams/components/stream-card.tsx b/src/views/streams/components/stream-card.tsx
index 7fae2f306..4e7e4f260 100644
--- a/src/views/streams/components/stream-card.tsx
+++ b/src/views/streams/components/stream-card.tsx
@@ -6,7 +6,7 @@ import { Link as RouterLink } from "react-router-dom";
import UserAvatar from "../../../components/user-avatar";
import UserLink from "../../../components/user-link";
import StreamStatusBadge from "./status-badge";
-import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
+import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import useEventNaddr from "../../../hooks/use-event-naddr";
import { getEventUID } from "../../../helpers/nostr/events";
import StreamHashtags from "./stream-hashtags";
diff --git a/src/views/streams/components/stream-share-button.tsx b/src/views/streams/components/stream-share-button.tsx
index d7ff17bad..9da59b124 100644
--- a/src/views/streams/components/stream-share-button.tsx
+++ b/src/views/streams/components/stream-share-button.tsx
@@ -5,7 +5,7 @@ import dayjs from "dayjs";
import { getSharableEventAddress } from "../../../helpers/nip19";
import { DraftNostrEvent } from "../../../types/nostr-event";
-import { PostModalContext } from "../../../providers/post-modal-provider";
+import { PostModalContext } from "../../../providers/route/post-modal-provider";
import { RepostIcon } from "../../../components/icons";
import { ParsedStream } from "../../../helpers/nostr/stream";
diff --git a/src/views/streams/components/stream-zap-button.tsx b/src/views/streams/components/stream-zap-button.tsx
index 1a7c57f9f..926bb1a36 100644
--- a/src/views/streams/components/stream-zap-button.tsx
+++ b/src/views/streams/components/stream-zap-button.tsx
@@ -3,7 +3,7 @@ import { ParsedStream } from "../../../helpers/nostr/stream";
import { LightningIcon } from "../../../components/icons";
import useUserLNURLMetadata from "../../../hooks/use-user-lnurl-metadata";
import ZapModal from "../../../components/event-zap-modal";
-import { useRelaySelectionRelays } from "../../../providers/relay-selection-provider";
+import { useRelaySelectionRelays } from "../../../providers/local/relay-selection-provider";
import useStreamGoal from "../../../hooks/use-stream-goal";
export default function StreamZapButton({
diff --git a/src/views/streams/components/streamer-cards.tsx b/src/views/streams/components/streamer-cards.tsx
index f87f59635..b1080225e 100644
--- a/src/views/streams/components/streamer-cards.tsx
+++ b/src/views/streams/components/streamer-cards.tsx
@@ -13,7 +13,7 @@ import {
} from "@chakra-ui/react";
import { useReadRelayUrls } from "../../../hooks/use-client-relays";
-import { useRelaySelectionRelays } from "../../../providers/relay-selection-provider";
+import { useRelaySelectionRelays } from "../../../providers/local/relay-selection-provider";
import replaceableEventLoaderService from "../../../services/replaceable-event-requester";
import useSubject from "../../../hooks/use-subject";
import { NoteContents } from "../../../components/note/text-note-contents";
diff --git a/src/views/streams/dashboard/chat-card.tsx b/src/views/streams/dashboard/chat-card.tsx
index 2a597e7be..d4539018b 100644
--- a/src/views/streams/dashboard/chat-card.tsx
+++ b/src/views/streams/dashboard/chat-card.tsx
@@ -3,7 +3,7 @@ import { Flex } from "@chakra-ui/react";
import useStreamChatTimeline from "../stream/stream-chat/use-stream-chat-timeline";
import { useTimelineCurserIntersectionCallback } from "../../../hooks/use-timeline-cursor-intersection-callback";
-import IntersectionObserverProvider from "../../../providers/intersection-observer";
+import IntersectionObserverProvider from "../../../providers/local/intersection-observer";
import StreamChatLog from "../stream/stream-chat/chat-log";
import ChatMessageForm from "../stream/stream-chat/stream-chat-form";
import { ParsedStream } from "../../../helpers/nostr/stream";
diff --git a/src/views/streams/dashboard/index.tsx b/src/views/streams/dashboard/index.tsx
index 46f2c85cd..44d355bb9 100644
--- a/src/views/streams/dashboard/index.tsx
+++ b/src/views/streams/dashboard/index.tsx
@@ -10,12 +10,12 @@ import useParsedStreams from "../../../hooks/use-parsed-streams";
import useSubject from "../../../hooks/use-subject";
import { ParsedStream, STREAM_KIND, getATag } from "../../../helpers/nostr/stream";
import useTimelineLoader from "../../../hooks/use-timeline-loader";
-import RequireCurrentAccount from "../../../providers/require-current-account";
+import RequireCurrentAccount from "../../../providers/route/require-current-account";
import useCurrentAccount from "../../../hooks/use-current-account";
import { getEventUID } from "../../../helpers/nostr/events";
import { useReadRelayUrls } from "../../../hooks/use-client-relays";
import { ChevronLeftIcon } from "../../../components/icons";
-import RelaySelectionProvider from "../../../providers/relay-selection-provider";
+import RelaySelectionProvider from "../../../providers/local/relay-selection-provider";
import UsersCard from "./users-card";
import ZapsCard from "./zaps-card";
import ChatCard from "./chat-card";
diff --git a/src/views/streams/dashboard/users-card.tsx b/src/views/streams/dashboard/users-card.tsx
index cc287c78a..dd3259c66 100644
--- a/src/views/streams/dashboard/users-card.tsx
+++ b/src/views/streams/dashboard/users-card.tsx
@@ -8,7 +8,7 @@ import useStreamChatTimeline from "../stream/stream-chat/use-stream-chat-timelin
import UserAvatar from "../../../components/user-avatar";
import UserLink from "../../../components/user-link";
import useUserMuteFunctions from "../../../hooks/use-user-mute-functions";
-import { useMuteModalContext } from "../../../providers/mute-modal-provider";
+import { useMuteModalContext } from "../../../providers/route/mute-modal-provider";
import useUserMuteList from "../../../hooks/use-user-mute-list";
import { isPubkeyInList } from "../../../helpers/nostr/lists";
import { ParsedStream } from "../../../helpers/nostr/stream";
diff --git a/src/views/streams/index.tsx b/src/views/streams/index.tsx
index 003a49326..4c2b99c85 100644
--- a/src/views/streams/index.tsx
+++ b/src/views/streams/index.tsx
@@ -2,16 +2,16 @@ import { useCallback, useMemo } from "react";
import { Divider, Flex, Heading, SimpleGrid } from "@chakra-ui/react";
import useTimelineLoader from "../../hooks/use-timeline-loader";
-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 StreamCard from "./components/stream-card";
import { STREAM_KIND } from "../../helpers/nostr/stream";
import RelaySelectionButton from "../../components/relay-selection/relay-selection-button";
-import RelaySelectionProvider, { useRelaySelectionRelays } from "../../providers/relay-selection-provider";
+import RelaySelectionProvider, { useRelaySelectionRelays } from "../../providers/local/relay-selection-provider";
import useRelaysChanged from "../../hooks/use-relays-changed";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
-import PeopleListProvider, { usePeopleListContext } from "../../providers/people-list-provider";
+import PeopleListProvider, { usePeopleListContext } from "../../providers/local/people-list-provider";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
import useParsedStreams from "../../hooks/use-parsed-streams";
import { NostrRequestFilter } from "../../types/nostr-query";
diff --git a/src/views/streams/stream/index.tsx b/src/views/streams/stream/index.tsx
index 0f6fdcaa3..e21a2a79b 100644
--- a/src/views/streams/stream/index.tsx
+++ b/src/views/streams/stream/index.tsx
@@ -35,11 +35,11 @@ import StreamDebugButton from "../components/stream-debug-button";
import replaceableEventLoaderService from "../../../services/replaceable-event-requester";
import useSubject from "../../../hooks/use-subject";
import RelaySelectionButton from "../../../components/relay-selection/relay-selection-button";
-import RelaySelectionProvider from "../../../providers/relay-selection-provider";
+import RelaySelectionProvider from "../../../providers/local/relay-selection-provider";
import StreamerCards from "../components/streamer-cards";
import { useAppTitle } from "../../../hooks/use-app-title";
import StreamSatsPerMinute from "../components/stream-sats-per-minute";
-import { UserEmojiProvider } from "../../../providers/emoji-provider";
+import { UserEmojiProvider } from "../../../providers/global/emoji-provider";
import StreamStatusBadge from "../components/status-badge";
import ChatMessageForm from "./stream-chat/stream-chat-form";
import StreamChatLog from "./stream-chat/chat-log";
@@ -49,7 +49,7 @@ import StreamZapButton from "../components/stream-zap-button";
import StreamGoal from "../components/stream-goal";
import StreamShareButton from "../components/stream-share-button";
import VerticalPageLayout from "../../../components/vertical-page-layout";
-import { useBreakpointValue } from "../../../providers/breakpoint-provider";
+import { useBreakpointValue } from "../../../providers/global/breakpoint-provider";
function DesktopStreamPage({ stream }: { stream: ParsedStream }) {
useAppTitle(stream.title);
diff --git a/src/views/streams/stream/stream-chat/chat-message.tsx b/src/views/streams/stream/stream-chat/chat-message.tsx
index 5f269d8be..a62f74905 100644
--- a/src/views/streams/stream/stream-chat/chat-message.tsx
+++ b/src/views/streams/stream/stream-chat/chat-message.tsx
@@ -5,8 +5,8 @@ import { ParsedStream } from "../../../../helpers/nostr/stream";
import UserAvatar from "../../../../components/user-avatar";
import UserLink from "../../../../components/user-link";
import { NostrEvent } from "../../../../types/nostr-event";
-import { useRegisterIntersectionEntity } from "../../../../providers/intersection-observer";
-import { TrustProvider } from "../../../../providers/trust";
+import { useRegisterIntersectionEntity } from "../../../../providers/local/intersection-observer";
+import { TrustProvider } from "../../../../providers/local/trust";
import ChatMessageContent from "./chat-message-content";
import NoteZapButton from "../../../../components/note/note-zap-button";
diff --git a/src/views/streams/stream/stream-chat/index.tsx b/src/views/streams/stream/stream-chat/index.tsx
index 2a0c1b24c..621d24407 100644
--- a/src/views/streams/stream/stream-chat/index.tsx
+++ b/src/views/streams/stream/stream-chat/index.tsx
@@ -3,7 +3,7 @@ import { Card, CardBody, CardHeader, CardProps, Heading } from "@chakra-ui/react
import { ParsedStream } from "../../../../helpers/nostr/stream";
import { LightboxProvider } from "../../../../components/lightbox-provider";
-import IntersectionObserverProvider from "../../../../providers/intersection-observer";
+import IntersectionObserverProvider from "../../../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../../../hooks/use-timeline-cursor-intersection-callback";
import TopZappers from "../../components/top-zappers";
import ChatMessageForm from "./stream-chat-form";
diff --git a/src/views/streams/stream/stream-chat/stream-chat-form.tsx b/src/views/streams/stream/stream-chat/stream-chat-form.tsx
index 820507e0c..37a6ddcfc 100644
--- a/src/views/streams/stream/stream-chat/stream-chat-form.tsx
+++ b/src/views/streams/stream/stream-chat/stream-chat-form.tsx
@@ -3,14 +3,14 @@ import { Box, Button, Flex, useToast } from "@chakra-ui/react";
import { useForm } from "react-hook-form";
import { ParsedStream, buildChatMessage } from "../../../../helpers/nostr/stream";
-import { useRelaySelectionRelays } from "../../../../providers/relay-selection-provider";
+import { useRelaySelectionRelays } from "../../../../providers/local/relay-selection-provider";
import { useUserRelays } from "../../../../hooks/use-user-relays";
import { RelayMode } from "../../../../classes/relay";
import { unique } from "../../../../helpers/array";
-import { useSigningContext } from "../../../../providers/signing-provider";
+import { useSigningContext } from "../../../../providers/global/signing-provider";
import NostrPublishAction from "../../../../classes/nostr-publish-action";
import { createEmojiTags, ensureNotifyContentMentions } from "../../../../helpers/nostr/post";
-import { useContextEmojis } from "../../../../providers/emoji-provider";
+import { useContextEmojis } from "../../../../providers/global/emoji-provider";
import { MagicInput, RefType } from "../../../../components/magic-textarea";
import StreamZapButton from "../../components/stream-zap-button";
import { nostrBuildUploadImage } from "../../../../helpers/nostr-build";
diff --git a/src/views/streams/stream/stream-chat/use-stream-chat-timeline.ts b/src/views/streams/stream/stream-chat/use-stream-chat-timeline.ts
index 5f0c8454d..c4643407b 100644
--- a/src/views/streams/stream/stream-chat/use-stream-chat-timeline.ts
+++ b/src/views/streams/stream/stream-chat/use-stream-chat-timeline.ts
@@ -5,7 +5,7 @@ import { getEventUID } from "../../../../helpers/nostr/events";
import { ParsedStream, STREAM_CHAT_MESSAGE_KIND, getATag } from "../../../../helpers/nostr/stream";
import useTimelineLoader from "../../../../hooks/use-timeline-loader";
import { NostrEvent } from "../../../../types/nostr-event";
-import { useRelaySelectionRelays } from "../../../../providers/relay-selection-provider";
+import { useRelaySelectionRelays } from "../../../../providers/local/relay-selection-provider";
import useStreamGoal from "../../../../hooks/use-stream-goal";
import { NostrQuery } from "../../../../types/nostr-query";
import useUserMuteFilter from "../../../../hooks/use-user-mute-filter";
diff --git a/src/views/streams/stream/stream-chat/zap-message.tsx b/src/views/streams/stream/stream-chat/zap-message.tsx
index 7855f392e..27824e030 100644
--- a/src/views/streams/stream/stream-chat/zap-message.tsx
+++ b/src/views/streams/stream/stream-chat/zap-message.tsx
@@ -5,11 +5,11 @@ import { ParsedStream } from "../../../../helpers/nostr/stream";
import UserAvatar from "../../../../components/user-avatar";
import UserLink from "../../../../components/user-link";
import { NostrEvent } from "../../../../types/nostr-event";
-import { useRegisterIntersectionEntity } from "../../../../providers/intersection-observer";
+import { useRegisterIntersectionEntity } from "../../../../providers/local/intersection-observer";
import { LightningIcon } from "../../../../components/icons";
import { parseZapEvent } from "../../../../helpers/nostr/zaps";
import { readablizeSats } from "../../../../helpers/bolt11";
-import { TrustProvider } from "../../../../providers/trust";
+import { TrustProvider } from "../../../../providers/local/trust";
import ChatMessageContent from "./chat-message-content";
import useClientSideMuteFilter from "../../../../hooks/use-client-side-mute-filter";
diff --git a/src/views/things/index.tsx b/src/views/things/index.tsx
index e4efda271..3840acf1e 100644
--- a/src/views/things/index.tsx
+++ b/src/views/things/index.tsx
@@ -4,15 +4,15 @@ import { Link as RouterLink } from "react-router-dom";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import useSubject from "../../hooks/use-subject";
import { FILE_KIND } from "../../helpers/nostr/files";
-import PeopleListProvider, { usePeopleListContext } from "../../providers/people-list-provider";
-import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/relay-selection-provider";
+import PeopleListProvider, { usePeopleListContext } from "../../providers/local/people-list-provider";
+import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/local/relay-selection-provider";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
import RelaySelectionButton from "../../components/relay-selection/relay-selection-button";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
import VerticalPageLayout from "../../components/vertical-page-layout";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import Upload01 from "../../components/icons/upload-01";
-import IntersectionObserverProvider from "../../providers/intersection-observer";
+import IntersectionObserverProvider from "../../providers/local/intersection-observer";
function FilesPage() {
const { listId, filter } = usePeopleListContext();
diff --git a/src/views/things/upload/index.tsx b/src/views/things/upload/index.tsx
index ff9e8a7a6..0ca4dfbc3 100644
--- a/src/views/things/upload/index.tsx
+++ b/src/views/things/upload/index.tsx
@@ -15,7 +15,7 @@ import {
} from "@chakra-ui/react";
import VerticalPageLayout from "../../../components/vertical-page-layout";
-import { useSigningContext } from "../../../providers/signing-provider";
+import { useSigningContext } from "../../../providers/global/signing-provider";
import { useNavigate } from "react-router-dom";
import useRouteStateValue from "../../../hooks/use-route-state-value";
import SelectFileStep from "./select-file-step";
diff --git a/src/views/thread/components/reply-form.tsx b/src/views/thread/components/reply-form.tsx
index 8ad59bed2..39e4da27c 100644
--- a/src/views/thread/components/reply-form.tsx
+++ b/src/views/thread/components/reply-form.tsx
@@ -16,13 +16,13 @@ import {
getContentMentions,
} from "../../../helpers/nostr/post";
import useCurrentAccount from "../../../hooks/use-current-account";
-import { useSigningContext } from "../../../providers/signing-provider";
+import { useSigningContext } from "../../../providers/global/signing-provider";
import { useWriteRelayUrls } from "../../../hooks/use-client-relays";
import NostrPublishAction from "../../../classes/nostr-publish-action";
import { unique } from "../../../helpers/array";
import MagicTextArea, { RefType } from "../../../components/magic-textarea";
-import { useContextEmojis } from "../../../providers/emoji-provider";
-import { TrustProvider } from "../../../providers/trust";
+import { useContextEmojis } from "../../../providers/global/emoji-provider";
+import { TrustProvider } from "../../../providers/local/trust";
import { nostrBuildUploadImage } from "../../../helpers/nostr-build";
import { UploadImageIcon } from "../../../components/icons";
import { useThrottle } from "react-use";
diff --git a/src/views/thread/components/thread-post.tsx b/src/views/thread/components/thread-post.tsx
index 32305a99c..760df20ee 100644
--- a/src/views/thread/components/thread-post.tsx
+++ b/src/views/thread/components/thread-post.tsx
@@ -15,7 +15,7 @@ import { Link as RouterLink } from "react-router-dom";
import { ReplyIcon } from "../../../components/icons";
import { countReplies, ThreadItem } from "../../../helpers/thread";
-import { TrustProvider } from "../../../providers/trust";
+import { TrustProvider } from "../../../providers/local/trust";
import ReplyForm from "./reply-form";
import useClientSideMuteFilter from "../../../hooks/use-client-side-mute-filter";
import UserAvatarLink from "../../../components/user-avatar-link";
@@ -28,7 +28,7 @@ import NoteZapButton from "../../../components/note/note-zap-button";
import QuoteRepostButton from "../../../components/note/components/quote-repost-button";
import RepostButton from "../../../components/note/components/repost-button";
import NoteMenu from "../../../components/note/note-menu";
-import { useBreakpointValue } from "../../../providers/breakpoint-provider";
+import { useBreakpointValue } from "../../../providers/global/breakpoint-provider";
import NoteReactions from "../../../components/note/components/note-reactions";
import BookmarkButton from "../../../components/note/components/bookmark-button";
import NoteCommunityMetadata from "../../../components/note/note-community-metadata";
@@ -37,7 +37,7 @@ import NoteProxyLink from "../../../components/note/components/note-proxy-link";
import { NoteDetailsButton } from "../../../components/note/components/note-details-button";
import EventInteractionDetailsModal from "../../../components/event-interactions-modal";
import { getSharableEventAddress } from "../../../helpers/nip19";
-import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
+import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import useAppSettings from "../../../hooks/use-app-settings";
import useThreadColorLevelProps from "../../../hooks/use-thread-color-level-props";
import NoteToolsMenu from "../../../components/note/note-tools-menu";
diff --git a/src/views/thread/index.tsx b/src/views/thread/index.tsx
index 1fe844e72..765692724 100644
--- a/src/views/thread/index.tsx
+++ b/src/views/thread/index.tsx
@@ -9,7 +9,7 @@ import { ThreadPost } from "./components/thread-post";
import VerticalPageLayout from "../../components/vertical-page-layout";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import { ThreadItem, buildThread } from "../../helpers/thread";
-import IntersectionObserverProvider from "../../providers/intersection-observer";
+import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import useThreadTimelineLoader from "../../hooks/use-thread-timeline-loader";
import useSingleEvent from "../../hooks/use-single-event";
diff --git a/src/views/tools/dm-timeline.tsx b/src/views/tools/dm-timeline.tsx
index 8d346c695..e413e0b74 100644
--- a/src/views/tools/dm-timeline.tsx
+++ b/src/views/tools/dm-timeline.tsx
@@ -3,12 +3,14 @@ import { memo, useCallback, useRef } from "react";
import { Kind } from "nostr-tools";
import VerticalPageLayout from "../../components/vertical-page-layout";
-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 { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-import IntersectionObserverProvider, { useRegisterIntersectionEntity } from "../../providers/intersection-observer";
+import IntersectionObserverProvider, {
+ useRegisterIntersectionEntity,
+} from "../../providers/local/intersection-observer";
import useSubject from "../../hooks/use-subject";
import EmbeddedDM from "../../components/embed-event/event-types/embedded-dm";
import { NostrEvent } from "../../types/nostr-event";
diff --git a/src/views/tools/network-dm-graph.tsx b/src/views/tools/network-dm-graph.tsx
index 975eeac68..932ed81a6 100644
--- a/src/views/tools/network-dm-graph.tsx
+++ b/src/views/tools/network-dm-graph.tsx
@@ -16,7 +16,7 @@ import {
} from "three";
import useCurrentAccount from "../../hooks/use-current-account";
-import RequireCurrentAccount from "../../providers/require-current-account";
+import RequireCurrentAccount from "../../providers/route/require-current-account";
import { useUsersMetadata } from "../../hooks/use-user-network";
import { getPubkeysFromList } from "../../helpers/nostr/lists";
import useUserContactList from "../../hooks/use-user-contact-list";
@@ -24,7 +24,7 @@ import { useUserMetadata } from "../../hooks/use-user-metadata";
import EventStore from "../../classes/event-store";
import NostrRequest from "../../classes/nostr-request";
import { isPTag } from "../../types/nostr-event";
-import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/relay-selection-provider";
+import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/local/relay-selection-provider";
import RelaySelectionButton from "../../components/relay-selection/relay-selection-button";
import { useDebounce } from "react-use";
import useSubject from "../../hooks/use-subject";
diff --git a/src/views/tools/network-mute-graph.tsx b/src/views/tools/network-mute-graph.tsx
index fcc650604..6ce515462 100644
--- a/src/views/tools/network-mute-graph.tsx
+++ b/src/views/tools/network-mute-graph.tsx
@@ -14,7 +14,7 @@ import {
} from "three";
import useCurrentAccount from "../../hooks/use-current-account";
-import RequireCurrentAccount from "../../providers/require-current-account";
+import RequireCurrentAccount from "../../providers/route/require-current-account";
import { useUsersMetadata } from "../../hooks/use-user-network";
import { MUTE_LIST_KIND, getPubkeysFromList, isPubkeyInList } from "../../helpers/nostr/lists";
import useUserContactList from "../../hooks/use-user-contact-list";
diff --git a/src/views/tools/satellite-cdn/delete-file-button.tsx b/src/views/tools/satellite-cdn/delete-file-button.tsx
index f12afe861..ae82c5ea0 100644
--- a/src/views/tools/satellite-cdn/delete-file-button.tsx
+++ b/src/views/tools/satellite-cdn/delete-file-button.tsx
@@ -2,7 +2,7 @@ import { useCallback, useState } from "react";
import { IconButton, useToast } from "@chakra-ui/react";
import { SatelliteCDNFile, deleteFile } from "../../../helpers/satellite-cdn";
-import { useSigningContext } from "../../../providers/signing-provider";
+import { useSigningContext } from "../../../providers/global/signing-provider";
import { TrashIcon } from "../../../components/icons";
export default function FileDeleteButton({ file }: { file: SatelliteCDNFile }) {
diff --git a/src/views/tools/satellite-cdn/index.tsx b/src/views/tools/satellite-cdn/index.tsx
index 087575926..5a90e36de 100644
--- a/src/views/tools/satellite-cdn/index.tsx
+++ b/src/views/tools/satellite-cdn/index.tsx
@@ -19,7 +19,7 @@ import {
import { useAsync } from "react-use";
import VerticalPageLayout from "../../../components/vertical-page-layout";
-import { useSigningContext } from "../../../providers/signing-provider";
+import { useSigningContext } from "../../../providers/global/signing-provider";
import { NostrEvent } from "../../../types/nostr-event";
import { formatBytes } from "../../../helpers/number";
import { CopyIconButton } from "../../../components/copy-icon-button";
diff --git a/src/views/tools/satellite-cdn/share-file-button.tsx b/src/views/tools/satellite-cdn/share-file-button.tsx
index 8c4ef74c0..927ee28de 100644
--- a/src/views/tools/satellite-cdn/share-file-button.tsx
+++ b/src/views/tools/satellite-cdn/share-file-button.tsx
@@ -1,6 +1,6 @@
import { useContext } from "react";
import { SatelliteCDNFile } from "../../../helpers/satellite-cdn";
-import { PostModalContext } from "../../../providers/post-modal-provider";
+import { PostModalContext } from "../../../providers/route/post-modal-provider";
import { ButtonProps, IconButton } from "@chakra-ui/react";
import { QuoteRepostIcon } from "../../../components/icons";
diff --git a/src/views/tools/transform-note/text-to-speech/index.tsx b/src/views/tools/transform-note/text-to-speech/index.tsx
index 69f0ac6c0..9bdf0b9a8 100644
--- a/src/views/tools/transform-note/text-to-speech/index.tsx
+++ b/src/views/tools/transform-note/text-to-speech/index.tsx
@@ -14,7 +14,7 @@ import {
} from "../../../../helpers/nostr/dvm";
import useSubject from "../../../../hooks/use-subject";
import { DraftNostrEvent, NostrEvent } from "../../../../types/nostr-event";
-import { useSigningContext } from "../../../../providers/signing-provider";
+import { useSigningContext } from "../../../../providers/global/signing-provider";
import relayScoreboardService from "../../../../services/relay-scoreboard";
import NostrPublishAction from "../../../../classes/nostr-publish-action";
import clientRelaysService from "../../../../services/client-relays";
diff --git a/src/views/tools/transform-note/translation/index.tsx b/src/views/tools/transform-note/translation/index.tsx
index 2a5cafb6c..eb27a70e1 100644
--- a/src/views/tools/transform-note/translation/index.tsx
+++ b/src/views/tools/transform-note/translation/index.tsx
@@ -20,7 +20,7 @@ import useTimelineLoader from "../../../../hooks/use-timeline-loader";
import { getEventUID } from "../../../../helpers/nostr/events";
import { useReadRelayUrls } from "../../../../hooks/use-client-relays";
import useSubject from "../../../../hooks/use-subject";
-import { useSigningContext } from "../../../../providers/signing-provider";
+import { useSigningContext } from "../../../../providers/global/signing-provider";
import relayScoreboardService from "../../../../services/relay-scoreboard";
import NostrPublishAction from "../../../../classes/nostr-publish-action";
import clientRelaysService from "../../../../services/client-relays";
diff --git a/src/views/tools/wot-test.tsx b/src/views/tools/wot-test.tsx
index 86c091949..3c2152ff2 100644
--- a/src/views/tools/wot-test.tsx
+++ b/src/views/tools/wot-test.tsx
@@ -2,7 +2,7 @@ import { memo, useMemo, useState } from "react";
import { Button, Flex, Select, SimpleGrid, Text } from "@chakra-ui/react";
import useCurrentAccount from "../../hooks/use-current-account";
-import RequireCurrentAccount from "../../providers/require-current-account";
+import RequireCurrentAccount from "../../providers/route/require-current-account";
import { useNetworkConnectionCount } from "../../hooks/use-user-network";
import UserAvatarLink from "../../components/user-avatar-link";
import UserLink from "../../components/user-link";
diff --git a/src/views/torrents/components/torrent-table-row.tsx b/src/views/torrents/components/torrent-table-row.tsx
index de60507f4..11644058e 100644
--- a/src/views/torrents/components/torrent-table-row.tsx
+++ b/src/views/torrents/components/torrent-table-row.tsx
@@ -8,7 +8,7 @@ import Timestamp from "../../../components/timestamp";
import UserLink from "../../../components/user-link";
import Magnet from "../../../components/icons/magnet";
import { getNeventForEventId } from "../../../helpers/nip19";
-import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
+import { useRegisterIntersectionEntity } from "../../../providers/local/intersection-observer";
import { getEventUID } from "../../../helpers/nostr/events";
import { formatBytes } from "../../../helpers/number";
import NoteZapButton from "../../../components/note/note-zap-button";
diff --git a/src/views/torrents/components/torrents-comments.tsx b/src/views/torrents/components/torrents-comments.tsx
index ef8790a4c..fed6d6091 100644
--- a/src/views/torrents/components/torrents-comments.tsx
+++ b/src/views/torrents/components/torrents-comments.tsx
@@ -6,7 +6,9 @@ import { useReadRelayUrls } from "../../../hooks/use-client-relays";
import useThreadTimelineLoader from "../../../hooks/use-thread-timeline-loader";
import { ThreadItem, buildThread, countReplies } from "../../../helpers/thread";
import { useTimelineCurserIntersectionCallback } from "../../../hooks/use-timeline-cursor-intersection-callback";
-import IntersectionObserverProvider, { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
+import IntersectionObserverProvider, {
+ useRegisterIntersectionEntity,
+} from "../../../providers/local/intersection-observer";
import useAppSettings from "../../../hooks/use-app-settings";
import {
Alert,
@@ -26,7 +28,7 @@ import { UserDnsIdentityIcon } from "../../../components/user-dns-identity-icon"
import Timestamp from "../../../components/timestamp";
import Minus from "../../../components/icons/minus";
import Expand01 from "../../../components/icons/expand-01";
-import { TrustProvider } from "../../../providers/trust";
+import { TrustProvider } from "../../../providers/local/trust";
import { NoteContents } from "../../../components/note/text-note-contents";
import NoteReactions from "../../../components/note/components/note-reactions";
import { ReplyIcon } from "../../../components/icons";
diff --git a/src/views/torrents/index.tsx b/src/views/torrents/index.tsx
index 8326dee7c..54d5ed1f7 100644
--- a/src/views/torrents/index.tsx
+++ b/src/views/torrents/index.tsx
@@ -5,8 +5,8 @@ import { generatePrivateKey, getPublicKey } from "nostr-tools";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
import VerticalPageLayout from "../../components/vertical-page-layout";
-import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/relay-selection-provider";
-import PeopleListProvider, { usePeopleListContext } from "../../providers/people-list-provider";
+import RelaySelectionProvider, { useRelaySelectionContext } from "../../providers/local/relay-selection-provider";
+import PeopleListProvider, { usePeopleListContext } from "../../providers/local/people-list-provider";
import RelaySelectionButton from "../../components/relay-selection/relay-selection-button";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import useClientSideMuteFilter from "../../hooks/use-client-side-mute-filter";
@@ -15,7 +15,7 @@ import { TORRENT_KIND, validateTorrent } from "../../helpers/nostr/torrents";
import useSubject from "../../hooks/use-subject";
import TorrentTableRow from "./components/torrent-table-row";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-import IntersectionObserverProvider from "../../providers/intersection-observer";
+import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import useCurrentAccount from "../../hooks/use-current-account";
import { useUserMetadata } from "../../hooks/use-user-metadata";
import accountService from "../../services/account";
diff --git a/src/views/torrents/new.tsx b/src/views/torrents/new.tsx
index d79d9340d..f9a51a818 100644
--- a/src/views/torrents/new.tsx
+++ b/src/views/torrents/new.tsx
@@ -28,9 +28,9 @@ import { sha1 } from "@noble/hashes/sha1";
import { BencodeValue, decode, encode } from "../../lib/bencode";
import VerticalPageLayout from "../../components/vertical-page-layout";
import { Category, TORRENT_KIND, torrentCatagories } from "../../helpers/nostr/torrents";
-import { useBreakpointValue } from "../../providers/breakpoint-provider";
+import { useBreakpointValue } from "../../providers/global/breakpoint-provider";
import { DraftNostrEvent } from "../../types/nostr-event";
-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 { useNavigate } from "react-router-dom";
diff --git a/src/views/user/about/index.tsx b/src/views/user/about/index.tsx
index 9e728a93f..fc33740c9 100644
--- a/src/views/user/about/index.tsx
+++ b/src/views/user/about/index.tsx
@@ -7,7 +7,7 @@ import { getLudEndpoint } from "../../../helpers/lnurl";
import { EmbedableContent, embedUrls } from "../../../helpers/embeds";
import { truncatedId } from "../../../helpers/nostr/events";
import { parseAddress } from "../../../services/dns-identity";
-import { useAdditionalRelayContext } from "../../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../../providers/local/additional-relay-context";
import { useUserMetadata } from "../../../hooks/use-user-metadata";
import { embedNostrLinks, renderGenericUrl } from "../../../components/embed-types";
import {
diff --git a/src/views/user/about/user-joined-channels.tsx b/src/views/user/about/user-joined-channels.tsx
index f21f09d9d..b47b2cd5d 100644
--- a/src/views/user/about/user-joined-channels.tsx
+++ b/src/views/user/about/user-joined-channels.tsx
@@ -1,8 +1,8 @@
import { Button, Flex, Heading, SimpleGrid, useDisclosure } from "@chakra-ui/react";
-import { useAdditionalRelayContext } from "../../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../../providers/local/additional-relay-context";
import { ErrorBoundary } from "../../../components/error-boundary";
-import { useBreakpointValue } from "../../../providers/breakpoint-provider";
+import { useBreakpointValue } from "../../../providers/global/breakpoint-provider";
import useUserChannelsList from "../../../hooks/use-user-channels-list";
import { PointerChannelCard } from "../../channels/components/channel-card";
diff --git a/src/views/user/about/user-joined-communities.tsx b/src/views/user/about/user-joined-communities.tsx
index 361d7f568..d46e5bae0 100644
--- a/src/views/user/about/user-joined-communities.tsx
+++ b/src/views/user/about/user-joined-communities.tsx
@@ -1,10 +1,10 @@
import { Button, Flex, Heading, SimpleGrid, useDisclosure } from "@chakra-ui/react";
-import { useAdditionalRelayContext } from "../../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../../providers/local/additional-relay-context";
import useUserCommunitiesList from "../../../hooks/use-user-communities-list";
import { PointerCommunityCard } from "../../communities/components/community-card";
import { ErrorBoundary } from "../../../components/error-boundary";
-import { useBreakpointValue } from "../../../providers/breakpoint-provider";
+import { useBreakpointValue } from "../../../providers/global/breakpoint-provider";
export default function UserJoinedCommunities({ pubkey }: { pubkey: string }) {
const contextRelays = useAdditionalRelayContext();
diff --git a/src/views/user/about/user-pinned-events.tsx b/src/views/user/about/user-pinned-events.tsx
index c9b8cb5e1..6aad80f8b 100644
--- a/src/views/user/about/user-pinned-events.tsx
+++ b/src/views/user/about/user-pinned-events.tsx
@@ -1,6 +1,6 @@
import { Button, Flex, Heading, useDisclosure } from "@chakra-ui/react";
-import { useAdditionalRelayContext } from "../../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../../providers/local/additional-relay-context";
import useUserPinList from "../../../hooks/use-user-pin-list";
import { EmbedEventPointer } from "../../../components/embed-event";
diff --git a/src/views/user/about/user-stats-accordion.tsx b/src/views/user/about/user-stats-accordion.tsx
index 6d4e4fe4d..646434622 100644
--- a/src/views/user/about/user-stats-accordion.tsx
+++ b/src/views/user/about/user-stats-accordion.tsx
@@ -18,7 +18,7 @@ import { Kind } from "nostr-tools";
import { readablizeSats } from "../../../helpers/bolt11";
import trustedUserStatsService from "../../../services/trusted-user-stats";
-import { useAdditionalRelayContext } from "../../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../../providers/local/additional-relay-context";
import useUserContactList from "../../../hooks/use-user-contact-list";
import { getPubkeysFromList } from "../../../helpers/nostr/lists";
import Timestamp from "../../../components/timestamp";
diff --git a/src/views/user/articles.tsx b/src/views/user/articles.tsx
index 5e1c8807a..154c70040 100644
--- a/src/views/user/articles.tsx
+++ b/src/views/user/articles.tsx
@@ -1,10 +1,10 @@
import { useOutletContext } from "react-router-dom";
import { Kind } from "nostr-tools";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import useTimelineLoader from "../../hooks/use-timeline-loader";
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 TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
import VerticalPageLayout from "../../components/vertical-page-layout";
diff --git a/src/views/user/components/header.tsx b/src/views/user/components/header.tsx
index 7224e4bea..362ddee55 100644
--- a/src/views/user/components/header.tsx
+++ b/src/views/user/components/header.tsx
@@ -10,7 +10,7 @@ import { useUserMetadata } from "../../../hooks/use-user-metadata";
import { UserProfileMenu } from "./user-profile-menu";
import { UserFollowButton } from "../../../components/user-follow-button";
import accountService from "../../../services/account";
-import { useBreakpointValue } from "../../../providers/breakpoint-provider";
+import { useBreakpointValue } from "../../../providers/global/breakpoint-provider";
export default function Header({
pubkey,
diff --git a/src/views/user/components/user-zap-button.tsx b/src/views/user/components/user-zap-button.tsx
index 28ac4b9b1..178682b4d 100644
--- a/src/views/user/components/user-zap-button.tsx
+++ b/src/views/user/components/user-zap-button.tsx
@@ -2,7 +2,7 @@ import { IconButton, IconButtonProps, useDisclosure } from "@chakra-ui/react";
import { useUserMetadata } from "../../../hooks/use-user-metadata";
import { LightningIcon } from "../../../components/icons";
import ZapModal from "../../../components/event-zap-modal";
-import { useInvoiceModalContext } from "../../../providers/invoice-modal";
+import { useInvoiceModalContext } from "../../../providers/route/invoice-modal";
export default function UserZapButton({ pubkey, ...props }: { pubkey: string } & Omit) {
const metadata = useUserMetadata(pubkey);
diff --git a/src/views/user/dms.tsx b/src/views/user/dms.tsx
index 760d89827..56defb1a0 100644
--- a/src/views/user/dms.tsx
+++ b/src/views/user/dms.tsx
@@ -4,10 +4,12 @@ import { Kind } from "nostr-tools";
import { useOutletContext } from "react-router-dom";
import useTimelineLoader from "../../hooks/use-timeline-loader";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import useSubject from "../../hooks/use-subject";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-import IntersectionObserverProvider, { useRegisterIntersectionEntity } from "../../providers/intersection-observer";
+import IntersectionObserverProvider, {
+ useRegisterIntersectionEntity,
+} from "../../providers/local/intersection-observer";
import VerticalPageLayout from "../../components/vertical-page-layout";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
import { NostrEvent, isPTag } from "../../types/nostr-event";
diff --git a/src/views/user/emoji-packs.tsx b/src/views/user/emoji-packs.tsx
index b60b94db8..a642db472 100644
--- a/src/views/user/emoji-packs.tsx
+++ b/src/views/user/emoji-packs.tsx
@@ -1,11 +1,11 @@
import { useOutletContext } from "react-router-dom";
import { Heading, SimpleGrid } from "@chakra-ui/react";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import useSubject from "../../hooks/use-subject";
import { getEventUID } from "../../helpers/nostr/events";
-import IntersectionObserverProvider from "../../providers/intersection-observer";
+import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import EmojiPackCard from "../emoji-packs/components/emoji-pack-card";
import { EMOJI_PACK_KIND, getPackCordsFromFavorites } from "../../helpers/nostr/emoji-packs";
diff --git a/src/views/user/followers.tsx b/src/views/user/followers.tsx
index 55cf586d6..de8ec1263 100644
--- a/src/views/user/followers.tsx
+++ b/src/views/user/followers.tsx
@@ -6,7 +6,9 @@ import { useReadRelayUrls } from "../../hooks/use-client-relays";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import useSubject from "../../hooks/use-subject";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-import IntersectionObserverProvider, { useRegisterIntersectionEntity } from "../../providers/intersection-observer";
+import IntersectionObserverProvider, {
+ useRegisterIntersectionEntity,
+} from "../../providers/local/intersection-observer";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
import { useMemo, useRef } from "react";
import { getEventUID } from "../../helpers/nostr/events";
diff --git a/src/views/user/following.tsx b/src/views/user/following.tsx
index a870c5fe5..74e1023aa 100644
--- a/src/views/user/following.tsx
+++ b/src/views/user/following.tsx
@@ -2,7 +2,7 @@ import { SimpleGrid, Spinner } from "@chakra-ui/react";
import { useOutletContext } from "react-router-dom";
import { UserCard } from "./components/user-card";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import useUserContactList from "../../hooks/use-user-contact-list";
import { getPubkeysFromList } from "../../helpers/nostr/lists";
diff --git a/src/views/user/goals.tsx b/src/views/user/goals.tsx
index 284748a83..79c426009 100644
--- a/src/views/user/goals.tsx
+++ b/src/views/user/goals.tsx
@@ -1,11 +1,11 @@
import { useOutletContext } from "react-router-dom";
import { Flex, SimpleGrid } from "@chakra-ui/react";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import useSubject from "../../hooks/use-subject";
import { getEventUID } from "../../helpers/nostr/events";
-import IntersectionObserverProvider from "../../providers/intersection-observer";
+import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import { GOAL_KIND } from "../../helpers/nostr/goal";
import GoalCard from "../goals/components/goal-card";
diff --git a/src/views/user/index.tsx b/src/views/user/index.tsx
index c2528053e..8f7d65c1c 100644
--- a/src/views/user/index.tsx
+++ b/src/views/user/index.tsx
@@ -35,7 +35,7 @@ import { useAppTitle } from "../../hooks/use-app-title";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import relayScoreboardService from "../../services/relay-scoreboard";
import { RelayMode } from "../../classes/relay";
-import { AdditionalRelayProvider } from "../../providers/additional-relay-context";
+import { AdditionalRelayProvider } from "../../providers/local/additional-relay-context";
import { unique } from "../../helpers/array";
import { RelayFavicon } from "../../components/relay-favicon";
import { useUserRelays } from "../../hooks/use-user-relays";
diff --git a/src/views/user/lists.tsx b/src/views/user/lists.tsx
index f426958aa..22ed5249c 100644
--- a/src/views/user/lists.tsx
+++ b/src/views/user/lists.tsx
@@ -2,7 +2,7 @@ import { useCallback } from "react";
import { useOutletContext } from "react-router-dom";
import { Divider, Heading, SimpleGrid } from "@chakra-ui/react";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import useSubject from "../../hooks/use-subject";
import {
@@ -15,7 +15,7 @@ import {
} from "../../helpers/nostr/lists";
import { getEventUID } from "../../helpers/nostr/events";
import ListCard from "../lists/components/list-card";
-import IntersectionObserverProvider from "../../providers/intersection-observer";
+import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import { Kind } from "nostr-tools";
import VerticalPageLayout from "../../components/vertical-page-layout";
diff --git a/src/views/user/muted-by.tsx b/src/views/user/muted-by.tsx
index 378fd3ce5..42c635142 100644
--- a/src/views/user/muted-by.tsx
+++ b/src/views/user/muted-by.tsx
@@ -8,7 +8,9 @@ import useTimelineLoader from "../../hooks/use-timeline-loader";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import { MUTE_LIST_KIND, PEOPLE_LIST_KIND, getListName, getPubkeysFromList } from "../../helpers/nostr/lists";
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 { getEventUID } from "../../helpers/nostr/events";
import VerticalPageLayout from "../../components/vertical-page-layout";
diff --git a/src/views/user/notes.tsx b/src/views/user/notes.tsx
index 4cfccba60..9cadcb853 100644
--- a/src/views/user/notes.tsx
+++ b/src/views/user/notes.tsx
@@ -4,7 +4,7 @@ import { useOutletContext } from "react-router-dom";
import { Kind } from "nostr-tools";
import { isReply, isRepost, truncatedId } from "../../helpers/nostr/events";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import { RelayIconStack } from "../../components/relay-icon-stack";
import { NostrEvent } from "../../types/nostr-event";
import useTimelineLoader from "../../hooks/use-timeline-loader";
diff --git a/src/views/user/reactions.tsx b/src/views/user/reactions.tsx
index 00830995f..7f429f40c 100644
--- a/src/views/user/reactions.tsx
+++ b/src/views/user/reactions.tsx
@@ -5,13 +5,15 @@ import { nip25 } from "nostr-tools";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { NostrEvent } from "../../types/nostr-event";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
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 { TrustProvider } from "../../providers/trust";
+import { TrustProvider } from "../../providers/local/trust";
import UserAvatar from "../../components/user-avatar";
import UserLink from "../../components/user-link";
import NoteMenu from "../../components/note/note-menu";
diff --git a/src/views/user/relays.tsx b/src/views/user/relays.tsx
index 4f315775a..573176a58 100644
--- a/src/views/user/relays.tsx
+++ b/src/views/user/relays.tsx
@@ -10,7 +10,7 @@ import { NostrEvent } from "../../types/nostr-event";
import RelayReviewNote from "../relays/components/relay-review-note";
import { RelayFavicon } from "../../components/relay-favicon";
import { RelayDebugButton, RelayJoinAction, RelayMetadata } from "../relays/components/relay-card";
-import IntersectionObserverProvider from "../../providers/intersection-observer";
+import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import { useRelayInfo } from "../../hooks/use-relay-info";
import { ErrorBoundary } from "../../components/error-boundary";
diff --git a/src/views/user/reports.tsx b/src/views/user/reports.tsx
index 1372574a8..86f6a5caf 100644
--- a/src/views/user/reports.tsx
+++ b/src/views/user/reports.tsx
@@ -8,10 +8,12 @@ import UserLink from "../../components/user-link";
import { filterTagsByContentRefs, getEventUID } from "../../helpers/nostr/events";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { isETag, isPTag, NostrEvent } from "../../types/nostr-event";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
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 VerticalPageLayout from "../../components/vertical-page-layout";
diff --git a/src/views/user/streams.tsx b/src/views/user/streams.tsx
index ae00391c8..c9ad2af46 100644
--- a/src/views/user/streams.tsx
+++ b/src/views/user/streams.tsx
@@ -1,9 +1,9 @@
import { SimpleGrid } from "@chakra-ui/react";
import { useOutletContext } from "react-router-dom";
import { truncatedId } from "../../helpers/nostr/events";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
-import IntersectionObserverProvider from "../../providers/intersection-observer";
+import IntersectionObserverProvider from "../../providers/local/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { STREAM_KIND } from "../../helpers/nostr/stream";
diff --git a/src/views/user/torrents.tsx b/src/views/user/torrents.tsx
index a489bc7bb..af1f6d86d 100644
--- a/src/views/user/torrents.tsx
+++ b/src/views/user/torrents.tsx
@@ -3,10 +3,10 @@ import { useOutletContext } from "react-router-dom";
import { useCallback } from "react";
import useTimelineLoader from "../../hooks/use-timeline-loader";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
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 VerticalPageLayout from "../../components/vertical-page-layout";
import { TORRENT_KIND, validateTorrent } from "../../helpers/nostr/torrents";
diff --git a/src/views/user/tracks.tsx b/src/views/user/tracks.tsx
index 62694a65a..c418ee295 100644
--- a/src/views/user/tracks.tsx
+++ b/src/views/user/tracks.tsx
@@ -2,11 +2,13 @@ import { useRef } from "react";
import { useOutletContext } from "react-router-dom";
import { Box, SimpleGrid } from "@chakra-ui/react";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import useSubject from "../../hooks/use-subject";
import { getEventUID } from "../../helpers/nostr/events";
-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 VerticalPageLayout from "../../components/vertical-page-layout";
import { STEMSTR_TRACK_KIND } from "../../helpers/nostr/stemstr";
diff --git a/src/views/user/zaps.tsx b/src/views/user/zaps.tsx
index 5e2404ce3..083e3ac38 100644
--- a/src/views/user/zaps.tsx
+++ b/src/views/user/zaps.tsx
@@ -12,11 +12,13 @@ import { readablizeSats } from "../../helpers/bolt11";
import { isProfileZap, isNoteZap, parseZapEvent, totalZaps } from "../../helpers/nostr/zaps";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { NostrEvent, isATag, isETag, isPTag } from "../../types/nostr-event";
-import { useAdditionalRelayContext } from "../../providers/additional-relay-context";
+import { useAdditionalRelayContext } from "../../providers/local/additional-relay-context";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
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 { EmbedableContent, embedUrls } from "../../helpers/embeds";
import { embedNostrLinks, renderGenericUrl } from "../../components/embed-types";