|
1 | | -import { PageWrapper } from '@/components'; |
2 | 1 | import React from 'react'; |
| 2 | +import { Link } from 'react-router'; |
| 3 | +import { useTranslation } from 'react-i18next'; |
| 4 | +import { |
| 5 | + Badge, |
| 6 | + DsAlert, |
| 7 | + DsTabs, |
| 8 | + formatDisplayName, |
| 9 | + List, |
| 10 | + UserListItem, |
| 11 | +} from '@altinn/altinn-components'; |
| 12 | +import { PageWrapper } from '@/components'; |
3 | 13 | import { PageLayoutWrapper } from '../common/PageLayoutWrapper'; |
4 | 14 | import { useRerouteIfRequestPageDisabled } from '@/resources/utils/featureFlagUtils'; |
5 | 15 | import { Breadcrumbs } from '../common/Breadcrumbs/Breadcrumbs'; |
| 16 | +import ReporteePageHeading from '../common/ReporteePageHeading'; |
| 17 | +import { useGetReporteeQuery } from '@/rtk/features/userInfoApi'; |
| 18 | +import { useDocumentTitle } from '@/resources/hooks/useDocumentTitle'; |
| 19 | +import { formatDateToNorwegian } from '@/resources/utils'; |
| 20 | +import { useRequests } from '@/resources/hooks/useRequests'; |
| 21 | +import classes from './RequestPage.module.css'; |
| 22 | +import { Request } from './types'; |
6 | 23 |
|
7 | 24 | export const RequestPage = () => { |
| 25 | + const { t } = useTranslation(); |
| 26 | + |
8 | 27 | useRerouteIfRequestPageDisabled(); |
9 | 28 |
|
| 29 | + useDocumentTitle(t('request_page.page_title')); |
| 30 | + |
| 31 | + const { data: reportee, isLoading: isLoadingReportee } = useGetReporteeQuery(); |
| 32 | + const { pendingRequests, isLoadingRequests, isError } = useRequests(); |
| 33 | + |
| 34 | + const name = formatDisplayName({ |
| 35 | + fullName: reportee?.name || '', |
| 36 | + type: reportee?.type === 'Person' ? 'person' : 'company', |
| 37 | + }); |
| 38 | + |
| 39 | + const totalRequests = pendingRequests ? pendingRequests.length : 0; |
| 40 | + |
10 | 41 | return ( |
11 | 42 | <PageWrapper> |
12 | 43 | <PageLayoutWrapper> |
13 | 44 | <Breadcrumbs items={['root', 'requests']} /> |
14 | | - <div>Forespørsel-siden er under arbeid</div> |
| 45 | + <ReporteePageHeading |
| 46 | + title={t('request_page.heading', { name })} |
| 47 | + reportee={reportee} |
| 48 | + isLoading={isLoadingReportee} |
| 49 | + /> |
| 50 | + <DsTabs |
| 51 | + defaultValue='incomingRequests' |
| 52 | + data-size='sm' |
| 53 | + > |
| 54 | + <DsTabs.List className={classes.requestPageTabs}> |
| 55 | + <DsTabs.Tab |
| 56 | + value='incomingRequests' |
| 57 | + className={classes.requestTab} |
| 58 | + > |
| 59 | + {!!totalRequests && ( |
| 60 | + <Badge |
| 61 | + data-size='sm' |
| 62 | + variant='base' |
| 63 | + label={totalRequests} |
| 64 | + /> |
| 65 | + )} |
| 66 | + {t('request_page.incoming_requests')} |
| 67 | + </DsTabs.Tab> |
| 68 | + <DsTabs.Tab value='sentRequests'>{t('request_page.sent_requests')}</DsTabs.Tab> |
| 69 | + </DsTabs.List> |
| 70 | + <DsTabs.Panel value='incomingRequests'> |
| 71 | + <List> |
| 72 | + {isLoadingRequests ? ( |
| 73 | + <> |
| 74 | + <LoadingRequestListItem /> |
| 75 | + <LoadingRequestListItem /> |
| 76 | + <LoadingRequestListItem /> |
| 77 | + <LoadingRequestListItem /> |
| 78 | + </> |
| 79 | + ) : ( |
| 80 | + <PendingRequests pendingRequests={pendingRequests} /> |
| 81 | + )} |
| 82 | + {!isLoadingRequests && totalRequests === 0 && ( |
| 83 | + <div>{t('request_page.no_received_requests')}</div> |
| 84 | + )} |
| 85 | + </List> |
| 86 | + {isError && ( |
| 87 | + <DsAlert data-color='danger'>{t('request_page.error_loading_requests')}</DsAlert> |
| 88 | + )} |
| 89 | + </DsTabs.Panel> |
| 90 | + <DsTabs.Panel value='sentRequests'> |
| 91 | + <div>{t('request_page.no_sent_requests')}</div> |
| 92 | + </DsTabs.Panel> |
| 93 | + </DsTabs> |
15 | 94 | </PageLayoutWrapper> |
16 | 95 | </PageWrapper> |
17 | 96 | ); |
18 | 97 | }; |
| 98 | + |
| 99 | +interface PendingRequestsProps { |
| 100 | + pendingRequests: Request[] | undefined; |
| 101 | +} |
| 102 | + |
| 103 | +const PendingRequests = ({ pendingRequests }: PendingRequestsProps) => { |
| 104 | + const { t } = useTranslation(); |
| 105 | + return ( |
| 106 | + <> |
| 107 | + {pendingRequests?.map((request) => { |
| 108 | + return ( |
| 109 | + <UserListItem |
| 110 | + key={request.id} |
| 111 | + id={request.id} |
| 112 | + name={request.fromPartyName} |
| 113 | + type={request.fromPartyType} |
| 114 | + linkIcon |
| 115 | + description={`${t(request.description)} (${formatDateToNorwegian(request.createdDate)})`} |
| 116 | + as={(props) => ( |
| 117 | + <Link |
| 118 | + to={`/consent/request?id=${request.id}`} |
| 119 | + {...props} |
| 120 | + /> |
| 121 | + )} |
| 122 | + controls={t('request_page.process_request')} |
| 123 | + /> |
| 124 | + ); |
| 125 | + })} |
| 126 | + </> |
| 127 | + ); |
| 128 | +}; |
| 129 | + |
| 130 | +const LoadingRequestListItem = () => { |
| 131 | + return ( |
| 132 | + <UserListItem |
| 133 | + id={''} |
| 134 | + name={'xxxxxxxxxxxx'} |
| 135 | + description='xxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
| 136 | + type={'person'} |
| 137 | + interactive={false} |
| 138 | + loading |
| 139 | + /> |
| 140 | + ); |
| 141 | +}; |
0 commit comments