|
import * as Tabs from '@radix-ui/react-tabs'; |
|
import { useRevokeAllUserKeysMutation, useRevokeUserKeyMutation } from 'librechat-data-provider'; |
|
import React, { useState, useCallback, useRef } from 'react'; |
|
import { useOnClickOutside } from '~/hooks'; |
|
import DangerButton from './DangerButton'; |
|
|
|
export const RevokeKeysButton = ({ |
|
showText = true, |
|
endpoint = '', |
|
all = false, |
|
disabled = false, |
|
}: { |
|
showText?: boolean; |
|
endpoint?: string; |
|
all?: boolean; |
|
disabled?: boolean; |
|
}) => { |
|
const [confirmClear, setConfirmClear] = useState(false); |
|
const revokeKeyMutation = useRevokeUserKeyMutation(endpoint); |
|
const revokeKeysMutation = useRevokeAllUserKeysMutation(); |
|
|
|
const contentRef = useRef(null); |
|
useOnClickOutside(contentRef, () => confirmClear && setConfirmClear(false), []); |
|
|
|
const revokeAllUserKeys = useCallback(() => { |
|
if (confirmClear) { |
|
revokeKeysMutation.mutate({}); |
|
setConfirmClear(false); |
|
} else { |
|
setConfirmClear(true); |
|
} |
|
}, [confirmClear, revokeKeysMutation]); |
|
|
|
const revokeUserKey = useCallback(() => { |
|
if (!endpoint) { |
|
return; |
|
} else if (confirmClear) { |
|
revokeKeyMutation.mutate({}); |
|
setConfirmClear(false); |
|
} else { |
|
setConfirmClear(true); |
|
} |
|
}, [confirmClear, revokeKeyMutation, endpoint]); |
|
|
|
const onClick = all ? revokeAllUserKeys : revokeUserKey; |
|
|
|
return ( |
|
<DangerButton |
|
ref={contentRef} |
|
showText={showText} |
|
onClick={onClick} |
|
disabled={disabled} |
|
confirmClear={confirmClear} |
|
id={'revoke-all-user-keys'} |
|
actionTextCode={'com_ui_revoke'} |
|
infoTextCode={'com_ui_revoke_info'} |
|
dataTestIdInitial={'revoke-all-keys-initial'} |
|
dataTestIdConfirm={'revoke-all-keys-confirm'} |
|
mutation={all ? revokeKeysMutation : revokeKeyMutation} |
|
/> |
|
); |
|
}; |
|
|
|
function Data() { |
|
return ( |
|
<Tabs.Content value="data" role="tabpanel" className="w-full md:min-h-[300px]"> |
|
<div className="flex flex-col gap-3 text-sm text-gray-600 dark:text-gray-300"> |
|
<div className="border-b pb-3 last-of-type:border-b-0 dark:border-gray-700"> |
|
<RevokeKeysButton all={true} /> |
|
</div> |
|
</div> |
|
</Tabs.Content> |
|
); |
|
} |
|
|
|
export default React.memo(Data); |
|
|