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 { 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<AppDispatch>();
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");
}
};

View File

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

View File

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

View File

@ -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={() => (
<View style={{ marginRight: 10 }}>
{/* Add your icon component here if needed */}
);
}}
renderItem={(item) => (
<View
style={{
padding: 12,
opacity: item.disabled ? 0.5 : 1,
}}
>
<Text
style={{ color: item.disabled ? "#949CAC" : "#252A34" }}
>
{item.label}
</Text>
</View>
)}
/>
{touched.serviceType && errors.serviceType && (
<Text style={styles.error}>{errors.serviceType}</Text>
)}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -132,6 +132,7 @@ export const initSocket = async () => {
} catch (err) {
console.log(err, "");
store.dispatch(setTelemetryError("Initialization failed"));
throw err;
}
};