Browse Source

move report issue button on error message to gitrepublic

imwald
Silberengel 1 month ago
parent
commit
a8f71b6a7f
  1. 39
      src/components/ErrorBoundary.tsx
  2. 9
      src/pages/primary/NoteListPage/FollowingFeed.tsx
  3. 20
      src/pages/primary/NoteListPage/index.tsx

39
src/components/ErrorBoundary.tsx

@ -1,11 +1,12 @@ @@ -1,11 +1,12 @@
import { Button } from '@/components/ui/button'
import PostContent from '@/components/PostEditor/PostContent'
import { SILBERENGEL_PUBKEY } from '@/constants'
import { MessageCircle, RotateCw } from 'lucide-react'
import React, { Component, ReactNode } from 'react'
import { toast } from 'sonner'
import logger from '@/lib/logger'
const ISSUES_URL =
'https://gitrepublic.imwald.eu/repos/npub1l5sga6xg72phsz5422ykujprejwud075ggrr3z2hwyrfgr7eylqstegx9z/jumble-imwald-edition?tab=issues'
interface ErrorBoundaryProps {
children: ReactNode
}
@ -13,17 +14,16 @@ interface ErrorBoundaryProps { @@ -13,17 +14,16 @@ interface ErrorBoundaryProps {
interface ErrorBoundaryState {
hasError: boolean
error?: Error
showErrorReportDialog: boolean
}
export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
constructor(props: ErrorBoundaryProps) {
super(props)
this.state = { hasError: false, showErrorReportDialog: false }
this.state = { hasError: false }
}
static getDerivedStateFromError(error: Error) {
return { hasError: true, error, showErrorReportDialog: false }
return { hasError: true, error }
}
componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
@ -36,19 +36,21 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundarySt @@ -36,19 +36,21 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundarySt
<div className="w-screen h-screen flex flex-col items-center justify-center p-4 gap-4">
<h1 className="text-2xl font-bold">Oops, something went wrong.</h1>
<p className="text-lg text-center max-w-md">
Sorry for the inconvenience. You can help by sending me a public message with the error details.
Sorry for the inconvenience. You can help by logging an issue with the error details.
</p>
{this.state.error?.message && (
<>
<div className="flex gap-2">
<Button
onClick={() => {
this.setState({ showErrorReportDialog: true })
}}
className="bg-primary text-primary-foreground"
<Button asChild className="bg-primary text-primary-foreground">
<a
href={ISSUES_URL}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center"
>
<MessageCircle className="w-4 h-4 mr-2" />
Send Error Report
Report issue
</a>
</Button>
<Button
onClick={() => {
@ -69,19 +71,6 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundarySt @@ -69,19 +71,6 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundarySt
<RotateCw className="w-4 h-4 mr-2" />
Reload Page
</Button>
{this.state.showErrorReportDialog && (
<PostContent
defaultContent={`@${SILBERENGEL_PUBKEY} Jumble Error Report:
${this.state.error?.message || 'Unknown error'}
Please help investigate this issue. Thank you!`}
close={() => {
this.setState({ showErrorReportDialog: false })
}}
/>
)}
</div>
)
}

9
src/pages/primary/NoteListPage/FollowingFeed.tsx

@ -3,9 +3,14 @@ import { useFeed } from '@/providers/FeedProvider' @@ -3,9 +3,14 @@ import { useFeed } from '@/providers/FeedProvider'
import { useNostr } from '@/providers/NostrProvider'
import client from '@/services/client.service'
import { TFeedSubRequest } from '@/types'
import type { ReactNode } from 'react'
import { useEffect, useState } from 'react'
export default function FollowingFeed() {
export default function FollowingFeed({
setSubHeader
}: {
setSubHeader?: (node: ReactNode) => void
}) {
const { pubkey } = useNostr()
const { feedInfo } = useFeed()
const [subRequests, setSubRequests] = useState<TFeedSubRequest[]>([])
@ -24,5 +29,5 @@ export default function FollowingFeed() { @@ -24,5 +29,5 @@ export default function FollowingFeed() {
init()
}, [feedInfo.feedType, pubkey])
return <NormalFeed subRequests={subRequests} isMainFeed />
return <NormalFeed subRequests={subRequests} isMainFeed setSubHeader={setSubHeader} />
}

20
src/pages/primary/NoteListPage/index.tsx

@ -13,6 +13,7 @@ import React, { @@ -13,6 +13,7 @@ import React, {
Dispatch,
forwardRef,
SetStateAction,
useCallback,
useEffect,
useImperativeHandle,
useRef,
@ -39,11 +40,18 @@ const NoteListPage = forwardRef((_, ref) => { @@ -39,11 +40,18 @@ const NoteListPage = forwardRef((_, ref) => {
const [homeSubHeader, setHomeSubHeader] = useState<React.ReactNode>(null)
useImperativeHandle(ref, () => layoutRef.current)
// Clear subHeader when switching away from relay/relays/all-favorites feed
const setHomeSubHeaderStable = useCallback((node: React.ReactNode) => {
setHomeSubHeader(node)
}, [])
// Clear subHeader when switching to a feed that doesn't use it (e.g. bookmarks)
useEffect(() => {
const isRelaysFeed =
feedInfo.feedType === 'relay' || feedInfo.feedType === 'relays' || feedInfo.feedType === 'all-favorites'
if (!isRelaysFeed) setHomeSubHeader(null)
const usesSubHeader =
feedInfo.feedType === 'relay' ||
feedInfo.feedType === 'relays' ||
feedInfo.feedType === 'all-favorites' ||
feedInfo.feedType === 'following'
if (!usesSubHeader) setHomeSubHeader(null)
}, [feedInfo.feedType])
// REMOVED: Scroll-to-top logic - feed should NEVER scroll to top when drawer opens/closes
@ -90,14 +98,14 @@ const NoteListPage = forwardRef((_, ref) => { @@ -90,14 +98,14 @@ const NoteListPage = forwardRef((_, ref) => {
content = <BookmarkList />
}
} else if (feedInfo.feedType === 'following') {
content = <FollowingFeed />
content = <FollowingFeed setSubHeader={setHomeSubHeaderStable} />
} else {
content = (
<>
{showRelayDetails && feedInfo.feedType === 'relay' && !!feedInfo.id && (
<RelayInfo url={feedInfo.id!} className="mb-2 pt-3" />
)}
<RelaysFeed setSubHeader={setHomeSubHeader} />
<RelaysFeed setSubHeader={setHomeSubHeaderStable} />
</>
)
}

Loading…
Cancel
Save