upd: user role
Desrkipsi: - global state pada user role login - update fitur home No Issues
This commit is contained in:
@@ -1,26 +1,13 @@
|
|||||||
import ButtonBackHeader from "@/components/buttonBackHeader";
|
import ButtonBackHeader from "@/components/buttonBackHeader";
|
||||||
import { ButtonFiturMenu } from "@/components/buttonFiturMenu";
|
import { ButtonFiturMenu } from "@/components/buttonFiturMenu";
|
||||||
import Styles from "@/constants/Styles";
|
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 { AntDesign, Entypo, Ionicons, MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons";
|
||||||
import { router, Stack } from "expo-router";
|
import { router, Stack } from "expo-router";
|
||||||
import { useEffect, useState } from "react";
|
|
||||||
import { SafeAreaView, View } from "react-native";
|
import { SafeAreaView, View } from "react-native";
|
||||||
|
import { useSelector } from "react-redux";
|
||||||
|
|
||||||
export default function Feature() {
|
export default function Feature() {
|
||||||
const { token, decryptToken } = useAuthSession()
|
const entityUser = useSelector((state: any) => state.user)
|
||||||
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()
|
|
||||||
})
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SafeAreaView>
|
<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={<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') }} />
|
<ButtonFiturMenu icon={<Ionicons name="chatbubbles-sharp" size={35} color="black" />} text="Diskusi" onPress={() => { router.push('/discussion?active=true') }} />
|
||||||
</View>
|
</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={<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') }} />
|
<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={<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={() => { }} />
|
<ButtonFiturMenu icon={<Ionicons name="color-palette-sharp" size={35} color="black" />} text="Tema" onPress={() => { }} />
|
||||||
@@ -53,7 +40,7 @@ export default function Feature() {
|
|||||||
}
|
}
|
||||||
</View>
|
</View>
|
||||||
{
|
{
|
||||||
(roleUser == "supadmin" || roleUser == "developer") &&
|
(entityUser.role == "supadmin" || entityUser.role == "developer") &&
|
||||||
<View style={[Styles.rowSpaceBetween, Styles.mb15]}>
|
<View style={[Styles.rowSpaceBetween, Styles.mb15]}>
|
||||||
<ButtonFiturMenu icon={<Entypo name="image-inverted" size={35} color="black" />} text="Banner" onPress={() => { router.push('/banner') }} />
|
<ButtonFiturMenu icon={<Entypo name="image-inverted" size={35} color="black" />} text="Banner" onPress={() => { router.push('/banner') }} />
|
||||||
</View>
|
</View>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import Styles from "@/constants/Styles";
|
import Styles from "@/constants/Styles";
|
||||||
import { apiGetBanner } from "@/lib/api";
|
import { apiGetBanner, apiGetProfile } from "@/lib/api";
|
||||||
import { setEntities } from "@/lib/bannerSlice";
|
import { setEntities } from "@/lib/bannerSlice";
|
||||||
|
import { setEntityUser } from "@/lib/userSlice";
|
||||||
import { useAuthSession } from "@/providers/AuthProvider";
|
import { useAuthSession } from "@/providers/AuthProvider";
|
||||||
import React, { useEffect } from "react";
|
import React, { useEffect } from "react";
|
||||||
import { Dimensions, Image, View } from "react-native";
|
import { Dimensions, Image, View } from "react-native";
|
||||||
@@ -15,16 +16,27 @@ export default function CaraouselHome() {
|
|||||||
const progress = useSharedValue<number>(0);
|
const progress = useSharedValue<number>(0);
|
||||||
const dispatch = useDispatch()
|
const dispatch = useDispatch()
|
||||||
const entities = useSelector((state: any) => state.banner)
|
const entities = useSelector((state: any) => state.banner)
|
||||||
|
const entityUser = useSelector((state: any) => state.user)
|
||||||
|
|
||||||
async function handleBannerView() {
|
async function handleBannerView() {
|
||||||
const hasil = await decryptToken(String(token?.current))
|
const hasil = await decryptToken(String(token?.current))
|
||||||
apiGetBanner({ user: hasil }).then((data) => dispatch(setEntities(data.data)))
|
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(() => {
|
useEffect(() => {
|
||||||
handleBannerView()
|
handleBannerView()
|
||||||
}, [dispatch]);
|
}, [dispatch]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
handleUser()
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={[Styles.mv15]}>
|
<View style={[Styles.mv15]}>
|
||||||
<Carousel
|
<Carousel
|
||||||
|
|||||||
@@ -1,18 +1,15 @@
|
|||||||
import { combineReducers, combineSlices, configureStore } from '@reduxjs/toolkit';
|
import { configureStore } from '@reduxjs/toolkit';
|
||||||
import bannerReducer from './bannerSlice';
|
import bannerReducer from './bannerSlice';
|
||||||
import entitiesReducer from './entitiesSlice';
|
import entitiesReducer from './entitiesSlice';
|
||||||
|
import userReducer from './userSlice';
|
||||||
|
|
||||||
|
|
||||||
const reducer = combineSlices({
|
|
||||||
entitiesReducer,bannerReducer
|
|
||||||
})
|
|
||||||
|
|
||||||
const store = configureStore({
|
const store = configureStore({
|
||||||
reducer: {
|
reducer: {
|
||||||
entities: entitiesReducer,
|
entities: entitiesReducer,
|
||||||
banner: bannerReducer,
|
banner: bannerReducer,
|
||||||
|
user: userReducer
|
||||||
}
|
}
|
||||||
// Add other reducers as needed
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default store;
|
export default store;
|
||||||
14
lib/userSlice.ts
Normal file
14
lib/userSlice.ts
Normal 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;
|
||||||
Reference in New Issue
Block a user