Skip to content

Commit 9157fc1

Browse files
Merge pull request #69 from ShipFriend0516/feature/email-no-publish
[Feat] 이메일 발송 여부를 결정할 수 있는 플래그 구현
2 parents ae636a3 + 2acfe19 commit 9157fc1

4 files changed

Lines changed: 36 additions & 4 deletions

File tree

app/api/posts/route.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ export async function POST(req: Request) {
129129
seriesId,
130130
tags,
131131
isPrivate,
132+
sendToSubscribers,
132133
} = await req.json();
133134

134135
if (!title || !content || !author || !content) {
@@ -176,8 +177,8 @@ export async function POST(req: Request) {
176177
});
177178
}
178179

179-
// 새 글이 공개 글인 경우 구독자들에게 이메일 발송
180-
if (!post.isPrivate) {
180+
// 공개 글이면서 구독자에게 발행 옵션이 활성화된 경우 이메일 발송
181+
if (!post.isPrivate && sendToSubscribers) {
181182
const { sendNewPostNotifications } = await import(
182183
'@/app/lib/email/notifications'
183184
);

app/entities/post/write/PostMetadataForm.tsx

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ interface PostMetadataFormProps {
2121
seriesId?: string;
2222
tags: string[];
2323
isPrivate: boolean;
24+
sendToSubscribers: boolean;
2425
};
2526
}
2627

@@ -37,7 +38,8 @@ const PostMetadataForm = ({
3738
}: PostMetadataFormProps) => {
3839
const [tagInput, setTagInput] = useState<string>('');
3940

40-
const { title, subTitle, seriesId, tags, isPrivate } = formData;
41+
const { title, subTitle, seriesId, tags, isPrivate, sendToSubscribers } =
42+
formData;
4143
const selectOptions = series.map((s) => ({
4244
value: s._id,
4345
label: s.title,
@@ -67,7 +69,15 @@ const PostMetadataForm = ({
6769
};
6870

6971
const handlePublicChange = (e: ChangeEvent<HTMLInputElement>) => {
70-
onFieldChange('isPrivate', e.target.checked);
72+
const newIsPrivate = e.target.checked;
73+
onFieldChange('isPrivate', newIsPrivate);
74+
if (newIsPrivate) {
75+
onFieldChange('sendToSubscribers', false);
76+
}
77+
};
78+
79+
const handleSendToSubscribersChange = (e: ChangeEvent<HTMLInputElement>) => {
80+
onFieldChange('sendToSubscribers', e.target.checked);
7181
};
7282

7383
return (
@@ -161,6 +171,21 @@ const PostMetadataForm = ({
161171
/>
162172
</label>
163173
</div>
174+
{/* 구독자에게 발행 체크박스 */}
175+
<div className={'flex items-center gap-2'}>
176+
<label
177+
className={`inline-flex items-center text-nowrap gap-2 cursor-pointer ${isPrivate ? 'opacity-50' : ''}`}
178+
>
179+
<span className={'font-bold text-default'}>구독자에게 발행</span>
180+
<input
181+
type="checkbox"
182+
checked={sendToSubscribers}
183+
onChange={handleSendToSubscribersChange}
184+
disabled={isPrivate}
185+
className="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600 disabled:opacity-50"
186+
/>
187+
</label>
188+
</div>
164189
</div>
165190

166191
<button

app/hooks/post/usePost.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ interface FormData {
1616
seriesId: string;
1717
tags: string[];
1818
isPrivate: boolean;
19+
sendToSubscribers: boolean;
1920
}
2021

2122
interface UIState {
@@ -32,6 +33,7 @@ const usePost = (slug = '') => {
3233
seriesId: '',
3334
tags: [],
3435
isPrivate: false,
36+
sendToSubscribers: false,
3537
});
3638

3739
const [uiState, setUIState] = useState<UIState>({
@@ -60,6 +62,7 @@ const usePost = (slug = '') => {
6062
seriesId: formData.seriesId || '',
6163
tags: formData.tags,
6264
isPrivate: formData.isPrivate,
65+
sendToSubscribers: formData.sendToSubscribers,
6366
};
6467

6568
useEffect(() => {
@@ -132,6 +135,7 @@ const usePost = (slug = '') => {
132135
seriesId: seriesId || '',
133136
tags: tags || [],
134137
isPrivate: isPrivate || false,
138+
sendToSubscribers: false,
135139
});
136140
setUploadedImages(draftImages || []);
137141
}
@@ -180,6 +184,7 @@ const usePost = (slug = '') => {
180184
seriesId: data.post.seriesId || '',
181185
tags: data.post.tags || [],
182186
isPrivate: data.post.isPrivate || false,
187+
sendToSubscribers: false,
183188
});
184189
} catch (e) {
185190
console.error('글 조회 중 오류 발생', e);

app/types/Post.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ interface Post {
1616
seriesId?: string;
1717
tags?: string[];
1818
isPrivate?: boolean;
19+
sendToSubscribers?: boolean;
1920
}
2021
type PostBody = Omit<Post, '_id' | 'slug' | 'date' | 'timeToRead' | 'comment'>;
2122

0 commit comments

Comments
 (0)