elk/composables/dialog.ts

165 lines
4.9 KiB
TypeScript
Raw Permalink Normal View History

2023-01-08 06:21:09 +00:00
import type { mastodon } from 'masto'
import type { ConfirmDialogChoice, ConfirmDialogOptions, DraftItem, ErrorDialogData } from '~/types'
import { STORAGE_KEY_FIRST_VISIT } from '~/constants'
2022-11-24 02:38:14 +00:00
export const confirmDialogChoice = ref<ConfirmDialogChoice>()
export const confirmDialogLabel = ref<ConfirmDialogOptions>()
export const errorDialogData = ref<ErrorDialogData>()
2023-01-08 06:21:09 +00:00
export const mediaPreviewList = ref<mastodon.v1.MediaAttachment[]>([])
2022-11-30 03:27:19 +00:00
export const mediaPreviewIndex = ref(0)
2023-01-08 06:21:09 +00:00
export const statusEdit = ref<mastodon.v1.StatusEdit>()
export const dialogDraftKey = ref<string>()
2022-11-30 03:27:19 +00:00
2023-06-23 13:24:10 +01:00
export const reportAccount = ref<mastodon.v1.Account>()
export const reportStatus = ref<mastodon.v1.Status>()
2022-12-09 21:18:21 +00:00
export const commandPanelInput = ref('')
export const isFirstVisit = useLocalStorage(STORAGE_KEY_FIRST_VISIT, !process.mock)
2022-11-24 02:38:14 +00:00
2022-11-23 03:48:01 +00:00
export const isSigninDialogOpen = ref(false)
2022-11-24 08:04:53 +00:00
export const isPublishDialogOpen = ref(false)
2023-03-07 19:32:21 +00:00
export const isKeyboardShortcutsDialogOpen = ref(false)
2022-11-30 03:27:19 +00:00
export const isMediaPreviewOpen = ref(false)
2022-11-26 05:05:44 +00:00
export const isEditHistoryDialogOpen = ref(false)
2022-11-24 02:38:14 +00:00
export const isPreviewHelpOpen = ref(isFirstVisit.value)
2022-12-09 21:18:21 +00:00
export const isCommandPanelOpen = ref(false)
export const isConfirmDialogOpen = ref(false)
export const isErrorDialogOpen = ref(false)
export const isFavouritedBoostedByDialogOpen = ref(false)
2023-06-23 13:24:10 +01:00
export const isReportDialogOpen = ref(false)
2022-11-23 03:48:01 +00:00
2023-01-08 06:21:09 +00:00
export const lastPublishDialogStatus = ref<mastodon.v1.Status | null>(null)
export const favouritedBoostedByStatusId = ref<string | null>(null)
2022-11-23 03:48:01 +00:00
export function openSigninDialog() {
isSigninDialogOpen.value = true
}
2022-11-24 02:38:14 +00:00
export async function openConfirmDialog(label: ConfirmDialogOptions | string): Promise<ConfirmDialogChoice> {
confirmDialogLabel.value = typeof label === 'string' ? { title: label } : label
confirmDialogChoice.value = undefined
isConfirmDialogOpen.value = true
await until(isConfirmDialogOpen).toBe(false)
return confirmDialogChoice.value!
}
export async function openPublishDialog(draftKey = 'dialog', draft?: DraftItem, overwrite = false): Promise<void> {
dialogDraftKey.value = draftKey
2022-11-28 17:46:00 +00:00
if (draft) {
if (overwrite && !isEmptyDraft(currentUserDrafts.value[draftKey])) {
// TODO overwrite warning
// TODO don't overwrite, have a draft list
2024-02-24 16:46:14 +00:00
if (import.meta.dev) {
2022-11-28 17:46:00 +00:00
// eslint-disable-next-line no-alert
const result = confirm('[DEV] Are you sure you overwrite draft content?')
if (!result)
return
}
}
if (overwrite || !currentUserDrafts.value[draftKey])
currentUserDrafts.value[draftKey] = [draft]
}
2022-11-24 08:04:53 +00:00
isPublishDialogOpen.value = true
await until(isPublishDialogOpen).toBe(false)
2022-11-24 08:04:53 +00:00
}
export async function openFavoridedBoostedByDialog(statusId: string) {
isFavouritedBoostedByDialogOpen.value = true
favouritedBoostedByStatusId.value = statusId
}
2022-11-24 02:38:14 +00:00
if (isPreviewHelpOpen.value) {
watch(isPreviewHelpOpen, () => {
isFirstVisit.value = false
})
}
function restoreMediaPreviewFromState() {
mediaPreviewList.value = JSON.parse(history.state?.mediaPreviewList ?? '[]')
mediaPreviewIndex.value = history.state?.mediaPreviewIndex ?? 0
isMediaPreviewOpen.value = history.state?.mediaPreview ?? false
}
2024-02-24 16:46:14 +00:00
if (import.meta.client) {
window.addEventListener('popstate', restoreMediaPreviewFromState)
restoreMediaPreviewFromState()
}
2023-01-08 06:21:09 +00:00
export function openMediaPreview(attachments: mastodon.v1.MediaAttachment[], index = 0) {
2022-11-30 03:27:19 +00:00
mediaPreviewList.value = attachments
mediaPreviewIndex.value = index
isMediaPreviewOpen.value = true
history.pushState({
...history.state,
mediaPreview: true,
mediaPreviewList: JSON.stringify(attachments),
mediaPreviewIndex: index,
}, '')
2022-11-30 03:27:19 +00:00
}
export async function openErrorDialog(data: ErrorDialogData) {
errorDialogData.value = data
isErrorDialogOpen.value = true
await until(isErrorDialogOpen).toBe(false)
}
export function closeErrorDialog() {
isErrorDialogOpen.value = false
}
2022-11-30 03:27:19 +00:00
export function closeMediaPreview() {
history.back()
}
2023-01-08 06:21:09 +00:00
export function openEditHistoryDialog(edit: mastodon.v1.StatusEdit) {
2022-11-26 05:05:44 +00:00
statusEdit.value = edit
isEditHistoryDialogOpen.value = true
}
export function openPreviewHelp() {
isPreviewHelpOpen.value = true
}
2022-11-27 03:13:39 +00:00
export function closePreviewHelp() {
isPreviewHelpOpen.value = false
}
2022-12-09 21:18:21 +00:00
export function openCommandPanel(isCommandMode = false) {
2023-01-10 07:24:14 +00:00
commandPanelInput.value = isCommandMode ? '> ' : ''
2022-12-09 21:18:21 +00:00
isCommandPanelOpen.value = true
}
export function closeCommandPanel() {
isCommandPanelOpen.value = false
}
2023-03-07 19:32:21 +00:00
export function toggleKeyboardShortcuts() {
isKeyboardShortcutsDialogOpen.value = !isKeyboardShortcutsDialogOpen.value
}
export function closeKeyboardShortcuts() {
isKeyboardShortcutsDialogOpen.value = false
}
2023-06-23 13:24:10 +01:00
export function openReportDialog(account: mastodon.v1.Account, status?: mastodon.v1.Status) {
reportAccount.value = account
reportStatus.value = status
isReportDialogOpen.value = true
}
export function closeReportDialog() {
isReportDialogOpen.value = false
}