HEX
Server: LiteSpeed
System: Linux server902.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: deshuvsd (2181)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: /home/deshuvsd/www/wp-content/plugins/surerank/src/apps/admin-components/user-dropdown.js
import apiFetch from '@wordpress/api-fetch';
import { Avatar, DropdownMenu, toast } from '@bsf/force-ui';
import { Globe, LogOut, User } from 'lucide-react';
import { __ } from '@wordpress/i18n';
import { useDispatch, useSelect } from '@wordpress/data';
import { STORE_NAME } from '@/admin-store/constants';

const UserDropdown = () => {
	const searchConsole = useSelect( ( select ) =>
		select( STORE_NAME ).getSearchConsole()
	);
	const { toggleSiteSelectorModal, setConfirmationModal } =
		useDispatch( STORE_NAME );

	const handleChangeSite = () => {
		toggleSiteSelectorModal();
	};

	const handleDisconnect = () => {
		setConfirmationModal( {
			open: true,
			title: __( 'Disconnect Search Console Account', 'surerank' ),
			description: __(
				'Are you sure you want to disconnect your Search Console account from SureRank?',
				'surerank'
			),
			onConfirm: handleDisconnectConfirm,
			confirmButtonText: __( 'Disconnect', 'surerank' ),
		} );
	};

	const options = [
		{
			label: __( 'Change Site', 'surerank' ),
			icon: Globe,
			onClick: handleChangeSite,
		},
		{
			label: __( 'Disconnect', 'surerank' ),
			icon: LogOut,
			onClick: handleDisconnect,
		},
	];

	if ( ! searchConsole.authenticated ) {
		return null;
	}

	return (
		<DropdownMenu placement="bottom-start">
			<DropdownMenu.Trigger className="cursor-pointer">
				<Avatar variant="primary-light" size="xs">
					<User />
				</Avatar>
			</DropdownMenu.Trigger>
			<DropdownMenu.ContentWrapper>
				<DropdownMenu.Content className="w-60 [&>div]:p-1.5">
					<DropdownMenu.List className="p-0">
						<div className="p-1 flex gap-2 items-center">
							<Avatar
								src={ searchConsole.profile.gravatar }
								className="rounded-full shrink-0"
							/>
							<div className="max-w-[78%]">
								<p className="text-base font-medium text-text-primary truncate">
									{ searchConsole.profile.name }
								</p>
								<p className="text-xs font-normal text-text-tertiary truncate">
									{ searchConsole.profile.email }
								</p>
							</div>
						</div>
						<DropdownMenu.Separator className="w-[calc(100%+1rem)] -translate-x-2 mb-0 my-1" />
						{ options.map( ( option, index ) => (
							<DropdownMenu.Item
								className="p-1"
								key={ index }
								onClick={ option.onClick }
							>
								<option.icon className="size-5" />
								<span>{ option.label }</span>
							</DropdownMenu.Item>
						) ) }
					</DropdownMenu.List>
				</DropdownMenu.Content>
			</DropdownMenu.ContentWrapper>
		</DropdownMenu>
	);
};

export const handleDisconnectConfirm = async () => {
	try {
		const response = await apiFetch( {
			path: '/surerank/v1/google-search-console/revoke-auth',
			method: 'DELETE',
		} );
		if ( ! response.success ) {
			throw new Error(
				response?.message ??
					__(
						'Failed to disconnect your account. Please try again.',
						'surerank'
					)
			);
		}
		toast.success(
			__(
				'Your account has been disconnected. The page will refresh in a few seconds.',
				'surerank'
			)
		);
		// Refresh the page after 3 seconds
		setTimeout( () => {
			window.location.reload();
		}, 3000 );
	} catch ( error ) {
		toast.error( error.message );
	}
};

export default UserDropdown;