From 1ea4ca126d12df7631243fe53713f2fb8c11acea Mon Sep 17 00:00:00 2001 From: Gyeong-Jun Kim Date: Wed, 23 Sep 2020 18:33:45 +0900 Subject: [PATCH 01/13] =?UTF-8?q?fix=20:=20[=EC=B1=84=ED=8C=85]=201:1=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=95=88?= =?UTF-8?q?=EB=B3=B4=EC=9D=B4=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EC=8B=9C=EA=B0=84=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=ED=95=B4=EA=B2=B0=20(#366)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/application/MessageRequest.java | 9 ++------- .../message/application/MessageResponse.java | 12 ++++++++---- .../message/application/MessageService.java | 2 +- .../presentation/MessageController.java | 6 +++--- .../application/WholeMessageResponse.java | 19 ++++++------------- .../presentation/WholeMessageController.java | 7 ++----- .../chat/message/fixture/MessageFixture.java | 2 +- seller-lee-secret | 2 +- 8 files changed, 24 insertions(+), 35 deletions(-) diff --git a/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageRequest.java b/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageRequest.java index 152803f2..e381e3cd 100644 --- a/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageRequest.java +++ b/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageRequest.java @@ -7,18 +7,17 @@ public class MessageRequest { private Long senderId; private String senderNickname; private String message; - private String pushToken; + // TODO: 2020/09/23 pushToken 이슈 해결시, pushToken 추가 public MessageRequest() { } public MessageRequest(Long roomId, Long senderId, - String senderNickname, String message, String pushToken) { + String senderNickname, String message) { this.roomId = roomId; this.senderId = senderId; this.senderNickname = senderNickname; this.message = message; - this.pushToken = pushToken; } public Message toMessage() { @@ -40,8 +39,4 @@ public String getSenderNickname() { public String getMessage() { return message; } - - public String getPushToken() { - return pushToken; - } } \ No newline at end of file diff --git a/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageResponse.java b/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageResponse.java index f2ce3432..8c92a3b1 100644 --- a/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageResponse.java +++ b/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageResponse.java @@ -8,6 +8,8 @@ import com.jikgorae.chat.message.domain.Message; public class MessageResponse { + private static final long GAP_OF_KST_AND_UTC = 9L; + private String id; private Long senderId; private String senderNickname; @@ -18,7 +20,8 @@ public class MessageResponse { public MessageResponse() { } - public MessageResponse(String id, Long senderId, String senderNickname, Long roomId, String content, LocalDateTime createdTime) { + public MessageResponse(String id, Long senderId, String senderNickname, Long roomId, + String content, LocalDateTime createdTime) { this.id = id; this.senderId = senderId; this.senderNickname = senderNickname; @@ -30,7 +33,7 @@ public MessageResponse(String id, Long senderId, String senderNickname, Long roo public static MessageResponse of(Message message) { return new MessageResponse(message.getId(), message.getSenderId(), message.getSenderNickname(), message.getRoomId(), message.getContent(), - message.getCreatedTime().minusHours(9L)); + message.getCreatedTime().minusHours(GAP_OF_KST_AND_UTC)); } public static List listOf(List messages) { @@ -39,8 +42,9 @@ public static List listOf(List messages) { .collect(toList()); } - public void adjustTime() { - this.createdTime = createdTime.plusHours(9L); + public MessageResponse adjustTime() { + return new MessageResponse(id, senderId, senderNickname, roomId, content, + createdTime.plusHours(GAP_OF_KST_AND_UTC)); } public String getId() { diff --git a/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageService.java b/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageService.java index a7f94d54..480cfeb2 100644 --- a/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageService.java +++ b/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageService.java @@ -20,7 +20,7 @@ public MessageService(MessageRepository messageRepository) { public MessageResponse save(MessageRequest request) { Message message = request.toMessage(); // TODO: 2020/09/21 Member가 모듈로 분리 될때 토큰을 멤버 DB에서 조회해온다. - Message save = messageRepository.save(message.send(request.getPushToken())); + Message save = messageRepository.save(message); return MessageResponse.of(save); } diff --git a/back/chat/src/main/java/com/jikgorae/chat/message/presentation/MessageController.java b/back/chat/src/main/java/com/jikgorae/chat/message/presentation/MessageController.java index 7c3cdecf..3801a346 100644 --- a/back/chat/src/main/java/com/jikgorae/chat/message/presentation/MessageController.java +++ b/back/chat/src/main/java/com/jikgorae/chat/message/presentation/MessageController.java @@ -35,8 +35,7 @@ public MessageController(SimpMessageSendingOperations messagingTemplate, @MessageMapping(MESSAGE_URI) public void message(MessageRequest request) { MessageResponse response = messageService.save(request); - response.adjustTime(); - messagingTemplate.convertAndSend(DESTINATION + request.getRoomId(), response); + messagingTemplate.convertAndSend(DESTINATION + request.getRoomId(), response.adjustTime()); } @GetMapping(MESSAGE_REST_URI) @@ -47,6 +46,7 @@ public ResponseEntity> showAll(@PathVariable Long roomId, @GetMapping(MESSAGE_REST_URI + NEW) public ResponseEntity showLast(@PathVariable Long roomId) { - return ResponseEntity.ok(messageService.showLast(roomId)); + MessageResponse response = messageService.showLast(roomId); + return ResponseEntity.ok(response.adjustTime()); } } \ No newline at end of file diff --git a/back/chat/src/main/java/com/jikgorae/chat/wholemessage/application/WholeMessageResponse.java b/back/chat/src/main/java/com/jikgorae/chat/wholemessage/application/WholeMessageResponse.java index 7a18eb56..67114fb0 100644 --- a/back/chat/src/main/java/com/jikgorae/chat/wholemessage/application/WholeMessageResponse.java +++ b/back/chat/src/main/java/com/jikgorae/chat/wholemessage/application/WholeMessageResponse.java @@ -8,6 +8,8 @@ import com.jikgorae.chat.wholemessage.domain.WholeMessage; public class WholeMessageResponse { + private static final long GAP_OF_KST_AND_UTC = 9L; + private String id; private Long senderId; private String senderNickname; @@ -30,21 +32,11 @@ public WholeMessageResponse(String id, Long senderId, String senderNickname, this.createdTime = createdTime; } - public WholeMessageResponse(String id, Long senderId, String senderNickname, Long roomId, - String content, LocalDateTime createdTime) { - this.id = id; - this.senderId = senderId; - this.senderNickname = senderNickname; - this.roomId = roomId; - this.content = content; - this.createdTime = createdTime; - } - public static WholeMessageResponse of(WholeMessage wholeMessage) { return new WholeMessageResponse(wholeMessage.getId(), wholeMessage.getSenderId(), wholeMessage.getSenderNickname(), wholeMessage.getSenderAvatar(), wholeMessage.getRoomId(), wholeMessage.getContent(), - wholeMessage.getCreatedTime().minusHours(9L)); + wholeMessage.getCreatedTime().minusHours(GAP_OF_KST_AND_UTC)); } public static List listOf(List messages) { @@ -53,8 +45,9 @@ public static List listOf(List messages) { .collect(toList()); } - public void adjustTime() { - this.createdTime = createdTime.plusHours(9L); + public WholeMessageResponse adjustTime() { + return new WholeMessageResponse(id, senderId, senderNickname, senderAvatar, roomId, content, + createdTime.plusHours(GAP_OF_KST_AND_UTC)); } public String getId() { diff --git a/back/chat/src/main/java/com/jikgorae/chat/wholemessage/presentation/WholeMessageController.java b/back/chat/src/main/java/com/jikgorae/chat/wholemessage/presentation/WholeMessageController.java index f302f9e8..d6bb66fc 100644 --- a/back/chat/src/main/java/com/jikgorae/chat/wholemessage/presentation/WholeMessageController.java +++ b/back/chat/src/main/java/com/jikgorae/chat/wholemessage/presentation/WholeMessageController.java @@ -32,15 +32,12 @@ public WholeMessageController(SimpMessageSendingOperations messagingTemplate, @MessageMapping(WHOLE_MESSAGE_URI) public void message(WholeMessageRequest request) { WholeMessageResponse response = wholeMessageService.save(request); - response.adjustTime(); - messagingTemplate.convertAndSend(DESTINATION_OF_ORGANIZATION + request.getRoomId(), - response); + messagingTemplate.convertAndSend(DESTINATION_OF_ORGANIZATION + request.getRoomId(), response.adjustTime()); } @GetMapping(WHOLE_MESSAGE_REST_URI) public ResponseEntity> showAll(@PathVariable Long organizationId, @RequestParam int size, @RequestParam String lastMessageDate) { - return ResponseEntity.ok( - wholeMessageService.showAll(organizationId, size, lastMessageDate)); + return ResponseEntity.ok(wholeMessageService.showAll(organizationId, size, lastMessageDate)); } } diff --git a/back/chat/src/test/java/com/jikgorae/chat/message/fixture/MessageFixture.java b/back/chat/src/test/java/com/jikgorae/chat/message/fixture/MessageFixture.java index b6109c71..e7e4ebeb 100644 --- a/back/chat/src/test/java/com/jikgorae/chat/message/fixture/MessageFixture.java +++ b/back/chat/src/test/java/com/jikgorae/chat/message/fixture/MessageFixture.java @@ -4,6 +4,6 @@ public class MessageFixture { public static MessageRequest requestOf(Long roomId) { - return new MessageRequest(roomId, 99L, "NICKNAME", "MESSAGE", "ExponentPushToken[1234567-12345678901234]"); + return new MessageRequest(roomId, 99L, "NICKNAME", "MESSAGE"); } } diff --git a/seller-lee-secret b/seller-lee-secret index 1522c929..213b121b 160000 --- a/seller-lee-secret +++ b/seller-lee-secret @@ -1 +1 @@ -Subproject commit 1522c9290e11454d336ff589263a514c1a21ef27 +Subproject commit 213b121bbda449c882a89491a08ca3f2c20a0aff From 0a7466087b7b3d0c18a2352d23246584671f0a06 Mon Sep 17 00:00:00 2001 From: Gyeong-Jun Kim Date: Wed, 23 Sep 2020 18:51:56 +0900 Subject: [PATCH 02/13] =?UTF-8?q?fix=20:=20[=EC=B1=84=ED=8C=85=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8]=20=EC=A1=B0=EC=A7=81=20=ED=83=88=ED=87=B4?= =?UTF-8?q?=EC=8B=9C=20=EC=B1=84=ED=8C=85=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20(#368)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/chat/OrganizationChatList.tsx | 24 ++++--------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/front/src/components/chat/OrganizationChatList.tsx b/front/src/components/chat/OrganizationChatList.tsx index 1551d9fa..4d796798 100644 --- a/front/src/components/chat/OrganizationChatList.tsx +++ b/front/src/components/chat/OrganizationChatList.tsx @@ -1,29 +1,15 @@ -import React, { useEffect, useState } from "react"; - +import React from "react"; import { FlatList } from "react-native"; - import OrganizationItem from "./OrganizationItem"; -import { organizationAPI } from "../../api/api"; +import { useRecoilValue } from "recoil/dist"; +import { organizationListState } from "../../states/organizationState"; export default function OrganizationChatList() { - const [organizations, setOrganizations] = useState([ - { - id: 0, - name: "", - }, - ]); - - useEffect(() => { - const initOrganizations = async () => { - const { data } = await organizationAPI.showAll(); - setOrganizations(data); - }; - initOrganizations(); - }, []); + const organizationList = useRecoilValue(organizationListState); return ( ( // @ts-ignore From f752a55d0506d9a3490d2d2204ef3e4720fc94a6 Mon Sep 17 00:00:00 2001 From: Junyoung Lee Date: Wed, 23 Sep 2020 19:19:56 +0900 Subject: [PATCH 03/13] =?UTF-8?q?refactor:=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=88=98=EC=A0=95=20(#369)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ArticleDetail/ArticleDetailBottomNav.tsx | 36 +++--- .../ArticleCommon/ArticleCardTradeDetails.tsx | 5 +- .../ArticleCommon/ArticleCardTradeState.tsx | 6 +- front/src/components/Navigation/HomeStack.tsx | 16 +-- .../Profile/EnterOrganizationButton.tsx | 2 +- front/src/components/chat/ChatMenu.tsx | 7 +- front/src/components/chat/ChatRoomItem.tsx | 15 ++- front/src/components/chat/ChatTradeState.tsx | 57 ++++++---- front/src/screens/ArticleDetailScreen.tsx | 6 +- front/src/screens/CategoryHomeScreen.tsx | 6 +- front/src/screens/ChatScreen.tsx | 106 ++++++++++-------- front/src/screens/FeedHomeScreen.tsx | 10 +- front/src/screens/WholeChatScreen.tsx | 57 ++++++---- 13 files changed, 181 insertions(+), 148 deletions(-) diff --git a/front/src/components/ArticleDetail/ArticleDetailBottomNav.tsx b/front/src/components/ArticleDetail/ArticleDetailBottomNav.tsx index 2104d931..455c8392 100644 --- a/front/src/components/ArticleDetail/ArticleDetailBottomNav.tsx +++ b/front/src/components/ArticleDetail/ArticleDetailBottomNav.tsx @@ -12,7 +12,7 @@ import { StackNavigationProp } from "@react-navigation/stack"; import { HomeStackParam } from "../../types/types"; import { useSetRecoilState } from "recoil/dist"; import { chatRoomState } from "../../states/chatRoomState"; -import { MaterialCommunityIcons } from "@expo/vector-icons"; +import { AntDesign } from "@expo/vector-icons"; export default function ArticleDetailBottomNav() { const navigation = useNavigation< @@ -58,18 +58,21 @@ export default function ArticleDetailBottomNav() { - - {`${insertComma(price.toString())}원`} - - - {memberNickname !== author.nickname ? ( - + createChat(author)} /> - ) : undefined} + + ) : ( + <> + )} + + {`${insertComma(price.toString())}원`} ); @@ -86,25 +89,24 @@ const styles = StyleSheet.create({ alignItems: "center", borderRightWidth: 1, borderRightColor: theme.border, - paddingRight: 30, + paddingRight: 20, }, chatContainer: { justifyContent: "center", alignItems: "flex-end", - borderLeftWidth: 1, - borderLeftColor: theme.border, - paddingLeft: 30, + borderRightWidth: 1, + borderRightColor: theme.border, + paddingHorizontal: 20, }, priceContainer: { flex: 1, justifyContent: "center", alignItems: "flex-end", - paddingRight: 20, }, price: { fontSize: 24, fontWeight: "bold", - textAlign: "center", + textAlign: "right", color: theme.others, }, }); diff --git a/front/src/components/Common/ArticleCommon/ArticleCardTradeDetails.tsx b/front/src/components/Common/ArticleCommon/ArticleCardTradeDetails.tsx index 018c1b60..56cee5d3 100644 --- a/front/src/components/Common/ArticleCommon/ArticleCardTradeDetails.tsx +++ b/front/src/components/Common/ArticleCommon/ArticleCardTradeDetails.tsx @@ -23,7 +23,8 @@ const styles = StyleSheet.create({ alignItems: "center", }, createTime: { - marginLeft: 5, - fontSize: 12, + marginLeft: 10, + fontSize: 13, + color: "gray", }, }); diff --git a/front/src/components/Common/ArticleCommon/ArticleCardTradeState.tsx b/front/src/components/Common/ArticleCommon/ArticleCardTradeState.tsx index c8ddbbe3..b9685aac 100644 --- a/front/src/components/Common/ArticleCommon/ArticleCardTradeState.tsx +++ b/front/src/components/Common/ArticleCommon/ArticleCardTradeState.tsx @@ -39,21 +39,21 @@ export default function ArticleCardTradeState({ const styles = StyleSheet.create({ tradeOnSaleContainer: { - paddingHorizontal: 5, + paddingHorizontal: 10, backgroundColor: theme.primary, borderRadius: 10, justifyContent: "center", alignItems: "center", }, tradeReservedContainer: { - paddingHorizontal: 5, + paddingHorizontal: 10, backgroundColor: theme.secondary, borderRadius: 10, justifyContent: "center", alignItems: "center", }, tradeCompletedContainer: { - paddingHorizontal: 5, + paddingHorizontal: 10, backgroundColor: "lightgrey", borderRadius: 10, justifyContent: "center", diff --git a/front/src/components/Navigation/HomeStack.tsx b/front/src/components/Navigation/HomeStack.tsx index 343e8e77..5eb81ea2 100644 --- a/front/src/components/Navigation/HomeStack.tsx +++ b/front/src/components/Navigation/HomeStack.tsx @@ -62,20 +62,8 @@ export default function HomeStack() { component={CategoryHomeScreen} /> - - + + - 조직 입장/생성 + 조직 관리 diff --git a/front/src/components/chat/ChatMenu.tsx b/front/src/components/chat/ChatMenu.tsx index f74eb27f..a7eac497 100644 --- a/front/src/components/chat/ChatMenu.tsx +++ b/front/src/components/chat/ChatMenu.tsx @@ -34,7 +34,7 @@ export default function ChatMenu() { }; return ( - + @@ -49,11 +49,8 @@ export default function ChatMenu() { } const styles = StyleSheet.create({ - container: { - paddingVertical: 5, - }, menuOptions: { - width: 100, + width: 80, }, menuCustomStyle: { textAlign: "center", diff --git a/front/src/components/chat/ChatRoomItem.tsx b/front/src/components/chat/ChatRoomItem.tsx index ce62dc60..e23da32a 100644 --- a/front/src/components/chat/ChatRoomItem.tsx +++ b/front/src/components/chat/ChatRoomItem.tsx @@ -101,36 +101,35 @@ const styles = StyleSheet.create({ aspectRatio: 1, flexDirection: "row", justifyContent: "flex-start", - paddingVertical: 20, - paddingHorizontal: 20, + padding: 15, }, opponentContainer: { flex: 5, alignItems: "flex-start", + justifyContent: "space-between", + paddingVertical: 15, }, opponentTopContainer: { flexDirection: "row", + alignItems: "center", }, opponentNickname: { - paddingVertical: 10, fontSize: 16, color: "black", fontWeight: "bold", }, diffTime: { - paddingVertical: 11, - paddingHorizontal: 10, + paddingLeft: 10, fontSize: 14, color: "rgb(80,80,80)", }, lastMessage: { - paddingVertical: 5, - fontSize: 16, + fontSize: 18, color: "rgb(80,80,80)", }, articleThumbnailContainer: { flex: 1, justifyContent: "center", - paddingHorizontal: 20, + padding: 20, }, }); diff --git a/front/src/components/chat/ChatTradeState.tsx b/front/src/components/chat/ChatTradeState.tsx index 1976df65..955b51d0 100644 --- a/front/src/components/chat/ChatTradeState.tsx +++ b/front/src/components/chat/ChatTradeState.tsx @@ -1,6 +1,7 @@ import React from "react"; import { StyleSheet, Text, View } from "react-native"; import theme from "../../colors"; +import colors from "../../colors"; export default function ChatTradeState({ tradeState }: { tradeState: string }) { const getContainerStyleByTradeState = () => { @@ -22,54 +23,43 @@ export default function ChatTradeState({ tradeState }: { tradeState: string }) { } return styles.tradeCompletedText; }; + return ( - - - {tradeState} - + + {tradeState} ); } const styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: "flex-start", - }, tradeOnSaleContainer: { - flex: 1, - marginTop: 5, - aspectRatio: 5 / 3, + paddingHorizontal: 10, backgroundColor: theme.primary, borderRadius: 10, justifyContent: "center", alignItems: "center", }, tradeReservedContainer: { - flex: 1, - marginTop: 5, - aspectRatio: 5 / 3, + paddingHorizontal: 10, backgroundColor: theme.secondary, borderRadius: 10, justifyContent: "center", alignItems: "center", }, tradeCompletedContainer: { - flex: 1, - marginTop: 5, - aspectRatio: 5 / 3, + paddingHorizontal: 10, backgroundColor: "lightgrey", borderRadius: 10, justifyContent: "center", alignItems: "center", }, tradeOnSaleText: { - fontSize: 14, + fontSize: 12, fontWeight: "bold", color: "white", }, tradeReservedText: { - fontSize: 14, + fontSize: 12, fontWeight: "bold", color: "white", }, @@ -78,4 +68,33 @@ const styles = StyleSheet.create({ fontWeight: "bold", color: "grey", }, + containerOfOnSale: { + flex: 1, + backgroundColor: colors.primary, + width: 45, + height: 25, + borderRadius: 5, + justifyContent: "center", + alignItems: "center", + marginBottom: 3, + }, + containerOfNotOnSale: { + flex: 1, + backgroundColor: "lightgrey", + width: 60, + height: 25, + borderRadius: 5, + justifyContent: "center", + alignItems: "center", + marginBottom: 3, + }, + tradeStateOfOnSale: { + color: "white", + fontSize: 13, + fontWeight: "500", + }, + tradeStateOfNotOnSale: { + fontSize: 13, + color: "rgb(110,110,110)", + }, }); diff --git a/front/src/screens/ArticleDetailScreen.tsx b/front/src/screens/ArticleDetailScreen.tsx index 344cd147..d75d6dbc 100644 --- a/front/src/screens/ArticleDetailScreen.tsx +++ b/front/src/screens/ArticleDetailScreen.tsx @@ -212,7 +212,7 @@ const styles = StyleSheet.create({ articleContentContainer: { backgroundColor: "white", marginTop: -30, - paddingHorizontal: 30, + paddingHorizontal: 20, borderTopLeftRadius: 30, borderTopRightRadius: 30, }, @@ -229,8 +229,8 @@ const styles = StyleSheet.create({ backgroundColor: "white", borderWidth: 1, borderColor: theme.border, - paddingHorizontal: 30, - paddingVertical: 10, + paddingHorizontal: 20, + paddingVertical: 5, }, chatButtonContainer: { flex: 1, diff --git a/front/src/screens/CategoryHomeScreen.tsx b/front/src/screens/CategoryHomeScreen.tsx index e523d90c..849173cc 100644 --- a/front/src/screens/CategoryHomeScreen.tsx +++ b/front/src/screens/CategoryHomeScreen.tsx @@ -131,9 +131,9 @@ export default function CategoryHomeScreen() { setVisibleMenu(true)}> diff --git a/front/src/screens/ChatScreen.tsx b/front/src/screens/ChatScreen.tsx index 68054737..0651aafd 100644 --- a/front/src/screens/ChatScreen.tsx +++ b/front/src/screens/ChatScreen.tsx @@ -1,12 +1,15 @@ -import React, { useCallback, useEffect, useState } from "react"; +import React, { + useCallback, + useEffect, + useLayoutEffect, + useState, +} from "react"; import { useRecoilValue, useSetRecoilState } from "recoil/dist"; import { chatRoomState } from "../states/chatRoomState"; import { ActivityIndicator, Image, - Platform, - SafeAreaView, - StatusBar, + KeyboardAvoidingView, StyleSheet, Text, TouchableOpacity, @@ -19,8 +22,8 @@ import theme from "../colors"; import { CHAT_BASE_URL, messageAPI } from "../api/api"; import { memberAvatarState, - memberNicknameState, memberIdState, + memberNicknameState, } from "../states/memberState"; import SockJS from "sockjs-client"; import ArticleCardImage from "../components/Common/ArticleCommon/ArticleCardImage"; @@ -57,6 +60,33 @@ export default function ChatScreen() { const [hasMoreMessage, setHasMoreMessage] = useState(true); const [isLoading, setIsLoading] = useState(false); + useLayoutEffect(() => { + navigation.setOptions({ + title: `${opponent.nickname}님과의 채팅`, + headerTitleAlign: "left", + headerLeft: () => ( + ( + + )} + /> + ), + headerLeftContainerStyle: { + alignItems: "center", + justifyContents: "center", + aspectRatio: 1, + }, + headerRight: () => , + headerRightContainerStyle: { + aspectRatio: 1, + justifyContents: "center", + alignItems: "center", + }, + }); + }, [navigation]); + const pushMessage = useCallback((message = []) => { const received = JSON.parse(message.body); const user = { @@ -118,10 +148,8 @@ export default function ChatScreen() { // @ts-ignore const renderSend = (props) => { return ( - - - - + + ); }; @@ -195,24 +223,15 @@ export default function ChatScreen() { }; return ( - - - } - /> - - {opponent.nickname}님과의 채팅 - - - + - {articleInfo.title} + + {articleInfo.title} + @@ -284,9 +303,10 @@ export default function ChatScreen() { )} parsePatterns={(linkStyle) => [{ type: "phone", style: linkStyle }]} + maxInputLength={150} /> - + ); } @@ -294,15 +314,6 @@ const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: "white", - paddingTop: Platform.OS === "ios" ? 0 : StatusBar.currentHeight, - }, - navigationContainer: { - flex: 0.8, - flexDirection: "row", - backgroundColor: "white", - paddingHorizontal: 25, - borderBottomWidth: 1, - borderBottomColor: theme.border, }, opponentContainer: { flex: 1, @@ -310,14 +321,14 @@ const styles = StyleSheet.create({ alignItems: "center", }, opponent: { - fontSize: 18, + fontSize: 16, color: "black", }, articleContainer: { - flex: 1.8, + aspectRatio: 4, flexDirection: "row", backgroundColor: "rgb(250,250,250)", - paddingHorizontal: 30, + paddingHorizontal: 20, borderBottomWidth: 1, borderBottomColor: theme.border, }, @@ -325,30 +336,33 @@ const styles = StyleSheet.create({ aspectRatio: 1, flexDirection: "row", justifyContent: "center", - marginVertical: 15, + marginVertical: 10, }, articleInfoContainer: { flex: 1, - paddingHorizontal: 30, - paddingVertical: 20, + paddingHorizontal: 20, + paddingVertical: 10, + justifyContent: "space-between", + }, + articleTitleContainer: { + justifyContent: "flex-start", }, articleTitle: { - fontSize: 24, + fontSize: 22, fontWeight: "bold", color: "black", }, articlePriceAndTradeStateContainer: { - flex: 1, + aspectRatio: 8, flexDirection: "row", + justifyContent: "space-between", }, articlePriceContainer: { - flex: 1, - flexDirection: "row", alignItems: "flex-end", - justifyContent: "flex-end", + justifyContent: "center", }, articlePrice: { - fontSize: 18, + fontSize: 20, fontWeight: "bold", color: theme.others, }, @@ -360,12 +374,10 @@ const styles = StyleSheet.create({ chatContainer: { flex: 12, }, - sendingContainer: { + sendContainer: { aspectRatio: 1, justifyContent: "center", alignItems: "center", - padding: 5, - marginRight: 5, }, loadingContainer: { flex: 12, diff --git a/front/src/screens/FeedHomeScreen.tsx b/front/src/screens/FeedHomeScreen.tsx index 6a6fdd08..09b35b52 100644 --- a/front/src/screens/FeedHomeScreen.tsx +++ b/front/src/screens/FeedHomeScreen.tsx @@ -191,10 +191,12 @@ export default function FeedHomeScreen() { return ( - {setTitle()} setVisibleMenu(true)}> - + + {setTitle()} + + { + navigation.setOptions({ + title: `${name}`, + headerTitleAlign: "left", + headerLeft: () => ( + ( + + )} + /> + ), + headerLeftContainerStyle: { + alignItems: "center", + justifyContents: "center", + aspectRatio: 1, + }, + }); + }, [navigation]); + const pushMessage = useCallback((message = []) => { const received = JSON.parse(message.body); const user = { @@ -115,10 +139,8 @@ export default function WholeChatScreen() { // @ts-ignore const renderSend = (props) => { return ( - - - - + + ); }; @@ -211,17 +233,7 @@ export default function WholeChatScreen() { }; return ( - - - } - /> - - {name} - - + [{ type: "phone", style: linkStyle }]} /> - + ); } @@ -262,7 +274,6 @@ const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: "white", - paddingTop: Platform.OS === "ios" ? 0 : StatusBar.currentHeight, }, navigationContainer: { flex: 0.8, @@ -328,12 +339,10 @@ const styles = StyleSheet.create({ chatContainer: { flex: 12, }, - sendingContainer: { + sendContainer: { aspectRatio: 1, justifyContent: "center", alignItems: "center", - padding: 5, - marginRight: 5, }, loadingContainer: { flex: 12, From 5dac56ccd82bfd2812fbcb8c20779414b969d164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=84=B0=ED=8B=80?= Date: Wed, 23 Sep 2020 21:04:16 +0900 Subject: [PATCH 04/13] =?UTF-8?q?fix:=20=EC=95=8C=EB=A6=BC=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EC=9A=94=EC=B2=AD=EC=9D=84=20=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#371)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front/app.json | 3 ++- front/src/components/Profile/ProfileInfo.tsx | 2 +- front/src/screens/FeedHomeScreen.tsx | 26 +++++++++++++++----- front/src/screens/ProfileScreen.tsx | 3 +++ 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/front/app.json b/front/app.json index a523250e..7856726d 100644 --- a/front/app.json +++ b/front/app.json @@ -18,7 +18,8 @@ "android": { "package": "com.sellerleecompany.jikgorae", "softwareKeyboardLayoutMode": "pan", - "versionCode": 4 + "versionCode": 4, + "useNextNotificationsApi": true }, "ios": { "bundleIdentifier": "com.sellerleecompany.jikgorae", diff --git a/front/src/components/Profile/ProfileInfo.tsx b/front/src/components/Profile/ProfileInfo.tsx index ad185f15..c284b3f3 100644 --- a/front/src/components/Profile/ProfileInfo.tsx +++ b/front/src/components/Profile/ProfileInfo.tsx @@ -21,7 +21,7 @@ export default function ProfileInfo() { diff --git a/front/src/screens/FeedHomeScreen.tsx b/front/src/screens/FeedHomeScreen.tsx index 09b35b52..47c095eb 100644 --- a/front/src/screens/FeedHomeScreen.tsx +++ b/front/src/screens/FeedHomeScreen.tsx @@ -29,6 +29,7 @@ import { Menu, MenuOptions, MenuTrigger } from "react-native-popup-menu"; import { selectedOrganizationInFeedsState } from "../states/organizationState"; import { Feather } from "@expo/vector-icons"; import OrganizationList from "../components/organization/OrganizationList"; +import Constants from "expo-constants"; type FeedHomeScreenNavigationProp = CompositeNavigationProp< StackNavigationProp, @@ -78,15 +79,28 @@ export default function FeedHomeScreen() { ); const requestNotificationPermission = async () => { - const { status } = await Permissions.getAsync(Permissions.NOTIFICATIONS); - if (status !== PermissionStatus.GRANTED) { - return; + let pushToken; + if (Constants.isDevice) { + const { status: existingStatus } = await Permissions.getAsync( + Permissions.NOTIFICATIONS, + ); + let finalStatus = existingStatus; + if (existingStatus !== PermissionStatus.GRANTED) { + const { status } = await Permissions.askAsync( + Permissions.NOTIFICATIONS, + ); + finalStatus = status; + } + if (finalStatus !== PermissionStatus.GRANTED) { + alert("Failed to get push token for push notification!"); + return; + } + pushToken = (await Notifications.getExpoPushTokenAsync()).data; + console.log(pushToken); } - const pushToken = (await Notifications.getExpoPushTokenAsync()).data; - if (Platform.OS === "android") { - await Notifications.setNotificationChannelAsync("default", { + Notifications.setNotificationChannelAsync("default", { name: "default", importance: Notifications.AndroidImportance.MAX, vibrationPattern: [0, 250, 250, 250], diff --git a/front/src/screens/ProfileScreen.tsx b/front/src/screens/ProfileScreen.tsx index 77ce22bd..499ed3c5 100644 --- a/front/src/screens/ProfileScreen.tsx +++ b/front/src/screens/ProfileScreen.tsx @@ -37,6 +37,9 @@ export default function ProfileScreen() { navigation.setOptions({ headerShown: false, }); + }, [navigation]); + + useEffect(() => { getProfile(); }, []); From 6cb2d1591a5e07649a493ee6c959e7c82cf2bec3 Mon Sep 17 00:00:00 2001 From: jnsorn Date: Wed, 23 Sep 2020 22:37:40 +0900 Subject: [PATCH 05/13] =?UTF-8?q?chore=20:=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front/app.json | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/front/app.json b/front/app.json index 7856726d..96b5a866 100644 --- a/front/app.json +++ b/front/app.json @@ -1,8 +1,8 @@ { "expo": { "name": "직고래", - "slug": "jikgorae", - "version": "2.0.0", + "slug": "jikgorae-201", + "version": "2.0.1", "orientation": "portrait", "icon": "./assets/app_icon.png", "splash": { @@ -18,14 +18,9 @@ "android": { "package": "com.sellerleecompany.jikgorae", "softwareKeyboardLayoutMode": "pan", - "versionCode": 4, + "versionCode": 5, "useNextNotificationsApi": true }, - "ios": { - "bundleIdentifier": "com.sellerleecompany.jikgorae", - "supportsTablet": true, - "buildNumber": "2.0.0" - }, "web": { "favicon": "./assets/app_icon.png" } From 721b23c978df762a032d2b2df9109de2751fab05 Mon Sep 17 00:00:00 2001 From: jnsorn Date: Wed, 23 Sep 2020 22:38:26 +0900 Subject: [PATCH 06/13] =?UTF-8?q?chore=20:=20=EC=95=B1=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EC=BD=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front/assets/app_icon.png | Bin 51804 -> 12916 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/front/assets/app_icon.png b/front/assets/app_icon.png index 6f5bfbcae8b2096a131a94affabdc12d617244c3..e762c4265bafefec4a6220d8b7511b051bc4d9d2 100644 GIT binary patch literal 12916 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 From 08d80c661e0046712fc3df07c12a4b3d624855ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=84=B0=ED=8B=80?= Date: Wed, 23 Sep 2020 22:54:56 +0900 Subject: [PATCH 07/13] =?UTF-8?q?fix:=20=EC=B0=9C=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9D=B4=20=EC=95=88=EB=90=98=EB=8A=94=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/favorite/application/FavoriteCreatedListener.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/back/api/src/main/java/com/jikgorae/api/favorite/application/FavoriteCreatedListener.java b/back/api/src/main/java/com/jikgorae/api/favorite/application/FavoriteCreatedListener.java index bcc97c5f..3b0d12a1 100644 --- a/back/api/src/main/java/com/jikgorae/api/favorite/application/FavoriteCreatedListener.java +++ b/back/api/src/main/java/com/jikgorae/api/favorite/application/FavoriteCreatedListener.java @@ -2,6 +2,7 @@ import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; import com.jikgorae.api.articlefavoritecount.application.ArticleFavoriteCountService; import com.jikgorae.common.notification.domain.PushToken; @@ -24,6 +25,10 @@ public FavoriteCreatedListener(ArticleFavoriteCountService articleFavoriteCountS @Override public void onApplicationEvent(FavoriteCreatedEvent event) { articleFavoriteCountService.increase(event.getFavorite().getArticle()); + } + + @TransactionalEventListener + public void doAfterFavoriteCreatedEvent(FavoriteCreatedEvent event) { sendNotification(event); } From 8740d8d6bdb12e5c97d1d23bf18161af8e60d808 Mon Sep 17 00:00:00 2001 From: jnsorn Date: Wed, 23 Sep 2020 23:03:03 +0900 Subject: [PATCH 08/13] =?UTF-8?q?chore=20:=20slug=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front/app.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front/app.json b/front/app.json index 96b5a866..767d8438 100644 --- a/front/app.json +++ b/front/app.json @@ -1,7 +1,7 @@ { "expo": { "name": "직고래", - "slug": "jikgorae-201", + "slug": "jikgorae", "version": "2.0.1", "orientation": "portrait", "icon": "./assets/app_icon.png", From 0d1e7ce0a0d68db09664dd30b44af2504e414b3a Mon Sep 17 00:00:00 2001 From: kouz Date: Fri, 25 Sep 2020 13:24:27 +0900 Subject: [PATCH 09/13] =?UTF-8?q?refactor:=20MessageRequest=20=ED=91=B8?= =?UTF-8?q?=EC=8B=9C=20=ED=86=A0=ED=81=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/message/application/MessageRequest.java | 9 +++++++-- .../chat/message/application/MessageService.java | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageRequest.java b/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageRequest.java index e381e3cd..152803f2 100644 --- a/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageRequest.java +++ b/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageRequest.java @@ -7,17 +7,18 @@ public class MessageRequest { private Long senderId; private String senderNickname; private String message; - // TODO: 2020/09/23 pushToken 이슈 해결시, pushToken 추가 + private String pushToken; public MessageRequest() { } public MessageRequest(Long roomId, Long senderId, - String senderNickname, String message) { + String senderNickname, String message, String pushToken) { this.roomId = roomId; this.senderId = senderId; this.senderNickname = senderNickname; this.message = message; + this.pushToken = pushToken; } public Message toMessage() { @@ -39,4 +40,8 @@ public String getSenderNickname() { public String getMessage() { return message; } + + public String getPushToken() { + return pushToken; + } } \ No newline at end of file diff --git a/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageService.java b/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageService.java index 480cfeb2..a7f94d54 100644 --- a/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageService.java +++ b/back/chat/src/main/java/com/jikgorae/chat/message/application/MessageService.java @@ -20,7 +20,7 @@ public MessageService(MessageRepository messageRepository) { public MessageResponse save(MessageRequest request) { Message message = request.toMessage(); // TODO: 2020/09/21 Member가 모듈로 분리 될때 토큰을 멤버 DB에서 조회해온다. - Message save = messageRepository.save(message); + Message save = messageRepository.save(message.send(request.getPushToken())); return MessageResponse.of(save); } From 5b538603a15496925fd7c339e30e94fc798d6bff Mon Sep 17 00:00:00 2001 From: jnsorn Date: Wed, 30 Sep 2020 14:10:11 +0900 Subject: [PATCH 10/13] =?UTF-8?q?chore=20:=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front/app.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/front/app.json b/front/app.json index 767d8438..8a934fe5 100644 --- a/front/app.json +++ b/front/app.json @@ -2,7 +2,7 @@ "expo": { "name": "직고래", "slug": "jikgorae", - "version": "2.0.1", + "version": "2.0.2", "orientation": "portrait", "icon": "./assets/app_icon.png", "splash": { @@ -18,7 +18,7 @@ "android": { "package": "com.sellerleecompany.jikgorae", "softwareKeyboardLayoutMode": "pan", - "versionCode": 5, + "versionCode": 6, "useNextNotificationsApi": true }, "web": { From 0c77233077b713cf7fb868ddc9774ba7013aaf1a Mon Sep 17 00:00:00 2001 From: kouz Date: Wed, 30 Sep 2020 14:47:53 +0900 Subject: [PATCH 11/13] =?UTF-8?q?test:=20MessageFixture=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/jikgorae/chat/message/fixture/MessageFixture.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/back/chat/src/test/java/com/jikgorae/chat/message/fixture/MessageFixture.java b/back/chat/src/test/java/com/jikgorae/chat/message/fixture/MessageFixture.java index e7e4ebeb..67081b5c 100644 --- a/back/chat/src/test/java/com/jikgorae/chat/message/fixture/MessageFixture.java +++ b/back/chat/src/test/java/com/jikgorae/chat/message/fixture/MessageFixture.java @@ -4,6 +4,6 @@ public class MessageFixture { public static MessageRequest requestOf(Long roomId) { - return new MessageRequest(roomId, 99L, "NICKNAME", "MESSAGE"); + return new MessageRequest(roomId, 99L, "NICKNAME", "MESSAGE", "PUSH_TOKEN"); } } From 1eb42e1485daaf1086ad75ff405f3bae051501a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=84=B0=ED=8B=80=28=EB=82=A8=EC=9C=A4=EC=84=9C=29?= Date: Wed, 30 Sep 2020 19:22:48 +0900 Subject: [PATCH 12/13] =?UTF-8?q?fix:=20=EC=95=8C=EB=A6=BC=EC=9D=B4=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=EC=9D=84=20=EB=88=84=EB=A5=B8?= =?UTF-8?q?=EC=82=AC=EB=9E=8C=EC=97=90=EA=B2=8C=20=EB=B3=B4=EB=82=B4?= =?UTF-8?q?=EC=A7=80=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/favorite/application/FavoriteNotificationService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/back/api/src/main/java/com/jikgorae/api/favorite/application/FavoriteNotificationService.java b/back/api/src/main/java/com/jikgorae/api/favorite/application/FavoriteNotificationService.java index c55eb590..67c544df 100644 --- a/back/api/src/main/java/com/jikgorae/api/favorite/application/FavoriteNotificationService.java +++ b/back/api/src/main/java/com/jikgorae/api/favorite/application/FavoriteNotificationService.java @@ -36,7 +36,7 @@ public String makeMessage(ApplicationEvent applicationEvent) { @Override public PushToken getToken(ApplicationEvent applicationEvent) { FavoriteCreatedEvent event = (FavoriteCreatedEvent)applicationEvent; - Member member = memberRepository.findById(event.getFavorite().getMember().getId()) + Member member = memberRepository.findById(event.getFavorite().getArticle().getAuthor().getId()) .orElseThrow(() -> new NoSuchElementException("존재하지 않는 회원입니다.")); return new PushToken(member.getPushToken()); } From 0fc51679104d9e5be17cb2a767939a30a3337e41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=84=B0=ED=8B=80=28=EB=82=A8=EC=9C=A4=EC=84=9C=29?= Date: Wed, 30 Sep 2020 19:50:37 +0900 Subject: [PATCH 13/13] =?UTF-8?q?fix:=20=EC=95=8C=EB=A6=BC=EC=9D=84=20?= =?UTF-8?q?=EB=B3=B4=EB=82=B8=EC=82=AC=EB=9E=8C=EC=9D=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=B4=20=EB=A9=94=EC=8B=9C=EC=A7=80=EB=A1=9C=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=EB=90=98=EB=8A=94=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FavoriteNotificationService.java | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/back/api/src/main/java/com/jikgorae/api/favorite/application/FavoriteNotificationService.java b/back/api/src/main/java/com/jikgorae/api/favorite/application/FavoriteNotificationService.java index 67c544df..c2d5d7bf 100644 --- a/back/api/src/main/java/com/jikgorae/api/favorite/application/FavoriteNotificationService.java +++ b/back/api/src/main/java/com/jikgorae/api/favorite/application/FavoriteNotificationService.java @@ -1,14 +1,10 @@ package com.jikgorae.api.favorite.application; -import java.util.NoSuchElementException; - import org.springframework.context.ApplicationEvent; import org.springframework.stereotype.Service; import com.jikgorae.api.article.application.ArticleViewService; import com.jikgorae.api.article.domain.Article; -import com.jikgorae.api.member.domain.Member; -import com.jikgorae.api.member.domain.MemberRepository; import com.jikgorae.common.notification.domain.NotificationService; import com.jikgorae.common.notification.domain.PushToken; @@ -17,27 +13,22 @@ public class FavoriteNotificationService implements NotificationService { private static final String MESSAGE = "님이 회원님의 게시글을 찜했습니다."; private final ArticleViewService articleViewService; - private final MemberRepository memberRepository; - public FavoriteNotificationService(ArticleViewService articleViewService, - MemberRepository memberRepository) { + public FavoriteNotificationService(ArticleViewService articleViewService) { this.articleViewService = articleViewService; - this.memberRepository = memberRepository; } @Override public String makeMessage(ApplicationEvent applicationEvent) { FavoriteCreatedEvent event = (FavoriteCreatedEvent)applicationEvent; - Article article = articleViewService.show(event.getFavorite().getArticle().getId()); - String author = article.getAuthor().getNickname(); - return author + MESSAGE; + String senderNickname = event.getFavorite().getMember().getNickname(); + return senderNickname + MESSAGE; } @Override public PushToken getToken(ApplicationEvent applicationEvent) { FavoriteCreatedEvent event = (FavoriteCreatedEvent)applicationEvent; - Member member = memberRepository.findById(event.getFavorite().getArticle().getAuthor().getId()) - .orElseThrow(() -> new NoSuchElementException("존재하지 않는 회원입니다.")); - return new PushToken(member.getPushToken()); + Article article = articleViewService.show(event.getFavorite().getArticle().getId()); + return new PushToken(article.getAuthor().getPushToken()); } }