import { RouteProp, useRoute } from '@react-navigation/native' import { NativeStackNavigationOptions } from '@react-navigation/native-stack' import { useUser } from '@skolplattformen/hooks' import { Button, CheckBox, Input, StyleService, Text, useStyleSheet, } from '@ui-kitten/components' import { Formik } from 'formik' import moment from 'moment' import Personnummer from 'personnummer' import React, { useCallback } from 'react' import { View } from 'react-native' import DateTimePickerModal from 'react-native-modal-datetime-picker' import * as Yup from 'yup' import { defaultStackStyling } from '../design/navigationThemes' import usePersonalStorage from '../hooks/usePersonalStorage' import useSettingsStorage from '../hooks/useSettingsStorage' import { Layout as LayoutStyle, Sizing, Typography } from '../styles' import { studentName } from '../utils/peopleHelpers' import { useSMS } from '../utils/SMS' import { translate } from '../utils/translation' import { AlertIcon } from './icon.component' import { RootStackParamList } from './navigation.component' import { NavigationTitle } from './navigationTitle.component' type AbsenceRouteProps = RouteProp interface AbsenceFormValues { displayStartTimePicker: boolean displayEndTimePicker: boolean personalIdentityNumber: string isFullDay: boolean startTime: moment.Moment endTime: moment.Moment } export const absenceRouteOptions = (darkMode: boolean) => ({ route, }: { route: RouteProp }): NativeStackNavigationOptions => { const child = route.params.child return { ...defaultStackStyling(darkMode), headerTitle: () => ( ), } } const Absence = () => { const AbsenceSchema = Yup.object().shape({ personalIdentityNumber: Yup.string() .required(translate('abscense.personalNumberMissing')) .test('is-valid', translate('abscense.invalidPersonalNumber'), (value) => value ? Personnummer.valid(value) : true ), isFullDay: Yup.bool().required(), }) const { data: user } = useUser() const route = useRoute() const { sendSMS } = useSMS() const { child } = route.params const [personalIdentityNumber, setPersonalIdentityNumber] = React.useState('') const [personalIdsFromStorage, setPersonalIdInStorage] = useSettingsStorage( 'childPersonalIdentityNumber' ) const personalIdKey = `@childPersonalIdNumber.${child.id}` const minumumDate = moment().hours(8).minute(0) const maximumDate = moment().hours(17).minute(0) const styles = useStyleSheet(themedStyles) const submit = useCallback( async (values: AbsenceFormValues) => { const personalIdNumber = Personnummer.parse( values.personalIdentityNumber ).format() if (values.isFullDay) { sendSMS(personalIdNumber) } else { sendSMS( `${personalIdNumber} ${moment(values.startTime).format( 'HHmm' )}-${moment(values.endTime).format('HHmm')}` ) } const toStore = { ...personalIdsFromStorage, ...{ [personalIdKey]: personalIdNumber }, } setPersonalIdInStorage(toStore) }, [personalIdKey, personalIdsFromStorage, sendSMS, setPersonalIdInStorage] ) React.useEffect(() => { const personalIdFromStorage = personalIdsFromStorage[personalIdKey] || '' setPersonalIdentityNumber(personalIdFromStorage || '') }, [child, personalIdKey, personalIdsFromStorage, user]) const initialValues: AbsenceFormValues = { displayStartTimePicker: false, displayEndTimePicker: false, personalIdentityNumber: personalIdentityNumber || '', isFullDay: true, startTime: moment().hours(Math.max(8, new Date().getHours())).minute(0), endTime: maximumDate, } return ( {({ handleChange, handleBlur, handleSubmit, setFieldValue, values, touched, errors, }) => { const hasError = (field: keyof typeof values) => errors[field] && touched[field] return ( {translate('abscense.childsPersonalNumber')} {hasError('personalIdentityNumber') && ( {errors.personalIdentityNumber} )} setFieldValue('isFullDay', checked)} > {translate('abscense.entireDay')} {!values.isFullDay && ( {translate('abscense.startTime')} { setFieldValue('startTime', date) setFieldValue('displayStartTimePicker', false) }} onCancel={() => setFieldValue('displayStartTimePicker', false) } /> {translate('abscense.endTime')} { setFieldValue('endTime', date) setFieldValue('displayEndTimePicker', false) }} onCancel={() => setFieldValue('displayEndTimePicker', false) } /> )} ) }} ) } export default Absence const themedStyles = StyleService.create({ wrap: { ...LayoutStyle.flex.full, padding: Sizing.t4, backgroundColor: 'background-basic-color-2', }, field: { marginBottom: Sizing.t4 }, partOfDay: { ...LayoutStyle.flex.row, marginBottom: Sizing.t4 }, spacer: { width: Sizing.t2 }, inputHalf: { ...LayoutStyle.flex.full }, input: { backgroundColor: 'background-basic-color-1', borderColor: 'color-input-border', }, // TODO: Refactor to use mapping.json in eva design pickerButton: { backgroundColor: 'background-basic-color-1', }, label: { ...Typography.fontSize.sm, ...Typography.fontWeight.bold, marginBottom: Sizing.t2, }, error: { color: 'color-primary-600', }, })