Skip to content

Commit

Permalink
refractor view events to a common component
Browse files Browse the repository at this point in the history
  • Loading branch information
avichaljadeja2002 committed Jan 14, 2025
1 parent 073a87c commit 432da99
Show file tree
Hide file tree
Showing 10 changed files with 346 additions and 411 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ expo-env.d.ts
# @end expo-cli
credentials.json

/backend/omniplanner/src/main/resources/application.properties
#/backend/omniplanner/src/main/resources/application.properties
6 changes: 5 additions & 1 deletion app/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import axios from "axios";
import { cLog } from './log';

// export const IPAddr = "http://34.204.83.156:8080" // For AWS
export const IPAddr = "http://137.112.196.132:8080" // For local testing on laptop
export const IPAddr = "http://127.0.0.1:8080" // For local testing on laptop
export const logging = true;

export const repeatingData = [
Expand Down Expand Up @@ -70,4 +70,8 @@ export const verifyToken = async (navigation) => {
}
cLog('Verify response:', response.data);
return true;
}

export const getUserId = async() => {
return await AsyncStorage.getItem('userId');
}
242 changes: 242 additions & 0 deletions app/genericViewEventPage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,242 @@
import React, { useEffect, useState } from 'react';
import axios from 'axios';
import { View, Text, TextInput, Button, StyleSheet } from 'react-native';
import DateTimePicker from '@react-native-community/datetimepicker';

Check failure on line 4 in app/genericViewEventPage.tsx

View workflow job for this annotation

GitHub Actions / lint-ts

'DateTimePicker' is defined but never used
import MultiSelect from 'react-native-multiple-select';

Check failure on line 5 in app/genericViewEventPage.tsx

View workflow job for this annotation

GitHub Actions / lint-ts

'MultiSelect' is defined but never used
import { Dropdown } from 'react-native-element-dropdown';
import { getUserId, IPAddr, repeatingData } from './constants';

Check failure on line 7 in app/genericViewEventPage.tsx

View workflow job for this annotation

GitHub Actions / lint-ts

'IPAddr' is defined but never used

Check failure on line 7 in app/genericViewEventPage.tsx

View workflow job for this annotation

GitHub Actions / lint-ts

'repeatingData' is defined but never used
import { cLog } from './log';
import { RouteProp, useRoute } from '@react-navigation/native';
import { RootStackParamList } from '@/components/Types';

export interface Field {
name: string;
label: string;
type: 'text' | 'date' | 'time' | 'dropdown' | 'multi-select' | 'number' | 'textarea';
options?: { label: string; value: any }[];
}

type EventParams = {
event: {
event_date: string;
event_time: string;
repeat_timeline?: string;
ingredients?: string;
[key: string]: any;
};
};

type GenericEventPageProps = {
title: string;
fields: Field[];
updateEndpoint: string;
fetchEndpoint?: string;
mainPage: string;
};

const GenericEventPage = ({
title,
fields,
updateEndpoint,
fetchEndpoint,
mainPage,

Check failure on line 42 in app/genericViewEventPage.tsx

View workflow job for this annotation

GitHub Actions / lint-ts

'mainPage' is defined but never used
}: GenericEventPageProps) => {
const [formData, setFormData] = useState<any>({});
const [additionalData, setAdditionalData] = useState<any>([]);

Check failure on line 45 in app/genericViewEventPage.tsx

View workflow job for this annotation

GitHub Actions / lint-ts

'additionalData' is assigned a value but never used
const route = useRoute<RouteProp<RootStackParamList, any>>();
const { event } = route.params as EventParams;

const [userId, setUserId] = useState<number | null>(null);

useEffect(() => {
const fetchUserId = async () => {
const id = await getUserId();
if (id !== null) {
setUserId(Number(id));
}
};

fetchUserId();
}, []);
const handleSave = async (saveData: any) => {
try {
cLog('Save Data:', saveData);
const response = await axios.put(updateEndpoint, saveData);
cLog('Event updated successfully:', response.data);
} catch (error) {
console.error('Error updating event:', error);
}
};

const fetchAdditionalData = async () => {
if (!fetchEndpoint) return;
try {
const response = await axios.get(fetchEndpoint);
setAdditionalData(response.data);
} catch (error) {
console.error('Error fetching additional data:', error);
}
};

useEffect(() => {
fetchAdditionalData();
let eventDate = event.event.event_date;
if (event.event.event_date !== event.event.event_time) {
const dateTimeString = `${event.event.event_date}T${event.event.event_time}`;
eventDate = new Date(dateTimeString);
}

if (eventDate) {
event.event['event_date'] = eventDate;
event.event['event_time'] = eventDate;
}

if (event.event['repeat_timeline']) {
event.event['repeat_timeline'] = parseInt(event.event['repeat_timeline'], 10);
event.event['repeating'] = event.event['repeat_timeline'] !== 0;
}

setFormData(event.event);
}, [event]);

const handleChange = (name: string, value: any) => {
setFormData({ ...formData, [name]: value });
};

const handleFormSave = () => {
cLog("Saving data:", formData);
setFormData({ ...formData, userId: userId });
handleSave(formData);
};

return (
<View style={styles.container}>
<Text style={styles.title}>{title}</Text>
{fields.map((field) => {
switch (field.type) {
case 'text':
return (
<View key={field.name} style={styles.field}>
<Text>{field.label}</Text>
<TextInput
style={styles.input}
value={formData[field.name]}
onChangeText={(value) => handleChange(field.name, value)}
/>
</View>
);
case 'date':
case 'time':
return (
<View key={field.name} style={styles.field}>
<Text>{field.label}</Text>
<TextInput
style={styles.input}
value={formData[field.name]?.toString()}
onChangeText={(value) => handleChange(field.name, value)}
placeholder={field.type === 'date' ? 'YYYY-MM-DD' : 'HH:MM'}
/>
</View>
);
case 'dropdown':
return (
<View key={field.name} style={styles.field}>
<Text>{field.label}</Text>
<Dropdown
style={{ height: 50, width: '80%' }}
data={field.options || []}
maxHeight={300}
labelField="label"
valueField="value"
value={formData[field.name]}
onChange={(item: { label: string; value: any }) =>
handleChange(field.name, item.value)
}
placeholder="Select"
/>
</View>

);
case 'multi-select':
return (
<View key={field.name} style={styles.field}>
<Text>{field.label}</Text>
{/* <MultiSelect
items={field.options || []}
uniqueKey="value"
selectedItems={formData[field.name] || []}
onSelectedItemsChange={(selected) => handleChange(field.name, selected)}
selectText="Choose items"
searchInputPlaceholderText="Search items..."
tagRemoveIconColor="#CCC"
tagBorderColor="#CCC"
tagTextColor="#CCC"
selectedItemTextColor="#CCC"
selectedItemIconColor="#CCC"
itemTextColor="#000"
displayKey="label"
searchInputStyle={{ color: '#CCC' }}
submitButtonColor="#48d22b"
submitButtonText="Submit"
/> */}
</View>
);
case 'number':
{
return (
<View key={field.name} style={styles.field}>
<Text>{field.label}</Text>
<TextInput
style={[styles.input, { height: 50 }]}
value={formData[field.name]}
onChangeText={(text) => handleChange(field.name, text)}
placeholder={field.label}
keyboardType="numeric"
/>
</View>
)
}
case 'textarea':
{
return (
<View key={field.name} style={styles.field}>
<Text>{field.label}</Text>
<TextInput
value={formData[field.name]}
onChangeText={(text) => handleChange(field.name, text)}
multiline
placeholder={field.label}
/>
</View>
)
}
default:
return null;
}
})}
<Button title="Save" onPress={handleFormSave} />
</View>
);
};

