diff --git a/README.md b/README.md index 9a177fe..dbab442 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@

사이드 프로젝트 팀을 위한 체계적인 일정 관리 앱, 함께 만들고 함께 확인하는 협업 공간.

-

1 2 @@ -35,15 +34,6 @@ --- -## 트러블 슈팅 -- SafeAreaView 플랫폼 별 여백 이슈 -- 플랫폼 별 키보드 이슈 -- 모달 위에 모달 위에 모달 이슈 -- 팀 리스트 바로 안 불러와지는 것 -- 중복 리프레쉬 토큰 재발급 인터셉터로 해결 - ---- - ## 🛠 기술 스택 ### Core diff --git a/app/auth/permission.tsx b/app/auth/permission.tsx index 50100a6..4b3c9b6 100644 --- a/app/auth/permission.tsx +++ b/app/auth/permission.tsx @@ -38,7 +38,7 @@ export default function PermissionsScreen() { if (!pending) { Alert.alert( "오류", - "로그인 정보가 만료되었습니다. 다시 로그인해 주세요." + "로그인 정보가 만료되었습니다. 다시 로그인해 주세요.", ); router.replace("/auth"); return; @@ -112,7 +112,7 @@ export default function PermissionsScreen() { > 앱 접근 권한 안내 - + Nemonemo 서비스 이용을 위해 다음 권한을 확인해 주시길 바랍니다. @@ -156,11 +156,13 @@ export default function PermissionsScreen() { - + + + ); } @@ -169,17 +171,14 @@ const styles = StyleSheet.create({ container: { flex: 1, marginTop: 134, - marginHorizontal: 20, gap: globalSpacingMd, }, textContainer: { - padding: 20, - marginVertical: 30, + marginHorizontal: 20, gap: 20, }, card: { borderRadius: 12, - padding: 16, gap: 12, }, row: { @@ -189,21 +188,29 @@ const styles = StyleSheet.create({ text_h1: { fontSize: 22, fontWeight: "700", - lineHeight: 27, - fontFamily: "Pretendard-Regular", + lineHeight: 24, + fontFamily: "Pretendard-Bold", color: "#2B2B2B", }, text_h3: { - fontSize: 19, + fontSize: 16, fontWeight: "500", - lineHeight: 27, + lineHeight: 18, + fontFamily: "Pretendard-Bold", + color: "#2B2B2B", + }, + text_h4: { + fontSize: 16, + fontWeight: "400", + lineHeight: 20, fontFamily: "Pretendard-Regular", color: "#2B2B2B", + marginHorizontal: 20, }, text_body1: { - fontSize: 16, - fontWeight: "200", - lineHeight: 27, + fontSize: 14, + fontWeight: "300", + lineHeight: 20, fontFamily: "Pretendard-Regular", color: globalGray700, }, @@ -216,10 +223,11 @@ const styles = StyleSheet.create({ }, text_body3: { fontSize: 12, - fontWeight: "200", - lineHeight: 17, + fontWeight: "300", + lineHeight: 18, fontFamily: "Pretendard-Regular", - color: globalGray700, + marginHorizontal: 20, + color: "#5F5F5F", }, rowIcon: { flexDirection: "row", alignItems: "center", gap: 12 }, rowText: { flex: 1, gap: 4 }, diff --git a/app/teams/check/join/profile-setup.tsx b/app/teams/check/join/profile-setup.tsx index 46a84b2..2bb72ae 100644 --- a/app/teams/check/join/profile-setup.tsx +++ b/app/teams/check/join/profile-setup.tsx @@ -4,6 +4,7 @@ import { Position } from "@/features/team/types/team.model"; import NemoText from "@/shared/ui/atoms/NemoText"; import Chips, { ChipText } from "@/shared/ui/molecules/Chips"; import CtaButton from "@/shared/ui/molecules/CtaButton"; +import { useQueryClient } from "@tanstack/react-query"; import { useLocalSearchParams, useRouter } from "expo-router"; import { useState } from "react"; import { StyleSheet, TouchableOpacity, View } from "react-native"; @@ -11,6 +12,7 @@ import { SafeAreaView } from "react-native-safe-area-context"; export default function ProfileSetupScreen() { const router = useRouter(); + const queryClient = useQueryClient(); const params = useLocalSearchParams<{ teamId?: string; inviteCode: string; @@ -23,7 +25,7 @@ export default function ProfileSetupScreen() { : []; const [selectedPositionId, setSelectedPositionId] = useState( - null + null, ); const [chipData, setChipData] = useState( @@ -31,7 +33,7 @@ export default function ProfileSetupScreen() { id: position.positionId, content: position.positionName, isActive: false, - })) + })), ); const handlePositionSelect = (items: ChipText[]) => { @@ -68,6 +70,11 @@ export default function ProfileSetupScreen() { positionId: selectedPositionId, }); + // teamList staleTime이 길어서 참가 직후 캐시가 그대로일 수 있음. + // 사이드바에서 즉시 새 팀이 보이도록 참가 성공 시점에 갱신한다. + await queryClient.invalidateQueries({ queryKey: ["teamList"] }); + await queryClient.refetchQueries({ queryKey: ["teamList"] }); + const joinedTeamId = Number(params.teamId); if (Number.isFinite(joinedTeamId) && joinedTeamId > 0) { router.replace(`/${joinedTeamId}/calendar`); diff --git a/shared/hooks/useCalendarForm.tsx b/shared/hooks/useCalendarForm.tsx index 5113714..8bb0e5a 100644 --- a/shared/hooks/useCalendarForm.tsx +++ b/shared/hooks/useCalendarForm.tsx @@ -63,13 +63,15 @@ export const createInitialState = ({ // schedule 편집 if (type === "schedule") { const s = data as SchedulesResponse; - const person = persons - .filter((per) => (s.attendeeMemberIds ?? []).includes(per.memberId)) - .map((per) => ({ ...per, isActive: true })); - - const position = positions - .filter((pos) => data.positionIds.includes(pos.positionId)) - .map((pos) => ({ ...pos, isActive: true })); + const person = persons.map((per) => ({ + ...per, + isActive: (s.attendeeMemberIds ?? []).includes(per.memberId), + })); + + const position = positions.map((pos) => ({ + ...pos, + isActive: (data.positionIds ?? []).includes(pos.positionId), + })); const { repeatType, repeatEndDate,