2024-06-07 20:17:03 +03:00
'use client' ;
2025-02-12 21:36:03 +03:00
import { Controller , useForm } from 'react-hook-form' ;
2025-02-12 01:34:35 +03:00
import { zodResolver } from '@hookform/resolvers/zod' ;
import { z } from 'zod' ;
2024-06-07 20:17:03 +03:00
2025-03-12 11:54:32 +03:00
import { ModalForm } from '@/components/modal1' ;
2025-01-16 16:31:03 +03:00
import { useDialogsStore } from '@/stores/dialogs' ;
2024-06-07 20:17:03 +03:00
import { limits } from '@/utils/constants' ;
2025-02-12 01:34:35 +03:00
import { errorMsg } from '@/utils/labels' ;
2024-06-07 20:17:03 +03:00
2025-03-12 11:54:32 +03:00
import { PickLocation } from '../components/pick-location' ;
import { validateLocation } from '../models/library-api' ;
2025-02-10 01:32:16 +03:00
2025-03-02 19:07:12 +03:00
const schemaLocation = z . strictObject ( {
2025-02-12 01:34:35 +03:00
location : z.string ( ) . refine ( data = > validateLocation ( data ) , { message : errorMsg.invalidLocation } )
} ) ;
type ILocationType = z . infer < typeof schemaLocation > ;
2025-01-16 16:31:03 +03:00
export interface DlgChangeLocationProps {
2024-06-07 20:17:03 +03:00
initial : string ;
onChangeLocation : ( newLocation : string ) = > void ;
}
2025-02-19 23:29:45 +03:00
export function DlgChangeLocation() {
2025-01-16 16:31:03 +03:00
const { initial , onChangeLocation } = useDialogsStore ( state = > state . props as DlgChangeLocationProps ) ;
2024-06-07 20:17:03 +03:00
2025-02-12 01:34:35 +03:00
const {
handleSubmit ,
control ,
formState : { errors , isValid , isDirty }
} = useForm < ILocationType > ( {
resolver : zodResolver ( schemaLocation ) ,
defaultValues : {
location : initial
} ,
mode : 'onChange'
} ) ;
2024-06-26 18:59:49 +03:00
2025-02-12 01:34:35 +03:00
function onSubmit ( data : ILocationType ) {
onChangeLocation ( data . location ) ;
2025-02-06 14:09:20 +03:00
}
2024-06-07 20:17:03 +03:00
return (
2025-02-06 20:27:56 +03:00
< ModalForm
2024-06-07 20:17:03 +03:00
overflowVisible
header = 'Изменение расположения'
submitText = 'Переместить'
submitInvalidTooltip = { ` Допустимы буквы, цифры, подчерк, пробел и "!". Сегмент пути не может начинаться и заканчиваться пробелом. Общая длина (с корнем) не должна превышать ${ limits . location_len } ` }
2025-02-12 01:34:35 +03:00
canSubmit = { isValid && isDirty }
onSubmit = { event = > void handleSubmit ( onSubmit ) ( event ) }
2025-03-11 22:24:51 +03:00
className = 'w-130 pb-3 px-6 h-36'
2024-06-07 20:17:03 +03:00
>
2025-02-12 01:34:35 +03:00
< Controller
2025-03-10 16:01:40 +03:00
control = { control }
2025-02-12 01:34:35 +03:00
name = 'location'
render = { ( { field } ) = > (
2025-03-11 22:24:51 +03:00
< PickLocation
dropdownHeight = 'h-38' //
value = { field . value }
onChange = { field . onChange }
2025-02-12 01:34:35 +03:00
error = { errors . location }
/ >
) }
/ >
2025-02-06 20:27:56 +03:00
< / ModalForm >
2024-06-07 20:17:03 +03:00
) ;
}