You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.4 KiB
140 lines
4.4 KiB
import { useScreenSize } from '@/providers/ScreenSizeProvider' |
|
import { Ellipsis } from 'lucide-react' |
|
import { Event } from 'nostr-tools' |
|
import { useState, useMemo } from 'react' |
|
import { DesktopMenu } from './DesktopMenu' |
|
import EditOrCloneEventDialog, { type TEditOrCloneMode } from './EditOrCloneEventDialog' |
|
import { MobileMenu } from './MobileMenu' |
|
import RawEventDialog from './RawEventDialog' |
|
import ReportDialog from './ReportDialog' |
|
import { SubMenuAction, useMenuActions } from './useMenuActions' |
|
import PostEditor from '../PostEditor' |
|
import type { HighlightData } from '../PostEditor/HighlightEditor' |
|
|
|
export default function NoteOptions({ |
|
event, |
|
className, |
|
initialHighlightData, |
|
highlightDefaultContent, |
|
isPostEditorOpen, |
|
onPostEditorClose, |
|
onOpenPublicMessage, |
|
initialPublicMessageTo, |
|
onOpenCallInvite, |
|
initialDefaultContent |
|
}: { |
|
event: Event |
|
className?: string |
|
initialHighlightData?: HighlightData |
|
highlightDefaultContent?: string |
|
isPostEditorOpen?: boolean |
|
onPostEditorClose?: () => void |
|
/** Opens the post editor in public message mode with the given pubkey in the mention list. */ |
|
onOpenPublicMessage?: (pubkey: string) => void |
|
/** When set, the post editor is opened in public message mode with this pubkey pre-filled. */ |
|
initialPublicMessageTo?: string | null |
|
/** Opens the post editor with the given content (e.g. call invite URL). */ |
|
onOpenCallInvite?: (url: string) => void |
|
/** Default content when opening the editor (e.g. call invite URL). */ |
|
initialDefaultContent?: string | null |
|
}) { |
|
const { isSmallScreen } = useScreenSize() |
|
const [isRawEventDialogOpen, setIsRawEventDialogOpen] = useState(false) |
|
const [isReportDialogOpen, setIsReportDialogOpen] = useState(false) |
|
const [editCloneOpen, setEditCloneOpen] = useState(false) |
|
const [editCloneMode, setEditCloneMode] = useState<TEditOrCloneMode>('clone') |
|
const [isDrawerOpen, setIsDrawerOpen] = useState(false) |
|
const [showSubMenu, setShowSubMenu] = useState(false) |
|
const [activeSubMenu, setActiveSubMenu] = useState<SubMenuAction[]>([]) |
|
const [subMenuTitle, setSubMenuTitle] = useState('') |
|
|
|
const closeDrawer = () => { |
|
setIsDrawerOpen(false) |
|
setShowSubMenu(false) |
|
} |
|
|
|
const goBackToMainMenu = () => { |
|
setShowSubMenu(false) |
|
} |
|
|
|
const showSubMenuActions = (subMenu: SubMenuAction[], title: string) => { |
|
setActiveSubMenu(subMenu) |
|
setSubMenuTitle(title) |
|
setShowSubMenu(true) |
|
} |
|
|
|
const menuActions = useMenuActions({ |
|
event, |
|
closeDrawer, |
|
showSubMenuActions, |
|
setIsRawEventDialogOpen, |
|
setIsReportDialogOpen, |
|
isSmallScreen, |
|
onOpenPublicMessage, |
|
onOpenCallInvite, |
|
onOpenEditOrClone: (mode) => { |
|
setEditCloneMode(mode) |
|
setEditCloneOpen(true) |
|
} |
|
}) |
|
|
|
const trigger = useMemo( |
|
() => ( |
|
<button |
|
className="flex items-center text-muted-foreground hover:text-foreground pl-2 h-full" |
|
onClick={() => setIsDrawerOpen(true)} |
|
> |
|
<Ellipsis /> |
|
</button> |
|
), |
|
[] |
|
) |
|
|
|
return ( |
|
<div className={className} onClick={(e) => e.stopPropagation()}> |
|
{isSmallScreen ? ( |
|
<MobileMenu |
|
menuActions={menuActions} |
|
trigger={trigger} |
|
isDrawerOpen={isDrawerOpen} |
|
setIsDrawerOpen={setIsDrawerOpen} |
|
showSubMenu={showSubMenu} |
|
activeSubMenu={activeSubMenu} |
|
subMenuTitle={subMenuTitle} |
|
closeDrawer={closeDrawer} |
|
goBackToMainMenu={goBackToMainMenu} |
|
/> |
|
) : ( |
|
<DesktopMenu menuActions={menuActions} trigger={trigger} /> |
|
)} |
|
|
|
<RawEventDialog |
|
event={event} |
|
isOpen={isRawEventDialogOpen} |
|
onClose={() => setIsRawEventDialogOpen(false)} |
|
/> |
|
<ReportDialog |
|
event={event} |
|
isOpen={isReportDialogOpen} |
|
closeDialog={() => setIsReportDialogOpen(false)} |
|
/> |
|
<EditOrCloneEventDialog |
|
open={editCloneOpen} |
|
onOpenChange={setEditCloneOpen} |
|
sourceEvent={event} |
|
mode={editCloneMode} |
|
/> |
|
{onPostEditorClose != null && ( |
|
<PostEditor |
|
open={isPostEditorOpen ?? false} |
|
setOpen={(open) => { |
|
if (!open) onPostEditorClose() |
|
}} |
|
defaultContent={initialDefaultContent ?? highlightDefaultContent ?? ''} |
|
initialHighlightData={initialHighlightData} |
|
initialPublicMessageTo={initialPublicMessageTo ?? undefined} |
|
/> |
|
)} |
|
</div> |
|
) |
|
}
|
|
|