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 { 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");
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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],
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
},
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -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([]);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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!"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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": "कुछ गलत हो गया!"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -132,6 +132,7 @@ export const initSocket = async () => {
|
|||
} catch (err) {
|
||||
console.log(err, "");
|
||||
store.dispatch(setTelemetryError("Initialization failed"));
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue