refactor(notes): extract title validation into domain service
This commit is contained in:
1 parent
557e48116a
commit
5aeeb21f7f
3 files changed
+37
-3
No files matched your search
@@ -3,6 +3,7 @@ import type {
|
|||||||
NoteEditorProps,
|
NoteEditorProps,
|
||||||
NoteFormProps,
|
NoteFormProps,
|
||||||
} from '../interfaces/note-editor'
|
} from '../interfaces/note-editor'
|
||||||
|
import { isTitleValid, normalizeTitle } from '../lib/noteValidation'
|
||||||
import DeleteModal from './DeleteModal'
|
import DeleteModal from './DeleteModal'
|
||||||
|
|
||||||
const TITLE_REQUIRED_MESSAGE = 'Le titre est obligatoire.'
|
const TITLE_REQUIRED_MESSAGE = 'Le titre est obligatoire.'
|
||||||
@@ -82,15 +83,15 @@ function NoteEditor(props: NoteEditorProps) {
|
|||||||
|
|
||||||
const handleTitleChange = (value: string) => {
|
const handleTitleChange = (value: string) => {
|
||||||
setTitle(value)
|
setTitle(value)
|
||||||
if (titleMissing && value.trim() !== '') setTitleMissing(false)
|
if (titleMissing && isTitleValid(value)) setTitleMissing(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleSubmit = () => {
|
const handleSubmit = () => {
|
||||||
if (title.trim() === '') {
|
if (!isTitleValid(title)) {
|
||||||
setTitleMissing(true)
|
setTitleMissing(true)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const safeTitle = title.trim()
|
const safeTitle = normalizeTitle(title)
|
||||||
if (props.mode === 'create') {
|
if (props.mode === 'create') {
|
||||||
props.onCreate(safeTitle, content)
|
props.onCreate(safeTitle, content)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import { describe, expect, it } from 'vitest'
|
||||||
|
import { isTitleValid, normalizeTitle } from './noteValidation'
|
||||||
|
|
||||||
|
describe('isTitleValid', () => {
|
||||||
|
it('accepts a non-empty title', () => {
|
||||||
|
expect(isTitleValid('Courses')).toBe(true)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('rejects an empty title', () => {
|
||||||
|
expect(isTitleValid('')).toBe(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('rejects a whitespace-only title', () => {
|
||||||
|
expect(isTitleValid(' ')).toBe(false)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('normalizeTitle', () => {
|
||||||
|
it('trims surrounding whitespace', () => {
|
||||||
|
expect(normalizeTitle(' Courses ')).toBe('Courses')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('keeps an already trimmed title unchanged', () => {
|
||||||
|
expect(normalizeTitle('Courses')).toBe('Courses')
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
export function isTitleValid(title: string): boolean {
|
||||||
|
return title.trim().length > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
export function normalizeTitle(title: string): string {
|
||||||
|
return title.trim()
|
||||||
|
}
|
||||||
Reference in new issue
Block a user