{"version":3,"sources":["webpack://_N_E/./components/hooks/use-login-check-callback.ts","webpack://_N_E/./components/hooks/use-optimistic-status.ts","webpack://_N_E/./components/hooks/use-toggle-follow.ts","webpack://_N_E/./components/new/statement/index.tsx","webpack://_N_E/./components/toast-messager.tsx","webpack://_N_E/./lib/ugc-interact.ts","webpack://_N_E/./new/groups/services/group.ts","webpack://_N_E/./components/new/statement/index.module.scss"],"names":["callback","commonParams","notLogin","globalState","useContext","GlobalStoreContext","state","openLogin","LoginStoreContext","useCallback","userData","user_id","args","useStatusCountUpdater","status","count","useState","curStatus","setCurStatus","useEffect","curCount","setCurCount","begin","Math","max","prev","next","rollback","execute","pendingRef","useRef","current","followedMap","id","userId","followed","followCount","uid","map","length","update","useOptimisticStatus","useLoginCheckCallback","focus","unlike","to_user_id","then","useMemo","enter_method","Object","values","forEach","Statement","year","Date","getFullYear","className","href","target","rel","src","require","style","width","height","marginBottom","onClick","sendTeaCommEvent","event_id","module_id","button_name","PubSub","title","containerName","ToastMessager","getContainer","props","container","document","createElement","body","appendChild","this","startCloseTimer","prevProps","duration","closeTimer","clearTimeout","window","setTimeout","handleClose","onClose","close","text","visible","in","timeout","unmountOnExit","classNames","getComponent","PureComponent","show","config","getElementById","div","render","ReactDOM","destory","bind","parentNode","removeChild","hide","openToast","params","fetch","method","headers","localStorage","getItem","serializeObject","res","data","message","is_following","Promise","resolve","reject","catch","err","digg","group_id","action","like_type","thread_id","digg_action","aid","getUrl","err_no","err_tips","console","log","fetchColumnInfo","req","json","Error","prompts","fetchEpisodeByColumnId","fetchIsFollowed","toUserId","module","exports"],"mappings":"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","file":"static/chunks/1513-651b0936f61ed418e463.js","sourcesContent":["import { useCallback, useContext } from 'react'\nimport { GlobalStoreContext } from 'Components/store'\nimport { LoginStoreContext } from 'New/login/login-store'\nimport { ILoginCommonParams } from 'New/login/context/view-context'\n\nfunction useLoginCheckCallback any>(\n callback: T | null,\n commonParams?: ILoginCommonParams,\n notLogin?: () => void\n) {\n const { state: globalState } = useContext(GlobalStoreContext)\n const { openLogin } = useContext(LoginStoreContext)\n\n return useCallback(\n (...args) => {\n if (globalState?.userData?.user_id) {\n return callback?.(...args)\n } else {\n openLogin(commonParams)\n if (notLogin) {\n notLogin()\n }\n }\n },\n [\n globalState?.userData?.user_id,\n callback,\n commonParams,\n openLogin,\n notLogin,\n ]\n )\n}\n\nexport default useLoginCheckCallback\n","// 点赞/关注/收藏 乐观更新\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nexport interface IStatusCountUpdaterParams {\n status?: boolean\n count?: number\n}\n\nexport function useStatusCountUpdater({\n status = false,\n count = 0,\n}: IStatusCountUpdaterParams) {\n const [curStatus, setCurStatus] = useState(status)\n\n useEffect(() => {\n setCurStatus(status)\n }, [status])\n\n const [curCount, setCurCount] = useState(count)\n\n useEffect(() => {\n setCurCount(count)\n }, [count])\n\n return {\n begin: useCallback<\n () => {\n prev: [boolean, number]\n next: [boolean, number]\n }\n >(() => {\n setCurStatus(!curStatus)\n const count = Math.max(0, curStatus ? curCount - 1 : curCount + 1)\n setCurCount(count)\n return {\n prev: [curStatus, curCount],\n next: [!curStatus, count],\n }\n }, [curStatus, curCount]),\n rollback: useCallback(([curStatus, curCount]) => {\n setCurStatus(curStatus)\n setCurCount(curCount)\n }, []),\n curStatus,\n curCount,\n }\n}\n\nfunction useOptimisticStatus({\n begin,\n execute,\n rollback,\n}: {\n begin(): {\n prev: T\n next: T\n }\n execute(status: T): Promise | void // 请求方法,返回boolean表示执行成功还是失败\n rollback(status: T): void\n}) {\n const pendingRef = useRef(false)\n\n return useCallback(async () => {\n const { prev, next } = begin()\n if (execute) {\n if (pendingRef.current) {\n return\n }\n pendingRef.current = true\n try {\n const status = await execute(next)\n pendingRef.current = false\n if (status) {\n begin()\n } else {\n rollback(prev)\n }\n } catch (e) {\n pendingRef.current = false\n rollback(prev)\n }\n }\n }, [execute, begin, rollback])\n}\n\nexport default useOptimisticStatus\n","import useOptimisticStatus from 'Components/hooks/use-optimistic-status'\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n Dispatch,\n SetStateAction,\n useRef,\n} from 'react'\nimport { focus } from 'lib/ugc-interact'\nimport { unlike } from 'New/groups/services/group'\nimport useLoginCheckCallback from 'Components/hooks/use-login-check-callback'\n\nconst followedMap: Record<\n string,\n {\n length: number\n map: Record<\n string,\n {\n setCurStatus: Dispatch>\n setCurCount: Dispatch>\n }\n >\n }\n> = {}\n\nlet id = 0\n\n// 关注/取消关注\nfunction useToggleFollow({\n userId,\n followed = false,\n followCount = 0,\n}: {\n userId?: string | number\n followed?: boolean\n followCount?: number\n}) {\n const [curStatus, setCurStatus] = useState(followed)\n const [curCount, setCurCount] = useState(followCount)\n useEffect(() => {\n setCurStatus(followed)\n }, [followed])\n useEffect(() => {\n setCurCount(followCount)\n }, [followCount])\n\n const [uid] = useState(() => {\n return ++id\n })\n\n useEffect(() => {\n if (!userId) return\n if (!followedMap[userId]) {\n followedMap[userId] = {\n map: {},\n length: 0,\n }\n }\n if (!followedMap[userId].map[uid]) {\n followedMap[userId].map[uid] = { setCurStatus, setCurCount }\n followedMap[userId].length++\n }\n return () => {\n delete followedMap[userId].map[uid]\n followedMap[userId].length--\n if (!followedMap[userId].length) {\n delete followedMap[userId]\n }\n }\n }, [userId])\n\n return {\n update: useOptimisticStatus({\n execute: useLoginCheckCallback(\n useCallback(\n ([curFollow]) => {\n return (curFollow ? focus : unlike)({\n user_id: userId!,\n to_user_id: userId!,\n }).then(() => {\n return true\n })\n },\n [userId]\n ),\n useMemo(\n () => ({\n enter_method: 'follow',\n }),\n []\n )\n ),\n begin: useCallback<\n () => {\n prev: [boolean, number]\n next: [boolean, number]\n }\n >(() => {\n setCurStatus(!curStatus)\n const count = Math.max(0, curStatus ? curCount - 1 : curCount + 1)\n setCurCount(count)\n Object.values(followedMap[userId!]?.map || {}).forEach(\n ({ setCurStatus, setCurCount }) => {\n setCurStatus(!curStatus)\n setCurCount(count)\n }\n )\n return {\n prev: [curStatus, curCount],\n next: [!curStatus, count],\n }\n }, [userId, curStatus, curCount]),\n rollback: useCallback(\n ([curStatus, curCount]: [boolean, number]) => {\n setCurStatus(curStatus)\n setCurCount(curCount)\n Object.values(followedMap[userId!]?.map || {}).forEach(\n ({ setCurStatus, setCurCount }) => {\n setCurStatus(curStatus)\n setCurCount(curCount)\n }\n )\n },\n [userId]\n ),\n }),\n curStatus,\n curCount,\n }\n}\n\nexport default useToggleFollow\n","/* 声明文件 */\nimport React from 'react'\nimport { sendTeaCommEvent } from 'lib/tea-analyze'\nimport PubSub from 'pubsub-js'\nimport style from './index.module.scss'\n\nexport default function Statement() {\n const year = new Date().getFullYear()\n return (\n
\n
\n

© {year} 懂车帝

\n

www.dongchedi.com

\n
\n
\n

\n \n \n 京公网安备 11010802026035号\n \n

\n

\n \n 京ICP备17027026号-3\n \n

\n

\n \n 增值电信业务经营许可证(京B2-20180202)\n \n

\n
\n
\n

\n \n 广播电视节目制作经营许可证\n \n

\n

网络文化经营许可证-京网文(2019)4715-493号

\n

公司名称:北京空间变换科技有限公司

\n
\n
\n

\n \n 中央网信办违法和不良信息举报中心\n \n

\n

违法和不良信息举报电话:400-140-2108

\n

举报邮箱:jubao@mail.dongchedi.com

\n
\n

\n \n 懂车帝用户协议\n {' '}\n |{' '}\n \n 懂车帝隐私政策\n {' '}\n |{' '}\n \n 营业执照\n \n

\n
\n \n {\n sendTeaCommEvent('clk_event', {\n event_id: 'related_module_bottom_link',\n module_id: 'related_module',\n button_name: '站点地图',\n })\n }}\n >\n 站点地图\n \n {\n sendTeaCommEvent('clk_event', {\n event_id: 'related_module_bottom_link',\n module_id: 'related_module',\n button_name: '侵权投诉',\n })\n }}\n >\n 侵权投诉\n \n {\n PubSub.publish('OPEN_FEEDBACK')\n sendTeaCommEvent('clk_event', {\n event_id: 'related_module_bottom_link',\n module_id: 'related_module',\n button_name: '我要反馈',\n })\n }}\n >\n 我要反馈\n \n {\n sendTeaCommEvent('clk_event', {\n event_id: 'related_module_bottom_link',\n module_id: 'related_module',\n button_name: '加入我们',\n })\n }}\n >\n 加入我们\n \n {\n sendTeaCommEvent('clk_event', {\n event_id: 'related_module_bottom_link',\n module_id: 'related_module',\n button_name: '广告投放',\n })\n }}\n >\n 广告投放\n \n \n 懂车指数\n \n

