add group api added
This commit is contained in:
@@ -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>
|
||||
</>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user