@funhub/platform 0.1.143 → 0.1.144

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/components/biz/basics/fullscreen-feed/runtime/client.mjs +1 -1
  2. package/dist/components/biz/business/comment/reply-detail.mjs +1 -1
  3. package/dist/components/biz/business/detail/shared/detail-introduction.mjs +1 -1
  4. package/dist/components/biz/business/detail/shared/detail-operate.mjs +1 -1
  5. package/dist/components/biz/business/detail/shared/registry.d.mts +12 -4
  6. package/dist/components/biz/business/detail/shared/registry.mjs +1 -1
  7. package/dist/components/biz/business/detail/shared/runtime-context-provider.mjs +1 -1
  8. package/dist/components/biz/business/detail/shared/use-video-detail-webview-bridge.mjs +1 -1
  9. package/dist/components/biz/business/detail/video-detail-actions/material.d.mts +1 -1
  10. package/dist/components/biz/business/detail/video-detail-info/client.mjs +1 -1
  11. package/dist/components/biz/business/detail/video-detail-info/material.d.mts +2 -2
  12. package/dist/components/biz/business/detail/video-detail-info/schema.mjs +1 -1
  13. package/dist/components/biz/business/detail/video-detail-info/server.mjs +1 -1
  14. package/dist/components/biz/business/detail/video-detail-info-title-tags-episodes/client.mjs +1 -1
  15. package/dist/components/biz/business/detail/video-detail-info-title-tags-episodes/material.d.mts +2 -2
  16. package/dist/components/biz/business/detail/video-detail-player/client.mjs +1 -1
  17. package/dist/components/biz/business/detail/video-detail-player-bridge-only/client.d.mts +12 -0
  18. package/dist/components/biz/business/detail/video-detail-player-bridge-only/client.mjs +2 -0
  19. package/dist/components/biz/business/detail/video-detail-player-bridge-only/index.d.mts +5 -0
  20. package/dist/components/biz/business/detail/video-detail-player-bridge-only/material.d.mts +17 -0
  21. package/dist/components/biz/business/detail/video-detail-player-bridge-only/material.mjs +2 -0
  22. package/dist/components/biz/business/detail/video-detail-player-bridge-only/schema.d.mts +23 -0
  23. package/dist/components/biz/business/detail/video-detail-player-bridge-only/schema.mjs +2 -0
  24. package/dist/components/biz/business/detail/video-detail-player-bridge-only/server.d.mts +11 -0
  25. package/dist/components/biz/business/detail/video-detail-player-bridge-only/server.mjs +2 -0
  26. package/dist/components/biz/business/detail/video-detail-recommend/material.d.mts +2 -2
  27. package/dist/components/biz/business/home-recommend/shared/home-recommend-base.mjs +1 -1
  28. package/dist/components/biz/business/marquee/client.mjs +1 -1
  29. package/dist/components/biz/business/profile/profile-header/client.mjs +1 -1
  30. package/dist/components/biz/business/search-bar/variants/detail-search-bar/runtime/client.mjs +1 -1
  31. package/dist/components/biz/business/search-history/client.mjs +1 -1
  32. package/dist/components/biz/business/search-input/client.mjs +1 -1
  33. package/dist/components/biz/business/tab-bar/client.mjs +1 -1
  34. package/dist/components/biz/business/text-recommend/client.mjs +1 -1
  35. package/dist/components/common/at-element/index.mjs +1 -1
  36. package/dist/components/common/blocked-dialog/blocked-dialog.mjs +1 -1
  37. package/dist/components/common/funhub-provider/funhub-provider.mjs +1 -1
  38. package/dist/components/common/header-nav/client.mjs +1 -1
  39. package/dist/components/common/info-card/card-header.mjs +1 -1
  40. package/dist/components/common/list/user-activity-list/user-activity-list-item.mjs +1 -1
  41. package/dist/components/common/tab-bar/index.mjs +1 -1
  42. package/dist/components/pages/(follow)/_components/interaction-tabs/index.mjs +1 -1
  43. package/dist/components/pages/(follow)/_components/user-list/index.mjs +1 -1
  44. package/dist/components/pages/collection-create/form.mjs +1 -1
  45. package/dist/components/pages/collection-detail/detail.mjs +1 -1
  46. package/dist/components/pages/feedback/_components/feedback-form.mjs +1 -1
  47. package/dist/components/pages/fullscreen-feed/page.mjs +1 -1
  48. package/dist/components/pages/home/client.mjs +1 -1
  49. package/dist/components/pages/login/auth-guard.mjs +1 -1
  50. package/dist/components/pages/post-detail/post-detail-client.mjs +1 -1
  51. package/dist/components/pages/publish/components/collection.mjs +1 -1
  52. package/dist/components/pages/publish/components/header.mjs +1 -1
  53. package/dist/components/pages/publish/page-client.mjs +1 -1
  54. package/dist/components/pages/search/page-client.mjs +1 -1
  55. package/dist/components/pages/search/search-result/search-video-info.mjs +1 -1
  56. package/dist/components/pages/search/top-header.mjs +1 -1
  57. package/dist/components/pages/search-result/page-client.mjs +1 -1
  58. package/dist/components/pages/settings/_components/settings.mjs +1 -1
  59. package/dist/components/pages/video-detail/video-detail-client.mjs +1 -1
  60. package/dist/components/pages/video-list/video-list-client.mjs +1 -1
  61. package/dist/components/ui/badge.d.mts +1 -1
  62. package/dist/components/ui/button.d.mts +2 -2
  63. package/dist/components/ui/image.d.mts +4 -4
  64. package/dist/components/ui/link.mjs +1 -1
  65. package/dist/hooks/use-card-decoration.mjs +1 -1
  66. package/dist/hooks/use-content-operate.mjs +1 -1
  67. package/dist/materials.d.mts +3 -1
  68. package/dist/materials.mjs +1 -1
  69. package/dist/utils/login-modal-bridge.mjs +1 -1
  70. package/dist/utils/use-compatible-router.d.mts +26 -0
  71. package/dist/utils/use-compatible-router.mjs +2 -0
  72. package/dist/utils.d.mts +6 -5
  73. package/dist/utils.mjs +1 -1
  74. package/package.json +28 -28
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{prefetchVideoPlayerSrc as e}from"../../../../common/video-player/process-m3u8-cache.mjs";import{useLoginModalStore as t}from"../../../../../store/modules/login-modal-store.mjs";import{BasicFullscreen as n}from"../basic-fullscreen.mjs";import{adaptFeedItemToSafeInformation as r,normalizeToFeedItem as i}from"./adapters.mjs";import a from"./styles.module.mjs";import{BottomInfo as o}from"./bottom-info.mjs";import{PostSlide as s}from"./post-slide.mjs";import{UserAction as c}from"./user-action.mjs";import{VideoSlide as ee}from"./video-slide.mjs";import{useCallback as l,useEffect as u,useMemo as d,useRef as f,useState as p}from"react";import{Fragment as m,jsx as h,jsxs as g}from"react/jsx-runtime";import _ from"next/dynamic";import{useParams as te,useRouter as ne}from"next/navigation";const re=_(()=>import(`./comment-modal.mjs`),{ssr:!1,loading:()=>null});function v(_){let v=ne(),y=te(),{items:b,activeIndex:x,top:ie,bottom:ae,videoConfig:oe,userInteracted:S,onUserInteracted:C,onActiveIndexChange:se,onDataUpdate:ce,onOpenComment:w,getNavigationInfo:T,onControlsVisibilityChange:E,onGestureStart:le,onGestureEnd:D,onSwipeCancel:O,onCustomActionRender:ue,onVideoProgressUpdate:de,currentUserId:fe,followIds:pe,onFollowIdsChange:me,commentContentId:he,onRequireLogin:k,style:ge,activeEpisodeId:_e}=_,A=oe;function j(){S||C()}function M(e){j();let t=typeof y?.locale==`string`?`/${y.locale}`:``;v.push(`${t}/profile/${e}`)}let N=l(e=>`${typeof y?.locale==`string`?`/${y.locale}`:``}/feed-series/${e}/episode/1`,[y?.locale]);function P(e){j();let t=N(e);window.isWebView?window.location.href=t:v.push(t)}function F(){if(k){k();return}t.getState().open()}let[I,ve]=p({});function ye(e,t){if(!t)return e;let n=t.static?{...e.static||{},...t.static}:e.static,r=t.author?{...e.author||{},...t.author}:e.author;return{...e,...t,static:n,author:r}}function L(e,t){ve(n=>{let r=n[e]||{},i=t.static?{...r.static||{},...t.static}:r.static,a=t.author?{...r.author||{},...t.author}:r.author;return{...n,[e]:{...r,...t,...i?{static:i}:{},...a?{author:a}:{}}}}),ce(e,t)}let[R,be]=p(null),[z,xe]=p(``),[Se,B]=p(1),[V,H]=p(!1);function Ce(e,t,n){if(j(),w){w(t);return}be(t),xe(e),B(n),H(!0)}function we(e){let t=e.static?.comment_cnt;t!=null&&z&&L(z,{static:{comment_cnt:t}})}let U=d(()=>{function e(e){return!!e&&typeof e==`object`&&typeof e.kind==`string`&&!!e.originalData}function t(e){return!!e&&typeof e==`object`&&typeof e.content_id==`string`}function n(e){return!!e&&typeof e==`object`&&typeof e.id==`string`&&typeof e.name==`string`}function a(e){let t=Array.isArray(e.medias)?e.medias:[],n=t.map(e=>e?.media_url?e.is_video&&e.cover_image||e.media_url:``).filter(e=>!!e),r=e.content||``,i=r.length>18?`${r.slice(0,18)}...`:r,a={id:e.content_id,mid:e.content_id,name:i,img_y:e.cover_image||``,preview_images:t,description:r,tags:(e.tags||[]).map(e=>({id:e,name:e})),links:[],static:{like_cnt:e.like_count??0,dislike_cnt:e.dislike_count??0,comment_cnt:e.comment_count??0,share_cnt:e.share_count??0,browse_cnt:e.view_count??0,collect_cnt:0},type:e.type,is_liked:!!e.is_liked,is_dislike:!!e.is_dislike,is_collected:!!e.is_collected,is_followed:!!e.is_followed,author:e.author,up_user:e.user_id};return{kind:`post`,id:e.content_id,title:i,content:r,images:n,originalData:a}}function o(e){let t=(Array.isArray(e.preview_images)?e.preview_images:[]).map(e=>e?typeof e==`string`?e:e.is_video?e.cover_image||e.media_url||``:e.media_url||``:``).filter(e=>!!e);return{kind:`post`,id:e.id,title:e.name,content:e.description??``,images:t,originalData:e}}return(b||[]).map(s=>{if(e(s))return s;if(t(s))return a(s);if(n(s)){let e=r(s);return e.type===1&&e.links.length===0?o(e):i(e)}return null}).filter(Boolean)},[b]),W=d(()=>{if(!U.length)return[];let e=Math.max(0,x-1),t=Math.min(U.length-1,x+2),n=[];for(let r=e;r<=t;r+=1){let e=U[r];if(!e||e.kind!==`video`)continue;let t=e.videoUrl||e.hlsList?.[0]?.url||``;t&&n.push(t)}return Array.from(new Set(n))},[x,U]);u(()=>{W.forEach(t=>e(t))},[W]);let G=f(new Set);u(()=>{let e=U[x];if(!e||e.kind!==`video`||Number(e.originalData?.episode_cnt||0)<=1||T(x).onSeriesClick)return;let t=e.originalData?.id||e.id;if(!t)return;let n=N(t);G.current.has(n)||(G.current.add(n),v.prefetch(n))},[x,N,T,U,v]);let K=ie??0,q=ae??0,Te={...ge,top:`${K}px`,bottom:`${q}px`,height:`calc(100dvh - ${K}px - ${q}px)`},J=f(x),[Ee,Y]=p(!1),[X,Z]=p(!1),[De,Q]=p(!1),$=Ee&&X&&De;return u(()=>{J.current=x,Y(!1),Z(!1),Q(!1)},[x,E]),u(()=>{E?.($)},[$,E]),g(m,{children:[h(n,{items:U,activeIndex:x,userInteracted:S,onUserInteracted:C,onActiveIndexChange:se,onViewportIndexChange:e=>{J.current=e,Y(!1),Z(!1),Q(!1)},onGestureStart:le,onGestureEnd:D,onSwipeCancel:O,style:Te,className:`w-full h-full fixed top-0 left-0 overflow-hidden z-[2] touch-none ${a.fullscreenFeed}`,trackClassName:a.feedTrack,itemWrapperClassName:a.feedItem,renderItem:({item:e,index:t,activeIndex:n,isActive:r,isSettledActive:i,shouldMount:l,swipeNext:u})=>{if(!e)return h(`div`,{className:a.emptySlide});let d=Math.abs(t-n)<=1,f=ye(e.originalData,I[e.id]);return g(m,{children:[e.kind===`post`?h(s,{item:e,isSettledActive:i,shouldMount:l}):e.kind===`video`?h(ee,{item:e,videoConfig:A,isActive:r,isSettledActive:i,shouldMount:l,shouldLoadCover:d,isPaused:V,userInteracted:S,onPlayerInteract:()=>{t===J.current&&X&&Q(!0)},onControlsVisibilityChange:e=>{t===J.current&&Y(e)},onVideoEnded:A?.autoNext?u:void 0,onProgressUpdate:(n,r)=>{t===J.current&&(!X&&n>=.05&&Z(!0),de?.({id:e.id,currentTime:n,duration:r}))}}):h(`div`,{className:a.emptySlide}),h(c,{information:f,onUpdate:t=>L(e.id,t),onOpenComment:()=>Ce(e.id,f,e.kind===`post`?2:1),onCustomActionRender:ue,onUserNavigate:M,currentUserId:fe,followIds:pe,onFollowChange:e=>{me?.(e)},onRequireLogin:F,activeEpisodeId:_e}),r&&h(o,{information:f,isPost:e.kind===`post`,navigation:(()=>{let e=T(t);return(f.episode_cnt??0)>1&&!e.onSeriesClick?{...e,onSeriesClick:()=>P(f.id)}:e})(),isControlsVisible:$,onUserNavigate:M,onNextClick:u})]})}}),!w&&V&&R&&h(re,{open:V,information:R,contentId:he||R.id,content_type:Se,onUpdate:we,onClose:()=>H(!1)})]})}export{v as default};
2
+ "use client";import{useRouter as e}from"../../../../../utils/use-compatible-router.mjs";import{prefetchVideoPlayerSrc as t}from"../../../../common/video-player/process-m3u8-cache.mjs";import{useLoginModalStore as n}from"../../../../../store/modules/login-modal-store.mjs";import{BasicFullscreen as r}from"../basic-fullscreen.mjs";import{adaptFeedItemToSafeInformation as i,normalizeToFeedItem as a}from"./adapters.mjs";import o from"./styles.module.mjs";import{BottomInfo as s}from"./bottom-info.mjs";import{PostSlide as ee}from"./post-slide.mjs";import{UserAction as te}from"./user-action.mjs";import{VideoSlide as ne}from"./video-slide.mjs";import{useCallback as c,useEffect as l,useMemo as u,useRef as d,useState as f}from"react";import{Fragment as p,jsx as m,jsxs as h}from"react/jsx-runtime";import{useParams as re}from"next/navigation";import g from"next/dynamic";const ie=g(()=>import(`./comment-modal.mjs`),{ssr:!1,loading:()=>null});function _(g){let _=e(),v=re(),{items:y,activeIndex:b,top:ae,bottom:oe,videoConfig:se,userInteracted:x,onUserInteracted:S,onActiveIndexChange:ce,onDataUpdate:le,onOpenComment:C,getNavigationInfo:w,onControlsVisibilityChange:T,onGestureStart:E,onGestureEnd:D,onSwipeCancel:O,onCustomActionRender:ue,onVideoProgressUpdate:de,currentUserId:fe,followIds:pe,onFollowIdsChange:me,commentContentId:he,onRequireLogin:k,style:ge,activeEpisodeId:_e}=g,A=se;function j(){x||S()}function M(e){j();let t=typeof v?.locale==`string`?`/${v.locale}`:``;_.push(`${t}/profile/${e}`)}let N=c(e=>`${typeof v?.locale==`string`?`/${v.locale}`:``}/feed-series/${e}/episode/1`,[v?.locale]);function P(e){j();let t=N(e);_.push(t)}function F(){if(k){k();return}n.getState().open()}let[I,ve]=f({});function L(e,t){if(!t)return e;let n=t.static?{...e.static||{},...t.static}:e.static,r=t.author?{...e.author||{},...t.author}:e.author;return{...e,...t,static:n,author:r}}function R(e,t){ve(n=>{let r=n[e]||{},i=t.static?{...r.static||{},...t.static}:r.static,a=t.author?{...r.author||{},...t.author}:r.author;return{...n,[e]:{...r,...t,...i?{static:i}:{},...a?{author:a}:{}}}}),le(e,t)}let[z,ye]=f(null),[B,be]=f(``),[xe,Se]=f(1),[V,H]=f(!1);function Ce(e,t,n){if(j(),C){C(t);return}ye(t),be(e),Se(n),H(!0)}function we(e){let t=e.static?.comment_cnt;t!=null&&B&&R(B,{static:{comment_cnt:t}})}let U=u(()=>{function e(e){return!!e&&typeof e==`object`&&typeof e.kind==`string`&&!!e.originalData}function t(e){return!!e&&typeof e==`object`&&typeof e.content_id==`string`}function n(e){return!!e&&typeof e==`object`&&typeof e.id==`string`&&typeof e.name==`string`}function r(e){let t=Array.isArray(e.medias)?e.medias:[],n=t.map(e=>e?.media_url?e.is_video&&e.cover_image||e.media_url:``).filter(e=>!!e),r=e.content||``,i=r.length>18?`${r.slice(0,18)}...`:r,a={id:e.content_id,mid:e.content_id,name:i,img_y:e.cover_image||``,preview_images:t,description:r,tags:(e.tags||[]).map(e=>({id:e,name:e})),links:[],static:{like_cnt:e.like_count??0,dislike_cnt:e.dislike_count??0,comment_cnt:e.comment_count??0,share_cnt:e.share_count??0,browse_cnt:e.view_count??0,collect_cnt:0},type:e.type,is_liked:!!e.is_liked,is_dislike:!!e.is_dislike,is_collected:!!e.is_collected,is_followed:!!e.is_followed,author:e.author,up_user:e.user_id};return{kind:`post`,id:e.content_id,title:i,content:r,images:n,originalData:a}}function o(e){let t=(Array.isArray(e.preview_images)?e.preview_images:[]).map(e=>e?typeof e==`string`?e:e.is_video?e.cover_image||e.media_url||``:e.media_url||``:``).filter(e=>!!e);return{kind:`post`,id:e.id,title:e.name,content:e.description??``,images:t,originalData:e}}return(y||[]).map(s=>{if(e(s))return s;if(t(s))return r(s);if(n(s)){let e=i(s);return e.type===1&&e.links.length===0?o(e):a(e)}return null}).filter(Boolean)},[y]),W=u(()=>{if(!U.length)return[];let e=Math.max(0,b-1),t=Math.min(U.length-1,b+2),n=[];for(let r=e;r<=t;r+=1){let e=U[r];if(!e||e.kind!==`video`)continue;let t=e.videoUrl||e.hlsList?.[0]?.url||``;t&&n.push(t)}return Array.from(new Set(n))},[b,U]);l(()=>{W.forEach(e=>t(e))},[W]);let G=d(new Set);l(()=>{let e=U[b];if(!e||e.kind!==`video`||Number(e.originalData?.episode_cnt||0)<=1||w(b).onSeriesClick)return;let t=e.originalData?.id||e.id;if(!t)return;let n=N(t);G.current.has(n)||(G.current.add(n),_.prefetch(n))},[b,N,w,U,_]);let K=ae??0,q=oe??0,Te={...ge,top:`${K}px`,bottom:`${q}px`,height:`calc(100dvh - ${K}px - ${q}px)`},J=d(b),[Ee,Y]=f(!1),[X,Z]=f(!1),[De,Q]=f(!1),$=Ee&&X&&De;return l(()=>{J.current=b,Y(!1),Z(!1),Q(!1)},[b,T]),l(()=>{T?.($)},[$,T]),h(p,{children:[m(r,{items:U,activeIndex:b,userInteracted:x,onUserInteracted:S,onActiveIndexChange:ce,onViewportIndexChange:e=>{J.current=e,Y(!1),Z(!1),Q(!1)},onGestureStart:E,onGestureEnd:D,onSwipeCancel:O,style:Te,className:`w-full h-full fixed top-0 left-0 overflow-hidden z-[2] touch-none ${o.fullscreenFeed}`,trackClassName:o.feedTrack,itemWrapperClassName:o.feedItem,renderItem:({item:e,index:t,activeIndex:n,isActive:r,isSettledActive:i,shouldMount:a,swipeNext:c})=>{if(!e)return m(`div`,{className:o.emptySlide});let l=Math.abs(t-n)<=1,u=L(e.originalData,I[e.id]);return h(p,{children:[e.kind===`post`?m(ee,{item:e,isSettledActive:i,shouldMount:a}):e.kind===`video`?m(ne,{item:e,videoConfig:A,isActive:r,isSettledActive:i,shouldMount:a,shouldLoadCover:l,isPaused:V,userInteracted:x,onPlayerInteract:()=>{t===J.current&&X&&Q(!0)},onControlsVisibilityChange:e=>{t===J.current&&Y(e)},onVideoEnded:A?.autoNext?c:void 0,onProgressUpdate:(n,r)=>{t===J.current&&(!X&&n>=.05&&Z(!0),de?.({id:e.id,currentTime:n,duration:r}))}}):m(`div`,{className:o.emptySlide}),m(te,{information:u,onUpdate:t=>R(e.id,t),onOpenComment:()=>Ce(e.id,u,e.kind===`post`?2:1),onCustomActionRender:ue,onUserNavigate:M,currentUserId:fe,followIds:pe,onFollowChange:e=>{me?.(e)},onRequireLogin:F,activeEpisodeId:_e}),r&&m(s,{information:u,isPost:e.kind===`post`,navigation:(()=>{let e=w(t);return(u.episode_cnt??0)>1&&!e.onSeriesClick?{...e,onSeriesClick:()=>P(u.id)}:e})(),isControlsVisible:$,onUserNavigate:M,onNextClick:c})]})}}),!C&&V&&z&&m(ie,{open:V,information:z,contentId:he||z.id,content_type:xe,onUpdate:we,onClose:()=>H(!1)})]})}export{_ as default};
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{cn as e}from"../../../../utils/cn.mjs";import{debounceFun as t,getCurrentSecondTime as n,parseTextAtUserIds as r,replaceAtUserElement as i}from"../../../../utils/common.mjs";import{useFollowIdsState as a}from"../../../../store/modules/follow-ids-store.mjs";import{useUserStore as o}from"../../../../store/modules/user-store.mjs";import{gCommunityGetComments as s,pCommunityCreateComment as c,pCommunityDislikeComment as l,pCommunityLikeComment as u,pInteractionFollow as d,pInteractionUnfollow as f}from"../../../../service/generated/client.mjs";import{checkFollowStatus as p}from"../../../../utils/follow-service.mjs";import{Image as m}from"../../../ui/image.mjs";import{Dialog as h,DialogContent as g}from"../../../ui/dialog.mjs";import{InfiniteScroll as _}from"../../../ui/infinite-scroll.mjs";import{useLikeDislike as v}from"../../../../hooks/use-like-dislike.mjs";import{useKeepAliveState as y}from"../../../common/keep-scroll-position/index.mjs";import b from"../../../../assets/icons/close.mjs";import x from"../../../../assets/icons/common/follow_sel.mjs";import S from"../../../../assets/icons/common/follow_user.mjs";import{UnfollowConfirmDialog as C}from"../../../common/follow-button/unfollow-confirm-dialog.mjs";import w from"../../../../assets/icons/detail/give_like.mjs";import T from"../../../../assets/icons/detail/give_like_sel.mjs";import E from"./comment-input.mjs";import D from"../../../../assets/icons/detail/un_like.mjs";import O from"../../../../assets/icons/detail/un_like_sel.mjs";import{CommentMedia as k}from"./comment-media.mjs";import{CommentRichText as A}from"./comment-rich-text.mjs";import{TimeDisplay as j}from"./time-display.mjs";import{CommentItem as M}from"./comment-item.mjs";import{mapApiReplayToReplay as N}from"../../../../types/safe-replay.mjs";import{memo as P,useCallback as F,useEffect as I,useMemo as L,useRef as R,useState as z}from"react";import{Fragment as B,jsx as V,jsxs as H}from"react/jsx-runtime";import{toast as U}from"sonner";import{useTranslations as W}from"next-intl";import{useRouter as G}from"next/navigation";function K(e){if(e==null)return 0;let t=typeof e==`number`?e:Number(e);if(!Number.isNaN(t)&&t>0)return t>0xe8d4a51000?Math.floor(t/1e3):Math.floor(t);let n=Date.parse(String(e));return Number.isNaN(n)?0:Math.floor(n/1e3)}function q(e,t,n){let r=[];return Array.isArray(n)&&n.length>0?(n.forEach(e=>{let t=!!e?.is_video,n=String(e?.media_url||``),i=String(e?.cover_image||``);!n&&!i||r.push({cover_image:i,cover_image_thumbnail:i,cover_image_radio:1,cover_image_resolution:String(e?.cover_image_resolution||``),image_url:t?``:n,image_thumbnail:t?``:n,image_radio:1,image_resolution:String(e?.image_resolution||``),is_video:t,resolution:String(e?.video_resolution||``),video_duration:Number(e?.video_duration||0),video_url:t?n:``,video_size:Number(e?.video_size||0),video_codec_info:{hls_info:[],video_codec_deal:!1}})}),r):(e?.length&&e.forEach(e=>{r.push({cover_image:``,cover_image_thumbnail:``,cover_image_radio:1,cover_image_resolution:``,image_url:e,image_thumbnail:e,image_radio:1,image_resolution:``,is_video:!1,resolution:``,video_duration:0,video_url:``,video_size:0,video_codec_info:{hls_info:[],video_codec_deal:!1}})}),t?.length&&t.forEach(e=>{r.push({cover_image:``,cover_image_thumbnail:``,cover_image_radio:1,cover_image_resolution:``,image_url:``,image_thumbnail:``,image_radio:1,image_resolution:``,is_video:!0,resolution:``,video_duration:0,video_url:e,video_size:0,video_codec_info:{hls_info:[],video_codec_deal:!1}})}),r)}function J(e){let t=X(e.mentioned_users),n=t.length>0?t:Z(e.content||``);return{id:String(e.comment_id??e.id??``),user_name:e.user?.nickname||e.user?.username||``,text:e.content||``,type:`4`,files:[],at_users:n,cover_image:``,nine_grid_content_info:q(e?.images,e?.videos,e?.medias)}}function Y(e,t){let n=e.is_liked?`1`:e.is_dislike?`2`:`0`,r=X(e.mentioned_users),i=r.length>0?r:Z(e.content||``),a=String(e.comment_id??e.id??``),o=typeof e.like_count==`number`?e.like_count:0,s=N({id:a,like_cnt:(e.is_liked&&o===0?1:o).toString(),dislike_cnt:(e.dislike_count||0).toString(),created_at:K(e.create_time),text:e.content||``,type:`4`,like_flag:n,user_id:e.user_id||``,user_name:e.user?.nickname||e.user?.username||``,avatar:e.user?.avatar_url||``,reply_cnt:(e.reply_count||0).toString(),nine_grid_content_info:q(e?.images,e?.videos,e?.medias),at_users:i,parent_reply:void 0});return t&&(s.parent_reply=J(t)),s}function X(e){return Array.isArray(e)?e.map(e=>({user_id:e.user_id||``,name:e.nickname||e.username||``,avatar:e.avatar_url||``,birthday:``,signature:e.signature||``})):[]}function Z(e){if(!e)return[];let t=new Map,n=/<span[^>]*class=['"]mention['"][^>]*data-id=['"]([^'"]+)['"][^>]*>@([^<]*)<\/span>/g,r;for(;(r=n.exec(e))!==null;){let e=r[1]?String(r[1]):``,n=(r[2]?String(r[2]):``).replace(/^@/,``)||e;!e||t.has(e)||t.set(e,{user_id:e,name:n,avatar:``,birthday:``,signature:``})}if(t.size>0)return Array.from(t.values());let i=/<@_user>(\w+)<\/@_user>/g;for(;(r=i.exec(e))!==null;){let e=r[1]?String(r[1]):``;!e||t.has(e)||t.set(e,{user_id:e,name:e,avatar:``,birthday:``,signature:``})}return Array.from(t.values())}function ee(e){return!Array.isArray(e)||e.length===0?[]:e.map(e=>{let t=!!e.is_video,n=t?String(e.video_url||``):String(e.image_url||e.cover_image||``),r=String(e.cover_image||e.image_url||``);return{media_url:n,is_video:t,image_resolution:String(e.image_resolution||``),cover_image:r,cover_image_resolution:String(e.cover_image_resolution||``),video_resolution:String(e.resolution||``),video_duration:Number(e.video_duration||0),video_size:Number(e.video_size||0)}}).filter(e=>!!e.media_url)}function Q(e,t){let n=[];return e.forEach(e=>{n.push(Y(e,t)),e.sub_comments?.length&&n.push(...Q(e.sub_comments,e))}),n}function $(e){let t=Number(e)||0;return t>=1e4?`${(t/1e4).toFixed(1)}w`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}const te=t((e,t,n)=>{try{if(!e?.id)return;u({comment_id:e.id,is_like:e.like_flag!==`1`},{revalidate:!1})}catch(e){console.error(`点赞回复失败:`,e)}},200),ne=t((e,t,n)=>{try{if(!e?.id)return;l({comment_id:e.id,is_dislike:e.like_flag!==`2`},{revalidate:!1})}catch(e){console.error(`点踩回复失败:`,e)}},200),re=P(({comment:e,updateFollow:t,onRequireLogin:n})=>{let{userInfo:r,userId:i,isLogin:a}=o(),s=r?.userId||r?.user_id||i||``;return V(`div`,{className:`w-full bg-bg1`,children:V(M,{comment:e,variant:`light`,isLogin:a,onRequireLogin:n,rightSlot:L(()=>!!s&&String(s)===String(e.user_id||``),[e.user_id,s])?V(B,{}):V(ie,{userId:e.user_id,hasFollow:e.is_follow,onChange:t,onRequireLogin:n}),showReplyButton:!1})})});function ie({userId:t,hasFollow:n=!1,onChange:r,onRequireLogin:i}){let s=W(`components.biz.business.comment`),{isLogin:c,userInfo:l,userId:u}=o(),{followIds:p}=a(),[m,h]=z(n),[g,_]=z(!1),v=l?.userId||l?.user_id||u||``,y=L(()=>!!v&&String(v)===String(t||``),[t,v]),b=L(()=>n||p.includes(t),[p,n,t]);I(()=>{h(b)},[b]);let w=F(async()=>{try{if(!v||!t||t===`0`){U.error(s(`replyDetail.loginRequired`));return}if(m){let e=await f({follower_id:String(v),followee_id:t});if(e.code!==0){U.error(e.message||s(`replyDetail.unfollowFailed`));return}}else{let e=await d({follower_id:String(v),followee_id:t});if(e.code!==0){U.error(e.message||s(`replyDetail.followFailed`));return}}window.sensors?.track(`detail_follow_click`,{object_id:``,action:m?`取消关注`:`关注`,author_id:t}),sessionStorage.setItem(`user_page_refresh`,`1`)}catch(e){console.error(`关注或取消关注失败:`,e),U.error(s(m?`replyDetail.unfollowFailed`:`replyDetail.followFailed`));return}let e=!m;r?.(e),h(e);let{followIds:n,setFollowIds:i}=a.getState(),o=new Set(n);e?o.add(t):o.delete(t),i(Array.from(o))},[t,m,r,v,s]),T=F(()=>{if(!c){i?.();return}if(m){_(!0);return}w()},[w,m,c,i]);function E(){_(!1),w()}function D(){_(!1)}return y||!t||t===`0`?null:H(B,{children:[V(`div`,{className:e(`h-[28px] rounded-[14px] px-[8px] border border-solid cursor-pointer flex items-center justify-center`,m?`border-text3`:`border-theme5`),onClick:T,children:m?H(B,{children:[V(x,{className:`w-[12px] h-[12px] text-text3 shrink-0`}),V(`span`,{className:`text-text3 text-[12px] leading-[18px] ml-[4px] shrink-0`,children:s(`replyDetail.followed`)})]}):H(B,{children:[V(S,{className:`block w-[12px] h-[12px] text-theme5 shrink-0`}),V(`span`,{className:`block text-theme5 text-[12px] leading-[18px] ml-[4px] shrink-0`,children:s(`replyDetail.follow`)})]})}),V(C,{open:g,onOpenChange:_,onCancel:D,onConfirm:E})]})}const ae=t(e=>{e()},0);function oe(e,t,n,r){let i=R(!1);I(()=>{i.current=!1},[r]),I(()=>{let r=e.current;if(!r)return;!i.current&&t>0&&(r.scrollTop=t,i.current=!0);let a=()=>{i.current=!0,n(r.scrollTop)};return r.addEventListener(`scroll`,a,{passive:!0}),()=>r.removeEventListener(`scroll`,a)},[e,n,t,r])}const se=P(({commentId:e,informationId:t,handleReplyComment:n,onReplyListUpdate:r})=>{let i=W(`components.biz.business.comment`),[a,o]=y(`replay-detail-list-${e}`,[]),[c,l]=y(`replay-detail-has-more-${e}`,!0),[u,d]=y(`replay-detail-page-${e}`,1),{getLikedListData:f,getDislikedListData:p}=v(),m=R(!1),h=F(async()=>{if(!(!e||!t)&&!m.current){m.current=!0;try{let n=await s({content_id:t,parent_id:e,page:u,page_size:20,sort_by:`latest`});if(n.code!==0)throw Error(n.message||i(`replyDetail.fetchRepliesFailed`));let r=n.data?.data?.comments??[],a=Q(r);((n.data?.data?.has_more??!1)===!1||r.length<20)&&l(!1),o(e=>{let t=new Set(e.map(e=>e.id)),n=a.filter(e=>!t.has(e.id));return[...e,...n]}),a.length>0&&d(u+1)}catch(e){console.error(`获取回复列表失败:`,e),l(!1)}finally{m.current=!1}}},[e,t,u,o,l,d,i]),g=F(e=>{o(t=>[e,...t])},[o]);I(()=>{r(g)},[r,g]),I(()=>{e&&t&&(o(e=>e.length===0?e:[]),l(e=>e===!0?e:!0),d(e=>e===1?e:1))},[e,t,o,l,d]);let b=F(n=>{o(e=>f(e,n.id)),te(n,t,e)},[e,f,t,o]),x=F(n=>{n.like_flag!==`2`&&U.message(i(`replyDetail.dislikeHint`)),o(e=>p(e,n.id)),ne(n,t,e)},[e,p,t,o,i]),[S,C]=y(`replay-detail-scroll-top-${e}`,0),w=R(null);oe(w,S,C,e),I(()=>{!e||!t||a.length===0&&c&&h()},[e,t,h,a.length,c]);let T=F(async()=>{await h()},[h]);return H(`div`,{ref:w,className:`w-full pb-[66px]`,children:[a.map((e,t)=>V(ce,{replyItem:e,replyComment:n,onLikeReply:b,onDislikeReply:x},`${e.id}-${t}`)),V(_,{loadMore:T,hasMore:c})]})});function ce({replyItem:e,replyComment:t,onLikeReply:n,onDislikeReply:r}){let i=W(`components.biz.business.comment`),a=G(),o=e.status===`0`;function s(){n?.(e)}function c(){r?.(e)}function l(){t(e)}return H(`div`,{className:`p-[16px] flex flex-col`,children:[H(`div`,{className:`flex flex-row justify-between`,children:[H(`button`,{type:`button`,className:`flex flex-row items-center text-left`,onClick:()=>{a.push(`/profile/${e.user_id}`)},children:[V(`div`,{className:`w-[38px] h-[38px] rounded-full overflow-hidden relative bg-bg2`,children:e.avatar&&V(m,{src:e.avatar,fill:!0,objectFit:`cover`,alt:`avatar`})}),H(`div`,{className:`ml-[12px] flex flex-col`,children:[V(`span`,{className:`text-text2 text-[14px] leading-[14px] max-w-[180px] text-ellipsis overflow-hidden whitespace-nowrap`,children:e.user_name}),V(`span`,{className:`mt-[8px] text-text3 text-[12px] leading-[12px]`,children:V(j,{timestamp:e.created_at})})]})]}),o?V(`div`,{className:`px-[8px] py-[4px] bg-text3/10 rounded-[12px]`,children:V(`span`,{className:`text-text3 text-[12px] leading-[12px]`,children:i(`replyDetail.underReview`)})}):H(`div`,{className:`flex flex-row items-center`,children:[H(`div`,{className:`px-[4px] flex flex-col items-center`,onClick:s,children:[e.like_flag===`1`?V(T,{className:`w-[14px] h-[14px]`}):V(w,{className:`w-[14px] h-[14px] text-text3`}),V(`span`,{className:`mt-[4px] text-text3 text-[12px] leading-[12px]`,children:e.like_cnt===`0`?i(`replyDetail.like`):$(e.like_cnt)})]}),H(`div`,{className:`ml-[12px] px-[4px] flex flex-col items-center`,onClick:c,children:[e.like_flag===`2`?V(O,{className:`w-[14px] h-[14px]`}):V(D,{className:`w-[14px] h-[14px] text-text3`}),V(`span`,{className:`mt-[4px] text-text3 text-[12px] leading-[12px]`,children:e.dislike_cnt===`0`?i(`replyDetail.dislike`):$(e.dislike_cnt)})]})]})]}),H(`div`,{className:`mt-[4px] pl-[50px] flex flex-col`,children:[e.text&&V(A,{className:`text-text1 text-[14px] leading-[22px] break-all`,text:e.text,atUsers:e.at_users}),V(k,{list:e.nine_grid_content_info,disabled:o,hasText:!!e.text,playerId:e.id}),e.parent_reply&&e.parent_reply.text&&H(B,{children:[H(`div`,{className:`mt-[4px] flex flex-row items-center text-[14px] leading-[22px] relative pl-[8px]`,children:[V(`div`,{className:`w-[2px] h-full bg-line1 mr-[8px] absolute left-0 top-0 bottom-0 m-auto`}),H(`span`,{className:`text-theme1`,children:[e.parent_reply.user_name,`:`,e.parent_reply.text&&V(`span`,{className:`text-text1`,children:V(A,{text:e.parent_reply.text,atUsers:e.parent_reply.at_users})})]})]}),V(`div`,{className:`mt-1`,children:V(k,{list:e.parent_reply.nine_grid_content_info,disabled:o,hasText:!!e.parent_reply.text,playerId:e.parent_reply.id})})]}),V(`div`,{className:`mt-[4px] w-[fit-content] h-[30px] px-[12px] text-text1 text-[14px] leading-[22px] flex flex-row items-center bg-bg1 rounded-[15px]`,onClick:l,children:V(`span`,{children:i(`replyDetail.reply`)})})]})]})}function le({comment:e,information:t,contentType:s,visible:l,onClose:u,onReplyComment:d,onReplyAdded:f,onRequireLogin:m}){let _=W(`components.biz.business.comment`),v=R(null),[y,x]=z(()=>N({})),[S,C]=z(!1),{userInfo:w,userId:T}=o(),{followIds:D,setFollowIds:O}=a(),k=w?.userId||w?.user_id||T||``,A=w?.name||w?.nick_name||w?.nickname||w?.user_name||``,j=w?.avatar||w?.avatar_url||``,M=R({commentId:``,userId:``});function P(e){if(!e)return``;if(Array.isArray(e))return String(e[0]||``);if(typeof e==`object`){if(Object.prototype.hasOwnProperty.call(e,`comment_id`))return String(e.comment_id??``);if(Array.isArray(e.data))return String(e.data[0]||``)}return``}I(()=>{l&&(!k||!e.user_id||e.user_id!==`0`&&String(k)!==String(e.user_id)&&(M.current.commentId===e.id&&M.current.userId===k||(M.current={commentId:e.id,userId:k},(async()=>{let t=await p({app_id:0,follower_id:k,followee_ids:[e.user_id]});if(!t.success||!t.data?.is_following_map)return;let n=!!t.data.is_following_map[e.user_id];e.is_follow=n;let r=new Set(D);n?r.add(e.user_id):r.delete(e.user_id),O(Array.from(r))})())))},[e,D,k,O,l]);let L=F(e=>{x(e),setTimeout(()=>{C(!0),v.current?.focus()},10)},[]);function B(){ae(()=>{C(!1)})}async function G({text:e,imageVideoInfoList:t}){let n=e=>e.success?e:(U.error(e.message||_(`replyDetail.publishReplyFailed`)),{...e,toastHandled:!0});if(S){let r=await q({text:e,imageVideoInfoList:t});return C(!1),n(r)}else{let r=await K({text:e,imageVideoInfoList:t});return C(!1),n(r)}}async function K({text:e,imageVideoInfoList:t}){return await d?.({text:e,imageVideoInfoList:t,callback:r=>{let i=Z(e);if(!r||r===`0`)return;let a=N({id:r,user_id:k,user_name:A,avatar:j,text:e,created_at:n(),type:`4`,nine_grid_content_info:t,at_users:i});J?.(a)}})??{success:!0}}async function q({text:e,imageVideoInfoList:a}){if(!y?.id||y.id===`0`)return{success:!1,message:_(`replyDetail.invalidReplyTarget`)};let o=ee(a),l=r(e),u=s===`video`?1:2;try{let r=await c({content_id:t.id,content:i(e),medias:o,mentioned_users:l,parent_id:y.id,source_type:u},{revalidate:!1});if(r.code!==0)return{success:!1,message:r.message||_(`replyDetail.publishReplyFailed`)};let s=P(r.data);if(!s||s===`0`)return{success:!1,message:_(`replyDetail.publishReplyFailed`)};let d=N({id:s,user_id:k,user_name:A,avatar:j,text:e,created_at:n(),type:`4`,nine_grid_content_info:a,at_users:Z(e)});return d.parent_reply=y,J?.(d),f?.(),{success:!0}}catch(e){return console.error(`发布回复回复失败:`,e),{success:!1,message:_(`replyDetail.publishReplyFailed`)}}}let[J,Y]=z(null),X=F(e=>{Y(()=>e)},[]),Q=S?`回复@${y.user_name}`:``;function $(e){e||u()}return V(h,{open:l,onOpenChange:$,children:H(g,{showCloseButton:!1,className:`fixed left-0 right-0 bottom-0 top-[84px] z-[1000] h-auto w-full max-w-none translate-x-0 translate-y-0 rounded-none bg-bg2 p-0 text-text1 !flex !flex-col !gap-0`,children:[H(`div`,{className:`w-full h-[60px] bg-bg1 flex items-center justify-center relative`,children:[V(`button`,{type:`button`,className:`w-[48px] focus-within:outline-none focus-within:border-none focus-within:ring-0 h-full flex items-center justify-center absolute left-0 top-0`,onClick:u,children:V(b,{className:`w-[16px] h-[16px] text-text1`})}),V(`span`,{className:`text-[18px] font-bold`,children:_(`replyDetail.commentDetail`)})]}),H(`div`,{className:`flex-1 min-h-0 w-full overflow-y-auto bg-bg2`,children:[V(re,{comment:e,updateFollow:t=>{e.is_follow=t},onRequireLogin:m}),V(se,{commentId:e.id,informationId:t.id,handleReplyComment:L,onReplyListUpdate:X}),V(E,{placeholder:Q,onInputBlur:B,onPublish:G,onRequireLogin:m,ref:v})]})]})})}export{le as default};
2
+ "use client";import{cn as e}from"../../../../utils/cn.mjs";import{debounceFun as t,getCurrentSecondTime as n,parseTextAtUserIds as r,replaceAtUserElement as i}from"../../../../utils/common.mjs";import{useFollowIdsState as a}from"../../../../store/modules/follow-ids-store.mjs";import{useUserStore as o}from"../../../../store/modules/user-store.mjs";import{gCommunityGetComments as s,pCommunityCreateComment as c,pCommunityDislikeComment as l,pCommunityLikeComment as u,pInteractionFollow as d,pInteractionUnfollow as f}from"../../../../service/generated/client.mjs";import{checkFollowStatus as p}from"../../../../utils/follow-service.mjs";import{useRouter as m}from"../../../../utils/use-compatible-router.mjs";import{Image as h}from"../../../ui/image.mjs";import{Dialog as g,DialogContent as _}from"../../../ui/dialog.mjs";import{InfiniteScroll as v}from"../../../ui/infinite-scroll.mjs";import{useLikeDislike as y}from"../../../../hooks/use-like-dislike.mjs";import{useKeepAliveState as b}from"../../../common/keep-scroll-position/index.mjs";import x from"../../../../assets/icons/close.mjs";import S from"../../../../assets/icons/common/follow_sel.mjs";import C from"../../../../assets/icons/common/follow_user.mjs";import{UnfollowConfirmDialog as w}from"../../../common/follow-button/unfollow-confirm-dialog.mjs";import T from"../../../../assets/icons/detail/give_like.mjs";import E from"../../../../assets/icons/detail/give_like_sel.mjs";import D from"./comment-input.mjs";import O from"../../../../assets/icons/detail/un_like.mjs";import k from"../../../../assets/icons/detail/un_like_sel.mjs";import{CommentMedia as A}from"./comment-media.mjs";import{CommentRichText as j}from"./comment-rich-text.mjs";import{TimeDisplay as M}from"./time-display.mjs";import{CommentItem as N}from"./comment-item.mjs";import{mapApiReplayToReplay as P}from"../../../../types/safe-replay.mjs";import{memo as F,useCallback as I,useEffect as L,useMemo as R,useRef as z,useState as B}from"react";import{Fragment as V,jsx as H,jsxs as U}from"react/jsx-runtime";import{toast as W}from"sonner";import{useTranslations as G}from"next-intl";function K(e){if(e==null)return 0;let t=typeof e==`number`?e:Number(e);if(!Number.isNaN(t)&&t>0)return t>0xe8d4a51000?Math.floor(t/1e3):Math.floor(t);let n=Date.parse(String(e));return Number.isNaN(n)?0:Math.floor(n/1e3)}function q(e,t,n){let r=[];return Array.isArray(n)&&n.length>0?(n.forEach(e=>{let t=!!e?.is_video,n=String(e?.media_url||``),i=String(e?.cover_image||``);!n&&!i||r.push({cover_image:i,cover_image_thumbnail:i,cover_image_radio:1,cover_image_resolution:String(e?.cover_image_resolution||``),image_url:t?``:n,image_thumbnail:t?``:n,image_radio:1,image_resolution:String(e?.image_resolution||``),is_video:t,resolution:String(e?.video_resolution||``),video_duration:Number(e?.video_duration||0),video_url:t?n:``,video_size:Number(e?.video_size||0),video_codec_info:{hls_info:[],video_codec_deal:!1}})}),r):(e?.length&&e.forEach(e=>{r.push({cover_image:``,cover_image_thumbnail:``,cover_image_radio:1,cover_image_resolution:``,image_url:e,image_thumbnail:e,image_radio:1,image_resolution:``,is_video:!1,resolution:``,video_duration:0,video_url:``,video_size:0,video_codec_info:{hls_info:[],video_codec_deal:!1}})}),t?.length&&t.forEach(e=>{r.push({cover_image:``,cover_image_thumbnail:``,cover_image_radio:1,cover_image_resolution:``,image_url:``,image_thumbnail:``,image_radio:1,image_resolution:``,is_video:!0,resolution:``,video_duration:0,video_url:e,video_size:0,video_codec_info:{hls_info:[],video_codec_deal:!1}})}),r)}function J(e){let t=X(e.mentioned_users),n=t.length>0?t:Z(e.content||``);return{id:String(e.comment_id??e.id??``),user_name:e.user?.nickname||e.user?.username||``,text:e.content||``,type:`4`,files:[],at_users:n,cover_image:``,nine_grid_content_info:q(e?.images,e?.videos,e?.medias)}}function Y(e,t){let n=e.is_liked?`1`:e.is_dislike?`2`:`0`,r=X(e.mentioned_users),i=r.length>0?r:Z(e.content||``),a=String(e.comment_id??e.id??``),o=typeof e.like_count==`number`?e.like_count:0,s=P({id:a,like_cnt:(e.is_liked&&o===0?1:o).toString(),dislike_cnt:(e.dislike_count||0).toString(),created_at:K(e.create_time),text:e.content||``,type:`4`,like_flag:n,user_id:e.user_id||``,user_name:e.user?.nickname||e.user?.username||``,avatar:e.user?.avatar_url||``,reply_cnt:(e.reply_count||0).toString(),nine_grid_content_info:q(e?.images,e?.videos,e?.medias),at_users:i,parent_reply:void 0});return t&&(s.parent_reply=J(t)),s}function X(e){return Array.isArray(e)?e.map(e=>({user_id:e.user_id||``,name:e.nickname||e.username||``,avatar:e.avatar_url||``,birthday:``,signature:e.signature||``})):[]}function Z(e){if(!e)return[];let t=new Map,n=/<span[^>]*class=['"]mention['"][^>]*data-id=['"]([^'"]+)['"][^>]*>@([^<]*)<\/span>/g,r;for(;(r=n.exec(e))!==null;){let e=r[1]?String(r[1]):``,n=(r[2]?String(r[2]):``).replace(/^@/,``)||e;!e||t.has(e)||t.set(e,{user_id:e,name:n,avatar:``,birthday:``,signature:``})}if(t.size>0)return Array.from(t.values());let i=/<@_user>(\w+)<\/@_user>/g;for(;(r=i.exec(e))!==null;){let e=r[1]?String(r[1]):``;!e||t.has(e)||t.set(e,{user_id:e,name:e,avatar:``,birthday:``,signature:``})}return Array.from(t.values())}function ee(e){return!Array.isArray(e)||e.length===0?[]:e.map(e=>{let t=!!e.is_video,n=t?String(e.video_url||``):String(e.image_url||e.cover_image||``),r=String(e.cover_image||e.image_url||``);return{media_url:n,is_video:t,image_resolution:String(e.image_resolution||``),cover_image:r,cover_image_resolution:String(e.cover_image_resolution||``),video_resolution:String(e.resolution||``),video_duration:Number(e.video_duration||0),video_size:Number(e.video_size||0)}}).filter(e=>!!e.media_url)}function Q(e,t){let n=[];return e.forEach(e=>{n.push(Y(e,t)),e.sub_comments?.length&&n.push(...Q(e.sub_comments,e))}),n}function $(e){let t=Number(e)||0;return t>=1e4?`${(t/1e4).toFixed(1)}w`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}const te=t((e,t,n)=>{try{if(!e?.id)return;u({comment_id:e.id,is_like:e.like_flag!==`1`},{revalidate:!1})}catch(e){console.error(`点赞回复失败:`,e)}},200),ne=t((e,t,n)=>{try{if(!e?.id)return;l({comment_id:e.id,is_dislike:e.like_flag!==`2`},{revalidate:!1})}catch(e){console.error(`点踩回复失败:`,e)}},200),re=F(({comment:e,updateFollow:t,onRequireLogin:n})=>{let{userInfo:r,userId:i,isLogin:a}=o(),s=r?.userId||r?.user_id||i||``;return H(`div`,{className:`w-full bg-bg1`,children:H(N,{comment:e,variant:`light`,isLogin:a,onRequireLogin:n,rightSlot:R(()=>!!s&&String(s)===String(e.user_id||``),[e.user_id,s])?H(V,{}):H(ie,{userId:e.user_id,hasFollow:e.is_follow,onChange:t,onRequireLogin:n}),showReplyButton:!1})})});function ie({userId:t,hasFollow:n=!1,onChange:r,onRequireLogin:i}){let s=G(`components.biz.business.comment`),{isLogin:c,userInfo:l,userId:u}=o(),{followIds:p}=a(),[m,h]=B(n),[g,_]=B(!1),v=l?.userId||l?.user_id||u||``,y=R(()=>!!v&&String(v)===String(t||``),[t,v]),b=R(()=>n||p.includes(t),[p,n,t]);L(()=>{h(b)},[b]);let x=I(async()=>{try{if(!v||!t||t===`0`){W.error(s(`replyDetail.loginRequired`));return}if(m){let e=await f({follower_id:String(v),followee_id:t});if(e.code!==0){W.error(e.message||s(`replyDetail.unfollowFailed`));return}}else{let e=await d({follower_id:String(v),followee_id:t});if(e.code!==0){W.error(e.message||s(`replyDetail.followFailed`));return}}window.sensors?.track(`detail_follow_click`,{object_id:``,action:m?`取消关注`:`关注`,author_id:t}),sessionStorage.setItem(`user_page_refresh`,`1`)}catch(e){console.error(`关注或取消关注失败:`,e),W.error(s(m?`replyDetail.unfollowFailed`:`replyDetail.followFailed`));return}let e=!m;r?.(e),h(e);let{followIds:n,setFollowIds:i}=a.getState(),o=new Set(n);e?o.add(t):o.delete(t),i(Array.from(o))},[t,m,r,v,s]),T=I(()=>{if(!c){i?.();return}if(m){_(!0);return}x()},[x,m,c,i]);function E(){_(!1),x()}function D(){_(!1)}return y||!t||t===`0`?null:U(V,{children:[H(`div`,{className:e(`h-[28px] rounded-[14px] px-[8px] border border-solid cursor-pointer flex items-center justify-center`,m?`border-text3`:`border-theme5`),onClick:T,children:m?U(V,{children:[H(S,{className:`w-[12px] h-[12px] text-text3 shrink-0`}),H(`span`,{className:`text-text3 text-[12px] leading-[18px] ml-[4px] shrink-0`,children:s(`replyDetail.followed`)})]}):U(V,{children:[H(C,{className:`block w-[12px] h-[12px] text-theme5 shrink-0`}),H(`span`,{className:`block text-theme5 text-[12px] leading-[18px] ml-[4px] shrink-0`,children:s(`replyDetail.follow`)})]})}),H(w,{open:g,onOpenChange:_,onCancel:D,onConfirm:E})]})}const ae=t(e=>{e()},0);function oe(e,t,n,r){let i=z(!1);L(()=>{i.current=!1},[r]),L(()=>{let r=e.current;if(!r)return;!i.current&&t>0&&(r.scrollTop=t,i.current=!0);let a=()=>{i.current=!0,n(r.scrollTop)};return r.addEventListener(`scroll`,a,{passive:!0}),()=>r.removeEventListener(`scroll`,a)},[e,n,t,r])}const se=F(({commentId:e,informationId:t,handleReplyComment:n,onReplyListUpdate:r})=>{let i=G(`components.biz.business.comment`),[a,o]=b(`replay-detail-list-${e}`,[]),[c,l]=b(`replay-detail-has-more-${e}`,!0),[u,d]=b(`replay-detail-page-${e}`,1),{getLikedListData:f,getDislikedListData:p}=y(),m=z(!1),h=I(async()=>{if(!(!e||!t)&&!m.current){m.current=!0;try{let n=await s({content_id:t,parent_id:e,page:u,page_size:20,sort_by:`latest`});if(n.code!==0)throw Error(n.message||i(`replyDetail.fetchRepliesFailed`));let r=n.data?.data?.comments??[],a=Q(r);((n.data?.data?.has_more??!1)===!1||r.length<20)&&l(!1),o(e=>{let t=new Set(e.map(e=>e.id)),n=a.filter(e=>!t.has(e.id));return[...e,...n]}),a.length>0&&d(u+1)}catch(e){console.error(`获取回复列表失败:`,e),l(!1)}finally{m.current=!1}}},[e,t,u,o,l,d,i]),g=I(e=>{o(t=>[e,...t])},[o]);L(()=>{r(g)},[r,g]),L(()=>{e&&t&&(o(e=>e.length===0?e:[]),l(e=>e===!0?e:!0),d(e=>e===1?e:1))},[e,t,o,l,d]);let _=I(n=>{o(e=>f(e,n.id)),te(n,t,e)},[e,f,t,o]),x=I(n=>{n.like_flag!==`2`&&W.message(i(`replyDetail.dislikeHint`)),o(e=>p(e,n.id)),ne(n,t,e)},[e,p,t,o,i]),[S,C]=b(`replay-detail-scroll-top-${e}`,0),w=z(null);oe(w,S,C,e),L(()=>{!e||!t||a.length===0&&c&&h()},[e,t,h,a.length,c]);let T=I(async()=>{await h()},[h]);return U(`div`,{ref:w,className:`w-full pb-[66px]`,children:[a.map((e,t)=>H(ce,{replyItem:e,replyComment:n,onLikeReply:_,onDislikeReply:x},`${e.id}-${t}`)),H(v,{loadMore:T,hasMore:c})]})});function ce({replyItem:e,replyComment:t,onLikeReply:n,onDislikeReply:r}){let i=G(`components.biz.business.comment`),a=m(),o=e.status===`0`;function s(){n?.(e)}function c(){r?.(e)}function l(){t(e)}return U(`div`,{className:`p-[16px] flex flex-col`,children:[U(`div`,{className:`flex flex-row justify-between`,children:[U(`button`,{type:`button`,className:`flex flex-row items-center text-left`,onClick:()=>{a.push(`/profile/${e.user_id}`)},children:[H(`div`,{className:`w-[38px] h-[38px] rounded-full overflow-hidden relative bg-bg2`,children:e.avatar&&H(h,{src:e.avatar,fill:!0,objectFit:`cover`,alt:`avatar`})}),U(`div`,{className:`ml-[12px] flex flex-col`,children:[H(`span`,{className:`text-text2 text-[14px] leading-[14px] max-w-[180px] text-ellipsis overflow-hidden whitespace-nowrap`,children:e.user_name}),H(`span`,{className:`mt-[8px] text-text3 text-[12px] leading-[12px]`,children:H(M,{timestamp:e.created_at})})]})]}),o?H(`div`,{className:`px-[8px] py-[4px] bg-text3/10 rounded-[12px]`,children:H(`span`,{className:`text-text3 text-[12px] leading-[12px]`,children:i(`replyDetail.underReview`)})}):U(`div`,{className:`flex flex-row items-center`,children:[U(`div`,{className:`px-[4px] flex flex-col items-center`,onClick:s,children:[e.like_flag===`1`?H(E,{className:`w-[14px] h-[14px]`}):H(T,{className:`w-[14px] h-[14px] text-text3`}),H(`span`,{className:`mt-[4px] text-text3 text-[12px] leading-[12px]`,children:e.like_cnt===`0`?i(`replyDetail.like`):$(e.like_cnt)})]}),U(`div`,{className:`ml-[12px] px-[4px] flex flex-col items-center`,onClick:c,children:[e.like_flag===`2`?H(k,{className:`w-[14px] h-[14px]`}):H(O,{className:`w-[14px] h-[14px] text-text3`}),H(`span`,{className:`mt-[4px] text-text3 text-[12px] leading-[12px]`,children:e.dislike_cnt===`0`?i(`replyDetail.dislike`):$(e.dislike_cnt)})]})]})]}),U(`div`,{className:`mt-[4px] pl-[50px] flex flex-col`,children:[e.text&&H(j,{className:`text-text1 text-[14px] leading-[22px] break-all`,text:e.text,atUsers:e.at_users}),H(A,{list:e.nine_grid_content_info,disabled:o,hasText:!!e.text,playerId:e.id}),e.parent_reply&&e.parent_reply.text&&U(V,{children:[U(`div`,{className:`mt-[4px] flex flex-row items-center text-[14px] leading-[22px] relative pl-[8px]`,children:[H(`div`,{className:`w-[2px] h-full bg-line1 mr-[8px] absolute left-0 top-0 bottom-0 m-auto`}),U(`span`,{className:`text-theme1`,children:[e.parent_reply.user_name,`:`,e.parent_reply.text&&H(`span`,{className:`text-text1`,children:H(j,{text:e.parent_reply.text,atUsers:e.parent_reply.at_users})})]})]}),H(`div`,{className:`mt-1`,children:H(A,{list:e.parent_reply.nine_grid_content_info,disabled:o,hasText:!!e.parent_reply.text,playerId:e.parent_reply.id})})]}),H(`div`,{className:`mt-[4px] w-[fit-content] h-[30px] px-[12px] text-text1 text-[14px] leading-[22px] flex flex-row items-center bg-bg1 rounded-[15px]`,onClick:l,children:H(`span`,{children:i(`replyDetail.reply`)})})]})]})}function le({comment:e,information:t,contentType:s,visible:l,onClose:u,onReplyComment:d,onReplyAdded:f,onRequireLogin:m}){let h=G(`components.biz.business.comment`),v=z(null),[y,b]=B(()=>P({})),[S,C]=B(!1),{userInfo:w,userId:T}=o(),{followIds:E,setFollowIds:O}=a(),k=w?.userId||w?.user_id||T||``,A=w?.name||w?.nick_name||w?.nickname||w?.user_name||``,j=w?.avatar||w?.avatar_url||``,M=z({commentId:``,userId:``});function N(e){if(!e)return``;if(Array.isArray(e))return String(e[0]||``);if(typeof e==`object`){if(Object.prototype.hasOwnProperty.call(e,`comment_id`))return String(e.comment_id??``);if(Array.isArray(e.data))return String(e.data[0]||``)}return``}L(()=>{l&&(!k||!e.user_id||e.user_id!==`0`&&String(k)!==String(e.user_id)&&(M.current.commentId===e.id&&M.current.userId===k||(M.current={commentId:e.id,userId:k},(async()=>{let t=await p({app_id:0,follower_id:k,followee_ids:[e.user_id]});if(!t.success||!t.data?.is_following_map)return;let n=!!t.data.is_following_map[e.user_id];e.is_follow=n;let r=new Set(E);n?r.add(e.user_id):r.delete(e.user_id),O(Array.from(r))})())))},[e,E,k,O,l]);let F=I(e=>{b(e),setTimeout(()=>{C(!0),v.current?.focus()},10)},[]);function R(){ae(()=>{C(!1)})}async function V({text:e,imageVideoInfoList:t}){let n=e=>e.success?e:(W.error(e.message||h(`replyDetail.publishReplyFailed`)),{...e,toastHandled:!0});if(S){let r=await q({text:e,imageVideoInfoList:t});return C(!1),n(r)}else{let r=await K({text:e,imageVideoInfoList:t});return C(!1),n(r)}}async function K({text:e,imageVideoInfoList:t}){return await d?.({text:e,imageVideoInfoList:t,callback:r=>{let i=Z(e);if(!r||r===`0`)return;let a=P({id:r,user_id:k,user_name:A,avatar:j,text:e,created_at:n(),type:`4`,nine_grid_content_info:t,at_users:i});J?.(a)}})??{success:!0}}async function q({text:e,imageVideoInfoList:a}){if(!y?.id||y.id===`0`)return{success:!1,message:h(`replyDetail.invalidReplyTarget`)};let o=ee(a),l=r(e),u=s===`video`?1:2;try{let r=await c({content_id:t.id,content:i(e),medias:o,mentioned_users:l,parent_id:y.id,source_type:u},{revalidate:!1});if(r.code!==0)return{success:!1,message:r.message||h(`replyDetail.publishReplyFailed`)};let s=N(r.data);if(!s||s===`0`)return{success:!1,message:h(`replyDetail.publishReplyFailed`)};let d=P({id:s,user_id:k,user_name:A,avatar:j,text:e,created_at:n(),type:`4`,nine_grid_content_info:a,at_users:Z(e)});return d.parent_reply=y,J?.(d),f?.(),{success:!0}}catch(e){return console.error(`发布回复回复失败:`,e),{success:!1,message:h(`replyDetail.publishReplyFailed`)}}}let[J,Y]=B(null),X=I(e=>{Y(()=>e)},[]),Q=S?`回复@${y.user_name}`:``;function $(e){e||u()}return H(g,{open:l,onOpenChange:$,children:U(_,{showCloseButton:!1,className:`fixed left-0 right-0 bottom-0 top-[84px] z-[1000] h-auto w-full max-w-none translate-x-0 translate-y-0 rounded-none bg-bg2 p-0 text-text1 !flex !flex-col !gap-0`,children:[U(`div`,{className:`w-full h-[60px] bg-bg1 flex items-center justify-center relative`,children:[H(`button`,{type:`button`,className:`w-[48px] focus-within:outline-none focus-within:border-none focus-within:ring-0 h-full flex items-center justify-center absolute left-0 top-0`,onClick:u,children:H(x,{className:`w-[16px] h-[16px] text-text1`})}),H(`span`,{className:`text-[18px] font-bold`,children:h(`replyDetail.commentDetail`)})]}),U(`div`,{className:`flex-1 min-h-0 w-full overflow-y-auto bg-bg2`,children:[H(re,{comment:e,updateFollow:t=>{e.is_follow=t},onRequireLogin:m}),H(se,{commentId:e.id,informationId:t.id,handleReplyComment:F,onReplyListUpdate:X}),H(D,{placeholder:Q,onInputBlur:R,onPublish:V,onRequireLogin:m,ref:v})]})]})})}export{le as default};
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{Box as e}from"../../../../ui/box.mjs";import{Text as t}from"../../../../ui/text.mjs";import{useCardDecoration as n}from"../../../../../hooks/use-card-decoration.mjs";import{DetailInfoTags as r}from"./detail-info-tags.mjs";import{DetailInfoTitle as i}from"./detail-info-title.mjs";import{useEffect as a,useMemo as o,useRef as s,useState as c}from"react";import{jsx as l,jsxs as u}from"react/jsx-runtime";import{useTranslations as d}from"next-intl";function f({information:f,isShow:m,showTags:h=!0}){let g=d(`components.biz.business.detail`),{getTitleText:_}=n(),v=o(()=>_(f),[_,f]),y=o(()=>f.description||``,[f.description]),[b,x]=c(!1),[S,C]=c(!1),w=s(null),T=o(()=>p(f.score),[f.score]),E=f.tags||[],D=h&&E.length>0;a(()=>{x(!1)},[y]),a(()=>{if(b){C(!0);return}let e=w.current;if(!y||!m||!e){C(!1);return}let t=()=>{C(e.scrollHeight>e.clientHeight+1)};t();let n=new ResizeObserver(t);return n.observe(e),()=>{n.disconnect()}},[y,b,m]);function O(){x(e=>!e)}return!v&&!y&&!D?null:u(e,{className:`w-full mt-4 px-[12px]`,children:[u(e,{className:`w-full flex items-start justify-between min-w-0`,children:[l(e,{className:`flex-1 pr-[12px] min-w-0`,children:l(i,{title:v})}),u(e,{className:`ml-4 shrink-0 flex flex-col items-center`,children:[l(e,{className:`text-[28px] leading-[36px] h-[36px] font-bold text-[#FF9F1A]`,children:T}),l(t,{className:`text-[12px] text-text2 leading-4`,children:g(`detailIntroduction.score`)})]})]}),y&&m&&u(e,{className:`mt-[12px]`,children:[l(`p`,{ref:w,className:`text-[14px] leading-[22px] text-text2 break-all ${b?``:`line-clamp-1`}`,children:y}),S&&l(`button`,{type:`button`,className:`mt-[8px] text-theme5 inline-flex items-center text-[12px] leading-[18px] text-text2`,onClick:O,children:g(b?`detailIntroduction.collapse`:`detailIntroduction.expand`)})]}),D&&l(r,{tags:E,className:`mt-[12px]`})]})}function p(e){let t=Number(e||`0`);return Number.isFinite(t)?(t>10?t/10:t).toFixed(1):`0`}export{f as DetailIntroduction};
2
+ "use client";import{Box as e}from"../../../../ui/box.mjs";import{Text as t}from"../../../../ui/text.mjs";import{useCardDecoration as n}from"../../../../../hooks/use-card-decoration.mjs";import{DetailInfoTags as r}from"./detail-info-tags.mjs";import{DetailInfoTitle as i}from"./detail-info-title.mjs";import{useEffect as a,useMemo as o,useRef as s,useState as c}from"react";import{jsx as l,jsxs as u}from"react/jsx-runtime";import{useTranslations as d}from"next-intl";function f({information:f,isShow:m,showTags:h=!0}){let g=d(`components.biz.business.detail`),{getTitleText:_}=n(),v=o(()=>_(f),[_,f]),y=o(()=>f.description||``,[f.description]),[b,x]=c(!1),[S,C]=c(!1),w=s(null),T=o(()=>p(f.score),[f.score]),E=f.tags||[],D=h&&E.length>0;a(()=>{x(!1)},[y]),a(()=>{if(b){C(!0);return}let e=w.current;if(!y||!m||!e){C(!1);return}let t=()=>{C(e.scrollHeight>e.clientHeight+1)};t();let n=new ResizeObserver(t);return n.observe(e),()=>{n.disconnect()}},[y,b,m]);function O(){x(e=>!e)}return!v&&!y&&!D?null:u(e,{className:`w-full pt-4 px-[12px]`,children:[u(e,{className:`w-full flex items-start justify-between min-w-0`,children:[l(e,{className:`flex-1 pr-[12px] min-w-0`,children:l(i,{title:v})}),u(e,{className:`ml-4 shrink-0 flex flex-col items-center`,children:[l(e,{className:`text-[28px] leading-[36px] h-[36px] font-bold text-[#FF9F1A]`,children:T}),l(t,{className:`text-[12px] text-text2 leading-4`,children:g(`detailIntroduction.score`)})]})]}),y&&m&&u(e,{className:`mt-[12px]`,children:[l(`p`,{ref:w,className:`text-[14px] leading-[22px] text-text2 break-all ${b?``:`line-clamp-1`}`,children:y}),S&&l(`button`,{type:`button`,className:`mt-[8px] text-theme5 inline-flex items-center text-[12px] leading-[18px] text-text2`,onClick:O,children:g(b?`detailIntroduction.collapse`:`detailIntroduction.expand`)})]}),D&&l(r,{tags:E,className:`mt-[12px]`})]})}function p(e){let t=Number(e||`0`);return Number.isFinite(t)?(t>10?t/10:t).toFixed(1):`0`}export{f as DetailIntroduction};
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{useUserStore as e}from"../../../../../store/modules/user-store.mjs";import{pCommunityMoveCollectionContent as t}from"../../../../../service/generated/client.mjs";import{Box as n}from"../../../../ui/box.mjs";import{Text as r}from"../../../../ui/text.mjs";import{useLoginModalStore as i}from"../../../../../store/modules/login-modal-store.mjs";import{useDeleteRequest as a}from"../../../../../hooks/query/use-query.mjs";import{debounceFun as o}from"../../../../../utils/tools.mjs";import s from"../../../../common/interaction-animations.module.mjs";import c from"../../../../common/collection-popup/index.mjs";import l from"../../../../common/share-popup/share-popup.mjs";import{useContentOperate as u}from"../../../../../hooks/use-content-operate.mjs";import d from"../../../../../assets/icons/detail/check-ok.mjs";import f from"../../../../../assets/icons/detail/collect_nor.mjs";import p from"../../../../../assets/icons/detail/collect_sel.mjs";import ee from"../../../../../assets/icons/detail/give_like.mjs";import m from"../../../../../assets/icons/detail/give_like_sel.mjs";import te from"../../../../../assets/icons/detail/share.mjs";import{useCallback as h,useEffect as g,useMemo as _,useRef as v,useState as y}from"react";import{jsx as b,jsxs as x}from"react/jsx-runtime";import{toast as S}from"sonner";import{useTranslations as C}from"next-intl";import{usePathname as w,useSearchParams as ne}from"next/navigation";function T({mode:T=`renderer`,information:O,onUpdate:k}){let A=T===`editor`||!O?.id||O.id.startsWith(`preview-`),j=`${w()}?${ne()?.toString()||``}`,M=v(j),N=C(`components.biz.business.detail`),[P,F]=y(!1),[I,L]=y(!1),R=v(0),z=e(e=>e.userId),B=e(e=>e.isLogin),V=a();g(()=>{M.current!==j&&(l.clear(),M.current=j)},[j]),g(()=>()=>{l.clear()},[]);let H=h(()=>{z&&(V([`user-profile`,`mine`,z,`user-like-video`]),V([`user-profile`,`mine`,z,`user-like-post`]),V([`user-profile`,`mine`,z,`user-collect-video`,z]),V([`user-profile`,`mine`,z,`user-collect-post`,z]))},[V,z]),{likeAnimation:U,handleLikeOperate:W,handleDefaultCollectionOperate:G,handleShareOperate:K}=u({id:O.id,isLike:O.like||!1,isDislike:O.dislike||!1,isCollect:O.collect||!1,likeCnt:D(O.static?.like_cnt),dislikeCnt:D(O.static?.dislike_cnt),contentType:1,prefetchDefaultCollection:!A,animationClasses:{like:s.likeShakeAnimation,dislike:s.dislikeShakeAnimation}}),q=h(e=>{k?.({...e})},[k]),J=h(async()=>{if(P)return;if(!B){i.getState().open();return}let e=Date.now();if(e-R.current<300)return;R.current=e,F(!0);let t=O.like||!1,n=O.dislike||!1,r=D(O.static?.like_cnt),a=D(O.static?.dislike_cnt),o=!t,s=Math.max(0,r+(o?1:-1)),c=o?!1:n,l=o&&n?Math.max(0,a-1):a;q({like:o,dislike:c,static:{...O.static,like_cnt:s,dislike_cnt:l}});try{let e=await W();if(!e){q({like:t,dislike:n,static:{...O.static,like_cnt:r,dislike_cnt:a}});return}q({like:e.isLike,dislike:e.isDislike??c,static:{...O.static,like_cnt:e.likeCnt,dislike_cnt:e.dislikeCnt??l}}),H(),window.sensors?.track?.(`detail_like_click`,{object_id:O.id,action:e.isLike?`点赞`:`取消点赞`,like_count:e.likeCnt})}catch(e){console.error(`点赞操作失败:`,e),S.error(N(`detailOperate.operateFailed`))}finally{F(!1)}},[W,O,H,P,B,N,q]),Y=_(()=>O.id,[O.id]),X=h(()=>{K(({isCollect:e})=>{q({collect:e})},Y)},[K,Y,q]),Z=h(()=>{c.show({mode:`select`,onCollect:async e=>{try{let n=await t({new_collection_id:e,content_id:O.id});if(n.code!==0)throw Error(n.message||N(`detailOperate.collectFailed`));q({collect:!0}),H(),S.success(N(`detailOperate.modifyCollectionSuccess`))}catch(e){console.error(`修改收藏夹失败:`,e),S.error(N(`detailOperate.collectFailed`))}}})},[O.id,H,N,q]),Q=h(e=>{let t=e||N(`detailOperate.defaultCollection`);S.custom(e=>x(`div`,{className:`flex items-center justify-between gap-[16px] px-[16px] py-[12px] rounded-[12px] bg-black text-white shadow-lg min-w-[280px]`,children:[x(`div`,{className:`flex items-center gap-[10px]`,children:[b(`div`,{className:`w-[24px] h-[24px] rounded-full bg-white flex items-center justify-center`,children:b(d,{className:`w-[14px] h-[14px]`})}),x(`div`,{className:`flex items-center gap-[6px]`,children:[b(`span`,{className:`text-[14px] leading-[20px]`,children:N(`detailOperate.collectAdded`)}),b(`span`,{className:`text-[14px] leading-[20px] font-semibold`,children:t})]})]}),b(`button`,{type:`button`,className:`text-[14px] text-theme5 font-semibold`,onClick:()=>{S.dismiss(e),Z()},children:N(`detailOperate.modifyCollection`)})]}))},[Z,N]),$=h(async()=>{if(I)return;if(!B){i.getState().open();return}let e=O.collect||!1;L(!0),window.sensors?.track?.(`detail_fav_click`,{object_id:O.id,action:e?`取消收藏`:`收藏`});try{let t=await G({currentCollect:e,onUpdate:({isCollect:e})=>{q({collect:e})}});if(!t?.success){S.error(t?.message||N(`detailOperate.collectFailed`));return}H(),window.sensors?.track?.(`detail_fav_click`,{object_id:O.id,action:t.isCollect?`收藏`:`取消收藏`}),!e&&t.isCollect&&Q(t.collectionTitle),e&&t.isCollect===!1&&S.success(N(`detailOperate.uncollectSuccess`))}catch(e){console.error(`收藏操作失败:`,e),S.error(e?.message||N(`detailOperate.collectFailed`))}finally{L(!1)}},[G,O.collect,O.id,H,I,B,Q,N,q]),re=_(()=>o($,300),[$]);return x(n,{className:`w-full h-[42px] mt-[16px] flex items-center justify-between ${A?`pointer-events-none`:``}`,children:[x(n,{className:`w-[25%] h-full flex flex-col items-center justify-center ${P?`opacity-50 cursor-not-allowed`:`cursor-pointer`}`,onClick:J,children:[O.like?b(m,{className:`w-[20px] h-[20px] ${U.animationClass}`}):b(ee,{className:`w-[20px] h-[20px] text-text2`}),b(r,{className:`text-[12px] text-text2 leading-[20px]`,children:O.static?O.static.like_cnt===0?N(`detailOperate.like`):E(O.static?.like_cnt):N(`detailOperate.like`)})]}),x(n,{className:`w-[25%] h-full flex flex-col items-center justify-center ${I?`opacity-50 cursor-not-allowed`:`cursor-pointer`}`,onClick:re,children:[O.collect?b(p,{className:`w-[20px] h-[20px]`}):b(f,{className:`w-[20px] h-[20px] text-text2`}),b(r,{className:`text-[12px] text-text2 leading-[20px]`,children:N(`detailOperate.collection`)})]}),x(n,{className:`w-[25%] h-full flex flex-col items-center justify-center cursor-pointer`,onClick:X,children:[b(te,{className:`w-[20px] h-[20px] text-text2`}),b(r,{className:`text-[12px] text-text2 leading-[20px]`,children:N(`detailOperate.share`)})]})]})}function E(e){let t=Number(e||0);return Number.isNaN(t)||t<=0?`0`:t>=1e4?`${(t/1e4).toFixed(1)}w`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}function D(e){if(e==null)return 0;if(typeof e==`number`)return e;let t=Number(e);return Number.isNaN(t)?0:t}export{T as DetailOperate};
2
+ "use client";import{useUserStore as e}from"../../../../../store/modules/user-store.mjs";import{pCommunityMoveCollectionContent as t}from"../../../../../service/generated/client.mjs";import{Box as n}from"../../../../ui/box.mjs";import{Text as r}from"../../../../ui/text.mjs";import{useLoginModalStore as i}from"../../../../../store/modules/login-modal-store.mjs";import{useDeleteRequest as a}from"../../../../../hooks/query/use-query.mjs";import{debounceFun as o}from"../../../../../utils/tools.mjs";import s from"../../../../common/interaction-animations.module.mjs";import c from"../../../../common/collection-popup/index.mjs";import l from"../../../../common/share-popup/share-popup.mjs";import{useContentOperate as u}from"../../../../../hooks/use-content-operate.mjs";import d from"../../../../../assets/icons/detail/check-ok.mjs";import f from"../../../../../assets/icons/detail/collect_nor.mjs";import p from"../../../../../assets/icons/detail/collect_sel.mjs";import ee from"../../../../../assets/icons/detail/give_like.mjs";import m from"../../../../../assets/icons/detail/give_like_sel.mjs";import te from"../../../../../assets/icons/detail/share.mjs";import{useCallback as h,useEffect as g,useMemo as _,useRef as v,useState as y}from"react";import{jsx as b,jsxs as x}from"react/jsx-runtime";import{toast as S}from"sonner";import{usePathname as C,useSearchParams as w}from"next/navigation";import{useTranslations as ne}from"next-intl";function T({mode:T=`renderer`,information:O,onUpdate:k}){let A=T===`editor`||!O?.id||O.id.startsWith(`preview-`),j=`${C()}?${w()?.toString()||``}`,M=v(j),N=ne(`components.biz.business.detail`),[P,F]=y(!1),[I,L]=y(!1),R=v(0),z=e(e=>e.userId),B=e(e=>e.isLogin),V=a();g(()=>{M.current!==j&&(l.clear(),M.current=j)},[j]),g(()=>()=>{l.clear()},[]);let H=h(()=>{z&&(V([`user-profile`,`mine`,z,`user-like-video`]),V([`user-profile`,`mine`,z,`user-like-post`]),V([`user-profile`,`mine`,z,`user-collect-video`,z]),V([`user-profile`,`mine`,z,`user-collect-post`,z]))},[V,z]),{likeAnimation:U,handleLikeOperate:W,handleDefaultCollectionOperate:G,handleShareOperate:K}=u({id:O.id,isLike:O.like||!1,isDislike:O.dislike||!1,isCollect:O.collect||!1,likeCnt:D(O.static?.like_cnt),dislikeCnt:D(O.static?.dislike_cnt),contentType:1,prefetchDefaultCollection:!A,animationClasses:{like:s.likeShakeAnimation,dislike:s.dislikeShakeAnimation}}),q=h(e=>{k?.({...e})},[k]),J=h(async()=>{if(P)return;if(!B){i.getState().open();return}let e=Date.now();if(e-R.current<300)return;R.current=e,F(!0);let t=O.like||!1,n=O.dislike||!1,r=D(O.static?.like_cnt),a=D(O.static?.dislike_cnt),o=!t,s=Math.max(0,r+(o?1:-1)),c=o?!1:n,l=o&&n?Math.max(0,a-1):a;q({like:o,dislike:c,static:{...O.static,like_cnt:s,dislike_cnt:l}});try{let e=await W();if(!e){q({like:t,dislike:n,static:{...O.static,like_cnt:r,dislike_cnt:a}});return}q({like:e.isLike,dislike:e.isDislike??c,static:{...O.static,like_cnt:e.likeCnt,dislike_cnt:e.dislikeCnt??l}}),H(),window.sensors?.track?.(`detail_like_click`,{object_id:O.id,action:e.isLike?`点赞`:`取消点赞`,like_count:e.likeCnt})}catch(e){console.error(`点赞操作失败:`,e),S.error(N(`detailOperate.operateFailed`))}finally{F(!1)}},[W,O,H,P,B,N,q]),Y=_(()=>O.id,[O.id]),X=h(()=>{K(({isCollect:e})=>{q({collect:e})},Y)},[K,Y,q]),Z=h(()=>{c.show({mode:`select`,onCollect:async e=>{try{let n=await t({new_collection_id:e,content_id:O.id});if(n.code!==0)throw Error(n.message||N(`detailOperate.collectFailed`));q({collect:!0}),H(),S.success(N(`detailOperate.modifyCollectionSuccess`))}catch(e){console.error(`修改收藏夹失败:`,e),S.error(N(`detailOperate.collectFailed`))}}})},[O.id,H,N,q]),Q=h(e=>{let t=e||N(`detailOperate.defaultCollection`);S.custom(e=>x(`div`,{className:`flex items-center justify-between gap-[16px] px-[16px] py-[12px] rounded-[12px] bg-black text-white shadow-lg min-w-[280px]`,children:[x(`div`,{className:`flex items-center gap-[10px]`,children:[b(`div`,{className:`w-[24px] h-[24px] rounded-full bg-white flex items-center justify-center`,children:b(d,{className:`w-[14px] h-[14px]`})}),x(`div`,{className:`flex items-center gap-[6px]`,children:[b(`span`,{className:`text-[14px] leading-[20px]`,children:N(`detailOperate.collectAdded`)}),b(`span`,{className:`text-[14px] leading-[20px] font-semibold`,children:t})]})]}),b(`button`,{type:`button`,className:`text-[14px] text-theme5 font-semibold`,onClick:()=>{S.dismiss(e),Z()},children:N(`detailOperate.modifyCollection`)})]}))},[Z,N]),$=h(async()=>{if(I)return;if(!B){i.getState().open();return}let e=O.collect||!1;L(!0),window.sensors?.track?.(`detail_fav_click`,{object_id:O.id,action:e?`取消收藏`:`收藏`});try{let t=await G({currentCollect:e,onUpdate:({isCollect:e})=>{q({collect:e})}});if(!t?.success){S.error(t?.message||N(`detailOperate.collectFailed`));return}H(),window.sensors?.track?.(`detail_fav_click`,{object_id:O.id,action:t.isCollect?`收藏`:`取消收藏`}),!e&&t.isCollect&&Q(t.collectionTitle),e&&t.isCollect===!1&&S.success(N(`detailOperate.uncollectSuccess`))}catch(e){console.error(`收藏操作失败:`,e),S.error(e?.message||N(`detailOperate.collectFailed`))}finally{L(!1)}},[G,O.collect,O.id,H,I,B,Q,N,q]),re=_(()=>o($,300),[$]);return x(n,{className:`w-full h-[42px] mt-[16px] flex items-center justify-between ${A?`pointer-events-none`:``}`,children:[x(n,{className:`w-[25%] h-full flex flex-col items-center justify-center ${P?`opacity-50 cursor-not-allowed`:`cursor-pointer`}`,onClick:J,children:[O.like?b(m,{className:`w-[20px] h-[20px] ${U.animationClass}`}):b(ee,{className:`w-[20px] h-[20px] text-text2`}),b(r,{className:`text-[12px] text-text2 leading-[20px]`,children:O.static?O.static.like_cnt===0?N(`detailOperate.like`):E(O.static?.like_cnt):N(`detailOperate.like`)})]}),x(n,{className:`w-[25%] h-full flex flex-col items-center justify-center ${I?`opacity-50 cursor-not-allowed`:`cursor-pointer`}`,onClick:re,children:[O.collect?b(p,{className:`w-[20px] h-[20px]`}):b(f,{className:`w-[20px] h-[20px] text-text2`}),b(r,{className:`text-[12px] text-text2 leading-[20px]`,children:N(`detailOperate.collection`)})]}),x(n,{className:`w-[25%] h-full flex flex-col items-center justify-center cursor-pointer`,onClick:X,children:[b(te,{className:`w-[20px] h-[20px] text-text2`}),b(r,{className:`text-[12px] text-text2 leading-[20px]`,children:N(`detailOperate.share`)})]})]})}function E(e){let t=Number(e||0);return Number.isNaN(t)||t<=0?`0`:t>=1e4?`${(t/1e4).toFixed(1)}w`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}function D(e){if(e==null)return 0;if(typeof e==`number`)return e;let t=Number(e);return Number.isNaN(t)?0:t}export{T as DetailOperate};
@@ -2,6 +2,12 @@
2
2
  import { VideoDetailPlayerClient } from "../video-detail-player/client.mjs";
3
3
  import { VideoDetailPlayer } from "../video-detail-player/server.mjs";
4
4
  import "../video-detail-player/index.mjs";
5
+ import { SchemaHasDefaultValue } from "../../../../../utils/schema/schema.mjs";
6
+ import { DefineMaterialOption } from "../../../../../utils/schema/material.mjs";
7
+ import { MaterialMap } from "../../../../../utils/schema/utils.mjs";
8
+ import { VideoDetailPlayerBridgeOnlyClient } from "../video-detail-player-bridge-only/client.mjs";
9
+ import { VideoDetailPlayerBridgeOnly } from "../video-detail-player-bridge-only/server.mjs";
10
+ import "../video-detail-player-bridge-only/index.mjs";
5
11
  import { VideoDetailInfoClient } from "../video-detail-info/client.mjs";
6
12
  import { VideoDetailInfo } from "../video-detail-info/server.mjs";
7
13
  import "../video-detail-info/index.mjs";
@@ -14,9 +20,6 @@ import "../video-detail-actions/index.mjs";
14
20
  import { VideoDetailRecommendClient } from "../video-detail-recommend/client.mjs";
15
21
  import { VideoDetailRecommend } from "../video-detail-recommend/server.mjs";
16
22
  import "../video-detail-recommend/index.mjs";
17
- import { SchemaHasDefaultValue } from "../../../../../utils/schema/schema.mjs";
18
- import { DefineMaterialOption } from "../../../../../utils/schema/material.mjs";
19
- import { MaterialMap } from "../../../../../utils/schema/utils.mjs";
20
23
  import "../../../../../utils.mjs";
21
24
  import z$1 from "zod";
22
25
 
@@ -26,7 +29,12 @@ declare const videoDetailMaterials: MaterialMap<readonly [DefineMaterialOption<t
26
29
  renderer: "renderer";
27
30
  editor: "editor";
28
31
  }>>;
29
- }, z$1.core.$strip>, "video-detail-player", "视频模块">, DefineMaterialOption<typeof VideoDetailInfo, typeof VideoDetailInfoClient, z$1.ZodObject<{
32
+ }, z$1.core.$strip>, "video-detail-player", "视频模块">, DefineMaterialOption<typeof VideoDetailPlayerBridgeOnly, typeof VideoDetailPlayerBridgeOnlyClient, z$1.ZodObject<{
33
+ mode: z$1.ZodOptional<z$1.ZodEnum<{
34
+ renderer: "renderer";
35
+ editor: "editor";
36
+ }>>;
37
+ }, z$1.core.$strip>, "video-detail-player-bridge-only", "视频模块">, DefineMaterialOption<typeof VideoDetailInfo, typeof VideoDetailInfoClient, z$1.ZodObject<{
30
38
  showTags: z$1.ZodBoolean & SchemaHasDefaultValue;
31
39
  showEpisodes: z$1.ZodBoolean & SchemaHasDefaultValue;
32
40
  mode: z$1.ZodOptional<z$1.ZodEnum<{
@@ -1,2 +1,2 @@
1
1
 
2
- import{getSchemaDefaultProps as e}from"../../../../../utils/schema/schema.mjs";import{generateMaterialMap as t}from"../../../../../utils/schema/utils.mjs";import{videoDetailInfoMaterial as n}from"../video-detail-info/material.mjs";import{videoDetailInfoTitleTagsEpisodesMaterial as r}from"../video-detail-info-title-tags-episodes/material.mjs";import{videoDetailPlayerMaterial as i}from"../video-detail-player/material.mjs";import{videoDetailRecommendMaterial as a}from"../video-detail-recommend/material.mjs";import{videoDetailActionsMaterial as o}from"../video-detail-actions/material.mjs";function s(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>typeof t==`number`&&Number.isFinite(t)?[e,String(t)]:[e,t]))}function c(t,n){let r={...e(t.propsSchema),...n??{}},i=t.propsSchema.safeParse(r);if(i.success)return{isValid:!0,props:i.data};let a=s(r),o=t.propsSchema.safeParse(a);return o.success?{isValid:!0,props:o.data}:{isValid:!1,props:r}}const l=t([i,n,r,o,a]);export{c as resolveMaterialProps,l as videoDetailMaterials};
2
+ import{getSchemaDefaultProps as e}from"../../../../../utils/schema/schema.mjs";import{generateMaterialMap as t}from"../../../../../utils/schema/utils.mjs";import{videoDetailInfoMaterial as n}from"../video-detail-info/material.mjs";import{videoDetailInfoTitleTagsEpisodesMaterial as r}from"../video-detail-info-title-tags-episodes/material.mjs";import{videoDetailPlayerMaterial as i}from"../video-detail-player/material.mjs";import{videoDetailPlayerBridgeOnlyMaterial as a}from"../video-detail-player-bridge-only/material.mjs";import{videoDetailRecommendMaterial as o}from"../video-detail-recommend/material.mjs";import{videoDetailActionsMaterial as s}from"../video-detail-actions/material.mjs";function c(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>typeof t==`number`&&Number.isFinite(t)?[e,String(t)]:[e,t]))}function l(t,n){let r={...e(t.propsSchema),...n??{}},i=t.propsSchema.safeParse(r);if(i.success)return{isValid:!0,props:i.data};let a=c(r),o=t.propsSchema.safeParse(a);return o.success?{isValid:!0,props:o.data}:{isValid:!1,props:r}}const u=t([i,a,n,r,s,o]);export{l as resolveMaterialProps,u as videoDetailMaterials};
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{gContentGetVideoDetail as e}from"../../../../../service/generated/client.mjs";import{notifyBridgeEpisodeChanged as t}from"../../../../../utils/login-modal-bridge.mjs";import{useRequest as n}from"../../../../../hooks/query/use-query.mjs";import{useKeepAliveState as r}from"../../../../common/keep-scroll-position/index.mjs";import{createContext as i,use as a,useCallback as o,useEffect as s,useMemo as c}from"react";import{jsx as l}from"react/jsx-runtime";import{useParams as u,useRouter as d}from"next/navigation";const f=i(void 0),p=`funhub:video-detail-episode-sync`;function m(e,t){let n=String(e||``).split(`/`).filter(Boolean),r=n.findIndex(e=>e===`video`||e===`webview`);return r<0?!1:n[r+1]===t}function h(e){let t=Math.floor(Number(e)||1);return t>0?t:1}function g(e){typeof window>`u`||window.dispatchEvent(new CustomEvent(p,{detail:e}))}function _(e){return e.type===p&&e instanceof CustomEvent}function v(e,t){if(!(!e&&!t))return{information:e?.information??t?.information,currentSeriesNum:e?.currentSeriesNum??t?.currentSeriesNum,onEpisodeChange:e?.onEpisodeChange??t?.onEpisodeChange,onUpdateInformation:e?.onUpdateInformation??t?.onUpdateInformation,detailId:e?.detailId??t?.detailId,episodeIndex:e?.episodeIndex??t?.episodeIndex,resumeProgressSeconds:e?.resumeProgressSeconds??t?.resumeProgressSeconds,isShow:e?.isShow??t?.isShow,isWebView:e?.isWebView??t?.isWebView,isInformationLoading:e?.isInformationLoading??t?.isInformationLoading,isInformationResolved:e?.isInformationResolved??t?.isInformationResolved}}function y({value:e,children:t}){let n=a(f);return l(f,{value:c(()=>v(n,e)??e,[n,e]),children:t})}function b(){let e=a(f),t=x({enabled:e===void 0||e.onEpisodeChange===void 0||e.detailId===void 0||e.currentSeriesNum===void 0||e.episodeIndex===void 0||e.isInformationLoading===void 0||e.isInformationResolved===void 0,shouldRequestInformation:!e?.information});return c(()=>{let n=v(e,t);return n&&(e&&t&&e.onEpisodeChange===void 0?{...n,currentSeriesNum:t.currentSeriesNum??n.currentSeriesNum,episodeIndex:t.episodeIndex??n.episodeIndex,onEpisodeChange:t.onEpisodeChange??n.onEpisodeChange}:n)},[e,t])}function x(i){let{enabled:a,shouldRequestInformation:l}=i,f=u(),v=d(),y=f.level,b=Array.isArray(y)?y:typeof y==`string`?[y]:[],x=b[0]||``,S=b.findIndex(e=>e===`episode`),C=S>=0?b[S+1]:b[2],w=Math.max(1,Number(C)||1),[T,E]=r(`video-detail-material-series-num-${x}`,w);s(()=>{E(w)},[w,E]),s(()=>{if(!x||typeof window>`u`)return;let e=e=>{if(!_(e))return;let t=e.detail;if(!t||t.detailId!==x)return;let n=h(t.seriesNum);E(e=>e===n?e:n)};return window.addEventListener(p,e),()=>{window.removeEventListener(p,e)}},[x,E]);let D=o(e=>{if(!x)return;let t=h(e);E(t),g({detailId:x,seriesNum:t})},[x,E]),O=Math.max(1,Number(T)||1),k=Math.max(0,O-1),A=b[1]||``,j=typeof window<`u`&&(window.isWebView===!0||window.isWebview===!0),{data:M,isPending:N,isFetching:P,isError:F,isSuccess:I}=n([`video-detail-material-fallback`,x],async()=>x?await e({id:x}):null,{enabled:a&&l&&!!x}),L=c(()=>{let e=M?.data?.video;if(!(!e||typeof e!=`object`))return{...e,content_type:1,episode_cnt:e.links?.length||0}},[M?.data?.video]),R=o(e=>{let n=Math.max(1,Math.floor(Number(e)||1));if(!x||typeof window>`u`)return;let r=`${j?`/webview`:`/video`}/${x}/${encodeURIComponent(A)}/episode/${n}`,{search:i,hash:a,pathname:o}=window.location,s=`${o}${i}${a}`,c=`${r}${i}${a}`,l=m(o,x);if(s!==c){j&&t({detailId:x,seriesNum:n,nextPath:r}),l&&typeof window.history?.replaceState==`function`?(window.history.replaceState(window.history.state,``,c),D(n)):v.replace(c,{scroll:!1});return}O!==n&&D(n)},[O,x,j,A,v,D]);if(a)return{information:L,currentSeriesNum:O,onEpisodeChange:R,detailId:x,episodeIndex:k,resumeProgressSeconds:0,isShow:!0,isWebView:j,isInformationLoading:l?!!x&&!L&&(N||P):!1,isInformationResolved:!x||!!L||!l||F||I}}export{y as VideoDetailMaterialRuntimeProvider,b as useVideoDetailMaterialRuntimeContext};
2
+ "use client";import{gContentGetVideoDetail as e}from"../../../../../service/generated/client.mjs";import{useRouter as t}from"../../../../../utils/use-compatible-router.mjs";import{notifyBridgeEpisodeChanged as n}from"../../../../../utils/login-modal-bridge.mjs";import{useRequest as r}from"../../../../../hooks/query/use-query.mjs";import{useKeepAliveState as i}from"../../../../common/keep-scroll-position/index.mjs";import{createContext as a,use as o,useCallback as s,useEffect as c,useMemo as l}from"react";import{jsx as u}from"react/jsx-runtime";import{useParams as d}from"next/navigation";const f=a(void 0),p=`funhub:video-detail-episode-sync`;function m(e,t){let n=String(e||``).split(`/`).filter(Boolean),r=n.findIndex(e=>e===`video`||e===`webview`);return r<0?!1:n[r+1]===t}function h(e){let t=Math.floor(Number(e)||1);return t>0?t:1}function g(e){typeof window>`u`||window.dispatchEvent(new CustomEvent(p,{detail:e}))}function _(e){return e.type===p&&e instanceof CustomEvent}function v(e,t){if(!(!e&&!t))return{information:e?.information??t?.information,currentSeriesNum:e?.currentSeriesNum??t?.currentSeriesNum,onEpisodeChange:e?.onEpisodeChange??t?.onEpisodeChange,onUpdateInformation:e?.onUpdateInformation??t?.onUpdateInformation,detailId:e?.detailId??t?.detailId,episodeIndex:e?.episodeIndex??t?.episodeIndex,resumeProgressSeconds:e?.resumeProgressSeconds??t?.resumeProgressSeconds,isShow:e?.isShow??t?.isShow,isWebView:e?.isWebView??t?.isWebView,isInformationLoading:e?.isInformationLoading??t?.isInformationLoading,isInformationResolved:e?.isInformationResolved??t?.isInformationResolved}}function y({value:e,children:t}){let n=o(f);return u(f,{value:l(()=>v(n,e)??e,[n,e]),children:t})}function b(){let e=o(f),t=x({enabled:e===void 0||e.onEpisodeChange===void 0||e.detailId===void 0||e.currentSeriesNum===void 0||e.episodeIndex===void 0||e.isInformationLoading===void 0||e.isInformationResolved===void 0,shouldRequestInformation:!e?.information});return l(()=>{let n=v(e,t);return n&&(e&&t&&e.onEpisodeChange===void 0?{...n,currentSeriesNum:t.currentSeriesNum??n.currentSeriesNum,episodeIndex:t.episodeIndex??n.episodeIndex,onEpisodeChange:t.onEpisodeChange??n.onEpisodeChange}:n)},[e,t])}function x(a){let{enabled:o,shouldRequestInformation:u}=a,f=d(),v=t(),y=f.level,b=Array.isArray(y)?y:typeof y==`string`?[y]:[],x=b[0]||``,S=b.findIndex(e=>e===`episode`),C=S>=0?b[S+1]:b[2],w=Math.max(1,Number(C)||1),[T,E]=i(`video-detail-material-series-num-${x}`,w);c(()=>{E(w)},[w,E]),c(()=>{if(!x||typeof window>`u`)return;let e=e=>{if(!_(e))return;let t=e.detail;if(!t||t.detailId!==x)return;let n=h(t.seriesNum);E(e=>e===n?e:n)};return window.addEventListener(p,e),()=>{window.removeEventListener(p,e)}},[x,E]);let D=s(e=>{if(!x)return;let t=h(e);E(t),g({detailId:x,seriesNum:t})},[x,E]),O=Math.max(1,Number(T)||1),k=Math.max(0,O-1),A=b[1]||``,j=typeof window<`u`&&window.isWebView===!0,{data:M,isPending:N,isFetching:P,isError:F,isSuccess:I}=r([`video-detail-material-fallback`,x],async()=>x?await e({id:x}):null,{enabled:o&&u&&!!x}),L=l(()=>{let e=M?.data?.video;if(!(!e||typeof e!=`object`))return{...e,content_type:1,episode_cnt:e.links?.length||0}},[M?.data?.video]),R=s(e=>{let t=Math.max(1,Math.floor(Number(e)||1));if(!x||typeof window>`u`)return;let r=`/video/${x}/${encodeURIComponent(A)}/episode/${t}`,{search:i,hash:a,pathname:o}=window.location,s=`${o}${i}${a}`,c=`${r}${i}${a}`,l=m(o,x);if(s!==c){j&&n({detailId:x,seriesNum:t,nextPath:r}),l&&typeof window.history?.replaceState==`function`?(window.history.replaceState(window.history.state,``,c),D(t)):v.replace(c,{scroll:!1});return}O!==t&&D(t)},[O,x,j,A,v,D]);if(o)return{information:L,currentSeriesNum:O,onEpisodeChange:R,detailId:x,episodeIndex:k,resumeProgressSeconds:0,isShow:!0,isWebView:j,isInformationLoading:u?!!x&&!L&&(N||P):!1,isInformationResolved:!x||!!L||!u||F||I}}export{y as VideoDetailMaterialRuntimeProvider,b as useVideoDetailMaterialRuntimeContext};
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import e from"../../../../../utils/get-res-url.mjs";import{decryptImageToUint8Array as t}from"../../../../../utils/decrypt-image-client.mjs";import{pInteractionBrowse as n}from"../../../../../service/generated/client.mjs";import{uint8ArrayToBase64 as r}from"../../../../../utils/uint8.mjs";import{batchQueryContentInteractions as i}from"../../../../../hooks/use-content-operate.mjs";import{useCallback as a,useEffect as o,useMemo as s}from"react";function c(c){let{enabled:l=!0,detailId:u=``,information:d,episodeIndex:f=0,currentSeriesNum:p=1}=c,m=s(()=>String(u||d?.id||``).trim(),[u,d?.id]),h=a(async()=>{let n=d?.links?.[f]?.m3u8_url||``,i=n?`${process.env.NEXT_PUBLIC_API_BASE}/api/content/processM3u8?url=${encodeURIComponent(`${e()}/m3f/${n}`)}`:``,a=d?.img_y||d?.img_x||d?.preview_images?.[0]||``,o=``,s=await t(a);return s&&(o=r(s.bytes)),{poster:o,src:i,title:d?.name||``}},[f,d]),g=a(async()=>{if(!m)return null;let e=await i([m],1);return e?.interaction_list?.[0]?e.interaction_list[0].browse_record:null},[m]),_=a(async e=>{if(!m)return;let t=e.browse_episode||p,r=Date.now(),i=String(e.browse_key||r);try{await n({app_id:0,content_type:1,content_id:m,browse_duration:Number(e.browse_duration||0),browse_episode:String(t),browse_key:i,browse_page_ts:r})}catch(e){console.error(`上报播放进度失败:`,e)}},[p,m]);o(()=>{if(!l||typeof window>`u`)return;let e=window;return e.video=m?{[m]:d}:{},e.getVideoInfoAsync=h,e.getVideoBrowseRecordAsync=g,e.reportVideoBrowse=_,()=>{e.getVideoInfoAsync===h&&delete e.getVideoInfoAsync,e.getVideoBrowseRecordAsync===g&&delete e.getVideoBrowseRecordAsync,e.reportVideoBrowse===_&&delete e.reportVideoBrowse}},[g,h,l,d,_,m])}export{c as useVideoDetailWebViewBridge};
2
+ "use client";import e from"../../../../../utils/get-res-url.mjs";import{decryptImageToUint8Array as t}from"../../../../../utils/decrypt-image-client.mjs";import{pInteractionBrowse as n}from"../../../../../service/generated/client.mjs";import{uint8ArrayToBase64 as r}from"../../../../../utils/uint8.mjs";import{batchQueryContentInteractions as i}from"../../../../../hooks/use-content-operate.mjs";import{useCallback as a,useEffect as o,useMemo as s}from"react";function c(e){let t=String(e||``).split(`/`).filter(Boolean),n=t.findIndex(e=>e===`video`||e===`webview`);if(n<0)return``;try{return decodeURIComponent(t[n+1]||``)}catch{return t[n+1]||``}}function l(l){let{enabled:u=!0,detailId:d=``,information:f,episodeIndex:p=0,currentSeriesNum:m=1}=l,h=s(()=>String(d||f?.id||``).trim()||(typeof window<`u`?c(window.location.pathname):``),[d,f?.id]),g=a(()=>{let t=f?.links?.[p]?.m3u8_url||``,n=process.env.NEXT_PUBLIC_API_BASE||(typeof window<`u`?window.location.origin:``),r=t?`${e()}/m3f/${t}`:``,i=t&&n?`${n}/api/content/processM3u8?url=${encodeURIComponent(r)}`:``,a=f?.name||``;return{posterUrl:f?.img_y||f?.img_x||f?.preview_images?.[0]||``,src:i,title:a}},[p,f]),_=a(async()=>{let{src:e,title:n,posterUrl:i}=g(),a=``;if(i)try{let e=await t(i);e&&(a=r(e.bytes))}catch(e){console.warn(`[webview bridge] getVideoInfoAsync poster failed:`,e)}return{poster:a,src:e,title:n}},[g]),v=a(async()=>{if(!h)return null;let e=await i([h],1);return e?.interaction_list?.[0]?e.interaction_list[0].browse_record:null},[h]),y=a(async e=>{if(!h)return;let t=e.browse_episode||m,r=Date.now(),i=String(e.browse_key||r);try{await n({app_id:0,content_type:1,content_id:h,browse_duration:Number(e.browse_duration||0),browse_episode:String(t),browse_key:i,browse_page_ts:r})}catch(e){console.error(`上报播放进度失败:`,e)}},[m,h]);o(()=>{if(!u||typeof window>`u`)return;let e=window;return e.__funhubWebViewBridgeReady=!0,e.__funhubWebViewBridgeDetailId=h,e.video=h?{[h]:f}:{},e.getVideoInfo=g,e.getVideoInfoAsync=_,e.getVideoBrowseRecordAsync=v,e.reportVideoBrowse=y,window.dispatchEvent(new CustomEvent(`funhub:webview-bridge-ready`,{detail:{detailId:h}})),()=>{e.getVideoInfoAsync===_&&delete e.getVideoInfoAsync,e.getVideoInfo===g&&delete e.getVideoInfo,e.getVideoBrowseRecordAsync===v&&delete e.getVideoBrowseRecordAsync,e.reportVideoBrowse===y&&delete e.reportVideoBrowse}},[g,v,_,u,f,y,h])}export{l as useVideoDetailWebViewBridge};
@@ -1,7 +1,7 @@
1
1
 
2
+ import { DefineMaterialOption } from "../../../../../utils/schema/material.mjs";
2
3
  import { VideoDetailActionsClient } from "./client.mjs";
3
4
  import { VideoDetailActions } from "./server.mjs";
4
- import { DefineMaterialOption } from "../../../../../utils/schema/material.mjs";
5
5
  import "../../../../../utils.mjs";
6
6
  import * as zod from "zod";
7
7
  import * as zod_v4_core0 from "zod/v4/core";
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{SeriesEpisodes as e}from"../../../../common/series-episodes/index.mjs";import{DetailIntroduction as t}from"../shared/detail-introduction.mjs";import{editorPreviewInformation as n}from"../shared/editor-preview.mjs";import{useVideoDetailMaterialRuntimeContext as r}from"../shared/runtime-context-provider.mjs";import{jsx as i,jsxs as a}from"react/jsx-runtime";function o({showTags:o=!1,showEpisodes:s=!1,mode:c=`renderer`}){let l=r(),u=l?.information,d=l?.currentSeriesNum??1,f=l?.onEpisodeChange,p=l?.isShow??!0,m=c===`editor`,h=m?n:u;if(!h)return null;let g=Math.max(1,Number(d||1)),_=m?e=>{}:f??(()=>{}),v=h?.is_more_link===`y`&&(h?.links?.length??0)>1;return a(`div`,{className:m?`pointer-events-none`:void 0,children:[i(t,{information:h,isShow:p,showTags:o}),s&&v&&i(e,{mode:`detail`,series_num:g,information:h,onEpisodeChange:_})]})}export{o as VideoDetailInfoClient};
2
+ "use client";import{SeriesEpisodes as e}from"../../../../common/series-episodes/index.mjs";import{DetailIntroduction as t}from"../shared/detail-introduction.mjs";import{editorPreviewInformation as n}from"../shared/editor-preview.mjs";import{useVideoDetailMaterialRuntimeContext as r}from"../shared/runtime-context-provider.mjs";import{jsx as i,jsxs as a}from"react/jsx-runtime";function o({showTags:o=!1,showEpisodes:s=!0,mode:c=`renderer`}){let l=r(),u=l?.information,d=l?.currentSeriesNum??1,f=l?.onEpisodeChange,p=l?.isShow??!0,m=c===`editor`,h=m,g=h?n:u;if(!g)return null;let _=Math.max(1,Number(d||1)),v=h?e=>{}:f??(()=>{}),y=g?.is_more_link===`y`&&(g?.links?.length??0)>1;return a(`div`,{className:h?`pointer-events-none`:void 0,children:[i(t,{information:g,isShow:p,showTags:o}),(m||s)&&y&&i(e,{mode:`detail`,series_num:_,information:g,onEpisodeChange:v})]})}export{o as VideoDetailInfoClient};
@@ -1,8 +1,8 @@
1
1
 
2
- import { VideoDetailInfoClient } from "./client.mjs";
3
- import { VideoDetailInfo } from "./server.mjs";
4
2
  import { SchemaHasDefaultValue } from "../../../../../utils/schema/schema.mjs";
5
3
  import { DefineMaterialOption } from "../../../../../utils/schema/material.mjs";
4
+ import { VideoDetailInfoClient } from "./client.mjs";
5
+ import { VideoDetailInfo } from "./server.mjs";
6
6
  import "../../../../../utils.mjs";
7
7
  import * as zod from "zod";
8
8
  import * as zod_v4_core0 from "zod/v4/core";
@@ -1,2 +1,2 @@
1
1
 
2
- import{defineComponentPropsSchema as e,defineSwitchPropSchema as t,getSchemaDefaultProps as n}from"../../../../../utils/schema/schema.mjs";const r=e({showTags:t({label:`显示标签`,defaultValue:!1}),showEpisodes:t({label:`显示选集`,defaultValue:!1})});n(r);export{r as videoDetailInfoInspectorPropsSchema};
2
+ import{defineComponentPropsSchema as e,defineSwitchPropSchema as t,getSchemaDefaultProps as n}from"../../../../../utils/schema/schema.mjs";const r=e({showTags:t({label:`显示标签`,defaultValue:!1}),showEpisodes:t({label:`显示选集`,defaultValue:!0})});n(r);export{r as videoDetailInfoInspectorPropsSchema};
@@ -1,2 +1,2 @@
1
1
 
2
- import{VideoDetailMaterialRuntimeProvider as e}from"../shared/runtime-context-provider.mjs";import{VideoDetailInfoClient as t}from"./client.mjs";import{resolveVideoDetailRouteFromMaterialContext as n}from"../shared/material-route-context.mjs";import{getVideoDetailServerInformation as r}from"../shared/video-detail-server-data.mjs";import{jsx as i,jsxs as a}from"react/jsx-runtime";import o from"next/link";async function s(s){let{mode:l=`renderer`,showEpisodes:d=!1,detailId:f,currentSeriesNum:p,__route:m,...h}=s;if(l!==`renderer`)return i(t,{...h,showEpisodes:d,mode:l});let g=n(m),_=String(f||g.detailId||``).trim();if(!_)return i(t,{...h,showEpisodes:d,mode:l});let v=await r(_);if(!v)return i(t,{...h,showEpisodes:d,mode:l});let y=Math.max(1,Number(p||g.currentSeriesNum||1)),b=c(v),x=d&&v.is_more_link===`y`&&b.length>1;return a(e,{value:{information:v,detailId:_,currentSeriesNum:y,episodeIndex:Math.max(0,y-1),isShow:!0,isInformationLoading:!1,isInformationResolved:!0},children:[i(t,{...h,showEpisodes:!1,mode:l}),x&&i(`div`,{className:`w-full px-[12px] mt-[12px]`,children:i(`div`,{className:`flex flex-wrap gap-[8px]`,children:b.map(e=>{let t=e.seriesNum===y;return i(o,{href:u(_,v.name||``,e.seriesNum),className:`h-[28px] min-w-[40px] rounded-[6px] border px-[8px] text-[12px] leading-[26px] text-center ${t?`border-theme5 text-theme5 bg-theme5/10`:`border-line1 text-text2 bg-bg1`}`,children:e.label},e.key)})})})]})}function c(e){return(Array.isArray(e.links)?e.links:[]).map((e,t)=>{let n=e||{},r=typeof n.id==`string`?n.id:``,i=l(n.id,n.name,t+1);return{key:r||`episode-${i}-${t+1}`,seriesNum:i,label:`第${i}集`}})}function l(e,t,n){let r=Number(e);if(Number.isFinite(r)&&r>0)return Math.floor(r);let i=Number(t);return Number.isFinite(i)&&i>0?Math.floor(i):n}function u(e,t,n){return`/video/${e}/${encodeURIComponent(t||``)}/episode/${n}`}export{s as VideoDetailInfo};
2
+ import{VideoDetailMaterialRuntimeProvider as e}from"../shared/runtime-context-provider.mjs";import{VideoDetailInfoClient as t}from"./client.mjs";import{resolveVideoDetailRouteFromMaterialContext as n}from"../shared/material-route-context.mjs";import{getVideoDetailServerInformation as r}from"../shared/video-detail-server-data.mjs";import{jsx as i,jsxs as a}from"react/jsx-runtime";import o from"next/link";async function s(s){let{mode:l=`renderer`,showEpisodes:d=!0,detailId:f,currentSeriesNum:p,__route:m,...h}=s;if(l!==`renderer`)return i(t,{...h,showEpisodes:d,mode:l});let g=n(m),_=String(f||g.detailId||``).trim();if(!_)return i(t,{...h,showEpisodes:d,mode:l});let v=await r(_);if(!v)return i(t,{...h,showEpisodes:d,mode:l});let y=Math.max(1,Number(p||g.currentSeriesNum||1)),b=c(v),x=d&&v.is_more_link===`y`&&b.length>1;return a(e,{value:{information:v,detailId:_,currentSeriesNum:y,episodeIndex:Math.max(0,y-1),isShow:!0,isInformationLoading:!1,isInformationResolved:!0},children:[i(t,{...h,showEpisodes:!1,mode:l}),x&&i(`div`,{className:`w-full px-[12px] mt-[12px]`,children:i(`div`,{className:`flex flex-wrap gap-[8px]`,children:b.map(e=>{let t=e.seriesNum===y;return i(o,{href:u(_,v.name||``,e.seriesNum),className:`h-[28px] min-w-[40px] rounded-[6px] border px-[8px] text-[12px] leading-[26px] text-center ${t?`border-theme5 text-theme5 bg-theme5/10`:`border-line1 text-text2 bg-bg1`}`,children:e.label},e.key)})})})]})}function c(e){return(Array.isArray(e.links)?e.links:[]).map((e,t)=>{let n=e||{},r=typeof n.id==`string`?n.id:``,i=l(n.id,n.name,t+1);return{key:r||`episode-${i}-${t+1}`,seriesNum:i,label:`第${i}集`}})}function l(e,t,n){let r=Number(e);if(Number.isFinite(r)&&r>0)return Math.floor(r);let i=Number(t);return Number.isFinite(i)&&i>0?Math.floor(i):n}function u(e,t,n){return`/video/${e}/${encodeURIComponent(t||``)}/episode/${n}`}export{s as VideoDetailInfo};
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{Box as e}from"../../../../ui/box.mjs";import{SeriesEpisodes as t}from"../../../../common/series-episodes/index.mjs";import{useCardDecoration as n}from"../../../../../hooks/use-card-decoration.mjs";import{DetailInfoTags as r}from"../shared/detail-info-tags.mjs";import{DetailInfoTitle as i}from"../shared/detail-info-title.mjs";import{editorPreviewInformation as a}from"../shared/editor-preview.mjs";import{useVideoDetailMaterialRuntimeContext as o}from"../shared/runtime-context-provider.mjs";import{jsx as s,jsxs as c}from"react/jsx-runtime";function l({showTags:l=!0,showEpisodes:u=!0,mode:d=`renderer`}){let f=o(),p=f?.information,m=f?.currentSeriesNum??1,h=f?.onEpisodeChange,g=d===`editor`,{getTitleText:_}=n(),v=g,y=v?a:p;if(!y)return null;let b=Math.max(1,Number(m||1)),x=v?e=>{}:h??(()=>{}),S=_(y),C=y?.is_more_link===`y`&&(y?.links?.length??0)>1,w=l&&(y.tags?.length??0)>0,T=u&&C;return!S&&!w&&!T?null:c(e,{className:`w-full pt-[16px] ${v?`pointer-events-none`:``}`,children:[c(e,{className:`px-[12px]`,children:[S&&s(i,{title:S}),w&&s(r,{tags:y.tags||[],className:`mt-[12px]`})]}),T&&s(t,{mode:`detail`,series_num:b,information:y,onEpisodeChange:x})]})}export{l as VideoDetailInfoTitleTagsEpisodesClient};
2
+ "use client";import{Box as e}from"../../../../ui/box.mjs";import{SeriesEpisodes as t}from"../../../../common/series-episodes/index.mjs";import{useCardDecoration as n}from"../../../../../hooks/use-card-decoration.mjs";import{DetailInfoTags as r}from"../shared/detail-info-tags.mjs";import{DetailInfoTitle as i}from"../shared/detail-info-title.mjs";import{editorPreviewInformation as a}from"../shared/editor-preview.mjs";import{useVideoDetailMaterialRuntimeContext as o}from"../shared/runtime-context-provider.mjs";import{jsx as s,jsxs as c}from"react/jsx-runtime";function l({showTags:l=!0,showEpisodes:u=!0,mode:d=`renderer`}){let f=o(),p=f?.information,m=f?.currentSeriesNum??1,h=f?.onEpisodeChange,g=d===`editor`,{getTitleText:_}=n(),v=g,y=v?a:p;if(!y)return null;let b=Math.max(1,Number(m||1)),x=v?e=>{}:h??(()=>{}),S=_(y),C=y?.is_more_link===`y`&&(y?.links?.length??0)>1,w=l&&(y.tags?.length??0)>0,T=(g||u)&&C;return!S&&!w&&!T?null:c(e,{className:`w-full pt-[16px] ${v?`pointer-events-none`:``}`,children:[c(e,{className:`px-[12px]`,children:[S&&s(i,{title:S}),w&&s(r,{tags:y.tags||[],className:`mt-[12px]`})]}),T&&s(t,{mode:`detail`,series_num:b,information:y,onEpisodeChange:x})]})}export{l as VideoDetailInfoTitleTagsEpisodesClient};
@@ -1,8 +1,8 @@
1
1
 
2
- import { VideoDetailInfoTitleTagsEpisodesClient } from "./client.mjs";
3
- import { VideoDetailInfoTitleTagsEpisodes } from "./server.mjs";
4
2
  import { SchemaHasDefaultValue } from "../../../../../utils/schema/schema.mjs";
5
3
  import { DefineMaterialOption } from "../../../../../utils/schema/material.mjs";
4
+ import { VideoDetailInfoTitleTagsEpisodesClient } from "./client.mjs";
5
+ import { VideoDetailInfoTitleTagsEpisodes } from "./server.mjs";
6
6
  import "../../../../../utils.mjs";
7
7
  import * as zod from "zod";
8
8
  import * as zod_v4_core0 from "zod/v4/core";
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{pxToVw as e}from"../../../../../utils/helper.mjs";import{EmptyState as t}from"../../../../ui/empty.mjs";import{Skeleton as n}from"../../../../ui/skeleton.mjs";import{useRequest as r}from"../../../../../hooks/query/use-query.mjs";import{batchQueryContentInteractions as i}from"../../../../../hooks/use-content-operate.mjs";import a from"../../../../../assets/icons/detail/video_play.mjs";import o from"../../search-bar/variants/detail-search-bar/index.mjs";import{editorPreviewInformation as s}from"../shared/editor-preview.mjs";import{useVideoDetailMaterialRuntimeContext as c}from"../shared/runtime-context-provider.mjs";import{useVideoDetailWebViewBridge as l}from"../shared/use-video-detail-webview-bridge.mjs";import{DetailHero as u}from"../shared/video-hero.mjs";import{useMemo as d}from"react";import{Fragment as f,jsx as p,jsxs as m}from"react/jsx-runtime";import{useTranslations as h}from"next-intl";function g({mode:g=`renderer`,children:_}){let v=h(`components.pages.videoDetail`),y=c(),b=y?.information,x=y?.episodeIndex??0,S=y?.currentSeriesNum??1,C=y?.resumeProgressSeconds??0,w=y?.isWebView??!1,T=y?.isInformationLoading??!1,E=y?.isInformationResolved??!!b;l({enabled:g===`renderer`,detailId:y?.detailId||b?.id||``,information:b,episodeIndex:x,currentSeriesNum:S});let D=g===`editor`,O=D?{...s,id:``,mid:``}:b,k=D?0:x,A=O?.links?.[k]?.id||``,j=g===`renderer`&&!w&&!!O?.id,{data:M,isFetching:N,isFetchedAfterMount:P,isSuccess:F}=r(d(()=>[`video-detail-player-interaction`,O?.id,A,S],[A,S,O?.id]),async()=>O?.id?await i([O.id],1):null,{enabled:j,staleTime:0,refetchOnMount:`always`,refetchOnWindowFocus:!1}),I=d(()=>{if(!P||N||!F)return 0;let e=M?.interaction_list?.[0]?.browse_record,t=Number(e?.browse_duration||0);if(!Number.isFinite(t)||t<=0)return 0;let n=String(e?.browse_episode||``).trim();if(!n)return t;let r=Number.parseInt(n,10);return Number.isNaN(r)?0:r===S?t:0},[S,M,P,N,F]),L=D?0:I>0?I:C,R=O?.status===`1`;return D&&O?p(`div`,{className:`pointer-events-none`,children:p(u,{mode:g,isVideo:!0,information:O,episodeIndex:k,resumeProgressSeconds:L})}):m(`div`,{className:`w-full bg-bg2 text-text1 ${w?``:`pt-11`}`,children:[!w&&p(`div`,{className:`fixed h-[44px] bg-black top-0 left-0 right-0 z-[1000]`,children:p(o,{})}),m(`div`,{className:`mx-auto w-full max-w-[840px]`,children:[O&&!R&&p(t,{type:`no-content`,text:v(`videoDetailClient.videoUnavailable`)}),O&&R&&m(f,{children:[!w&&p(u,{mode:g,isVideo:!0,information:O,episodeIndex:k,resumeProgressSeconds:L}),_]}),!O&&T&&m(`div`,{className:`relative w-full overflow-hidden`,style:{height:e(241.875),maxHeight:e(242)},children:[p(n,{className:`h-full w-full rounded-none`}),p(`div`,{className:`absolute inset-0 z-[1] flex items-center justify-center pointer-events-none`,children:p(`div`,{className:`flex items-center justify-center w-10 h-10 rounded-full bg-[rgba(0,0,0,0.45)]`,children:p(a,{className:`w-[14px] h-[20px] text-white`})})})]}),!O&&!T&&E&&p(t,{type:`no-content`,text:v(`videoDetailClient.videoDeleted`)})]})]})}export{g as VideoDetailPlayerClient};
2
+ "use client";import{pxToVw as e}from"../../../../../utils/helper.mjs";import{EmptyState as t}from"../../../../ui/empty.mjs";import{Skeleton as n}from"../../../../ui/skeleton.mjs";import{useRequest as r}from"../../../../../hooks/query/use-query.mjs";import{batchQueryContentInteractions as i}from"../../../../../hooks/use-content-operate.mjs";import a from"../../../../../assets/icons/detail/video_play.mjs";import o from"../../search-bar/variants/detail-search-bar/index.mjs";import{editorPreviewInformation as s}from"../shared/editor-preview.mjs";import{useVideoDetailMaterialRuntimeContext as c}from"../shared/runtime-context-provider.mjs";import{DetailHero as l}from"../shared/video-hero.mjs";import{useMemo as u}from"react";import{Fragment as d,jsx as f,jsxs as p}from"react/jsx-runtime";import{useTranslations as m}from"next-intl";function h({mode:h=`renderer`,children:g}){let _=m(`components.pages.videoDetail`),v=c(),y=v?.information,b=v?.episodeIndex??0,x=v?.currentSeriesNum??1,S=v?.resumeProgressSeconds??0,C=v?.isWebView??!1,w=v?.isInformationLoading??!1,T=v?.isInformationResolved??!!y,E=h===`editor`,D=E?{...s,id:``,mid:``}:y,O=E?0:b,k=D?.links?.[O]?.id||``,A=h===`renderer`&&!C&&!!D?.id,{data:j,isFetching:M,isFetchedAfterMount:N,isSuccess:P}=r(u(()=>[`video-detail-player-interaction`,D?.id,k,x],[k,x,D?.id]),async()=>D?.id?await i([D.id],1):null,{enabled:A,staleTime:0,refetchOnMount:`always`,refetchOnWindowFocus:!1}),F=u(()=>{if(!N||M||!P)return 0;let e=j?.interaction_list?.[0]?.browse_record,t=Number(e?.browse_duration||0);if(!Number.isFinite(t)||t<=0)return 0;let n=String(e?.browse_episode||``).trim();if(!n)return t;let r=Number.parseInt(n,10);return Number.isNaN(r)?0:r===x?t:0},[x,j,N,M,P]),I=E?0:F>0?F:S,L=D?.status===`1`;return E&&D?f(`div`,{className:`pointer-events-none`,children:f(l,{mode:h,isVideo:!0,information:D,episodeIndex:O,resumeProgressSeconds:I})}):p(`div`,{className:`w-full bg-bg2 text-text1 ${C?``:`pt-11`}`,children:[!C&&f(`div`,{className:`fixed h-[44px] bg-black top-0 left-0 right-0 z-[1000]`,children:f(o,{})}),p(`div`,{className:`mx-auto w-full max-w-[840px]`,children:[D&&!L&&f(t,{type:`no-content`,text:_(`videoDetailClient.videoUnavailable`)}),D&&L&&p(d,{children:[!C&&f(l,{mode:h,isVideo:!0,information:D,episodeIndex:O,resumeProgressSeconds:I}),g]}),!D&&w&&p(`div`,{className:`relative w-full overflow-hidden`,style:{height:e(241.875),maxHeight:e(242)},children:[f(n,{className:`h-full w-full rounded-none`}),f(`div`,{className:`absolute inset-0 z-[1] flex items-center justify-center pointer-events-none`,children:f(`div`,{className:`flex items-center justify-center w-10 h-10 rounded-full bg-[rgba(0,0,0,0.45)]`,children:f(a,{className:`w-[14px] h-[20px] text-white`})})})]}),!D&&!w&&T&&f(t,{type:`no-content`,text:_(`videoDetailClient.videoDeleted`)})]})]})}export{h as VideoDetailPlayerClient};
@@ -0,0 +1,12 @@
1
+
2
+ import { VideoDetailPlayerBridgeOnlyProps } from "./schema.mjs";
3
+
4
+ //#region components/biz/business/detail/video-detail-player-bridge-only/client.d.ts
5
+ /**
6
+ * WebView 桥接播放器物料客户端组件:
7
+ * - 仅注入 Bridge 所需全局方法
8
+ * - 不渲染 UI(return null)
9
+ */
10
+ declare function VideoDetailPlayerBridgeOnlyClient(props: VideoDetailPlayerBridgeOnlyProps): null;
11
+ //#endregion
12
+ export { VideoDetailPlayerBridgeOnlyClient };
@@ -0,0 +1,2 @@
1
+
2
+ "use client";import{useVideoDetailMaterialRuntimeContext as e}from"../shared/runtime-context-provider.mjs";import{useVideoDetailWebViewBridge as t}from"../shared/use-video-detail-webview-bridge.mjs";function n(n){let r=e();return t({enabled:!0,detailId:r?.detailId||r?.information?.id||``,information:r?.information??null,episodeIndex:r?.episodeIndex??0,currentSeriesNum:r?.currentSeriesNum??1}),null}export{n as VideoDetailPlayerBridgeOnlyClient};
@@ -0,0 +1,5 @@
1
+
2
+ import { VideoDetailPlayerBridgeOnlyInspectorProps, VideoDetailPlayerBridgeOnlyProps, videoDetailPlayerBridgeOnlyInspectorPropsSchema } from "./schema.mjs";
3
+ import { VideoDetailPlayerBridgeOnlyClient } from "./client.mjs";
4
+ import { VideoDetailPlayerBridgeOnly } from "./server.mjs";
5
+ import { videoDetailPlayerBridgeOnlyMaterial } from "./material.mjs";
@@ -0,0 +1,17 @@
1
+
2
+ import { DefineMaterialOption } from "../../../../../utils/schema/material.mjs";
3
+ import "../../../../../utils/schema/index.mjs";
4
+ import { VideoDetailPlayerBridgeOnlyClient } from "./client.mjs";
5
+ import { VideoDetailPlayerBridgeOnly } from "./server.mjs";
6
+ import * as zod from "zod";
7
+ import * as zod_v4_core0 from "zod/v4/core";
8
+
9
+ //#region components/biz/business/detail/video-detail-player-bridge-only/material.d.ts
10
+ declare const videoDetailPlayerBridgeOnlyMaterial: DefineMaterialOption<typeof VideoDetailPlayerBridgeOnly, typeof VideoDetailPlayerBridgeOnlyClient, zod.ZodObject<{
11
+ mode: zod.ZodOptional<zod.ZodEnum<{
12
+ renderer: "renderer";
13
+ editor: "editor";
14
+ }>>;
15
+ }, zod_v4_core0.$strip>, "video-detail-player-bridge-only", "视频模块">;
16
+ //#endregion
17
+ export { videoDetailPlayerBridgeOnlyMaterial };
@@ -0,0 +1,2 @@
1
+
2
+ import{defineMaterial as e}from"../../../../../utils/schema/material.mjs";import{VideoDetailPlayerBridgeOnlyClient as t}from"./client.mjs";import{videoDetailPlayerBridgeOnlyInspectorPropsSchema as n}from"./schema.mjs";import{VideoDetailPlayerBridgeOnly as r}from"./server.mjs";const i=e({type:`video-detail-player-bridge-only`,name:`播放器桥接(仅 WebView)`,icon:`/static/components-thumb/video_player.png`,category:`视频模块`,serverComponent:r,clientComponent:t,propsSchema:n});export{i as videoDetailPlayerBridgeOnlyMaterial};
@@ -0,0 +1,23 @@
1
+
2
+ import { InferSchemaProps } from "../../../../../utils/schema/schema.mjs";
3
+ import "../../../../../utils/schema/index.mjs";
4
+ import * as zod from "zod";
5
+ import * as zod_v4_core0 from "zod/v4/core";
6
+
7
+ //#region components/biz/business/detail/video-detail-player-bridge-only/schema.d.ts
8
+ /**
9
+ * WebView 桥接播放器物料:
10
+ * - 不渲染任何 UI
11
+ * - 仅在 WebView 场景注入 `getVideoInfoAsync/getVideoBrowseRecordAsync/reportVideoBrowse` 等全局方法
12
+ */
13
+ declare const videoDetailPlayerBridgeOnlyInspectorPropsSchema: zod.ZodObject<{
14
+ mode: zod.ZodOptional<zod.ZodEnum<{
15
+ renderer: "renderer";
16
+ editor: "editor";
17
+ }>>;
18
+ }, zod_v4_core0.$strip>;
19
+ type VideoDetailPlayerBridgeOnlyInspectorProps = InferSchemaProps<typeof videoDetailPlayerBridgeOnlyInspectorPropsSchema>;
20
+ /** WebView 桥接播放器物料 props。 */
21
+ interface VideoDetailPlayerBridgeOnlyProps extends VideoDetailPlayerBridgeOnlyInspectorProps {}
22
+ //#endregion
23
+ export { VideoDetailPlayerBridgeOnlyInspectorProps, VideoDetailPlayerBridgeOnlyProps, videoDetailPlayerBridgeOnlyInspectorPropsSchema };
@@ -0,0 +1,2 @@
1
+
2
+ import{defineComponentPropsSchema as e,getSchemaDefaultProps as t}from"../../../../../utils/schema/schema.mjs";const n=e({});t(n);export{n as videoDetailPlayerBridgeOnlyInspectorPropsSchema};
@@ -0,0 +1,11 @@
1
+
2
+ import { VideoDetailPlayerBridgeOnlyProps } from "./schema.mjs";
3
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
4
+
5
+ //#region components/biz/business/detail/video-detail-player-bridge-only/server.d.ts
6
+ /**
7
+ * WebView 桥接播放器物料服务端组件。
8
+ */
9
+ declare function VideoDetailPlayerBridgeOnly(props: VideoDetailPlayerBridgeOnlyProps): react_jsx_runtime0.JSX.Element;
10
+ //#endregion
11
+ export { VideoDetailPlayerBridgeOnly };
@@ -0,0 +1,2 @@
1
+
2
+ import{VideoDetailPlayerBridgeOnlyClient as e}from"./client.mjs";import{jsx as t}from"react/jsx-runtime";function n(n){let{mode:r=`renderer`,...i}=n;return t(e,{...i,mode:r})}export{n as VideoDetailPlayerBridgeOnly};
@@ -1,8 +1,8 @@
1
1
 
2
- import { VideoDetailRecommendClient } from "./client.mjs";
3
- import { VideoDetailRecommend } from "./server.mjs";
4
2
  import { SchemaHasDefaultValue } from "../../../../../utils/schema/schema.mjs";
5
3
  import { DefineMaterialOption } from "../../../../../utils/schema/material.mjs";
4
+ import { VideoDetailRecommendClient } from "./client.mjs";
5
+ import { VideoDetailRecommend } from "./server.mjs";
6
6
  import "../../../../../utils.mjs";
7
7
  import * as zod from "zod";
8
8
  import * as zod_v4_core0 from "zod/v4/core";
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{pContentGetPopularVideoList as e}from"../../../../../service/generated/client.mjs";import{Image as t}from"../../../../ui/image.mjs";import{Box as n}from"../../../../ui/box.mjs";import{Text as r}from"../../../../ui/text.mjs";import i from"../../../../../assets/icons/detail/video_flag.mjs";import{MiniThreeCard as a}from"../../../../common/cards/mini-three-card.mjs";import{HOME_RECOMMEND_DEFAULT_GRID_COLUMNS as o,HOME_RECOMMEND_DEFAULT_GRID_ROWS as s,HOME_RECOMMEND_DEFAULT_PLAY_COUNT_DELTA as c,HOME_RECOMMEND_DEFAULT_SHOW_EPISODE as l,HOME_RECOMMEND_DEFAULT_SHOW_PLAY_COUNT as u,HOME_RECOMMEND_MAX_GRID_COLUMNS as ee,HOME_RECOMMEND_MAX_GRID_ROWS as te}from"./home-recommend-default-config.mjs";import{HOME_RECOMMEND_CARD_CONFIG_FIELD as d}from"./home-recommend-preview.mjs";import{useCallback as f,useEffect as p,useLayoutEffect as m,useMemo as h,useRef as g,useState as _}from"react";import{jsx as v,jsxs as y}from"react/jsx-runtime";import{useRouter as ne}from"next/navigation";const re={},ie={list:[]};function b({variant:t,props:i=re,data:a=ie,mode:d=`renderer`}){let b=d===`editor`,S=ne(),{list:C,title:se,cursor:T}=a,E=h(()=>Array.isArray(C)?C:[],[C]),D=h(()=>Array.isArray(a.icons)?a.icons:[],[a.icons]),{rows:O,columns:ce,moreLink:k,title:A,smartTagEnabled:j,smartTagIds:M,catId:ue,showPlayCount:de,playCountDelta:fe,showEpisode:pe,enableInfinite:me}=i,F=me===!0&&j===!0,I=!b&&F&&E.length>=16,L=h(()=>Array.isArray(M)?M.map(e=>String(e||``).trim()).filter(Boolean):[],[M]),R=typeof ue==`string`?ue.trim():``,[z,he]=_(0),[ge,_e]=_(E),[ve,ye]=_(D),[B,V]=_(()=>N(T)),[be,xe]=_(!1),Se=g(null),H=g(null),U=g(!1);p(()=>{_e(E),ye(D),V(N(T))},[T,D,E]);let Ce=oe(O,s,te),W=oe(ce,o,ee),G=F?16:t===`grid`?Ce*W:16,we=Ce*W,Te=b&&t===`grid`,K=Te?ge.slice(0,we):ge,q=Te?ve.slice(0,we):ve,Ee=t===`waterfall`?6:4,J=K.length>0?Math.max(0,K.length-Ee):-1,De=!!B,Oe=A&&A.trim()||se||``,Y=de??u,X=Number(fe??c),Z=pe??l,ke=!F,Q=ke?ae(k):``,Ae=ke&&!!Q,je=f(async()=>{let t=B;if(!(!I||!t||U.current)){U.current=!0,xe(!0);try{let n=await e({cursor:t,page_size:G,tags:L.length>0?L:void 0,cat_id:R||void 0}),r=Array.isArray(n.data?.videos)?n.data.videos:[],i=N(n.data?.cursor);r.length>0&&_e(e=>e.concat(r)),V(e=>{if(!(!r.length||!i))return i===e?void 0:i})}catch(e){console.error(`推荐位加载下一页失败(client)`,e),V(void 0)}finally{U.current=!1,xe(!1)}}},[B,R,G,L,I]),Me=f(()=>{Q&&(Q.startsWith(`http`)?window.location.href=Q:S.push(Q))},[Q,S]);p(()=>{let e=H.current;if(!e||!I||!De)return;let t=new IntersectionObserver(e=>{!e[0]?.isIntersecting||be||je()},{root:null,threshold:0});return t.observe(e),()=>{t.disconnect()}},[je,De,be,K.length,G,I,J]),m(()=>{let e=Se.current;if(!e||t!==`waterfall`)return;let n=()=>{let t=e.clientWidth||0;he(t>0?(t-12)/2:0)};n();let r=new ResizeObserver(n);return r.observe(e),()=>{r.disconnect()}},[t]);let $=h(()=>t===`waterfall`?le(K,q,z):{left:[],right:[]},[z,q,K,t]);return K.length?y(n,{className:`w-full mt-[16px]`,children:[y(n,{className:`flex items-center justify-between px-[12px] mb-[8px]`,children:[v(r,{className:`flex-1 min-w-0 text-text1 text-[18px] leading-[26px] font-bold line-clamp-1`,children:Oe}),Ae&&v(r,{className:`text-text3 text-[12px] leading-[18px] cursor-pointer`,onClick:Me,children:`更多`})]}),t===`grid`&&v(n,{className:`w-full flex flex-wrap px-[12px]`,children:K.map((e,n)=>{let r=q[n],i=w(e),a=Y&&(i?.showPlayCount??!0),o=i?.playCountDelta??X,s=i?.showEpisode??Z,c=n%W,l=W>1?{paddingLeft:12*c/W,paddingRight:12*(W-c-1)/W}:void 0;return v(`div`,{ref:n===J?H:void 0,className:`min-w-0`,style:{width:`${100/W}%`,...l||{}},children:v(x,{variant:t,item:e,icon:r,index:n,showPlayCount:a,playCountDelta:o,showEpisode:s,widthStyle:{width:`100%`}})},P(e,n))})}),t===`waterfall`&&y(n,{ref:Se,className:`w-full px-[12px] flex gap-[12px]`,children:[v(n,{className:`flex-1 min-w-0 flex flex-col`,children:$.left.map(e=>{let n=w(e.item),r=Y&&(n?.showPlayCount??!0),i=n?.playCountDelta??X,a=n?.showEpisode??Z;return v(`div`,{ref:e.index===J?H:void 0,children:v(x,{variant:t,item:e.item,icon:e.icon,index:e.index,showPlayCount:r,playCountDelta:i,showEpisode:a,widthStyle:{width:`100%`}})},P(e.item,e.index))})}),v(n,{className:`flex-1 min-w-0 flex flex-col`,children:$.right.map(e=>{let n=w(e.item),r=Y&&(n?.showPlayCount??!0),i=n?.playCountDelta??X,a=n?.showEpisode??Z;return v(`div`,{ref:e.index===J?H:void 0,children:v(x,{variant:t,item:e.item,icon:e.icon,index:e.index,showPlayCount:r,playCountDelta:i,showEpisode:a,widthStyle:{width:`100%`}})},P(e.item,e.index))})})]})]}):null}function x({variant:e,item:t,icon:o,index:s,showPlayCount:c,playCountDelta:l,showEpisode:u,widthStyle:ee}){let te=se(t),d=t.name||t?.title||``,f=O(ce(t.static?.browse_cnt??0,l)),p=E(t,u),m=j(t,o,s);return v(a,{url:te,text:d,className:`w-full`,style:ee,topRightChild:m?v(S,{url:m}):void 0,bottomLeftChild:c?y(n,{className:`h-[20px] leading-[20px] text-[#fff] text-[12px] px-[4px] rounded-[4px] bg-[#333] ml-[4px] flex items-center`,children:[v(i,{className:`w-[16px] h-[auto] text-[#fff] mr-[4px]`}),f]}):null,bottomRightChild:u?p&&v(r,{className:`text-[#fff] text-[12px] leading-[18px] pr-2`,children:p}):null,textChild:v(n,{className:`py-[4px]`,children:v(r,{as:`h3`,className:`text-text1 text-[16px] leading-[24px] ${e===`waterfall`?`break-words line-clamp-3`:`line-clamp-1`}`,children:d})}),linkPath:C(t)})}function S({url:e}){return v(n,{className:`relative w-[40px] h-[20px]`,children:v(t,{src:e,alt:`corner`,width:40,height:20,className:`w-full h-auto`})})}function C(e){let t=encodeURIComponent(e.name||``);return`/video/${e.id||``}/${t}/episode/1`}function ae(e){return e?e.trim():``}function oe(e,t,n){let r=Number(e);return!Number.isFinite(r)||r<=0?t:Math.min(n,Math.floor(r))}function w(e){return e[d]}function se(e){return e.img_y||e.img_x||e?.coverUrl}function T(e){return typeof e==`string`?e:``}function E(e,t){if(!t)return``;if(D(e)){let t=Number(e.episode_cnt||e.links?.length||0);return t>0?`全${t}集`:``}return A(Number(e.duration||0))}function D(e){if(Number(e.type??0)===2)return!0;let t=Number(e.episode_cnt||e.links?.length||0);return Number.isFinite(t)&&t>1}function O(e){return!Number.isFinite(e)||e<=0?`0`:e>=1e6?`${k(e/1e6)}M`:e>=1e3?`${k(e/1e3)}k`:Math.floor(e).toString()}function ce(e,t){let n=Number(e||0),r=Number(t||0);return!Number.isFinite(n)||!Number.isFinite(r)?0:Math.max(0,n+r)}function k(e){let t=e.toFixed(1);return t.endsWith(`.0`)?t.slice(0,-2):t}function A(e){if(!Number.isFinite(e)||e<=0)return``;let t=Math.floor(e),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=e=>String(e).padStart(2,`0`);return n>0?`${a(n)}:${a(r)}:${a(i)}`:`${a(r)}:${a(i)}`}function j(e,t,n){return T(e.badge_url)||T(t?.material_url)||``}function le(e,t,n){let r=[],i=[],a=n<=0,o=0,s=0;return e.forEach((e,c)=>{let l=t[c];if(a){c%2==0?r.push({item:e,icon:l,index:c}):i.push({item:e,icon:l,index:c});return}let u=M(n,e);o<=s?(r.push({item:e,icon:l,index:c}),o+=u):(i.push({item:e,icon:l,index:c}),s+=u)}),{left:r,right:i}}function M(e,t){if(!e)return 0;let n=e*1.3461538461538463,r=E(t,!0)?18:0;return n+20+r+6+16}function N(e){if(typeof e==`string`)return e.trim()||void 0}function P(e,t){return e.id?`home-recommend-${e.id}`:`home-recommend-${t}`}export{b as default};
2
+ "use client";import{pContentGetPopularVideoList as e}from"../../../../../service/generated/client.mjs";import{useRouter as t}from"../../../../../utils/use-compatible-router.mjs";import{Image as n}from"../../../../ui/image.mjs";import{Box as r}from"../../../../ui/box.mjs";import{Text as i}from"../../../../ui/text.mjs";import a from"../../../../../assets/icons/detail/video_flag.mjs";import{MiniThreeCard as o}from"../../../../common/cards/mini-three-card.mjs";import{HOME_RECOMMEND_DEFAULT_GRID_COLUMNS as s,HOME_RECOMMEND_DEFAULT_GRID_ROWS as c,HOME_RECOMMEND_DEFAULT_PLAY_COUNT_DELTA as l,HOME_RECOMMEND_DEFAULT_SHOW_EPISODE as u,HOME_RECOMMEND_DEFAULT_SHOW_PLAY_COUNT as ee,HOME_RECOMMEND_MAX_GRID_COLUMNS as d,HOME_RECOMMEND_MAX_GRID_ROWS as f}from"./home-recommend-default-config.mjs";import{HOME_RECOMMEND_CARD_CONFIG_FIELD as p}from"./home-recommend-preview.mjs";import{useCallback as m,useEffect as h,useLayoutEffect as te,useMemo as g,useRef as _,useState as v}from"react";import{jsx as y,jsxs as b}from"react/jsx-runtime";const ne={},re={list:[]};function x({variant:n,props:a=ne,data:o=re,mode:p=`renderer`}){let x=p===`editor`,C=t(),{list:w,title:oe,cursor:E}=o,D=g(()=>Array.isArray(w)?w:[],[w]),O=g(()=>Array.isArray(o.icons)?o.icons:[],[o.icons]),{rows:k,columns:se,moreLink:A,title:j,smartTagEnabled:M,smartTagIds:N,catId:le,showPlayCount:ue,playCountDelta:de,showEpisode:fe,enableInfinite:pe}=a,I=pe===!0&&M===!0,L=!x&&I&&D.length>=16,R=g(()=>Array.isArray(N)?N.map(e=>String(e||``).trim()).filter(Boolean):[],[N]),z=typeof le==`string`?le.trim():``,[B,me]=v(0),[he,ge]=v(D),[_e,ve]=v(O),[V,H]=v(()=>P(E)),[ye,be]=v(!1),xe=_(null),U=_(null),W=_(!1);h(()=>{ge(D),ve(O),H(P(E))},[E,O,D]);let Se=ae(k,c,f),G=ae(se,s,d),K=I?16:n===`grid`?Se*G:16,Ce=Se*G,we=x&&n===`grid`,q=we?he.slice(0,Ce):he,J=we?_e.slice(0,Ce):_e,Te=n===`waterfall`?6:4,Y=q.length>0?Math.max(0,q.length-Te):-1,Ee=!!V,De=j&&j.trim()||oe||``,X=ue??ee,Z=Number(de??l),Q=fe??u,Oe=!I,$=Oe?ie(A):``,ke=Oe&&!!$,Ae=m(async()=>{let t=V;if(!(!L||!t||W.current)){W.current=!0,be(!0);try{let n=await e({cursor:t,page_size:K,tags:R.length>0?R:void 0,cat_id:z||void 0}),r=Array.isArray(n.data?.videos)?n.data.videos:[],i=P(n.data?.cursor);r.length>0&&ge(e=>e.concat(r)),H(e=>{if(!(!r.length||!i))return i===e?void 0:i})}catch(e){console.error(`推荐位加载下一页失败(client)`,e),H(void 0)}finally{W.current=!1,be(!1)}}},[V,z,K,R,L]),je=m(()=>{if($){if($.startsWith(`http`)){window.location.href=$;return}C.push($)}},[$,C]);h(()=>{let e=U.current;if(!e||!L||!Ee)return;let t=new IntersectionObserver(e=>{!e[0]?.isIntersecting||ye||Ae()},{root:null,threshold:0});return t.observe(e),()=>{t.disconnect()}},[Ae,Ee,ye,q.length,K,L,Y]),te(()=>{let e=xe.current;if(!e||n!==`waterfall`)return;let t=()=>{let t=e.clientWidth||0;me(t>0?(t-12)/2:0)};t();let r=new ResizeObserver(t);return r.observe(e),()=>{r.disconnect()}},[n]);let Me=g(()=>n===`waterfall`?ce(q,J,B):{left:[],right:[]},[B,J,q,n]);return q.length?b(r,{className:`w-full mt-[16px]`,children:[b(r,{className:`flex items-center justify-between px-[12px] mb-[8px]`,children:[y(i,{className:`flex-1 min-w-0 text-text1 text-[18px] leading-[26px] font-bold line-clamp-1`,children:De}),ke&&y(i,{className:`text-text3 text-[12px] leading-[18px] cursor-pointer`,onClick:je,children:`更多`})]}),n===`grid`&&y(r,{className:`w-full flex flex-wrap px-[12px]`,children:q.map((e,t)=>{let r=J[t],i=T(e),a=X&&(i?.showPlayCount??!0),o=i?.playCountDelta??Z,s=i?.showEpisode??Q,c=t%G,l=G>1?{paddingLeft:12*c/G,paddingRight:12*(G-c-1)/G}:void 0;return y(`div`,{ref:t===Y?U:void 0,className:`min-w-0`,style:{width:`${100/G}%`,...l||{}},children:y(S,{variant:n,item:e,icon:r,index:t,showPlayCount:a,playCountDelta:o,showEpisode:s,widthStyle:{width:`100%`}})},F(e,t))})}),n===`waterfall`&&b(r,{ref:xe,className:`w-full px-[12px] flex gap-[12px]`,children:[y(r,{className:`flex-1 min-w-0 flex flex-col`,children:Me.left.map(e=>{let t=T(e.item),r=X&&(t?.showPlayCount??!0),i=t?.playCountDelta??Z,a=t?.showEpisode??Q;return y(`div`,{ref:e.index===Y?U:void 0,children:y(S,{variant:n,item:e.item,icon:e.icon,index:e.index,showPlayCount:r,playCountDelta:i,showEpisode:a,widthStyle:{width:`100%`}})},F(e.item,e.index))})}),y(r,{className:`flex-1 min-w-0 flex flex-col`,children:Me.right.map(e=>{let t=T(e.item),r=X&&(t?.showPlayCount??!0),i=t?.playCountDelta??Z,a=t?.showEpisode??Q;return y(`div`,{ref:e.index===Y?U:void 0,children:y(S,{variant:n,item:e.item,icon:e.icon,index:e.index,showPlayCount:r,playCountDelta:i,showEpisode:a,widthStyle:{width:`100%`}})},F(e.item,e.index))})})]})]}):null}function S({variant:e,item:t,icon:n,index:s,showPlayCount:c,playCountDelta:l,showEpisode:u,widthStyle:ee}){let d=oe(t),f=t.name||t?.title||``,p=k(se(t.static?.browse_cnt??0,l)),m=D(t,u),h=M(t,n,s);return y(o,{url:d,text:f,className:`w-full`,style:ee,topRightChild:h?y(C,{url:h}):void 0,bottomLeftChild:c?b(r,{className:`h-[20px] leading-[20px] text-[#fff] text-[12px] px-[4px] rounded-[4px] bg-[#333] ml-[4px] flex items-center`,children:[y(a,{className:`w-[16px] h-[auto] text-[#fff] mr-[4px]`}),p]}):null,bottomRightChild:u?m&&y(i,{className:`text-[#fff] text-[12px] leading-[18px] pr-2`,children:m}):null,textChild:y(r,{className:`py-[4px]`,children:y(i,{as:`h3`,className:`text-text1 text-[16px] leading-[24px] ${e===`waterfall`?`break-words line-clamp-3`:`line-clamp-1`}`,children:f})}),linkPath:w(t)})}function C({url:e}){return y(r,{className:`relative w-[40px] h-[20px]`,children:y(n,{src:e,alt:`corner`,width:40,height:20,className:`w-full h-auto`})})}function w(e){let t=encodeURIComponent(e.name||``);return`/video/${e.id||``}/${t}/episode/1`}function ie(e){return e?e.trim():``}function ae(e,t,n){let r=Number(e);return!Number.isFinite(r)||r<=0?t:Math.min(n,Math.floor(r))}function T(e){return e[p]}function oe(e){return e.img_y||e.img_x||e?.coverUrl}function E(e){return typeof e==`string`?e:``}function D(e,t){if(!t)return``;if(O(e)){let t=e.update_status===`0`,n=Number(e.episode_cnt||e.links?.length||0);return n>0?`${t?`更新至`:`全`}${n}集`:``}return j(Number(e.duration||0))}function O(e){if(Number(e.type??0)===2)return!0;let t=Number(e.episode_cnt||e.links?.length||0);return Number.isFinite(t)&&t>1}function k(e){return!Number.isFinite(e)||e<=0?`0`:e>=1e6?`${A(e/1e6)}M`:e>=1e3?`${A(e/1e3)}k`:Math.floor(e).toString()}function se(e,t){let n=Number(e||0),r=Number(t||0);return!Number.isFinite(n)||!Number.isFinite(r)?0:Math.max(0,n+r)}function A(e){let t=e.toFixed(1);return t.endsWith(`.0`)?t.slice(0,-2):t}function j(e){if(!Number.isFinite(e)||e<=0)return``;let t=Math.floor(e),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=e=>String(e).padStart(2,`0`);return n>0?`${a(n)}:${a(r)}:${a(i)}`:`${a(r)}:${a(i)}`}function M(e,t,n){return E(e.badge_url)||E(t?.material_url)||``}function ce(e,t,n){let r=[],i=[],a=n<=0,o=0,s=0;return e.forEach((e,c)=>{let l=t[c];if(a){c%2==0?r.push({item:e,icon:l,index:c}):i.push({item:e,icon:l,index:c});return}let u=N(n,e);o<=s?(r.push({item:e,icon:l,index:c}),o+=u):(i.push({item:e,icon:l,index:c}),s+=u)}),{left:r,right:i}}function N(e,t){if(!e)return 0;let n=e*1.3461538461538463,r=D(t,!0)?18:0;return n+20+r+6+16}function P(e){if(typeof e==`string`)return e.trim()||void 0}function F(e,t){return e.id?`home-recommend-${e.id}`:`home-recommend-${t}`}export{x as default};
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{Image as e}from"../../../ui/image.mjs";import{Box as t}from"../../../ui/box.mjs";import{Text as n}from"../../../ui/text.mjs";import r from"../../../../assets/icons/right_arrow.mjs";import i from"../../../../assets/images/marquee.mjs";import a from"./marquee.module.mjs";import{defaultMarqueePeriod as o}from"./schema.mjs";import{useEffect as s,useMemo as c,useRef as l,useState as u}from"react";import{X as d}from"lucide-react";import{jsx as f,jsxs as p}from"react/jsx-runtime";import{useTranslations as m}from"next-intl";import{useRouter as h}from"next/navigation";const g=[],_=`marquee_list`;let v=null;function y(e,t=20){let n=Array.from(e);return n.length<=t?e:`${n.slice(0,t).join(``)}...`}function b(e,t){if(!e)return!1;if(t===`once`)return!0;let n=new Date(e),r=new Date;return n.getFullYear()===r.getFullYear()&&n.getMonth()===r.getMonth()&&n.getDate()===r.getDate()}function x(){if(v)return v;let e=localStorage.getItem(_);if(!e)return v={},{};try{let t=JSON.parse(e);if(!t||typeof t!=`object`)return{};let n={};return Object.entries(t).forEach(([e,t])=>{if(!t||typeof t!=`object`)return;let r=t.closedAt;typeof r!=`number`||Number.isNaN(r)||(n[e]={closedAt:r})}),v=n,n}catch{return v={},{}}}function S(e){v=e,localStorage.setItem(_,JSON.stringify(e))}function C(e){return x()[e]??{}}function w(e,t){S({...x(),[e]:t})}function T(e,t){return b(e.closedAt,t)}function E(_){let v=m(`components.biz.business.marquee`),{marqueeKey:b,contents:x=g,click:S,close:E,displayStrategy:D,mode:O=`renderer`}=_,k=O===`editor`,A=h(),j=l(!1),[M,N]=u(k),[P,F]=u(k),[I,L]=u(!1),[R,z]=u(0);s(()=>{L(!0)},[]);let B=c(()=>{let e=D?.period??o,t=e.start,n=e.end;if(!t&&!n)return!0;let r=Date.now(),i=t?new Date(t).getTime():0,a=n?new Date(n).getTime():2**53-1;return r>=i&&r<=a},[D?.period]),V=c(()=>(x??[]).map(e=>({...e,text:y(String(e?.text??``))})).filter(e=>!!e.text),[x]),H=b?.trim()??``;if(s(()=>{z(0)},[c(()=>V.map(e=>`${e.text??``}::${e.link??``}`).join(`|`),[V]),H]),s(()=>{k||H||j.current||process.env.NODE_ENV===`production`||(j.current=!0,console.warn(`[MarqueeClient] marqueeKey is required in renderer mode.`))},[k,H]),s(()=>{if(I){if(k){N(!0),F(!0);return}if(!D?.rule||!B||V.length===0){N(!1),F(!0);return}if(!H){N(!1),F(!0);return}N(!T(C(H),D.rule)),F(!0)}},[D?.rule,k,I,B,V.length,H]),!k&&(!I||!P||!M||!B)||V.length===0)return null;let U=V[R%V.length],W=S?.enabled===!0,G=S?.link||U.link,K=W&&!!G,q=E?.enabled===!0;function J(){!H||!D?.rule||V.length===0||w(H,{...C(H),closedAt:Date.now()})}let Y=e=>{e.stopPropagation(),N(!1),J()},X=()=>{k||K&&G&&A.push(G)},Z=()=>{k||!M||V.length<=1||z(e=>(e+1)%V.length)},Q=k?a[`marquee-item-paused`]:V.length>1?a[`marquee-item-once`]:a[`marquee-item-loop`];return f(t,{className:k?`px-3 py-2 w-full bg-bg1 pointer-events-none`:`px-3 py-2 w-full bg-bg1`,children:p(t,{className:`pl-[2px] pr-[12px] py-[2px] flex items-center w-full cursor-pointer relative rounded-[8px] overflow-hidden ${a[`marquee-shell`]}`,onClick:X,children:[f(t,{className:`relative shrink-0 w-[36px] h-[36px] mr-[4px]`,children:f(e,{src:typeof i==`string`?i:i.src,alt:v(`noticeAlt`),fill:!0,className:`object-cover`,unoptimized:!0})}),f(t,{className:`flex-1 overflow-hidden relative h-[22px] ml-1`,children:f(t,{className:`absolute inset-y-0 left-0 flex items-center whitespace-nowrap ${Q}`,onAnimationEnd:Z,children:f(n,{className:`inline-block text-[14px] text-[#f59e0b] leading-[22px] font-medium`,children:U.text})},`marquee-item-${R}`)}),p(t,{className:`flex items-center gap-[12px] shrink-0 ml-[4px]`,children:[K&&f(r,{className:`w-[16px] h-[16px] text-[#f59e0b]`}),q&&f(t,{className:`opacity-30 hover:opacity-100 transition-opacity`,onClick:Y,children:f(d,{className:`w-[12px] h-[12px] text-[#F59E0B]`})})]})]})})}export{E as MarqueeClient};
2
+ "use client";import{useRouter as e}from"../../../../utils/use-compatible-router.mjs";import{Image as t}from"../../../ui/image.mjs";import{Box as n}from"../../../ui/box.mjs";import{Text as r}from"../../../ui/text.mjs";import i from"../../../../assets/icons/right_arrow.mjs";import a from"../../../../assets/images/marquee.mjs";import o from"./marquee.module.mjs";import{defaultMarqueePeriod as s}from"./schema.mjs";import{useEffect as c,useMemo as l,useRef as u,useState as d}from"react";import{X as f}from"lucide-react";import{jsx as p,jsxs as m}from"react/jsx-runtime";import{useTranslations as h}from"next-intl";const g=[],_=`marquee_list`;let v=null;function y(e,t=20){let n=Array.from(e);return n.length<=t?e:`${n.slice(0,t).join(``)}...`}function b(e,t){if(!e)return!1;if(t===`once`)return!0;let n=new Date(e),r=new Date;return n.getFullYear()===r.getFullYear()&&n.getMonth()===r.getMonth()&&n.getDate()===r.getDate()}function x(){if(v)return v;let e=localStorage.getItem(_);if(!e)return v={},{};try{let t=JSON.parse(e);if(!t||typeof t!=`object`)return{};let n={};return Object.entries(t).forEach(([e,t])=>{if(!t||typeof t!=`object`)return;let r=t.closedAt;typeof r!=`number`||Number.isNaN(r)||(n[e]={closedAt:r})}),v=n,n}catch{return v={},{}}}function S(e){v=e,localStorage.setItem(_,JSON.stringify(e))}function C(e){return x()[e]??{}}function w(e,t){S({...x(),[e]:t})}function T(e,t){return b(e.closedAt,t)}function E(_){let v=h(`components.biz.business.marquee`),{marqueeKey:b,contents:x=g,click:S,close:E,displayStrategy:D,mode:O=`renderer`}=_,k=O===`editor`,A=e(),j=u(!1),[M,N]=d(k),[P,F]=d(k),[I,L]=d(!1),[R,z]=d(0);c(()=>{L(!0)},[]);let B=l(()=>{let e=D?.period??s,t=e.start,n=e.end;if(!t&&!n)return!0;let r=Date.now(),i=t?new Date(t).getTime():0,a=n?new Date(n).getTime():2**53-1;return r>=i&&r<=a},[D?.period]),V=l(()=>(x??[]).map(e=>({...e,text:y(String(e?.text??``))})).filter(e=>!!e.text),[x]),H=b?.trim()??``;if(c(()=>{z(0)},[l(()=>V.map(e=>`${e.text??``}::${e.link??``}`).join(`|`),[V]),H]),c(()=>{k||H||j.current||process.env.NODE_ENV===`production`||(j.current=!0,console.warn(`[MarqueeClient] marqueeKey is required in renderer mode.`))},[k,H]),c(()=>{if(I){if(k){N(!0),F(!0);return}if(!D?.rule||!B||V.length===0){N(!1),F(!0);return}if(!H){N(!1),F(!0);return}N(!T(C(H),D.rule)),F(!0)}},[D?.rule,k,I,B,V.length,H]),!k&&(!I||!P||!M||!B)||V.length===0)return null;let U=V[R%V.length],W=S?.enabled===!0,G=S?.link||U.link,K=W&&!!G,q=E?.enabled===!0;function J(){!H||!D?.rule||V.length===0||w(H,{...C(H),closedAt:Date.now()})}let Y=e=>{e.stopPropagation(),N(!1),J()};function X(e){if(typeof window>`u`){A.push(e);return}if(window.isWebView===!0)try{let t=new URL(e,window.location.href);if(t.origin===window.location.origin){let e=t.pathname.split(`/`).filter(Boolean),n=e.findIndex(e=>e===`video`);n>=0&&(e[n]=`webview`,t.pathname=`/${e.join(`/`)}`)}window.location.href=t.toString();return}catch{window.location.href=e;return}A.push(e)}function Z(){k||K&&G&&(N(!1),J(),X(G))}let Q=()=>{k||!M||V.length<=1||z(e=>(e+1)%V.length)},$=k?o[`marquee-item-paused`]:V.length>1?o[`marquee-item-once`]:o[`marquee-item-loop`];return p(n,{className:k?`px-3 py-2 w-full bg-bg1 pointer-events-none`:`px-3 py-2 w-full bg-bg1`,children:m(n,{className:`pl-[2px] pr-[12px] py-[2px] flex items-center w-full cursor-pointer relative rounded-[8px] overflow-hidden ${o[`marquee-shell`]}`,onClick:Z,children:[p(n,{className:`relative shrink-0 w-[36px] h-[36px] mr-[4px]`,children:p(t,{src:typeof a==`string`?a:a.src,alt:v(`noticeAlt`),fill:!0,className:`object-cover`,unoptimized:!0})}),p(n,{className:`flex-1 overflow-hidden relative h-[22px] ml-1`,children:p(n,{className:`absolute inset-y-0 left-0 flex items-center whitespace-nowrap ${$}`,onAnimationEnd:Q,children:p(r,{className:`inline-block text-[14px] text-[#f59e0b] leading-[22px] font-medium`,children:U.text})},`marquee-item-${R}`)}),m(n,{className:`flex items-center gap-[12px] shrink-0 ml-[4px]`,children:[K&&p(i,{className:`w-[16px] h-[16px] text-[#f59e0b]`}),q&&p(n,{className:`opacity-30 hover:opacity-100 transition-opacity`,onClick:Y,children:p(f,{className:`w-[12px] h-[12px] text-[#F59E0B]`})})]})]})})}export{E as MarqueeClient};