Commit f6dd96ab by asranov0003

feat: render black and white lists

parent b840a4ff
import React, { useEffect, useState } from "react"; import React, { useCallback, useEffect, useState } from "react";
import "./BlockApps.css"; import "./BlockApps.css";
import SectionHeader from "../../layouts/SectionHeader"; import SectionHeader from "../../layouts/SectionHeader";
import { LuWalletCards } from "react-icons/lu"; import { LuWalletCards } from "react-icons/lu";
...@@ -10,7 +10,11 @@ import { ...@@ -10,7 +10,11 @@ import {
useAppSelector, useAppSelector,
type RootState, type RootState,
} from "../../stores/store"; } from "../../stores/store";
import { fetchAppList } from "../../stores/slices/appsSlice"; import {
fetchAppList,
fetchBlackList,
fetchWhiteList,
} from "../../stores/slices/appsSlice";
const BlockApps: React.FC = () => { const BlockApps: React.FC = () => {
const [selectedTab, setSelectedTab] = useState<"all" | "blocked" | "allowed">( const [selectedTab, setSelectedTab] = useState<"all" | "blocked" | "allowed">(
...@@ -18,12 +22,22 @@ const BlockApps: React.FC = () => { ...@@ -18,12 +22,22 @@ const BlockApps: React.FC = () => {
); );
const { t } = useTranslation(); const { t } = useTranslation();
const { selectedDevice } = useAppSelector((state: RootState) => state.device); const { selectedDevice } = useAppSelector((state: RootState) => state.device);
const { allApps } = useAppSelector((state: RootState) => state.apps); const { allApps, blackList, whiteList } = useAppSelector(
(state: RootState) => state.apps
);
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const fetchDatas = useCallback(async () => {
const deviceId = selectedDevice?.id || "";
await dispatch(fetchAppList(deviceId));
await dispatch(fetchBlackList(deviceId));
await dispatch(fetchWhiteList(deviceId));
}, [selectedDevice?.id, dispatch]);
useEffect(() => { useEffect(() => {
dispatch(fetchAppList(selectedDevice?.id || "")); fetchDatas();
}, [selectedDevice, dispatch]); }, [fetchDatas]);
const renderTabContent = () => { const renderTabContent = () => {
switch (selectedTab) { switch (selectedTab) {
...@@ -67,36 +81,64 @@ const BlockApps: React.FC = () => { ...@@ -67,36 +81,64 @@ const BlockApps: React.FC = () => {
return ( return (
<div className="blockapps__content"> <div className="blockapps__content">
<h3 className="blockapps__content__title"> <h3 className="blockapps__content__title">
{t("blockapps.blockedApps")} (0) {t("blockapps.blockedApps")} ({blackList.length})
</h3> </h3>
<div className="blockapps__content__actions"> <div className="blockapps__content__actions">
<CButton title={t("blockapps.unBlock")} disabled /> <CButton title={t("blockapps.unBlock")} disabled />
</div> </div>
<div className="blockapps__content__empty"> {blackList.length === 0 && (
<p>{t("blockapps.noFoundApps")}</p> <div className="blockapps__content__empty">
</div> <p>{t("blockapps.noFoundApps")}</p>
</div>
)}
<div className="blockapps__content__apps"></div> <div className="blockapps__content__apps">
{blackList.map((app, index) => {
return (
<div key={index} className="blockapps__content__app">
<img
src={`data:image/jpeg;base64,${app.appIcon}`}
alt={app.appName}
/>
<h4>{app.appName}</h4>
</div>
);
})}
</div>
</div> </div>
); );
case "allowed": case "allowed":
return ( return (
<div className="blockapps__content"> <div className="blockapps__content">
<h3 className="blockapps__content__title"> <h3 className="blockapps__content__title">
{t("blockapps.allowedApps")} (0) {t("blockapps.allowedApps")} ({whiteList.length})
</h3> </h3>
<div className="blockapps__content__actions"> <div className="blockapps__content__actions">
<CButton title={t("blockapps.remove")} disabled /> <CButton title={t("blockapps.remove")} disabled />
</div> </div>
<div className="blockapps__content__empty"> {whiteList.length === 0 && (
<p>{t("blockapps.noFoundApps")}</p> <div className="blockapps__content__empty">
</div> <p>{t("blockapps.noFoundApps")}</p>
</div>
)}
<div className="blockapps__content__apps"></div> <div className="blockapps__content__apps">
{whiteList.map((app, index) => {
return (
<div key={index} className="blockapps__content__app">
<img
src={`data:image/jpeg;base64,${app.appIcon}`}
alt={app.appName}
/>
<h4>{app.appName}</h4>
</div>
);
})}
</div>
</div> </div>
); );
default: default:
......
...@@ -11,12 +11,20 @@ export interface IApp { ...@@ -11,12 +11,20 @@ export interface IApp {
interface AppsState { interface AppsState {
allApps: IApp[]; allApps: IApp[];
blackList: IApp[];
whiteList: IApp[];
isLoadingAllApps: boolean; isLoadingAllApps: boolean;
isLoadingBlackList: boolean;
isLoadingWhiteList: boolean;
} }
const initialState: AppsState = { const initialState: AppsState = {
allApps: [], allApps: [],
blackList: [],
whiteList: [],
isLoadingAllApps: false, isLoadingAllApps: false,
isLoadingBlackList: false,
isLoadingWhiteList: false,
}; };
export const fetchAppList = createAsyncThunk( export const fetchAppList = createAsyncThunk(
...@@ -28,6 +36,8 @@ export const fetchAppList = createAsyncThunk( ...@@ -28,6 +36,8 @@ export const fetchAppList = createAsyncThunk(
wIcons: true, wIcons: true,
}); });
console.log("All Apps Response: ", response.list);
return response.list; return response.list;
} catch (error) { } catch (error) {
if (typeof error === "object" && error !== null && "message" in error) { if (typeof error === "object" && error !== null && "message" in error) {
...@@ -39,6 +49,70 @@ export const fetchAppList = createAsyncThunk( ...@@ -39,6 +49,70 @@ export const fetchAppList = createAsyncThunk(
} }
); );
export const fetchBlackList = createAsyncThunk(
"apps/fetchBlackList",
async (deviceId: string, { rejectWithValue, getState }) => {
try {
const response = await sendRpcRequest<{ list: string[] }>(
"apps.blacklist",
{
deviceId,
}
);
const state = getState() as { apps: AppsState };
const allApps = state.apps.allApps;
const filtered = allApps.filter((app) =>
response.list.includes(app.pkgName)
);
return filtered;
} catch (error) {
if (typeof error === "object" && error !== null && "message" in error) {
return rejectWithValue(error.message);
}
return rejectWithValue("Unknown error occurred");
}
}
);
export const fetchWhiteList = createAsyncThunk(
"apps/fetchWhiteList",
async (deviceId: string, { rejectWithValue, getState, dispatch }) => {
const state = getState() as { apps: AppsState };
if (state.apps.allApps.length === 0) {
const result = await dispatch(fetchAppList(deviceId));
if (fetchAppList.rejected.match(result)) {
return rejectWithValue("Failed to fetch all apps before whitelist.");
}
}
try {
const response = await sendRpcRequest<{ list: string[] }>(
"apps.whitelist",
{ deviceId }
);
const updatedState = getState() as { apps: AppsState };
const allApps = updatedState.apps.allApps;
const filtered = allApps.filter((app) =>
response.list.includes(app.pkgName)
);
return filtered;
} catch (error) {
if (typeof error === "object" && error !== null && "message" in error) {
return rejectWithValue(error.message);
}
return rejectWithValue("Unknown error occurred");
}
}
);
const appsSlice = createSlice({ const appsSlice = createSlice({
name: "apps", name: "apps",
initialState, initialState,
...@@ -51,6 +125,31 @@ const appsSlice = createSlice({ ...@@ -51,6 +125,31 @@ const appsSlice = createSlice({
.addCase(fetchAppList.fulfilled, (state, action) => { .addCase(fetchAppList.fulfilled, (state, action) => {
state.isLoadingAllApps = false; state.isLoadingAllApps = false;
state.allApps = action.payload; state.allApps = action.payload;
})
.addCase(fetchAppList.rejected, (state) => {
state.isLoadingAllApps = false;
})
.addCase(fetchBlackList.pending, (state) => {
state.isLoadingBlackList = true;
})
.addCase(fetchBlackList.fulfilled, (state, action) => {
state.isLoadingBlackList = false;
state.blackList = action.payload;
})
.addCase(fetchBlackList.rejected, (state) => {
state.isLoadingBlackList = false;
})
.addCase(fetchWhiteList.pending, (state) => {
state.isLoadingWhiteList = true;
})
.addCase(fetchWhiteList.fulfilled, (state, action) => {
state.isLoadingWhiteList = false;
state.whiteList = action.payload;
})
.addCase(fetchWhiteList.rejected, (state) => {
state.isLoadingWhiteList = false;
}); });
}, },
}); });
......
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