@funhub/platform 0.1.23 → 0.1.25
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.
- package/dist/assets/icons/right_arrow.mjs +2 -0
- package/dist/assets/images/Frame.mjs +2 -0
- package/dist/assets/images/marquee.mjs +2 -0
- package/dist/biz.d.mts +25 -1
- package/dist/biz.mjs +1 -1
- package/dist/common.mjs +1 -1
- package/dist/components/biz/basics/fullscreen-feed/index.mjs +1 -1
- package/dist/components/biz/basics/fullscreen-feed/runtime/client.mjs +1 -1
- package/dist/components/biz/basics/fullscreen-feed/runtime/post-slide.mjs +1 -1
- package/dist/components/biz/basics/fullscreen-feed/runtime/use-mixed-feed-controller.mjs +1 -1
- package/dist/components/biz/basics/fullscreen-feed/runtime/use-series-feed-controller.mjs +1 -1
- package/dist/components/biz/basics/fullscreen-feed/runtime/user-action.mjs +1 -1
- package/dist/components/biz/basics/logo/variants/basic-logo/runtime/client.mjs +1 -1
- package/dist/components/biz/basics/search/shared/components/search-box.mjs +1 -1
- package/dist/components/biz/basics/search/variants/simple-search/runtime/client.mjs +1 -1
- package/dist/components/biz/business/banner/variants/basic-banner/inspector-schema.d.mts +0 -2
- package/dist/components/biz/business/banner/variants/basic-banner/inspector-schema.mjs +1 -1
- package/dist/components/biz/business/banner/variants/basic-banner/material.d.mts +0 -1
- package/dist/components/biz/business/banner/variants/basic-banner/runtime/client.mjs +1 -1
- package/dist/components/biz/business/card-grid/variants/card-grid-2x3-infinite/runtime/client.mjs +1 -1
- package/dist/components/biz/business/card-grid/variants/card-grid-3x3-infinite/runtime/client.mjs +1 -1
- package/dist/components/biz/business/channel-list/channel-filter-dialog.mjs +2 -0
- package/dist/components/biz/business/channel-list/client.d.mts +8 -0
- package/dist/components/biz/business/channel-list/client.mjs +2 -0
- package/dist/components/biz/business/channel-list/default-props.mjs +2 -0
- package/dist/components/biz/business/channel-list/material.d.mts +16 -0
- package/dist/components/biz/business/channel-list/material.mjs +2 -0
- package/dist/components/biz/business/channel-list/schema.d.mts +23 -0
- package/dist/components/biz/business/channel-list/schema.mjs +2 -0
- package/dist/components/biz/business/comment/comment-item.mjs +1 -1
- package/dist/components/biz/business/comment/comment-list.mjs +1 -1
- package/dist/components/biz/business/comment/reply-detail.mjs +1 -1
- package/dist/components/biz/business/detail/detail-operate.mjs +1 -1
- package/dist/components/biz/business/detail/materials/registry.d.mts +4 -4
- package/dist/components/biz/business/detail/materials/video-detail-actions/schema.d.mts +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-info/schema.d.mts +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-info-title/schema.d.mts +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-info-title-tags-episodes/schema.d.mts +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-player/schema.d.mts +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-recommend/client.mjs +1 -1
- package/dist/components/biz/business/detail/video-hero.mjs +1 -1
- package/dist/components/biz/business/fullscreen-feed/variants/shared/runtime-compat.mjs +1 -1
- package/dist/components/biz/business/home-recommend/shared/home-recommend-base.mjs +1 -1
- package/dist/components/biz/business/index.d.mts +31 -1
- package/dist/components/biz/business/index.mjs +1 -1
- package/dist/components/biz/business/marquee/client.d.mts +16 -0
- package/dist/components/biz/business/marquee/client.mjs +2 -0
- package/dist/components/biz/business/marquee/index.d.mts +5 -0
- package/dist/components/biz/business/marquee/material.d.mts +24 -0
- package/dist/components/biz/business/marquee/material.mjs +2 -0
- package/dist/components/biz/business/marquee/schema.d.mts +33 -0
- package/dist/components/biz/business/marquee/schema.mjs +2 -0
- package/dist/components/biz/business/marquee/server.d.mts +11 -0
- package/dist/components/biz/business/marquee/server.mjs +2 -0
- package/dist/components/biz/business/nav-bar/variants/basic-nav-bar/runtime/client.mjs +1 -1
- package/dist/components/biz/business/recommended-users/variants/basic-recommended-users/runtime/client.mjs +1 -1
- package/dist/components/biz/business/search-bar/variants/detail-search-bar/runtime/client.mjs +1 -1
- package/dist/components/biz/business/search-history/use-search-history.mjs +1 -1
- package/dist/components/biz/business/search-history2/client.d.mts +21 -0
- package/dist/components/biz/business/search-history2/client.mjs +2 -0
- package/dist/components/biz/business/search-history2/index.d.mts +5 -0
- package/dist/components/biz/business/search-history2/material.d.mts +15 -0
- package/dist/components/biz/business/search-history2/material.mjs +2 -0
- package/dist/components/biz/business/search-history2/schema.d.mts +21 -0
- package/dist/components/biz/business/search-history2/schema.mjs +2 -0
- package/dist/components/biz/business/search-history2/server.d.mts +11 -0
- package/dist/components/biz/business/search-history2/server.mjs +2 -0
- package/dist/components/biz/business/search-input/client.d.mts +19 -0
- package/dist/components/biz/business/search-input/client.mjs +2 -0
- package/dist/components/biz/business/search-input/index.d.mts +5 -0
- package/dist/components/biz/business/search-input/material.d.mts +14 -0
- package/dist/components/biz/business/search-input/material.mjs +2 -0
- package/dist/components/biz/business/search-input/schema.d.mts +19 -0
- package/dist/components/biz/business/search-input/schema.mjs +2 -0
- package/dist/components/biz/business/search-input/server.d.mts +11 -0
- package/dist/components/biz/business/search-input/server.mjs +2 -0
- package/dist/components/biz/business/shortcut-grid/client.d.mts +2 -2
- package/dist/components/biz/business/shortcut-grid/client.mjs +1 -1
- package/dist/components/biz/business/shortcut-grid/material.d.mts +12 -1
- package/dist/components/biz/business/shortcut-grid/material.mjs +1 -1
- package/dist/components/biz/business/shortcut-grid/schema.d.mts +13 -5
- package/dist/components/biz/business/shortcut-grid/schema.mjs +1 -1
- package/dist/components/biz/business/tab-bar/client.d.mts +13 -0
- package/dist/components/biz/business/tab-bar/client.mjs +2 -0
- package/dist/components/biz/business/tab-bar/index.d.mts +5 -0
- package/dist/components/biz/business/tab-bar/material.d.mts +21 -0
- package/dist/components/biz/business/tab-bar/material.mjs +2 -0
- package/dist/components/biz/business/tab-bar/schema.d.mts +27 -0
- package/dist/components/biz/business/tab-bar/schema.mjs +2 -0
- package/dist/components/biz/business/tab-bar/server.d.mts +11 -0
- package/dist/components/biz/business/tab-bar/server.mjs +2 -0
- package/dist/components/biz/business/text-recommend/client.d.mts +22 -0
- package/dist/components/biz/business/text-recommend/client.mjs +2 -0
- package/dist/components/biz/business/text-recommend/index.d.mts +5 -0
- package/dist/components/biz/business/text-recommend/material.d.mts +15 -0
- package/dist/components/biz/business/text-recommend/material.mjs +2 -0
- package/dist/components/biz/business/text-recommend/schema.d.mts +21 -0
- package/dist/components/biz/business/text-recommend/schema.mjs +2 -0
- package/dist/components/biz/business/text-recommend/server.d.mts +12 -0
- package/dist/components/biz/business/text-recommend/server.mjs +2 -0
- package/dist/components/biz/business/video-horizontal-list/client.d.mts +25 -0
- package/dist/components/biz/business/video-horizontal-list/client.mjs +2 -0
- package/dist/components/biz/business/video-horizontal-list/index.d.mts +5 -0
- package/dist/components/biz/business/video-horizontal-list/material.d.mts +18 -0
- package/dist/components/biz/business/video-horizontal-list/material.mjs +2 -0
- package/dist/components/biz/business/video-horizontal-list/schema.d.mts +21 -0
- package/dist/components/biz/business/video-horizontal-list/schema.mjs +2 -0
- package/dist/components/biz/business/video-horizontal-list/server.d.mts +12 -0
- package/dist/components/biz/business/video-horizontal-list/server.mjs +2 -0
- package/dist/components/biz/example/button/client.mjs +1 -1
- package/dist/components/biz/renderer/renderer.d.mts +1 -1
- package/dist/components/biz/renderer/renderer.mjs +1 -1
- package/dist/components/common/at-element/index.mjs +1 -1
- package/dist/components/common/blocked-dialog/blocked-dialog.mjs +1 -1
- package/dist/components/common/collection-popup/collection-create-modal.mjs +1 -1
- package/dist/components/common/delete-confirm-dialog/delete-confirm-dialog.mjs +1 -1
- package/dist/components/common/funhub-provider/funhub-provider.mjs +1 -1
- package/dist/components/common/header-nav/client.mjs +1 -1
- package/dist/components/common/info-card/card-header.mjs +1 -1
- package/dist/components/common/list/post-list/post-list.mjs +1 -1
- package/dist/components/common/list/user-activity-list/user-activity-list-actions.mjs +1 -1
- package/dist/components/common/list/user-activity-list/user-activity-list-item.mjs +1 -1
- package/dist/components/common/list/video-list/video-list.mjs +1 -1
- package/dist/components/common/popup-video/index.mjs +1 -1
- package/dist/components/common/series-episodes/index.mjs +1 -1
- package/dist/components/common/share-popup/share-popup.mjs +1 -1
- package/dist/components/common/tab-bar/index.mjs +1 -1
- package/dist/components/common/top-nav-bar/client.mjs +1 -1
- package/dist/components/common/video-player/index.mjs +2 -2
- package/dist/components/pages/(follow)/_components/interaction-tabs/index.mjs +1 -1
- package/dist/components/pages/(follow)/_components/user-list/index.mjs +1 -1
- package/dist/components/pages/(follow)/fans/page.mjs +1 -1
- package/dist/components/pages/(follow)/followed/page.mjs +1 -1
- package/dist/components/pages/collection-create/form.mjs +1 -1
- package/dist/components/pages/collection-detail/detail.mjs +1 -1
- package/dist/components/pages/feed-series/feed-series-client.mjs +1 -1
- package/dist/components/pages/feed-series/page.mjs +1 -1
- package/dist/components/pages/feedback/_components/feedback-form.mjs +1 -1
- package/dist/components/pages/fullscreen-feed/page.mjs +1 -1
- package/dist/components/pages/home/client.mjs +1 -1
- package/dist/components/pages/login/index.mjs +1 -1
- package/dist/components/pages/post-detail/post-detail-client.mjs +1 -1
- package/dist/components/pages/profile/_components/tabs/collect-tab/client.mjs +1 -1
- package/dist/components/pages/profile/_components/tabs/history-tab/client.mjs +1 -1
- package/dist/components/pages/profile/_components/tabs/like-tab/client.mjs +1 -1
- package/dist/components/pages/profile/_components/tabs/publish-tab/client.mjs +1 -1
- package/dist/components/pages/profile/_components/user-profile-container/client.mjs +1 -1
- package/dist/components/pages/profile/_components/user-profile-header/client.mjs +1 -1
- package/dist/components/pages/publish/components/collection-popup.mjs +1 -1
- package/dist/components/pages/publish/components/collection.mjs +1 -1
- package/dist/components/pages/publish/components/header.mjs +1 -1
- package/dist/components/pages/publish/page-client.mjs +1 -1
- package/dist/components/pages/search/hot-recommend.mjs +1 -1
- package/dist/components/pages/search/page-client.mjs +1 -1
- package/dist/components/pages/search/search-result/search-video-info.mjs +1 -1
- package/dist/components/pages/search/top-header.mjs +1 -1
- package/dist/components/pages/settings/_components/settings.mjs +1 -1
- package/dist/components/pages/user-follow/page.mjs +1 -1
- package/dist/components/pages/video-detail/page.mjs +1 -1
- package/dist/components/pages/video-detail/video-detail-client.mjs +1 -1
- package/dist/components/pages/video-list/video-list-client.mjs +1 -1
- package/dist/components/ui/image.d.mts +4 -4
- package/dist/hooks/use-content-operate.mjs +1 -1
- package/dist/hooks.mjs +1 -1
- package/dist/i18n/locales/en.mjs +1 -1
- package/dist/i18n/locales/zh-CN.mjs +1 -1
- package/dist/i18n.d.mts +1 -1
- package/dist/i18n.mjs +1 -1
- package/dist/materials.d.mts +8 -7
- package/dist/materials.mjs +1 -1
- package/dist/utils/schema/material.d.mts +1 -1
- package/dist/utils/share-manager.mjs +1 -1
- package/dist/utils.d.mts +4 -4
- package/dist/utils.mjs +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
|
|
2
|
-
"use client";import{buildContentUrl as e}from"../../../../../utils/helpers/url.mjs";import{mergeStyles as t}from"../../../../../utils/styles/helpers.mjs";import{
|
|
2
|
+
"use client";import{buildContentUrl as e}from"../../../../../utils/helpers/url.mjs";import{mergeStyles as t}from"../../../../../utils/styles/helpers.mjs";import{Image as n}from"../../../../../../ui/image.mjs";import{Box as r}from"../../../../../../ui/box.mjs";import{Carousel as i,CarouselContent as a,CarouselItem as o}from"../../../../../../ui/carousel.mjs";import{Text as s}from"../../../../../../ui/text.mjs";import c from"../../../../../../ui/legacy/button.mjs";import l from"../../../../../../ui/link.mjs";import{defaultProps as u}from"../defaults/default-props.mjs";import{useEffect as d,useRef as f,useState as p}from"react";import m from"clsx";import{jsx as h,jsxs as g}from"react/jsx-runtime";import{useIsClient as _}from"foxact/use-is-client";const v={list:[]};function y({props:y=v,styles:b,events:x}){let{autoplay:S=u.autoplay,interval:C=u.interval,loop:w=u.loop,showTitle:T=u.showTitle,showIndicator:E=u.showIndicator,list:D=[]}={...u,...y},[O,k]=p(),[A,j]=p(0),M=_(),N=f(null);if(d(()=>{if(!O||!M)return;let e=()=>{j(O.selectedScrollSnap())};return O.on(`select`,e),e(),()=>{O.off(`select`,e)}},[O,x,M]),d(()=>!S||!O||D.length<=1?void 0:(N.current=setInterval(()=>{O.canScrollNext()?O.scrollNext():w&&O.scrollTo(0)},C),()=>{N.current&&=(clearInterval(N.current),null)}),[S,O,C,w,D.length]),!D||D.length===0)return null;let P=D[A];return g(r,{className:`relative w-full`,style:b?t(b,{}):void 0,children:[h(i,{setApi:k,opts:{align:`start`,loop:w,skipSnaps:!1,dragFree:!1},className:`w-full`,children:h(a,{className:`ml-0`,children:D.map((t,r)=>h(o,{className:`pl-0`,children:h(l,{href:e({url:``,contentId:t.contentId,contentType:1,title:t.title}),className:`block relative w-full h-[242px] overflow-hidden touch-manipulation`,children:h(n,{src:t.coverUrl,alt:t.title||`Banner ${r+1}`,fill:!0,objectFit:`cover`,unoptimized:!0})})},r))})}),T&&P?.title&&h(r,{className:`absolute bottom-[8px] left-[8px]`,children:h(s,{as:`p`,className:`text-white text-[16px] line-clamp-1`,children:P.title})}),E&&D.length>1&&h(r,{className:`absolute bottom-[16px] right-[8px] flex items-center gap-[4px]`,children:D.map((e,t)=>h(c,{type:`button`,className:m(`transition-all duration-300 rounded-full !p-0`,t===A?`w-[10px] h-[6px] bg-black`:`w-[6px] h-[6px] bg-white/50`),"aria-label":`跳转到第 ${t+1} 个 Banner`},t))})]})}export{y as default};
|
package/dist/components/biz/business/card-grid/variants/card-grid-2x3-infinite/runtime/client.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
|
|
2
|
-
"use client";import{CardSpec as e}from"../../../../../utils/constants/card-spec.mjs";import{mergeStyles as t}from"../../../../../utils/styles/helpers.mjs";import{transformContentListToCardItems as n}from"../../../../../utils/transformers/card-grid.mjs";import{gContentGetAppChannelBlockData as r}from"../../../../../../../service/generated/client.mjs";import{Box as i}from"../../../../../../ui/box.mjs";import{InfiniteScroll as a}from"../../../../../../ui/infinite-scroll.mjs";import{Text as o}from"../../../../../../ui/text.mjs";import s
|
|
2
|
+
"use client";import{CardSpec as e}from"../../../../../utils/constants/card-spec.mjs";import{mergeStyles as t}from"../../../../../utils/styles/helpers.mjs";import{transformContentListToCardItems as n}from"../../../../../utils/transformers/card-grid.mjs";import{gContentGetAppChannelBlockData as r}from"../../../../../../../service/generated/client.mjs";import{Box as i}from"../../../../../../ui/box.mjs";import{InfiniteScroll as a}from"../../../../../../ui/infinite-scroll.mjs";import{Text as o}from"../../../../../../ui/text.mjs";import{usePaginated as s}from"../../../../../../../hooks/query/use-query.mjs";import c from"../../../../../basics/card-layout/runtime/client.mjs";import{useLayoutEffect as l,useMemo as u,useRef as d,useState as f}from"react";import{jsx as p,jsxs as m}from"react/jsx-runtime";const h={},g={list:[],title:``,cursor:``,block_id:``};function _({props:_=h,styles:v,data:y=g}){let b=e.V2_LARGE,{gap:x=8}=_||{},{title:S,cursor:C,block_id:w,list:T}=y,E=v?t(v,{}):void 0,D=T&&T.length>0,O=u(()=>{if(!D)return;let e=C&&C.trim()?C:void 0;return{pages:[{data:{block:{data:{videos:T,cursor:C||``}}}}],pageParams:[e]}},[D,T,C]),{data:k,fetchNextPage:A,hasNextPage:j}=s({key:[`card-grid-2x3-infinite`,w],queryFn:e=>r({block_id:w,cursor:e||void 0,page_size:20}),getNextPageParam:e=>{let t=e.data?.block?.data?.cursor;return t&&t.trim()?t:void 0},options:{enabled:!!w,initialData:O,refetchOnMount:!1,refetchOnWindowFocus:!1,refetchOnReconnect:!1},initialPageParam:D&&C&&C.trim()?C:void 0}),M=d(T),[N,P]=f(!1);l(()=>{P(!0)},[]);let F=u(()=>{let e=[...M.current];if(!N)return e;let t=[...e],n=k?.pages;if(n&&n.length>1)for(let e=1;e<n.length;e++){let r=n[e].data?.block?.data?.videos||[];t.push(...r)}return t},[N,k?.pages]),I=u(()=>n(F,`view-duration`),[F]);return m(i,{children:[S&&p(o,{as:`h2`,className:`text-[18px] font-bold text-text1 mb-[10px] px-[12px]`,children:S}),p(a,{loadMore:()=>A().then(()=>void 0),hasMore:j===!0||j===void 0&&!!C&&T.length>0,initialLoad:!0,rootId:`app-scroll-container`,threshold:1e3,className:``,children:p(c,{props:{cardSpec:b,gap:x},data:I,styles:E})})]})}export{_ as default};
|
package/dist/components/biz/business/card-grid/variants/card-grid-3x3-infinite/runtime/client.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
|
|
2
|
-
"use client";import{CardSpec as e}from"../../../../../utils/constants/card-spec.mjs";import{mergeStyles as t}from"../../../../../utils/styles/helpers.mjs";import{transformContentListToCardItems as n}from"../../../../../utils/transformers/card-grid.mjs";import{gContentGetAppChannelBlockData as r}from"../../../../../../../service/generated/client.mjs";import{Box as i}from"../../../../../../ui/box.mjs";import{InfiniteScroll as a}from"../../../../../../ui/infinite-scroll.mjs";import{Text as o}from"../../../../../../ui/text.mjs";import s
|
|
2
|
+
"use client";import{CardSpec as e}from"../../../../../utils/constants/card-spec.mjs";import{mergeStyles as t}from"../../../../../utils/styles/helpers.mjs";import{transformContentListToCardItems as n}from"../../../../../utils/transformers/card-grid.mjs";import{gContentGetAppChannelBlockData as r}from"../../../../../../../service/generated/client.mjs";import{Box as i}from"../../../../../../ui/box.mjs";import{InfiniteScroll as a}from"../../../../../../ui/infinite-scroll.mjs";import{Text as o}from"../../../../../../ui/text.mjs";import{usePaginated as s}from"../../../../../../../hooks/query/use-query.mjs";import c from"../../../../../basics/card-layout/runtime/client.mjs";import{useLayoutEffect as l,useMemo as u,useRef as d,useState as f}from"react";import{jsx as p,jsxs as m}from"react/jsx-runtime";const h={},g={list:[],title:``,cursor:``,block_id:``};function _({props:_=h,styles:v,data:y=g}){let b=e.V3_SMALL,{gap:x=8}=_||{},{title:S,cursor:C,block_id:w,list:T}=y,E=v?t(v,{}):void 0,D=T&&T.length>0,O=u(()=>{if(!D)return;let e=C&&C.trim()?C:void 0;return{pages:[{data:{block:{data:{videos:T,cursor:C||``}}}}],pageParams:[e]}},[D,T,C]),{data:k,fetchNextPage:A,hasNextPage:j}=s({key:[`card-grid-3x3-infinite`,w],queryFn:e=>r({block_id:w,cursor:e||void 0,page_size:21}),getNextPageParam:e=>{let t=e.data?.block?.data?.cursor;return t&&t.trim()?t:void 0},options:{enabled:!!w,initialData:O,refetchOnMount:!1,refetchOnWindowFocus:!1,refetchOnReconnect:!1},initialPageParam:D&&C&&C.trim()?C:void 0}),M=d(T),[N,P]=f(!1);l(()=>{P(!0)},[]);let F=u(()=>{let e=[...M.current];if(!N)return e;let t=[...e],n=k?.pages;if(n&&n.length>1)for(let e=1;e<n.length;e++){let r=n[e].data?.block?.data?.videos||[];t.push(...r)}return t},[N,k?.pages]),I=u(()=>n(F,`view-duration`),[F]);return m(i,{children:[S&&p(o,{as:`h2`,className:`text-[18px] font-bold text-text1 mb-[10px] px-[12px]`,children:S}),p(a,{loadMore:()=>A().then(()=>void 0),hasMore:j===!0||j===void 0&&!!C&&T.length>0,className:``,initialLoad:!0,rootId:`app-scroll-container`,threshold:1e3,children:p(c,{props:{cardSpec:b,gap:x},data:I,styles:E})})]})}export{_ as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
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"../../../ui/popup.mjs";import i from"../../../../assets/images/add.mjs";import a from"../../../../assets/images/less.mjs";import{useEffect as o,useMemo 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";const f=`channel-filter-hidden-channel-ids`;function p(){if(typeof window>`u`)return[];try{let e=localStorage.getItem(f);return e?JSON.parse(e):[]}catch(e){return console.error(`Failed to load hidden channel IDs:`,e),[]}}function m(e){if(!(typeof window>`u`))try{localStorage.setItem(f,JSON.stringify(e))}catch(e){console.error(`Failed to save hidden channel IDs:`,e)}}function h({open:f,onOpenChange:h,channels:g,onChannelClick:_,onChannelsChange:v}){let y=d(`components.biz.business.navBar.variants.basicNavBar.runtime`),[b,x]=c(g);o(()=>{if(g.length>0){let e=p();x(g.filter(t=>!e.includes(t.title)))}},[g]);let S=s(()=>g.filter(e=>!b.some(t=>t.title===e.title)),[g,b]),C=e=>{if(h(e),!e){m(S.map(e=>e.title)),v?.(b);let e=new URL(window.location.href).pathname,t=decodeURIComponent(e.split(`/`).pop());S.find(e=>e.title===t)&&b[0]&&(window.location.href=`/`)}},w=e=>{x(t=>t.filter(t=>t.title!==e.title))},T=e=>{x(t=>[...t,e])},E=(e,t)=>{_?.(e,t)},D=()=>{x(g),m([])},O=e=>e===`推荐`;return l(r,{open:f,onOpenChange:C,side:`top`,showCloseButton:!0,className:`!h-screen max-h-screen`,closeButtonClassName:`border-0`,children:u(t,{className:`flex flex-col h-full px-[12px]`,children:[l(t,{className:`mb-4 pt-4`,children:l(n,{className:`text-text1 font-bold text-[18px]`,children:y(`channelFilterDialog.allChannels`)})}),u(t,{className:`mb-[32px]`,children:[u(t,{className:`flex items-center justify-between h-6 mb-[12px]`,children:[l(n,{className:`text-text1 text-[16px]`,children:y(`channelFilterDialog.myChannels`)}),l(t,{onClick:D,children:l(n,{className:`text-text1 text-[16px]`,children:y(`channelFilterDialog.resetDefault`)})})]}),l(t,{className:`grid grid-cols-4 gap-[12px]`,children:b.map((r,i)=>{let o=O(r.title);return u(t,{className:`relative h-[40px] px-4 bg-bg1 rounded-[50px] cursor-pointer flex items-center justify-center whitespace-nowrap`,onClick:()=>E(r,i),children:[l(n,{className:`text-text1 text-[14px]`,children:r.title}),!o&&l(t,{className:`absolute top-0 right-0 flex items-center justify-center cursor-pointer w-[16px] h-[16px]`,onClick:e=>{e.stopPropagation(),w(r)},children:l(e,{src:typeof a==`string`?a:a.src,alt:y(`channelFilterDialog.delete`),width:16,height:16})})]},r.title||`my-channel-${i}`)})})]}),u(t,{children:[l(t,{className:`h-6 mb-[12px]`,children:l(n,{className:`text-text1 text-[16px]`,children:y(`channelFilterDialog.moreChannels`)})}),S.length===0?l(t,{className:`flex justify-center`,children:u(n,{className:`text-text3 text-[14px]`,children:[y(`channelFilterDialog.allAddedTo`),`"`,y(`channelFilterDialog.myChannels`),`"`]})}):l(t,{className:`grid grid-cols-4 gap-[12px]`,children:S.map((r,a)=>u(t,{className:`relative h-[40px] px-4 bg-bg1 rounded-[50px] cursor-pointer flex items-center justify-center whitespace-nowrap`,onClick:()=>E(r,a),children:[l(n,{className:`text-text1 text-[14px]`,children:r.title}),l(t,{className:`absolute top-0 right-0 flex items-center justify-center cursor-pointer w-[16px] h-[16px]`,onClick:e=>{e.stopPropagation(),T(r)},children:l(e,{src:typeof i==`string`?i:i.src,alt:y(`channelFilterDialog.add`),width:16,height:16})})]},r.title||`more-channel-${a}`))})]})]})})}export{h as default,p as loadHiddenChannelIdsFromStorage};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
|
|
2
|
+
import { ChannelListProps } from "./schema.mjs";
|
|
3
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
4
|
+
|
|
5
|
+
//#region components/biz/business/channel-list/client.d.ts
|
|
6
|
+
declare function BasicNavBarClient(props: ChannelListProps): react_jsx_runtime0.JSX.Element;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { BasicNavBarClient };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
|
|
2
|
+
"use client";import{mergeStyles as e}from"../../utils/styles/helpers.mjs";import{pxToVw as t}from"../../../../utils/helper.mjs";import{Box as n}from"../../../ui/box.mjs";import{useSticky as r}from"../../../../hooks/use-sticky.mjs";import i from"../../../ui/link.mjs";import{urlPrefix as a}from"../../../../constants/url-prefix.mjs";import o,{loadHiddenChannelIdsFromStorage as s}from"./channel-filter-dialog.mjs";import{defaultProps as c}from"./default-props.mjs";import{useEffect as l,useMemo as u,useState as d}from"react";import{clsx as f}from"clsx";import{Fragment as p,jsx as m,jsxs as h}from"react/jsx-runtime";const g={};function _(e,t){return t===0?`/`:`${a.CHANNEL}/${encodeURIComponent(e.title)}`}function v(a){let{styles:v,events:y,...b}=a,x=b||g,S={...c,...x},{channelItemHeight:C,channelItemFontSize:w,channelItemActiveFontSize:T,channelItemGap:E}=S,[D,O]=d(!1),{isSticky:k,ref:A}=r(),[j,M]=d(S.list),N=u(()=>S.currentChannelId??null,[S.currentChannelId]);l(()=>{let e=s();M(e?.length?S.list.filter(t=>!e.includes(t.title)):S.list)},[S.list]);let P=e=>{M(e)},F=(e,t)=>{y?.onChannelChange?.(e,t)},I=v?e(v,{}):void 0;return h(p,{children:[k&&m(n,{className:`w-full`,style:{height:t(44)}}),m(n,{as:`nav`,ref:A,className:f(`w-full transition-all duration-200`,!S.isFullfeed&&k&&`fixed top-0 left-0 right-0 z-50`,S.isFullfeed&&`fixed top-[54px] left-0 z-10 w-full`,!S.isFullfeed&&`bg-bg1`),style:I,children:m(n,{className:`relative flex items-center h-[44px]`,children:m(n,{className:`flex-1 overflow-x-auto overflow-y-hidden [&::-webkit-scrollbar]:hidden`,style:{scrollbarWidth:`none`,msOverflowStyle:`none`,WebkitOverflowScrolling:`touch`},children:m(n,{className:`flex items-center h-full`,style:{paddingLeft:t(16),paddingRight:t(16),gap:t(E)},children:j.map((e,n)=>{let r=N===e.title||N===null&&n===0;return m(i,{href:_(e,n),className:f(`whitespace-nowrap cursor-pointer transition-all duration-200`,`flex items-center justify-center`),style:{height:t(C),fontSize:t(r?T:w),fontWeight:r?`bold`:`normal`,color:r?`var(--color-theme5)`:`var(--color-text2)`},onClick:()=>F(e,n),children:e.title},e.title||`channel-${n}`)})})})})}),m(o,{open:D,onOpenChange:O,channels:S.list,currentChannelId:N,onChannelClick:F,onChannelsChange:P})]})}export{v as default};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
import { SchemaHasDefaultValue } from "../../../../utils/schema/schema.mjs";
|
|
3
|
+
import { DefineMaterialOption } from "../../../../utils/schema/material.mjs";
|
|
4
|
+
import "../../../../utils/schema/index.mjs";
|
|
5
|
+
import { BasicNavBarClient } from "./client.mjs";
|
|
6
|
+
import * as zod from "zod";
|
|
7
|
+
import * as zod_v4_core0 from "zod/v4/core";
|
|
8
|
+
|
|
9
|
+
//#region components/biz/business/channel-list/material.d.ts
|
|
10
|
+
declare const channelListMaterial: DefineMaterialOption<typeof BasicNavBarClient, zod.ZodObject<{
|
|
11
|
+
list: zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
|
|
12
|
+
title: zod.ZodOptional<zod.ZodString>;
|
|
13
|
+
}, zod_v4_core0.$strip>>> & SchemaHasDefaultValue;
|
|
14
|
+
}, zod_v4_core0.$strip>, "channel-list">;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { channelListMaterial };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
|
|
2
|
+
import{defineMaterial as e}from"../../../../utils/schema/material.mjs";import t from"./client.mjs";import{channelListInspectorPropsSchema as n}from"./schema.mjs";const r=e({type:`channel-list`,name:`频道`,icon:`/static/components-thumb/channel_list_editable.png`,category:`内容组件`,serverComponent:t,clientComponent:t,propsSchema:n});export{r as channelListMaterial};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
import { BaseComponentProps } from "../../utils/types/component.mjs";
|
|
3
|
+
import "../../utils/index.mjs";
|
|
4
|
+
import { SchemaHasDefaultValue } from "../../../../utils/schema/schema.mjs";
|
|
5
|
+
import "../../../../utils/schema/index.mjs";
|
|
6
|
+
import z from "zod";
|
|
7
|
+
|
|
8
|
+
//#region components/biz/business/channel-list/schema.d.ts
|
|
9
|
+
/**
|
|
10
|
+
* 定义可以被低代码右侧inspector编辑的props
|
|
11
|
+
*/
|
|
12
|
+
declare const channelListInspectorPropsSchema: z.ZodObject<{
|
|
13
|
+
list: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
14
|
+
title: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>>> & SchemaHasDefaultValue;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
type ChannelListInspectorProps<T extends object = object> = z.infer<typeof channelListInspectorPropsSchema> & BaseComponentProps;
|
|
18
|
+
/**
|
|
19
|
+
* 基于ButtonInspectorProps再派生出组件真正的props(因为不是所有props都需要被编辑,比如说下面的children就不需要,但是button组件又需要传入children)
|
|
20
|
+
*/
|
|
21
|
+
type ChannelListProps = ChannelListInspectorProps;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { ChannelListProps };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
|
|
2
|
+
import{defineArrayItemPropSchema as e,defineComponentPropsSchema as t,defineTextPropSchema as n,getSchemaDefaultProps as r}from"../../../../utils/schema/schema.mjs";import i from"zod";const a=t({list:e(i.object({title:n({label:`内容标题`,required:!1})}),{required:!1,label:`list`,defaultValue:[{title:`频道列表`}]})});r(a);export{a as channelListInspectorPropsSchema};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
|
|
2
|
-
"use client";import{cn as e}from"../../../../utils/cn.mjs";import{Avatar as t,AvatarImage as n}from"../../../ui/avatar.mjs";import r from"
|
|
2
|
+
"use client";import{cn as e}from"../../../../utils/cn.mjs";import{Avatar as t,AvatarImage as n}from"../../../ui/avatar.mjs";import r from"../../../../assets/icons/common/right_arrow.mjs";import{useInteractionAnimation as i}from"../../../../hooks/use-interaction-animation.mjs";import a from"../../../common/interaction-animations.module.mjs";import o from"../../../../assets/icons/detail/give_like.mjs";import s from"../../../../assets/icons/detail/give_like_sel.mjs";import c from"../../../../assets/icons/common/god_comment.mjs";import l from"../../../../assets/icons/detail/un_like.mjs";import u from"../../../../assets/icons/detail/un_like_sel.mjs";import{CommentMedia as d}from"./comment-media.mjs";import{CommentRichText as f}from"./comment-rich-text.mjs";import{TimeDisplay as p}from"./time-display.mjs";import{memo as m}from"react";import{jsx as h,jsxs as g}from"react/jsx-runtime";import{useTranslations as _}from"next-intl";import v from"next/link";function y(e){let t=Number(e)||0;return t>=1e4?`${(t/1e4).toFixed(1)}w`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}const b=m(({comment:m,isHighlight:b,onReply:x,onViewReplies:S,onReplyAction:C,onLike:w,onDislike:T,onRequireLogin:E,variant:D=`dark`,rightSlot:O,showReplyButton:k=!0,isLogin:A=!0})=>{let j=_(`components.biz.business.comment`),M=D===`light`,N=m.status===`0`,P=i();function F(){E?.()}function I(){if(!A){F();return}P.trigger(a.likeShakeAnimation),w?.(m)}function L(){if(!A){F();return}T?.(m)}function R(){if(!A){F();return}if(!x){F();return}x(m)}function z(){if(!A){F();return}S?.(m)}function B(){if(!A){F();return}if(C){C(m);return}if(+m.reply_cnt==0){R();return}z()}function V(){return m.reply_cnt===`0`?j(`commentItem.reply`):j(`commentItem.replyCount`,{count:m.reply_cnt})}return g(`div`,{className:e(`flex flex-col p-[16px] relative`,M?`text-text1`:`text-white`),children:[b&&h(c,{className:`w-[70px] h-[70px] absolute top-0 right-[80px]`}),g(`div`,{className:`flex flex-row justify-between relative z-[2]`,children:[g(v,{className:`flex flex-row items-center`,href:`/profile/${m.user_id}`,children:[h(t,{children:h(n,{src:m.avatar,alt:m.user_name})}),g(`div`,{className:`ml-[12px] flex flex-col min-w-0`,children:[h(`span`,{className:e(`text-[14px] leading-[14px] max-w-[180px] text-ellipsis overflow-hidden whitespace-nowrap`,M?`text-text2`:`text-white/80`),children:m.user_name}),h(`span`,{className:e(`mt-[8px] text-[12px] leading-[12px]`,M?`text-text3`:`text-white/50`),children:h(p,{timestamp:m.created_at})})]})]}),N?h(`div`,{className:`px-[8px] py-[4px] bg-text3/10 rounded-[12px]`,children:h(`span`,{className:e(`text-[12px] leading-[12px]`,M?`text-text3`:`text-white/60`),children:j(`commentItem.contentInReview`)})}):O||g(`div`,{className:`flex flex-row items-center`,children:[g(`button`,{type:`button`,className:`px-[4px] flex flex-col items-center`,onClick:I,children:[m.like_flag===`1`?h(s,{className:e(`w-[14px] h-[14px]`,P.animationClass)}):h(o,{className:e(`w-[14px] h-[14px]`,M?`text-text3`:`text-white/70`,P.animationClass)}),h(`span`,{className:e(`mt-[4px] text-[12px] leading-[12px]`,M?`text-text3`:`text-white/70`),children:m.like_cnt===`0`?j(`commentItem.like`):y(m.like_cnt)})]}),g(`button`,{type:`button`,className:`ml-[12px] px-[4px] flex flex-col items-center`,onClick:L,children:[m.like_flag===`2`?h(u,{className:`w-[14px] h-[14px]`}):h(l,{className:e(`w-[14px] h-[14px]`,M?`text-text3`:`text-white/70`)}),h(`span`,{className:e(`mt-[4px] text-[12px] leading-[12px]`,M?`text-text3`:`text-white/70`),children:m.dislike_cnt===`0`?j(`commentItem.dislike`):y(m.dislike_cnt)})]})]})]}),g(`div`,{className:`mt-[4px] pl-[50px] flex flex-col`,children:[m.text&&h(f,{className:e(`text-[14px] leading-[22px] break-all`,M?`text-text1`:`text-white/90`),text:m.text,atUsers:m.at_users}),h(d,{list:m.nine_grid_content_info,disabled:N,hasText:!!m.text,playerId:m.id}),k&&g(`button`,{type:`button`,className:e(`mt-[4px] w-[fit-content] h-[30px] px-[12px] text-[14px] leading-[22px] flex flex-row items-center rounded-[15px]`,M?`text-text1 bg-bg2`:`text-white bg-white/10`),onClick:B,children:[h(`span`,{children:V()}),m.reply_cnt!==`0`&&h(r,{className:`w-[10px] h-[10px] ml-[2px]`})]})]})]})});export{b as CommentItem};
|
|
@@ -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{useUserStore as a}from"../../../../store/modules/user-store.mjs";import{gCommunityGetComments as o,pCommunityCreateComment as s,pCommunityDislikeComment as c,pCommunityLikeComment as l}from"../../../../service/generated/client.mjs";import{Box as u}from"../../../ui/box.mjs";import{InfiniteScroll as ee}from"../../../ui/infinite-scroll.mjs";import{Text as d}from"../../../ui/text.mjs";import{useDeleteRequest as te}from"../../../../hooks/query/use-query.mjs";import{useLoginModalStore as ne}from"../../../../store/modules/login-modal-store.mjs";import{useLikeDislike as re}from"../../../../hooks/use-like-dislike.mjs";import{useKeepAliveEffect as ie,useKeepAliveState as f}from"../../../common/keep-scroll-position/index.mjs";import{isMobileIOS as ae}from"../../../../utils/tools.mjs";import{MediaPreview as oe}from"../../../common/media-preview/index.mjs";import{mapApiCommentToComment as p}from"../../../../types/safe-comment.mjs";import se from"../../../../assets/icons/common/solid-arrow.mjs";import ce from"./comment-input.mjs";import{CommentItem as le}from"./comment-item.mjs";import ue from"./reply-detail.mjs";import{memo as m,useCallback as h,useEffect as de,useMemo as g,useRef as fe,useState as pe}from"react";import{Fragment as me,jsx as _,jsxs as v}from"react/jsx-runtime";import{toast as he}from"sonner";import{useTranslations as ge}from"next-intl";const _e=t(e=>{e()},0),ve=t(e=>{e()},10),ye=t(e=>{try{l({comment_id:e.id,is_like:e.like_flag!==`1`},{revalidate:!1})}catch(e){console.error(`点赞评论失败:`,e)}},200),be=t(e=>{try{c({comment_id:e.id,is_dislike:e.like_flag!==`2`},{revalidate:!1})}catch(e){console.error(`点踩评论失败:`,e)}},200);function xe(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 y(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 Se(e){let t=typeof e.reply_count==`number`?e.reply_count:0,n=Array.isArray(e.sub_comments)?e.sub_comments.length:0,r=t>0?t:n,i=e.is_liked?`1`:e.is_dislike?`2`:`0`,a=b(e.mentioned_users),o=a.length>0?a:Ce(e.content||``),s=String(e.comment_id??e.id??``),c=typeof e.like_count==`number`?e.like_count:0,l=e.is_liked&&c===0?1:c;return p({id:s,reply_cnt:r.toString(),like_cnt:l,dislike_cnt:0,created_at:xe(e.create_time),text:e.content||``,type:`4`,like_flag:i,user_id:e.user_id||``,user_name:e.user?.nickname||e.user?.username||``,avatar:e.user?.avatar_url||``,files:[],at_users:o,nine_grid_content_info:y(e?.images,e?.videos,e?.medias),is_follow:!1})}function b(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 Ce(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 we(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)}const x=m(({information:t,listQueryKey:c,contentId:l,contentType:m,isShow:xe=!0,isClickLoad:y=!1,initialComments:b,initialTotal:x,initialHasMore:S,addCommentCount:Te,onCommentAdded:Ee,onRequireLogin:C,onTotalChange:w,onReplyDetailVisibleChange:T,className:De})=>{let{userInfo:E,userId:Oe,isLogin:D}=a(),{open:ke}=ne(),O=ge(`components.biz.business.comment`),Ae=Te??Ee??(()=>{});function je(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``}let k=h(()=>{C?C():ke()},[C,ke]),A=y?5:20,j=g(()=>b?.length?b.map(Se):[],[b]),M=b!==void 0||typeof x==`number`||typeof S==`boolean`,Me=g(()=>typeof S==`boolean`?S:typeof x==`number`?j.length<x:M?j.length===0?!1:j.length>=A:!0,[M,S,j.length,x,A]),[N,P]=f(`info-detail-comment-list-${l}`,j),[F,I]=f(`info-detail-comment-list-has-more-${l}`,Me),[L,Ne]=f(`info-comment-detail-page-${l}`,j.length>0?2:1),[Pe,R]=f(`info-detail-comment-list-loading-${l}`,!1),[z,B]=f(`info-detail-selected-comment-${l}`,p({id:``,user_id:``})),[V,H]=f(`info-detail-reply-detail-visible-${l}`,!1),[U,W]=pe(!1),G=fe(null),K=h(e=>{typeof window>`u`||window.dispatchEvent(new CustomEvent(`funhub:comment-reply-detail-visible-change`,{detail:{visible:e}}))},[]);de(()=>{K(V),T?.(V)},[K,T,V]),de(()=>()=>{K(!1),T?.(!1)},[K,T]);let q=g(()=>Pe||F&&N.length===0?O(`commentList.loading`):N.length>0&&!F?O(`commentList.noMore`):N.length===0&&!F?O(`commentList.emptyPrompt`):``,[N.length,F,Pe,O]),Fe=g(()=>U?`回复@${z.user_name}`:``,[U,z.user_name]),{getLikedListData:Ie,getDislikedListData:J}=re(),Le=h(()=>{P(e=>e.map(e=>e.id===z.id?{...e,reply_cnt:(Number(e.reply_cnt||0)+1).toString()}:e)),B(e=>({...e,reply_cnt:(Number(e.reply_cnt||0)+1).toString()}))},[z.id,P,B]),Y=h(async()=>{if(l)try{let e=await o({content_id:l,page:L,page_size:A,sort_by:`latest`});if(e.code!==0)throw Error(e.message||O(`commentList.fetchCommentsFailed`));let t=(e.data?.data?.comments??[]).map(Se),n=e.data?.data?.total??0;L===1&&w&&w(n),((e.data?.data?.has_more??!1)===!1||t.length<A)&&I(!1),P(e=>{let n=new Set(e.map(e=>e.id)),r=t.filter(e=>!n.has(e.id));return[...e,...r]}),Ne(L+1)}catch(e){console.error(`获取评论列表失败:`,e),I(!1)}},[l,L,A,P,I,Ne]),X=h(async()=>{R(!0);try{await Y()}catch(e){console.error(`获取评论列表失败:`,e)}R(!1)},[Y,R]);ie(()=>{y&&!M&&X()},[M,y,X],`info-detail-comment-initial-load-more-${l}`),ie(()=>{!M||!w||typeof x==`number`&&w(x)},[M,x,w],`info-detail-comment-initial-total-${l}`);function Re(){_e(()=>{W(!1)})}async function ze({text:e,imageVideoInfoList:t}){try{if(!D)return k(),{success:!1,message:O(`commentList.loginRequired`)};let a=E?.userId||E?.user_id||Oe||``;if(!a)return k(),{success:!1,message:O(`commentList.loginRequired`)};let o=E?.nick_name||E?.nickname||E?.name||E?.user_name||E?.username||``,c=E?.avatar||E?.avatar_url||``,u=we(t),ee=r(e),d=await s({content_id:l,content:i(e),medias:u,mentioned_users:ee,source_type:m===`video`?1:2},{revalidate:!1});if(d.code===0){let r=je(d.data);if(!r||r===`0`)return{success:!1,message:O(`commentList.publishCommentFailed`)};let i=Ce(e),s=p({text:e,id:r,avatar:c,user_id:a,user_name:o,like_cnt:d.data.like_count,created_at:n(),nine_grid_content_info:t,at_users:i});return P(e=>[s,...e]),{success:!0}}else return{success:!1,message:d.message||O(`commentList.publishCommentFailed`)}}catch(e){return console.error(e),{success:!1,message:O(`commentList.publishCommentFailed`)}}}let Z=h(async({text:e,imageVideoInfoList:t,callback:n})=>{try{if(!D)return k(),{success:!1,message:O(`commentList.loginRequired`)};if(!z?.id||z.id===`0`)return{success:!1,message:O(`commentList.invalidReplyTarget`)};let a=we(t),o=r(e),c=await s({content_id:l,content:i(e),medias:a,mentioned_users:o,parent_id:z.id,source_type:m===`video`?1:2},{revalidate:!1});if(c.code!==0)return{success:!1,message:c.message||O(`commentList.publishReplyFailed`)};P(e=>e.map(e=>e.id===z.id?{...e,reply_cnt:(Number(e.reply_cnt)+1).toString()}:e));let u=je(c.data);return!u||u===`0`?{success:!1,message:O(`commentList.publishReplyFailed`)}:(n?.(u),{success:!0})}catch(e){return console.error(`发布回复评论失败:`,e),{success:!1,message:O(`commentList.publishReplyFailed`)}}},[l,m,D,k,z.id,P,O]);async function Be({text:e,imageVideoInfoList:t}){let n=e=>e.success?e:(he.error(e.message||O(`commentList.publishCommentFailed`)),{...e,toastHandled:!0});if(U){let r=await Z({text:e,imageVideoInfoList:t,callback:e=>{}});return W(!1),n(r)}else{let r=await ze({text:e,imageVideoInfoList:t});return r.success&&Ae(),W(!1),n(r)}}let Q=h(e=>{B(e),ae()&&G.current?.focus(),ve(()=>{W(!0),G.current?.focus()})},[B]),$=h(e=>{B(e),H(!0)},[H,B]),Ve=h(e=>{if(e.reply_cnt===`0`){Q(e);return}$(e)},[Q,$]),He=h(e=>{if(!D){C?.();return}P(Ie(N,e.id)),ye(e)},[N,Ie,D,C,P]),Ue=h(e=>{if(!D){C?.();return}e.like_flag!==`2`&&he.message(O(`commentList.dislikeHint`)),P(J(N,e.id)),be(e)},[N,J,D,C,P,O]),We=te();function Ge(){c&&We(c),H(!1)}return v(me,{children:[v(u,{className:e(`w-full pb-[60px]`,De),children:[N.map((e,t)=>_(le,{comment:e,onReply:Q,onViewReplies:$,onReplyAction:Ve,onLike:He,onDislike:Ue,isLogin:D,onRequireLogin:k},`${e.id}-${t}-comment`)),xe&&_(ee,{loadMore:async()=>{await Y()},hasMore:F,initialLoad:!y&&N.length===0&&F!==!1}),y&&v(u,{className:`w-full my-[8px]`,children:[!q&&v(u,{className:`w-[fit-content] h-[42px] flex items-center justify-center mx-[auto]`,onClick:()=>{X()},children:[_(d,{className:`text-text3 text-[14px]`,children:O(`commentList.viewMore`)}),_(se,{className:`w-[8px] h-[auto] ml-[4px] text-text3`})]}),q&&_(u,{className:`w-full h-[42px] flex items-center justify-center`,children:_(d,{className:`text-text3 text-[12px]`,children:q})})]}),_(ce,{placeholder:Fe,onPublish:({text:e,imageVideoInfoList:t})=>Be({text:e,imageVideoInfoList:t}),onInputBlur:Re,onRequireLogin:k,ref:G})]}),_(ue,{visible:V,comment:z,information:t,contentType:m,onClose:Ge,onReplyComment:Z,onReplyAdded:Le,onRequireLogin:k},z.id),_(oe,{})]})});export{x 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{useUserStore as a}from"../../../../store/modules/user-store.mjs";import{gCommunityGetComments as o,pCommunityCreateComment as s,pCommunityDislikeComment as c,pCommunityLikeComment as l}from"../../../../service/generated/client.mjs";import{Box as u}from"../../../ui/box.mjs";import{InfiniteScroll as ee}from"../../../ui/infinite-scroll.mjs";import{Text as d}from"../../../ui/text.mjs";import{isMobileIOS as te}from"../../../../utils/tools.mjs";import{useLoginModalStore as ne}from"../../../../store/modules/login-modal-store.mjs";import{useDeleteRequest as re}from"../../../../hooks/query/use-query.mjs";import{useLikeDislike as ie}from"../../../../hooks/use-like-dislike.mjs";import{useKeepAliveEffect as ae,useKeepAliveState as f}from"../../../common/keep-scroll-position/index.mjs";import{MediaPreview as oe}from"../../../common/media-preview/index.mjs";import{mapApiCommentToComment as p}from"../../../../types/safe-comment.mjs";import se from"../../../../assets/icons/common/solid-arrow.mjs";import ce from"./comment-input.mjs";import{CommentItem as le}from"./comment-item.mjs";import ue from"./reply-detail.mjs";import{memo as m,useCallback as h,useEffect as de,useMemo as g,useRef as fe,useState as pe}from"react";import{Fragment as me,jsx as _,jsxs as v}from"react/jsx-runtime";import{toast as he}from"sonner";import{useTranslations as ge}from"next-intl";const _e=t(e=>{e()},0),ve=t(e=>{e()},10),ye=t(e=>{try{l({comment_id:e.id,is_like:e.like_flag!==`1`},{revalidate:!1})}catch(e){console.error(`点赞评论失败:`,e)}},200),be=t(e=>{try{c({comment_id:e.id,is_dislike:e.like_flag!==`2`},{revalidate:!1})}catch(e){console.error(`点踩评论失败:`,e)}},200);function xe(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 y(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 Se(e){let t=typeof e.reply_count==`number`?e.reply_count:0,n=Array.isArray(e.sub_comments)?e.sub_comments.length:0,r=t>0?t:n,i=e.is_liked?`1`:e.is_dislike?`2`:`0`,a=b(e.mentioned_users),o=a.length>0?a:Ce(e.content||``),s=String(e.comment_id??e.id??``),c=typeof e.like_count==`number`?e.like_count:0,l=e.is_liked&&c===0?1:c;return p({id:s,reply_cnt:r.toString(),like_cnt:l,dislike_cnt:0,created_at:xe(e.create_time),text:e.content||``,type:`4`,like_flag:i,user_id:e.user_id||``,user_name:e.user?.nickname||e.user?.username||``,avatar:e.user?.avatar_url||``,files:[],at_users:o,nine_grid_content_info:y(e?.images,e?.videos,e?.medias),is_follow:!1})}function b(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 Ce(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 we(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)}const x=m(({information:t,listQueryKey:c,contentId:l,contentType:m,isShow:xe=!0,isClickLoad:y=!1,initialComments:b,initialTotal:x,initialHasMore:S,addCommentCount:Te,onCommentAdded:Ee,onRequireLogin:C,onTotalChange:w,onReplyDetailVisibleChange:T,className:De})=>{let{userInfo:E,userId:Oe,isLogin:D}=a(),{open:ke}=ne(),O=ge(`components.biz.business.comment`),Ae=Te??Ee??(()=>{});function je(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``}let k=h(()=>{C?C():ke()},[C,ke]),A=y?5:20,j=g(()=>b?.length?b.map(Se):[],[b]),M=b!==void 0||typeof x==`number`||typeof S==`boolean`,Me=g(()=>typeof S==`boolean`?S:typeof x==`number`?j.length<x:M?j.length===0?!1:j.length>=A:!0,[M,S,j.length,x,A]),[N,P]=f(`info-detail-comment-list-${l}`,j),[F,I]=f(`info-detail-comment-list-has-more-${l}`,Me),[L,Ne]=f(`info-comment-detail-page-${l}`,j.length>0?2:1),[Pe,R]=f(`info-detail-comment-list-loading-${l}`,!1),[z,B]=f(`info-detail-selected-comment-${l}`,p({id:``,user_id:``})),[V,H]=f(`info-detail-reply-detail-visible-${l}`,!1),[U,W]=pe(!1),G=fe(null),K=h(e=>{typeof window>`u`||window.dispatchEvent(new CustomEvent(`funhub:comment-reply-detail-visible-change`,{detail:{visible:e}}))},[]);de(()=>{K(V),T?.(V)},[K,T,V]),de(()=>()=>{K(!1),T?.(!1)},[K,T]);let q=g(()=>Pe||F&&N.length===0?O(`commentList.loading`):N.length>0&&!F?O(`commentList.noMore`):N.length===0&&!F?O(`commentList.emptyPrompt`):``,[N.length,F,Pe,O]),Fe=g(()=>U?`回复@${z.user_name}`:``,[U,z.user_name]),{getLikedListData:Ie,getDislikedListData:J}=ie(),Le=h(()=>{P(e=>e.map(e=>e.id===z.id?{...e,reply_cnt:(Number(e.reply_cnt||0)+1).toString()}:e)),B(e=>({...e,reply_cnt:(Number(e.reply_cnt||0)+1).toString()}))},[z.id,P,B]),Y=h(async()=>{if(l)try{let e=await o({content_id:l,page:L,page_size:A,sort_by:`latest`});if(e.code!==0)throw Error(e.message||O(`commentList.fetchCommentsFailed`));let t=(e.data?.data?.comments??[]).map(Se),n=e.data?.data?.total??0;L===1&&w&&w(n),((e.data?.data?.has_more??!1)===!1||t.length<A)&&I(!1),P(e=>{let n=new Set(e.map(e=>e.id)),r=t.filter(e=>!n.has(e.id));return[...e,...r]}),Ne(L+1)}catch(e){console.error(`获取评论列表失败:`,e),I(!1)}},[l,L,A,P,I,Ne]),X=h(async()=>{R(!0);try{await Y()}catch(e){console.error(`获取评论列表失败:`,e)}R(!1)},[Y,R]);ae(()=>{y&&!M&&X()},[M,y,X],`info-detail-comment-initial-load-more-${l}`),ae(()=>{!M||!w||typeof x==`number`&&w(x)},[M,x,w],`info-detail-comment-initial-total-${l}`);function Re(){_e(()=>{W(!1)})}async function ze({text:e,imageVideoInfoList:t}){try{if(!D)return k(),{success:!1,message:O(`commentList.loginRequired`)};let a=E?.userId||E?.user_id||Oe||``;if(!a)return k(),{success:!1,message:O(`commentList.loginRequired`)};let o=E?.nick_name||E?.nickname||E?.name||E?.user_name||E?.username||``,c=E?.avatar||E?.avatar_url||``,u=we(t),ee=r(e),d=await s({content_id:l,content:i(e),medias:u,mentioned_users:ee,source_type:m===`video`?1:2},{revalidate:!1});if(d.code===0){let r=je(d.data);if(!r||r===`0`)return{success:!1,message:O(`commentList.publishCommentFailed`)};let i=Ce(e),s=p({text:e,id:r,avatar:c,user_id:a,user_name:o,like_cnt:d.data.like_count,created_at:n(),nine_grid_content_info:t,at_users:i});return P(e=>[s,...e]),{success:!0}}else return{success:!1,message:d.message||O(`commentList.publishCommentFailed`)}}catch(e){return console.error(e),{success:!1,message:O(`commentList.publishCommentFailed`)}}}let Z=h(async({text:e,imageVideoInfoList:t,callback:n})=>{try{if(!D)return k(),{success:!1,message:O(`commentList.loginRequired`)};if(!z?.id||z.id===`0`)return{success:!1,message:O(`commentList.invalidReplyTarget`)};let a=we(t),o=r(e),c=await s({content_id:l,content:i(e),medias:a,mentioned_users:o,parent_id:z.id,source_type:m===`video`?1:2},{revalidate:!1});if(c.code!==0)return{success:!1,message:c.message||O(`commentList.publishReplyFailed`)};P(e=>e.map(e=>e.id===z.id?{...e,reply_cnt:(Number(e.reply_cnt)+1).toString()}:e));let u=je(c.data);return!u||u===`0`?{success:!1,message:O(`commentList.publishReplyFailed`)}:(n?.(u),{success:!0})}catch(e){return console.error(`发布回复评论失败:`,e),{success:!1,message:O(`commentList.publishReplyFailed`)}}},[l,m,D,k,z.id,P,O]);async function Be({text:e,imageVideoInfoList:t}){let n=e=>e.success?e:(he.error(e.message||O(`commentList.publishCommentFailed`)),{...e,toastHandled:!0});if(U){let r=await Z({text:e,imageVideoInfoList:t,callback:e=>{}});return W(!1),n(r)}else{let r=await ze({text:e,imageVideoInfoList:t});return r.success&&Ae(),W(!1),n(r)}}let Q=h(e=>{B(e),te()&&G.current?.focus(),ve(()=>{W(!0),G.current?.focus()})},[B]),$=h(e=>{B(e),H(!0)},[H,B]),Ve=h(e=>{if(e.reply_cnt===`0`){Q(e);return}$(e)},[Q,$]),He=h(e=>{if(!D){C?.();return}P(Ie(N,e.id)),ye(e)},[N,Ie,D,C,P]),Ue=h(e=>{if(!D){C?.();return}e.like_flag!==`2`&&he.message(O(`commentList.dislikeHint`)),P(J(N,e.id)),be(e)},[N,J,D,C,P,O]),We=re();function Ge(){c&&We(c),H(!1)}return v(me,{children:[v(u,{className:e(`w-full pb-[60px]`,De),children:[N.map((e,t)=>_(le,{comment:e,onReply:Q,onViewReplies:$,onReplyAction:Ve,onLike:He,onDislike:Ue,isLogin:D,onRequireLogin:k},`${e.id}-${t}-comment`)),xe&&_(ee,{loadMore:async()=>{await Y()},hasMore:F,initialLoad:!y&&N.length===0&&F!==!1}),y&&v(u,{className:`w-full my-[8px]`,children:[!q&&v(u,{className:`w-[fit-content] h-[42px] flex items-center justify-center mx-[auto]`,onClick:()=>{X()},children:[_(d,{className:`text-text3 text-[14px]`,children:O(`commentList.viewMore`)}),_(se,{className:`w-[8px] h-[auto] ml-[4px] text-text3`})]}),q&&_(u,{className:`w-full h-[42px] flex items-center justify-center`,children:_(d,{className:`text-text3 text-[12px]`,children:q})})]}),_(ce,{placeholder:Fe,onPublish:({text:e,imageVideoInfoList:t})=>Be({text:e,imageVideoInfoList:t}),onInputBlur:Re,onRequireLogin:k,ref:G})]}),_(ue,{visible:V,comment:z,information:t,contentType:m,onClose:Ge,onReplyComment:Z,onReplyAdded:Le,onRequireLogin:k},z.id),_(oe,{})]})});export{x 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{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 v from"../../../../assets/icons/close.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/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{useRouter as P}from"next/navigation";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=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=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(M,{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 w=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}w()},[w,m,c,i]);function E(){_(!1),w()}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(x,{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(S,{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(C,{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 v=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:v,onDislikeReply:x},`${e.id}-${t}`)),H(_,{loadMore:T,hasMore:c})]})});function ce({replyItem:e,replyComment:t,onLikeReply:n,onDislikeReply:r}){let i=G(`components.biz.business.comment`),a=P(),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(m,{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(j,{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(T,{className:`w-[14px] h-[14px]`}):H(w,{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(O,{className:`w-[14px] h-[14px]`}):H(D,{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(A,{className:`text-text1 text-[14px] leading-[22px] break-all`,text:e.text,atUsers:e.at_users}),H(k,{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(A,{text:e.parent_reply.text,atUsers:e.parent_reply.at_users})})]})]}),H(`div`,{className:`mt-1`,children:H(k,{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 _=G(`components.biz.business.comment`),y=z(null),[b,x]=B(()=>N({})),[S,C]=B(!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=z({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``}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(D);n?r.add(e.user_id):r.delete(e.user_id),O(Array.from(r))})())))},[e,D,k,O,l]);let F=I(e=>{x(e),setTimeout(()=>{C(!0),y.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||_(`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(!b?.id||b.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:b.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=b,J?.(d),f?.(),{success:!0}}catch(e){return console.error(`发布回复回复失败:`,e),{success:!1,message:_(`replyDetail.publishReplyFailed`)}}}let[J,Y]=B(null),X=I(e=>{Y(()=>e)},[]),Q=S?`回复@${b.user_name}`:``;function $(e){e||u()}return H(h,{open:l,onOpenChange:$,children:U(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:[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(v,{className:`w-[16px] h-[16px] text-text1`})}),H(`span`,{className:`text-[18px] font-bold`,children:_(`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(E,{placeholder:Q,onInputBlur:R,onPublish:V,onRequireLogin:m,ref:y})]})]})})}export{le as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
|
|
2
|
-
"use client";import{useUserStore as e}from"../../../../store/modules/user-store.mjs";import{Box as t}from"../../../ui/box.mjs";import{Text as n}from"../../../ui/text.mjs";import{
|
|
2
|
+
"use client";import{useUserStore as e}from"../../../../store/modules/user-store.mjs";import{Box as t}from"../../../ui/box.mjs";import{Text as n}from"../../../ui/text.mjs";import{debounceFun as r}from"../../../../utils/tools.mjs";import{useLoginModalStore as i}from"../../../../store/modules/login-modal-store.mjs";import{useDeleteRequest as a}from"../../../../hooks/query/use-query.mjs";import o from"../../../common/collection-popup/index.mjs";import{useContentOperate as s}from"../../../../hooks/use-content-operate.mjs";import c from"../../../common/interaction-animations.module.mjs";import l from"../../../../assets/icons/detail/check-ok.mjs";import u from"../../../../assets/icons/detail/collect_nor.mjs";import d from"../../../../assets/icons/detail/collect_sel.mjs";import f from"../../../../assets/icons/detail/give_like.mjs";import p from"../../../../assets/icons/detail/give_like_sel.mjs";import m from"../../../../assets/icons/detail/share.mjs";import{useCallback as h,useMemo as g,useRef as _,useState as v}from"react";import{jsx as y,jsxs as b}from"react/jsx-runtime";import{toast as x}from"sonner";import{useTranslations as S}from"next-intl";function C({information:C,onUpdate:E}){let D=S(`components.biz.business.detail`),[O,k]=v(!1),[A,j]=v(!1),M=_(0),N=e(e=>e.userId),P=e(e=>e.isLogin),F=a(),I=h(()=>{N&&(F([`user-profile`,`mine`,N,`user-like-video`]),F([`user-profile`,`mine`,N,`user-like-post`]),F([`user-profile`,`mine`,N,`user-collect-video`,N]),F([`user-profile`,`mine`,N,`user-collect-post`,N]))},[F,N]),{likeAnimation:L,handleLikeOperate:R,handleDefaultCollectionOperate:z,handleShareOperate:B}=s({id:C.id,isLike:C.like||!1,isDislike:C.dislike||!1,isCollect:C.collect||!1,likeCnt:T(C.static?.like_cnt),dislikeCnt:T(C.static?.dislike_cnt),contentType:C.content_type,prefetchDefaultCollection:!0,animationClasses:{like:c.likeShakeAnimation,dislike:c.dislikeShakeAnimation}}),V=h(e=>{E?.({...e})},[E]),H=h(async()=>{if(O)return;if(!P){i.getState().open();return}let e=Date.now();if(e-M.current<300)return;M.current=e,k(!0);let t=C.like||!1,n=C.dislike||!1,r=T(C.static?.like_cnt),a=T(C.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;V({like:o,dislike:c,static:{...C.static,like_cnt:s,dislike_cnt:l}});try{let e=await R();if(!e){V({like:t,dislike:n,static:{...C.static,like_cnt:r,dislike_cnt:a}});return}V({like:e.isLike,dislike:e.isDislike??c,static:{...C.static,like_cnt:e.likeCnt,dislike_cnt:e.dislikeCnt??l}}),I(),window.sensors?.track?.(`detail_like_click`,{object_id:C.id,action:e.isLike?`点赞`:`取消点赞`,like_count:e.likeCnt})}catch(e){console.error(`点赞操作失败:`,e),x.error(D(`detailOperate.operateFailed`))}finally{k(!1)}},[R,C,I,O,P,D,V]),U=g(()=>C.id,[C.id]),W=h(()=>{B(({isCollect:e})=>{V({collect:e})},U)},[B,U,V]);async function G(e){return await new Promise(e=>setTimeout(e,300)),e}let K=h(()=>{o.show({mode:`select`,onCollect:async e=>{try{await G({contentId:C.id,collectionId:e}),V({collect:!0}),I(),x.success(D(`detailOperate.modifyCollectionSuccess`))}catch(e){console.error(`修改收藏夹失败:`,e),x.error(D(`detailOperate.collectFailed`))}}})},[C.id,I,D,V]),q=h(e=>{let t=e||D(`detailOperate.defaultCollection`);x.custom(e=>b(`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:[b(`div`,{className:`flex items-center gap-[10px]`,children:[y(`div`,{className:`w-[24px] h-[24px] rounded-full bg-white flex items-center justify-center`,children:y(l,{className:`w-[14px] h-[14px]`})}),b(`div`,{className:`flex items-center gap-[6px]`,children:[y(`span`,{className:`text-[14px] leading-[20px]`,children:D(`detailOperate.collectAdded`)}),y(`span`,{className:`text-[14px] leading-[20px] font-semibold`,children:t})]})]}),y(`button`,{type:`button`,className:`text-[14px] text-theme5 font-semibold`,onClick:()=>{x.dismiss(e),K()},children:D(`detailOperate.modifyCollection`)})]}))},[K,D]),J=h(async()=>{if(A)return;if(!P){i.getState().open();return}let e=C.collect||!1;j(!0),window.sensors?.track?.(`detail_fav_click`,{object_id:C.id,action:e?`取消收藏`:`收藏`});try{let t=await z({currentCollect:e,onUpdate:({isCollect:e})=>{V({collect:e})}});if(!t?.success){x.error(t?.message||D(`detailOperate.collectFailed`));return}I(),window.sensors?.track?.(`detail_fav_click`,{object_id:C.id,action:t.isCollect?`收藏`:`取消收藏`}),!e&&t.isCollect&&q(t.collectionTitle)}catch(e){console.error(`收藏操作失败:`,e),x.error(e?.message||D(`detailOperate.collectFailed`))}finally{j(!1)}},[z,C.collect,C.id,I,A,P,q,D,V]),Y=g(()=>r(J,300),[J]);return b(t,{className:`w-full h-[42px] mt-[16px] flex items-center justify-between`,children:[b(t,{className:`w-[25%] h-full flex flex-col items-center justify-center ${O?`opacity-50 cursor-not-allowed`:`cursor-pointer`}`,onClick:H,children:[C.like?y(p,{className:`w-[20px] h-[20px] ${L.animationClass}`}):y(f,{className:`w-[20px] h-[20px] text-text2`}),y(n,{className:`text-[12px] text-text2 leading-[20px]`,children:C.static?C.static.like_cnt===0?D(`detailOperate.like`):w(C.static?.like_cnt):D(`detailOperate.like`)})]}),b(t,{className:`w-[25%] h-full flex flex-col items-center justify-center ${A?`opacity-50 cursor-not-allowed`:`cursor-pointer`}`,onClick:Y,children:[C.collect?y(d,{className:`w-[20px] h-[20px]`}):y(u,{className:`w-[20px] h-[20px] text-text2`}),y(n,{className:`text-[12px] text-text2 leading-[20px]`,children:D(`detailOperate.collection`)})]}),b(t,{className:`w-[25%] h-full flex flex-col items-center justify-center cursor-pointer`,onClick:W,children:[y(m,{className:`w-[20px] h-[20px] text-text2`}),y(n,{className:`text-[12px] text-text2 leading-[20px]`,children:D(`detailOperate.share`)})]})]})}function w(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 T(e){if(e==null)return 0;if(typeof e==`number`)return e;let t=Number(e);return Number.isNaN(t)?0:t}export{C as DetailOperate};
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
import { SchemaHasDefaultValue } from "../../../../../utils/schema/schema.mjs";
|
|
3
3
|
import { DefineMaterialOption } from "../../../../../utils/schema/material.mjs";
|
|
4
4
|
import { MaterialMap } from "../../../../../utils/schema/utils.mjs";
|
|
5
|
-
import {
|
|
6
|
-
import "./video-detail-
|
|
5
|
+
import { VideoDetailPlayerClient } from "./video-detail-player/client.mjs";
|
|
6
|
+
import "./video-detail-player/index.mjs";
|
|
7
7
|
import { VideoDetailInfoClient } from "./video-detail-info/client.mjs";
|
|
8
8
|
import "./video-detail-info/index.mjs";
|
|
9
9
|
import { VideoDetailInfoTitleClient } from "./video-detail-info-title/client.mjs";
|
|
10
10
|
import "./video-detail-info-title/index.mjs";
|
|
11
11
|
import { VideoDetailInfoTitleTagsEpisodesClient } from "./video-detail-info-title-tags-episodes/client.mjs";
|
|
12
12
|
import "./video-detail-info-title-tags-episodes/index.mjs";
|
|
13
|
-
import {
|
|
14
|
-
import "./video-detail-
|
|
13
|
+
import { VideoDetailActionsClient } from "./video-detail-actions/client.mjs";
|
|
14
|
+
import "./video-detail-actions/index.mjs";
|
|
15
15
|
import { VideoDetailRecommendClient } from "./video-detail-recommend/client.mjs";
|
|
16
16
|
import "./video-detail-recommend/index.mjs";
|
|
17
17
|
import "../../../../../utils.mjs";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
|
+
import { SafeInformationType } from "../../../../../../types/safe-information.mjs";
|
|
2
3
|
import { InferSchemaProps } from "../../../../../../utils/schema/schema.mjs";
|
|
3
4
|
import "../../../../../../utils/schema/index.mjs";
|
|
4
|
-
import { SafeInformationType } from "../../../../../../types/safe-information.mjs";
|
|
5
5
|
import * as zod from "zod";
|
|
6
6
|
import * as zod_v4_core0 from "zod/v4/core";
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
|
+
import { SafeInformationType } from "../../../../../../types/safe-information.mjs";
|
|
2
3
|
import { InferSchemaProps, SchemaHasDefaultValue } from "../../../../../../utils/schema/schema.mjs";
|
|
3
4
|
import "../../../../../../utils/schema/index.mjs";
|
|
4
|
-
import { SafeInformationType } from "../../../../../../types/safe-information.mjs";
|
|
5
5
|
import * as zod from "zod";
|
|
6
6
|
import * as zod_v4_core0 from "zod/v4/core";
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
|
+
import { SafeInformationType } from "../../../../../../types/safe-information.mjs";
|
|
2
3
|
import { InferSchemaProps } from "../../../../../../utils/schema/schema.mjs";
|
|
3
4
|
import "../../../../../../utils/schema/index.mjs";
|
|
4
|
-
import { SafeInformationType } from "../../../../../../types/safe-information.mjs";
|
|
5
5
|
import * as zod from "zod";
|
|
6
6
|
import * as zod_v4_core0 from "zod/v4/core";
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
|
+
import { SafeInformationType } from "../../../../../../types/safe-information.mjs";
|
|
2
3
|
import { InferSchemaProps, SchemaHasDefaultValue } from "../../../../../../utils/schema/schema.mjs";
|
|
3
4
|
import "../../../../../../utils/schema/index.mjs";
|
|
4
|
-
import { SafeInformationType } from "../../../../../../types/safe-information.mjs";
|
|
5
5
|
import * as zod from "zod";
|
|
6
6
|
import * as zod_v4_core0 from "zod/v4/core";
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
|
+
import { SafeInformationType } from "../../../../../../types/safe-information.mjs";
|
|
2
3
|
import { InferSchemaProps } from "../../../../../../utils/schema/schema.mjs";
|
|
3
4
|
import "../../../../../../utils/schema/index.mjs";
|
|
4
|
-
import { SafeInformationType } from "../../../../../../types/safe-information.mjs";
|
|
5
5
|
import * as zod from "zod";
|
|
6
6
|
import * as zod_v4_core0 from "zod/v4/core";
|
|
7
7
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
|
|
2
|
-
"use client";import{gContentGetGuessYouLikeVideos as e}from"../../../../../../service/generated/client.mjs";import{Box as t}from"../../../../../ui/box.mjs";import{Text as n}from"../../../../../ui/text.mjs";import{
|
|
2
|
+
"use client";import{gContentGetGuessYouLikeVideos as e}from"../../../../../../service/generated/client.mjs";import{Box as t}from"../../../../../ui/box.mjs";import{Text as n}from"../../../../../ui/text.mjs";import{useAppContext as r}from"../../../../../../hooks/use-app-context/index.mjs";import{MiniThreeCard as i}from"../../../../../common/cards/mini-three-card.mjs";import{useRequest as a}from"../../../../../../hooks/query/use-query.mjs";import{useCardDecoration as o}from"../../../../../../hooks/use-card-decoration.mjs";import s from"../../../../../../assets/icons/detail/video_flag.mjs";import{applyPlayCountDelta as c,buildEpisodeLabel as l,clampColumns as u,mergeManualAndPool as d,mockPagedList as f,resolveRows as p}from"./utils.mjs";import{useEffect as m,useMemo as h,useRef as g,useState as _}from"react";import{jsx as v,jsxs as y}from"react/jsx-runtime";import{useTranslations as b}from"next-intl";function x({detailId:x,rows:C,columns:w,smartTagEnabled:T,smartTagIds:E,title:D,showPlayCount:O,playCountDelta:k,showEpisode:A,enableInfinite:j,items:M}){let N=r(),P=b(`components.biz.business.detail`),{getVerticalHoCoverImageUrl:F,getTitleText:I}=o(),[L,R]=_(1),z=g(null),B=h(()=>E??[],[E]),V=h(()=>M??[],[M]),{data:H}=a([`video-detail-recommend`,x],async()=>!x||N===`editor`?null:await e(),{enabled:N===`renderer`&&!!x}),U=h(()=>{let e=H?.data?.videos;return Array.isArray(e)?e.map(e=>S(e)).filter(e=>!x||!e.id||e.id!==x):[]},[H?.data?.videos,x]),W=p(C,j),G=u(w),K=W*G,q=h(()=>new Set(V.map(e=>e.contentId)),[V]),J=h(()=>{let e=U.filter(e=>!q.has(e.id));if(!T||B.length===0)return e;let t=new Set(B.map(String));return e.filter(e=>(Array.isArray(e.source_tags)?e.source_tags:String(e.source_tags||``).split(`,`).filter(Boolean)).some(e=>t.has(String(e?.id??e))))},[q,U,T,B]),Y=h(()=>{if(!V.length)return[];let e=new Map(J.map(e=>[e.id,e]));return V.map(t=>{let n=e.get(t.contentId);if(!n)return null;let r=t.titleMode===`custom`?t.title:I(n),i=t.coverMode===`upload`?t.coverUrl:F(n);return{info:{...n,name:r||n.name,img_y:i||n.img_y,img_x:i||n.img_x},config:{showPlayCount:t.showPlayCount,playCountDelta:t.playCountDelta,showEpisode:t.showEpisode}}}).filter(Boolean)},[J,I,F,V]),X=h(()=>J.map(e=>({info:e})),[J]),Z=h(()=>d(Y,X,K),[Y,K,X]),Q=h(()=>{if(!j)return Z;let e=f(X,L,K,5);return L===1?Z:Z.concat(e)},[Z,j,L,K,X]),$=j&&L<5&&X.length>0;return m(()=>{j&&R(1)},[x,j]),m(()=>{if(!j)return;let e=z.current;if(!e||!$)return;let t=new IntersectionObserver(e=>{e[0]?.isIntersecting&&R(e=>Math.min(e+1,5))});return t.observe(e),()=>{t.disconnect()}},[j,$]),Q.length?y(t,{className:`w-full mt-[16px]`,children:[v(n,{className:`block pl-[12px] mb-[8px] text-text1 text-[18px] leading-[26px] font-bold`,children:D||P(`detailGuessLike.title`)}),v(t,{className:`w-full flex flex-wrap px-[12px]`,children:Q.map((e,t)=>{let n=e.config?.showPlayCount??O,r=e.config?.playCountDelta??k,a=e.config?.showEpisode??A,o=ee(c(e.info.play_count||0,r)),u=l(Number(e.info.update_status)===1?`done`:`updating`,e.info.episode_cnt||e.info.links?.length,e.info.episode_cnt||e.info.links?.length),d=Number.isFinite(G)&&G>0?`${100/G}%`:`33.333333%`;return v(i,{url:F(e.info),text:I(e.info),style:{width:d},bottomLeftChild:n?y(`div`,{className:`h-[20px] leading-[20px] text-[#fff] text-[12px] px-[4px] rounded-[4px] bg-[#333] ml-[4px] flex items-center`,children:[v(s,{className:`w-[16px] h-[auto] text-[#fff] mr-[4px]`}),o]}):null,bottomRightChild:a&&u?v(`div`,{className:`text-[#F59E0B] text-[12px] font-bold leading-[20px] pr-[8px]`,children:u}):null,linkPath:te(e.info)},`guess-like-${t}`)})}),j&&v(`div`,{ref:z,className:`h-[1px] w-full`})]}):null}function S(e){return{id:e.video_id||``,mid:``,name:e.name||``,cat_id:``,cat_name:``,status:`1`,status_text:``,create_time:``,content_type:0,episode_cnt:e.episode_count||0,show_at:e.show_at??``,position:``,img_type:e.img_type??``,img_x:e.img_x??``,img_y:e.img_y??``,img_width:``,img_height:``,play_count:e.play_count,preview_images:[],duration:String(e.duration??``),score:String(e.score??``),is_more_link:e.is_more_link?`y`:`n`,update_status:String(e.update_status??``),description:e.description??``,language:``,director:``,actor:``,area:``,issue_date:``,publisher:``,series:``,number:``,tags:[],source_tags:e.source_tags??``,source_actor:[],links:Array.isArray(e.episodes)?e.episodes.map(e=>({id:e.id??``,name:e.name??``,preview_m3u8_url:e.preview_m3u8_url??``,m3u8_url:e.m3u8_url??``})):[],money:``,up_user:``,source_username:``,task_id:``,file_status:``}}function ee(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 te(e){if(e.content_type===0){let t=encodeURIComponent(e.name||``);return`/video/${e.id}/${t}/episode/1`}return`/post/${e.id}`}export{x as VideoDetailRecommendClient};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
|
|
2
|
-
"use client";import{cn as e}from"../../../../utils/cn.mjs";import{pxToVw as t}from"../../../../utils/helper.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{useBrowseReport as a}from"../../../../hooks/use-browse-report.mjs";import{MediaPreview as o,useMediaPreview as s}from"../../../common/media-preview/index.mjs";import
|
|
2
|
+
"use client";import{cn as e}from"../../../../utils/cn.mjs";import{pxToVw as t}from"../../../../utils/helper.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{useBrowseReport as a}from"../../../../hooks/use-browse-report.mjs";import{MediaPreview as o,useMediaPreview as s}from"../../../common/media-preview/index.mjs";import{UserActivityMediaGrid as c}from"../../../common/list/user-activity-list/user-activity-list-item.mjs";import l from"../../../common/video-player/index.mjs";import{memo as u,useCallback as d,useEffect as f,useMemo as p,useRef as m}from"react";import{Fragment as h,jsx as g,jsxs as _}from"react/jsx-runtime";import{useTranslations as v}from"next-intl";const y=u(({information:t,isVideo:n,episodeIndex:a=0,resumeProgressSeconds:l=0,className:u=``})=>{let d=p(()=>({id:t.id,name:t.name,preview_images:t.preview_images,img_y:t.img_y,img_x:t.img_x}),[t.id,t.name,t.preview_images,t.img_y,t.img_x]),f=p(()=>{let e=t?.medias,n=Array.isArray(e)?e.filter(Boolean):[];return n.length>0?n:(d.preview_images?.length?d.preview_images:[d.img_y||d.img_x||``].filter(Boolean)).filter(Boolean).map(e=>({media_url:e,is_video:!1,cover_image:``}))},[d.img_x,d.img_y,d.preview_images,t]),m=s(),h=p(()=>f.filter(Boolean).map(e=>{let n=e?.is_video?`video`:`image`,r=String(e?.media_url||``),i=e?.cover_image||t.img_y||t.img_x;return{src:r,type:n,...i?{cover:String(i)}:{}}}).filter(e=>!!e.src),[t.img_x,t.img_y,f]);return n?g(b,{information:t,episodeIndex:a,resumeProgressSeconds:l}):_(`div`,{className:e(`w-full`,u),children:[_(r,{className:`mt-3 px-[12px] space-y-1`,children:[g(i,{as:`p`,className:`break-all`,dangerouslySetInnerHTML:{__html:t.description}}),g(c,{medias:f,onItemClick:e=>{h.length&&m.open(h,e)}})]}),g(o,{})]})});y.displayName=`DetailHero`;const b=u(({information:e,episodeIndex:t,resumeProgressSeconds:n})=>{let r=p(()=>({id:e.id,mid:e.mid,img_width:e.img_width,img_height:e.img_height,img_y:e.img_y,img_x:e.img_x,preview_images:e.preview_images}),[e.id,e.mid,e.img_width,e.img_height,e.img_y,e.img_x,e.preview_images]);return g(x,{information:{...e,...r},episodeIndex:t,resumeProgressSeconds:n})},(e,t)=>{let n=e.information,r=t.information;return n.id===r.id&&n.mid===r.mid&&n.img_width===r.img_width&&n.img_height===r.img_height&&n.img_y===r.img_y&&n.img_x===r.img_x&&e.resumeProgressSeconds===t.resumeProgressSeconds&&e.episodeIndex===t.episodeIndex});b.displayName=`StableDetailPlayerBox`;function x({information:e,episodeIndex:i,resumeProgressSeconds:o}){let s=v(`components.biz.business.detail`),c=m(0),u=m(0),y=Math.max(0,Number(i)||0),b=y+1,x=p(()=>e?.id,[e?.id]),T=p(()=>({id:e.id,mid:e.mid,img_width:e.img_width,img_height:e.img_height,img_y:e.img_y,img_x:e.img_x,preview_images:e.preview_images,links:e.links}),[e.id,e.mid,e.img_width,e.img_height,e.img_y,e.img_x,e.preview_images,e.links]),E=p(()=>T.mid||T.id,[T.id,T.mid]),D=p(()=>{let e=T.links?.[y]?.id;return e?String(e):`ep-${y+1}`},[y,T.links]),O=p(()=>`__reportData_detail_page__${T.id}:${D}`,[D,T.id]),k=p(()=>{if(typeof window>`u`)return 0;try{let e=sessionStorage.getItem(O);if(!e)return 0;let t=JSON.parse(e),n=Number(t.currentTime||0),r=Number(t.duration||0);if(!Number.isFinite(n)||!Number.isFinite(r))return 0;if(n>0&&r>0)return n}catch(e){console.error(`读取 sessionStorage 数据失败:`,e)}return 0},[O]),A=p(()=>{let e=Number(o||0);return Number.isFinite(e)&&e>0?e:0},[o]),j=p(()=>A>0?A:k,[A,k]),M=p(()=>{let t=w(e),n=t[t.length?Math.max(0,Math.min(y,t.length-1)):0]?.url||``,r=!!t.length;if(!r)return{hasVideo:!1,hlsList:[],videoUrl:``,width:1,height:1,resolution:`0x0`,aspectRatio:1,poster:``};let i=Number(T.img_width||0)||1,a=Number(T.img_height||0)||1;return{hasVideo:r,hlsList:t,videoUrl:n,width:i,height:a,resolution:S(i,a),aspectRatio:(i||1)/(a||1),poster:T.img_y||T.img_x||T.preview_images?.[0]||``}},[e.id,e.links,y,T.img_width,T.img_height,T.img_y,T.img_x,T.preview_images]),N=d((e,t)=>{c.current=e,u.current=t},[]),P=p(()=>M.videoUrl.endsWith(`m3u8`)?{startTimeSeconds:j,preload:`none`}:{startTimeSeconds:j},[j,M.videoUrl]);f(()=>{c.current=0,u.current=0},[x,y]);let F=a({contentId:x,browseEpisode:b,contentType:1,enabled:!!x,intervalMs:60*1e3,getCurrentTimeSeconds:()=>c.current,getDurationSeconds:()=>u.current});if(f(()=>{let e=()=>{if(!(typeof window>`u`)&&!(c.current<=0||u.current<=0))try{sessionStorage.setItem(O,JSON.stringify({episodeId:D,currentTime:c.current,duration:u.current}))}catch(e){console.error(`写入 sessionStorage 失败:`,e)}},t=()=>{e()},n=()=>{document.visibilityState===`hidden`&&e()},r=()=>{e()};return window.addEventListener(`beforeunload`,t),document.addEventListener(`visibilitychange`,n),window.addEventListener(`popstate`,r),()=>{window.removeEventListener(`beforeunload`,t),document.removeEventListener(`visibilitychange`,n),window.removeEventListener(`popstate`,r),e()}},[D,O]),!M.hasVideo)return g(`div`,{className:`mt-3 rounded-xl bg-bg1 px-3 py-10 text-center text-text3`,children:s(`videoHero.noVideos`)});let I=C(430,M.aspectRatio,242),L=I.height>0?t(I.height):`auto`,R=t(242);return _(h,{children:[g(r,{suppressHydrationWarning:!0,className:`w-full`,style:{height:L,maxWidth:`100%`,maxHeight:R}}),_(r,{className:`w-full relative bg-bg2 !fixed !top-[44px] !left-0 z-[10]`,children:[M.poster&&_(`div`,{className:`w-full h-full bg-bg2 absolute top-0 left-0 z-[1] overflow-hidden`,style:{height:L},children:[g(n,{src:M.poster,alt:s(`videoHero.coverAlt`),fill:!0,className:`object-cover`,priority:!0}),g(`div`,{className:`w-full h-full absolute top-0 left-0 z-[1] bg-[rgba(255,255,255,0.2)] backdrop-blur-[4px]`})]}),g(r,{suppressHydrationWarning:!0,"data-aspect-ratio":M.resolution,className:`w-full overflow-hidden flex justify-center relative z-[2]`,style:{height:L,maxWidth:`100%`,maxHeight:R,backdropFilter:`blur(0)`,WebkitBackdropFilter:`blur(0)`},children:g(l,{plyerId:`detail-player-${T.id}-${y}`,parentId:E,resolution:M.resolution||`0x0`,videoUrl:M.videoUrl,poster:M.poster,mergeConfig:P,onProgressUpdate:N,onPlay:F.handlePlay,onPause:F.handlePause,onEnded:F.handleEnded},`stable-player-${T.id}-${y}`)})]})]})}function S(e,t){return!e||!t?``:`${e}x${t}`}function C(e,t,n){let r=e/t;return r<=n?{width:e,height:r}:{width:n*t,height:n}}function w(e){let t=e.links||[];return t.length>0?t.map((e,t)=>({text:e.name||String(t+1),url:e.m3u8_url||e.preview_m3u8_url||``,definition:``,isDefault:t===0})).filter(e=>e.url):[]}export{y as DetailHero};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
|
|
2
|
-
"use client";import{mergeStyles as e}from"../../../../utils/styles/helpers.mjs";import{useUserStore as t}from"../../../../../../store/modules/user-store.mjs";import{gContentGetAppChannelBlockData as n}from"../../../../../../service/generated/client.mjs";import{checkFollowStatus as r}from"../../../../../../utils/follow-service.mjs";import{useKeepAliveEffect as i,useKeepAliveState as a}from"../../../../../common/keep-scroll-position/index.mjs";import{
|
|
2
|
+
"use client";import{mergeStyles as e}from"../../../../utils/styles/helpers.mjs";import{useUserStore as t}from"../../../../../../store/modules/user-store.mjs";import{gContentGetAppChannelBlockData as n}from"../../../../../../service/generated/client.mjs";import{checkFollowStatus as r}from"../../../../../../utils/follow-service.mjs";import{useKeepAliveEffect as i,useKeepAliveState as a}from"../../../../../common/keep-scroll-position/index.mjs";import{batchQueryContentInteractions as o}from"../../../../../../hooks/use-content-operate.mjs";import{adaptFeedItemToSafeInformation as s,normalizeToFeedItem as ee}from"../../../../basics/fullscreen-feed/runtime/adapters.mjs";import{buildInteractionMap as te,collectPendingInteractionIds as ne,mergeInteractionIntoFeedItems as re}from"../../../../basics/fullscreen-feed/runtime/interaction-sync.mjs";import{defaultProps as ie}from"../../../../basics/fullscreen-feed/defaults/default-props.mjs";import{useCallback as c,useEffect as l,useMemo as u,useRef as d}from"react";function f(e){return!!e&&typeof e==`object`&&(`data`in e||`props`in e||`styles`in e||`events`in e)}function p(e){let t=String(e?.content_id??e?.id??``),n=e?.author,r=Array.isArray(e?.medias)?e.medias:[],i=String(e?.content||``),a=e?.title?String(e.title):i.length>18?`${i.slice(0,18)}...`:i;return{id:t,mid:t,show_at:e?.create_time||``,name:a,img_y:e?.cover_image||``,preview_images:r,description:e?.content||``,tags:[],links:[],up_user:e?.user_id||n?.user_id||``,source_username:n?.nick_name||``,type:e?.type,is_liked:!!e?.is_liked,is_dislike:!!e?.is_dislike,is_collected:!!e?.is_collected,is_followed:!!e?.is_followed,author:n?{user_id:n.user_id||``,nick_name:n.nick_name||``,user_name:n.user_name||n.username||n.nick_name||``,avatar:n.avatar||``,is_verified:!!n.is_verified}:void 0,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}}}function m(e){let t=p(e);return t.id?{kind:`post`,id:t.id,title:t.name,content:e?.content||``,images:t.preview_images||[],originalData:t}:null}function ae(e){return!e||typeof e!=`object`?null:`kind`in e&&`originalData`in e?e:`content_id`in e||`comment_count`in e||`like_count`in e?m(e):ee(s(e))}function oe(e){if(Array.isArray(e))return e;if(!e||typeof e!=`object`)return[];let t=e.list||e.contents||e.videos||e.items;return Array.isArray(t)?t:[]}function h(s){let ee=s.data||{},f=s.styles,p=u(()=>s.events||{},[s.events]),m=s.data,h={...ie,...ee},g=String(m?.block_id||m?.blockId||h.block_id||h.blockId||``),_=String(m?.app_id||h.app_id||h.appId||``)||void 0,se=m?.cursor||h.cursor,v=se==null?``:String(se),y=Number(m?.refresh_key??m?.refreshKey??h.refresh_key??h.refreshKey??0),ce=String(m?.keep_alive_key||m?.keepAliveKey||h.keep_alive_key||h.keepAliveKey||``),b=u(()=>ce||`fullscreen-feed-runtime:${_||`app`}:${g||`unknown`}`,[_,g,ce]),x=u(()=>oe(m).map(e=>ae(e)).filter(Boolean),[m]),S=u(()=>{let e=Number(h.initialActiveIndex??0);return Number.isFinite(e)?e:0},[h.initialActiveIndex]),[le,C]=a(`${b}-active-index`,S),[ue,w]=a(`${b}-user-interacted`,!1),[T,E]=a(`${b}-follow-ids`,Array.isArray(h.followIds)?h.followIds:[]),D=d(T),[O,k]=a(`${b}-items`,x),A=d(O);A.current=O;let[de,fe]=a(`${b}-refresh-key`,y),{userId:pe,userInfo:me}=t(),j=pe||me?.userId||``,[M,N]=a(`${b}-checked-interaction-ids`,{video:[],post:[]}),P=d({video:new Set(M.video),post:new Set(M.post)}),F=d(M);F.current=M;let[I,L]=a(`${b}-checked-followee-ids`,[]),R=d(new Set(I)),z=d(I);z.current=I;let B=d(new Set),V=d(!1),H=c(e=>{let t=e.originalData;return t?.author?.user_id||t?.up_user||``},[]),U=c(async()=>{if(V.current||!j||B.current.size===0)return;V.current=!0;let e=Array.from(B.current);B.current=new Set;let t=await r({app_id:0,follower_id:j,followee_ids:e});if(t.success&&t.data?.is_following_map){let n=t.data.is_following_map;k(e=>{let t=!1,r=e.map(e=>{let r=H(e);if(!r||!(r in n))return e;let i=!!n[r];return e.originalData?.is_followed===i?e:(t=!0,{...e,originalData:{...e.originalData,is_followed:i}})});return t?r:e}),E(t=>{let r=new Set(t);e.forEach(e=>{n[e]?r.add(e):r.delete(e)});let i=Array.from(r);return D.current=i,i})}V.current=!1,B.current.size>0&&U()},[H,j,E,k]),W=c(e=>{if(!j)return;let t=e.map(e=>H(e)).filter(e=>!!e);t.length!==0&&(t.forEach(e=>{R.current.has(e)||(R.current.add(e),B.current.add(e))}),B.current.size>0&&L(Array.from(R.current)),U())},[U,H,j,L]),G=c(e=>{if(e.size===0)return e;let t=new Map;return e.forEach((e,n)=>{if(!e)return;let{is_followed:r,...i}=e;t.set(n,i)}),t},[]),K=c(async e=>{if(!j)return;let{pendingVideoIds:t,pendingPostIds:n}=ne(e,P.current);if(t.length===0&&n.length===0)return;N({video:Array.from(P.current.video),post:Array.from(P.current.post)});let[r,i]=await Promise.all([t.length>0?o(t,1):Promise.resolve(null),n.length>0?o(n,2):Promise.resolve(null)]),a=G(te(r?.interaction_list)),s=G(te(i?.interaction_list));k(e=>{let t=re(e,a,s);if(t===e)return e;if(R.current.size===0)return t;let n=!1,r=t.map(e=>{let t=H(e);if(!t||!R.current.has(t))return e;let r=D.current.includes(t);return e.originalData?.is_followed===r?e:(n=!0,{...e,originalData:{...e.originalData,is_followed:r}})});return n?r:t})},[H,j,N,k,G]),[q,J]=a(`${b}-cursor`,v),Y=d(q),X=d(!1),[Z,Q]=a(`${b}-has-more`,!!(v&&v.trim()));l(()=>{Y.current=q},[q]),l(()=>{D.current=T},[T]),l(()=>{P.current={video:new Set(F.current.video),post:new Set(F.current.post)}},[F,j]),l(()=>{P.current={video:new Set,post:new Set},N({video:[],post:[]})},[j,N]),l(()=>{R.current=new Set(z.current)},[z,j]),l(()=>{R.current=new Set,B.current=new Set,L([]),j&&A.current.length!==0&&W(A.current)},[b,W,j,L]),l(()=>{j&&O.length!==0&&W(O)},[O,W,j]),l(()=>{j&&O.length!==0&&K(O)},[O,K,j]),i(()=>{y!==de&&(O.length>0||(k(x),J(v),Y.current=v,Q(!!(v&&v.trim())),C(S),w(!1),R.current=new Set,L([]),P.current={video:new Set,post:new Set},N({video:[],post:[]})),fe(y))},[S,v,x,O.length,y,C,J,Q,k,N,fe,w,de],`fullscreen-feed-runtime-refresh-${b}`);let he=h.onSwipeTo||p.onSwipeTo,ge=h.onCustomActionRender,_e=h.onRequireLogin||p.onRequireLogin,ve=h.onFollowIdsChange||p.onFollowIdsChange,ye=p.onControlsVisibilityChange,be=p.onGestureStart,xe=p.onGestureEnd,Se=p.onSwipeCancel,Ce=h.onDataUpdate||p.onDataUpdate,we=h.onOpenComment||p.onOpenComment,Te=f?e(f,{}):void 0,Ee={loop:h.loop,autoNext:h.autoNext,...h.videoConfig||{}},$=c(async()=>{if(!g||!Z||X.current)return;let e=Y.current;if(!e||!e.trim()){Q(!1);return}X.current=!0;try{let t=(await n({app_id:_,block_id:g,cursor:e||void 0})).data?.block?.data,r=t?.cursor,i=r==null?``:String(r),a=[];Array.isArray(t?.videos)&&a.push(...t.videos),Array.isArray(t?.contents)&&a.push(...t.contents);let o=a.map(e=>ae(e)).filter(Boolean);o.length>0&&(k(e=>{let t=new Set(e.map(e=>`${e.kind}:${e.id}`)),n=[...e];return o.forEach(e=>{if(!e.id)return;let r=`${e.kind}:${e.id}`;t.has(r)||(t.add(r),n.push(e))}),n}),W(o),K(o)),Y.current=i,J(i),Q(!!(i&&i.trim()))}catch(e){console.error(`FullscreenFeed runtime fetchMore failed:`,e),Q(!1)}finally{X.current=!1}},[_,g,Z,J]),De=c(()=>{w(!0),p.onUserInteracted?.()},[p,w]),Oe=c((e,t)=>{C(e),he?.({activeIndex:e,items:A.current,direction:t});let n=A.current.length;g&&Z&&n>0&&e>=n-2&&$()},[g,$,Z,he,C]),ke=c(e=>{D.current=e,E(e),ve?.(e)},[ve,E]),Ae=c(e=>{let t=p.getNavigationInfo;if(t)return t(e);let n=O[e+1];return{showSeriesButton:!1,nextItemText:n?`\u4E0B\u4E00\u6761${n.title?`\u00B7${n.title}`:``}`:``}},[O,p]);return{items:O,activeIndex:le,...h,top:h.top,bottom:h.bottom,currentUserId:h.currentUserId,videoConfig:Ee,userInteracted:ue,onUserInteracted:De,onActiveIndexChange:Oe,onDataUpdate:(e,t)=>Ce?.(e,t),onOpenComment:we,getNavigationInfo:Ae,onControlsVisibilityChange:ye,onGestureStart:be,onGestureEnd:xe,onSwipeCancel:Se,onCustomActionRender:ge,followIds:T,onFollowIdsChange:ke,onRequireLogin:_e,style:Te}}export{f as isRuntimeBaseComponentProps,h as useFullscreenFeedRuntimeCompat};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
|
|
2
|
-
"use client";import{gContentGetAppChannelBlockData 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{
|
|
2
|
+
"use client";import{gContentGetAppChannelBlockData 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{useAppContext as i}from"../../../../../hooks/use-app-context/index.mjs";import{MiniThreeCard as a}from"../../../../common/cards/mini-three-card.mjs";import{usePaginated as o}from"../../../../../hooks/query/use-query.mjs";import s from"../../../../../assets/icons/detail/video_flag.mjs";import{useRouter as c}from"next/navigation";import{useCallback as l,useEffect as u,useLayoutEffect as d,useMemo as f,useRef as p,useState as m}from"react";import{jsx as h,jsxs as g}from"react/jsx-runtime";const _={},v={list:[]};function y({variant:e,props:t=_,data:a=v}){let o=i(),s=c(),{list:y,title:x,cursor:S,block_id:w,channel_id:T}=a,E=Array.isArray(a.icons)?a.icons:[],{moreLink:D}=t,[O,k]=m(0),j=p(null),{items:P,icons:F,hasNextPage:I,isFetchingNextPage:L,fetchNextPage:R}=N({blockId:w||``,initialCursor:S||``,initialIcons:E,initialList:y,pageSize:16,enabled:o===`renderer`}),z=e===`waterfall`?6:4,B=P.length>=z?P.length-z:-1,V=p(null),H=p(!1),U=x||``,W=C(D,w||``,T||``),G=!!(S&&S.trim()),K=o===`renderer`&&(G||I===!0),q=l(()=>{W&&(W.startsWith(`http`)?window.location.href=W:s.push(W))},[W,s]);d(()=>{let t=j.current;if(!t||e!==`waterfall`)return;let n=()=>{let e=t.clientWidth||0;k(e>0?(e-12)/2:0)};n();let r=new ResizeObserver(n);return r.observe(t),()=>{r.disconnect()}},[e]),u(()=>{let e=V.current;if(!e||!K||P.length<16)return;let t=document.getElementById(`app-scroll-container`)||null,n=new IntersectionObserver(e=>{e[0]?.isIntersecting&&(L||H.current||(H.current=!0,R().finally(()=>{H.current=!1})))},{root:t,threshold:0});return n.observe(e),()=>{n.disconnect()}},[K,R,L,P.length,B]);let J=f(()=>e===`waterfall`?A(P,F,O):{left:[],right:[]},[O,P,F,e]);return P.length?g(n,{className:`w-full mt-[16px]`,children:[g(n,{className:`flex items-center justify-between px-[12px] mb-[8px]`,children:[h(r,{className:`text-text1 text-[18px] leading-[26px] font-bold line-clamp-1`,children:U}),h(r,{className:`text-text3 text-[12px] leading-[18px] ${W?`cursor-pointer`:``}`,onClick:q,children:`更多`})]}),e===`grid`&&h(n,{className:`w-full flex flex-wrap px-[12px]`,children:P.map((e,t)=>{let n=F[t];return h(`div`,{ref:t===B?V:void 0,className:`w-1/2 px-[6px]`,children:h(b,{item:e,icon:n,index:t,widthStyle:{width:`100%`}})},M(e,t))})}),e===`waterfall`&&g(n,{ref:j,className:`w-full px-[12px] flex gap-[12px]`,children:[h(n,{className:`flex-1 min-w-0 flex flex-col`,children:J.left.map(e=>h(`div`,{ref:e.index===B?V:void 0,children:h(b,{item:e.item,icon:e.icon,index:e.index,widthStyle:{width:`100%`}})},M(e.item,e.index)))}),h(n,{className:`flex-1 min-w-0 flex flex-col`,children:J.right.map(e=>h(`div`,{ref:e.index===B?V:void 0,children:h(b,{item:e.item,icon:e.icon,index:e.index,widthStyle:{width:`100%`}})},M(e.item,e.index)))})]})]}):null}function b({item:e,icon:t,index:i,widthStyle:o}){let c=w(e),l=e.name||``,u=E(e.static?.browse_cnt??0),d=T(e),f=k(e,t,i);return h(a,{url:c,text:l,className:`w-full`,style:o,topRightChild:f?h(x,{url:f}):void 0,bottomLeftChild:g(n,{className:`h-[20px] leading-[20px] text-[#fff] text-[12px] px-[4px] rounded-[4px] bg-[#333] ml-[4px] flex items-center`,children:[h(s,{className:`w-[16px] h-[auto] text-[#fff] mr-[4px]`}),u]}),textChild:g(n,{className:`mt-[4px]`,children:[h(r,{as:`h3`,className:`text-text1 text-[14px] leading-[20px] line-clamp-1`,children:l}),d&&h(r,{className:`text-text3 text-[12px] leading-[18px]`,children:d})]}),linkPath:S(e)})}function x({url:e}){return h(n,{className:`relative w-[40px] h-[20px] mr-[6px] mt-[6px]`,children:h(t,{src:e,alt:`corner`,fill:!0,objectFit:`contain`})})}function S(e){let t=encodeURIComponent(e.name||``);return`/video/${e.id||``}/${t}/episode/1`}function C(e,t,n){if(e)return e;if(!t)return``;let r=new URLSearchParams({blockId:t});return n&&r.set(`channelId`,n),`/featured?${r.toString()}`}function w(e){return e.img_y||e.img_x||``}function T(e){if((e.type??0)===2){let t=Number(e.episode_cnt||e.links?.length||0);return t>0?`全${t}集`:``}return O(Number(e.duration||0))}function E(e){return!Number.isFinite(e)||e<=0?`0`:e>=1e6?`${D(e/1e6)}M`:e>=1e3?`${D(e/1e3)}k`:Math.floor(e).toString()}function D(e){let t=e.toFixed(1);return t.endsWith(`.0`)?t.slice(0,-2):t}function O(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 k(e,t,n){let r=e;return r.corner_icon_url||r.corner_icon||r.icon_url||t?.material_url||``}function A(e,t,n){let r=[],i=[],a=0,o=0;return e.forEach((e,s)=>{let c=t[s],l=j(n,e);a<=o?(r.push({item:e,icon:c,index:s}),a+=l):(i.push({item:e,icon:c,index:s}),o+=l)}),{left:r,right:i}}function j(e,t){if(!e)return 0;let n=e*1.3461538461538463,r=T(t)?18:0;return n+20+r+6+16}function M(e,t){return e.id?`home-recommend-${e.id}`:`home-recommend-${t}`}function N({blockId:t,initialList:n,initialCursor:r,initialIcons:i,pageSize:a,enabled:s}){let c=n.length>0,h=p(n),g=p(i),[_,v]=m(!1);u(()=>{h.current=n,g.current=i},[i,n]);let y=f(()=>{if(!c)return;let e=r&&r.trim()?r:void 0;return{pages:[{data:{block:{data:{videos:n,icons:i,cursor:r||``}}}}],pageParams:[e]}},[c,r,i,n]),{data:b,fetchNextPage:x,hasNextPage:S,isFetchingNextPage:C}=o({key:[`home-recommend`,t],queryFn:n=>e({block_id:t,cursor:n||void 0,page_size:a}),getNextPageParam:e=>{let t=e.data?.block?.data?.cursor;return t&&t.trim()?t:void 0},options:{enabled:s&&!!t,initialData:y,refetchOnMount:!1,refetchOnWindowFocus:!1,refetchOnReconnect:!1},initialPageParam:c&&r&&r.trim()?r:void 0});d(()=>{v(!0)},[]);let w=f(()=>{if(!_)return{items:c?[...h.current]:[],icons:c?[...g.current]:[]};let e=b?.pages||[],t=[],n=[],r=c?1:0;c&&(t.push(...h.current),n.push(...g.current));for(let i=r;i<e.length;i++){let r=e[i].data?.block?.data,a=r?.videos||[],o=r?.icons||[];t.push(...a),n.push(...o)}return{items:t,icons:n}},[c,_,b?.pages]),T=l(async()=>{await x()},[x]);return{items:w.items,icons:w.icons,hasNextPage:S,isFetchingNextPage:C,fetchNextPage:T}}export{y as default};
|