feat(redpacket): 红包与游戏横幅全量实现 (#19~#24)

- #19 fix: SendRedEnvelopeUseCase 动态取 currencyType(workspaceId>0 取
  workspace.currency,修复 iOS 硬编码 PEA → 150001 错误)
- #20: RedEnvelopeBubble typ=8,四态(橙色领取/已领/过期/抢完)+ 领取按钮
- #21: ReceiveRedEnvelopeUseCase POST /app/api/wallet/rp/receive,
  typed JSON body(避免 code=30007),SnackBar 反馈
- #22: SendRedEnvelopeSheet BottomSheet,STANDARD_RP + LUCKY_RP,
  发送成功后构建 typ=8 content JSON 回调给 ChatPage
- #23: BannerViewModel Notifier,Group.topic 双格式解析(JSON object/string),
  FetchBannerUseCase + Timer 倒计时 + applyNewRound WS 接口
- #24: BannerView 游戏横幅条(状态/倒计时/上期结果),
  MiniAppFloatButton 悬浮按钮(hasGame 显示/隐藏,onTap TODO #25)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
pp-bot
2026-03-23 23:11:29 +09:00
parent 83774f5f61
commit d9539d391c
12 changed files with 1616 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:im_app/app/di/network_provider.dart';
import 'package:im_app/features/chat/usecases/send_red_envelope_usecase.dart';
import 'package:im_app/features/chat/usecases/receive_red_envelope_usecase.dart';
import 'package:im_app/features/chat/usecases/fetch_banner_usecase.dart';
/// 发送红包 UseCase Provider
final sendRedEnvelopeUseCaseProvider = Provider<SendRedEnvelopeUseCase>((ref) {
return SendRedEnvelopeUseCase(api: ref.read(networkSdkApiProvider));
});
/// 领取红包 UseCase Provider
final receiveRedEnvelopeUseCaseProvider =
Provider<ReceiveRedEnvelopeUseCase>((ref) {
return ReceiveRedEnvelopeUseCase(api: ref.read(networkSdkApiProvider));
});
/// 游戏横幅 UseCase Provider
final fetchBannerUseCaseProvider = Provider<FetchBannerUseCase>((ref) {
return FetchBannerUseCase(api: ref.read(networkSdkApiProvider));
});