Show API save errors in RoomModal footer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -49,9 +49,10 @@ interface RoomModalProps {
|
|||||||
categories?: { id: string; name: string }[]
|
categories?: { id: string; name: string }[]
|
||||||
onClose: () => void
|
onClose: () => void
|
||||||
onSave: (room: Room) => void
|
onSave: (room: Room) => void
|
||||||
|
error?: string | null
|
||||||
}
|
}
|
||||||
|
|
||||||
export function RoomModal({ open, room, categories = [], onClose, onSave }: RoomModalProps) {
|
export function RoomModal({ open, room, categories = [], onClose, onSave, error }: RoomModalProps) {
|
||||||
const isEdit = !!room
|
const isEdit = !!room
|
||||||
const [tab, setTab] = useState<ModalTab>('main')
|
const [tab, setTab] = useState<ModalTab>('main')
|
||||||
|
|
||||||
@@ -164,6 +165,9 @@ export function RoomModal({ open, room, categories = [], onClose, onSave }: Room
|
|||||||
size="xl"
|
size="xl"
|
||||||
footer={
|
footer={
|
||||||
<>
|
<>
|
||||||
|
{error && (
|
||||||
|
<p className="text-sm text-red-600 dark:text-red-400 flex-1 text-left">{error}</p>
|
||||||
|
)}
|
||||||
<button onClick={onClose} className="btn-secondary">Отмена</button>
|
<button onClick={onClose} className="btn-secondary">Отмена</button>
|
||||||
<button onClick={handleSave} className="btn-primary" disabled={!form.number}>
|
<button onClick={handleSave} className="btn-primary" disabled={!form.number}>
|
||||||
{isEdit ? 'Сохранить' : 'Добавить номер'}
|
{isEdit ? 'Сохранить' : 'Добавить номер'}
|
||||||
|
|||||||
@@ -62,7 +62,10 @@ export function RoomsPage() {
|
|||||||
setModalOpen(true)
|
setModalOpen(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const [saveError, setSaveError] = useState<string | null>(null)
|
||||||
|
|
||||||
const handleSave = async (room: Room) => {
|
const handleSave = async (room: Room) => {
|
||||||
|
setSaveError(null)
|
||||||
try {
|
try {
|
||||||
const isNew = !rooms.find(r => r.id === room.id)
|
const isNew = !rooms.find(r => r.id === room.id)
|
||||||
if (isNew) {
|
if (isNew) {
|
||||||
@@ -90,7 +93,12 @@ export function RoomsPage() {
|
|||||||
}
|
}
|
||||||
setModalOpen(false)
|
setModalOpen(false)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Failed to save room:', err)
|
const msg = err instanceof Error ? err.message : 'Ошибка сохранения'
|
||||||
|
setSaveError(
|
||||||
|
msg.includes('already exists') || msg.includes('duplicate') || msg.includes('unique')
|
||||||
|
? `Номер «${room.number}» уже существует`
|
||||||
|
: msg,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,9 +283,10 @@ export function RoomsPage() {
|
|||||||
<RoomModal
|
<RoomModal
|
||||||
open={modalOpen}
|
open={modalOpen}
|
||||||
room={editingRoom}
|
room={editingRoom}
|
||||||
onClose={() => setModalOpen(false)}
|
onClose={() => { setModalOpen(false); setSaveError(null) }}
|
||||||
onSave={handleSave}
|
onSave={handleSave}
|
||||||
categories={MOCK_CATEGORIES}
|
categories={MOCK_CATEGORIES}
|
||||||
|
error={saveError}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user