Skip to content
This repository was archived by the owner on Sep 22, 2025. It is now read-only.

Commit bb90ecd

Browse files
committed
Scaffolding and wiring for Page Detail screen
1 parent 662ecdf commit bb90ecd

File tree

7 files changed

+109
-7
lines changed

7 files changed

+109
-7
lines changed

src/main.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import {
3737
BulkProperty,
3838
Pages,
3939
AddPages,
40+
PageDetail,
4041
} from '~/routes';
4142
import {
4243
addPropertyAction,
@@ -55,6 +56,7 @@ import {
5556
authenticatedLoader,
5657
pagesLoader,
5758
addPagesLoader,
59+
pageDetailLoader,
5860
} from '~/routes/route-handlers';
5961

6062
const queryClient = new QueryClient({
@@ -107,7 +109,7 @@ const router = createBrowserRouter([
107109
element: <TagDetails />,
108110
loader: authenticatedLoader(tagDetailsLoader(queryClient)),
109111
},
110-
{
112+
{ // report page detail
111113
path: 'reports/:reportId/pages/:pageId',
112114
element: <PageDetails />,
113115
loader: authenticatedLoader(pageDetailsLoader(queryClient)),
@@ -125,6 +127,11 @@ const router = createBrowserRouter([
125127
element: <AddPages />,
126128
loader: authenticatedLoader(addPagesLoader(queryClient)),
127129
},
130+
{ // url detail
131+
path: 'pages/:pageId',
132+
element: <PageDetail />,
133+
loader: authenticatedLoader(pageDetailLoader(queryClient)),
134+
},
128135
{
129136
path: 'properties',
130137
element: <Properties />,

src/queries/pages.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
import { queryOptions } from '@tanstack/react-query';
2-
import { getPages, IPageParams } from '~/services';
2+
import { getPages, getPageDetail, IPageParams, IPageDetailParams } from '~/services';
33

44
// Query for all pages
55
export const pagesQuery = (params:IPageParams) => queryOptions({
66
queryKey: ['pages'],
77
queryFn: async () => getPages({params: params}),
88
});
99

10+
// Query for page detail
11+
export const pageDetailQuery = (params:IPageDetailParams) => queryOptions({
12+
queryKey: ['page-detail'],
13+
queryFn: async () => getPageDetail(params),
14+
});
15+
1016

src/routes/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export { default as EditProperty } from './protected/properties/edit-property';
2121
// Pages
2222
export { default as Pages } from './protected/pages/pages';
2323
export { default as AddPages } from './protected/pages/add-pages';
24+
export { default as PageDetail } from './protected/pages/page-detail';
2425

2526
// Scans
2627
export { default as Scans } from './protected/scans';
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { QueryClient, useQueryClient } from '@tanstack/react-query';
2+
import { ActionFunctionArgs, Link, useLoaderData, useNavigate } from 'react-router-dom';
3+
import { SEO } from '~/components/layout';
4+
import { pageDetailQuery } from '~/queries/pages';
5+
6+
// Initial data on pageload
7+
export const pageDetailLoader =
8+
(queryClient: QueryClient) => async ({ params }: ActionFunctionArgs) => {
9+
console.log(params);
10+
if(!params.pageId) return;
11+
const initialPage = await queryClient.ensureQueryData(
12+
pageDetailQuery({ pageId: params.pageId }),
13+
);
14+
return { initialPage };
15+
};
16+
17+
const pageDetail = () => {
18+
const navigate = useNavigate();
19+
const queryClient = useQueryClient();
20+
const { initialPage } = useLoaderData() as Awaited<
21+
ReturnType<ReturnType<typeof pageDetailLoader>>
22+
>;
23+
24+
return (
25+
<>
26+
<SEO
27+
title="Pages - Equalify"
28+
description="Manage and monitor your properties on Equalify to improve their accessibility."
29+
url="https://dashboard.equalify.app/properties"
30+
/>
31+
<div className="flex w-full flex-col-reverse justify-between sm:flex-row sm:items-center">
32+
<h1
33+
className="text-2xl font-bold md:text-3xl"
34+
id="properties-list-heading"
35+
>
36+
Page Detail
37+
</h1>
38+
<div className="flex flex-row items-center gap-2">
39+
<Link
40+
to=""
41+
onClick={() => navigate(-1)}
42+
aria-label='Back to Pages'
43+
className="text-[#186121]">
44+
&#60; Back to Pages
45+
</Link>
46+
</div>
47+
</div>
48+
<section>
49+
</section>
50+
</>
51+
)
52+
};
53+
export default pageDetail;

src/routes/protected/pages/pages.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,12 @@ const Pages = () => {
110110
accessorKey: 'url',
111111
header: 'URL',
112112
cell: ({ row }) => (
113-
<a
113+
<Link
114114
className="text-blue-500 hover:opacity-50"
115-
target="_blank"
116-
href={row.original.url}
115+
to={'./'+row.original.id}
117116
>
118117
{row.original.url}
119-
</a>
118+
</Link>
120119
),
121120
},
122121
{

src/routes/route-handlers.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ export { tagDetailsLoader } from './protected/reports/tag-details';
1313
export { reportsLoader } from './protected/reports/reports';
1414
export { scansLoader } from './protected/scans';
1515
export { pagesLoader } from './protected/pages/pages';
16-
export { addPagesLoader } from './protected/pages/add-pages'
16+
export { addPagesLoader } from './protected/pages/add-pages';
17+
export { pageDetailLoader } from './protected/pages/page-detail';
1718

1819
export const authenticatedLoader = (loader: any) => async (args: any) => {
1920
const { isAuthenticated } = useStore.getState();

src/services/pages.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ export interface IUrl {
3939
urlId: string;
4040
}
4141

42+
export interface IPageDetailParams {
43+
pageId: string;
44+
}
45+
4246
const API_NAME = 'auth';
4347

4448
/**
@@ -70,6 +74,36 @@ export const getPages = async ({ params }: { params: IPageParams }): Promise<IPa
7074
}
7175
};
7276

77+
/**
78+
* Fetch single page detail
79+
* @returns {Promise<IPage>} Single IPage record
80+
* @throws Will throw an error if the fetch fails
81+
*/
82+
export const getPageDetail = async ( params :IPageDetailParams): Promise<IPage> => {
83+
try {
84+
const response = await get({
85+
apiName: API_NAME,
86+
path: `/get/page`,
87+
options: {
88+
queryParams: {
89+
pageId: params.pageId,
90+
},
91+
},
92+
}).response;
93+
console.log(response);
94+
95+
const { body } = response;
96+
const { result } = (await body.json()) as unknown as ApiResponse<
97+
IPage
98+
>;
99+
console.log('Fetched', result);
100+
return result ;
101+
} catch (error) {
102+
console.error('Error fetching pages', error);
103+
throw error;
104+
}
105+
};
106+
73107
/**
74108
* Send pages to scan
75109
* @param urls - Array of <IUrl>s to sent to scan
@@ -95,6 +129,7 @@ export const sendUrlsToScan = async (
95129
}
96130
};
97131

132+
/* Add pages */
98133
export const addPagesFromForm = async (
99134
formData:any
100135
): Promise<{result:any}> => {

0 commit comments

Comments
 (0)