|
@@ -15,14 +15,19 @@ import { Picker } from '@react-native-picker/picker';
|
|
|
import { MaterialCommunityIcons } from '@expo/vector-icons';
|
|
|
import { Picker as WheelPicker } from 'react-native-wheel-pick';
|
|
|
import moment from 'moment';
|
|
|
-import { Button, Header, PageWrapper } from 'src/components';
|
|
|
+import { Button, Header, PageWrapper, WarningModal } from 'src/components';
|
|
|
import { Colors } from 'src/theme';
|
|
|
import { Dropdown } from 'react-native-searchable-dropdown-kj';
|
|
|
import { qualityOptions } from '../utils/constants';
|
|
|
import { getFontSize } from 'src/utils';
|
|
|
import TrashSVG from 'assets/icons/travels-screens/trash-solid.svg';
|
|
|
import { storage, StoreType } from 'src/storage';
|
|
|
-import { useGetVisitsQuery, usePostAddVisitMutation } from '@api/myRegions';
|
|
|
+import {
|
|
|
+ useGetVisitsQuery,
|
|
|
+ usePostAddVisitMutation,
|
|
|
+ usePostDeleteVisitMutation,
|
|
|
+ usePostUpdateVisitMutation
|
|
|
+} from '@api/myRegions';
|
|
|
import ActionSheet from 'react-native-actions-sheet';
|
|
|
import { ButtonVariants } from 'src/types/components';
|
|
|
import EditSvg from 'assets/icons/travels-screens/pen-to-square.svg';
|
|
@@ -71,6 +76,8 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
|
|
|
|
|
|
const { data: existingVisits } = useGetVisitsQuery(id, token, token ? true : false);
|
|
|
const { mutateAsync: addVisit } = usePostAddVisitMutation();
|
|
|
+ const { mutateAsync: updateVisitAsync } = usePostUpdateVisitMutation();
|
|
|
+ const { mutateAsync: deleteVisitAsync } = usePostDeleteVisitMutation();
|
|
|
|
|
|
const [visits, setVisits] = useState<Visit[]>([]);
|
|
|
const [showDatePicker, setShowDatePicker] = useState<DatePickerState | null>(null);
|
|
@@ -81,6 +88,15 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
|
|
|
const [selectedMonth, setSelectedMonth] = useState<number | null>(null);
|
|
|
const [selectedDay, setSelectedDay] = useState<number | null>(null);
|
|
|
|
|
|
+ const [modalState, setModalState] = useState({
|
|
|
+ isWarningVisible: false,
|
|
|
+ type: 'success',
|
|
|
+ title: '',
|
|
|
+ buttonTitle: '',
|
|
|
+ message: '',
|
|
|
+ action: () => {}
|
|
|
+ });
|
|
|
+
|
|
|
const createEmptyVisit = useCallback(
|
|
|
(): Visit => ({
|
|
|
id: Date.now() + Math.random(),
|
|
@@ -152,14 +168,35 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
|
|
|
}, []);
|
|
|
|
|
|
const toggleEditVisit = useCallback(
|
|
|
- (id: number): void => {
|
|
|
- const visit = visits.find((v) => v.id === id);
|
|
|
+ async (visitId: number): Promise<void> => {
|
|
|
+ const visit = visits.find((v) => v.id === visitId);
|
|
|
if (visit && visit.isEditing) {
|
|
|
- Alert.alert('TO DO edit existing visit');
|
|
|
+ await updateVisitAsync(
|
|
|
+ {
|
|
|
+ token,
|
|
|
+ region: id,
|
|
|
+ id: visitId,
|
|
|
+ quality: visit.quality.id,
|
|
|
+ year_from: visit.startDate?.year || null,
|
|
|
+ month_from: visit.startDate?.month || null,
|
|
|
+ day_from: visit.startDate?.day || null,
|
|
|
+ year_to: visit.endDate?.year || null,
|
|
|
+ month_to: visit.endDate?.month || null,
|
|
|
+ day_to: visit.endDate?.day || null,
|
|
|
+ completed: 1,
|
|
|
+ hidden: 0
|
|
|
+ },
|
|
|
+ {
|
|
|
+ onSuccess: (data) => {},
|
|
|
+ onError: (error) => {
|
|
|
+ console.log('updateVisitAsync error', error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
}
|
|
|
setVisits((prevVisits) =>
|
|
|
prevVisits.map((visit) =>
|
|
|
- visit.id === id ? { ...visit, isEditing: !visit.isEditing } : visit
|
|
|
+ visit.id === visitId ? { ...visit, isEditing: !visit.isEditing } : visit
|
|
|
)
|
|
|
);
|
|
|
},
|
|
@@ -167,18 +204,50 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
|
|
|
);
|
|
|
|
|
|
const deleteVisit = useCallback(
|
|
|
- (id: number): void => {
|
|
|
+ async (id: number): Promise<void> => {
|
|
|
const visitToDelete = visits.find((visit: Visit) => visit.id === id);
|
|
|
if (!visitToDelete) return;
|
|
|
-
|
|
|
- Animated.timing(visitToDelete.animatedValue, {
|
|
|
- toValue: 0,
|
|
|
- duration: 300,
|
|
|
- easing: Easing.in(Easing.quad),
|
|
|
- useNativeDriver: false
|
|
|
- }).start(() => {
|
|
|
- setVisits((prevVisits) => prevVisits.filter((visit) => visit.id !== id));
|
|
|
- });
|
|
|
+ if (visitToDelete.isExisting) {
|
|
|
+ setModalState({
|
|
|
+ type: 'delete',
|
|
|
+ title: `Delete visit`,
|
|
|
+ message: `Are you sure you want to delete this visit?`,
|
|
|
+ action: async () => {
|
|
|
+ await deleteVisitAsync(
|
|
|
+ {
|
|
|
+ token,
|
|
|
+ id: visitToDelete.id
|
|
|
+ },
|
|
|
+ {
|
|
|
+ onSuccess: (res) => {
|
|
|
+ Animated.timing(visitToDelete.animatedValue, {
|
|
|
+ toValue: 0,
|
|
|
+ duration: 300,
|
|
|
+ easing: Easing.in(Easing.quad),
|
|
|
+ useNativeDriver: false
|
|
|
+ }).start(() => {
|
|
|
+ setVisits((prevVisits) => prevVisits.filter((visit) => visit.id !== id));
|
|
|
+ });
|
|
|
+ },
|
|
|
+ onError: (err) => {
|
|
|
+ console.log('delete err', err);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ },
|
|
|
+ buttonTitle: 'Delete',
|
|
|
+ isWarningVisible: true
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ Animated.timing(visitToDelete.animatedValue, {
|
|
|
+ toValue: 0,
|
|
|
+ duration: 300,
|
|
|
+ easing: Easing.in(Easing.quad),
|
|
|
+ useNativeDriver: false
|
|
|
+ }).start(() => {
|
|
|
+ setVisits((prevVisits) => prevVisits.filter((visit) => visit.id !== id));
|
|
|
+ });
|
|
|
+ }
|
|
|
},
|
|
|
[visits]
|
|
|
);
|
|
@@ -258,7 +327,6 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
|
|
|
}
|
|
|
|
|
|
newVisits.forEach(async (v) => {
|
|
|
- console.log('visit', v);
|
|
|
await addVisit(
|
|
|
{
|
|
|
token,
|
|
@@ -274,9 +342,7 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
|
|
|
hidden: 0
|
|
|
},
|
|
|
{
|
|
|
- onSuccess: (data) => {
|
|
|
- console.log('addVisit data', data);
|
|
|
- },
|
|
|
+ onSuccess: (data) => {},
|
|
|
onError: (error) => {
|
|
|
console.log('addVisit error', error);
|
|
|
}
|
|
@@ -346,7 +412,7 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
|
|
|
}
|
|
|
|
|
|
for (let i = 1; i <= maxDay; i++) {
|
|
|
- days.push({ label: i.toString(), value: i });
|
|
|
+ days.push({ label: i.toString(), value: i as never });
|
|
|
}
|
|
|
|
|
|
return days;
|
|
@@ -680,6 +746,16 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
|
|
|
</View>
|
|
|
</View>
|
|
|
</ActionSheet>
|
|
|
+
|
|
|
+ <WarningModal
|
|
|
+ type={modalState.type}
|
|
|
+ isVisible={modalState.isWarningVisible}
|
|
|
+ buttonTitle={modalState.buttonTitle}
|
|
|
+ message={modalState.message}
|
|
|
+ action={modalState.action}
|
|
|
+ onClose={() => setModalState({ ...modalState, isWarningVisible: false })}
|
|
|
+ title={modalState.title}
|
|
|
+ />
|
|
|
</PageWrapper>
|
|
|
);
|
|
|
};
|