friend_interact_click_view.dart 3.66 KB
import 'dart:async';

import 'package:doublefeel_flutter/app/modules/interact/widgets/friend_interaction_dialog.dart';
import 'package:doublefeel_flutter/app/modules/report_common/widgets/health_report_subject_scope.dart';
import 'package:doublefeel_flutter/core/network/api/interaction_api.dart';
import 'package:doublefeel_flutter/core/util/size_extensions.dart';
import 'package:doublefeel_flutter/data/models/interaction/interaction_models.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

class FriendInteractClickView extends StatelessWidget {
  const FriendInteractClickView({
    super.key,
    this.onAction,
    this.interactionContext,
    this.interactionType = FriendInteractionType.defaultInteraction,
  });

  final VoidCallback? onAction;
  final FriendInteractionContext? interactionContext;
  final FriendInteractionType interactionType;

  @override
  Widget build(BuildContext context) => GestureDetector(
    behavior: HitTestBehavior.opaque,
    onTap: () {
      onAction?.call();
      final interaction = _interactionContextOf(context);
      FriendInteractionDialog.show<void>(
        context,
        avatar: _avatar(interaction),
        steps: '15627',
        onMiss: interaction == null
            ? null
            : () => unawaited(
                _sendInteraction(interaction, FriendInteractionActionType.miss),
              ),
        onPoke: interaction == null
            ? null
            : () => unawaited(
                _sendInteraction(interaction, FriendInteractionActionType.poke),
              ),
        onPunch: interaction == null
            ? null
            : () => unawaited(
                _sendInteraction(
                  interaction,
                  FriendInteractionActionType.punch,
                ),
              ),
      );
    },
    child: SizedBox(
      width: 24.dp,
      height: 24.dp,
      child: Image.asset(
        'assets/images/interact/ic_friend_interact_click.png',
        width: double.infinity,
        height: double.infinity,
      ),
    ),
  );

  FriendInteractionContext? _interactionContextOf(BuildContext context) {
    if (interactionContext != null) return interactionContext;
    final friendUserId = HealthReportSubjectScope.friendUserIdOf(context);
    if (friendUserId == null) return null;
    return FriendInteractionContext(
      friendUserId: friendUserId,
      type: interactionType,
      avatarUrl: HealthReportSubjectScope.friendAvatarUrlOf(context),
    );
  }

  ImageProvider _avatar(FriendInteractionContext? interaction) {
    final url = interaction?.avatarUrl?.trim();
    return url?.isNotEmpty == true
        ? NetworkImage(url!)
        : const AssetImage('assets/images/interact/unpaired_avatar.png');
  }

  Future<void> _sendInteraction(
    FriendInteractionContext interaction,
    FriendInteractionActionType action,
  ) async {
    await Get.find<InteractionApi>().sendInteraction(
      InteractionData(
        friendUserId: interaction.friendUserId,
        interactionType: interaction.type.value,
        actionType: action.value,
      ),
    );
  }
}

class FriendInteractCardOverlay extends StatelessWidget {
  const FriendInteractCardOverlay({
    super.key,
    required this.showInteraction,
    required this.child,
    this.interactionType = FriendInteractionType.defaultInteraction,
  });

  final bool showInteraction;
  final Widget child;
  final FriendInteractionType interactionType;

  @override
  Widget build(BuildContext context) => Stack(
    children: [
      child,
      if (showInteraction)
        Positioned(
          top: 20,
          right: 20,
          child: FriendInteractClickView(interactionType: interactionType),
        ),
    ],
  );
}