From 39a65e00e3d2fd1e931fd72886de2647693f9457 Mon Sep 17 00:00:00 2001 From: vinay kumar Date: Thu, 18 Sep 2025 13:50:23 +0530 Subject: [PATCH] Add error logs and service regular validations --- app/(tabs)/_layout.tsx | 8 +++-- app/(tabs)/index.tsx | 9 +++-- app/(tabs)/payments.tsx | 36 +++++++++++-------- app/(tabs)/service.tsx | 43 +++++++++++++++-------- app/payments/TransactionDetails.tsx | 2 +- app/payments/selectAmount.tsx | 10 ++++-- app/user/edit_name.tsx | 2 +- app/user/profile.tsx | 2 +- components/common/CustomSnackbar.tsx | 2 ++ components/service/IssueSelectorModal.tsx | 2 +- constants/config.ts | 8 ++--- services/i18n/locals/en.json | 8 +++-- services/i18n/locals/hi.json | 8 +++-- services/socket.ts | 1 + 14 files changed, 91 insertions(+), 50 deletions(-) diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index 702ceff..aa9b3ac 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -10,6 +10,7 @@ import { getPaymentSummary, getUserDetails } from "@/store/userSlice"; import { useDispatch } from "react-redux"; import { logout } from "@/store/authSlice"; import { getLanguage, setLanguage } from "@/services/i18n"; +import { useTranslation } from "react-i18next"; export default function TabLayout() { const { isLoggedIn } = useSelector((state: RootState) => state.auth); @@ -17,13 +18,14 @@ export default function TabLayout() { const TAB_CONFIG = useTabConfig(); const dispatch = useDispatch(); const { showSnackbar } = useSnackbar(); + const { t } = useTranslation(); useEffect(() => { const unsubscribe = NetInfo.addEventListener((state) => { const isConnected = state.isConnected; if (isConnected === false) { 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()); if (result?.batteries?.[0]?.device_id) { - initSocket(); + await initSocket(); } else { console.warn("Skipping initSocket, no device_id yet"); } } catch (error) { console.error("Failed to fetch user details", error); - showSnackbar("Failed to fetch user details", "error"); + showSnackbar(t("common.something-went-wrong"), "error"); } }; diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index d54a916..d0846e1 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -217,9 +217,12 @@ export default function HomeScreen() { ]); await initSocket(); - } catch (error) { - showSnackbar("Something went wrong", "error"); - console.error("Manual refresh failed", 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"); + } } finally { stopSpin(); setRefreshing(false); diff --git a/app/(tabs)/payments.tsx b/app/(tabs)/payments.tsx index 3b06388..a30eaf6 100644 --- a/app/(tabs)/payments.tsx +++ b/app/(tabs)/payments.tsx @@ -167,13 +167,13 @@ export default function PaymentsTabScreen() { } else { showSnackbar("No EMI details found", "error"); } - } catch (err) { - console.error("Error fetching EMI details:", err); - const errorMessage = - err instanceof Error - ? err.message - : `${t("service.something-went-wrong")}`; - showSnackbar(errorMessage, "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); } finally { setIsLoading(false); } @@ -181,13 +181,19 @@ export default function PaymentsTabScreen() { const handleRefresh = async () => { try { + console.log("payments refresh"); setShowFullHistory(false); setRefreshing(true); startSpin(); await Promise.all([fetchEmiDetails(), fetchPaymentHistory(1, false)]); 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); } finally { stopSpin(); @@ -345,13 +351,13 @@ export default function PaymentsTabScreen() { } else { showSnackbar("No payment history found", "error"); } - } catch (err) { - console.error("Error fetching payment history:", err); - const errorMessage = - err instanceof Error - ? err.message - : `${t("service.something-went-wrong")}`; - showSnackbar(errorMessage, "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); } finally { if (isLoadMore) { setIsLoadingMore(false); diff --git a/app/(tabs)/service.tsx b/app/(tabs)/service.tsx index d3a4904..0d919d9 100644 --- a/app/(tabs)/service.tsx +++ b/app/(tabs)/service.tsx @@ -95,12 +95,10 @@ export default function ServiceFormScreen(): JSX.Element { 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 dropdownData = [ + { label: "Regular", value: "Regular", disabled: !isAfterSixMonths }, + { label: "On-demand", value: "On-demand", disabled: false }, + ]; const fetchIssues = async () => { try { @@ -114,7 +112,7 @@ export default function ServiceFormScreen(): JSX.Element { } } catch (error: any) { console.error("Error fetching issues:", error); - showSnackbar(`${t("service.something-went-wrong")}`, "error"); + showSnackbar(`${t("common.something-went-wrong")}`, "error"); setIssues([]); } finally { setIsLoadingIssues(false); @@ -282,7 +280,7 @@ export default function ServiceFormScreen(): JSX.Element { actions.resetForm(); } catch (error: any) { console.error("Error during submission:", error); - showSnackbar(`${t("service.something-went-wrong")}`, "error"); + showSnackbar(`${t("common.something-went-wrong")}`, "error"); } finally { actions.setSubmitting(false); } @@ -322,19 +320,36 @@ export default function ServiceFormScreen(): JSX.Element { value={values.serviceType} onFocus={() => setIsFocus(true)} onBlur={() => setIsFocus(false)} - onChange={(item) => + onChange={(item) => { + if (item.disabled) { + showSnackbar( + t("service.regular-available-after-6-months"), + "error" + ); + return; + } handleServiceTypeChange( item, setFieldValue, setFieldTouched - ) - } - renderLeftIcon={() => ( - - {/* Add your icon component here if needed */} + ); + }} + renderItem={(item) => ( + + + {item.label} + )} /> + {touched.serviceType && errors.serviceType && ( {errors.serviceType} )} diff --git a/app/payments/TransactionDetails.tsx b/app/payments/TransactionDetails.tsx index 81c302b..c7a3b69 100644 --- a/app/payments/TransactionDetails.tsx +++ b/app/payments/TransactionDetails.tsx @@ -82,7 +82,7 @@ export default function TransactionDetailScreen() { const errorMessage = err instanceof Error ? err.message - : `${t("service.something-went-wrong")}`; + : `${t("common.something-went-wrong")}`; showSnackbar(errorMessage, "error"); router.back(); } finally { diff --git a/app/payments/selectAmount.tsx b/app/payments/selectAmount.tsx index 80cb552..a0c72d4 100644 --- a/app/payments/selectAmount.tsx +++ b/app/payments/selectAmount.tsx @@ -6,7 +6,6 @@ import { TouchableOpacity, TextInput, ScrollView, - KeyboardAvoidingView, Keyboard, } from "react-native"; import { useDispatch, useSelector } from "react-redux"; @@ -149,7 +148,7 @@ const SelectAmountScreen = () => { } } catch (err) { console.error(err, "Error in creating order."); - showSnackbar(`${t("service.something-went-wrong")}`, "error"); + showSnackbar(`${t("common.something-went-wrong")}`, "error"); } finally { setIsFetching(false); } @@ -191,16 +190,21 @@ const SelectAmountScreen = () => { let numericText = text.replace(/[^0-9.]/g, ""); const parts = numericText.split("."); + // Only allow one decimal if (parts.length > 2) { numericText = parts[0] + "." + parts[1]; } + + // Only allow two digits after decimal if (parts[1]?.length > 2) { numericText = parts[0] + "." + parts[1].slice(0, 2); } const numValue = parseFloat(numericText); + + // If over max, don't update field value — just return early if (!isNaN(numValue) && numValue > payments.MAX_AMOUNT) { - numericText = payments.MAX_AMOUNT.toString(); + return; } setFieldValue("customAmount", numericText, true); diff --git a/app/user/edit_name.tsx b/app/user/edit_name.tsx index 171b881..4a75b12 100644 --- a/app/user/edit_name.tsx +++ b/app/user/edit_name.tsx @@ -50,7 +50,7 @@ export default function EditName() { showSnackbar(`${t("profile.name-changed")}`, "success"); router.back(); } catch (error) { - showSnackbar(`${t("service.something-went-wrong")}`, "error"); + showSnackbar(`${t("common.something-went-wrong")}`, "error"); console.error("Error updating name:", error); } finally { setIsLoading(false); diff --git a/app/user/profile.tsx b/app/user/profile.tsx index a1573d0..d073288 100644 --- a/app/user/profile.tsx +++ b/app/user/profile.tsx @@ -49,7 +49,7 @@ export default function ProfileScreen() { const handlePickImage = async () => { let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, - quality: 1, + quality: 0.5, allowsEditing: true, aspect: [1, 1], }); diff --git a/components/common/CustomSnackbar.tsx b/components/common/CustomSnackbar.tsx index 20c490b..7d98420 100644 --- a/components/common/CustomSnackbar.tsx +++ b/components/common/CustomSnackbar.tsx @@ -63,6 +63,7 @@ const styles = StyleSheet.create({ flexDirection: "row", alignItems: "center", gap: 8, + paddingHorizontal: 8, }, message: { fontStyle: "normal", @@ -80,6 +81,7 @@ const styles = StyleSheet.create({ color: "#242C3B", borderWidth: 1, borderColor: "#B6ECDD", + backgroundColor: "green", }, }); diff --git a/components/service/IssueSelectorModal.tsx b/components/service/IssueSelectorModal.tsx index 34057df..91304bc 100644 --- a/components/service/IssueSelectorModal.tsx +++ b/components/service/IssueSelectorModal.tsx @@ -44,7 +44,7 @@ export default function IssueSelectorModal({ }; const filteredIssues = issues.filter((issue) => - issue.name.toLowerCase().includes(search.toLowerCase()) + issue.name.toLowerCase().includes(search.toLowerCase().trim()) ); const clearSelection = () => setSelectedValues([]); diff --git a/constants/config.ts b/constants/config.ts index 2f40e2d..8acf168 100644 --- a/constants/config.ts +++ b/constants/config.ts @@ -68,10 +68,6 @@ export const useTabConfig = () => { ]; }; -export const SERVICE = { - ENABLE_REGULAR_SERVICE_AFTER_IN_MONTHS: 1, -}; - export const MESSAGES = { AUTHENTICATION: { INVALID_TOKEN: "Invalid Token", @@ -195,3 +191,7 @@ export const payments = { EMI_WARNING_DAYS_THRESHOLD: 14, AMOUNT_PAID_TO: "Nav Shakti Lithium Pvt. Ltd.", }; + +export const SERVICE = { + ENABLE_REGULAR_SERVICE_AFTER_IN_MONTHS: 6, +}; diff --git a/services/i18n/locals/en.json b/services/i18n/locals/en.json index 475bc75..88d5343 100644 --- a/services/i18n/locals/en.json +++ b/services/i18n/locals/en.json @@ -132,10 +132,10 @@ "clear": "Clear", "issues-selected": "issue selected", "service-request-success": "Service request submitted successfully", - "something-went-wrong": "Something went wrong!", "select-valid-time": "Select valid time", "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-and-warranty": "My Battery and Warranty", @@ -154,5 +154,9 @@ "serial-number": "Serial Number", "charger-details": "Charger Details", "uid": "UID" + }, + "common": { + "no-internet-connection": "No internet connection", + "something-went-wrong": "Something went wrong!" } } diff --git a/services/i18n/locals/hi.json b/services/i18n/locals/hi.json index 478c81a..67ab3e6 100644 --- a/services/i18n/locals/hi.json +++ b/services/i18n/locals/hi.json @@ -132,10 +132,10 @@ "clear": "साफ़ करें", "issues-selected": "समस्याएँ चुनी गई", "service-request-success": "सेवा अनुरोध सफलतापूर्वक सबमिट किया गया", - "something-went-wrong": "कुछ गलत हो गया!", "words": "शब्द", "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-and-warranty": "मेरी बैटरी और वारंटी", @@ -154,5 +154,9 @@ "serial-number": "सीरियल नंबर", "charger-details": "चार्जर विवरण", "uid": "UID" + }, + "common": { + "no-internet-connection": "इंटरनेट कनेक्शन नहीं है", + "something-went-wrong": "कुछ गलत हो गया!" } } diff --git a/services/socket.ts b/services/socket.ts index 1fbacc5..bddfe37 100644 --- a/services/socket.ts +++ b/services/socket.ts @@ -132,6 +132,7 @@ export const initSocket = async () => { } catch (err) { console.log(err, ""); store.dispatch(setTelemetryError("Initialization failed")); + throw err; } };