build method

  1. @override
dynamic build(
  1. dynamic context,
  2. dynamic ref
)

Implementation

@override
Widget build(BuildContext context, WidgetRef ref) {
  final message = ref.watch(
    chatInputProvider.select((state) => state.selectedMessage),
  );
  if (message == null) {
    // shouldn’t ever happen in reality
    return const SizedBox.shrink();
  }

  final myId = ref.watch(myUserIdStrProvider);
  final isAuthor = (myId == message.author.id);
  bool isTextMessage = false;
  if (message is TextMessage) {
    isTextMessage = true;
  }

  return Container(
    padding: const EdgeInsets.all(8),
    constraints: const BoxConstraints(maxWidth: 200),
    margin: !isAuthor
        ? const EdgeInsets.only(top: 4)
        : const EdgeInsets.only(top: 4),
    decoration: BoxDecoration(
      borderRadius: const BorderRadius.all(Radius.circular(5)),
      color: Theme.of(context).colorScheme.surface,
    ),
    child: Column(
      mainAxisAlignment: MainAxisAlignment.start,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        makeMenuItem(
          pressed: () =>
              ref.read(chatInputProvider.notifier).setReplyToMessage(message),
          text: Text(L10n.of(context).reply),
          icon: const Icon(Icons.reply_rounded, size: 18),
        ),
        if (isTextMessage)
          makeMenuItem(
            pressed: () => onCopyMessage(context, ref, message),
            text: Text(L10n.of(context).copyMessage),
            icon: const Icon(Icons.copy_all_outlined, size: 14),
          ),
        if (isAuthor)
          makeMenuItem(
            pressed: () => onPressEditMessage(context, ref, roomId, message),
            text: Text(L10n.of(context).edit),
            icon: const Icon(Atlas.pencil_box_bold, size: 14),
          ),
        if (!isAuthor)
          makeMenuItem(
            pressed: () => onReportMessage(context, message, roomId),
            text: Text(
              L10n.of(context).report,
              style: TextStyle(color: Theme.of(context).colorScheme.error),
            ),
            icon: Icon(
              Icons.flag_outlined,
              size: 14,
              color: Theme.of(context).colorScheme.error,
            ),
          ),
        // FIXME: should be a check whether the user can redact.
        if (isAuthor)
          makeMenuItem(
            pressed: () => onDeleteOwnMessage(
              context,
              ref,
              message.remoteId ?? message.id,
              roomId,
            ),
            text: Text(
              L10n.of(context).delete,
              style: TextStyle(color: Theme.of(context).colorScheme.error),
            ),
            icon: Icon(
              Atlas.trash_can_thin,
              size: 14,
              color: Theme.of(context).colorScheme.error,
            ),
          ),
      ],
    ),
  );
}