Add calender validations
parent
04fd60d6bc
commit
d44677a034
|
|
@ -206,9 +206,9 @@ export default function HomeScreen() {
|
||||||
setRefreshing(true);
|
setRefreshing(true);
|
||||||
startSpin();
|
startSpin();
|
||||||
|
|
||||||
await dispatch(clearUser());
|
// await dispatch(clearUser());
|
||||||
await dispatch(getUserDetails()).unwrap();
|
await dispatch(getUserDetails());
|
||||||
await dispatch(getPaymentSummary()).unwrap();
|
await dispatch(getPaymentSummary());
|
||||||
|
|
||||||
console.log("Manual refresh complete");
|
console.log("Manual refresh complete");
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,6 @@ const BatteryDetails = () => {
|
||||||
const model = data?.batteries[0]?.battery_model ?? "---";
|
const model = data?.batteries[0]?.battery_model ?? "---";
|
||||||
const batteryId = data?.batteries[0]?.battery_id ?? "---";
|
const batteryId = data?.batteries[0]?.battery_id ?? "---";
|
||||||
const bmsId = data?.batteries[0]?.bms_id ?? "---";
|
const bmsId = data?.batteries[0]?.bms_id ?? "---";
|
||||||
const warrantyStartDate = data?.batteries[0]?.warranty_start_date ?? "---";
|
|
||||||
const warrantyEndDate = data?.batteries[0]?.warranty_end_date ?? "---";
|
|
||||||
const vimId = data?.batteries[0]?.vim_id ?? "---";
|
const vimId = data?.batteries[0]?.vim_id ?? "---";
|
||||||
const serialNumber = data?.batteries[0]?.serial_no ?? "---";
|
const serialNumber = data?.batteries[0]?.serial_no ?? "---";
|
||||||
const chargerUid = data?.batteries[0]?.charger_uid ?? "---";
|
const chargerUid = data?.batteries[0]?.charger_uid ?? "---";
|
||||||
|
|
|
||||||
|
|
@ -11,11 +11,12 @@ import {
|
||||||
KeyboardAvoidingView,
|
KeyboardAvoidingView,
|
||||||
Platform,
|
Platform,
|
||||||
ActivityIndicator,
|
ActivityIndicator,
|
||||||
|
Keyboard,
|
||||||
} from "react-native";
|
} from "react-native";
|
||||||
import { Dropdown } from "react-native-element-dropdown";
|
import { Dropdown } from "react-native-element-dropdown";
|
||||||
import { DateTimePickerAndroid } from "@react-native-community/datetimepicker";
|
import { DateTimePickerAndroid } from "@react-native-community/datetimepicker";
|
||||||
import * as ImagePicker from "expo-image-picker";
|
import * as ImagePicker from "expo-image-picker";
|
||||||
import { Formik, FormikHelpers } from "formik";
|
import { FastField, Formik, FormikHelpers } from "formik";
|
||||||
import * as Yup from "yup";
|
import * as Yup from "yup";
|
||||||
import ChevronRight from "../../assets/icons/chevron_rightside.svg";
|
import ChevronRight from "../../assets/icons/chevron_rightside.svg";
|
||||||
import AddPhoto from "../../assets/icons/add_photo_alternate.svg";
|
import AddPhoto from "../../assets/icons/add_photo_alternate.svg";
|
||||||
|
|
@ -23,11 +24,13 @@ import IssueSelectorModal from "@/components/service/IssueSelectorModal";
|
||||||
import { uploadImage } from "@/utils/User";
|
import { uploadImage } from "@/utils/User";
|
||||||
import api from "@/services/axiosClient";
|
import api from "@/services/axiosClient";
|
||||||
import { useSnackbar } from "@/contexts/Snackbar";
|
import { useSnackbar } from "@/contexts/Snackbar";
|
||||||
import { BASE_URL } from "@/constants/config";
|
import { BASE_URL, SERVICE } from "@/constants/config";
|
||||||
import { Overlay } from "@/components/common/Overlay";
|
import { Overlay } from "@/components/common/Overlay";
|
||||||
import CrossIcon from "@/assets/icons/close_white.svg";
|
import CrossIcon from "@/assets/icons/close_white.svg";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import CalendarIcon from "@/assets/icons/calendar.svg";
|
import CalendarIcon from "@/assets/icons/calendar.svg";
|
||||||
|
import { useSelector } from "react-redux";
|
||||||
|
import { RootState } from "@/store";
|
||||||
|
|
||||||
interface FormValues {
|
interface FormValues {
|
||||||
serviceType: string | null;
|
serviceType: string | null;
|
||||||
|
|
@ -58,6 +61,8 @@ export default function ServiceFormScreen(): JSX.Element {
|
||||||
const [isFocus, setIsFocus] = useState<boolean>(false);
|
const [isFocus, setIsFocus] = useState<boolean>(false);
|
||||||
const [isIssueSelectorVisible, setIssueSelectorVisible] = useState(false);
|
const [isIssueSelectorVisible, setIssueSelectorVisible] = useState(false);
|
||||||
|
|
||||||
|
const { data } = useSelector((state: RootState) => state.user);
|
||||||
|
|
||||||
const [issues, setIssues] = useState<Issue[]>([]);
|
const [issues, setIssues] = useState<Issue[]>([]);
|
||||||
const [isLoadingIssues, setIsLoadingIssues] = useState(false);
|
const [isLoadingIssues, setIsLoadingIssues] = useState(false);
|
||||||
const { showSnackbar } = useSnackbar();
|
const { showSnackbar } = useSnackbar();
|
||||||
|
|
@ -66,6 +71,37 @@ export default function ServiceFormScreen(): JSX.Element {
|
||||||
setIssueSelectorVisible(!isIssueSelectorVisible);
|
setIssueSelectorVisible(!isIssueSelectorVisible);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function checkSixMonthsCondition(warrantyStartDate: string | undefined) {
|
||||||
|
if (warrantyStartDate) {
|
||||||
|
const startDate = new Date(warrantyStartDate);
|
||||||
|
|
||||||
|
const monthsLater = new Date(startDate);
|
||||||
|
monthsLater.setMonth(
|
||||||
|
monthsLater.getMonth() + SERVICE.ENABLE_REGULAR_SERVICE_AFTER_IN_MONTHS
|
||||||
|
);
|
||||||
|
|
||||||
|
const today = new Date();
|
||||||
|
|
||||||
|
if (today >= monthsLater) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const warrantyStartDay = data?.batteries[0]?.warranty_start_date;
|
||||||
|
const isAfterSixMonths = checkSixMonthsCondition(warrantyStartDay);
|
||||||
|
|
||||||
|
const dropdownData = isAfterSixMonths
|
||||||
|
? [
|
||||||
|
{ label: "Regular", value: "Regular" },
|
||||||
|
{ label: "On-demand", value: "On-demand" },
|
||||||
|
]
|
||||||
|
: [{ label: "On-demand", value: "On-demand" }];
|
||||||
|
|
||||||
const fetchIssues = async () => {
|
const fetchIssues = async () => {
|
||||||
try {
|
try {
|
||||||
setIsLoadingIssues(true);
|
setIsLoadingIssues(true);
|
||||||
|
|
@ -111,13 +147,9 @@ export default function ServiceFormScreen(): JSX.Element {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const showPicker = (
|
const showPicker = (setFieldValue: (field: string, value: any) => void) => {
|
||||||
currentDate: Date | null,
|
const now = new Date();
|
||||||
setFieldValue: (field: string, value: any) => void
|
|
||||||
) => {
|
|
||||||
const now = currentDate || new Date();
|
|
||||||
|
|
||||||
// First, show the date picker
|
|
||||||
DateTimePickerAndroid.open({
|
DateTimePickerAndroid.open({
|
||||||
value: now,
|
value: now,
|
||||||
mode: "date",
|
mode: "date",
|
||||||
|
|
@ -147,6 +179,16 @@ export default function ServiceFormScreen(): JSX.Element {
|
||||||
showSnackbar(`${t("service.select-valid-time")}`, "error");
|
showSnackbar(`${t("service.select-valid-time")}`, "error");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//(10AM - 5PM)
|
||||||
|
const hours = combinedDate.getHours();
|
||||||
|
if (hours < 10 || hours >= 17) {
|
||||||
|
showSnackbar(
|
||||||
|
t("service.time-must-be-between-10-and-5"),
|
||||||
|
"error"
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
setFieldValue("date", combinedDate);
|
setFieldValue("date", combinedDate);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -203,6 +245,7 @@ export default function ServiceFormScreen(): JSX.Element {
|
||||||
values: FormValues,
|
values: FormValues,
|
||||||
actions: FormikHelpers<FormValues>
|
actions: FormikHelpers<FormValues>
|
||||||
) => {
|
) => {
|
||||||
|
Keyboard.dismiss();
|
||||||
try {
|
try {
|
||||||
const uploadedPhotoUrls: string[] = [];
|
const uploadedPhotoUrls: string[] = [];
|
||||||
for (const uri of values.photos) {
|
for (const uri of values.photos) {
|
||||||
|
|
@ -271,10 +314,7 @@ export default function ServiceFormScreen(): JSX.Element {
|
||||||
selectedTextStyle={styles.selectedTextStyle}
|
selectedTextStyle={styles.selectedTextStyle}
|
||||||
inputSearchStyle={styles.inputSearchStyle}
|
inputSearchStyle={styles.inputSearchStyle}
|
||||||
iconStyle={styles.iconStyle}
|
iconStyle={styles.iconStyle}
|
||||||
data={[
|
data={dropdownData}
|
||||||
{ label: "Regular", value: "Regular" },
|
|
||||||
{ label: "On-demand", value: "On-demand" },
|
|
||||||
]}
|
|
||||||
maxHeight={200}
|
maxHeight={200}
|
||||||
labelField="label"
|
labelField="label"
|
||||||
valueField="value"
|
valueField="value"
|
||||||
|
|
@ -315,13 +355,9 @@ export default function ServiceFormScreen(): JSX.Element {
|
||||||
styles.issueTextDisabled,
|
styles.issueTextDisabled,
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
{isLoadingIssues ? (
|
{getSelectedIssuesText(values.issues)}
|
||||||
<ActivityIndicator />
|
|
||||||
) : (
|
|
||||||
getSelectedIssuesText(values.issues)
|
|
||||||
)}
|
|
||||||
</Text>
|
</Text>
|
||||||
<ChevronRight />
|
{isLoadingIssues ? <ActivityIndicator /> : <ChevronRight />}
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
{touched.issues && errors.issues && (
|
{touched.issues && errors.issues && (
|
||||||
<Text style={styles.error}>{errors.issues}</Text>
|
<Text style={styles.error}>{errors.issues}</Text>
|
||||||
|
|
@ -330,11 +366,11 @@ export default function ServiceFormScreen(): JSX.Element {
|
||||||
|
|
||||||
<View style={{ marginTop: 8 }}>
|
<View style={{ marginTop: 8 }}>
|
||||||
<Text style={styles.label}>
|
<Text style={styles.label}>
|
||||||
{t("service.select-datetime")}{" "}
|
{t("service.select-datetime")}
|
||||||
<Text style={styles.required}>*</Text>
|
<Text style={styles.required}>*</Text>
|
||||||
</Text>
|
</Text>
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
onPress={() => showPicker(values.date, setFieldValue)}
|
onPress={() => showPicker(setFieldValue)}
|
||||||
style={styles.inputBoxDate}
|
style={styles.inputBoxDate}
|
||||||
>
|
>
|
||||||
<Text style={styles.dateText}>
|
<Text style={styles.dateText}>
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,10 @@ export const useTabConfig = () => {
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const SERVICE = {
|
||||||
|
ENABLE_REGULAR_SERVICE_AFTER_IN_MONTHS: 6,
|
||||||
|
};
|
||||||
|
|
||||||
export const MESSAGES = {
|
export const MESSAGES = {
|
||||||
AUTHENTICATION: {
|
AUTHENTICATION: {
|
||||||
INVALID_TOKEN: "Invalid Token",
|
INVALID_TOKEN: "Invalid Token",
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,7 @@
|
||||||
"service-type": "Service Type",
|
"service-type": "Service Type",
|
||||||
"issue": "Issue",
|
"issue": "Issue",
|
||||||
"select-issue": "Select Issue",
|
"select-issue": "Select Issue",
|
||||||
"select-datetime": "Select Date and Time",
|
"select-datetime": "Select Date and Time (10AM - 5PM)",
|
||||||
"select": "-Select-",
|
"select": "-Select-",
|
||||||
"add-photos": "Add photos",
|
"add-photos": "Add photos",
|
||||||
"supported-formats": "Supported formats include JPG, JPEG and PNG.",
|
"supported-formats": "Supported formats include JPG, JPEG and PNG.",
|
||||||
|
|
@ -131,7 +131,8 @@
|
||||||
"service-request-success": "Service request submitted successfully",
|
"service-request-success": "Service request submitted successfully",
|
||||||
"something-went-wrong": "Something went wrong!",
|
"something-went-wrong": "Something went wrong!",
|
||||||
"select-valid-time": "Select valid time",
|
"select-valid-time": "Select valid time",
|
||||||
"words": "words"
|
"words": "words",
|
||||||
|
"time-must-be-between-10-and-5": "Select a time between 10 AM – 5 PM."
|
||||||
},
|
},
|
||||||
"battery": {
|
"battery": {
|
||||||
"battery-and-warranty": "My Battery and Warranty",
|
"battery-and-warranty": "My Battery and Warranty",
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,7 @@
|
||||||
"service-type": "सेवा प्रकार",
|
"service-type": "सेवा प्रकार",
|
||||||
"issue": "समस्या",
|
"issue": "समस्या",
|
||||||
"select-issue": "समस्या का चयन करें",
|
"select-issue": "समस्या का चयन करें",
|
||||||
"select-datetime": "दिनांक और समय का चयन करें",
|
"select-datetime": "दिनांक और समय (10AM - 5PM) का चयन करें",
|
||||||
"select": "-चुनें-",
|
"select": "-चुनें-",
|
||||||
"add-photos": "फ़ोटो जोड़ें",
|
"add-photos": "फ़ोटो जोड़ें",
|
||||||
"supported-formats": "समर्थित प्रारूपों में JPG, JPEG और PNG शामिल हैं।",
|
"supported-formats": "समर्थित प्रारूपों में JPG, JPEG और PNG शामिल हैं।",
|
||||||
|
|
@ -131,7 +131,8 @@
|
||||||
"service-request-success": "सेवा अनुरोध सफलतापूर्वक सबमिट किया गया",
|
"service-request-success": "सेवा अनुरोध सफलतापूर्वक सबमिट किया गया",
|
||||||
"something-went-wrong": "कुछ गलत हो गया!",
|
"something-went-wrong": "कुछ गलत हो गया!",
|
||||||
"words": "शब्द",
|
"words": "शब्द",
|
||||||
"select-valid-time": "सही समय चुनें"
|
"select-valid-time": "सही समय चुनें",
|
||||||
|
"time-must-be-between-10-and-5": "समय सुबह 10:00 बजे से शाम 5:00 बजे के बीच चुनें।"
|
||||||
},
|
},
|
||||||
"battery": {
|
"battery": {
|
||||||
"battery-and-warranty": "मेरी बैटरी और वारंटी",
|
"battery-and-warranty": "मेरी बैटरी और वारंटी",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue