Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor file viewer #7270

Draft
wants to merge 37 commits into
base: master
Choose a base branch
from
Draft

Conversation

ch-iv
Copy link
Contributor

@ch-iv ch-iv commented Oct 19, 2024

Proposed Changes

(Describe your changes here. Also describe the motivation for your changes: what problem do they solve, or how do they improve the application or codebase? If this pull request fixes an open issue, use a keyword to link this pull request to the issue.)

...

Screenshots of your changes (if applicable)
Associated documentation repository pull request (if applicable)

Type of Change

(Write an X or a brief description next to the type or types that best describe your changes.)

Type Applies?
🚨 Breaking change (fix or feature that would cause existing functionality to change)
New feature (non-breaking change that adds functionality)
🐛 Bug fix (non-breaking change that fixes an issue)
🎨 User interface change (change to user interface; provide screenshots)
♻️ Refactoring (internal change to codebase, without changing functionality)
🚦 Test update (change that only adds or modifies tests)
📦 Dependency update (change that updates a dependency)
🔧 Internal (change that only affects developers or continuous integration)

Checklist

(Complete each of the following items for your pull request. Indicate that you have completed an item by changing the [ ] into a [x] in the raw text, or by clicking on the checkbox in the rendered description on GitHub.)

Before opening your pull request:

  • I have performed a self-review of my changes.
    • Check that all changed files included in this pull request are intentional changes.
    • Check that all changes are relevant to the purpose of this pull request, as described above.
  • I have added tests for my changes, if applicable.
    • This is required for all bug fixes and new features.
  • I have updated the project documentation, if applicable.
    • This is required for new features.
  • If this is my first contribution, I have added myself to the list of contributors.

After opening your pull request:

  • I have updated the project Changelog (this is required for all changes).
  • I have verified that the pre-commit.ci checks have passed.
  • I have verified that the CI tests have passed.
  • I have reviewed the test coverage changes reported by Coveralls.
  • I have requested a review from a project maintainer.

Questions and Comments

(Include any questions or comments you have regarding your changes.)

Copy link
Collaborator

@david-yz-liu david-yz-liu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ch-iv great work! The code in this component is quite thorny, and you've done a good job teasing it apart. I've left a few comments on how you can streamline further (with a bit more aggressive refactoring).

One thing to watch out for as you are doing manual tests of your code is to make sure in the grading view that annotations are correctly rendered as files are switched, when switching between viewers of different types (e.g., pdf -> text) and between different files that use the same viewer.

});
}
});
this.setFileUrl(submission_file_id);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to my comment on your other PR, this function calls setState, which isn't synchronous. As you probably noticed, in the current implementation of setFileUrl, all of the URL-creation code is synchronous except the heic/heif image formats, which currently require a separate request to be made.

You can try doing the following:

  • Move the heic/heif handling into the ImageViewer component, where it more logically belongs
  • Change this.setFileUrl to this.getFileUrl and just (synchronously) return a URL, and then use that to set the initial url in the setState call on line 114
  • Ideally set the type state in that initial call (L114) as well, so that you don't need the if branch code on Lines 122-124
  • See also my comment on the plaintext/binary branch a bit further below

if (response.ok) {
return response.text();
}
const delimiter = this.props.selectedFileURL.includes("?") ? "&" : "?";
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This delimiter-handling part is quite awkward; I believe you're running into this because you're trying to unify the handling of multiple different URLs.

Rather than insert this here, please modify how the URLs are originally generated to include these query parameters directly. (I assume this will involve a few different locations, because of the different places this component is used.)

return response.text();
}
const delimiter = this.props.selectedFileURL.includes("?") ? "&" : "?";
fetch(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, so a larger change you can make (which I'd support) is to move the content fetching here into the TextViewer and BinaryViewer components. This will make the different viewer components more uniform in how they fetch data, and help simplify the FileViewer code.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants