/* eslint-disable react-hooks/rules-of-hooks */ import { useCallback, useEffect, useRef, useState } from 'react'; import { Button, Flex, FormControl, FormHelperText, FormLabel, HStack, IconButton, Input, InputGroup, Menu, MenuButton, MenuDivider, MenuGroup, MenuItem, MenuItemOption, MenuList, MenuOptionGroup, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Stack, Text, Textarea, VStack, useColorModeValue, useToast } from '@chakra-ui/react'; import { AiFillCheckCircle } from 'react-icons/ai'; import { AccessGroup, Organization } from '@/types'; import { AsyncSelect, CreatableSelect, Select } from 'chakra-react-select'; import { Field, Form, Formik } from 'formik'; import { useAuthContext } from '@/contexts/AuthContext'; export default function InviteOrganizationRobloxGroupModal({ isOpen, onClose, onAdd, organization, accessGroupOptions }: { isOpen: boolean; onClose: () => void; onAdd: () => void; organization: any; accessGroupOptions: any; }) { const toast = useToast(); const initialRef = useRef(null); const finalRef = useRef(null); const { user } = useAuthContext(); const [groupRoles, setGroupRoles] = useState([]); const [groupSearchResults, setGroupSearchResults] = useState([]); const [lastGroupId, setLastGroupId] = useState(''); const groupIdRef = useRef(null); const groupRolesRef = useRef(null); const groupNameRef = useRef(null); const formRef = useRef(null); const getGroupSearchResults = (value: string, callback: any) => { user.getIdToken().then((token: any) => { fetch(`/api/v1/roblox/group-search/${encodeURIComponent(value)}`, { method: 'GET', headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }) .then((res) => { if (res.status === 200) { return res.json(); } else { return res.json().then((json) => { throw new Error(json.message); }); } }) .then((data) => { let options = [] as any; data.forEach((group: any) => { options.push({ label: group.name, value: group.id }); }); callback(options); }) .catch((error) => { toast({ title: 'There was an error fetching Roblox group search results.', description: error.message, status: 'error', duration: 5000, isClosable: true }); callback([]); }); }); }; const fetchGroupRoles = (groupId: any) => { groupId = groupId?.value; setGroupRoles([]); if (!groupId) return; user.getIdToken().then((token: any) => { fetch(`/api/v1/roblox/group-roles/${groupId}`, { method: 'GET', headers: { 'Content-Type': 'application/json' } }) .then((res) => { if (res.status === 200) { return res.json(); } else { return res.json().then((json) => { throw new Error(json.message); }); } }) .then((data) => { setGroupRoles( data.map((role: any) => { return { label: role.name, value: role.id }; }) ); if (lastGroupId !== groupId) { formRef.current.setFieldValue('robloxGroupRoles', []); } toast({ title: 'Successfully fetched group roles.', status: 'success', duration: 5000, isClosable: true }); setLastGroupId(groupId); }) .catch((error) => { toast({ title: 'There was an error fetching Roblox group roles.', description: error.message, status: 'error', duration: 5000, isClosable: true }); }); }); }; return ( <> { user.getIdToken().then((token: any) => { fetch(`/api/v1/organizations/${organization.id}/members`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ type: 'roblox-group', name: values.name || values.robloxGroupId?.label || 'Roblox Group', robloxGroupId: values.robloxGroupId?.value, robloxGroupRoles: values.robloxGroupRoles?.map((role: any) => role.value), // get access group ids from names accessGroups: values?.accessGroups.map((accessGroup: any) => accessGroup.value) }) }) .then((res) => { if (res.status === 200) { return res.json(); } else { return res.json().then((json) => { throw new Error(json.message); }); } }) .then((data) => { toast({ title: data.message, status: 'success', duration: 5000, isClosable: true }); onClose(); onAdd(); actions.resetForm(); }) .catch((error) => { toast({ title: 'There was an error adding a Roblox group to your organization.', description: error.message, status: 'error', duration: 5000, isClosable: true }); }) .finally(() => { actions.setSubmitting(false); }); }); }} > {(props) => (
Add Roblox Group {({ field, form }: any) => ( Name )} {({ field, form }: any) => ( Group 'No search results found.'} loadOptions={(inputValue, callback) => { getGroupSearchResults(inputValue, callback); }} onChange={(value) => { form.setFieldValue('robloxGroupId', value); fetchGroupRoles(value); }} value={field.value || []} /> )} {({ field, form }: any) => ( Group Roles { form.setFieldValue('accessGroups', value); }} value={field.value || []} placeholder="Select an access group..." isMulti closeMenuOnSelect={false} hideSelectedOptions={false} selectedOptionStyle={'check'} /> Add a Roblox group to your organization to start managing their access. )}
)}
); }