skolplattformen-backup/apps/skolplattformen-sthlm/components/newsList.component.tsx

96 lines
2.7 KiB
TypeScript
Raw Normal View History

2021-10-05 15:44:14 +00:00
import { useNews } from '@skolplattformen/hooks'
import { Input, List, StyleService, useStyleSheet } from '@ui-kitten/components'
import React, { useMemo, useState } from 'react'
import { TouchableOpacity, View } from 'react-native'
import { Sizing } from '../styles'
2021-04-25 16:38:18 +00:00
import {
renderSearchResultPreview,
useNewsListSearchResults,
2021-04-25 16:38:18 +00:00
} from '../utils/search'
import { translate } from '../utils/translation'
import { useChild } from './childContext.component'
import { CloseOutlineIcon, SearchIcon } from './icon.component'
import { NewsListItem } from './newsListItem.component'
2020-12-07 20:59:14 +00:00
export const NewsList = () => {
const styles = useStyleSheet(themedStyles)
const child = useChild()
2021-02-20 08:38:08 +00:00
const { data } = useNews(child)
2021-04-25 16:38:18 +00:00
const [searchQuery, setSearchQuery] = useState('')
const searchResults = useNewsListSearchResults(searchQuery)
const header = useMemo(
() => (
<Input
accessibilityHint={translate('news.search.placeholder', {
defaultValue: 'Sök alla nyheter...',
})}
placeholder={translate('news.search.placeholder', {
defaultValue: 'Sök alla nyheter...',
})}
2021-04-25 16:38:18 +00:00
returnKeyType="search"
status="basic"
accessoryLeft={SearchIcon}
onChangeText={setSearchQuery}
value={searchQuery}
style={styles.search}
accessoryRight={(props) =>
searchQuery.length > 0 ? (
<TouchableOpacity onPress={() => setSearchQuery('')}>
<CloseOutlineIcon {...props} />
</TouchableOpacity>
) : (
<View />
)
}
2021-04-25 16:38:18 +00:00
/>
),
[searchQuery, styles.search]
2021-04-25 16:38:18 +00:00
)
if (searchQuery) {
return (
2021-02-18 09:09:27 +00:00
<List
style={styles.container}
contentContainerStyle={styles.contentContainer}
2021-04-25 16:38:18 +00:00
keyboardDismissMode="on-drag"
data={searchResults}
ListHeaderComponent={header}
renderItem={({ item: searchResult }) => (
<NewsListItem key={searchResult.item.id} item={searchResult.item}>
{renderSearchResultPreview(searchResult)}
</NewsListItem>
2021-02-18 09:09:27 +00:00
)}
/>
2021-04-25 16:38:18 +00:00
)
}
return (
<List
style={styles.container}
contentContainerStyle={styles.contentContainer}
keyboardDismissMode="on-drag"
data={data}
ListHeaderComponent={header}
2021-04-30 16:02:21 +00:00
renderItem={({ item }) => <NewsListItem key={item.id} item={item} />}
2021-04-25 16:38:18 +00:00
/>
2020-12-15 01:38:36 +00:00
)
}
2020-12-07 20:59:14 +00:00
const themedStyles = StyleService.create({
container: {
height: '100%',
width: '100%',
},
contentContainer: {
paddingVertical: Sizing.t3,
paddingHorizontal: Sizing.t3,
},
search: {
backgroundColor: 'background-basic-color-1',
borderRadius: 40,
marginBottom: Sizing.t2,
},
})