added family wallet redeem options

This commit was merged in pull request #629.
This commit is contained in:
victorAnumudu
2024-03-08 21:50:42 +01:00
parent 71ee75072d
commit 7f83cd5cc6
6 changed files with 140 additions and 35 deletions
+2 -34
View File
@@ -7,6 +7,7 @@ import { PriceFormatter } from "../Helpers/PriceFormatter";
import SearchCom from "../Helpers/SearchCom";
import { localImgLoad } from "../../lib";
import background from "../../assets/images/bg-sky-blue.jpg";
import FamilyWalletRedeemOptions from "./FamilyWalletRedeemOptions";
/**
* Renders a list of wallet items or a loading spinner depending on the state of the `wallet` object.
@@ -23,21 +24,6 @@ export default function FamilyWalletBox({ wallet, payment, countries }) {
const currentWalletSelected = data?.filter((item) => item.code === name);
}
const [redeemData, setRedeemData] = useState({loading: true, data: []});
const [filteredRedeemData, setFilteredRedeemData] = useState({value: '', data:[]}) // State to hold filter blog
const handleFilterRedeemData = ({target}) => {
// let filterWord = target.value
// let filteredData = []
// if(!filterWord){
// filteredData = redeemData?.data?.redeemData
// }else{
// filteredData = redeemData?.data?.redeemData?.filter(item => item.post_title.toLowerCase().startsWith(filterWord.toLowerCase()))
// }
// setFilteredRedeemData({value:target.value, data: filteredData})
}
const image = selectedWallet.code
? `${selectedWallet.code.toLowerCase()}.svg`
: "default.png";
@@ -91,25 +77,7 @@ export default function FamilyWalletBox({ wallet, payment, countries }) {
</div>
</div>
<div className="w-full">
<div className="w-full sm:flex items-center gap-4">
<h1 className="text-2xl font-bold text-black dark:text-white">Redeem Options</h1>
<div className="sm:w-1/2 w-full sm:pr-20 pr-0 mb-5 sm:mb-0">
<SearchCom
placeholder='Search Blog Items...'
value={filteredRedeemData.value}
handleSearch={handleFilterRedeemData}
/>
</div>
</div>
{/* redeem options */}
<div className="mt-5 grid sm:grid-cols-2 lg:grid-cols-3 xxl:grid-cols-4 gap-4">
{[1,2,3,4,5,6,7].map(item => (
<div key={item} className="p-5 h-60 bg-white dark:bg-dark-white text-black dark:text-white rounded-2xl shadow-md hover:shadow-none transition-all duration-300">
Dummy
</div>
))}
</div>
<FamilyWalletRedeemOptions />
</div>
</div>
);
@@ -0,0 +1,83 @@
import React, { useEffect, useState } from 'react'
import SearchCom from '../Helpers/SearchCom'
import LoadingSpinner from '../Spinners/LoadingSpinner';
import { Link } from 'react-router-dom';
import { useSelector } from 'react-redux';
export default function FamilyWalletRedeemOptions() {
const { familyWalletRedeemOptList } = useSelector((state) => state.familyWalletRedeemOptList); // FAMILY WALLET REDDEM OPTIONS LIST
const [filteredRedeemData, setFilteredRedeemData] = useState({value: '', data:{}}) // State to hold filtered redeem banner option
const handleFilterRedeemData = ({target}) => {
// thiskey01
let filterWord = target.value
let filteredData = {}
if(!filterWord){
filteredData = {...familyWalletRedeemOptList?.data}
}else{
let matchedData = Object.keys(familyWalletRedeemOptList?.data)?.filter(item => (item.toLowerCase().startsWith(filterWord.toLowerCase())))
filteredData = matchedData.map(item => familyWalletRedeemOptList.data[item])
}
setFilteredRedeemData({value:target.value, data: {...filteredData}})
}
useEffect(()=>{
setFilteredRedeemData(prev => ({...prev, data:{...familyWalletRedeemOptList?.data}}))
}, [familyWalletRedeemOptList.image])
return (
<div className="w-full">
<div className="w-full sm:flex items-center gap-4">
<h1 className="text-2xl font-bold text-black dark:text-white">Redeem Options</h1>
<div className="sm:w-1/2 w-full sm:pr-20 pr-0 mb-5 sm:mb-0">
<SearchCom
placeholder='Search...'
value={filteredRedeemData.value}
handleSearch={handleFilterRedeemData}
/>
</div>
</div>
{/* redeem options */}
{familyWalletRedeemOptList.loading ?
<div className='mt-5 w-full h-[20rem] rounded-2xl bg-white dark:bg-dark-white text-black dark:text-white flex justify-center items-center'>
<LoadingSpinner size='10' color='sky-blue' height='h-[30rem]' />
</div>
: Object.keys(familyWalletRedeemOptList?.data)?.length > 0 ?
Object.keys(filteredRedeemData?.data)?.length ?
<div className="mt-5 grid sm:grid-cols-2 lg:grid-cols-3 xxl:grid-cols-4 gap-4">
{ Object.keys(filteredRedeemData?.data)?.map((item)=>{
// text, image, description, action
let newData = filteredRedeemData?.data[item].banner
let bgImage = `url(${newData?.image})`
return (
<Link to={''} key={item}>
<div className={`group relative h-60 text-black dark:text-white rounded-2xl shadow-md hover:shadow-none transition-all duration-300 overflow-hidden`}
style={{
// background: `#ffffff ${bgImage} no-repeat center center / cover`
}}
>
<img src={newData?.image} alt='Redeem Image' className='w-full h-full bg-cover rounded-2xl group-hover:scale-110 transition-all duration-300' />
<div className='absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 p-2 bg-white/80 rounded-2xl w-[80%] flex flex-col justify-center items-center gap-2'>
<h1 className='text-lg font-bold text-[#083e21]'>{newData.text}</h1>
<p className='text-base text-black'>{newData.description}</p>
</div>
</div>
</Link>
)
})}
</div>
:
<div className='mt-5 w-full h-[20rem] rounded-2xl bg-white dark:bg-dark-white text-black dark:text-white flex justify-center items-center'>
<p>Search Item not Found!</p>
</div>
:
<div className='mt-5 w-full h-[20rem] rounded-2xl bg-white dark:bg-dark-white text-black dark:text-white flex justify-center items-center'>
<p>No Redeem Options Found!</p>
</div>
}
</div>
)
}
+19
View File
@@ -13,6 +13,7 @@ import { updateUserJobList } from "../store/userJobList";
import { updateWalletDetails } from "../store/walletDetails";
import { familyBannersList } from "../store/FamilyBannerList";
import { familyResources } from "../store/FamilyResources";
import {familyWalletRedeemOptList} from '../store/FamilyWalletRedeemOpt'
const AuthRoute = ({ redirectPath = "/login", children }) => {
const apiCall = useMemo(() => new usersService(), []);
@@ -291,6 +292,24 @@ const AuthRoute = ({ redirectPath = "/login", children }) => {
}, [isLogin.status]);
//FUNCTION TO GET FAMILY WALLET REDEEM OPTIONS
useEffect(() => {
if((!loggedIn && !isLogin.status) || account_type == 'FULL'){ // DO NOT CALL THIS, IF USER ACCOUNT TYPE IS FULL
return
}
const familyWalletRedeemOptions = async () => { // FUNCTION TO GET FAMILY WALLET REDDEM OPTIONS
dispatch(familyWalletRedeemOptList({loading: true, image: '', data:{}}))
apiCall.getFamilyWalletRedeemOptions().then((res)=>{
dispatch(familyWalletRedeemOptList({loading: false, image: res?.data?.session_image_server, data:res?.data?.result_list}))
}).catch((err)=>{
console.log(err)
dispatch(familyWalletRedeemOptList({loading: false, image: '', data:{}}))
})
};
familyWalletRedeemOptions()
}, [isLogin.status]);
// RENDER PAGE
return isLogin.loading && !loggedIn ? (
<LoadingSpinner size="32" color="sky-blue" height="h-screen" />
+13
View File
@@ -1305,6 +1305,19 @@ class usersService {
};
return this.postAuxEnd("/blogdata", postData);
}
// API FUNCTION FOR FAMILY WALLET REDEEM OPTIONS
getFamilyWalletRedeemOptions() {
var postData = {
uuid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: apiConst.WRENCHBOARD_JOB_ACTIVE,
offset: 0,
limit: 30,
};
return this.postAuxEnd("/familywallet/redeem/options", postData);
}
/*
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username)
+20
View File
@@ -0,0 +1,20 @@
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
familyWalletRedeemOptList: {loading: true, image: '', data: {}}
};
export const familyWalletRedeemOptListSlice = createSlice({
name: "familyWalletRedeemOptList",
initialState,
reducers: {
familyWalletRedeemOptList: (state,action) => {
state.familyWalletRedeemOptList = {...action.payload}
},
},
});
// Action creators are generated for each case reducer function
export const { familyWalletRedeemOptList } = familyWalletRedeemOptListSlice.actions;
export default familyWalletRedeemOptListSlice.reducer;
+3 -1
View File
@@ -10,6 +10,7 @@ import userJobListReducer from "./userJobList";
import walletDetails from "./walletDetails";
import familyBannerListReducer from "./FamilyBannerList"
import familyResourcesReducer from './FamilyResources'
import familyWalletRedeemOptListReducer from './FamilyWalletRedeemOpt'
export default configureStore({
reducer: {
@@ -22,6 +23,7 @@ export default configureStore({
notifications: notificationsReducer,
walletDetails: walletDetails,
familyBannersList: familyBannerListReducer,
familyResources: familyResourcesReducer
familyResources: familyResourcesReducer,
familyWalletRedeemOptList: familyWalletRedeemOptListReducer
},
});