mirror of
https://github.com/hzrd149/nostrudel.git
synced 2025-09-27 12:07:43 +02:00
fix build
This commit is contained in:
@@ -10,7 +10,7 @@ import { nip19 } from "nostr-tools";
|
|||||||
import { matchSorter } from "match-sorter/dist/match-sorter.esm.js";
|
import { matchSorter } from "match-sorter/dist/match-sorter.esm.js";
|
||||||
|
|
||||||
import { Emoji, useContextEmojis } from "../providers/emoji-provider";
|
import { Emoji, useContextEmojis } from "../providers/emoji-provider";
|
||||||
import { useUserDirectoryContext } from "../providers/user-directory-provider";
|
import { useUserSearchDirectoryContext } from "../providers/user-directory-provider";
|
||||||
import { UserAvatar } from "./user-avatar";
|
import { UserAvatar } from "./user-avatar";
|
||||||
|
|
||||||
export type PeopleToken = { pubkey: string; names: string[] };
|
export type PeopleToken = { pubkey: string; names: string[] };
|
||||||
@@ -57,7 +57,7 @@ const Loading: ReactTextareaAutocompleteProps<
|
|||||||
|
|
||||||
function useAutocompleteTriggers() {
|
function useAutocompleteTriggers() {
|
||||||
const emojis = useContextEmojis();
|
const emojis = useContextEmojis();
|
||||||
const getDirectory = useUserDirectoryContext();
|
const getDirectory = useUserSearchDirectoryContext();
|
||||||
|
|
||||||
const triggers: TriggerType<Token> = {
|
const triggers: TriggerType<Token> = {
|
||||||
":": {
|
":": {
|
||||||
|
@@ -17,7 +17,7 @@ import { useForm } from "react-hook-form";
|
|||||||
|
|
||||||
import { EventSplit } from "../../helpers/nostr/zaps";
|
import { EventSplit } from "../../helpers/nostr/zaps";
|
||||||
import { AddIcon } from "../icons";
|
import { AddIcon } from "../icons";
|
||||||
import { useUserDirectoryContext } from "../../providers/user-directory-provider";
|
import { useUserSearchDirectoryContext } from "../../providers/user-directory-provider";
|
||||||
import { useAsync } from "react-use";
|
import { useAsync } from "react-use";
|
||||||
import { getUserDisplayName } from "../../helpers/user-metadata";
|
import { getUserDisplayName } from "../../helpers/user-metadata";
|
||||||
import userMetadataService from "../../services/user-metadata";
|
import userMetadataService from "../../services/user-metadata";
|
||||||
@@ -58,10 +58,10 @@ function AddUserForm({
|
|||||||
});
|
});
|
||||||
watch("percent");
|
watch("percent");
|
||||||
|
|
||||||
const getDirectory = useUserDirectoryContext();
|
const getDirectory = useUserSearchDirectoryContext();
|
||||||
const { value: users } = useAsync(async () => {
|
const { value: users } = useAsync(async () => {
|
||||||
const dir = await getDirectory();
|
const dir = await getDirectory();
|
||||||
return dir.map((pubkey) => ({ pubkey, metadata: userMetadataService.getSubject(pubkey).value }));
|
return dir.map(({ pubkey }) => ({ pubkey, metadata: userMetadataService.getSubject(pubkey).value }));
|
||||||
}, [getDirectory]);
|
}, [getDirectory]);
|
||||||
|
|
||||||
const submit = handleSubmit((values) => {
|
const submit = handleSubmit((values) => {
|
||||||
|
@@ -5,7 +5,7 @@ import { useAsync, useThrottle } from "react-use";
|
|||||||
import { matchSorter } from "match-sorter";
|
import { matchSorter } from "match-sorter";
|
||||||
import { nip19 } from "nostr-tools";
|
import { nip19 } from "nostr-tools";
|
||||||
|
|
||||||
import { useUserDirectoryContext } from "../../providers/user-directory-provider";
|
import { useUserSearchDirectoryContext } from "../../providers/user-directory-provider";
|
||||||
import { UserAvatar } from "../user-avatar";
|
import { UserAvatar } from "../user-avatar";
|
||||||
import { useUserMetadata } from "../../hooks/use-user-metadata";
|
import { useUserMetadata } from "../../hooks/use-user-metadata";
|
||||||
import { getUserDisplayName } from "../../helpers/user-metadata";
|
import { getUserDisplayName } from "../../helpers/user-metadata";
|
||||||
@@ -23,7 +23,7 @@ function UserOption({ pubkey }: { pubkey: string }) {
|
|||||||
|
|
||||||
export default function SearchModal({ isOpen, onClose }: Omit<ModalProps, "children">) {
|
export default function SearchModal({ isOpen, onClose }: Omit<ModalProps, "children">) {
|
||||||
const searchRef = useRef<HTMLInputElement | null>(null);
|
const searchRef = useRef<HTMLInputElement | null>(null);
|
||||||
const getDirectory = useUserDirectoryContext();
|
const getDirectory = useUserSearchDirectoryContext();
|
||||||
|
|
||||||
const [inputValue, setInputValue] = useState("");
|
const [inputValue, setInputValue] = useState("");
|
||||||
const search = useThrottle(inputValue);
|
const search = useThrottle(inputValue);
|
||||||
|
@@ -9,7 +9,7 @@ import { InvoiceModalProvider } from "./invoice-modal";
|
|||||||
import NotificationTimelineProvider from "./notification-timeline";
|
import NotificationTimelineProvider from "./notification-timeline";
|
||||||
import PostModalProvider from "./post-modal-provider";
|
import PostModalProvider from "./post-modal-provider";
|
||||||
import { DefaultEmojiProvider, UserEmojiProvider } from "./emoji-provider";
|
import { DefaultEmojiProvider, UserEmojiProvider } from "./emoji-provider";
|
||||||
import { AllUserDirectoryProvider } from "./user-directory-provider";
|
import { AllUserSearchDirectoryProvider } from "./user-directory-provider";
|
||||||
import MuteModalProvider from "./mute-modal-provider";
|
import MuteModalProvider from "./mute-modal-provider";
|
||||||
import BreakpointProvider from "./breakpoint-provider";
|
import BreakpointProvider from "./breakpoint-provider";
|
||||||
|
|
||||||
@@ -39,9 +39,9 @@ export function PageProviders({ children }: { children: React.ReactNode }) {
|
|||||||
<NotificationTimelineProvider>
|
<NotificationTimelineProvider>
|
||||||
<DefaultEmojiProvider>
|
<DefaultEmojiProvider>
|
||||||
<UserEmojiProvider>
|
<UserEmojiProvider>
|
||||||
<AllUserDirectoryProvider>
|
<AllUserSearchDirectoryProvider>
|
||||||
<PostModalProvider>{children}</PostModalProvider>
|
<PostModalProvider>{children}</PostModalProvider>
|
||||||
</AllUserDirectoryProvider>
|
</AllUserSearchDirectoryProvider>
|
||||||
</UserEmojiProvider>
|
</UserEmojiProvider>
|
||||||
</DefaultEmojiProvider>
|
</DefaultEmojiProvider>
|
||||||
</NotificationTimelineProvider>
|
</NotificationTimelineProvider>
|
||||||
|
@@ -1,17 +1,13 @@
|
|||||||
import { PropsWithChildren, createContext, useCallback, useContext } from "react";
|
import { PropsWithChildren, createContext, useCallback, useContext } from "react";
|
||||||
|
|
||||||
import { useCurrentAccount } from "../hooks/use-current-account";
|
|
||||||
import useUserContactList from "../hooks/use-user-contact-list";
|
|
||||||
import { getPubkeysFromList } from "../helpers/nostr/lists";
|
|
||||||
import userMetadataService from "../services/user-metadata";
|
|
||||||
import db from "../services/db";
|
import db from "../services/db";
|
||||||
|
|
||||||
export type UserDirectory = { pubkey: string; names: [] }[];
|
export type UserDirectory = { pubkey: string; names: [] }[];
|
||||||
export type GetDirectoryFn = () => Promise<UserDirectory> | UserDirectory;
|
export type GetDirectoryFn = () => Promise<UserDirectory> | UserDirectory;
|
||||||
const UserDirectoryContext = createContext<GetDirectoryFn>(async () => []);
|
const UserSearchDirectoryContext = createContext<GetDirectoryFn>(async () => []);
|
||||||
|
|
||||||
export function useUserDirectoryContext() {
|
export function useUserSearchDirectoryContext() {
|
||||||
return useContext(UserDirectoryContext);
|
return useContext(UserSearchDirectoryContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
// export function getNameDirectory(directory: UserDirectory) {
|
// export function getNameDirectory(directory: UserDirectory) {
|
||||||
@@ -46,19 +42,19 @@ export function useUserDirectoryContext() {
|
|||||||
// return <UserDirectoryProvider getDirectory={getDirectory}>{children}</UserDirectoryProvider>;
|
// return <UserDirectoryProvider getDirectory={getDirectory}>{children}</UserDirectoryProvider>;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
export function AllUserDirectoryProvider({ children }: PropsWithChildren) {
|
export function AllUserSearchDirectoryProvider({ children }: PropsWithChildren) {
|
||||||
const getDirectory = useCallback(async () => {
|
const getDirectory = useCallback(async () => {
|
||||||
return await db.getAll("userSearch");
|
return await db.getAll("userSearch");
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return <UserDirectoryProvider getDirectory={getDirectory}>{children}</UserDirectoryProvider>;
|
return <UserSearchDirectoryProvider getDirectory={getDirectory}>{children}</UserSearchDirectoryProvider>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function UserDirectoryProvider({
|
export default function UserSearchDirectoryProvider({
|
||||||
children,
|
children,
|
||||||
getDirectory,
|
getDirectory,
|
||||||
}: PropsWithChildren & { getDirectory: GetDirectoryFn }) {
|
}: PropsWithChildren & { getDirectory: GetDirectoryFn }) {
|
||||||
const parent = useContext(UserDirectoryContext);
|
const parent = useContext(UserSearchDirectoryContext);
|
||||||
const wrapper = useCallback<() => Promise<UserDirectory>>(async () => {
|
const wrapper = useCallback<() => Promise<UserDirectory>>(async () => {
|
||||||
const dir = parent ? await parent() : [];
|
const dir = parent ? await parent() : [];
|
||||||
const newDir = await getDirectory();
|
const newDir = await getDirectory();
|
||||||
@@ -68,5 +64,5 @@ export default function UserDirectoryProvider({
|
|||||||
return dir;
|
return dir;
|
||||||
}, [parent, getDirectory]);
|
}, [parent, getDirectory]);
|
||||||
|
|
||||||
return <UserDirectoryContext.Provider value={wrapper}>{children}</UserDirectoryContext.Provider>;
|
return <UserSearchDirectoryContext.Provider value={wrapper}>{children}</UserSearchDirectoryContext.Provider>;
|
||||||
}
|
}
|
||||||
|
@@ -22,7 +22,6 @@ import NostrPublishAction from "../../../classes/nostr-publish-action";
|
|||||||
import { unique } from "../../../helpers/array";
|
import { unique } from "../../../helpers/array";
|
||||||
import MagicTextArea, { RefType } from "../../../components/magic-textarea";
|
import MagicTextArea, { RefType } from "../../../components/magic-textarea";
|
||||||
import { useContextEmojis } from "../../../providers/emoji-provider";
|
import { useContextEmojis } from "../../../providers/emoji-provider";
|
||||||
import UserDirectoryProvider from "../../../providers/user-directory-provider";
|
|
||||||
import { TrustProvider } from "../../../providers/trust";
|
import { TrustProvider } from "../../../providers/trust";
|
||||||
import { nostrBuildUploadImage } from "../../../helpers/nostr-build";
|
import { nostrBuildUploadImage } from "../../../helpers/nostr-build";
|
||||||
import { UploadImageIcon } from "../../../components/icons";
|
import { UploadImageIcon } from "../../../components/icons";
|
||||||
@@ -96,56 +95,54 @@ export default function ReplyForm({ item, onCancel, onSubmitted }: ReplyFormProp
|
|||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<UserDirectoryProvider getDirectory={() => threadMembers}>
|
<Flex as="form" direction="column" gap="2" pb="4" onSubmit={submit}>
|
||||||
<Flex as="form" direction="column" gap="2" pb="4" onSubmit={submit}>
|
<MagicTextArea
|
||||||
<MagicTextArea
|
placeholder="Reply"
|
||||||
placeholder="Reply"
|
autoFocus
|
||||||
autoFocus
|
mb="2"
|
||||||
mb="2"
|
rows={4}
|
||||||
rows={4}
|
isRequired
|
||||||
isRequired
|
value={getValues().content}
|
||||||
value={getValues().content}
|
onChange={(e) => setValue("content", e.target.value, { shouldDirty: true })}
|
||||||
onChange={(e) => setValue("content", e.target.value, { shouldDirty: true })}
|
instanceRef={(inst) => (textAreaRef.current = inst)}
|
||||||
instanceRef={(inst) => (textAreaRef.current = inst)}
|
onPaste={(e) => {
|
||||||
onPaste={(e) => {
|
const imageFile = Array.from(e.clipboardData.files).find((f) => f.type.includes("image"));
|
||||||
const imageFile = Array.from(e.clipboardData.files).find((f) => f.type.includes("image"));
|
if (imageFile) uploadImage(imageFile);
|
||||||
if (imageFile) uploadImage(imageFile);
|
}}
|
||||||
|
/>
|
||||||
|
<Flex gap="2" alignItems="center">
|
||||||
|
<VisuallyHiddenInput
|
||||||
|
type="file"
|
||||||
|
accept="image/*"
|
||||||
|
ref={imageUploadRef}
|
||||||
|
onChange={(e) => {
|
||||||
|
const img = e.target.files?.[0];
|
||||||
|
if (img) uploadImage(img);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<Flex gap="2" alignItems="center">
|
<IconButton
|
||||||
<VisuallyHiddenInput
|
icon={<UploadImageIcon />}
|
||||||
type="file"
|
aria-label="Upload Image"
|
||||||
accept="image/*"
|
title="Upload Image"
|
||||||
ref={imageUploadRef}
|
onClick={() => imageUploadRef.current?.click()}
|
||||||
onChange={(e) => {
|
isLoading={uploading}
|
||||||
const img = e.target.files?.[0];
|
size="sm"
|
||||||
if (img) uploadImage(img);
|
/>
|
||||||
}}
|
<UserAvatarStack label="Notify" pubkeys={notifyPubkeys} />
|
||||||
/>
|
<ButtonGroup size="sm" ml="auto">
|
||||||
<IconButton
|
<Button onClick={onCancel}>Cancel</Button>
|
||||||
icon={<UploadImageIcon />}
|
<Button type="submit" colorScheme="primary" size="sm">
|
||||||
aria-label="Upload Image"
|
Submit
|
||||||
title="Upload Image"
|
</Button>
|
||||||
onClick={() => imageUploadRef.current?.click()}
|
</ButtonGroup>
|
||||||
isLoading={uploading}
|
|
||||||
size="sm"
|
|
||||||
/>
|
|
||||||
<UserAvatarStack label="Notify" pubkeys={notifyPubkeys} />
|
|
||||||
<ButtonGroup size="sm" ml="auto">
|
|
||||||
<Button onClick={onCancel}>Cancel</Button>
|
|
||||||
<Button type="submit" colorScheme="primary" size="sm">
|
|
||||||
Submit
|
|
||||||
</Button>
|
|
||||||
</ButtonGroup>
|
|
||||||
</Flex>
|
|
||||||
{getValues().content.length > 0 && (
|
|
||||||
<Box p="2" borderWidth={1} borderRadius="md" mb="2">
|
|
||||||
<TrustProvider trust>
|
|
||||||
<NoteContents event={draft} />
|
|
||||||
</TrustProvider>
|
|
||||||
</Box>
|
|
||||||
)}
|
|
||||||
</Flex>
|
</Flex>
|
||||||
</UserDirectoryProvider>
|
{getValues().content.length > 0 && (
|
||||||
|
<Box p="2" borderWidth={1} borderRadius="md" mb="2">
|
||||||
|
<TrustProvider trust>
|
||||||
|
<NoteContents event={draft} />
|
||||||
|
</TrustProvider>
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
|
</Flex>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -43,7 +43,7 @@ import { UserEmojiProvider } from "../../../providers/emoji-provider";
|
|||||||
import StreamStatusBadge from "../components/status-badge";
|
import StreamStatusBadge from "../components/status-badge";
|
||||||
import ChatMessageForm from "./stream-chat/stream-chat-form";
|
import ChatMessageForm from "./stream-chat/stream-chat-form";
|
||||||
import useStreamChatTimeline from "./stream-chat/use-stream-chat-timeline";
|
import useStreamChatTimeline from "./stream-chat/use-stream-chat-timeline";
|
||||||
import UserDirectoryProvider from "../../../providers/user-directory-provider";
|
import UserSearchDirectoryProvider from "../../../providers/user-directory-provider";
|
||||||
import StreamChatLog from "./stream-chat/chat-log";
|
import StreamChatLog from "./stream-chat/chat-log";
|
||||||
import TopZappers from "../components/top-zappers";
|
import TopZappers from "../components/top-zappers";
|
||||||
import StreamHashtags from "../components/stream-hashtags";
|
import StreamHashtags from "../components/stream-hashtags";
|
||||||
@@ -206,20 +206,20 @@ function StreamPage({ stream }: { stream: ParsedStream }) {
|
|||||||
const isMobile = useBreakpointValue({ base: true, lg: false });
|
const isMobile = useBreakpointValue({ base: true, lg: false });
|
||||||
const Layout = isMobile ? MobileStreamPage : DesktopStreamPage;
|
const Layout = isMobile ? MobileStreamPage : DesktopStreamPage;
|
||||||
|
|
||||||
const chatTimeline = useStreamChatTimeline(stream);
|
// const chatTimeline = useStreamChatTimeline(stream);
|
||||||
const chatLog = useSubject(chatTimeline.timeline);
|
// const chatLog = useSubject(chatTimeline.timeline);
|
||||||
const pubkeysInChat = useMemo(() => {
|
// const pubkeysInChat = useMemo(() => {
|
||||||
const set = new Set<string>();
|
// const set = new Set<string>();
|
||||||
for (const event of chatLog) {
|
// for (const event of chatLog) {
|
||||||
set.add(event.pubkey);
|
// set.add(event.pubkey);
|
||||||
}
|
// }
|
||||||
return Array.from(set);
|
// return Array.from(set);
|
||||||
}, [chatLog]);
|
// }, [chatLog]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<UserDirectoryProvider getDirectory={() => pubkeysInChat}>
|
// <UserDirectoryProvider getDirectory={() => pubkeysInChat}>
|
||||||
<Layout stream={stream} />
|
<Layout stream={stream} />
|
||||||
</UserDirectoryProvider>
|
// </UserDirectoryProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user