Skip to content

Commit 04bdad6

Browse files
authored
fix(RV-497): Fix 1st time ux to templates > 0 (#499)
1 parent 9f97b66 commit 04bdad6

File tree

5 files changed

+54
-42
lines changed

5 files changed

+54
-42
lines changed

frontend/src/App.test.tsx

+9-6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest';
44
import { BrowserRouter } from 'react-router-dom';
55
import App from './App';
66
import { FilesProvider } from './contexts/FilesContext';
7+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
78

89
// Mock the imports
910
vi.mock('./components/AppHeader/AppHeader.tsx', () => ({
@@ -29,11 +30,13 @@ describe('App component', () => {
2930

3031
const renderComponent = () => {
3132
render(
32-
<BrowserRouter>
33-
<FilesProvider>
34-
<App />
35-
</FilesProvider>
36-
</BrowserRouter>
33+
<QueryClientProvider client={new QueryClient()}>
34+
<BrowserRouter>
35+
<FilesProvider>
36+
<App />
37+
</FilesProvider>
38+
</BrowserRouter>
39+
</QueryClientProvider>
3740
);
3841
};
3942

@@ -48,7 +51,7 @@ describe('App component', () => {
4851
});
4952

5053
it('displays regular content on subsequent visits', () => {
51-
localStorage.setItem('hasVisited', 'true');
54+
localStorage.setItem('templates', JSON.stringify(['hello']));
5255
renderComponent();
5356
expect(screen.queryByTestId('first-time-exp')).not.toBeInTheDocument();
5457
expect(screen.getByTestId('templates-index')).toBeInTheDocument();

frontend/src/App.tsx

+36-8
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,49 @@ import Comment from './assets/comment.svg';
99
import CSV from './assets/csv.svg';
1010
import "./App.scss";
1111
import { useFiles } from "./contexts/FilesContext.tsx";
12+
import { useQuery } from "@tanstack/react-query";
13+
import { TemplateAPI } from "./types/templates.ts";
1214

1315
function App() {
1416
const { pathname } = useLocation();
1517
const navigate = useNavigate();
16-
const { setFiles } = useFiles();
17-
const [isFirstVisit, setIsFirstVisit] = useState(false);
18+
const { setFiles, templates, setTemplates } = useFiles();
19+
const [hasMorethan1Template, setHasMoreThanOneTemplate] = useState(false);
1820

21+
const templateQuery = useQuery({
22+
queryKey: ["templates"],
23+
queryFn: TemplateAPI.getTemplates,
24+
});
1925
useEffect(() => {
20-
const hasVisited = localStorage.getItem("hasVisited");
21-
if (!hasVisited) {
22-
setIsFirstVisit(true);
23-
localStorage.setItem("hasVisited", "true");
26+
const getTemplates = async () => {
27+
const templatesJSON = localStorage.getItem("templates") || "[]";
28+
if (templateQuery.data && templateQuery.data?.length > 0) {
29+
setTemplates(templateQuery.data as []);
30+
} else if (templatesJSON) {
31+
setTemplates(
32+
JSON.parse(templatesJSON).map((template) => ({
33+
...template,
34+
updatedAt: template.lastUpdated,
35+
})),
36+
);
37+
} else {
38+
setTemplates([]);
39+
}
40+
};
41+
getTemplates();
42+
}, [templateQuery.data]);
43+
44+
useEffect(() => {
45+
if (templates.length > 0) {
46+
setHasMoreThanOneTemplate(true);
47+
} else {
48+
setHasMoreThanOneTemplate(false);
2449
}
50+
}, [templates.length]);
51+
52+
useEffect(() => {
2553
setFiles([]);
26-
}, []);
54+
},[]);
2755

2856
const navLinks = [
2957
{ text: "Annotate and Extract", url: "/" },
@@ -58,7 +86,7 @@ function App() {
5886
<div className="flex-10 display-flex flex-column bg-idwa-light" data-testid="content-area">
5987
<h2 className="padding-left-2 bg-white margin-top-0 home-header" data-testid="home-header">Annotate and Extract</h2>
6088
<div className="display-flex flex-justify-center app-content-container width-full" data-testid="app-content-container">
61-
{isFirstVisit ? (
89+
{!hasMorethan1Template ? (
6290
<div className="bg-white display-flex flex-column flex-justify flex-align-center first-time-content" data-testid="first-time-exp">
6391
<h3 className="first-time-header" data-testid="first-time-header">
6492
Welcome to Report Vision

frontend/src/components/ExtractUploadFile.scss

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ p {
5757
display: flex;
5858
flex-direction: column;
5959
height: 150px;
60-
width: 914px;
60+
width: 100%;
6161
border-left: 5px solid #d63e04;
6262
background-color: #f4e3db;
6363
}

frontend/src/components/TemplatesIndex/TemplatesIndex.tsx

+3-27
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1-
import { FC, useEffect, useState } from "react";
1+
import { FC, useEffect } from "react";
22
import { Button } from "@trussworks/react-uswds";
33
import { SortableTable } from "../SortableTable/SortableTable.tsx";
44
import { useNavigate } from "react-router-dom";
55
import extractImage from "../../assets/extract_image.svg";
6-
import { useQuery } from "@tanstack/react-query";
7-
import { TemplateAPI } from "../../types/templates.ts";
86
import usePagination from "../../hooks/use-pagination/index.ts";
7+
import { useFiles } from "../../contexts/FilesContext.tsx";
98

109
import './TemplatesIndex.scss'
1110

1211
type TemplateIndexProps = unknown;
1312

1413
export const TemplatesIndex: FC<TemplateIndexProps> = () => {
15-
const [templates, setTemplates] = useState([]);
14+
const { templates, setTemplates } = useFiles();
1615
const {
1716
currentItems,
1817
currentPage,
@@ -24,29 +23,6 @@ export const TemplatesIndex: FC<TemplateIndexProps> = () => {
2423
hasPreviousPage
2524
} = usePagination(templates, 10, 1);
2625
const navigate = useNavigate();
27-
// TODO: Pagination and sorting will be added later
28-
const templateQuery = useQuery({
29-
queryKey: ["templates"],
30-
queryFn: TemplateAPI.getTemplates,
31-
});
32-
useEffect(() => {
33-
const getTemplates = async () => {
34-
const templatesJSON = localStorage.getItem("templates") || "[]";
35-
if (templateQuery.data && templateQuery.data?.length > 0) {
36-
setTemplates(templateQuery.data as []);
37-
} else if (templatesJSON) {
38-
setTemplates(
39-
JSON.parse(templatesJSON).map((template) => ({
40-
...template,
41-
updatedAt: template.lastUpdated,
42-
})),
43-
);
44-
} else {
45-
setTemplates([]);
46-
}
47-
};
48-
getTemplates();
49-
}, [templateQuery.data]);
5026

5127
useEffect(() => {
5228
const localStorageEvent = (event) => {

frontend/src/contexts/FilesContext.tsx

+5
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ export interface FileType {
3636

3737
interface FileContextType {
3838
files: File[];
39+
templates: any[];
3940
selectedTemplates: TemplatePair[];
41+
setTemplates: (templates: any[]) => void;
4042
addFile: (file: File) => void;
4143
removeFile: (fileName: string) => void;
4244
clearFiles: () => void;
@@ -49,6 +51,7 @@ const FilesContext = createContext<FileContextType | undefined>(undefined);
4951

5052
export const FilesProvider = ({ children }: { children: ReactNode }) => {
5153
const [files, setFiles] = useState<File[]>([]);
54+
const [templates, setTemplates] = useState<any[]>([]);
5255
const [selectedTemplates, _setSelectedTemplates] = useState<TemplatePair[]>(
5356
[],
5457
);
@@ -85,8 +88,10 @@ export const FilesProvider = ({ children }: { children: ReactNode }) => {
8588
return (
8689
<FilesContext.Provider
8790
value={{
91+
templates,
8892
files,
8993
selectedTemplates,
94+
setTemplates,
9095
addFile,
9196
removeFile,
9297
clearFiles,

0 commit comments

Comments
 (0)