diff --git a/scm-ui/src/repos/sources/components/content/SourcecodeViewer.js b/scm-ui/src/repos/sources/components/content/SourcecodeViewer.js index 3917e851b9..648c99d29a 100644 --- a/scm-ui/src/repos/sources/components/content/SourcecodeViewer.js +++ b/scm-ui/src/repos/sources/components/content/SourcecodeViewer.js @@ -15,6 +15,7 @@ type Props = { type State = { content: string, + language: string, error: Error, hasError: boolean, loaded: boolean @@ -26,6 +27,7 @@ class SourcecodeViewer extends React.Component { this.state = { content: "", + language: "", error: new Error(), hasError: false, loaded: false @@ -34,6 +36,22 @@ class SourcecodeViewer extends React.Component { componentDidMount() { const { file } = this.props; + getProgrammingLanguage(file._links.self.href) + .then(result => { + if (result.error) { + this.setState({ + ...this.state, + hasError: true, + error: result.error + }); + } else { + this.setState({ + ...this.state, + language: result.language + }); + } + }) + .catch(err => {}); getContent(file._links.self.href) .then(result => { if (result.error) { @@ -59,7 +77,7 @@ class SourcecodeViewer extends React.Component { const error = this.state.error; const hasError = this.state.hasError; const loaded = this.state.loaded; - const { contentType } = this.props; + const language = this.state.language; if (hasError) { return ; @@ -76,7 +94,7 @@ class SourcecodeViewer extends React.Component { return ( {content} @@ -85,37 +103,27 @@ class SourcecodeViewer extends React.Component { } } -export function getLanguage(contentType: string) { - const language = contentType.substring( - contentType.indexOf("/") + 1, - contentType.length - ); +export function getLanguage(language: string) { + return language.toLowerCase(); +} - let languageType; - - switch (language) { - case "x-go": - languageType = "go"; - break; - case "x-java-source": - languageType = "java"; - break; - case "x-web-markdown": - languageType = "markdown"; - break; - default: - languageType = language; - } - - return languageType; +export function getProgrammingLanguage(url: string) { + return apiClient + .head(url) + .then(response => { + return { language: response.headers.get("Language") }; + }) + .catch(err => { + return { error: err }; + }); } export function getContent(url: string) { return apiClient .get(url) .then(response => response.text()) - .then(content => { - return content; + .then(response => { + return response; }) .catch(err => { return { error: err }; diff --git a/scm-ui/src/repos/sources/components/content/SourcecodeViewer.test.js b/scm-ui/src/repos/sources/components/content/SourcecodeViewer.test.js index a33dba454b..b132721e3b 100644 --- a/scm-ui/src/repos/sources/components/content/SourcecodeViewer.test.js +++ b/scm-ui/src/repos/sources/components/content/SourcecodeViewer.test.js @@ -1,6 +1,10 @@ //@flow import fetchMock from "fetch-mock"; -import { getContent, getLanguage } from "./SourcecodeViewer"; +import { + getContent, + getLanguage, + getProgrammingLanguage +} from "./SourcecodeViewer"; describe("get content", () => { const CONTENT_URL = "/repositories/scmadmin/TestRepo/content/testContent"; @@ -18,22 +22,28 @@ describe("get content", () => { done(); }); }); + + it("should return language", done => { + let headers = { + Language: "JAVA" + }; + + fetchMock.head("/api/v2" + CONTENT_URL, { + headers + }); + + getProgrammingLanguage(CONTENT_URL).then(content => { + expect(content.language).toBe("JAVA"); + done(); + }); + }); }); describe("get correct language type", () => { it("should return javascript", () => { - expect(getLanguage("application/javascript")).toBe("javascript"); + expect(getLanguage("JAVASCRIPT")).toBe("javascript"); }); - it("should return text", () => { - expect(getLanguage("text/plain")).toBe("plain"); - }); - it("should return go", () => { - expect(getLanguage("text/x-go")).toBe("go"); - }); - it("should return java", () => { - expect(getLanguage("text/x-java-source")).toBe("java"); - }); - it("should return markdown", () => { - expect(getLanguage("text/x-web-markdown")).toBe("markdown"); + it("should return nothing for plain text", () => { + expect(getLanguage("")).toBe(""); }); });