ui tweaks

This commit is contained in:
ivic00
2024-09-28 20:38:20 +02:00
parent 7fa5a17e0b
commit 908eeab607
10 changed files with 371 additions and 220 deletions

View File

@ -1,21 +1,40 @@
import React, {useRef, useState} from "react"; import React, { useRef, useState } from "react";
import {LayoutChangeEvent} from "react-native"; import { LayoutChangeEvent, StyleSheet } from "react-native";
import {Calendar} from "react-native-big-calendar"; import { Calendar } from "react-native-big-calendar";
import {Button, Picker, PickerModes, SegmentedControl, Text, View} from "react-native-ui-lib"; import {
import {MaterialIcons} from "@expo/vector-icons"; Button,
import {AddEventDialog} from "@/components/pages/calendar/AddEventDialog"; Picker,
import {useGetEvents} from "@/hooks/firebase/useGetEvents"; PickerModes,
SegmentedControl,
Text,
View,
} from "react-native-ui-lib";
import { MaterialIcons } from "@expo/vector-icons";
import { AddEventDialog } from "@/components/pages/calendar/AddEventDialog";
import { useGetEvents } from "@/hooks/firebase/useGetEvents";
import { useAuthContext } from "@/contexts/AuthContext"; import { useAuthContext } from "@/contexts/AuthContext";
import HeaderTemplate from "@/components/shared/HeaderTemplate";
import CalendarViewSwitch from "@/components/pages/calendar/CalendarViewSwitch";
const modeMap = new Map([ const modeMap = new Map([
[0, "day"], [0, "day"],
[1, "week"], [1, "week"],
[2, "month"] [2, "month"],
]); ]);
const months = [ const months = [
"January", "February", "March", "April", "May", "June", "January",
"July", "August", "September", "October", "November", "December" "February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
]; ];
export default function Screen() { export default function Screen() {
@ -25,10 +44,10 @@ export default function Screen() {
const [selectedDate, setSelectedDate] = useState<Date>(new Date()); const [selectedDate, setSelectedDate] = useState<Date>(new Date());
const calendarContainerRef = useRef(null); const calendarContainerRef = useRef(null);
const { data: events} = useGetEvents() const { data: events } = useGetEvents();
const onLayout = (event: LayoutChangeEvent) => { const onLayout = (event: LayoutChangeEvent) => {
const {height} = event.nativeEvent.layout; const { height } = event.nativeEvent.layout;
setCalendarHeight(height); setCalendarHeight(height);
}; };
@ -49,21 +68,22 @@ export default function Screen() {
setSelectedDate(updatedDate); setSelectedDate(updatedDate);
}; };
console.log(events) console.log(events);
return ( return (
<View style={{flex: 1, height: "100%", padding: 10}}> <View style={{ flex: 1, height: "100%", padding: 10 }}>
<View style={{height: 60, justifyContent: "space-evenly", alignItems: "flex-start"}}> <HeaderTemplate
<Text>Welcome {profileData?.firstName}</Text> message={"Let's get your week started!"}
<Text>Let's get your week started!</Text> isWelcome={true}
</View> />
<View <View
style={{flex: 1, backgroundColor: "#fff", borderRadius: 30}} style={{ flex: 1, backgroundColor: "#fff", borderRadius: 30 }}
ref={calendarContainerRef} ref={calendarContainerRef}
onLayout={onLayout} onLayout={onLayout}
> >
<View style={{ <View
style={{
flexDirection: "row", flexDirection: "row",
justifyContent: "space-between", justifyContent: "space-between",
alignItems: "center", alignItems: "center",
@ -72,54 +92,68 @@ export default function Screen() {
borderRadius: 20, borderRadius: 20,
borderBottomLeftRadius: 0, borderBottomLeftRadius: 0,
borderBottomRightRadius: 0, borderBottomRightRadius: 0,
backgroundColor: "#f9f9f9", backgroundColor: "white",
marginBottom: 10, marginBottom: 10,
shadowColor: "#000", }}
shadowOffset: { width: 0, height: 2 }, >
shadowOpacity: 0.1,
shadowRadius: 5,
elevation: 3,
}}>
<Picker <Picker
value={months[selectedDate.getMonth()]} // Get the month from the date value={months[selectedDate.getMonth()]} // Get the month from the date
placeholder={"Select Month"} placeholder={"Select Month"}
mode={PickerModes.SINGLE} mode={PickerModes.SINGLE}
onChange={(itemValue) => handleMonthChange(itemValue as string)} onChange={(itemValue) => handleMonthChange(itemValue as string)}
trailingAccessory={<MaterialIcons name={"keyboard-arrow-down"}/>} trailingAccessory={<MaterialIcons name={"keyboard-arrow-down"} />}
> >
{months.map((month) => ( {months.map((month) => (
<Picker.Item key={month} label={month} value={month}/> <Picker.Item key={month} label={month} value={month} />
))} ))}
</Picker> </Picker>
<View> <View>
<SegmentedControl <SegmentedControl
segments={[ segments={[{ label: "D" }, { label: "W" }, { label: "M" }]}
{label: "D"}, backgroundColor="#ececec"
{label: "W"}, inactiveColor="#919191"
{label: "M"} activeBackgroundColor="#ea156c"
]} activeColor="white"
outlineColor="white"
outlineWidth={3}
style={{ backgroundColor: "green" }}
segmentLabelStyle={styles.segmentslblStyle}
onChangeIndex={handleSegmentChange} onChangeIndex={handleSegmentChange}
initialIndex={[...modeMap.entries()].find(([_, value]) => value === mode)?.[0] || 1} initialIndex={
[...modeMap.entries()].find(
([_, value]) => value === mode
)?.[0] || 1
}
/> />
</View> </View>
</View> </View>
{calendarHeight > 0 && ( {calendarHeight > 0 && (
<Calendar <Calendar
bodyContainerStyle={styles.calHeader}
mode={mode} mode={mode}
events={events ?? []} events={events ?? []}
height={calendarHeight} height={calendarHeight}
activeDate={selectedDate} activeDate={selectedDate}
onSwipeEnd={(newDate) => { onSwipeEnd={(newDate) => {
console.log(newDate) console.log(newDate);
setSelectedDate(newDate); setSelectedDate(newDate);
}} }}
/> />
)} )}
</View> </View>
<CalendarViewSwitch />
<AddEventDialog/> <AddEventDialog />
</View> </View>
); );
} }
const styles = StyleSheet.create({
segmentslblStyle: {
fontSize: 14,
},
calHeader: {
borderWidth: 0
},
});

View File

@ -13,9 +13,16 @@ const BrainDumpPage = () => {
return ( return (
<View> <View>
<ScrollView> <ScrollView
<HeaderTemplate message={"Welcome to your notes!"} isWelcome={false} /> showsVerticalScrollIndicator={false}
showsHorizontalScrollIndicator={false}
>
<View marginH-25> <View marginH-25>
<HeaderTemplate
message={"Welcome to your notes!"}
isWelcome={false}
/>
<View>
<View style={styles.searchField} centerV> <View style={styles.searchField} centerV>
<TextField <TextField
value={searchText} value={searchText}
@ -35,6 +42,7 @@ const BrainDumpPage = () => {
</View> </View>
<DumpList searchText={searchText} /> <DumpList searchText={searchText} />
</View> </View>
</View>
</ScrollView> </ScrollView>
</View> </View>
); );

View File

@ -1,7 +1,7 @@
import { View, Text } from "react-native-ui-lib"; import { View, Text } from "react-native-ui-lib";
import React, { useState } from "react"; import React, { useState } from "react";
import { IBrainDump } from "@/contexts/DumpContext"; import { IBrainDump } from "@/contexts/DumpContext";
import { TouchableOpacity } from "react-native-gesture-handler"; import { TouchableOpacity, TouchableWithoutFeedback } from "react-native-gesture-handler";
import MoveBrainDump from "./MoveBrainDump"; import MoveBrainDump from "./MoveBrainDump";
const BrainDumpItem = (props: { item: IBrainDump }) => { const BrainDumpItem = (props: { item: IBrainDump }) => {
@ -9,7 +9,7 @@ const BrainDumpItem = (props: { item: IBrainDump }) => {
return ( return (
<View> <View>
<TouchableOpacity onPress={() => setIsVisible(true)}> <TouchableWithoutFeedback onPress={() => setIsVisible(true)}>
<View <View
backgroundColor="white" backgroundColor="white"
marginV-5 marginV-5
@ -19,9 +19,9 @@ const BrainDumpItem = (props: { item: IBrainDump }) => {
<Text text70BL marginB-8> <Text text70BL marginB-8>
{props.item.title} {props.item.title}
</Text> </Text>
<Text text80>{props.item.description}</Text> <Text text70>{props.item.description}</Text>
</View> </View>
</TouchableOpacity> </TouchableWithoutFeedback>
<MoveBrainDump item={props.item} isVisible={isVisible} setIsVisible={setIsVisible} /> <MoveBrainDump item={props.item} isVisible={isVisible} setIsVisible={setIsVisible} />
</View> </View>
); );

View File

@ -22,16 +22,19 @@ export const AddEventDialog = () => {
position: "absolute", position: "absolute",
bottom: 20, bottom: 20,
right: 20, right: 20,
height: 60, height: 40,
width: 60,
borderRadius: 30, borderRadius: 30,
backgroundColor: "#fff", backgroundColor: "#fd1775",
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
}} }}
centerV
color="white"
enableShadow enableShadow
iconSource={() => <MaterialIcons name="add" size={30}/>} iconSource={() => <MaterialIcons name="add" size={22} color={'white'}/>}
onPress={() => setShow(true)} onPress={() => setShow(true)}
label="New"
text60R
/> />
<Dialog <Dialog

View File

@ -0,0 +1,74 @@
import { View, Text, Button, TouchableOpacity } from "react-native-ui-lib";
import React, { useState } from "react";
import { MaterialIcons } from "@expo/vector-icons";
import { StyleSheet } from "react-native";
const CalendarViewSwitch = () => {
const [show, setShow] = useState<boolean>(false);
const [calView, setCalView] = useState<boolean>(false);
return (
<View
row
spread
style={{
position: "absolute",
bottom: 20,
left: 20,
borderRadius: 30,
backgroundColor: "white",
alignItems: "center",
justifyContent: "center",
// iOS shadow
shadowColor: "#000",
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.25,
shadowRadius: 3.84,
// Android shadow (elevation)
elevation: 6,
}}
centerV
>
<TouchableOpacity onPress={() => setCalView(true)}>
<View
centerV
centerH
height={40}
paddingH-15
style={calView ? styles.switchBtnActive : styles.switchBtn}
>
<Text color={calView ? "white" : "#a1a1a1"} text70R>
Family View
</Text>
</View>
</TouchableOpacity>
<TouchableOpacity onPress={() => setCalView(false)}>
<View
centerV
centerH
height={40}
paddingH-15
style={!calView ? styles.switchBtnActive : styles.switchBtn}
>
<Text color={!calView ? "white" : "#a1a1a1"} text70R>
My View
</Text>
</View>
</TouchableOpacity>
</View>
);
};
export default CalendarViewSwitch;
const styles = StyleSheet.create({
switchBtnActive: {
backgroundColor: "#a1a1a1",
borderRadius: 50,
},
switchBtn: {
backgroundColor: "white",
borderRadius: 50,
},
});

View File

@ -4,6 +4,7 @@ import {
Button, Button,
TouchableOpacity, TouchableOpacity,
Checkbox, Checkbox,
ButtonSize,
} from "react-native-ui-lib"; } from "react-native-ui-lib";
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { ProfileType, useAuthContext } from "@/contexts/AuthContext"; import { ProfileType, useAuthContext } from "@/contexts/AuthContext";
@ -15,9 +16,8 @@ import {
useGroceryContext, useGroceryContext,
} from "@/contexts/GroceryContext"; } from "@/contexts/GroceryContext";
import EditGroceryFrequency from "./EditGroceryFrequency"; import EditGroceryFrequency from "./EditGroceryFrequency";
import { TextInput } from "react-native";
import EditGroceryItem from "./EditGroceryItem"; import EditGroceryItem from "./EditGroceryItem";
import { TouchableWithoutFeedback } from "react-native-gesture-handler"; import { StyleSheet } from "react-native";
const GroceryItem = ({ const GroceryItem = ({
item, item,
@ -32,7 +32,9 @@ const GroceryItem = ({
const [openFreqEdit, setOpenFreqEdit] = useState<boolean>(false); const [openFreqEdit, setOpenFreqEdit] = useState<boolean>(false);
const [isEditingTitle, setIsEditingTitle] = useState<boolean>(false); const [isEditingTitle, setIsEditingTitle] = useState<boolean>(false);
const [newTitle, setNewTitle] = useState<string>(""); const [newTitle, setNewTitle] = useState<string>("");
const [category, setCategory] = useState<GroceryCategory>(GroceryCategory.None); const [category, setCategory] = useState<GroceryCategory>(
GroceryCategory.None
);
const handleTitleChange = (newTitle: string) => { const handleTitleChange = (newTitle: string) => {
updateGroceryItem(item.id, { title: newTitle }); updateGroceryItem(item.id, { title: newTitle });
@ -47,12 +49,14 @@ const GroceryItem = ({
}, []); }, []);
return ( return (
<ListItem <View
key={item.id} key={item.id}
style={{ borderRadius: 50, marginVertical: 5, height: 55 }} style={{ borderRadius: 18, marginVertical: 5 }}
backgroundColor="white" backgroundColor="white"
centerV centerV
padding-0 padding-0
>
<ListItem
onPress={() => { onPress={() => {
setOpenFreqEdit(true); setOpenFreqEdit(true);
}} }}
@ -78,7 +82,7 @@ const GroceryItem = ({
id: item.id, id: item.id,
title: newTitle, title: newTitle,
setTitle: setNewTitle, setTitle: setNewTitle,
category:category, category: category,
updateCategory: updateGroceryItem, updateCategory: updateGroceryItem,
closeEdit: setIsEditingTitle, closeEdit: setIsEditingTitle,
setCategory: setCategory, setCategory: setCategory,
@ -86,9 +90,9 @@ const GroceryItem = ({
/> />
)} )}
</ListItem.Part> </ListItem.Part>
<ListItem.Part right containerStyle={{ paddingEnd: 20 }}> <ListItem.Part right containerStyle={{ paddingEnd: item.approved ? 20 : 5 }}>
{!item.approved ? ( {!item.approved ? (
<View row> <View row >
<Button <Button
padding-0 padding-0
children={ children={
@ -125,7 +129,7 @@ const GroceryItem = ({
) : ( ) : (
<Checkbox <Checkbox
value={item.bought} value={item.bought}
color={"#f58749"} style={styles.checkbox}
onValueChange={() => onValueChange={() =>
updateGroceryItem(item.id, { bought: !item.bought }) updateGroceryItem(item.id, { bought: !item.bought })
} }
@ -133,7 +137,36 @@ const GroceryItem = ({
)} )}
</ListItem.Part> </ListItem.Part>
</ListItem> </ListItem>
{!item.approved && (
<View>
<View centerH>
<View height={1} backgroundColor="#e7e7e7" width={"90%"} />
</View>
<View paddingL-10 paddingV-15 flexS row centerV>
<View
style={{
width: 25,
aspectRatio: 1,
borderRadius: 50,
backgroundColor: "red",
marginHorizontal: 10,
}}
></View>
<Text color="#858585" text70>Requested by Austin</Text>
</View>
</View>
)}
</View>
); );
}; };
const styles = StyleSheet.create({
checkbox:{
borderRadius: 50,
borderWidth: 1,
color: "#bfbfbf",
borderColor: "#bfbfbf",
}
})
export default GroceryItem; export default GroceryItem;

View File

@ -83,7 +83,7 @@ const GroceryList = () => {
message={"Welcome to your grocery list"} message={"Welcome to your grocery list"}
isWelcome={false} isWelcome={false}
> >
<View row spread> <View row spread gap-5>
<View <View
backgroundColor="#e2eed8" backgroundColor="#e2eed8"
padding-8 padding-8

View File

@ -1,5 +1,7 @@
import React from "react"; import React from "react";
import { StyleSheet } from "react-native";
import { Button, View, Text } from "react-native-ui-lib"; import { Button, View, Text } from "react-native-ui-lib";
interface IDrawerButtonProps { interface IDrawerButtonProps {
bgColor: string; bgColor: string;
color: string; color: string;
@ -7,6 +9,7 @@ interface IDrawerButtonProps {
icon: React.ReactNode; icon: React.ReactNode;
title: string; title: string;
} }
const DrawerButton = (props: IDrawerButtonProps) => { const DrawerButton = (props: IDrawerButtonProps) => {
return ( return (
<Button <Button
@ -18,9 +21,7 @@ const DrawerButton = (props: IDrawerButtonProps) => {
iconSource={() => ( iconSource={() => (
<View <View
backgroundColor={props.bgColor} backgroundColor={props.bgColor}
width={60} style={styles.iconContainer}
height={60}
style={{ borderRadius: 50 }}
centerV centerV
centerH centerH
> >
@ -34,18 +35,16 @@ const DrawerButton = (props: IDrawerButtonProps) => {
flexDirection: "column", flexDirection: "column",
justifyContent: "space-between", justifyContent: "space-between",
paddingVertical: 15, paddingVertical: 15,
// Shadow for iOS
shadowColor: "#000",
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.3,
shadowRadius: 10, // This will create a blurry shadow
// Shadow for Android
elevation: 1,
}} }}
></Button> ></Button>
); );
}; };
export default DrawerButton; export default DrawerButton;
const styles = StyleSheet.create({
iconContainer: {
width: '70%',
aspectRatio: 1,
borderRadius: 50,
},
});

View File

@ -10,7 +10,7 @@ const HeaderTemplate = (props: {
}) => { }) => {
const { user, profileData } = useAuthContext(); const { user, profileData } = useAuthContext();
return ( return (
<View row centerV padding-25> <View row centerV marginV-15>
<View <View
backgroundColor="pink" backgroundColor="pink"
height={65} height={65}

View File

@ -28,19 +28,19 @@ export const BrainDumpProvider: React.FC<{ children: React.ReactNode }> = ({
id: 0, id: 0,
title: "Favorite Weekend Activities", title: "Favorite Weekend Activities",
description: description:
"What's something fun we can do together this weekend? Maybe a new game, a picnic, or trying out a family recipe. Everyone share one idea!", "What's something fun we can do together this weekend? Maybe a new game, a picnic?",
}, },
{ {
id: 1, id: 1,
title: "Whats For Dinner", title: "Whats For Dinner",
description: description:
"Whats one meal youd love to have for dinner this week? Lets get creative with new ideas we havent tried yet.", "Whats one meal youd love to have for dinner this week?",
}, },
{ {
id: 2, id: 2,
title: "The Best Thing About Today", title: "The Best Thing About Today",
description: description:
"What was the highlight of your day? Lets each take a moment to share something good that happened, no matter how small.", "What was the highlight of your day? Lets each take a moment to share something!",
}, },
{ {
id: 3, id: 3,