Commit d6224c0f by asranov0003

feat: add block and unblock device

parent 03105f2d
...@@ -11,11 +11,16 @@ import { Link } from "react-router-dom"; ...@@ -11,11 +11,16 @@ import { Link } from "react-router-dom";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import CModal from "../../components/CModal"; import CModal from "../../components/CModal";
import CButton from "../../components/CButton"; import CButton from "../../components/CButton";
import { useAppDispatch, useAppSelector, type RootState } from "../../stores/store";
import { blockDevice, unBlockDevice } from "../../stores/slices/commandSlice";
const ManageApps: React.FC = () => { const ManageApps: React.FC = () => {
const [isOpenLockDeviceModal, setIsOpenLockDeviceModal] = useState(false); const [isOpenLockDeviceModal, setIsOpenLockDeviceModal] = useState(false);
const [isOpenUnLockDeviceModal, setIsOpenUnLockDeviceModal] = useState(false); const [isOpenUnLockDeviceModal, setIsOpenUnLockDeviceModal] = useState(false);
const { t } = useTranslation(); const { t } = useTranslation();
const { selectedDevice } = useAppSelector((state: RootState) => state.device)
const { isLoadingBlockDevice, isLoadingUnBlockDevice } = useAppSelector((state: RootState) => state.command)
const dispatch = useAppDispatch();
const handleModalLockDevice = () => { const handleModalLockDevice = () => {
setIsOpenLockDeviceModal((prev) => !prev); setIsOpenLockDeviceModal((prev) => !prev);
...@@ -25,6 +30,26 @@ const ManageApps: React.FC = () => { ...@@ -25,6 +30,26 @@ const ManageApps: React.FC = () => {
setIsOpenUnLockDeviceModal((prev) => !prev); setIsOpenUnLockDeviceModal((prev) => !prev);
}; };
const handleBlockDevice = async () => {
try {
await dispatch(blockDevice(selectedDevice?.id || ""));
} catch (error) {
console.error("Error blocking device:", error);
} finally {
handleModalLockDevice();
}
}
const handleUnBlockDevice = async () => {
try {
await dispatch(unBlockDevice(selectedDevice?.id || ""));
} catch (error) {
console.error("Error blocking device:", error);
} finally {
handleModalUnlockDevice();
}
};
return ( return (
<div className="manageapps wrapper"> <div className="manageapps wrapper">
<SectionHeader to="/home" /> <SectionHeader to="/home" />
...@@ -83,7 +108,11 @@ const ManageApps: React.FC = () => { ...@@ -83,7 +108,11 @@ const ManageApps: React.FC = () => {
variant="danger" variant="danger"
onClick={handleModalLockDevice} onClick={handleModalLockDevice}
/> />
<CButton title={t("common.yes")} /> <CButton
title={t("common.yes")}
onClick={handleBlockDevice}
isLoading={isLoadingBlockDevice}
/>
</div> </div>
</div> </div>
} }
...@@ -107,7 +136,11 @@ const ManageApps: React.FC = () => { ...@@ -107,7 +136,11 @@ const ManageApps: React.FC = () => {
variant="danger" variant="danger"
onClick={handleModalUnlockDevice} onClick={handleModalUnlockDevice}
/> />
<CButton title={t("common.yes")} /> <CButton
title={t("common.yes")}
onClick={handleUnBlockDevice}
isLoading={isLoadingUnBlockDevice}
/>
</div> </div>
</div> </div>
} }
......
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
import { sendRpcRequest } from "../../services/apiClient";
interface ICommandState {
isLoadingBlockDevice: boolean;
isLoadingUnBlockDevice: boolean;
}
const initialState: ICommandState = {
isLoadingBlockDevice: false,
isLoadingUnBlockDevice: false,
};
export const blockDevice = createAsyncThunk(
"command/blockDevice",
async (deviceId: string, { rejectWithValue }) => {
try {
const response = await sendRpcRequest("command.block", {
deviceId,
password: "0000",
});
return response;
} catch (error) {
if (typeof error === "object" && error !== null && "message" in error) {
return rejectWithValue(error.message);
}
return rejectWithValue("Unknown error occurred");
}
}
);
export const unBlockDevice = createAsyncThunk(
"command/unBlockDevice",
async (deviceId: string, { rejectWithValue }) => {
try {
const response = await sendRpcRequest("command.block", {
deviceId,
});
return response;
} catch (error) {
if (typeof error === "object" && error !== null && "message" in error) {
return rejectWithValue(error.message);
}
return rejectWithValue("Unknown error occurred");
}
}
);
const commandSlice = createSlice({
name: "command",
initialState,
reducers: {},
extraReducers: (builder) => {
builder
.addCase(blockDevice.pending, (state) => {
state.isLoadingBlockDevice = true;
})
.addCase(blockDevice.fulfilled, (state) => {
state.isLoadingBlockDevice = false;
})
.addCase(unBlockDevice.pending, (state) => {
state.isLoadingUnBlockDevice = true;
})
.addCase(unBlockDevice.fulfilled, (state) => {
state.isLoadingUnBlockDevice = false;
});
},
});
export default commandSlice.reducer;
...@@ -3,6 +3,7 @@ import authSlice from "./slices/authSlice"; ...@@ -3,6 +3,7 @@ import authSlice from "./slices/authSlice";
import accountSlice from "./slices/accountSlice"; import accountSlice from "./slices/accountSlice";
import notificationSlice from "./slices/notificationSlice"; import notificationSlice from "./slices/notificationSlice";
import deviceSlice from "./slices/deviceSlice"; import deviceSlice from "./slices/deviceSlice";
import commandSlice from "./slices/commandSlice";
import { import {
useDispatch, useDispatch,
useSelector, useSelector,
...@@ -15,6 +16,7 @@ export const store = configureStore({ ...@@ -15,6 +16,7 @@ export const store = configureStore({
account: accountSlice, account: accountSlice,
notification: notificationSlice, notification: notificationSlice,
device: deviceSlice, device: deviceSlice,
command: commandSlice,
}, },
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment