Skip to content

Commit

Permalink
작업 환경 변경을 위한 임시 커밋
Browse files Browse the repository at this point in the history
  • Loading branch information
ottuck committed Aug 23, 2024
1 parent e6699cc commit 89a76f0
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 107 deletions.
64 changes: 34 additions & 30 deletions lib/feature/friendsList/provider/FriendsListProvider.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
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 '../../../model/FriendModel.dart';
import '../../../utils/Talker.dart';

// 친구목록을 제공하는 Provider
final friendsListProvider = StreamProvider<List<FriendModel>>((ref) {
final firestore = FirebaseFirestore.instance;
const userId = 'eztqDqrvEXDc8nqnnrB8'; // 로그인을 가정한 임시 유저 ID
Expand All @@ -18,12 +18,10 @@ final friendsListProvider = StreamProvider<List<FriendModel>>((ref) {
.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');
Expand All @@ -32,42 +30,48 @@ final friendsListProvider = StreamProvider<List<FriendModel>>((ref) {
}).toList()));
});

// 친구 삭제 처리 함수
void handleMenuSelection(BuildContext context, WidgetRef ref, int value, FriendModel friend) async {
switch (value) {
case 1:
// 신고하기 로직 처리
Navigator.of(context).pop();
break;
case 2:
final deleteFriend = ref.read(deleteFriendProvider);
Navigator.of(context).pop();
await deleteFriend(context, friend);
break;
case 3:
// 차단하기 로직 처리
Navigator.of(context).pop();
break;
}
}

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();
await firestore
.collection('users_test')
.doc(userId)
.collection('friends')
.doc(friend.userID)
.delete();

ref.invalidate(friendsListProvider);
ref.invalidate(friendsListProvider);

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

// 친구목록 이미지 URL을 제공하는 Provider
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);
rethrow;
}
});
final storageRef = FirebaseStorage.instance.ref('profileimage/$imageName');
final downloadUrl = await storageRef.getDownloadURL();
return downloadUrl;
});
91 changes: 14 additions & 77 deletions lib/feature/friendsList/widget/FriendBottomSheet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,35 +6,16 @@ import 'package:go_router/go_router.dart';
import '../../../model/FriendModel.dart';
import '../provider/FriendsListProvider.dart';
import 'BottomSheetButtonWidget.dart';
import 'PopupMenuItem.dart'; // PopupMenuItem.dart import

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 {
class FriendBottomSheetWidget extends StatelessWidget {
final FriendModel friend;
final String imageUrl;

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

@override
Widget build(BuildContext context, WidgetRef ref) {
Widget build(BuildContext context) {
return Container(
height: 260,
decoration: BoxDecoration(
Expand Down Expand Up @@ -72,9 +53,17 @@ class FriendBottomSheetWidget extends ConsumerWidget {
],
),
),
IconButton(
icon: const Icon(Icons.more_vert),
onPressed: () => _showSettingsMenu(context, ref),
Consumer(
builder: (context, ref, child) {
return PopupMenuButton<int>(
onSelected: (value) => handleMenuSelection(context, ref, value, friend),
itemBuilder: (context) => [
buildPopupMenuItem(icon: Icons.report, text: "신고하기", value: 1),
buildPopupMenuItem(icon: Icons.delete, text: "삭제하기", value: 2),
buildPopupMenuItem(icon: Icons.block, text: "차단하기", value: 3),
],
);
},
),
],
),
Expand Down Expand Up @@ -117,56 +106,4 @@ class FriendBottomSheetWidget extends ConsumerWidget {
),
);
}

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();
// 차단하기 처리 로직
},
),
],
);
}
}
18 changes: 18 additions & 0 deletions lib/feature/friendsList/widget/PopupMenuItem.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import 'package:flutter/material.dart';

PopupMenuItem<int> buildPopupMenuItem({
required IconData icon,
required String text,
required int value,
}) {
return PopupMenuItem<int>(
value: value,
child: Row(
children: [
Icon(icon),
const SizedBox(width: 10),
Text(text),
],
),
);
}

0 comments on commit 89a76f0

Please sign in to comment.