From 49f03fe85f22f301d29bd3ee3d66f452710e58a4 Mon Sep 17 00:00:00 2001 From: XYShaoKang <38753204+XYShaoKang@users.noreply.github.com> Date: Sat, 21 Sep 2024 22:40:36 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修复「全国、全球」按钮切换 2. 修复页面切换 --- src/content/pages/ranking/App.tsx | 12 ++-- src/content/pages/ranking/BetaApp.tsx | 19 +++--- src/content/pages/ranking/Item.tsx | 64 +++++++++++++------ src/content/pages/ranking/Predict.tsx | 14 +++- src/content/pages/ranking/RealTimePredict.tsx | 4 +- src/content/pages/ranking/utils.ts | 9 ++- 6 files changed, 74 insertions(+), 48 deletions(-) diff --git a/src/content/pages/ranking/App.tsx b/src/content/pages/ranking/App.tsx index 5d697a7..bad8970 100644 --- a/src/content/pages/ranking/App.tsx +++ b/src/content/pages/ranking/App.tsx @@ -58,21 +58,17 @@ const LegacyApp: FC = () => { }) ).unwrap() const userInfos = res.total_rank.map(a => { - if (a.data_region.toLocaleLowerCase() === 'cn') { - return { - region: a.data_region, - username: a.user_slug, - } - } return { region: a.data_region, - username: a.username, + username: a.user_slug, + oldUsername: a.username, } }) if (hasMyRank) { userInfos.unshift({ region: 'CN', - username: (window as any).LeetCodeData.userStatus.username, + username: (window as any).LeetCodeData.userStatus.user_slug, + oldUsername: (window as any).LeetCodeData.userStatus.username, }) } setUserInfos(userInfos) diff --git a/src/content/pages/ranking/BetaApp.tsx b/src/content/pages/ranking/BetaApp.tsx index 25792f5..ee14b96 100644 --- a/src/content/pages/ranking/BetaApp.tsx +++ b/src/content/pages/ranking/BetaApp.tsx @@ -26,7 +26,7 @@ export const BetaApp: FC = () => { const options = useAppSelector(selectOptions) const [titleRoot, setTitleRoot] = useState() const [rows, setRows] = useState() - const [param] = useUrlChange() + const [param] = useUrlChange(true) const dispatch = useAppDispatch() const hasMyRank = !!rows?.[0]?.parentElement?.className.includes( 'from-ranking-primary' @@ -45,15 +45,10 @@ export const BetaApp: FC = () => { ).unwrap() const userInfos = res.total_rank.map(a => { - if (a.data_region.toLocaleLowerCase() === 'cn') { - return { - region: a.data_region, - username: a.user_slug, - } - } return { region: a.data_region, - username: a.username, + username: a.user_slug, + oldUsername: a.username, } }) if (hasMyRank) { @@ -63,6 +58,7 @@ export const BetaApp: FC = () => { userInfos.unshift({ region: 'CN', username, + oldUsername: username, }) } setUserInfos(userInfos) @@ -75,8 +71,6 @@ export const BetaApp: FC = () => { useEffectMount(async state => { const handleChange = debounce(async () => { - // const parent = await findElement('.table-responsive>table>thead>tr') - // console.log('handleChange') const el = await findElementByXPath( '//*[@id="__next"]//div[text()="用户名"]', el => { @@ -103,7 +97,6 @@ export const BetaApp: FC = () => { .children as unknown as HTMLElement[] if (state.isMount) { setTitleRoot(trs[0]) - // console.log([...trs].slice(1).map(a=>a.children[0])) setRows([...trs].slice(1).map(a => a.children[0]) as HTMLElement[]) } } @@ -111,6 +104,10 @@ export const BetaApp: FC = () => { handleChange() window.addEventListener('urlchange', handleChange) + const el = await findElementByXPath( + '//*[@id="__next"]//button[text()="全国"]' + ) + el.parentElement!.addEventListener('click', handleChange) }, []) useEffect(() => { diff --git a/src/content/pages/ranking/Item.tsx b/src/content/pages/ranking/Item.tsx index a7ce936..a81ce71 100644 --- a/src/content/pages/ranking/Item.tsx +++ b/src/content/pages/ranking/Item.tsx @@ -5,6 +5,7 @@ import { css } from 'styled-components/macro' import { debounce } from 'src/utils' import { selectUserPredict, selectContestInfo } from './rankSlice' +import { findElementByXPath } from '@/utils' type ItmeType = { contestSlug: string @@ -25,24 +26,38 @@ export type PageParamType = { region: 'local' | 'global' } -function getParam(): PageParamType { +function getParam(beta?: boolean): PageParamType { const [, contestId, , pageStr = '1'] = location.pathname .split('/') .filter(Boolean) const page = Number(pageStr) - const checkbox = document.querySelector( - '.checkbox>label>input' - ) as HTMLInputElement - const region = checkbox?.checked ? 'global' : 'local' + let region: 'local' | 'global' = 'local' + if (beta) { + const btn = document.evaluate( + '//*[@id="__next"]//button[text()="全国"]', + document, + null, + XPathResult['FIRST_ORDERED_NODE_TYPE'], + null + ).singleNodeValue as HTMLButtonElement + if (btn && btn.dataset.state !== 'active') { + region = 'global' + } + } else { + const checkbox = document.querySelector( + '.checkbox>label>input' + ) as HTMLInputElement + region = checkbox?.checked ? 'global' : 'local' + } return { contestId, page, region } } -export function useUrlChange(): [PageParamType] { - const [param, setParam] = useState(getParam()) +export function useUrlChange(beta?: boolean): [PageParamType] { + const [param, setParam] = useState(getParam(beta)) useEffectMount(state => { const handle = debounce(() => { - if (state.isMount) setParam(getParam()) + if (state.isMount) setParam(getParam(beta)) }, 100) window.addEventListener('urlchange', handle) state.unmount.push(() => { @@ -51,19 +66,30 @@ export function useUrlChange(): [PageParamType] { }) }, []) // 是否选中「显示全球」 - useEffectMount(state => { - const checkbox = document.querySelector( - '.checkbox>label>input' - ) as HTMLInputElement - if (!checkbox) return + useEffectMount(async state => { const handle = debounce((_e: Event) => { - if (state.isMount) setParam(getParam()) + if (state.isMount) setParam(getParam(beta)) }, 100) - checkbox.addEventListener('change', handle) - state.unmount.push(() => { - handle.cancel() - checkbox.removeEventListener('change', handle) - }) + if (beta) { + const el = await findElementByXPath( + '//*[@id="__next"]//button[text()="全国"]' + ) + el.parentElement!.addEventListener('click', handle) + state.unmount.push(() => { + handle.cancel() + el.parentElement!.removeEventListener('change', handle) + }) + } else { + const checkbox = document.querySelector( + '.checkbox>label>input' + ) as HTMLInputElement + if (!checkbox) return + checkbox.addEventListener('change', handle) + state.unmount.push(() => { + handle.cancel() + checkbox.removeEventListener('change', handle) + }) + } }) return [param] } diff --git a/src/content/pages/ranking/Predict.tsx b/src/content/pages/ranking/Predict.tsx index 9f93bba..4ed3b21 100644 --- a/src/content/pages/ranking/Predict.tsx +++ b/src/content/pages/ranking/Predict.tsx @@ -25,7 +25,7 @@ const PredictItem = memo(function PredictItem({ ...props }: PredictItemProps) { const { username, region } = useUser(hasMyRank, index, row, beta) - const [{ contestId: contestSlug }] = useUrlChange() + const [{ contestId: contestSlug }] = useUrlChange(beta) return ( { - dispatch(fetchPrediction({ contestSlug: contestId, users: userInfos })) + dispatch( + fetchPrediction({ + contestSlug: contestId, + users: userInfos.map(a => ({ + region: a.region, + username: a.oldUsername!, + })), + }) + ) }, [dispatch, contestId, JSON.stringify(userInfos)]) const showPredict = !!options?.contestRankingPage.showPredict diff --git a/src/content/pages/ranking/RealTimePredict.tsx b/src/content/pages/ranking/RealTimePredict.tsx index b773c08..ccb2a81 100644 --- a/src/content/pages/ranking/RealTimePredict.tsx +++ b/src/content/pages/ranking/RealTimePredict.tsx @@ -24,7 +24,7 @@ export const RealTimePredictItem: FC = ({ ...props }) => { const { username, region } = useUser(hasMyRank, index, row, beta) - const [{ contestId: contestSlug }] = useUrlChange() + const [{ contestId: contestSlug }] = useUrlChange(beta) usePredict({ username, @@ -55,7 +55,7 @@ export const RealTimePredict: FC = ({ hasMyRank, ...props }) => { - const [{ contestId: contestSlug }] = useUrlChange() + const [{ contestId: contestSlug }] = useUrlChange(props.beta) useFetchPreviousRatingData(contestSlug) const borderColor = props.beta ? '#888' : '#ddd' diff --git a/src/content/pages/ranking/utils.ts b/src/content/pages/ranking/utils.ts index 079b6f0..5dc0486 100644 --- a/src/content/pages/ranking/utils.ts +++ b/src/content/pages/ranking/utils.ts @@ -18,7 +18,7 @@ import { selectFetchContestRankingState, } from './rankSlice' -export type User = { region: string; username: string } +export type User = { region: string; username: string; oldUsername?: string } /** 获取当前行的用户信息 * @@ -43,11 +43,10 @@ export function getUsername( const a = row.children[0].children[0].children[0] as HTMLAnchorElement if (a.host === 'leetcode.com') { region = 'US' - username = a.pathname.split('/').filter(Boolean)[0] } else { region = 'CN' - username = a.pathname.split('/').filter(Boolean)[1] } + username = a.pathname.split('/').filter(Boolean)[1] } else { const a = row.children[1].children[0] as HTMLAnchorElement if (a.host === 'leetcode.com') { @@ -72,13 +71,13 @@ export const useRowChange = ( useEffect(() => { const handleChange = debounce(() => { onChange() - }, 10) + }, 100) handleChange() const observer = new MutationObserver(handleChange) const a = beta ? row.children[0].children[0].children[0].children[0] : row.children[1].children[0] - observer.observe(a, { attributes: true }) + observer.observe(a, { attributes: true, childList: true }) return () => { handleChange.cancel() observer.disconnect() From c0c8045145c4c6966950d8e13b2da74b8bea039b Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 21 Sep 2024 14:41:57 +0000 Subject: [PATCH 2/2] chore(release): 0.14.2 [skip ci] --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b90184..012f650 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [0.14.2](https://github.com/XYShaoKang/refined-leetcode/compare/v0.14.1...v0.14.2) (2024-09-21) + + +### Bug Fixes + +* 修复切换问题 ([49f03fe](https://github.com/XYShaoKang/refined-leetcode/commit/49f03fe85f22f301d29bd3ee3d66f452710e58a4)) + ## [0.14.1](https://github.com/XYShaoKang/refined-leetcode/compare/v0.14.0...v0.14.1) (2024-09-17) diff --git a/package.json b/package.json index 703504d..7c16f30 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "refined-leetcode", - "version": "0.14.1", + "version": "0.14.2", "main": "index.js", "author": "XYShaoKang", "license": "MIT", pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy