From 0e5adb246fd03e403684ea9b4ed531ec48ff5185 Mon Sep 17 00:00:00 2001 From: Ren Amamiya <123083837+reyamir@users.noreply.github.com> Date: Wed, 20 Sep 2023 14:31:14 +0700 Subject: [PATCH 01/18] resizable widget --- package.json | 2 + pnpm-lock.yaml | 53 +++++++++++++++++-- src/shared/widgets/global/articles.tsx | 5 +- src/shared/widgets/global/files.tsx | 5 +- src/shared/widgets/global/hashtag.tsx | 5 +- src/shared/widgets/index.ts | 1 + src/shared/widgets/local/articles.tsx | 5 +- src/shared/widgets/local/feeds.tsx | 5 +- src/shared/widgets/local/files.tsx | 5 +- src/shared/widgets/local/follows.tsx | 5 +- src/shared/widgets/local/network.tsx | 17 +++--- src/shared/widgets/local/thread.tsx | 5 +- src/shared/widgets/local/user.tsx | 5 +- .../widgets/nostrBand/trendingAccounts.tsx | 5 +- .../widgets/nostrBand/trendingNotes.tsx | 5 +- src/shared/widgets/other/learnNostr.tsx | 5 +- src/shared/widgets/wrapper.tsx | 32 +++++++++++ src/stores/widgets.ts | 13 +++++ 18 files changed, 141 insertions(+), 37 deletions(-) create mode 100644 src/shared/widgets/wrapper.tsx diff --git a/package.json b/package.json index 7a0ea3e9..933b4147 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "**/*.{ts, tsx, css, md, html, json}": "prettier --cache --write" }, "dependencies": { + "@dnd-kit/core": "^6.0.8", "@getalby/sdk": "^2.4.0", "@nostr-dev-kit/ndk": "^1.2.1", "@nostr-fetch/adapter-ndk": "^0.12.2", @@ -47,6 +48,7 @@ "nostr-fetch": "^0.13.0", "nostr-tools": "^1.15.0", "qrcode.react": "^3.1.0", + "re-resizable": "^6.9.11", "react": "^18.2.0", "react-currency-input-field": "^3.6.11", "react-dom": "^18.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc164463..817f014b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + '@dnd-kit/core': + specifier: ^6.0.8 + version: 6.0.8(react-dom@18.2.0)(react@18.2.0) '@getalby/sdk': specifier: ^2.4.0 version: 2.4.0 @@ -92,6 +95,9 @@ dependencies: qrcode.react: specifier: ^3.1.0 version: 3.1.0(react@18.2.0) + re-resizable: + specifier: ^6.9.11 + version: 6.9.11(react-dom@18.2.0)(react@18.2.0) react: specifier: ^18.2.0 version: 18.2.0 @@ -124,7 +130,7 @@ dependencies: version: 3.0.1 tauri-plugin-sql-api: specifier: github:tauri-apps/tauri-plugin-sql#v1 - version: github.com/tauri-apps/tauri-plugin-sql/b8fd19dac907cc8c3d78681cd4803a326b8b861e + version: github.com/tauri-apps/tauri-plugin-sql/26467343db277e79daf3a216372ba25e1fec0deb tauri-plugin-store-api: specifier: github:tauri-apps/tauri-plugin-store#v1 version: github.com/tauri-apps/tauri-plugin-store/a65ce9bfb168a9a3cd7ed4102b9f22770cc3abfa @@ -369,6 +375,37 @@ packages: to-fast-properties: 2.0.0 dev: true + /@dnd-kit/accessibility@3.0.1(react@18.2.0): + resolution: {integrity: sha512-HXRrwS9YUYQO9lFRc/49uO/VICbM+O+ZRpFDe9Pd1rwVv2PCNkRiTZRdxrDgng/UkvdC3Re9r2vwPpXXrWeFzg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /@dnd-kit/core@6.0.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@dnd-kit/accessibility': 3.0.1(react@18.2.0) + '@dnd-kit/utilities': 3.2.1(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + dev: false + + /@dnd-kit/utilities@3.2.1(react@18.2.0): + resolution: {integrity: sha512-OOXqISfvBw/1REtkSK2N3Fi2EQiLMlWUlqnOK/UpOISqBZPWpE6TqL+jcPtMOkE8TqYGiURvRdPSI9hltNUjEA==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -5134,6 +5171,16 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /re-resizable@6.9.11(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-a3hiLWck/NkmyLvGWUuvkAmN1VhwAz4yOhS6FdMTaxCUVN9joIWkT11wsO68coG/iEYuwn+p/7qAmfQzRhiPLQ==} + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /react-currency-input-field@3.6.11(react@18.2.0): resolution: {integrity: sha512-M9vOx1eaioSaYWirm7W2WSBi4bpLg+LK4Gf7C1kNhy6MvoSoOzd0mYZPxA78OC9UBIQ2nM080Wu9D1CwTY6n3w==} peerDependencies: @@ -6314,8 +6361,8 @@ packages: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false - github.com/tauri-apps/tauri-plugin-sql/b8fd19dac907cc8c3d78681cd4803a326b8b861e: - resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-sql/tar.gz/b8fd19dac907cc8c3d78681cd4803a326b8b861e} + github.com/tauri-apps/tauri-plugin-sql/26467343db277e79daf3a216372ba25e1fec0deb: + resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-sql/tar.gz/26467343db277e79daf3a216372ba25e1fec0deb} name: tauri-plugin-sql-api version: 0.0.0 dependencies: diff --git a/src/shared/widgets/global/articles.tsx b/src/shared/widgets/global/articles.tsx index c12f530e..fa19b01f 100644 --- a/src/shared/widgets/global/articles.tsx +++ b/src/shared/widgets/global/articles.tsx @@ -7,6 +7,7 @@ import { useNDK } from '@libs/ndk/provider'; import { ArticleNote, NoteSkeleton, NoteWrapper } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { Widget } from '@utils/types'; @@ -51,7 +52,7 @@ export function GlobalArticlesWidget({ params }: { params: Widget }) { ); return ( -
+
{status === 'loading' ? ( @@ -89,6 +90,6 @@ export function GlobalArticlesWidget({ params }: { params: Widget }) {
)}
- + ); } diff --git a/src/shared/widgets/global/files.tsx b/src/shared/widgets/global/files.tsx index d82857b7..56011e19 100644 --- a/src/shared/widgets/global/files.tsx +++ b/src/shared/widgets/global/files.tsx @@ -7,6 +7,7 @@ import { useNDK } from '@libs/ndk/provider'; import { FileNote, NoteSkeleton, NoteWrapper } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { Widget } from '@utils/types'; @@ -52,7 +53,7 @@ export function GlobalFilesWidget({ params }: { params: Widget }) { ); return ( -
+
{status === 'loading' ? ( @@ -90,6 +91,6 @@ export function GlobalFilesWidget({ params }: { params: Widget }) {
)}
- + ); } diff --git a/src/shared/widgets/global/hashtag.tsx b/src/shared/widgets/global/hashtag.tsx index 7833c377..374b87c0 100644 --- a/src/shared/widgets/global/hashtag.tsx +++ b/src/shared/widgets/global/hashtag.tsx @@ -15,6 +15,7 @@ import { UnknownNote, } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { nHoursAgo } from '@utils/date'; import { Widget } from '@utils/types'; @@ -114,7 +115,7 @@ export function GlobalHashtagWidget({ params }: { params: Widget }) { ); return ( -
+
{status === 'loading' ? ( @@ -152,6 +153,6 @@ export function GlobalHashtagWidget({ params }: { params: Widget }) {
)}
- + ); } diff --git a/src/shared/widgets/index.ts b/src/shared/widgets/index.ts index 7b29f9d0..fd0dcdbf 100644 --- a/src/shared/widgets/index.ts +++ b/src/shared/widgets/index.ts @@ -1,3 +1,4 @@ +export * from './wrapper'; export * from './local/feeds'; export * from './local/network'; export * from './local/user'; diff --git a/src/shared/widgets/local/articles.tsx b/src/shared/widgets/local/articles.tsx index 11fecff0..fd49fc1e 100644 --- a/src/shared/widgets/local/articles.tsx +++ b/src/shared/widgets/local/articles.tsx @@ -8,6 +8,7 @@ import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; import { FileNote, NoteSkeleton, NoteWrapper } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { DBEvent, Widget } from '@utils/types'; @@ -53,7 +54,7 @@ export function LocalArticlesWidget({ params }: { params: Widget }) { ); return ( -
+
{status === 'loading' ? ( @@ -125,6 +126,6 @@ export function LocalArticlesWidget({ params }: { params: Widget }) {
- + ); } diff --git a/src/shared/widgets/local/feeds.tsx b/src/shared/widgets/local/feeds.tsx index ac1dc890..23a4bf9a 100644 --- a/src/shared/widgets/local/feeds.tsx +++ b/src/shared/widgets/local/feeds.tsx @@ -16,6 +16,7 @@ import { } from '@shared/notes'; import { NoteSkeleton } from '@shared/notes/skeleton'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { DBEvent, Widget } from '@utils/types'; @@ -116,7 +117,7 @@ export function LocalFeedsWidget({ params }: { params: Widget }) { ); return ( -
+
{status === 'loading' ? ( @@ -188,6 +189,6 @@ export function LocalFeedsWidget({ params }: { params: Widget }) {
- + ); } diff --git a/src/shared/widgets/local/files.tsx b/src/shared/widgets/local/files.tsx index ec5f3ced..d8328cc0 100644 --- a/src/shared/widgets/local/files.tsx +++ b/src/shared/widgets/local/files.tsx @@ -8,6 +8,7 @@ import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; import { FileNote, NoteSkeleton, NoteWrapper } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { DBEvent, Widget } from '@utils/types'; @@ -53,7 +54,7 @@ export function LocalFilesWidget({ params }: { params: Widget }) { ); return ( -
+
{status === 'loading' ? ( @@ -125,6 +126,6 @@ export function LocalFilesWidget({ params }: { params: Widget }) {
- + ); } diff --git a/src/shared/widgets/local/follows.tsx b/src/shared/widgets/local/follows.tsx index 73810d4e..0d22b0f8 100644 --- a/src/shared/widgets/local/follows.tsx +++ b/src/shared/widgets/local/follows.tsx @@ -16,6 +16,7 @@ import { } from '@shared/notes'; import { NoteSkeleton } from '@shared/notes/skeleton'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { DBEvent, Widget } from '@utils/types'; @@ -115,7 +116,7 @@ export function LocalFollowsWidget({ params }: { params: Widget }) { ); return ( -
+
{status === 'loading' ? ( @@ -193,6 +194,6 @@ export function LocalFollowsWidget({ params }: { params: Widget }) { ) : null}
- + ); } diff --git a/src/shared/widgets/local/network.tsx b/src/shared/widgets/local/network.tsx index 68aa833e..fd177ad1 100644 --- a/src/shared/widgets/local/network.tsx +++ b/src/shared/widgets/local/network.tsx @@ -16,6 +16,7 @@ import { } from '@shared/notes'; import { NoteSkeleton } from '@shared/notes/skeleton'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { useNostr } from '@utils/hooks/useNostr'; import { toRawEvent } from '@utils/rawEvent'; @@ -127,19 +128,15 @@ export function LocalNetworkWidget() { since: db.account.last_login_at ?? Math.floor(Date.now() / 1000), }; - sub( - filter, - async (event) => { - const rawEvent = toRawEvent(event); - await db.createEvent(rawEvent); - }, - false // don't close sub on eose - ); + sub(filter, async (event) => { + const rawEvent = toRawEvent(event); + await db.createEvent(rawEvent); + }); } }, []); return ( -
+
{status === 'loading' ? ( @@ -217,6 +214,6 @@ export function LocalNetworkWidget() { ) : null}
- + ); } diff --git a/src/shared/widgets/local/thread.tsx b/src/shared/widgets/local/thread.tsx index 1d754610..8236e558 100644 --- a/src/shared/widgets/local/thread.tsx +++ b/src/shared/widgets/local/thread.tsx @@ -16,6 +16,7 @@ import { RepliesList } from '@shared/notes/replies/list'; import { NoteSkeleton } from '@shared/notes/skeleton'; import { TitleBar } from '@shared/titleBar'; import { User } from '@shared/user'; +import { WidgetWrapper } from '@shared/widgets'; import { useEvent } from '@utils/hooks/useEvent'; import { Widget } from '@utils/types'; @@ -41,7 +42,7 @@ export function LocalThreadWidget({ params }: { params: Widget }) { ); return ( -
+
{status === 'loading' ? ( @@ -69,6 +70,6 @@ export function LocalThreadWidget({ params }: { params: Widget }) {
- + ); } diff --git a/src/shared/widgets/local/user.tsx b/src/shared/widgets/local/user.tsx index 4266d76c..fc920bc9 100644 --- a/src/shared/widgets/local/user.tsx +++ b/src/shared/widgets/local/user.tsx @@ -16,6 +16,7 @@ import { } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; import { UserProfile } from '@shared/userProfile'; +import { WidgetWrapper } from '@shared/widgets'; import { nHoursAgo } from '@utils/date'; import { Widget } from '@utils/types'; @@ -120,7 +121,7 @@ export function LocalUserWidget({ params }: { params: Widget }) { ); return ( -
+
@@ -166,6 +167,6 @@ export function LocalUserWidget({ params }: { params: Widget }) {
- + ); } diff --git a/src/shared/widgets/nostrBand/trendingAccounts.tsx b/src/shared/widgets/nostrBand/trendingAccounts.tsx index c8e3286d..6dfa8358 100644 --- a/src/shared/widgets/nostrBand/trendingAccounts.tsx +++ b/src/shared/widgets/nostrBand/trendingAccounts.tsx @@ -2,6 +2,7 @@ import { useQuery } from '@tanstack/react-query'; import { NoteSkeleton } from '@shared/notes/skeleton'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { NostrBandUserProfile, type Profile } from '@shared/widgets/nostrBandUserProfile'; import { Widget } from '@utils/types'; @@ -31,7 +32,7 @@ export function TrendingAccountsWidget({ params }: { params: Widget }) { ); return ( -
+
{status === 'loading' ? ( @@ -56,6 +57,6 @@ export function TrendingAccountsWidget({ params }: { params: Widget }) {
)}
- + ); } diff --git a/src/shared/widgets/nostrBand/trendingNotes.tsx b/src/shared/widgets/nostrBand/trendingNotes.tsx index 321b2b88..5056e9e9 100644 --- a/src/shared/widgets/nostrBand/trendingNotes.tsx +++ b/src/shared/widgets/nostrBand/trendingNotes.tsx @@ -3,6 +3,7 @@ import { useQuery } from '@tanstack/react-query'; import { NoteSkeleton, NoteWrapper, TextNote } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { Widget } from '@utils/types'; @@ -31,7 +32,7 @@ export function TrendingNotesWidget({ params }: { params: Widget }) { ); return ( -
+
{status === 'loading' ? ( @@ -58,6 +59,6 @@ export function TrendingNotesWidget({ params }: { params: Widget }) {
)}
- + ); } diff --git a/src/shared/widgets/other/learnNostr.tsx b/src/shared/widgets/other/learnNostr.tsx index aee20b27..b48de3d6 100644 --- a/src/shared/widgets/other/learnNostr.tsx +++ b/src/shared/widgets/other/learnNostr.tsx @@ -2,6 +2,7 @@ import { useNavigate } from 'react-router-dom'; import { ArrowRightIcon } from '@shared/icons'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { useResources } from '@stores/resources'; @@ -21,7 +22,7 @@ export function LearnNostrWidget({ params }: { params: Widget }) { }; return ( -
+
{resources.map((resource, index) => ( @@ -58,6 +59,6 @@ export function LearnNostrWidget({ params }: { params: Widget }) {
))}
- + ); } diff --git a/src/shared/widgets/wrapper.tsx b/src/shared/widgets/wrapper.tsx new file mode 100644 index 00000000..72e8587f --- /dev/null +++ b/src/shared/widgets/wrapper.tsx @@ -0,0 +1,32 @@ +import { Resizable } from 're-resizable'; +import { ReactNode, useState } from 'react'; +import { twMerge } from 'tailwind-merge'; + +export function WidgetWrapper({ + children, + className, +}: { + children: ReactNode; + className?: string; +}) { + const [width, setWidth] = useState(400); + + return ( + e.preventDefault()} + onResizeStop={(e, direction, ref, d) => { + setWidth((prevWidth) => prevWidth + d.width); + }} + minWidth={400} + minHeight={'100vh'} + className={twMerge( + 'relative shrink-0 grow-0 basis-[400px] bg-white/10 backdrop-blur-xl', + className + )} + enable={{ right: true }} + > + {children} + + ); +} diff --git a/src/stores/widgets.ts b/src/stores/widgets.ts index d1805eef..60f6745d 100644 --- a/src/stores/widgets.ts +++ b/src/stores/widgets.ts @@ -10,6 +10,7 @@ interface WidgetState { fetchWidgets: (db: LumeStorage) => void; setWidget: (db: LumeStorage, { kind, title, content }: Widget) => void; removeWidget: (db: LumeStorage, id: string) => void; + reorderWidget: (id: string, position: number) => void; } export const WidgetKinds = { @@ -141,6 +142,18 @@ export const useWidgets = create()( await db.removeWidget(id); set((state) => ({ widgets: state.widgets.filter((widget) => widget.id !== id) })); }, + reorderWidget: (id: string, position: number) => + set((state) => { + const widgets = [...state.widgets]; + const widget = widgets.find((widget) => widget.id === id); + if (!widget) return { widgets }; + + const idx = widgets.indexOf(widget); + widgets.splice(idx, 1); + widgets.splice(position, 0, widget); + + return { widgets }; + }), }), { name: 'widgets', From 17fe3bb1f64220f85797df71aced635d744e3cd6 Mon Sep 17 00:00:00 2001 From: Ren Amamiya <123083837+reyamir@users.noreply.github.com> Date: Thu, 21 Sep 2023 09:11:45 +0700 Subject: [PATCH 02/18] wip: timeline --- package.json | 2 - pnpm-lock.yaml | 120 +------------------------- src/app.tsx | 7 ++ src/app/chats/components/item.tsx | 4 +- src/app/chats/components/modal.tsx | 2 +- src/app/chats/components/unknowns.tsx | 2 +- src/app/timeline/index.tsx | 7 ++ src/shared/accounts/active.tsx | 28 ++++-- src/shared/composer/modal.tsx | 8 +- src/shared/icons/index.ts | 1 + src/shared/icons/timeline.tsx | 22 +++++ src/shared/logout.tsx | 6 +- src/shared/navigation.tsx | 53 ++++++++---- 13 files changed, 107 insertions(+), 155 deletions(-) create mode 100644 src/app/timeline/index.tsx create mode 100644 src/shared/icons/timeline.tsx diff --git a/package.json b/package.json index 933b4147..d66dae26 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "**/*.{ts, tsx, css, md, html, json}": "prettier --cache --write" }, "dependencies": { - "@dnd-kit/core": "^6.0.8", "@getalby/sdk": "^2.4.0", "@nostr-dev-kit/ndk": "^1.2.1", "@nostr-fetch/adapter-ndk": "^0.12.2", @@ -40,7 +39,6 @@ "@tiptap/suggestion": "^2.1.10", "dayjs": "^1.11.10", "destr": "^2.0.1", - "get-urls": "^12.1.0", "html-to-text": "^9.0.5", "light-bolt11-decoder": "^3.0.0", "lru-cache": "^10.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 817f014b..1868a42b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,9 +5,6 @@ settings: excludeLinksFromLockfile: false dependencies: - '@dnd-kit/core': - specifier: ^6.0.8 - version: 6.0.8(react-dom@18.2.0)(react@18.2.0) '@getalby/sdk': specifier: ^2.4.0 version: 2.4.0 @@ -71,9 +68,6 @@ dependencies: destr: specifier: ^2.0.1 version: 2.0.1 - get-urls: - specifier: ^12.1.0 - version: 12.1.0 html-to-text: specifier: ^9.0.5 version: 9.0.5 @@ -130,7 +124,7 @@ dependencies: version: 3.0.1 tauri-plugin-sql-api: specifier: github:tauri-apps/tauri-plugin-sql#v1 - version: github.com/tauri-apps/tauri-plugin-sql/26467343db277e79daf3a216372ba25e1fec0deb + version: github.com/tauri-apps/tauri-plugin-sql/51e39b0b6ba542ffc6af1fa438933fdc1ae265a0 tauri-plugin-store-api: specifier: github:tauri-apps/tauri-plugin-store#v1 version: github.com/tauri-apps/tauri-plugin-store/a65ce9bfb168a9a3cd7ed4102b9f22770cc3abfa @@ -375,37 +369,6 @@ packages: to-fast-properties: 2.0.0 dev: true - /@dnd-kit/accessibility@3.0.1(react@18.2.0): - resolution: {integrity: sha512-HXRrwS9YUYQO9lFRc/49uO/VICbM+O+ZRpFDe9Pd1rwVv2PCNkRiTZRdxrDgng/UkvdC3Re9r2vwPpXXrWeFzg==} - peerDependencies: - react: '>=16.8.0' - dependencies: - react: 18.2.0 - tslib: 2.6.2 - dev: false - - /@dnd-kit/core@6.0.8(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - dependencies: - '@dnd-kit/accessibility': 3.0.1(react@18.2.0) - '@dnd-kit/utilities': 3.2.1(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.2 - dev: false - - /@dnd-kit/utilities@3.2.1(react@18.2.0): - resolution: {integrity: sha512-OOXqISfvBw/1REtkSK2N3Fi2EQiLMlWUlqnOK/UpOISqBZPWpE6TqL+jcPtMOkE8TqYGiURvRdPSI9hltNUjEA==} - peerDependencies: - react: '>=16.8.0' - dependencies: - react: 18.2.0 - tslib: 2.6.2 - dev: false - /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -2668,13 +2631,6 @@ packages: string-width: 5.1.2 dev: true - /clone-regexp@3.0.0: - resolution: {integrity: sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==} - engines: {node: '>=12'} - dependencies: - is-regexp: 3.1.0 - dev: false - /clsx@2.0.0: resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} engines: {node: '>=6'} @@ -2723,11 +2679,6 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /convert-hrtime@5.0.0: - resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} - engines: {node: '>=12'} - dev: false - /crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} dev: false @@ -3400,11 +3351,6 @@ packages: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /function-timeout@0.1.1: - resolution: {integrity: sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==} - engines: {node: '>=14.16'} - dev: false - /function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} @@ -3446,17 +3392,6 @@ packages: get-intrinsic: 1.2.1 dev: true - /get-urls@12.1.0: - resolution: {integrity: sha512-qHO+QmPiI1bEw0Y/m+WMAAx/UoEEXLZwEx0DVaKMtlHNrKbMeV960LryIpd+E2Ykb9XkVHmVtpbCsmul3GhR0g==} - engines: {node: '>=16'} - dependencies: - normalize-url: 8.0.0 - super-regex: 0.2.0 - url-regex-safe: 4.0.0 - transitivePeerDependencies: - - re2 - dev: false - /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3672,11 +3607,6 @@ packages: loose-envify: 1.4.0 dev: false - /ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} - dev: false - /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -3819,11 +3749,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-regexp@3.1.0: - resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} - engines: {node: '>=12'} - dev: false - /is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} dev: true @@ -4612,11 +4537,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /normalize-url@8.0.0: - resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} - engines: {node: '>=14.16'} - dev: false - /nostr-fetch@0.13.0: resolution: {integrity: sha512-0lIBkDjF5W0OBtkoMPax6ArKlzMGQDfc6cSyZ+XFvAoY2TJEiUXkI7Piwf0TQBEvJtahHaZnaTaFD13T69mgmQ==} dependencies: @@ -5709,15 +5629,6 @@ packages: ts-interface-checker: 0.1.13 dev: true - /super-regex@0.2.0: - resolution: {integrity: sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==} - engines: {node: '>=14.16'} - dependencies: - clone-regexp: 3.0.0 - function-timeout: 0.1.1 - time-span: 5.1.0 - dev: false - /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -5794,24 +5705,12 @@ packages: engines: {node: '>=10'} dev: false - /time-span@5.1.0: - resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} - engines: {node: '>=12'} - dependencies: - convert-hrtime: 5.0.0 - dev: false - /tippy.js@6.3.7: resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} dependencies: '@popperjs/core': 2.11.8 dev: false - /tlds@1.242.0: - resolution: {integrity: sha512-aP3dXawgmbfU94mA32CJGHmJUE1E58HCB1KmlKRhBNtqBL27mSQcAEmcaMaQ1Za9kIVvOdbxJD3U5ycDy7nJ3w==} - hasBin: true - dev: false - /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -6028,19 +5927,6 @@ packages: punycode: 2.3.0 dev: true - /url-regex-safe@4.0.0: - resolution: {integrity: sha512-BrnFCWKNFrFnRzKD66NtJqQepfJrUHNPvPxE5y5NSAhXBb4OlobQjt7907Jm4ItPiXaeX+dDWMkcnOd4jR9N8A==} - engines: {node: '>= 14'} - peerDependencies: - re2: ^1.20.1 - peerDependenciesMeta: - re2: - optional: true - dependencies: - ip-regex: 4.3.0 - tlds: 1.242.0 - dev: false - /use-callback-ref@1.3.0(@types/react@18.2.22)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} @@ -6361,8 +6247,8 @@ packages: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false - github.com/tauri-apps/tauri-plugin-sql/26467343db277e79daf3a216372ba25e1fec0deb: - resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-sql/tar.gz/26467343db277e79daf3a216372ba25e1fec0deb} + github.com/tauri-apps/tauri-plugin-sql/51e39b0b6ba542ffc6af1fa438933fdc1ae265a0: + resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-sql/tar.gz/51e39b0b6ba542ffc6af1fa438933fdc1ae265a0} name: tauri-plugin-sql-api version: 0.0.0 dependencies: diff --git a/src/app.tsx b/src/app.tsx index cd9c8897..c3393f9b 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -59,6 +59,13 @@ const router = createBrowserRouter([ return { Component: SpaceScreen }; }, }, + { + path: 'timeline', + async lazy() { + const { TimelineScreen } = await import('@app/timeline'); + return { Component: TimelineScreen }; + }, + }, { path: 'users/:pubkey', async lazy() { diff --git a/src/app/chats/components/item.tsx b/src/app/chats/components/item.tsx index 6ec9bc91..8aecdafd 100644 --- a/src/app/chats/components/item.tsx +++ b/src/app/chats/components/item.tsx @@ -11,7 +11,7 @@ export function ChatsListItem({ pubkey }: { pubkey: string }) { if (status === 'loading') { return ( -
+
@@ -24,7 +24,7 @@ export function ChatsListItem({ pubkey }: { pubkey: string }) { preventScrollReset={true} className={({ isActive }) => twMerge( - 'flex h-10 items-center gap-2.5 rounded-r-lg border-l-2 pl-4 pr-2', + 'flex h-10 items-center gap-2.5 rounded-r-lg border-l-2 pl-4 pr-3', isActive ? 'border-fuchsia-500 bg-white/5 text-white' : 'border-transparent text-white/70' diff --git a/src/app/chats/components/modal.tsx b/src/app/chats/components/modal.tsx index 5a2adce7..53aa5e71 100644 --- a/src/app/chats/components/modal.tsx +++ b/src/app/chats/components/modal.tsx @@ -23,7 +23,7 @@ export function NewMessageModal() { diff --git a/src/shared/icons/index.ts b/src/shared/icons/index.ts index 2c14749b..144c1ab4 100644 --- a/src/shared/icons/index.ts +++ b/src/shared/icons/index.ts @@ -64,3 +64,4 @@ export * from './follows'; export * from './alby'; export * from './stars'; export * from './nwc'; +export * from './timeline'; diff --git a/src/shared/icons/timeline.tsx b/src/shared/icons/timeline.tsx new file mode 100644 index 00000000..52ff870e --- /dev/null +++ b/src/shared/icons/timeline.tsx @@ -0,0 +1,22 @@ +import { SVGProps } from 'react'; + +export function TimeLineIcon(props: JSX.IntrinsicAttributes & SVGProps) { + return ( + + + + ); +} diff --git a/src/shared/logout.tsx b/src/shared/logout.tsx index d5399bf4..d11fad5f 100644 --- a/src/shared/logout.tsx +++ b/src/shared/logout.tsx @@ -3,6 +3,8 @@ import { useNavigate } from 'react-router-dom'; import { useStorage } from '@libs/storage/provider'; +import { LogoutIcon } from '@shared/icons'; + import { useStronghold } from '@stores/stronghold'; export function Logout() { @@ -25,9 +27,9 @@ export function Logout() { diff --git a/src/shared/navigation.tsx b/src/shared/navigation.tsx index a20ca992..9e38bdc7 100644 --- a/src/shared/navigation.tsx +++ b/src/shared/navigation.tsx @@ -4,12 +4,16 @@ import { twMerge } from 'tailwind-merge'; import { ChatsList } from '@app/chats/components/list'; -import { useStorage } from '@libs/storage/provider'; - import { ActiveAccount } from '@shared/accounts/active'; import { ComposerModal } from '@shared/composer'; import { Frame } from '@shared/frame'; -import { BellIcon, NavArrowDownIcon, NwcIcon, SpaceIcon } from '@shared/icons'; +import { + BellIcon, + NavArrowDownIcon, + NwcIcon, + SpaceIcon, + TimeLineIcon, +} from '@shared/icons'; import { useActivities } from '@stores/activities'; import { useSidebar } from '@stores/sidebar'; @@ -17,8 +21,6 @@ import { useSidebar } from '@stores/sidebar'; import { compactNumber } from '@utils/number'; export function Navigation() { - const { db } = useStorage(); - const [totalNewActivities] = useActivities((state) => [state.totalNewActivities]); const [chats, toggleChats] = useSidebar((state) => [state.chats, state.toggleChats]); const [integrations, toggleIntegrations] = useSidebar((state) => [ @@ -28,18 +30,37 @@ export function Navigation() { return ( - {db.platform === 'darwin' ? ( -
- ) : null} -
-
- +
+ +
+
+
+ + twMerge( + 'flex h-10 items-center gap-2.5 rounded-r-lg border-l-2 pl-4 pr-3', + isActive + ? 'border-fuchsia-500 bg-white/5 text-white' + : 'border-transparent text-white/70' + ) + } + > + + + + Timeline + twMerge( - 'flex h-10 items-center gap-2.5 rounded-r-lg border-l-2 pl-4 pr-2', + 'flex h-10 items-center gap-2.5 rounded-r-lg border-l-2 pl-4 pr-3', isActive ? 'border-fuchsia-500 bg-white/5 text-white' : 'border-transparent text-white/70' @@ -56,7 +77,7 @@ export function Navigation() { preventScrollReset={true} className={({ isActive }) => twMerge( - 'flex h-10 items-center justify-between rounded-r-lg border-l-2 pl-4 pr-2', + 'flex h-10 items-center justify-between rounded-r-lg border-l-2 pl-4 pr-3', isActive ? 'border-fuchsia-500 bg-white/5 text-white' : 'border-transparent text-white/70' @@ -81,7 +102,7 @@ export function Navigation() {
-
+