better structure

This commit is contained in:
Ren Amamiya 2023-05-10 16:17:38 +07:00
parent 1a30c10806
commit e7bcf6c3f8
94 changed files with 533 additions and 403 deletions

View File

@ -9,7 +9,6 @@
"bracketSpacing": true, "bracketSpacing": true,
"bracketSameLine": false, "bracketSameLine": false,
"importOrder": [ "importOrder": [
"^@lume/(.*)$",
"^@app/(.*)$", "^@app/(.*)$",
"^@shared/(.*)$", "^@shared/(.*)$",
"^@icons/(.*)$", "^@icons/(.*)$",

View File

@ -1,5 +1,6 @@
import MutedItem from '@lume/app/channel/components/mutedItem'; import MutedItem from '@app/channel/components/mutedItem';
import MuteIcon from '@lume/shared/icons/mute';
import MuteIcon from '@icons/mute';
import { Popover, Transition } from '@headlessui/react'; import { Popover, Transition } from '@headlessui/react';
import { Fragment } from 'react'; import { Fragment } from 'react';

View File

@ -1,12 +1,15 @@
import { AvatarUploader } from '@lume/shared/avatarUploader'; import { AvatarUploader } from '@shared/avatarUploader';
import CancelIcon from '@lume/shared/icons/cancel'; import { Image } from '@shared/image';
import PlusIcon from '@lume/shared/icons/plus'; import { RelayContext } from '@shared/relayProvider';
import { Image } from '@lume/shared/image';
import { RelayContext } from '@lume/shared/relayProvider'; import CancelIcon from '@icons/cancel';
import { DEFAULT_AVATAR, WRITEONLY_RELAYS } from '@lume/stores/constants'; import PlusIcon from '@icons/plus';
import { dateToUnix } from '@lume/utils/getDate';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { DEFAULT_AVATAR, WRITEONLY_RELAYS } from '@stores/constants';
import { createChannel } from '@lume/utils/storage';
import { dateToUnix } from '@utils/date';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { createChannel } from '@utils/storage';
import { Dialog, Transition } from '@headlessui/react'; import { Dialog, Transition } from '@headlessui/react';
import { getEventHash, signEvent } from 'nostr-tools'; import { getEventHash, signEvent } from 'nostr-tools';

View File

@ -1,5 +1,6 @@
import { useChannelProfile } from '@lume/utils/hooks/useChannelProfile'; import { useChannelProfile } from '@app/channel/hooks/useChannelProfile';
import { usePageContext } from '@lume/utils/hooks/usePageContext';
import { usePageContext } from '@utils/hooks/usePageContext';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';

View File

@ -1,6 +1,7 @@
import ChannelCreateModal from '@lume/app/channel/components/createModal'; import ChannelCreateModal from '@app/channel/components/createModal';
import ChannelsListItem from '@lume/app/channel/components/item'; import ChannelsListItem from '@app/channel/components/item';
import { getChannels } from '@lume/utils/storage';
import { getChannels } from '@utils/storage';
import useSWR from 'swr'; import useSWR from 'swr';

View File

@ -1,5 +1,6 @@
import MiniMember from '@lume/app/channel/components/miniMember'; import MiniMember from '@app/channel/components/miniMember';
import { channelMembersAtom } from '@lume/stores/channel';
import { channelMembersAtom } from '@stores/channel';
import { useAtomValue } from 'jotai'; import { useAtomValue } from 'jotai';

View File

@ -1,6 +1,8 @@
import ChannelMessageItem from '@lume/app/channel/components/messages/item'; import ChannelMessageItem from '@app/channel/components/messages/item';
import { sortedChannelMessagesAtom } from '@lume/stores/channel';
import { hoursAgo } from '@lume/utils/getDate'; import { sortedChannelMessagesAtom } from '@stores/channel';
import { getHourAgo } from '@utils/date';
import { useAtomValue } from 'jotai'; import { useAtomValue } from 'jotai';
import { useCallback, useRef } from 'react'; import { useCallback, useRef } from 'react';
@ -39,7 +41,7 @@ export default function ChannelMessageList() {
</div> </div>
<div className="relative flex justify-center"> <div className="relative flex justify-center">
<div className="inline-flex items-center gap-x-1.5 rounded-full bg-zinc-900 px-3 py-1.5 text-xs font-medium text-zinc-400 shadow-sm ring-1 ring-inset ring-zinc-800"> <div className="inline-flex items-center gap-x-1.5 rounded-full bg-zinc-900 px-3 py-1.5 text-xs font-medium text-zinc-400 shadow-sm ring-1 ring-inset ring-zinc-800">
{hoursAgo(24, now.current).toLocaleDateString('en-US', { {getHourAgo(24, now.current).toLocaleDateString('en-US', {
weekday: 'long', weekday: 'long',
year: 'numeric', year: 'numeric',
month: 'long', month: 'long',

View File

@ -1,11 +1,15 @@
import UserReply from '@lume/app/channel/components/messages/userReply'; import UserReply from '@app/channel/components/messages/userReply';
import { ImagePicker } from '@lume/shared/form/imagePicker';
import CancelIcon from '@lume/shared/icons/cancel'; import { ImagePicker } from '@shared/form/imagePicker';
import { RelayContext } from '@lume/shared/relayProvider'; import { RelayContext } from '@shared/relayProvider';
import { channelContentAtom, channelReplyAtom } from '@lume/stores/channel';
import { WRITEONLY_RELAYS } from '@lume/stores/constants'; import CancelIcon from '@icons/cancel';
import { dateToUnix } from '@lume/utils/getDate';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { channelContentAtom, channelReplyAtom } from '@stores/channel';
import { WRITEONLY_RELAYS } from '@stores/constants';
import { dateToUnix } from '@utils/date';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { useAtom, useAtomValue } from 'jotai'; import { useAtom, useAtomValue } from 'jotai';
import { useResetAtom } from 'jotai/utils'; import { useResetAtom } from 'jotai/utils';

View File

@ -1,11 +1,14 @@
import CancelIcon from '@lume/shared/icons/cancel'; import { RelayContext } from '@shared/relayProvider';
import HideIcon from '@lume/shared/icons/hide'; import { Tooltip } from '@shared/tooltip';
import { RelayContext } from '@lume/shared/relayProvider';
import { Tooltip } from '@lume/shared/tooltip'; import CancelIcon from '@icons/cancel';
import { channelMessagesAtom } from '@lume/stores/channel'; import HideIcon from '@icons/hide';
import { WRITEONLY_RELAYS } from '@lume/stores/constants';
import { dateToUnix } from '@lume/utils/getDate'; import { channelMessagesAtom } from '@stores/channel';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { WRITEONLY_RELAYS } from '@stores/constants';
import { dateToUnix } from '@utils/date';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { Dialog, Transition } from '@headlessui/react'; import { Dialog, Transition } from '@headlessui/react';
import { useAtom } from 'jotai'; import { useAtom } from 'jotai';

View File

@ -1,8 +1,9 @@
import MessageHideButton from '@lume/app/channel/components/messages/hideButton'; import MessageHideButton from '@app/channel/components/messages/hideButton';
import MessageMuteButton from '@lume/app/channel/components/messages/muteButton'; import MessageMuteButton from '@app/channel/components/messages/muteButton';
import MessageReplyButton from '@lume/app/channel/components/messages/replyButton'; import MessageReplyButton from '@app/channel/components/messages/replyButton';
import ChannelMessageUser from '@lume/app/channel/components/messages/user'; import ChannelMessageUser from '@app/channel/components/messages/user';
import { noteParser } from '@lume/utils/parser';
import { noteParser } from '@utils/parser';
import { useMemo } from 'react'; import { useMemo } from 'react';

View File

@ -1,11 +1,14 @@
import CancelIcon from '@lume/shared/icons/cancel'; import { RelayContext } from '@shared/relayProvider';
import MuteIcon from '@lume/shared/icons/mute'; import { Tooltip } from '@shared/tooltip';
import { RelayContext } from '@lume/shared/relayProvider';
import { Tooltip } from '@lume/shared/tooltip'; import CancelIcon from '@icons/cancel';
import { channelMessagesAtom } from '@lume/stores/channel'; import MuteIcon from '@icons/mute';
import { WRITEONLY_RELAYS } from '@lume/stores/constants';
import { dateToUnix } from '@lume/utils/getDate'; import { channelMessagesAtom } from '@stores/channel';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { WRITEONLY_RELAYS } from '@stores/constants';
import { dateToUnix } from '@utils/date';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { Dialog, Transition } from '@headlessui/react'; import { Dialog, Transition } from '@headlessui/react';
import { useAtom } from 'jotai'; import { useAtom } from 'jotai';

View File

@ -1,6 +1,8 @@
import ReplyMessageIcon from '@lume/shared/icons/replyMessage'; import { Tooltip } from '@shared/tooltip';
import { Tooltip } from '@lume/shared/tooltip';
import { channelReplyAtom } from '@lume/stores/channel'; import ReplyMessageIcon from '@icons/replyMessage';
import { channelReplyAtom } from '@stores/channel';
import { useSetAtom } from 'jotai'; import { useSetAtom } from 'jotai';

View File

@ -1,7 +1,9 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR, IMGPROXY_URL } from '@lume/stores/constants';
import { useProfile } from '@lume/utils/hooks/useProfile'; import { DEFAULT_AVATAR, IMGPROXY_URL } from '@stores/constants';
import { shortenKey } from '@lume/utils/shortenKey';
import { useProfile } from '@utils/hooks/useProfile';
import { shortenKey } from '@utils/shortenKey';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime'; import relativeTime from 'dayjs/plugin/relativeTime';

View File

@ -1,7 +1,9 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR, IMGPROXY_URL } from '@lume/stores/constants';
import { useProfile } from '@lume/utils/hooks/useProfile'; import { DEFAULT_AVATAR, IMGPROXY_URL } from '@stores/constants';
import { shortenKey } from '@lume/utils/shortenKey';
import { useProfile } from '@utils/hooks/useProfile';
import { shortenKey } from '@utils/shortenKey';
export default function UserReply({ pubkey }: { pubkey: string }) { export default function UserReply({ pubkey }: { pubkey: string }) {
const { user, isError, isLoading } = useProfile(pubkey); const { user, isError, isLoading } = useProfile(pubkey);

View File

@ -1,7 +1,10 @@
import CopyIcon from '@lume/shared/icons/copy'; import { useChannelProfile } from '@app/channel/hooks/useChannelProfile';
import { Image } from '@lume/shared/image';
import { DEFAULT_AVATAR } from '@lume/stores/constants'; import { Image } from '@shared/image';
import { useChannelProfile } from '@lume/utils/hooks/useChannelProfile';
import CopyIcon from '@icons/copy';
import { DEFAULT_AVATAR } from '@stores/constants';
import { nip19 } from 'nostr-tools'; import { nip19 } from 'nostr-tools';

View File

@ -1,6 +1,8 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR } from '@lume/stores/constants';
import { useProfile } from '@lume/utils/hooks/useProfile'; import { DEFAULT_AVATAR } from '@stores/constants';
import { useProfile } from '@utils/hooks/useProfile';
export default function MiniMember({ pubkey }: { pubkey: string }) { export default function MiniMember({ pubkey }: { pubkey: string }) {
const { user, isError, isLoading } = useProfile(pubkey); const { user, isError, isLoading } = useProfile(pubkey);

View File

@ -1,7 +1,9 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR } from '@lume/stores/constants';
import { useProfile } from '@lume/utils/hooks/useProfile'; import { DEFAULT_AVATAR } from '@stores/constants';
import { shortenKey } from '@lume/utils/shortenKey';
import { useProfile } from '@utils/hooks/useProfile';
import { shortenKey } from '@utils/shortenKey';
import { useState } from 'react'; import { useState } from 'react';
@ -10,7 +12,7 @@ export default function MutedItem({ data }: { data: any }) {
const [status, setStatus] = useState(data.status); const [status, setStatus] = useState(data.status);
const unmute = async () => { const unmute = async () => {
const { updateItemInBlacklist } = await import('@lume/utils/storage'); const { updateItemInBlacklist } = await import('@utils/storage');
const res = await updateItemInBlacklist(data.content, 0); const res = await updateItemInBlacklist(data.content, 0);
if (res) { if (res) {
setStatus(0); setStatus(0);
@ -18,7 +20,7 @@ export default function MutedItem({ data }: { data: any }) {
}; };
const mute = async () => { const mute = async () => {
const { updateItemInBlacklist } = await import('@lume/utils/storage'); const { updateItemInBlacklist } = await import('@utils/storage');
const res = await updateItemInBlacklist(data.content, 1); const res = await updateItemInBlacklist(data.content, 1);
if (res) { if (res) {
setStatus(1); setStatus(1);

View File

@ -1,12 +1,15 @@
import { AvatarUploader } from '@lume/shared/avatarUploader'; import { AvatarUploader } from '@shared/avatarUploader';
import CancelIcon from '@lume/shared/icons/cancel'; import { Image } from '@shared/image';
import EditIcon from '@lume/shared/icons/edit'; import { RelayContext } from '@shared/relayProvider';
import { Image } from '@lume/shared/image';
import { RelayContext } from '@lume/shared/relayProvider'; import CancelIcon from '@icons/cancel';
import { DEFAULT_AVATAR, WRITEONLY_RELAYS } from '@lume/stores/constants'; import EditIcon from '@icons/edit';
import { dateToUnix } from '@lume/utils/getDate';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { DEFAULT_AVATAR, WRITEONLY_RELAYS } from '@stores/constants';
import { getChannel, updateChannelMetadata } from '@lume/utils/storage';
import { dateToUnix } from '@utils/date';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { getChannel, updateChannelMetadata } from '@utils/storage';
import { Dialog, Transition } from '@headlessui/react'; import { Dialog, Transition } from '@headlessui/react';
import { getEventHash, signEvent } from 'nostr-tools'; import { getEventHash, signEvent } from 'nostr-tools';

View File

@ -1,6 +1,8 @@
import { RelayContext } from '@lume/shared/relayProvider'; import { RelayContext } from '@shared/relayProvider';
import { READONLY_RELAYS } from '@lume/stores/constants';
import { getChannel } from '@lume/utils/storage'; import { READONLY_RELAYS } from '@stores/constants';
import { getChannel } from '@utils/storage';
import { useContext } from 'react'; import { useContext } from 'react';
import useSWR from 'swr'; import useSWR from 'swr';

View File

@ -1,6 +1,6 @@
import AppHeader from '@lume/shared/appHeader'; import AppHeader from '@shared/appHeader';
import MultiAccounts from '@lume/shared/multiAccounts'; import MultiAccounts from '@shared/multiAccounts';
import Navigation from '@lume/shared/navigation'; import Navigation from '@shared/navigation';
export function LayoutChannel({ children }: { children: React.ReactNode }) { export function LayoutChannel({ children }: { children: React.ReactNode }) {
return ( return (

View File

@ -1,16 +1,19 @@
import ChannelBlackList from '@lume/app/channel/components/blacklist'; import ChannelBlackList from '@app/channel/components/blacklist';
import ChannelMembers from '@lume/app/channel/components/members'; import ChannelMembers from '@app/channel/components/members';
import ChannelMessageForm from '@lume/app/channel/components/messages/form'; import ChannelMessageForm from '@app/channel/components/messages/form';
import ChannelMetadata from '@lume/app/channel/components/metadata'; import ChannelMetadata from '@app/channel/components/metadata';
import ChannelUpdateModal from '@lume/app/channel/components/updateModal'; import ChannelUpdateModal from '@app/channel/components/updateModal';
import { RelayContext } from '@lume/shared/relayProvider';
import { channelMessagesAtom, channelReplyAtom } from '@lume/stores/channel'; import { RelayContext } from '@shared/relayProvider';
import { READONLY_RELAYS } from '@lume/stores/constants';
import { dateToUnix, hoursAgo } from '@lume/utils/getDate'; import { channelMessagesAtom, channelReplyAtom } from '@stores/channel';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { READONLY_RELAYS } from '@stores/constants';
import { usePageContext } from '@lume/utils/hooks/usePageContext';
import { getActiveBlacklist, getBlacklist } from '@lume/utils/storage'; import { dateToUnix, getHourAgo } from '@utils/date';
import { arrayObjToPureArr } from '@lume/utils/transform'; import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { usePageContext } from '@utils/hooks/usePageContext';
import { getActiveBlacklist, getBlacklist } from '@utils/storage';
import { arrayObjToPureArr } from '@utils/transform';
import { useSetAtom } from 'jotai'; import { useSetAtom } from 'jotai';
import { useResetAtom } from 'jotai/utils'; import { useResetAtom } from 'jotai/utils';
@ -30,7 +33,7 @@ const fetchHided = async ([, id]) => {
return array; return array;
}; };
const ChannelMessageList = lazy(() => import('@lume/app/channel/components/messageList')); const ChannelMessageList = lazy(() => import('@app/channel/components/messageList'));
export function Page() { export function Page() {
const pool: any = useContext(RelayContext); const pool: any = useContext(RelayContext);
@ -57,7 +60,7 @@ export function Page() {
{ {
'#e': [key], '#e': [key],
kinds: [42], kinds: [42],
since: dateToUnix(hoursAgo(24, now.current)), since: dateToUnix(getHourAgo(24, now.current)),
limit: 20, limit: 20,
}, },
], ],

View File

@ -1,8 +1,10 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR } from '@lume/stores/constants';
import { usePageContext } from '@lume/utils/hooks/usePageContext'; import { DEFAULT_AVATAR } from '@stores/constants';
import { useProfile } from '@lume/utils/hooks/useProfile';
import { shortenKey } from '@lume/utils/shortenKey'; import { usePageContext } from '@utils/hooks/usePageContext';
import { useProfile } from '@utils/hooks/useProfile';
import { shortenKey } from '@utils/shortenKey';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';

View File

@ -1,7 +1,8 @@
import ChatsListItem from '@lume/app/chat/components/item'; import ChatsListItem from '@app/chat/components/item';
import ChatsListSelfItem from '@lume/app/chat/components/self'; import ChatsListSelfItem from '@app/chat/components/self';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount';
import { getChats } from '@lume/utils/storage'; import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { getChats } from '@utils/storage';
import useSWR from 'swr'; import useSWR from 'swr';

View File

@ -1,6 +1,8 @@
import { ChatMessageItem } from '@lume/app/chat/components/messages/item'; import { ChatMessageItem } from '@app/chat/components/messages/item';
import { sortedChatMessagesAtom } from '@lume/stores/chat';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { sortedChatMessagesAtom } from '@stores/chat';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { useAtomValue } from 'jotai'; import { useAtomValue } from 'jotai';
import { useCallback, useRef } from 'react'; import { useCallback, useRef } from 'react';

View File

@ -1,9 +1,11 @@
import { ImagePicker } from '@lume/shared/form/imagePicker'; import { ImagePicker } from '@shared/form/imagePicker';
import { RelayContext } from '@lume/shared/relayProvider'; import { RelayContext } from '@shared/relayProvider';
import { chatContentAtom } from '@lume/stores/chat';
import { WRITEONLY_RELAYS } from '@lume/stores/constants'; import { chatContentAtom } from '@stores/chat';
import { dateToUnix } from '@lume/utils/getDate'; import { WRITEONLY_RELAYS } from '@stores/constants';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount';
import { dateToUnix } from '@utils/date';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { useAtom } from 'jotai'; import { useAtom } from 'jotai';
import { useResetAtom } from 'jotai/utils'; import { useResetAtom } from 'jotai/utils';

View File

@ -1,8 +1,9 @@
import ChatMessageUser from '@lume/app/chat/components/messages/user'; import ChatMessageUser from '@app/chat/components/messages/user';
import ImagePreview from '@lume/app/note/components/preview/image'; import { useDecryptMessage } from '@app/chat/hooks/useDecryptMessage';
import VideoPreview from '@lume/app/note/components/preview/video'; import ImagePreview from '@app/note/components/preview/image';
import { useDecryptMessage } from '@lume/utils/hooks/useDecryptMessage'; import VideoPreview from '@app/note/components/preview/video';
import { noteParser } from '@lume/utils/parser';
import { noteParser } from '@utils/parser';
import { memo } from 'react'; import { memo } from 'react';

View File

@ -1,7 +1,9 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR, IMGPROXY_URL } from '@lume/stores/constants';
import { useProfile } from '@lume/utils/hooks/useProfile'; import { DEFAULT_AVATAR, IMGPROXY_URL } from '@stores/constants';
import { shortenKey } from '@lume/utils/shortenKey';
import { useProfile } from '@utils/hooks/useProfile';
import { shortenKey } from '@utils/shortenKey';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime'; import relativeTime from 'dayjs/plugin/relativeTime';

View File

@ -1,8 +1,10 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR } from '@lume/stores/constants';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { DEFAULT_AVATAR } from '@stores/constants';
import { usePageContext } from '@lume/utils/hooks/usePageContext';
import { shortenKey } from '@lume/utils/shortenKey'; import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { usePageContext } from '@utils/hooks/usePageContext';
import { shortenKey } from '@utils/shortenKey';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';

View File

@ -1,6 +1,6 @@
import AppHeader from '@lume/shared/appHeader'; import AppHeader from '@shared/appHeader';
import MultiAccounts from '@lume/shared/multiAccounts'; import MultiAccounts from '@shared/multiAccounts';
import Navigation from '@lume/shared/navigation'; import Navigation from '@shared/navigation';
export function LayoutChat({ children }: { children: React.ReactNode }) { export function LayoutChat({ children }: { children: React.ReactNode }) {
return ( return (

View File

@ -1,16 +1,19 @@
import ChatMessageForm from '@lume/app/chat/components/messages/form'; import ChatMessageForm from '@app/chat/components/messages/form';
import { RelayContext } from '@lume/shared/relayProvider';
import { chatMessagesAtom } from '@lume/stores/chat'; import { RelayContext } from '@shared/relayProvider';
import { READONLY_RELAYS } from '@lume/stores/constants';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { chatMessagesAtom } from '@stores/chat';
import { usePageContext } from '@lume/utils/hooks/usePageContext'; import { READONLY_RELAYS } from '@stores/constants';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { usePageContext } from '@utils/hooks/usePageContext';
import { useSetAtom } from 'jotai'; import { useSetAtom } from 'jotai';
import { useResetAtom } from 'jotai/utils'; import { useResetAtom } from 'jotai/utils';
import { Suspense, lazy, useContext, useEffect } from 'react'; import { Suspense, lazy, useContext, useEffect } from 'react';
import useSWRSubscription from 'swr/subscription'; import useSWRSubscription from 'swr/subscription';
const ChatMessageList = lazy(() => import('@lume/app/chat/components/messageList')); const ChatMessageList = lazy(() => import('@app/chat/components/messageList'));
export function Page() { export function Page() {
const pool: any = useContext(RelayContext); const pool: any = useContext(RelayContext);

View File

@ -1,4 +1,4 @@
import { getActiveAccount } from '@lume/utils/storage'; import { getActiveAccount } from '@utils/storage';
import useSWR from 'swr'; import useSWR from 'swr';
import { navigate } from 'vite-plugin-ssr/client/router'; import { navigate } from 'vite-plugin-ssr/client/router';

View File

@ -1,7 +1,10 @@
import LumeIcon from '@lume/shared/icons/lume'; import { RelayContext } from '@shared/relayProvider';
import { RelayContext } from '@lume/shared/relayProvider';
import { READONLY_RELAYS } from '@lume/stores/constants'; import LumeIcon from '@icons/lume';
import { dateToUnix, hoursAgo } from '@lume/utils/getDate';
import { READONLY_RELAYS } from '@stores/constants';
import { dateToUnix, getHourAgo } from '@utils/date';
import { import {
addToBlacklist, addToBlacklist,
countTotalLongNotes, countTotalLongNotes,
@ -11,8 +14,8 @@ import {
getActiveAccount, getActiveAccount,
getLastLogin, getLastLogin,
updateLastLogin, updateLastLogin,
} from '@lume/utils/storage'; } from '@utils/storage';
import { getParentID, nip02ToArray } from '@lume/utils/transform'; import { getParentID, nip02ToArray } from '@utils/transform';
import { useContext, useEffect, useRef } from 'react'; import { useContext, useEffect, useRef } from 'react';
import { navigate } from 'vite-plugin-ssr/client/router'; import { navigate } from 'vite-plugin-ssr/client/router';
@ -38,12 +41,12 @@ export function Page() {
let sinceLongNotes: number; let sinceLongNotes: number;
if (notes === 0) { if (notes === 0) {
sinceNotes = dateToUnix(hoursAgo(48, now.current)); sinceNotes = dateToUnix(getHourAgo(48, now.current));
} else { } else {
if (parseInt(lastLogin) > 0) { if (parseInt(lastLogin) > 0) {
sinceNotes = parseInt(lastLogin); sinceNotes = parseInt(lastLogin);
} else { } else {
sinceNotes = dateToUnix(hoursAgo(48, now.current)); sinceNotes = dateToUnix(getHourAgo(48, now.current));
} }
} }
@ -174,7 +177,7 @@ export function Page() {
() => { () => {
updateLastLogin(dateToUnix(now.current)); updateLastLogin(dateToUnix(now.current));
timeout = setTimeout(() => { timeout = setTimeout(() => {
navigate('/app/daily', { overwriteLastHistoryEntry: true }); navigate('/app/radar', { overwriteLastHistoryEntry: true });
}, 5000); }, 5000);
} }
); );

View File

@ -1,11 +1,12 @@
import { Kind1 } from '@lume/app/note/components/kind1'; import { Kind1 } from '@app/note/components/kind1';
import { Kind1063 } from '@lume/app/note/components/kind1063'; import { Kind1063 } from '@app/note/components/kind1063';
import NoteMetadata from '@lume/app/note/components/metadata'; import NoteMetadata from '@app/note/components/metadata';
import { NoteParent } from '@lume/app/note/components/parent'; import { NoteParent } from '@app/note/components/parent';
import { NoteDefaultUser } from '@lume/app/note/components/user/default'; import { NoteDefaultUser } from '@app/note/components/user/default';
import { NoteWrapper } from '@lume/app/note/components/wrapper'; import { NoteWrapper } from '@app/note/components/wrapper';
import { noteParser } from '@lume/utils/parser';
import { isTagsIncludeID } from '@lume/utils/transform'; import { noteParser } from '@utils/parser';
import { isTagsIncludeID } from '@utils/transform';
import { useMemo } from 'react'; import { useMemo } from 'react';

View File

@ -1,7 +1,7 @@
import { MentionNote } from '@lume/app/note/components/mentions/note'; import { MentionNote } from '@app/note/components/mentions/note';
import { MentionUser } from '@lume/app/note/components/mentions/user'; import { MentionUser } from '@app/note/components/mentions/user';
import ImagePreview from '@lume/app/note/components/preview/image'; import ImagePreview from '@app/note/components/preview/image';
import VideoPreview from '@lume/app/note/components/preview/video'; import VideoPreview from '@app/note/components/preview/video';
import ReactMarkdown from 'react-markdown'; import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm'; import remarkGfm from 'remark-gfm';

View File

@ -1,4 +1,4 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
function isImage(url: string) { function isImage(url: string) {
return /\.(jpg|jpeg|gif|png|webp|avif)$/.test(url); return /\.(jpg|jpeg|gif|png|webp|avif)$/.test(url);

View File

@ -1,11 +1,14 @@
import { Kind1 } from '@lume/app/note/components/kind1'; import { Kind1 } from '@app/note/components/kind1';
import { Kind1063 } from '@lume/app/note/components/kind1063'; import { Kind1063 } from '@app/note/components/kind1063';
import { NoteSkeleton } from '@lume/app/note/components/skeleton'; import { NoteSkeleton } from '@app/note/components/skeleton';
import { NoteDefaultUser } from '@lume/app/note/components/user/default'; import { NoteDefaultUser } from '@app/note/components/user/default';
import { NoteWrapper } from '@lume/app/note/components/wrapper'; import { NoteWrapper } from '@app/note/components/wrapper';
import { RelayContext } from '@lume/shared/relayProvider';
import { READONLY_RELAYS } from '@lume/stores/constants'; import { RelayContext } from '@shared/relayProvider';
import { noteParser } from '@lume/utils/parser';
import { READONLY_RELAYS } from '@stores/constants';
import { noteParser } from '@utils/parser';
import { memo, useContext } from 'react'; import { memo, useContext } from 'react';
import useSWRSubscription from 'swr/subscription'; import useSWRSubscription from 'swr/subscription';

View File

@ -1,5 +1,5 @@
import { useProfile } from '@lume/utils/hooks/useProfile'; import { useProfile } from '@utils/hooks/useProfile';
import { shortenKey } from '@lume/utils/shortenKey'; import { shortenKey } from '@utils/shortenKey';
export function MentionUser(props: { children: any[] }) { export function MentionUser(props: { children: any[] }) {
const pubkey = props.children[0]; const pubkey = props.children[0];

View File

@ -1,9 +1,12 @@
import NoteLike from '@lume/app/note/components/metadata/like'; import NoteLike from '@app/note/components/metadata/like';
import NoteReply from '@lume/app/note/components/metadata/reply'; import NoteReply from '@app/note/components/metadata/reply';
import NoteRepost from '@lume/app/note/components/metadata/repost'; import NoteRepost from '@app/note/components/metadata/repost';
import ZapIcon from '@lume/shared/icons/zap';
import { RelayContext } from '@lume/shared/relayProvider'; import { RelayContext } from '@shared/relayProvider';
import { READONLY_RELAYS } from '@lume/stores/constants';
import ZapIcon from '@icons/zap';
import { READONLY_RELAYS } from '@stores/constants';
import { useContext, useState } from 'react'; import { useContext, useState } from 'react';
import useSWRSubscription from 'swr/subscription'; import useSWRSubscription from 'swr/subscription';

View File

@ -1,8 +1,11 @@
import LikeIcon from '@lume/shared/icons/like'; import { RelayContext } from '@shared/relayProvider';
import { RelayContext } from '@lume/shared/relayProvider';
import { WRITEONLY_RELAYS } from '@lume/stores/constants'; import LikeIcon from '@icons/like';
import { dateToUnix } from '@lume/utils/getDate';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { WRITEONLY_RELAYS } from '@stores/constants';
import { dateToUnix } from '@utils/date';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { getEventHash, signEvent } from 'nostr-tools'; import { getEventHash, signEvent } from 'nostr-tools';
import { useContext, useEffect, useState } from 'react'; import { useContext, useEffect, useState } from 'react';

View File

@ -1,9 +1,12 @@
import ReplyIcon from '@lume/shared/icons/reply'; import { Image } from '@shared/image';
import { Image } from '@lume/shared/image'; import { RelayContext } from '@shared/relayProvider';
import { RelayContext } from '@lume/shared/relayProvider';
import { WRITEONLY_RELAYS } from '@lume/stores/constants'; import ReplyIcon from '@icons/reply';
import { dateToUnix } from '@lume/utils/getDate';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { WRITEONLY_RELAYS } from '@stores/constants';
import { dateToUnix } from '@utils/date';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { Dialog, Transition } from '@headlessui/react'; import { Dialog, Transition } from '@headlessui/react';
import { getEventHash, signEvent } from 'nostr-tools'; import { getEventHash, signEvent } from 'nostr-tools';

View File

@ -1,8 +1,11 @@
import RepostIcon from '@lume/shared/icons/repost'; import { RelayContext } from '@shared/relayProvider';
import { RelayContext } from '@lume/shared/relayProvider';
import { WRITEONLY_RELAYS } from '@lume/stores/constants'; import RepostIcon from '@icons/repost';
import { dateToUnix } from '@lume/utils/getDate';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { WRITEONLY_RELAYS } from '@stores/constants';
import { dateToUnix } from '@utils/date';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { getEventHash, signEvent } from 'nostr-tools'; import { getEventHash, signEvent } from 'nostr-tools';
import { useContext, useEffect, useState } from 'react'; import { useContext, useEffect, useState } from 'react';

View File

@ -1,11 +1,14 @@
import { Kind1 } from '@lume/app/note/components/kind1'; import { Kind1 } from '@app/note/components/kind1';
import { Kind1063 } from '@lume/app/note/components/kind1063'; import { Kind1063 } from '@app/note/components/kind1063';
import NoteMetadata from '@lume/app/note/components/metadata'; import NoteMetadata from '@app/note/components/metadata';
import { NoteSkeleton } from '@lume/app/note/components/skeleton'; import { NoteSkeleton } from '@app/note/components/skeleton';
import { NoteDefaultUser } from '@lume/app/note/components/user/default'; import { NoteDefaultUser } from '@app/note/components/user/default';
import { RelayContext } from '@lume/shared/relayProvider';
import { READONLY_RELAYS } from '@lume/stores/constants'; import { RelayContext } from '@shared/relayProvider';
import { noteParser } from '@lume/utils/parser';
import { READONLY_RELAYS } from '@stores/constants';
import { noteParser } from '@utils/parser';
import { memo, useContext } from 'react'; import { memo, useContext } from 'react';
import useSWRSubscription from 'swr/subscription'; import useSWRSubscription from 'swr/subscription';

View File

@ -1,4 +1,4 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
export default function ImagePreview({ urls }: { urls: string[] }) { export default function ImagePreview({ urls }: { urls: string[] }) {
return ( return (

View File

@ -1,7 +1,8 @@
import { RootNote } from '@lume/app/note/components/rootNote'; import { RootNote } from '@app/note/components/rootNote';
import { NoteRepostUser } from '@lume/app/note/components/user/repost'; import { NoteRepostUser } from '@app/note/components/user/repost';
import { NoteWrapper } from '@lume/app/note/components/wrapper'; import { NoteWrapper } from '@app/note/components/wrapper';
import { getQuoteID } from '@lume/utils/transform';
import { getQuoteID } from '@utils/transform';
export function NoteQuoteRepost({ event }: { event: any }) { export function NoteQuoteRepost({ event }: { event: any }) {
const rootID = getQuoteID(event.tags); const rootID = getQuoteID(event.tags);

View File

@ -1,8 +1,10 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { RelayContext } from '@lume/shared/relayProvider'; import { RelayContext } from '@shared/relayProvider';
import { WRITEONLY_RELAYS } from '@lume/stores/constants';
import { dateToUnix } from '@lume/utils/getDate'; import { WRITEONLY_RELAYS } from '@stores/constants';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount';
import { dateToUnix } from '@utils/date';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { getEventHash, signEvent } from 'nostr-tools'; import { getEventHash, signEvent } from 'nostr-tools';
import { useContext, useState } from 'react'; import { useContext, useState } from 'react';

View File

@ -1,6 +1,7 @@
import { Kind1 } from '@lume/app/note/components/kind1'; import { Kind1 } from '@app/note/components/kind1';
import NoteReplyUser from '@lume/app/note/components/user/reply'; import NoteReplyUser from '@app/note/components/user/reply';
import { noteParser } from '@lume/utils/parser';
import { noteParser } from '@utils/parser';
export default function Reply({ data }: { data: any }) { export default function Reply({ data }: { data: any }) {
const content = noteParser(data); const content = noteParser(data);

View File

@ -1,8 +1,11 @@
import NoteReplyForm from '@lume/app/note/components/replies/form'; import NoteReplyForm from '@app/note/components/replies/form';
import Reply from '@lume/app/note/components/replies/item'; import Reply from '@app/note/components/replies/item';
import { RelayContext } from '@lume/shared/relayProvider';
import { READONLY_RELAYS } from '@lume/stores/constants'; import { RelayContext } from '@shared/relayProvider';
import { sortEvents } from '@lume/utils/transform';
import { READONLY_RELAYS } from '@stores/constants';
import { sortEvents } from '@utils/transform';
import { useContext } from 'react'; import { useContext } from 'react';
import useSWRSubscription from 'swr/subscription'; import useSWRSubscription from 'swr/subscription';

View File

@ -1,11 +1,14 @@
import { Kind1 } from '@lume/app/note/components/kind1'; import { Kind1 } from '@app/note/components/kind1';
import { Kind1063 } from '@lume/app/note/components/kind1063'; import { Kind1063 } from '@app/note/components/kind1063';
import NoteMetadata from '@lume/app/note/components/metadata'; import NoteMetadata from '@app/note/components/metadata';
import { NoteSkeleton } from '@lume/app/note/components/skeleton'; import { NoteSkeleton } from '@app/note/components/skeleton';
import { NoteDefaultUser } from '@lume/app/note/components/user/default'; import { NoteDefaultUser } from '@app/note/components/user/default';
import { RelayContext } from '@lume/shared/relayProvider';
import { READONLY_RELAYS } from '@lume/stores/constants'; import { RelayContext } from '@shared/relayProvider';
import { noteParser } from '@lume/utils/parser';
import { READONLY_RELAYS } from '@stores/constants';
import { noteParser } from '@utils/parser';
import { memo, useContext } from 'react'; import { memo, useContext } from 'react';
import useSWRSubscription from 'swr/subscription'; import useSWRSubscription from 'swr/subscription';

View File

@ -1,7 +1,9 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR, IMGPROXY_URL } from '@lume/stores/constants';
import { useProfile } from '@lume/utils/hooks/useProfile'; import { DEFAULT_AVATAR, IMGPROXY_URL } from '@stores/constants';
import { shortenKey } from '@lume/utils/shortenKey';
import { useProfile } from '@utils/hooks/useProfile';
import { shortenKey } from '@utils/shortenKey';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime'; import relativeTime from 'dayjs/plugin/relativeTime';

View File

@ -1,7 +1,9 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR, IMGPROXY_URL } from '@lume/stores/constants';
import { useProfile } from '@lume/utils/hooks/useProfile'; import { DEFAULT_AVATAR, IMGPROXY_URL } from '@stores/constants';
import { shortenKey } from '@lume/utils/shortenKey';
import { useProfile } from '@utils/hooks/useProfile';
import { shortenKey } from '@utils/shortenKey';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime'; import relativeTime from 'dayjs/plugin/relativeTime';

View File

@ -1,6 +1,8 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR, IMGPROXY_URL } from '@lume/stores/constants';
import { useProfile } from '@lume/utils/hooks/useProfile'; import { DEFAULT_AVATAR, IMGPROXY_URL } from '@stores/constants';
import { useProfile } from '@utils/hooks/useProfile';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime'; import relativeTime from 'dayjs/plugin/relativeTime';

View File

@ -1,6 +1,6 @@
import AppHeader from '@lume/shared/appHeader'; import AppHeader from '@shared/appHeader';
import MultiAccounts from '@lume/shared/multiAccounts'; import MultiAccounts from '@shared/multiAccounts';
import Navigation from '@lume/shared/navigation'; import Navigation from '@shared/navigation';
export function LayoutNewsfeed({ children }: { children: React.ReactNode }) { export function LayoutNewsfeed({ children }: { children: React.ReactNode }) {
return ( return (

View File

@ -1,11 +1,14 @@
import { Kind1 } from '@lume/app/note/components/kind1'; import { Kind1 } from '@app/note/components/kind1';
import NoteMetadata from '@lume/app/note/components/metadata'; import NoteMetadata from '@app/note/components/metadata';
import RepliesList from '@lume/app/note/components/replies/list'; import RepliesList from '@app/note/components/replies/list';
import { NoteDefaultUser } from '@lume/app/note/components/user/default'; import { NoteDefaultUser } from '@app/note/components/user/default';
import { RelayContext } from '@lume/shared/relayProvider';
import { READONLY_RELAYS } from '@lume/stores/constants'; import { RelayContext } from '@shared/relayProvider';
import { usePageContext } from '@lume/utils/hooks/usePageContext';
import { noteParser } from '@lume/utils/parser'; import { READONLY_RELAYS } from '@stores/constants';
import { usePageContext } from '@utils/hooks/usePageContext';
import { noteParser } from '@utils/parser';
import { useContext } from 'react'; import { useContext } from 'react';
import useSWRSubscription from 'swr/subscription'; import useSWRSubscription from 'swr/subscription';

View File

@ -1,4 +1,4 @@
import { CreateViewModal } from '@lume/app/daily/components/views/createModal'; import { CreateViewModal } from '@app/radar/components/views/createModal';
export function Header() { export function Header() {
return ( return (

View File

@ -1,5 +1,5 @@
import CancelIcon from '@lume/shared/icons/cancel'; import CancelIcon from '@icons/cancel';
import PlusIcon from '@lume/shared/icons/plus'; import PlusIcon from '@icons/plus';
import { Dialog, Transition } from '@headlessui/react'; import { Dialog, Transition } from '@headlessui/react';
import { Fragment, useState } from 'react'; import { Fragment, useState } from 'react';

View File

@ -1,6 +1,6 @@
import AppHeader from '@lume/shared/appHeader'; import AppHeader from '@shared/appHeader';
import MultiAccounts from '@lume/shared/multiAccounts'; import MultiAccounts from '@shared/multiAccounts';
import Navigation from '@lume/shared/navigation'; import Navigation from '@shared/navigation';
export function LayoutNewsfeed({ children }: { children: React.ReactNode }) { export function LayoutNewsfeed({ children }: { children: React.ReactNode }) {
return ( return (

View File

@ -1,8 +1,9 @@
import { Header } from '@lume/app/daily/components/header'; import { NoteBase } from '@app/note/components/base';
import { NoteBase } from '@lume/app/note/components/base'; import { NoteQuoteRepost } from '@app/note/components/quoteRepost';
import { NoteQuoteRepost } from '@lume/app/note/components/quoteRepost'; import { NoteSkeleton } from '@app/note/components/skeleton';
import { NoteSkeleton } from '@lume/app/note/components/skeleton'; import { Header } from '@app/radar/components/header';
import { getNotes } from '@lume/utils/storage';
import { getNotes } from '@utils/storage';
import { useInfiniteQuery } from '@tanstack/react-query'; import { useInfiniteQuery } from '@tanstack/react-query';
import { useVirtualizer } from '@tanstack/react-virtual'; import { useVirtualizer } from '@tanstack/react-virtual';

View File

@ -1,7 +1,7 @@
export function Page() { export function Page() {
return ( return (
<div> <div>
<p>MySpace</p> <p>Space</p>
</div> </div>
); );
} }

View File

@ -1,7 +1,9 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR } from '@lume/stores/constants';
import { useProfile } from '@lume/utils/hooks/useProfile'; import { DEFAULT_AVATAR } from '@stores/constants';
import { shortenKey } from '@lume/utils/shortenKey';
import { useProfile } from '@utils/hooks/useProfile';
import { shortenKey } from '@utils/shortenKey';
export default function User({ pubkey }: { pubkey: string }) { export default function User({ pubkey }: { pubkey: string }) {
const { user } = useProfile(pubkey); const { user } = useProfile(pubkey);

View File

@ -1,5 +1,5 @@
import ArrowLeftIcon from '@lume/shared/icons/arrowLeft'; import ArrowLeftIcon from '@icons/arrowLeft';
import ArrowRightIcon from '@lume/shared/icons/arrowRight'; import ArrowRightIcon from '@icons/arrowRight';
import useSWR from 'swr'; import useSWR from 'swr';

View File

@ -1,6 +1,7 @@
import EyeOffIcon from '@lume/shared/icons/eyeOff'; import EyeOffIcon from '@icons/eyeOff';
import EyeOnIcon from '@lume/shared/icons/eyeOn'; import EyeOnIcon from '@icons/eyeOn';
import { onboardingAtom } from '@lume/stores/onboarding';
import { onboardingAtom } from '@stores/onboarding';
import { useSetAtom } from 'jotai'; import { useSetAtom } from 'jotai';
import { generatePrivateKey, getPublicKey, nip19 } from 'nostr-tools'; import { generatePrivateKey, getPublicKey, nip19 } from 'nostr-tools';

View File

@ -1,7 +1,8 @@
import { AvatarUploader } from '@lume/shared/avatarUploader'; import { AvatarUploader } from '@shared/avatarUploader';
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR } from '@lume/stores/constants';
import { onboardingAtom } from '@lume/stores/onboarding'; import { DEFAULT_AVATAR } from '@stores/constants';
import { onboardingAtom } from '@stores/onboarding';
import { useAtom } from 'jotai'; import { useAtom } from 'jotai';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';

View File

@ -1,16 +1,20 @@
import User from '@lume/auth/components/user'; import { RelayContext } from '@shared/relayProvider';
import CheckCircleIcon from '@lume/shared/icons/checkCircle';
import { RelayContext } from '@lume/shared/relayProvider'; import CheckCircleIcon from '@icons/checkCircle';
import { WRITEONLY_RELAYS } from '@lume/stores/constants';
import { onboardingAtom } from '@lume/stores/onboarding'; import { WRITEONLY_RELAYS } from '@stores/constants';
import { createAccount, createPleb } from '@lume/utils/storage'; import { onboardingAtom } from '@stores/onboarding';
import { arrayToNIP02 } from '@lume/utils/transform';
import { createAccount, createPleb } from '@utils/storage';
import { arrayToNIP02 } from '@utils/transform';
import { useAtom } from 'jotai'; import { useAtom } from 'jotai';
import { getEventHash, signEvent } from 'nostr-tools'; import { getEventHash, signEvent } from 'nostr-tools';
import { useContext, useState } from 'react'; import { useContext, useState } from 'react';
import { navigate } from 'vite-plugin-ssr/client/router'; import { navigate } from 'vite-plugin-ssr/client/router';
import User from '../../../components/user';
const initialList = [ const initialList = [
{ pubkey: '82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2' }, { pubkey: '82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2' },
{ pubkey: 'a341f45ff9758f570a21b000c17d4e53a3a497c8397f26c0e6d61e5acffc7a98' }, { pubkey: 'a341f45ff9758f570a21b000c17d4e53a3a497c8397f26c0e6d61e5acffc7a98' },

View File

@ -1,4 +1,4 @@
import { onboardingAtom } from '@lume/stores/onboarding'; import { onboardingAtom } from '@stores/onboarding';
import { useSetAtom } from 'jotai'; import { useSetAtom } from 'jotai';
import { getPublicKey, nip19 } from 'nostr-tools'; import { getPublicKey, nip19 } from 'nostr-tools';

View File

@ -1,9 +1,11 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { RelayContext } from '@lume/shared/relayProvider'; import { RelayContext } from '@shared/relayProvider';
import { DEFAULT_AVATAR, READONLY_RELAYS } from '@lume/stores/constants';
import { onboardingAtom } from '@lume/stores/onboarding'; import { DEFAULT_AVATAR, READONLY_RELAYS } from '@stores/constants';
import { shortenKey } from '@lume/utils/shortenKey'; import { onboardingAtom } from '@stores/onboarding';
import { createAccount, createPleb } from '@lume/utils/storage';
import { shortenKey } from '@utils/shortenKey';
import { createAccount, createPleb } from '@utils/storage';
import { useAtom } from 'jotai'; import { useAtom } from 'jotai';
import { getPublicKey } from 'nostr-tools'; import { getPublicKey } from 'nostr-tools';

View File

@ -1,5 +1,6 @@
import ArrowRightIcon from '@lume/shared/icons/arrowRight'; import { Image } from '@shared/image';
import { Image } from '@lume/shared/image';
import ArrowRightIcon from '@icons/arrowRight';
const PLEBS = [ const PLEBS = [
'https://133332.xyz/p.jpg', 'https://133332.xyz/p.jpg',

View File

@ -1,11 +1,11 @@
import '@lume/renderer/index.css';
import { Shell } from '@lume/renderer/shell';
import { PageContextClient } from '@lume/renderer/types';
import { StrictMode } from 'react'; import { StrictMode } from 'react';
import { Root, createRoot, hydrateRoot } from 'react-dom/client'; import { Root, createRoot, hydrateRoot } from 'react-dom/client';
import 'vidstack/styles/defaults.css'; import 'vidstack/styles/defaults.css';
import './index.css';
import { Shell } from './shell';
import { PageContextClient } from './types';
export const clientRouting = true; export const clientRouting = true;
export const hydrationCanBeAborted = true; export const hydrationCanBeAborted = true;

View File

@ -1,10 +1,10 @@
import { Shell } from '@lume/renderer/shell';
import { PageContextServer } from '@lume/renderer/types';
import { StrictMode } from 'react'; import { StrictMode } from 'react';
import ReactDOMServer from 'react-dom/server'; import ReactDOMServer from 'react-dom/server';
import { dangerouslySkipEscape, escapeInject } from 'vite-plugin-ssr/server'; import { dangerouslySkipEscape, escapeInject } from 'vite-plugin-ssr/server';
import { Shell } from './shell';
import { PageContextServer } from './types';
export const passToClient = ['pageProps']; export const passToClient = ['pageProps'];
export function render(pageContext: PageContextServer) { export function render(pageContext: PageContextServer) {

View File

@ -1,10 +1,11 @@
import { PageContext } from '@lume/renderer/types'; import { RelayProvider } from '@shared/relayProvider';
import { RelayProvider } from '@lume/shared/relayProvider';
import { PageContextProvider } from '@lume/utils/hooks/usePageContext'; import { PageContextProvider } from '@utils/hooks/usePageContext';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { LayoutDefault } from './layoutDefault'; import { LayoutDefault } from './layoutDefault';
import { PageContext } from './types';
const queryClient = new QueryClient(); const queryClient = new QueryClient();

View File

@ -1,5 +1,6 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR } from '@lume/stores/constants';
import { DEFAULT_AVATAR } from '@stores/constants';
export default function ActiveAccount({ user }: { user: any }) { export default function ActiveAccount({ user }: { user: any }) {
const userData = JSON.parse(user.metadata); const userData = JSON.parse(user.metadata);

View File

@ -1,5 +1,6 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR } from '@lume/stores/constants';
import { DEFAULT_AVATAR } from '@stores/constants';
export default function InactiveAccount({ user }: { user: any }) { export default function InactiveAccount({ user }: { user: any }) {
const userData = JSON.parse(user.metadata); const userData = JSON.parse(user.metadata);

View File

@ -1,4 +1,4 @@
import { usePageContext } from '@lume/utils/hooks/usePageContext'; import { usePageContext } from '@utils/hooks/usePageContext';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';

View File

@ -1,6 +1,6 @@
import ArrowLeftIcon from '@lume/shared/icons/arrowLeft'; import ArrowLeftIcon from '@icons/arrowLeft';
import ArrowRightIcon from '@lume/shared/icons/arrowRight'; import ArrowRightIcon from '@icons/arrowRight';
import RefreshIcon from '@lume/shared/icons/refresh'; import RefreshIcon from '@icons/refresh';
export default function AppHeader() { export default function AppHeader() {
const goBack = () => { const goBack = () => {

View File

@ -1,4 +1,4 @@
import { createBlobFromFile } from '@lume/utils/createBlobFromFile'; import { createBlobFromFile } from '@utils/createBlobFromFile';
import { open } from '@tauri-apps/api/dialog'; import { open } from '@tauri-apps/api/dialog';
import { Body, fetch } from '@tauri-apps/api/http'; import { Body, fetch } from '@tauri-apps/api/http';

View File

@ -1,11 +1,14 @@
import { Post } from '@lume/shared/composer/types/post'; import { Post } from '@shared/composer/types/post';
import { User } from '@lume/shared/composer/user'; import { User } from '@shared/composer/user';
import CancelIcon from '@lume/shared/icons/cancel';
import ChevronDownIcon from '@lume/shared/icons/chevronDown'; import CancelIcon from '@icons/cancel';
import ChevronRightIcon from '@lume/shared/icons/chevronRight'; import ChevronDownIcon from '@icons/chevronDown';
import ComposeIcon from '@lume/shared/icons/compose'; import ChevronRightIcon from '@icons/chevronRight';
import { composerAtom } from '@lume/stores/composer'; import ComposeIcon from '@icons/compose';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount';
import { composerAtom } from '@stores/composer';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { Dialog, Transition } from '@headlessui/react'; import { Dialog, Transition } from '@headlessui/react';
import { useAtom } from 'jotai'; import { useAtom } from 'jotai';

View File

@ -1,5 +1,6 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { DEFAULT_AVATAR, IMGPROXY_URL } from '@lume/stores/constants';
import { DEFAULT_AVATAR, IMGPROXY_URL } from '@stores/constants';
export function User({ data }: { data: any }) { export function User({ data }: { data: any }) {
const metadata = JSON.parse(data.metadata); const metadata = JSON.parse(data.metadata);

View File

@ -1,11 +1,14 @@
import HeartBeatIcon from '@lume/shared/icons/heartbeat'; import { RelayContext } from '@shared/relayProvider';
import { RelayContext } from '@lume/shared/relayProvider';
import { READONLY_RELAYS } from '@lume/stores/constants'; import HeartBeatIcon from '@icons/heartbeat';
import { hasNewerNoteAtom } from '@lume/stores/note';
import { dateToUnix } from '@lume/utils/getDate'; import { READONLY_RELAYS } from '@stores/constants';
import { useActiveAccount } from '@lume/utils/hooks/useActiveAccount'; import { hasNewerNoteAtom } from '@stores/note';
import { createChat, createNote, updateAccount } from '@lume/utils/storage';
import { getParentID, nip02ToArray } from '@lume/utils/transform'; import { dateToUnix } from '@utils/date';
import { useActiveAccount } from '@utils/hooks/useActiveAccount';
import { createChat, createNote, updateAccount } from '@utils/storage';
import { getParentID, nip02ToArray } from '@utils/transform';
import { useSetAtom } from 'jotai'; import { useSetAtom } from 'jotai';
import { useContext, useRef } from 'react'; import { useContext, useRef } from 'react';

View File

@ -1,8 +1,10 @@
import PlusIcon from '@lume/shared/icons/plus'; import PlusIcon from '@icons/plus';
import { channelContentAtom } from '@lume/stores/channel';
import { chatContentAtom } from '@lume/stores/chat'; import { channelContentAtom } from '@stores/channel';
import { noteContentAtom } from '@lume/stores/note'; import { chatContentAtom } from '@stores/chat';
import { createBlobFromFile } from '@lume/utils/createBlobFromFile'; import { noteContentAtom } from '@stores/note';
import { createBlobFromFile } from '@utils/createBlobFromFile';
import { open } from '@tauri-apps/api/dialog'; import { open } from '@tauri-apps/api/dialog';
import { Body, fetch } from '@tauri-apps/api/http'; import { Body, fetch } from '@tauri-apps/api/http';

View File

@ -1,4 +1,4 @@
import { DEFAULT_AVATAR } from '@lume/stores/constants'; import { DEFAULT_AVATAR } from '@stores/constants';
export function Image(props) { export function Image(props) {
const addImageFallback = (event) => { const addImageFallback = (event) => {

View File

@ -1,9 +1,12 @@
import ActiveAccount from '@lume/shared/accounts/active'; import ActiveAccount from '@shared/accounts/active';
import InactiveAccount from '@lume/shared/accounts/inactive'; import InactiveAccount from '@shared/accounts/inactive';
import BellIcon from '@lume/shared/icons/bell';
import PlusIcon from '@lume/shared/icons/plus'; import BellIcon from '@icons/bell';
import { APP_VERSION } from '@lume/stores/constants'; import PlusIcon from '@icons/plus';
import { getAccounts, getActiveAccount } from '@lume/utils/storage';
import { APP_VERSION } from '@stores/constants';
import { getAccounts, getActiveAccount } from '@utils/storage';
import useSWR from 'swr'; import useSWR from 'swr';

View File

@ -1,12 +1,14 @@
import ChannelsList from '@lume/app/channel/components/list'; import ChannelsList from '@app/channel/components/list';
import ChatsList from '@lume/app/chat/components/list'; import ChatsList from '@app/chat/components/list';
import ActiveLink from '@lume/shared/activeLink';
import { ComposerModal } from '@lume/shared/composer/modal'; import ActiveLink from '@shared/activeLink';
import EventCollector from '@lume/shared/eventCollector'; import { ComposerModal } from '@shared/composer/modal';
import MyspaceIcon from '@lume/shared/icons/myspace'; import EventCollector from '@shared/eventCollector';
import NavArrowDownIcon from '@lume/shared/icons/navArrowDown';
import ThreadsIcon from '@lume/shared/icons/threads'; import MyspaceIcon from '@icons/myspace';
import WorldIcon from '@lume/shared/icons/world'; import NavArrowDownIcon from '@icons/navArrowDown';
import ThreadsIcon from '@icons/threads';
import WorldIcon from '@icons/world';
import { Disclosure } from '@headlessui/react'; import { Disclosure } from '@headlessui/react';
@ -24,14 +26,14 @@ export default function Navigation() {
</div> </div>
<div className="flex flex-col text-zinc-400"> <div className="flex flex-col text-zinc-400">
<ActiveLink <ActiveLink
href="/app/daily" href="/app/radar"
className="flex h-8 items-center gap-2.5 rounded-md px-2.5 text-[13px] font-semibold hover:text-zinc-200" className="flex h-8 items-center gap-2.5 rounded-md px-2.5 text-[13px] font-semibold hover:text-zinc-200"
activeClassName="" activeClassName=""
> >
<span className="inline-flex h-5 w-5 items-center justify-center rounded bg-zinc-900"> <span className="inline-flex h-5 w-5 items-center justify-center rounded bg-zinc-900">
<WorldIcon width={12} height={12} className="text-zinc-200" /> <WorldIcon width={12} height={12} className="text-zinc-200" />
</span> </span>
<span>Daily</span> <span>Radar</span>
</ActiveLink> </ActiveLink>
<ActiveLink <ActiveLink
href="/app/threads" href="/app/threads"
@ -44,14 +46,14 @@ export default function Navigation() {
<span>Threads</span> <span>Threads</span>
</ActiveLink> </ActiveLink>
<ActiveLink <ActiveLink
href="/app/myspace" href="/app/space"
className="flex h-8 items-center gap-2.5 rounded-md px-2.5 text-[13px] font-semibold hover:text-zinc-200" className="flex h-8 items-center gap-2.5 rounded-md px-2.5 text-[13px] font-semibold hover:text-zinc-200"
activeClassName="" activeClassName=""
> >
<span className="inline-flex h-5 w-5 items-center justify-center rounded bg-zinc-900"> <span className="inline-flex h-5 w-5 items-center justify-center rounded bg-zinc-900">
<MyspaceIcon width={12} height={12} className="text-zinc-200" /> <MyspaceIcon width={12} height={12} className="text-zinc-200" />
</span> </span>
<span>MySpace</span> <span>Space</span>
</ActiveLink> </ActiveLink>
</div> </div>
</div> </div>

View File

@ -1,4 +1,4 @@
import { useNetworkStatus } from '@lume/utils/hooks/useNetworkStatus'; import { useNetworkStatus } from '@utils/hooks/useNetworkStatus';
export function NetworkStatusIndicator() { export function NetworkStatusIndicator() {
const isOnline = useNetworkStatus(); const isOnline = useNetworkStatus();

View File

@ -1,6 +1,7 @@
import { RelayContext } from '@lume/shared/relaysProvider'; import { RelayContext } from '@shared/relaysProvider';
import { UserFollow } from '@lume/shared/user/follow'; import { UserFollow } from '@shared/user/follow';
import { READONLY_RELAYS } from '@lume/stores/constants';
import { READONLY_RELAYS } from '@stores/constants';
import destr from 'destr'; import destr from 'destr';
import { Author } from 'nostr-relaypool'; import { Author } from 'nostr-relaypool';

View File

@ -1,6 +1,7 @@
import { RelayContext } from '@lume/shared/relaysProvider'; import { RelayContext } from '@shared/relaysProvider';
import { UserFollow } from '@lume/shared/user/follow'; import { UserFollow } from '@shared/user/follow';
import { READONLY_RELAYS } from '@lume/stores/constants';
import { READONLY_RELAYS } from '@stores/constants';
import { Author } from 'nostr-relaypool'; import { Author } from 'nostr-relaypool';
import { useContext, useEffect, useState } from 'react'; import { useContext, useEffect, useState } from 'react';

View File

@ -1,7 +1,9 @@
import { Image } from '@lume/shared/image'; import { Image } from '@shared/image';
import { RelayContext } from '@lume/shared/relayProvider'; import { RelayContext } from '@shared/relayProvider';
import { DEFAULT_AVATAR, READONLY_RELAYS } from '@lume/stores/constants';
import { shortenKey } from '@lume/utils/shortenKey'; import { DEFAULT_AVATAR, READONLY_RELAYS } from '@stores/constants';
import { shortenKey } from '@utils/shortenKey';
import destr from 'destr'; import destr from 'destr';
import { Author } from 'nostr-relaypool'; import { Author } from 'nostr-relaypool';

View File

@ -1,6 +1,7 @@
import { NoteBase } from '@lume/shared/note/base'; import { NoteBase } from '@shared/note/base';
import { RelayContext } from '@lume/shared/relaysProvider'; import { RelayContext } from '@shared/relaysProvider';
import { READONLY_RELAYS } from '@lume/stores/constants';
import { READONLY_RELAYS } from '@stores/constants';
import { Author } from 'nostr-relaypool'; import { Author } from 'nostr-relaypool';
import { useContext, useEffect, useState } from 'react'; import { useContext, useEffect, useState } from 'react';

View File

@ -1,4 +1,4 @@
import { FULL_RELAYS } from '@lume/stores/constants'; import { FULL_RELAYS } from '@stores/constants';
import { RelayPool } from 'nostr-relaypool'; import { RelayPool } from 'nostr-relaypool';
import { createContext } from 'react'; import { createContext } from 'react';

22
src/utils/date.tsx Normal file
View File

@ -0,0 +1,22 @@
// get X days ago with user provided date
export function getDayAgo(numOfDays, date = new Date()) {
const days = new Date(date.getTime());
days.setDate(date.getDate() - numOfDays);
return days;
}
// get X hours ago with user provided date
export function getHourAgo(numOfHours, date = new Date()) {
const hours = new Date(date.getTime());
hours.setHours(date.getHours() - numOfHours);
return hours;
}
// convert date to unix timestamp
export function dateToUnix(_date?: Date) {
const date = _date || new Date();
return Math.floor(date.getTime() / 1000);
}

View File

@ -1,22 +0,0 @@
// get X days ago with user provided date
export function daysAgo(numOfDays, date = new Date()) {
const daysAgo = new Date(date.getTime());
daysAgo.setDate(date.getDate() - numOfDays);
return daysAgo;
}
// get X hours ago with user provided date
export function hoursAgo(numOfHours, date = new Date()) {
const hoursAgo = new Date(date.getTime());
hoursAgo.setHours(date.getHours() - numOfHours);
return hoursAgo;
}
// convert date to unix timestamp
export function dateToUnix(_date?: Date) {
const date = _date || new Date();
return Math.floor(date.getTime() / 1000);
}

View File

@ -1,4 +1,4 @@
import { getActiveAccount } from '@lume/utils/storage'; import { getActiveAccount } from '@utils/storage';
import useSWR from 'swr'; import useSWR from 'swr';

View File

@ -1,5 +1,6 @@
import { METADATA_SERVICE } from '@lume/stores/constants'; import { METADATA_SERVICE } from '@stores/constants';
import { createPleb, getPleb } from '@lume/utils/storage';
import { createPleb, getPleb } from '@utils/storage';
import useSWR from 'swr'; import useSWR from 'swr';

View File

@ -2,7 +2,6 @@
"compilerOptions": { "compilerOptions": {
"baseUrl": "./", "baseUrl": "./",
"paths": { "paths": {
"@lume/*": ["src/*"],
"@app/*": ["src/app/*"], "@app/*": ["src/app/*"],
"@shared/*": ["src/shared/*"], "@shared/*": ["src/shared/*"],
"@icons/*": ["src/shared/icons/*"], "@icons/*": ["src/shared/icons/*"],