{"version":3,"file":"js/chunk.a4da3b1b29047e0c.js","mappings":"sQAGO,SAAeA,EAAc,GAAD,+BAInC,aAFC,OAED,kBAJO,WAA6BC,GAAiC,6FAC5DC,EAAAA,EAAAA,GAA6B,mBAAoB,CAAED,OAAAA,KAAS,4CACpE,sBAGM,SAAeE,EAAiB,GAAD,+BAItC,aAFC,OAED,kBAJO,WAAgCF,GAAoC,6FAClEC,EAAAA,EAAAA,GAA6B,sBAAuB,CAAED,OAAAA,KAAS,4CACvE,sBAGM,SAAeG,EAAgB,GAAD,+BAIrC,aAFC,OAED,kBAJO,WAA+BH,GAAsB,6FACnDC,EAAAA,EAAAA,GAA6B,qBAAsB,CAAED,OAAAA,KAAS,4CACtE,sBAGM,SAAeI,EAAY,GAAD,+BAIjC,aAFC,OAED,kBAJO,WAA2BJ,GAAsB,6FAC/CC,EAAAA,EAAAA,GAA6B,qBAAsB,CAAED,OAAAA,KAAS,4CACtE,sBAGM,SAAeK,EAAY,GAAD,+BAIjC,aAFC,OAED,kBAJO,WAA2BL,GAAgC,6FACzDC,EAAAA,EAAAA,GAA6B,mBAAoB,CAAED,OAAAA,KAAS,4CACpE,sBAGM,SAAeM,EAAiB,EAAD,kCAStC,aAFC,OAED,kBATO,WACLC,EACAP,GAAgC,6FAEzBC,EAAAA,EAAAA,GAAO,4BAA2CM,EAAS,UAAU,CAC1EP,OAAAA,KACA,4CACH,sBAGM,SAAeQ,EAAa,EAAD,kCASlC,aAFC,OAED,kBATO,WACLC,EACAT,GAAoC,6FAE7BC,EAAAA,EAAAA,GAAO,2BAA0CQ,EAAO,UAAU,CACvET,OAAAA,KACA,4CACH,sBAGM,SAAeU,EAAiB,EAAD,kCAOrC,sCAPM,WACLD,EACAT,GAAoC,6FAE7BC,EAAAA,EAAAA,GAAO,2BAA0CQ,EAAO,cAAc,CAC3ET,OAAAA,KACA,4CACH,sBCnDD,IAAMW,GAAc,IAAIC,EAAAA,IAAUC,SAAS,CACzCC,gBAAiB,CAAC,EAClBC,qBAAsB,CACpBC,KAAM,kBAAM,gJAA2B,EACvCC,YAAa,kBAAM,uDAAkC,EACrDC,WAAY,kBAAM,+BAAiC,EACnDC,iBAAkB,kBAAM,+BAAuC,GAEjEC,wBAAyB,CAAC,EAC1BC,mBAAoB,CAAC,IAUjBC,EAAc,WA4BlB,WAAYC,GAA4B,sCACtCC,KAAKC,QAASC,EAAAA,EAAAA,IAAS,CACrBC,OAAQ,EACRC,YAAaL,EAAMK,YACnBC,SAAS,EACTC,WAAW,EAEXC,KAAMR,EAAMQ,KACZC,KAAM,MACNC,SAAUV,EAAMU,SAChBxB,QAASc,EAAMd,UAIjBe,KAAKU,OACP,CA0JC,MAlEA,EAsIA,OA9NA,0BAED,WAAQ,WACmB,UAArBV,KAAKC,OAAOM,MAAyC,cAArBP,KAAKC,OAAOM,MAC9CP,KAAKW,YAGPC,EAAAA,EAAAA,IAAQ,sBACLC,YACC,UACA,kBACG,EAAKZ,OAAOG,aACb,EAAKH,OAAOI,SACZ,EAAKJ,OAAOK,SAAS,GACvB,CAAEQ,WAAW,IAEdC,GAAG,SAAS,SAACC,GACZA,EAAEC,iBACF,EAAKC,cACP,KAEFN,EAAAA,EAAAA,IAAQ,sBAAsBC,YAC5B,UACA,kBAAO,EAAKZ,OAAOI,OAAO,GAC1B,CAAES,WAAW,KAGfF,EAAAA,EAAAA,IAAQ,2BAA2BC,YACjC,UACA,kBAAM,EAAKZ,OAAOG,WAAW,GAC7B,CAAEU,WAAW,KAGfF,EAAAA,EAAAA,IAAQ,eAAeC,YAAY,UAAU,kBAAO,EAAKZ,OAAOK,SAAS,GAAE,CACzEQ,WAAW,IAWbK,OAAOC,iBAAiB,SAAS,SAACC,GAChC,IAAMC,EAAKD,EAAME,OACXC,EAAYF,EAAGG,aAAa,+BAG7BD,IACL,EAAKvB,OAAOO,KAAOgB,EACnBE,SAASC,iBAAiB,yBAAyBC,SAAQ,SAACC,GAC1DA,EAAKC,UAAUC,OAAO,SACxB,IACAT,EAAGQ,UAAUE,IAAI,UACjB,EAAKrB,WACP,IAGAQ,OAAOC,iBAAiB,SAAS,SAACC,GAChC,IAAMC,EAAKD,EAAME,OACXU,EAAYX,EAAGG,aAAa,mBAG7BQ,IACL,EAAKhC,OAAOiC,aAAeD,EAC3BP,SAASC,iBAAiB,eAAeC,SAAQ,SAACC,GAChDA,EAAKC,UAAUC,OAAO,SACxB,IACAT,EAAGQ,UAAUE,IAAI,UACjB,EAAKrB,WACP,IAGAQ,OAAOC,iBAAiB,SAAS,SAACC,GAChC,IAAMC,EAAKD,EAAME,OACXC,EAAYF,EAAGG,aAAa,2BAG7BD,IACL,EAAKvB,OAAOkC,kBAAoBX,EAChCE,SAASC,iBAAiB,qBAAqBC,SAAQ,SAACC,GACtDA,EAAKC,UAAUC,OAAO,SACxB,IACAT,EAAGQ,UAAUE,IAAI,UACjB,EAAKrB,WACP,GACF,GAAC,yCAED,8FAGyB,GAFvBX,KAAKC,OAAOG,aAAc,EAC1BJ,KAAKC,OAAOI,SAAU,EACtBL,KAAKC,OAAOE,OAAS,EAAE,SAGI,OAArBH,KAAKC,OAAOM,KAAa,iCACf6B,EAAqB,CAC/B5B,KAAMR,KAAKC,OAAOO,KAClB6B,KAAMrC,KAAKC,OAAOE,SAClB,OAHFmC,EAAM,EAAH,gCAI2B,UAArBtC,KAAKC,OAAOM,KAAgB,kCACzB6B,EAAgB,CAC1BC,KAAMrC,KAAKC,OAAOE,OAClBoC,SAAUvC,KAAKC,OAAOiC,eACtB,QAHFI,EAAM,EAAH,gCAI2B,gBAArBtC,KAAKC,OAAOM,KAAsB,iBAG1B,OAFXiC,EACU,QADO,EAAGrB,OAAOsB,SAASC,OACvCC,MAAM,KAAK,UAAE,aADU,EAEtBA,MAAM,KAAK,GAAE,UAELP,EACVI,GAAqBxC,KAAKC,OAAOQ,SACjC,CACE4B,KAAMrC,KAAKC,OAAOE,OAClBoC,SAAUvC,KAAKC,OAAOiC,eAEzB,QANDI,EAAM,EAAH,gCAO2B,UAArBtC,KAAKC,OAAOM,KAAgB,kCACzB6B,EAAiBpC,KAAKC,OAAOhB,QAAU,CACjDoD,KAAMrC,KAAKC,OAAOE,OAClBK,KAAMR,KAAKC,OAAOkC,mBAAqB,SACvC,QAHFG,EAAM,EAAH,gCAI2B,WAArBtC,KAAKC,OAAOM,KAAiB,iBACuB,OAAvDqC,EAAwC,QAAvC,EAAGzB,OAAOsB,SAASC,OAAOC,MAAM,KAAK,UAAE,aAApC,EAAsCA,MAAM,KAAK,GAAE,UACjDP,EAAkB,CAC5BC,KAAMrC,KAAKC,OAAOE,OAClBK,KAAM,OACNoC,EAAAA,IACA,QAJFN,EAAM,EAAH,8CAMSF,EAAqBpC,KAAKC,OAAOhB,QAAU,CACrDoD,KAAMrC,KAAKC,OAAOE,OAClBK,KAAMR,KAAKC,OAAOkC,mBAAqB,WACvC,QAHFG,EAAM,EAAH,qCAOwB,OAPxB,0BAMLtC,KAAKC,OAAOI,SAAU,EACtBL,KAAKC,OAAOK,WAAY,EAAK,4BAI/BM,EAAAA,EAAAA,IAAQ,mBAAmBU,GAAGuB,UAAY,IAC3BC,EAAAA,EAAAA,IAAaR,EAAIS,MACzBnB,SAAQ,SAACN,IACdV,EAAAA,EAAAA,IAAQ,mBAAmBU,GAAG0B,sBAC5B,YACA1B,GAEFnC,EAAY8D,UAAU3B,EACxB,IAEAtB,KAAKC,OAAOI,SAAU,EACtBL,KAAKC,OAAOG,YAAckC,EAAIY,SAAS,0DACxC,0FAED,8FAC6B,GAA3BlD,KAAKC,OAAOI,SAAU,EAAK,SAGA,OAArBL,KAAKC,OAAOM,KAAa,gCACf6B,EAAoB,CAAEC,KAAMrC,KAAKC,OAAOE,OAAS,IAAI,OAAjEmC,EAAM,EAAH,+BAC2B,OAArBtC,KAAKC,OAAOM,KAAa,kCACtB6B,EAAqB,CAC/B5B,KAAMR,KAAKC,OAAOO,KAClB6B,KAAMrC,KAAKC,OAAOE,OAAS,IAC3B,QAHFmC,EAAM,EAAH,gCAI2B,OAArBtC,KAAKC,OAAOM,KAAa,kCACtB6B,EAAgB,CAAEC,KAAMrC,KAAKC,OAAOE,OAAS,IAAI,QAA7DmC,EAAM,EAAH,gCAC2B,UAArBtC,KAAKC,OAAOM,KAAgB,kCACzB6B,EAAgB,CAC1BC,KAAMrC,KAAKC,OAAOE,OAAS,EAC3BoC,SAAUvC,KAAKC,OAAOiC,cAAgB,gBACtC,QAHFI,EAAM,EAAH,gCAI2B,gBAArBtC,KAAKC,OAAOM,KAAsB,iBAG1B,OAFXiC,EACU,QADO,EAAGrB,OAAOsB,SAASC,OACvCC,MAAM,KAAK,UAAE,aADU,EAEtBA,MAAM,KAAK,GAAE,UACLP,EACVI,GAAqBxC,KAAKC,OAAOQ,SACjC,CACE4B,KAAMrC,KAAKC,OAAOE,OAAS,EAC3BoC,SAAUvC,KAAKC,OAAOiC,cAAgB,gBAEzC,QANDI,EAAM,EAAH,gCAO2B,UAArBtC,KAAKC,OAAOM,KAAgB,kCACzB6B,EAAiBpC,KAAKC,OAAOhB,QAAU,CACjDoD,KAAMrC,KAAKC,OAAOE,OAAS,EAC3BK,KAAMR,KAAKC,OAAOkC,mBAAqB,SACvC,QAHFG,EAAM,EAAH,gCAI2B,WAArBtC,KAAKC,OAAOM,KAAiB,iBACuB,OAAvDqC,EAAwC,QAAvC,EAAGzB,OAAOsB,SAASC,OAAOC,MAAM,KAAK,UAAE,aAApC,EAAsCA,MAAM,KAAK,GAAE,UACjDP,EAAkB,CAC5BC,KAAMrC,KAAKC,OAAOE,OAAS,EAC3BK,KAAM,OACNoC,EAAAA,IACA,QAJFN,EAAM,EAAH,8CAMSF,EAAqBpC,KAAKC,OAAOhB,QAAU,CACrDoD,KAAMrC,KAAKC,OAAOE,OAAS,EAC3BK,KAAMR,KAAKC,OAAOkC,mBAAqB,WACvC,QAHFG,EAAM,EAAH,qCAOwB,OAPxB,0BAMLtC,KAAKC,OAAOI,SAAU,EACtBL,KAAKC,OAAOK,WAAY,EAAK,4BAIhBwC,EAAAA,EAAAA,IAAaR,EAAIS,MACzBnB,SAAQ,SAACN,IACdV,EAAAA,EAAAA,IAAQ,mBAAmBU,GAAG0B,sBAC5B,YACA1B,GAEFnC,EAAY8D,UAAU3B,EACxB,IAGAtB,KAAKC,OAAOE,QAAU,EACtBH,KAAKC,OAAOI,SAAU,EACtBL,KAAKC,OAAOG,YAAckC,EAAIY,SAAS,0DACxC,iDAzQiB,GA4QpB,WAAgBnD,GAA0B,OAAK,IAAID,EAAeC,EAAM,C","sources":["webpack:///./src/api/feed.ts","webpack:///./src/components/FeedController.ts"],"sourcesContent":["import request from './request';\n\n// 搜索\nexport async function getSearchFeed(params: API.Feed.SearchFeedParams) {\n return request<API.Feed.FeedForGet>('/api/feed/search', { params });\n}\n\n// 推荐\nexport async function getRecommendFeed(params: API.Feed.RecommendFeedParams) {\n return request<API.Feed.FeedForGet>('/api/feed/recommend', { params });\n}\n\n// 关注\nexport async function getFollowedFeed(params: API.PageParams) {\n return request<API.Feed.FeedForGet>('/api/feed/followed', { params });\n}\n\n// 热榜\nexport async function getTrending(params: API.PageParams) {\n return request<API.Feed.FeedForGet>('/api/feed/trending', { params });\n}\n\n// 圈子最新发布\nexport async function getGroupNew(params: API.Feed.GroupFeedParams) {\n return request<API.Feed.FeedForGet>('/api/group/posts', { params });\n}\n\n// 圈子详情帖子列表\nexport async function getGroupPostList(\n group_uid: string,\n params: API.Feed.GroupFeedParams,\n) {\n return request<API.Feed.FeedForGet>(`/api/group/groups/${group_uid}/posts`, {\n params,\n });\n}\n\n// 个人主页——作品\nexport async function getUserWorks(\n userUid: string,\n params: API.Feed.RecommendFeedParams,\n) {\n return request<API.Feed.FeedForGet>(`/api/user/people/${userUid}/works`, {\n params,\n });\n}\n\n// 个人主页——收藏\nexport async function getUserBookmarks(\n userUid: string,\n params: API.Feed.RecommendFeedParams,\n) {\n return request<API.Feed.FeedForGet>(`/api/user/people/${userUid}/bookmarks`, {\n params,\n });\n}\n","import { createElList, reactEl, reactive, Toolkit } from '@ns/mpa';\n\nimport * as api from '@/api/feed';\n\nconst pollToolkit = new Toolkit().register({\n reactComponents: {},\n asyncReactComponents: {\n Poll: () => import('@/components/Poll'),\n ShareButton: () => import('@/components/ShareButton'),\n MarkButton: () => import('@/components/MarkButton'),\n FeedAvatarHeader: () => import('@/components/FeedAvatarHeader'),\n },\n asyncFunctionComponents: {},\n functionComponents: {},\n});\n\ntype FeedControllerProps = {\n hasMoreData: boolean;\n type: '关注' | '推荐' | '热榜' | 'group';\n userUid?: string;\n groupUid?: string;\n};\n\nclass FeedController {\n states: {\n // 下一次分页请求时使用的 offset 值\n offset: number;\n // 是否还有更多数据\n hasMoreData: boolean;\n // 是否加载中\n loading: boolean;\n // 加载失败\n loadError: boolean;\n // feed容器中得内容\n //feedHTML: string;\n type:\n | '关注'\n | '推荐'\n | '热榜'\n | 'group'\n | 'groupDetail'\n | 'works'\n | 'bookmarks'\n | 'search';\n kind: API.Feed.RecommendKind | undefined;\n groupOrderBy?: API.Feed.GroupFeedOrderBy | undefined;\n groupUid?: string;\n userUid?: string;\n userSecondTabKind?: API.Feed.RecommendKind;\n };\n\n constructor(props: FeedControllerProps) {\n this.states = reactive({\n offset: 1,\n hasMoreData: props.hasMoreData,\n loading: false,\n loadError: false,\n //feedHTML: \"\",\n type: props.type,\n kind: 'all',\n groupUid: props.groupUid,\n userUid: props.userUid,\n // userSecondTabKind: 'post',\n });\n\n this.setup();\n }\n\n setup() {\n if (this.states.type === 'works' || this.states.type === 'bookmarks') {\n this.loadData();\n }\n\n reactEl('#load-more-trigger')\n .toggleClass(\n 'hidden',\n () =>\n !this.states.hasMoreData ||\n this.states.loading ||\n this.states.loadError,\n { immediate: true },\n )\n .on('click', (e) => {\n e.preventDefault();\n this.loadMoreData();\n });\n\n reactEl('#loading-indicator').toggleClass(\n 'hidden',\n () => !this.states.loading,\n { immediate: true },\n );\n\n reactEl('#no-more-data-indicator').toggleClass(\n 'hidden',\n () => this.states.hasMoreData,\n { immediate: true },\n );\n\n reactEl('#load-error').toggleClass('hidden', () => !this.states.loadError, {\n immediate: true,\n });\n\n // watch(() => this.states.feedHTML, (html)=> {\n // const elList = createElList(html)\n // elList.forEach(el => {\n // reactEl('#feed-container').el.insertAdjacentElement('beforeend', el as Element)\n // pollToolkit.renderAll(el as Element)\n // })\n // })\n // 社区首页——推荐-二级tab\n window.addEventListener('click', (event) => {\n const el = event.target as HTMLInputElement;\n const secondTab = el.getAttribute('data-homepage-second-navbar') as\n | API.Feed.RecommendKind\n | undefined;\n if (!secondTab) return;\n this.states.kind = secondTab;\n document.querySelectorAll('.homepage-second-Kind').forEach((item) => {\n item.classList.remove('active');\n });\n el.classList.add('active');\n this.loadData();\n });\n\n // 圈子首页/详情——最新发布/最新回帖\n window.addEventListener('click', (event) => {\n const el = event.target as HTMLInputElement;\n const groupType = el.getAttribute('data-group-type') as\n | API.Feed.GroupFeedOrderBy\n | undefined;\n if (!groupType) return;\n this.states.groupOrderBy = groupType;\n document.querySelectorAll('.group-type').forEach((item) => {\n item.classList.remove('active');\n });\n el.classList.add('active');\n this.loadData();\n });\n\n // 个人主页——二级tab\n window.addEventListener('click', (event) => {\n const el = event.target as HTMLInputElement;\n const secondTab = el.getAttribute('data-user-second-navbar') as\n | API.Feed.RecommendKind\n | undefined;\n if (!secondTab) return;\n this.states.userSecondTabKind = secondTab;\n document.querySelectorAll('.user-second-Kind').forEach((item) => {\n item.classList.remove('active');\n });\n el.classList.add('active');\n this.loadData();\n });\n }\n\n async loadData() {\n this.states.hasMoreData = true;\n this.states.loading = true;\n this.states.offset = 1;\n let res;\n try {\n if (this.states.type === '推荐') {\n res = await api.getRecommendFeed({\n kind: this.states.kind,\n page: this.states.offset,\n });\n } else if (this.states.type === 'group') {\n res = await api.getGroupNew({\n page: this.states.offset,\n order_by: this.states.groupOrderBy,\n });\n } else if (this.states.type === 'groupDetail') {\n const childrenGroupsUid = window.location.search\n .split('?')[1]\n ?.split('=')[2];\n\n res = await api.getGroupPostList(\n childrenGroupsUid || this.states.groupUid!,\n {\n page: this.states.offset,\n order_by: this.states.groupOrderBy,\n },\n );\n } else if (this.states.type === 'works') {\n res = await api.getUserWorks(this.states.userUid!, {\n page: this.states.offset,\n kind: this.states.userSecondTabKind || 'post',\n });\n } else if (this.states.type === 'search') {\n const q = window.location.search.split('?')[1]?.split('=')[1];\n res = await api.getSearchFeed({\n page: this.states.offset,\n kind: 'post', // TODO: 因只做了圈子的数据搜索,目前先写死后期需要动态传入: this.states.kind\n q,\n });\n } else {\n res = await api.getUserBookmarks(this.states.userUid!, {\n page: this.states.offset,\n kind: this.states.userSecondTabKind || 'lesson',\n });\n }\n } catch (err) {\n this.states.loading = false;\n this.states.loadError = true;\n return;\n }\n\n reactEl('#feed-container').el.innerHTML = '';\n const elList = createElList(res.html);\n elList.forEach((el) => {\n reactEl('#feed-container').el.insertAdjacentElement(\n 'beforeend',\n el as Element,\n );\n pollToolkit.renderAll(el as Element);\n });\n\n this.states.loading = false;\n this.states.hasMoreData = res.has_more;\n }\n\n async loadMoreData() {\n this.states.loading = true;\n let res;\n try {\n if (this.states.type === '关注') {\n res = await api.getFollowedFeed({ page: this.states.offset + 1 });\n } else if (this.states.type === '推荐') {\n res = await api.getRecommendFeed({\n kind: this.states.kind,\n page: this.states.offset + 1,\n });\n } else if (this.states.type === '热榜') {\n res = await api.getTrending({ page: this.states.offset + 1 });\n } else if (this.states.type === 'group') {\n res = await api.getGroupNew({\n page: this.states.offset + 1,\n order_by: this.states.groupOrderBy || '-replied_at',\n });\n } else if (this.states.type === 'groupDetail') {\n const childrenGroupsUid = window.location.search\n .split('?')[1]\n ?.split('=')[2];\n res = await api.getGroupPostList(\n childrenGroupsUid || this.states.groupUid!,\n {\n page: this.states.offset + 1,\n order_by: this.states.groupOrderBy || '-replied_at',\n },\n );\n } else if (this.states.type === 'works') {\n res = await api.getUserWorks(this.states.userUid!, {\n page: this.states.offset + 1,\n kind: this.states.userSecondTabKind || 'post',\n });\n } else if (this.states.type === 'search') {\n const q = window.location.search.split('?')[1]?.split('=')[1];\n res = await api.getSearchFeed({\n page: this.states.offset + 1,\n kind: 'post', //TODO: 因只做了圈子的数据搜索,目前先写死后期需要动态传入: this.states.kind\n q,\n });\n } else {\n res = await api.getUserBookmarks(this.states.userUid!, {\n page: this.states.offset + 1,\n kind: this.states.userSecondTabKind || 'lesson',\n });\n }\n } catch (err) {\n this.states.loading = false;\n this.states.loadError = true;\n return;\n }\n\n const elList = createElList(res.html);\n elList.forEach((el) => {\n reactEl('#feed-container').el.insertAdjacentElement(\n 'beforeend',\n el as Element,\n );\n pollToolkit.renderAll(el as Element);\n });\n\n // this.states.feedHTML = res.html;\n this.states.offset += 1;\n this.states.loading = false;\n this.states.hasMoreData = res.has_more;\n }\n}\n\nexport default (props: FeedControllerProps) => new FeedController(props);\n"],"names":["getSearchFeed","params","request","getRecommendFeed","getFollowedFeed","getTrending","getGroupNew","getGroupPostList","group_uid","getUserWorks","userUid","getUserBookmarks","pollToolkit","Toolkit","register","reactComponents","asyncReactComponents","Poll","ShareButton","MarkButton","FeedAvatarHeader","asyncFunctionComponents","functionComponents","FeedController","props","this","states","reactive","offset","hasMoreData","loading","loadError","type","kind","groupUid","setup","loadData","reactEl","toggleClass","immediate","on","e","preventDefault","loadMoreData","window","addEventListener","event","el","target","secondTab","getAttribute","document","querySelectorAll","forEach","item","classList","remove","add","groupType","groupOrderBy","userSecondTabKind","api","page","res","order_by","childrenGroupsUid","location","search","split","q","innerHTML","createElList","html","insertAdjacentElement","renderAll","has_more"],"sourceRoot":""}