Set camera at socket location fails

Hello!
So, what I’m trying to achieve is Skyrim-like camera system.
Insted of having two cameras inside character I’m trying to move camera from one location to another.
Zooming to shoulder works pretty fine, but problem begins when I try to attach camera to mesh socket.
At first it attaches to left hand (?), and only when i scroll once again it moves into the right position.
Here’s some code:

void AMainCharacter::ZoomIn()
{
	CheckCameraState();

	switch (CameraState)
	{
	case Shoulder:
		SpringArm->TargetArmLength -= 8;
		SpringArm->TargetOffset.Y += 4;
		break;
	case Head:
		EnterFirstPersonView();
		break;
	}
}

void AMainCharacter::EnterFirstPersonView()
{
	SpringArm->TargetOffset.Y = 0;
	bUseControllerRotationYaw = true;
	Camera->SetupAttachment(GetMesh(), "Head");
	Camera->SetWorldLocation(GetMesh()->GetSocketTransform("Head").GetLocation());
}

This video should help you to understand what’s happening

So i tried bunch of different combinations and what i got kinda satisfies me.
I got rid of SpringArm->TargetOffset.Y = 0;. This thing made that camera shift to the left hand.
Also replaced Camera->SetupAttachment(GetMesh(), "Head"); with Camera->AttachToComponent(RootComponent, ...);.
Made some rotation controll changes and here’s the final form :

	if (CameraState != InsideHead)
	{
		bUseControllerRotationYaw = true;
		//bUseControllerRotationPitch = true;
		Camera->bUsePawnControlRotation = true;
		Camera->AttachToComponent(RootComponent, FAttachmentTransformRules(EAttachmentRule::SnapToTarget,false));
		Camera->SetWorldLocation(GetMesh()->GetSocketTransform("Head").GetLocation());
		CameraState = InsideHead;
	}