Add error logs and service regular validations

rename-package
vinay kumar 2025-09-18 13:50:23 +05:30
parent c3dd8e3867
commit 39a65e00e3
14 changed files with 91 additions and 50 deletions

View File

@ -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");
} }
}; };

View File

@ -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);

View File

@ -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);

View File

@ -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>
)} )}

View File

@ -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 {

View File

@ -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);

View File

@ -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);

View File

@ -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],
}); });

View File

@ -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",
}, },
}); });

View File

@ -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([]);

View File

@ -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,
};

View File

@ -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!"
} }
} }

View File

@ -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": "कुछ गलत हो गया!"
} }
} }

View File

@ -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;
} }
}; };