import type { AccessCode } from '@seamapi/types/connect'
import { useAccessCode } from 'lib/seam/access-codes/use-access-code.js'
import { useUpdateAccessCode } from 'lib/seam/access-codes/use-update-access-code.js'
import {
type CommonProps,
withRequiredCommonProps,
} from 'lib/seam/components/common-props.js'
import { useResponseErrors } from 'lib/seam/components/CreateAccessCodeForm/CreateAccessCodeForm.js'
import { useDevice } from 'lib/seam/devices/use-device.js'
import { useComponentTelemetry } from 'lib/telemetry/index.js'
import {
AccessCodeForm,
type AccessCodeFormSubmitData,
type ResponseErrors,
} from 'lib/ui/AccessCodeForm/AccessCodeForm.js'
export interface EditAccessCodeFormProps extends CommonProps {
accessCodeId: string
onSuccess?: (accessCodeId: string) => void
}
export const NestedEditAccessCodeForm =
withRequiredCommonProps(EditAccessCodeForm)
export function EditAccessCodeForm({
accessCodeId,
onBack,
className,
onSuccess,
}: EditAccessCodeFormProps): JSX.Element | null {
useComponentTelemetry('EditAccessCodeForm')
const { accessCode } = useAccessCode({
access_code_id: accessCodeId,
})
if (accessCode == null) {
return null
}
return (
)
}
function Content({
className,
onBack,
accessCode,
onSuccess,
}: Omit & {
accessCode: AccessCode
}): JSX.Element | null {
const { device } = useDevice({
device_id: accessCode.device_id,
})
const { submit, isSubmitting, responseErrors } = useSubmitEditAccessCode(
accessCode,
() => {
if (onSuccess != null) {
onSuccess(accessCode.access_code_id)
}
if (onBack != null) {
onBack()
}
}
)
if (device == null) {
return null
}
return (
)
}
function useSubmitEditAccessCode(
accessCode: AccessCode,
onSuccess?: () => void
): {
submit: (data: AccessCodeFormSubmitData) => void
isSubmitting: boolean
responseErrors: ResponseErrors | null
} {
const { mutate, isPending: isSubmitting } = useUpdateAccessCode()
const { responseErrors, handleResponseError, resetResponseErrors } =
useResponseErrors()
const submit = (data: AccessCodeFormSubmitData): void => {
resetResponseErrors()
const { name, code, type, device, startDate, endDate } = data
if (name === '') {
return
}
if (isSubmitting) {
return
}
if (type === 'time_bound') {
mutate(
{
access_code_id: accessCode.access_code_id,
name,
code,
device_id: device.device_id,
type: 'time_bound',
starts_at: startDate,
ends_at: endDate,
},
{
onSuccess,
onError: handleResponseError,
}
)
return
}
mutate(
{
access_code_id: accessCode.access_code_id,
name,
code,
type: 'ongoing',
device_id: device.device_id,
},
{
onSuccess,
onError: handleResponseError,
}
)
}
return { submit, isSubmitting, responseErrors }
}