feat: refactor
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
"@getalby/sdk": "^3.2.3",
|
"@getalby/sdk": "^3.2.3",
|
||||||
"@lume/ark": "workspace:^",
|
"@lume/ark": "workspace:^",
|
||||||
"@lume/icons": "workspace:^",
|
"@lume/icons": "workspace:^",
|
||||||
|
"@lume/storage": "workspace:^",
|
||||||
"@lume/ui": "workspace:^",
|
"@lume/ui": "workspace:^",
|
||||||
"@lume/utils": "workspace:^",
|
"@lume/utils": "workspace:^",
|
||||||
"@nostr-dev-kit/ndk": "^2.3.2",
|
"@nostr-dev-kit/ndk": "^2.3.2",
|
||||||
@@ -79,6 +80,7 @@
|
|||||||
"tailwindcss": "^3.4.1",
|
"tailwindcss": "^3.4.1",
|
||||||
"typescript": "^5.3.3",
|
"typescript": "^5.3.3",
|
||||||
"vite": "^5.0.11",
|
"vite": "^5.0.11",
|
||||||
|
"vite-plugin-top-level-await": "^1.4.1",
|
||||||
"vite-tsconfig-paths": "^4.2.3"
|
"vite-tsconfig-paths": "^4.2.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { ColumnProvider, LumeProvider } from "@lume/ark";
|
import { ColumnProvider, LumeProvider } from "@lume/ark";
|
||||||
|
import { StorageProvider } from "@lume/storage";
|
||||||
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
||||||
import { Toaster } from "sonner";
|
import { Toaster } from "sonner";
|
||||||
import Router from "./router";
|
import Router from "./router";
|
||||||
@@ -15,11 +16,13 @@ export default function App() {
|
|||||||
return (
|
return (
|
||||||
<QueryClientProvider client={queryClient}>
|
<QueryClientProvider client={queryClient}>
|
||||||
<Toaster position="top-center" theme="system" closeButton />
|
<Toaster position="top-center" theme="system" closeButton />
|
||||||
<LumeProvider>
|
<StorageProvider>
|
||||||
<ColumnProvider>
|
<LumeProvider>
|
||||||
<Router />
|
<ColumnProvider>
|
||||||
</ColumnProvider>
|
<Router />
|
||||||
</LumeProvider>
|
</ColumnProvider>
|
||||||
|
</LumeProvider>
|
||||||
|
</StorageProvider>
|
||||||
</QueryClientProvider>
|
</QueryClientProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { LoaderIcon } from "@lume/icons";
|
import { LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { AppLayout, AuthLayout, HomeLayout, SettingsLayout } from "@lume/ui";
|
import { AppLayout, AuthLayout, HomeLayout, SettingsLayout } from "@lume/ui";
|
||||||
import { fetch } from "@tauri-apps/plugin-http";
|
import { fetch } from "@tauri-apps/plugin-http";
|
||||||
import {
|
import {
|
||||||
@@ -23,7 +24,7 @@ export default function Router() {
|
|||||||
element: <HomeLayout />,
|
element: <HomeLayout />,
|
||||||
errorElement: <ErrorScreen />,
|
errorElement: <ErrorScreen />,
|
||||||
loader: async () => {
|
loader: async () => {
|
||||||
if (!storage.account) return redirect("auth");
|
if (!ark.account) return redirect("auth");
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { CheckIcon, ChevronDownIcon, LoaderIcon } from "@lume/icons";
|
import { CheckIcon, ChevronDownIcon, LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { onboardingAtom } from "@lume/utils";
|
import { onboardingAtom } from "@lume/utils";
|
||||||
import NDK, {
|
import NDK, {
|
||||||
NDKEvent,
|
NDKEvent,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useStorage } from "@lume/ark";
|
|
||||||
import { EyeOffIcon, EyeOnIcon, LoaderIcon } from "@lume/icons";
|
import { EyeOffIcon, EyeOnIcon, LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { getPublicKey, nip19 } from "nostr-tools";
|
import { getPublicKey, nip19 } from "nostr-tools";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useForm } from "react-hook-form";
|
import { useForm } from "react-hook-form";
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { LoaderIcon } from "@lume/icons";
|
import { LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import NDK, { NDKNip46Signer, NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
|
import NDK, { NDKNip46Signer, NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
|
||||||
import { nip19 } from "nostr-tools";
|
import { nip19 } from "nostr-tools";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { LoaderIcon } from "@lume/icons";
|
import { LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { NIP05 } from "@lume/types";
|
import { NIP05 } from "@lume/types";
|
||||||
import NDK, { NDKNip46Signer, NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
|
import NDK, { NDKNip46Signer, NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
|
||||||
import { Window } from "@tauri-apps/api/window";
|
import { Window } from "@tauri-apps/api/window";
|
||||||
import { fetch } from "@tauri-apps/plugin-http";
|
import { fetch } from "@tauri-apps/plugin-http";
|
||||||
import { nip19 } from "nostr-tools";
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useForm } from "react-hook-form";
|
import { useForm } from "react-hook-form";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
@@ -30,6 +30,13 @@ export function LoginWithOAuth() {
|
|||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
|
||||||
|
if (!emailRegex.test(data.nip05)) {
|
||||||
|
setLoading(false);
|
||||||
|
return toast.error(
|
||||||
|
"Cannot verify your NIP-05 address, please try again later.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const localPath = data.nip05.split("@")[0];
|
const localPath = data.nip05.split("@")[0];
|
||||||
const service = data.nip05.split("@")[1];
|
const service = data.nip05.split("@")[1];
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { InfoIcon, LoaderIcon } from "@lume/icons";
|
import { InfoIcon, LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { FETCH_LIMIT } from "@lume/utils";
|
import { FETCH_LIMIT } from "@lume/utils";
|
||||||
import { NDKKind } from "@nostr-dev-kit/ndk";
|
import { NDKKind } from "@nostr-dev-kit/ndk";
|
||||||
import * as Switch from "@radix-ui/react-switch";
|
import * as Switch from "@radix-ui/react-switch";
|
||||||
@@ -57,7 +58,7 @@ export function OnboardingScreen() {
|
|||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
|
||||||
// get account contacts
|
// get account contacts
|
||||||
await ark.getUserContacts(storage.account.pubkey);
|
await ark.getUserContacts(ark.account.pubkey);
|
||||||
|
|
||||||
// refetch newsfeed
|
// refetch newsfeed
|
||||||
await queryClient.prefetchInfiniteQuery({
|
await queryClient.prefetchInfiniteQuery({
|
||||||
@@ -73,7 +74,7 @@ export function OnboardingScreen() {
|
|||||||
const events = await ark.getInfiniteEvents({
|
const events = await ark.getInfiniteEvents({
|
||||||
filter: {
|
filter: {
|
||||||
kinds: [NDKKind.Text, NDKKind.Repost],
|
kinds: [NDKKind.Text, NDKKind.Repost],
|
||||||
authors: storage.account.contacts,
|
authors: ark.account.contacts,
|
||||||
},
|
},
|
||||||
limit: FETCH_LIMIT,
|
limit: FETCH_LIMIT,
|
||||||
pageParam,
|
pageParam,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { LoaderIcon, RunIcon } from "@lume/icons";
|
import { LoaderIcon, RunIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { User } from "@lume/ui";
|
import { User } from "@lume/ui";
|
||||||
import { NDKKind } from "@nostr-dev-kit/ndk";
|
import { NDKKind } from "@nostr-dev-kit/ndk";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
@@ -17,7 +18,7 @@ export function DepotContactCard() {
|
|||||||
|
|
||||||
const event = await ark.getEventByFilter({
|
const event = await ark.getEventByFilter({
|
||||||
filter: {
|
filter: {
|
||||||
authors: [storage.account.pubkey],
|
authors: [ark.account.pubkey],
|
||||||
kinds: [NDKKind.Contacts],
|
kinds: [NDKKind.Contacts],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -39,13 +40,13 @@ export function DepotContactCard() {
|
|||||||
<div className="flex h-56 w-full flex-col gap-2 overflow-hidden rounded-xl bg-neutral-100 p-2 dark:bg-neutral-900">
|
<div className="flex h-56 w-full flex-col gap-2 overflow-hidden rounded-xl bg-neutral-100 p-2 dark:bg-neutral-900">
|
||||||
<div className="flex flex-1 items-center justify-center rounded-lg bg-neutral-200 dark:bg-neutral-800">
|
<div className="flex flex-1 items-center justify-center rounded-lg bg-neutral-200 dark:bg-neutral-800">
|
||||||
<div className="isolate flex -space-x-2">
|
<div className="isolate flex -space-x-2">
|
||||||
{storage.account.contacts?.slice(0, 8).map((item) => (
|
{ark.account.contacts?.slice(0, 8).map((item) => (
|
||||||
<User key={item} pubkey={item} variant="ministacked" />
|
<User key={item} pubkey={item} variant="ministacked" />
|
||||||
))}
|
))}
|
||||||
{storage.account.contacts?.length > 8 ? (
|
{ark.account.contacts?.length > 8 ? (
|
||||||
<div className="inline-flex h-6 w-6 items-center justify-center rounded-full bg-neutral-300 text-neutral-900 ring-1 ring-white dark:bg-neutral-700 dark:text-neutral-100 dark:ring-black">
|
<div className="inline-flex h-6 w-6 items-center justify-center rounded-full bg-neutral-300 text-neutral-900 ring-1 ring-white dark:bg-neutral-700 dark:text-neutral-100 dark:ring-black">
|
||||||
<span className="text-[8px] font-medium">
|
<span className="text-[8px] font-medium">
|
||||||
+{storage.account.contacts?.length - 8}
|
+{ark.account.contacts?.length - 8}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { LoaderIcon, RunIcon } from "@lume/icons";
|
import { LoaderIcon, RunIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { User } from "@lume/ui";
|
import { User } from "@lume/ui";
|
||||||
import { NDKKind } from "@nostr-dev-kit/ndk";
|
import { NDKKind } from "@nostr-dev-kit/ndk";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
@@ -17,7 +18,7 @@ export function DepotProfileCard() {
|
|||||||
|
|
||||||
const event = await ark.getEventByFilter({
|
const event = await ark.getEventByFilter({
|
||||||
filter: {
|
filter: {
|
||||||
authors: [storage.account.pubkey],
|
authors: [ark.account.pubkey],
|
||||||
kinds: [NDKKind.Metadata],
|
kinds: [NDKKind.Metadata],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -38,7 +39,7 @@ export function DepotProfileCard() {
|
|||||||
return (
|
return (
|
||||||
<div className="flex h-56 w-full flex-col gap-2 overflow-hidden rounded-xl bg-neutral-100 p-2 dark:bg-neutral-900">
|
<div className="flex h-56 w-full flex-col gap-2 overflow-hidden rounded-xl bg-neutral-100 p-2 dark:bg-neutral-900">
|
||||||
<div className="flex flex-1 items-center justify-center rounded-lg bg-neutral-200 dark:bg-neutral-800">
|
<div className="flex flex-1 items-center justify-center rounded-lg bg-neutral-200 dark:bg-neutral-800">
|
||||||
<User pubkey={storage.account.pubkey} variant="simple" />
|
<User pubkey={ark.account.pubkey} variant="simple" />
|
||||||
</div>
|
</div>
|
||||||
<div className="inline-flex shrink-0 items-center justify-between">
|
<div className="inline-flex shrink-0 items-center justify-between">
|
||||||
<div className="text-sm font-medium">Profile</div>
|
<div className="text-sm font-medium">Profile</div>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { LoaderIcon, RunIcon } from "@lume/icons";
|
import { LoaderIcon, RunIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { NDKKind } from "@nostr-dev-kit/ndk";
|
import { NDKKind } from "@nostr-dev-kit/ndk";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
@@ -17,7 +18,7 @@ export function DepotRelaysCard() {
|
|||||||
|
|
||||||
const event = await ark.getEventByFilter({
|
const event = await ark.getEventByFilter({
|
||||||
filter: {
|
filter: {
|
||||||
authors: [storage.account.pubkey],
|
authors: [ark.account.pubkey],
|
||||||
kinds: [NDKKind.RelayList],
|
kinds: [NDKKind.RelayList],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -39,7 +40,7 @@ export function DepotRelaysCard() {
|
|||||||
async function loadRelays() {
|
async function loadRelays() {
|
||||||
const event = await ark.getEventByFilter({
|
const event = await ark.getEventByFilter({
|
||||||
filter: {
|
filter: {
|
||||||
authors: [storage.account.pubkey],
|
authors: [ark.account.pubkey],
|
||||||
kinds: [NDKKind.RelayList],
|
kinds: [NDKKind.RelayList],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { ChevronDownIcon, DepotIcon, GossipIcon } from "@lume/icons";
|
import { ChevronDownIcon, DepotIcon, GossipIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { NDKKind } from "@nostr-dev-kit/ndk";
|
import { NDKKind } from "@nostr-dev-kit/ndk";
|
||||||
import * as Collapsible from "@radix-ui/react-collapsible";
|
import * as Collapsible from "@radix-ui/react-collapsible";
|
||||||
import { invoke } from "@tauri-apps/api/core";
|
import { invoke } from "@tauri-apps/api/core";
|
||||||
@@ -36,7 +37,7 @@ export function DepotScreen() {
|
|||||||
|
|
||||||
const relayEvent = await ark.getEventByFilter({
|
const relayEvent = await ark.getEventByFilter({
|
||||||
filter: {
|
filter: {
|
||||||
authors: [storage.account.pubkey],
|
authors: [ark.account.pubkey],
|
||||||
kinds: [NDKKind.RelayList],
|
kinds: [NDKKind.RelayList],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { LoaderIcon } from "@lume/icons";
|
import { LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { delay } from "@lume/utils";
|
import { delay } from "@lume/utils";
|
||||||
import { resolveResource } from "@tauri-apps/api/path";
|
import { resolveResource } from "@tauri-apps/api/path";
|
||||||
import { readTextFile, writeTextFile } from "@tauri-apps/plugin-fs";
|
import { readTextFile, writeTextFile } from "@tauri-apps/plugin-fs";
|
||||||
@@ -26,9 +27,7 @@ export function DepotOnboardingScreen() {
|
|||||||
|
|
||||||
// add current user to whitelist
|
// add current user to whitelist
|
||||||
// biome-ignore lint/complexity/useLiteralKeys: <explanation>
|
// biome-ignore lint/complexity/useLiteralKeys: <explanation>
|
||||||
parsedConfig.authorization["pubkey_whitelist"].push(
|
parsedConfig.authorization["pubkey_whitelist"].push(ark.account.pubkey);
|
||||||
storage.account.pubkey,
|
|
||||||
);
|
|
||||||
|
|
||||||
// update new config
|
// update new config
|
||||||
const newConfig = stringify(parsedConfig);
|
const newConfig = stringify(parsedConfig);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useStorage } from "@lume/ark";
|
import { useStorage } from "@lume/storage";
|
||||||
import { downloadDir } from "@tauri-apps/api/path";
|
import { downloadDir } from "@tauri-apps/api/path";
|
||||||
import { message, save } from "@tauri-apps/plugin-dialog";
|
import { message, save } from "@tauri-apps/plugin-dialog";
|
||||||
import { writeTextFile } from "@tauri-apps/plugin-fs";
|
import { writeTextFile } from "@tauri-apps/plugin-fs";
|
||||||
@@ -25,18 +25,18 @@ export function ErrorScreen() {
|
|||||||
const filePath = await save({
|
const filePath = await save({
|
||||||
defaultPath: `${downloadPath}/${fileName}`,
|
defaultPath: `${downloadPath}/${fileName}`,
|
||||||
});
|
});
|
||||||
const nsec = await storage.loadPrivkey(storage.account.pubkey);
|
const nsec = await storage.loadPrivkey(ark.account.pubkey);
|
||||||
|
|
||||||
if (filePath) {
|
if (filePath) {
|
||||||
if (nsec) {
|
if (nsec) {
|
||||||
await writeTextFile(
|
await writeTextFile(
|
||||||
filePath,
|
filePath,
|
||||||
`Nostr account, generated by Lume (lume.nu)\nPublic key: ${storage.account.id}\nPrivate key: ${nsec}`,
|
`Nostr account, generated by Lume (lume.nu)\nPublic key: ${ark.account.id}\nPrivate key: ${nsec}`,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
await writeTextFile(
|
await writeTextFile(
|
||||||
filePath,
|
filePath,
|
||||||
`Nostr account, generated by Lume (lume.nu)\nPublic key: ${storage.account.id}`,
|
`Nostr account, generated by Lume (lume.nu)\nPublic key: ${ark.account.id}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} // else { user cancel action }
|
} // else { user cancel action }
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useStorage } from "@lume/ark";
|
|
||||||
import { LoaderIcon } from "@lume/icons";
|
import { LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@ export function NWCForm({ setWalletConnectURL }) {
|
|||||||
const params = new URLSearchParams(uriObj.search);
|
const params = new URLSearchParams(uriObj.search);
|
||||||
|
|
||||||
if (params.has("relay") && params.has("secret")) {
|
if (params.has("relay") && params.has("secret")) {
|
||||||
await storage.createPrivkey(`${storage.account.pubkey}-nwc`, uri);
|
await storage.createPrivkey(`${ark.account.pubkey}-nwc`, uri);
|
||||||
setWalletConnectURL(uri);
|
setWalletConnectURL(uri);
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useStorage } from "@lume/ark";
|
|
||||||
import { CheckCircleIcon } from "@lume/icons";
|
import { CheckCircleIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { NWCForm } from "./components/form";
|
import { NWCForm } from "./components/form";
|
||||||
|
|
||||||
@@ -8,13 +8,13 @@ export function NWCScreen() {
|
|||||||
const [walletConnectURL, setWalletConnectURL] = useState<null | string>(null);
|
const [walletConnectURL, setWalletConnectURL] = useState<null | string>(null);
|
||||||
|
|
||||||
const remove = async () => {
|
const remove = async () => {
|
||||||
await storage.removePrivkey(`${storage.account.pubkey}-nwc`);
|
await storage.removePrivkey(`${ark.account.pubkey}-nwc`);
|
||||||
setWalletConnectURL(null);
|
setWalletConnectURL(null);
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
async function getNWC() {
|
async function getNWC() {
|
||||||
const nwc = await storage.loadPrivkey(`${storage.account.pubkey}-nwc`);
|
const nwc = await storage.loadPrivkey(`${ark.account.pubkey}-nwc`);
|
||||||
if (nwc) setWalletConnectURL(nwc);
|
if (nwc) setWalletConnectURL(nwc);
|
||||||
}
|
}
|
||||||
getNWC();
|
getNWC();
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { CancelIcon, RefreshIcon } from "@lume/icons";
|
import { CancelIcon, RefreshIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { NDKKind } from "@nostr-dev-kit/ndk";
|
import { NDKKind } from "@nostr-dev-kit/ndk";
|
||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { RelayForm } from "./relayForm";
|
import { RelayForm } from "./relayForm";
|
||||||
@@ -9,12 +10,12 @@ export function UserRelayList() {
|
|||||||
const storage = useStorage();
|
const storage = useStorage();
|
||||||
|
|
||||||
const { status, data, refetch } = useQuery({
|
const { status, data, refetch } = useQuery({
|
||||||
queryKey: ["relays", storage.account.pubkey],
|
queryKey: ["relays", ark.account.pubkey],
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
const event = await ark.getEventByFilter({
|
const event = await ark.getEventByFilter({
|
||||||
filter: {
|
filter: {
|
||||||
kinds: [NDKKind.RelayList],
|
kinds: [NDKKind.RelayList],
|
||||||
authors: [storage.account.pubkey],
|
authors: [ark.account.pubkey],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useStorage } from "@lume/ark";
|
import { useStorage } from "@lume/storage";
|
||||||
|
|
||||||
export function AdvancedSettingScreen() {
|
export function AdvancedSettingScreen() {
|
||||||
const storage = useStorage();
|
const storage = useStorage();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useStorage } from "@lume/ark";
|
|
||||||
import { EyeOffIcon } from "@lume/icons";
|
import { EyeOffIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { nip19 } from "nostr-tools";
|
import { nip19 } from "nostr-tools";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
|
|
||||||
@@ -10,12 +10,12 @@ export function BackupSettingScreen() {
|
|||||||
const [showPassword, setShowPassword] = useState(false);
|
const [showPassword, setShowPassword] = useState(false);
|
||||||
|
|
||||||
const removePrivkey = async () => {
|
const removePrivkey = async () => {
|
||||||
await storage.removePrivkey(storage.account.pubkey);
|
await storage.removePrivkey(ark.account.pubkey);
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
async function loadPrivkey() {
|
async function loadPrivkey() {
|
||||||
const key = await storage.loadPrivkey(storage.account.pubkey);
|
const key = await storage.loadPrivkey(ark.account.pubkey);
|
||||||
if (key) setPrivkey(key);
|
if (key) setPrivkey(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useStorage } from "@lume/ark";
|
|
||||||
import { LoaderIcon } from "@lume/icons";
|
import { LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { compactNumber } from "@lume/utils";
|
import { compactNumber } from "@lume/utils";
|
||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { fetch } from "@tauri-apps/plugin-http";
|
import { fetch } from "@tauri-apps/plugin-http";
|
||||||
@@ -8,10 +8,10 @@ import { Link } from "react-router-dom";
|
|||||||
export function PostCard() {
|
export function PostCard() {
|
||||||
const storage = useStorage();
|
const storage = useStorage();
|
||||||
const { status, data } = useQuery({
|
const { status, data } = useQuery({
|
||||||
queryKey: ["user-stats", storage.account.pubkey],
|
queryKey: ["user-stats", ark.account.pubkey],
|
||||||
queryFn: async ({ signal }: { signal: AbortSignal }) => {
|
queryFn: async ({ signal }: { signal: AbortSignal }) => {
|
||||||
const res = await fetch(
|
const res = await fetch(
|
||||||
`https://api.nostr.band/v0/stats/profile/${storage.account.pubkey}`,
|
`https://api.nostr.band/v0/stats/profile/${ark.account.pubkey}`,
|
||||||
{
|
{
|
||||||
signal,
|
signal,
|
||||||
},
|
},
|
||||||
@@ -39,7 +39,7 @@ export function PostCard() {
|
|||||||
<div className="flex h-full w-full flex-col justify-between p-4">
|
<div className="flex h-full w-full flex-col justify-between p-4">
|
||||||
<h3 className="pt-1 text-5xl font-semibold tabular-nums text-neutral-900 dark:text-neutral-100">
|
<h3 className="pt-1 text-5xl font-semibold tabular-nums text-neutral-900 dark:text-neutral-100">
|
||||||
{compactNumber.format(
|
{compactNumber.format(
|
||||||
data.stats[storage.account.pubkey].pub_note_count,
|
data.stats[ark.account.pubkey].pub_note_count,
|
||||||
)}
|
)}
|
||||||
</h3>
|
</h3>
|
||||||
<div className="mt-auto flex h-6 w-full items-center justify-between">
|
<div className="mt-auto flex h-6 w-full items-center justify-between">
|
||||||
@@ -47,7 +47,7 @@ export function PostCard() {
|
|||||||
Posts
|
Posts
|
||||||
</p>
|
</p>
|
||||||
<Link
|
<Link
|
||||||
to={`/users/${storage.account.pubkey}`}
|
to={`/users/${ark.account.pubkey}`}
|
||||||
className="inline-flex h-6 w-max items-center gap-1 rounded-full bg-neutral-200 px-2.5 text-sm font-medium hover:bg-neutral-300 dark:bg-neutral-800 dark:hover:bg-neutral-700"
|
className="inline-flex h-6 w-max items-center gap-1 rounded-full bg-neutral-200 px-2.5 text-sm font-medium hover:bg-neutral-300 dark:bg-neutral-800 dark:hover:bg-neutral-700"
|
||||||
>
|
>
|
||||||
View
|
View
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useProfile, useStorage } from "@lume/ark";
|
import { useProfile } from "@lume/ark";
|
||||||
import { EditIcon, LoaderIcon } from "@lume/icons";
|
import { EditIcon, LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { displayNpub } from "@lume/utils";
|
import { displayNpub } from "@lume/utils";
|
||||||
import * as Avatar from "@radix-ui/react-avatar";
|
import * as Avatar from "@radix-ui/react-avatar";
|
||||||
import { writeText } from "@tauri-apps/plugin-clipboard-manager";
|
import { writeText } from "@tauri-apps/plugin-clipboard-manager";
|
||||||
@@ -10,13 +11,13 @@ import { Link } from "react-router-dom";
|
|||||||
export function ProfileCard() {
|
export function ProfileCard() {
|
||||||
const storage = useStorage();
|
const storage = useStorage();
|
||||||
const svgURI = `data:image/svg+xml;utf8,${encodeURIComponent(
|
const svgURI = `data:image/svg+xml;utf8,${encodeURIComponent(
|
||||||
minidenticon(storage.account.pubkey, 90, 50),
|
minidenticon(ark.account.pubkey, 90, 50),
|
||||||
)}`;
|
)}`;
|
||||||
|
|
||||||
const { isLoading, user } = useProfile(storage.account.pubkey);
|
const { isLoading, user } = useProfile(ark.account.pubkey);
|
||||||
|
|
||||||
const copyNpub = async () => {
|
const copyNpub = async () => {
|
||||||
return await writeText(nip19.npubEncode(storage.account.pubkey));
|
return await writeText(nip19.npubEncode(ark.account.pubkey));
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -47,7 +48,7 @@ export function ProfileCard() {
|
|||||||
<Avatar.Root className="shrink-0">
|
<Avatar.Root className="shrink-0">
|
||||||
<Avatar.Image
|
<Avatar.Image
|
||||||
src={user?.picture || user?.image}
|
src={user?.picture || user?.image}
|
||||||
alt={storage.account.pubkey}
|
alt={ark.account.pubkey}
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
decoding="async"
|
decoding="async"
|
||||||
style={{ contentVisibility: "auto" }}
|
style={{ contentVisibility: "auto" }}
|
||||||
@@ -56,7 +57,7 @@ export function ProfileCard() {
|
|||||||
<Avatar.Fallback delayMs={300}>
|
<Avatar.Fallback delayMs={300}>
|
||||||
<img
|
<img
|
||||||
src={svgURI}
|
src={svgURI}
|
||||||
alt={storage.account.pubkey}
|
alt={ark.account.pubkey}
|
||||||
className="h-16 w-16 rounded-xl bg-black dark:bg-white"
|
className="h-16 w-16 rounded-xl bg-black dark:bg-white"
|
||||||
/>
|
/>
|
||||||
</Avatar.Fallback>
|
</Avatar.Fallback>
|
||||||
@@ -66,7 +67,7 @@ export function ProfileCard() {
|
|||||||
{user?.display_name || user?.name}
|
{user?.display_name || user?.name}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-lg text-neutral-700 dark:text-neutral-300">
|
<p className="text-lg text-neutral-700 dark:text-neutral-300">
|
||||||
{user?.nip05 || displayNpub(storage.account.pubkey, 16)}
|
{user?.nip05 || displayNpub(ark.account.pubkey, 16)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { EditIcon, LoaderIcon } from "@lume/icons";
|
import { EditIcon, LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { compactNumber } from "@lume/utils";
|
import { compactNumber } from "@lume/utils";
|
||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
@@ -9,7 +10,7 @@ export function RelayCard() {
|
|||||||
const storage = useStorage();
|
const storage = useStorage();
|
||||||
|
|
||||||
const { status, data } = useQuery({
|
const { status, data } = useQuery({
|
||||||
queryKey: ["relays", storage.account.pubkey],
|
queryKey: ["relays", ark.account.pubkey],
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
const relays = await ark.getUserRelays({});
|
const relays = await ark.getUserRelays({});
|
||||||
return relays;
|
return relays;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useStorage } from "@lume/ark";
|
|
||||||
import { LoaderIcon } from "@lume/icons";
|
import { LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { compactNumber } from "@lume/utils";
|
import { compactNumber } from "@lume/utils";
|
||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { fetch } from "@tauri-apps/plugin-http";
|
import { fetch } from "@tauri-apps/plugin-http";
|
||||||
@@ -7,10 +7,10 @@ import { fetch } from "@tauri-apps/plugin-http";
|
|||||||
export function ZapCard() {
|
export function ZapCard() {
|
||||||
const storage = useStorage();
|
const storage = useStorage();
|
||||||
const { status, data } = useQuery({
|
const { status, data } = useQuery({
|
||||||
queryKey: ["user-stats", storage.account.pubkey],
|
queryKey: ["user-stats", ark.account.pubkey],
|
||||||
queryFn: async ({ signal }: { signal: AbortSignal }) => {
|
queryFn: async ({ signal }: { signal: AbortSignal }) => {
|
||||||
const res = await fetch(
|
const res = await fetch(
|
||||||
`https://api.nostr.band/v0/stats/profile/${storage.account.pubkey}`,
|
`https://api.nostr.band/v0/stats/profile/${ark.account.pubkey}`,
|
||||||
{
|
{
|
||||||
signal,
|
signal,
|
||||||
},
|
},
|
||||||
@@ -38,8 +38,7 @@ export function ZapCard() {
|
|||||||
<div className="flex h-full w-full flex-col justify-between p-4">
|
<div className="flex h-full w-full flex-col justify-between p-4">
|
||||||
<h3 className="pt-1 text-5xl font-semibold tabular-nums text-neutral-900 dark:text-neutral-100">
|
<h3 className="pt-1 text-5xl font-semibold tabular-nums text-neutral-900 dark:text-neutral-100">
|
||||||
{compactNumber.format(
|
{compactNumber.format(
|
||||||
data?.stats[storage.account.pubkey]?.zaps_received?.msats /
|
data?.stats[ark.account.pubkey]?.zaps_received?.msats / 1000 || 0,
|
||||||
1000 || 0,
|
|
||||||
)}
|
)}
|
||||||
</h3>
|
</h3>
|
||||||
<div className="mt-auto flex h-6 items-center text-xl font-medium leading-none text-neutral-600 dark:text-neutral-400">
|
<div className="mt-auto flex h-6 items-center text-xl font-medium leading-none text-neutral-600 dark:text-neutral-400">
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import {
|
import {
|
||||||
CheckCircleIcon,
|
CheckCircleIcon,
|
||||||
LoaderIcon,
|
LoaderIcon,
|
||||||
PlusIcon,
|
PlusIcon,
|
||||||
UnverifiedIcon,
|
UnverifiedIcon,
|
||||||
} from "@lume/icons";
|
} from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { NDKKind, NDKUserProfile } from "@nostr-dev-kit/ndk";
|
import { NDKKind, NDKUserProfile } from "@nostr-dev-kit/ndk";
|
||||||
import { useQueryClient } from "@tanstack/react-query";
|
import { useQueryClient } from "@tanstack/react-query";
|
||||||
import { message } from "@tauri-apps/plugin-dialog";
|
import { message } from "@tauri-apps/plugin-dialog";
|
||||||
@@ -31,7 +32,7 @@ export function EditProfileScreen() {
|
|||||||
defaultValues: async () => {
|
defaultValues: async () => {
|
||||||
const res: NDKUserProfile = queryClient.getQueryData([
|
const res: NDKUserProfile = queryClient.getQueryData([
|
||||||
"user",
|
"user",
|
||||||
storage.account.pubkey,
|
ark.account.pubkey,
|
||||||
]);
|
]);
|
||||||
if (res.image) {
|
if (res.image) {
|
||||||
setPicture(res.image);
|
setPicture(res.image);
|
||||||
@@ -102,7 +103,7 @@ export function EditProfileScreen() {
|
|||||||
|
|
||||||
if (data.nip05) {
|
if (data.nip05) {
|
||||||
const verify = ark.validateNIP05({
|
const verify = ark.validateNIP05({
|
||||||
pubkey: storage.account.pubkey,
|
pubkey: ark.account.pubkey,
|
||||||
nip05: data.nip05,
|
nip05: data.nip05,
|
||||||
});
|
});
|
||||||
if (verify) {
|
if (verify) {
|
||||||
@@ -125,7 +126,7 @@ export function EditProfileScreen() {
|
|||||||
if (publish) {
|
if (publish) {
|
||||||
// invalid cache
|
// invalid cache
|
||||||
queryClient.invalidateQueries({
|
queryClient.invalidateQueries({
|
||||||
queryKey: ["user", storage.account.pubkey],
|
queryKey: ["user", ark.account.pubkey],
|
||||||
});
|
});
|
||||||
// reset form
|
// reset form
|
||||||
reset();
|
reset();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useStorage } from "@lume/ark";
|
|
||||||
import { DarkIcon, LightIcon, SystemModeIcon } from "@lume/icons";
|
import { DarkIcon, LightIcon, SystemModeIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import * as Switch from "@radix-ui/react-switch";
|
import * as Switch from "@radix-ui/react-switch";
|
||||||
import { invoke } from "@tauri-apps/api/core";
|
import { invoke } from "@tauri-apps/api/core";
|
||||||
import { getCurrent } from "@tauri-apps/api/window";
|
import { getCurrent } from "@tauri-apps/api/window";
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { useArk, useProfile, useStorage } from "@lume/ark";
|
import { useArk, useProfile } from "@lume/ark";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { NIP05 } from "@lume/ui";
|
import { NIP05 } from "@lume/ui";
|
||||||
import { displayNpub } from "@lume/utils";
|
import { displayNpub } from "@lume/utils";
|
||||||
import * as Avatar from "@radix-ui/react-avatar";
|
import * as Avatar from "@radix-ui/react-avatar";
|
||||||
@@ -50,7 +51,7 @@ export function UserProfile({ pubkey }: { pubkey: string }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (storage.account.contacts.includes(pubkey)) {
|
if (ark.account.contacts.includes(pubkey)) {
|
||||||
setFollowed(true);
|
setFollowed(true);
|
||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import react from "@vitejs/plugin-react-swc";
|
import react from "@vitejs/plugin-react-swc";
|
||||||
import million from "million/compiler";
|
import million from "million/compiler";
|
||||||
import { defineConfig } from "vite";
|
import { defineConfig } from "vite";
|
||||||
|
import topLevelAwait from "vite-plugin-top-level-await";
|
||||||
import viteTsconfigPaths from "vite-tsconfig-paths";
|
import viteTsconfigPaths from "vite-tsconfig-paths";
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
@@ -13,6 +14,12 @@ export default defineConfig({
|
|||||||
}),
|
}),
|
||||||
react(),
|
react(),
|
||||||
viteTsconfigPaths(),
|
viteTsconfigPaths(),
|
||||||
|
topLevelAwait({
|
||||||
|
// The export name of top-level await promise for each chunk module
|
||||||
|
promiseExportName: "__tla",
|
||||||
|
// The function to generate import names of top-level await promise in each chunk module
|
||||||
|
promiseImportName: (i) => `__tla_${i}`,
|
||||||
|
}),
|
||||||
],
|
],
|
||||||
envPrefix: ["VITE_", "TAURI_"],
|
envPrefix: ["VITE_", "TAURI_"],
|
||||||
build: {
|
build: {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { LumeStorage } from "@lume/storage";
|
import { Account, type NDKEventWithReplies, type NIP05 } from "@lume/types";
|
||||||
import { type NDKEventWithReplies, type NIP05 } from "@lume/types";
|
|
||||||
import NDK, {
|
import NDK, {
|
||||||
NDKEvent,
|
NDKEvent,
|
||||||
NDKFilter,
|
NDKFilter,
|
||||||
@@ -20,18 +19,18 @@ import { NostrFetcher, normalizeRelayUrl } from "nostr-fetch";
|
|||||||
import { nip19 } from "nostr-tools";
|
import { nip19 } from "nostr-tools";
|
||||||
|
|
||||||
export class Ark {
|
export class Ark {
|
||||||
#storage: LumeStorage;
|
|
||||||
public ndk: NDK;
|
public ndk: NDK;
|
||||||
|
public account: Account;
|
||||||
|
|
||||||
constructor({
|
constructor({
|
||||||
ndk,
|
ndk,
|
||||||
storage,
|
account,
|
||||||
}: {
|
}: {
|
||||||
ndk: NDK;
|
ndk: NDK;
|
||||||
storage: LumeStorage;
|
account: Account;
|
||||||
}) {
|
}) {
|
||||||
this.ndk = ndk;
|
this.ndk = ndk;
|
||||||
this.#storage = storage;
|
this.account = account;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async connectDepot() {
|
public async connectDepot() {
|
||||||
@@ -106,8 +105,9 @@ export class Ark {
|
|||||||
|
|
||||||
public async getUserProfile(pubkey?: string) {
|
public async getUserProfile(pubkey?: string) {
|
||||||
try {
|
try {
|
||||||
|
const currentUserPubkey = this.account.pubkey;
|
||||||
|
|
||||||
// get clean pubkey without any special characters
|
// get clean pubkey without any special characters
|
||||||
const currentUserPubkey = this.#storage.account.pubkey;
|
|
||||||
let hexstring = pubkey
|
let hexstring = pubkey
|
||||||
? pubkey.replace(/[^a-zA-Z0-9]/g, "").replace("nostr:", "")
|
? pubkey.replace(/[^a-zA-Z0-9]/g, "").replace("nostr:", "")
|
||||||
: currentUserPubkey;
|
: currentUserPubkey;
|
||||||
@@ -141,8 +141,9 @@ export class Ark {
|
|||||||
|
|
||||||
public async getUserContacts(pubkey?: string) {
|
public async getUserContacts(pubkey?: string) {
|
||||||
try {
|
try {
|
||||||
|
const currentUserPubkey = this.account.pubkey;
|
||||||
|
|
||||||
// get clean pubkey without any special characters
|
// get clean pubkey without any special characters
|
||||||
const currentUserPubkey = this.#storage.account.pubkey;
|
|
||||||
let hexstring = pubkey
|
let hexstring = pubkey
|
||||||
? pubkey.replace(/[^a-zA-Z0-9]/g, "").replace("nostr:", "")
|
? pubkey.replace(/[^a-zA-Z0-9]/g, "").replace("nostr:", "")
|
||||||
: currentUserPubkey;
|
: currentUserPubkey;
|
||||||
@@ -165,8 +166,8 @@ export class Ark {
|
|||||||
|
|
||||||
const contacts = [...(await user.follows())].map((user) => user.pubkey);
|
const contacts = [...(await user.follows())].map((user) => user.pubkey);
|
||||||
|
|
||||||
if (!pubkey || pubkey === this.#storage.account.pubkey)
|
if (!pubkey || pubkey === this.account.pubkey)
|
||||||
this.#storage.account.contacts = contacts;
|
this.account.contacts = contacts;
|
||||||
|
|
||||||
return contacts;
|
return contacts;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -177,7 +178,7 @@ export class Ark {
|
|||||||
public async getUserRelays({ pubkey }: { pubkey?: string }) {
|
public async getUserRelays({ pubkey }: { pubkey?: string }) {
|
||||||
try {
|
try {
|
||||||
const user = this.ndk.getUser({
|
const user = this.ndk.getUser({
|
||||||
pubkey: pubkey ? pubkey : this.#storage.account.pubkey,
|
pubkey: pubkey ? pubkey : this.account.pubkey,
|
||||||
});
|
});
|
||||||
return await user.relayList();
|
return await user.relayList();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -192,19 +193,19 @@ export class Ark {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (publish) {
|
if (publish) {
|
||||||
this.#storage.account.contacts = tags.map((item) => item[1]);
|
this.account.contacts = tags.map((item) => item[1]);
|
||||||
return publish;
|
return publish;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async createContact({ pubkey }: { pubkey: string }) {
|
public async createContact({ pubkey }: { pubkey: string }) {
|
||||||
const user = this.ndk.getUser({ pubkey: this.#storage.account.pubkey });
|
const user = this.ndk.getUser({ pubkey: this.account.pubkey });
|
||||||
const contacts = await user.follows();
|
const contacts = await user.follows();
|
||||||
return await user.follow(new NDKUser({ pubkey: pubkey }), contacts);
|
return await user.follow(new NDKUser({ pubkey: pubkey }), contacts);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async deleteContact({ pubkey }: { pubkey: string }) {
|
public async deleteContact({ pubkey }: { pubkey: string }) {
|
||||||
const user = this.ndk.getUser({ pubkey: this.#storage.account.pubkey });
|
const user = this.ndk.getUser({ pubkey: this.account.pubkey });
|
||||||
const contacts = await user.follows();
|
const contacts = await user.follows();
|
||||||
contacts.delete(new NDKUser({ pubkey: pubkey }));
|
contacts.delete(new NDKUser({ pubkey: pubkey }));
|
||||||
|
|
||||||
@@ -362,7 +363,7 @@ export class Ark {
|
|||||||
const relayMap = new Map<string, string[]>();
|
const relayMap = new Map<string, string[]>();
|
||||||
const relayEvents = fetcher.fetchLatestEventsPerAuthor(
|
const relayEvents = fetcher.fetchLatestEventsPerAuthor(
|
||||||
{
|
{
|
||||||
authors: this.#storage.account.contacts,
|
authors: this.account.contacts,
|
||||||
relayUrls: connectedRelays,
|
relayUrls: connectedRelays,
|
||||||
},
|
},
|
||||||
{ kinds: [NDKKind.RelayList] },
|
{ kinds: [NDKKind.RelayList] },
|
||||||
@@ -569,7 +570,7 @@ export class Ark {
|
|||||||
const event = await this.ndk.fetchEvent({
|
const event = await this.ndk.fetchEvent({
|
||||||
kinds: [NDKKind.AppRecommendation],
|
kinds: [NDKKind.AppRecommendation],
|
||||||
"#d": [unknownKind],
|
"#d": [unknownKind],
|
||||||
authors: this.#storage.account.contacts || [author],
|
authors: this.account.contacts || [author],
|
||||||
});
|
});
|
||||||
|
|
||||||
if (event) return event.tags.filter((item) => item[0] !== "d");
|
if (event) return event.tags.filter((item) => item[0] !== "d");
|
||||||
@@ -577,7 +578,7 @@ export class Ark {
|
|||||||
const altEvent = await this.ndk.fetchEvent({
|
const altEvent = await this.ndk.fetchEvent({
|
||||||
kinds: [NDKKind.AppHandler],
|
kinds: [NDKKind.AppHandler],
|
||||||
"#k": [unknownKind],
|
"#k": [unknownKind],
|
||||||
authors: this.#storage.account.contacts || [author],
|
authors: this.account.contacts || [author],
|
||||||
});
|
});
|
||||||
|
|
||||||
if (altEvent) return altEvent.tags.filter((item) => item[0] !== "d");
|
if (altEvent) return altEvent.tags.filter((item) => item[0] !== "d");
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { ChevronUpIcon } from "@lume/icons";
|
import { ChevronUpIcon } from "@lume/icons";
|
||||||
import { NDKEvent, NDKFilter } from "@nostr-dev-kit/ndk";
|
import { NDKEvent, NDKFilter } from "@nostr-dev-kit/ndk";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { useArk } from "../../provider";
|
import { useArk } from "../../hooks/useArk";
|
||||||
|
|
||||||
export function ColumnLiveWidget({
|
export function ColumnLiveWidget({
|
||||||
filter,
|
filter,
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { IColumn } from "@lume/types";
|
import { IColumn } from "@lume/types";
|
||||||
import { COL_TYPES } from "@lume/utils";
|
import { COL_TYPES } from "@lume/utils";
|
||||||
import {
|
import {
|
||||||
@@ -8,7 +9,6 @@ import {
|
|||||||
useEffect,
|
useEffect,
|
||||||
useState,
|
useState,
|
||||||
} from "react";
|
} from "react";
|
||||||
import { useStorage } from "../../provider";
|
|
||||||
|
|
||||||
type ColumnContext = {
|
type ColumnContext = {
|
||||||
columns: IColumn[];
|
columns: IColumn[];
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { NDKAppHandlerEvent } from "@nostr-dev-kit/ndk";
|
import { NDKAppHandlerEvent } from "@nostr-dev-kit/ndk";
|
||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { useArk } from "../../provider";
|
import { useArk } from "../../hooks/useArk";
|
||||||
|
|
||||||
export function AppHandler({ tag }: { tag: string[] }) {
|
export function AppHandler({ tag }: { tag: string[] }) {
|
||||||
const ark = useArk();
|
const ark = useArk();
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { webln } from "@getalby/sdk";
|
import { webln } from "@getalby/sdk";
|
||||||
import { SendPaymentResponse } from "@getalby/sdk/dist/types";
|
import { SendPaymentResponse } from "@getalby/sdk/dist/types";
|
||||||
import { CancelIcon, ZapIcon } from "@lume/icons";
|
import { CancelIcon, ZapIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import {
|
import {
|
||||||
compactNumber,
|
compactNumber,
|
||||||
displayNpub,
|
displayNpub,
|
||||||
@@ -13,8 +14,8 @@ import { QRCodeSVG } from "qrcode.react";
|
|||||||
import { useEffect, useRef, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
import CurrencyInput from "react-currency-input-field";
|
import CurrencyInput from "react-currency-input-field";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import { useArk } from "../../../hooks/useArk";
|
||||||
import { useProfile } from "../../../hooks/useProfile";
|
import { useProfile } from "../../../hooks/useProfile";
|
||||||
import { useArk, useStorage } from "../../../provider";
|
|
||||||
import { useNoteContext } from "../provider";
|
import { useNoteContext } from "../provider";
|
||||||
|
|
||||||
export function NoteZap() {
|
export function NoteZap() {
|
||||||
@@ -87,7 +88,7 @@ export function NoteZap() {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
async function getWalletConnectURL() {
|
async function getWalletConnectURL() {
|
||||||
const uri: string = await invoke("secure_load", {
|
const uri: string = await invoke("secure_load", {
|
||||||
key: `${storage.account.pubkey}-nwc`,
|
key: `${ark.account.pubkey}-nwc`,
|
||||||
});
|
});
|
||||||
if (uri) setWalletConnectURL(uri);
|
if (uri) setWalletConnectURL(uri);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ export function NoteChild({
|
|||||||
"\n",
|
"\n",
|
||||||
);
|
);
|
||||||
|
|
||||||
const text = parsedContent;
|
const text = parsedContent as string;
|
||||||
const words = text.split(/( |\n)/);
|
const words = text.split(/( |\n)/);
|
||||||
|
|
||||||
const hashtags = words.filter((word) => word.startsWith("#"));
|
const hashtags = words.filter((word) => word.startsWith("#"));
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import {
|
import {
|
||||||
AUDIOS,
|
AUDIOS,
|
||||||
IMAGES,
|
IMAGES,
|
||||||
@@ -15,7 +16,6 @@ import { nip19 } from "nostr-tools";
|
|||||||
import { ReactNode, useMemo, useState } from "react";
|
import { ReactNode, useMemo, useState } from "react";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import reactStringReplace from "react-string-replace";
|
import reactStringReplace from "react-string-replace";
|
||||||
import { useStorage } from "../../provider";
|
|
||||||
import { Hashtag } from "./mentions/hashtag";
|
import { Hashtag } from "./mentions/hashtag";
|
||||||
import { MentionNote } from "./mentions/note";
|
import { MentionNote } from "./mentions/note";
|
||||||
import { MentionUser } from "./mentions/user";
|
import { MentionUser } from "./mentions/user";
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { useArk } from "../../provider";
|
import { useArk } from "../../hooks/useArk";
|
||||||
import { AppHandler } from "./appHandler";
|
import { AppHandler } from "./appHandler";
|
||||||
import { useNoteContext } from "./provider";
|
import { useNoteContext } from "./provider";
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { NDKEvent, NostrEvent } from "@nostr-dev-kit/ndk";
|
import { NDKEvent, NostrEvent } from "@nostr-dev-kit/ndk";
|
||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { Note } from "..";
|
import { Note } from "..";
|
||||||
import { useArk } from "../../../provider";
|
import { useArk } from "../../../hooks/useArk";
|
||||||
|
|
||||||
export function RepostNote({
|
export function RepostNote({
|
||||||
event,
|
event,
|
||||||
|
|||||||
4
packages/ark/src/context.ts
Normal file
4
packages/ark/src/context.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
import { createContext } from "react";
|
||||||
|
import { type Ark } from "./ark";
|
||||||
|
|
||||||
|
export const LumeContext = createContext<Ark>(undefined);
|
||||||
10
packages/ark/src/hooks/useArk.ts
Normal file
10
packages/ark/src/hooks/useArk.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { useContext } from "react";
|
||||||
|
import { LumeContext } from "../context";
|
||||||
|
|
||||||
|
export const useArk = () => {
|
||||||
|
const context = useContext(LumeContext);
|
||||||
|
if (context === undefined) {
|
||||||
|
throw new Error("Please import Ark Provider to use useArk() hook");
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
};
|
||||||
@@ -1,21 +1,24 @@
|
|||||||
import { useQuery } from '@tanstack/react-query';
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { useArk } from '../provider';
|
import { useArk } from "./useArk";
|
||||||
|
|
||||||
export function useEvent(id: string) {
|
export function useEvent(id: string) {
|
||||||
const ark = useArk();
|
const ark = useArk();
|
||||||
const { status, isLoading, isError, data } = useQuery({
|
const { status, isLoading, isError, data } = useQuery({
|
||||||
queryKey: ['event', id],
|
queryKey: ["event", id],
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
const event = await ark.getEventById({ id });
|
const event = await ark.getEventById({ id });
|
||||||
if (!event)
|
if (!event)
|
||||||
throw new Error(`Cannot get event with ${id}, will be retry after 10 seconds`);
|
throw new Error(
|
||||||
return event;
|
`Cannot get event with ${id}, will be retry after 10 seconds`,
|
||||||
},
|
);
|
||||||
refetchOnWindowFocus: false,
|
return event;
|
||||||
refetchOnMount: false,
|
},
|
||||||
refetchOnReconnect: false,
|
refetchOnWindowFocus: false,
|
||||||
retry: 2,
|
refetchOnMount: false,
|
||||||
});
|
refetchOnReconnect: false,
|
||||||
|
staleTime: Infinity,
|
||||||
|
retry: 2,
|
||||||
|
});
|
||||||
|
|
||||||
return { status, isLoading, isError, data };
|
return { status, isLoading, isError, data };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { useArk } from "../provider";
|
import { useArk } from "./useArk";
|
||||||
|
|
||||||
export function useProfile(pubkey: string) {
|
export function useProfile(pubkey: string) {
|
||||||
const ark = useArk();
|
const ark = useArk();
|
||||||
@@ -20,6 +20,7 @@ export function useProfile(pubkey: string) {
|
|||||||
refetchOnMount: false,
|
refetchOnMount: false,
|
||||||
refetchOnWindowFocus: false,
|
refetchOnWindowFocus: false,
|
||||||
refetchOnReconnect: false,
|
refetchOnReconnect: false,
|
||||||
|
staleTime: Infinity,
|
||||||
retry: 2,
|
retry: 2,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { NDKKind, NDKRelayUrl, NDKTag } from "@nostr-dev-kit/ndk";
|
import { NDKKind, NDKRelayUrl, NDKTag } from "@nostr-dev-kit/ndk";
|
||||||
import { useMutation, useQueryClient } from "@tanstack/react-query";
|
import { useMutation, useQueryClient } from "@tanstack/react-query";
|
||||||
import { useArk, useStorage } from "../provider";
|
import { useArk } from "./useArk";
|
||||||
|
|
||||||
export function useRelay() {
|
export function useRelay() {
|
||||||
const ark = useArk();
|
const ark = useArk();
|
||||||
@@ -14,13 +15,13 @@ export function useRelay() {
|
|||||||
) => {
|
) => {
|
||||||
// Cancel any outgoing refetches
|
// Cancel any outgoing refetches
|
||||||
await queryClient.cancelQueries({
|
await queryClient.cancelQueries({
|
||||||
queryKey: ["relays", storage.account.pubkey],
|
queryKey: ["relays", ark.account.pubkey],
|
||||||
});
|
});
|
||||||
|
|
||||||
// Snapshot the previous value
|
// Snapshot the previous value
|
||||||
const prevRelays: NDKTag[] = queryClient.getQueryData([
|
const prevRelays: NDKTag[] = queryClient.getQueryData([
|
||||||
"relays",
|
"relays",
|
||||||
storage.account.pubkey,
|
ark.account.pubkey,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// create new relay list if not exist
|
// create new relay list if not exist
|
||||||
@@ -42,7 +43,7 @@ export function useRelay() {
|
|||||||
|
|
||||||
// Optimistically update to the new value
|
// Optimistically update to the new value
|
||||||
queryClient.setQueryData(
|
queryClient.setQueryData(
|
||||||
["relays", storage.account.pubkey],
|
["relays", ark.account.pubkey],
|
||||||
(prev: NDKTag[]) => [...prev, ["r", relay, purpose ?? ""]],
|
(prev: NDKTag[]) => [...prev, ["r", relay, purpose ?? ""]],
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -51,7 +52,7 @@ export function useRelay() {
|
|||||||
},
|
},
|
||||||
onSettled: () => {
|
onSettled: () => {
|
||||||
queryClient.invalidateQueries({
|
queryClient.invalidateQueries({
|
||||||
queryKey: ["relays", storage.account.pubkey],
|
queryKey: ["relays", ark.account.pubkey],
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -60,13 +61,13 @@ export function useRelay() {
|
|||||||
mutationFn: async (relay: NDKRelayUrl) => {
|
mutationFn: async (relay: NDKRelayUrl) => {
|
||||||
// Cancel any outgoing refetches
|
// Cancel any outgoing refetches
|
||||||
await queryClient.cancelQueries({
|
await queryClient.cancelQueries({
|
||||||
queryKey: ["relays", storage.account.pubkey],
|
queryKey: ["relays", ark.account.pubkey],
|
||||||
});
|
});
|
||||||
|
|
||||||
// Snapshot the previous value
|
// Snapshot the previous value
|
||||||
const prevRelays: NDKTag[] = queryClient.getQueryData([
|
const prevRelays: NDKTag[] = queryClient.getQueryData([
|
||||||
"relays",
|
"relays",
|
||||||
storage.account.pubkey,
|
ark.account.pubkey,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (!prevRelays) return;
|
if (!prevRelays) return;
|
||||||
@@ -80,14 +81,14 @@ export function useRelay() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Optimistically update to the new value
|
// Optimistically update to the new value
|
||||||
queryClient.setQueryData(["relays", storage.account.pubkey], prevRelays);
|
queryClient.setQueryData(["relays", ark.account.pubkey], prevRelays);
|
||||||
|
|
||||||
// Return a context object with the snapshotted value
|
// Return a context object with the snapshotted value
|
||||||
return { prevRelays };
|
return { prevRelays };
|
||||||
},
|
},
|
||||||
onSettled: () => {
|
onSettled: () => {
|
||||||
queryClient.invalidateQueries({
|
queryClient.invalidateQueries({
|
||||||
queryKey: ["relays", storage.account.pubkey],
|
queryKey: ["relays", ark.account.pubkey],
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
export * from "./ark";
|
export * from "./ark";
|
||||||
|
export * from "./context";
|
||||||
export * from "./provider";
|
export * from "./provider";
|
||||||
export * from "./hooks/useEvent";
|
export * from "./hooks/useEvent";
|
||||||
|
export * from "./hooks/useArk";
|
||||||
export * from "./hooks/useProfile";
|
export * from "./hooks/useProfile";
|
||||||
export * from "./hooks/useRelay";
|
export * from "./hooks/useRelay";
|
||||||
export * from "./components/column/provider";
|
export * from "./components/column/provider";
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { LoaderIcon } from "@lume/icons";
|
import { LoaderIcon } from "@lume/icons";
|
||||||
import { NDKCacheAdapterTauri } from "@lume/ndk-cache-tauri";
|
import { NDKCacheAdapterTauri } from "@lume/ndk-cache-tauri";
|
||||||
import { LumeStorage } from "@lume/storage";
|
import { useStorage } from "@lume/storage";
|
||||||
import { QUOTES, delay, sendNativeNotification } from "@lume/utils";
|
import { QUOTES, sendNativeNotification } from "@lume/utils";
|
||||||
import NDK, {
|
import NDK, {
|
||||||
NDKEvent,
|
NDKEvent,
|
||||||
NDKKind,
|
NDKKind,
|
||||||
@@ -11,44 +11,28 @@ import NDK, {
|
|||||||
NDKRelayAuthPolicies,
|
NDKRelayAuthPolicies,
|
||||||
} from "@nostr-dev-kit/ndk";
|
} from "@nostr-dev-kit/ndk";
|
||||||
import { fetch } from "@tauri-apps/plugin-http";
|
import { fetch } from "@tauri-apps/plugin-http";
|
||||||
import { locale, platform } from "@tauri-apps/plugin-os";
|
|
||||||
import { relaunch } from "@tauri-apps/plugin-process";
|
|
||||||
import Database from "@tauri-apps/plugin-sql";
|
|
||||||
import { check } from "@tauri-apps/plugin-updater";
|
|
||||||
import Linkify from "linkify-react";
|
import Linkify from "linkify-react";
|
||||||
import { normalizeRelayUrl, normalizeRelayUrlSet } from "nostr-fetch";
|
import { normalizeRelayUrlSet } from "nostr-fetch";
|
||||||
import { PropsWithChildren, useEffect, useState } from "react";
|
import { PropsWithChildren, useEffect, useState } from "react";
|
||||||
import { createContext, useContextSelector } from "use-context-selector";
|
|
||||||
import { Ark } from "./ark";
|
import { Ark } from "./ark";
|
||||||
|
import { LumeContext } from "./context";
|
||||||
|
|
||||||
type Context = {
|
export const LumeProvider = ({ children }: PropsWithChildren<object>) => {
|
||||||
storage: LumeStorage;
|
const storage = useStorage();
|
||||||
ark: Ark;
|
const [context, setContext] = useState<Ark>(undefined);
|
||||||
};
|
|
||||||
|
|
||||||
const LumeContext = createContext<Context>({
|
|
||||||
storage: undefined,
|
|
||||||
ark: undefined,
|
|
||||||
});
|
|
||||||
|
|
||||||
const LumeProvider = ({ children }: PropsWithChildren<object>) => {
|
|
||||||
const [context, setContext] = useState<Context>(undefined);
|
|
||||||
const [isNewVersion, setIsNewVersion] = useState(false);
|
|
||||||
|
|
||||||
async function initNostrSigner({
|
async function initNostrSigner({
|
||||||
storage,
|
|
||||||
nsecbunker,
|
nsecbunker,
|
||||||
}: {
|
}: {
|
||||||
storage: LumeStorage;
|
|
||||||
nsecbunker?: boolean;
|
nsecbunker?: boolean;
|
||||||
}) {
|
}) {
|
||||||
try {
|
try {
|
||||||
if (!storage.account) return null;
|
if (!storage.currentUser) return null;
|
||||||
|
|
||||||
// NIP-46 Signer
|
// NIP-46 Signer
|
||||||
if (nsecbunker) {
|
if (nsecbunker) {
|
||||||
const localSignerPrivkey = await storage.loadPrivkey(
|
const localSignerPrivkey = await storage.loadPrivkey(
|
||||||
storage.account.pubkey,
|
storage.currentUser.pubkey,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!localSignerPrivkey) return null;
|
if (!localSignerPrivkey) return null;
|
||||||
@@ -64,7 +48,7 @@ const LumeProvider = ({ children }: PropsWithChildren<object>) => {
|
|||||||
|
|
||||||
const remoteSigner = new NDKNip46Signer(
|
const remoteSigner = new NDKNip46Signer(
|
||||||
bunker,
|
bunker,
|
||||||
storage.account.pubkey,
|
storage.currentUser.pubkey,
|
||||||
localSigner,
|
localSigner,
|
||||||
);
|
);
|
||||||
await remoteSigner.blockUntilReady();
|
await remoteSigner.blockUntilReady();
|
||||||
@@ -73,11 +57,8 @@ const LumeProvider = ({ children }: PropsWithChildren<object>) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Privkey Signer
|
// Privkey Signer
|
||||||
const userPrivkey = await storage.loadPrivkey(storage.account.pubkey);
|
const userPrivkey = await storage.loadPrivkey(storage.currentUser.pubkey);
|
||||||
|
if (!userPrivkey) return null;
|
||||||
if (!userPrivkey) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new NDKPrivateKeySigner(userPrivkey);
|
return new NDKPrivateKeySigner(userPrivkey);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -87,45 +68,23 @@ const LumeProvider = ({ children }: PropsWithChildren<object>) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function init() {
|
async function init() {
|
||||||
const platformName = await platform();
|
|
||||||
const osLocale = await locale();
|
|
||||||
const sqliteAdapter = await Database.load("sqlite:lume_v3.db");
|
|
||||||
|
|
||||||
const storage = new LumeStorage(sqliteAdapter, platformName, osLocale);
|
|
||||||
await storage.init();
|
|
||||||
|
|
||||||
// check for new update
|
|
||||||
if (storage.settings.autoupdate) {
|
|
||||||
const update = await check();
|
|
||||||
// install new version
|
|
||||||
if (update) {
|
|
||||||
setIsNewVersion(true);
|
|
||||||
|
|
||||||
await update.downloadAndInstall();
|
|
||||||
await relaunch();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const explicitRelayUrls = normalizeRelayUrlSet([
|
const explicitRelayUrls = normalizeRelayUrlSet([
|
||||||
"wss://bostr.nokotaro.com/",
|
"wss://bostr.nokotaro.com/",
|
||||||
"wss://nostr.mutinywallet.com",
|
"wss://nostr.mutinywallet.com/",
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (storage.settings.depot) {
|
|
||||||
await storage.launchDepot();
|
|
||||||
await delay(2000);
|
|
||||||
|
|
||||||
explicitRelayUrls.push(normalizeRelayUrl("ws://localhost:6090"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// #TODO: user should config outbox relays
|
// #TODO: user should config outbox relays
|
||||||
const outboxRelayUrls = normalizeRelayUrlSet(["wss://purplepag.es"]);
|
const outboxRelayUrls = normalizeRelayUrlSet(["wss://purplepag.es/"]);
|
||||||
|
|
||||||
// #TODO: user should config blacklist relays
|
// #TODO: user should config blacklist relays
|
||||||
// No need to connect depot tunnel url
|
// No need to connect depot tunnel url
|
||||||
const blacklistRelayUrls = storage.settings.tunnelUrl.length
|
const blacklistRelayUrls = storage.settings.tunnelUrl.length
|
||||||
? [storage.settings.tunnelUrl, `${storage.settings.tunnelUrl}/`]
|
? [
|
||||||
: [];
|
storage.settings.tunnelUrl,
|
||||||
|
`${storage.settings.tunnelUrl}/`,
|
||||||
|
"wss://brb.io/",
|
||||||
|
]
|
||||||
|
: ["wss://brb.io/"];
|
||||||
|
|
||||||
const cacheAdapter = new NDKCacheAdapterTauri(storage);
|
const cacheAdapter = new NDKCacheAdapterTauri(storage);
|
||||||
const ndk = new NDK({
|
const ndk = new NDK({
|
||||||
@@ -136,7 +95,7 @@ const LumeProvider = ({ children }: PropsWithChildren<object>) => {
|
|||||||
enableOutboxModel: !storage.settings.lowPower,
|
enableOutboxModel: !storage.settings.lowPower,
|
||||||
autoConnectUserRelays: !storage.settings.lowPower,
|
autoConnectUserRelays: !storage.settings.lowPower,
|
||||||
autoFetchUserMutelist: !storage.settings.lowPower,
|
autoFetchUserMutelist: !storage.settings.lowPower,
|
||||||
// clientName: 'Lume',
|
// clientName: "Lume",
|
||||||
// clientNip89: '',
|
// clientNip89: '',
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -145,8 +104,7 @@ const LumeProvider = ({ children }: PropsWithChildren<object>) => {
|
|||||||
|
|
||||||
// add signer
|
// add signer
|
||||||
const signer = await initNostrSigner({
|
const signer = await initNostrSigner({
|
||||||
storage,
|
nsecbunker: storage.settings.nsecbunker,
|
||||||
nsecbunker: storage.settings.bunker,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (signer) ndk.signer = signer;
|
if (signer) ndk.signer = signer;
|
||||||
@@ -167,19 +125,19 @@ const LumeProvider = ({ children }: PropsWithChildren<object>) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// update account's metadata
|
// update account's metadata
|
||||||
if (storage.account) {
|
if (signer) {
|
||||||
const user = ndk.getUser({ pubkey: storage.account.pubkey });
|
const user = ndk.getUser({ pubkey: storage.currentUser.pubkey });
|
||||||
ndk.activeUser = user;
|
ndk.activeUser = user;
|
||||||
|
|
||||||
const contacts = await user.follows();
|
const contacts = await user.follows();
|
||||||
storage.account.contacts = [...contacts].map((user) => user.pubkey);
|
storage.currentUser.contacts = [...contacts].map((user) => user.pubkey);
|
||||||
|
|
||||||
// subscribe for new activity
|
// subscribe for new activity
|
||||||
const sub = ndk.subscribe(
|
const sub = ndk.subscribe(
|
||||||
{
|
{
|
||||||
kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Zap],
|
kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Zap],
|
||||||
"#p": [storage.account.pubkey],
|
|
||||||
since: Math.floor(Date.now() / 1000),
|
since: Math.floor(Date.now() / 1000),
|
||||||
|
"#p": [storage.currentUser.pubkey],
|
||||||
},
|
},
|
||||||
{ closeOnEose: false, groupable: false },
|
{ closeOnEose: false, groupable: false },
|
||||||
);
|
);
|
||||||
@@ -212,14 +170,14 @@ const LumeProvider = ({ children }: PropsWithChildren<object>) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ark utils
|
// ark utils
|
||||||
const ark = new Ark({ storage, ndk });
|
const ark = new Ark({ ndk, account: storage.currentUser });
|
||||||
|
|
||||||
// update context
|
// update context
|
||||||
setContext({ ark, storage });
|
setContext(ark);
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!context && !isNewVersion) init();
|
if (!context) init();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
if (!context) {
|
if (!context) {
|
||||||
@@ -243,37 +201,13 @@ const LumeProvider = ({ children }: PropsWithChildren<object>) => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="absolute bottom-5 right-5 inline-flex items-center gap-2.5">
|
<div className="absolute bottom-5 right-5 inline-flex items-center gap-2.5">
|
||||||
<LoaderIcon className="w-6 h-6 text-blue-500 animate-spin" />
|
<LoaderIcon className="w-6 h-6 text-blue-500 animate-spin" />
|
||||||
<p className="font-semibold">
|
<p className="font-semibold">Starting</p>
|
||||||
{isNewVersion ? "Found a new version, updating..." : "Starting..."}
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<LumeContext.Provider
|
<LumeContext.Provider value={context}>{children}</LumeContext.Provider>
|
||||||
value={{ ark: context.ark, storage: context.storage }}
|
|
||||||
>
|
|
||||||
{children}
|
|
||||||
</LumeContext.Provider>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const useArk = () => {
|
|
||||||
const context = useContextSelector(LumeContext, (state) => state.ark);
|
|
||||||
if (context === undefined) {
|
|
||||||
throw new Error("Please import Ark Provider to use useArk() hook");
|
|
||||||
}
|
|
||||||
return context;
|
|
||||||
};
|
|
||||||
|
|
||||||
const useStorage = () => {
|
|
||||||
const context = useContextSelector(LumeContext, (state) => state.storage);
|
|
||||||
if (context === undefined) {
|
|
||||||
throw new Error("Please import Ark Provider to use useStorage() hook");
|
|
||||||
}
|
|
||||||
return context;
|
|
||||||
};
|
|
||||||
|
|
||||||
export { LumeProvider, useArk, useStorage };
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { RepostNote, TextNote, useArk, useStorage } from "@lume/ark";
|
import { RepostNote, TextNote, useArk } from "@lume/ark";
|
||||||
import { ArrowRightCircleIcon, LoaderIcon } from "@lume/icons";
|
import { ArrowRightCircleIcon, LoaderIcon } from "@lume/icons";
|
||||||
import { FETCH_LIMIT } from "@lume/utils";
|
import { FETCH_LIMIT } from "@lume/utils";
|
||||||
import { NDKEvent, NDKFilter, NDKKind } from "@nostr-dev-kit/ndk";
|
import { NDKEvent, NDKFilter, NDKKind } from "@nostr-dev-kit/ndk";
|
||||||
@@ -11,7 +11,6 @@ export function HomeRoute({
|
|||||||
content,
|
content,
|
||||||
}: { colKey: string; content: string }) {
|
}: { colKey: string; content: string }) {
|
||||||
const ark = useArk();
|
const ark = useArk();
|
||||||
const storage = useStorage();
|
|
||||||
const ref = useRef<VListHandle>();
|
const ref = useRef<VListHandle>();
|
||||||
const cacheKey = `${colKey}-vlist`;
|
const cacheKey = `${colKey}-vlist`;
|
||||||
|
|
||||||
@@ -40,7 +39,7 @@ export function HomeRoute({
|
|||||||
filter = {
|
filter = {
|
||||||
kinds: [NDKKind.Text, NDKKind.Repost],
|
kinds: [NDKKind.Text, NDKKind.Repost],
|
||||||
"#t": parsed.hashtags.map((item) => item.replace("#", "")),
|
"#t": parsed.hashtags.map((item) => item.replace("#", "")),
|
||||||
authors: storage.account.contacts,
|
authors: ark.account.contacts,
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
filter = {
|
filter = {
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { useColumnContext, useStorage } from "@lume/ark";
|
import { useArk, useColumnContext } from "@lume/ark";
|
||||||
import { CancelIcon, CheckCircleIcon } from "@lume/icons";
|
import { CancelIcon, CheckCircleIcon } from "@lume/icons";
|
||||||
import { User } from "@lume/ui";
|
import { User } from "@lume/ui";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
|
||||||
export function GroupForm({ id }: { id: number }) {
|
export function GroupForm({ id }: { id: number }) {
|
||||||
const storage = useStorage();
|
const ark = useArk();
|
||||||
const { updateColumn, removeColumn } = useColumnContext();
|
const { updateColumn, removeColumn } = useColumnContext();
|
||||||
|
|
||||||
const [title, setTitle] = useState<string>(`Group-${id}`);
|
const [title, setTitle] = useState<string>(`Group-${id}`);
|
||||||
@@ -59,7 +59,7 @@ export function GroupForm({ id }: { id: number }) {
|
|||||||
<span className="text-sm font-medium text-neutral-600 dark:text-neutral-400">{`${users.length} / ∞`}</span>
|
<span className="text-sm font-medium text-neutral-600 dark:text-neutral-400">{`${users.length} / ∞`}</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col gap-2">
|
<div className="flex flex-col gap-2">
|
||||||
{storage.account?.contacts?.map((item: string) => (
|
{ark.account?.contacts?.map((item: string) => (
|
||||||
<button
|
<button
|
||||||
key={item}
|
key={item}
|
||||||
type="button"
|
type="button"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { RepostNote, TextNote, useArk, useStorage } from "@lume/ark";
|
import { RepostNote, TextNote, useArk } from "@lume/ark";
|
||||||
import { ArrowRightCircleIcon, LoaderIcon } from "@lume/icons";
|
import { ArrowRightCircleIcon, LoaderIcon } from "@lume/icons";
|
||||||
import { FETCH_LIMIT } from "@lume/utils";
|
import { FETCH_LIMIT } from "@lume/utils";
|
||||||
import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
|
import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { RepostNote, TextNote, useArk, useStorage } from "@lume/ark";
|
import { RepostNote, TextNote, useArk } from "@lume/ark";
|
||||||
import { ArrowRightCircleIcon, LoaderIcon } from "@lume/icons";
|
import { ArrowRightCircleIcon, LoaderIcon } from "@lume/icons";
|
||||||
import { EmptyFeed } from "@lume/ui";
|
import { EmptyFeed } from "@lume/ui";
|
||||||
import { FETCH_LIMIT } from "@lume/utils";
|
import { FETCH_LIMIT } from "@lume/utils";
|
||||||
@@ -9,7 +9,6 @@ import { CacheSnapshot, VList, VListHandle } from "virtua";
|
|||||||
|
|
||||||
export function HomeRoute({ colKey }: { colKey: string }) {
|
export function HomeRoute({ colKey }: { colKey: string }) {
|
||||||
const ark = useArk();
|
const ark = useArk();
|
||||||
const storage = useStorage();
|
|
||||||
const ref = useRef<VListHandle>();
|
const ref = useRef<VListHandle>();
|
||||||
const cacheKey = `${colKey}-vlist`;
|
const cacheKey = `${colKey}-vlist`;
|
||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
@@ -34,7 +33,7 @@ export function HomeRoute({ colKey }: { colKey: string }) {
|
|||||||
const events = await ark.getInfiniteEvents({
|
const events = await ark.getInfiniteEvents({
|
||||||
filter: {
|
filter: {
|
||||||
kinds: [NDKKind.Text, NDKKind.Repost],
|
kinds: [NDKKind.Text, NDKKind.Repost],
|
||||||
authors: storage.account.contacts,
|
authors: ark.account.contacts,
|
||||||
},
|
},
|
||||||
limit: FETCH_LIMIT,
|
limit: FETCH_LIMIT,
|
||||||
pageParam,
|
pageParam,
|
||||||
@@ -94,7 +93,7 @@ export function HomeRoute({ colKey }: { colKey: string }) {
|
|||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
if (!storage.account.contacts.length) {
|
if (!ark.account.contacts.length) {
|
||||||
return (
|
return (
|
||||||
<div className="px-3 mt-3">
|
<div className="px-3 mt-3">
|
||||||
<EmptyFeed />
|
<EmptyFeed />
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Column, useStorage } from "@lume/ark";
|
import { Column, useArk } from "@lume/ark";
|
||||||
import { TimelineIcon } from "@lume/icons";
|
import { TimelineIcon } from "@lume/icons";
|
||||||
import { IColumn } from "@lume/types";
|
import { IColumn } from "@lume/types";
|
||||||
import { EventRoute, UserRoute } from "@lume/ui";
|
import { EventRoute, UserRoute } from "@lume/ui";
|
||||||
@@ -9,7 +9,7 @@ import { HomeRoute } from "./home";
|
|||||||
|
|
||||||
export function Timeline({ column }: { column: IColumn }) {
|
export function Timeline({ column }: { column: IColumn }) {
|
||||||
const colKey = `timeline-${column.id}`;
|
const colKey = `timeline-${column.id}`;
|
||||||
const storage = useStorage();
|
const ark = useArk();
|
||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
const since = useRef(Math.floor(Date.now() / 1000));
|
const since = useRef(Math.floor(Date.now() / 1000));
|
||||||
|
|
||||||
@@ -35,9 +35,9 @@ export function Timeline({ column }: { column: IColumn }) {
|
|||||||
<Column.Live
|
<Column.Live
|
||||||
filter={{
|
filter={{
|
||||||
kinds: [NDKKind.Text, NDKKind.Repost],
|
kinds: [NDKKind.Text, NDKKind.Repost],
|
||||||
authors: !storage.account.contacts.length
|
authors: !ark.account.contacts.length
|
||||||
? [storage.account.pubkey]
|
? [ark.account.pubkey]
|
||||||
: storage.account.contacts,
|
: ark.account.contacts,
|
||||||
since: since.current,
|
since: since.current,
|
||||||
}}
|
}}
|
||||||
onClick={refreshTimeline}
|
onClick={refreshTimeline}
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
import {
|
import { RepostNote, TextNote, useArk, useProfile } from "@lume/ark";
|
||||||
RepostNote,
|
|
||||||
TextNote,
|
|
||||||
useArk,
|
|
||||||
useProfile,
|
|
||||||
useStorage,
|
|
||||||
} from "@lume/ark";
|
|
||||||
import { ArrowRightCircleIcon, LoaderIcon } from "@lume/icons";
|
import { ArrowRightCircleIcon, LoaderIcon } from "@lume/icons";
|
||||||
import { NIP05 } from "@lume/ui";
|
import { NIP05 } from "@lume/ui";
|
||||||
import { FETCH_LIMIT, displayNpub } from "@lume/utils";
|
import { FETCH_LIMIT, displayNpub } from "@lume/utils";
|
||||||
@@ -17,7 +11,6 @@ import { WindowVirtualizer } from "virtua";
|
|||||||
|
|
||||||
export function HomeRoute({ id }: { id: string }) {
|
export function HomeRoute({ id }: { id: string }) {
|
||||||
const ark = useArk();
|
const ark = useArk();
|
||||||
const storage = useStorage();
|
|
||||||
|
|
||||||
const { user } = useProfile(id);
|
const { user } = useProfile(id);
|
||||||
const { data, hasNextPage, isLoading, isFetchingNextPage, fetchNextPage } =
|
const { data, hasNextPage, isLoading, isFetchingNextPage, fetchNextPage } =
|
||||||
@@ -94,7 +87,7 @@ export function HomeRoute({ id }: { id: string }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (storage.account.contacts.includes(id)) {
|
if (ark.account.contacts.includes(id)) {
|
||||||
setFollowed(true);
|
setFollowed(true);
|
||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@lume/storage",
|
"name": "@lume/storage",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"main": "./index.ts",
|
"main": "./src/index.ts",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
|
|||||||
2
packages/storage/src/index.ts
Normal file
2
packages/storage/src/index.ts
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export * from "./storage";
|
||||||
|
export * from "./provider";
|
||||||
29
packages/storage/src/provider.tsx
Normal file
29
packages/storage/src/provider.tsx
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import { locale, platform } from "@tauri-apps/plugin-os";
|
||||||
|
import Database from "@tauri-apps/plugin-sql";
|
||||||
|
import { PropsWithChildren, createContext, useContext } from "react";
|
||||||
|
import { LumeStorage } from "./storage";
|
||||||
|
|
||||||
|
const StorageContext = createContext<LumeStorage>(null);
|
||||||
|
|
||||||
|
const sqliteAdapter = await Database.load("sqlite:lume_v3.db");
|
||||||
|
const platformName = await platform();
|
||||||
|
const osLocale = await locale();
|
||||||
|
|
||||||
|
const db = new LumeStorage(sqliteAdapter, platformName, osLocale);
|
||||||
|
await db.init();
|
||||||
|
|
||||||
|
if (db.settings.depot) await db.launchDepot();
|
||||||
|
|
||||||
|
export const StorageProvider = ({ children }: PropsWithChildren<object>) => {
|
||||||
|
return (
|
||||||
|
<StorageContext.Provider value={db}>{children}</StorageContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useStorage = () => {
|
||||||
|
const context = useContext(StorageContext);
|
||||||
|
if (context === undefined) {
|
||||||
|
throw new Error("Please import Storage Provider to use useStorage() hook");
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
};
|
||||||
@@ -18,10 +18,10 @@ export class LumeStorage {
|
|||||||
#depot: Child;
|
#depot: Child;
|
||||||
readonly platform: Platform;
|
readonly platform: Platform;
|
||||||
readonly locale: string;
|
readonly locale: string;
|
||||||
public account: Account;
|
public currentUser: Account;
|
||||||
public settings: {
|
public settings: {
|
||||||
autoupdate: boolean;
|
autoupdate: boolean;
|
||||||
bunker: boolean;
|
nsecbunker: boolean;
|
||||||
media: boolean;
|
media: boolean;
|
||||||
hashtag: boolean;
|
hashtag: boolean;
|
||||||
depot: boolean;
|
depot: boolean;
|
||||||
@@ -37,7 +37,7 @@ export class LumeStorage {
|
|||||||
this.platform = platform;
|
this.platform = platform;
|
||||||
this.settings = {
|
this.settings = {
|
||||||
autoupdate: false,
|
autoupdate: false,
|
||||||
bunker: false,
|
nsecbunker: false,
|
||||||
media: true,
|
media: true,
|
||||||
hashtag: true,
|
hashtag: true,
|
||||||
depot: false,
|
depot: false,
|
||||||
@@ -52,25 +52,15 @@ export class LumeStorage {
|
|||||||
const settings = await this.getAllSettings();
|
const settings = await this.getAllSettings();
|
||||||
|
|
||||||
for (const item of settings) {
|
for (const item of settings) {
|
||||||
if (item.key === "nsecbunker")
|
if (item.value.length > 10) {
|
||||||
this.settings.bunker = !!parseInt(item.value);
|
this.settings[item.key] = item.value;
|
||||||
if (item.key === "hashtag")
|
} else {
|
||||||
this.settings.hashtag = !!parseInt(item.value);
|
this.settings[item.key] = !!parseInt(item.value);
|
||||||
if (item.key === "autoupdate")
|
}
|
||||||
this.settings.autoupdate = !!parseInt(item.value);
|
|
||||||
if (item.key === "media") this.settings.media = !!parseInt(item.value);
|
|
||||||
if (item.key === "depot") this.settings.depot = !!parseInt(item.value);
|
|
||||||
if (item.key === "tunnel_url") this.settings.tunnelUrl = item.value;
|
|
||||||
if (item.key === "lowPower")
|
|
||||||
this.settings.lowPower = !!parseInt(item.value);
|
|
||||||
if (item.key === "translation")
|
|
||||||
this.settings.translation = !!parseInt(item.value);
|
|
||||||
if (item.key === "translateApiKey")
|
|
||||||
this.settings.translateApiKey = item.value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const account = await this.getActiveAccount();
|
const account = await this.getActiveAccount();
|
||||||
if (account) this.account = account;
|
if (account) this.currentUser = account;
|
||||||
}
|
}
|
||||||
|
|
||||||
async #keyring_save(key: string, value: string) {
|
async #keyring_save(key: string, value: string) {
|
||||||
@@ -256,7 +246,7 @@ export class LumeStorage {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (results.length) {
|
if (results.length) {
|
||||||
this.account = results[0];
|
this.currentUser = results[0];
|
||||||
return results[0];
|
return results[0];
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -289,8 +279,8 @@ export class LumeStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const account = await this.getActiveAccount();
|
const account = await this.getActiveAccount();
|
||||||
this.account = account;
|
this.currentUser = account;
|
||||||
this.account.contacts = [];
|
this.currentUser.contacts = [];
|
||||||
|
|
||||||
return account;
|
return account;
|
||||||
}
|
}
|
||||||
@@ -322,7 +312,7 @@ export class LumeStorage {
|
|||||||
public async updateAccount(column: string, value: string) {
|
public async updateAccount(column: string, value: string) {
|
||||||
const insert = await this.#db.execute(
|
const insert = await this.#db.execute(
|
||||||
`UPDATE accounts SET ${column} = $1 WHERE id = $2;`,
|
`UPDATE accounts SET ${column} = $1 WHERE id = $2;`,
|
||||||
[value, this.account.id],
|
[value, this.currentUser.id],
|
||||||
);
|
);
|
||||||
|
|
||||||
if (insert) {
|
if (insert) {
|
||||||
@@ -332,11 +322,11 @@ export class LumeStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async getColumns() {
|
public async getColumns() {
|
||||||
if (!this.account) return [];
|
if (!this.currentUser) return [];
|
||||||
|
|
||||||
const columns: Array<IColumn> = await this.#db.select(
|
const columns: Array<IColumn> = await this.#db.select(
|
||||||
"SELECT * FROM columns WHERE account_id = $1 ORDER BY created_at DESC;",
|
"SELECT * FROM columns WHERE account_id = $1 ORDER BY created_at DESC;",
|
||||||
[this.account.id],
|
[this.currentUser.id],
|
||||||
);
|
);
|
||||||
|
|
||||||
return columns;
|
return columns;
|
||||||
@@ -349,7 +339,7 @@ export class LumeStorage {
|
|||||||
) {
|
) {
|
||||||
const insert = await this.#db.execute(
|
const insert = await this.#db.execute(
|
||||||
"INSERT INTO columns (account_id, kind, title, content) VALUES ($1, $2, $3, $4);",
|
"INSERT INTO columns (account_id, kind, title, content) VALUES ($1, $2, $3, $4);",
|
||||||
[this.account.id, kind, title, content],
|
[this.currentUser.id, kind, title, content],
|
||||||
);
|
);
|
||||||
|
|
||||||
if (insert) {
|
if (insert) {
|
||||||
@@ -429,10 +419,10 @@ export class LumeStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async logout() {
|
public async logout() {
|
||||||
this.account = null;
|
this.currentUser = null;
|
||||||
return await this.#db.execute(
|
return await this.#db.execute(
|
||||||
"UPDATE accounts SET is_active = '0' WHERE id = $1;",
|
"UPDATE accounts SET is_active = '0' WHERE id = $1;",
|
||||||
[this.account.id],
|
[this.currentUser.id],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
"@dnd-kit/core": "^6.1.0",
|
"@dnd-kit/core": "^6.1.0",
|
||||||
"@lume/ark": "workspace:^",
|
"@lume/ark": "workspace:^",
|
||||||
"@lume/icons": "workspace:^",
|
"@lume/icons": "workspace:^",
|
||||||
|
"@lume/storage": "workspace:^",
|
||||||
"@lume/utils": "workspace:^",
|
"@lume/utils": "workspace:^",
|
||||||
"@nostr-dev-kit/ndk": "^2.3.2",
|
"@nostr-dev-kit/ndk": "^2.3.2",
|
||||||
"@radix-ui/react-accordion": "^1.1.2",
|
"@radix-ui/react-accordion": "^1.1.2",
|
||||||
|
|||||||
@@ -1,19 +1,18 @@
|
|||||||
import { useProfile, useStorage } from "@lume/ark";
|
import { useArk, useProfile } from "@lume/ark";
|
||||||
import { useNetworkStatus } from "@lume/utils";
|
import { useNetworkStatus } from "@lume/utils";
|
||||||
import * as Avatar from "@radix-ui/react-avatar";
|
import * as Avatar from "@radix-ui/react-avatar";
|
||||||
import { minidenticon } from "minidenticons";
|
import { minidenticon } from "minidenticons";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from "tailwind-merge";
|
||||||
import { AccountMoreActions } from "./more";
|
|
||||||
|
|
||||||
export function ActiveAccount() {
|
export function ActiveAccount() {
|
||||||
const storage = useStorage();
|
const ark = useArk();
|
||||||
const isOnline = useNetworkStatus();
|
const isOnline = useNetworkStatus();
|
||||||
|
|
||||||
const { user } = useProfile(storage.account.pubkey);
|
const { user } = useProfile(ark.account.pubkey);
|
||||||
|
|
||||||
const svgURI = `data:image/svg+xml;utf8,${encodeURIComponent(
|
const svgURI = `data:image/svg+xml;utf8,${encodeURIComponent(
|
||||||
minidenticon(storage.account.pubkey, 90, 50),
|
minidenticon(ark.account.pubkey, 90, 50),
|
||||||
)}`;
|
)}`;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -21,7 +20,7 @@ export function ActiveAccount() {
|
|||||||
<Avatar.Root>
|
<Avatar.Root>
|
||||||
<Avatar.Image
|
<Avatar.Image
|
||||||
src={user?.picture || user?.image}
|
src={user?.picture || user?.image}
|
||||||
alt={storage.account.pubkey}
|
alt={ark.account.pubkey}
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
decoding="async"
|
decoding="async"
|
||||||
style={{ contentVisibility: "auto" }}
|
style={{ contentVisibility: "auto" }}
|
||||||
@@ -30,7 +29,7 @@ export function ActiveAccount() {
|
|||||||
<Avatar.Fallback delayMs={150}>
|
<Avatar.Fallback delayMs={150}>
|
||||||
<img
|
<img
|
||||||
src={svgURI}
|
src={svgURI}
|
||||||
alt={storage.account.pubkey}
|
alt={ark.account.pubkey}
|
||||||
className="aspect-square h-auto w-full rounded-xl bg-black dark:bg-white"
|
className="aspect-square h-auto w-full rounded-xl bg-black dark:bg-white"
|
||||||
/>
|
/>
|
||||||
</Avatar.Fallback>
|
</Avatar.Fallback>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useStorage } from "@lume/ark";
|
import { useStorage } from "@lume/storage";
|
||||||
import * as AlertDialog from "@radix-ui/react-alert-dialog";
|
import * as AlertDialog from "@radix-ui/react-alert-dialog";
|
||||||
import { useQueryClient } from "@tanstack/react-query";
|
import { useQueryClient } from "@tanstack/react-query";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { LoaderIcon } from "@lume/icons";
|
import { LoaderIcon } from "@lume/icons";
|
||||||
import { FETCH_LIMIT } from "@lume/utils";
|
import { useStorage } from "@lume/storage";
|
||||||
import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
|
import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
|
||||||
import { useInfiniteQuery } from "@tanstack/react-query";
|
import { useInfiniteQuery } from "@tanstack/react-query";
|
||||||
import { useCallback, useMemo } from "react";
|
import { useCallback, useMemo } from "react";
|
||||||
import { VList } from "virtua";
|
|
||||||
import { ReplyActivity } from "./reply";
|
import { ReplyActivity } from "./reply";
|
||||||
import { RepostActivity } from "./repost";
|
import { RepostActivity } from "./repost";
|
||||||
import { ZapActivity } from "./zap";
|
import { ZapActivity } from "./zap";
|
||||||
@@ -27,7 +26,7 @@ export function ActivityContent() {
|
|||||||
const events = await ark.getInfiniteEvents({
|
const events = await ark.getInfiniteEvents({
|
||||||
filter: {
|
filter: {
|
||||||
kinds: [NDKKind.Zap],
|
kinds: [NDKKind.Zap],
|
||||||
"#p": [storage.account.pubkey],
|
"#p": [ark.account.pubkey],
|
||||||
},
|
},
|
||||||
limit: 100,
|
limit: 100,
|
||||||
pageParam,
|
pageParam,
|
||||||
@@ -52,7 +51,7 @@ export function ActivityContent() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const renderEvent = useCallback((event: NDKEvent) => {
|
const renderEvent = useCallback((event: NDKEvent) => {
|
||||||
if (event.pubkey === storage.account.pubkey) return null;
|
if (event.pubkey === ark.account.pubkey) return null;
|
||||||
|
|
||||||
switch (event.kind) {
|
switch (event.kind) {
|
||||||
case NDKKind.Text:
|
case NDKKind.Text:
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { MentionNote, useArk, useColumnContext, useStorage } from "@lume/ark";
|
import { MentionNote, useArk, useColumnContext } from "@lume/ark";
|
||||||
import { LoaderIcon, TrashIcon } from "@lume/icons";
|
import { LoaderIcon, TrashIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { NDKCacheUserProfile } from "@lume/types";
|
import { NDKCacheUserProfile } from "@lume/types";
|
||||||
import { COL_TYPES, cn, editorValueAtom } from "@lume/utils";
|
import { COL_TYPES, cn, editorValueAtom } from "@lume/utils";
|
||||||
import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
|
import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useStorage } from "@lume/ark";
|
|
||||||
import { CheckIcon, LoaderIcon } from "@lume/icons";
|
import { CheckIcon, LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { onboardingAtom } from "@lume/utils";
|
import { onboardingAtom } from "@lume/utils";
|
||||||
import { useQueryClient } from "@tanstack/react-query";
|
import { useQueryClient } from "@tanstack/react-query";
|
||||||
import { motion } from "framer-motion";
|
import { motion } from "framer-motion";
|
||||||
@@ -20,7 +20,7 @@ export function OnboardingFinishScreen() {
|
|||||||
const queryKeys = queryCache.getAll().map((cache) => cache.queryKey);
|
const queryKeys = queryCache.getAll().map((cache) => cache.queryKey);
|
||||||
|
|
||||||
await queryClient.refetchQueries({
|
await queryClient.refetchQueries({
|
||||||
queryKey: ["user", storage.account.pubkey],
|
queryKey: ["user", ark.account.pubkey],
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const key of queryKeys) {
|
for (const key of queryKeys) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useArk, useStorage } from "@lume/ark";
|
import { useArk } from "@lume/ark";
|
||||||
import { ArrowLeftIcon, LoaderIcon } from "@lume/icons";
|
import { ArrowLeftIcon, LoaderIcon } from "@lume/icons";
|
||||||
|
import { useStorage } from "@lume/storage";
|
||||||
import { NDKKind, NDKUserProfile } from "@nostr-dev-kit/ndk";
|
import { NDKKind, NDKUserProfile } from "@nostr-dev-kit/ndk";
|
||||||
import { motion } from "framer-motion";
|
import { motion } from "framer-motion";
|
||||||
import { minidenticon } from "minidenticons";
|
import { minidenticon } from "minidenticons";
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
import {
|
import { RepostNote, TextNote, useArk, useProfile } from "@lume/ark";
|
||||||
RepostNote,
|
|
||||||
TextNote,
|
|
||||||
useArk,
|
|
||||||
useProfile,
|
|
||||||
useStorage,
|
|
||||||
} from "@lume/ark";
|
|
||||||
import {
|
import {
|
||||||
ArrowLeftIcon,
|
ArrowLeftIcon,
|
||||||
ArrowRightCircleIcon,
|
ArrowRightCircleIcon,
|
||||||
@@ -22,7 +16,6 @@ import { NIP05 } from "../nip05";
|
|||||||
|
|
||||||
export function UserRoute() {
|
export function UserRoute() {
|
||||||
const ark = useArk();
|
const ark = useArk();
|
||||||
const storage = useStorage();
|
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const { id } = useParams();
|
const { id } = useParams();
|
||||||
@@ -101,7 +94,7 @@ export function UserRoute() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (storage.account.contacts.includes(id)) {
|
if (ark.account.contacts.includes(id)) {
|
||||||
setFollowed(true);
|
setFollowed(true);
|
||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { atom } from "jotai";
|
import { atom } from "jotai";
|
||||||
|
|
||||||
|
// Editor
|
||||||
export const editorAtom = atom(false);
|
export const editorAtom = atom(false);
|
||||||
export const editorValueAtom = atom([
|
export const editorValueAtom = atom([
|
||||||
{
|
{
|
||||||
@@ -8,7 +9,9 @@ export const editorValueAtom = atom([
|
|||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// Onboarding
|
||||||
export const onboardingAtom = atom(false);
|
export const onboardingAtom = atom(false);
|
||||||
|
|
||||||
|
// Activity
|
||||||
export const activityAtom = atom(false);
|
export const activityAtom = atom(false);
|
||||||
export const activityUnreadAtom = atom(0);
|
export const activityUnreadAtom = atom(0);
|
||||||
|
|||||||
518
pnpm-lock.yaml
generated
518
pnpm-lock.yaml
generated
@@ -54,6 +54,9 @@ importers:
|
|||||||
'@lume/icons':
|
'@lume/icons':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../../packages/icons
|
version: link:../../packages/icons
|
||||||
|
'@lume/storage':
|
||||||
|
specifier: workspace:^
|
||||||
|
version: link:../../packages/storage
|
||||||
'@lume/ui':
|
'@lume/ui':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../../packages/ui
|
version: link:../../packages/ui
|
||||||
@@ -235,6 +238,9 @@ importers:
|
|||||||
vite:
|
vite:
|
||||||
specifier: ^5.0.11
|
specifier: ^5.0.11
|
||||||
version: 5.0.11(@types/node@20.11.0)
|
version: 5.0.11(@types/node@20.11.0)
|
||||||
|
vite-plugin-top-level-await:
|
||||||
|
specifier: ^1.4.1
|
||||||
|
version: 1.4.1(vite@5.0.11)
|
||||||
vite-tsconfig-paths:
|
vite-tsconfig-paths:
|
||||||
specifier: ^4.2.3
|
specifier: ^4.2.3
|
||||||
version: 4.2.3(typescript@5.3.3)(vite@5.0.11)
|
version: 4.2.3(typescript@5.3.3)(vite@5.0.11)
|
||||||
@@ -264,25 +270,25 @@ importers:
|
|||||||
version: 0.15.0(@nostr-dev-kit/ndk@2.3.2)(nostr-fetch@0.15.0)
|
version: 0.15.0(@nostr-dev-kit/ndk@2.3.2)(nostr-fetch@0.15.0)
|
||||||
'@radix-ui/react-avatar':
|
'@radix-ui/react-avatar':
|
||||||
specifier: ^1.0.4
|
specifier: ^1.0.4
|
||||||
version: 1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
||||||
'@radix-ui/react-collapsible':
|
'@radix-ui/react-collapsible':
|
||||||
specifier: ^1.0.3
|
specifier: ^1.0.3
|
||||||
version: 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
||||||
'@radix-ui/react-dialog':
|
'@radix-ui/react-dialog':
|
||||||
specifier: ^1.0.5
|
specifier: ^1.0.5
|
||||||
version: 1.0.5(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
version: 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
||||||
'@radix-ui/react-dropdown-menu':
|
'@radix-ui/react-dropdown-menu':
|
||||||
specifier: ^2.0.6
|
specifier: ^2.0.6
|
||||||
version: 2.0.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
version: 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
||||||
'@radix-ui/react-hover-card':
|
'@radix-ui/react-hover-card':
|
||||||
specifier: ^1.0.7
|
specifier: ^1.0.7
|
||||||
version: 1.0.7(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
||||||
'@radix-ui/react-popover':
|
'@radix-ui/react-popover':
|
||||||
specifier: ^1.0.7
|
specifier: ^1.0.7
|
||||||
version: 1.0.7(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
||||||
'@radix-ui/react-tooltip':
|
'@radix-ui/react-tooltip':
|
||||||
specifier: ^1.0.7
|
specifier: ^1.0.7
|
||||||
version: 1.0.7(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
||||||
'@tanstack/react-query':
|
'@tanstack/react-query':
|
||||||
specifier: ^5.17.9
|
specifier: ^5.17.9
|
||||||
version: 5.17.9(react@18.2.0)
|
version: 5.17.9(react@18.2.0)
|
||||||
@@ -880,6 +886,9 @@ importers:
|
|||||||
'@lume/icons':
|
'@lume/icons':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../icons
|
version: link:../icons
|
||||||
|
'@lume/storage':
|
||||||
|
specifier: workspace:^
|
||||||
|
version: link:../storage
|
||||||
'@lume/utils':
|
'@lume/utils':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../utils
|
version: link:../utils
|
||||||
@@ -1866,26 +1875,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-arrow@1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
/@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==}
|
resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -1910,29 +1899,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-avatar@1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
/@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==}
|
resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -1961,33 +1927,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-collapsible@1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/primitive': 1.0.1
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-presence': 1.0.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
/@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==}
|
resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2012,29 +1951,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-collection@1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.47)(react@18.2.0):
|
/@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.47)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==}
|
resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2097,39 +2013,6 @@ packages:
|
|||||||
react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
|
react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-dialog@1.0.5(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/primitive': 1.0.1
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-dismissable-layer': 1.0.5(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-focus-scope': 1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-portal': 1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-presence': 1.0.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
aria-hidden: 1.2.3
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-direction@1.0.1(@types/react@18.2.47)(react@18.2.0):
|
/@radix-ui/react-direction@1.0.1(@types/react@18.2.47)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==}
|
resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2169,30 +2052,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-dismissable-layer@1.0.5(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/primitive': 1.0.1
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
/@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==}
|
resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2220,32 +2079,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-dropdown-menu@2.0.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/primitive': 1.0.1
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-menu': 2.0.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.47)(react@18.2.0):
|
/@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.47)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==}
|
resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2283,28 +2116,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-focus-scope@1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-hover-card@1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
/@radix-ui/react-hover-card@1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-OcUN2FU0YpmajD/qkph3XzMcK/NmSk9hGWnjV68p6QiZMgILugusgQwnLSDs3oFSJYGKf3Y49zgFedhGh04k9A==}
|
resolution: {integrity: sha512-OcUN2FU0YpmajD/qkph3XzMcK/NmSk9hGWnjV68p6QiZMgILugusgQwnLSDs3oFSJYGKf3Y49zgFedhGh04k9A==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2334,34 +2145,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-hover-card@1.0.7(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-OcUN2FU0YpmajD/qkph3XzMcK/NmSk9hGWnjV68p6QiZMgILugusgQwnLSDs3oFSJYGKf3Y49zgFedhGh04k9A==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/primitive': 1.0.1
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-dismissable-layer': 1.0.5(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-popper': 1.1.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-portal': 1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-presence': 1.0.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-id@1.0.1(@types/react@18.2.47)(react@18.2.0):
|
/@radix-ui/react-id@1.0.1(@types/react@18.2.47)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
|
resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2415,43 +2198,6 @@ packages:
|
|||||||
react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
|
react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-menu@2.0.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/primitive': 1.0.1
|
|
||||||
'@radix-ui/react-collection': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-dismissable-layer': 1.0.5(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-focus-scope': 1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-popper': 1.1.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-portal': 1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-presence': 1.0.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-roving-focus': 1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
aria-hidden: 1.2.3
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
/@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==}
|
resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2487,40 +2233,6 @@ packages:
|
|||||||
react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
|
react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-popover@1.0.7(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/primitive': 1.0.1
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-dismissable-layer': 1.0.5(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-focus-scope': 1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-popper': 1.1.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-portal': 1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-presence': 1.0.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
aria-hidden: 1.2.3
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
/@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==}
|
resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2551,35 +2263,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-popper@1.1.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@floating-ui/react-dom': 2.0.5(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-arrow': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-size': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/rect': 1.0.1
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
/@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==}
|
resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2601,26 +2284,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-portal@1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
/@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==}
|
resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2643,27 +2306,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-presence@1.0.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
/@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
|
resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2685,26 +2327,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-primitive@1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
/@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==}
|
resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2734,34 +2356,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-roving-focus@1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/primitive': 1.0.1
|
|
||||||
'@radix-ui/react-collection': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-select@2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
/@radix-ui/react-select@2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==}
|
resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2877,37 +2471,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-tooltip@1.0.7(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/primitive': 1.0.1
|
|
||||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-dismissable-layer': 1.0.5(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-popper': 1.1.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-portal': 1.0.4(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-presence': 1.0.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
|
|
||||||
'@radix-ui/react-visually-hidden': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.47)(react@18.2.0):
|
/@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.47)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==}
|
resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -3031,26 +2594,6 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@radix-ui/react-visually-hidden@1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
|
|
||||||
resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==}
|
|
||||||
peerDependencies:
|
|
||||||
'@types/react': '*'
|
|
||||||
'@types/react-dom': '*'
|
|
||||||
react: ^16.8 || ^17.0 || ^18.0
|
|
||||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@types/react':
|
|
||||||
optional: true
|
|
||||||
'@types/react-dom':
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
'@babel/runtime': 7.23.8
|
|
||||||
'@radix-ui/react-primitive': 1.0.3(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@types/react': 18.2.47
|
|
||||||
react: 18.2.0
|
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@radix-ui/rect@1.0.1:
|
/@radix-ui/rect@1.0.1:
|
||||||
resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==}
|
resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3062,6 +2605,16 @@ packages:
|
|||||||
engines: {node: '>=14.0.0'}
|
engines: {node: '>=14.0.0'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@rollup/plugin-virtual@3.0.2:
|
||||||
|
resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==}
|
||||||
|
engines: {node: '>=14.0.0'}
|
||||||
|
peerDependencies:
|
||||||
|
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
|
||||||
|
peerDependenciesMeta:
|
||||||
|
rollup:
|
||||||
|
optional: true
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@rollup/rollup-android-arm-eabi@4.9.5:
|
/@rollup/rollup-android-arm-eabi@4.9.5:
|
||||||
resolution: {integrity: sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==}
|
resolution: {integrity: sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
@@ -6547,6 +6100,11 @@ packages:
|
|||||||
hasBin: true
|
hasBin: true
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/uuid@9.0.1:
|
||||||
|
resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
|
||||||
|
hasBin: true
|
||||||
|
dev: true
|
||||||
|
|
||||||
/uuidv4@2.0.0:
|
/uuidv4@2.0.0:
|
||||||
resolution: {integrity: sha512-sAUlwUVepcVk6bwnaW/oi6LCwMdueako5QQzRr90ioAVVcms6p1mV0PaSxK8gyAC4CRvKddsk217uUpZUbKd2Q==}
|
resolution: {integrity: sha512-sAUlwUVepcVk6bwnaW/oi6LCwMdueako5QQzRr90ioAVVcms6p1mV0PaSxK8gyAC4CRvKddsk217uUpZUbKd2Q==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -6588,6 +6146,20 @@ packages:
|
|||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/vite-plugin-top-level-await@1.4.1(vite@5.0.11):
|
||||||
|
resolution: {integrity: sha512-hogbZ6yT7+AqBaV6lK9JRNvJDn4/IJvHLu6ET06arNfo0t2IsyCaon7el9Xa8OumH+ESuq//SDf8xscZFE0rWw==}
|
||||||
|
peerDependencies:
|
||||||
|
vite: '>=2.8'
|
||||||
|
dependencies:
|
||||||
|
'@rollup/plugin-virtual': 3.0.2
|
||||||
|
'@swc/core': 1.3.102
|
||||||
|
uuid: 9.0.1
|
||||||
|
vite: 5.0.11(@types/node@20.11.0)
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- '@swc/helpers'
|
||||||
|
- rollup
|
||||||
|
dev: true
|
||||||
|
|
||||||
/vite-tsconfig-paths@4.2.3(typescript@5.3.3)(vite@5.0.11):
|
/vite-tsconfig-paths@4.2.3(typescript@5.3.3)(vite@5.0.11):
|
||||||
resolution: {integrity: sha512-xVsA2xe6QSlzBujtWF8q2NYexh7PAUYfzJ4C8Axpe/7d2pcERYxuxGgph9F4f0iQO36g5tyGq6eBUYIssdUrVw==}
|
resolution: {integrity: sha512-xVsA2xe6QSlzBujtWF8q2NYexh7PAUYfzJ4C8Axpe/7d2pcERYxuxGgph9F4f0iQO36g5tyGq6eBUYIssdUrVw==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
|
|||||||
Reference in New Issue
Block a user