From d35c64e28de41c4da3e4c08c9fb4d3bfbab81bde Mon Sep 17 00:00:00 2001 From: Ren Amamiya <123083837+reyamir@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:12:07 +0700 Subject: [PATCH] polish --- package.json | 1 + pnpm-lock.yaml | 173 +++++++++++++++++++++++++++++++ src/app.tsx | 19 ++++ src/app/chat/components/item.tsx | 8 +- src/app/settings/account.tsx | 7 ++ src/app/settings/general.tsx | 7 ++ src/app/settings/shortcuts.tsx | 7 ++ src/app/settings/update.tsx | 7 ++ src/app/user/components/feed.tsx | 23 +++- src/app/user/index.tsx | 2 +- src/libs/storage.tsx | 14 +++ src/shared/icons/index.tsx | 2 + src/shared/icons/logout.tsx | 24 +++++ src/shared/icons/settings.tsx | 29 ++++++ src/shared/logout.tsx | 123 ++++++++++++++++++++++ src/shared/lumeBar.tsx | 74 ++++--------- src/shared/navigation.tsx | 12 +-- src/shared/notification.tsx | 58 +++++++++++ src/shared/relayManager.tsx | 13 --- src/shared/settingsLayout.tsx | 74 +++++++++++++ 20 files changed, 589 insertions(+), 88 deletions(-) create mode 100644 src/app/settings/account.tsx create mode 100644 src/app/settings/general.tsx create mode 100644 src/app/settings/shortcuts.tsx create mode 100644 src/app/settings/update.tsx create mode 100644 src/shared/icons/logout.tsx create mode 100644 src/shared/icons/settings.tsx create mode 100644 src/shared/logout.tsx create mode 100644 src/shared/notification.tsx delete mode 100644 src/shared/relayManager.tsx create mode 100644 src/shared/settingsLayout.tsx diff --git a/package.json b/package.json index 5c58783f..b35861db 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@floating-ui/react": "^0.23.1", "@headlessui/react": "^1.7.15", "@nostr-dev-kit/ndk": "0.6.0", + "@radix-ui/react-popover": "^1.0.6", "@radix-ui/react-tooltip": "^1.0.6", "@tanstack/react-query": "^4.29.19", "@tanstack/react-virtual": "3.0.0-beta.54", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 992e48bc..85045271 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,6 +10,9 @@ dependencies: '@nostr-dev-kit/ndk': specifier: 0.6.0 version: 0.6.0(typescript@4.9.5) + '@radix-ui/react-popover': + specifier: ^1.0.6 + version: 1.0.6(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-tooltip': specifier: ^1.0.6 version: 1.0.6(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) @@ -714,6 +717,43 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.5 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} + 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.22.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + 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.14)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: @@ -729,6 +769,41 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==} + 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.22.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + 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.14)(react@18.2.0) + dev: false + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} peerDependencies: @@ -2158,6 +2233,10 @@ packages: resolution: {integrity: sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==} dev: false + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true @@ -2827,6 +2906,11 @@ packages: has-symbols: 1.0.3 dev: false + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -3118,6 +3202,12 @@ packages: side-channel: 1.0.4 dev: false + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + /ip-regex@4.3.0: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} engines: {node: '>=8'} @@ -4297,6 +4387,41 @@ packages: react-fast-compare: 3.2.2 dev: false + /react-remove-scroll-bar@2.3.4(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.2.14)(react@18.2.0) + tslib: 2.6.0 + dev: false + + /react-remove-scroll@2.5.5(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.14)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.14)(react@18.2.0) + tslib: 2.6.0 + use-callback-ref: 1.3.0(@types/react@18.2.14)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.14)(react@18.2.0) + dev: false + /react-router-dom@6.14.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-YEwlApKwzMMMbGbhh+Q7MsloTldcwMgHxUY/1g0uA62+B1hZo2jsybCWIDCL8zvIDB1FA0pBKY9chHbZHt+2dQ==} engines: {node: '>=14'} @@ -4325,6 +4450,23 @@ packages: engines: {node: '>=0.12.0'} dev: false + /react-style-singleton@2.2.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.6.0 + dev: false + /react-virtuoso@4.3.11(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-0YrCvQ5GsIKRcN34GxrzhSJGuMNI+hGxWci5cTVuPQ8QWTEsrKfCyqm7YNBMmV3pu7onG1YVUBo86CyCXdejXg==} engines: {node: '>=10'} @@ -5117,6 +5259,37 @@ packages: tlds: 1.240.0 dev: false + /use-callback-ref@1.3.0(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + tslib: 2.6.0 + dev: false + + /use-sidecar@1.1.2(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.6.0 + dev: false + /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: diff --git a/src/app.tsx b/src/app.tsx index c13e9ce1..684e28ef 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -13,12 +13,17 @@ import { ChannelScreen } from "@app/channel"; import { ChatScreen } from "@app/chat"; import { ErrorScreen } from "@app/error"; import { Root } from "@app/root"; +import { AccountSettingsScreen } from "@app/settings/account"; +import { GeneralSettingsScreen } from "@app/settings/general"; +import { ShortcutsSettingsScreen } from "@app/settings/shortcuts"; +import { UpdateSettingsScreen } from "@app/settings/update"; import { SpaceScreen } from "@app/space"; import { TrendingScreen } from "@app/trending"; import { UserScreen } from "@app/user"; import { AppLayout } from "@shared/appLayout"; import { AuthLayout } from "@shared/authLayout"; import { Protected } from "@shared/protected"; +import { SettingsLayout } from "@shared/settingsLayout"; import { RouterProvider, createBrowserRouter } from "react-router-dom"; const router = createBrowserRouter([ @@ -72,6 +77,20 @@ const router = createBrowserRouter([ { path: "channel/:id", element: }, ], }, + { + path: "/settings", + element: ( + + + + ), + children: [ + { path: "general", element: }, + { path: "shortcuts", element: }, + { path: "account", element: }, + { path: "update", element: }, + ], + }, ]); export default function App() { diff --git a/src/app/chat/components/item.tsx b/src/app/chat/components/item.tsx index 78278ba4..d95f379c 100644 --- a/src/app/chat/components/item.tsx +++ b/src/app/chat/components/item.tsx @@ -12,9 +12,7 @@ export function ChatsListItem({ data }: { data: any }) { return (
-
-
-
+
); } @@ -40,10 +38,10 @@ export function ChatsListItem({ data }: { data: any }) {
-
+
{user?.nip05 || - user?.displayName || user?.name || + user?.displayName || shortenKey(data.sender_pubkey)}
diff --git a/src/app/settings/account.tsx b/src/app/settings/account.tsx new file mode 100644 index 00000000..984d1c70 --- /dev/null +++ b/src/app/settings/account.tsx @@ -0,0 +1,7 @@ +export function AccountSettingsScreen() { + return ( +
+

Account

+
+ ); +} diff --git a/src/app/settings/general.tsx b/src/app/settings/general.tsx new file mode 100644 index 00000000..df9e5701 --- /dev/null +++ b/src/app/settings/general.tsx @@ -0,0 +1,7 @@ +export function GeneralSettingsScreen() { + return ( +
+

General

+
+ ); +} diff --git a/src/app/settings/shortcuts.tsx b/src/app/settings/shortcuts.tsx new file mode 100644 index 00000000..610fce3b --- /dev/null +++ b/src/app/settings/shortcuts.tsx @@ -0,0 +1,7 @@ +export function ShortcutsSettingsScreen() { + return ( +
+

Shortcuts

+
+ ); +} diff --git a/src/app/settings/update.tsx b/src/app/settings/update.tsx new file mode 100644 index 00000000..362a35a1 --- /dev/null +++ b/src/app/settings/update.tsx @@ -0,0 +1,7 @@ +export function UpdateSettingsScreen() { + return ( +
+

Update

+
+ ); +} diff --git a/src/app/user/components/feed.tsx b/src/app/user/components/feed.tsx index 79309bee..16b2e30f 100644 --- a/src/app/user/components/feed.tsx +++ b/src/app/user/components/feed.tsx @@ -1,19 +1,32 @@ -import { getNotesByPubkey } from "@libs/storage"; +import { NDKFilter } from "@nostr-dev-kit/ndk"; import { Note } from "@shared/notes/note"; +import { RelayContext } from "@shared/relayProvider"; import { useQuery } from "@tanstack/react-query"; +import { dateToUnix, getHourAgo } from "@utils/date"; import { LumeEvent } from "@utils/types"; +import { useContext } from "react"; export function UserFeed({ pubkey }: { pubkey: string }) { + const ndk = useContext(RelayContext); const { status, data } = useQuery(["user-feed", pubkey], async () => { - return await getNotesByPubkey(pubkey); + const now = new Date(); + const filter: NDKFilter = { + kinds: [1], + authors: [pubkey], + since: dateToUnix(getHourAgo(48, now)), + }; + const events = await ndk.fetchEvents(filter); + return [...events]; }); return ( -
+
{status === "loading" ? ( -

Loading...

+
+

Loading...

+
) : ( - data.map((note: LumeEvent) => ) + data.map((note: LumeEvent) => ) )}
); diff --git a/src/app/user/index.tsx b/src/app/user/index.tsx index 8ed02fec..66fdb1b1 100644 --- a/src/app/user/index.tsx +++ b/src/app/user/index.tsx @@ -145,7 +145,7 @@ export function UserScreen() { } font-medium inline-flex items-center gap-2 h-10 border-t`} > - Posts + Activities from 48 hours ago )} diff --git a/src/libs/storage.tsx b/src/libs/storage.tsx index 2bab3ebc..1f02bcd2 100644 --- a/src/libs/storage.tsx +++ b/src/libs/storage.tsx @@ -400,7 +400,21 @@ export async function createBlock(kind: number, title: string, content: any) { ); } +// remove block export async function removeBlock(id: string) { const db = await connect(); return await db.execute(`DELETE FROM blocks WHERE id = "${id}";`); } + +// logout +export async function removeAll() { + const db = await connect(); + await db.execute(`UPDATE settings SET value = "0" WHERE key = "last_login";`); + await db.execute("DELETE FROM replies;"); + await db.execute("DELETE FROM notes;"); + await db.execute("DELETE FROM blacklist;"); + await db.execute("DELETE FROM blocks;"); + await db.execute("DELETE FROM chats;"); + await db.execute("DELETE FROM accounts;"); + return true; +} diff --git a/src/shared/icons/index.tsx b/src/shared/icons/index.tsx index 5c4c0c9f..5e4db457 100644 --- a/src/shared/icons/index.tsx +++ b/src/shared/icons/index.tsx @@ -39,4 +39,6 @@ export * from "./cmd"; export * from "./verticalDots"; export * from "./signal"; export * from "./unverified"; +export * from "./settings"; +export * from "./logout"; // @endindex diff --git a/src/shared/icons/logout.tsx b/src/shared/icons/logout.tsx new file mode 100644 index 00000000..aa31d985 --- /dev/null +++ b/src/shared/icons/logout.tsx @@ -0,0 +1,24 @@ +import { SVGProps } from "react"; + +export function LogoutIcon( + props: JSX.IntrinsicAttributes & SVGProps, +) { + return ( + + + + ); +} diff --git a/src/shared/icons/settings.tsx b/src/shared/icons/settings.tsx new file mode 100644 index 00000000..f7a59720 --- /dev/null +++ b/src/shared/icons/settings.tsx @@ -0,0 +1,29 @@ +import { SVGProps } from "react"; + +export function SettingsIcon( + props: JSX.IntrinsicAttributes & SVGProps, +) { + return ( + + + + + ); +} diff --git a/src/shared/logout.tsx b/src/shared/logout.tsx new file mode 100644 index 00000000..86aeb4cb --- /dev/null +++ b/src/shared/logout.tsx @@ -0,0 +1,123 @@ +import { Dialog, Transition } from "@headlessui/react"; +import { removeAll } from "@libs/storage"; +import { CancelIcon, LogoutIcon } from "@shared/icons"; +import { useQueryClient } from "@tanstack/react-query"; +import { relaunch } from "@tauri-apps/api/process"; +import { Fragment, useState } from "react"; + +export function Logout() { + const queryClient = useQueryClient(); + const [isOpen, setIsOpen] = useState(false); + + const closeModal = () => { + setIsOpen(false); + }; + + const openModal = () => { + setIsOpen(true); + }; + + const logout = async () => { + // reset database + await removeAll(); + // reset react query + queryClient.clear(); + // navigate + await relaunch(); + }; + + return ( + <> + + + + +
+ +
+ + +
+
+
+ + Are you sure! + + +
+ +

+ When logout, all local data will be wiped, and restart + app then you need to start onboarding process again when + you log in. +

+

+ In the next version, Lume will support multi account, + then you can switch between all account s instead of + logout +

+
+
+
+
+
+ + +
+
+
+
+
+
+
+ + ); +} diff --git a/src/shared/lumeBar.tsx b/src/shared/lumeBar.tsx index b86810f1..292c095a 100644 --- a/src/shared/lumeBar.tsx +++ b/src/shared/lumeBar.tsx @@ -1,68 +1,30 @@ -import { Transition } from "@headlessui/react"; -import { getActiveAccount } from "@libs/storage"; import { ActiveAccount } from "@shared/accounts/active"; -import { VerticalDotsIcon } from "@shared/icons"; -import { RelayManager } from "@shared/relayManager"; -import { useQuery } from "@tanstack/react-query"; -import { useState } from "react"; +import { SettingsIcon } from "@shared/icons"; +import { Logout } from "@shared/logout"; +import { Notification } from "@shared/notification"; +import { useAccount } from "@utils/hooks/useAccount"; import { Link } from "react-router-dom"; export function LumeBar() { - const { status, data: activeAccount } = useQuery( - ["activeAccount"], - async () => { - return await getActiveAccount(); - }, - ); - - const [open, setOpen] = useState(false); - - const toggleMenu = () => { - setOpen((isOpen) => !isOpen); - }; + const { status, account } = useAccount(); return ( -
+
-
- {status === "loading" ? ( -
- ) : ( - - )} - -
- + + +
- - - Settings - - - Logout - -
); } diff --git a/src/shared/navigation.tsx b/src/shared/navigation.tsx index 6b3d9312..68a9325f 100644 --- a/src/shared/navigation.tsx +++ b/src/shared/navigation.tsx @@ -7,14 +7,10 @@ import { LumeBar } from "@shared/lumeBar"; import { NavLink } from "react-router-dom"; import { twMerge } from "tailwind-merge"; -export function Navigation({ reverse = false }: { reverse?: boolean }) { +export function Navigation() { return ( -
- +
+
@@ -117,7 +113,7 @@ export function Navigation({ reverse = false }: { reverse?: boolean }) { )}
-
+
diff --git a/src/shared/notification.tsx b/src/shared/notification.tsx new file mode 100644 index 00000000..9ef57384 --- /dev/null +++ b/src/shared/notification.tsx @@ -0,0 +1,58 @@ +import { Dialog, Transition } from "@headlessui/react"; +import { BellIcon } from "@shared/icons"; +import { Fragment, useState } from "react"; + +export function Notification() { + const [isOpen, setIsOpen] = useState(false); + + const closeModal = () => { + setIsOpen(false); + }; + + const openModal = () => { + setIsOpen(true); + }; + + return ( + <> + + + + +
+ +
+ + +

OK

+
+
+
+
+
+ + ); +} diff --git a/src/shared/relayManager.tsx b/src/shared/relayManager.tsx deleted file mode 100644 index c249835d..00000000 --- a/src/shared/relayManager.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { SignalIcon } from "@shared/icons"; - -export function RelayManager() { - return ( - - ); -} diff --git a/src/shared/settingsLayout.tsx b/src/shared/settingsLayout.tsx new file mode 100644 index 00000000..f5a79bcf --- /dev/null +++ b/src/shared/settingsLayout.tsx @@ -0,0 +1,74 @@ +import { AppHeader } from "@shared/appHeader"; +import { NavLink, Outlet, ScrollRestoration } from "react-router-dom"; +import { twMerge } from "tailwind-merge"; + +export function SettingsLayout() { + return ( +
+
+
+ +
+
+
+

+ Settings +

+
+
+ + twMerge( + "flex h-9 items-center gap-2.5 rounded-md px-2.5 text-zinc-200", + isActive ? "bg-zinc-900/50" : "", + ) + } + > + General + + + twMerge( + "flex h-9 items-center gap-2.5 rounded-md px-2.5 text-zinc-200", + isActive ? "bg-zinc-900/50" : "", + ) + } + > + Shortcuts + + + twMerge( + "flex h-9 items-center gap-2.5 rounded-md px-2.5 text-zinc-200", + isActive ? "bg-zinc-900/50" : "", + ) + } + > + Account + + + twMerge( + "flex h-9 items-center gap-2.5 rounded-md px-2.5 text-zinc-200", + isActive ? "bg-zinc-900/50" : "", + ) + } + > + Update + +
+
+
+
+
+
+ + +
+
+ ); +}