11import axios from 'axios'
22import { useEffect , useState } from 'react'
3- import type { KeywordPageType , JudgmentByKey } from '../types'
43import { useParams } from 'react-router-dom'
54import { Helmet } from 'react-helmet'
65import TopMenu from './TopMenu'
6+ import type { KeywordPageType } from '../types'
77
8- const KeywordJudgmentListPage = ( { language } : KeywordPageType ) => {
8+ interface KeywordResultItem {
9+ keyword : string
10+ }
11+
12+ interface KeywordResultsBaseProps < T extends KeywordResultItem > extends KeywordPageType {
13+ apiBasePath : string
14+ buildLink : ( item : T ) => string
15+ formatLabel : ( item : T ) => React . ReactNode
16+ getItemKey : ( item : T ) => string
17+ }
18+
19+ const KeywordResultsBase = < T extends KeywordResultItem , > ( {
20+ language,
21+ apiBasePath,
22+ buildLink,
23+ formatLabel,
24+ getItemKey
25+ } : KeywordResultsBaseProps < T > ) => {
926 const keyword_id : string = decodeURIComponent ( useParams ( ) . keyword_id ?? '' )
10- const [ judgments , setJudgments ] = useState < JudgmentByKey [ ] > ( [ ] )
27+ const [ items , setItems ] = useState < T [ ] > ( [ ] )
1128 const [ lan , setLan ] = useState < string > ( ( ) => localStorage . getItem ( 'language' ) || language )
12- const path = `/api/judgment/keyword /${ lan } /${ encodeURIComponent ( keyword_id ) } `
29+ const path = `${ apiBasePath } /${ lan } /${ encodeURIComponent ( keyword_id ) } `
1330 const title = lan === 'fin' ? 'Asiasanat' : 'Ämnesord'
1431
1532 const topStyle : React . CSSProperties = {
@@ -47,19 +64,15 @@ const KeywordJudgmentListPage = ({ language }: KeywordPageType) => {
4764 marginTop : '50px'
4865 }
4966
50- const getJudgments = async ( path : string ) => {
51- const resp = await axios . get ( path )
52- setJudgments ( resp . data )
67+ const getItems = async ( url : string ) => {
68+ const resp = await axios . get ( url )
69+ setItems ( resp . data )
5370 }
5471
5572 useEffect ( ( ) => {
56- getJudgments ( path )
73+ getItems ( path )
5774 } , [ path ] )
5875
59- function prepareLink ( judgment : JudgmentByKey ) : string {
60- return `/oikeuskaytanto/${ judgment . year } /${ judgment . number } /${ judgment . level } `
61- }
62-
6376 const handleSelect = ( event : React . SyntheticEvent ) => {
6477 const currentValue = ( event . target as HTMLInputElement ) . value
6578 setLan ( currentValue )
@@ -78,11 +91,11 @@ const KeywordJudgmentListPage = ({ language }: KeywordPageType) => {
7891 </ div >
7992 < div style = { contentStyle } id = "contentdiv" >
8093 < div id = "contentDiv" style = { contentContainerStyle } >
81- < h1 > { title } - { judgments . length > 0 && ` ${ judgments [ 0 ] . keyword } ` } </ h1 >
82- { Array . isArray ( judgments ) && judgments . map ( judgment => (
83- < div style = { listStyle } key = { ` ${ judgment . level } - ${ judgment . number } - ${ judgment . year } ` } >
84- < a href = { prepareLink ( judgment ) } >
85- < b > { judgment . level . toUpperCase ( ) } { judgment . number } / { judgment . year } </ b >
94+ < h1 > { title } - { items . length > 0 && ` ${ items [ 0 ] . keyword } ` } </ h1 >
95+ { Array . isArray ( items ) && items . map ( item => (
96+ < div style = { listStyle } key = { getItemKey ( item ) } >
97+ < a href = { buildLink ( item ) } >
98+ { formatLabel ( item ) }
8699 </ a >
87100 </ div >
88101 ) ) }
@@ -92,4 +105,4 @@ const KeywordJudgmentListPage = ({ language }: KeywordPageType) => {
92105 )
93106}
94107
95- export default KeywordJudgmentListPage
108+ export default KeywordResultsBase
0 commit comments