Add error logs and service regular validations
parent
c3dd8e3867
commit
39a65e00e3
|
|
@ -10,6 +10,7 @@ import { getPaymentSummary, getUserDetails } from "@/store/userSlice";
|
||||||
import { useDispatch } from "react-redux";
|
import { useDispatch } from "react-redux";
|
||||||
import { logout } from "@/store/authSlice";
|
import { logout } from "@/store/authSlice";
|
||||||
import { getLanguage, setLanguage } from "@/services/i18n";
|
import { getLanguage, setLanguage } from "@/services/i18n";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
export default function TabLayout() {
|
export default function TabLayout() {
|
||||||
const { isLoggedIn } = useSelector((state: RootState) => state.auth);
|
const { isLoggedIn } = useSelector((state: RootState) => state.auth);
|
||||||
|
|
@ -17,13 +18,14 @@ export default function TabLayout() {
|
||||||
const TAB_CONFIG = useTabConfig();
|
const TAB_CONFIG = useTabConfig();
|
||||||
const dispatch = useDispatch<AppDispatch>();
|
const dispatch = useDispatch<AppDispatch>();
|
||||||
const { showSnackbar } = useSnackbar();
|
const { showSnackbar } = useSnackbar();
|
||||||
|
const { t } = useTranslation();
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const unsubscribe = NetInfo.addEventListener((state) => {
|
const unsubscribe = NetInfo.addEventListener((state) => {
|
||||||
const isConnected = state.isConnected;
|
const isConnected = state.isConnected;
|
||||||
|
|
||||||
if (isConnected === false) {
|
if (isConnected === false) {
|
||||||
console.log("No internet connection");
|
console.log("No internet connection");
|
||||||
showSnackbar("No internet connection", "error");
|
showSnackbar(t("common.no-internet-connection"), "error");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -41,13 +43,13 @@ export default function TabLayout() {
|
||||||
await dispatch(getPaymentSummary());
|
await dispatch(getPaymentSummary());
|
||||||
|
|
||||||
if (result?.batteries?.[0]?.device_id) {
|
if (result?.batteries?.[0]?.device_id) {
|
||||||
initSocket();
|
await initSocket();
|
||||||
} else {
|
} else {
|
||||||
console.warn("Skipping initSocket, no device_id yet");
|
console.warn("Skipping initSocket, no device_id yet");
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to fetch user details", error);
|
console.error("Failed to fetch user details", error);
|
||||||
showSnackbar("Failed to fetch user details", "error");
|
showSnackbar(t("common.something-went-wrong"), "error");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -217,9 +217,12 @@ export default function HomeScreen() {
|
||||||
]);
|
]);
|
||||||
|
|
||||||
await initSocket();
|
await initSocket();
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
showSnackbar("Something went wrong", "error");
|
if (error.message === "Network Error" || !error.response) {
|
||||||
console.error("Manual refresh failed", error);
|
showSnackbar(t("common.no-internet-connection"), "error");
|
||||||
|
} else {
|
||||||
|
showSnackbar(t("common.something-went-wrong"), "error");
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
stopSpin();
|
stopSpin();
|
||||||
setRefreshing(false);
|
setRefreshing(false);
|
||||||
|
|
|
||||||
|
|
@ -167,13 +167,13 @@ export default function PaymentsTabScreen() {
|
||||||
} else {
|
} else {
|
||||||
showSnackbar("No EMI details found", "error");
|
showSnackbar("No EMI details found", "error");
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (error: any) {
|
||||||
console.error("Error fetching EMI details:", err);
|
if (error.message === "Network Error" || !error.response) {
|
||||||
const errorMessage =
|
showSnackbar(t("common.no-internet-connection"), "error");
|
||||||
err instanceof Error
|
} else {
|
||||||
? err.message
|
showSnackbar(t("common.something-went-wrong"), "error");
|
||||||
: `${t("service.something-went-wrong")}`;
|
}
|
||||||
showSnackbar(errorMessage, "error");
|
console.error("Manual refresh failed", error);
|
||||||
} finally {
|
} finally {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
|
|
@ -181,13 +181,19 @@ export default function PaymentsTabScreen() {
|
||||||
|
|
||||||
const handleRefresh = async () => {
|
const handleRefresh = async () => {
|
||||||
try {
|
try {
|
||||||
|
console.log("payments refresh");
|
||||||
setShowFullHistory(false);
|
setShowFullHistory(false);
|
||||||
setRefreshing(true);
|
setRefreshing(true);
|
||||||
startSpin();
|
startSpin();
|
||||||
|
|
||||||
await Promise.all([fetchEmiDetails(), fetchPaymentHistory(1, false)]);
|
await Promise.all([fetchEmiDetails(), fetchPaymentHistory(1, false)]);
|
||||||
console.log("Manual refresh complete");
|
console.log("Manual refresh complete");
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
|
if (error.message === "Network Error" || !error.response) {
|
||||||
|
showSnackbar(t("common.no-internet-connection"), "error");
|
||||||
|
} else {
|
||||||
|
showSnackbar(t("common.something-went-wrong"), "error");
|
||||||
|
}
|
||||||
console.error("Manual refresh failed", error);
|
console.error("Manual refresh failed", error);
|
||||||
} finally {
|
} finally {
|
||||||
stopSpin();
|
stopSpin();
|
||||||
|
|
@ -345,13 +351,13 @@ export default function PaymentsTabScreen() {
|
||||||
} else {
|
} else {
|
||||||
showSnackbar("No payment history found", "error");
|
showSnackbar("No payment history found", "error");
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (error: any) {
|
||||||
console.error("Error fetching payment history:", err);
|
if (error.message === "Network Error" || !error.response) {
|
||||||
const errorMessage =
|
showSnackbar(t("common.no-internet-connection"), "error");
|
||||||
err instanceof Error
|
} else {
|
||||||
? err.message
|
showSnackbar(t("common.something-went-wrong"), "error");
|
||||||
: `${t("service.something-went-wrong")}`;
|
}
|
||||||
showSnackbar(errorMessage, "error");
|
console.error("Manual refresh failed", error);
|
||||||
} finally {
|
} finally {
|
||||||
if (isLoadMore) {
|
if (isLoadMore) {
|
||||||
setIsLoadingMore(false);
|
setIsLoadingMore(false);
|
||||||
|
|
|
||||||
|
|
@ -95,12 +95,10 @@ export default function ServiceFormScreen(): JSX.Element {
|
||||||
const warrantyStartDay = data?.batteries[0]?.warranty_start_date;
|
const warrantyStartDay = data?.batteries[0]?.warranty_start_date;
|
||||||
const isAfterSixMonths = checkSixMonthsCondition(warrantyStartDay);
|
const isAfterSixMonths = checkSixMonthsCondition(warrantyStartDay);
|
||||||
|
|
||||||
const dropdownData = isAfterSixMonths
|
const dropdownData = [
|
||||||
? [
|
{ label: "Regular", value: "Regular", disabled: !isAfterSixMonths },
|
||||||
{ label: "Regular", value: "Regular" },
|
{ label: "On-demand", value: "On-demand", disabled: false },
|
||||||
{ label: "On-demand", value: "On-demand" },
|
];
|
||||||
]
|
|
||||||
: [{ label: "On-demand", value: "On-demand" }];
|
|
||||||
|
|
||||||
const fetchIssues = async () => {
|
const fetchIssues = async () => {
|
||||||
try {
|
try {
|
||||||
|
|
@ -114,7 +112,7 @@ export default function ServiceFormScreen(): JSX.Element {
|
||||||
}
|
}
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error("Error fetching issues:", error);
|
console.error("Error fetching issues:", error);
|
||||||
showSnackbar(`${t("service.something-went-wrong")}`, "error");
|
showSnackbar(`${t("common.something-went-wrong")}`, "error");
|
||||||
setIssues([]);
|
setIssues([]);
|
||||||
} finally {
|
} finally {
|
||||||
setIsLoadingIssues(false);
|
setIsLoadingIssues(false);
|
||||||
|
|
@ -282,7 +280,7 @@ export default function ServiceFormScreen(): JSX.Element {
|
||||||
actions.resetForm();
|
actions.resetForm();
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error("Error during submission:", error);
|
console.error("Error during submission:", error);
|
||||||
showSnackbar(`${t("service.something-went-wrong")}`, "error");
|
showSnackbar(`${t("common.something-went-wrong")}`, "error");
|
||||||
} finally {
|
} finally {
|
||||||
actions.setSubmitting(false);
|
actions.setSubmitting(false);
|
||||||
}
|
}
|
||||||
|
|
@ -322,19 +320,36 @@ export default function ServiceFormScreen(): JSX.Element {
|
||||||
value={values.serviceType}
|
value={values.serviceType}
|
||||||
onFocus={() => setIsFocus(true)}
|
onFocus={() => setIsFocus(true)}
|
||||||
onBlur={() => setIsFocus(false)}
|
onBlur={() => setIsFocus(false)}
|
||||||
onChange={(item) =>
|
onChange={(item) => {
|
||||||
|
if (item.disabled) {
|
||||||
|
showSnackbar(
|
||||||
|
t("service.regular-available-after-6-months"),
|
||||||
|
"error"
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
handleServiceTypeChange(
|
handleServiceTypeChange(
|
||||||
item,
|
item,
|
||||||
setFieldValue,
|
setFieldValue,
|
||||||
setFieldTouched
|
setFieldTouched
|
||||||
)
|
);
|
||||||
}
|
}}
|
||||||
renderLeftIcon={() => (
|
renderItem={(item) => (
|
||||||
<View style={{ marginRight: 10 }}>
|
<View
|
||||||
{/* Add your icon component here if needed */}
|
style={{
|
||||||
|
padding: 12,
|
||||||
|
opacity: item.disabled ? 0.5 : 1,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text
|
||||||
|
style={{ color: item.disabled ? "#949CAC" : "#252A34" }}
|
||||||
|
>
|
||||||
|
{item.label}
|
||||||
|
</Text>
|
||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{touched.serviceType && errors.serviceType && (
|
{touched.serviceType && errors.serviceType && (
|
||||||
<Text style={styles.error}>{errors.serviceType}</Text>
|
<Text style={styles.error}>{errors.serviceType}</Text>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ export default function TransactionDetailScreen() {
|
||||||
const errorMessage =
|
const errorMessage =
|
||||||
err instanceof Error
|
err instanceof Error
|
||||||
? err.message
|
? err.message
|
||||||
: `${t("service.something-went-wrong")}`;
|
: `${t("common.something-went-wrong")}`;
|
||||||
showSnackbar(errorMessage, "error");
|
showSnackbar(errorMessage, "error");
|
||||||
router.back();
|
router.back();
|
||||||
} finally {
|
} finally {
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import {
|
||||||
TouchableOpacity,
|
TouchableOpacity,
|
||||||
TextInput,
|
TextInput,
|
||||||
ScrollView,
|
ScrollView,
|
||||||
KeyboardAvoidingView,
|
|
||||||
Keyboard,
|
Keyboard,
|
||||||
} from "react-native";
|
} from "react-native";
|
||||||
import { useDispatch, useSelector } from "react-redux";
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
|
|
@ -149,7 +148,7 @@ const SelectAmountScreen = () => {
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err, "Error in creating order.");
|
console.error(err, "Error in creating order.");
|
||||||
showSnackbar(`${t("service.something-went-wrong")}`, "error");
|
showSnackbar(`${t("common.something-went-wrong")}`, "error");
|
||||||
} finally {
|
} finally {
|
||||||
setIsFetching(false);
|
setIsFetching(false);
|
||||||
}
|
}
|
||||||
|
|
@ -191,16 +190,21 @@ const SelectAmountScreen = () => {
|
||||||
let numericText = text.replace(/[^0-9.]/g, "");
|
let numericText = text.replace(/[^0-9.]/g, "");
|
||||||
const parts = numericText.split(".");
|
const parts = numericText.split(".");
|
||||||
|
|
||||||
|
// Only allow one decimal
|
||||||
if (parts.length > 2) {
|
if (parts.length > 2) {
|
||||||
numericText = parts[0] + "." + parts[1];
|
numericText = parts[0] + "." + parts[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Only allow two digits after decimal
|
||||||
if (parts[1]?.length > 2) {
|
if (parts[1]?.length > 2) {
|
||||||
numericText = parts[0] + "." + parts[1].slice(0, 2);
|
numericText = parts[0] + "." + parts[1].slice(0, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
const numValue = parseFloat(numericText);
|
const numValue = parseFloat(numericText);
|
||||||
|
|
||||||
|
// If over max, don't update field value — just return early
|
||||||
if (!isNaN(numValue) && numValue > payments.MAX_AMOUNT) {
|
if (!isNaN(numValue) && numValue > payments.MAX_AMOUNT) {
|
||||||
numericText = payments.MAX_AMOUNT.toString();
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
setFieldValue("customAmount", numericText, true);
|
setFieldValue("customAmount", numericText, true);
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ export default function EditName() {
|
||||||
showSnackbar(`${t("profile.name-changed")}`, "success");
|
showSnackbar(`${t("profile.name-changed")}`, "success");
|
||||||
router.back();
|
router.back();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
showSnackbar(`${t("service.something-went-wrong")}`, "error");
|
showSnackbar(`${t("common.something-went-wrong")}`, "error");
|
||||||
console.error("Error updating name:", error);
|
console.error("Error updating name:", error);
|
||||||
} finally {
|
} finally {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ export default function ProfileScreen() {
|
||||||
const handlePickImage = async () => {
|
const handlePickImage = async () => {
|
||||||
let result = await ImagePicker.launchImageLibraryAsync({
|
let result = await ImagePicker.launchImageLibraryAsync({
|
||||||
mediaTypes: ImagePicker.MediaTypeOptions.Images,
|
mediaTypes: ImagePicker.MediaTypeOptions.Images,
|
||||||
quality: 1,
|
quality: 0.5,
|
||||||
allowsEditing: true,
|
allowsEditing: true,
|
||||||
aspect: [1, 1],
|
aspect: [1, 1],
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ const styles = StyleSheet.create({
|
||||||
flexDirection: "row",
|
flexDirection: "row",
|
||||||
alignItems: "center",
|
alignItems: "center",
|
||||||
gap: 8,
|
gap: 8,
|
||||||
|
paddingHorizontal: 8,
|
||||||
},
|
},
|
||||||
message: {
|
message: {
|
||||||
fontStyle: "normal",
|
fontStyle: "normal",
|
||||||
|
|
@ -80,6 +81,7 @@ const styles = StyleSheet.create({
|
||||||
color: "#242C3B",
|
color: "#242C3B",
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
borderColor: "#B6ECDD",
|
borderColor: "#B6ECDD",
|
||||||
|
backgroundColor: "green",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ export default function IssueSelectorModal({
|
||||||
};
|
};
|
||||||
|
|
||||||
const filteredIssues = issues.filter((issue) =>
|
const filteredIssues = issues.filter((issue) =>
|
||||||
issue.name.toLowerCase().includes(search.toLowerCase())
|
issue.name.toLowerCase().includes(search.toLowerCase().trim())
|
||||||
);
|
);
|
||||||
|
|
||||||
const clearSelection = () => setSelectedValues([]);
|
const clearSelection = () => setSelectedValues([]);
|
||||||
|
|
|
||||||
|
|
@ -68,10 +68,6 @@ export const useTabConfig = () => {
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
export const SERVICE = {
|
|
||||||
ENABLE_REGULAR_SERVICE_AFTER_IN_MONTHS: 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const MESSAGES = {
|
export const MESSAGES = {
|
||||||
AUTHENTICATION: {
|
AUTHENTICATION: {
|
||||||
INVALID_TOKEN: "Invalid Token",
|
INVALID_TOKEN: "Invalid Token",
|
||||||
|
|
@ -195,3 +191,7 @@ export const payments = {
|
||||||
EMI_WARNING_DAYS_THRESHOLD: 14,
|
EMI_WARNING_DAYS_THRESHOLD: 14,
|
||||||
AMOUNT_PAID_TO: "Nav Shakti Lithium Pvt. Ltd.",
|
AMOUNT_PAID_TO: "Nav Shakti Lithium Pvt. Ltd.",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const SERVICE = {
|
||||||
|
ENABLE_REGULAR_SERVICE_AFTER_IN_MONTHS: 6,
|
||||||
|
};
|
||||||
|
|
|
||||||
|
|
@ -132,10 +132,10 @@
|
||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
"issues-selected": "issue selected",
|
"issues-selected": "issue selected",
|
||||||
"service-request-success": "Service request submitted successfully",
|
"service-request-success": "Service request submitted successfully",
|
||||||
"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."
|
"time-must-be-between-10-and-5": "Select a time between 10 AM – 5 PM.",
|
||||||
|
"regular-available-after-6-months": "Regular service available after 6 months of purchase"
|
||||||
},
|
},
|
||||||
"battery": {
|
"battery": {
|
||||||
"battery-and-warranty": "My Battery and Warranty",
|
"battery-and-warranty": "My Battery and Warranty",
|
||||||
|
|
@ -154,5 +154,9 @@
|
||||||
"serial-number": "Serial Number",
|
"serial-number": "Serial Number",
|
||||||
"charger-details": "Charger Details",
|
"charger-details": "Charger Details",
|
||||||
"uid": "UID"
|
"uid": "UID"
|
||||||
|
},
|
||||||
|
"common": {
|
||||||
|
"no-internet-connection": "No internet connection",
|
||||||
|
"something-went-wrong": "Something went wrong!"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -132,10 +132,10 @@
|
||||||
"clear": "साफ़ करें",
|
"clear": "साफ़ करें",
|
||||||
"issues-selected": "समस्याएँ चुनी गई",
|
"issues-selected": "समस्याएँ चुनी गई",
|
||||||
"service-request-success": "सेवा अनुरोध सफलतापूर्वक सबमिट किया गया",
|
"service-request-success": "सेवा अनुरोध सफलतापूर्वक सबमिट किया गया",
|
||||||
"something-went-wrong": "कुछ गलत हो गया!",
|
|
||||||
"words": "शब्द",
|
"words": "शब्द",
|
||||||
"select-valid-time": "सही समय चुनें",
|
"select-valid-time": "सही समय चुनें",
|
||||||
"time-must-be-between-10-and-5": "समय सुबह 10:00 बजे से शाम 5:00 बजे के बीच चुनें।"
|
"time-must-be-between-10-and-5": "समय सुबह 10:00 बजे से शाम 5:00 बजे के बीच चुनें।",
|
||||||
|
"regular-available-after-6-months": "रेगुलर सेवा खरीद के 6 महीने बाद उपलब्ध होगी"
|
||||||
},
|
},
|
||||||
"battery": {
|
"battery": {
|
||||||
"battery-and-warranty": "मेरी बैटरी और वारंटी",
|
"battery-and-warranty": "मेरी बैटरी और वारंटी",
|
||||||
|
|
@ -154,5 +154,9 @@
|
||||||
"serial-number": "सीरियल नंबर",
|
"serial-number": "सीरियल नंबर",
|
||||||
"charger-details": "चार्जर विवरण",
|
"charger-details": "चार्जर विवरण",
|
||||||
"uid": "UID"
|
"uid": "UID"
|
||||||
|
},
|
||||||
|
"common": {
|
||||||
|
"no-internet-connection": "इंटरनेट कनेक्शन नहीं है",
|
||||||
|
"something-went-wrong": "कुछ गलत हो गया!"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -132,6 +132,7 @@ export const initSocket = async () => {
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err, "");
|
console.log(err, "");
|
||||||
store.dispatch(setTelemetryError("Initialization failed"));
|
store.dispatch(setTelemetryError("Initialization failed"));
|
||||||
|
throw err;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue