public void OnEndDrag(PointerEventData eventData)
        {
            if (IsOnline && !hasAuthority)
            {
                return;
            }

            CurrentPointerEventData = eventData;
            CurrentDragPhase        = DragPhase.End;

            UpdatePosition();
            if (SecondaryDragAction != null && IsProcessingSecondaryDragAction)
            {
                SecondaryDragAction();
            }

            Vector2 removedOffset = Vector2.zero;
            Vector2 pointerDragOffset;

            if (PointerDragOffsets.TryGetValue(eventData.pointerId, out pointerDragOffset))
            {
                removedOffset = (Vector2)transform.position - eventData.position - pointerDragOffset;
            }
            PointerPositions.Remove(eventData.pointerId);
            PointerDragOffsets.Remove(eventData.pointerId);
            Vector2 otherOffset;

            foreach (int offsetKey in PointerDragOffsets.Keys.ToList())
            {
                if (PointerDragOffsets.TryGetValue(offsetKey, out otherOffset))
                {
                    PointerDragOffsets[offsetKey] = otherOffset - removedOffset;
                }
            }

            if (IsProcessingSecondaryDragAction)
            {
                return;
            }

            if (PlaceHolder != null)
            {
                StartCoroutine(MoveToPlaceHolder());
            }
            else if (ParentCardStack == null)
            {
                Discard();
            }
        }
        public void OnPointerUp(PointerEventData eventData)
        {
            if (CurrentPointerEventData != null && CurrentPointerEventData.pointerId == eventData.pointerId && !eventData.dragging &&
                eventData.button != PointerEventData.InputButton.Middle && eventData.button != PointerEventData.InputButton.Right)
            {
                if (!DidSelectOnDown && EventSystem.current.currentSelectedGameObject == gameObject && DoubleClickAction != null)
                {
                    DoubleClickAction(this);
                }
                else if (PlaceHolder == null)
                {
                    EventSystem.current.SetSelectedGameObject(gameObject, eventData);
                }
            }

            CurrentPointerEventData = eventData;
            if (CurrentDragPhase == DragPhase.Drag)
            {
                return;
            }

            PointerPositions.Remove(eventData.pointerId);
            PointerDragOffsets.Remove(eventData.pointerId);
        }