Change select style

This commit is contained in:
Brandon Presley 2023-10-26 20:30:41 +13:00
parent 717c07d512
commit 1d13cb9c5d
2 changed files with 41 additions and 35 deletions

View File

@ -1,6 +1,13 @@
import React, { useCallback, useMemo, useState } from "react"; import React, { useCallback, useMemo, useState } from "react";
import { View } from "react-native"; import { Pressable, View } from "react-native";
import { Button, Menu, Subheading, useTheme } from "react-native-paper"; import {
Button,
IconButton,
Menu,
Subheading,
useTheme,
} from "react-native-paper";
import AppInput from "./AppInput";
import { ITEM_PADDING } from "./constants"; import { ITEM_PADDING } from "./constants";
export interface Item { export interface Item {
@ -22,13 +29,14 @@ function Select({
}) { }) {
const [show, setShow] = useState(false); const [show, setShow] = useState(false);
const { colors } = useTheme(); const { colors } = useTheme();
let menuButton: React.Ref<View> = null;
const selected = useMemo( const selected = useMemo(
() => items.find((item) => item.value === value) || items[0], () => items.find((item) => item.value === value) || items[0],
[items, value] [items, value]
); );
const handlePress = useCallback( const press = useCallback(
(newValue: string) => { (newValue: string) => {
onChange(newValue); onChange(newValue);
setShow(false); setShow(false);
@ -37,38 +45,35 @@ function Select({
); );
return ( return (
<View <Menu
style={{ visible={show}
flexDirection: "row", onDismiss={() => setShow(false)}
alignItems: "center", anchor={
paddingLeft: ITEM_PADDING, <View>
}} <Pressable onPress={() => setShow(true)}>
> <AppInput label={label} value={selected.label} editable={false} />
{label && <Subheading style={{ width: 100 }}>{label}</Subheading>} </Pressable>
<Menu <View
visible={show} style={{ position: "absolute", right: 0, flexDirection: "row" }}
onDismiss={() => setShow(false)}
anchor={
<Button
onPress={() => setShow(true)}
style={{
alignSelf: "flex-start",
}}
> >
{selected?.label} <IconButton
</Button> ref={menuButton}
} icon="menu-down"
> onPress={() => setShow(true)}
{items.map((item) => ( />
<Menu.Item </View>
titleStyle={{ color: item.color || colors.onSurface }} </View>
key={item.value} }
title={item.label} >
onPress={() => handlePress(item.value)} {items.map((item) => (
/> <Menu.Item
))} title={item.label}
</Menu> key={item.value}
</View> onPress={() => press(item.value)}
titleStyle={{ color: item.color || colors.onSurface }}
/>
))}
</Menu>
); );
} }

View File

@ -2,7 +2,7 @@ import { NavigationProp, useNavigation } from "@react-navigation/native";
import { format } from "date-fns"; import { format } from "date-fns";
import { useCallback, useEffect, useMemo, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { NativeModules, ScrollView } from "react-native"; import { NativeModules, ScrollView, View } from "react-native";
import DocumentPicker from "react-native-document-picker"; import DocumentPicker from "react-native-document-picker";
import { Dirs, FileSystem } from "react-native-file-access"; import { Dirs, FileSystem } from "react-native-file-access";
import ConfirmDialog from "./ConfirmDialog"; import ConfirmDialog from "./ConfirmDialog";
@ -324,6 +324,7 @@ export default function SettingsPage() {
<Page term={term} search={setTerm} style={{ flexGrow: 1 }}> <Page term={term} search={setTerm} style={{ flexGrow: 1 }}>
<ScrollView style={{ marginTop: MARGIN, flex: 1 }}> <ScrollView style={{ marginTop: MARGIN, flex: 1 }}>
{switchesMarkup} {switchesMarkup}
<View style={{ marginBottom: MARGIN }} />
{selectsMarkup} {selectsMarkup}
{buttonsMarkup} {buttonsMarkup}
</ScrollView> </ScrollView>