fix: some 🐛
This commit is contained in:
parent
a264b747e7
commit
7c34042da3
11 changed files with 27 additions and 69 deletions
10
package-lock.json
generated
10
package-lock.json
generated
|
|
@ -41,7 +41,6 @@
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"react-i18next": "^15.2.0",
|
"react-i18next": "^15.2.0",
|
||||||
"react-resizable-panels": "^2.1.7",
|
|
||||||
"react-simple-pull-to-refresh": "^1.3.3",
|
"react-simple-pull-to-refresh": "^1.3.3",
|
||||||
"react-string-replace": "^1.1.1",
|
"react-string-replace": "^1.1.1",
|
||||||
"tailwind-merge": "^2.5.5",
|
"tailwind-merge": "^2.5.5",
|
||||||
|
|
@ -7562,15 +7561,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/react-resizable-panels": {
|
|
||||||
"version": "2.1.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.7.tgz",
|
|
||||||
"integrity": "sha512-JtT6gI+nURzhMYQYsx8DKkx6bSoOGFp7A3CwMrOb8y5jFHFyqwo9m68UhmXRw57fRVJksFn1TSlm3ywEQ9vMgA==",
|
|
||||||
"peerDependencies": {
|
|
||||||
"react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc",
|
|
||||||
"react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/react-simple-pull-to-refresh": {
|
"node_modules/react-simple-pull-to-refresh": {
|
||||||
"version": "1.3.3",
|
"version": "1.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/react-simple-pull-to-refresh/-/react-simple-pull-to-refresh-1.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/react-simple-pull-to-refresh/-/react-simple-pull-to-refresh-1.3.3.tgz",
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,6 @@
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"react-i18next": "^15.2.0",
|
"react-i18next": "^15.2.0",
|
||||||
"react-resizable-panels": "^2.1.7",
|
|
||||||
"react-simple-pull-to-refresh": "^1.3.3",
|
"react-simple-pull-to-refresh": "^1.3.3",
|
||||||
"react-string-replace": "^1.1.1",
|
"react-string-replace": "^1.1.1",
|
||||||
"tailwind-merge": "^2.5.5",
|
"tailwind-merge": "^2.5.5",
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import Sidebar from '@/components/Sidebar'
|
import Sidebar from '@/components/Sidebar'
|
||||||
import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@/components/ui/resizable'
|
|
||||||
import { Separator } from '@/components/ui/separator'
|
import { Separator } from '@/components/ui/separator'
|
||||||
import { cn } from '@/lib/utils'
|
import { cn } from '@/lib/utils'
|
||||||
import NoteListPage from '@/pages/primary/NoteListPage'
|
import NoteListPage from '@/pages/primary/NoteListPage'
|
||||||
|
|
@ -268,11 +267,12 @@ export function PageManager({ maxStackSize = 5 }: { maxStackSize?: number }) {
|
||||||
<div className="flex h-screen overflow-hidden">
|
<div className="flex h-screen overflow-hidden">
|
||||||
<Sidebar />
|
<Sidebar />
|
||||||
<Separator orientation="vertical" />
|
<Separator orientation="vertical" />
|
||||||
<ResizablePanelGroup direction="horizontal">
|
<div className="grid grid-cols-2 w-full">
|
||||||
<ResizablePanel minSize={30}>
|
<div className="flex">
|
||||||
{primaryPages.map(({ name, element }) => (
|
{primaryPages.map(({ name, element }) => (
|
||||||
<div
|
<div
|
||||||
key={name}
|
key={name}
|
||||||
|
className="w-full"
|
||||||
style={{
|
style={{
|
||||||
display: currentPrimaryPage === name ? 'block' : 'none'
|
display: currentPrimaryPage === name ? 'block' : 'none'
|
||||||
}}
|
}}
|
||||||
|
|
@ -280,9 +280,9 @@ export function PageManager({ maxStackSize = 5 }: { maxStackSize?: number }) {
|
||||||
{element}
|
{element}
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</ResizablePanel>
|
<Separator orientation="vertical" className="z-50" />
|
||||||
<ResizableHandle />
|
</div>
|
||||||
<ResizablePanel minSize={30}>
|
<div>
|
||||||
{secondaryStack.length ? (
|
{secondaryStack.length ? (
|
||||||
secondaryStack.map((item, index) => (
|
secondaryStack.map((item, index) => (
|
||||||
<div
|
<div
|
||||||
|
|
@ -295,8 +295,8 @@ export function PageManager({ maxStackSize = 5 }: { maxStackSize?: number }) {
|
||||||
) : (
|
) : (
|
||||||
<HomePage />
|
<HomePage />
|
||||||
)}
|
)}
|
||||||
</ResizablePanel>
|
</div>
|
||||||
</ResizablePanelGroup>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</SecondaryPageContext.Provider>
|
</SecondaryPageContext.Provider>
|
||||||
</PrimaryPageContext.Provider>
|
</PrimaryPageContext.Provider>
|
||||||
|
|
|
||||||
|
|
@ -86,14 +86,14 @@ function AccountManagerNav({
|
||||||
}}
|
}}
|
||||||
className="w-full mt-4"
|
className="w-full mt-4"
|
||||||
>
|
>
|
||||||
{t('Signup with Nstart wizard')}
|
{t('Sign up')}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant="link"
|
variant="link"
|
||||||
onClick={() => setPage('generate')}
|
onClick={() => setPage('generate')}
|
||||||
className="w-full text-muted-foreground py-0 h-fit mt-1"
|
className="w-full text-muted-foreground py-0 h-fit mt-1"
|
||||||
>
|
>
|
||||||
{t('or generate your private key here')}
|
{t('or simply generate a private key')}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
{accounts.length > 0 && (
|
{accounts.length > 0 && (
|
||||||
|
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
import { GripVertical } from 'lucide-react'
|
|
||||||
import * as ResizablePrimitive from 'react-resizable-panels'
|
|
||||||
|
|
||||||
import { cn } from '@/lib/utils'
|
|
||||||
|
|
||||||
const ResizablePanelGroup = ({
|
|
||||||
className,
|
|
||||||
...props
|
|
||||||
}: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) => (
|
|
||||||
<ResizablePrimitive.PanelGroup
|
|
||||||
className={cn('flex h-full w-full data-[panel-group-direction=vertical]:flex-col', className)}
|
|
||||||
{...props}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
|
|
||||||
const ResizablePanel = ResizablePrimitive.Panel
|
|
||||||
|
|
||||||
const ResizableHandle = ({
|
|
||||||
withHandle,
|
|
||||||
className,
|
|
||||||
...props
|
|
||||||
}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {
|
|
||||||
withHandle?: boolean
|
|
||||||
}) => (
|
|
||||||
<ResizablePrimitive.PanelResizeHandle
|
|
||||||
className={cn(
|
|
||||||
'relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90',
|
|
||||||
className
|
|
||||||
)}
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
{withHandle && (
|
|
||||||
<div className="z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border">
|
|
||||||
<GripVertical className="h-2.5 w-2.5" />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</ResizablePrimitive.PanelResizeHandle>
|
|
||||||
)
|
|
||||||
|
|
||||||
export { ResizablePanelGroup, ResizablePanel, ResizableHandle }
|
|
||||||
|
|
@ -132,7 +132,7 @@ export default {
|
||||||
'read & write relays notice':
|
'read & write relays notice':
|
||||||
'The number of read and write servers should ideally be kept between 2 and 4.',
|
'The number of read and write servers should ideally be kept between 2 and 4.',
|
||||||
"Don't have an account yet?": "Don't have an account yet?",
|
"Don't have an account yet?": "Don't have an account yet?",
|
||||||
'or generate your private key here': 'or generate your private key here',
|
'or simply generate a private key': 'or simply generate a private key',
|
||||||
'This is a private key. Do not share it with anyone. Keep it safe and secure. You will not be able to recover it if you lose it.':
|
'This is a private key. Do not share it with anyone. Keep it safe and secure. You will not be able to recover it if you lose it.':
|
||||||
'This is a private key. Do not share it with anyone. Keep it safe and secure. You will not be able to recover it if you lose it.',
|
'This is a private key. Do not share it with anyone. Keep it safe and secure. You will not be able to recover it if you lose it.',
|
||||||
Edit: 'Edit',
|
Edit: 'Edit',
|
||||||
|
|
@ -146,7 +146,7 @@ export default {
|
||||||
Back: 'Back',
|
Back: 'Back',
|
||||||
'optional: encrypt nsec': 'optional: encrypt nsec',
|
'optional: encrypt nsec': 'optional: encrypt nsec',
|
||||||
password: 'password',
|
password: 'password',
|
||||||
'Signup with Nstart wizard': 'Signup with Nstart wizard',
|
'Sign up': 'Sign up',
|
||||||
'Save to': 'Save to',
|
'Save to': 'Save to',
|
||||||
'Enter a name for the new relay set': 'Enter a name for the new relay set',
|
'Enter a name for the new relay set': 'Enter a name for the new relay set',
|
||||||
'Save to a new relay set': 'Save to a new relay set',
|
'Save to a new relay set': 'Save to a new relay set',
|
||||||
|
|
|
||||||
|
|
@ -132,7 +132,7 @@ export default {
|
||||||
'写服务器用于发布您的事件。其他用户会从您的写服务器寻找您发布的事件。',
|
'写服务器用于发布您的事件。其他用户会从您的写服务器寻找您发布的事件。',
|
||||||
'read & write relays notice': '读服务器和写服务器的数量都应尽量保持在 2 到 4 个之间。',
|
'read & write relays notice': '读服务器和写服务器的数量都应尽量保持在 2 到 4 个之间。',
|
||||||
"Don't have an account yet?": '还没有账户?',
|
"Don't have an account yet?": '还没有账户?',
|
||||||
'or generate your private key here': '或者直接生成私钥',
|
'or simply generate a private key': '或者简单生成一个私钥',
|
||||||
'This is a private key. Do not share it with anyone. Keep it safe and secure. You will not be able to recover it if you lose it.':
|
'This is a private key. Do not share it with anyone. Keep it safe and secure. You will not be able to recover it if you lose it.':
|
||||||
'这是私钥,请勿与他人分享。请妥善保管,否则将无法找回。',
|
'这是私钥,请勿与他人分享。请妥善保管,否则将无法找回。',
|
||||||
Edit: '编辑',
|
Edit: '编辑',
|
||||||
|
|
@ -147,7 +147,7 @@ export default {
|
||||||
'password (optional): encrypt nsec': '密码 (可选): 加密 nsec',
|
'password (optional): encrypt nsec': '密码 (可选): 加密 nsec',
|
||||||
'optional: encrypt nsec': '可选: 加密 nsec',
|
'optional: encrypt nsec': '可选: 加密 nsec',
|
||||||
password: '密码',
|
password: '密码',
|
||||||
'Signup with Nstart wizard': '使用 Nstart 向导注册',
|
'Sign up': '注册',
|
||||||
'Save to': '保存到',
|
'Save to': '保存到',
|
||||||
'Enter a name for the new relay set': '输入新服务器组的名称',
|
'Enter a name for the new relay set': '输入新服务器组的名称',
|
||||||
'Save to a new relay set': '保存到新服务器组',
|
'Save to a new relay set': '保存到新服务器组',
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ const PrimaryPageLayout = forwardRef(
|
||||||
<DeepBrowsingProvider active={current === pageName} scrollAreaRef={scrollAreaRef}>
|
<DeepBrowsingProvider active={current === pageName} scrollAreaRef={scrollAreaRef}>
|
||||||
<ScrollArea
|
<ScrollArea
|
||||||
className="h-screen overflow-auto"
|
className="h-screen overflow-auto"
|
||||||
scrollBarClassName="z-50"
|
scrollBarClassName="z-20 pt-12"
|
||||||
ref={scrollAreaRef}
|
ref={scrollAreaRef}
|
||||||
>
|
>
|
||||||
{titlebar && <PrimaryPageTitlebar>{titlebar}</PrimaryPageTitlebar>}
|
{titlebar && <PrimaryPageTitlebar>{titlebar}</PrimaryPageTitlebar>}
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ const SecondaryPageLayout = forwardRef(
|
||||||
<DeepBrowsingProvider active={currentIndex === index} scrollAreaRef={scrollAreaRef}>
|
<DeepBrowsingProvider active={currentIndex === index} scrollAreaRef={scrollAreaRef}>
|
||||||
<ScrollArea
|
<ScrollArea
|
||||||
className="h-screen overflow-auto"
|
className="h-screen overflow-auto"
|
||||||
scrollBarClassName="sm:z-50"
|
scrollBarClassName="z-20 pt-12"
|
||||||
ref={scrollAreaRef}
|
ref={scrollAreaRef}
|
||||||
>
|
>
|
||||||
<SecondaryPageTitlebar
|
<SecondaryPageTitlebar
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ export function DeepBrowsingProvider({
|
||||||
const lastScrollTopRef = useRef(
|
const lastScrollTopRef = useRef(
|
||||||
(!scrollAreaRef ? window.scrollY : scrollAreaRef.current?.scrollTop) || 0
|
(!scrollAreaRef ? window.scrollY : scrollAreaRef.current?.scrollTop) || 0
|
||||||
)
|
)
|
||||||
|
const [lastScrollTop, setLastScrollTop] = useState(lastScrollTopRef.current)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setDeepBrowsing(false)
|
setDeepBrowsing(false)
|
||||||
|
|
@ -48,6 +49,7 @@ export function DeepBrowsingProvider({
|
||||||
const scrollTop = (!scrollAreaRef ? window.scrollY : scrollAreaRef.current?.scrollTop) || 0
|
const scrollTop = (!scrollAreaRef ? window.scrollY : scrollAreaRef.current?.scrollTop) || 0
|
||||||
const diff = scrollTop - lastScrollTopRef.current
|
const diff = scrollTop - lastScrollTopRef.current
|
||||||
lastScrollTopRef.current = scrollTop
|
lastScrollTopRef.current = scrollTop
|
||||||
|
setLastScrollTop(scrollTop)
|
||||||
if (scrollTop <= 800) {
|
if (scrollTop <= 800) {
|
||||||
setDeepBrowsing(false)
|
setDeepBrowsing(false)
|
||||||
return
|
return
|
||||||
|
|
@ -74,7 +76,7 @@ export function DeepBrowsingProvider({
|
||||||
}, [active])
|
}, [active])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DeepBrowsingContext.Provider value={{ deepBrowsing, lastScrollTop: lastScrollTopRef.current }}>
|
<DeepBrowsingContext.Provider value={{ deepBrowsing, lastScrollTop }}>
|
||||||
{children}
|
{children}
|
||||||
</DeepBrowsingContext.Provider>
|
</DeepBrowsingContext.Provider>
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import { BIG_RELAY_URLS } from '@/constants'
|
import { BIG_RELAY_URLS } from '@/constants'
|
||||||
import { isWebsocketUrl, normalizeUrl } from '@/lib/url'
|
import { isWebsocketUrl, normalizeUrl } from '@/lib/url'
|
||||||
|
import client from '@/services/client.service'
|
||||||
import storage from '@/services/storage.service'
|
import storage from '@/services/storage.service'
|
||||||
import { TFeedType } from '@/types'
|
import { TFeedType } from '@/types'
|
||||||
import { Filter } from 'nostr-tools'
|
import { Filter } from 'nostr-tools'
|
||||||
|
|
@ -37,6 +38,7 @@ export function FeedProvider({ children }: { children: React.ReactNode }) {
|
||||||
const { getFollowings } = useFollowList()
|
const { getFollowings } = useFollowList()
|
||||||
const { relaySets } = useRelaySets()
|
const { relaySets } = useRelaySets()
|
||||||
const feedTypeRef = useRef<TFeedType>(storage.getFeedType())
|
const feedTypeRef = useRef<TFeedType>(storage.getFeedType())
|
||||||
|
const [feedType, setFeedType] = useState<TFeedType>(feedTypeRef.current)
|
||||||
const [relayUrls, setRelayUrls] = useState<string[]>([])
|
const [relayUrls, setRelayUrls] = useState<string[]>([])
|
||||||
const [temporaryRelayUrls, setTemporaryRelayUrls] = useState<string[]>([])
|
const [temporaryRelayUrls, setTemporaryRelayUrls] = useState<string[]>([])
|
||||||
const [filter, setFilter] = useState<Filter>({})
|
const [filter, setFilter] = useState<Filter>({})
|
||||||
|
|
@ -93,11 +95,13 @@ export function FeedProvider({ children }: { children: React.ReactNode }) {
|
||||||
(relaySets.length > 0 ? relaySets[0] : null)
|
(relaySets.length > 0 ? relaySets[0] : null)
|
||||||
if (relaySet) {
|
if (relaySet) {
|
||||||
feedTypeRef.current = feedType
|
feedTypeRef.current = feedType
|
||||||
|
setFeedType(feedType)
|
||||||
setRelayUrls(relaySet.relayUrls)
|
setRelayUrls(relaySet.relayUrls)
|
||||||
setActiveRelaySetId(relaySet.id)
|
setActiveRelaySetId(relaySet.id)
|
||||||
setFilter({})
|
setFilter({})
|
||||||
storage.setActiveRelaySetId(relaySet.id)
|
storage.setActiveRelaySetId(relaySet.id)
|
||||||
storage.setFeedType(feedType)
|
storage.setFeedType(feedType)
|
||||||
|
client.setCurrentRelayUrls(relaySet.relayUrls)
|
||||||
}
|
}
|
||||||
return setIsReady(true)
|
return setIsReady(true)
|
||||||
}
|
}
|
||||||
|
|
@ -106,6 +110,7 @@ export function FeedProvider({ children }: { children: React.ReactNode }) {
|
||||||
return setIsReady(true)
|
return setIsReady(true)
|
||||||
}
|
}
|
||||||
feedTypeRef.current = feedType
|
feedTypeRef.current = feedType
|
||||||
|
setFeedType(feedType)
|
||||||
setActiveRelaySetId(null)
|
setActiveRelaySetId(null)
|
||||||
const [relayList, followings] = await Promise.all([
|
const [relayList, followings] = await Promise.all([
|
||||||
getRelayList(options.pubkey),
|
getRelayList(options.pubkey),
|
||||||
|
|
@ -125,10 +130,12 @@ export function FeedProvider({ children }: { children: React.ReactNode }) {
|
||||||
}
|
}
|
||||||
|
|
||||||
feedTypeRef.current = feedType
|
feedTypeRef.current = feedType
|
||||||
|
setFeedType(feedType)
|
||||||
setTemporaryRelayUrls(urls)
|
setTemporaryRelayUrls(urls)
|
||||||
setRelayUrls(urls)
|
setRelayUrls(urls)
|
||||||
setActiveRelaySetId(null)
|
setActiveRelaySetId(null)
|
||||||
setFilter({})
|
setFilter({})
|
||||||
|
client.setCurrentRelayUrls(urls)
|
||||||
return setIsReady(true)
|
return setIsReady(true)
|
||||||
}
|
}
|
||||||
setIsReady(true)
|
setIsReady(true)
|
||||||
|
|
@ -137,7 +144,7 @@ export function FeedProvider({ children }: { children: React.ReactNode }) {
|
||||||
return (
|
return (
|
||||||
<FeedContext.Provider
|
<FeedContext.Provider
|
||||||
value={{
|
value={{
|
||||||
feedType: feedTypeRef.current,
|
feedType,
|
||||||
relayUrls,
|
relayUrls,
|
||||||
temporaryRelayUrls,
|
temporaryRelayUrls,
|
||||||
filter,
|
filter,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue