add group api added

This commit is contained in:
victorAnumudu
2024-01-04 22:45:32 +01:00
parent 98ddc5aaae
commit f6e55718bb
10 changed files with 909 additions and 8 deletions
+224
View File
@@ -0,0 +1,224 @@
import React, { useState } from 'react'
import InputCom from '../../components/Helpers/Inputs/InputCom/index'
import LoadingSpinner from '../Spinners/LoadingSpinner'
import GroupMemberTable from './GroupMemberTable'
import EmailValidator from '../../lib/EmailValidator'
import usersService from '../../services/UsersService'
export default function MemberList({groupList, selectedGroup, setUpdateList}) {
const api = new usersService()
const [fields, setFields] = useState({
firstname: '',
lastname: '',
email: ''
})
const handleFieldsChange = ({target:{name, value}}) => {
setFields(prev => ({...prev, [name]:value}))
let error = requestState?.errors?.indexOf(name) //// checks if the input field was in error array and removes it when the input changes
if(error >= 0){
let oldErrorArr = requestState.errors
let newErrorArr = oldErrorArr.splice(error, 1)
setRequestState(prev => ({...prev, errors:oldErrorArr}))
}
}
const [requestState, setRequestState] = useState({
loading: false,
status: false,
message: '',
data: [],
errors: []
})
const addMember = () => {
let errors = Object.keys(fields).filter((item) => { // CHECKS FOR EMPTY STRINGS
if(typeof item == 'string' && fields[item] === ''){
return item
}
})
if(errors.length){
setRequestState({
loading: false,
status: false,
message: '',
data: [],
errors: [...errors]
})
return
}
//checks if email is a valid email address
let regEx = /^[^0-9][a-zA-Z0-9._%+-]+@[a-zA-Z]+(\.[a-zA-Z]+)+$/;
if (!EmailValidator(fields.email)) {
setRequestState({
loading: false,
status: false,
message: 'Email is invalid',
data: [],
errors: []
})
return setTimeout(()=>{
setRequestState({
loading: false,
status: false,
message: '',
data: [],
errors: []
})
},3000)
}
setRequestState({
loading: true,
status: false,
message: '',
data: [],
errors: []
})
const requestData = {
firstname:fields.firstname,lastname:fields.lastname, email:fields.email, group_id: selectedGroup?.id, action:13015
}
api.groupMemberAdd(requestData).then(response => {
let {status, data} = response
if(status != 200 || data?.internal_return < 0){
setRequestState({
loading: false,
status: false,
message: 'Unable to add member',
data: [],
errors: []
})
return
}
setRequestState({
loading: false,
status: true,
message: 'Member added',
data: [],
errors: []
})
setTimeout(()=>{
// trigger group page reload
setUpdateList(prev => !prev)
setRequestState({
loading: false,
status: false,
message: '',
data: [],
errors: []
})
}, 3000)
}).catch(error=>{
setRequestState({
loading: false,
status: false,
message: 'Something went wrong, try again',
data: [],
errors: []
})
}).finally(()=>{
setTimeout(()=>{
setRequestState({
loading: false,
status: false,
message: '',
data: [],
errors: []
})
setFields({
firstname: '',
lastname: '',
email: ''
})
}, 3000)
})
}
return (
<>
<div className='p-5 w-full min-h-[600px] overflow-y-auto'>
{groupList && groupList.length < 1 ?
<>
<h1 className='my-5 text-lg lg:text-xl tracking-wide text-slate-900 dark:text-slate-100'>No Group selected</h1>
</>
:
<>
<h1 className='mb-5 text-lg lg:text-2xl tracking-wide font-bold text-slate-900 dark:text-slate-100'>{selectedGroup?.name}</h1>
<div className='w-full flex flex-col-reverse lg:flex-col'>
<div className='py-3 w-full sm:w-[500px] xl:w-full xxl:w-[500px]'>
<div className='relative grid grid-cols-1 sm:grid-cols-2 gap-2'>
<div className='h-10 relative'>
<input
id='firstname'
name='firstname'
// className={`peer px-5 w-full h-full rounded-full outline-none placeholder:text-transparent transition-all duration-500 text-black dark:text-black bg-gradient-to-br from-slate-50/80 via-slate-200/80 to-slate-100/80 focus:from-slate-100/80 focus:to-slate-50/80`}
className={`peer px-5 w-full h-full rounded-full outline-none border placeholder:text-slate-600 transition-all duration-500 text-black dark:text-black bg-gradient-to-br from-slate-50/80 via-slate-200/80 to-slate-100/80 focus:from-slate-100/80 focus:to-slate-50/80 ${requestState.errors.includes('firstname') ? 'border-red-500' : 'border-transparent'}`}
type='text'
placeholder='First Name'
value={fields.firstname}
onChange={handleFieldsChange}
/>
{/* <label htmlFor='firstname' className={`text-sm text-black dark:text-slate-500 absolute left-5 -top-4 translate-y-0 peer-focus:-top-3 peer-focus:translate-y-0 peer-placeholder-shown:top-1/2 peer-placeholder-shown:-translate-y-1/2 transition-all duration-500 ${requestState.errors.includes('firstname') ? 'text-red-500' : ''}`}>First Name</label> */}
</div>
<div className='h-10 relative'>
<input
id='lastname'
name='lastname'
// className={`peer px-5 w-full h-full rounded-full outline-none placeholder:text-transparent transition-all duration-500 text-black dark:text-black bg-gradient-to-br from-slate-50/80 via-slate-200/80 to-slate-100/80 focus:from-slate-100/80 focus:to-slate-50/80`}
className={`peer px-5 w-full h-full rounded-full outline-none border placeholder:text-slate-600 transition-all duration-500 text-black dark:text-black bg-gradient-to-br from-slate-50/80 via-slate-200/80 to-slate-100/80 focus:from-slate-100/80 focus:to-slate-50/80 ${requestState.errors.includes('lastname') ? 'border-red-500' : 'border-transparent'}`}
type='text'
placeholder='Last Name'
value={fields.lastname}
onChange={handleFieldsChange}
/>
{/* <label htmlFor='lastname' className={`text-sm text-black dark:text-slate-500 absolute left-5 -top-4 translate-y-0 peer-focus:-top-3 peer-focus:translate-y-0 peer-placeholder-shown:top-1/2 peer-placeholder-shown:-translate-y-1/2 transition-all duration-500 ${requestState.errors.includes('lastname') ? 'text-red-500' : ''}`}>LastName</label> */}
</div>
<div className='h-10 relative'>
<input
id='email'
name='email'
// className={`peer px-5 w-full h-full rounded-full outline-none placeholder:text-transparent transition-all duration-500 text-black dark:text-black bg-gradient-to-br from-slate-50/80 via-slate-200/80 to-slate-100/80 focus:from-slate-100/80 focus:to-slate-50/80`}
className={`peer px-5 w-full h-full rounded-full outline-none border placeholder:text-slate-600 transition-all duration-500 text-black dark:text-black bg-gradient-to-br from-slate-50/80 via-slate-200/80 to-slate-100/80 focus:from-slate-100/80 focus:to-slate-50/80 ${requestState.errors.includes('email') ? 'border-red-500' : 'border-transparent'}`}
type='email'
placeholder='Email'
value={fields.email}
onChange={handleFieldsChange}
/>
{/* <label htmlFor='email' className={`text-sm text-black dark:text-slate-500 absolute left-5 -top-4 translate-y-0 peer-focus:-top-3 peer-focus:translate-y-0 peer-placeholder-shown:top-1/2 peer-placeholder-shown:-translate-y-1/2 transition-all duration-500 ${requestState.errors.includes('email') ? 'text-red-500' : ''}`}>Email</label> */}
</div>
<div className='flex justify-end items-center'>
{requestState.loading ?
<LoadingSpinner size='8' color='sky-blue' />
:
<button onClick={addMember} disabled={requestState.loading || requestState.status} className='py-2 px-4 flex justify-center items-center bg-sky-blue hover:bg-sky-600 text-base rounded-full text-white font-bold'>Add Member</button>
}
</div>
{!requestState.loading && requestState.message &&
<p className={`text-lg absolute -bottom-7 left-0 ${requestState.status ? 'text-green-500' : 'text-red-500'}`}>{requestState.message}</p>
}
</div>
</div>
<div className='my-2 flex flex-col min-h-[300px]'>
{selectedGroup?.data?.length < 1 ?
<h1 className='my-5 text-lg lg:text-xl tracking-wide text-slate-900 dark:text-slate-100'>No Member Found, Please Add</h1>
:
<GroupMemberTable selectedList={selectedGroup?.data} />
}
</div>
</div>
</>
}
</div>
</>
)
}