diff --git a/README.md b/README.md
index 9a177fe..dbab442 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,6 @@
사이드 프로젝트 팀을 위한 체계적인 일정 관리 앱, 함께 만들고 함께 확인하는 협업 공간.
-
@@ -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,