Skip to content

Commit 2b35d47

Browse files
author
Ben Warzeski
authored
feat: mock data updates
feat: mock data updates
2 parents 255bd88 + 72292da commit 2b35d47

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+893
-876
lines changed

src/components/AppContainer.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import PropTypes from 'prop-types';
66
*/
77

88
const AppContainer = ({ Component }) => (
9-
<div>
9+
<div className="bg-light-300">
1010
<Component />
1111
</div>
1212
);

src/components/FilePreview/BaseRenderers/TXTRenderer.jsx renamed to src/components/FilePreview/components/FileRenderer/BaseRenderers/TXTRenderer.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
3-
import { rendererHooks } from './textHooks';
3+
import { useTextRendererData } from './textHooks';
44

55
const TXTRenderer = ({ url, onError, onSuccess }) => {
6-
const { content } = rendererHooks({ url, onError, onSuccess });
6+
const { content } = useTextRendererData({ url, onError, onSuccess });
77
return (
88
<pre className="txt-renderer">
99
{content}

src/components/FilePreview/BaseRenderers/textHooks.js renamed to src/components/FilePreview/components/FileRenderer/BaseRenderers/textHooks.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useEffect } from 'react';
22

3-
import { get } from 'axios';
3+
import axios from 'axios';
44
import { useKeyedState, StrictDict } from '@edx/react-unit-test-utils';
55

66
export const stateKeys = StrictDict({
@@ -12,14 +12,14 @@ export const fetchFile = async ({
1212
url,
1313
onError,
1414
onSuccess,
15-
}) => get(url)
15+
}) => axios.get(url)
1616
.then(({ data }) => {
1717
onSuccess();
1818
setContent(data);
1919
})
2020
.catch((e) => onError(e.response.status));
2121

22-
export const rendererHooks = ({ url, onError, onSuccess }) => {
22+
export const useTextRendererData = ({ url, onError, onSuccess }) => {
2323
const [content, setContent] = useKeyedState(stateKeys.content, '');
2424
useEffect(() => {
2525
fetchFile({
@@ -33,6 +33,6 @@ export const rendererHooks = ({ url, onError, onSuccess }) => {
3333
};
3434

3535
export default {
36-
rendererHooks,
36+
useTextRendererData,
3737
fetchFile,
3838
};

src/components/FilePreview/FileCard.jsx renamed to src/components/FilePreview/components/FileRenderer/FileCard/index.jsx

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,21 @@ import './FileCard.scss';
88
/**
99
* <FileCard />
1010
*/
11-
export const FileCard = ({ file, children }) => (
12-
<Card className="file-card" key={file.name}>
11+
const FileCard = ({ file, children }) => (
12+
<Card className="file-card" key={file.fileName}>
1313
<Collapsible
1414
className="file-collapsible"
1515
defaultOpen
16-
title={<h3 className="file-card-title">{file.name}</h3>}
16+
title={<h3 className="file-card-title">{file.fileName}</h3>}
1717
>
1818
<div className="preview-panel">
1919
{children}
2020
</div>
2121
</Collapsible>
2222
</Card>
2323
);
24-
FileCard.defaultProps = {
25-
};
2624
FileCard.propTypes = {
27-
file: PropTypes.shape({
28-
name: PropTypes.string.isRequired,
29-
downloadUrl: PropTypes.string.isRequired,
30-
description: PropTypes.string.isRequired,
31-
}).isRequired,
25+
file: PropTypes.shape({ fileName: PropTypes.string.isRequired }).isRequired,
3226
children: PropTypes.node.isRequired,
3327
};
3428

src/components/FilePreview/FileCard.test.jsx renamed to src/components/FilePreview/components/FileRenderer/FileCard/index.test.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { shallow } from '@edx/react-unit-test-utils';
33

44
import { Collapsible } from '@edx/paragon';
55

6-
import FileCard from './FileCard';
6+
import FileCard from './';
77

88
describe('File Preview Card component', () => {
99
const props = {
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { useKeyedState, StrictDict } from '@edx/react-unit-test-utils';
2+
3+
import { errorStatuses, errorMessages, renderers } from '../constants';
4+
import { getFileType } from '../utils';
5+
import messages from './messages';
6+
7+
export const stateKeys = StrictDict({
8+
errorStatus: 'errorStatus',
9+
isLoading: 'isLoading',
10+
});
11+
12+
/**
13+
* component hooks
14+
*/
15+
export const useRenderData = ({
16+
file,
17+
formatMessage,
18+
}) => {
19+
const [errorStatus, setErrorStatus] = useKeyedState(stateKeys.errorStatus, null);
20+
const [isLoading, setIsLoading] = useKeyedState(stateKeys.isLoading, true);
21+
22+
const setState = (newState) => {
23+
setErrorStatus(newState.errorStatus);
24+
setIsLoading(newState.isLoading);
25+
};
26+
27+
const stopLoading = (status = null) => setState({ isLoading: false, errorStatus: status });
28+
29+
const errorMessage = (
30+
errorMessages[errorStatus] || errorMessages[errorStatuses.serverError]
31+
);
32+
const errorAction = {
33+
id: 'retry',
34+
onClick: () => setState({ errorStatus: null, isLoading: true }),
35+
message: messages.retryButton,
36+
};
37+
const error = {
38+
headerMessage: errorMessage,
39+
children: formatMessage(errorMessage),
40+
actions: [errorAction],
41+
};
42+
43+
const Renderer = renderers[getFileType(file.fileName)];
44+
const rendererProps = {
45+
fileName: file.fileName,
46+
url: file.fileUrl,
47+
onError: stopLoading,
48+
onSuccess: () => stopLoading(),
49+
};
50+
51+
return {
52+
errorStatus,
53+
isLoading,
54+
error,
55+
Renderer,
56+
rendererProps,
57+
};
58+
};

src/components/FilePreview/FileRenderer.jsx renamed to src/components/FilePreview/components/FileRenderer/index.jsx

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,23 @@ import { useIntl } from '@edx/frontend-platform/i18n';
55

66
import FileCard from './FileCard';
77
import { ErrorBanner, LoadingBanner } from './Banners';
8-
import { renderHooks } from './hooks';
8+
import { useRenderData } from './hooks';
99

1010
/**
1111
* <FileRenderer />
1212
*/
13-
export const FileRenderer = ({
14-
file,
15-
}) => {
13+
export const FileRenderer = ({ file }) => {
1614
const { formatMessage } = useIntl();
1715
const {
1816
Renderer,
1917
isLoading,
2018
errorStatus,
2119
error,
2220
rendererProps,
23-
} = renderHooks({ file, formatMessage });
21+
} = useRenderData({ file, formatMessage });
2422

2523
return (
26-
<FileCard key={file.downloadUrl} file={file}>
24+
<FileCard key={file.fileUrl} file={file}>
2725
{isLoading && <LoadingBanner />}
2826
{errorStatus ? (
2927
<ErrorBanner {...error} />
@@ -37,8 +35,8 @@ export const FileRenderer = ({
3735
FileRenderer.defaultProps = {};
3836
FileRenderer.propTypes = {
3937
file: PropTypes.shape({
40-
name: PropTypes.string,
41-
downloadUrl: PropTypes.string,
38+
fileName: PropTypes.string,
39+
fileUrl: PropTypes.string,
4240
}).isRequired,
4341
// injected
4442
// intl: intlShape.isRequired,
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { defineMessages } from '@edx/frontend-platform/i18n';
2+
3+
const messages = defineMessages({
4+
fileInfo: {
5+
id: 'ora-grading.InfoPopover.fileInfo',
6+
defaultMessage: 'File info',
7+
description: 'Popover trigger button text for file preview card',
8+
},
9+
retryButton: {
10+
id: 'ora-grading.ResponseDisplay.FileRenderer.retryButton',
11+
defaultMessage: 'Retry',
12+
description: 'Retry button for error in file renderer',
13+
},
14+
});
15+
16+
export default messages;
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { StrictDict } from '@edx/react-unit-test-utils';
2+
3+
import {
4+
PDFRenderer,
5+
ImageRenderer,
6+
TXTRenderer,
7+
} from './FileRenderer/BaseRenderers';
8+
9+
import messages from './messages';
10+
11+
export const errorStatuses = StrictDict({
12+
badRequest: 400,
13+
unauthorized: 401,
14+
forbidden: 403,
15+
notFound: 404,
16+
conflict: 409,
17+
serverError: 500,
18+
});
19+
20+
export const fileTypes = StrictDict({
21+
pdf: 'pdf',
22+
jpg: 'jpg',
23+
jpeg: 'jpeg',
24+
png: 'png',
25+
bmp: 'bmp',
26+
txt: 'txt',
27+
gif: 'gif',
28+
jfif: 'jfif',
29+
pjpeg: 'pjpeg',
30+
pjp: 'pjp',
31+
svg: 'svg',
32+
});
33+
34+
export const errorMessages = {
35+
[errorStatuses.notFound]: messages.fileNotFoundError,
36+
[errorStatuses.serverError]: messages.unknownError,
37+
};
38+
39+
/**
40+
* Config data
41+
*/
42+
export const renderers = {
43+
[fileTypes.pdf]: PDFRenderer,
44+
[fileTypes.jpg]: ImageRenderer,
45+
[fileTypes.jpeg]: ImageRenderer,
46+
[fileTypes.bmp]: ImageRenderer,
47+
[fileTypes.png]: ImageRenderer,
48+
[fileTypes.txt]: TXTRenderer,
49+
[fileTypes.gif]: ImageRenderer,
50+
[fileTypes.jfif]: ImageRenderer,
51+
[fileTypes.pjpeg]: ImageRenderer,
52+
[fileTypes.pjp]: ImageRenderer,
53+
[fileTypes.svg]: ImageRenderer,
54+
};
55+
56+
export const supportedTypes = Object.keys(renderers);
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { default as FileRenderer } from './FileRenderer';
2+
export { isSupported } from './utils';

src/components/FilePreview/messages.js renamed to src/components/FilePreview/components/messages.js

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,6 @@
11
import { defineMessages } from '@edx/frontend-platform/i18n';
22

33
const messages = defineMessages({
4-
fileInfo: {
5-
id: 'ora-grading.InfoPopover.fileInfo',
6-
defaultMessage: 'File info',
7-
description: 'Popover trigger button text for file preview card',
8-
},
9-
retryButton: {
10-
id: 'ora-grading.ResponseDisplay.FileRenderer.retryButton',
11-
defaultMessage: 'Retry',
12-
description: 'Retry button for error in file renderer',
13-
},
144
fileNotFoundError: {
155
id: 'ora-grading.ResponseDisplay.FileRenderer.fileNotFound',
166
defaultMessage: 'File not found',
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import {
2+
PDFRenderer,
3+
ImageRenderer,
4+
TXTRenderer,
5+
} from './FileRenderer/BaseRenderers';
6+
7+
import { supportedTypes } from './constants';
8+
9+
/**
10+
* Util methods and transforms
11+
*/
12+
export const getFileType = (fileName) => fileName.split('.').pop()?.toLowerCase();
13+
export const isSupported = ({ fileName }) => supportedTypes.includes(
14+
getFileType(fileName),
15+
);

0 commit comments

Comments
 (0)