From 432da99424b12ece04209a2e06517ccdca85c49c Mon Sep 17 00:00:00 2001 From: avichaljadeja2002 Date: Mon, 13 Jan 2025 19:32:19 -0500 Subject: [PATCH] refractor view events to a common component --- .gitignore | 2 +- app/constants.js | 6 +- app/genericViewEventPage.tsx | 242 ++++++++++++++++++ app/viewCalendarEvents.tsx | 68 ++--- app/viewEventPage.tsx | 185 ------------- app/viewFinanceEvents.tsx | 71 ++--- app/viewHealthEvents.tsx | 67 ++--- app/viewMealEvents.tsx | 94 ++----- .../src/main/resources/application.properties | 16 ++ tsconfig.json | 6 +- 10 files changed, 346 insertions(+), 411 deletions(-) create mode 100644 app/genericViewEventPage.tsx delete mode 100644 app/viewEventPage.tsx create mode 100644 backend/omniplanner/src/main/resources/application.properties diff --git a/.gitignore b/.gitignore index e1a76c9..d74d7c7 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/app/constants.js b/app/constants.js index 2cc9e1c..a20d3f8 100644 --- a/app/constants.js +++ b/app/constants.js @@ -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 = [ @@ -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'); } \ No newline at end of file diff --git a/app/genericViewEventPage.tsx b/app/genericViewEventPage.tsx new file mode 100644 index 0000000..c720cd4 --- /dev/null +++ b/app/genericViewEventPage.tsx @@ -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'; +import MultiSelect from 'react-native-multiple-select'; +import { Dropdown } from 'react-native-element-dropdown'; +import { getUserId, IPAddr, repeatingData } from './constants'; +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, +}: GenericEventPageProps) => { + const [formData, setFormData] = useState({}); + const [additionalData, setAdditionalData] = useState([]); + const route = useRoute>(); + const { event } = route.params as EventParams; + + const [userId, setUserId] = useState(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 ( + + {title} + {fields.map((field) => { + switch (field.type) { + case 'text': + return ( + + {field.label} + handleChange(field.name, value)} + /> + + ); + case 'date': + case 'time': + return ( + + {field.label} + handleChange(field.name, value)} + placeholder={field.type === 'date' ? 'YYYY-MM-DD' : 'HH:MM'} + /> + + ); + case 'dropdown': + return ( + + {field.label} + + handleChange(field.name, item.value) + } + placeholder="Select" + /> + + + ); + case 'multi-select': + return ( + + {field.label} + {/* 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" + /> */} + + ); + case 'number': + { + return ( + + {field.label} + handleChange(field.name, text)} + placeholder={field.label} + keyboardType="numeric" + /> + + ) + } + case 'textarea': + { + return ( + + {field.label} + handleChange(field.name, text)} + multiline + placeholder={field.label} + /> + + ) + } + default: + return null; + } + })} +