Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 0 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
<p align="center">사이드 프로젝트 팀을 위한 체계적인 일정 관리 앱, 함께 만들고 함께 확인하는 협업 공간.</p>
</div>


<p align="center">
<img width="600" height="700" alt="1" src="https://github.com/user-attachments/assets/10a49cf0-b1b7-40de-9937-9943f1efa38d" />
<img width="600" height="1000" alt="2" src="https://github.com/user-attachments/assets/16e2256c-333a-4df5-9037-5bec776d5e2d" />
Expand Down Expand Up @@ -35,15 +34,6 @@

---

## 트러블 슈팅
- SafeAreaView 플랫폼 별 여백 이슈
- 플랫폼 별 키보드 이슈
- 모달 위에 모달 위에 모달 이슈
- 팀 리스트 바로 안 불러와지는 것
- 중복 리프레쉬 토큰 재발급 인터셉터로 해결

---

## 🛠 기술 스택

### Core
Expand Down
50 changes: 29 additions & 21 deletions app/auth/permission.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export default function PermissionsScreen() {
if (!pending) {
Alert.alert(
"오류",
"로그인 정보가 만료되었습니다. 다시 로그인해 주세요."
"로그인 정보가 만료되었습니다. 다시 로그인해 주세요.",
);
router.replace("/auth");
return;
Expand Down Expand Up @@ -112,7 +112,7 @@ export default function PermissionsScreen() {
>
앱 접근 권한 안내
</Text>
<Text style={styles.text_body1}>
<Text style={styles.text_h4}>
Nemonemo 서비스 이용을 위해 다음 권한을 확인해 주시길 바랍니다.
</Text>
<View style={styles.divider} />
Expand Down Expand Up @@ -156,11 +156,13 @@ export default function PermissionsScreen() {
</View>
</View>

<CtaButton
label={isSubmitting ? "처리 중..." : "확인"}
onPress={handleComplete}
isActive={canSubmit}
/>
<View style={{ marginBottom: 20 }}>
<CtaButton
label={isSubmitting ? "처리 중..." : "다음으로"}
onPress={handleComplete}
isActive={canSubmit}
/>
</View>
</SafeAreaView>
);
}
Expand All @@ -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: {
Expand All @@ -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,
},
Expand All @@ -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 },
Expand Down
11 changes: 9 additions & 2 deletions app/teams/check/join/profile-setup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ 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";
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;
Expand All @@ -23,15 +25,15 @@ export default function ProfileSetupScreen() {
: [];

const [selectedPositionId, setSelectedPositionId] = useState<number | null>(
null
null,
);

const [chipData, setChipData] = useState<ChipText[]>(
positions.map((position) => ({
id: position.positionId,
content: position.positionName,
isActive: false,
}))
})),
);

const handlePositionSelect = (items: ChipText[]) => {
Expand Down Expand Up @@ -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`);
Expand Down
16 changes: 9 additions & 7 deletions shared/hooks/useCalendarForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down