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.
49 lines
1.3 KiB
49 lines
1.3 KiB
import type { Event } from 'nostr-tools' |
|
|
|
class PostEditorService extends EventTarget { |
|
static instance: PostEditorService |
|
|
|
isSuggestionPopupOpen = false |
|
/** Ref-count of open PostEditor / Sheet shells (reply, new post, etc.). */ |
|
private composerShellOpenCount = 0 |
|
|
|
get isComposerShellOpen(): boolean { |
|
return this.composerShellOpenCount > 0 |
|
} |
|
|
|
setComposerShellOpen(open: boolean) { |
|
if (open) { |
|
this.composerShellOpenCount += 1 |
|
} else { |
|
this.composerShellOpenCount = Math.max(0, this.composerShellOpenCount - 1) |
|
} |
|
} |
|
|
|
constructor() { |
|
super() |
|
if (!PostEditorService.instance) { |
|
PostEditorService.instance = this |
|
} |
|
return PostEditorService.instance |
|
} |
|
|
|
closeSuggestionPopup() { |
|
this.isSuggestionPopupOpen = false |
|
this.dispatchEvent(new CustomEvent('closeSuggestionPopup')) |
|
} |
|
|
|
/** Opens the main “new note” composer (same as sidebar / write button). Listeners run login check. */ |
|
requestOpenNewPost() { |
|
this.dispatchEvent(new CustomEvent('requestOpenNewPost')) |
|
} |
|
|
|
/** Parent note when replying — used by @-mention search to surface thread participants. */ |
|
replyParentEvent?: Event |
|
|
|
setReplyParentEvent(event?: Event) { |
|
this.replyParentEvent = event |
|
} |
|
} |
|
|
|
const instance = new PostEditorService() |
|
export default instance
|
|
|