use header instead of content type

This commit is contained in:
Maren Süwer
2018-10-29 14:53:24 +01:00
parent 188bb54094
commit 06ca66d9f1
2 changed files with 57 additions and 39 deletions

View File

@@ -15,6 +15,7 @@ type Props = {
type State = { type State = {
content: string, content: string,
language: string,
error: Error, error: Error,
hasError: boolean, hasError: boolean,
loaded: boolean loaded: boolean
@@ -26,6 +27,7 @@ class SourcecodeViewer extends React.Component<Props, State> {
this.state = { this.state = {
content: "", content: "",
language: "",
error: new Error(), error: new Error(),
hasError: false, hasError: false,
loaded: false loaded: false
@@ -34,6 +36,22 @@ class SourcecodeViewer extends React.Component<Props, State> {
componentDidMount() { componentDidMount() {
const { file } = this.props; 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) getContent(file._links.self.href)
.then(result => { .then(result => {
if (result.error) { if (result.error) {
@@ -59,7 +77,7 @@ class SourcecodeViewer extends React.Component<Props, State> {
const error = this.state.error; const error = this.state.error;
const hasError = this.state.hasError; const hasError = this.state.hasError;
const loaded = this.state.loaded; const loaded = this.state.loaded;
const { contentType } = this.props; const language = this.state.language;
if (hasError) { if (hasError) {
return <ErrorNotification error={error} />; return <ErrorNotification error={error} />;
@@ -76,7 +94,7 @@ class SourcecodeViewer extends React.Component<Props, State> {
return ( return (
<SyntaxHighlighter <SyntaxHighlighter
showLineNumbers="true" showLineNumbers="true"
language={getLanguage(contentType)} language={getLanguage(language)}
style={arduinoLight} style={arduinoLight}
> >
{content} {content}
@@ -85,37 +103,27 @@ class SourcecodeViewer extends React.Component<Props, State> {
} }
} }
export function getLanguage(contentType: string) { export function getLanguage(language: string) {
const language = contentType.substring( return language.toLowerCase();
contentType.indexOf("/") + 1, }
contentType.length
);
let languageType; export function getProgrammingLanguage(url: string) {
return apiClient
switch (language) { .head(url)
case "x-go": .then(response => {
languageType = "go"; return { language: response.headers.get("Language") };
break; })
case "x-java-source": .catch(err => {
languageType = "java"; return { error: err };
break; });
case "x-web-markdown":
languageType = "markdown";
break;
default:
languageType = language;
}
return languageType;
} }
export function getContent(url: string) { export function getContent(url: string) {
return apiClient return apiClient
.get(url) .get(url)
.then(response => response.text()) .then(response => response.text())
.then(content => { .then(response => {
return content; return response;
}) })
.catch(err => { .catch(err => {
return { error: err }; return { error: err };

View File

@@ -1,6 +1,10 @@
//@flow //@flow
import fetchMock from "fetch-mock"; import fetchMock from "fetch-mock";
import { getContent, getLanguage } from "./SourcecodeViewer"; import {
getContent,
getLanguage,
getProgrammingLanguage
} from "./SourcecodeViewer";
describe("get content", () => { describe("get content", () => {
const CONTENT_URL = "/repositories/scmadmin/TestRepo/content/testContent"; const CONTENT_URL = "/repositories/scmadmin/TestRepo/content/testContent";
@@ -18,22 +22,28 @@ describe("get content", () => {
done(); 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", () => { describe("get correct language type", () => {
it("should return javascript", () => { it("should return javascript", () => {
expect(getLanguage("application/javascript")).toBe("javascript"); expect(getLanguage("JAVASCRIPT")).toBe("javascript");
}); });
it("should return text", () => { it("should return nothing for plain text", () => {
expect(getLanguage("text/plain")).toBe("plain"); expect(getLanguage("")).toBe("");
});
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");
}); });
}); });