Add refresh socket connection and service validation

rename-package
vinay kumar 2025-09-17 18:47:04 +05:30
parent 4eb06631b4
commit c3dd8e3867
7 changed files with 56 additions and 31 deletions

View File

@ -38,14 +38,18 @@ import {
import { setDueAmount } from "@/store/paymentSlice"; import { setDueAmount } from "@/store/paymentSlice";
import { Image } from "expo-image"; import { Image } from "expo-image";
import EMINotification from "@/components/Payments/EmiNotification"; import EMINotification from "@/components/Payments/EmiNotification";
import { initSocket } from "@/services/socket";
import { useSnackbar } from "@/contexts/Snackbar";
export default function HomeScreen() { export default function HomeScreen() {
const { t } = useTranslation(); const { t } = useTranslation();
const navigation = useNavigation(); const navigation = useNavigation();
const [isSupportModalVisible, setIsSupportModalVisible] = useState(false); const [isSupportModalVisible, setIsSupportModalVisible] = useState(false);
const { SoC, SoH, chargingState, lat, lon, loading, totalDistance } = const { SoC, SoH, chargingState, lat, lon, loading, totalDistance, error } =
useSelector((state: RootState) => state.telemetry); useSelector((state: RootState) => state.telemetry);
const { showSnackbar } = useSnackbar();
const [refreshing, setRefreshing] = useState(false); const [refreshing, setRefreshing] = useState(false);
const spinValue = useState(new Animated.Value(0))[0]; const spinValue = useState(new Animated.Value(0))[0];
@ -206,12 +210,15 @@ export default function HomeScreen() {
setRefreshing(true); setRefreshing(true);
startSpin(); startSpin();
// await dispatch(clearUser()); await dispatch(clearUser());
await dispatch(getUserDetails()); await Promise.all([
await dispatch(getPaymentSummary()); dispatch(getUserDetails()).unwrap(),
dispatch(getPaymentSummary()).unwrap(),
]);
console.log("Manual refresh complete"); await initSocket();
} catch (error) { } catch (error) {
showSnackbar("Something went wrong", "error");
console.error("Manual refresh failed", error); console.error("Manual refresh failed", error);
} finally { } finally {
stopSpin(); stopSpin();
@ -291,12 +298,10 @@ export default function HomeScreen() {
) : null} ) : null}
<View style={styles.map}> <View style={styles.map}>
{loading ? ( {error ? (
<View style={styles.errorContainer}> <View style={styles.errorContainer}>
<LocationOff /> <LocationOff />
<Text style={styles.errorText}> <Text style={styles.errorText}>{t("home.error-location")}</Text>
{t("home.fetching-location")}
</Text>
</View> </View>
) : lat != null && lon != null && !(lat == 0 && lon == 0) ? ( ) : lat != null && lon != null && !(lat == 0 && lon == 0) ? (
<> <>
@ -342,18 +347,19 @@ export default function HomeScreen() {
) : ( ) : (
<View style={styles.errorContainer}> <View style={styles.errorContainer}>
<LocationOff /> <LocationOff />
<Text style={styles.errorText}>{t("home.error-location")}</Text> <Text style={styles.errorText}>
{t("home.fetching-location")}
</Text>
</View> </View>
)} )}
</View> </View>
{warrantyEndDate && warrantyStartDate && (
<TouchableOpacity onPress={() => router.push("/(tabs)/my-battery")}> <TouchableOpacity onPress={() => router.push("/(tabs)/my-battery")}>
<BatteryWarrantyCard <BatteryWarrantyCard
warrantyStartDate={warrantyStartDate} warrantyStartDate={warrantyStartDate}
warrantyEndDate={warrantyEndDate} warrantyEndDate={warrantyEndDate}
/> />
</TouchableOpacity> </TouchableOpacity>
)}
</ScrollView> </ScrollView>
<CustomerSupportModal <CustomerSupportModal
visible={isSupportModalVisible} visible={isSupportModalVisible}

View File

@ -341,17 +341,26 @@ export default function ServiceFormScreen(): JSX.Element {
</View> </View>
<View style={{ marginTop: 8 }}> <View style={{ marginTop: 8 }}>
<Text style={styles.label}> <Text style={styles.label}>
{t("service.issue")} <Text style={styles.required}>*</Text> {t("service.issue")}{" "}
{values.serviceType == "On-demand" && (
<Text style={styles.required}>*</Text>
)}
</Text> </Text>
<TouchableOpacity <TouchableOpacity
style={[styles.inputBox]} style={[styles.inputBox]}
onPress={toggleIssueSelector} onPress={toggleIssueSelector}
disabled={values.serviceType === "Regular" || isLoadingIssues} disabled={
values.serviceType === "Regular" ||
isLoadingIssues ||
values.serviceType == null
}
> >
<Text <Text
style={[ style={[
styles.issueText, styles.issueText,
values.serviceType === "Regular" && (values.serviceType === "Regular" ||
values.serviceType == null ||
isLoadingIssues) &&
styles.issueTextDisabled, styles.issueTextDisabled,
]} ]}
> >
@ -366,7 +375,7 @@ export default function ServiceFormScreen(): JSX.Element {
<View style={{ marginTop: 8 }}> <View style={{ marginTop: 8 }}>
<Text style={styles.label}> <Text style={styles.label}>
{t("service.select-datetime")} {t("service.select-datetime")}{" "}
<Text style={styles.required}>*</Text> <Text style={styles.required}>*</Text>
</Text> </Text>
<TouchableOpacity <TouchableOpacity

View File

@ -18,8 +18,6 @@ export default ({
method, method,
status, status,
}: PaymentHistoryCardProps) => { }: PaymentHistoryCardProps) => {
//failure, confirmed, pending
const router = useRouter(); const router = useRouter();
const handlePress = () => { const handlePress = () => {
@ -58,7 +56,6 @@ export default ({
const statusStyle = getStatusStyle(status); const statusStyle = getStatusStyle(status);
return ( return (
// <TouchableOpacity style={styles.paymentCard} onPress={handlePress}>
<TouchableOpacity style={styles.paymentCard} onPress={handlePress}> <TouchableOpacity style={styles.paymentCard} onPress={handlePress}>
<View style={styles.paymentCardTop}> <View style={styles.paymentCardTop}>
<Text style={styles.paymentDate}>{date}</Text> <Text style={styles.paymentDate}>{date}</Text>
@ -82,7 +79,6 @@ export default ({
)} )}
</View> </View>
</TouchableOpacity> </TouchableOpacity>
// </TouchableOpacity>
); );
}; };

View File

@ -69,7 +69,7 @@ export const useTabConfig = () => {
}; };
export const SERVICE = { export const SERVICE = {
ENABLE_REGULAR_SERVICE_AFTER_IN_MONTHS: 6, ENABLE_REGULAR_SERVICE_AFTER_IN_MONTHS: 1,
}; };
export const MESSAGES = { export const MESSAGES = {

View File

@ -4,6 +4,7 @@ import {
updateTelemetry, updateTelemetry,
setTelemetryLoading, setTelemetryLoading,
setTelemetryError, setTelemetryError,
clearTelemetry,
} from "../store/telemetrySlice"; } from "../store/telemetrySlice";
import { BmsState } from "@/constants/types"; import { BmsState } from "@/constants/types";
import { BASE_URL, SOCKET_BASE_URL, VECTOR_BASE_URL } from "@/constants/config"; import { BASE_URL, SOCKET_BASE_URL, VECTOR_BASE_URL } from "@/constants/config";
@ -29,6 +30,7 @@ const fetchToken = async (): Promise<string> => {
`${BASE_URL}/api/v1/vec-token` `${BASE_URL}/api/v1/vec-token`
); );
console.log("response.data.data.token", response.data.data.token);
return response.data.data.token; return response.data.data.token;
} catch (error) { } catch (error) {
console.error("Error fetching token:", error); console.error("Error fetching token:", error);
@ -106,11 +108,18 @@ export const connectSocket = () => {
export const initSocket = async () => { export const initSocket = async () => {
try { try {
if (socket) {
socket.disconnect();
socket = null;
console.log("Previous socket disconnected before reinitializing");
}
store.dispatch(clearTelemetry());
const hardwareDeviceId = const hardwareDeviceId =
store.getState().user.data?.batteries?.[0]?.device_id; store.getState().user.data?.batteries?.[0]?.device_id;
if (!hardwareDeviceId) { if (!hardwareDeviceId) {
console.warn("initSocket skipped: hardwareDeviceId not ready"); console.warn("initSocket skipped: hardwareDeviceId not ready");
return; // just exit gracefully return;
} }
console.log(hardwareDeviceId, "hardware deviced"); console.log(hardwareDeviceId, "hardware deviced");

View File

@ -37,9 +37,14 @@ export const telemetrySlice = createSlice({
state.loading = false; state.loading = false;
state.error = action.payload; state.error = action.payload;
}, },
clearTelemetry: () => initialState,
}, },
}); });
export const { updateTelemetry, setTelemetryLoading, setTelemetryError } = export const {
telemetrySlice.actions; updateTelemetry,
setTelemetryLoading,
clearTelemetry,
setTelemetryError,
} = telemetrySlice.actions;
export default telemetrySlice.reducer; export default telemetrySlice.reducer;

View File

@ -113,7 +113,7 @@ const userSlice = createSlice({
initialState, initialState,
reducers: { reducers: {
clearUser: (state) => { clearUser: (state) => {
state.data = null; state.loading = true;
state.error = null; state.error = null;
state.loading = false; state.loading = false;
state.paymentSummary = null; state.paymentSummary = null;