Keep input focused and keyboard open after adding tasks
- Added useRef to manage input focus directly - Added useEffect to auto-focus when form becomes visible - Refocus input after successful task creation with setTimeout - Modified handleBlur to preserve focus when keeping form open - Provides seamless continuous task input experience on mobile
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { useState } from 'react'
|
import { useState, useRef, useEffect } from 'react'
|
||||||
import { useRouter } from 'next/navigation'
|
import { useRouter } from 'next/navigation'
|
||||||
import { createItem } from '@/lib/actions'
|
import { createItem } from '@/lib/actions'
|
||||||
import { Plus } from 'lucide-react'
|
import { Plus } from 'lucide-react'
|
||||||
@@ -19,6 +19,19 @@ export default function InlineItemCreate({ listId }: InlineItemCreateProps) {
|
|||||||
const [isSubmitting, setIsSubmitting] = useState(false)
|
const [isSubmitting, setIsSubmitting] = useState(false)
|
||||||
const [error, setError] = useState('')
|
const [error, setError] = useState('')
|
||||||
const [keepFormOpen, setKeepFormOpen] = useState(false)
|
const [keepFormOpen, setKeepFormOpen] = useState(false)
|
||||||
|
const inputRef = useRef<HTMLInputElement>(null)
|
||||||
|
|
||||||
|
// Focus input when form becomes visible
|
||||||
|
useEffect(() => {
|
||||||
|
if ((isCreating || keepFormOpen) && inputRef.current) {
|
||||||
|
// Small delay to ensure the input is rendered
|
||||||
|
setTimeout(() => {
|
||||||
|
if (inputRef.current) {
|
||||||
|
inputRef.current.focus()
|
||||||
|
}
|
||||||
|
}, 50)
|
||||||
|
}
|
||||||
|
}, [isCreating, keepFormOpen])
|
||||||
|
|
||||||
const handleSubmit = async (e: React.FormEvent) => {
|
const handleSubmit = async (e: React.FormEvent) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
@@ -49,6 +62,13 @@ export default function InlineItemCreate({ listId }: InlineItemCreateProps) {
|
|||||||
|
|
||||||
// The revalidatePath in createItem will refresh the data
|
// The revalidatePath in createItem will refresh the data
|
||||||
// but we'll keep the form open due to keepFormOpen state
|
// but we'll keep the form open due to keepFormOpen state
|
||||||
|
|
||||||
|
// Refocus the input after a short delay to keep keyboard open
|
||||||
|
setTimeout(() => {
|
||||||
|
if (inputRef.current) {
|
||||||
|
inputRef.current.focus()
|
||||||
|
}
|
||||||
|
}, 100)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error creating item:', error)
|
console.error('Error creating item:', error)
|
||||||
const errorMessage = error instanceof Error ? error.message : 'Failed to add task'
|
const errorMessage = error instanceof Error ? error.message : 'Failed to add task'
|
||||||
@@ -77,9 +97,13 @@ export default function InlineItemCreate({ listId }: InlineItemCreateProps) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleBlur = () => {
|
const handleBlur = (e: React.FocusEvent) => {
|
||||||
// Force viewport reset on iOS Safari
|
// Only handle blur if we're not keeping the form open
|
||||||
window.scrollTo(0, 0)
|
// This prevents the keyboard from closing when we want it to stay open
|
||||||
|
if (!keepFormOpen) {
|
||||||
|
// Force viewport reset on iOS Safari
|
||||||
|
window.scrollTo(0, 0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isCreating && !keepFormOpen) {
|
if (!isCreating && !keepFormOpen) {
|
||||||
@@ -98,6 +122,7 @@ export default function InlineItemCreate({ listId }: InlineItemCreateProps) {
|
|||||||
<form onSubmit={handleSubmit} className="bg-white border-2 border-blue-400 rounded-lg p-4 sm:p-5 shadow-sm">
|
<form onSubmit={handleSubmit} className="bg-white border-2 border-blue-400 rounded-lg p-4 sm:p-5 shadow-sm">
|
||||||
<div className="mb-3 sm:mb-4">
|
<div className="mb-3 sm:mb-4">
|
||||||
<input
|
<input
|
||||||
|
ref={inputRef}
|
||||||
type="text"
|
type="text"
|
||||||
value={title}
|
value={title}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user