Moves system-level operations (auth, billing, admin) to use the /metadata endpoint instead of /graphql. This cleans up the endpoint separation so /graphql is purely for core objects (Company, People, etc.) and /metadata handles all system operations. Part of prep work for webhook/API key core migration.
82 lines
2.8 KiB
TypeScript
82 lines
2.8 KiB
TypeScript
import { approvedAccessDomainsState } from '@/settings/security/states/ApprovedAccessDomainsState';
|
|
import { SnackBarVariant } from '@/ui/feedback/snack-bar-manager/components/SnackBar';
|
|
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
|
|
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
|
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
|
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
|
import { UnwrapRecoilValue, useSetRecoilState } from 'recoil';
|
|
import { isDefined } from 'twenty-shared/utils';
|
|
import { IconDotsVertical, IconTrash } from 'twenty-ui/display';
|
|
import { LightIconButton } from 'twenty-ui/input';
|
|
import { MenuItem } from 'twenty-ui/navigation';
|
|
import { useDeleteApprovedAccessDomainMutation } from '~/generated-metadata/graphql';
|
|
|
|
type SettingsSecurityApprovedAccessDomainRowDropdownMenuProps = {
|
|
approvedAccessDomain: UnwrapRecoilValue<typeof approvedAccessDomainsState>[0];
|
|
};
|
|
|
|
export const SettingsSecurityApprovedAccessDomainRowDropdownMenu = ({
|
|
approvedAccessDomain,
|
|
}: SettingsSecurityApprovedAccessDomainRowDropdownMenuProps) => {
|
|
const dropdownId = `settings-approved-access-domain-row-${approvedAccessDomain.id}`;
|
|
|
|
const setApprovedAccessDomains = useSetRecoilState(
|
|
approvedAccessDomainsState,
|
|
);
|
|
|
|
const { enqueueSnackBar } = useSnackBar();
|
|
|
|
const { closeDropdown } = useDropdown(dropdownId);
|
|
|
|
const [deleteApprovedAccessDomain] = useDeleteApprovedAccessDomainMutation();
|
|
|
|
const handleDeleteApprovedAccessDomain = async () => {
|
|
const result = await deleteApprovedAccessDomain({
|
|
variables: {
|
|
input: {
|
|
id: approvedAccessDomain.id,
|
|
},
|
|
},
|
|
onCompleted: () => {
|
|
setApprovedAccessDomains((approvedAccessDomains) => {
|
|
return approvedAccessDomains.filter(
|
|
({ id }) => id !== approvedAccessDomain.id,
|
|
);
|
|
});
|
|
},
|
|
});
|
|
if (isDefined(result.errors)) {
|
|
enqueueSnackBar('Error deleting approved access domain', {
|
|
variant: SnackBarVariant.Error,
|
|
duration: 2000,
|
|
});
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Dropdown
|
|
dropdownId={dropdownId}
|
|
dropdownPlacement="right-start"
|
|
clickableComponent={
|
|
<LightIconButton Icon={IconDotsVertical} accent="tertiary" />
|
|
}
|
|
dropdownComponents={
|
|
<DropdownContent>
|
|
<DropdownMenuItemsContainer>
|
|
<MenuItem
|
|
accent="danger"
|
|
LeftIcon={IconTrash}
|
|
text="Delete"
|
|
onClick={() => {
|
|
handleDeleteApprovedAccessDomain();
|
|
closeDropdown();
|
|
}}
|
|
/>
|
|
</DropdownMenuItemsContainer>
|
|
</DropdownContent>
|
|
}
|
|
/>
|
|
);
|
|
};
|