\n
\n )\n}\n","import React, { ReactNode, PureComponent } from 'react'\nimport ReactDOM from 'react-dom'\nimport classNames from 'classnames'\nimport { Fade } from './animation'\n\nimport Portal from './portal'\n\nexport interface IToastProps {\n text?: string\n className?: string\n duration?: number\n onClose?: () => void\n close?: () => void\n visible: boolean\n getContainer?: () => HTMLElement\n}\n\nexport type TToastFunc = (\n config: Partial,\n duration?: number,\n onClose?: () => void\n) => {\n hide?: () => void\n}\nconst containerName = '__toast_container'\nexport default class ToastMessager extends PureComponent {\n closeTimer?: number\n\n static show: TToastFunc\n\n static defaultProps: Partial = {\n duration: 1500,\n visible: false,\n }\n\n componentDidMount() {\n this.startCloseTimer()\n }\n\n componentDidUpdate(prevProps: IToastProps) {\n const { duration } = this.props\n if (duration !== prevProps.duration) {\n this.startCloseTimer()\n }\n }\n\n startCloseTimer() {\n const { duration } = this.props\n if (duration) {\n this.closeTimer && clearTimeout(this.closeTimer)\n this.closeTimer = window.setTimeout(() => {\n this.handleClose()\n }, duration)\n }\n }\n\n handleClose() {\n const { onClose, close } = this.props\n onClose && onClose()\n close && close()\n }\n\n getContainer = (): HTMLElement => {\n const { getContainer } = this.props\n if (getContainer) {\n return getContainer()\n }\n const container = document.createElement('div')\n document.body.appendChild(container)\n return container\n }\n\n getComponent() {\n const { className, text, visible } = this.props\n return (\n <>\n \n
\n
\n
\n
{text}
\n
\n
\n
\n
\n \n \n )\n }\n\n render() {\n return (\n {this.getComponent()}\n )\n }\n}\n\nexport function openToast(config: Partial) {\n const oldDiv = document.getElementById(containerName)\n if (oldDiv) {\n return {}\n }\n\n const div = document.createElement('div')\n div.id = containerName\n document.body.appendChild(div)\n\n function render(props: IToastProps) {\n ReactDOM.render(, div)\n }\n\n function close() {\n render({\n ...(config as IToastProps),\n getContainer: () => div,\n // @ts-ignore\n onClose: destory.bind(this),\n visible: false,\n })\n }\n\n function destory() {\n const unmountResult = ReactDOM.unmountComponentAtNode(div)\n if (unmountResult && div.parentNode) {\n div.parentNode.removeChild(div)\n }\n }\n\n render({\n ...(config as IToastProps),\n // @ts-ignore\n onClose: destory.bind(this),\n getContainer: () => div,\n close,\n visible: true,\n })\n\n return {\n hide: close,\n }\n}\n\nToastMessager.show = (config, duration) =>\n openToast({\n ...config,\n duration,\n })\n","import fetch from 'lib/decorated-fetch'\nimport serializeObject from '@arsenal/arsenal/modules/serializeObject'\nimport getUrl from 'lib/url'\nimport ToastMessager from 'Components/toast-messager'\nimport { DiggType } from 'Components/hooks/use-toggle-digg'\nconst apiMap = {\n 1: '/ugc/video/v1/digg/digg/',\n 4: '/motor/discuss_ugc/digg/digg/',\n}\n\nconst methodMap = {\n 1: 'POST',\n 4: 'POST',\n}\n\ninterface FocusParams {\n user_id: number | string\n to_user_id: number | string\n}\n\ninterface DiggParams {\n user_id: number\n group_id: string\n action: 'digg' | 'cancel_digg'\n like_type?: DiggType\n}\n\ninterface DiggCommentParams {\n comment_id: string\n group_id: string\n}\n\nexport const focus = ({ user_id, to_user_id }: FocusParams) => {\n const params = {\n user_id,\n to_user_id,\n }\n return fetch('/motor/user/relation/pc_like', {\n method: 'POST',\n headers: {\n 'tt-anti-token': window.localStorage.getItem('tt-anti-token') || '',\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: serializeObject(params),\n })\n .then((res) => {\n const { message, is_following } = res.data\n if (message === 'success' && is_following) {\n return Promise.resolve()\n } else {\n ToastMessager.show({\n text: '关注失败',\n })\n return Promise.reject('关注失败')\n }\n })\n .catch((err) => {\n ToastMessager.show({\n text: '关注失败',\n })\n return Promise.reject('关注失败')\n })\n}\n\nexport const digg = ({\n user_id,\n group_id,\n action,\n like_type = 'digg_thread',\n}: DiggParams) => {\n const params = {\n user_id,\n thread_id: group_id,\n digg_action: action,\n like_type,\n group_id,\n aid: 1839,\n }\n let request = null\n request = fetch(getUrl(`/motor/community/digg_like`), {\n method: 'POST',\n headers: {\n 'tt-anti-token': window.localStorage.getItem('tt-anti-token') || '',\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: serializeObject(params),\n })\n return request\n .then((res) => {\n const { err_no, err_tips } = res\n if (err_no) {\n return Promise.reject(err_tips)\n } else {\n return Promise.resolve()\n }\n })\n .catch((err) => {\n console.log(err)\n return Promise.reject('点赞失败')\n })\n}\n\nexport const diggComment = ({ comment_id, group_id }: DiggCommentParams) => {\n const params = {\n aid: 36,\n user_id: 64194007718,\n comment_id,\n group_id,\n device_id: 69983831301,\n aggr_type: 0,\n action: 'digg',\n }\n return fetch('/browser/2/data/comment_action/', {\n method: 'POST',\n headers: {\n 'tt-anti-token': window.localStorage.getItem('tt-anti-token') || '',\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: serializeObject(params),\n })\n .then((res) => {\n const { digg_count } = res.data\n if (digg_count === 1) {\n return Promise.resolve()\n } else {\n return Promise.reject('点赞失败')\n }\n })\n .catch((err) => {\n console.log(err)\n return Promise.reject('点赞失败')\n })\n}\n","import { IBaseResponse } from 'New/groups/services/groups'\nimport fetch from 'lib/decorated-fetch'\nimport getUrl from 'lib/url'\nimport serializeObject from '@arsenal/arsenal/modules/serializeObject'\nimport ToastMessager from 'Components/toast-messager'\n\nexport interface IColumnHeadColumnInfo {\n background_color: string\n background_image_url: string\n column_id: number\n description: IColumnHeadColumnInfoDesc\n group_id_str: string\n group_info: string\n logo: string\n pop_title: string\n publish_time: number\n related_series: IColumnHeadSeriesInfo[]\n scheme: string\n series_title: string\n tags: IColumnHeadColumnInfoColumnTag[]\n title: string\n total_periods: string\n}\nexport interface IColumnHeadColumnInfoColumnTag {\n height: number\n image_url: string\n scheme: string\n title: string\n width: number\n}\nexport interface IColumnHeadColumnInfoDesc {\n background_color: string\n description: string\n host_user: IColumnHeadUserInfo[]\n title: string\n user: IColumnHeadUserInfo\n}\nexport interface IColumnHeadSeriesInfo {\n count: number\n series_id: number\n series_name: string\n}\nexport interface IColumnHeadUserInfo {\n auth_v_type: number\n avatar_url: string\n berified_avatar_url: string\n description: string\n is_followed: boolean\n name: string\n profile_url: string\n scheme: string\n user_id: number\n}\nexport interface IColumnShareInfo {\n extra: IColumnShareInfoExtra\n share_image: string\n share_text: string\n share_url: string\n title: string\n weixin_share_schema: string\n weixin_special_type: number\n}\n\nexport interface IColumnShareInfoExtra {\n category_list: string[]\n}\n\nexport interface IGetColumnInfoHeadResponseData {\n list: IGetColumnInfoHeadResponseDataCardInfo[]\n share_info: IColumnShareInfo\n tab: IGetColumnInfoHeadResponseDataTabInfo[]\n user: IColumnHeadUserInfo\n}\nexport interface IGetColumnInfoHeadResponseDataCardInfo {\n card_id: number\n duplicate: boolean\n info: IColumnHeadColumnInfo\n type: number\n unique_id: number\n unique_id_str: string\n}\nexport interface IGetColumnInfoHeadResponseDataTabInfo {\n elevator: string\n name: string\n tid: number\n}\n\nexport interface IFetchGroupInfoParams {\n column_id: number\n}\n\n// 顶部信息\nexport const fetchColumnInfo = async function (\n params: IFetchGroupInfoParams,\n req: any\n) {\n const json: IBaseResponse = await fetch(\n getUrl(\n `/motor/pc/content/column/info/head?${serializeObject(params)}`,\n 'motor.pc_content.api'\n ),\n {\n req,\n }\n )\n\n if (0 !== json?.status) {\n throw Error(json?.prompts || json.message)\n }\n return json?.data\n}\n\nexport interface IEpisode {\n episode: number //当前期数\n publish_time: number // 视频发布时间\n title: string //视频标题\n unique_id: number // gid\n unique_id_str: string // gid string\n article_type: number\n video_info: IVideoInfo // 视频详情信息\n}\n\nexport interface IEpisodeList {\n program_list: IEpisode[] //期数信息111\n has_more: boolean // 是否还有数据\n total: number\n}\n\nexport interface IVideoInfo {\n cover_url: string //封面图信息\n video_duration: number // 视频时长\n video_id: string //视频vid\n video_size: string // 视频大小list, 样例:\"{\"1080p\":{\"duration\":1219.263,\"file_size\":677901428,\"h\":1080,\"w\":1920},\"4k\":{\"duration\":1219.263,\"file_size\":2560095563,\"h\":2160,\"w\":3840},\"high\":{\"duration\":1219.267,\"file_size\":61686236,\"h\":480,\"w\":854},\"normal\":{\"duration\":1219.267,\"file_size\":63017752,\"h\":360,\"w\":640},\"ultra\":{\"duration\":1219.263,\"file_size\":201829423,\"h\":720,\"w\":1280}}\"\n video_type: number\n video_watch_count: number //视频观看人数\n}\n\nexport interface IFetchEpisodeParams {\n count: number\n page: number\n series_id: number\n column_id: number\n source: number\n}\n\nexport const fetchEpisodeByColumnId = async (params: IFetchEpisodeParams) => {\n const json: IBaseResponse = await fetch(\n getUrl(\n `/motor/pc/content/get_episode_by_column_id?${serializeObject(params)}`\n )\n )\n\n if (0 !== json?.status) {\n throw Error(json?.prompts || json.message)\n }\n\n return json?.data\n}\n\ninterface IFocusParams {\n user_id: number | string\n to_user_id: number | string\n}\nexport const unlike = async (params: IFocusParams) => {\n return fetch('/motor/user/relation/pc_unlike', {\n method: 'POST',\n headers: {\n 'tt-anti-token': window.localStorage.getItem('tt-anti-token') || '',\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: serializeObject(params),\n })\n .then((res) => {\n const { message, is_following } = res?.data || {}\n if (message === 'success' && !is_following) {\n return Promise.resolve()\n } else {\n ToastMessager.show({\n text: '取消关注失败',\n })\n return Promise.reject('取消关注失败')\n }\n })\n .catch(() => {\n ToastMessager.show({\n text: '取消关注失败',\n })\n return Promise.reject('取消关注失败')\n })\n}\n\nexport const fetchIsFollowed = async (toUserId: number) => {\n const json: IBaseResponse<{ is_following: boolean }> = await fetch(\n getUrl(`/motor/pc/content/follow?to_user_id=${toUserId}`)\n )\n\n if (0 !== json?.status) {\n throw Error(json?.prompts || json.message)\n }\n\n return json?.data\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"more-info-list\":\"statement_more-info-list__2F2UL\"};"],"sourceRoot":""}