upd: user role

Desrkipsi:
- global state pada user role login
- update fitur home

No Issues
This commit is contained in:
amel
2025-04-29 11:01:36 +08:00
parent b4c560b88e
commit 9b471eb269
4 changed files with 36 additions and 26 deletions

View File

@@ -1,26 +1,13 @@
import ButtonBackHeader from "@/components/buttonBackHeader";
import { ButtonFiturMenu } from "@/components/buttonFiturMenu";
import Styles from "@/constants/Styles";
import { apiGetProfile } from "@/lib/api";
import { useAuthSession } from "@/providers/AuthProvider";
import { AntDesign, Entypo, Ionicons, MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons";
import { router, Stack } from "expo-router";
import { useEffect, useState } from "react";
import { SafeAreaView, View } from "react-native";
import { useSelector } from "react-redux";
export default function Feature() {
const { token, decryptToken } = useAuthSession()
const [roleUser, setRoleUser] = useState('user')
async function handleUserLogin() {
const hasil = await decryptToken(String(token?.current))
const respons = await apiGetProfile({ id: hasil })
setRoleUser(respons.data.idUserRole)
}
useEffect(() => {
handleUserLogin()
})
const entityUser = useSelector((state: any) => state.user)
return (
<SafeAreaView>
@@ -38,14 +25,14 @@ export default function Feature() {
<ButtonFiturMenu icon={<MaterialIcons name="campaign" size={35} color="black" />} text="Pengumuman" onPress={() => { router.push('/announcement') }} />
<ButtonFiturMenu icon={<Ionicons name="chatbubbles-sharp" size={35} color="black" />} text="Diskusi" onPress={() => { router.push('/discussion?active=true') }} />
</View>
<View style={[Styles.rowSpaceBetween, Styles.mb15, (roleUser != 'supadmin' && roleUser != 'developer' && roleUser != 'cosupadmin' && Styles.w40)]}>
<View style={[Styles.rowSpaceBetween, Styles.mb15, (entityUser.role != 'supadmin' && entityUser.role != 'developer' && entityUser.role != 'cosupadmin' && Styles.w40)]}>
<ButtonFiturMenu icon={<MaterialIcons name="groups" size={35} color="black" />} text="Anggota" onPress={() => { router.push('/member?active=true') }} />
<ButtonFiturMenu icon={<MaterialCommunityIcons name="account-tie" size={35} color="black" />} text="Jabatan" onPress={() => { router.push('/position?active=true') }} />
{
roleUser == "cosupadmin" && <ButtonFiturMenu icon={<Entypo name="image-inverted" size={35} color="black" />} text="Banner" onPress={() => { router.push('/banner') }} />
entityUser.role == "cosupadmin" && <ButtonFiturMenu icon={<Entypo name="image-inverted" size={35} color="black" />} text="Banner" onPress={() => { router.push('/banner') }} />
}
{
(roleUser == "supadmin" || roleUser == "developer") &&
(entityUser.role == "supadmin" || entityUser.role == "developer") &&
<>
<ButtonFiturMenu icon={<AntDesign name="tags" size={35} color="black" />} text="Lembaga Desa" onPress={() => { router.push('/group?active=true') }} />
<ButtonFiturMenu icon={<Ionicons name="color-palette-sharp" size={35} color="black" />} text="Tema" onPress={() => { }} />
@@ -53,7 +40,7 @@ export default function Feature() {
}
</View>
{
(roleUser == "supadmin" || roleUser == "developer") &&
(entityUser.role == "supadmin" || entityUser.role == "developer") &&
<View style={[Styles.rowSpaceBetween, Styles.mb15]}>
<ButtonFiturMenu icon={<Entypo name="image-inverted" size={35} color="black" />} text="Banner" onPress={() => { router.push('/banner') }} />
</View>

View File

@@ -1,6 +1,7 @@
import Styles from "@/constants/Styles";
import { apiGetBanner } from "@/lib/api";
import { apiGetBanner, apiGetProfile } from "@/lib/api";
import { setEntities } from "@/lib/bannerSlice";
import { setEntityUser } from "@/lib/userSlice";
import { useAuthSession } from "@/providers/AuthProvider";
import React, { useEffect } from "react";
import { Dimensions, Image, View } from "react-native";
@@ -15,16 +16,27 @@ export default function CaraouselHome() {
const progress = useSharedValue<number>(0);
const dispatch = useDispatch()
const entities = useSelector((state: any) => state.banner)
const entityUser = useSelector((state: any) => state.user)
async function handleBannerView() {
const hasil = await decryptToken(String(token?.current))
apiGetBanner({ user: hasil }).then((data) => dispatch(setEntities(data.data)))
}
async function handleUser() {
const hasil = await decryptToken(String(token?.current))
const response = await apiGetProfile({ id: hasil })
dispatch(setEntityUser({ role: response.data.idUserRole, admin: false }))
}
useEffect(() => {
handleBannerView()
}, [dispatch]);
useEffect(() => {
handleUser()
}, []);
return (
<View style={[Styles.mv15]}>
<Carousel

View File

@@ -1,18 +1,15 @@
import { combineReducers, combineSlices, configureStore } from '@reduxjs/toolkit';
import { configureStore } from '@reduxjs/toolkit';
import bannerReducer from './bannerSlice';
import entitiesReducer from './entitiesSlice';
import userReducer from './userSlice';
const reducer = combineSlices({
entitiesReducer,bannerReducer
})
const store = configureStore({
reducer: {
entities: entitiesReducer,
banner: bannerReducer,
user: userReducer
}
// Add other reducers as needed
});
export default store;

14
lib/userSlice.ts Normal file
View File

@@ -0,0 +1,14 @@
import { createSlice } from '@reduxjs/toolkit';
const userSlice = createSlice({
name: 'user',
initialState: { role: '', admin: false },
reducers: {
setEntityUser: (state, action) => {
return action.payload;
},
},
});
export const { setEntityUser } = userSlice.actions;
export default userSlice.reducer;