Repository navigation
Conversation
caf95f0 to
e40200c
Compare
jserv
left a comment
There was a problem hiding this comment.
Check CONTRIBUTING.md carefully.
Improve git commit messages per https://cbea.ms/git-commit/ :
- Separate subject from body with a blank line
- Limit the subject line to 50 characters
- Capitalize the subject line
- Do not end the subject line with a period
- Use the imperative mood in the subject line
- Wrap the body at 72 characters
- Use the body to explain what and why vs. how
Don’t make the same mistakes again! Run make hooks in advance.
This comment has been minimized.
This comment has been minimized.
|
@ga-1113 e40200c merges |
e40200c to
97fda76
Compare
| /// Find the published problem for a completed scenario. The map's key is the | ||
| /// LeetCode URL slug; scenario page names and saved legacy ids both work here. | ||
| /// A malformed map entry cannot turn the fixed destination into another host. | ||
| export function originalProblemForPage(pages, page) { |
There was a problem hiding this comment.
This puts the published title and LeetCode URL into Past attempts, the replay and the downloaded Markdown. docs/development.md says the opposite: "The title reaches the live interview page only: saved history, the downloaded report and the replay keep the scenario's." It also lists the only reasons web/problem-pages.json is fetched, and every completed report is now one more. Update that paragraph in this PR so the contract matches what ships.
97fda76 to
620efca
Compare
620efca to
84bd452
Compare
|
Rebased onto the latest main to include the CI fixes from #434 and resolved the conflict. |
Don't leave messages like the above, as GitHub always tracks. |
| void loadPageMap() | ||
| .then((pages) => { | ||
| if (selected === recordingId) | ||
| showOriginalProblem(nodes.report, pages, saved.problemId); | ||
| }) | ||
| .catch(() => {}); |
There was a problem hiding this comment.
No browser test reaches this lookup, or the one renderReport in web/interview.js starts for the report shown right after an interview, which is the case #152 asks for. Only the Past attempts path is driven end to end, so the selected === recordingId guard and the immediate report's link could break with every test still passing. Add one test that finishes an interview and expects the link under the title, and one that opens a second recording before the first lookup settles and checks the first problem's link does not appear on it.
jserv
left a comment
There was a problem hiding this comment.
Rebase latest main branch and resolve conflicts.
Completed reports need a way back to the original problem so readers can revisit the source while reviewing their answers. Include the LeetCode link in completed reports, saved attempts, replays, and Markdown exports. Prevent duplicate exports while the optional problem lookup is pending, and allow retries after it finishes or fails. Add browser coverage for the report shown after an interview and for a late lookup after switching recordings, so stale links cannot appear on another report.
84bd452 to
5b47ed1
Compare
| let timer; | ||
| try { | ||
| return await Promise.race([ | ||
| loadPageMap().catch(() => null), |
There was a problem hiding this comment.
This .catch(() => null) is what lets a download proceed when the map fetch fails or returns malformed JSON. Every test either swaps out loadPageMapForDownload (the download.test.js harness) or only stalls the fetch to hit the timeout (the lobby test), so deleting this catch would leave the suite green while an offline user loses report export. Add a browser test that aborts /problem-pages.json and another that serves invalid JSON, then asserts one Markdown download with no Original problem: line and a re-enabled button.
| button.disabled = true; | ||
| try { | ||
| const at = new Date(); | ||
| const problemPages = await loadPageMapForDownload(); |
There was a problem hiding this comment.
leaveRoom() doesn't know about this wait. Once the report is persisted, Done navigates to / without a confirm. So if /problem-pages.json is still pending, the export is lost when Done is clicked within the next 10s. That happens when the prefetch in renderReport stalled, or when it failed and this call fetches again. Before this change the file was saved synchronously inside the click. Disabling #done while a download is pending, or letting leaveRoom wait for it, would close that gap.
|
|
||
| /// A report can be exported without its optional original-problem link. Bound | ||
| /// only this caller's wait; the shared lookup may still serve other consumers. | ||
| export async function loadPageMapForDownload() { |
There was a problem hiding this comment.
This is the same bounded wait as loadHistoryPageMap in web/app.js (L1126). The only difference is that the timeout is 10_000 here and requestTimeoutMs there. Exporting one helper from this module, e.g. loadPageMapWithin(ms), and using it in both places would keep the two from drifting. The void loadPageMap().then(... showOriginalProblem ...).catch(() => {}) repeated in app.js, interview.js and replay.js could live next to it too, with replay passing its selected === recordingId check in.
The completed report now shows an Original problem link directly below its title. The link uses the published problem map to open the corresponding LeetCode page.
The same reference appears in the immediate report, Past attempts, replay, and downloaded Markdown. The lobby loads the map only when a saved report is opened or exported. Unknown or malformed mappings leave the line hidden, and the active interview view is unchanged.
Checks: 138 lobby browser tests, 70 render tests, and 8 history tests passed. Prettier 3.9.9 and ESLint 10.12.0 passed for the changed JavaScript files; the local app was manually tested.
Closes #152