Skip to content

Commit a42f048

Browse files
committed
Refactor with usePageTitle
1 parent 49497ad commit a42f048

File tree

13 files changed

+65
-74
lines changed

13 files changed

+65
-74
lines changed

examples/demo/src/categories/CategoryList.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import {
44
List,
55
RecordContextProvider,
66
useDefaultTitle,
7-
useGetResourceLabel,
87
useListContext,
9-
useTranslate,
108
} from 'react-admin';
119
import {
1210
Grid,
@@ -20,14 +18,11 @@ import { humanize } from 'inflection';
2018

2119
import LinkToRelatedProducts from './LinkToRelatedProducts';
2220
import { Category } from '../types';
21+
import { usePageTitle } from '../usePageTitle';
2322

2423
const CategoriesTitle = () => {
2524
const title = useDefaultTitle();
26-
const translate = useTranslate();
27-
const getResourceLabel = useGetResourceLabel();
28-
const pageTitle = translate('ra.page.list', {
29-
name: getResourceLabel('categories', 2),
30-
});
25+
const pageTitle = usePageTitle({ view: 'list' });
3126
return (
3227
<>
3328
<title>{`${title} - ${pageTitle}`}</title>

examples/demo/src/invoices/InvoiceList.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,12 @@ import {
1313
ReferenceInput,
1414
FilterButton,
1515
useDefaultTitle,
16-
useTranslate,
17-
useGetResourceLabel,
1816
} from 'react-admin';
1917

2018
import FullNameField from '../visitors/FullNameField';
2119
import AddressField from '../visitors/AddressField';
2220
import InvoiceShow from './InvoiceShow';
21+
import { usePageTitle } from '../usePageTitle';
2322

2423
const listFilters = [
2524
<DateInput source="date_gte" alwaysOn />,
@@ -38,11 +37,7 @@ const ListActions = () => (
3837

3938
const InvoicesTitle = () => {
4039
const title = useDefaultTitle();
41-
const translate = useTranslate();
42-
const getResourceLabel = useGetResourceLabel();
43-
const pageTitle = translate('ra.page.list', {
44-
name: getResourceLabel('invoices', 2),
45-
});
40+
const pageTitle = usePageTitle({ view: 'list' });
4641
return (
4742
<>
4843
<title>{`${title} - ${pageTitle}`}</title>

examples/demo/src/orders/OrderEdit.tsx

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ import {
1717
} from 'react-admin';
1818
import { Card, CardContent, Box, Grid, Typography, Link } from '@mui/material';
1919

20-
import { Order, Customer } from '../types';
20+
import { Customer } from '../types';
2121
import Basket from './Basket';
2222
import Totals from './Totals';
23+
import { usePageTitle } from '../usePageTitle';
2324

2425
const OrderEdit = () => (
2526
<Edit title={<OrderTitle />} component="div">
@@ -29,17 +30,13 @@ const OrderEdit = () => (
2930

3031
const OrderTitle = () => {
3132
const appTitle = useDefaultTitle();
32-
const translate = useTranslate();
33-
const record = useRecordContext<Order>();
34-
const pageTitle = translate('resources.orders.title', {
35-
reference: record?.reference,
36-
});
37-
return record ? (
33+
const pageTitle = usePageTitle({ view: 'edit' });
34+
return (
3835
<>
3936
<title>{`${appTitle} - ${pageTitle}`}</title>
4037
<span>{pageTitle}</span>
4138
</>
42-
) : null;
39+
);
4340
};
4441

4542
const CustomerDetails = () => {

examples/demo/src/orders/OrderList.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,15 @@ import {
2020
TextField,
2121
TopToolbar,
2222
useDefaultTitle,
23-
useGetResourceLabel,
2423
useListContext,
25-
useTranslate,
2624
} from 'react-admin';
2725
import { useMediaQuery, Divider, Tabs, Tab, Theme } from '@mui/material';
2826

2927
import CustomerReferenceField from '../visitors/CustomerReferenceField';
3028
import AddressField from '../visitors/AddressField';
3129
import MobileGrid from './MobileGrid';
3230
import { Customer } from '../types';
31+
import { usePageTitle } from '../usePageTitle';
3332

3433
const ListActions = () => (
3534
<TopToolbar>
@@ -41,11 +40,7 @@ const ListActions = () => (
4140

4241
const OrdersTitle = () => {
4342
const title = useDefaultTitle();
44-
const translate = useTranslate();
45-
const getResourceLabel = useGetResourceLabel();
46-
const pageTitle = translate('ra.page.list', {
47-
name: getResourceLabel('orders', 2),
48-
});
43+
const pageTitle = usePageTitle({ view: 'list' });
4944
return (
5045
<>
5146
<title>{`${title} - ${pageTitle}`}</title>

examples/demo/src/products/ProductCreate.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ import {
55
TextInput,
66
required,
77
useDefaultTitle,
8-
useGetResourceLabel,
9-
useTranslate,
108
} from 'react-admin';
119
import { ProductEditDetails } from './ProductEditDetails';
10+
import { usePageTitle } from '../usePageTitle';
1211
const RichTextInput = React.lazy(() =>
1312
import('ra-input-rich-text').then(module => ({
1413
default: module.RichTextInput,
@@ -17,11 +16,8 @@ const RichTextInput = React.lazy(() =>
1716

1817
const ProductTitle = () => {
1918
const appTitle = useDefaultTitle();
20-
const translate = useTranslate();
21-
const getResourceLabel = useGetResourceLabel();
22-
const pageTitle = translate('ra.page.create', {
23-
name: getResourceLabel('products', 1),
24-
});
19+
const pageTitle = usePageTitle({ view: 'list' });
20+
2521
return (
2622
<>
2723
<title>{`${appTitle} - ${pageTitle}`}</title>

examples/demo/src/products/ProductList.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,16 @@ import {
1717
Title,
1818
TopToolbar,
1919
useTranslate,
20-
useGetResourceLabel,
2120
useDefaultTitle,
2221
} from 'react-admin';
2322

2423
import ImageList from './GridList';
2524
import Aside from './Aside';
25+
import { usePageTitle } from '../usePageTitle';
2626

2727
const ProductList = () => {
2828
const appTitle = useDefaultTitle();
29-
const translate = useTranslate();
30-
const getResourceLabel = useGetResourceLabel();
31-
const pageTitle = translate('ra.page.list', {
32-
name: getResourceLabel('products', 2),
33-
});
29+
const pageTitle = usePageTitle({ view: 'list' });
3430
const isSmall = useMediaQuery<Theme>(theme => theme.breakpoints.down('md'));
3531
return (
3632
<ListBase perPage={24} sort={{ field: 'reference', order: 'ASC' }}>

examples/demo/src/reviews/ReviewCreate.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,15 @@ import {
1111
useRedirect,
1212
getRecordFromLocation,
1313
useDefaultTitle,
14-
useTranslate,
15-
useGetResourceLabel,
1614
} from 'react-admin';
1715
import { useLocation } from 'react-router';
1816

1917
import StarRatingInput from './StarRatingInput';
18+
import { usePageTitle } from '../usePageTitle';
2019

2120
const ReviewTitle = () => {
2221
const appTitle = useDefaultTitle();
23-
const translate = useTranslate();
24-
const getResourceLabel = useGetResourceLabel();
25-
const pageTitle = translate('ra.page.create', {
26-
name: getResourceLabel('reviews', 1),
27-
});
22+
const pageTitle = usePageTitle({ view: 'create' });
2823
return (
2924
<>
3025
<title>{`${appTitle} - ${pageTitle}`}</title>

examples/demo/src/reviews/ReviewList.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import {
88
SelectColumnsButton,
99
TopToolbar,
1010
useDefaultTitle,
11-
useGetResourceLabel,
12-
useTranslate,
1311
} from 'react-admin';
1412
import { matchPath, useLocation, useNavigate } from 'react-router-dom';
1513
import { Box, Drawer, useMediaQuery, Theme } from '@mui/material';
@@ -18,6 +16,7 @@ import ReviewListMobile from './ReviewListMobile';
1816
import ReviewListDesktop from './ReviewListDesktop';
1917
import reviewFilters from './reviewFilters';
2018
import ReviewEdit from './ReviewEdit';
19+
import { usePageTitle } from '../usePageTitle';
2120

2221
const ReviewListActions = () => (
2322
<TopToolbar>
@@ -30,11 +29,7 @@ const ReviewListActions = () => (
3029

3130
const ReviewsTitle = () => {
3231
const title = useDefaultTitle();
33-
const translate = useTranslate();
34-
const getResourceLabel = useGetResourceLabel();
35-
const pageTitle = translate('ra.page.list', {
36-
name: getResourceLabel('reviews', 2),
37-
});
32+
const pageTitle = usePageTitle({ view: 'list' });
3833
return (
3934
<>
4035
<title>{`${title} - ${pageTitle}`}</title>

examples/demo/src/segments/Segments.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ import { useTranslate, Title, useDefaultTitle } from 'react-admin';
1111

1212
import LinkToRelatedCustomers from './LinkToRelatedCustomers';
1313
import segments from './data';
14+
import { usePageTitle } from '../usePageTitle';
1415

1516
const Segments = () => {
1617
const appTitle = useDefaultTitle();
1718
const translate = useTranslate();
18-
const pageTitle = translate('resources.segments.name', { smart_count: 2 });
19+
const pageTitle = usePageTitle({ view: 'list' });
1920

2021
return (
2122
<>

examples/demo/src/usePageTitle.tsx

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import {
2+
HintedString,
3+
RaRecord,
4+
useGetRecordRepresentation,
5+
useGetResourceLabel,
6+
useRecordContext,
7+
useResourceContext,
8+
useTranslate,
9+
} from 'react-admin';
10+
11+
export const usePageTitle = (props: {
12+
view: HintedString<'list' | 'edit' | 'show' | 'create'>;
13+
record?: RaRecord;
14+
resource?: string;
15+
count?: number;
16+
}) => {
17+
const { view, count = view === 'list' ? 2 : 1 } = props;
18+
const translate = useTranslate();
19+
const record = useRecordContext(props);
20+
const resource = useResourceContext(props);
21+
const getResourceLabel = useGetResourceLabel();
22+
const getRecordRepresentation = useGetRecordRepresentation();
23+
24+
if (!resource) {
25+
throw new Error(
26+
'usePageTitle must be used inside a <Resource> component or provide a resource prop'
27+
);
28+
}
29+
30+
const pageTitle = translate(`ra.page.${view}`, {
31+
name: getResourceLabel(resource, count),
32+
recordRepresentation: getRecordRepresentation(record),
33+
});
34+
35+
return pageTitle;
36+
};

0 commit comments

Comments
 (0)