diff --git a/components/starRoles/RoleModal.tsx b/components/starRoles/StarRoleModal.tsx similarity index 81% rename from components/starRoles/RoleModal.tsx rename to components/starRoles/StarRoleModal.tsx index 311d8f0..c6f83aa 100644 --- a/components/starRoles/RoleModal.tsx +++ b/components/starRoles/StarRoleModal.tsx @@ -9,12 +9,13 @@ import { IonTitle, IonToolbar, } from '@ionic/react' -import { ComponentProps, ReactNode, useEffect, useRef } from 'react' +import { ComponentProps, MutableRefObject, ReactNode } from 'react' import { StarRole } from '../db' export default function StarRoleModal({ dismiss, title, + titleInput, starRole = {}, toolbarSlot, ...props @@ -22,15 +23,9 @@ export default function StarRoleModal({ dismiss: (data?: any, role?: string) => void title: string starRole?: Partial + titleInput: MutableRefObject toolbarSlot?: ReactNode } & ComponentProps) { - const input = useRef(null) - - // Might cause problems that this runs on every render but seems fine atm... - useEffect(() => { - input.current?.setFocus() - }) - return ( void - title: string -}) { +} & ComponentProps) { return ( { @@ -17,7 +17,7 @@ export function CreateStarRoleModal({ role, ) }} - title={title} + {...props} /> ) } diff --git a/components/starRoles/create/useCreateStarRoleModal.ts b/components/starRoles/create/useCreateStarRoleModal.ts index a391898..1233642 100644 --- a/components/starRoles/create/useCreateStarRoleModal.ts +++ b/components/starRoles/create/useCreateStarRoleModal.ts @@ -1,6 +1,6 @@ import { useIonModal } from '@ionic/react' import { HookOverlayOptions } from '@ionic/react/dist/types/hooks/HookOverlayOptions' -import { useCallback } from 'react' +import { useCallback, useRef } from 'react' import { db } from '../../db' import { CreateStarRoleModal } from './modal' @@ -12,11 +12,12 @@ export function useCreateStarRoleModal(): [ }) => void, (data?: any, role?: string) => void, ] { + const titleInput = useRef(null) const [present, dismiss] = useIonModal(CreateStarRoleModal, { dismiss: (data: string, role: string) => dismiss(data, role), title: 'Create star role', + titleInput, }) - const createStarRole = useCallback(async ({ title }: { title: any }) => { db.starRoles.add({ title }) }, []) @@ -24,6 +25,9 @@ export function useCreateStarRoleModal(): [ return [ ({ onWillDismiss }: HookOverlayOptions) => { present({ + onDidPresent: _event => { + titleInput.current?.setFocus() + }, onWillDismiss: event => { if (event.detail.role === 'confirm') { const { starRole } = event.detail.data diff --git a/components/starRoles/edit/modal.tsx b/components/starRoles/edit/modal.tsx index 8304a79..512385e 100644 --- a/components/starRoles/edit/modal.tsx +++ b/components/starRoles/edit/modal.tsx @@ -1,15 +1,12 @@ -import { StarRole } from '../../db' -import StarRoleModal from '../RoleModal' +import { ComponentProps } from 'react' +import StarRoleModal from '../StarRoleModal' export function EditStarRoleModal({ dismiss, - starRole, - title, + ...props }: { dismiss: (data?: any, role?: string) => void - starRole: StarRole - title: string -}) { +} & ComponentProps) { return ( { @@ -20,8 +17,7 @@ export function EditStarRoleModal({ role, ) }} - starRole={starRole} - title={title} + {...props} /> ) } diff --git a/components/starRoles/edit/useEditStarRoleModal.ts b/components/starRoles/edit/useEditStarRoleModal.ts index 7035bf8..040b7f0 100644 --- a/components/starRoles/edit/useEditStarRoleModal.ts +++ b/components/starRoles/edit/useEditStarRoleModal.ts @@ -1,5 +1,5 @@ import { useIonModal } from '@ionic/react' -import { useCallback, useState } from 'react' +import { useCallback, useRef, useState } from 'react' import { StarRole, db } from '../../db' import { EditStarRoleModal } from './modal' @@ -8,10 +8,12 @@ export function useEditStarRoleModal(): [ (data?: any, role?: string) => void, ] { const [starRole, setStarRole] = useState(null) + const titleInput = useRef(null) const [present, dismiss] = useIonModal(EditStarRoleModal, { dismiss: (data: string, role: string) => dismiss(data, role), starRole, title: 'Edit star role', + titleInput, }) const editStarRole = useCallback(async (updatedStarRole: StarRole) => { @@ -23,6 +25,9 @@ export function useEditStarRoleModal(): [ return [ (starRole: StarRole) => { present({ + onDidPresent: _event => { + titleInput.current?.setFocus() + }, onWillPresent: () => { setStarRole(starRole) }, diff --git a/components/todos/TodoModal.tsx b/components/todos/TodoModal.tsx index 39a1f81..0d579a4 100644 --- a/components/todos/TodoModal.tsx +++ b/components/todos/TodoModal.tsx @@ -16,6 +16,7 @@ import { import { openOutline } from 'ionicons/icons' import { ComponentProps, + MutableRefObject, ReactNode, useCallback, useEffect, @@ -28,26 +29,22 @@ import { useLiveQuery } from 'dexie-react-hooks' export default function TodoModal({ dismiss, title, + titleInput, todo = {}, toolbarSlot, ...props }: { dismiss: (data?: any, role?: string) => void title: string + titleInput: MutableRefObject todo?: Partial toolbarSlot?: ReactNode } & ComponentProps) { const noteInput = useRef(null) const starRoleInput = useRef(null) - const titleInput = useRef(null) const starRoles = useLiveQuery(() => db.starRoles.toArray(), [], []) - // Might cause problems that this runs on every render but seems fine atm... - useEffect(() => { - titleInput.current?.setFocus() - }) - const noteProvider = useNoteProvider() const emitTodo = useCallback(() => { dismiss( @@ -59,7 +56,7 @@ export default function TodoModal({ }, 'confirm', ) - }, [dismiss, todo]) + }, [dismiss, todo, titleInput]) return ( void - title: string -}) { +} & ComponentProps) { const locationSelect = useRef(null) return ( @@ -35,7 +34,6 @@ export function CreateTodoModal({ locationSelect.current!.value = ListType.icebox } }} - title={title} toolbarSlot={ } + {...props} /> ) } diff --git a/components/todos/create/useCreateTodoModal.ts b/components/todos/create/useCreateTodoModal.ts index cf737a6..e1eea44 100644 --- a/components/todos/create/useCreateTodoModal.ts +++ b/components/todos/create/useCreateTodoModal.ts @@ -1,6 +1,6 @@ import { useIonModal } from '@ionic/react' import { HookOverlayOptions } from '@ionic/react/dist/types/hooks/HookOverlayOptions' -import { useCallback } from 'react' +import { useCallback, useRef } from 'react' import { db, ListType, Todo } from '../../db' import useNoteProvider from '../../notes/useNoteProvider' import { CreateTodoModal } from './modal' @@ -13,9 +13,11 @@ export function useCreateTodoModal(): [ }) => void, (data?: any, role?: string) => void, ] { + const titleInput = useRef(null) const [present, dismiss] = useIonModal(CreateTodoModal, { dismiss: (data: string, role: string) => dismiss(data, role), title: 'Create todo', + titleInput, }) const noteProvider = useNoteProvider() @@ -48,6 +50,9 @@ export function useCreateTodoModal(): [ return [ ({ onWillDismiss }: HookOverlayOptions) => { present({ + onDidPresent: _event => { + titleInput.current?.setFocus() + }, onWillDismiss: event => { if (event.detail.role === 'confirm') { const { todo, location } = event.detail.data diff --git a/components/todos/edit/modal.tsx b/components/todos/edit/modal.tsx index 52234d3..d54a279 100644 --- a/components/todos/edit/modal.tsx +++ b/components/todos/edit/modal.tsx @@ -1,24 +1,6 @@ -import { useIonModal } from '@ionic/react' -import { useCallback } from 'react' -import { Todo, db } from '../../db' -import useNoteProvider from '../../notes/useNoteProvider' -import useSelectedTodo from '../SelectedTodo' +import { ComponentProps } from 'react' import TodoModal from '../TodoModal' -export function EditTodoModal({ - dismiss, - title, - todo, -}: { - dismiss: (data?: any, role?: string) => void - title: string - todo: Todo -}) { - return ( - - ) +export function EditTodoModal({ ...props }: ComponentProps) { + return } diff --git a/components/todos/edit/useEditTodoModal.ts b/components/todos/edit/useEditTodoModal.ts index 3e2d996..3e716a1 100644 --- a/components/todos/edit/useEditTodoModal.ts +++ b/components/todos/edit/useEditTodoModal.ts @@ -1,5 +1,5 @@ import { useIonModal } from '@ionic/react' -import { useCallback } from 'react' +import { useCallback, useRef } from 'react' import { Todo, db } from '../../db' import useNoteProvider from '../../notes/useNoteProvider' import useSelectedTodo from '../SelectedTodo' @@ -10,9 +10,11 @@ export function useEditTodoModal(): [ (data?: any, role?: string) => void, ] { const [todo, setTodo] = useSelectedTodo() + const titleInput = useRef(null) const [present, dismiss] = useIonModal(EditTodoModal, { dismiss: (data: string, role: string) => dismiss(data, role), title: 'Edit todo', + titleInput, todo, }) const noteProvider = useNoteProvider() @@ -37,6 +39,9 @@ export function useEditTodoModal(): [ return [ (todo: Todo) => { present({ + onDidPresent: _event => { + titleInput.current?.setFocus() + }, onWillPresent: () => { setTodo(todo) },