1- import { useState } from 'react'
1+ import { useState , useEffect } from 'react'
22import {
33 X ,
44 ChevronLeft ,
@@ -16,7 +16,7 @@ import { StoryOptionsModal } from './StoryOptionsModal'
1616import ReportModal from '@/components/post/ReportModal'
1717import AccountInfoModal from '@/components/post/AccountInfoModal'
1818import { instance } from '@/shared/api/ky'
19-
19+ import { useCurrentUser } from '@/shared/auth/useCurrentUser'
2020import instagramLogo from '@/assets/instagram-black-logo.png'
2121
2222interface StoryViewerProps {
@@ -41,6 +41,8 @@ const formatRelativeTime = (createdAt: string) => {
4141export function StoryViewer ( { feed, userId } : StoryViewerProps ) {
4242 const navigate = useNavigate ( )
4343 const queryClient = useQueryClient ( )
44+ const { data : me } = useCurrentUser ( )
45+
4446 const [ imageError , setImageError ] = useState ( false )
4547 const [ isOptionsOpen , setIsOptionsOpen ] = useState ( false )
4648 const [ isReportOpen , setIsReportOpen ] = useState ( false )
@@ -59,15 +61,23 @@ export function StoryViewer({ feed, userId }: StoryViewerProps) {
5961 togglePause,
6062 } = useStoryViewer ( feed , userId )
6163
64+ const isMine =
65+ me ?. userId !== undefined &&
66+ String ( currentUser ?. userId ) === String ( me . userId )
67+
68+ useEffect ( ( ) => {
69+ if ( imageError && ! isPaused ) {
70+ togglePause ( )
71+ }
72+ } , [ imageError , isPaused , togglePause ] )
73+
6274 if ( ! currentUser || ! currentStory ) return null
6375
6476 const isFirstStoryOfFirstUser =
6577 currentUserIndex === 0 && currentStoryIndex === 0
6678 const isLastStoryOfLastUser =
6779 currentUserIndex === feed . length - 1 &&
68- currentStoryIndex === currentUser . stories . length - 1
69-
70- const isMine = String ( currentUser . userId ) === '1'
80+ currentStoryIndex === ( currentUser ?. stories ?. length ?? 0 ) - 1
7181
7282 const handleOpenOptions = ( e : React . MouseEvent ) => {
7383 e . stopPropagation ( )
@@ -77,7 +87,7 @@ export function StoryViewer({ feed, userId }: StoryViewerProps) {
7787
7888 const handleCloseOptions = ( ) => {
7989 setIsOptionsOpen ( false )
80- if ( isPaused ) togglePause ( )
90+ if ( isPaused && ! imageError ) togglePause ( )
8191 }
8292
8393 const handleOpenReport = ( ) => {
@@ -98,9 +108,7 @@ export function StoryViewer({ feed, userId }: StoryViewerProps) {
98108 const handleDeleteStory = async ( ) => {
99109 try {
100110 const response = await instance
101- . delete ( `api/v1/stories/${ currentStory . id } ` , {
102- searchParams : { loggedInUser : 1 } ,
103- } )
111+ . delete ( `api/v1/stories/${ currentStory . id } ` )
104112 . json < { isSuccess : boolean ; code : string ; message : string } > ( )
105113
106114 if ( response . isSuccess ) {
@@ -190,9 +198,10 @@ export function StoryViewer({ feed, userId }: StoryViewerProps) {
190198 < button
191199 onClick = { ( e ) => {
192200 e . stopPropagation ( )
193- togglePause ( )
201+ if ( ! imageError ) togglePause ( )
194202 } }
195- className = "p-1 text-white transition-opacity hover:opacity-70"
203+ className = "p-1 text-white transition-opacity hover:opacity-70 disabled:opacity-30"
204+ disabled = { imageError }
196205 >
197206 { isPaused ? (
198207 < Play className = "h-5 w-5 fill-current" />
@@ -236,7 +245,6 @@ export function StoryViewer({ feed, userId }: StoryViewerProps) {
236245 referrerPolicy = "no-referrer"
237246 />
238247
239- { /* 내 스토리일 때 좌측 하단에 조회수 표시 */ }
240248 { isMine && currentStory . viewCount !== undefined && (
241249 < div className = "absolute bottom-4 left-4 z-50 flex flex-col items-start gap-1" >
242250 < span className = "text-[13px] font-semibold text-white drop-shadow-md" >
@@ -275,7 +283,7 @@ export function StoryViewer({ feed, userId }: StoryViewerProps) {
275283 < ReportModal
276284 onClose = { ( ) => {
277285 setIsReportOpen ( false )
278- if ( isPaused ) togglePause ( )
286+ if ( isPaused && ! imageError ) togglePause ( )
279287 } }
280288 onHideComment = { ( ) => { } }
281289 nickname = { currentUser . nickname }
@@ -287,7 +295,7 @@ export function StoryViewer({ feed, userId }: StoryViewerProps) {
287295 < AccountInfoModal
288296 onClose = { ( ) => {
289297 setIsAccountInfoOpen ( false )
290- if ( isPaused ) togglePause ( )
298+ if ( isPaused && ! imageError ) togglePause ( )
291299 } }
292300 nickname = { currentUser . nickname }
293301 profileImageUrl = { currentUser . profileImageUrl }
@@ -299,7 +307,7 @@ export function StoryViewer({ feed, userId }: StoryViewerProps) {
299307 className = "fixed inset-0 z-[110] flex items-center justify-center bg-black/60 p-4"
300308 onClick = { ( ) => {
301309 setIsDeleteConfirmOpen ( false )
302- if ( isPaused ) togglePause ( )
310+ if ( isPaused && ! imageError ) togglePause ( )
303311 } }
304312 >
305313 < div
@@ -323,7 +331,7 @@ export function StoryViewer({ feed, userId }: StoryViewerProps) {
323331 < button
324332 onClick = { ( ) => {
325333 setIsDeleteConfirmOpen ( false )
326- if ( isPaused ) togglePause ( )
334+ if ( isPaused && ! imageError ) togglePause ( )
327335 } }
328336 className = "w-full border-t border-gray-200 py-3 text-[14px] active:bg-gray-50"
329337 >
0 commit comments