Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
5f8ea4a
style: 기록간 간격 32px → 40px으로 수정
ljh130334 Aug 20, 2025
6cfa619
fix: 기록장 툴팁 메시지 수정
ljh130334 Aug 20, 2025
274caf0
fix: 스크롤 안보이게 수정
ljh130334 Aug 20, 2025
6508d00
fix: 글 수정 페이지에서 책 표지 불러오기 문제 해결 - 책 정보 로딩 로직 수정
ljh130334 Aug 20, 2025
12a9928
fix: 글 작성 및 수정 시 버튼 위의 ‘작성중’/'수정중' 글씨 삭제
ljh130334 Aug 20, 2025
db837d4
style: 더보기 바텀시트 아래 여백 수정
ljh130334 Aug 20, 2025
e513656
fix: 진행도 표시에 소수점 내림 처리 적용
ljh130334 Aug 20, 2025
43c99a2
fix: 기록장 뒤로가기 시 모임 메인페이지로 이동하도록 수정
ljh130334 Aug 20, 2025
250c0d4
style: min-height: 100vh 설정
ljh130334 Aug 20, 2025
9622a6f
refactor: 페이지 전체 dim 오버레이 추가 후 필터를 최상단 z-index로 설정
ljh130334 Aug 20, 2025
6462d16
fix: 총평 버튼 비활성화된 상태에서 클릭 방지 처리
ljh130334 Aug 20, 2025
b0d7334
fix: 기록 숨기기/기록 보이기 개발용 버튼 제거
ljh130334 Aug 20, 2025
180c42f
fix: 바텀시트 width 화면 크기에 맞춰 수정
ljh130334 Aug 20, 2025
c869941
fix: dim 영역 클릭 시 모달 닫히도록 수정
ljh130334 Aug 20, 2025
bb15de0
fix: 모임 생성 시 생성 중 버튼 텍스트 제거
ljh130334 Aug 20, 2025
28baad1
fix: 가이드텍스트 typo 수정
ljh130334 Aug 20, 2025
0baa26f
fix: 오늘의 한마디 자정 기준으로 작성 카운트 리셋
ljh130334 Aug 20, 2025
60f9b5e
fix: 페이지 로딩 시 가장 하단 메시지가 보이도록 수정
ljh130334 Aug 20, 2025
b055dc3
fix: 첫 번째 한마디 작성 시에만 성공 메시지 뜨도록 수정
ljh130334 Aug 20, 2025
a5bbdf8
fix: isError prop 추가 후 적용
ljh130334 Aug 20, 2025
04a0ec1
fix: 책 컴포넌트에 저자+'저' 형태로 수정
ljh130334 Aug 20, 2025
2986f6d
fix: 책 상세정보 페이지 라우팅 경로 수정
ljh130334 Aug 20, 2025
7dd01a1
fix: 장르 태그의 색상을 장르에 맞게 매핑
ljh130334 Aug 20, 2025
8180ee8
fix: 좌우 20px 패딩 유지로 수정
ljh130334 Aug 20, 2025
52d4ae5
fix: 기록 수정 버튼 네비게이션 코드 제거
ljh130334 Aug 20, 2025
83f6524
fix: 내 기록 길게 눌러서 더보기 메뉴 표시하도록 수정
ljh130334 Aug 20, 2025
a723538
fix: 내 모임방 모달 수정
heeeeyong Aug 20, 2025
778b713
fix: 로딩스피너 수정
heeeeyong Aug 20, 2025
e610e8e
fix: 블라인드 처리 된 기록에 상효작용 불가능하도록 수정
ljh130334 Aug 20, 2025
fdc64e5
fix: isMyself 변수 추가
heeeeyong Aug 20, 2025
0e071c9
Merge pull request #177 from THIP-TextHip/main
heeeeyong Aug 20, 2025
5da1c7c
fix: 블라인드 처리 시스템 수정
ljh130334 Aug 20, 2025
137c4d0
style: 커서 색 수정 및 입력박스 확장하도록 수정
ljh130334 Aug 20, 2025
da75273
refactor: 입력 검증 로직 개선
ljh130334 Aug 20, 2025
489aa46
fix: 피드 책 저장 로직 수정
heeeeyong Aug 20, 2025
2c7655c
fix: 팝업 제대로 동작하도록 수정
ljh130334 Aug 20, 2025
3a15bb9
feat: 핀하기 기능 구현 및 일부 스타일링 수정
ljh130334 Aug 20, 2025
e3a5ccf
fix: 사진 클릭 범위 수정
heeeeyong Aug 20, 2025
43b9e06
feat: 툴팁 구현
ljh130334 Aug 20, 2025
ae2f98a
fix: 내 띱 목록 전체 바 선 수정
heeeeyong Aug 20, 2025
3d0c8b7
fix: conflict 해결
ljh130334 Aug 20, 2025
5077cea
Merge pull request #179 from THIP-TextHip/qa/jihyeon
ljh130334 Aug 20, 2025
5f021f3
Merge pull request #178 from THIP-TextHip/chore/minor-updates
heeeeyong Aug 20, 2025
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
3 changes: 3 additions & 0 deletions src/assets/memory/record-x.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ export const Overlay = styled.div<{ isOpen: boolean }>`

export const BottomSheet = styled.div<{ isOpen: boolean }>`
width: 100%;
max-width: 540px;
min-width: 360px;
max-width: 767px;
min-width: 320px;
background: ${colors.darkgrey.main};
border-radius: 20px 20px 0 0;
display: flex;
Expand Down
4 changes: 4 additions & 0 deletions src/components/common/LoadingSpinner.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ const LoadingSpinner = ({
const Container = styled.div<{ fullHeight: boolean }>`
display: flex;
flex-direction: column;
width: 100%;
max-width: 767px;
min-width: 320px;
margin: 0 auto;
justify-content: center;
align-items: center;
${({ fullHeight }) =>
Expand Down
50 changes: 13 additions & 37 deletions src/components/common/Modal/MoreMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,9 @@ import styled from '@emotion/styled';
import { colors, typography } from '@/styles/global/global';
import type { MoreMenuProps } from '@/stores/usePopupStore';

const MoreMenu = ({
onEdit,
onDelete,
onClose,
onReport,
onPin,
isWriter,
type,
}: MoreMenuProps) => {
const MoreMenu = ({ onEdit, onDelete, onClose, onReport, isWriter, type }: MoreMenuProps) => {
return (
<Overlay onClick={onClose}>
<Overlay onClick={() => onClose?.()}>
{type === 'post' ? (
Comment on lines +5 to 8
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

onPin 제거에 따른 타입/사용처 정합성 점검 필요

컴포넌트 시그니처에서 onPin을 제거했습니다. 그러나 usePopupStore의 MoreMenuProps에는 여전히 onPin이 정의되어 있습니다. 또한 기존 호출부가 onPin을 기대하고 있을 수 있으니 검색/정리 필요합니다.

다음 스크립트로 onPin 사용처와 타입 정의를 확인하세요.

MoreMenuProps는 아래처럼 정리하는 것을 권장합니다(별도 파일 변경):

// src/stores/usePopupStore.ts
export interface MoreMenuProps {
  onEdit?: () => void;
  onDelete?: () => void;
  onClose?: () => void;
  onReport?: () => void;
  // onPin?: () => void; // 제거
  isWriter?: boolean;
  type?: 'post' | 'reply';
}

🏁 Script executed:

#!/bin/bash
# onPin 타입/사용처 탐색
rg -n --type=ts --type=tsx -C2 "\bonPin\b"

# MoreMenu 호출부에서 onPin을 넘기는 곳이 있는지 확인
rg -nP --type=ts --type=tsx -C2 "MoreMenu\s*\(\{[^\}]*onPin"

Length of output: 163


아래 스크립트로 onPin 사용처와 타입 정의, MoreMenu 호출부를 재검증해 주세요. (--type 대신 -g 옵션으로 파일 확장자 필터링)


🏁 Script executed:

#!/bin/bash
# 1) onPin 키워드 사용처 검색 (TS/TSX)
rg -n -g "*.{ts,tsx}" -C2 "\bonPin\b"

# 2) MoreMenuProps 정의 위치 확인
rg -n -C5 "interface MoreMenuProps" -g "src/stores/usePopupStore.ts"

# 3) MoreMenu 컴포넌트 시그니처 확인
rg -n -C5 "const MoreMenu" -g "src/components/common/Modal/MoreMenu.tsx"

# 4) MoreMenu 호출부(사용처) 검색
rg -n -C3 -g "*.{ts,tsx}" "MoreMenu"

Length of output: 13205


MoreMenuProps 및 사용처에서 onPin 제거 필요

MoreMenu 컴포넌트에서 onPin을 제거하셨으므로, 타입 정의와 호출부에서도 완전히 정리해야 합니다:

  • src/stores/usePopupStore.ts
    • export interface MoreMenuProps 에서 onPin?: () => void; 삭제
  • src/components/memory/RecordItem/RecordItem.tsx
    • openMoreMenu({ …, onPin: handlePinConfirm, … }) 호출부에서 onPin: handlePinConfirm 제거

현재 이 두 곳 외에는 onPin 사용처가 없습니다. 위 수정 후 컴파일 및 동작을 한번 더 확인해 주세요.

🤖 Prompt for AI Agents
In src/stores/usePopupStore.ts (where MoreMenuProps is declared) and
src/components/memory/RecordItem/RecordItem.tsx (call site opening the more
menu), remove the now-unused onPin property: delete the onPin?: () => void; from
the MoreMenuProps interface and remove the onPin: handlePinConfirm (or
equivalent) entry from the openMoreMenu(...) call; then rebuild to ensure no
other references remain and verify runtime behavior.

// post 타입: 기존 로직 유지
<>
Expand All @@ -25,11 +17,6 @@ const MoreMenu = ({
<Button variant="delete" onClick={onDelete}>
삭제하기
</Button>
{onPin && (
<Button variant="pin" onClick={onPin}>
피드에 핀하기
</Button>
)}
</RecordContainer>
</>
) : (
Expand Down Expand Up @@ -70,21 +57,16 @@ const Overlay = styled.div`
bottom: 0;
display: flex;
justify-content: center;
align-items: center;
min-width: 320px;
max-width: 767px;
margin: 0 auto;
align-items: flex-end;
width: 100vw;
height: 100vh;
background-color: rgba(18, 18, 18, 0.1);
backdrop-filter: blur(2.5px);
z-index: 1200;
`;

const ReportContainer = styled.div`
position: fixed;
left: 0;
right: 0;
bottom: 0;

position: relative;
display: flex;
flex-direction: column;
min-width: 320px;
Expand All @@ -94,16 +76,11 @@ const ReportContainer = styled.div`
padding: 20px;
border-radius: 12px 12px 0px 0px;
background-color: ${colors.darkgrey.main};
z-index: 1201;
`;

// 3개 버튼을 위한 컨테이너 (핀하기 포함)
const RecordContainer = styled.div`
position: fixed;
left: 0;
right: 0;
bottom: 0;

position: relative;
display: flex;
flex-direction: column;
min-width: 320px;
Expand All @@ -112,7 +89,6 @@ const RecordContainer = styled.div`
padding: 20px;
border-radius: 12px 12px 0px 0px;
background-color: ${colors.darkgrey.main};
z-index: 1201;
`;

const Button = styled.div<{ variant: 'edit' | 'delete' | 'report' | 'pin' }>`
Expand Down Expand Up @@ -142,30 +118,30 @@ const Button = styled.div<{ variant: 'edit' | 'delete' | 'report' | 'pin' }>`
if (variant === 'pin') {
return `
&:first-of-type {
padding: 8px 12px 16px 12px;
padding: 13px 12px 21px 12px;
}

&:nth-of-type(2) {
padding: 8px 12px 16px 12px;
padding: 13px 12px 21px 12px;
}

&:last-of-type {
padding: 16px 12px 8px 12px;
padding: 21px 12px 13px 12px;
border-bottom: none;
}
`;
}
return `
&:first-of-type {
padding: 8px 12px 16px 12px;
padding: 13px 12px 21px 12px;
}

&:nth-of-type(2) {
padding: 8px 12px 16px 12px;
padding: 13px 12px 21px 12px;
}

&:last-of-type {
padding: 16px 12px 8px 12px;
padding: 21px 12px 13px 12px;
border-bottom: none;
}
`;
Expand Down
7 changes: 4 additions & 3 deletions src/components/common/Modal/Snackbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { colors, typography } from '@/styles/global/global';
import type { SnackbarProps } from '@/stores/usePopupStore';
import { useEffect, useState } from 'react';

const Snackbar = ({ message, actionText, variant, onActionClick, onClose }: SnackbarProps) => {
const Snackbar = ({ message, actionText, variant, isError, onActionClick, onClose }: SnackbarProps) => {
const [visible, setVisible] = useState(false);

useEffect(() => {
Expand All @@ -20,7 +20,7 @@ const Snackbar = ({ message, actionText, variant, onActionClick, onClose }: Snac

return (
<Container variant={variant} visible={visible}>
<Discription>{message}</Discription>
<Discription isError={isError}>{message}</Discription>
{variant === 'bottom' && actionText && <Button onClick={onActionClick}>{actionText}</Button>}
</Container>
);
Expand Down Expand Up @@ -52,9 +52,10 @@ const Container = styled.div<{ variant: 'top' | 'bottom'; visible: boolean }>`
transition: transform 2s cubic-bezier(0.16, 1, 0.3, 1);
`;

const Discription = styled.div`
const Discription = styled.div<{ isError?: boolean }>`
font-size: ${typography.fontSize.xs};
font-weight: ${typography.fontWeight.medium};
color: ${({ isError }) => isError ? colors.red : colors.white};
`;

const Button = styled.div`
Expand Down
9 changes: 6 additions & 3 deletions src/components/common/Post/PostBody.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const Container = styled.div`
flex-direction: column;
width: 100%;
gap: 16px;
cursor: pointer;
`;

const PostContent = styled.div<{ hasImage: boolean }>`
Expand Down Expand Up @@ -82,9 +83,11 @@ const PostBody = ({
}, [contentBody]);

return (
<Container>
<BookInfoCard bookTitle={bookTitle} bookAuthor={bookAuthor} isbn={isbn} />
<PostContent hasImage={hasImage} onClick={() => handlePostClick(feedId)}>
<Container onClick={() => handlePostClick(feedId)}>
<div onClick={(e) => e.stopPropagation()}>
<BookInfoCard bookTitle={bookTitle} bookAuthor={bookAuthor} isbn={isbn} />
</div>
<PostContent hasImage={hasImage}>
<div className="content" ref={contentRef}>
{contentBody}
</div>
Expand Down
12 changes: 10 additions & 2 deletions src/components/common/Post/PostFooter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ interface PostFooterProps {
isLiked?: boolean;
isPublic?: boolean;
isDetail?: boolean;
onSaveToggle?: (feedId: number, newSaveState: boolean) => void;
}

const PostFooter = ({
Expand All @@ -63,6 +64,7 @@ const PostFooter = ({
isLiked = false,
isPublic = true,
isDetail = false,
onSaveToggle,
}: PostFooterProps) => {
const [liked, setLiked] = useState(isLiked);
const [likeCount, setLikeCount] = useState<number>(initialLikeCount);
Expand Down Expand Up @@ -90,9 +92,15 @@ const PostFooter = ({
const response = await postSaveFeed(feedId, !saved);

if (response.isSuccess) {
const newSaveState = response.data?.isSaved ?? !saved;
// 성공 시 상태 업데이트
setSaved(response.data?.isSaved ?? !saved);
console.log('저장 상태 변경 성공:', response.data?.isSaved);
setSaved(newSaveState);
console.log('저장 상태 변경 성공:', newSaveState);

// 부모 컴포넌트에 알림
if (onSaveToggle) {
onSaveToggle(feedId, newSaveState);
}
} else {
console.error('저장 상태 변경 실패:', response.message);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,16 @@ export const DateRangeContainer = styled.div`
width: 100%;
`;

export const DateGroup = styled.div`
export const DateGroup = styled.div<{ alignItems?: 'start' | 'end' | 'center' }>`
display: flex;
align-items: center;
gap: 2px;
flex: 1;
justify-content: center;
justify-content: ${({ alignItems = 'center' }) => {
if (alignItems === 'start') return 'flex-start';
if (alignItems === 'end') return 'flex-end';
return 'center';
}};
`;

export const WheelContainer = styled.div`
Expand Down Expand Up @@ -89,11 +93,11 @@ export const WheelItem = styled.div<{ isSelected: boolean }>`
}
`;

export const DateUnitText = styled.div`
export const DateUnitText = styled.div<{ isLast?: boolean }>`
color: ${semanticColors.text.primary};
font-size: ${typography.fontSize.xs};
font-weight: ${typography.fontWeight.regular};
margin-right: 6px;
margin-right: ${({ isLast }) => (isLast ? '0px' : '6px')};
`;

export const SeparatorText = styled.div`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ const ActivityPeriodSection = ({
<DatePickerContainer>
<DateRangeContainer>
{/* 시작일 */}
<DateGroup>
<DateGroup alignItems="end">
<DateWheel
values={years}
selectedValue={startDate.year}
Expand All @@ -212,13 +212,13 @@ const ActivityPeriodSection = ({
onChange={handleStartDayChange}
width={24}
/>
<DateUnitText>일</DateUnitText>
<DateUnitText isLast>일</DateUnitText>
</DateGroup>

<SeparatorText>~</SeparatorText>

{/* 종료일 */}
<DateGroup>
<DateGroup alignItems="start">
<DateWheel
values={years}
selectedValue={endDate.year}
Expand All @@ -241,7 +241,7 @@ const ActivityPeriodSection = ({
onChange={handleEndDayChange}
width={24}
/>
<DateUnitText>일</DateUnitText>
<DateUnitText isLast>일</DateUnitText>
</DateGroup>
</DateRangeContainer>

Expand Down
6 changes: 3 additions & 3 deletions src/components/creategroup/RoomInfoSection.styled.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import styled from '@emotion/styled';
import { typography, semanticColors } from '../../styles/global/global';
import { typography, semanticColors, colors } from '../../styles/global/global';

export const TextAreaBox = styled.div`
position: relative;
Expand All @@ -13,7 +13,7 @@ export const TextArea = styled.textarea`
border: none;
outline: none;
color: ${semanticColors.text.primary};
font-size: ${typography.fontSize.base};
font-size: ${typography.fontSize.sm};
width: 100%;
resize: none;
font-family: ${typography.fontFamily.primary};
Expand All @@ -22,7 +22,7 @@ export const TextArea = styled.textarea`
margin: 0;

&::placeholder {
color: ${semanticColors.text.primary};
color: ${colors.grey[300]};
font-size: ${typography.fontSize.sm};
}
`;
Expand Down
4 changes: 2 additions & 2 deletions src/components/creategroup/RoomInfoSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const RoomInfoSection = ({
<SectionTitle>방 제목</SectionTitle>
<TextAreaBox>
<TextArea
placeholder="방 제목을 입력합니다."
placeholder="방 제목을 입력해주세요."
value={roomTitle}
onChange={e => onRoomTitleChange(e.target.value)}
maxLength={15}
Expand All @@ -36,7 +36,7 @@ const RoomInfoSection = ({
<SectionTitle>한 줄 소개</SectionTitle>
<TextAreaBox>
<TextArea
placeholder="방에 대한 소개 입력입니다."
placeholder="방에 대한 짧은 소개글을 작성해주세요."
value={roomDescription}
onChange={e => onRoomDescriptionChange(e.target.value)}
maxLength={75}
Expand Down
6 changes: 4 additions & 2 deletions src/components/createpost/PostContentSection.styled.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,19 @@ export const TextAreaBox = styled.div`
flex-direction: column;
`;

export const TextArea = styled.textarea`
export const TextArea = styled.textarea<{ readOnly?: boolean }>`
width: 100%;
min-height: 100px;
background-color: ${semanticColors.background.primary};
background-color: ${props => props.readOnly ? '#f5f5f5' : semanticColors.background.primary};
color: ${semanticColors.text.secondary};
font-size: ${typography.fontSize.sm};
font-weight: ${typography.fontWeight.regular};
font-family: ${typography.fontFamily.primary};
resize: none;
outline: none;
border: none;
overflow: hidden;
cursor: ${props => props.readOnly ? 'not-allowed' : 'text'};

&::placeholder {
color: ${semanticColors.text.ghost};
Expand Down
4 changes: 0 additions & 4 deletions src/components/createpost/PostContentSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ const PostContentSection = ({ content, onContentChange, readOnly = false }: Post
maxLength={maxLength}
rows={4}
readOnly={readOnly}
style={{
backgroundColor: readOnly ? '#f5f5f5' : 'transparent',
cursor: readOnly ? 'not-allowed' : 'text'
}}
/>
<CharacterCount>
{content.length} / {maxLength}
Expand Down
4 changes: 2 additions & 2 deletions src/components/feed/FeedPost.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,13 @@ const BorderBottom = styled.div`
background: #1c1c1c;
`;

const FeedPost = ({ showHeader, isLast, isMyFeed, ...postData }: FeedPostProps) => {
const FeedPost = ({ showHeader, isLast, isMyFeed, onSaveToggle, ...postData }: FeedPostProps) => {
return (
<>
<Container>
{showHeader && <PostHeader {...postData} />}
<PostBody {...postData} />
<PostFooter isMyFeed={!!isMyFeed} {...postData} />
<PostFooter isMyFeed={!!isMyFeed} onSaveToggle={onSaveToggle} {...postData} />
</Container>
{!isLast && <BorderBottom />}
</>
Expand Down
Loading