{"version":3,"file":"js/chunk.09897daf0348e5cc.js","mappings":"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","sources":["webpack:///./src/components/homepage/HomepageContribution/index.tsx","webpack:///./src/api/homepage.ts"],"sourcesContent":["// 首页 -- 贡献榜\nimport * as api from '@/api/homepage';\nimport bg from '@/static/imgs/homepage-contribution-bg.png';\nimport { useRequest } from 'ahooks';\nimport { Avatar, Modal } from 'antd';\nimport { useState } from 'react';\n\ntype ItemRenderProps = {\n item: API.Homepage.BuildingRankItem;\n};\nconst ItemRender: React.FC<ItemRenderProps> = ({ item }) => {\n const [avatarUrl] = useState(\n item.avatar_url ||\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxOC41OCAxOC41OCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiNiY2MxY2M7fS5jbHMtMntmaWxsOiNmZmY7ZmlsbC1ydWxlOmV2ZW5vZGQ7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT7otYTmupAgMzwvdGl0bGU+PGcgaWQ9IuWbvuWxgl8yIiBkYXRhLW5hbWU9IuWbvuWxgiAyIj48ZyBpZD0i5Zu+5bGCXzEtMiIgZGF0YS1uYW1lPSLlm77lsYIgMSI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSI5LjI5IiBjeT0iOS4yOSIgcj0iOS4yOSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTcuODEsMTMuMWMtLjkxLjE1LTQuMTYsMS42My00LjQ4LDMuMzFhOS4yOCw5LjI4LDAsMCwwLDExLjkzLDBjLS4zMi0xLjY4LTMuNTgtMy4xNi00LjQ4LTMuMzEtLjMsMC0uMy0uODktLjMtLjg5YTQuMzQsNC4zNCwwLDAsMCwxLjA2LTIuMDljLjUxLDAsLjgyLTEuMjguMzEtMS43MywwLS40Ny42Ni0zLjcxLTIuNTYtMy43MVM2LjcxLDcuOTEsNi43NCw4LjM5Yy0uNTEuNDUtLjE5LDEuNzMuMzEsMS43M2E0LjM0LDQuMzQsMCwwLDAsMS4wNiwyLjA5UzguMSwxMy4wNSw3LjgxLDEzLjFaIi8+PC9nPjwvZz48L3N2Zz4=',\n );\n\n const numberCommonClassNames =\n 'w-24px h-24px rounded-full flex justify-center items-center text-hex-FFFFFF';\n\n const numberRender = (sort: number) => {\n switch (sort) {\n case 1:\n return (\n <div className={`${numberCommonClassNames} bg-hex-e3635d`}>1</div>\n );\n case 2:\n return (\n <div className={`${numberCommonClassNames} bg-hex-ff7c2e`}>2</div>\n );\n case 3:\n return (\n <div className={`${numberCommonClassNames} bg-hex-ffb02e`}>3</div>\n );\n default:\n return (\n <div className={`${numberCommonClassNames} bg-hex-c9cdd4`}>\n {sort}\n </div>\n );\n }\n };\n\n return (\n <div className=\"mt-10px flex justify-between items-center\">\n <div className=\"flex items-center\">\n {numberRender(item.sort)}\n <div className=\"ml-8px\">\n <Avatar src={avatarUrl} style={{ objectFit: 'cover' }} />\n </div>\n <span className=\"text-hex-1D2129 text-15px ml-8px\">{item.name}</span>\n </div>\n <div className=\"flex items-center\">\n <span className=\"text-hex-1D2129 text-18px mr-4px\">\n {item.building_score}\n </span>\n <span className=\"text-hex-86909C text-12px\">共建值</span>\n </div>\n </div>\n );\n};\n\ntype HomepageContributionProps = {\n open: boolean;\n closeModal: () => void;\n};\n\nconst HomepageContribution: React.FC<HomepageContributionProps> = (props) => {\n const [rankType, setRankType] = useState<'all' | 'week'>('all');\n // 贡献列表\n const { data: buildingRankData, run: runBuildingRankData } = useRequest(\n async (params) => {\n return await api.getBuildingRank(params);\n },\n {\n defaultParams: [{ kind: rankType }],\n },\n );\n const active = 'w-40px h-20px bg-hex-ffffff rounded-100px text-hex-3598E8';\n return (\n <Modal\n className=\"homepage-contribution\"\n width={400}\n open={props.open}\n footer={null}\n onCancel={props.closeModal}\n maskClosable={false}\n >\n <div\n style={{ backgroundImage: `url(${bg})` }}\n className=\"space-y-6px py-16px px-20px h-110px text-hex-FFFFFF\"\n >\n <div className=\"mt-40px flex justify-between items-center\">\n <div className=\"flex items-center\">\n <div>\n <Avatar\n src={buildingRankData?.avatar_url}\n style={{ objectFit: 'cover' }}\n />\n </div>\n <span className=\"text-15px ml-8px\">\n 我的排名:\n {buildingRankData?.sort || (buildingRankData?.user_uid && '-')}\n </span>\n </div>\n <div className=\"flex items-center\">\n <span className=\"text-18px mr-4px\">\n {buildingRankData?.building_score ||\n (buildingRankData?.user_uid && '-')}\n </span>\n <span className=\"text-12px\"> 共建值</span>\n </div>\n </div>\n </div>\n\n <div className=\"p-20px\">\n <div className=\"flex justify-between items-center\">\n <div className=\"text-hex-1D2129 text-16px font-500\">\n {rankType === 'all' ? '总榜' : '周榜'}\n </div>\n <div className=\"w-84px h-24px bg-hex-F2F3F5 text-hex-4E5969 rounded-full p-2px flex\">\n <div\n className={`w-40px text-12px cursor-pointer flex justify-center items-center ${\n rankType === 'all' && active\n } `}\n onClick={() => {\n setRankType('all');\n runBuildingRankData({ kind: 'all' });\n }}\n >\n 总榜\n </div>\n <div\n className={`w-40px text-12px cursor-pointer flex justify-center items-center ${\n rankType === 'week' && active\n } `}\n onClick={() => {\n setRankType('week');\n runBuildingRankData({ kind: 'week' });\n }}\n >\n 周榜\n </div>\n </div>\n </div>\n <div className=\"mt-18px\">\n {buildingRankData?.items.map((item) => {\n return <ItemRender key={item.user_uid} item={item} />;\n })}\n </div>\n </div>\n </Modal>\n );\n};\n\nexport default HomepageContribution;\n","import request from './request';\n\n// 获取广告内容\nexport async function areaDetail(areaCode: string) {\n return request<API.Homepage.Area>(`/api/publicity/areas/${areaCode}`, {\n skipErrorHandler: true,\n });\n}\n\n// 获取广告弹窗内容\nexport async function getPopDetail() {\n return request<API.Homepage.Pop>(`/api/publicity/pop`, {\n skipErrorHandler: true,\n });\n}\n\n// 活动列表\nexport async function listActivities(\n params: API.Homepage.ActivityForListParams,\n) {\n return request<API.Homepage.ActivityForList[]>(`/api/activity/activities`, {\n params,\n });\n}\n\n// 获取社区表单\nexport async function listCommunityForms(\n params: API.Homepage.FormForListParams,\n) {\n return request<API.PageResponse<API.Homepage.FormForList>>(\n '/api/crf/community/forms',\n { params },\n );\n}\n\n/**\n * 贡献排行榜\n * @param statsType\n * portal_rank: 总榜\n * portal_rank_last30d: 月榜\n */\nexport async function rankForList(params: API.Homepage.RankForListParams) {\n return request<API.ToolPageResponse<API.Homepage.RankForList>>(\n '/api/stats/rank/ranks',\n { params },\n );\n}\n\n/**\n * 科研导航-首页展示\n * @returns\n */\nexport async function navigationForList() {\n return request<API.ToolPageResponse<API.Homepage.NavigationForList>>(\n '/api/tools/navigation/navigations/index',\n );\n}\n\n/**\n * 工具广场\n * @returns\n */\nexport async function toolsForList() {\n return request<API.ToolPageResponse<API.Homepage.ToolForList>>(\n '/api/tools/portal',\n );\n}\n\n/**\n * 收藏\n * @param navigationId\n * @returns\n */\nexport async function navigationBookmark(navigationId: number) {\n return request(`/api/tools/navigation/${navigationId}/like`, {\n method: 'POST',\n });\n}\n\n/**\n * 取消收藏\n * @param navigationId\n * @returns\n */\nexport async function navigationUnbookmark(navigationId: number) {\n return request(`/api/tools/navigation/${navigationId}/unlike`, {\n method: 'POST',\n });\n}\n\n/**\n *\n * @returns\n */\nexport async function getStats() {\n return request<API.Homepage.StatsDetail>('/api/stats/threads/count');\n}\n\n// 积分任务列表\nexport async function listTasks(params: { is_jifen_enabled?: number }) {\n return request<API.Homepage.TaskForList[]>('/api/task/tasks', {\n // 首页会自动调用该接口,用户未登录时屏蔽报错\n // FIXME 注意,原则上,这里不应该设置 skipErrorHandler,而应该在业务组件中判断,若用户未登录,则不调用该接口\n skipErrorHandler: true,\n params,\n });\n}\n\n// 触发任务事件通知\nexport async function taskSignals(data: API.Homepage.TaskCheckSignalsData) {\n return request<API.Homepage.TaskForList[]>('/api/task/signals', {\n method: 'POST',\n data,\n });\n}\n// 签到\nexport async function taskCheck(data: API.Homepage.TaskCheckData) {\n return request<API.Homepage.TaskForList[]>('/api/task/check', {\n method: 'POST',\n data,\n });\n}\n// 用户签到详情\nexport async function getUsercheck(params: { device_t: number }) {\n return request<API.Homepage.TaskUsercheckDetail>('/api/task/usercheck', {\n params,\n // 首页会自动调用该接口,用户未登录时屏蔽报错\n // FIXME 注意,原则上,这里不应该设置 skipErrorHandler,而应该在业务组件中判断,若用户未登录,则不调用该接口\n skipErrorHandler: true,\n });\n}\n\n// 共建积分概要\nexport async function getBuildingOverview() {\n return request<API.Homepage.BuildingOverviewDetail>(\n '/api/task/building-overview',\n );\n}\n\n// 共建榜前10\nexport async function getBuildingRank(params: { kind: 'all' | 'week' }) {\n return request<API.Homepage.BuildingRankForGet>(\n '/api/task/stat/building-rank',\n { params },\n );\n}\n\n// 用户勋章列表\nexport async function getUserMedal(uid: string | null) {\n return request<API.Homepage.UserMedalForList[]>(\n `/api/task/users/${uid}/user-medal`,\n );\n}\n\n// 获取用户完成任务的提示\nexport async function getUnreadUserTask() {\n return request<API.Homepage.UnreadUserTaskForGet>(\n '/api/task/get-unread-user-task',\n );\n}\n\n// 获取用户勋章提示\nexport async function getUnreadUserMedal() {\n return request<API.Homepage.UnreadUserMedalForGet>(\n '/api/task/get-unread-user-medal',\n );\n}\n\n// 最新动态\nexport async function listEvents(params: API.PageParams) {\n return request<API.ToolPageResponse<API.Homepage.EventForList>>(\n '/api/event/events',\n {\n params,\n },\n );\n}\n\n// 获取用户是否有机构工作台\nexport async function getHasDashboard() {\n return request<API.Homepage.HasJoinedDashboard>(\n '/api/system/userinfo/dashboard',\n );\n}\n"],"names":["ItemRender","item","useState","avatar_url","avatarUrl","numberCommonClassNames","className","sort","numberRender","src","style","objectFit","name","building_score","props","rankType","setRankType","useRequest","params","api","defaultParams","kind","buildingRankData","data","runBuildingRankData","run","active","width","open","footer","onCancel","closeModal","maskClosable","backgroundImage","bg","user_uid","onClick","items","map","areaDetail","areaCode","request","skipErrorHandler","getPopDetail","listActivities","listCommunityForms","navigationForList","toolsForList","navigationBookmark","navigationId","method","navigationUnbookmark","getStats","listTasks","taskCheck","getUsercheck","getBuildingOverview","getBuildingRank","getUserMedal","uid","getUnreadUserTask","getUnreadUserMedal","listEvents"],"sourceRoot":""}