diff --git a/apps/desktop2/src/app.tsx b/apps/desktop2/src/app.tsx index 202d74cd..8a511086 100644 --- a/apps/desktop2/src/app.tsx +++ b/apps/desktop2/src/app.tsx @@ -4,9 +4,9 @@ import React, { StrictMode } from "react"; import ReactDOM from "react-dom/client"; import { I18nextProvider } from "react-i18next"; import "./app.css"; +import { type } from "@tauri-apps/plugin-os"; import i18n from "./locale"; import { routeTree } from "./router.gen"; // auto generated file -import { type } from "@tauri-apps/plugin-os"; const queryClient = new QueryClient(); const os = await type(); diff --git a/apps/desktop2/src/components/column.tsx b/apps/desktop2/src/components/column.tsx index 19bd5373..ceef4f65 100644 --- a/apps/desktop2/src/components/column.tsx +++ b/apps/desktop2/src/components/column.tsx @@ -44,9 +44,9 @@ export function Column({ useEffect(() => { if (!isCreated) return; - const unlisten = listen("window", (data) => { + const unlisten = listen("child-webview", (data) => { if (data.payload.scroll) repositionWebview(); - if (data.payload.resize) resizeWebview(); + if (data.payload.resize) repositionWebview().then(() => resizeWebview()); }); return () => { diff --git a/apps/desktop2/src/components/note/buttons/repost.tsx b/apps/desktop2/src/components/note/buttons/repost.tsx index b8e840bf..fe90523a 100644 --- a/apps/desktop2/src/components/note/buttons/repost.tsx +++ b/apps/desktop2/src/components/note/buttons/repost.tsx @@ -1,15 +1,16 @@ import { RepostIcon } from "@lume/icons"; -import { cn } from "@lume/utils"; -import { useCallback, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { toast } from "sonner"; -import { Spinner } from "@lume/ui"; -import { useNoteContext } from "../provider"; import { LumeWindow } from "@lume/system"; +import { Spinner } from "@lume/ui"; +import { cn } from "@lume/utils"; +import { useRouteContext } from "@tanstack/react-router"; import { Menu, MenuItem } from "@tauri-apps/api/menu"; +import { useCallback, useState } from "react"; +import { toast } from "sonner"; +import { useNoteContext } from "../provider"; export function NoteRepost({ large = false }: { large?: boolean }) { const event = useNoteContext(); + const { settings } = useRouteContext({ strict: false }); const [loading, setLoading] = useState(false); const [isRepost, setIsRepost] = useState(false); @@ -56,6 +57,8 @@ export function NoteRepost({ large = false }: { large?: boolean }) { await menu.popup().catch((e) => console.error(e)); }, []); + if (!settings.display_repost_button) return null; + return ( -
@@ -127,10 +119,15 @@ function Accounts() { setWindowWidth(getWindowDimensions().width); } - if (!windowWidth) setWindowWidth(getWindowDimensions().width); + if (!windowWidth) { + setWindowWidth(getWindowDimensions().width); + } + window.addEventListener("resize", handleResize); - return () => window.removeEventListener("resize", handleResize); + return () => { + window.removeEventListener("resize", handleResize); + }; }, []); return ( diff --git a/apps/desktop2/src/routes/__root.tsx b/apps/desktop2/src/routes/__root.tsx index cdb2ddcb..bb165709 100644 --- a/apps/desktop2/src/routes/__root.tsx +++ b/apps/desktop2/src/routes/__root.tsx @@ -1,5 +1,5 @@ -import { CheckCircleIcon, InfoCircleIcon, CancelCircleIcon } from "@lume/icons"; -import type { Settings } from "@lume/types"; +import { CancelCircleIcon, CheckCircleIcon, InfoCircleIcon } from "@lume/icons"; +import type { Settings } from "@lume/system"; import { Spinner } from "@lume/ui"; import type { QueryClient } from "@tanstack/react-query"; import { Outlet, createRootRouteWithContext } from "@tanstack/react-router"; @@ -40,7 +40,7 @@ export const Route = createRootRouteWithContext()({ function Pending() { return ( -
+
); diff --git a/apps/desktop2/src/routes/auth/$account.settings.tsx b/apps/desktop2/src/routes/auth/$account.settings.tsx deleted file mode 100644 index 15045b27..00000000 --- a/apps/desktop2/src/routes/auth/$account.settings.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import { LaurelIcon } from "@lume/icons"; -import { NostrQuery } from "@lume/system"; -import { Spinner } from "@lume/ui"; -import * as Switch from "@radix-ui/react-switch"; -import { createFileRoute } from "@tanstack/react-router"; -import { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { toast } from "sonner"; - -export const Route = createFileRoute("/auth/$account/settings")({ - beforeLoad: async () => { - const settings = await NostrQuery.getSettings(); - return { settings }; - }, - component: Screen, - pendingComponent: Pending, -}); - -function Screen() { - const { settings } = Route.useRouteContext(); - const { account } = Route.useParams(); - const { t } = useTranslation(); - - const [newSettings, setNewSettings] = useState(settings); - const [loading, setLoading] = useState(false); - - const navigate = Route.useNavigate(); - - const toggleEnhancedPrivacy = () => { - setNewSettings((prev) => ({ - ...prev, - enhancedPrivacy: !newSettings.enhancedPrivacy, - })); - }; - - const toggleNsfw = () => { - setNewSettings((prev) => ({ - ...prev, - nsfw: !newSettings.nsfw, - })); - }; - - const submit = async () => { - try { - // start loading - setLoading(true); - - // publish settings - const eventId = await NostrQuery.setSettings(newSettings); - - if (eventId) { - return navigate({ - to: "/$account/home", - params: { account }, - replace: true, - }); - } - } catch (e) { - setLoading(false); - toast.error(e); - } - }; - - return ( -
-
-
- -
-
-

- {t("onboardingSettings.title")} -

-

- {t("onboardingSettings.subtitle")} -

-
-
-
-
-
-
-

Enhanced Privacy

-

- Lume will display external resources like image, video or link - preview as plain text. -

-
- toggleEnhancedPrivacy()} - className="relative mt-1 h-7 w-12 shrink-0 cursor-default rounded-full bg-neutral-200 outline-none data-[state=checked]:bg-blue-500 dark:bg-white/20" - > - - -
-
-
-

Filter sensitive content

-

- By default, Lume will display all content which have Content - Warning tag, it's may include NSFW content. -

-
- toggleNsfw()} - className="relative mt-1 h-7 w-12 shrink-0 cursor-default rounded-full bg-neutral-200 outline-none data-[state=checked]:bg-blue-500 dark:bg-white/20" - > - - -
-
- -
-
- ); -} - -function Pending() { - return ( -
- -
- ); -} diff --git a/apps/desktop2/src/routes/auth/new/profile.tsx b/apps/desktop2/src/routes/auth/create-profile.tsx similarity index 76% rename from apps/desktop2/src/routes/auth/new/profile.tsx rename to apps/desktop2/src/routes/auth/create-profile.tsx index 09fdc7ad..631ac258 100644 --- a/apps/desktop2/src/routes/auth/new/profile.tsx +++ b/apps/desktop2/src/routes/auth/create-profile.tsx @@ -9,7 +9,7 @@ import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; -export const Route = createFileRoute("/auth/new/profile")({ +export const Route = createFileRoute("/auth/create-profile")({ component: Screen, loader: async () => { const account = await NostrAccount.createAccount(); @@ -58,24 +58,24 @@ function Screen() { }; return ( -
+

Let's set up your profile.

-
+
{picture ? ( avatar ) : null} @@ -83,7 +83,7 @@ function Screen() {
@@ -106,7 +106,7 @@ function Screen() { {...register("name")} placeholder="e.g. alice" spellCheck={false} - className="h-11 rounded-lg border-transparent bg-neutral-100 px-3 placeholder:text-neutral-600 focus:border-blue-500 focus:ring-0 dark:bg-white/10 dark:placeholder:text-neutral-400" + className="px-3 border-transparent rounded-lg h-11 bg-neutral-100 placeholder:text-neutral-600 focus:border-blue-500 focus:ring-0 dark:bg-white/10 dark:placeholder:text-neutral-400" />
@@ -129,12 +129,12 @@ function Screen() { {...register("website")} placeholder="e.g. https://alice.me" spellCheck={false} - className="h-11 rounded-lg border-transparent bg-neutral-100 px-3 placeholder:text-neutral-500 focus:border-blue-500 focus:ring-0 dark:bg-white/10 dark:placeholder:text-neutral-400" + className="px-3 border-transparent rounded-lg h-11 bg-neutral-100 placeholder:text-neutral-500 focus:border-blue-500 focus:ring-0 dark:bg-white/10 dark:placeholder:text-neutral-400" />
diff --git a/apps/desktop2/src/routes/auth/privkey.lazy.tsx b/apps/desktop2/src/routes/auth/privkey.lazy.tsx index 15daa529..edccf216 100644 --- a/apps/desktop2/src/routes/auth/privkey.lazy.tsx +++ b/apps/desktop2/src/routes/auth/privkey.lazy.tsx @@ -28,7 +28,7 @@ function Screen() { if (npub) { navigate({ - to: "/auth/$account/settings", + to: "/$account/home", params: { account: npub }, replace: true, }); @@ -40,11 +40,11 @@ function Screen() { }; return ( -
+

Continue with Private Key

-
+
@@ -73,14 +73,14 @@ function Screen() { type="password" value={password} onChange={(e) => setPassword(e.target.value)} - className="h-11 rounded-lg border-transparent bg-neutral-100 px-3 placeholder:text-neutral-600 focus:border-blue-500 focus:ring-0 dark:bg-white/10 dark:placeholder:text-neutral-400" + className="px-3 border-transparent rounded-lg h-11 bg-neutral-100 placeholder:text-neutral-600 focus:border-blue-500 focus:ring-0 dark:bg-white/10 dark:placeholder:text-neutral-400" />
diff --git a/apps/desktop2/src/routes/auth/remote.lazy.tsx b/apps/desktop2/src/routes/auth/remote.lazy.tsx index e853ab2e..0ae2c0d0 100644 --- a/apps/desktop2/src/routes/auth/remote.lazy.tsx +++ b/apps/desktop2/src/routes/auth/remote.lazy.tsx @@ -27,7 +27,7 @@ function Screen() { if (remoteAccount?.length) { return navigate({ - to: "/auth/$account/settings", + to: "/$account/home", params: { account: remoteAccount }, replace: true, }); @@ -39,11 +39,11 @@ function Screen() { }; return ( -
+

Continue with Nostr Connect

-
+
-
+
{loading ? ( -

+

Waiting confirmation...

) : null} diff --git a/apps/desktop2/src/routes/bootstrap-relays.tsx b/apps/desktop2/src/routes/bootstrap-relays.tsx index 1655b8aa..aed396f1 100644 --- a/apps/desktop2/src/routes/bootstrap-relays.tsx +++ b/apps/desktop2/src/routes/bootstrap-relays.tsx @@ -1,6 +1,6 @@ import { CancelIcon, PlusIcon } from "@lume/icons"; import { NostrQuery } from "@lume/system"; -import { Relay } from "@lume/types"; +import type { Relay } from "@lume/types"; import { Spinner } from "@lume/ui"; import { createFileRoute } from "@tanstack/react-router"; import { useEffect, useState } from "react"; @@ -51,16 +51,16 @@ function Screen() { }, [bootstrapRelays]); return ( -
-
-
+
+
+

Customize Bootstrap Relays

-
+
{relays.map((relay) => (
{relay.url} @@ -69,7 +69,7 @@ function Screen() { {relay.purpose?.length ? ( @@ -77,19 +77,19 @@ function Screen() {
))} -
+
-
+
{loading ? ( -
+
) : events.length ? ( @@ -68,11 +69,11 @@ function Screen() {
Users
-
+
{events .filter((ev) => ev.kind === Kind.Metadata) - .map((event, index) => ( - + .map((event) => ( + ))}
@@ -80,7 +81,7 @@ function Screen() {
Notes
-
+
{events .filter((ev) => ev.kind === Kind.Text) .map((event) => ( @@ -91,8 +92,8 @@ function Screen() {
) : null} {!loading && !events.length ? ( -
-
+
+
Try searching for people, notes, or keywords @@ -103,17 +104,17 @@ function Screen() { ); } -function SearchUser({ event }: { event: NostrEvent }) { +function SearchUser({ event }: { event: LumeEvent }) { return (