const styles = StyleSheet.create({
container: {
padding: 20,
},
title: {
fontSize: 24,
fontWeight: 'bold',
marginBottom: 20,
},
field: {
marginBottom: 15,
},
input: {
borderWidth: 1,
borderColor: '#ccc',
padding: 10,
borderRadius: 5,
},
});

export default GenericEventPage;
68 changes: 19 additions & 49 deletions app/viewCalendarEvents.tsx
Original file line number Diff line number Diff line change
@@ -1,54 +1,24 @@
import React from 'react';
import axios from 'axios';
import React, { useEffect, useState } from 'react';

Check failure on line 1 in app/viewCalendarEvents.tsx

View workflow job for this annotation

GitHub Actions / lint-ts

'useEffect' is defined but never used

Check failure on line 1 in app/viewCalendarEvents.tsx

View workflow job for this annotation

GitHub Actions / lint-ts

'useState' is defined but never used
import GenericEventPage, { Field } from './genericViewEventPage';
import { IPAddr, repeatingData } from './constants';
import { cLog } from './log'
import GenericViewPageForm from './viewEventPage';
import { RouteProp, useRoute } from '@react-navigation/native';
import { RootStackParamList } from '@/components/Types';

type ViewEventsRouteProp = RouteProp<RootStackParamList, 'viewCalendarEvents'>;

export default function ViewCalendarEvents() {
const route = useRoute<ViewEventsRouteProp>();
const { event } = route.params;
cLog("Passed event:", event);
const fields = [
{ name: 'title', label: 'Title', type: 'text' },
{ name: 'event_date', label: 'Date', type: 'date' },
{ name: 'event_time', label: 'Time', type: 'time' },
{ name: 'description', label: 'Description', type: 'textarea' },
{ name: 'repeat_timeline', label: 'Repeating', type: 'dropdown', options: repeatingData },
];
const handleSave = async (saveData: any) => {
try {
cLog("Save Data:", saveData);
const hit = IPAddr + '/update_calendar_event';
cLog('Updating event with:' + hit);
const response = await axios.put(hit, saveData);
cLog('Event updated successfully:' + response.data);
} catch (error) {
console.error('Error updating event:', error);
}
};

let eventDate = event.event.event_date;
if (event.event.event_date != event.event.event_time) {
const dateTimeString = `${event.event.event_date}T${event.event.event_time}`;
eventDate = new Date(dateTimeString);
}

if (eventDate) event.event['event_date'] = eventDate;
if (eventDate) event.event['event_time'] = eventDate;
if (event.event['repeat_timeline']) event.event['repeat_timeline'] = parseInt(event.event['repeat_timeline'], 10);
if (event.event['repeat_timeline'] !== undefined) event.event['repeating'] = event.event['repeat_timeline'] !== 0;
export default function ViewHealthEvents() {
const fields: Field[] = [
{ name: 'title', label: 'Title', type: 'text' },
{ name: 'description', label: 'Description', type: 'textarea' },
{ name: 'event_date', label: 'Date', type: 'date' },
{ name: 'event_time', label: 'Time', type: 'time' },
{ name: 'repeat_timeline', label: 'Repeating', type: 'dropdown', options: repeatingData },
];

return (
<GenericViewPageForm
title="Calendar Event"
initialData={event.event}
fields={fields}
mainPage='calendarEvents'
onSave={handleSave}
/>
);
}
return (
<GenericEventPage
title="Calendar event"
fields={fields}
updateEndpoint={`${IPAddr}/update_calendar_event`}
mainPage="calendarEvents"
/>
);
}
Loading

0 comments on commit 432da99

Please sign in to comment.