feat: prompt for mobile note titles
This commit is contained in:
64
apps/mobile/src/useMobileNoteCreateFlow.ts
Normal file
64
apps/mobile/src/useMobileNoteCreateFlow.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
import { useCallback, useState } from 'react'
|
||||
import type { MobileNote } from './demoData'
|
||||
|
||||
export function useMobileNoteCreateFlow({
|
||||
createNote,
|
||||
onCreated,
|
||||
}: {
|
||||
createNote: (title: string) => Promise<MobileNote | null>
|
||||
onCreated: (note: MobileNote) => void
|
||||
}) {
|
||||
const [failed, setFailed] = useState(false)
|
||||
const [isCreating, setIsCreating] = useState(false)
|
||||
const [isPromptOpen, setIsPromptOpen] = useState(false)
|
||||
const [title, setTitle] = useState('')
|
||||
|
||||
const cancel = useCallback(() => {
|
||||
if (isCreating) {
|
||||
return
|
||||
}
|
||||
|
||||
setFailed(false)
|
||||
setIsPromptOpen(false)
|
||||
setTitle('')
|
||||
}, [isCreating])
|
||||
|
||||
const open = useCallback(() => {
|
||||
setFailed(false)
|
||||
setIsPromptOpen(true)
|
||||
}, [])
|
||||
|
||||
const submit = useCallback(() => {
|
||||
if (isCreating) {
|
||||
return
|
||||
}
|
||||
|
||||
setFailed(false)
|
||||
setIsCreating(true)
|
||||
void createNote(title)
|
||||
.then((note) => {
|
||||
if (note) {
|
||||
setIsPromptOpen(false)
|
||||
setTitle('')
|
||||
onCreated(note)
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
setFailed(true)
|
||||
})
|
||||
.finally(() => {
|
||||
setIsCreating(false)
|
||||
})
|
||||
}, [createNote, isCreating, onCreated, title])
|
||||
|
||||
return {
|
||||
cancel,
|
||||
failed,
|
||||
isCreating,
|
||||
isPromptOpen,
|
||||
open,
|
||||
setTitle,
|
||||
submit,
|
||||
title,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user