Skip to content

Commit

Permalink
ui수정 임시 커밋
Browse files Browse the repository at this point in the history
  • Loading branch information
ottuck committed Aug 22, 2024
1 parent 00a6127 commit e6699cc
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 44 deletions.
69 changes: 47 additions & 22 deletions lib/feature/friendsList/provider/FriendsListProvider.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import 'package:blueberry_flutter_template/utils/Talker.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

import '../../../model/FriendModel.dart';
import '../../../utils/Talker.dart';

// 친구 목록을 제공하는 Provider
final friendsListProvider = StreamProvider<List<FriendModel>>((ref) {
final firestore = FirebaseFirestore.instance;
const userId = 'eztqDqrvEXDc8nqnnrB8'; // 로그인을 가정한 임시 유저 ID
Expand All @@ -15,34 +17,57 @@ final friendsListProvider = StreamProvider<List<FriendModel>>((ref) {
.collection('friends')
.snapshots()
.asyncMap((snapshot) => Future.wait(snapshot.docs.map((doc) async {
final userID = doc['userID'] as String;
talker.info('Fetching data for userID: $userID');

final userDoc =
await firestore.collection('users_test').doc(userID).get();

if (userDoc.exists) {
talker.info('User data found: ${userDoc.data()}');
return FriendModel.fromJson(userDoc.data()!);
} else {
talker.warning('User data not found for userID: $userID');
throw Exception('User data not found for userID: $userID');
}
}).toList()));
final userID = doc['userID'] as String;
talker.info('Fetching data for userID: $userID');

final userDoc = await firestore.collection('users_test').doc(userID).get();

if (userDoc.exists) {
talker.info('User data found: ${userDoc.data()}');
return FriendModel.fromJson(userDoc.data()!);
} else {
talker.warning('User data not found for userID: $userID');
throw Exception('User data not found for userID: $userID');
}
}).toList()));
});

final deleteFriendProvider = Provider<Future<void> Function(BuildContext, FriendModel)>((ref) {
return (BuildContext context, FriendModel friend) async {
final firestore = FirebaseFirestore.instance;
const userId = 'eztqDqrvEXDc8nqnnrB8'; // 로그인을 가정한 임시 유저 ID

try {
await firestore
.collection('users_test')
.doc(userId)
.collection('friends')
.doc(friend.userID)
.delete();

ref.invalidate(friendsListProvider);

ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('친구가 삭제되었습니다.')),
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('친구 삭제에 실패했습니다.')),
);
}
};
});

// 친구목록 이미지 URL을 제공하는 Provider
final friendsListImageProvider =
FutureProvider.family<String, String>((ref, imageName) async {
final friendsListImageProvider = FutureProvider.family<String, String>((ref, imageName) async {
try {
final storageRef = FirebaseStorage.instance.ref('profileimage/$imageName');
final downloadUrl = await storageRef.getDownloadURL();

talker.info('Download URL for image $imageName: $downloadUrl');
return downloadUrl;
} catch (e, stacktrace) {
talker.error(
'Failed to fetch download URL for image $imageName', e, stacktrace);
talker.error('Failed to fetch download URL for image $imageName', e, stacktrace);
rethrow;
}
});
});
112 changes: 90 additions & 22 deletions lib/feature/friendsList/widget/FriendBottomSheet.dart
Original file line number Diff line number Diff line change
@@ -1,28 +1,45 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';

import '../../../model/FriendModel.dart';
import '../../../utils/AppStrings.dart';
import '../../userreport/provider/UserReportBottomSheetWidget.dart';
import '../provider/FriendsListProvider.dart';
import 'BottomSheetButtonWidget.dart';

class FriendBottomSheetWidget extends StatelessWidget {
class FriendBottomSheetLauncher {
static void show({
required BuildContext context,
required FriendModel friend,
required String imageUrl,
}) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(top: Radius.circular(25.0)),
),
builder: (context) => FriendBottomSheetWidget(
friend: friend,
imageUrl: imageUrl,
),
);
}
}

class FriendBottomSheetWidget extends ConsumerWidget {
final FriendModel friend;
final String imageUrl;

const FriendBottomSheetWidget(
{super.key, required this.friend, required this.imageUrl});
const FriendBottomSheetWidget({super.key, required this.friend, required this.imageUrl});

@override
Widget build(BuildContext context) {
Widget build(BuildContext context, WidgetRef ref) {
return Container(
height: 260, // 바텀 시트 높이 수정 부분
height: 260,
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: const BorderRadius.vertical(
top: Radius.circular(25.0),
),
borderRadius: const BorderRadius.vertical(top: Radius.circular(25.0)),
),
padding: const EdgeInsets.all(16),
child: Column(
Expand All @@ -49,14 +66,16 @@ class FriendBottomSheetWidget extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(friend.name,
style: const TextStyle(
fontWeight: FontWeight.bold, fontSize: 20)),
Text(friend.name, style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 20)),
const SizedBox(height: 8),
Text(friend.status, style: const TextStyle(fontSize: 16)),
],
),
),
IconButton(
icon: const Icon(Icons.more_vert),
onPressed: () => _showSettingsMenu(context, ref),
),
],
),
),
Expand All @@ -69,15 +88,14 @@ class FriendBottomSheetWidget extends StatelessWidget {
Navigator.of(context).pop();
GoRouter.of(context).push('/chat');
},
text: AppStrings.chatButton,
text: '채팅',
),
BottomSheetButtonWidget(
onPressed: () {
Navigator.of(context).pop();
GoRouter.of(context)
.push('/userdetail'); // 현재 임의 경로 사용 중 수정 필요
GoRouter.of(context).push('/userdetail');
},
text: AppStrings.profileButton,
text: '프로필',
),
BottomSheetButtonWidget(
onPressed: () {
Expand All @@ -86,19 +104,69 @@ class FriendBottomSheetWidget extends StatelessWidget {
context: context,
isScrollControlled: true,
shape: const RoundedRectangleBorder(
borderRadius:
BorderRadius.vertical(top: Radius.circular(25.0)),
borderRadius: BorderRadius.vertical(top: Radius.circular(25.0)),
),
builder: (context) =>
UserReportBottomSheetWidget(friend: friend),
builder: (context) => const Text('신고하기 위젯 표시'),
);
},
text: AppStrings.reportButton,
text: '신고하기',
),
],
),
],
),
);
}

void _showSettingsMenu(BuildContext context, WidgetRef ref) {
showModalBottomSheet(
context: context,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(top: Radius.circular(25.0)),
),
builder: (context) => _SettingsMenu(friend: friend, ref: ref),
);
}
}

class _SettingsMenu extends StatelessWidget {
final FriendModel friend;
final WidgetRef ref;

const _SettingsMenu({required this.friend, required this.ref});

@override
Widget build(BuildContext context) {
final deleteFriend = ref.read(deleteFriendProvider);

return Column(
mainAxisSize: MainAxisSize.min,
children: [
ListTile(
leading: const Icon(Icons.report),
title: const Text('신고하기'),
onTap: () {
Navigator.of(context).pop();
// 신고하기 처리 로직
},
),
ListTile(
leading: const Icon(Icons.delete),
title: const Text('삭제하기'),
onTap: () async {
Navigator.of(context).pop();
await deleteFriend(context, friend);
},
),
ListTile(
leading: const Icon(Icons.block),
title: const Text('차단하기'),
onTap: () {
Navigator.of(context).pop();
// 차단하기 처리 로직
},
),
],
);
}
}

0 comments on commit e6699cc

Please sign in to comment.