diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..fef4337 --- /dev/null +++ b/.babelrc @@ -0,0 +1,11 @@ +{ + "presets": ["module:metro-react-native-babel-preset"], + "plugins": [ + [ + "babel-plugin-inline-import", + { + "extensions": [".svg"] + } + ] + ] +} diff --git a/babel.config.js b/babel.config.js index 295d033..f2c9fdf 100644 --- a/babel.config.js +++ b/babel.config.js @@ -8,16 +8,16 @@ module.exports = function (api) { { root: ["./src"], alias: { - "@assets": "./src/assets", "@components": "./src/components", - "@global": "./src/global", - "@mocks": "./src/mocks", + "@routes": "./src/routes", "@screens": "./src/screens", - "@utils": "./src/utils", + "@assets": "./src/shared/assets", + "@constants": "./src/shared/constants", "@interfaces": "./src/shared/interfaces", - "@requests": "./src/shared/utils/handlers", "@api": "./src/shared/services/api", - "@routes": "./src/routes", + "@requests": "./src/shared/services", + "@custom-types": "./src/shared/types", + "@utils": "./src/shared/utils", }, }, ], diff --git a/declarations.d.ts b/declarations.d.ts new file mode 100644 index 0000000..624fca2 --- /dev/null +++ b/declarations.d.ts @@ -0,0 +1,6 @@ +declare module "*.svg" { + import React from "react"; + import { SvgProps } from "react-native-svg"; + const content: React.FC; + export default content; +} diff --git a/metro.config.js b/metro.config.js new file mode 100644 index 0000000..e8c4f79 --- /dev/null +++ b/metro.config.js @@ -0,0 +1,16 @@ +const { getDefaultConfig } = require("metro-config"); + +module.exports = (async () => { + const { + resolver: { sourceExts, assetExts }, + } = await getDefaultConfig(); + return { + transformer: { + babelTransformerPath: require.resolve("react-native-svg-transformer"), + }, + resolver: { + assetExts: assetExts.filter(ext => ext !== "svg"), + sourceExts: [...sourceExts, "svg"], + }, + }; +})(); diff --git a/package.json b/package.json index c9d2f6f..384bb21 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "ios": "expo start --ios", "web": "expo start --web", "prepare": "husky install", - "format": "prettier --write \"**/*.{js,jsx,json,md}\"" + "format": "prettier --write \"**/*.{js,jsx,json,md,ts,tsx}\"" }, "lint-staged": { "src/**/*.{js,ts,tsx}": [ @@ -29,6 +29,7 @@ "dependencies": { "@expo-google-fonts/inter": "^0.2.3", "@react-native-async-storage/async-storage": "1.17.11", + "@react-native-picker/picker": "2.4.8", "@react-navigation/bottom-tabs": "^6.5.7", "@react-navigation/native": "^6.1.6", "@react-navigation/native-stack": "^6.9.12", @@ -39,9 +40,10 @@ "expo-status-bar": "~1.4.4", "react": "18.2.0", "react-hook-form": "^7.43.6", - "react-native": "0.71.4", + "react-native": "0.71.6", "react-native-safe-area-context": "4.5.0", "react-native-screens": "~3.20.0", + "react-native-select-dropdown": "^3.3.2", "react-native-svg": "13.4.0", "styled-components": "^5.3.9" }, @@ -52,6 +54,7 @@ "@types/styled-components-react-native": "^5.2.1", "@typescript-eslint/eslint-plugin": "^5.55.0", "@typescript-eslint/parser": "^5.55.0", + "babel-plugin-inline-import": "^3.0.0", "babel-plugin-module-resolver": "^5.0.0", "eslint": "^8.36.0", "eslint-plugin-import": "^2.27.5", @@ -59,6 +62,7 @@ "husky": "^8.0.3", "lint-staged": "^13.2.0", "prettier": "^2.8.6", + "react-native-svg-transformer": "^1.0.0", "typescript": "^4.9.4" }, "private": true diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index 2be4d15..4d321e4 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -14,6 +14,8 @@ interface CardProps { author?: string; onPress?: () => void; onEdit?: () => void; + canEdit: boolean; + isEdited?: boolean; } export function Card({ @@ -28,6 +30,8 @@ export function Card({ author, onPress, onEdit, + canEdit, + isEdited = false, }: CardProps) { const props: SpecificCardProps["props"] = { id, @@ -40,6 +44,8 @@ export function Card({ author, onPress, onEdit, + canEdit, + isEdited, }; if (type === "annotation") return ; @@ -59,6 +65,8 @@ export interface SpecificCardProps { author?: string; onPress?: () => void; onEdit?: () => void; + canEdit: boolean; + isEdited?: boolean; }; } @@ -69,17 +77,17 @@ function Update({ props }: SpecificCardProps) { Atualização | {props.date}, {props.time} - - - + {props.canEdit && ( + + + + )} {props.description} - - Comentado por {props.author} - + Comentado por {props.author} ); @@ -90,22 +98,23 @@ function Anotation({ props }: SpecificCardProps) { <Text color="#000000" size={12} weight="500"> - Anotação | {props.date}, {props.time} + Anotação | {props.date}, {props.time}{" "} + {props.isEdited && ( + <Text color="#999999" size={12} weight="500"> + (editado) + </Text> + )} </Text> <EditIcon onPress={props.onEdit}> <Edit /> </EditIcon> - - {props.title} - + {props.title && {props.title}} {props.description} - - Criado por {props.author} - + Criado por {props.author} ); @@ -118,15 +127,17 @@ function Meeting({ props }: SpecificCardProps) { {props.date} | {props.partner} - - - + {props.canEdit && ( + + + + )} {props.time} - + {props.title} diff --git a/src/components/Icon/icons.tsx b/src/components/Icon/icons.tsx new file mode 100644 index 0000000..661a527 --- /dev/null +++ b/src/components/Icon/icons.tsx @@ -0,0 +1,88 @@ +// import { SvgProps } from "react-native-svg"; + +import checkIcon from "../../shared/assets/icons/check.svg"; +import checkboxOffIcon from "../../shared/assets/icons/checkbox-off.svg"; +import checkboxOnIcon from "../../shared/assets/icons/checkbox-on.svg"; +import closeIcon from "../../shared/assets/icons/close.svg"; +import editIcon from "../../shared/assets/icons/edit.svg"; +import eyeHiddenIcon from "../../shared/assets/icons/eye-hidden.svg"; +import eyeIcon from "../../shared/assets/icons/eye.svg"; +import homeIcon from "../../shared/assets/icons/home.svg"; +import imageIcon from "../../shared/assets/icons/image.svg"; +import infoIcon from "../../shared/assets/icons/info.svg"; +import loadingIcon from "../../shared/assets/icons/loading.svg"; +import logOffIcon from "../../shared/assets/icons/log-off.svg"; +import menuIcon from "../../shared/assets/icons/menu.svg"; +import minusIcon from "../../shared/assets/icons/minus.svg"; +import orderIcon from "../../shared/assets/icons/order.svg"; +import plusIcon from "../../shared/assets/icons/plus.svg"; +import profileIcon from "../../shared/assets/icons/profile.svg"; +import questionIcon from "../../shared/assets/icons/question.svg"; +import radio1Icon from "../../shared/assets/icons/radio-1.svg"; +import radioIcon from "../../shared/assets/icons/radio.svg"; +import refreshIcon from "../../shared/assets/icons/refresh.svg"; +import searchIcon from "../../shared/assets/icons/search.svg"; +import trashIcon from "../../shared/assets/icons/trash.svg"; +import usersIcon from "../../shared/assets/icons/users.svg"; +import arrowLeftIcon from "../../shared/assets/icons/arrow-left.svg"; + +export type iconsName = + | "arrow-left" + | "check" + | "checkbox-off" + | "checkbox-on" + | "close" + | "edit" + | "eye-hidden" + | "eye" + | "home" + | "image" + | "info" + | "loading" + | "log-off" + | "menu" + | "minus" + | "order" + | "plus" + | "profile" + | "question" + | "radio-1" + | "radio" + | "refresh" + | "search" + | "trash" + | "users"; + +interface Icon { + name: iconsName; + image: any; + // image: React.FC +} + +export const iconList: Icon[] = [ + { image: arrowLeftIcon, name: "arrow-left" }, + { image: checkIcon, name: "check" }, + { image: checkboxOffIcon, name: "checkbox-off" }, + { image: checkboxOnIcon, name: "checkbox-on" }, + { image: closeIcon, name: "close" }, + { image: editIcon, name: "edit" }, + { image: eyeHiddenIcon, name: "eye-hidden" }, + { image: eyeIcon, name: "eye" }, + { image: homeIcon, name: "home" }, + { image: imageIcon, name: "image" }, + { image: infoIcon, name: "info" }, + { image: loadingIcon, name: "loading" }, + { image: logOffIcon, name: "log-off" }, + { image: menuIcon, name: "menu" }, + { image: minusIcon, name: "minus" }, + { image: orderIcon, name: "order" }, + { image: plusIcon, name: "plus" }, + { image: profileIcon, name: "profile" }, + { image: questionIcon, name: "question" }, + { image: radio1Icon, name: "radio-1" }, + { image: radioIcon, name: "radio" }, + { image: refreshIcon, name: "refresh" }, + { image: searchIcon, name: "search" }, + { image: trashIcon, name: "trash" }, + { image: usersIcon, name: "users" }, +]; diff --git a/src/components/Icon/index.tsx b/src/components/Icon/index.tsx new file mode 100644 index 0000000..eb0b657 --- /dev/null +++ b/src/components/Icon/index.tsx @@ -0,0 +1,41 @@ +import { SvgXml } from "react-native-svg"; + +import { iconList, iconsName } from "./icons"; + +import InfoIcon from "../../shared/assets/icons/info.svg"; + +interface IconProps { + icon: iconsName; + size?: number; + width?: number; + height?: number; + fillColor?: string; + strokeColor?: string; +} + +export function Icon({ + icon, + size, + width = 24, + height = 24, + strokeColor, + fillColor, +}: IconProps) { + function getIcon() { + const svgFile = iconList.find(item => item.name == icon); + + if (svgFile) return svgFile.image; + + return InfoIcon; + } + + return ( + + ); +} diff --git a/src/components/Icons/Info.tsx b/src/components/Icons/Info.tsx index 33194e1..17b7527 100644 --- a/src/components/Icons/Info.tsx +++ b/src/components/Icons/Info.tsx @@ -1,23 +1,23 @@ import { SvgXml } from "react-native-svg"; interface IconProps { - fillColor: string - strokeColor: string - size?: number - height?: number - width?: number + fillColor: string; + strokeColor: string; + size?: number; + height?: number; + width?: number; } -export function Info( - { - fillColor = "#666666", - strokeColor = "#666666", - size, - width = 24, - height = 24, - }: IconProps -) { - const markup = ` +export function Info({ + fillColor = "#666666", + strokeColor = "#666666", + size, + width = 24, + height = 24, +}: IconProps) { + const markup = ` diff --git a/src/components/Modal/index.tsx b/src/components/Modal/index.tsx index 51c930e..46c4fda 100644 --- a/src/components/Modal/index.tsx +++ b/src/components/Modal/index.tsx @@ -1,4 +1,4 @@ -import { isAndroid } from "@utils/checkPlatform"; +import { isAndroid } from "@constants"; import { ReactNode } from "react"; import { Modal as ReactNativeModal, TouchableOpacity } from "react-native"; import { Button } from "../Button"; @@ -39,9 +39,7 @@ export function Modal({ >
- - {title} - + {title} diff --git a/src/components/Modal/styles.ts b/src/components/Modal/styles.ts index c4b61e7..9ce7621 100644 --- a/src/components/Modal/styles.ts +++ b/src/components/Modal/styles.ts @@ -1,7 +1,7 @@ import { StatusBar } from "react-native"; import styled, { css } from "styled-components/native"; -import { isAndroid } from "@utils/checkPlatform"; +import { isAndroid } from "@constants"; export const Overlay = styled.KeyboardAvoidingView<{ isBottom: boolean }>` background: rgba(0, 0, 0, 0.6); diff --git a/src/components/index.ts b/src/components/index.ts index df69f76..6bffa79 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -8,6 +8,7 @@ import { Tabs } from "./Tabs"; import { Text } from "./Text"; // icons +import { Icon } from "./Icon"; import { CheckCircle } from "./Icons/CheckCircle"; import { Close } from "./Icons/Close"; import { Drop } from "./Icons/Drop"; @@ -30,6 +31,7 @@ export { Tabs, Text, // icons + Icon, Drop, PlusCircle, Close, diff --git a/src/routes/BottomTabs/index.tsx b/src/routes/BottomTabs/index.tsx index cb8c92d..9e3fe3c 100644 --- a/src/routes/BottomTabs/index.tsx +++ b/src/routes/BottomTabs/index.tsx @@ -1,29 +1,26 @@ import React from "react"; +import { RootStackParamList } from "@custom-types/rootStackParamList"; +import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; +import { + BottomTabDescriptorMap, + BottomTabNavigationEventMap, +} from "@react-navigation/bottom-tabs/lib/typescript/src/types"; import { NavigationHelpers, ParamListBase, StackActions, TabNavigationState, } from "@react-navigation/native"; - -import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; - -import { - BottomTabDescriptorMap, - BottomTabNavigationEventMap, -} from "@react-navigation/bottom-tabs/lib/typescript/src/types"; - -import StorageController from "@requests/StorageController"; -import { RootStackParamList } from "../../shared/types/rootStackParamList"; +import StorageController from "@utils/handlers/StorageController"; import { Home } from "@screens/Home"; -import { Partnerships } from "@screens/Partnerships"; import { Partnership } from "@screens/Partnership"; +import { Partnerships } from "@screens/Partnerships"; import { Container, Tab, TabIndicator } from "./styles"; -import { Home as HomeIcon, Profile, Order, Text } from "@components"; +import { Home as HomeIcon, Order, Profile, Text } from "@components"; interface TabBarProps { state: TabNavigationState; diff --git a/src/routes/CustomHeaderTitle/index.tsx b/src/routes/CustomHeaderTitle/index.tsx new file mode 100644 index 0000000..a513eed --- /dev/null +++ b/src/routes/CustomHeaderTitle/index.tsx @@ -0,0 +1,16 @@ +import React from "react"; + +import { useNavigation } from "@react-navigation/native"; + +import { Icon } from "@components"; +import { Container } from "./styles"; + +export function CustomHeaderTitle() { + const navigation = useNavigation(); + + return ( + + + + ); +} diff --git a/src/routes/CustomHeaderTitle/styles.ts b/src/routes/CustomHeaderTitle/styles.ts new file mode 100644 index 0000000..9449911 --- /dev/null +++ b/src/routes/CustomHeaderTitle/styles.ts @@ -0,0 +1,7 @@ +import { StatusBar } from "react-native"; +import styled from "styled-components/native"; +import { isAndroid } from "@constants"; + +export const Container = styled.TouchableOpacity` + margin-top: ${isAndroid ? `${StatusBar.currentHeight}px` : "0"}; +`; diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 83efb0c..0bb0c8e 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -4,25 +4,39 @@ import { NavigationContainer } from "@react-navigation/native"; import { createNativeStackNavigator } from "@react-navigation/native-stack"; -import { RootStackParamList } from "../shared/types/rootStackParamList"; +import { RootStackParamList } from "@custom-types/rootStackParamList"; import { SignIn } from "@screens/Auth/SignIn"; import { BottomTabs } from "@routes/BottomTabs"; +import { Partnership } from "@screens/Partnership"; + +import { Meeting } from "@screens/Meeting"; +import { CustomHeaderTitle } from "./CustomHeaderTitle"; const Stack = createNativeStackNavigator(); export function AppRoutes() { return ( - - - + + + + + + , + }} + > + + + ); diff --git a/src/screens/Auth/SignIn/index.tsx b/src/screens/Auth/SignIn/index.tsx index b58c5c6..7c42547 100644 --- a/src/screens/Auth/SignIn/index.tsx +++ b/src/screens/Auth/SignIn/index.tsx @@ -1,20 +1,23 @@ -import React, { useState, useEffect } from "react"; - -import { View } from "react-native"; -import { useForm, Controller, SubmitHandler } from "react-hook-form"; +import React, { useEffect, useState } from "react"; +import { + Button, + Eye, + EyeHidden, + Header, + Info, + Loading, + Text, +} from "@components"; +import { validEmailPattern } from "@constants"; +import { PropsStack } from "@custom-types/rootStackParamList"; +import { IUserLogin } from "@interfaces/user.interface"; import { StackActions, useNavigation } from "@react-navigation/native"; +import authRequest from "@requests/auth.request"; +import StorageController from "@utils/handlers/StorageController"; import { isAxiosError } from "axios"; - -import authRequest from "../../../shared/services/auth.request"; -import { IUserLogin } from "../../../shared/interfaces/user.interface"; -import { validEmailPattern } from "../../../shared/constants/validEmailPattern"; - -import StorageController from "../../../shared/utils/handlers/StorageController"; -import { PropsStack } from "../../../shared/types/rootStackParamList"; - -import { Button, Text, Info, EyeHidden, Eye, Loading } from "@components"; - +import { Controller, SubmitHandler, useForm } from "react-hook-form"; +import { View } from "react-native"; import { Container, Form, @@ -24,7 +27,6 @@ import { InputPassword, LoadingContainer, PasswordInputContainer, - TextContainer, TextInput, } from "./styles"; @@ -87,15 +89,7 @@ export function SignIn() {
- - - Bem vindo(a) ao - - - OWL - PARTNERS - - +
{isLoading && } diff --git a/src/screens/Auth/SignIn/styles.ts b/src/screens/Auth/SignIn/styles.ts index 93da106..c12e510 100644 --- a/src/screens/Auth/SignIn/styles.ts +++ b/src/screens/Auth/SignIn/styles.ts @@ -1,6 +1,6 @@ import styled from "styled-components/native"; -import { isIOS } from "@utils/checkPlatform"; +import { isIOS } from "@constants"; export const Container = styled.SafeAreaView` position: relative; @@ -9,7 +9,7 @@ export const Container = styled.SafeAreaView` `; export const FormContainer = styled.KeyboardAvoidingView.attrs({ - behavior: isIOS ? "padding" : "height" + behavior: isIOS ? "padding" : "height", })` flex: 1; padding: 32px 32px; @@ -17,12 +17,6 @@ export const FormContainer = styled.KeyboardAvoidingView.attrs({ justify-content: space-between; `; -export const TextContainer = styled.View` - align-items: center; - - height: 54px; -`; - export const Form = styled.View` flex: 1; justify-content: center; @@ -37,11 +31,11 @@ export const InfoErrorContainer = styled.View` flex-direction: row; gap: 4px; - align-items: center + align-items: center; `; export const PasswordInputContainer = styled.View<{ - borderColor?: string + borderColor?: string; }>` margin-top: 8px; @@ -53,12 +47,12 @@ export const PasswordInputContainer = styled.View<{ border: 1px solid; border-radius: 8px; - border-color: ${({borderColor}) => borderColor || "#cccccc"}; + border-color: ${({ borderColor }) => borderColor || "#cccccc"}; `; export const InputPassword = styled.TextInput.attrs({ placeholderTextColor: "#999999", - cursorColor: "#EF4444" + cursorColor: "#EF4444", })` padding-left: 8px; height: 100%; @@ -74,9 +68,9 @@ export const IconButton = styled.TouchableOpacity` export const TextInput = styled.TextInput.attrs({ placeholderTextColor: "#999999", - cursorColor: "#EF4444" + cursorColor: "#EF4444", })<{ - borderColor?: string + borderColor?: string; }>` margin-top: 8px; @@ -85,9 +79,9 @@ export const TextInput = styled.TextInput.attrs({ border: 1px solid; border-radius: 8px; - border-color: ${({borderColor}) => borderColor || "#cccccc"}; + border-color: ${({ borderColor }) => borderColor || "#cccccc"}; `; export const LoadingContainer = styled.View` - max-height: 60px -` + max-height: 60px; +`; diff --git a/src/screens/Home/AddMeetingModal/index.tsx b/src/screens/Home/AddMeetingModal/index.tsx new file mode 100644 index 0000000..fb9ee4b --- /dev/null +++ b/src/screens/Home/AddMeetingModal/index.tsx @@ -0,0 +1,105 @@ +import { Input, Modal, Text } from "@components"; +import { IPartnership } from "@interfaces/partner.interface"; +import { Picker } from "@react-native-picker/picker"; +import meetingRequest from "@requests/meeting.request"; +import partnershipRequests from "@requests/partnership.requests"; +import { formatDateISO } from "@utils/formatDateISO"; +import { useEffect, useState } from "react"; +import { ScrollView, View } from "react-native"; +import { PartnershipDropDownArea } from "./styles"; + +interface AddMeetingModalProps { + visible: boolean; + onClose: () => void; +} + +export function AddMeetingModal({ visible, onClose }: AddMeetingModalProps) { + const [partnership, setPartnership] = useState(""); + const [pickerFocused, setPickerFocused] = useState(false); + const [partnerships, setPartnerships] = useState([]); + + const [date, setDate] = useState(""); + const [hour, setHour] = useState(""); + const [theme, setTheme] = useState(""); + + const [isLoading, setIsLoading] = useState(false); + + async function getPartnerships() { + const data: IPartnership[] = await partnershipRequests.getPartnerships(); + setPartnerships(data); + } + + useEffect(() => { + getPartnerships(); + }, []); + + async function handleSubmit() { + setIsLoading(true); + await meetingRequest.createMeeting( + partnership, + formatDateISO(date, hour), + theme, + ); + setIsLoading(false); + onClose(); + } + + return ( + + + <> + Parceria + + setPartnership(itemValue)} + onFocus={() => setPickerFocused(true)} + onBlur={() => setPickerFocused(false)} + > + + {partnerships.map(option => { + return ( + + ); + })} + + + + + + } + /> + ); +} diff --git a/src/screens/Home/AddMeetingModal/styles.ts b/src/screens/Home/AddMeetingModal/styles.ts new file mode 100644 index 0000000..e632cd8 --- /dev/null +++ b/src/screens/Home/AddMeetingModal/styles.ts @@ -0,0 +1,17 @@ +import { StatusBar } from "react-native"; +import styled from "styled-components/native"; + +import { isAndroid } from "@constants"; + +export const Container = styled.SafeAreaView` + margin-top: ${isAndroid ? `${StatusBar.currentHeight}px` : "0"}; + flex: 1; + background: #f4f5f7; + padding: 24px 24px; +`; + +export const PartnershipDropDownArea = styled.View` + background: #f4f5f7; + border-radius: 8px; + border: 1px solid #cccccc; +`; diff --git a/src/screens/Home/index.tsx b/src/screens/Home/index.tsx index 151c15d..619a1f4 100644 --- a/src/screens/Home/index.tsx +++ b/src/screens/Home/index.tsx @@ -1,13 +1,40 @@ -import { Button, Header } from "@components"; -import { ButtonsContainer, Container } from "./styles"; +import { Button, Card, Header, Loading, Text } from "@components"; +import { PropsStack } from "@custom-types/rootStackParamList"; +import { IMeetingsHome } from "@interfaces/meeting.interface"; +import { useFocusEffect, useNavigation } from "@react-navigation/native"; +import meetingRequest from "@requests/meeting.request"; +import { formatDate } from "@utils/formatDate"; +import { formatTime } from "@utils/formatTime"; +import { useCallback, useState } from "react"; +import { View } from "react-native"; +import { AddMeetingModal } from "./AddMeetingModal"; +import { ButtonsContainer, Container, MeetingContainer } from "./styles"; export function Home() { + const [data, setData] = useState(); + const [isLoading, setIsLoading] = useState(true); + const [isAddMeetingModalOpen, setIsAddMeetingModalOpen] = useState(false); + const navigation = useNavigation(); + + async function getMeetings() { + setIsLoading(true); + const meeting: IMeetingsHome = await meetingRequest.getMeetings(); + setData(meeting); + setIsLoading(false); + } + + useFocusEffect( + useCallback(() => { + getMeetings(); + }, []), + ); + return (
- + + + <> + Proximas reuniões + {isLoading ? ( + + + + ) : ( + + {data?.upcomingMeetings.map( + ({ + id, + title, + description, + meetingDateTime, + Partner: { name, partnerId }, + }) => { + return ( + navigation.navigate("Meeting", { id })} + /> + ); + }, + )} + + )} + + + <> + Ultimas reuniões + {isLoading ? ( + + + + ) : ( + + {data?.pastMeetings.map( + ({ + id, + title, + description, + meetingDateTime, + Partner: { name, partnerId }, + }) => { + return ( + navigation.navigate("Meeting", { id })} + /> + ); + }, + )} + + )} + + + setIsAddMeetingModalOpen(false)} + /> +
); } diff --git a/src/screens/Home/styles.ts b/src/screens/Home/styles.ts index 35265d0..e01b9ec 100644 --- a/src/screens/Home/styles.ts +++ b/src/screens/Home/styles.ts @@ -1,7 +1,7 @@ import { StatusBar } from "react-native"; import styled from "styled-components/native"; -import { isAndroid } from "@utils/checkPlatform"; +import { isAndroid } from "@constants"; export const Container = styled.SafeAreaView` margin-top: ${isAndroid ? `${StatusBar.currentHeight}px` : "0"}; @@ -12,3 +12,7 @@ export const Container = styled.SafeAreaView` export const ButtonsContainer = styled.View` padding: 24px 24px; `; + +export const MeetingContainer = styled.ScrollView` + padding: 24px 24px; +`; diff --git a/src/screens/Meeting/AnnotationsList/index.tsx b/src/screens/Meeting/AnnotationsList/index.tsx new file mode 100644 index 0000000..82e3ec1 --- /dev/null +++ b/src/screens/Meeting/AnnotationsList/index.tsx @@ -0,0 +1,140 @@ +import { Card, Input, Loading, Modal, Text } from "@components"; +import { IComment } from "@interfaces/annotation.interface"; +import meetingRequest from "@requests/meeting.request"; +import { formatDate } from "@utils/formatDate"; +import { formatTime } from "@utils/formatTime"; +import StorageController from "@utils/handlers/StorageController"; +import { useEffect, useState } from "react"; +import { ScrollView, View } from "react-native"; + +interface AnnotationsListProps { + data?: IComment[]; + meetingId: string; +} + +export function AnnotationsList({ data, meetingId }: AnnotationsListProps) { + const [newComment, setNewComment] = useState(""); + const [isLoading, setIsLoading] = useState(true); + const [annotations, setAnnotations] = useState(data ?? []); + const [modalComment, setModalComment] = useState(); + const [isCommentModalOpen, setIsCommentModalOpen] = useState(false); + const [isEditCommentModalOpen, setIsEditCommentModalOpen] = useState(false); + const [editedComment, setEditedComment] = useState(""); + + async function getData() { + setIsLoading(true); + const comments = await meetingRequest.getMeetingComments(meetingId); + setAnnotations(comments); + setIsLoading(false); + } + + useEffect(() => { + getData(); + }, [meetingId]); + + async function handleAddComment() { + setIsLoading(true); + const user = await StorageController.getUserInfo(); + if (user) + await meetingRequest.createMeetingComment( + meetingId, + newComment, + user?.id, + ); + + const updatedComments = await meetingRequest.getMeetingComments(meetingId); + updatedComments && setAnnotations(updatedComments); + setNewComment(""); + setIsLoading(false); + } + + async function handleEditComment() { + setIsLoading(true); + await meetingRequest.updateMeetingComment(modalComment!.id, editedComment); + const updatedComments = await meetingRequest.getMeetingComments(meetingId); + updatedComments && setAnnotations(updatedComments); + setEditedComment(""); + setIsLoading(false); + setIsEditCommentModalOpen(false); + } + + return ( + + + ); +} diff --git a/src/screens/Meeting/index.tsx b/src/screens/Meeting/index.tsx new file mode 100644 index 0000000..0ed3d3e --- /dev/null +++ b/src/screens/Meeting/index.tsx @@ -0,0 +1,150 @@ +import { Button, Header, Input, Loading, Modal, Text } from "@components"; +import { + PropsStack, + RootStackParamList, +} from "@custom-types/rootStackParamList"; +import { IMeeting } from "@interfaces/meeting.interface"; +import { RouteProp, useNavigation, useRoute } from "@react-navigation/native"; +import meetingRequest from "@requests/meeting.request"; +import { formatDate } from "@utils/formatDate"; +import { formatDateISO } from "@utils/formatDateISO"; +import { formatTime } from "@utils/formatTime"; +import { useEffect, useState } from "react"; +import { View } from "react-native"; +import { AnnotationsList } from "./AnnotationsList"; +import { + AnnotationsListContainer, + ButtonsContainer, + Container, + InfoCardContainer, + InfoContainer, + ModalContent, +} from "./styles"; + +export function Meeting() { + const [data, setData] = useState(); + const [isLoading, setIsLoading] = useState(true); + const [updatedMeetingDate, setUpdatedMeetingDate] = useState(""); + const [updatedMeetingHour, setUpdatedMeetingHour] = useState(""); + const [updatedMeetingTheme, setUpdatedMeetingTheme] = useState(""); + const [isEditModalOpen, setIsEditModalOpen] = useState(false); + const [isLoadingDelete, setIsLoadingDelete] = useState(false); + const navigation = useNavigation(); + + const route = useRoute>(); + const { id } = route.params; + + async function getData() { + setIsLoading(true); + const meetingData: IMeeting = await meetingRequest.getMeeting(id); + setData(meetingData); + setUpdatedMeetingDate(formatDate(meetingData.meetingDateTime)); + setUpdatedMeetingHour(formatTime(meetingData.meetingDateTime)); + setUpdatedMeetingTheme(meetingData.title); + setIsLoading(false); + } + + useEffect(() => { + getData(); + }, [id]); + + async function handleDeleteMeeting() { + setIsLoadingDelete(true); + await meetingRequest.deleteMeeting(id); + setIsLoadingDelete(false); + navigation.navigate("Home"); + } + + async function handleUpdateMeeting() { + setIsLoading(true); + await meetingRequest.updateMeeting( + id, + formatDateISO(updatedMeetingDate, updatedMeetingHour), + updatedMeetingTheme, + ); + getData(); + setIsLoading(false); + setIsEditModalOpen(false); + } + + return ( + + +
+ + {isLoading ? ( + + + + ) : ( + + <> + Informações da reunião + + {data && ( + + + {data.Partner.name} |{" "} + + {data.title} + + + + Agendada para {formatDate(data.meetingDateTime)} às{" "} + {formatTime(data.meetingDateTime)} + + + )} + + )} + + + + + + + + + + + setIsEditModalOpen(false)} + title={"Editar reunião"} + buttonTitle="Editar reunião" + onPressButton={handleUpdateMeeting} + isLoading={isLoading} + content={ + + {data && ( + <> + + } + /> +
+ ); +} diff --git a/src/screens/Meeting/styles.ts b/src/screens/Meeting/styles.ts new file mode 100644 index 0000000..6a43107 --- /dev/null +++ b/src/screens/Meeting/styles.ts @@ -0,0 +1,53 @@ +import { StatusBar } from "react-native"; +import styled from "styled-components/native"; + +import { isAndroid } from "@constants"; + +export const Container = styled.SafeAreaView` + margin-top: ${isAndroid ? `${StatusBar.currentHeight}px` : "0"}; + flex: 1; + background: #f4f5f7; +`; + +export const ButtonsContainer = styled.View` + padding: 12px 24px; +`; + +export const AnnotationsListContainer = styled.View` + padding: 24px 24px; + flex: 1; +`; + +export const ModalContent = styled.View` + gap: 8px; +`; + +export const ListContainer = styled.ScrollView``; + +export const LoadingContainer = styled.View` + margin-top: 24px; +`; + +export const TextInput = styled.TextInput` + background: #f4f5f7; + padding: 0px 16px; + border-radius: 8px; + border: 1px solid #cccccc; + align-items: center; + justify-content: center; + width: 345px; + height: 56px; +`; + +export const InfoContainer = styled.View` + padding: 24px 24px; + gap: 10px; +`; + +export const InfoCardContainer = styled.View` + background: #ffffff; + border-radius: 8px; + padding: 24px; + gap: 8px; + justify-content: center; +`; diff --git a/src/screens/Partnership/AnnotationsList/index.tsx b/src/screens/Partnership/AnnotationsList/index.tsx new file mode 100644 index 0000000..c2243cd --- /dev/null +++ b/src/screens/Partnership/AnnotationsList/index.tsx @@ -0,0 +1,145 @@ +import { Card, Input, Loading, Modal, Text } from "@components"; +import { RootStackParamList } from "@custom-types/rootStackParamList"; +import { IComment } from "@interfaces/annotation.interface"; +import { RouteProp, useRoute } from "@react-navigation/native"; +import annotationRequests from "@requests/annotation.requests"; +import { formatDate } from "@utils/formatDate"; +import { formatTime } from "@utils/formatTime"; +import { useEffect, useState } from "react"; +import { ScrollView, View } from "react-native"; + +interface AnnotationsListyProps { + isPartnershipDisabled: boolean; +} + +export function AnnotationsList({ + isPartnershipDisabled, +}: AnnotationsListyProps) { + const [newComment, setNewComment] = useState(""); + const [isLoading, setIsLoading] = useState(true); + const [annotations, setAnnotations] = useState(); + const [modalComment, setModalComment] = useState(); + const [isCommentModalOpen, setIsCommentModalOpen] = useState(false); + const [isEditCommentModalOpen, setIsEditCommentModalOpen] = useState(false); + const [editedComment, setEditedComment] = useState(""); + const route = useRoute>(); + + const { id } = route.params; + + async function getData() { + setIsLoading(true); + const comments = await annotationRequests.getAnnotations(id); + setAnnotations(comments); + setIsLoading(false); + } + + useEffect(() => { + getData(); + }, [id]); + + async function handleAddComment() { + setIsLoading(true); + await annotationRequests.createAnnotation(id, newComment); + const updatedComments = await annotationRequests.getAnnotations(id); + updatedComments && setAnnotations(updatedComments); + setNewComment(""); + setIsLoading(false); + } + + async function handleEditComment() { + setIsLoading(true); + await annotationRequests.updateAnnotation( + modalComment?.id ?? "", + id, + editedComment, + ); + const updatedComments = await annotationRequests.getAnnotations(id); + updatedComments && setAnnotations(updatedComments); + setEditedComment(""); + setIsLoading(false); + setIsEditCommentModalOpen(false); + } + + return ( + + {!isPartnershipDisabled && ( + + ); +} diff --git a/src/screens/Partnership/EditPartnershipModal/index.tsx b/src/screens/Partnership/EditPartnershipModal/index.tsx new file mode 100644 index 0000000..bde47ef --- /dev/null +++ b/src/screens/Partnership/EditPartnershipModal/index.tsx @@ -0,0 +1,314 @@ +import { Icon, Modal, Text } from "@components"; +import { + ClassificationSelectOptions, + stateSelectOptions, + statusSelectOptions, +} from "@constants"; +import { + IModalPropsEdit, + IPartnershipEdit, +} from "@interfaces/partner.interface"; +import { Picker } from "@react-native-picker/picker"; +import partnershipRequests from "@requests/partnership.requests"; +import { useEffect, useState } from "react"; +import { Controller, SubmitHandler, useForm } from "react-hook-form"; +import { ScrollView, TouchableOpacity } from "react-native"; +import { AddPartnerView, Container, SelectArea, TextInput } from "./styles"; +import { getPartnerStatusEnumByValue } from "@utils/handlers/formatEnumsPartner"; + +export function EditPartnershipModal({ + visible, + onClose, + closeAfterUpdate, + partnerProps, +}: IModalPropsEdit) { + const { + control, + setValue, + handleSubmit, + formState: { errors }, + } = useForm({ + mode: "onChange", + defaultValues: partnerProps, + }); + + const [isLoading, setIsLoading] = useState(false); + + const [selectStatus, setSelectStatus] = useState(""); + const [selectStates, setSelectStates] = useState(""); + const [selectClassification, setSelectClassification] = useState(""); + + const onSubmit: SubmitHandler = async payload => { + const data = { + memberNumber: Number(payload.memberNumber), + address: payload.address, + city: payload.city, + classification: payload.classification, + email: payload.email, + name: payload.name, + neighborhood: payload.neighborhood, + phoneNumber: payload.phoneNumber, + state: payload.state, + status: payload.status, + zipCode: payload.zipCode, + }; + try { + setIsLoading(true); + await partnershipRequests.updatePartnership(data, partnerProps.id); + } catch (error) { + console.error(error); + } + setIsLoading(false); + closeAfterUpdate(); + }; + + useEffect(() => { + if (partnerProps) { + setValue("name", partnerProps["name"]); + setValue("email", partnerProps["email"]); + setValue("phoneNumber", partnerProps["phoneNumber"]); + setValue("zipCode", partnerProps["zipCode"]); + setValue("state", partnerProps["state"]); + setValue("city", partnerProps["city"]); + setValue("neighborhood", partnerProps["neighborhood"]); + setValue("address", partnerProps["address"]); + setValue("classification", partnerProps["classification"]); + setValue("memberNumber", partnerProps["memberNumber"]); + + const partnerStatus = + getPartnerStatusEnumByValue(partnerProps["status"])?.statusKey ?? + partnerProps["status"]; + setValue("status", partnerStatus); + } + }, [partnerProps]); + + return ( + + + + Editar parceria + + + + + + Informações gerais + + ( + <> + Parceria + + {errors.name && Este campo é obrigatório} + + )} + /> + + ( + <> + E-mail + + + )} + /> + + ( + <> + Classificação + + { + setSelectClassification(itemValue), + field.onChange(itemValue); + }} + > + {Object.keys(ClassificationSelectOptions).map( + classification => { + return ( + + ); + }, + )} + + + + )} + /> + + ( + <> + Status + + { + setSelectStatus(itemValue), field.onChange(itemValue); + }} + > + {statusSelectOptions.map(status => { + return ( + + ); + })} + + + {errors.status && Este campo é obrigatório} + + )} + /> + + ( + <> + Estado + + { + setSelectStates(itemValue), field.onChange(itemValue); + }} + > + {stateSelectOptions.map(state => { + return ( + + ); + })} + + + + )} + /> + + ( + <> + Cidade + + + )} + /> + + ( + <> + CEP + + + )} + /> + + ( + <> + Endereço + + + )} + /> + + ( + <> + Número de membros + + + )} + /> + + ( + <> + Telefone + + + )} + /> + + + } + /> + ); +} diff --git a/src/screens/PartnershipForm/styles.ts b/src/screens/Partnership/EditPartnershipModal/styles.ts similarity index 59% rename from src/screens/PartnershipForm/styles.ts rename to src/screens/Partnership/EditPartnershipModal/styles.ts index 1770a44..bec928a 100644 --- a/src/screens/PartnershipForm/styles.ts +++ b/src/screens/Partnership/EditPartnershipModal/styles.ts @@ -1,13 +1,11 @@ import { StatusBar } from "react-native"; import styled from "styled-components/native"; -import { isAndroid } from "@utils/checkPlatform"; +import { isAndroid } from "@constants"; export const Container = styled.SafeAreaView` margin-top: ${isAndroid ? `${StatusBar.currentHeight}px` : "0"}; - flex: 1; - background: #f4f5f7; - padding: 24px 24px; + gap: 10px; `; export const TextInput = styled.TextInput` @@ -22,10 +20,7 @@ export const TextInput = styled.TextInput` `; export const AddPartnerView = styled.View` - justify-content: "space-between"; - flex-direction: "row"; - gap: 140.25px; - margin-bottom: 24px; + margin-bottom: 15px; `; export const StatusView = styled.View` @@ -36,24 +31,14 @@ export const StatusView = styled.View` align-items: center; width: 345px; height: 56px; -`; -export const DropDowArea = styled.View` - width: 100%; - height: 450px; - border-radius: 10px; - margin-top: 15px; - background-color: #fff; - elevation: 3; - align-self: center; - margin-bottom: 10px; + justify-content: "space-between"; + flex-direction: "row"; + gap: 140.25; `; -export const StatusTypeText = styled.Text` - width: 85%; - height: 40px; - border-bottom-width: 0.2px; - border-bottom-color: #8e8e8e; - align-self: center; - justify-content: center; +export const SelectArea = styled.View` + background: #f4f5f7; + border-radius: 8px; + border: 1px solid #cccccc; `; diff --git a/src/screens/Partnership/MeetingsList/index.tsx b/src/screens/Partnership/MeetingsList/index.tsx new file mode 100644 index 0000000..cc4d5ea --- /dev/null +++ b/src/screens/Partnership/MeetingsList/index.tsx @@ -0,0 +1,119 @@ +import { Card, Loading, Text } from "@components"; +import { PropsStack } from "@custom-types/rootStackParamList"; +import { IMeetingsHome } from "@interfaces/meeting.interface"; +import { IPartnership } from "@interfaces/partner.interface"; +import { useNavigation } from "@react-navigation/native"; +import meetingRequest from "@requests/meeting.request"; +import { formatDate } from "@utils/formatDate"; +import { formatTime } from "@utils/formatTime"; +import { useEffect, useState } from "react"; +import { ScrollView, View } from "react-native"; + +interface MeetingListyProps { + partnershipId: string; + isPartnershipDisabled: boolean; + partnerProps: IPartnership; +} + +export function MeetingsList({ + partnershipId, + isPartnershipDisabled, + partnerProps, +}: MeetingListyProps) { + const [data, setData] = useState(); + const [isLoading, setIsLoading] = useState(true); + const navigation = useNavigation(); + + async function getMeetings() { + setIsLoading(true); + const meeting: IMeetingsHome = await meetingRequest.getPartnerMeetigs( + partnershipId, + ); + setData(meeting); + setIsLoading(false); + } + + useEffect(() => { + getMeetings(); + }, [partnershipId]); + + return ( + + {isLoading ? ( + + + + ) : data?.upcomingMeetings?.length === 0 ? ( + + Não há proximas reuniões + + ) : ( + <> + Proximas reuniões + + {data?.upcomingMeetings.map( + ({ id, title, description, meetingDateTime }) => { + return ( + navigation.navigate("Meeting", { id })} + /> + ); + }, + )} + + + )} + + {isLoading ? ( + + + + ) : data?.pastMeetings?.length === 0 ? ( + + Não há reuniões passadas + + ) : ( + <> + Ultimas reuniões + + {data?.pastMeetings.map( + ({ id, title, description, meetingDateTime }) => { + return ( + navigation.navigate("Meeting", { id })} + /> + ); + }, + )} + + + )} + + ); +} diff --git a/src/screens/Partnership/index.tsx b/src/screens/Partnership/index.tsx index 2c71a65..0f6e117 100644 --- a/src/screens/Partnership/index.tsx +++ b/src/screens/Partnership/index.tsx @@ -1,249 +1,161 @@ -import { - Button, - Card, - Header, - Input, - Loading, - Modal, - Tabs, - Text, -} from "@components"; -import { IComment } from "@interfaces/annotation.interface"; +import { Button, Header, Tabs, Text } from "@components"; +import { RootStackParamList } from "@custom-types/rootStackParamList"; import { IPartnership } from "@interfaces/partner.interface"; -import { useRoute } from "@react-navigation/native"; -import AnnotationController from "@requests/AnnotationController"; -import PartnershipController from "@requests/PartnershipController"; -import { formatDate } from "@utils/formatDate"; -import { formatTime } from "@utils/formatTime"; +import { RouteProp, useRoute } from "@react-navigation/native"; +import partnershipRequests from "@requests/partnership.requests"; import { useEffect, useState } from "react"; +import { ScrollView, View } from "react-native"; +import { AnnotationsList } from "./AnnotationsList"; +import { EditPartnershipModal } from "./EditPartnershipModal"; +import { MeetingsList } from "./MeetingsList"; import { ButtonsContainer, + ContactView, Container, HistoryContainer, - ListContainer, - LoadingContainer, + InformationView, + PartnerInfoView, } from "./styles"; export function Partnership() { const [tab, setTab] = useState(0); + const [visibleEditModal, setVisibleEditModal] = useState(false); const [data, setData] = useState(); const [isLoading, setIsLoading] = useState(true); - const { - params: { partnershipId }, - } = useRoute< - Readonly<{ - key: string; - name: string; - params: { partnershipId: string }; - }> - >(); + const [isPartnerDisable, setIsPartnerDisable] = useState(false); - async function getData() { - setIsLoading(true); - const partnershipData = await PartnershipController.getPartnership( - partnershipId, - ); - setData(partnershipData); - setIsLoading(false); - } + const route = useRoute>(); - useEffect(() => { - getData(); - }, [partnershipId]); + const { id } = route.params; - async function handleDeletePartnership() { - await PartnershipController.deletePartnership(partnershipId); - getData(); - } - - function handleUpdatePartnership() { - // PartnershipController.updatePartnership(); - alert("Parceria editada!"); - } - - return ( - -
- - {data?.disabled ? ( - - Essa parceria foi deletada e, portanto, não pode ser atualizada. - - ) : ( - - - - - )} - - - setTab(tab)} /> - - {tab === 0 ? ( - - ) : ( - - )} - -
- ); -} - -interface HistoryProps { - isDisabled: boolean; -} - -function History({ isDisabled }: HistoryProps) { - const [newComment, setNewComment] = useState(""); - const [isLoading, setIsLoading] = useState(true); - const [annotations, setAnnotations] = useState(); - const [modalComment, setModalComment] = useState(); - const [isCommentModalOpen, setIsCommentModalOpen] = useState(false); - const [isEditCommentModalOpen, setIsEditCommentModalOpen] = useState(false); - const [editedComment, setEditedComment] = useState(""); - const { - params: { partnershipId }, - } = - useRoute< - Readonly<{ key: string; name: string; params: { partnershipId: string } }> - >(); - - async function getData() { + async function getPartnerships() { setIsLoading(true); - const comments = await AnnotationController.getAnnotations(partnershipId); - setAnnotations(comments); + const partnerships = await partnershipRequests.getPartnership(id); + setData(partnerships); setIsLoading(false); } useEffect(() => { - getData(); - }, [partnershipId]); + getPartnerships(); + }, []); - async function handleAddComment() { - setIsLoading(true); - await AnnotationController.createAnnotation(partnershipId, newComment); - const updatedComments = await AnnotationController.getAnnotations( - partnershipId, - ); - updatedComments && setAnnotations(updatedComments); - setNewComment(""); - setIsLoading(false); + function handleCloseEditModal() { + getPartnerships(); + setVisibleEditModal(false); } - async function handleEditComment() { - setIsLoading(true); - await AnnotationController.updateAnnotation( - modalComment?.id ?? "", - partnershipId, - editedComment, - ); - const updatedComments = await AnnotationController.getAnnotations( - partnershipId, - ); - updatedComments && setAnnotations(updatedComments); - setEditedComment(""); - setIsLoading(false); - setIsEditCommentModalOpen(false); + async function handleDeletePartnership() { + await partnershipRequests.deletePartnership(id); + getPartnerships(); } return ( - - {!isDisabled && ( - + )} + + + + setTab(tab)} /> + {tab === 0 ? ( + + ) : ( + data && ( + + ) + )} + + +
); } - -function MeetingList() { - return Em breve...; -} diff --git a/src/screens/Partnership/styles.ts b/src/screens/Partnership/styles.ts index 8cbe513..5fab410 100644 --- a/src/screens/Partnership/styles.ts +++ b/src/screens/Partnership/styles.ts @@ -1,12 +1,12 @@ -import { StatusBar } from "react-native"; import styled from "styled-components/native"; -import { isAndroid } from "@utils/checkPlatform"; +import { isAndroid } from "@constants"; export const Container = styled.SafeAreaView` - margin-top: ${isAndroid ? `${StatusBar.currentHeight}px` : "0"}; + padding-top: ${isAndroid ? "60px" : "0"}; flex: 1; background: #f4f5f7; + gap: 10px; `; export const ButtonsContainer = styled.View` @@ -18,12 +18,6 @@ export const HistoryContainer = styled.View` flex: 1; `; -export const ListContainer = styled.ScrollView``; - -export const LoadingContainer = styled.View` - margin-top: 24px; -`; - export const TextInput = styled.TextInput` background: #f4f5f7; padding: 0px 16px; @@ -34,3 +28,28 @@ export const TextInput = styled.TextInput` width: 345px; height: 56px; `; + +export const InformationView = styled.View` + background: #ffffff; + border-radius: 8px; + padding: 24px; + gap: 8px; + width: 345px; + height: 160px; + justify-content: center; +`; + +export const ContactView = styled.View` + background: #ffffff; + border-radius: 8px; + padding: 24px; + gap: 8px; + width: 345px; + height: 123px; + justify-content: center; +`; + +export const PartnerInfoView = styled.View` + padding: 24px 24px; + gap: 10px; +`; diff --git a/src/screens/PartnershipEdit/index.tsx b/src/screens/PartnershipEdit/index.tsx deleted file mode 100644 index bd7d999..0000000 --- a/src/screens/PartnershipEdit/index.tsx +++ /dev/null @@ -1,266 +0,0 @@ -import { Button, Close, Drop, Text } from "@components"; -import { Modal, ScrollView, TouchableOpacity, View } from "react-native"; -import { - AddPartnerView, - Container, - DropDowArea, - StatusTypeText, - StatusView, - TextInput, -} from "./styles"; -import { useForm, Controller } from "react-hook-form"; -import { useEffect, useState } from "react"; - -type formDataProps = { - name: string; - classification: string; - state: string; - address: string; - memberNumber: number; - email: string; - phoneNumber: string; - status: string; -}; - -interface ModalProps { - visible: boolean; - onClose: () => void; -} - -const statusSelectOptions = [ - { id: 1, description: "Em prospecção" }, - { id: 2, description: "Primeiro contato feito" }, - { id: 3, description: "Primeira reunião marcada/realizada" }, - { id: 4, description: "Documentação enviada/em análise (Parceiro)" }, - { id: 5, description: "Documentação devolvida (Academy)" }, - { id: 6, description: "Documentação devolvida (Legal)" }, - { id: 7, description: "Documentação Analisada e devolvida (Parceiro)" }, - { id: 8, description: "Preparação de Executive Sumary (Academy)" }, - { id: 9, description: "ES em analise (Legal)" }, - { id: 10, description: "ES em analise (Academy Global)" }, - { id: 11, description: "Pronto para assinatura, Parceria Firmada" }, -]; - -export function PartnershipEdit({ visible, onClose }: ModalProps) { - const { - control, - handleSubmit, - formState: { errors }, - } = useForm({ - mode: "onChange", - defaultValues: async () => { - const result = await fetch( - "https://owlpartners.onrender.com/partners/d65d3f16-ead4-4b4b-a3ce-84b9ddf20a51" - ).then(res => res.json()); - return result; - }, - }); - - const [isStatusSelectOpen, setisStatusSelectOpen] = useState(false); - const [selectStatus, setSelecteStatus] = useState(""); - - // useEffect(() => { - // console.log('requisição'); - // setSelecteStatus('Primeiro contato feito'); - // }, []) - - async function hendlerPartnershipForm(statusSelectOptions: formDataProps) { - console.log(statusSelectOptions); - onClose(); - } - - function handlerStatusPartenerSelected(statusSelectOptions: { - description: string; - }) { - setSelecteStatus(statusSelectOptions.description); - setisStatusSelectOpen(false); - } - - return ( - - - - Editar parceria - - - - - - - - Informações gerais - - ( - - Parceria - - - )} - /> - - ( - - Classificação - - - )} - /> - - ( - - Localização - - - )} - /> - - ( - - Endereço - - - )} - /> - - ( - - Número de membros - - - )} - /> - - ( - - E-mail - - - )} - /> - - ( - - Telefone - - - )} - /> - - ( - - Status - { - setisStatusSelectOpen(!isStatusSelectOpen); - }} - > - - {selectStatus} - - - - - {isStatusSelectOpen ? ( - - {statusSelectOptions.map(status => { - return ( - - { - handlerStatusPartenerSelected(status); - field.onChange(status.description); - }} - > - {status.description} - - - ); - })} - - ) : null} - - {errors && Este campo é obrigatório} - - )} - /> - - - - - - - - - ); -} diff --git a/src/screens/PartnershipForm/index.tsx b/src/screens/PartnershipForm/index.tsx deleted file mode 100644 index 3b0d65b..0000000 --- a/src/screens/PartnershipForm/index.tsx +++ /dev/null @@ -1,250 +0,0 @@ -import { Button, Close, Drop, Text } from "@components"; -import { useState } from "react"; -import { Controller, useForm } from "react-hook-form"; -import { Modal, ScrollView, TouchableOpacity, View } from "react-native"; -import { - AddPartnerView, - Container, - DropDowArea, - StatusTypeText, - StatusView, - TextInput, -} from "./styles"; - -type formDataProps = { - partner: string; - classification: string; - location: string; - address: string; - membersQuantity: string; - email: string; - phoneNumber: string; - status: string; -}; - -interface ModalProps { - visible: boolean; - onClose: () => void; -} - -const statusSelectOptions = [ - { id: 1, description: "Em prospecção" }, - { id: 2, description: "Primeiro contato feito" }, - { id: 3, description: "Primeira reunião marcada/realizada" }, - { id: 4, description: "Documentação enviada/em análise (Parceiro)" }, - { id: 5, description: "Documentação devolvida (Academy)" }, - { id: 6, description: "Documentação devolvida (Legal)" }, - { id: 7, description: "Documentação Analisada e devolvida (Parceiro)" }, - { id: 8, description: "Preparação de Executive Sumary (Academy)" }, - { id: 9, description: "ES em analise (Legal)" }, - { id: 10, description: "ES em analise (Academy Global)" }, - { id: 11, description: "Pronto para assinatura, Parceria Firmada" }, -]; - -export function PartnershipForm({ visible, onClose }: ModalProps) { - const { - control, - handleSubmit, - formState: { errors }, - } = useForm(); - const [selectStatus, setSelecteStatus] = useState(""); - const [isStatusSelectOpen, setisStatusSelectOpen] = useState(false); - - function hendlerPartnershipForm(statusSelectOptions: formDataProps) { - console.log(statusSelectOptions); - onClose(); - } - - function handlerStatusPartenerSelected(statusSelectOptions: { - description: string; - }) { - setSelecteStatus(statusSelectOptions.description); - setisStatusSelectOpen(false); - } - - return ( - - - - Adicionar nova parceria - - - - - - - - Informações gerais - - ( - - Parceria - - {errors.partner && Este campo é obrigatório} - - )} - /> - - ( - - Classificação - - - )} - /> - - ( - - Localização - - - )} - /> - - ( - - Endereço - - - )} - /> - - ( - - Número de membros - - - )} - /> - - ( - - E-mail - - - )} - /> - - ( - - Telefone - - - )} - /> - - ( - - Status - { - setisStatusSelectOpen(!isStatusSelectOpen); - }} - > - - {selectStatus} - - - - - {isStatusSelectOpen ? ( - - {statusSelectOptions.map(status => { - return ( - - { - handlerStatusPartenerSelected(status), - onChange(status.description); - }} - > - {status.description} - - - ); - })} - - ) : null} - - {errors.partner && Este campo é obrigatório} - - )} - /> - - - - - - - - - ); -} diff --git a/src/screens/PartnershipInformation/index.tsx b/src/screens/PartnershipInformation/index.tsx deleted file mode 100644 index 944de46..0000000 --- a/src/screens/PartnershipInformation/index.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { Button, Header, Text } from "@components"; -import { PartnershipEdit } from "@screens/PartnershipEdit"; -import { useState } from "react"; -import { View } from "react-native"; -import { ContactView, Container, InformationView } from "./styles"; - -const partner = { - partner: "USP", - classification: "Universidade", - location: "São Paulo, Brasil", - address: "Rua 10, 123", - membersQuantity: "100", - email: "usp@gmail.com", - phoneNumber: "(12)99464-4356", - status: "Em prospecção", -}; - -export function PartnershipInformation() { - const [visibleModal, setVisibleModal] = useState(false); - return ( - -
- - Informação da parceria - - - - - {partner.classification} | {partner.partner} - - Status: {partner.status} - Quantidade de menbros: {partner.membersQuantity} - Localização: {partner.location} - - - - E-mail: {partner.email} - Telefone: {partner.phoneNumber} - - - - - setVisibleModal(false)} - /> -
- ); -} diff --git a/src/screens/PartnershipInformation/styles.ts b/src/screens/PartnershipInformation/styles.ts deleted file mode 100644 index ef2e80c..0000000 --- a/src/screens/PartnershipInformation/styles.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { StatusBar } from "react-native"; -import styled from "styled-components/native"; - -import { isAndroid } from "@utils/checkPlatform"; - -export const Container = styled.SafeAreaView` - margin-top: ${isAndroid ? `${StatusBar.currentHeight}px` : "0"}; - flex: 1; - background: #f4f5f7; - padding: 24px 24px; - gap: 10px; -`; - -export const InformationView = styled.View` - background: #ffffff; - border-radius: 8px; - padding: 24px; - gap: 8px; - width: 345px; - height: 152px; -`; - -export const ContactView = styled.View` - background: #ffffff; - border-radius: 8px; - padding: 24px; - gap: 8px; - width: 345px; - height: 123px; -`; diff --git a/src/screens/Partnerships/AddPartnershipModal/index.tsx b/src/screens/Partnerships/AddPartnershipModal/index.tsx new file mode 100644 index 0000000..936b5ae --- /dev/null +++ b/src/screens/Partnerships/AddPartnershipModal/index.tsx @@ -0,0 +1,284 @@ +import { Drop, Modal, Text } from "@components"; +import { + ClassificationSelectOptions, + stateSelectOptions, + statusSelectOptions, +} from "@constants"; +import { IModalPropsForm, IPartnership } from "@interfaces/partner.interface"; +import partnershipRequests from "@requests/partnership.requests"; +import { Key, useState } from "react"; +import { Controller, SubmitHandler, useForm } from "react-hook-form"; +import { ScrollView, View } from "react-native"; +import { Picker } from "@react-native-picker/picker"; +import { + ClassicationDropDownArea, + Container, + StateDropDowArea, + StatusDropDowArea, + TextInput, +} from "./styles"; + +export function AddPartnershipModal({ + visible, + onClose, + closeAfterUpdate, +}: IModalPropsForm) { + const { + control, + handleSubmit, + formState: { errors }, + } = useForm(); + + const [selectStatus, setSelectStatus] = useState(""); + const [selectStates, setSelectStates] = useState(""); + const [selectClassification, setSelectClassification] = useState(""); + + const [isLoading, setIsLoading] = useState(false); + const [pickerFocused, setPickerFocused] = useState(false); + + const onSubmit: SubmitHandler = async payload => { + const data = { + ...payload, + memberNumber: Number(payload.memberNumber), + }; + + try { + setIsLoading(true); + await partnershipRequests.createPartnership(data); + } catch (error) { + console.error(error); + } + setIsLoading(false); + closeAfterUpdate(); + }; + + return ( + + + Informações gerais + + ( + <> + Parceria + + {errors.name && Este campo é obrigatório} + + )} + /> + + ( + <> + E-mail + + + )} + /> + + ( + <> + Classificação + + { + setSelectClassification(itemValue), onChange(itemValue); + }} + onFocus={() => setPickerFocused(true)} + onBlur={() => setPickerFocused(false)} + > + + + {Object.keys(ClassificationSelectOptions).map( + classification => { + return ( + + ); + }, + )} + + + + )} + /> + + ( + <> + Status + + { + setSelectStatus(itemValue), onChange(itemValue); + }} + > + + + {statusSelectOptions.map(status => { + return ( + + ); + })} + + + {errors.status && Este campo é obrigatório} + + )} + /> + + ( + + Estado + + { + setSelectStates(itemValue), onChange(itemValue); + }} + > + + + {stateSelectOptions.map(state => { + return ( + + ); + })} + + + + )} + /> + + ( + <> + Cidade + + + )} + /> + + ( + <> + CEP + + + )} + /> + + ( + <> + Endereço + + + )} + /> + + ( + <> + Número de membros + + + )} + /> + + ( + <> + Telefone + + + )} + /> + + + } + /> + ); +} diff --git a/src/screens/PartnershipEdit/styles.ts b/src/screens/Partnerships/AddPartnershipModal/styles.ts similarity index 54% rename from src/screens/PartnershipEdit/styles.ts rename to src/screens/Partnerships/AddPartnershipModal/styles.ts index 532de46..d905102 100644 --- a/src/screens/PartnershipEdit/styles.ts +++ b/src/screens/Partnerships/AddPartnershipModal/styles.ts @@ -1,7 +1,7 @@ import { StatusBar } from "react-native"; import styled from "styled-components/native"; -import { isAndroid } from "@utils/checkPlatform"; +import { isAndroid } from "@constants"; export const Container = styled.SafeAreaView` margin-top: ${isAndroid ? `${StatusBar.currentHeight}px` : "0"}; @@ -22,36 +22,26 @@ export const TextInput = styled.TextInput` `; export const AddPartnerView = styled.View` + justify-content: "space-between"; + flex-direction: "row"; gap: 140.25px; margin-bottom: 24px; `; -export const StatusView = styled.View` +export const ClassicationDropDownArea = styled.View` background: #f4f5f7; - padding: 0px 16px; border-radius: 8px; border: 1px solid #cccccc; - align-items: center; - width: 345px; - height: 56px; `; -export const DropDowArea = styled.View` - width: 100%; - height: 450px; - border-radius: 10px; - margin-top: 15px; - background-color: #fff; - elevation: 3; - align-self: center; - margin-bottom: 10px; +export const StatusDropDowArea = styled.View` + background: #f4f5f7; + border-radius: 8px; + border: 1px solid #cccccc; `; -export const StatusTypeText = styled.Text` - width: 85%; - height: 40px; - border-bottom-width: 0.2px; - border-bottom-color: #8e8e8e; - align-self: center; - justify-content: center; +export const StateDropDowArea = styled.View` + background: #f4f5f7; + border-radius: 8px; + border: 1px solid #cccccc; `; diff --git a/src/screens/Partnerships/index.tsx b/src/screens/Partnerships/index.tsx index d1aeedf..a2bc9ee 100644 --- a/src/screens/Partnerships/index.tsx +++ b/src/screens/Partnerships/index.tsx @@ -1,9 +1,11 @@ -import { Button, Header, Loading, Tabs, Text } from "@components"; +import { Button, Header, Input, Loading, Tabs, Text } from "@components"; +import { PropsStack } from "@custom-types/rootStackParamList"; import { IPartnership } from "@interfaces/partner.interface"; import { useNavigation } from "@react-navigation/native"; -import { PartnershipForm } from "@screens/PartnershipForm"; +import partnershipRequests from "@requests/partnership.requests"; import { useEffect, useState } from "react"; -import partnerRequest from "../../shared/services/partner.request"; +import { View } from "react-native"; +import { AddPartnershipModal } from "./AddPartnershipModal"; import { ButtonView, Container, @@ -14,28 +16,50 @@ import { } from "./styles"; export function Partnerships() { - const [visibleModal, setVisibleModal] = useState(false); + const [visibleAddPartnershipModal, setVisibleAddPartnershipModal] = + useState(false); const [isLoading, setIsLoading] = useState(true); const [data, setData] = useState([]); + const [filteredData, setFilteredData] = useState([]); const [tab, setTab] = useState(0); - const navigation = useNavigation(); + + const navigation = useNavigation(); async function getPartnerships() { setIsLoading(true); - const partnerships: IPartnership[] = await partnerRequest.List(tab === 1); + const partnerships: IPartnership[] = + await partnershipRequests.getPartnerships(tab === 1); setData(partnerships); + setFilteredData(partnerships); setIsLoading(false); } + async function filterPartnership(name: string) { + const isPartnershipDisabledTab = tab === 1; + const filteredPartnerships = await partnershipRequests.getPartnerships( + isPartnershipDisabledTab, + name, + ); + setFilteredData(filteredPartnerships); + } + useEffect(() => { getPartnerships(); }, [tab]); + function handleCloseEditModal() { + getPartnerships(); + setVisibleAddPartnershipModal(false); + } + return (
- @@ -46,6 +70,12 @@ export function Partnerships() { onChangeTab={tab => setTab(tab)} /> +
); diff --git a/src/screens/Partnerships/styles.ts b/src/screens/Partnerships/styles.ts index 6c9ed1a..b3bc9fd 100644 --- a/src/screens/Partnerships/styles.ts +++ b/src/screens/Partnerships/styles.ts @@ -1,7 +1,7 @@ import { StatusBar } from "react-native"; import styled from "styled-components/native"; -import { isAndroid } from "@utils/checkPlatform"; +import { isAndroid } from "@constants"; export const Container = styled.SafeAreaView` margin-top: ${isAndroid ? `${StatusBar.currentHeight}px` : "0"}; diff --git a/src/shared/assets/icons/arrow-left.svg b/src/shared/assets/icons/arrow-left.svg new file mode 100644 index 0000000..2e71060 --- /dev/null +++ b/src/shared/assets/icons/arrow-left.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/shared/assets/icons/check.svg b/src/shared/assets/icons/check.svg new file mode 100644 index 0000000..704224c --- /dev/null +++ b/src/shared/assets/icons/check.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/shared/assets/icons/checkbox-off.svg b/src/shared/assets/icons/checkbox-off.svg new file mode 100644 index 0000000..8219392 --- /dev/null +++ b/src/shared/assets/icons/checkbox-off.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/checkbox-on.svg b/src/shared/assets/icons/checkbox-on.svg new file mode 100644 index 0000000..7376464 --- /dev/null +++ b/src/shared/assets/icons/checkbox-on.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/close.svg b/src/shared/assets/icons/close.svg new file mode 100644 index 0000000..84658fd --- /dev/null +++ b/src/shared/assets/icons/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/edit.svg b/src/shared/assets/icons/edit.svg new file mode 100644 index 0000000..4f924ba --- /dev/null +++ b/src/shared/assets/icons/edit.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/eye-hidden.svg b/src/shared/assets/icons/eye-hidden.svg new file mode 100644 index 0000000..12a5878 --- /dev/null +++ b/src/shared/assets/icons/eye-hidden.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/shared/assets/icons/eye.svg b/src/shared/assets/icons/eye.svg new file mode 100644 index 0000000..cb07383 --- /dev/null +++ b/src/shared/assets/icons/eye.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/shared/assets/icons/home.svg b/src/shared/assets/icons/home.svg new file mode 100644 index 0000000..6edde0d --- /dev/null +++ b/src/shared/assets/icons/home.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/image.svg b/src/shared/assets/icons/image.svg new file mode 100644 index 0000000..6796b7f --- /dev/null +++ b/src/shared/assets/icons/image.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/shared/assets/icons/info.svg b/src/shared/assets/icons/info.svg new file mode 100644 index 0000000..e92522c --- /dev/null +++ b/src/shared/assets/icons/info.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/shared/assets/icons/loading.svg b/src/shared/assets/icons/loading.svg new file mode 100644 index 0000000..6054f93 --- /dev/null +++ b/src/shared/assets/icons/loading.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/shared/assets/icons/log-off.svg b/src/shared/assets/icons/log-off.svg new file mode 100644 index 0000000..fe7e3f2 --- /dev/null +++ b/src/shared/assets/icons/log-off.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/menu.svg b/src/shared/assets/icons/menu.svg new file mode 100644 index 0000000..1ca1226 --- /dev/null +++ b/src/shared/assets/icons/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/minus.svg b/src/shared/assets/icons/minus.svg new file mode 100644 index 0000000..66c73b3 --- /dev/null +++ b/src/shared/assets/icons/minus.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/shared/assets/icons/order.svg b/src/shared/assets/icons/order.svg new file mode 100644 index 0000000..f0cd1e4 --- /dev/null +++ b/src/shared/assets/icons/order.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/plus.svg b/src/shared/assets/icons/plus.svg new file mode 100644 index 0000000..93e779e --- /dev/null +++ b/src/shared/assets/icons/plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/profile.svg b/src/shared/assets/icons/profile.svg new file mode 100644 index 0000000..e8f94bc --- /dev/null +++ b/src/shared/assets/icons/profile.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/question.svg b/src/shared/assets/icons/question.svg new file mode 100644 index 0000000..18029b7 --- /dev/null +++ b/src/shared/assets/icons/question.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/shared/assets/icons/radio-1.svg b/src/shared/assets/icons/radio-1.svg new file mode 100644 index 0000000..e3998ee --- /dev/null +++ b/src/shared/assets/icons/radio-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/radio.svg b/src/shared/assets/icons/radio.svg new file mode 100644 index 0000000..02a8c83 --- /dev/null +++ b/src/shared/assets/icons/radio.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/shared/assets/icons/refresh.svg b/src/shared/assets/icons/refresh.svg new file mode 100644 index 0000000..55d0c53 --- /dev/null +++ b/src/shared/assets/icons/refresh.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/shared/assets/icons/search.svg b/src/shared/assets/icons/search.svg new file mode 100644 index 0000000..3992216 --- /dev/null +++ b/src/shared/assets/icons/search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/shared/assets/icons/trash.svg b/src/shared/assets/icons/trash.svg new file mode 100644 index 0000000..742a59f --- /dev/null +++ b/src/shared/assets/icons/trash.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/shared/assets/icons/users.svg b/src/shared/assets/icons/users.svg new file mode 100644 index 0000000..474156d --- /dev/null +++ b/src/shared/assets/icons/users.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/utils/checkPlatform.ts b/src/shared/constants/checkPlatform.ts similarity index 100% rename from src/utils/checkPlatform.ts rename to src/shared/constants/checkPlatform.ts diff --git a/src/shared/constants/classificationSelectOptions.ts b/src/shared/constants/classificationSelectOptions.ts new file mode 100644 index 0000000..124a88f --- /dev/null +++ b/src/shared/constants/classificationSelectOptions.ts @@ -0,0 +1,6 @@ +export enum ClassificationSelectOptions { + COLEGIOS = "COLEGIOS", + UNIVERSIDADES = "UNIVERSIDADES", + SECRETARIAS = "SECRETARIAS", + GOVERNOS = "GOVERNOS", +} diff --git a/src/shared/utils/endpoints.ts b/src/shared/constants/endpoints.ts similarity index 58% rename from src/shared/utils/endpoints.ts rename to src/shared/constants/endpoints.ts index cb0351d..2df13d8 100644 --- a/src/shared/utils/endpoints.ts +++ b/src/shared/constants/endpoints.ts @@ -5,7 +5,6 @@ export enum USER_ENDPOINTS { export enum PARTNERSHIP_ENDPOINTS { CREATE_PARTNERSHIP = "/partners", LIST_PARTNERSHIP = "/partners/search", - CREATE = "/partners", LIST = "/partners/search", DETAILS = "/partners/", @@ -18,3 +17,15 @@ export enum ANNOTATION_ENDPOINTS { LIST = "/partners/comment/", EDIT = "/partners/comment/", } + +export enum MEETING_ENDPOINTS { + CREATE = "/meetings", + LIST = "/meetings", + DETAILS = "/meetings/", + EDIT = "/meetings/", + DELETE = "/meetings/", + COMMENTS = "/meetings/comment/", + ADD_COMMENT = "/meetings/comment", + UPDATE_COMMENT = "/meetings/comment/", + BY_PARTNER = "/meetings/partner/", +} diff --git a/src/shared/constants/index.ts b/src/shared/constants/index.ts new file mode 100644 index 0000000..d188193 --- /dev/null +++ b/src/shared/constants/index.ts @@ -0,0 +1,14 @@ +import { isAndroid, isIOS } from "./checkPlatform"; +import { ClassificationSelectOptions } from "./classificationSelectOptions"; +import { stateSelectOptions } from "./stateSelectOptions"; +import { statusSelectOptions } from "./statusSelectOptions"; +import { validEmailPattern } from "./validEmailPattern"; + +export { + isAndroid, + isIOS, + ClassificationSelectOptions, + stateSelectOptions, + statusSelectOptions, + validEmailPattern, +}; diff --git a/src/shared/constants/stateSelectOptions.ts b/src/shared/constants/stateSelectOptions.ts new file mode 100644 index 0000000..b85c4a9 --- /dev/null +++ b/src/shared/constants/stateSelectOptions.ts @@ -0,0 +1,115 @@ +type States = { + UF: string; + name: string; +}; + +export const stateSelectOptions: States[] = [ + { + UF: "AC", + name: "Acre", + }, + { + UF: "AL", + name: "Alagoas", + }, + { + UF: "AP", + name: "Amapá", + }, + { + UF: "AM", + name: "Amazonas", + }, + { + UF: "BA", + name: "Bahia", + }, + { + UF: "CE", + name: "Ceará", + }, + { + UF: "DF", + name: "Distrito Federal", + }, + { + UF: "ES", + name: "Espírito Santo", + }, + { + UF: "GO", + name: "Goiás", + }, + { + UF: "MA", + name: "Maranhão", + }, + { + UF: "MT", + name: "Mato Grosso", + }, + { + UF: "MS", + name: "Mato Grosso do Sul", + }, + { + UF: "MG", + name: "Minas Gerais", + }, + { + UF: "PA", + name: "Pará", + }, + { + UF: "PB", + name: "Paraíba", + }, + { + UF: "PR", + name: "Paraná", + }, + { + UF: "PE", + name: "Pernambuco", + }, + { + UF: "PI", + name: "Piauí", + }, + { + UF: "RJ", + name: "Rio de Janeiro", + }, + { + UF: "RN", + name: "Rio Grande do Norte", + }, + { + UF: "RS", + name: "Rio Grande do Sul", + }, + { + UF: "RO", + name: "Rondônia", + }, + { + UF: "RR", + name: "Roraima", + }, + { + UF: "SC", + name: "Santa Catarina", + }, + { + UF: "SP", + name: "São Paulo", + }, + { + UF: "SE", + name: "Sergipe", + }, + { + UF: "TO", + name: "Tocantins", + }, +]; diff --git a/src/shared/constants/statusSelectOptions.ts b/src/shared/constants/statusSelectOptions.ts new file mode 100644 index 0000000..82b400e --- /dev/null +++ b/src/shared/constants/statusSelectOptions.ts @@ -0,0 +1,56 @@ +type Status = { + id: number; + description: string; + value: string; +}; + +export const statusSelectOptions: Status[] = [ + { id: 1, description: "Em prospecção", value: "EmProspeccao" }, + { + id: 2, + description: "Primeiro contato feito", + value: "PrimeiroContatoFeito", + }, + { + id: 3, + description: "Primeira reunião marcada/realizada", + value: "PrimeiraReuniaoMarcadaRealizada", + }, + { + id: 4, + description: "Documentação enviada/em análise (Parceiro)", + value: "DocumentacaoEnviadaEmAnalise_Parceiro", + }, + { + id: 5, + description: "Documentação devolvida (Academy)", + value: "DocumentacaoDevolvida_EmAnaliseAcademy", + }, + { + id: 6, + description: "Documentação devolvida (Legal)", + value: "DocumentacaoDevolvida_EmAnaliseLegal", + }, + { + id: 7, + description: "Documentação Analisada e devolvida (Parceiro)", + value: "DocumentacaoAnalisadaDevolvida_Parceiro", + }, + { + id: 8, + description: "Preparação de Executive Sumary (Academy)", + value: "EmPreparacaoDeExecutiveSummary_Academy", + }, + { id: 9, description: "ES em analise (Legal)", value: "ESEmAnalise_Legal" }, + { + id: 10, + description: "ES em analise (Academy Global)", + value: "ESEmAnaliseAcademy_Global", + }, + { + id: 11, + description: "Pronto para assinatura", + value: "ProntoParaAssinatura", + }, + { id: 12, description: "Parceria Firmada", value: "ParceriaFirmada" }, +]; diff --git a/src/shared/constants/validEmailPattern.ts b/src/shared/constants/validEmailPattern.ts index 14ed320..3e23319 100644 --- a/src/shared/constants/validEmailPattern.ts +++ b/src/shared/constants/validEmailPattern.ts @@ -1 +1,2 @@ -export const validEmailPattern = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; +export const validEmailPattern = + /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; diff --git a/src/shared/interfaces/annotation.interface.ts b/src/shared/interfaces/annotation.interface.ts index 2736069..ef19d13 100644 --- a/src/shared/interfaces/annotation.interface.ts +++ b/src/shared/interfaces/annotation.interface.ts @@ -10,4 +10,5 @@ export interface IComment { title?: string; createdAt: string; updatedAt: string; + disabled: boolean; } diff --git a/src/shared/interfaces/meeting.interface.ts b/src/shared/interfaces/meeting.interface.ts new file mode 100644 index 0000000..e276148 --- /dev/null +++ b/src/shared/interfaces/meeting.interface.ts @@ -0,0 +1,33 @@ +import { IComment } from "./annotation.interface"; +import { IPartnership } from "./partner.interface"; + +export interface IMeeting { + id: string; + title: string; + description: string; + meetingDateTime: string; + Partner: { + id: IPartnership["id"]; + name: IPartnership["name"]; + email?: IPartnership["email"]; + phoneNumber?: IPartnership["phoneNumber"]; + status?: IPartnership["status"]; + }; + meetingComments: IComment[]; +} +export interface IMeetingsHome { + pastMeetings: { + id: string; + title: string; + description: string; + meetingDateTime: string; + Partner: { name: string; partnerId: string }; + }[]; + upcomingMeetings: { + id: string; + title: string; + description: string; + meetingDateTime: string; + Partner: { name: string; partnerId: string }; + }[]; +} diff --git a/src/shared/interfaces/partner.interface.ts b/src/shared/interfaces/partner.interface.ts index a728d25..cf3fd57 100644 --- a/src/shared/interfaces/partner.interface.ts +++ b/src/shared/interfaces/partner.interface.ts @@ -1,5 +1,5 @@ export interface IPartnership { - id?: string; + id: string; name: string; email: string; phoneNumber: string; @@ -13,3 +13,45 @@ export interface IPartnership { memberNumber: number; disabled: boolean; } + +export interface IPartnershipEdit { + name: string; + email: string; + phoneNumber: string; + zipCode: string; + state: string; + city: string; + neighborhood: string; + address: string; + classification: string; + status: string; + memberNumber: number; +} + +export interface IModalPropsEdit { + visible: boolean; + onClose: () => void; + closeAfterUpdate: () => void; + partnerProps: IPartnership; +} + +export interface IModalPropsForm { + visible: boolean; + onClose: () => void; + closeAfterUpdate: () => void; +} + +export enum PartnerStatus { + EmProspeccao = "Em prospecção", + PrimeiroContatoFeito = "Primeiro contato feito", + PrimeiraReuniaoMarcadaRealizada = "Primeira reunião marcada/realizada", + DocumentacaoEnviadaEmAnalise_Parceiro = "Documentação enviada/em análise (Parceiro)", + DocumentacaoDevolvida_EmAnaliseAcademy = "Documentação devolvida (Academy)", + DocumentacaoDevolvida_EmAnaliseLegal = "Documentação devolvida (Legal)", + DocumentacaoAnalisadaDevolvida_Parceiro = "Documentação Analisada e devolvida (Parceiro)", + EmPreparacaoDeExecutiveSummary_Academy = "Preparação de Executive Sumary (Academy)", + ESEmAnalise_Legal = "ES em analise (Legal)", + ESEmAnaliseAcademy_Global = "ES em analise (Academy Global)", + ProntoParaAssinatura = "Pronto para assinatura", + ParceriaFirmada = "Parceria Firmada", +} diff --git a/src/shared/utils/handlers/AnnotationController.ts b/src/shared/services/annotation.requests.ts similarity index 62% rename from src/shared/utils/handlers/AnnotationController.ts rename to src/shared/services/annotation.requests.ts index e2010a0..300ddf5 100644 --- a/src/shared/utils/handlers/AnnotationController.ts +++ b/src/shared/services/annotation.requests.ts @@ -1,10 +1,11 @@ import { api } from "@api"; -import { IComment } from "@interfaces/annotation.interface"; -import { ANNOTATION_ENDPOINTS } from "../endpoints"; -import StorageController from "./StorageController"; +import { IComment } from "@interfaces/annotation.interface"; +import { alertError } from "@utils/alertError"; +import StorageController from "@utils/handlers/StorageController"; +import { ANNOTATION_ENDPOINTS } from "../constants/endpoints"; -class AnnotationController { +class AnnotationRequests { async createAnnotation(partnerId: string, comment: string) { try { const user = await StorageController.getUserInfo(); @@ -13,13 +14,13 @@ class AnnotationController { throw new Error("User is empty"); } - await api.post(ANNOTATION_ENDPOINTS.CREATE, { + return await api.post(ANNOTATION_ENDPOINTS.CREATE, { partnerId, comment, userId: user.id, }); } catch (error) { - console.error(error); + alertError(error, "Não foi possível cadastrar a anotação :("); } } @@ -28,7 +29,7 @@ class AnnotationController { const { data } = await api.get(ANNOTATION_ENDPOINTS.LIST + id); return data as IComment[]; } catch (error) { - console.error(error); + alertError(error, "Não foi possível carregar a lista de anotações :("); } } @@ -44,9 +45,9 @@ class AnnotationController { }); return data; } catch (error) { - console.error(error); + alertError(error, "Não foi possível atualizar o comentário :("); } } } -export default new AnnotationController(); +export default new AnnotationRequests(); diff --git a/src/shared/services/auth.request.ts b/src/shared/services/auth.request.ts index ce2aa34..6179be3 100644 --- a/src/shared/services/auth.request.ts +++ b/src/shared/services/auth.request.ts @@ -1,11 +1,11 @@ import { api } from "./api"; -import { IUserAuthenticated, IUserLogin } from "../interfaces/user.interface"; -import { USER_ENDPOINTS } from "../utils/endpoints"; -import StorageController from "../utils/handlers/StorageController"; +import { IUserAuthenticated, IUserLogin } from "@interfaces/user.interface"; +import StorageController from "@utils/handlers/StorageController"; +import { USER_ENDPOINTS } from "../constants/endpoints"; -class AuthRequest { - public async authenticate(payload: IUserLogin) { +class AuthRequests { + async authenticate(payload: IUserLogin) { const response = await api.post( USER_ENDPOINTS.USER_LOGIN, payload, @@ -20,4 +20,4 @@ class AuthRequest { } } -export default new AuthRequest(); +export default new AuthRequests(); diff --git a/src/shared/services/meeting.request.ts b/src/shared/services/meeting.request.ts new file mode 100644 index 0000000..4c114da --- /dev/null +++ b/src/shared/services/meeting.request.ts @@ -0,0 +1,120 @@ +import { alertError } from "@utils/alertError"; +import { Alert } from "react-native"; +import { MEETING_ENDPOINTS } from "../constants/endpoints"; +import { api } from "./api"; + +class MeetingRequests { + async createMeeting(partnershipId: string, dateTime: string, theme: string) { + try { + const payload = { + title: theme.trim(), + partnerId: partnershipId, + meetingDateTime: dateTime, + }; + await api.post(MEETING_ENDPOINTS.CREATE, payload); + Alert.alert( + "Reunião cadastrada!", + "A partir de agora a nova reunião irá aparecer nas listagens", + ); + } catch (error) { + alertError(error, "Não foi possível cadastrar a reunião :("); + } + } + + async getMeetings() { + try { + const { data } = await api.get(MEETING_ENDPOINTS.LIST); + return data; + } catch (error) { + alertError(error, "Não foi possível carregar a lista de reuniões :("); + } + } + + async getPartnerMeetigs(partnershipId: string) { + try { + const { data } = await api.get( + MEETING_ENDPOINTS.BY_PARTNER + partnershipId, + ); + return data; + } catch (error) { + alertError(error, "Não foi possível carregar a lista de reuniões :("); + } + } + + async getMeeting(id: string) { + try { + const { data } = await api.get(MEETING_ENDPOINTS.DETAILS + id); + return data; + } catch (error) { + alertError(error, "Não foi possível carregar os dados da reunião :("); + } + } + + async updateMeeting(id: string, dateTime: string, updatedTheme: string) { + try { + const payload = { + meetingDateTime: dateTime, + title: updatedTheme.trim(), + }; + await api.put(MEETING_ENDPOINTS.EDIT + id, payload); + Alert.alert( + "Reunião atualizada!", + "Os dados da reunião foram atualizados", + ); + } catch (error) { + alertError(error, "Não foi possível atualizar os dados da reunião :("); + } + } + + async deleteMeeting(id: string) { + try { + await api.delete(MEETING_ENDPOINTS.DELETE + id); + Alert.alert( + "Reunião excluída!", + "Esta reunião deixará de aparecer em listagens e históricos", + ); + } catch (error) { + alertError(error, "Não foi possível deletar a reunião :("); + } + } + + async getMeetingComments(id: string) { + try { + const { data } = await api.get(MEETING_ENDPOINTS.COMMENTS + id); + return data; + } catch (error) { + alertError( + error, + "Não foi possível carregar os comentários da reunião :(", + ); + } + } + + async createMeetingComment( + meetingId: string, + comment: string, + userId: string, + ) { + try { + const payload = { + comment, + meetingId, + userId, + }; + const { data } = await api.post(MEETING_ENDPOINTS.ADD_COMMENT, payload); + return data; + } catch (error) { + alertError(error, "Não foi possível cadastrar o comentário :("); + } + } + + async updateMeetingComment(commentId: string, comment: string) { + try { + await api.put(MEETING_ENDPOINTS.UPDATE_COMMENT + commentId, { comment }); + } catch (error) { + alertError(error, "Não foi possível atualizar o comentário :("); + } + } +} + +export default new MeetingRequests(); diff --git a/src/shared/services/partner.request.ts b/src/shared/services/partner.request.ts deleted file mode 100644 index 7e12a15..0000000 --- a/src/shared/services/partner.request.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { PARTNERSHIP_ENDPOINTS } from "../utils/endpoints"; -import { api } from "./api"; - -class PartnerRequest { - public async List(disabled: boolean) { - try { - const response = await api.get( - PARTNERSHIP_ENDPOINTS.LIST_PARTNERSHIP + "?disabled=" + disabled, - ); - return response.data; - } catch (error) { - console.error(error); - } - } -} -export default new PartnerRequest(); diff --git a/src/shared/services/partnership.requests.ts b/src/shared/services/partnership.requests.ts new file mode 100644 index 0000000..4e26d35 --- /dev/null +++ b/src/shared/services/partnership.requests.ts @@ -0,0 +1,73 @@ +import { api } from "@api"; + +import { IPartnership, IPartnershipEdit } from "@interfaces/partner.interface"; +import { alertError } from "@utils/alertError"; +import { Alert } from "react-native"; +import { PARTNERSHIP_ENDPOINTS } from "../constants/endpoints"; +import { + formatPartnerStatusByList, + formatStatus, +} from "@utils/handlers/formatEnumsPartner"; + +class PartnershipRequests { + async createPartnership(newPartnership: IPartnership) { + try { + const { data } = await api.post( + PARTNERSHIP_ENDPOINTS.CREATE, + newPartnership, + ); + return data; + } catch (error) { + alertError(error, "Não foi possível cadastrar a parceria :("); + } + } + + async getPartnerships(disabled?: boolean, name?: string) { + try { + const { data } = name + ? await api.get( + PARTNERSHIP_ENDPOINTS.LIST + + `?disabled=${disabled}` + + `&name=${name}`, + ) + : await api.get(PARTNERSHIP_ENDPOINTS.LIST + `?disabled=${disabled}`); + + return formatPartnerStatusByList(data); + } catch (error) { + alertError(error, "Não foi possível carregar a lista de parcerias :("); + } + } + + async getPartnership(id: string) { + try { + const { data } = await api.get( + PARTNERSHIP_ENDPOINTS.DETAILS + id, + ); + return formatStatus(data); + } catch (error) { + alertError(error, "Não foi possível carregar os dados da parceria :("); + } + } + + async updatePartnership(updatedPartnership: IPartnershipEdit, id: string) { + try { + await api.put(PARTNERSHIP_ENDPOINTS.EDIT + id, updatedPartnership); + } catch (error) { + alertError(error, "Não foi possível atualizar os dados da parceria :("); + } + } + + async deletePartnership(id: string) { + try { + await api.delete(PARTNERSHIP_ENDPOINTS.DELETE + id); + Alert.alert( + "Parceria excluída!", + "Esta parceria ainda vai aparecer na listagem, mas ações como editar ou adicionar anotação foram bloqueadas!", + ); + } catch (error) { + alertError(error, "Não foi possível deletar a parceria :("); + } + } +} + +export default new PartnershipRequests(); diff --git a/src/shared/types/rootStackParamList.ts b/src/shared/types/rootStackParamList.ts index 323e85f..d9cb8a5 100644 --- a/src/shared/types/rootStackParamList.ts +++ b/src/shared/types/rootStackParamList.ts @@ -1,12 +1,15 @@ import { NativeStackNavigationProp } from "@react-navigation/native-stack"; -export type RootStackParamList = { +type RootStackParamList = { SignIn: undefined; - Partnership: { id: string; name: string }; + Meeting: { id: string }; + Partnership: { id: string }; Partnerships: undefined; Home: undefined; HomeStack: undefined; MyProfile: undefined; }; -export type PropsStack = NativeStackNavigationProp; +type PropsStack = NativeStackNavigationProp; + +export { PropsStack, RootStackParamList }; diff --git a/src/shared/utils/alertError.ts b/src/shared/utils/alertError.ts new file mode 100644 index 0000000..cc7812c --- /dev/null +++ b/src/shared/utils/alertError.ts @@ -0,0 +1,24 @@ +import { isAxiosError } from "axios"; +import { Alert } from "react-native"; + +export function alertError(error: any, mensage?: string) { + if (isAxiosError(error)) { + if (error.response && error.response.status === 401) { + console.error(error); + Alert.alert( + "Sessão expirada!", + "Faça login novamente para continuar navegando pelo app", + ); + throw new Error("Unauthorized"); + } else if (error.response && error.response.status >= 500) { + console.error(error); + Alert.alert( + "Instabilidade no servidor!", + "Tente novamente dentro de alguns instantes...", + ); + } else { + console.error(error); + Alert.alert("Ops!", mensage); + } + } +} diff --git a/src/utils/formatDate.ts b/src/shared/utils/formatDate.ts similarity index 100% rename from src/utils/formatDate.ts rename to src/shared/utils/formatDate.ts diff --git a/src/shared/utils/formatDateISO.ts b/src/shared/utils/formatDateISO.ts new file mode 100644 index 0000000..16670a1 --- /dev/null +++ b/src/shared/utils/formatDateISO.ts @@ -0,0 +1,10 @@ +export function formatDateISO(date: string, hour: string) { + const year = Number(date.split("/")[2]); + const month = Number(date.split("/")[1]) - 1; + const day = Number(date.split("/")[0]); + const hours = Number(hour.split(":")[0]); + const minutes = Number(hour.split(":")[1]); + + const formatedDate = new Date(year, month, day, hours, minutes); + return formatedDate.toISOString(); +} diff --git a/src/utils/formatTime.ts b/src/shared/utils/formatTime.ts similarity index 100% rename from src/utils/formatTime.ts rename to src/shared/utils/formatTime.ts diff --git a/src/shared/utils/handlers/PartnershipController.ts b/src/shared/utils/handlers/PartnershipController.ts deleted file mode 100644 index 8a772d2..0000000 --- a/src/shared/utils/handlers/PartnershipController.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { api } from "@api"; -import { Alert } from "react-native"; -import { PARTNERSHIP_ENDPOINTS } from "../endpoints"; - -class PartnershipController { - async getPartnerships() { - try { - const { data } = await api.get(PARTNERSHIP_ENDPOINTS.LIST); - return data; - } catch (error) { - console.error(error); - } - } - - async getPartnership(id: string) { - try { - const { data } = await api.get(PARTNERSHIP_ENDPOINTS.DETAILS + id); - return data; - } catch (error) { - console.error(error); - } - } - - async deletePartnership(id: string) { - try { - await api.delete(PARTNERSHIP_ENDPOINTS.DELETE + id); - Alert.alert( - "Parceria excluída!", - "Esta parceria ainda vai aparecer na listagem, mas ações como editar ou adicionar anotação foram bloqueadas!", - ); - } catch (error) { - console.error(error); - } - } -} - -export default new PartnershipController(); diff --git a/src/shared/utils/handlers/formatEnumsPartner.ts b/src/shared/utils/handlers/formatEnumsPartner.ts new file mode 100644 index 0000000..0fac414 --- /dev/null +++ b/src/shared/utils/handlers/formatEnumsPartner.ts @@ -0,0 +1,52 @@ +import { IPartnership, PartnerStatus } from "@interfaces/partner.interface"; + +function getPartnerStatusEnumByKey(status: PartnerStatus) { + const findStatus = Object.entries(PartnerStatus).find( + ([key, _]) => key === status, + ); + + if (findStatus) { + const [statusKey, statusValue] = findStatus; + return { statusKey, statusValue }; + } + + return null; +} + +function getPartnerStatusEnumByValue( + status: string, +): { statusKey: string; statusValue: string } | null { + const findStatus = Object.entries(PartnerStatus).find( + ([_, value]) => value === status, + ); + + if (findStatus) { + const [statusKey, statusValue] = findStatus; + return { statusKey, statusValue }; + } + + return null; +} + +function formatStatus(partner: IPartnership): IPartnership { + const findStatusValue = getPartnerStatusEnumByKey( + partner.status as PartnerStatus, + )?.statusValue; + + if (findStatusValue) { + partner.status = findStatusValue; + } + + return partner; +} + +function formatPartnerStatusByList(partners: IPartnership[]) { + return partners.map(partner => formatStatus(partner)); +} + +export { + formatPartnerStatusByList, + formatStatus, + getPartnerStatusEnumByKey, + getPartnerStatusEnumByValue, +}; diff --git a/tsconfig.json b/tsconfig.json index 1045c5b..b6cb5f4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,16 +5,16 @@ "baseUrl": "./", "paths": { - "@assets/*": ["./src/assets/*"], "@components": ["./src/components"], - "@global/*": ["./src/global/*"], - "@mocks/*": ["./src/mocks/*"], + "@routes/*": ["./src/routes/*"], "@screens/*": ["./src/screens/*"], - "@utils/*": ["./src/utils/*"], + "@assets/*": ["./src/shared/assets/*"], + "@constants": ["./src/shared/constants"], "@interfaces/*": ["./src/shared/interfaces/*"], "@api": ["./src/shared/services/api"], - "@requests/*": ["./src/shared/utils/handlers/*"], - "@routes/*": ["./src/routes/*"] + "@requests/*": ["./src/shared/services/*"], + "@custom-types/*": ["./src/shared/types/*"], + "@utils/*": ["./src/shared/utils/*"] } } } diff --git a/yarn.lock b/yarn.lock index e7b25ce..38f9335 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24,11 +24,23 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== + dependencies: + "@babel/highlight" "^7.18.6" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== +"@babel/compat-data@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" + integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== + "@babel/core@^7.13.16", "@babel/core@^7.16.0", "@babel/core@^7.20.0": version "7.21.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.3.tgz#cf1c877284a469da5d1ce1d1e53665253fae712e" @@ -50,6 +62,27 @@ json5 "^2.2.2" semver "^6.3.0" +"@babel/core@^7.19.6": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" + integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" + "@babel/helper-compilation-targets" "^7.21.4" + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.4" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.4" + "@babel/types" "^7.21.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + "@babel/generator@^7.20.0", "@babel/generator@^7.21.3": version "7.21.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.3.tgz#232359d0874b392df04045d72ce2fd9bb5045fce" @@ -60,6 +93,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" + integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== + dependencies: + "@babel/types" "^7.21.4" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -86,6 +129,17 @@ lru-cache "^5.1.1" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz#770cd1ce0889097ceacb99418ee6934ef0572656" + integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== + dependencies: + "@babel/compat-data" "^7.21.4" + "@babel/helper-validator-option" "^7.21.0" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz#64f49ecb0020532f19b1d014b03bccaa1ab85fb9" @@ -278,6 +332,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== +"@babel/parser@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" + integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -1060,6 +1119,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" + integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.4" + "@babel/types" "^7.21.4" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.3", "@babel/types@^7.4.4": version "7.21.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.3.tgz#4865a5357ce40f64e3400b0f3b737dc6d4f64d05" @@ -1069,6 +1144,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" + integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -1935,10 +2019,10 @@ dependencies: serve-static "^1.13.1" -"@react-native-community/cli-doctor@^10.2.0": - version "10.2.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-10.2.1.tgz#b6b7a3f0f9cef1a05f1adc6393eb29c6f8f2972c" - integrity sha512-IwhdSD+mtgWdxg2eMr0fpkn08XN7r70DC1riGSmqK/DXNyWBzIZlCkDN+/TwlaUEsiFk6LQTjgCiqZSMpmDrsg== +"@react-native-community/cli-doctor@^10.2.2": + version "10.2.2" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-10.2.2.tgz#b1893604fa9fc8971064e7c00042350f96868bfe" + integrity sha512-49Ep2aQOF0PkbAR/TcyMjOm9XwBa8VQr+/Zzf4SJeYwiYLCT1NZRAVAVjYRXl0xqvq5S5mAGZZShS4AQl4WsZw== dependencies: "@react-native-community/cli-config" "^10.1.1" "@react-native-community/cli-platform-ios" "^10.2.1" @@ -1979,19 +2063,7 @@ glob "^7.1.3" logkitty "^0.7.1" -"@react-native-community/cli-platform-ios@10.2.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.0.tgz#be21c0e3bbf17358d540cc23e5556bf679f6322e" - integrity sha512-hIPK3iL/mL+0ChXmQ9uqqzNOKA48H+TAzg+hrxQLll/6dNMxDeK9/wZpktcsh8w+CyhqzKqVernGcQs7tPeKGw== - dependencies: - "@react-native-community/cli-tools" "^10.1.1" - chalk "^4.1.2" - execa "^1.0.0" - fast-xml-parser "^4.0.12" - glob "^7.1.3" - ora "^5.4.1" - -"@react-native-community/cli-platform-ios@^10.2.1": +"@react-native-community/cli-platform-ios@10.2.1", "@react-native-community/cli-platform-ios@^10.2.1": version "10.2.1" resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.1.tgz#2e6bd2cb6d48cbb8720d7b7265bb1bab80745f72" integrity sha512-hz4zu4Y6eyj7D0lnZx8Mf2c2si8y+zh/zUTgCTaPPLzQD8jSZNNBtUUiA1cARm2razpe8marCZ1QbTMAGbf3mg== @@ -2003,21 +2075,21 @@ glob "^7.1.3" ora "^5.4.1" -"@react-native-community/cli-plugin-metro@^10.2.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-10.2.0.tgz#83cabbc04c80f7e94f88ed998b72c7d572c6f094" - integrity sha512-9eiJrKYuauEDkQLCrjJUh7tS9T0oaMQqVUSSSuyDG6du7HQcfaR4mSf21wK75jvhKiwcQLpsFmMdctAb+0v+Cg== +"@react-native-community/cli-plugin-metro@^10.2.2": + version "10.2.2" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-10.2.2.tgz#766914e3c8007dfe52b253544c4f6cd8549919ac" + integrity sha512-sTGjZlD3OGqbF9v1ajwUIXhGmjw9NyJ/14Lo0sg7xH8Pv4qUd5ZvQ6+DWYrQn3IKFUMfGFWYyL81ovLuPylrpw== dependencies: "@react-native-community/cli-server-api" "^10.1.1" "@react-native-community/cli-tools" "^10.1.1" chalk "^4.1.2" execa "^1.0.0" - metro "0.73.8" - metro-config "0.73.8" - metro-core "0.73.8" - metro-react-native-babel-transformer "0.73.8" - metro-resolver "0.73.8" - metro-runtime "0.73.8" + metro "0.73.9" + metro-config "0.73.9" + metro-core "0.73.9" + metro-react-native-babel-transformer "0.73.9" + metro-resolver "0.73.9" + metro-runtime "0.73.9" readline "^1.3.0" "@react-native-community/cli-server-api@^10.1.1": @@ -2057,17 +2129,17 @@ dependencies: joi "^17.2.1" -"@react-native-community/cli@10.2.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-10.2.0.tgz#bcb65bb3dcb03b0fc4e49619d51e12d23396b301" - integrity sha512-QH7AFBz5FX2zTZRH/o3XehHrZ0aZZEL5Sh+23nSEFgSj3bLFfvjjZhuoiRSAo7iiBdvAoXrfxQ8TXgg4Xf/7fw== +"@react-native-community/cli@10.2.2": + version "10.2.2" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-10.2.2.tgz#3fa438ba7f19f83e07bc337765fc1cabdcf2cac2" + integrity sha512-aZVcVIqj+OG6CrliR/Yn8wHxrvyzbFBY9cj7n0MvRw/P54QUru2nNqUTSSbqv0Qaa297yHJbe6kFDojDMSTM8Q== dependencies: "@react-native-community/cli-clean" "^10.1.1" "@react-native-community/cli-config" "^10.1.1" "@react-native-community/cli-debugger-ui" "^10.0.0" - "@react-native-community/cli-doctor" "^10.2.0" + "@react-native-community/cli-doctor" "^10.2.2" "@react-native-community/cli-hermes" "^10.2.0" - "@react-native-community/cli-plugin-metro" "^10.2.0" + "@react-native-community/cli-plugin-metro" "^10.2.2" "@react-native-community/cli-server-api" "^10.1.1" "@react-native-community/cli-tools" "^10.1.1" "@react-native-community/cli-types" "^10.0.0" @@ -2080,6 +2152,11 @@ prompts "^2.4.0" semver "^6.3.0" +"@react-native-picker/picker@2.4.8": + version "2.4.8" + resolved "https://registry.yarnpkg.com/@react-native-picker/picker/-/picker-2.4.8.tgz#a1a21f3d6ecadedbc3f0b691a444ddd7baa081f8" + integrity sha512-5NQ5XPo1B03YNqKFrV6h9L3CQaHlB80wd4ETHUEABRP2iLh7FHLVObX2GfziD+K/VJb8G4KZcZ23NFBFP1f7bg== + "@react-native/assets@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e" @@ -2200,6 +2277,98 @@ dependencies: "@sinonjs/commons" "^2.0.0" +"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" + integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== + +"@svgr/babel-plugin-remove-jsx-attribute@*": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-7.0.0.tgz#91da77a009dc38e8d30da45d9b62ef8736f2d90a" + integrity sha512-iiZaIvb3H/c7d3TH2HBeK91uI2rMhZNwnsIrvd7ZwGLkFw6mmunOCoVnjdYua662MqGFxlN9xTq4fv9hgR4VXQ== + +"@svgr/babel-plugin-remove-jsx-empty-expression@*": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-7.0.0.tgz#5154ff1213509e36ab315974c8c2fd48dafb827b" + integrity sha512-sQQmyo+qegBx8DfFc04PFmIO1FP1MHI1/QEpzcIcclo5OAISsOJPW76ZIs0bDyO/DBSJEa/tDa1W26pVtt0FRw== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" + integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== + +"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" + integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== + +"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" + integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== + +"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" + integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== + +"@svgr/babel-plugin-transform-svg-component@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" + integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== + +"@svgr/babel-preset@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" + integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" + "@svgr/babel-plugin-remove-jsx-attribute" "*" + "@svgr/babel-plugin-remove-jsx-empty-expression" "*" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" + "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" + "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" + "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" + "@svgr/babel-plugin-transform-svg-component" "^6.5.1" + +"@svgr/core@^6.1.2": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" + integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + +"@svgr/hast-util-to-babel-ast@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" + integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== + dependencies: + "@babel/types" "^7.20.0" + entities "^4.4.0" + +"@svgr/plugin-jsx@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" + integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/hast-util-to-babel-ast" "^6.5.1" + svg-parser "^2.0.4" + +"@svgr/plugin-svgo@^6.1.2": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" + integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== + dependencies: + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + svgo "^2.8.0" + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -2388,6 +2557,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.3.tgz#f0b991c32cfc6a4e7f3399d6cb4b8cf9a0315014" integrity sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" @@ -3178,6 +3352,13 @@ babel-loader@^8.2.3: make-dir "^3.1.0" schema-utils "^2.6.5" +babel-plugin-inline-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-inline-import/-/babel-plugin-inline-import-3.0.0.tgz#220eb2a52f8e779d8fb89447f950275e1e3f5981" + integrity sha512-thnykl4FMb8QjMjVCuZoUmAM7r2mnTn5qJwrryCvDv6rugbJlTHZMctdjDtEgD0WBAXJOLJSGXN3loooEwx7UQ== + dependencies: + require-resolve "0.0.2" + babel-plugin-module-resolver@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz#22a4f32f7441727ec1fbf4967b863e1e3e9f33e2" @@ -4165,6 +4346,17 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: js-yaml "^3.13.1" parse-json "^4.0.0" +cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + cross-fetch@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" @@ -4440,6 +4632,11 @@ deepmerge@^4.0.0: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + default-gateway@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" @@ -4746,7 +4943,7 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^4.2.0: +entities@^4.2.0, entities@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== @@ -7036,7 +7233,7 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-parse-even-better-errors@^2.3.1: +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -7486,53 +7683,53 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -metro-babel-transformer@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.73.8.tgz#521374cb9234ba126f3f8d63588db5901308b4ed" - integrity sha512-GO6H/W2RjZ0/gm1pIvdO9EP34s3XN6kzoeyxqmfqKfYhJmYZf1SzXbyiIHyMbJNwJVrsKuHqu32+GopTlKscWw== +metro-babel-transformer@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.73.9.tgz#bec8aaaf1bbdc2e469fde586fde455f8b2a83073" + integrity sha512-DlYwg9wwYIZTHtic7dyD4BP0SDftoltZ3clma76nHu43blMWsCnrImHeHsAVne3XsQ+RJaSRxhN5nkG2VyVHwA== dependencies: "@babel/core" "^7.20.0" hermes-parser "0.8.0" - metro-source-map "0.73.8" + metro-source-map "0.73.9" nullthrows "^1.1.1" -metro-cache-key@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.73.8.tgz#afc9f63454edbd9d207544445a66e8a4e119462d" - integrity sha512-VzFGu4kJGIkLjyDgVoM2ZxIHlMdCZWMqVIux9N+EeyMVMvGXTiXW8eGROgxzDhVjyR58IjfMsYpRCKz5dR+2ew== +metro-cache-key@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.73.9.tgz#7d8c441a3b7150f7b201273087ef3cf7d3435d9f" + integrity sha512-uJg+6Al7UoGIuGfoxqPBy6y1Ewq7Y8/YapGYIDh6sohInwt/kYKnPZgLDYHIPvY2deORnQ/2CYo4tOeBTnhCXQ== -metro-cache@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.73.8.tgz#85e2d7f7c7c74d1f942b7ecd168f7aceb987d883" - integrity sha512-/uFbTIw813Rvb8kSAIHvax9gWl41dtgjY2SpJLNIBLdQ6oFZ3CVo3ahZIiEZOrCeHl9xfGn5tmvNb8CEFa/Q5w== +metro-cache@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.73.9.tgz#773c2df6ba53434e58ccbe421b0c54e6da8d2890" + integrity sha512-upiRxY8rrQkUWj7ieACD6tna7xXuXdu2ZqrheksT79ePI0aN/t0memf6WcyUtJUMHZetke3j+ppELNvlmp3tOw== dependencies: - metro-core "0.73.8" + metro-core "0.73.9" rimraf "^3.0.2" -metro-config@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.73.8.tgz#8f6c22c94528919635c6688ed8d2ad8a10c70b27" - integrity sha512-sAYq+llL6ZAfro64U99ske8HcKKswxX4wIZbll9niBKG7TkWm7tfMY1jO687XEmE4683rHncZeBRav9pLngIzg== +metro-config@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.73.9.tgz#6b43c70681bdd6b00f44400fc76dddbe53374500" + integrity sha512-NiWl1nkYtjqecDmw77tbRbXnzIAwdO6DXGZTuKSkH+H/c1NKq1eizO8Fe+NQyFtwR9YLqn8Q0WN1nmkwM1j8CA== dependencies: cosmiconfig "^5.0.5" jest-validate "^26.5.2" - metro "0.73.8" - metro-cache "0.73.8" - metro-core "0.73.8" - metro-runtime "0.73.8" + metro "0.73.9" + metro-cache "0.73.9" + metro-core "0.73.9" + metro-runtime "0.73.9" -metro-core@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.73.8.tgz#a31ba7d7bfe3f4c2ac2c7a2493aa4229ecad701e" - integrity sha512-Aew4dthbZf8bRRjlYGL3cnai3+LKYTf6mc7YS2xLQRWtgGZ1b/H8nQtBvXZpfRYFcS84UeEQ10vwIf5eR3qPdQ== +metro-core@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.73.9.tgz#410c5c0aeae840536c10039f68098fdab3da568e" + integrity sha512-1NTs0IErlKcFTfYyRT3ljdgrISWpl1nys+gaHkXapzTSpvtX9F1NQNn5cgAuE+XIuTJhbsCdfIJiM2JXbrJQaQ== dependencies: lodash.throttle "^4.1.1" - metro-resolver "0.73.8" + metro-resolver "0.73.9" -metro-file-map@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.73.8.tgz#88d666e7764e1b0adf5fd634d91e97e3135d2db7" - integrity sha512-CM552hUO9om02jJdLszOCIDADKNaaeVz8CjYXItndvgr5jmFlQYAR+UMvaDzeT8oYdAV1DXAljma2CS2UBymPg== +metro-file-map@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.73.9.tgz#09c04a8e8ef1eaa6ecb2b9cb8cb53bb0fa0167ec" + integrity sha512-R/Wg3HYeQhYY3ehWtfedw8V0ne4lpufG7a21L3GWer8tafnC9pmjoCKEbJz9XZkVj9i1FtxE7UTbrtZNeIILxQ== dependencies: abort-controller "^3.0.0" anymatch "^3.0.3" @@ -7550,32 +7747,32 @@ metro-file-map@0.73.8: optionalDependencies: fsevents "^2.3.2" -metro-hermes-compiler@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.73.8.tgz#c522e2c97afc8bdc249755d88146a75720bc2498" - integrity sha512-2d7t+TEoQLk+jyXgBykmAtPPJK2B46DB3qUYIMKDFDDaKzCljrojyVuGgQq6SM1f95fe6HDAQ3K9ihTjeB90yw== +metro-hermes-compiler@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.73.9.tgz#6f473e67e8f76066066f00e2e0ecce865f7d445d" + integrity sha512-5B3vXIwQkZMSh3DQQY23XpTCpX9kPLqZbA3rDuAcbGW0tzC3f8dCenkyBb0GcCzyTDncJeot/A7oVCVK6zapwg== -metro-inspector-proxy@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.73.8.tgz#67d5aadfc33fe97f61c716eb168db4bd5d0e3c96" - integrity sha512-F0QxwDTox0TDeXVRN7ZmI7BknBjPDVKQ1ZeKznFBiMa0SXiD1kzoksfpDbZ6hTEKrhVM9Ep0YQmC7avwZouOnA== +metro-inspector-proxy@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.73.9.tgz#8e11cd300adf3f904f1f5afe28b198312cdcd8c2" + integrity sha512-B3WrWZnlYhtTrv0IaX3aUAhi2qVILPAZQzb5paO1e+xrz4YZHk9c7dXv7qe7B/IQ132e3w46y3AL7rFo90qVjA== dependencies: connect "^3.6.5" debug "^2.2.0" ws "^7.5.1" yargs "^17.5.1" -metro-minify-terser@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.73.8.tgz#a0fe857d6aaf99cba3a2aef59ee06ac409682c6b" - integrity sha512-pnagyXAoMPhihWrHRIWqCxrP6EJ8Hfugv5RXBb6HbOANmwajn2uQuzeu18+dXaN1yPoDCMCgpg/UA4ibFN5jtQ== +metro-minify-terser@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.73.9.tgz#301aef2e106b0802f7a14ef0f2b4883b20c80018" + integrity sha512-MTGPu2qV5qtzPJ2SqH6s58awHDtZ4jd7lmmLR+7TXDwtZDjIBA0YVfI0Zak2Haby2SqoNKrhhUns/b4dPAQAVg== dependencies: terser "^5.15.0" -metro-minify-uglify@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.73.8.tgz#b2e2430014c340479db4fc393a2ea4c5bad75ecd" - integrity sha512-9wZqKfraVfmtMXdOzRyan+6r1woQXqqa4KeXfVh7+Mxl+5+J0Lmw6EvTrWawsaOEpvpn32q9MfoHC1d8plDJwA== +metro-minify-uglify@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.73.9.tgz#cf4f8c19b688deea103905689ec736c2f2acd733" + integrity sha512-gzxD/7WjYcnCNGiFJaA26z34rjOp+c/Ft++194Wg91lYep3TeWQ0CnH8t2HRS7AYDHU81SGWgvD3U7WV0g4LGA== dependencies: uglify-es "^3.1.9" @@ -7623,10 +7820,10 @@ metro-react-native-babel-preset@0.73.7: "@babel/template" "^7.0.0" react-refresh "^0.4.0" -metro-react-native-babel-preset@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.8.tgz#04908f264f5d99c944ae20b5b11f659431328431" - integrity sha512-spNrcQJTbQntEIqJnCA6yL4S+dzV9fXCk7U+Rm7yJasZ4o4Frn7jP23isu7FlZIp1Azx1+6SbP7SgQM+IP5JgQ== +metro-react-native-babel-preset@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.9.tgz#ef54637dd20f025197beb49e71309a9c539e73e2" + integrity sha512-AoD7v132iYDV4K78yN2OLgTPwtAKn0XlD2pOhzyBxiI8PeXzozhbKyPV7zUOJUPETj+pcEVfuYj5ZN/8+bhbCw== dependencies: "@babel/core" "^7.20.0" "@babel/plugin-proposal-async-generator-functions" "^7.0.0" @@ -7667,64 +7864,64 @@ metro-react-native-babel-preset@0.73.8: "@babel/template" "^7.0.0" react-refresh "^0.4.0" -metro-react-native-babel-transformer@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.73.8.tgz#cbcd4b243216878431dc4311ce46f02a928e3991" - integrity sha512-oH/LCCJPauteAE28c0KJAiSrkV+1VJbU0PwA9UwaWnle+qevs/clpKQ8LrIr33YbBj4CiI1kFoVRuNRt5h4NFg== +metro-react-native-babel-transformer@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.73.9.tgz#4f4f0cfa5119bab8b53e722fabaf90687d0cbff0" + integrity sha512-DSdrEHuQ22ixY7DyipyKkIcqhOJrt5s6h6X7BYJCP9AMUfXOwLe2biY3BcgJz5GOXv8/Akry4vTCvQscVS1otQ== dependencies: "@babel/core" "^7.20.0" babel-preset-fbjs "^3.4.0" hermes-parser "0.8.0" - metro-babel-transformer "0.73.8" - metro-react-native-babel-preset "0.73.8" - metro-source-map "0.73.8" + metro-babel-transformer "0.73.9" + metro-react-native-babel-preset "0.73.9" + metro-source-map "0.73.9" nullthrows "^1.1.1" -metro-resolver@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.73.8.tgz#65cc158575d130363296f66a33257c7971228640" - integrity sha512-GiBWont7/OgAftkkj2TiEp+Gf1PYZUk8xV4MbtnQjIKyy3MlGY3GbpMQ1BHih9GUQqlF0n9jsUlC2K5P0almXQ== +metro-resolver@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.73.9.tgz#f3cf77e6c7606a34aa81bad40edb856aad671cf3" + integrity sha512-Ej3wAPOeNRPDnJmkK0zk7vJ33iU07n+oPhpcf5L0NFkWneMmSM2bflMPibI86UjzZGmRfn0AhGhs8yGeBwQ/Xg== dependencies: absolute-path "^0.0.0" -metro-runtime@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.73.8.tgz#dadae7c154fbbde24390cf7f7e7d934a2768cd18" - integrity sha512-M+Bg9M4EN5AEpJ8NkiUsawD75ifYvYfHi05w6QzHXaqOrsTeaRbbeLuOGCYxU2f/tPg17wQV97/rqUQzs9qEtA== +metro-runtime@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.73.9.tgz#0b24c0b066b8629ee855a6e5035b65061fef60d5" + integrity sha512-d5Hs83FpKB9r8q8Vb95+fa6ESpwysmPr4lL1I2rM2qXAFiO7OAPT9Bc23WmXgidkBtD0uUFdB2lG+H1ATz8rZg== dependencies: "@babel/runtime" "^7.0.0" react-refresh "^0.4.0" -metro-source-map@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.73.8.tgz#5134174e3d43de26ad331b95f637944c6547d441" - integrity sha512-wozFXuBYMAy7b8BCYwC+qoXsvayVJBHWtSTlSLva99t+CoUSG9JO9kg1umzbOz28YYPxKmvb/wbnLMkHdas2cA== +metro-source-map@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.73.9.tgz#89ca41f6346aeb12f7f23496fa363e520adafebe" + integrity sha512-l4VZKzdqafipriETYR6lsrwtavCF1+CMhCOY9XbyWeTrpGSNgJQgdeJpttzEZTHQQTLR0csQo0nD1ef3zEP6IQ== dependencies: "@babel/traverse" "^7.20.0" "@babel/types" "^7.20.0" invariant "^2.2.4" - metro-symbolicate "0.73.8" + metro-symbolicate "0.73.9" nullthrows "^1.1.1" - ob1 "0.73.8" + ob1 "0.73.9" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.73.8.tgz#96920f607bce484283d822ee5fe18d932f69c03d" - integrity sha512-xkBAcceYYp0GGdCCuMzkCF1ejHsd0lYlbKBkjSRgM0Nlj80VapPaSwumYoAvSaDxcbkvS7/sCjURGp5DsSFgRQ== +metro-symbolicate@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.73.9.tgz#cb452299a36e5b86b2826e7426d51221635c48bf" + integrity sha512-4TUOwxRHHqbEHxRqRJ3wZY5TA8xq7AHMtXrXcjegMH9FscgYztsrIG9aNBUBS+VLB6g1qc6BYbfIgoAnLjCDyw== dependencies: invariant "^2.2.4" - metro-source-map "0.73.8" + metro-source-map "0.73.9" nullthrows "^1.1.1" source-map "^0.5.6" through2 "^2.0.1" vlq "^1.0.0" -metro-transform-plugins@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.73.8.tgz#07be7fd94a448ea1b245ab02ce7d277d757f9a32" - integrity sha512-IxjlnB5eA49M0WfvPEzvRikK3Rr6bECUUfcZt/rWpSphq/mttgyLYcHQ+VTZZl0zHolC3cTLwgoDod4IIJBn1A== +metro-transform-plugins@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.73.9.tgz#9fffbe1b24269e3d114286fa681abc570072d9b8" + integrity sha512-r9NeiqMngmooX2VOKLJVQrMuV7PAydbqst5bFhdVBPcFpZkxxqyzjzo+kzrszGy2UpSQBZr2P1L6OMjLHwQwfQ== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" @@ -7732,29 +7929,29 @@ metro-transform-plugins@0.73.8: "@babel/traverse" "^7.20.0" nullthrows "^1.1.1" -metro-transform-worker@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.73.8.tgz#701a006c2b4d93f1bb24802f3f2834c963153db9" - integrity sha512-B8kR6lmcvyG4UFSF2QDfr/eEnWJvg0ZadooF8Dg6m/3JSm9OAqfSoC0YrWqAuvtWImNDnbeKWN7/+ns44Hv6tg== +metro-transform-worker@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.73.9.tgz#30384cef2d5e35a4abe91b15bf1a8344f5720441" + integrity sha512-Rq4b489sIaTUENA+WCvtu9yvlT/C6zFMWhU4sq+97W29Zj0mPBjdk+qGT5n1ZBgtBIJzZWt1KxeYuc17f4aYtQ== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" "@babel/parser" "^7.20.0" "@babel/types" "^7.20.0" babel-preset-fbjs "^3.4.0" - metro "0.73.8" - metro-babel-transformer "0.73.8" - metro-cache "0.73.8" - metro-cache-key "0.73.8" - metro-hermes-compiler "0.73.8" - metro-source-map "0.73.8" - metro-transform-plugins "0.73.8" + metro "0.73.9" + metro-babel-transformer "0.73.9" + metro-cache "0.73.9" + metro-cache-key "0.73.9" + metro-hermes-compiler "0.73.9" + metro-source-map "0.73.9" + metro-transform-plugins "0.73.9" nullthrows "^1.1.1" -metro@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.73.8.tgz#25f014e4064eb34a4833c316e0a9094528061a8c" - integrity sha512-2EMJME9w5x7Uzn+DnQ4hzWr33u/aASaOBGdpf4lxbrlk6/vl4UBfX1sru6KU535qc/0Z1BMt4Vq9qsP3ZGFmWg== +metro@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.73.9.tgz#150e69a6735fab0bcb4f6ee97fd1efc65b3ec36f" + integrity sha512-BlYbPmTF60hpetyNdKhdvi57dSqutb+/oK0u3ni4emIh78PiI0axGo7RfdsZ/mn3saASXc94tDbpC5yn7+NpEg== dependencies: "@babel/code-frame" "^7.0.0" "@babel/core" "^7.20.0" @@ -7778,23 +7975,23 @@ metro@0.73.8: invariant "^2.2.4" jest-worker "^27.2.0" lodash.throttle "^4.1.1" - metro-babel-transformer "0.73.8" - metro-cache "0.73.8" - metro-cache-key "0.73.8" - metro-config "0.73.8" - metro-core "0.73.8" - metro-file-map "0.73.8" - metro-hermes-compiler "0.73.8" - metro-inspector-proxy "0.73.8" - metro-minify-terser "0.73.8" - metro-minify-uglify "0.73.8" - metro-react-native-babel-preset "0.73.8" - metro-resolver "0.73.8" - metro-runtime "0.73.8" - metro-source-map "0.73.8" - metro-symbolicate "0.73.8" - metro-transform-plugins "0.73.8" - metro-transform-worker "0.73.8" + metro-babel-transformer "0.73.9" + metro-cache "0.73.9" + metro-cache-key "0.73.9" + metro-config "0.73.9" + metro-core "0.73.9" + metro-file-map "0.73.9" + metro-hermes-compiler "0.73.9" + metro-inspector-proxy "0.73.9" + metro-minify-terser "0.73.9" + metro-minify-uglify "0.73.9" + metro-react-native-babel-preset "0.73.9" + metro-resolver "0.73.9" + metro-runtime "0.73.9" + metro-source-map "0.73.9" + metro-symbolicate "0.73.9" + metro-transform-plugins "0.73.9" + metro-transform-worker "0.73.9" mime-types "^2.1.27" node-fetch "^2.2.0" nullthrows "^1.1.1" @@ -8239,10 +8436,10 @@ nullthrows@1.1.1, nullthrows@^1.1.1: resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== -ob1@0.73.8: - version "0.73.8" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.73.8.tgz#c569f1a15ce2d04da6fd70293ad44b5a93b11978" - integrity sha512-1F7j+jzD+edS6ohQP7Vg5f3yiIk5i3x1uLrNIHOmLHWzWK1t3zrDpjnoXghccdVlsU+UjbyURnDynm4p0GgXeA== +ob1@0.73.9: + version "0.73.9" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.73.9.tgz#d5677a0dd3e2f16ad84231278d79424436c38c59" + integrity sha512-kHOzCOFXmAM26fy7V/YuXNKne2TyRiXbFAvPBIbuedJCZZWQZHLdPzMeXJI4Egt6IcfDttRzN3jQ90wOwq1iNw== object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" @@ -8616,6 +8813,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse-png@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/parse-png/-/parse-png-2.1.0.tgz#2a42ad719fedf90f81c59ebee7ae59b280d6b338" @@ -8654,6 +8861,11 @@ path-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== +path-dirname@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -8664,6 +8876,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-extra@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/path-extra/-/path-extra-1.0.3.tgz#7c112189a6e50d595790e7ad2037e44e410c1166" + integrity sha512-vYm3+GCkjUlT1rDvZnDVhNLXIRvwFPaN8ebHAFcuMJM/H0RBOPD7JrcldiNLd9AS3dhAyUHLa4Hny5wp1A+Ffw== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -9311,10 +9528,10 @@ react-native-codegen@^0.71.5: jscodeshift "^0.13.1" nullthrows "^1.1.1" -react-native-gradle-plugin@^0.71.16: - version "0.71.16" - resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.16.tgz#822bb0c680e03b5df5aa65f2e5ffc2bc2930854a" - integrity sha512-H2BjG2zk7B7Wii9sXvd9qhCVRQYDAHSWdMw9tscmZBqSP62DkIWEQSk4/B2GhQ4aK9ydVXgtqR6tBeg3yy8TSA== +react-native-gradle-plugin@^0.71.17: + version "0.71.17" + resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.17.tgz#cf780a27270f0a32dca8184eff91555d7627dd00" + integrity sha512-OXXYgpISEqERwjSlaCiaQY6cTY5CH6j73gdkWpK0hedxtiWMWgH+i5TOi4hIGYitm9kQBeyDu+wim9fA8ROFJA== react-native-safe-area-context@4.5.0: version "4.5.0" @@ -9329,6 +9546,20 @@ react-native-screens@~3.20.0: react-freeze "^1.0.0" warn-once "^0.1.0" +react-native-select-dropdown@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/react-native-select-dropdown/-/react-native-select-dropdown-3.3.2.tgz#f874bc48f7633b914c202782bbbf988a8b5863a2" + integrity sha512-2rsPgAzeZ4Pdsf/kCuwYyzmLd5OO+cT3yZ0gAvVZ9C+5xkchiY7iE9u5M5F0DCgMqmwJjBBsiBEvULJ/Eaxpng== + +react-native-svg-transformer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/react-native-svg-transformer/-/react-native-svg-transformer-1.0.0.tgz#7a707e5e95d20321b5f3dcfd0c3c8762ebd0221b" + integrity sha512-ALHU5VvLLyKM/BvyEG7VYJmqglvaXtU7mGRCxrEwwpJO/GBf1ZMUzc4AeJAjSodj7yYtlDYRxNSt9ySWpaa6JQ== + dependencies: + "@svgr/core" "^6.1.2" + "@svgr/plugin-svgo" "^6.1.2" + path-dirname "^1.0.2" + react-native-svg@13.4.0: version "13.4.0" resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-13.4.0.tgz#82399ba0956c454144618aa581e2d748dd3f010a" @@ -9337,15 +9568,15 @@ react-native-svg@13.4.0: css-select "^5.1.0" css-tree "^1.1.3" -react-native@0.71.4: - version "0.71.4" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.71.4.tgz#f03f600efe68f745d19454ab17f9c1a9ef304790" - integrity sha512-3hSYqvWrOdKhpV3HpEKp1/CkWx8Sr/N/miCrmUIAsVTSJUR7JW0VvIsrV9urDhUj/s6v2WF4n7qIEEJsmTCrPw== +react-native@0.71.6: + version "0.71.6" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.71.6.tgz#e8f07baf55abd1015eaa7040ceaa4aa632c2c04f" + integrity sha512-gHrDj7qaAaiE41JwaFCh3AtvOqOLuRgZtHKzNiwxakG/wvPAYmG73ECfWHGxjxIx/QT17Hp37Da3ipCei/CayQ== dependencies: "@jest/create-cache-key-function" "^29.2.1" - "@react-native-community/cli" "10.2.0" + "@react-native-community/cli" "10.2.2" "@react-native-community/cli-platform-android" "10.2.0" - "@react-native-community/cli-platform-ios" "10.2.0" + "@react-native-community/cli-platform-ios" "10.2.1" "@react-native/assets" "1.0.0" "@react-native/normalize-color" "2.1.0" "@react-native/polyfills" "2.0.0" @@ -9358,16 +9589,16 @@ react-native@0.71.4: jest-environment-node "^29.2.1" jsc-android "^250231.0.0" memoize-one "^5.0.0" - metro-react-native-babel-transformer "0.73.8" - metro-runtime "0.73.8" - metro-source-map "0.73.8" + metro-react-native-babel-transformer "0.73.9" + metro-runtime "0.73.9" + metro-source-map "0.73.9" mkdirp "^0.5.1" nullthrows "^1.1.1" pretty-format "^26.5.2" promise "^8.3.0" react-devtools-core "^4.26.1" react-native-codegen "^0.71.5" - react-native-gradle-plugin "^0.71.16" + react-native-gradle-plugin "^0.71.17" react-refresh "^0.4.0" react-shallow-renderer "^16.15.0" regenerator-runtime "^0.13.2" @@ -9599,6 +9830,13 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +require-resolve@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/require-resolve/-/require-resolve-0.0.2.tgz#bab410ab1aee2f3f55b79317451dd3428764e6f3" + integrity sha512-eafQVaxdQsWUB8HybwognkdcIdKdQdQBwTxH48FuE6WI0owZGKp63QYr1MRp73PoX0AcyB7MDapZThYUY8FD0A== + dependencies: + x-path "^0.0.2" + requireg@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/requireg/-/requireg-0.2.2.tgz#437e77a5316a54c9bcdbbf5d1f755fe093089830" @@ -10582,7 +10820,12 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svgo@^2.7.0: +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^2.7.0, svgo@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== @@ -11428,6 +11671,13 @@ ws@^8.13.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== +x-path@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/x-path/-/x-path-0.0.2.tgz#294d076bb97a7706cc070bbb2a6fd8c54df67b12" + integrity sha512-zQ4WFI0XfJN1uEkkrB19Y4TuXOlHqKSxUJo0Yt+axPjRm8tCG6SJ6+Wo3/+Kjg4c2c8IvBXuJ0uYoshxNn4qMw== + dependencies: + path-extra "^1.0.2" + xcode@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/xcode/-/xcode-3.0.1.tgz#3efb62aac641ab2c702458f9a0302696146aa53c" @@ -11553,7 +11803,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.2: +yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==