From 76fe9c4d298342e88663a584e39e1713a6f5c723 Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Mon, 6 Apr 2026 20:04:21 -0300 Subject: [PATCH 01/54] =?UTF-8?q?scrum-78=20tela=20de=20editar=20hist?= =?UTF-8?q?=C3=B3ria=20e=20toggle=20de=20escrever=20ou=20gravar=20=C3=A1ud?= =?UTF-8?q?io?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(mybusiness)/editStory.tsx | 32 +++++++++++++ app/_layout.tsx | 1 + components/editStory/audioBox.tsx | 55 ++++++++++++++++++++++ components/editStory/checklist.tsx | 14 ++++++ components/editStory/checklistButton.tsx | 51 ++++++++++++++++++++ components/editStory/inputBox.tsx | 33 +++++++++++++ components/editStory/toggleWrite.tsx | 25 ++++++++++ components/editStory/toggleWriteButton.tsx | 42 +++++++++++++++++ components/overview/editButton.tsx | 4 +- 9 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 app/(mybusiness)/editStory.tsx create mode 100644 components/editStory/audioBox.tsx create mode 100644 components/editStory/checklist.tsx create mode 100644 components/editStory/checklistButton.tsx create mode 100644 components/editStory/inputBox.tsx create mode 100644 components/editStory/toggleWrite.tsx create mode 100644 components/editStory/toggleWriteButton.tsx diff --git a/app/(mybusiness)/editStory.tsx b/app/(mybusiness)/editStory.tsx new file mode 100644 index 0000000..1b1f514 --- /dev/null +++ b/app/(mybusiness)/editStory.tsx @@ -0,0 +1,32 @@ +import AudioBox from '@/components/editStory/audioBox'; +import Checklist from '@/components/editStory/checklist'; +import InputBox from '@/components/editStory/inputBox'; +import ToggleWrite from '@/components/editStory/toggleWrite'; +import { Container } from '@/components/general/container'; +import { Header } from '@/components/general/header'; +import { useState } from 'react'; +import { Text, View } from 'react-native'; + +export default function EditStory() { + const [toggle, setToggle] = useState<'WRITE' | 'AUDIO'>('WRITE') + const [text, setText] = useState('') + const [audio, setAudio] = useState('') + + return ( + + +
+ Conte sua história para nosso assistente, que vai resumir de uma forma objetiva e original. + + {toggle === 'WRITE' && + + } + { + toggle === 'AUDIO' && + + } + + + + ); +} diff --git a/app/_layout.tsx b/app/_layout.tsx index 83d1b3c..1f08e15 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -15,6 +15,7 @@ export default function RootLayout() { + diff --git a/components/editStory/audioBox.tsx b/components/editStory/audioBox.tsx new file mode 100644 index 0000000..2900148 --- /dev/null +++ b/components/editStory/audioBox.tsx @@ -0,0 +1,55 @@ +import Ionicons from "@expo/vector-icons/Ionicons" +import { Pressable, Text, View } from "react-native" +import Animated, { + useAnimatedStyle, + useSharedValue, + withRepeat, + withTiming +} from "react-native-reanimated" + +type Props = { + audio: string + setAudio: (s: string) => void +} + +export default function AudioBox({ audio, setAudio }: Props) { + + const scale = useSharedValue(1) + + const animatedStyle = useAnimatedStyle(() => { + return { + transform: [{ scale: scale.value }] + } + }) + + const handlePressIn = () => { + scale.value = withRepeat( + withTiming(1.2, { duration: 600 }), + -1, + true + ) + } + + const handlePressOut = () => { + scale.value = withTiming(1, { duration: 200 }) + } + + return ( + + + + + + + + + + Toque para começar a gravar + + + ) +} \ No newline at end of file diff --git a/components/editStory/checklist.tsx b/components/editStory/checklist.tsx new file mode 100644 index 0000000..d4719f1 --- /dev/null +++ b/components/editStory/checklist.tsx @@ -0,0 +1,14 @@ +import { Text, View } from 'react-native'; +import ChecklistButton from './checklistButton'; + +export default function Checklist() { + return ( + + Dicas para uma boa descrição + + + + + + ); +} diff --git a/components/editStory/checklistButton.tsx b/components/editStory/checklistButton.tsx new file mode 100644 index 0000000..b5bde8b --- /dev/null +++ b/components/editStory/checklistButton.tsx @@ -0,0 +1,51 @@ +import { useEffect } from "react" +import { Pressable, Text } from "react-native" +import Animated, { + interpolateColor, + useAnimatedStyle, + useSharedValue, + withTiming +} from "react-native-reanimated" + +type Props = { + text: string + check: boolean +} + +export default function ChecklistButton({ text, check }: Props) { + + const progress = useSharedValue(check ? 1 : 0) + + useEffect(() => { + progress.value = withTiming(check ? 1 : 0, { duration: 250 }) + }, [check]) + + const animatedStyle = useAnimatedStyle(() => { + return { + backgroundColor: interpolateColor( + progress.value, + [0, 1], + ['transparent', '#C34342'] // verde + ), + borderColor: interpolateColor( + progress.value, + [0, 1], + ['#000', '#C34342'] + ) + } + }) + + return ( + + + + + + {text} + + + ) +} \ No newline at end of file diff --git a/components/editStory/inputBox.tsx b/components/editStory/inputBox.tsx new file mode 100644 index 0000000..9e8061a --- /dev/null +++ b/components/editStory/inputBox.tsx @@ -0,0 +1,33 @@ +import { useState } from "react" +import { TextInput, View } from "react-native" + +type Props = { + text: string, + setText: (s: string) => void +} + +export default function InputBox({ text, setText }: Props) { + + const [isFocused, setIsFocused] = useState(false) + + return ( + + setIsFocused(true)} + onBlur={() => setIsFocused(false)} + className="text-base text-black" + /> + + ) +} \ No newline at end of file diff --git a/components/editStory/toggleWrite.tsx b/components/editStory/toggleWrite.tsx new file mode 100644 index 0000000..4f276c8 --- /dev/null +++ b/components/editStory/toggleWrite.tsx @@ -0,0 +1,25 @@ +import { View } from "react-native"; +import ToggleWriteButton from "./toggleWriteButton"; + +type Props = { + toggle: 'WRITE' | 'AUDIO' + setToggle: (s: 'WRITE' | 'AUDIO')=> void +} +export default function ToggleWrite ({toggle, setToggle}: Props) { + return( + + setToggle('WRITE')} + /> + setToggle("AUDIO")} + /> + + ) +} \ No newline at end of file diff --git a/components/editStory/toggleWriteButton.tsx b/components/editStory/toggleWriteButton.tsx new file mode 100644 index 0000000..4e1085a --- /dev/null +++ b/components/editStory/toggleWriteButton.tsx @@ -0,0 +1,42 @@ +import { Pressable, Text } from "react-native" +import Animated, { + useAnimatedStyle, + withTiming +} from "react-native-reanimated" + +type Props = { + text: string + tag: 'WRITE' | 'AUDIO' + toggle: 'WRITE' | 'AUDIO' + handlePress: (s: 'WRITE' | 'AUDIO') => void +} + +export default function ToggleWriteButton({ + text, + handlePress, + toggle, + tag +}: Props) { + + const animatedStyle = useAnimatedStyle(() => { + const isActive = toggle === tag + + return { + backgroundColor: withTiming( + isActive ? '#ffffff' : 'transparent', + { duration: 300 } + ) + } + }) + + return ( + + handlePress(tag)} + > + {text} + + + ) +} \ No newline at end of file diff --git a/components/overview/editButton.tsx b/components/overview/editButton.tsx index d225e81..bcec225 100644 --- a/components/overview/editButton.tsx +++ b/components/overview/editButton.tsx @@ -1,12 +1,12 @@ import Ionicons from '@expo/vector-icons/Ionicons'; +import { router } from 'expo-router'; import { Pressable, StyleSheet, Text, View } from 'react-native'; export default function EditButton() { - const handleEditButton = () => {}; return ( router.navigate('/(mybusiness)/editStory')} className="flex-row justify-between items-center" > From c718d6a468e4c5caf22804638e4af8ca7df2de2f Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Mon, 6 Apr 2026 22:45:40 -0300 Subject: [PATCH 02/54] =?UTF-8?q?scrum-78=20eslint=20corre=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/editStory/audioBox.tsx | 12 ++++++------ components/editStory/checklistButton.tsx | 14 +++++++------- components/editStory/inputBox.tsx | 4 ++-- components/editStory/toggleWrite.tsx | 6 +++--- components/editStory/toggleWriteButton.tsx | 12 ++++++------ 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/components/editStory/audioBox.tsx b/components/editStory/audioBox.tsx index 2900148..301510f 100644 --- a/components/editStory/audioBox.tsx +++ b/components/editStory/audioBox.tsx @@ -1,11 +1,11 @@ -import Ionicons from "@expo/vector-icons/Ionicons" -import { Pressable, Text, View } from "react-native" +import Ionicons from '@expo/vector-icons/Ionicons' +import { Pressable, Text, View } from 'react-native' import Animated, { useAnimatedStyle, useSharedValue, withRepeat, - withTiming -} from "react-native-reanimated" + withTiming, +} from 'react-native-reanimated' type Props = { audio: string @@ -18,7 +18,7 @@ export default function AudioBox({ audio, setAudio }: Props) { const animatedStyle = useAnimatedStyle(() => { return { - transform: [{ scale: scale.value }] + transform: [{ scale: scale.value }], } }) @@ -26,7 +26,7 @@ export default function AudioBox({ audio, setAudio }: Props) { scale.value = withRepeat( withTiming(1.2, { duration: 600 }), -1, - true + true, ) } diff --git a/components/editStory/checklistButton.tsx b/components/editStory/checklistButton.tsx index b5bde8b..e125c04 100644 --- a/components/editStory/checklistButton.tsx +++ b/components/editStory/checklistButton.tsx @@ -1,11 +1,11 @@ -import { useEffect } from "react" -import { Pressable, Text } from "react-native" +import { useEffect } from 'react' +import { Pressable, Text } from 'react-native' import Animated, { interpolateColor, useAnimatedStyle, useSharedValue, - withTiming -} from "react-native-reanimated" + withTiming, +} from 'react-native-reanimated' type Props = { text: string @@ -25,13 +25,13 @@ export default function ChecklistButton({ text, check }: Props) { backgroundColor: interpolateColor( progress.value, [0, 1], - ['transparent', '#C34342'] // verde + ['transparent', '#C34342'], // verde ), borderColor: interpolateColor( progress.value, [0, 1], - ['#000', '#C34342'] - ) + ['#000', '#C34342'], + ), } }) diff --git a/components/editStory/inputBox.tsx b/components/editStory/inputBox.tsx index 9e8061a..511fdb7 100644 --- a/components/editStory/inputBox.tsx +++ b/components/editStory/inputBox.tsx @@ -1,5 +1,5 @@ -import { useState } from "react" -import { TextInput, View } from "react-native" +import { useState } from 'react' +import { TextInput, View } from 'react-native' type Props = { text: string, diff --git a/components/editStory/toggleWrite.tsx b/components/editStory/toggleWrite.tsx index 4f276c8..f5ef1f1 100644 --- a/components/editStory/toggleWrite.tsx +++ b/components/editStory/toggleWrite.tsx @@ -1,5 +1,5 @@ -import { View } from "react-native"; -import ToggleWriteButton from "./toggleWriteButton"; +import { View } from 'react-native'; +import ToggleWriteButton from './toggleWriteButton'; type Props = { toggle: 'WRITE' | 'AUDIO' @@ -18,7 +18,7 @@ export default function ToggleWrite ({toggle, setToggle}: Props) { text='Gravar Áudio' tag='AUDIO' toggle={toggle} - handlePress={()=> setToggle("AUDIO")} + handlePress={()=> setToggle('AUDIO')} /> ) diff --git a/components/editStory/toggleWriteButton.tsx b/components/editStory/toggleWriteButton.tsx index 4e1085a..919abf8 100644 --- a/components/editStory/toggleWriteButton.tsx +++ b/components/editStory/toggleWriteButton.tsx @@ -1,8 +1,8 @@ -import { Pressable, Text } from "react-native" +import { Pressable, Text } from 'react-native' import Animated, { useAnimatedStyle, - withTiming -} from "react-native-reanimated" + withTiming, +} from 'react-native-reanimated' type Props = { text: string @@ -15,7 +15,7 @@ export default function ToggleWriteButton({ text, handlePress, toggle, - tag + tag, }: Props) { const animatedStyle = useAnimatedStyle(() => { @@ -24,8 +24,8 @@ export default function ToggleWriteButton({ return { backgroundColor: withTiming( isActive ? '#ffffff' : 'transparent', - { duration: 300 } - ) + { duration: 300 }, + ), } }) From 011d249b100050bd9aa61d6346dea0ca9c741c9d Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Mon, 6 Apr 2026 22:49:23 -0300 Subject: [PATCH 03/54] scrum-78 lint fix 2 --- components/editStory/audioBox.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/editStory/audioBox.tsx b/components/editStory/audioBox.tsx index 301510f..65a7c35 100644 --- a/components/editStory/audioBox.tsx +++ b/components/editStory/audioBox.tsx @@ -14,6 +14,9 @@ type Props = { export default function AudioBox({ audio, setAudio }: Props) { + audio + setAudio + const scale = useSharedValue(1) const animatedStyle = useAnimatedStyle(() => { From 33d808a4b2d9d96eac10a7004ad8069aca63be99 Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Tue, 7 Apr 2026 19:35:29 -0300 Subject: [PATCH 04/54] =?UTF-8?q?scrum-80=20tela=20de=20edi=C3=A7=C3=A3o?= =?UTF-8?q?=20e=20upload=20de=20imagens=20do=20estabelecimento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(mybusiness)/editStory.tsx | 7 +++ app/(mybusiness)/manageImages.tsx | 17 ++++++ app/_layout.tsx | 1 + components/general/generalButton.tsx | 18 ++++++ components/manageImages/fileUpload.tsx | 63 +++++++++++++++++++++ components/manageImages/imageItem.tsx | 76 ++++++++++++++++++++++++++ components/manageImages/imagesList.tsx | 51 +++++++++++++++++ package-lock.json | 40 ++++++++++++-- package.json | 4 +- scripts/reset-project.js | 10 +++- 10 files changed, 279 insertions(+), 8 deletions(-) create mode 100644 app/(mybusiness)/manageImages.tsx create mode 100644 components/general/generalButton.tsx create mode 100644 components/manageImages/fileUpload.tsx create mode 100644 components/manageImages/imageItem.tsx create mode 100644 components/manageImages/imagesList.tsx diff --git a/app/(mybusiness)/editStory.tsx b/app/(mybusiness)/editStory.tsx index 1b1f514..a4a7e99 100644 --- a/app/(mybusiness)/editStory.tsx +++ b/app/(mybusiness)/editStory.tsx @@ -3,7 +3,9 @@ import Checklist from '@/components/editStory/checklist'; import InputBox from '@/components/editStory/inputBox'; import ToggleWrite from '@/components/editStory/toggleWrite'; import { Container } from '@/components/general/container'; +import GeneralButton from '@/components/general/generalButton'; import { Header } from '@/components/general/header'; +import { router } from 'expo-router'; import { useState } from 'react'; import { Text, View } from 'react-native'; @@ -12,6 +14,10 @@ export default function EditStory() { const [text, setText] = useState('') const [audio, setAudio] = useState('') + const handlePress = ()=> { + router.navigate('/(mybusiness)/manageImages') + } + return ( @@ -26,6 +32,7 @@ export default function EditStory() { } + ); diff --git a/app/(mybusiness)/manageImages.tsx b/app/(mybusiness)/manageImages.tsx new file mode 100644 index 0000000..69a4e3e --- /dev/null +++ b/app/(mybusiness)/manageImages.tsx @@ -0,0 +1,17 @@ +import { Container } from '@/components/general/container'; +import { Header } from '@/components/general/header'; +import FileUpload from '@/components/manageImages/fileUpload'; +import ImagesList from '@/components/manageImages/imagesList'; +import { View } from 'react-native'; + +export default function ManageImages () { + return( + + +
+ + + + + ) +} \ No newline at end of file diff --git a/app/_layout.tsx b/app/_layout.tsx index 1f08e15..f983bd7 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -16,6 +16,7 @@ export default function RootLayout() { + diff --git a/components/general/generalButton.tsx b/components/general/generalButton.tsx new file mode 100644 index 0000000..946627d --- /dev/null +++ b/components/general/generalButton.tsx @@ -0,0 +1,18 @@ +import { Pressable, Text } from 'react-native'; + +type Props = { + text: string + handlePress: ()=> void +} +export default function GeneralButton ({text, handlePress}: Props) { + return( + + + {text} + + + ) +} \ No newline at end of file diff --git a/components/manageImages/fileUpload.tsx b/components/manageImages/fileUpload.tsx new file mode 100644 index 0000000..ffd904a --- /dev/null +++ b/components/manageImages/fileUpload.tsx @@ -0,0 +1,63 @@ +import Ionicons from '@expo/vector-icons/Ionicons'; +import * as ImagePicker from 'expo-image-picker'; +import { Component } from 'react'; +import { Image, Pressable, Text, View } from 'react-native'; + +type State = { + image: string | null; +}; + +export default class FileUpload extends Component<{}, State> { + state: State = { + image: null, + }; + + pickImage = async () => { + const permission = await ImagePicker.requestMediaLibraryPermissionsAsync(); + + if (!permission.granted) { + alert('Permissão para acessar a galeria é necessária!'); + return; + } + + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ['images'], + quality: 1, + }); + + if (!result.canceled) { + this.setState({ image: result.assets[0].uri }); + } + }; + + render() { + const { image } = this.state; + + return ( + + + Imagens ou mídias + + + + + {image ? ( + + ) : ( + <> + + + Adicionar Imagem + + + )} + + + + ); + } +} \ No newline at end of file diff --git a/components/manageImages/imageItem.tsx b/components/manageImages/imageItem.tsx new file mode 100644 index 0000000..7da65a0 --- /dev/null +++ b/components/manageImages/imageItem.tsx @@ -0,0 +1,76 @@ +import * as ImagePicker from 'expo-image-picker'; +import { ActivityIndicator, Alert, Image, Pressable, Text, View } from 'react-native'; + +type Props = { + id: string; + uri: string; + onDelete: () => void; + onReplace: (newUri: string) => void; + isLoading?: boolean; +}; + +export default function ImageItem({ + uri, + onDelete, + onReplace, + isLoading = false, +}: Props) { + + async function handlePickImage() { + const permission = await ImagePicker.requestMediaLibraryPermissionsAsync(); + + if (!permission.granted) { + Alert.alert('Permissão necessária', 'Você precisa permitir acesso à galeria.'); + return; + } + + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ['images'], // novo padrão + quality: 1, + }); + + if (!result.canceled) { + const newUri = result.assets[0].uri; + + onReplace(newUri); + } + } + + return ( + + + + + {/* 🔄 Substituir */} + + {isLoading ? ( + + ) : ( + + Substituir + + )} + + + {/* 🗑️ Deletar */} + + + Deletar + + + + + ); +} \ No newline at end of file diff --git a/components/manageImages/imagesList.tsx b/components/manageImages/imagesList.tsx new file mode 100644 index 0000000..af3de5e --- /dev/null +++ b/components/manageImages/imagesList.tsx @@ -0,0 +1,51 @@ +import { useState } from 'react'; +import { Text, View } from 'react-native'; +import ImageItem from './imageItem'; + +type ImageType = { + id: string; + uri: string; +}; + +export default function ImagesList() { + const [images, setImages] = useState([ + { id: '1', uri: 'https://picsum.photos/id/1018/800/400' }, + { id: '2', uri: 'https://picsum.photos/id/1015/800/400' }, + { id: '3', uri: 'https://picsum.photos/id/1019/800/400' }, + { id: '4', uri: 'https://picsum.photos/id/1020/800/400' }, + { id: '5', uri: 'https://picsum.photos/id/1024/800/400' }, + ]); + + // DELETE (simulando API) + function handleDelete(id: string) { + setImages(prev => prev.filter(img => img.id !== id)); + } + + // UPDATE / REPLACE (simulando API) + function handleReplace(id: string) { + const newImage = `https://picsum.photos/800/400?random=${Math.random()}`; + + setImages(prev => + prev.map(img => + img.id === id ? { ...img, uri: newImage } : img, + ), + ); + } + + return ( + + + Imagens cadastradas + + {images.map((img) => ( + handleDelete(img.id)} + onReplace={() => handleReplace(img.id)} + /> + ))} + + ); +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e4c14b9..90ea7cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "expo-font": "~55.0.4", "expo-haptics": "~55.0.9", "expo-image": "~55.0.6", + "expo-image-picker": "~55.0.17", "expo-linking": "~55.0.9", "expo-router": "~55.0.8", "expo-splash-screen": "~55.0.13", @@ -39,7 +40,8 @@ "react-native-snap-carousel": "^3.9.1", "react-native-web": "~0.21.0", "react-native-worklets": "0.7.2", - "tailwindcss": "^3.4.17" + "tailwindcss": "^3.4.17", + "zod": "^4.3.6" }, "devDependencies": { "@types/react": "~19.2.10", @@ -6220,6 +6222,27 @@ } } }, + "node_modules/expo-image-loader": { + "version": "55.0.0", + "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-55.0.0.tgz", + "integrity": "sha512-NOjp56wDrfuA5aiNAybBIjqIn1IxKeGJ8CECWZncQ/GzjZfyTYAHTCyeApYkdKkMBLHINzI4BbTGSlbCa0fXXQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-picker": { + "version": "55.0.17", + "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-55.0.17.tgz", + "integrity": "sha512-oCayiw6ZMKDnUGVPFhQ1j0Cg0ZvzSDWwuVm0QSX+AkdqBuRv/n3SB3ZTVW2M+lR6zU/aTtVTduqlNnVyv4CrhA==", + "license": "MIT", + "dependencies": { + "expo-image-loader": "~55.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-keep-awake": { "version": "55.0.4", "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-55.0.4.tgz", @@ -6784,6 +6807,15 @@ } } }, + "node_modules/expo/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", @@ -13690,9 +13722,9 @@ } }, "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index e458a17..e7421b8 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "expo-font": "~55.0.4", "expo-haptics": "~55.0.9", "expo-image": "~55.0.6", + "expo-image-picker": "~55.0.17", "expo-linking": "~55.0.9", "expo-router": "~55.0.8", "expo-splash-screen": "~55.0.13", @@ -44,7 +45,8 @@ "react-native-snap-carousel": "^3.9.1", "react-native-web": "~0.21.0", "react-native-worklets": "0.7.2", - "tailwindcss": "^3.4.17" + "tailwindcss": "^3.4.17", + "zod": "^4.3.6" }, "devDependencies": { "@types/react": "~19.2.10", diff --git a/scripts/reset-project.js b/scripts/reset-project.js index 0abde93..8edba94 100644 --- a/scripts/reset-project.js +++ b/scripts/reset-project.js @@ -2,8 +2,11 @@ /** * This script is used to reset the project to a blank state. - * It deletes or moves the /app, /components, /hooks, /scripts, and /constants directories to /app-example based on user input and creates a new /app directory with an index.tsx and _layout.tsx file. - * You can remove the `reset-project` script from package.json and safely delete this file after running it. + * It deletes or moves the /app, /components, /hooks, /scripts, + * and /constants directories to /app-example based on user inpu + * and creates a new /app directory with an index.tsx and _layout.tsx file. + * You can remove the `reset-project` script from package.json + * and safely delete this file after running it. */ const fs = require('fs'); @@ -87,7 +90,8 @@ const moveDirectories = async (userInput) => { console.log('\n✅ Project reset complete. Next steps:'); console.log( - `1. Run \`npx expo start\` to start a development server.\n2. Edit app/index.tsx to edit the main screen.${ + `1. Run \`npx expo start\` to start a development server.\n2. + Edit app/index.tsx to edit the main screen.${ userInput === 'y' ? `\n3. Delete the /${exampleDir} directory when you're done referencing it.` : '' From 4b842ec2e9af9a2c77bbfc548be3f2bf94adf163 Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Tue, 7 Apr 2026 23:29:33 -0300 Subject: [PATCH 05/54] scrum-27 implementando a api no header e no progresso da home --- app/home.tsx | 6 +- app/index.tsx | 17 +++- .../Home/completeProfile/completeProfile.tsx | 79 +++++++++++++++ components/Home/completeProfile/main.tsx | 47 --------- components/Home/header/header.tsx | 96 +++++++++++++++++++ components/Home/header/main.tsx | 46 --------- types/enterprise.ts | 7 ++ types/user.ts | 8 ++ 8 files changed, 205 insertions(+), 101 deletions(-) create mode 100644 components/Home/completeProfile/completeProfile.tsx delete mode 100644 components/Home/completeProfile/main.tsx create mode 100644 components/Home/header/header.tsx delete mode 100644 components/Home/header/main.tsx create mode 100644 types/enterprise.ts create mode 100644 types/user.ts diff --git a/app/home.tsx b/app/home.tsx index bcab6c4..b143082 100644 --- a/app/home.tsx +++ b/app/home.tsx @@ -1,13 +1,13 @@ import { Container } from '@/components/general/container'; -import { CompleteProfile } from '@/components/Home/completeProfile/main'; -import { Header } from '@/components/Home/header/main'; +import { CompleteProfile } from '@/components/Home/completeProfile/completeProfile'; +import { Header } from '@/components/Home/header/header'; import { RouteGrid } from '@/components/Home/routeGrid/main'; export default function Home() { return (
- + ); diff --git a/app/index.tsx b/app/index.tsx index 8b87602..a50b026 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -1,17 +1,24 @@ -import { router } from 'expo-router'; +import { useRouter } from 'expo-router'; import { Pressable, Text, View } from 'react-native'; import '../global.css'; export default function App() { + const router = useRouter(); // ✅ correto + return ( - Hello Mandacá! + + Hello Mandacá! + + router.navigate('/home')} + onPress={() => router.push('/home')} // ✅ usar push > - ir para Home + + ir para Home + ); -} +} \ No newline at end of file diff --git a/components/Home/completeProfile/completeProfile.tsx b/components/Home/completeProfile/completeProfile.tsx new file mode 100644 index 0000000..8ec3206 --- /dev/null +++ b/components/Home/completeProfile/completeProfile.tsx @@ -0,0 +1,79 @@ +import { Enterprise } from '@/types/enterprise'; +import axios from 'axios'; +import { useEffect, useState } from 'react'; +import { ActivityIndicator, StyleSheet, Text, View } from 'react-native'; + +export const CompleteProfile = () => { + const [enterprise, setEnterprise] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + let isMounted = true; + + const getEnterprise = async () => { + try { + const enterpriseId = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; + const response = await axios.get( + `https://mandaca-backend.onrender.com/enterprises/percentage/${enterpriseId}`, + ); + if (isMounted) setEnterprise(response.data); + } catch (error) { + console.error('Erro ao buscar empresa:', error); + } finally { + if (isMounted) setLoading(false); + } + }; + + getEnterprise(); + return () => { isMounted = false; }; // Limpa o efeito para evitar erros de memória + }, []); + + if (loading) { + return ( + + + + ); + } + + const porcentagem = enterprise?.porcentagem ?? 0; + + return ( + + + Complete seu Perfil + {porcentagem}% + + + + Preencha as informações para atrair mais turistas + + + + + + + ); +}; + +const style = StyleSheet.create({ + card: { + padding: 24, + backgroundColor: '#FFF', // Substitua 'light' pela cor real para testar + borderRadius: 24, + gap: 16, + }, + row: { flexDirection: 'row', justifyContent: 'space-between' }, + title: { fontWeight: 'bold', fontSize: 24 }, + percentageText: { fontWeight: 'bold', fontSize: 24, color: '#C34342' }, // Substitua pela cor do seu primary + subtitle: { fontSize: 18 }, + progressBg: { width: '100%', height: 8, backgroundColor: '#EEE', borderRadius: 99 }, + progressBar: { height: '100%', backgroundColor: '#C34342', borderRadius: 99 }, + cardShadow: { + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.25, + shadowRadius: 3.8, + elevation: 5, + }, +}); \ No newline at end of file diff --git a/components/Home/completeProfile/main.tsx b/components/Home/completeProfile/main.tsx deleted file mode 100644 index ead29e6..0000000 --- a/components/Home/completeProfile/main.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { StyleSheet, Text, View } from 'react-native'; -import Animated, { useSharedValue } from 'react-native-reanimated'; - -type Props = { - prifileProgress: number; -}; - -export const CompleteProfile = ({ prifileProgress }: Props) => { - const profileProgress = useSharedValue(prifileProgress); - - return ( - - - Complete seu Perfil - 75% - - - - Preencha as informações para atrair mais turistas - - - - - - - ); -}; - -const style = StyleSheet.create({ - cardShadow: { - shadowColor: '#000', - shadowOffset: { - width: 0, - height: 2, - }, - shadowOpacity: 1, - shadowRadius: 3.8, - - elevation: 5, - }, -}); diff --git a/components/Home/header/header.tsx b/components/Home/header/header.tsx new file mode 100644 index 0000000..53b3177 --- /dev/null +++ b/components/Home/header/header.tsx @@ -0,0 +1,96 @@ +import { User } from '@/types/user'; +import Ionicons from '@expo/vector-icons/Ionicons'; +import axios from 'axios'; +import { router } from 'expo-router'; +import { useEffect, useState } from 'react'; +import { + ActivityIndicator, + Image, + Pressable, + StyleSheet, + Text, + View, +} from 'react-native'; + + + +export const Header = () => { + const [user, setUser] = useState(null); + const [loading, setLoading] = useState(true); + + const getUser = async () => { + try { + const userId = '453df15b-61ce-4571-8bdb-cdbedf0ff041'; + + const responseUser = await axios.get( + `https://mandaca-backend.onrender.com/users/${userId}`, + ); + + setUser(responseUser.data); + } catch (error) { + console.error('Erro ao buscar usuário:', error); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + getUser(); + }, []); + + if (loading) { + return ; + } + + const userName = user?.nome || 'Usuário'; + const userInitial = userName.charAt(0).toUpperCase(); + + return ( + + router.push('/profile')} + > + {user?.url_foto_usuario ? ( + + ) : ( + {userInitial} + )} + + + + + Bem-vindo de volta, + + + {userName} + + + + router.push('/notifications')} + > + + + + ); +}; + +const style = StyleSheet.create({ + cardShadow: { + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 2, + }, + shadowOpacity: 1, + shadowRadius: 3.8, + elevation: 5, + }, +}); \ No newline at end of file diff --git a/components/Home/header/main.tsx b/components/Home/header/main.tsx deleted file mode 100644 index c887bf6..0000000 --- a/components/Home/header/main.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import Ionicons from '@expo/vector-icons/Ionicons'; -import { router } from 'expo-router'; -import { Pressable, StyleSheet, Text, View } from 'react-native'; - -export const Header = () => { - const userName = 'Maria da Silva'; // requisição para receber nome do usuário - - return ( - - router.navigate('/profile')} - > - M - - - - Bem-vinda de volta, - {userName} - - - router.navigate('/notifications')} - > - - - - ); -}; - -const style = StyleSheet.create({ - cardShadow: { - shadowColor: '#000', - shadowOffset: { - width: 0, - height: 2, - }, - shadowOpacity: 1, - shadowRadius: 3.8, - - elevation: 5, - }, -}); diff --git a/types/enterprise.ts b/types/enterprise.ts new file mode 100644 index 0000000..312b97c --- /dev/null +++ b/types/enterprise.ts @@ -0,0 +1,7 @@ +export type Enterprise = { + id_empresa: string; + nome: string; + porcentagem: number; + campos_preenchidos: string[]; + campos_faltando: string[]; +}; \ No newline at end of file diff --git a/types/user.ts b/types/user.ts new file mode 100644 index 0000000..a9f6ca3 --- /dev/null +++ b/types/user.ts @@ -0,0 +1,8 @@ +export type User = { + id_usuario: string; + tipo_usuario: string; + nome: string; + cpf: string; + url_foto_usuario: string; + empresa_id: string; +}; \ No newline at end of file From 2d17b58563fbdee267ec112eda0a607dbff64baf Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Wed, 8 Apr 2026 00:49:15 -0300 Subject: [PATCH 06/54] scrum-27 completeProfile useEffect fix --- .../Home/completeProfile/completeProfile.tsx | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/components/Home/completeProfile/completeProfile.tsx b/components/Home/completeProfile/completeProfile.tsx index 8ec3206..8f75ba4 100644 --- a/components/Home/completeProfile/completeProfile.tsx +++ b/components/Home/completeProfile/completeProfile.tsx @@ -7,25 +7,31 @@ export const CompleteProfile = () => { const [enterprise, setEnterprise] = useState(null); const [loading, setLoading] = useState(true); - useEffect(() => { - let isMounted = true; - - const getEnterprise = async () => { - try { - const enterpriseId = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; - const response = await axios.get( - `https://mandaca-backend.onrender.com/enterprises/percentage/${enterpriseId}`, - ); - if (isMounted) setEnterprise(response.data); - } catch (error) { - console.error('Erro ao buscar empresa:', error); - } finally { - if (isMounted) setLoading(false); + const getEnterprise = async () => { + try { + const enterpriseId = + 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; + + const response = await axios.get( + `https://mandaca-backend.onrender.com/enterprises/percentage/${enterpriseId}` + ); + + // 🔥 validação extra (evita crash) + if (response.data && typeof response.data.porcentagem === 'number') { + setEnterprise(response.data); + } else { + console.warn('Resposta inesperada:', response.data); } - }; + } catch (error) { + console.error('Erro ao buscar empresa:', error); + } finally { + setLoading(false); + } + }; + + useEffect(() => { getEnterprise(); - return () => { isMounted = false; }; // Limpa o efeito para evitar erros de memória }, []); if (loading) { @@ -61,7 +67,7 @@ const style = StyleSheet.create({ padding: 24, backgroundColor: '#FFF', // Substitua 'light' pela cor real para testar borderRadius: 24, - gap: 16, + gap: 16 }, row: { flexDirection: 'row', justifyContent: 'space-between' }, title: { fontWeight: 'bold', fontSize: 24 }, From 6332438ba56e2c5f411c19a3d6deb5703029f261 Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Wed, 8 Apr 2026 00:51:40 -0300 Subject: [PATCH 07/54] scrum-27 lint fix --- components/Home/completeProfile/completeProfile.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/Home/completeProfile/completeProfile.tsx b/components/Home/completeProfile/completeProfile.tsx index 8f75ba4..0845dd7 100644 --- a/components/Home/completeProfile/completeProfile.tsx +++ b/components/Home/completeProfile/completeProfile.tsx @@ -13,7 +13,7 @@ export const CompleteProfile = () => { 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; const response = await axios.get( - `https://mandaca-backend.onrender.com/enterprises/percentage/${enterpriseId}` + `https://mandaca-backend.onrender.com/enterprises/percentage/${enterpriseId}`, ); // 🔥 validação extra (evita crash) @@ -67,7 +67,7 @@ const style = StyleSheet.create({ padding: 24, backgroundColor: '#FFF', // Substitua 'light' pela cor real para testar borderRadius: 24, - gap: 16 + gap: 16, }, row: { flexDirection: 'row', justifyContent: 'space-between' }, title: { fontWeight: 'bold', fontSize: 24 }, From 13ff712b4f0f54bc772de80bb86005d82d805daa Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Fri, 10 Apr 2026 17:04:50 -0300 Subject: [PATCH 08/54] =?UTF-8?q?scrum-77=20implementa=C3=A7=C3=A3o=20da?= =?UTF-8?q?=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/overview/carousel.tsx | 98 ++++++++++++-------------------- services/getImagesEnterprise.ts | 22 +++++++ types/imageEnterprise.ts | 5 ++ 3 files changed, 64 insertions(+), 61 deletions(-) create mode 100644 services/getImagesEnterprise.ts create mode 100644 types/imageEnterprise.ts diff --git a/components/overview/carousel.tsx b/components/overview/carousel.tsx index 933da45..2491f86 100644 --- a/components/overview/carousel.tsx +++ b/components/overview/carousel.tsx @@ -1,11 +1,12 @@ +import { getImagesEnterprise } from '@/services/getImagesEnterprise'; +import { ImageEnterprise } from '@/types/imageEnterprise'; import React, { useEffect, useState } from 'react'; import { Dimensions, - Image, // Importe isso + Image, NativeScrollEvent, NativeSyntheticEvent, ScrollView, - StyleSheet, View, } from 'react-native'; import Animated, { @@ -15,12 +16,12 @@ import Animated, { withTiming, } from 'react-native-reanimated'; + const { width } = Dimensions.get('window'); const DOT_ACTIVE_COLOR = '#C34342'; const DOT_INACTIVE_COLOR = '#C7C7CC'; -// 1. Tipagem para as Props da bolinha interface PaginationDotProps { active: boolean; } @@ -47,34 +48,44 @@ const PaginationDot = ({ active }: PaginationDotProps) => { }; }); - return ; + return ( + + ); }; export default function Carousel() { const ITEM_WIDTH = width * 0.8; - const SPACING = 1; + const SPACING = 8; + const [activeIndex, setActiveIndex] = useState(0); + const [images, setImages] = useState([]); - const images = [ - 'https://picsum.photos/id/1018/800/400', - 'https://picsum.photos/id/1015/800/400', - 'https://picsum.photos/id/1019/800/400', - 'https://picsum.photos/id/1020/800/400', - 'https://picsum.photos/id/1024/800/400', - ]; + const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; + + useEffect(() => { + const loadImages = async () => { + try { + const data = await getImagesEnterprise(ENTERPRISE_ID); + setImages(data); + } catch (error) { + console.error(error); + } + }; + + loadImages(); + }, []); - // 2. Tipagem do evento de Scroll const handleScroll = (event: NativeSyntheticEvent) => { const scrollOffset = event.nativeEvent.contentOffset.x; const index = Math.round(scrollOffset / (ITEM_WIDTH + SPACING)); - + if (index !== activeIndex && index >= 0 && index < images.length) { setActiveIndex(index); } }; return ( - + - {images.map((uri, index) => ( + {images.map((item) => ( ))} - + {images.map((_, index) => ( - ))} ); -} - -// ... estilos permanecem os mesmos -const styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - }, - card: { - height: 200, - borderRadius: 16, - overflow: 'hidden', - }, - image: { - width: '100%', - height: '100%', - }, - paginationContainer: { - flexDirection: 'row', - marginTop: 16, - alignItems: 'center', - justifyContent: 'center', - }, - dot: { - width: 10, - height: 10, - borderRadius: 5, - marginHorizontal: 4, - }, -}); \ No newline at end of file +} \ No newline at end of file diff --git a/services/getImagesEnterprise.ts b/services/getImagesEnterprise.ts new file mode 100644 index 0000000..9b1cbcf --- /dev/null +++ b/services/getImagesEnterprise.ts @@ -0,0 +1,22 @@ +import axios from 'axios'; + +export interface Photo { + id_foto: string; + url_foto_empresa: string; + empresa_id: string; +} + +const BASE_URL = 'https://mandaca-backend.onrender.com'; + +export const getImagesEnterprise = async (enterpriseId: string): Promise => { + try { + const response = await axios.get( + `${BASE_URL}/photos/enterprise/${enterpriseId}`, + ); + + return response.data; + } catch (error) { + console.error('Erro ao buscar fotos da empresa:', error); + throw error; + } +}; \ No newline at end of file diff --git a/types/imageEnterprise.ts b/types/imageEnterprise.ts new file mode 100644 index 0000000..4f55954 --- /dev/null +++ b/types/imageEnterprise.ts @@ -0,0 +1,5 @@ +export type ImageEnterprise = { + id_foto: string; + url_foto_empresa: string; + empresa_id: string; +}; \ No newline at end of file From f7e6b9d91d15957855afd853c4c3b20a8f67d3a6 Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Sat, 11 Apr 2026 16:38:43 -0300 Subject: [PATCH 09/54] =?UTF-8?q?scrum-80=20implementa=C3=A7=C3=A3o=20da?= =?UTF-8?q?=20api=20no=20fluxo=20de=20edi=C3=A7=C3=A3o=20de=20imagens=20da?= =?UTF-8?q?=20empresa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(mybusiness)/manageImages.tsx | 2 - .../Home/completeProfile/completeProfile.tsx | 3 +- components/MyBusiness/overviewCard/main.tsx | 4 +- components/manageImages/fileUpload.tsx | 105 +++++++++++------- components/manageImages/imageItem.tsx | 4 +- components/manageImages/imagesList.tsx | 59 ++++++---- components/overview/carousel.tsx | 33 +++--- services/getImagesEnterprise.ts | 22 ---- services/imagesEnterprise.ts | 39 +++++++ 9 files changed, 162 insertions(+), 109 deletions(-) delete mode 100644 services/getImagesEnterprise.ts create mode 100644 services/imagesEnterprise.ts diff --git a/app/(mybusiness)/manageImages.tsx b/app/(mybusiness)/manageImages.tsx index 69a4e3e..e305408 100644 --- a/app/(mybusiness)/manageImages.tsx +++ b/app/(mybusiness)/manageImages.tsx @@ -1,6 +1,5 @@ import { Container } from '@/components/general/container'; import { Header } from '@/components/general/header'; -import FileUpload from '@/components/manageImages/fileUpload'; import ImagesList from '@/components/manageImages/imagesList'; import { View } from 'react-native'; @@ -9,7 +8,6 @@ export default function ManageImages () {
- diff --git a/components/Home/completeProfile/completeProfile.tsx b/components/Home/completeProfile/completeProfile.tsx index 0845dd7..68ad056 100644 --- a/components/Home/completeProfile/completeProfile.tsx +++ b/components/Home/completeProfile/completeProfile.tsx @@ -16,7 +16,6 @@ export const CompleteProfile = () => { `https://mandaca-backend.onrender.com/enterprises/percentage/${enterpriseId}`, ); - // 🔥 validação extra (evita crash) if (response.data && typeof response.data.porcentagem === 'number') { setEnterprise(response.data); } else { @@ -65,7 +64,7 @@ export const CompleteProfile = () => { const style = StyleSheet.create({ card: { padding: 24, - backgroundColor: '#FFF', // Substitua 'light' pela cor real para testar + backgroundColor: '#FFF', borderRadius: 24, gap: 16, }, diff --git a/components/MyBusiness/overviewCard/main.tsx b/components/MyBusiness/overviewCard/main.tsx index 831eff1..1400e62 100644 --- a/components/MyBusiness/overviewCard/main.tsx +++ b/components/MyBusiness/overviewCard/main.tsx @@ -1,5 +1,5 @@ -import { Image, Pressable, StyleSheet, Text, View } from 'react-native'; import Ionicons from '@expo/vector-icons/Ionicons'; +import { Image, Pressable, StyleSheet, Text, View } from 'react-native'; type Props = { imageUrl?: string; @@ -7,7 +7,6 @@ type Props = { }; export const OverviewCard = ({ imageUrl, onPress }: Props) => { - // requisição para receber imagem do estabelecimento return ( { )} - {/* Conteúdo textos */} diff --git a/components/manageImages/fileUpload.tsx b/components/manageImages/fileUpload.tsx index ffd904a..c59ceae 100644 --- a/components/manageImages/fileUpload.tsx +++ b/components/manageImages/fileUpload.tsx @@ -1,18 +1,22 @@ import Ionicons from '@expo/vector-icons/Ionicons'; import * as ImagePicker from 'expo-image-picker'; -import { Component } from 'react'; -import { Image, Pressable, Text, View } from 'react-native'; +import { useState } from 'react'; +import { Pressable, Text, View } from 'react-native'; -type State = { - image: string | null; +import { uploadImage } from '@/services/imagesEnterprise'; + +type Props = { + onUploadSuccess?: () => void; }; -export default class FileUpload extends Component<{}, State> { - state: State = { - image: null, - }; +type Status = 'idle' | 'loading' | 'success'; + +export default function FileUpload({ onUploadSuccess }: Props) { + const [status, setStatus] = useState('idle'); + + const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; - pickImage = async () => { + const pickImage = async () => { const permission = await ImagePicker.requestMediaLibraryPermissionsAsync(); if (!permission.granted) { @@ -26,38 +30,59 @@ export default class FileUpload extends Component<{}, State> { }); if (!result.canceled) { - this.setState({ image: result.assets[0].uri }); + const uri = result.assets[0].uri; + + setStatus('loading'); + + try { + await uploadImage(uri, ENTERPRISE_ID); + + setStatus('success'); + + onUploadSuccess?.(); + + setTimeout(() => { + setStatus('idle'); + }, 3000); + + } catch (error) { + console.error('Erro ao fazer upload:', error); + setStatus('idle'); + } } }; - render() { - const { image } = this.state; - - return ( - - - Imagens ou mídias - - - - - {image ? ( - - ) : ( - <> - - - Adicionar Imagem - - - )} - - - - ); - } + return ( + + + Adicionar Imagem + + + + + {status === 'loading' && ( + Enviando... + )} + + {status === 'success' && ( + <> + + + Imagem Adicionada + + + )} + + {status === 'idle' && ( + <> + + + Adicionar Imagem + + + )} + + + + ); } \ No newline at end of file diff --git a/components/manageImages/imageItem.tsx b/components/manageImages/imageItem.tsx index 7da65a0..c6c825d 100644 --- a/components/manageImages/imageItem.tsx +++ b/components/manageImages/imageItem.tsx @@ -25,7 +25,7 @@ export default function ImageItem({ } const result = await ImagePicker.launchImageLibraryAsync({ - mediaTypes: ['images'], // novo padrão + mediaTypes: ['images'], quality: 1, }); @@ -45,7 +45,6 @@ export default function ImageItem({ /> - {/* 🔄 Substituir */} - {/* 🗑️ Deletar */} ([ - { id: '1', uri: 'https://picsum.photos/id/1018/800/400' }, - { id: '2', uri: 'https://picsum.photos/id/1015/800/400' }, - { id: '3', uri: 'https://picsum.photos/id/1019/800/400' }, - { id: '4', uri: 'https://picsum.photos/id/1020/800/400' }, - { id: '5', uri: 'https://picsum.photos/id/1024/800/400' }, - ]); - - // DELETE (simulando API) - function handleDelete(id: string) { - setImages(prev => prev.filter(img => img.id !== id)); - } + const [images, setImages] = useState([]); + + const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; + + const loadImages = async () => { + try { + const data: ImageEnterprise[] = await getImagesByEnterprise(ENTERPRISE_ID); - // UPDATE / REPLACE (simulando API) - function handleReplace(id: string) { - const newImage = `https://picsum.photos/800/400?random=${Math.random()}`; + const formattedImages: ImageType[] = data.map((item) => ({ + id: item.id_foto, + uri: item.url_foto_empresa, + })); - setImages(prev => - prev.map(img => - img.id === id ? { ...img, uri: newImage } : img, - ), - ); + setImages(formattedImages); + } catch (error) { + console.error(error); + } + }; + + useEffect(() => { + loadImages(); + }, []); + + async function handleDelete(id: string) { + try { + await deleteImage(id); + loadImages(); + } catch (error) { + console.error('Erro ao deletar imagem:', error); + } } return ( + + Imagens cadastradas + {images.map((img) => ( handleDelete(img.id)} - onReplace={() => handleReplace(img.id)} + onReplace={() => {}} /> ))} diff --git a/components/overview/carousel.tsx b/components/overview/carousel.tsx index 2491f86..d09331e 100644 --- a/components/overview/carousel.tsx +++ b/components/overview/carousel.tsx @@ -1,6 +1,7 @@ -import { getImagesEnterprise } from '@/services/getImagesEnterprise'; +import { getImagesByEnterprise } from '@/services/imagesEnterprise'; import { ImageEnterprise } from '@/types/imageEnterprise'; -import React, { useEffect, useState } from 'react'; +import { useFocusEffect } from '@react-navigation/native'; +import React, { useCallback, useState } from 'react'; import { Dimensions, Image, @@ -9,6 +10,7 @@ import { ScrollView, View, } from 'react-native'; + import Animated, { interpolateColor, useAnimatedStyle, @@ -16,7 +18,6 @@ import Animated, { withTiming, } from 'react-native-reanimated'; - const { width } = Dimensions.get('window'); const DOT_ACTIVE_COLOR = '#C34342'; @@ -29,7 +30,7 @@ interface PaginationDotProps { const PaginationDot = ({ active }: PaginationDotProps) => { const animationProgress = useSharedValue(active ? 1 : 0); - useEffect(() => { + React.useEffect(() => { animationProgress.value = withTiming(active ? 1 : 0, { duration: 300 }); }, [active]); @@ -62,18 +63,20 @@ export default function Carousel() { const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; - useEffect(() => { - const loadImages = async () => { - try { - const data = await getImagesEnterprise(ENTERPRISE_ID); - setImages(data); - } catch (error) { - console.error(error); - } - }; + const loadImages = async () => { + try { + const data = await getImagesByEnterprise(ENTERPRISE_ID); + setImages(data); + } catch (error) { + console.error(error); + } + }; - loadImages(); - }, []); + useFocusEffect( + useCallback(() => { + loadImages(); + }, []), + ); const handleScroll = (event: NativeSyntheticEvent) => { const scrollOffset = event.nativeEvent.contentOffset.x; diff --git a/services/getImagesEnterprise.ts b/services/getImagesEnterprise.ts deleted file mode 100644 index 9b1cbcf..0000000 --- a/services/getImagesEnterprise.ts +++ /dev/null @@ -1,22 +0,0 @@ -import axios from 'axios'; - -export interface Photo { - id_foto: string; - url_foto_empresa: string; - empresa_id: string; -} - -const BASE_URL = 'https://mandaca-backend.onrender.com'; - -export const getImagesEnterprise = async (enterpriseId: string): Promise => { - try { - const response = await axios.get( - `${BASE_URL}/photos/enterprise/${enterpriseId}`, - ); - - return response.data; - } catch (error) { - console.error('Erro ao buscar fotos da empresa:', error); - throw error; - } -}; \ No newline at end of file diff --git a/services/imagesEnterprise.ts b/services/imagesEnterprise.ts new file mode 100644 index 0000000..021a257 --- /dev/null +++ b/services/imagesEnterprise.ts @@ -0,0 +1,39 @@ +// src/services/photoService.ts + +import { ImageEnterprise } from '@/types/imageEnterprise'; +import axios from 'axios'; + +const BASE_URL = 'https://mandaca-backend.onrender.com'; + +export const getImagesByEnterprise = async (enterpriseId: string): Promise => { + const response = await axios.get( + `${BASE_URL}/photos/enterprise/${enterpriseId}`, + ); + + return response.data; +}; + +export const deleteImage = async (photoId: string): Promise => { + await axios.delete(`${BASE_URL}/photos/${photoId}`); +}; + +export const uploadImage = async ( + imageUri: string, + empresa_id: string, +): Promise => { + const formData = new FormData(); + + formData.append('empresa_id', empresa_id); + + formData.append('files', { + uri: imageUri, + name: 'photo.jpg', + type: 'image/jpeg', + } as any); + + await axios.post(`${BASE_URL}/photos/`, formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); +}; \ No newline at end of file From f23188af8ce17fdf3e17a78a9f4409a9d44771bc Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Mon, 13 Apr 2026 15:43:01 -0300 Subject: [PATCH 10/54] =?UTF-8?q?implementando=20a=20api=20nos=20campos=20?= =?UTF-8?q?de=20edi=C3=A7=C3=A3o=20de=20hist=C3=B3ria=20e=20no=20bot=C3=A3?= =?UTF-8?q?o=20de=20mapa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(mybusiness)/businessOverview.tsx | 59 +++++++++++++++++-- app/(mybusiness)/editStory.tsx | 85 ++++++++++++++++++++------- components/general/generalButton.tsx | 39 ++++++++---- components/overview/address.tsx | 34 +++++++---- components/overview/carousel.tsx | 24 ++++++++ 5 files changed, 191 insertions(+), 50 deletions(-) diff --git a/app/(mybusiness)/businessOverview.tsx b/app/(mybusiness)/businessOverview.tsx index 499c499..05b6a63 100644 --- a/app/(mybusiness)/businessOverview.tsx +++ b/app/(mybusiness)/businessOverview.tsx @@ -1,19 +1,66 @@ +import { useFocusEffect } from '@react-navigation/native'; +import axios from 'axios'; +import { useCallback, useState } from 'react'; +import { ActivityIndicator, Alert, View } from 'react-native'; + import { Container } from '@/components/general/container'; import { Header } from '@/components/general/header'; import Address from '@/components/overview/address'; import EditButton from '@/components/overview/editButton'; import Journey from '@/components/overview/journey'; +const BASE_URL = 'https://mandaca-backend.onrender.com'; +const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; + export default function Overview () { - //requisições para pegar a história e o endereço do restaurante - const story = 'Tudo começou na cozinha da nossa avó, onde o aroma de temperos frescos e o calor do fogão a lenha nos ensinaram sobre o amor em forma de comida. Nosso restaurante nasceu desse sonho: compartilhar os sabores da nossa infância' - const address = 'Rua Parnaíba, 23. João Pessoa, Paraíba.' + const [story, setStory] = useState(''); + const [address, setAddress] = useState(''); + const [loading, setLoading] = useState(false); + + const loadOverview = useCallback(async () => { + try { + setLoading(true); + + const response = await axios.get( + `${BASE_URL}/enterprises/overview`, + { + params: { enterprise_id: ENTERPRISE_ID }, + } + ); + + setStory(response.data.historia ?? ''); + setAddress(response.data.endereco ?? ''); + + } catch (error) { + console.error('Erro ao buscar visão geral:', error); + Alert.alert('Erro', 'Não foi possível carregar os dados.'); + } finally { + setLoading(false); + } + }, []); + + useFocusEffect( + useCallback(() => { + loadOverview(); + }, [loadOverview]), + ); + return(
- -
- + + {loading ? ( + + + + ) : ( + <> + +
+ + + )} + ); } \ No newline at end of file diff --git a/app/(mybusiness)/editStory.tsx b/app/(mybusiness)/editStory.tsx index a4a7e99..9eee833 100644 --- a/app/(mybusiness)/editStory.tsx +++ b/app/(mybusiness)/editStory.tsx @@ -5,35 +5,78 @@ import ToggleWrite from '@/components/editStory/toggleWrite'; import { Container } from '@/components/general/container'; import GeneralButton from '@/components/general/generalButton'; import { Header } from '@/components/general/header'; +import axios from 'axios'; import { router } from 'expo-router'; import { useState } from 'react'; -import { Text, View } from 'react-native'; +import { Alert, Text, View } from 'react-native'; + +const BASE_URL = 'https://mandaca-backend.onrender.com'; +const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; export default function EditStory() { - const [toggle, setToggle] = useState<'WRITE' | 'AUDIO'>('WRITE') - const [text, setText] = useState('') - const [audio, setAudio] = useState('') - - const handlePress = ()=> { - router.navigate('/(mybusiness)/manageImages') - } + const [toggle, setToggle] = useState<'WRITE' | 'AUDIO'>('WRITE'); + const [text, setText] = useState(''); + const [audio, setAudio] = useState(''); + const [saving, setSaving] = useState(false); + + const handlePress = async () => { + try { + if (toggle === 'WRITE' && !text.trim()) { + Alert.alert('Atenção', 'Digite uma história antes de continuar.'); + return; + } + + if (toggle === 'AUDIO' && !audio) { + Alert.alert('Atenção', 'Grave um áudio antes de continuar.'); + return; + } + + setSaving(true); + + await axios.put(`${BASE_URL}/enterprises/${ENTERPRISE_ID}`, { + historia: toggle === 'WRITE' ? text.trim() : audio, + }); + + setText(''); + setAudio(''); + + router.navigate('/(mybusiness)/manageImages'); + + } catch (error) { + console.error(error); + Alert.alert('Erro', 'Não foi possível salvar a história. Tente novamente.'); + } finally { + setSaving(false); + } + }; return (
- Conte sua história para nosso assistente, que vai resumir de uma forma objetiva e original. - - {toggle === 'WRITE' && - - } - { - toggle === 'AUDIO' && - - } - - + + + Conte sua história para nosso assistente, que vai resumir de uma forma objetiva e original. + + + + + {toggle === 'WRITE' && ( + + )} + + {toggle === 'AUDIO' && ( + + )} + + + + - ); -} + ); +} \ No newline at end of file diff --git a/components/general/generalButton.tsx b/components/general/generalButton.tsx index 946627d..1f5ce6c 100644 --- a/components/general/generalButton.tsx +++ b/components/general/generalButton.tsx @@ -1,18 +1,33 @@ -import { Pressable, Text } from 'react-native'; +import { ActivityIndicator, Pressable, Text } from 'react-native'; type Props = { - text: string - handlePress: ()=> void -} -export default function GeneralButton ({text, handlePress}: Props) { - return( - void; + disabled?: boolean; + loading?: boolean; +}; + +export default function GeneralButton({ + text, + handlePress, + disabled = false, + loading = false, +}: Props) { + return ( + - - {text} - + {loading ? ( + + ) : ( + + {text} + + )} - ) + ); } \ No newline at end of file diff --git a/components/overview/address.tsx b/components/overview/address.tsx index 7518bc5..9f8e7ae 100644 --- a/components/overview/address.tsx +++ b/components/overview/address.tsx @@ -1,25 +1,41 @@ import Ionicons from '@expo/vector-icons/Ionicons'; -import { Pressable, StyleSheet, Text, View } from 'react-native'; +import { Alert, Linking, Pressable, StyleSheet, Text, View } from 'react-native'; type Props = { address: string; }; export default function Address({ address }: Props) { - const handleMapsbutton = () => {}; + + const handleMapsbutton = async () => { + if (!address) { + Alert.alert('Erro', 'Endereço não disponível.'); + return; + } + + try { + const url = `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(address)}`; + await Linking.openURL(url); + } catch (error) { + console.error(error); + Alert.alert('Erro', 'Não foi possível abrir o mapa.'); + } + }; + return ( Endereço - {address} + {address || 'Endereço não informado'} + Abrir no maps - + ); @@ -28,13 +44,9 @@ export default function Address({ address }: Props) { const style = StyleSheet.create({ cardShadow: { shadowColor: '#000', - shadowOffset: { - width: 0, - height: 2, - }, + shadowOffset: { width: 0, height: 2 }, shadowOpacity: 1, shadowRadius: 3.8, - elevation: 2, }, -}); +}); \ No newline at end of file diff --git a/components/overview/carousel.tsx b/components/overview/carousel.tsx index d09331e..98606d2 100644 --- a/components/overview/carousel.tsx +++ b/components/overview/carousel.tsx @@ -3,6 +3,7 @@ import { ImageEnterprise } from '@/types/imageEnterprise'; import { useFocusEffect } from '@react-navigation/native'; import React, { useCallback, useState } from 'react'; import { + ActivityIndicator, Dimensions, Image, NativeScrollEvent, @@ -60,12 +61,20 @@ export default function Carousel() { const [activeIndex, setActiveIndex] = useState(0); const [images, setImages] = useState([]); + const [loadingImages, setLoadingImages] = useState>({}); const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; const loadImages = async () => { try { const data = await getImagesByEnterprise(ENTERPRISE_ID); + + const initialLoadingState: Record = {}; + data.forEach(item => { + initialLoadingState[item.id_foto] = true; + }); + + setLoadingImages(initialLoadingState); setImages(data); } catch (error) { console.error(error); @@ -87,6 +96,13 @@ export default function Carousel() { } }; + const handleImageLoad = (id: string) => { + setLoadingImages(prev => ({ + ...prev, + [id]: false, + })); + }; + return ( + {/* 🔥 Placeholder */} + {loadingImages[item.id_foto] && ( + + + + )} + handleImageLoad(item.id_foto)} /> ))} From e1833bd1241ec06c058190746029f2442737696f Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Mon, 13 Apr 2026 15:48:22 -0300 Subject: [PATCH 11/54] scrum-78 lint fix --- app/(mybusiness)/businessOverview.tsx | 4 ++-- app/(mybusiness)/editStory.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/(mybusiness)/businessOverview.tsx b/app/(mybusiness)/businessOverview.tsx index 05b6a63..4f8844a 100644 --- a/app/(mybusiness)/businessOverview.tsx +++ b/app/(mybusiness)/businessOverview.tsx @@ -25,7 +25,7 @@ export default function Overview () { `${BASE_URL}/enterprises/overview`, { params: { enterprise_id: ENTERPRISE_ID }, - } + }, ); setStory(response.data.historia ?? ''); @@ -51,7 +51,7 @@ export default function Overview () { {loading ? ( - + ) : ( <> diff --git a/app/(mybusiness)/editStory.tsx b/app/(mybusiness)/editStory.tsx index 9eee833..ca0ab3f 100644 --- a/app/(mybusiness)/editStory.tsx +++ b/app/(mybusiness)/editStory.tsx @@ -56,7 +56,7 @@ export default function EditStory() {
- Conte sua história para nosso assistente, que vai resumir de uma forma objetiva e original. + Conte história do seu restaurante. From 9bdd0d2d21b2fddfee6afaf283e7e0808f329d08 Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Mon, 13 Apr 2026 17:43:18 -0300 Subject: [PATCH 12/54] =?UTF-8?q?scrum-78=20feature=20de=20envio=20de=20?= =?UTF-8?q?=C3=A1udio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.json | 3 +- app/(mybusiness)/editStory.tsx | 7 +- components/editStory/audioBox.tsx | 124 ++++++++++++++++++++++++------ package-lock.json | 31 ++++++++ package.json | 2 + 5 files changed, 143 insertions(+), 24 deletions(-) diff --git a/app.json b/app.json index 4713a73..1bc9ada 100644 --- a/app.json +++ b/app.json @@ -42,7 +42,8 @@ ], "expo-font", "expo-image", - "expo-web-browser" + "expo-web-browser", + "expo-audio" ], "experiments": { "typedRoutes": true, diff --git a/app/(mybusiness)/editStory.tsx b/app/(mybusiness)/editStory.tsx index ca0ab3f..e682ac4 100644 --- a/app/(mybusiness)/editStory.tsx +++ b/app/(mybusiness)/editStory.tsx @@ -66,7 +66,12 @@ export default function EditStory() { )} {toggle === 'AUDIO' && ( - + )} diff --git a/components/editStory/audioBox.tsx b/components/editStory/audioBox.tsx index 65a7c35..6e6671f 100644 --- a/components/editStory/audioBox.tsx +++ b/components/editStory/audioBox.tsx @@ -1,4 +1,6 @@ import Ionicons from '@expo/vector-icons/Ionicons' +import axios from 'axios' +import { useState } from 'react' import { Pressable, Text, View } from 'react-native' import Animated, { useAnimatedStyle, @@ -7,52 +9,130 @@ import Animated, { withTiming, } from 'react-native-reanimated' +import { + RecordingPresets, + requestRecordingPermissionsAsync, + useAudioRecorder, +} from 'expo-audio' + type Props = { audio: string setAudio: (s: string) => void + setText: (s: string) => void + setToggle: (t: 'WRITE' | 'AUDIO') => void } -export default function AudioBox({ audio, setAudio }: Props) { +const BASE_URL = 'https://mandaca-backend.onrender.com' +const USER_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2' + +export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) { + + const recorder = useAudioRecorder(RecordingPresets.HIGH_QUALITY) - audio - setAudio + const [loading, setLoading] = useState(false) const scale = useSharedValue(1) - const animatedStyle = useAnimatedStyle(() => { - return { - transform: [{ scale: scale.value }], + const animatedStyle = useAnimatedStyle(() => ({ + transform: [{ scale: scale.value }], + })) + + const startRecording = async () => { + try { + const permission = await requestRecordingPermissionsAsync() + + if (!permission.granted) { + alert('Permissão de microfone necessária!') + return + } + + await recorder.prepareToRecordAsync() + recorder.record() + + scale.value = withRepeat( + withTiming(1.2, { duration: 600 }), + -1, + true + ) + + } catch (error) { + console.error('Erro ao iniciar gravação:', error) } - }) - - const handlePressIn = () => { - scale.value = withRepeat( - withTiming(1.2, { duration: 600 }), - -1, - true, - ) } - const handlePressOut = () => { - scale.value = withTiming(1, { duration: 200 }) + const stopRecording = async () => { + try { + setLoading(true) + + await recorder.stop() + + const uri = recorder.uri + + scale.value = withTiming(1) + + if (!uri) return + + const formData = new FormData() + + formData.append('audio', { + uri, + name: 'audio.m4a', + type: 'audio/m4a', + } as any) + + formData.append('usuario_id', USER_ID) + + const response = await axios.post( + `${BASE_URL}/transcriptions`, + formData, + { + headers: { + 'Content-Type': 'multipart/form-data', + }, + } + ) + + const texto = response.data?.historia || '' + + setAudio(texto) + setText(texto) + setToggle('WRITE') + setAudio(texto) + + + } catch (error) { + console.error('Erro ao enviar áudio:', error) + } finally { + setLoading(false) + } } return ( - + - - Toque para começar a gravar - + {loading ? ( + + Processando áudio... + + ) : ( + + {recorder.isRecording + ? 'Gravando... solte para enviar' + : audio + ? 'Áudio convertido com sucesso ✅' + : 'Toque e segure para gravar'} + + )} ) } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 90ea7cb..fb14846 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,8 @@ "axios": "^1.13.6", "babel-preset-expo": "^55.0.11", "expo": "^55.0.9", + "expo-audio": "~55.0.13", + "expo-av": "^16.0.8", "expo-constants": "~55.0.9", "expo-font": "~55.0.4", "expo-haptics": "~55.0.9", @@ -6144,6 +6146,35 @@ "react-native": "*" } }, + "node_modules/expo-audio": { + "version": "55.0.13", + "resolved": "https://registry.npmjs.org/expo-audio/-/expo-audio-55.0.13.tgz", + "integrity": "sha512-rY9C81mSE6HHCPtyeCv53nRrBL1Su7JpQVuvbMFOA7AOY7xppg3Gq1SFybiDIiNQunDfcUUc2b8eDO8vkO0Iag==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "expo-asset": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-av": { + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/expo-av/-/expo-av-16.0.8.tgz", + "integrity": "sha512-cmVPftGR/ca7XBgs7R6ky36lF3OC0/MM/lpgX/yXqfv0jASTsh7AYX9JxHCwFmF+Z6JEB1vne9FDx4GiLcGreQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, "node_modules/expo-constants": { "version": "55.0.9", "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.9.tgz", diff --git a/package.json b/package.json index e7421b8..8a19d59 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "axios": "^1.13.6", "babel-preset-expo": "^55.0.11", "expo": "^55.0.9", + "expo-audio": "~55.0.13", + "expo-av": "^16.0.8", "expo-constants": "~55.0.9", "expo-font": "~55.0.4", "expo-haptics": "~55.0.9", From 2464e62f73cf0a5b8dd6a92b5b61275052cdb1cb Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Mon, 13 Apr 2026 17:49:32 -0300 Subject: [PATCH 13/54] scrum-34 pegando imagem da api --- app/(mybusiness)/myBusiness.tsx | 87 ++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 29 deletions(-) diff --git a/app/(mybusiness)/myBusiness.tsx b/app/(mybusiness)/myBusiness.tsx index 5bb6af2..73b6297 100644 --- a/app/(mybusiness)/myBusiness.tsx +++ b/app/(mybusiness)/myBusiness.tsx @@ -1,31 +1,60 @@ -import { Container } from '@/components/general/container'; -import { Header } from '@/components/general/header'; -import { AccessGrid } from '@/components/MyBusiness/accessGrid/main'; -import { OverviewCard } from '@/components/MyBusiness/overviewCard/main'; -import { router } from 'expo-router'; -import { View } from 'react-native'; +import { useFocusEffect } from '@react-navigation/native' +import { router } from 'expo-router' +import { useCallback, useState } from 'react' +import { View } from 'react-native' + +import { Container } from '@/components/general/container' +import { Header } from '@/components/general/header' +import { AccessGrid } from '@/components/MyBusiness/accessGrid/main' +import { OverviewCard } from '@/components/MyBusiness/overviewCard/main' + +import { getImagesByEnterprise } from '@/services/imagesEnterprise' +import { ImageEnterprise } from '@/types/imageEnterprise' + +const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2' export default function MyBusiness() { - // requisição para buscar dados do backend: - // imagem e notificações (menu, reservations, reviews, schedule) - - return ( - -
- - router.navigate('/businessOverview')} - /> - - - - ); -} + + const [image, setImage] = useState(undefined) + + const loadImages = useCallback(async () => { + try { + const data: ImageEnterprise[] = await getImagesByEnterprise(ENTERPRISE_ID) + + if (data.length > 0) { + setImage(data[0].url_foto_empresa) + } + + } catch (error) { + console.error('Erro ao carregar imagem:', error) + } + }, []) + + useFocusEffect( + useCallback(() => { + loadImages() + }, [loadImages]) + ) + + return ( + +
+ + + router.navigate('/businessOverview')} + /> + + + + + ) +} \ No newline at end of file From 5a08819b21158f0fcb259d7cdbe9a9fd566fcc0b Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Mon, 13 Apr 2026 17:52:11 -0300 Subject: [PATCH 14/54] scrum-34 lint fix --- app/(mybusiness)/myBusiness.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/(mybusiness)/myBusiness.tsx b/app/(mybusiness)/myBusiness.tsx index 73b6297..cae21df 100644 --- a/app/(mybusiness)/myBusiness.tsx +++ b/app/(mybusiness)/myBusiness.tsx @@ -33,7 +33,7 @@ export default function MyBusiness() { useFocusEffect( useCallback(() => { loadImages() - }, [loadImages]) + }, [loadImages]), ) return ( From 1f9dddc2645c60a2327323cee5ebec0d7be3c324 Mon Sep 17 00:00:00 2001 From: degoNDL Date: Mon, 13 Apr 2026 21:06:55 -0300 Subject: [PATCH 15/54] =?UTF-8?q?[SCRUM-78]=20fix:=20corrige=20upload=20de?= =?UTF-8?q?=20=C3=A1udio=20e=20limite=20de=20caracteres=20da=20hist=C3=B3r?= =?UTF-8?q?ia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/editStory/audioBox.tsx | 45 +++++++++++++++---------------- components/editStory/inputBox.tsx | 44 +++++++++++++++++------------- 2 files changed, 47 insertions(+), 42 deletions(-) diff --git a/components/editStory/audioBox.tsx b/components/editStory/audioBox.tsx index 6e6671f..6c0f0c0 100644 --- a/components/editStory/audioBox.tsx +++ b/components/editStory/audioBox.tsx @@ -1,5 +1,5 @@ import Ionicons from '@expo/vector-icons/Ionicons' -import axios from 'axios' +import * as FileSystem from 'expo-file-system/legacy' import { useState } from 'react' import { Pressable, Text, View } from 'react-native' import Animated, { @@ -23,7 +23,7 @@ type Props = { } const BASE_URL = 'https://mandaca-backend.onrender.com' -const USER_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2' +const USER_ID = '453df15b-61ce-4571-8bdb-cdbedf0ff041' export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) { @@ -72,36 +72,33 @@ export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) if (!uri) return - const formData = new FormData() - - formData.append('audio', { - uri, - name: 'audio.m4a', - type: 'audio/m4a', - } as any) - - formData.append('usuario_id', USER_ID) - - const response = await axios.post( + const result = await FileSystem.uploadAsync( `${BASE_URL}/transcriptions`, - formData, + uri, { - headers: { - 'Content-Type': 'multipart/form-data', + httpMethod: 'POST', + uploadType: FileSystem.FileSystemUploadType.MULTIPART, + fieldName: 'audio', + mimeType: 'audio/m4a', + parameters: { + usuario_id: USER_ID, }, - } + }, ) - const texto = response.data?.historia || '' + if (result.status < 200 || result.status >= 300) { + throw new Error(`HTTP ${result.status}: ${result.body}`) + } + + const data = JSON.parse(result.body) + const texto = data?.historia || '' - setAudio(texto) setText(texto) - setToggle('WRITE') setAudio(texto) + setToggle('WRITE') - - } catch (error) { - console.error('Erro ao enviar áudio:', error) + } catch (error: any) { + console.error('Erro ao enviar áudio:', error?.message) } finally { setLoading(false) } @@ -135,4 +132,4 @@ export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) )} ) -} \ No newline at end of file +} diff --git a/components/editStory/inputBox.tsx b/components/editStory/inputBox.tsx index 511fdb7..c16edce 100644 --- a/components/editStory/inputBox.tsx +++ b/components/editStory/inputBox.tsx @@ -1,5 +1,7 @@ import { useState } from 'react' -import { TextInput, View } from 'react-native' +import { Text, TextInput, View } from 'react-native' + +const MAX_LENGTH = 500 type Props = { text: string, @@ -11,23 +13,29 @@ export default function InputBox({ text, setText }: Props) { const [isFocused, setIsFocused] = useState(false) return ( - - setIsFocused(true)} - onBlur={() => setIsFocused(false)} - className="text-base text-black" - /> + + + setIsFocused(true)} + onBlur={() => setIsFocused(false)} + className="text-base text-black" + /> + + + {text.length}/{MAX_LENGTH} + ) } \ No newline at end of file From aaea01e4807ef1201083f6f5fde7a3491793dcee Mon Sep 17 00:00:00 2001 From: degoNDL Date: Mon, 13 Apr 2026 21:15:58 -0300 Subject: [PATCH 16/54] [SCRUM-78] fix: corrige trailing comma no audioBox --- components/editStory/audioBox.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/editStory/audioBox.tsx b/components/editStory/audioBox.tsx index 6c0f0c0..9601992 100644 --- a/components/editStory/audioBox.tsx +++ b/components/editStory/audioBox.tsx @@ -52,7 +52,7 @@ export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) scale.value = withRepeat( withTiming(1.2, { duration: 600 }), -1, - true + true, ) } catch (error) { From a835ea06dad81a29b56ed9d794eb4b601060e30a Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Tue, 14 Apr 2026 22:04:09 -0300 Subject: [PATCH 17/54] =?UTF-8?q?scrum-41=20interface=20da=20tela=20de=20r?= =?UTF-8?q?elat=C3=B3rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(report)/negativePoints.tsx | 13 +++++++ app/(report)/positivePoints.tsx | 13 +++++++ app/(report)/recomandations.tsx | 13 +++++++ app/(report)/report.tsx | 22 ++++++++++++ app/_layout.tsx | 5 ++- app/report.tsx | 12 ------- components/Home/routeGrid/main.tsx | 2 +- components/general/header.tsx | 2 +- components/report/CardItem.tsx | 57 ++++++++++++++++++++++++++++++ components/report/CardList.tsx | 45 +++++++++++++++++++++++ components/report/chatButton.tsx | 20 +++++++++++ 11 files changed, 189 insertions(+), 15 deletions(-) create mode 100644 app/(report)/negativePoints.tsx create mode 100644 app/(report)/positivePoints.tsx create mode 100644 app/(report)/recomandations.tsx create mode 100644 app/(report)/report.tsx delete mode 100644 app/report.tsx create mode 100644 components/report/CardItem.tsx create mode 100644 components/report/CardList.tsx create mode 100644 components/report/chatButton.tsx diff --git a/app/(report)/negativePoints.tsx b/app/(report)/negativePoints.tsx new file mode 100644 index 0000000..d871389 --- /dev/null +++ b/app/(report)/negativePoints.tsx @@ -0,0 +1,13 @@ +import { Container } from "@/components/general/container"; +import { Header } from "@/components/general/header"; +import { View } from "react-native"; + +export default function NegativePoints () { + return( + + +
+ + + ) +} \ No newline at end of file diff --git a/app/(report)/positivePoints.tsx b/app/(report)/positivePoints.tsx new file mode 100644 index 0000000..83d702c --- /dev/null +++ b/app/(report)/positivePoints.tsx @@ -0,0 +1,13 @@ +import { Container } from "@/components/general/container"; +import { Header } from "@/components/general/header"; +import { View } from "react-native"; + +export default function PositivePoints () { + return( + + +
+ + + ) +} \ No newline at end of file diff --git a/app/(report)/recomandations.tsx b/app/(report)/recomandations.tsx new file mode 100644 index 0000000..7213f81 --- /dev/null +++ b/app/(report)/recomandations.tsx @@ -0,0 +1,13 @@ +import { Container } from "@/components/general/container"; +import { Header } from "@/components/general/header"; +import { View } from "react-native"; + +export default function Recomendations () { + return( + + +
+ + + ) +} \ No newline at end of file diff --git a/app/(report)/report.tsx b/app/(report)/report.tsx new file mode 100644 index 0000000..261723b --- /dev/null +++ b/app/(report)/report.tsx @@ -0,0 +1,22 @@ +import { Container } from '@/components/general/container'; +import { Header } from '@/components/general/header'; +import { CardList } from '@/components/report/CardList'; +import { ChatButton } from '@/components/report/chatButton'; +import { View } from 'react-native'; + +export default function Profile() { + + const handlePress = ()=> { + // to do + } + + return ( + + +
+ + + + + ); +} diff --git a/app/_layout.tsx b/app/_layout.tsx index f983bd7..628c857 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -17,7 +17,10 @@ export default function RootLayout() { - + + + + diff --git a/app/report.tsx b/app/report.tsx deleted file mode 100644 index fd1e843..0000000 --- a/app/report.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { Container } from '@/components/general/container'; -import { Text, View } from 'react-native'; - -export default function Report() { - return ( - - - Relatórios - - - ); -} diff --git a/components/Home/routeGrid/main.tsx b/components/Home/routeGrid/main.tsx index 80f0965..a414358 100644 --- a/components/Home/routeGrid/main.tsx +++ b/components/Home/routeGrid/main.tsx @@ -16,7 +16,7 @@ export const RouteGrid = () => { title="Relatórios" description="Visão geral e Insights" - route={() => router.navigate('/report')} + route={() => router.navigate('/(report)/report')} /> )} - {title} + {title} {showNotificationButton ? ( void +} + +export const CardItem = ({icon, typeCard, topics, handlePress}: Props)=> { + return( + + + + {typeCard == "positive" && + <> + Pontos positivos + + + } + {typeCard == "negative" && + <> + Pontos negativos + + + } + {typeCard == "recomendation" && + <> + Recomendações + + + } + + + {topics.map(item=> ( + + + {item.text} + + ))} + + Ver Sugestões + + + + ) +} \ No newline at end of file diff --git a/components/report/CardList.tsx b/components/report/CardList.tsx new file mode 100644 index 0000000..19f5ff6 --- /dev/null +++ b/components/report/CardList.tsx @@ -0,0 +1,45 @@ +import { router } from "expo-router" +import { View } from "react-native" +import { CardItem } from "./CardItem" + +export const CardList = ()=> { + const handlePresPositive = ()=> { + router.navigate('/(report)/positivePoints') + } + const handlePresNegative = ()=> { + router.navigate('/(report)/negativePoints') + } + const handlePresRecomendation = ()=> { + router.navigate('/(report)/recomandations') + } + return( + + + + + + ) +} \ No newline at end of file diff --git a/components/report/chatButton.tsx b/components/report/chatButton.tsx new file mode 100644 index 0000000..03c4b0b --- /dev/null +++ b/components/report/chatButton.tsx @@ -0,0 +1,20 @@ +import Ionicons from "@expo/vector-icons/Ionicons" +import { Pressable, Text } from "react-native" + +type Props = { + text: string + handlePress: ()=> void +} + +export const ChatButton = ({text, handlePress}: Props)=> { + return( + + + {text} + + + ) +} \ No newline at end of file From d2a2630bbbbad032ed41215d765f8f08bb841b30 Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Tue, 14 Apr 2026 23:04:27 -0300 Subject: [PATCH 18/54] scrim-41 adicionando o skeleton --- app/(report)/negativePoints.tsx | 6 ++--- app/(report)/positivePoints.tsx | 6 ++--- ...{recomandations.tsx => recomendations.tsx} | 6 ++--- app/(report)/report.tsx | 15 ++++++++--- components/report/CardItem.tsx | 14 +++++----- components/report/CardList.tsx | 24 ++++++++--------- components/report/cardItemSkeleton.tsx | 27 +++++++++++++++++++ components/report/cardListSkeleton.tsx | 12 +++++++++ components/report/chatButton.tsx | 4 +-- 9 files changed, 80 insertions(+), 34 deletions(-) rename app/(report)/{recomandations.tsx => recomendations.tsx} (60%) create mode 100644 components/report/cardItemSkeleton.tsx create mode 100644 components/report/cardListSkeleton.tsx diff --git a/app/(report)/negativePoints.tsx b/app/(report)/negativePoints.tsx index d871389..91f9bca 100644 --- a/app/(report)/negativePoints.tsx +++ b/app/(report)/negativePoints.tsx @@ -1,6 +1,6 @@ -import { Container } from "@/components/general/container"; -import { Header } from "@/components/general/header"; -import { View } from "react-native"; +import { Container } from '@/components/general/container'; +import { Header } from '@/components/general/header'; +import { View } from 'react-native'; export default function NegativePoints () { return( diff --git a/app/(report)/positivePoints.tsx b/app/(report)/positivePoints.tsx index 83d702c..49f2e5c 100644 --- a/app/(report)/positivePoints.tsx +++ b/app/(report)/positivePoints.tsx @@ -1,6 +1,6 @@ -import { Container } from "@/components/general/container"; -import { Header } from "@/components/general/header"; -import { View } from "react-native"; +import { Container } from '@/components/general/container'; +import { Header } from '@/components/general/header'; +import { View } from 'react-native'; export default function PositivePoints () { return( diff --git a/app/(report)/recomandations.tsx b/app/(report)/recomendations.tsx similarity index 60% rename from app/(report)/recomandations.tsx rename to app/(report)/recomendations.tsx index 7213f81..146b0b2 100644 --- a/app/(report)/recomandations.tsx +++ b/app/(report)/recomendations.tsx @@ -1,6 +1,6 @@ -import { Container } from "@/components/general/container"; -import { Header } from "@/components/general/header"; -import { View } from "react-native"; +import { Container } from '@/components/general/container'; +import { Header } from '@/components/general/header'; +import { View } from 'react-native'; export default function Recomendations () { return( diff --git a/app/(report)/report.tsx b/app/(report)/report.tsx index 261723b..2903e8f 100644 --- a/app/(report)/report.tsx +++ b/app/(report)/report.tsx @@ -1,13 +1,16 @@ import { Container } from '@/components/general/container'; import { Header } from '@/components/general/header'; -import { CardList } from '@/components/report/CardList'; +import { CardList } from '@/components/report/cardList'; +import { CardListSkeleton } from '@/components/report/cardListSkeleton'; import { ChatButton } from '@/components/report/chatButton'; +import { useState } from 'react'; import { View } from 'react-native'; export default function Profile() { - + const [loading, setLoading] = useState(false) + const handlePress = ()=> { - // to do + setLoading //to do } return ( @@ -15,7 +18,11 @@ export default function Profile() {
- + {loading ? ( + + ) : ( + + )} ); diff --git a/components/report/CardItem.tsx b/components/report/CardItem.tsx index bc3de40..13906bc 100644 --- a/components/report/CardItem.tsx +++ b/components/report/CardItem.tsx @@ -1,5 +1,5 @@ -import Ionicons from "@expo/vector-icons/Ionicons" -import { Pressable, Text, View } from "react-native" +import Ionicons from '@expo/vector-icons/Ionicons' +import { Pressable, Text, View } from 'react-native' type topic = { id: number, @@ -7,7 +7,7 @@ type topic = { } type Props = { icon: any, - typeCard: "positive" | "negative" | "recomendation", + typeCard: 'positive' | 'negative' | 'recomendation', topics: topic[] handlePress: ()=> void } @@ -19,19 +19,19 @@ export const CardItem = ({icon, typeCard, topics, handlePress}: Props)=> { > - {typeCard == "positive" && + {typeCard === 'positive' && <> Pontos positivos } - {typeCard == "negative" && + {typeCard === 'negative' && <> Pontos negativos } - {typeCard == "recomendation" && + {typeCard === 'recomendation' && <> Recomendações @@ -50,7 +50,7 @@ export const CardItem = ({icon, typeCard, topics, handlePress}: Props)=> { onPress={handlePress} > Ver Sugestões - + ) diff --git a/components/report/CardList.tsx b/components/report/CardList.tsx index 19f5ff6..838769c 100644 --- a/components/report/CardList.tsx +++ b/components/report/CardList.tsx @@ -1,6 +1,6 @@ -import { router } from "expo-router" -import { View } from "react-native" -import { CardItem } from "./CardItem" +import { router } from 'expo-router' +import { View } from 'react-native' +import { CardItem } from './cardItem' export const CardList = ()=> { const handlePresPositive = ()=> { @@ -15,27 +15,27 @@ export const CardList = ()=> { return( { + return ( + + + {/* Header */} + + + + + + + {/* Topics */} + {[1,2,3].map((_, index) => ( + + + + + ))} + + {/* Button */} + + + + ) +} \ No newline at end of file diff --git a/components/report/cardListSkeleton.tsx b/components/report/cardListSkeleton.tsx new file mode 100644 index 0000000..5377f78 --- /dev/null +++ b/components/report/cardListSkeleton.tsx @@ -0,0 +1,12 @@ +import { View } from 'react-native' +import { CardItemSkeleton } from './cardItemSkeleton' + +export const CardListSkeleton = () => { + return ( + + + + + + ) +} \ No newline at end of file diff --git a/components/report/chatButton.tsx b/components/report/chatButton.tsx index 03c4b0b..14c29c3 100644 --- a/components/report/chatButton.tsx +++ b/components/report/chatButton.tsx @@ -1,5 +1,5 @@ -import Ionicons from "@expo/vector-icons/Ionicons" -import { Pressable, Text } from "react-native" +import Ionicons from '@expo/vector-icons/Ionicons' +import { Pressable, Text } from 'react-native' type Props = { text: string From 01cb5cc70edb9d1daeef51a276808a698ba9ebbd Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Tue, 14 Apr 2026 23:12:10 -0300 Subject: [PATCH 19/54] =?UTF-8?q?scrum-41=20corre=C3=A7=C3=A3o=20de=20rota?= =?UTF-8?q?=20das=20recomenda=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/report/CardList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/report/CardList.tsx b/components/report/CardList.tsx index 838769c..108e9b9 100644 --- a/components/report/CardList.tsx +++ b/components/report/CardList.tsx @@ -10,7 +10,7 @@ export const CardList = ()=> { router.navigate('/(report)/negativePoints') } const handlePresRecomendation = ()=> { - router.navigate('/(report)/recomandations') + router.navigate('/(report)/recomendations') } return( From 4eddc08a24dee343f4330a9d95645f3a5f446775 Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Tue, 14 Apr 2026 23:18:28 -0300 Subject: [PATCH 20/54] =?UTF-8?q?scrum-41=20corre=C3=A7=C3=A3o=20dos=20nom?= =?UTF-8?q?es=20dos=20arquivos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(report)/report.tsx | 2 +- components/report/CardList.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/(report)/report.tsx b/app/(report)/report.tsx index 2903e8f..5a1b69e 100644 --- a/app/(report)/report.tsx +++ b/app/(report)/report.tsx @@ -1,6 +1,6 @@ import { Container } from '@/components/general/container'; import { Header } from '@/components/general/header'; -import { CardList } from '@/components/report/cardList'; +import { CardList } from '@/components/report/CardList'; import { CardListSkeleton } from '@/components/report/cardListSkeleton'; import { ChatButton } from '@/components/report/chatButton'; import { useState } from 'react'; diff --git a/components/report/CardList.tsx b/components/report/CardList.tsx index 108e9b9..7a2db84 100644 --- a/components/report/CardList.tsx +++ b/components/report/CardList.tsx @@ -1,6 +1,6 @@ import { router } from 'expo-router' import { View } from 'react-native' -import { CardItem } from './cardItem' +import { CardItem } from './CardItem' export const CardList = ()=> { const handlePresPositive = ()=> { From dda97147908f6ad2e4052e3196117718a4b3c108 Mon Sep 17 00:00:00 2001 From: Hivison Date: Mon, 20 Apr 2026 00:31:33 -0300 Subject: [PATCH 21/54] feat(help): implement help center and faq details screens --- .gitignore | 3 + app/(help)/help.tsx | 239 ++++++++++++++++++++++++++++++++++++++ app/(help)/helpDetail.tsx | 161 +++++++++++++++++++++++++ app/_layout.tsx | 3 +- app/help.tsx | 12 -- 5 files changed, 405 insertions(+), 13 deletions(-) create mode 100644 app/(help)/help.tsx create mode 100644 app/(help)/helpDetail.tsx delete mode 100644 app/help.tsx diff --git a/.gitignore b/.gitignore index f8c6c2e..e9aa402 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ app-example # generated native folders /ios /android + +# Qwen metadata +.qwen/ diff --git a/app/(help)/help.tsx b/app/(help)/help.tsx new file mode 100644 index 0000000..97f9161 --- /dev/null +++ b/app/(help)/help.tsx @@ -0,0 +1,239 @@ +import { Header } from '@/components/general/header'; +import Ionicons from '@expo/vector-icons/Ionicons'; +import MaterialIcons from '@expo/vector-icons/MaterialIcons'; +import { useRouter } from 'expo-router'; +import React from 'react'; +import { + Alert, + Linking, + Platform, + ScrollView, + StyleSheet, + Text, + TouchableOpacity, + View, +} from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; + +// Define types for our FAQ items +type FAQItem = { + id: number; + title: string; + icon: keyof typeof MaterialIcons.glyphMap; +}; + +const HelpScreen: React.FC = () => { + const router = useRouter(); + + // Sample FAQ data + const faqItems: FAQItem[] = [ + { id: 1, title: 'Como cadastrar meu negócio', icon: 'storefront' }, + { id: 2, title: 'Dicas de fotos', icon: 'camera-alt' }, + { id: 3, title: 'Termos de uso', icon: 'description' }, + { id: 4, title: 'Formas de pagamento', icon: 'credit-card' }, + ]; + + // Handle email support + const handleSendEmail = async () => { + const email = 'suporte@mandaca.com.br'; + const subject = encodeURIComponent('Suporte - Central de Ajuda Mandacá'); + + try { + const url = `mailto:${email}?subject=${subject}`; + const canOpen = await Linking.canOpenURL(url); + if (canOpen) { + await Linking.openURL(url); + } else { + Alert.alert('Erro', 'Não foi possível abrir o aplicativo de e-mail.'); + } + } catch (error) { + Alert.alert('Erro', 'Ocorreu um erro ao tentar abrir o e-mail.'); + } + }; + + // Handle phone call + const handleCallSupport = async () => { + const phoneNumber = Platform.OS === 'ios' ? 'telprompt:08001234567' : 'tel:08001234567'; + + try { + const canOpen = await Linking.canOpenURL(phoneNumber); + if (canOpen) { + await Linking.openURL(phoneNumber); + } else { + Alert.alert('Erro', 'Não foi possível realizar a chamada.'); + } + } catch (error) { + Alert.alert('Erro', 'Ocorreu um erro ao tentar ligar para o suporte.'); + } + }; + + return ( + + {/* Standard Fixed Header - Adjusted padding */} + +
router.back()} + /> + + + + {/* FAQ Section */} + + Perguntas Frequentes + + + {faqItems.map((item) => ( + router.push('/helpDetail')} // Final route path + style={styles.faqCard} + > + + {item.title} + + + ))} + + + + {/* Contact Section */} + + Contato + + + + + Enviar E-mail + + + + + Ligar para Suporte + + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#fff', + }, + headerWrapper: { + paddingHorizontal: 20, + paddingTop: 15, + paddingBottom: 20, + borderBottomWidth: 1, + borderBottomColor: '#F7FAFC', + }, + scrollContent: { + padding: 20, + paddingBottom: 40, + }, + section: { + marginBottom: 30, + }, + sectionTitle: { + fontSize: 14, + fontWeight: '700', + color: '#A0AEC0', + textTransform: 'uppercase', + letterSpacing: 1, + marginBottom: 16, + }, + faqCard: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: '#fff', + borderRadius: 16, + padding: 16, + marginBottom: 12, + borderWidth: 1, + borderColor: '#EDF2F7', + ...Platform.select({ + ios: { + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.05, + shadowRadius: 4, + }, + android: { + elevation: 2, + }, + }), + }, + faqTitle: { + flex: 1, + fontSize: 15, + fontWeight: '600', + color: '#2D3748', + marginLeft: 14, + }, + contactSection: { + marginTop: 10, + }, + buttonContainer: { + gap: 12, + }, + emailButton: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + backgroundColor: '#C34342', + borderRadius: 16, + paddingVertical: 18, + ...Platform.select({ + ios: { + shadowColor: '#C34342', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.2, + shadowRadius: 8, + }, + android: { + elevation: 4, + }, + }), + }, + phoneButton: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + backgroundColor: '#1A202C', + borderRadius: 16, + paddingVertical: 18, + ...Platform.select({ + ios: { + shadowColor: '#000', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.1, + shadowRadius: 8, + }, + android: { + elevation: 4, + }, + }), + }, + contactButtonText: { + color: '#fff', + fontSize: 16, + fontWeight: '700', + marginLeft: 10, + }, +}); + +export default HelpScreen; diff --git a/app/(help)/helpDetail.tsx b/app/(help)/helpDetail.tsx new file mode 100644 index 0000000..6552495 --- /dev/null +++ b/app/(help)/helpDetail.tsx @@ -0,0 +1,161 @@ +import { Header } from '@/components/general/header'; +import Ionicons from '@expo/vector-icons/Ionicons'; +import MaterialIcons from '@expo/vector-icons/MaterialIcons'; +import { useRouter } from 'expo-router'; +import React from 'react'; +import { + Platform, + ScrollView, + StyleSheet, + Text, + View, +} from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; + +/** + * Screen: FaqDetailScreen + * Focused on high readability and premium UI for FAQ content. + */ +const FaqDetailScreen: React.FC = () => { + const router = useRouter(); + + return ( + + {/* Standard Header with standard back button logic */} + +
router.back()} + /> + + + + {/* Visual Hierarchy: Icon and Centered Title */} + + + + + Como cadastrar meu negócio + + + {/* Content Section: Focused on Readability (lineHeight: 26) */} + + + Para cadastrar seu negócio no Mandacá e começar a atrair turistas da região, siga este guia passo a passo:{"\n\n"} + 1. Na sua tela inicial, navegue até a seção de ferramentas e clique no card "Minha Empresa".{"\n\n"} + 2. Toque no botão de adição ou editar. Preencha todas as informações básicas: nome do local, descrição detalhada e o tipo de serviço que você oferece (ex: Gastronomia, Artesanato).{"\n\n"} + 3. Fotos são fundamentais! Adicione imagens bem iluminadas da fachada e do interior para gerar confiança nos visitantes.{"\n\n"} + 4. Localização: Verifique se o ponto no mapa está correto para que o GPS leve os turistas exatamente até a sua porta.{"\n\n"} + 5. Finalize clicando em "Salvar". Nossa equipe analisará os dados em no máximo 24 horas para garantir a qualidade da plataforma. + + + + {/* Tip Box (UX Enhancement) */} + + + + Dica de Especialista + + + Negócios com descrições ricas em detalhes e que respondem rápido às avaliações tendem a aparecer no topo das buscas dos turistas! + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#fff', + }, + headerWrapper: { + paddingHorizontal: 20, + paddingTop: 15, + paddingBottom: 20, + borderBottomWidth: 1, + borderBottomColor: '#F7FAFC', + }, + scrollContent: { + paddingHorizontal: 24, + paddingTop: 32, + paddingBottom: 60, + }, + titleSection: { + alignItems: 'center', + marginBottom: 40, + }, + iconCircle: { + width: 80, + height: 80, + borderRadius: 40, + backgroundColor: '#FFF0F0', // Soft primary background + justifyContent: 'center', + alignItems: 'center', + marginBottom: 20, + }, + mainTitle: { + fontSize: 24, + fontWeight: '800', + color: '#1A202C', + textAlign: 'center', + lineHeight: 32, + }, + contentSection: { + marginBottom: 32, + }, + bodyText: { + fontSize: 16, + color: '#4A5568', + lineHeight: 26, // Defined for readability as requested + textAlign: 'justify', + }, + boldText: { + fontWeight: '700', + color: '#2D3748', + }, + tipBox: { + backgroundColor: '#FAFAFA', + borderRadius: 20, + padding: 20, + borderWidth: 1, + borderColor: '#F1F1F1', + ...Platform.select({ + ios: { + shadowColor: '#000', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.04, + shadowRadius: 10, + }, + android: { + elevation: 2, + }, + }), + }, + tipHeader: { + flexDirection: 'row', + alignItems: 'center', + marginBottom: 10, + gap: 8, + }, + tipTitle: { + fontSize: 14, + fontWeight: '700', + color: '#C34342', // Standard primary color + textTransform: 'uppercase', + letterSpacing: 0.5, + }, + tipText: { + fontSize: 14, + color: '#718096', + lineHeight: 22, + }, +}); + +export default FaqDetailScreen; diff --git a/app/_layout.tsx b/app/_layout.tsx index f983bd7..e445ba5 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -19,7 +19,8 @@ export default function RootLayout() { - + + diff --git a/app/help.tsx b/app/help.tsx deleted file mode 100644 index 00e0027..0000000 --- a/app/help.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { Container } from '@/components/general/container'; -import { Text, View } from 'react-native'; - -export default function Help() { - return ( - - - Ajuda - - - ); -} From 9d09b3fee0b81d8986d2e2af51b8f7b695dc8eef Mon Sep 17 00:00:00 2001 From: Hivison Date: Mon, 20 Apr 2026 15:34:52 -0300 Subject: [PATCH 22/54] fix(help): resolve lint errors and formatting in help screens --- app/(help)/help.tsx | 22 +++++++++++----------- app/(help)/helpDetail.tsx | 10 +++++----- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/(help)/help.tsx b/app/(help)/help.tsx index 97f9161..a49c5ea 100644 --- a/app/(help)/help.tsx +++ b/app/(help)/help.tsx @@ -15,7 +15,7 @@ import { } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; -// Define types for our FAQ items + type FAQItem = { id: number; title: string; @@ -33,7 +33,7 @@ const HelpScreen: React.FC = () => { { id: 4, title: 'Formas de pagamento', icon: 'credit-card' }, ]; - // Handle email support + const handleSendEmail = async () => { const email = 'suporte@mandaca.com.br'; const subject = encodeURIComponent('Suporte - Central de Ajuda Mandacá'); @@ -46,7 +46,7 @@ const HelpScreen: React.FC = () => { } else { Alert.alert('Erro', 'Não foi possível abrir o aplicativo de e-mail.'); } - } catch (error) { + } catch { Alert.alert('Erro', 'Ocorreu um erro ao tentar abrir o e-mail.'); } }; @@ -62,7 +62,7 @@ const HelpScreen: React.FC = () => { } else { Alert.alert('Erro', 'Não foi possível realizar a chamada.'); } - } catch (error) { + } catch { Alert.alert('Erro', 'Ocorreu um erro ao tentar ligar para o suporte.'); } }; @@ -71,9 +71,9 @@ const HelpScreen: React.FC = () => { {/* Standard Fixed Header - Adjusted padding */} -
router.back()} /> @@ -105,18 +105,18 @@ const HelpScreen: React.FC = () => { Contato - Enviar E-mail - diff --git a/app/(help)/helpDetail.tsx b/app/(help)/helpDetail.tsx index 6552495..7841e3b 100644 --- a/app/(help)/helpDetail.tsx +++ b/app/(help)/helpDetail.tsx @@ -46,11 +46,11 @@ const FaqDetailScreen: React.FC = () => { {/* Content Section: Focused on Readability (lineHeight: 26) */} - Para cadastrar seu negócio no Mandacá e começar a atrair turistas da região, siga este guia passo a passo:{"\n\n"} - 1. Na sua tela inicial, navegue até a seção de ferramentas e clique no card "Minha Empresa".{"\n\n"} - 2. Toque no botão de adição ou editar. Preencha todas as informações básicas: nome do local, descrição detalhada e o tipo de serviço que você oferece (ex: Gastronomia, Artesanato).{"\n\n"} - 3. Fotos são fundamentais! Adicione imagens bem iluminadas da fachada e do interior para gerar confiança nos visitantes.{"\n\n"} - 4. Localização: Verifique se o ponto no mapa está correto para que o GPS leve os turistas exatamente até a sua porta.{"\n\n"} + Para cadastrar seu negócio no Mandacá e começar a atrair turistas da região, siga este guia passo a passo:{'\n\n'} + 1. Na sua tela inicial, navegue até a seção de ferramentas e clique no card "Minha Empresa".{'\n\n'} + 2. Toque no botão de adição ou editar. Preencha todas as informações básicas: nome do local, descrição detalhada e o tipo de serviço que você oferece (ex: Gastronomia, Artesanato).{'\n\n'} + 3. Fotos são fundamentais! Adicione imagens bem iluminadas da fachada e do interior para gerar confiança nos visitantes.{'\n\n'} + 4. Localização: Verifique se o ponto no mapa está correto para que o GPS leve os turistas exatamente até a sua porta.{'\n\n'} 5. Finalize clicando em "Salvar". Nossa equipe analisará os dados em no máximo 24 horas para garantir a qualidade da plataforma. From 2c7e69da3ab49d6e78ff3be3e48b084b7a5b4d58 Mon Sep 17 00:00:00 2001 From: Hivison Date: Mon, 20 Apr 2026 15:41:51 -0300 Subject: [PATCH 23/54] fix(help): resolve critical lint errors (unescaped entities and max-len) --- app/(help)/helpDetail.tsx | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/app/(help)/helpDetail.tsx b/app/(help)/helpDetail.tsx index 7841e3b..ca96a03 100644 --- a/app/(help)/helpDetail.tsx +++ b/app/(help)/helpDetail.tsx @@ -46,12 +46,20 @@ const FaqDetailScreen: React.FC = () => { {/* Content Section: Focused on Readability (lineHeight: 26) */} - Para cadastrar seu negócio no Mandacá e começar a atrair turistas da região, siga este guia passo a passo:{'\n\n'} - 1. Na sua tela inicial, navegue até a seção de ferramentas e clique no card "Minha Empresa".{'\n\n'} - 2. Toque no botão de adição ou editar. Preencha todas as informações básicas: nome do local, descrição detalhada e o tipo de serviço que você oferece (ex: Gastronomia, Artesanato).{'\n\n'} - 3. Fotos são fundamentais! Adicione imagens bem iluminadas da fachada e do interior para gerar confiança nos visitantes.{'\n\n'} - 4. Localização: Verifique se o ponto no mapa está correto para que o GPS leve os turistas exatamente até a sua porta.{'\n\n'} - 5. Finalize clicando em "Salvar". Nossa equipe analisará os dados em no máximo 24 horas para garantir a qualidade da plataforma. + Para cadastrar seu negócio no Mandacá e começar a atrair turistas da região, + siga este guia passo a passo:{'\n\n'} + 1. Na sua tela inicial, navegue até a seção de ferramentas e clique no card{' '} + "Minha Empresa".{'\n\n'} + 2. Toque no botão de adição ou editar. Preencha todas as informações básicas: + nome do local, descrição detalhada e o tipo de serviço que você oferece + (ex: Gastronomia, Artesanato).{'\n\n'} + 3. Fotos são fundamentais! Adicione imagens + bem iluminadas da fachada e do interior para gerar confiança nos visitantes.{'\n\n'} + 4. Localização: Verifique se o ponto no mapa está correto para que o GPS leve + os turistas exatamente até a sua porta.{'\n\n'} + 5. Finalize clicando em "Salvar". + Nossa equipe analisará os dados em no máximo 24 horas para garantir + a qualidade da plataforma. @@ -62,7 +70,8 @@ const FaqDetailScreen: React.FC = () => { Dica de Especialista - Negócios com descrições ricas em detalhes e que respondem rápido às avaliações tendem a aparecer no topo das buscas dos turistas! + Negócios com descrições ricas em detalhes e que respondem rápido + às avaliações tendem a aparecer no topo das buscas dos turistas! From 9df4ac4ad421d785c695791a6db46c4f8f6a679f Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Mon, 20 Apr 2026 16:04:59 -0300 Subject: [PATCH 24/54] scrum-43 report.tsx component name fix --- app/(report)/report.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/(report)/report.tsx b/app/(report)/report.tsx index 5a1b69e..5112d90 100644 --- a/app/(report)/report.tsx +++ b/app/(report)/report.tsx @@ -6,7 +6,7 @@ import { ChatButton } from '@/components/report/chatButton'; import { useState } from 'react'; import { View } from 'react-native'; -export default function Profile() { +export default function Report() { const [loading, setLoading] = useState(false) const handlePress = ()=> { From 8d9500eaef2ad4d6bbf6e7f5ee8d431c0e331eb7 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 19:41:20 -0300 Subject: [PATCH 25/54] SCRUM-198 chore: cria constants/api.ts com EXPO_PUBLIC_API_URL --- constants/api.ts | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 constants/api.ts diff --git a/constants/api.ts b/constants/api.ts new file mode 100644 index 0000000..b85468d --- /dev/null +++ b/constants/api.ts @@ -0,0 +1,2 @@ +export const API_URL = + process.env.EXPO_PUBLIC_API_URL ?? 'http://localhost:8000'; From 7ba3605f4b580da8839413e716fd0fe5ae97c055 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 19:42:20 -0300 Subject: [PATCH 26/54] SCRUM-198 chore: substitui URLs hardcoded do backend por API_URL --- app/(mybusiness)/businessOverview.tsx | 4 ++-- app/(mybusiness)/editStory.tsx | 4 ++-- .../Home/completeProfile/completeProfile.tsx | 3 ++- components/Home/header/header.tsx | 3 ++- components/editStory/audioBox.tsx | 19 ++++++++++++++++--- services/imagesEnterprise.ts | 8 ++++---- 6 files changed, 28 insertions(+), 13 deletions(-) diff --git a/app/(mybusiness)/businessOverview.tsx b/app/(mybusiness)/businessOverview.tsx index 4f8844a..555f067 100644 --- a/app/(mybusiness)/businessOverview.tsx +++ b/app/(mybusiness)/businessOverview.tsx @@ -9,7 +9,7 @@ import Address from '@/components/overview/address'; import EditButton from '@/components/overview/editButton'; import Journey from '@/components/overview/journey'; -const BASE_URL = 'https://mandaca-backend.onrender.com'; +import { API_URL } from '@/constants/api'; const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; export default function Overview () { @@ -22,7 +22,7 @@ export default function Overview () { setLoading(true); const response = await axios.get( - `${BASE_URL}/enterprises/overview`, + `${API_URL}/enterprises/overview`, { params: { enterprise_id: ENTERPRISE_ID }, }, diff --git a/app/(mybusiness)/editStory.tsx b/app/(mybusiness)/editStory.tsx index e682ac4..9365181 100644 --- a/app/(mybusiness)/editStory.tsx +++ b/app/(mybusiness)/editStory.tsx @@ -10,7 +10,7 @@ import { router } from 'expo-router'; import { useState } from 'react'; import { Alert, Text, View } from 'react-native'; -const BASE_URL = 'https://mandaca-backend.onrender.com'; +import { API_URL } from '@/constants/api'; const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; export default function EditStory() { @@ -33,7 +33,7 @@ export default function EditStory() { setSaving(true); - await axios.put(`${BASE_URL}/enterprises/${ENTERPRISE_ID}`, { + await axios.put(`${API_URL}/enterprises/${ENTERPRISE_ID}`, { historia: toggle === 'WRITE' ? text.trim() : audio, }); diff --git a/components/Home/completeProfile/completeProfile.tsx b/components/Home/completeProfile/completeProfile.tsx index 68ad056..44d4a05 100644 --- a/components/Home/completeProfile/completeProfile.tsx +++ b/components/Home/completeProfile/completeProfile.tsx @@ -1,3 +1,4 @@ +import { API_URL } from '@/constants/api'; import { Enterprise } from '@/types/enterprise'; import axios from 'axios'; import { useEffect, useState } from 'react'; @@ -13,7 +14,7 @@ export const CompleteProfile = () => { 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; const response = await axios.get( - `https://mandaca-backend.onrender.com/enterprises/percentage/${enterpriseId}`, + `${API_URL}/enterprises/percentage/${enterpriseId}`, ); if (response.data && typeof response.data.porcentagem === 'number') { diff --git a/components/Home/header/header.tsx b/components/Home/header/header.tsx index 53b3177..41b112a 100644 --- a/components/Home/header/header.tsx +++ b/components/Home/header/header.tsx @@ -1,3 +1,4 @@ +import { API_URL } from '@/constants/api'; import { User } from '@/types/user'; import Ionicons from '@expo/vector-icons/Ionicons'; import axios from 'axios'; @@ -23,7 +24,7 @@ export const Header = () => { const userId = '453df15b-61ce-4571-8bdb-cdbedf0ff041'; const responseUser = await axios.get( - `https://mandaca-backend.onrender.com/users/${userId}`, + `${API_URL}/users/${userId}`, ); setUser(responseUser.data); diff --git a/components/editStory/audioBox.tsx b/components/editStory/audioBox.tsx index 9601992..51d2a77 100644 --- a/components/editStory/audioBox.tsx +++ b/components/editStory/audioBox.tsx @@ -1,3 +1,4 @@ +import { API_URL } from '@/constants/api' import Ionicons from '@expo/vector-icons/Ionicons' import * as FileSystem from 'expo-file-system/legacy' import { useState } from 'react' @@ -22,7 +23,6 @@ type Props = { setToggle: (t: 'WRITE' | 'AUDIO') => void } -const BASE_URL = 'https://mandaca-backend.onrender.com' const USER_ID = '453df15b-61ce-4571-8bdb-cdbedf0ff041' export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) { @@ -72,14 +72,27 @@ export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) if (!uri) return + const extension = uri.split('.').pop()?.toLowerCase() ?? 'm4a' + const mimeTypeMap: Record = { + 'm4a': 'audio/mp4', + 'mp4': 'audio/mp4', + 'mp3': 'audio/mpeg', + '3gp': 'audio/3gpp', + 'aac': 'audio/aac', + 'wav': 'audio/wav', + } + const mimeType = mimeTypeMap[extension] ?? 'audio/mp4' + + console.log('[AudioBox] URI gravada:', uri, '| MIME:', mimeType) + const result = await FileSystem.uploadAsync( - `${BASE_URL}/transcriptions`, + `${API_URL}/transcriptions`, uri, { httpMethod: 'POST', uploadType: FileSystem.FileSystemUploadType.MULTIPART, fieldName: 'audio', - mimeType: 'audio/m4a', + mimeType, parameters: { usuario_id: USER_ID, }, diff --git a/services/imagesEnterprise.ts b/services/imagesEnterprise.ts index 021a257..5cc2768 100644 --- a/services/imagesEnterprise.ts +++ b/services/imagesEnterprise.ts @@ -3,18 +3,18 @@ import { ImageEnterprise } from '@/types/imageEnterprise'; import axios from 'axios'; -const BASE_URL = 'https://mandaca-backend.onrender.com'; +import { API_URL } from '@/constants/api'; export const getImagesByEnterprise = async (enterpriseId: string): Promise => { const response = await axios.get( - `${BASE_URL}/photos/enterprise/${enterpriseId}`, + `${API_URL}/photos/enterprise/${enterpriseId}`, ); return response.data; }; export const deleteImage = async (photoId: string): Promise => { - await axios.delete(`${BASE_URL}/photos/${photoId}`); + await axios.delete(`${API_URL}/photos/${photoId}`); }; export const uploadImage = async ( @@ -31,7 +31,7 @@ export const uploadImage = async ( type: 'image/jpeg', } as any); - await axios.post(`${BASE_URL}/photos/`, formData, { + await axios.post(`${API_URL}/photos/`, formData, { headers: { 'Content-Type': 'multipart/form-data', }, From d71561617dde763dc3abb919bb14462651ba7905 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 19:43:40 -0300 Subject: [PATCH 27/54] SCRUM-198 chore: cria .env.example com EXPO_PUBLIC_API_URL --- .env.example | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..c07121b --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +# URL da API do backend (sem barra no final) +# Production: https://mandaca-backend-production.onrender.com +EXPO_PUBLIC_API_URL=http://localhost:8000 From f326bfbc615476d79d17f60c64706a3257525a55 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 19:43:55 -0300 Subject: [PATCH 28/54] SCRUM-198 chore: adiciona script build:web ao package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 8a19d59..f245947 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "android": "expo start --android", "ios": "expo start --ios", "web": "expo start --web", + "build:web": "expo export --platform web", "lint": "expo lint", "lint:fix": "eslint . --ext .ts,.tsx,.js,.jsx --fix", "type-check": "tsc --noEmit" From 5829b537236bdb9b47807c872917f68718677ee8 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 19:44:44 -0300 Subject: [PATCH 29/54] SCRUM-198 chore: adiciona render.yaml com deploy web production --- render.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 render.yaml diff --git a/render.yaml b/render.yaml new file mode 100644 index 0000000..39577bb --- /dev/null +++ b/render.yaml @@ -0,0 +1,14 @@ +services: + - type: web + name: mandaca-frontend-production + env: static + branch: main + buildCommand: npm install && npx expo export --platform web + staticPublishPath: dist + routes: + - type: rewrite + source: /* + destination: /index.html + envVars: + - key: EXPO_PUBLIC_API_URL + value: https://mandaca-backend-production.onrender.com From c37e53905af9d2d6be754bad5a50725bb3810548 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 19:45:04 -0300 Subject: [PATCH 30/54] SCRUM-198 chore: adiciona eas.json com perfis de build mobile --- eas.json | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 eas.json diff --git a/eas.json b/eas.json new file mode 100644 index 0000000..e527d31 --- /dev/null +++ b/eas.json @@ -0,0 +1,25 @@ +{ + "cli": { + "version": ">= 12.0.0" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal" + }, + "preview": { + "distribution": "internal", + "env": { + "EXPO_PUBLIC_API_URL": "https://mandaca-backend-production.onrender.com" + } + }, + "production": { + "env": { + "EXPO_PUBLIC_API_URL": "https://mandaca-backend-production.onrender.com" + } + } + }, + "submit": { + "production": {} + } +} From 6acf9ff56d65a01fe3f33ccb7de475386da61c1d Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 20:06:26 -0300 Subject: [PATCH 31/54] SCRUM-198 chore: vincula projeto ao Expo via eas init --- app.json | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app.json b/app.json index 1bc9ada..ad06818 100644 --- a/app.json +++ b/app.json @@ -19,7 +19,13 @@ "monochromeImage": "./assets/images/android-icon-monochrome.png" }, "edgeToEdgeEnabled": true, - "predictiveBackGestureEnabled": false + "predictiveBackGestureEnabled": false, + "permissions": [ + "android.permission.RECORD_AUDIO", + "android.permission.MODIFY_AUDIO_SETTINGS", + "android.permission.FOREGROUND_SERVICE", + "android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" + ] }, "web": { "output": "static", @@ -48,6 +54,13 @@ "experiments": { "typedRoutes": true, "reactCompiler": true - } + }, + "extra": { + "router": {}, + "eas": { + "projectId": "7272b860-132a-449b-89d8-a7d586f8fe7b" + } + }, + "owner": "notgreatdavi" } } From 6c4c63bc4c4584ba2904fdf9fc81c15fcd72d34b Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 20:09:57 -0300 Subject: [PATCH 32/54] SCRUM-198 chore: adiciona bundleIdentifier iOS ao app.json --- app.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app.json b/app.json index ad06818..b117076 100644 --- a/app.json +++ b/app.json @@ -9,7 +9,8 @@ "userInterfaceStyle": "light", "newArchEnabled": true, "ios": { - "supportsTablet": true + "supportsTablet": true, + "bundleIdentifier": "com.mandaca.frontend" }, "android": { "adaptiveIcon": { From afa42e3cb7a190e36880e11e64a5ed1aeb8ea18a Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 20:15:52 -0300 Subject: [PATCH 33/54] SCRUM-198 chore: adiciona package Android ao app.json --- app.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app.json b/app.json index b117076..6cc3cbe 100644 --- a/app.json +++ b/app.json @@ -10,9 +10,13 @@ "newArchEnabled": true, "ios": { "supportsTablet": true, - "bundleIdentifier": "com.mandaca.frontend" + "bundleIdentifier": "com.mandaca.frontend", + "infoPlist": { + "ITSAppUsesNonExemptEncryption": false + } }, "android": { + "package": "com.mandaca.frontend", "adaptiveIcon": { "backgroundColor": "#E6F4FE", "foregroundImage": "./assets/images/android-icon-foreground.png", From b4b1e14f6e627f62767399968133746073a4732c Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 21:03:23 -0300 Subject: [PATCH 34/54] SCRUM-198 chore: adiciona buildType apk ao perfil preview do eas.json --- eas.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/eas.json b/eas.json index e527d31..55a9add 100644 --- a/eas.json +++ b/eas.json @@ -9,6 +9,9 @@ }, "preview": { "distribution": "internal", + "android": { + "buildType": "apk" + }, "env": { "EXPO_PUBLIC_API_URL": "https://mandaca-backend-production.onrender.com" } From 2cd0bc9e3e5ac347112f23b84cb6ca7b7f0423f4 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 21:27:43 -0300 Subject: [PATCH 35/54] SCRUM-198 chore: adiciona GitHub Actions workflow para EAS Build Android --- .github/workflows/eas-build-android.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/eas-build-android.yml diff --git a/.github/workflows/eas-build-android.yml b/.github/workflows/eas-build-android.yml new file mode 100644 index 0000000..5161295 --- /dev/null +++ b/.github/workflows/eas-build-android.yml @@ -0,0 +1,25 @@ +name: EAS Build Android + +on: + push: + branches: [main] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + + - run: npm ci + + - uses: expo/expo-github-action@v8 + with: + eas-version: latest + token: ${{ secrets.EXPO_TOKEN }} + + - run: npx eas build --platform android --profile preview --non-interactive From 47c519649398e529e29fcec5ea5cce71d9bba42c Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 22:15:09 -0300 Subject: [PATCH 36/54] SCRUM-198 chore: adiciona comentario automatico de build no PR --- .github/workflows/eas-build-android.yml | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/.github/workflows/eas-build-android.yml b/.github/workflows/eas-build-android.yml index 5161295..d9b6381 100644 --- a/.github/workflows/eas-build-android.yml +++ b/.github/workflows/eas-build-android.yml @@ -3,10 +3,14 @@ name: EAS Build Android on: push: branches: [main] + pull_request: + branches: [main] jobs: build: runs-on: ubuntu-latest + permissions: + pull-requests: write steps: - uses: actions/checkout@v4 @@ -22,4 +26,21 @@ jobs: eas-version: latest token: ${{ secrets.EXPO_TOKEN }} - - run: npx eas build --platform android --profile preview --non-interactive + - name: Build Android APK + id: eas-build + run: | + OUTPUT=$(npx eas build --platform android --profile preview --non-interactive --json 2>/dev/null) + BUILD_ID=$(echo "$OUTPUT" | jq -r '.[0].id') + echo "build_id=$BUILD_ID" >> $GITHUB_OUTPUT + + - name: Comment on PR with build link + if: github.event_name == 'pull_request' + uses: actions/github-script@v7 + with: + script: | + await github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: `## Android Build (Preview)\n\nBuild enviado para o EAS. Acompanhe e baixe o APK quando terminar (~5 min):\n\n**[Ver build no Expo](https://expo.dev/accounts/notgreatdavi/projects/mandaca-frontend/builds/${{ steps.eas-build.outputs.build_id }})**` + }) From ee31026e0819b371ac2982d52102c74a17db47c4 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Tue, 21 Apr 2026 22:20:38 -0300 Subject: [PATCH 37/54] SCRUM-198 chore: adiciona eas-cli como dependencia local --- package-lock.json | 3821 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 1 + 2 files changed, 3769 insertions(+), 53 deletions(-) diff --git a/package-lock.json b/package-lock.json index fb14846..056b927 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@react-navigation/native": "^7.1.8", "axios": "^1.13.6", "babel-preset-expo": "^55.0.11", + "eas-cli": "^18.7.0", "expo": "^55.0.9", "expo-audio": "~55.0.13", "expo-av": "^16.0.8", @@ -54,6 +55,20 @@ "typescript": "~5.9.2" } }, + "node_modules/@0no-co/graphql.web": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", + "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", + "license": "MIT", + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "graphql": { + "optional": true + } + } + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -391,6 +406,92 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/parser": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", @@ -1457,6 +1558,28 @@ "node": ">=6.9.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@egjs/hammerjs": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", @@ -1653,6 +1776,36 @@ "integrity": "sha512-59qFO6w4W/wUZ6VuYfN1wtgyk4zFJspbKOdHYISMeDa2H4apZKY0Ab7K5ouee+C+s3/VfAp6tLK7ov+PsENhKw==", "license": "MIT AND Apache-2.0" }, + "node_modules/@expo/apple-utils": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/@expo/apple-utils/-/apple-utils-2.1.19.tgz", + "integrity": "sha512-f1iMteL+tTOSF1sovVB35ncobdiZvhjWvwEOWGIuAutyeIpcxNJ/2tUZSE748X/VEQLn1cL2Tozkdp2MLXStvA==", + "license": "MIT", + "bin": { + "apple-utils": "bin.js" + } + }, + "node_modules/@expo/bunyan": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.1.tgz", + "integrity": "sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==", + "license": "MIT", + "dependencies": { + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@expo/bunyan/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@expo/code-signing-certificates": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", @@ -1783,6 +1936,204 @@ "react-native": "*" } }, + "node_modules/@expo/eas-build-job": { + "version": "18.6.0", + "resolved": "https://registry.npmjs.org/@expo/eas-build-job/-/eas-build-job-18.6.0.tgz", + "integrity": "sha512-gd9EjQoGur7qrc/JwEo+ckNYbn5QqWsGOygs95/8uwyUyJO/JZWcoH7v5MnWiclCka1ttOfQjz3DhLm7menK5w==", + "license": "MIT", + "dependencies": { + "@expo/logger": "18.5.0", + "joi": "^17.13.1", + "semver": "^7.6.2", + "zod": "^4.3.5" + } + }, + "node_modules/@expo/eas-build-job/node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/@expo/eas-build-job/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/eas-json": { + "version": "18.6.0", + "resolved": "https://registry.npmjs.org/@expo/eas-json/-/eas-json-18.6.0.tgz", + "integrity": "sha512-PR8q/+hlkiwzAP+5mojwYUnolRzgzWSncA9iVGsuVBt3F6JvyVYF3WlZHzXBqoRFlU2urxeDqyZ+b+U/UjAxwQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.23.5", + "@expo/eas-build-job": "18.6.0", + "chalk": "4.1.2", + "env-string": "1.0.1", + "fs-extra": "11.2.0", + "golden-fleece": "1.0.9", + "joi": "17.11.0", + "log-symbols": "4.1.0", + "semver": "7.5.2", + "terminal-link": "2.1.1", + "tslib": "2.4.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@expo/eas-json/node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@expo/eas-json/node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/eas-json/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/eas-json/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@expo/eas-json/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@expo/eas-json/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@expo/eas-json/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/eas-json/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@expo/eas-json/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/eas-json/node_modules/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/eas-json/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/eas-json/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "license": "0BSD" + }, + "node_modules/@expo/eas-json/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/@expo/env": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.1.1.tgz", @@ -1931,6 +2282,16 @@ "react-native": "*" } }, + "node_modules/@expo/logger": { + "version": "18.5.0", + "resolved": "https://registry.npmjs.org/@expo/logger/-/logger-18.5.0.tgz", + "integrity": "sha512-KYMvfgsgkBQOaWVILokKJBhtuY9My4WozTm+N9tyjNvJ5eg23DhqWIvJpHnneg+KHLJaeDjbtaQ1/YkFreHU5g==", + "license": "BUSL-1.1", + "dependencies": { + "@types/bunyan": "^1.8.11", + "bunyan": "^1.8.15" + } + }, "node_modules/@expo/metro": { "version": "54.2.0", "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", @@ -2039,6 +2400,15 @@ } } }, + "node_modules/@expo/multipart-body-parser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@expo/multipart-body-parser/-/multipart-body-parser-2.0.0.tgz", + "integrity": "sha512-yS/wsqlj0d8ZKETEN7ro3dZtjdMhpte8wp+xUzjUQC3jizxcE0E62xgvGquJObiYUMGoCF5qRYr2t78STPEaSw==", + "license": "MIT", + "dependencies": { + "multipasta": "^0.2.5" + } + }, "node_modules/@expo/osascript": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.4.2.tgz", @@ -2065,6 +2435,15 @@ "resolve-workspace-root": "^2.0.0" } }, + "node_modules/@expo/pkcs12": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@expo/pkcs12/-/pkcs12-0.1.3.tgz", + "integrity": "sha512-96MePEGppKi08vawrTPw8kMCRdsbrDbV900MlI8rrP9F57DfDl/y1P52bwIDBYCEHE3XtPMo7s1xkG0BKOLCVg==", + "license": "MIT", + "dependencies": { + "node-forge": "^1.2.1" + } + }, "node_modules/@expo/plist": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.5.2.tgz", @@ -2076,6 +2455,215 @@ "xmlbuilder": "^15.1.1" } }, + "node_modules/@expo/plugin-help": { + "version": "5.1.23", + "resolved": "https://registry.npmjs.org/@expo/plugin-help/-/plugin-help-5.1.23.tgz", + "integrity": "sha512-s0uH6cPplLj73ZVie40EYUhl7X7q9kRR+8IfZWDod3wUtVGOFInxuCPX9Jpv1UwwBgbRu2cLisqr8m45LrFgxw==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^2.11.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@expo/plugin-help/node_modules/@oclif/core": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.16.0.tgz", + "integrity": "sha512-dL6atBH0zCZl1A1IXCKJgLPrM/wR7K+Wi401E/IvqsK8m2iCHW+0TEOGrans/cuN3oTW+uxIyJFHJ8Im0k4qBw==", + "license": "MIT", + "dependencies": { + "@types/cli-progress": "^3.11.0", + "ansi-escapes": "^4.3.2", + "ansi-styles": "^4.3.0", + "cardinal": "^2.1.1", + "chalk": "^4.1.2", + "clean-stack": "^3.0.1", + "cli-progress": "^3.12.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "get-package-type": "^0.1.0", + "globby": "^11.1.0", + "hyperlinker": "^1.0.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "js-yaml": "^3.14.1", + "natural-orderby": "^2.0.3", + "object-treeify": "^1.1.33", + "password-prompt": "^1.1.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "supports-color": "^8.1.1", + "supports-hyperlinks": "^2.2.0", + "ts-node": "^10.9.1", + "tslib": "^2.5.0", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@expo/plugin-help/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@expo/plugin-help/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@expo/plugin-help/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@expo/plugin-warn-if-update-available": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@expo/plugin-warn-if-update-available/-/plugin-warn-if-update-available-2.5.1.tgz", + "integrity": "sha512-B65QSIZ+TgFHnVXsTw+1Q6djsJByWwnIjYfoG8ZV9wizOC01gbAw1cOZ/YtrJ2BrDnzFQtM8qecjlmZ7C3MPLw==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^2.11.1", + "chalk": "^4.1.0", + "debug": "^4.3.4", + "ejs": "^3.1.7", + "fs-extra": "^10.1.0", + "http-call": "^5.2.2", + "semver": "^7.3.7", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@expo/plugin-warn-if-update-available/node_modules/@oclif/core": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.16.0.tgz", + "integrity": "sha512-dL6atBH0zCZl1A1IXCKJgLPrM/wR7K+Wi401E/IvqsK8m2iCHW+0TEOGrans/cuN3oTW+uxIyJFHJ8Im0k4qBw==", + "license": "MIT", + "dependencies": { + "@types/cli-progress": "^3.11.0", + "ansi-escapes": "^4.3.2", + "ansi-styles": "^4.3.0", + "cardinal": "^2.1.1", + "chalk": "^4.1.2", + "clean-stack": "^3.0.1", + "cli-progress": "^3.12.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "get-package-type": "^0.1.0", + "globby": "^11.1.0", + "hyperlinker": "^1.0.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "js-yaml": "^3.14.1", + "natural-orderby": "^2.0.3", + "object-treeify": "^1.1.33", + "password-prompt": "^1.1.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "supports-color": "^8.1.1", + "supports-hyperlinks": "^2.2.0", + "ts-node": "^10.9.1", + "tslib": "^2.5.0", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@expo/plugin-warn-if-update-available/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@expo/plugin-warn-if-update-available/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/plugin-warn-if-update-available/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@expo/plugin-warn-if-update-available/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/plugin-warn-if-update-available/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/@expo/prebuild-config": { "version": "55.0.11", "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-55.0.11.tgz", @@ -2128,6 +2716,42 @@ } } }, + "node_modules/@expo/results": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@expo/results/-/results-1.0.0.tgz", + "integrity": "sha512-qECzzXX5oJot3m2Gu9pfRDz50USdBieQVwYAzeAtQRUTD3PVeTK1tlRUoDcrK8PSruDLuVYdKkLebX4w/o55VA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/rudder-sdk-node": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@expo/rudder-sdk-node/-/rudder-sdk-node-1.1.1.tgz", + "integrity": "sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==", + "license": "MIT", + "dependencies": { + "@expo/bunyan": "^4.0.0", + "@segment/loosely-validate-event": "^2.0.0", + "fetch-retry": "^4.1.1", + "md5": "^2.2.1", + "node-fetch": "^2.6.1", + "remove-trailing-slash": "^0.1.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/rudder-sdk-node/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@expo/schema-utils": { "version": "55.0.2", "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-55.0.2.tgz", @@ -2152,12 +2776,66 @@ "node": ">=12" } }, + "node_modules/@expo/steps": { + "version": "18.6.0", + "resolved": "https://registry.npmjs.org/@expo/steps/-/steps-18.6.0.tgz", + "integrity": "sha512-PXWKoWfeU81oawdpisgYwj3mbPfjuXbjCXJnT6ICLNcy3mHmjLPM9oH4wpyoUc/jCW62GdGfmi+NHNDxGoiBmQ==", + "license": "BUSL-1.1", + "dependencies": { + "@expo/eas-build-job": "18.6.0", + "@expo/logger": "18.5.0", + "@expo/spawn-async": "^1.7.2", + "arg": "^5.0.2", + "fs-extra": "^11.2.0", + "joi": "^17.13.1", + "jsep": "^1.3.8", + "lodash.clonedeep": "^4.5.0", + "lodash.get": "^4.4.2", + "uuid": "^9.0.1", + "yaml": "^2.4.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@expo/steps/node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/@expo/steps/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@expo/sudo-prompt": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "license": "MIT" }, + "node_modules/@expo/timeago.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@expo/timeago.js/-/timeago.js-1.0.0.tgz", + "integrity": "sha512-PD45CGlCL8kG0U3YcH1NvYxQThw5XAS7qE9bgP4L7dakm8lsMz+p8BQ1IjBFMmImawVWsV3py6JZINaEebXLnw==", + "license": "MIT" + }, "node_modules/@expo/ui": { "version": "55.0.6", "resolved": "https://registry.npmjs.org/@expo/ui/-/ui-55.0.6.tgz", @@ -2203,6 +2881,21 @@ "excpretty": "build/cli.js" } }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -2255,6 +2948,114 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@isaacs/ttlcache": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", @@ -2584,22 +3385,139 @@ "node": ">=12.4.0" } }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "node_modules/@oclif/core": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.10.5.tgz", + "integrity": "sha512-qcdCF7NrdWPfme6Kr34wwljRCXbCVpL1WVxiNy0Ep6vbWKjxAjFQwuhqkoyL0yjI+KdwtLcOCGn5z2yzdijc8w==", "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { + "dependencies": { + "ansi-escapes": "^4.3.2", + "ansis": "^3.17.0", + "clean-stack": "^3.0.1", + "cli-spinners": "^2.9.2", + "debug": "^4.4.3", + "ejs": "^3.1.10", + "get-package-type": "^0.1.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "lilconfig": "^3.1.3", + "minimatch": "^10.2.5", + "semver": "^7.7.3", + "string-width": "^4.2.3", + "supports-color": "^8", + "tinyglobby": "^0.2.14", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/core/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@oclif/core/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@oclif/core/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@oclif/core/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@oclif/core/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@oclif/plugin-autocomplete": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.45.tgz", + "integrity": "sha512-ENrUg8rbVCjh40uvi3MC9kGbiUoEf11nyqE59RBzegeeLpRXNo/Zp27L9j1tUmPEqGgfS2/wvHPihNzkpK1FDw==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4", + "ansis": "^3.16.0", + "debug": "^4.4.1", + "ejs": "^3.1.10" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { "@types/react": { "optional": true } @@ -3117,6 +4035,125 @@ "dev": true, "license": "MIT" }, + "node_modules/@segment/loosely-validate-event": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", + "integrity": "sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==", + "dependencies": { + "component-type": "^1.2.1", + "join-component": "^1.1.0" + } + }, + "node_modules/@sentry-internal/tracing": { + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.77.0.tgz", + "integrity": "sha512-8HRF1rdqWwtINqGEdx8Iqs9UOP/n8E0vXUu3Nmbqj4p5sQPA7vvCfq+4Y4rTqZFc7sNdFpDsRION5iQEh8zfZw==", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.77.0", + "@sentry/types": "7.77.0", + "@sentry/utils": "7.77.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/core": { + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.77.0.tgz", + "integrity": "sha512-Tj8oTYFZ/ZD+xW8IGIsU6gcFXD/gfE+FUxUaeSosd9KHwBQNOLhZSsYo/tTVf/rnQI/dQnsd4onPZLiL+27aTg==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.77.0", + "@sentry/utils": "7.77.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node": { + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.77.0.tgz", + "integrity": "sha512-Ob5tgaJOj0OYMwnocc6G/CDLWC7hXfVvKX/ofkF98+BbN/tQa5poL+OwgFn9BA8ud8xKzyGPxGU6LdZ8Oh3z/g==", + "license": "MIT", + "dependencies": { + "@sentry-internal/tracing": "7.77.0", + "@sentry/core": "7.77.0", + "@sentry/types": "7.77.0", + "@sentry/utils": "7.77.0", + "https-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@sentry/node/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@sentry/types": { + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.77.0.tgz", + "integrity": "sha512-nfb00XRJVi0QpDHg+JkqrmEBHsqBnxJu191Ded+Cs1OJ5oPXEW6F59LVcBScGvMqe+WEk1a73eH8XezwfgrTsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.77.0.tgz", + "integrity": "sha512-NmM2kDOqVchrey3N5WSzdQoCsyDkQkiRxExPaNI2oKQ/jMWHs9yt0tSy7otPBcXs0AP59ihl75Bvm1tDRcsp5g==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.77.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, "node_modules/@sinclair/typebox": { "version": "0.27.10", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", @@ -3141,6 +4178,30 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "license": "MIT" + }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -3193,6 +4254,24 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/bunyan": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", + "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cli-progress": { + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.6.tgz", + "integrity": "sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -3848,6 +4927,26 @@ "win32" ] }, + "node_modules/@urql/core": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-4.0.11.tgz", + "integrity": "sha512-FFdY97vF5xnUrElcGw9erOLvtu+KGMLfwrLNDfv4IPgdp2IBsiGe+Kb7Aypfd3kH//BETewVSLm3+y2sSzjX6A==", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.1", + "wonka": "^6.3.2" + } + }, + "node_modules/@urql/exchange-retry": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.2.0.tgz", + "integrity": "sha512-1O/biKiVhhn0EtvDF4UOvz325K4RrLupfL8rHcmqD2TBLv4qVDWQuzx4JGa1FfqjjRb+C9TNZ6w19f32Mq85Ug==", + "license": "MIT", + "dependencies": { + "@urql/core": ">=4.0.0", + "wonka": "^6.3.2" + } + }, "node_modules/@xmldom/xmldom": { "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", @@ -3904,6 +5003,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -3930,6 +5041,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, "node_modules/anser": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", @@ -3987,6 +5137,21 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", + "license": "MIT" + }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -4076,6 +5241,15 @@ "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", "license": "MIT" }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", @@ -4202,6 +5376,30 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "license": "MIT" }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", @@ -4218,6 +5416,15 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -4245,7 +5452,21 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/babel-jest": { + "node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", @@ -4489,6 +5710,20 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -4662,6 +5897,24 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, + "node_modules/bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "engines": [ + "node >=0.10.0" + ], + "license": "MIT", + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -4771,6 +6024,19 @@ ], "license": "CC-BY-4.0" }, + "node_modules/cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", + "license": "MIT", + "dependencies": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + }, + "bin": { + "cdl": "bin/cdl.js" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4787,6 +6053,15 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -4823,6 +6098,15 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/chrome-launcher": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", @@ -4861,6 +6145,21 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "license": "MIT" }, + "node_modules/clean-stack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", + "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -4873,6 +6172,18 @@ "node": ">=4" } }, + "node_modules/cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/cli-spinners": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", @@ -4989,6 +6300,15 @@ "node": ">= 6" } }, + "node_modules/component-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.2.2.tgz", + "integrity": "sha512-99VUHREHiN5cLeHm3YLq312p6v+HUEcwtLCAtelvUDI6+SH5g5Cr85oNR2S1o6ywzL0ykMbuwLzM2ANocjEOIA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -5079,6 +6399,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -5105,6 +6434,12 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "license": "MIT" + }, "node_modules/cross-fetch": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", @@ -5128,6 +6463,24 @@ "node": ">= 8" } }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/css-in-js-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", @@ -5210,6 +6563,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -5358,6 +6720,27 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "license": "Apache-2.0" }, + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -5377,32 +6760,1202 @@ "dev": true, "license": "Apache-2.0", "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/domino": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.7.tgz", + "integrity": "sha512-3rcXhx0ixJV2nj8J0tljzejTF73A35LVVdnTQu79UAqTBFEgYPMgGtykMuu/BDqaOZphATku1ddRUn/RtqUHYQ==", + "license": "BSD-2-Clause" + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "hasInstallScript": true, + "license": "BSD-2-Clause", + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eas-cli": { + "version": "18.7.0", + "resolved": "https://registry.npmjs.org/eas-cli/-/eas-cli-18.7.0.tgz", + "integrity": "sha512-tU1KZbRTwr9Uvc1SZvpRF2JWmAusDhx4C1/fkWYjFuIlz9XFxkRsRrXVz9Qr57gbxWva7YNG+D44x+I1JRO2ag==", + "license": "MIT", + "dependencies": { + "@expo/apple-utils": "2.1.19", + "@expo/code-signing-certificates": "0.0.5", + "@expo/config": "55.0.10", + "@expo/config-plugins": "55.0.7", + "@expo/eas-build-job": "18.6.0", + "@expo/eas-json": "18.6.0", + "@expo/env": "^1.0.0", + "@expo/json-file": "8.3.3", + "@expo/logger": "18.5.0", + "@expo/multipart-body-parser": "2.0.0", + "@expo/osascript": "2.1.4", + "@expo/package-manager": "1.9.10", + "@expo/pkcs12": "0.1.3", + "@expo/plist": "0.2.0", + "@expo/plugin-help": "5.1.23", + "@expo/plugin-warn-if-update-available": "2.5.1", + "@expo/prebuild-config": "8.0.17", + "@expo/results": "1.0.0", + "@expo/rudder-sdk-node": "1.1.1", + "@expo/spawn-async": "1.7.2", + "@expo/steps": "18.6.0", + "@expo/timeago.js": "1.0.0", + "@oclif/core": "^4.8.3", + "@oclif/plugin-autocomplete": "^3.2.40", + "@segment/ajv-human-errors": "^2.1.2", + "@sentry/node": "7.77.0", + "@urql/core": "4.0.11", + "@urql/exchange-retry": "1.2.0", + "ajv": "8.11.0", + "ajv-formats": "2.1.1", + "better-opn": "3.0.2", + "bplist-parser": "^0.3.0", + "chalk": "4.1.2", + "cli-progress": "3.12.0", + "dateformat": "4.6.3", + "diff": "7.0.0", + "dotenv": "16.3.1", + "env-paths": "2.2.0", + "envinfo": "7.11.0", + "fast-deep-equal": "3.1.3", + "fast-glob": "3.3.2", + "figures": "3.2.0", + "form-data": "^4.0.4", + "fs-extra": "11.2.0", + "getenv": "1.0.0", + "gradle-to-js": "2.0.1", + "graphql": "16.8.1", + "graphql-tag": "2.12.6", + "https-proxy-agent": "5.0.1", + "ignore": "5.3.0", + "indent-string": "4.0.0", + "invariant": "^2.2.2", + "jks-js": "1.1.0", + "joi": "17.11.0", + "keychain": "1.5.0", + "log-symbols": "4.1.0", + "mime": "3.0.0", + "minimatch": "5.1.2", + "minizlib": "3.0.1", + "nanoid": "3.3.8", + "node-fetch": "2.6.7", + "node-forge": "1.3.1", + "node-stream-zip": "1.15.0", + "nullthrows": "1.1.1", + "ora": "5.1.0", + "pkg-dir": "4.2.0", + "pngjs": "7.0.0", + "promise-limit": "2.7.0", + "promise-retry": "2.0.1", + "prompts": "2.4.2", + "qrcode-terminal": "0.12.0", + "resolve-from": "5.0.0", + "semver": "7.5.4", + "set-interval-async": "3.0.3", + "slash": "3.0.0", + "tar": "7.5.7", + "tar-stream": "3.1.7", + "terminal-link": "2.1.1", + "ts-deepmerge": "6.2.0", + "tslib": "2.6.2", + "turndown": "7.1.2", + "untildify": "4.0.0", + "uuid": "9.0.1", + "wrap-ansi": "7.0.0", + "yaml": "2.6.0", + "zod": "^4.1.3" + }, + "bin": { + "eas": "bin/run" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/eas-cli/node_modules/@expo/code-signing-certificates": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", + "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", + "license": "MIT", + "dependencies": { + "node-forge": "^1.2.1", + "nullthrows": "^1.1.1" + } + }, + "node_modules/eas-cli/node_modules/@expo/config": { + "version": "55.0.10", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-55.0.10.tgz", + "integrity": "sha512-qCHxo9H1ZoeW+y0QeMtVZ3JfGmumpGrgUFX60wLWMarraoQZSe47ZUm9kJSn3iyoPjUtUNanO3eXQg+K8k4rag==", + "license": "MIT", + "dependencies": { + "@expo/config-plugins": "~55.0.7", + "@expo/config-types": "^55.0.5", + "@expo/json-file": "^10.0.12", + "@expo/require-utils": "^55.0.3", + "deepmerge": "^4.3.1", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "resolve-from": "^5.0.0", + "resolve-workspace-root": "^2.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4" + } + }, + "node_modules/eas-cli/node_modules/@expo/config/node_modules/@expo/json-file": { + "version": "10.0.13", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.13.tgz", + "integrity": "sha512-pX/XjQn7tgNw6zuuV2ikmegmwe/S7uiwhrs2wXrANMkq7ozrA+JcZwgW9Q/8WZgciBzfAhNp5hnackHcrmapQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" + } + }, + "node_modules/eas-cli/node_modules/@expo/config/node_modules/getenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eas-cli/node_modules/@expo/config/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eas-cli/node_modules/@expo/env": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-1.0.7.tgz", + "integrity": "sha512-qSTEnwvuYJ3umapO9XJtrb1fAqiPlmUUg78N0IZXXGwQRt+bkp0OBls+Y5Mxw/Owj8waAM0Z3huKKskRADR5ow==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "debug": "^4.3.4", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^2.0.0" + } + }, + "node_modules/eas-cli/node_modules/@expo/env/node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/eas-cli/node_modules/@expo/env/node_modules/getenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eas-cli/node_modules/@expo/image-utils": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.6.5.tgz", + "integrity": "sha512-RsS/1CwJYzccvlprYktD42KjyfWZECH6PPIEowvoSmXfGLfdViwcUEI4RvBfKX5Jli6P67H+6YmHvPTbGOboew==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "fs-extra": "9.0.0", + "getenv": "^1.0.0", + "jimp-compact": "0.16.1", + "parse-png": "^2.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "temp-dir": "~2.0.0", + "unique-string": "~2.0.0" + } + }, + "node_modules/eas-cli/node_modules/@expo/image-utils/node_modules/fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eas-cli/node_modules/@expo/image-utils/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eas-cli/node_modules/@expo/image-utils/node_modules/universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/eas-cli/node_modules/@expo/json-file": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-8.3.3.tgz", + "integrity": "sha512-eZ5dld9AD0PrVRiIWpRkm5aIoWBw3kAyd8VkuWEy92sEthBKDDDHAnK2a0dw0Eil6j7rK7lS/Qaq/Zzngv2h5A==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.2", + "write-file-atomic": "^2.3.0" + } + }, + "node_modules/eas-cli/node_modules/@expo/json-file/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eas-cli/node_modules/@expo/osascript": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.4.tgz", + "integrity": "sha512-LcPjxJ5FOFpqPORm+5MRLV0CuYWMthJYV6eerF+lQVXKlvgSn3EOqaHC3Vf3H+vmB0f6G4kdvvFtg40vG4bIhA==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "exec-async": "^2.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/eas-cli/node_modules/@expo/package-manager": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", + "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", + "license": "MIT", + "dependencies": { + "@expo/json-file": "^10.0.8", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "resolve-workspace-root": "^2.0.0" + } + }, + "node_modules/eas-cli/node_modules/@expo/package-manager/node_modules/@expo/json-file": { + "version": "10.0.13", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.13.tgz", + "integrity": "sha512-pX/XjQn7tgNw6zuuV2ikmegmwe/S7uiwhrs2wXrANMkq7ozrA+JcZwgW9Q/8WZgciBzfAhNp5hnackHcrmapQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" + } + }, + "node_modules/eas-cli/node_modules/@expo/package-manager/node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eas-cli/node_modules/@expo/package-manager/node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eas-cli/node_modules/@expo/package-manager/node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eas-cli/node_modules/@expo/package-manager/node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eas-cli/node_modules/@expo/package-manager/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eas-cli/node_modules/@expo/plist": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.2.0.tgz", + "integrity": "sha512-F/IZJQaf8OIVnVA6XWUeMPC3OH6MV00Wxf0WC0JhTQht2QgjyHUa3U5Gs3vRtDq8tXNsZneOQRDVwpaOnd4zTQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "~0.7.7", + "base64-js": "^1.2.3", + "xmlbuilder": "^14.0.0" + } + }, + "node_modules/eas-cli/node_modules/@expo/prebuild-config": { + "version": "8.0.17", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-8.0.17.tgz", + "integrity": "sha512-HM+XpDox3fAZuXZXvy55VRcBbsZSDijGf8jI8i/pexgWvtsnt1ouelPXRuE1pXDicMX+lZO83QV+XkyLmBEXYQ==", + "license": "MIT", + "dependencies": { + "@expo/config": "~10.0.4", + "@expo/config-plugins": "~9.0.0", + "@expo/config-types": "^52.0.0", + "@expo/image-utils": "^0.6.0", + "@expo/json-file": "^9.0.0", + "@react-native/normalize-colors": "0.76.2", + "debug": "^4.3.1", + "fs-extra": "^9.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "xml2js": "0.6.0" + } + }, + "node_modules/eas-cli/node_modules/@expo/prebuild-config/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eas-cli/node_modules/@expo/prebuild-config/node_modules/@expo/config": { + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-10.0.11.tgz", + "integrity": "sha512-nociJ4zr/NmbVfMNe9j/+zRlt7wz/siISu7PjdWE4WE+elEGxWWxsGzltdJG0llzrM+khx8qUiFK5aiVcdMBww==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~9.0.17", + "@expo/config-types": "^52.0.5", + "@expo/json-file": "^9.0.2", + "deepmerge": "^4.3.1", + "getenv": "^1.0.0", + "glob": "^10.4.2", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "resolve-workspace-root": "^2.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4", + "sucrase": "3.35.0" + } + }, + "node_modules/eas-cli/node_modules/@expo/prebuild-config/node_modules/@expo/config-plugins": { + "version": "9.0.17", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-9.0.17.tgz", + "integrity": "sha512-m24F1COquwOm7PBl5wRbkT9P9DviCXe0D7S7nQsolfbhdCWuvMkfXeoWmgjtdhy7sDlOyIgBrAdnB6MfsWKqIg==", + "license": "MIT", + "dependencies": { + "@expo/config-types": "^52.0.5", + "@expo/json-file": "~9.0.2", + "@expo/plist": "^0.2.2", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^1.0.0", + "glob": "^10.4.2", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/eas-cli/node_modules/@expo/prebuild-config/node_modules/@expo/config-plugins/node_modules/@expo/json-file": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-9.0.2.tgz", + "integrity": "sha512-yAznIUrybOIWp3Uax7yRflB0xsEpvIwIEqIjao9SGi2Gaa+N0OamWfe0fnXBSWF+2zzF4VvqwT4W5zwelchfgw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.3", + "write-file-atomic": "^2.3.0" + } + }, + "node_modules/eas-cli/node_modules/@expo/prebuild-config/node_modules/@expo/config-types": { + "version": "52.0.5", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-52.0.5.tgz", + "integrity": "sha512-AMDeuDLHXXqd8W+0zSjIt7f37vUd/BP8p43k68NHpyAvQO+z8mbQZm3cNQVAMySeayK2XoPigAFB1JF2NFajaA==", + "license": "MIT" + }, + "node_modules/eas-cli/node_modules/@expo/prebuild-config/node_modules/@expo/json-file": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-9.1.5.tgz", + "integrity": "sha512-prWBhLUlmcQtvN6Y7BpW2k9zXGd3ySa3R6rAguMJkp1z22nunLN64KYTUWfijFlprFoxm9r2VNnGkcbndAlgKA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.3" + } + }, + "node_modules/eas-cli/node_modules/@expo/prebuild-config/node_modules/@expo/plist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.2.2.tgz", + "integrity": "sha512-ZZGvTO6vEWq02UAPs3LIdja+HRO18+LRI5QuDl6Hs3Ps7KX7xU6Y6kjahWKY37Rx2YjNpX07dGpBFzzC+vKa2g==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "~0.7.7", + "base64-js": "^1.2.3", + "xmlbuilder": "^14.0.0" + } + }, + "node_modules/eas-cli/node_modules/@expo/prebuild-config/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eas-cli/node_modules/@expo/prebuild-config/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eas-cli/node_modules/@expo/prebuild-config/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eas-cli/node_modules/@expo/prebuild-config/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eas-cli/node_modules/@react-native/normalize-colors": { + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.2.tgz", + "integrity": "sha512-ICoOpaTLPsFQjNLSM00NgQr6wal300cZZonHVSDXKntX+BfkLeuCHRtr/Mn+klTtW+/1v2/2FRm9dXjvyGf9Dw==", + "license": "MIT" + }, + "node_modules/eas-cli/node_modules/@segment/ajv-human-errors": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@segment/ajv-human-errors/-/ajv-human-errors-2.16.0.tgz", + "integrity": "sha512-cHNfZcbHrmuYOA7/Sn7HlIDHanamiRTZtngfxcAuFaKQjP7cSqsVHjLz38FI2FQ8JDLz3syGLaz10Gn2ddo7+w==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.0.0" + } + }, + "node_modules/eas-cli/node_modules/@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "deprecated": "this version has critical issues, please update to the latest version", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/eas-cli/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/eas-cli/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eas-cli/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eas-cli/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eas-cli/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eas-cli/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/eas-cli/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/eas-cli/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/eas-cli/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eas-cli/node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/eas-cli/node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eas-cli/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eas-cli/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/eas-cli/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eas-cli/node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eas-cli/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/eas-cli/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eas-cli/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eas-cli/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/eas-cli/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eas-cli/node_modules/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eas-cli/node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/eas-cli/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/eas-cli/node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/eas-cli/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eas-cli/node_modules/ora": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz", + "integrity": "sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.4.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eas-cli/node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eas-cli/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eas-cli/node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/eas-cli/node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/eas-cli/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eas-cli/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eas-cli/node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/eas-cli/node_modules/sucrase/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eas-cli/node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eas-cli/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eas-cli/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, + "node_modules/eas-cli/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/eas-cli/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "node_modules/eas-cli/node_modules/xmlbuilder": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-14.0.0.tgz", + "integrity": "sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg==", "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "engines": { + "node": ">=8.0" + } + }, + "node_modules/eas-cli/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/eas-cli/node_modules/yaml": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": ">= 0.4" + "node": ">= 14" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.313", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", @@ -5433,6 +7986,54 @@ "iconv-lite": "^0.6.2" } }, + "node_modules/env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/env-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/env-string/-/env-string-1.0.1.tgz", + "integrity": "sha512-/DhCJDf5DSFK32joQiWRpWrT0h7p3hVQfMKxiBb7Nt8C8IF8BYyPtclDnuGGLOoj16d/8udKeiE7JbkotDmorQ==", + "license": "MIT" + }, + "node_modules/envinfo": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/error-stack-parser": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", @@ -6077,6 +8678,21 @@ "node": ">=6" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/exec-async": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", + "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", + "license": "MIT" + }, "node_modules/expo": { "version": "55.0.9", "resolved": "https://registry.npmjs.org/expo/-/expo-55.0.9.tgz", @@ -6859,6 +9475,12 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -6900,6 +9522,22 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -6966,6 +9604,36 @@ "integrity": "sha512-m6I8ALe4L4XpdETy7MJZWs6L1IVMbjs99bwbpIKphxX+0CTns4IKDWJY0LWfr4YsFjfg+z1TjzTMU8lKl8rG0w==", "license": "MIT" }, + "node_modules/fetch-retry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz", + "integrity": "sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==", + "license": "MIT" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -6979,6 +9647,36 @@ "node": ">=16.0.0" } }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -7119,6 +9817,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", @@ -7144,6 +9870,20 @@ "node": ">= 0.6" } }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -7422,6 +10162,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/golden-fleece": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/golden-fleece/-/golden-fleece-1.0.9.tgz", + "integrity": "sha512-YSwLaGMOgSBx9roJlNLL12c+FRiw7VECphinc6mGucphc/ZxTHgdEz6gmJqH6NOzYEd/yr64hwjom5pZ+tJVpg==" + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -7440,6 +10205,42 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/gradle-to-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gradle-to-js/-/gradle-to-js-2.0.1.tgz", + "integrity": "sha512-is3hDn9zb8XXnjbEeAEIqxTpLHUiGBqjegLmXPuyMBfKAggpadWFku4/AP8iYAGBX6qR9/5UIUIp47V0XI3aMw==", + "license": "Apache-2.0", + "dependencies": { + "lodash.merge": "^4.6.2" + }, + "bin": { + "gradle-to-js": "cli.js" + } + }, + "node_modules/graphql": { + "version": "16.8.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", + "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -7584,6 +10385,35 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, + "node_modules/http-call": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.3.0.tgz", + "integrity": "sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==", + "license": "ISC", + "dependencies": { + "content-type": "^1.0.4", + "debug": "^4.1.1", + "is-retry-allowed": "^1.1.0", + "is-stream": "^2.0.0", + "parse-json": "^4.0.0", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-call/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -7626,6 +10456,15 @@ "node": ">= 14" } }, + "node_modules/hyperlinker": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", + "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/hyphenate-style-name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", @@ -7704,6 +10543,15 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -7843,6 +10691,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" + }, "node_modules/is-bun-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", @@ -8010,6 +10864,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -8081,6 +10944,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -8170,6 +11042,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -8293,15 +11177,47 @@ "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" }, "engines": { - "node": ">= 0.4" + "node": ">=10" } }, "node_modules/jest-environment-node": { @@ -8492,6 +11408,36 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jks-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jks-js/-/jks-js-1.1.0.tgz", + "integrity": "sha512-irWi8S2V029Vic63w0/TYa8NIZwXu9oeMtHQsX51JDIVBo0lrEaOoyM8ALEEh5PVKD6TrA26FixQK6TzT7dHqA==", + "license": "MIT", + "dependencies": { + "node-forge": "^1.3.1", + "node-int64": "^0.4.0", + "node-rsa": "^1.1.1" + } + }, + "node_modules/joi": { + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", + "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/join-component": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz", + "integrity": "sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==", + "license": "MIT" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8516,6 +11462,15 @@ "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "license": "0BSD" }, + "node_modules/jsep": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -8535,6 +11490,12 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -8561,6 +11522,18 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -8577,6 +11550,12 @@ "node": ">=4.0" } }, + "node_modules/keychain": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/keychain/-/keychain-1.5.0.tgz", + "integrity": "sha512-liyp4r+93RI7EB2jhwaRd4MWfdgHH6shuldkaPMkELCJjMFvOOVXuTvw1pGqFfhsrgA6OqfykWWPQgBjQakVag==", + "license": "MIT" + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8936,17 +11915,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, "license": "MIT" }, "node_modules/lodash.throttle": { @@ -9059,6 +12050,12 @@ "yallist": "^3.0.2" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "license": "ISC" + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -9083,6 +12080,17 @@ "node": ">= 0.4" } }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", @@ -9444,7 +12452,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9459,6 +12467,101 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/minizlib/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/minizlib/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minizlib/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/minizlib/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minizlib/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minizlib/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -9471,18 +12574,100 @@ "node": ">=10" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "optional": true, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/multipasta": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/multipasta/-/multipasta-0.2.7.tgz", + "integrity": "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==", + "license": "MIT" + }, "node_modules/multitars": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/multitars/-/multitars-0.2.4.tgz", "integrity": "sha512-XgLbg1HHchFauMCQPRwMj6MSyDd5koPlTA1hM3rUFkeXzGpjU/I9fP3to7yrObE9jcN8ChIOQGrM0tV0kUZaKg==", "license": "MIT" }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "license": "ISC" + }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "optional": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -9494,6 +12679,13 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nan": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.26.2.tgz", + "integrity": "sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==", + "license": "MIT", + "optional": true + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -9552,6 +12744,25 @@ "dev": true, "license": "MIT" }, + "node_modules/natural-orderby": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", + "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "license": "MIT", + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -9621,6 +12832,28 @@ "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", "license": "MIT" }, + "node_modules/node-rsa": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.1.1.tgz", + "integrity": "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==", + "license": "MIT", + "dependencies": { + "asn1": "^0.2.4" + } + }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -9716,6 +12949,15 @@ "node": ">= 0.4" } }, + "node_modules/object-treeify": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", + "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/object.assign": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", @@ -10050,6 +13292,12 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10063,6 +13311,19 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/parse-png": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", @@ -10084,6 +13345,16 @@ "node": ">= 0.8" } }, + "node_modules/password-prompt": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz", + "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==", + "license": "0BSD", + "dependencies": { + "ansi-escapes": "^4.3.2", + "cross-spawn": "^7.0.3" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -10142,6 +13413,15 @@ "node": "20 || >=22" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -10154,28 +13434,92 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=8" } }, - "node_modules/pify": { + "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">= 6" + "node": ">=8" } }, "node_modules/plist": { @@ -10514,6 +13858,25 @@ "asap": "~2.0.6" } }, + "node_modules/promise-limit": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/promise-limit/-/promise-limit-2.7.0.tgz", + "integrity": "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==", + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -10554,12 +13917,19 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, "node_modules/query-string": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", @@ -11490,6 +14860,15 @@ "node": ">=8.10.0" } }, + "node_modules/redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", + "license": "MIT", + "dependencies": { + "esprima": "~4.0.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -11593,6 +14972,12 @@ "regjsparser": "bin/parser" } }, + "node_modules/remove-trailing-slash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz", + "integrity": "sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==", + "license": "MIT" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -11602,6 +14987,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -11660,6 +15054,15 @@ "node": ">=4" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -11770,6 +15173,13 @@ ], "license": "MIT" }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "license": "MIT", + "optional": true + }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -11977,6 +15387,15 @@ "node": ">= 0.4" } }, + "node_modules/set-interval-async": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/set-interval-async/-/set-interval-async-3.0.3.tgz", + "integrity": "sha512-o4DyBv6mko+A9cH3QKek4SAAT5UyJRkfdTi6JHii6ZCKUYFun8SwgBmQrOXd158JOwBQzA+BnO8BvT64xuCaSw==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/set-proto": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", @@ -12169,6 +15588,23 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/slugify": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.8.tgz", @@ -12308,6 +15744,17 @@ "node": ">= 0.10.0" } }, + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -12331,6 +15778,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", @@ -12441,6 +15903,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -12581,6 +16056,64 @@ "node": ">=14.0.0" } }, + "node_modules/tar": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -12656,6 +16189,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -12780,12 +16322,79 @@ "typescript": ">=4.8.4" } }, + "node_modules/ts-deepmerge": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-6.2.0.tgz", + "integrity": "sha512-2qxI/FZVDPbzh63GwWIZYE7daWKtwXZYuyc8YNq0iTmMUwn4mL0jRLsp6hfFlgbdRSR4x2ppe+E86FnvEpN7Nw==", + "license": "ISC", + "engines": { + "node": ">=14.13.1" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT" + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -12818,6 +16427,27 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/turndown": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.1.2.tgz", + "integrity": "sha512-ntI9R7fcUKjqBP6QU8rBK2Ehyt8LAzt3UBT9JR9tgo6GtuKvyUzpayWmeMKJw1DPdXzktvtIT8m2mVXz+bL/Qg==", + "license": "MIT", + "dependencies": { + "domino": "^2.1.6" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -12931,7 +16561,6 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -13032,6 +16661,27 @@ "node": ">=4" } }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -13076,6 +16726,15 @@ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -13110,7 +16769,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -13201,6 +16859,12 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "license": "MIT" + }, "node_modules/validate-npm-package-name": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", @@ -13571,6 +17235,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wonka": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.6.tgz", + "integrity": "sha512-MXH+6mDHAZ2GuMpgKS055FR6v0xVP3XwquxIMYXgiW+FejHQlMGlvVRZT4qMCxR+bEo/FCtIdKxwej9WV3YQag==", + "license": "MIT" + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -13581,6 +17263,12 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -13598,6 +17286,24 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -13739,6 +17445,15 @@ "node": ">=12" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index f245947..996505e 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@react-navigation/native": "^7.1.8", "axios": "^1.13.6", "babel-preset-expo": "^55.0.11", + "eas-cli": "^18.7.0", "expo": "^55.0.9", "expo-audio": "~55.0.13", "expo-av": "^16.0.8", From 3ad3ac70a1fec196da38b1c80f26f2d16828cda3 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Wed, 22 Apr 2026 07:35:48 -0300 Subject: [PATCH 38/54] SCRUM-198 chore: altera trigger de build Android para label no PR --- .github/workflows/eas-build-android.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/eas-build-android.yml b/.github/workflows/eas-build-android.yml index d9b6381..ece7567 100644 --- a/.github/workflows/eas-build-android.yml +++ b/.github/workflows/eas-build-android.yml @@ -4,11 +4,12 @@ on: push: branches: [main] pull_request: - branches: [main] + types: [labeled] jobs: build: runs-on: ubuntu-latest + if: github.event_name == 'push' || github.event.label.name == 'build-android' permissions: pull-requests: write steps: From f81ac6e15272d77b83cd2650eb98b428e3cad5b6 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Wed, 22 Apr 2026 07:36:56 -0300 Subject: [PATCH 39/54] SCRUM-198 chore: limita build preview para arm64-v8a reduzindo tempo de build --- eas.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/eas.json b/eas.json index 55a9add..b5b126e 100644 --- a/eas.json +++ b/eas.json @@ -10,7 +10,8 @@ "preview": { "distribution": "internal", "android": { - "buildType": "apk" + "buildType": "apk", + "gradleCommand": ":app:assembleRelease -PreactNativeArchitectures=arm64-v8a" }, "env": { "EXPO_PUBLIC_API_URL": "https://mandaca-backend-production.onrender.com" From fe57189d3a77ff009eace0a0cfe3a15713b0db17 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Wed, 22 Apr 2026 07:42:32 -0300 Subject: [PATCH 40/54] SCRUM-198 chore: adiciona --no-wait para postar comentario no PR imediatamente --- .github/workflows/eas-build-android.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/eas-build-android.yml b/.github/workflows/eas-build-android.yml index ece7567..24bed04 100644 --- a/.github/workflows/eas-build-android.yml +++ b/.github/workflows/eas-build-android.yml @@ -30,7 +30,7 @@ jobs: - name: Build Android APK id: eas-build run: | - OUTPUT=$(npx eas build --platform android --profile preview --non-interactive --json 2>/dev/null) + OUTPUT=$(npx eas build --platform android --profile preview --non-interactive --no-wait --json 2>/dev/null) BUILD_ID=$(echo "$OUTPUT" | jq -r '.[0].id') echo "build_id=$BUILD_ID" >> $GITHUB_OUTPUT From 082dd6f728cde533a1ab5337921dcc7d298a4423 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Wed, 22 Apr 2026 15:39:29 -0300 Subject: [PATCH 41/54] SCRUM-198 ci: cria workflow de release Android semanal via GitHub Releases --- .github/workflows/eas-release-android.yml | 77 +++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 .github/workflows/eas-release-android.yml diff --git a/.github/workflows/eas-release-android.yml b/.github/workflows/eas-release-android.yml new file mode 100644 index 0000000..b3d2ddb --- /dev/null +++ b/.github/workflows/eas-release-android.yml @@ -0,0 +1,77 @@ +name: EAS Release Android (Weekly) + +on: + schedule: + - cron: '0 9 * * 0' + workflow_dispatch: + +jobs: + release: + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + + - run: npm ci + + - uses: expo/expo-github-action@v8 + with: + eas-version: latest + token: ${{ secrets.EXPO_TOKEN }} + + - name: Build Android APK (aguarda conclusao) + id: eas-build + run: | + OUTPUT=$(npx eas build \ + --platform android \ + --profile preview \ + --non-interactive \ + --wait \ + --json 2>/dev/null) + echo "apk_url=$(echo "$OUTPUT" | jq -r '.[0].artifacts.applicationArchiveUrl')" \ + >> $GITHUB_OUTPUT + echo "build_id=$(echo "$OUTPUT" | jq -r '.[0].id')" \ + >> $GITHUB_OUTPUT + echo "app_version=$(echo "$OUTPUT" | jq -r '.[0].appVersion')" \ + >> $GITHUB_OUTPUT + + - name: Criar GitHub Release + env: + APK_URL: ${{ steps.eas-build.outputs.apk_url }} + BUILD_ID: ${{ steps.eas-build.outputs.build_id }} + APP_VERSION: ${{ steps.eas-build.outputs.app_version }} + GH_SHA: ${{ github.sha }} + uses: actions/github-script@v7 + with: + script: | + const date = new Date().toISOString().split('T')[0]; + const shortSha = process.env.GH_SHA.substring(0, 7); + const tagName = `android-preview-${date}-${shortSha}`; + + await github.rest.repos.createRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + tag_name: tagName, + name: `Android Preview ${date} (v${process.env.APP_VERSION})`, + body: [ + '## Android Preview Build', + '', + `- **Data:** ${date}`, + `- **Versao:** ${process.env.APP_VERSION}`, + `- **Commit:** \`${shortSha}\``, + `- **APK (arm64):** [Download direto](${process.env.APK_URL})`, + `- **[Ver build no Expo](https://expo.dev/accounts/notgreatdavi/projects/mandaca-frontend/builds/${process.env.BUILD_ID})**`, + '', + '> Build gerado automaticamente a partir da branch `main`.', + '> Instale apenas em dispositivos Android (arm64-v8a).', + ].join('\n'), + prerelease: true, + make_latest: 'false', + }); From 36e0546eddb32c126439fe75e1fdfe7c740035d5 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Wed, 22 Apr 2026 15:39:39 -0300 Subject: [PATCH 42/54] SCRUM-198 ci: remove trigger de push em main do workflow de PR build --- .github/workflows/eas-build-android.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/eas-build-android.yml b/.github/workflows/eas-build-android.yml index 24bed04..815490e 100644 --- a/.github/workflows/eas-build-android.yml +++ b/.github/workflows/eas-build-android.yml @@ -1,15 +1,13 @@ name: EAS Build Android on: - push: - branches: [main] pull_request: types: [labeled] jobs: build: runs-on: ubuntu-latest - if: github.event_name == 'push' || github.event.label.name == 'build-android' + if: github.event.label.name == 'build-android' permissions: pull-requests: write steps: From 90be1e6c2c5fcb93a62b9391e2ee617c0213df87 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Wed, 22 Apr 2026 17:12:50 -0300 Subject: [PATCH 43/54] SCRUM-198 fix: adiciona barra final na URL do endpoint de transcricao --- components/editStory/audioBox.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/editStory/audioBox.tsx b/components/editStory/audioBox.tsx index 51d2a77..7508875 100644 --- a/components/editStory/audioBox.tsx +++ b/components/editStory/audioBox.tsx @@ -86,7 +86,7 @@ export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) console.log('[AudioBox] URI gravada:', uri, '| MIME:', mimeType) const result = await FileSystem.uploadAsync( - `${API_URL}/transcriptions`, + `${API_URL}/transcriptions/`, uri, { httpMethod: 'POST', From b197ffc3fe3dbaec1ebccaba8ea62c3f087d91ce Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Wed, 22 Apr 2026 23:44:20 -0300 Subject: [PATCH 44/54] SCRUM-198 chore: adiciona arquivo VERSION com versao inicial 0.1.0 --- VERSION | 1 + 1 file changed, 1 insertion(+) create mode 100644 VERSION diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..6e8bf73 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.1.0 From 5077d00bfc76284f1f95b12e09c3525e9dfa1a0b Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Wed, 22 Apr 2026 23:44:20 -0300 Subject: [PATCH 45/54] SCRUM-198 ci: reescreve eas-release com semver, auto-bump e apk fixo --- .github/workflows/eas-release-android.yml | 114 ++++++++++++++-------- 1 file changed, 76 insertions(+), 38 deletions(-) diff --git a/.github/workflows/eas-release-android.yml b/.github/workflows/eas-release-android.yml index b3d2ddb..04ae606 100644 --- a/.github/workflows/eas-release-android.yml +++ b/.github/workflows/eas-release-android.yml @@ -2,7 +2,7 @@ name: EAS Release Android (Weekly) on: schedule: - - cron: '0 9 * * 0' + - cron: '0 8 * * 0' workflow_dispatch: jobs: @@ -12,21 +12,53 @@ jobs: contents: write steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GH_RELEASE_TOKEN }} + + - name: Configurar git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Auto-bump patch se necessario + id: version + run: | + git fetch --tags origin + CURRENT=$(cat VERSION) + if git tag --list | grep -q "^v${CURRENT}$"; then + MAJOR=$(echo "$CURRENT" | cut -d. -f1) + MINOR=$(echo "$CURRENT" | cut -d. -f2) + PATCH=$(echo "$CURRENT" | cut -d. -f3) + NEW_PATCH=$((PATCH + 1)) + NEW_VERSION="${MAJOR}.${MINOR}.${NEW_PATCH}" + echo "$NEW_VERSION" > VERSION + git add VERSION + git commit -m "SCRUM-197 chore: auto-bump version to ${NEW_VERSION}" + git push origin main + echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT + else + echo "version=$CURRENT" >> $GITHUB_OUTPUT + fi - - uses: actions/setup-node@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 with: node-version: 20 cache: npm - - run: npm ci + - name: Instalar dependencias + run: npm ci - - uses: expo/expo-github-action@v8 + - name: Setup EAS CLI + uses: expo/expo-github-action@v8 with: eas-version: latest token: ${{ secrets.EXPO_TOKEN }} - - name: Build Android APK (aguarda conclusao) + - name: Build Android APK id: eas-build run: | OUTPUT=$(npx eas build \ @@ -39,39 +71,45 @@ jobs: >> $GITHUB_OUTPUT echo "build_id=$(echo "$OUTPUT" | jq -r '.[0].id')" \ >> $GITHUB_OUTPUT - echo "app_version=$(echo "$OUTPUT" | jq -r '.[0].appVersion')" \ - >> $GITHUB_OUTPUT + + - name: Download APK do EAS + run: curl -L "${{ steps.eas-build.outputs.apk_url }}" -o mandaca-preview.apk + + - name: Criar tag git + env: + GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }} + run: | + VERSION="v${{ steps.version.outputs.version }}" + git tag "$VERSION" + git push origin "$VERSION" - name: Criar GitHub Release env: - APK_URL: ${{ steps.eas-build.outputs.apk_url }} + GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }} BUILD_ID: ${{ steps.eas-build.outputs.build_id }} - APP_VERSION: ${{ steps.eas-build.outputs.app_version }} - GH_SHA: ${{ github.sha }} - uses: actions/github-script@v7 - with: - script: | - const date = new Date().toISOString().split('T')[0]; - const shortSha = process.env.GH_SHA.substring(0, 7); - const tagName = `android-preview-${date}-${shortSha}`; - - await github.rest.repos.createRelease({ - owner: context.repo.owner, - repo: context.repo.repo, - tag_name: tagName, - name: `Android Preview ${date} (v${process.env.APP_VERSION})`, - body: [ - '## Android Preview Build', - '', - `- **Data:** ${date}`, - `- **Versao:** ${process.env.APP_VERSION}`, - `- **Commit:** \`${shortSha}\``, - `- **APK (arm64):** [Download direto](${process.env.APK_URL})`, - `- **[Ver build no Expo](https://expo.dev/accounts/notgreatdavi/projects/mandaca-frontend/builds/${process.env.BUILD_ID})**`, - '', - '> Build gerado automaticamente a partir da branch `main`.', - '> Instale apenas em dispositivos Android (arm64-v8a).', - ].join('\n'), - prerelease: true, - make_latest: 'false', - }); + run: | + VERSION="v${{ steps.version.outputs.version }}" + APK_URL="https://github.com/${{ github.repository }}/releases/latest/download/mandaca-preview.apk" + EXPO_URL="https://expo.dev/accounts/notgreatdavi/projects/mandaca-frontend/builds/${BUILD_ID}" + + gh release create "$VERSION" \ + --title "Release ${VERSION}" \ + --latest \ + mandaca-preview.apk \ + --notes "## Links + +**Frontend Web (Production):** https://mandaca-frontend-production.onrender.com +**APK Android (Download direto):** [mandaca-preview.apk](${APK_URL}) +**Build no Expo:** ${EXPO_URL} + +--- + +## Instalacao no Android + +1. Baixe o APK pelo link acima +2. No celular, abra o arquivo baixado (pode ser necessario habilitar *Instalar apps de fontes desconhecidas* nas configuracoes) +3. Siga o assistente de instalacao + +> Build preview gerado automaticamente a partir da branch \`main\`. +> Aponta para o backend de producao. +> Compativel com Android arm64-v8a." From c1542d9c7cd35a3eb9023c464060539030baf8f3 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Wed, 22 Apr 2026 23:58:47 -0300 Subject: [PATCH 46/54] SCRUM-198 ci: usa generate-notes e estrutura de release igual ao backend --- .github/workflows/eas-release-android.yml | 54 ++++++++++++++--------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/.github/workflows/eas-release-android.yml b/.github/workflows/eas-release-android.yml index 04ae606..c02d720 100644 --- a/.github/workflows/eas-release-android.yml +++ b/.github/workflows/eas-release-android.yml @@ -36,7 +36,7 @@ jobs: NEW_VERSION="${MAJOR}.${MINOR}.${NEW_PATCH}" echo "$NEW_VERSION" > VERSION git add VERSION - git commit -m "SCRUM-197 chore: auto-bump version to ${NEW_VERSION}" + git commit -m "SCRUM-198 chore: auto-bump version to ${NEW_VERSION}" git push origin main echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT else @@ -83,7 +83,7 @@ jobs: git tag "$VERSION" git push origin "$VERSION" - - name: Criar GitHub Release + - name: Gerar notas da release env: GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }} BUILD_ID: ${{ steps.eas-build.outputs.build_id }} @@ -91,25 +91,39 @@ jobs: VERSION="v${{ steps.version.outputs.version }}" APK_URL="https://github.com/${{ github.repository }}/releases/latest/download/mandaca-preview.apk" EXPO_URL="https://expo.dev/accounts/notgreatdavi/projects/mandaca-frontend/builds/${BUILD_ID}" + GENERATED=$(gh api repos/${{ github.repository }}/releases/generate-notes \ + --field tag_name="$VERSION" \ + --jq '.body') + + { + echo "## Links" + echo "" + echo "**Frontend Web (Production):** https://mandaca-frontend-production.onrender.com" + echo "**APK Android (Download direto):** [mandaca-preview.apk](${APK_URL})" + echo "**Build no Expo:** ${EXPO_URL}" + echo "" + echo "---" + echo "" + echo "$GENERATED" + echo "" + echo "---" + echo "" + echo "## Instalacao no Android" + echo "" + echo "1. Baixe o APK pelo link acima" + echo "2. No celular, abra o arquivo baixado (pode ser necessario habilitar *Instalar apps de fontes desconhecidas* nas configuracoes)" + echo "3. Siga o assistente de instalacao" + echo "" + echo "> Build preview gerado automaticamente a partir da branch \`main\`. Compativel com Android arm64-v8a." + } > /tmp/release-notes.md + - name: Criar GitHub Release + env: + GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }} + run: | + VERSION="v${{ steps.version.outputs.version }}" gh release create "$VERSION" \ --title "Release ${VERSION}" \ --latest \ - mandaca-preview.apk \ - --notes "## Links - -**Frontend Web (Production):** https://mandaca-frontend-production.onrender.com -**APK Android (Download direto):** [mandaca-preview.apk](${APK_URL}) -**Build no Expo:** ${EXPO_URL} - ---- - -## Instalacao no Android - -1. Baixe o APK pelo link acima -2. No celular, abra o arquivo baixado (pode ser necessario habilitar *Instalar apps de fontes desconhecidas* nas configuracoes) -3. Siga o assistente de instalacao - -> Build preview gerado automaticamente a partir da branch \`main\`. -> Aponta para o backend de producao. -> Compativel com Android arm64-v8a." + --notes-file /tmp/release-notes.md \ + mandaca-preview.apk From ff61c1a281b9de07d67770a51b0185068aec6159 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Thu, 23 Apr 2026 00:06:27 -0300 Subject: [PATCH 47/54] SCRUM-198 ci: separa release em dois jobs com no-wait e polling do apk --- .github/workflows/eas-release-android.yml | 71 ++++++++++++++++++----- 1 file changed, 56 insertions(+), 15 deletions(-) diff --git a/.github/workflows/eas-release-android.yml b/.github/workflows/eas-release-android.yml index c02d720..2a405b3 100644 --- a/.github/workflows/eas-release-android.yml +++ b/.github/workflows/eas-release-android.yml @@ -6,10 +6,14 @@ on: workflow_dispatch: jobs: - release: + create-release: + name: Criar Release runs-on: ubuntu-latest permissions: contents: write + outputs: + version: ${{ steps.version.outputs.version }} + build_id: ${{ steps.eas-build.outputs.build_id }} steps: - name: Checkout @@ -58,22 +62,16 @@ jobs: eas-version: latest token: ${{ secrets.EXPO_TOKEN }} - - name: Build Android APK + - name: Disparar build Android no EAS id: eas-build run: | OUTPUT=$(npx eas build \ --platform android \ --profile preview \ --non-interactive \ - --wait \ + --no-wait \ --json 2>/dev/null) - echo "apk_url=$(echo "$OUTPUT" | jq -r '.[0].artifacts.applicationArchiveUrl')" \ - >> $GITHUB_OUTPUT - echo "build_id=$(echo "$OUTPUT" | jq -r '.[0].id')" \ - >> $GITHUB_OUTPUT - - - name: Download APK do EAS - run: curl -L "${{ steps.eas-build.outputs.apk_url }}" -o mandaca-preview.apk + echo "build_id=$(echo "$OUTPUT" | jq -r '.[0].id')" >> $GITHUB_OUTPUT - name: Criar tag git env: @@ -99,8 +97,7 @@ jobs: echo "## Links" echo "" echo "**Frontend Web (Production):** https://mandaca-frontend-production.onrender.com" - echo "**APK Android (Download direto):** [mandaca-preview.apk](${APK_URL})" - echo "**Build no Expo:** ${EXPO_URL}" + echo "**APK Android:** [mandaca-preview.apk](${APK_URL}) — o build leva alguns minutos. Acompanhe em tempo real: [Ver build no Expo](${EXPO_URL})" echo "" echo "---" echo "" @@ -110,7 +107,7 @@ jobs: echo "" echo "## Instalacao no Android" echo "" - echo "1. Baixe o APK pelo link acima" + echo "1. Aguarde o build concluir no Expo (link acima) e entao baixe o APK" echo "2. No celular, abra o arquivo baixado (pode ser necessario habilitar *Instalar apps de fontes desconhecidas* nas configuracoes)" echo "3. Siga o assistente de instalacao" echo "" @@ -125,5 +122,49 @@ jobs: gh release create "$VERSION" \ --title "Release ${VERSION}" \ --latest \ - --notes-file /tmp/release-notes.md \ - mandaca-preview.apk + --notes-file /tmp/release-notes.md + + attach-apk: + name: Anexar APK ao Release + runs-on: ubuntu-latest + needs: create-release + permissions: + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + token: ${{ secrets.GH_RELEASE_TOKEN }} + + - name: Aguardar build e baixar APK + env: + EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }} + BUILD_ID: ${{ needs.create-release.outputs.build_id }} + run: | + echo "Aguardando conclusao do build ${BUILD_ID}..." + while true; do + RESPONSE=$(curl -s \ + -H "Authorization: Bearer ${EXPO_TOKEN}" \ + "https://api.expo.dev/v2/builds/${BUILD_ID}") + STATUS=$(echo "$RESPONSE" | jq -r '.data.status') + if [ "$STATUS" = "FINISHED" ]; then + APK_URL=$(echo "$RESPONSE" | jq -r '.data.artifacts.applicationArchiveUrl') + echo "Build concluido. Baixando APK..." + curl -L "$APK_URL" -o mandaca-preview.apk + break + elif [ "$STATUS" = "ERRORED" ] || [ "$STATUS" = "CANCELLED" ]; then + echo "Build falhou com status: ${STATUS}" + exit 1 + fi + echo "Status: ${STATUS}. Aguardando 30s..." + sleep 30 + done + + - name: Anexar APK ao release existente + env: + GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }} + VERSION: ${{ needs.create-release.outputs.version }} + run: | + gh release upload "v${VERSION}" mandaca-preview.apk --clobber + echo "APK anexado ao release v${VERSION}." From 9d3726c68bb9405e4b6139e357de9d337e055150 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Thu, 23 Apr 2026 00:09:07 -0300 Subject: [PATCH 48/54] SCRUM-198 ci: remove token desnecessario do checkout do job attach-apk --- .github/workflows/eas-release-android.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/eas-release-android.yml b/.github/workflows/eas-release-android.yml index 2a405b3..9aadcc4 100644 --- a/.github/workflows/eas-release-android.yml +++ b/.github/workflows/eas-release-android.yml @@ -134,8 +134,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - token: ${{ secrets.GH_RELEASE_TOKEN }} - name: Aguardar build e baixar APK env: From f186a03c6d1e7130876b3cdc85e777a21cd303d0 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Thu, 23 Apr 2026 00:17:46 -0300 Subject: [PATCH 49/54] SCRUM-198 ci: substitui polling via REST API pelo eas build:view no job attach-apk --- .github/workflows/eas-release-android.yml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/.github/workflows/eas-release-android.yml b/.github/workflows/eas-release-android.yml index 9aadcc4..6a8d787 100644 --- a/.github/workflows/eas-release-android.yml +++ b/.github/workflows/eas-release-android.yml @@ -135,19 +135,27 @@ jobs: - name: Checkout uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Setup EAS CLI + uses: expo/expo-github-action@v8 + with: + eas-version: latest + token: ${{ secrets.EXPO_TOKEN }} + - name: Aguardar build e baixar APK env: - EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }} BUILD_ID: ${{ needs.create-release.outputs.build_id }} run: | echo "Aguardando conclusao do build ${BUILD_ID}..." while true; do - RESPONSE=$(curl -s \ - -H "Authorization: Bearer ${EXPO_TOKEN}" \ - "https://api.expo.dev/v2/builds/${BUILD_ID}") - STATUS=$(echo "$RESPONSE" | jq -r '.data.status') + RESPONSE=$(eas build:view "$BUILD_ID" --json 2>/dev/null) + STATUS=$(echo "$RESPONSE" | jq -r '.status' 2>/dev/null || echo "UNKNOWN") if [ "$STATUS" = "FINISHED" ]; then - APK_URL=$(echo "$RESPONSE" | jq -r '.data.artifacts.applicationArchiveUrl') + APK_URL=$(echo "$RESPONSE" | jq -r '.artifacts.applicationArchiveUrl') echo "Build concluido. Baixando APK..." curl -L "$APK_URL" -o mandaca-preview.apk break From 601bb9713f5e10301228bcff8189814e893cc26c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 23 Apr 2026 03:18:41 +0000 Subject: [PATCH 50/54] SCRUM-198 chore: auto-bump version to 0.1.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6e8bf73..17e51c3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.0 +0.1.1 From f5e36ecd65ff8f0ebf07e3688fea2ddbeaf1f015 Mon Sep 17 00:00:00 2001 From: Davi Vieira <62678550+notsogreatdavi@users.noreply.github.com> Date: Thu, 23 Apr 2026 00:40:20 -0300 Subject: [PATCH 51/54] SCRUM-198 ci: usa graphql api do expo com logs e set +e no job attach-apk --- .github/workflows/eas-release-android.yml | 61 ++++++++++++++--------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/.github/workflows/eas-release-android.yml b/.github/workflows/eas-release-android.yml index 6a8d787..b198495 100644 --- a/.github/workflows/eas-release-android.yml +++ b/.github/workflows/eas-release-android.yml @@ -135,38 +135,51 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - - name: Setup EAS CLI - uses: expo/expo-github-action@v8 - with: - eas-version: latest - token: ${{ secrets.EXPO_TOKEN }} - - name: Aguardar build e baixar APK env: + EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }} BUILD_ID: ${{ needs.create-release.outputs.build_id }} run: | + set +e echo "Aguardando conclusao do build ${BUILD_ID}..." - while true; do - RESPONSE=$(eas build:view "$BUILD_ID" --json 2>/dev/null) - STATUS=$(echo "$RESPONSE" | jq -r '.status' 2>/dev/null || echo "UNKNOWN") - if [ "$STATUS" = "FINISHED" ]; then - APK_URL=$(echo "$RESPONSE" | jq -r '.artifacts.applicationArchiveUrl') - echo "Build concluido. Baixando APK..." - curl -L "$APK_URL" -o mandaca-preview.apk - break - elif [ "$STATUS" = "ERRORED" ] || [ "$STATUS" = "CANCELLED" ]; then - echo "Build falhou com status: ${STATUS}" - exit 1 + QUERY='{"query":"query($id:ID!){builds{byId(buildId:$id){id status artifacts{applicationArchiveUrl}}}}","variables":{"id":"'"${BUILD_ID}"'"}}' + + for attempt in $(seq 1 60); do + RESPONSE=$(curl -s -X POST \ + -H "Authorization: Bearer ${EXPO_TOKEN}" \ + -H "Content-Type: application/json" \ + -d "${QUERY}" \ + https://api.expo.dev/graphql) + STATUS=$(echo "${RESPONSE}" | jq -r '.data.builds.byId.status // empty' 2>/dev/null) + + if [ -z "${STATUS}" ]; then + echo "Tentativa ${attempt}: resposta inesperada. Preview: $(echo "${RESPONSE}" | head -c 300)" + sleep 30 + continue fi - echo "Status: ${STATUS}. Aguardando 30s..." - sleep 30 + + case "${STATUS}" in + FINISHED) + APK_URL=$(echo "${RESPONSE}" | jq -r '.data.builds.byId.artifacts.applicationArchiveUrl') + echo "Build concluido. Baixando APK de ${APK_URL}..." + curl -L -o mandaca-preview.apk "${APK_URL}" + ls -lh mandaca-preview.apk + exit 0 + ;; + ERRORED|CANCELED|CANCELLED) + echo "Build falhou com status: ${STATUS}" + exit 1 + ;; + *) + echo "Status: ${STATUS}. Aguardando 30s (tentativa ${attempt}/60)..." + sleep 30 + ;; + esac done + echo "Timeout apos 30 minutos aguardando o build" + exit 1 + - name: Anexar APK ao release existente env: GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }} From 2348d2dbaaf2a7c28708e5c82c93d35c67ea2807 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 23 Apr 2026 03:42:21 +0000 Subject: [PATCH 52/54] SCRUM-198 chore: auto-bump version to 0.1.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 17e51c3..d917d3e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.1 +0.1.2 From 477d70d8080bc03e571709746abd4475de79c2b0 Mon Sep 17 00:00:00 2001 From: Ronaldo Ribeiro Date: Fri, 24 Apr 2026 21:30:55 -0300 Subject: [PATCH 53/54] Scrum-205 fix: deteccao dos topicos da transcricao --- app/(mybusiness)/editStory.tsx | 21 +++++++++++--------- components/editStory/audioBox.tsx | 32 ++++++++++++++++++++---------- components/editStory/checklist.tsx | 24 +++++++++++++++++----- 3 files changed, 53 insertions(+), 24 deletions(-) diff --git a/app/(mybusiness)/editStory.tsx b/app/(mybusiness)/editStory.tsx index 9365181..afc7fda 100644 --- a/app/(mybusiness)/editStory.tsx +++ b/app/(mybusiness)/editStory.tsx @@ -17,9 +17,10 @@ export default function EditStory() { const [toggle, setToggle] = useState<'WRITE' | 'AUDIO'>('WRITE'); const [text, setText] = useState(''); const [audio, setAudio] = useState(''); - const [saving, setSaving] = useState(false); + const [detectedTopics, setDetectedTopics] = useState([]); + const [isSaving, setIsSaving] = useState(false); - const handlePress = async () => { + const handleSave = async () => { try { if (toggle === 'WRITE' && !text.trim()) { Alert.alert('Atenção', 'Digite uma história antes de continuar.'); @@ -31,7 +32,7 @@ export default function EditStory() { return; } - setSaving(true); + setIsSaving(true); await axios.put(`${API_URL}/enterprises/${ENTERPRISE_ID}`, { historia: toggle === 'WRITE' ? text.trim() : audio, @@ -39,6 +40,7 @@ export default function EditStory() { setText(''); setAudio(''); + setDetectedTopics([]); router.navigate('/(mybusiness)/manageImages'); @@ -46,7 +48,7 @@ export default function EditStory() { console.error(error); Alert.alert('Erro', 'Não foi possível salvar a história. Tente novamente.'); } finally { - setSaving(false); + setIsSaving(false); } }; @@ -56,7 +58,7 @@ export default function EditStory() {
- Conte história do seu restaurante. + Conte a história do seu restaurante. @@ -71,15 +73,16 @@ export default function EditStory() { setAudio={setAudio} setText={setText} setToggle={setToggle} + setDetectedTopics={setDetectedTopics} /> )} - + diff --git a/components/editStory/audioBox.tsx b/components/editStory/audioBox.tsx index 7508875..2bdd70a 100644 --- a/components/editStory/audioBox.tsx +++ b/components/editStory/audioBox.tsx @@ -21,15 +21,16 @@ type Props = { setAudio: (s: string) => void setText: (s: string) => void setToggle: (t: 'WRITE' | 'AUDIO') => void + setDetectedTopics?: (topics: string[]) => void } const USER_ID = '453df15b-61ce-4571-8bdb-cdbedf0ff041' -export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) { +export default function AudioBox({ audio, setAudio, setText, setToggle, setDetectedTopics }: Props) { const recorder = useAudioRecorder(RecordingPresets.HIGH_QUALITY) - const [loading, setLoading] = useState(false) + const [isLoading, setIsLoading] = useState(false) const scale = useSharedValue(1) @@ -62,7 +63,7 @@ export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) const stopRecording = async () => { try { - setLoading(true) + setIsLoading(true) await recorder.stop() @@ -104,16 +105,27 @@ export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) } const data = JSON.parse(result.body) - const texto = data?.historia || '' + const text = data?.historia || '' + + const detectedTopics: string[] = [] + if (data?.nome) detectedTopics.push('Nome do negócio') + if (data?.especialidade) detectedTopics.push('Sua especialidade (produtos/serviços)') + if (data?.endereco) detectedTopics.push('Localização / Bairro') + if (data?.historia) detectedTopics.push('Sua história ou o diferencial') + + setText(text) + setAudio(text) + + if (setDetectedTopics) { + setDetectedTopics(detectedTopics) + } - setText(texto) - setAudio(texto) setToggle('WRITE') } catch (error: any) { console.error('Erro ao enviar áudio:', error?.message) } finally { - setLoading(false) + setIsLoading(false) } } @@ -130,7 +142,7 @@ export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) - {loading ? ( + {isLoading ? ( Processando áudio... @@ -139,8 +151,8 @@ export default function AudioBox({ audio, setAudio, setText, setToggle }: Props) {recorder.isRecording ? 'Gravando... solte para enviar' : audio - ? 'Áudio convertido com sucesso ✅' - : 'Toque e segure para gravar'} + ? 'Áudio convertido com sucesso ✅' + : 'Toque e segure para gravar'} )} diff --git a/components/editStory/checklist.tsx b/components/editStory/checklist.tsx index d4719f1..d9d5c27 100644 --- a/components/editStory/checklist.tsx +++ b/components/editStory/checklist.tsx @@ -1,14 +1,28 @@ import { Text, View } from 'react-native'; import ChecklistButton from './checklistButton'; -export default function Checklist() { +type Props = { + detectedTopics?: string[]; +}; + +export default function Checklist({ detectedTopics = [] }: Props) { + const topics = [ + 'Nome do negócio', + 'Sua especialidade (produtos/serviços)', + 'Localização / Bairro', + 'Sua história ou o diferencial', + ]; + return ( Dicas para uma boa descrição - - - - + {topics.map((topic) => ( + + ))} ); } From 0a330f28ee7017e02fefea542275f72f2176b19d Mon Sep 17 00:00:00 2001 From: Ronaldo Ribeiro Date: Fri, 24 Apr 2026 21:36:48 -0300 Subject: [PATCH 54/54] scrum-205 fix: lint fix --- .github/workflows/eas-release-android.yml | 2 +- app/(help)/help.tsx | 10 +- app/(help)/helpDetail.tsx | 54 ++-- app/(mybusiness)/businessOverview.tsx | 95 +++--- app/(mybusiness)/editStory.tsx | 148 ++++----- app/(mybusiness)/manageImages.tsx | 20 +- app/(mybusiness)/myBusiness.tsx | 109 ++++--- app/(report)/negativePoints.tsx | 22 +- app/(report)/positivePoints.tsx | 22 +- app/(report)/recomendations.tsx | 18 +- app/(report)/report.tsx | 20 +- app/home.tsx | 2 +- app/index.tsx | 10 +- .../Home/completeProfile/completeProfile.tsx | 135 ++++---- components/Home/header/header.tsx | 140 ++++---- components/MyBusiness/overviewCard/main.tsx | 1 - components/editStory/audioBox.tsx | 301 +++++++++--------- components/editStory/checklist.tsx | 40 +-- components/editStory/checklistButton.tsx | 80 +++-- components/editStory/inputBox.tsx | 63 ++-- components/editStory/toggleWrite.tsx | 40 +-- components/editStory/toggleWriteButton.tsx | 68 ++-- components/general/generalButton.tsx | 50 ++- components/manageImages/fileUpload.tsx | 117 ++++--- components/manageImages/imageItem.tsx | 123 +++---- components/manageImages/imagesList.tsx | 92 +++--- components/overview/address.tsx | 12 +- components/overview/carousel.tsx | 20 +- components/overview/editButton.tsx | 2 +- components/report/CardItem.tsx | 109 ++++--- components/report/CardList.tsx | 92 +++--- components/report/cardItemSkeleton.tsx | 44 ++- components/report/cardListSkeleton.tsx | 20 +- components/report/chatButton.tsx | 33 +- constants/api.ts | 2 +- scripts/reset-project.js | 4 +- services/imagesEnterprise.ts | 52 +-- types/enterprise.ts | 12 +- types/imageEnterprise.ts | 8 +- types/user.ts | 14 +- 40 files changed, 1102 insertions(+), 1104 deletions(-) diff --git a/.github/workflows/eas-release-android.yml b/.github/workflows/eas-release-android.yml index b198495..afeeea0 100644 --- a/.github/workflows/eas-release-android.yml +++ b/.github/workflows/eas-release-android.yml @@ -2,7 +2,7 @@ name: EAS Release Android (Weekly) on: schedule: - - cron: '0 8 * * 0' + - cron: "0 8 * * 0" workflow_dispatch: jobs: diff --git a/app/(help)/help.tsx b/app/(help)/help.tsx index a49c5ea..fc8118f 100644 --- a/app/(help)/help.tsx +++ b/app/(help)/help.tsx @@ -15,7 +15,6 @@ import { } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; - type FAQItem = { id: number; title: string; @@ -33,7 +32,6 @@ const HelpScreen: React.FC = () => { { id: 4, title: 'Formas de pagamento', icon: 'credit-card' }, ]; - const handleSendEmail = async () => { const email = 'suporte@mandaca.com.br'; const subject = encodeURIComponent('Suporte - Central de Ajuda Mandacá'); @@ -53,7 +51,8 @@ const HelpScreen: React.FC = () => { // Handle phone call const handleCallSupport = async () => { - const phoneNumber = Platform.OS === 'ios' ? 'telprompt:08001234567' : 'tel:08001234567'; + const phoneNumber = + Platform.OS === 'ios' ? 'telprompt:08001234567' : 'tel:08001234567'; try { const canOpen = await Linking.canOpenURL(phoneNumber); @@ -79,7 +78,10 @@ const HelpScreen: React.FC = () => { /> - + {/* FAQ Section */} Perguntas Frequentes diff --git a/app/(help)/helpDetail.tsx b/app/(help)/helpDetail.tsx index ca96a03..bdd98ff 100644 --- a/app/(help)/helpDetail.tsx +++ b/app/(help)/helpDetail.tsx @@ -3,13 +3,7 @@ import Ionicons from '@expo/vector-icons/Ionicons'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; import { useRouter } from 'expo-router'; import React from 'react'; -import { - Platform, - ScrollView, - StyleSheet, - Text, - View, -} from 'react-native'; +import { Platform, ScrollView, StyleSheet, Text, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; /** @@ -23,16 +17,16 @@ const FaqDetailScreen: React.FC = () => { {/* Standard Header with standard back button logic */} -
router.back()} /> - {/* Visual Hierarchy: Icon and Centered Title */} @@ -46,20 +40,24 @@ const FaqDetailScreen: React.FC = () => { {/* Content Section: Focused on Readability (lineHeight: 26) */} - Para cadastrar seu negócio no Mandacá e começar a atrair turistas da região, - siga este guia passo a passo:{'\n\n'} - 1. Na sua tela inicial, navegue até a seção de ferramentas e clique no card{' '} - "Minha Empresa".{'\n\n'} - 2. Toque no botão de adição ou editar. Preencha todas as informações básicas: - nome do local, descrição detalhada e o tipo de serviço que você oferece - (ex: Gastronomia, Artesanato).{'\n\n'} - 3. Fotos são fundamentais! Adicione imagens - bem iluminadas da fachada e do interior para gerar confiança nos visitantes.{'\n\n'} - 4. Localização: Verifique se o ponto no mapa está correto para que o GPS leve - os turistas exatamente até a sua porta.{'\n\n'} - 5. Finalize clicando em "Salvar". - Nossa equipe analisará os dados em no máximo 24 horas para garantir - a qualidade da plataforma. + Para cadastrar seu negócio no Mandacá e começar a atrair turistas da + região, siga este guia passo a passo:{'\n\n'} + 1. Na sua tela inicial, navegue até a seção de ferramentas e clique + no card{' '} + "Minha Empresa". + {'\n\n'} + 2. Toque no botão de adição ou editar. Preencha todas as informações + básicas: nome do local, descrição detalhada e o tipo de serviço que + você oferece (ex: Gastronomia, Artesanato).{'\n\n'} + 3. Fotos são fundamentais!{' '} + Adicione imagens bem iluminadas da fachada e do interior para gerar + confiança nos visitantes.{'\n\n'} + 4. Localização: Verifique se o ponto no mapa está correto para que o + GPS leve os turistas exatamente até a sua porta.{'\n\n'} + 5. Finalize clicando em{' '} + "Salvar". Nossa + equipe analisará os dados em no máximo 24 horas para garantir a + qualidade da plataforma. @@ -70,8 +68,8 @@ const FaqDetailScreen: React.FC = () => { Dica de Especialista - Negócios com descrições ricas em detalhes e que respondem rápido - às avaliações tendem a aparecer no topo das buscas dos turistas! + Negócios com descrições ricas em detalhes e que respondem rápido às + avaliações tendem a aparecer no topo das buscas dos turistas! diff --git a/app/(mybusiness)/businessOverview.tsx b/app/(mybusiness)/businessOverview.tsx index 5c62828..785e589 100644 --- a/app/(mybusiness)/businessOverview.tsx +++ b/app/(mybusiness)/businessOverview.tsx @@ -13,54 +13,49 @@ import { API_URL } from '@/constants/api'; const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; export default function Overview() { - const [story, setStory] = useState(''); - const [address, setAddress] = useState(''); - const [loading, setLoading] = useState(false); - - const loadOverview = useCallback(async () => { - try { - setLoading(true); - - const response = await axios.get( - `${API_URL}/enterprises/overview`, - { - params: { enterprise_id: ENTERPRISE_ID }, - }, - ); - - setStory(response.data.historia ?? ''); - setAddress(response.data.endereco ?? ''); - - } catch (error) { - console.error('Erro ao buscar visão geral:', error); - Alert.alert('Erro', 'Não foi possível carregar os dados.'); - } finally { - setLoading(false); - } - }, []); - - useFocusEffect( - useCallback(() => { - loadOverview(); - }, [loadOverview]), - ); - - return ( - -
- - {loading ? ( - - - - ) : ( - <> - -
- - - )} - - - ); + const [story, setStory] = useState(''); + const [address, setAddress] = useState(''); + const [loading, setLoading] = useState(false); + + const loadOverview = useCallback(async () => { + try { + setLoading(true); + + const response = await axios.get(`${API_URL}/enterprises/overview`, { + params: { enterprise_id: ENTERPRISE_ID }, + }); + + setStory(response.data.historia ?? ''); + setAddress(response.data.endereco ?? ''); + } catch (error) { + console.error('Erro ao buscar visão geral:', error); + Alert.alert('Erro', 'Não foi possível carregar os dados.'); + } finally { + setLoading(false); + } + }, []); + + useFocusEffect( + useCallback(() => { + loadOverview(); + }, [loadOverview]), + ); + + return ( + +
+ + {loading ? ( + + + + ) : ( + <> + +
+ + + )} + + ); } diff --git a/app/(mybusiness)/editStory.tsx b/app/(mybusiness)/editStory.tsx index afc7fda..b756505 100644 --- a/app/(mybusiness)/editStory.tsx +++ b/app/(mybusiness)/editStory.tsx @@ -14,77 +14,77 @@ import { API_URL } from '@/constants/api'; const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; export default function EditStory() { - const [toggle, setToggle] = useState<'WRITE' | 'AUDIO'>('WRITE'); - const [text, setText] = useState(''); - const [audio, setAudio] = useState(''); - const [detectedTopics, setDetectedTopics] = useState([]); - const [isSaving, setIsSaving] = useState(false); - - const handleSave = async () => { - try { - if (toggle === 'WRITE' && !text.trim()) { - Alert.alert('Atenção', 'Digite uma história antes de continuar.'); - return; - } - - if (toggle === 'AUDIO' && !audio) { - Alert.alert('Atenção', 'Grave um áudio antes de continuar.'); - return; - } - - setIsSaving(true); - - await axios.put(`${API_URL}/enterprises/${ENTERPRISE_ID}`, { - historia: toggle === 'WRITE' ? text.trim() : audio, - }); - - setText(''); - setAudio(''); - setDetectedTopics([]); - - router.navigate('/(mybusiness)/manageImages'); - - } catch (error) { - console.error(error); - Alert.alert('Erro', 'Não foi possível salvar a história. Tente novamente.'); - } finally { - setIsSaving(false); - } - }; - - return ( - - -
- - - Conte a história do seu restaurante. - - - - - {toggle === 'WRITE' && ( - - )} - - {toggle === 'AUDIO' && ( - - )} - - - - - - - ); -} \ No newline at end of file + const [toggle, setToggle] = useState<'WRITE' | 'AUDIO'>('WRITE'); + const [text, setText] = useState(''); + const [audio, setAudio] = useState(''); + const [detectedTopics, setDetectedTopics] = useState([]); + const [isSaving, setIsSaving] = useState(false); + + const handleSave = async () => { + try { + if (toggle === 'WRITE' && !text.trim()) { + Alert.alert('Atenção', 'Digite uma história antes de continuar.'); + return; + } + + if (toggle === 'AUDIO' && !audio) { + Alert.alert('Atenção', 'Grave um áudio antes de continuar.'); + return; + } + + setIsSaving(true); + + await axios.put(`${API_URL}/enterprises/${ENTERPRISE_ID}`, { + historia: toggle === 'WRITE' ? text.trim() : audio, + }); + + setText(''); + setAudio(''); + setDetectedTopics([]); + + router.navigate('/(mybusiness)/manageImages'); + } catch (error) { + console.error(error); + Alert.alert( + 'Erro', + 'Não foi possível salvar a história. Tente novamente.', + ); + } finally { + setIsSaving(false); + } + }; + + return ( + + +
+ + + Conte a história do seu restaurante. + + + + + {toggle === 'WRITE' && } + + {toggle === 'AUDIO' && ( + + )} + + + + + + + ); +} diff --git a/app/(mybusiness)/manageImages.tsx b/app/(mybusiness)/manageImages.tsx index e305408..7759594 100644 --- a/app/(mybusiness)/manageImages.tsx +++ b/app/(mybusiness)/manageImages.tsx @@ -3,13 +3,13 @@ import { Header } from '@/components/general/header'; import ImagesList from '@/components/manageImages/imagesList'; import { View } from 'react-native'; -export default function ManageImages () { - return( - - -
- - - - ) -} \ No newline at end of file +export default function ManageImages() { + return ( + + +
+ + + + ); +} diff --git a/app/(mybusiness)/myBusiness.tsx b/app/(mybusiness)/myBusiness.tsx index cae21df..12d020d 100644 --- a/app/(mybusiness)/myBusiness.tsx +++ b/app/(mybusiness)/myBusiness.tsx @@ -1,60 +1,59 @@ -import { useFocusEffect } from '@react-navigation/native' -import { router } from 'expo-router' -import { useCallback, useState } from 'react' -import { View } from 'react-native' +import { useFocusEffect } from '@react-navigation/native'; +import { router } from 'expo-router'; +import { useCallback, useState } from 'react'; +import { View } from 'react-native'; -import { Container } from '@/components/general/container' -import { Header } from '@/components/general/header' -import { AccessGrid } from '@/components/MyBusiness/accessGrid/main' -import { OverviewCard } from '@/components/MyBusiness/overviewCard/main' +import { Container } from '@/components/general/container'; +import { Header } from '@/components/general/header'; +import { AccessGrid } from '@/components/MyBusiness/accessGrid/main'; +import { OverviewCard } from '@/components/MyBusiness/overviewCard/main'; -import { getImagesByEnterprise } from '@/services/imagesEnterprise' -import { ImageEnterprise } from '@/types/imageEnterprise' +import { getImagesByEnterprise } from '@/services/imagesEnterprise'; +import { ImageEnterprise } from '@/types/imageEnterprise'; -const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2' +const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; export default function MyBusiness() { - - const [image, setImage] = useState(undefined) - - const loadImages = useCallback(async () => { - try { - const data: ImageEnterprise[] = await getImagesByEnterprise(ENTERPRISE_ID) - - if (data.length > 0) { - setImage(data[0].url_foto_empresa) - } - - } catch (error) { - console.error('Erro ao carregar imagem:', error) - } - }, []) - - useFocusEffect( - useCallback(() => { - loadImages() - }, [loadImages]), - ) - - return ( - -
- - - router.navigate('/businessOverview')} - /> - - - - - ) -} \ No newline at end of file + const [image, setImage] = useState(undefined); + + const loadImages = useCallback(async () => { + try { + const data: ImageEnterprise[] = + await getImagesByEnterprise(ENTERPRISE_ID); + + if (data.length > 0) { + setImage(data[0].url_foto_empresa); + } + } catch (error) { + console.error('Erro ao carregar imagem:', error); + } + }, []); + + useFocusEffect( + useCallback(() => { + loadImages(); + }, [loadImages]), + ); + + return ( + +
+ + + router.navigate('/businessOverview')} + /> + + + + + ); +} diff --git a/app/(report)/negativePoints.tsx b/app/(report)/negativePoints.tsx index 91f9bca..eb1f651 100644 --- a/app/(report)/negativePoints.tsx +++ b/app/(report)/negativePoints.tsx @@ -2,12 +2,16 @@ import { Container } from '@/components/general/container'; import { Header } from '@/components/general/header'; import { View } from 'react-native'; -export default function NegativePoints () { - return( - - -
- - - ) -} \ No newline at end of file +export default function NegativePoints() { + return ( + + +
+ + + ); +} diff --git a/app/(report)/positivePoints.tsx b/app/(report)/positivePoints.tsx index 49f2e5c..fb283fd 100644 --- a/app/(report)/positivePoints.tsx +++ b/app/(report)/positivePoints.tsx @@ -2,12 +2,16 @@ import { Container } from '@/components/general/container'; import { Header } from '@/components/general/header'; import { View } from 'react-native'; -export default function PositivePoints () { - return( - - -
- - - ) -} \ No newline at end of file +export default function PositivePoints() { + return ( + + +
+ + + ); +} diff --git a/app/(report)/recomendations.tsx b/app/(report)/recomendations.tsx index 146b0b2..8e63e8a 100644 --- a/app/(report)/recomendations.tsx +++ b/app/(report)/recomendations.tsx @@ -2,12 +2,12 @@ import { Container } from '@/components/general/container'; import { Header } from '@/components/general/header'; import { View } from 'react-native'; -export default function Recomendations () { - return( - - -
- - - ) -} \ No newline at end of file +export default function Recomendations() { + return ( + + +
+ + + ); +} diff --git a/app/(report)/report.tsx b/app/(report)/report.tsx index 5112d90..da083cc 100644 --- a/app/(report)/report.tsx +++ b/app/(report)/report.tsx @@ -7,22 +7,18 @@ import { useState } from 'react'; import { View } from 'react-native'; export default function Report() { - const [loading, setLoading] = useState(false) + const [loading, setLoading] = useState(false); - const handlePress = ()=> { - setLoading //to do - } - - return ( + const handlePress = () => { + setLoading; //to do + }; + + return (
- - {loading ? ( - - ) : ( - - )} + + {loading ? : } ); diff --git a/app/home.tsx b/app/home.tsx index b143082..78c37fc 100644 --- a/app/home.tsx +++ b/app/home.tsx @@ -7,7 +7,7 @@ export default function Home() { return (
- + ); diff --git a/app/index.tsx b/app/index.tsx index a50b026..0bf95a1 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -7,18 +7,14 @@ export default function App() { return ( - - Hello Mandacá! - + Hello Mandacá! router.push('/home')} // ✅ usar push > - - ir para Home - + ir para Home ); -} \ No newline at end of file +} diff --git a/components/Home/completeProfile/completeProfile.tsx b/components/Home/completeProfile/completeProfile.tsx index 44d4a05..e3bdcb4 100644 --- a/components/Home/completeProfile/completeProfile.tsx +++ b/components/Home/completeProfile/completeProfile.tsx @@ -5,81 +5,84 @@ import { useEffect, useState } from 'react'; import { ActivityIndicator, StyleSheet, Text, View } from 'react-native'; export const CompleteProfile = () => { - const [enterprise, setEnterprise] = useState(null); - const [loading, setLoading] = useState(true); + const [enterprise, setEnterprise] = useState(null); + const [loading, setLoading] = useState(true); - const getEnterprise = async () => { - try { - const enterpriseId = - 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; + const getEnterprise = async () => { + try { + const enterpriseId = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; - const response = await axios.get( - `${API_URL}/enterprises/percentage/${enterpriseId}`, - ); + const response = await axios.get( + `${API_URL}/enterprises/percentage/${enterpriseId}`, + ); - if (response.data && typeof response.data.porcentagem === 'number') { - setEnterprise(response.data); - } else { - console.warn('Resposta inesperada:', response.data); - } + if (response.data && typeof response.data.porcentagem === 'number') { + setEnterprise(response.data); + } else { + console.warn('Resposta inesperada:', response.data); + } + } catch (error) { + console.error('Erro ao buscar empresa:', error); + } finally { + setLoading(false); + } + }; - } catch (error) { - console.error('Erro ao buscar empresa:', error); - } finally { - setLoading(false); - } - }; + useEffect(() => { + getEnterprise(); + }, []); - useEffect(() => { - getEnterprise(); - }, []); + if (loading) { + return ( + + + + ); + } - if (loading) { - return ( - - - - ); - } + const porcentagem = enterprise?.porcentagem ?? 0; - const porcentagem = enterprise?.porcentagem ?? 0; + return ( + + + Complete seu Perfil + {porcentagem}% + - return ( - - - Complete seu Perfil - {porcentagem}% - - - - Preencha as informações para atrair mais turistas - + + Preencha as informações para atrair mais turistas + - - - - - ); + + + + + ); }; const style = StyleSheet.create({ - card: { - padding: 24, - backgroundColor: '#FFF', - borderRadius: 24, - gap: 16, - }, - row: { flexDirection: 'row', justifyContent: 'space-between' }, - title: { fontWeight: 'bold', fontSize: 24 }, - percentageText: { fontWeight: 'bold', fontSize: 24, color: '#C34342' }, // Substitua pela cor do seu primary - subtitle: { fontSize: 18 }, - progressBg: { width: '100%', height: 8, backgroundColor: '#EEE', borderRadius: 99 }, - progressBar: { height: '100%', backgroundColor: '#C34342', borderRadius: 99 }, - cardShadow: { - shadowColor: '#000', - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.25, - shadowRadius: 3.8, - elevation: 5, - }, -}); \ No newline at end of file + card: { + padding: 24, + backgroundColor: '#FFF', + borderRadius: 24, + gap: 16, + }, + row: { flexDirection: 'row', justifyContent: 'space-between' }, + title: { fontWeight: 'bold', fontSize: 24 }, + percentageText: { fontWeight: 'bold', fontSize: 24, color: '#C34342' }, // Substitua pela cor do seu primary + subtitle: { fontSize: 18 }, + progressBg: { + width: '100%', + height: 8, + backgroundColor: '#EEE', + borderRadius: 99, + }, + progressBar: { height: '100%', backgroundColor: '#C34342', borderRadius: 99 }, + cardShadow: { + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.25, + shadowRadius: 3.8, + elevation: 5, + }, +}); diff --git a/components/Home/header/header.tsx b/components/Home/header/header.tsx index 41b112a..204c388 100644 --- a/components/Home/header/header.tsx +++ b/components/Home/header/header.tsx @@ -5,93 +5,85 @@ import axios from 'axios'; import { router } from 'expo-router'; import { useEffect, useState } from 'react'; import { - ActivityIndicator, - Image, - Pressable, - StyleSheet, - Text, - View, + ActivityIndicator, + Image, + Pressable, + StyleSheet, + Text, + View, } from 'react-native'; - - export const Header = () => { - const [user, setUser] = useState(null); - const [loading, setLoading] = useState(true); + const [user, setUser] = useState(null); + const [loading, setLoading] = useState(true); - const getUser = async () => { - try { - const userId = '453df15b-61ce-4571-8bdb-cdbedf0ff041'; + const getUser = async () => { + try { + const userId = '453df15b-61ce-4571-8bdb-cdbedf0ff041'; - const responseUser = await axios.get( - `${API_URL}/users/${userId}`, - ); + const responseUser = await axios.get(`${API_URL}/users/${userId}`); - setUser(responseUser.data); - } catch (error) { - console.error('Erro ao buscar usuário:', error); - } finally { - setLoading(false); - } - }; + setUser(responseUser.data); + } catch (error) { + console.error('Erro ao buscar usuário:', error); + } finally { + setLoading(false); + } + }; - useEffect(() => { - getUser(); - }, []); + useEffect(() => { + getUser(); + }, []); - if (loading) { - return ; - } + if (loading) { + return ; + } - const userName = user?.nome || 'Usuário'; - const userInitial = userName.charAt(0).toUpperCase(); + const userName = user?.nome || 'Usuário'; + const userInitial = userName.charAt(0).toUpperCase(); - return ( - - router.push('/profile')} - > - {user?.url_foto_usuario ? ( - - ) : ( - {userInitial} - )} - + return ( + + router.push('/profile')} + > + {user?.url_foto_usuario ? ( + + ) : ( + {userInitial} + )} + - - - Bem-vindo de volta, - - - {userName} - - + + Bem-vindo de volta, + {userName} + - router.push('/notifications')} - > - - - - ); + router.push('/notifications')} + > + + + + ); }; const style = StyleSheet.create({ - cardShadow: { - shadowColor: '#000', - shadowOffset: { - width: 0, - height: 2, - }, - shadowOpacity: 1, - shadowRadius: 3.8, - elevation: 5, + cardShadow: { + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 2, }, -}); \ No newline at end of file + shadowOpacity: 1, + shadowRadius: 3.8, + elevation: 5, + }, +}); diff --git a/components/MyBusiness/overviewCard/main.tsx b/components/MyBusiness/overviewCard/main.tsx index 1400e62..59e556c 100644 --- a/components/MyBusiness/overviewCard/main.tsx +++ b/components/MyBusiness/overviewCard/main.tsx @@ -7,7 +7,6 @@ type Props = { }; export const OverviewCard = ({ imageUrl, onPress }: Props) => { - return ( void - setText: (s: string) => void - setToggle: (t: 'WRITE' | 'AUDIO') => void - setDetectedTopics?: (topics: string[]) => void -} - -const USER_ID = '453df15b-61ce-4571-8bdb-cdbedf0ff041' - -export default function AudioBox({ audio, setAudio, setText, setToggle, setDetectedTopics }: Props) { - - const recorder = useAudioRecorder(RecordingPresets.HIGH_QUALITY) - - const [isLoading, setIsLoading] = useState(false) - - const scale = useSharedValue(1) - - const animatedStyle = useAnimatedStyle(() => ({ - transform: [{ scale: scale.value }], - })) - - const startRecording = async () => { - try { - const permission = await requestRecordingPermissionsAsync() - - if (!permission.granted) { - alert('Permissão de microfone necessária!') - return - } - - await recorder.prepareToRecordAsync() - recorder.record() - - scale.value = withRepeat( - withTiming(1.2, { duration: 600 }), - -1, - true, - ) - - } catch (error) { - console.error('Erro ao iniciar gravação:', error) - } + audio: string; + setAudio: (s: string) => void; + setText: (s: string) => void; + setToggle: (t: 'WRITE' | 'AUDIO') => void; + setDetectedTopics?: (topics: string[]) => void; +}; + +const USER_ID = '453df15b-61ce-4571-8bdb-cdbedf0ff041'; + +export default function AudioBox({ + audio, + setAudio, + setText, + setToggle, + setDetectedTopics, +}: Props) { + const recorder = useAudioRecorder(RecordingPresets.HIGH_QUALITY); + + const [isLoading, setIsLoading] = useState(false); + + const scale = useSharedValue(1); + + const animatedStyle = useAnimatedStyle(() => ({ + transform: [{ scale: scale.value }], + })); + + const startRecording = async () => { + try { + const permission = await requestRecordingPermissionsAsync(); + + if (!permission.granted) { + alert('Permissão de microfone necessária!'); + return; + } + + await recorder.prepareToRecordAsync(); + recorder.record(); + + scale.value = withRepeat(withTiming(1.2, { duration: 600 }), -1, true); + } catch (error) { + console.error('Erro ao iniciar gravação:', error); } - - const stopRecording = async () => { - try { - setIsLoading(true) - - await recorder.stop() - - const uri = recorder.uri - - scale.value = withTiming(1) - - if (!uri) return - - const extension = uri.split('.').pop()?.toLowerCase() ?? 'm4a' - const mimeTypeMap: Record = { - 'm4a': 'audio/mp4', - 'mp4': 'audio/mp4', - 'mp3': 'audio/mpeg', - '3gp': 'audio/3gpp', - 'aac': 'audio/aac', - 'wav': 'audio/wav', - } - const mimeType = mimeTypeMap[extension] ?? 'audio/mp4' - - console.log('[AudioBox] URI gravada:', uri, '| MIME:', mimeType) - - const result = await FileSystem.uploadAsync( - `${API_URL}/transcriptions/`, - uri, - { - httpMethod: 'POST', - uploadType: FileSystem.FileSystemUploadType.MULTIPART, - fieldName: 'audio', - mimeType, - parameters: { - usuario_id: USER_ID, - }, - }, - ) - - if (result.status < 200 || result.status >= 300) { - throw new Error(`HTTP ${result.status}: ${result.body}`) - } - - const data = JSON.parse(result.body) - const text = data?.historia || '' - - const detectedTopics: string[] = [] - if (data?.nome) detectedTopics.push('Nome do negócio') - if (data?.especialidade) detectedTopics.push('Sua especialidade (produtos/serviços)') - if (data?.endereco) detectedTopics.push('Localização / Bairro') - if (data?.historia) detectedTopics.push('Sua história ou o diferencial') - - setText(text) - setAudio(text) - - if (setDetectedTopics) { - setDetectedTopics(detectedTopics) - } - - setToggle('WRITE') - - } catch (error: any) { - console.error('Erro ao enviar áudio:', error?.message) - } finally { - setIsLoading(false) - } + }; + + const stopRecording = async () => { + try { + setIsLoading(true); + + await recorder.stop(); + + const uri = recorder.uri; + + scale.value = withTiming(1); + + if (!uri) return; + + const extension = uri.split('.').pop()?.toLowerCase() ?? 'm4a'; + const mimeTypeMap: Record = { + m4a: 'audio/mp4', + mp4: 'audio/mp4', + mp3: 'audio/mpeg', + '3gp': 'audio/3gpp', + aac: 'audio/aac', + wav: 'audio/wav', + }; + const mimeType = mimeTypeMap[extension] ?? 'audio/mp4'; + + console.log('[AudioBox] URI gravada:', uri, '| MIME:', mimeType); + + const result = await FileSystem.uploadAsync( + `${API_URL}/transcriptions/`, + uri, + { + httpMethod: 'POST', + uploadType: FileSystem.FileSystemUploadType.MULTIPART, + fieldName: 'audio', + mimeType, + parameters: { + usuario_id: USER_ID, + }, + }, + ); + + if (result.status < 200 || result.status >= 300) { + throw new Error(`HTTP ${result.status}: ${result.body}`); + } + + const data = JSON.parse(result.body); + const text = data?.historia || ''; + + const detectedTopics: string[] = []; + if (data?.nome) detectedTopics.push('Nome do negócio'); + if (data?.especialidade) + detectedTopics.push('Sua especialidade (produtos/serviços)'); + if (data?.endereco) detectedTopics.push('Localização / Bairro'); + if (data?.historia) detectedTopics.push('Sua história ou o diferencial'); + + setText(text); + setAudio(text); + + if (setDetectedTopics) { + setDetectedTopics(detectedTopics); + } + + setToggle('WRITE'); + } catch (error: any) { + console.error('Erro ao enviar áudio:', error?.message); + } finally { + setIsLoading(false); } - - return ( - - - - - - - - - {isLoading ? ( - - Processando áudio... - - ) : ( - - {recorder.isRecording - ? 'Gravando... solte para enviar' - : audio - ? 'Áudio convertido com sucesso ✅' - : 'Toque e segure para gravar'} - - )} - - ) + }; + + return ( + + + + + + + + {isLoading ? ( + Processando áudio... + ) : ( + + {recorder.isRecording + ? 'Gravando... solte para enviar' + : audio + ? 'Áudio convertido com sucesso ✅' + : 'Toque e segure para gravar'} + + )} + + ); } diff --git a/components/editStory/checklist.tsx b/components/editStory/checklist.tsx index d9d5c27..d305a27 100644 --- a/components/editStory/checklist.tsx +++ b/components/editStory/checklist.tsx @@ -2,27 +2,29 @@ import { Text, View } from 'react-native'; import ChecklistButton from './checklistButton'; type Props = { - detectedTopics?: string[]; + detectedTopics?: string[]; }; export default function Checklist({ detectedTopics = [] }: Props) { - const topics = [ - 'Nome do negócio', - 'Sua especialidade (produtos/serviços)', - 'Localização / Bairro', - 'Sua história ou o diferencial', - ]; + const topics = [ + 'Nome do negócio', + 'Sua especialidade (produtos/serviços)', + 'Localização / Bairro', + 'Sua história ou o diferencial', + ]; - return ( - - Dicas para uma boa descrição - {topics.map((topic) => ( - - ))} - - ); + return ( + + + Dicas para uma boa descrição + + {topics.map((topic) => ( + + ))} + + ); } diff --git a/components/editStory/checklistButton.tsx b/components/editStory/checklistButton.tsx index e125c04..ca900a2 100644 --- a/components/editStory/checklistButton.tsx +++ b/components/editStory/checklistButton.tsx @@ -1,51 +1,47 @@ -import { useEffect } from 'react' -import { Pressable, Text } from 'react-native' +import { useEffect } from 'react'; +import { Pressable, Text } from 'react-native'; import Animated, { - interpolateColor, - useAnimatedStyle, - useSharedValue, - withTiming, -} from 'react-native-reanimated' + interpolateColor, + useAnimatedStyle, + useSharedValue, + withTiming, +} from 'react-native-reanimated'; type Props = { - text: string - check: boolean -} + text: string; + check: boolean; +}; export default function ChecklistButton({ text, check }: Props) { + const progress = useSharedValue(check ? 1 : 0); - const progress = useSharedValue(check ? 1 : 0) - - useEffect(() => { - progress.value = withTiming(check ? 1 : 0, { duration: 250 }) - }, [check]) + useEffect(() => { + progress.value = withTiming(check ? 1 : 0, { duration: 250 }); + }, [check]); - const animatedStyle = useAnimatedStyle(() => { - return { - backgroundColor: interpolateColor( - progress.value, - [0, 1], - ['transparent', '#C34342'], // verde - ), - borderColor: interpolateColor( - progress.value, - [0, 1], - ['#000', '#C34342'], - ), - } - }) + const animatedStyle = useAnimatedStyle(() => { + return { + backgroundColor: interpolateColor( + progress.value, + [0, 1], + ['transparent', '#C34342'], // verde + ), + borderColor: interpolateColor( + progress.value, + [0, 1], + ['#000', '#C34342'], + ), + }; + }); - return ( - - - + return ( + + - - {text} - - - ) -} \ No newline at end of file + {text} + + ); +} diff --git a/components/editStory/inputBox.tsx b/components/editStory/inputBox.tsx index c16edce..7aa3668 100644 --- a/components/editStory/inputBox.tsx +++ b/components/editStory/inputBox.tsx @@ -1,41 +1,40 @@ -import { useState } from 'react' -import { Text, TextInput, View } from 'react-native' +import { useState } from 'react'; +import { Text, TextInput, View } from 'react-native'; -const MAX_LENGTH = 500 +const MAX_LENGTH = 500; type Props = { - text: string, - setText: (s: string) => void -} + text: string; + setText: (s: string) => void; +}; export default function InputBox({ text, setText }: Props) { + const [isFocused, setIsFocused] = useState(false); - const [isFocused, setIsFocused] = useState(false) - - return ( - - + - setIsFocused(true)} - onBlur={() => setIsFocused(false)} - className="text-base text-black" - /> - - - {text.length}/{MAX_LENGTH} - - - ) -} \ No newline at end of file + > + setIsFocused(true)} + onBlur={() => setIsFocused(false)} + className="text-base text-black" + /> + + + {text.length}/{MAX_LENGTH} + + + ); +} diff --git a/components/editStory/toggleWrite.tsx b/components/editStory/toggleWrite.tsx index f5ef1f1..7a01ddf 100644 --- a/components/editStory/toggleWrite.tsx +++ b/components/editStory/toggleWrite.tsx @@ -2,24 +2,24 @@ import { View } from 'react-native'; import ToggleWriteButton from './toggleWriteButton'; type Props = { - toggle: 'WRITE' | 'AUDIO' - setToggle: (s: 'WRITE' | 'AUDIO')=> void + toggle: 'WRITE' | 'AUDIO'; + setToggle: (s: 'WRITE' | 'AUDIO') => void; +}; +export default function ToggleWrite({ toggle, setToggle }: Props) { + return ( + + setToggle('WRITE')} + /> + setToggle('AUDIO')} + /> + + ); } -export default function ToggleWrite ({toggle, setToggle}: Props) { - return( - - setToggle('WRITE')} - /> - setToggle('AUDIO')} - /> - - ) -} \ No newline at end of file diff --git a/components/editStory/toggleWriteButton.tsx b/components/editStory/toggleWriteButton.tsx index 919abf8..31f3ad5 100644 --- a/components/editStory/toggleWriteButton.tsx +++ b/components/editStory/toggleWriteButton.tsx @@ -1,42 +1,42 @@ -import { Pressable, Text } from 'react-native' +import { Pressable, Text } from 'react-native'; import Animated, { - useAnimatedStyle, - withTiming, -} from 'react-native-reanimated' + useAnimatedStyle, + withTiming, +} from 'react-native-reanimated'; type Props = { - text: string - tag: 'WRITE' | 'AUDIO' - toggle: 'WRITE' | 'AUDIO' - handlePress: (s: 'WRITE' | 'AUDIO') => void -} + text: string; + tag: 'WRITE' | 'AUDIO'; + toggle: 'WRITE' | 'AUDIO'; + handlePress: (s: 'WRITE' | 'AUDIO') => void; +}; export default function ToggleWriteButton({ - text, - handlePress, - toggle, - tag, + text, + handlePress, + toggle, + tag, }: Props) { + const animatedStyle = useAnimatedStyle(() => { + const isActive = toggle === tag; - const animatedStyle = useAnimatedStyle(() => { - const isActive = toggle === tag - - return { - backgroundColor: withTiming( - isActive ? '#ffffff' : 'transparent', - { duration: 300 }, - ), - } - }) + return { + backgroundColor: withTiming(isActive ? '#ffffff' : 'transparent', { + duration: 300, + }), + }; + }); - return ( - - handlePress(tag)} - > - {text} - - - ) -} \ No newline at end of file + return ( + + handlePress(tag)} + > + {text} + + + ); +} diff --git a/components/general/generalButton.tsx b/components/general/generalButton.tsx index 1f5ce6c..af15600 100644 --- a/components/general/generalButton.tsx +++ b/components/general/generalButton.tsx @@ -1,33 +1,31 @@ import { ActivityIndicator, Pressable, Text } from 'react-native'; type Props = { - text: string; - handlePress: () => void; - disabled?: boolean; - loading?: boolean; + text: string; + handlePress: () => void; + disabled?: boolean; + loading?: boolean; }; export default function GeneralButton({ - text, - handlePress, - disabled = false, - loading = false, + text, + handlePress, + disabled = false, + loading = false, }: Props) { - return ( - - {loading ? ( - - ) : ( - - {text} - - )} - - ); -} \ No newline at end of file + return ( + + {loading ? ( + + ) : ( + {text} + )} + + ); +} diff --git a/components/manageImages/fileUpload.tsx b/components/manageImages/fileUpload.tsx index c59ceae..82c4c5d 100644 --- a/components/manageImages/fileUpload.tsx +++ b/components/manageImages/fileUpload.tsx @@ -6,83 +6,76 @@ import { Pressable, Text, View } from 'react-native'; import { uploadImage } from '@/services/imagesEnterprise'; type Props = { - onUploadSuccess?: () => void; + onUploadSuccess?: () => void; }; type Status = 'idle' | 'loading' | 'success'; export default function FileUpload({ onUploadSuccess }: Props) { - const [status, setStatus] = useState('idle'); + const [status, setStatus] = useState('idle'); - const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; + const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; - const pickImage = async () => { - const permission = await ImagePicker.requestMediaLibraryPermissionsAsync(); + const pickImage = async () => { + const permission = await ImagePicker.requestMediaLibraryPermissionsAsync(); - if (!permission.granted) { - alert('Permissão para acessar a galeria é necessária!'); - return; - } + if (!permission.granted) { + alert('Permissão para acessar a galeria é necessária!'); + return; + } - const result = await ImagePicker.launchImageLibraryAsync({ - mediaTypes: ['images'], - quality: 1, - }); + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ['images'], + quality: 1, + }); - if (!result.canceled) { - const uri = result.assets[0].uri; + if (!result.canceled) { + const uri = result.assets[0].uri; - setStatus('loading'); + setStatus('loading'); - try { - await uploadImage(uri, ENTERPRISE_ID); + try { + await uploadImage(uri, ENTERPRISE_ID); - setStatus('success'); + setStatus('success'); - onUploadSuccess?.(); + onUploadSuccess?.(); - setTimeout(() => { - setStatus('idle'); - }, 3000); + setTimeout(() => { + setStatus('idle'); + }, 3000); + } catch (error) { + console.error('Erro ao fazer upload:', error); + setStatus('idle'); + } + } + }; - } catch (error) { - console.error('Erro ao fazer upload:', error); - setStatus('idle'); - } - } - }; + return ( + + Adicionar Imagem - return ( - - - Adicionar Imagem - + + {status === 'loading' && Enviando...} - - - {status === 'loading' && ( - Enviando... - )} - - {status === 'success' && ( - <> - - - Imagem Adicionada - - - )} - - {status === 'idle' && ( - <> - - - Adicionar Imagem - - - )} - - - - ); -} \ No newline at end of file + {status === 'success' && ( + <> + + + Imagem Adicionada + + + )} + + {status === 'idle' && ( + <> + + + Adicionar Imagem + + + )} + + + ); +} diff --git a/components/manageImages/imageItem.tsx b/components/manageImages/imageItem.tsx index c6c825d..9ffa562 100644 --- a/components/manageImages/imageItem.tsx +++ b/components/manageImages/imageItem.tsx @@ -1,74 +1,79 @@ import * as ImagePicker from 'expo-image-picker'; -import { ActivityIndicator, Alert, Image, Pressable, Text, View } from 'react-native'; +import { + ActivityIndicator, + Alert, + Image, + Pressable, + Text, + View, +} from 'react-native'; type Props = { - id: string; - uri: string; - onDelete: () => void; - onReplace: (newUri: string) => void; - isLoading?: boolean; + id: string; + uri: string; + onDelete: () => void; + onReplace: (newUri: string) => void; + isLoading?: boolean; }; export default function ImageItem({ - uri, - onDelete, - onReplace, - isLoading = false, + uri, + onDelete, + onReplace, + isLoading = false, }: Props) { + async function handlePickImage() { + const permission = await ImagePicker.requestMediaLibraryPermissionsAsync(); - async function handlePickImage() { - const permission = await ImagePicker.requestMediaLibraryPermissionsAsync(); - - if (!permission.granted) { - Alert.alert('Permissão necessária', 'Você precisa permitir acesso à galeria.'); - return; - } + if (!permission.granted) { + Alert.alert( + 'Permissão necessária', + 'Você precisa permitir acesso à galeria.', + ); + return; + } - const result = await ImagePicker.launchImageLibraryAsync({ - mediaTypes: ['images'], - quality: 1, - }); + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ['images'], + quality: 1, + }); - if (!result.canceled) { - const newUri = result.assets[0].uri; + if (!result.canceled) { + const newUri = result.assets[0].uri; - onReplace(newUri); - } + onReplace(newUri); } + } - return ( - - + return ( + + - - - {isLoading ? ( - - ) : ( - - Substituir - - )} - + + + {isLoading ? ( + + ) : ( + Substituir + )} + - - - Deletar - - - - - ); -} \ No newline at end of file + + Deletar + + + + ); +} diff --git a/components/manageImages/imagesList.tsx b/components/manageImages/imagesList.tsx index 9f7ae13..5857472 100644 --- a/components/manageImages/imagesList.tsx +++ b/components/manageImages/imagesList.tsx @@ -3,64 +3,66 @@ import { Text, View } from 'react-native'; import FileUpload from './fileUpload'; import ImageItem from './imageItem'; -import { deleteImage, getImagesByEnterprise } from '@/services/imagesEnterprise'; +import { + deleteImage, + getImagesByEnterprise, +} from '@/services/imagesEnterprise'; import { ImageEnterprise } from '@/types/imageEnterprise'; type ImageType = { - id: string; - uri: string; + id: string; + uri: string; }; export default function ImagesList() { - const [images, setImages] = useState([]); + const [images, setImages] = useState([]); - const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; + const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; - const loadImages = async () => { - try { - const data: ImageEnterprise[] = await getImagesByEnterprise(ENTERPRISE_ID); + const loadImages = async () => { + try { + const data: ImageEnterprise[] = + await getImagesByEnterprise(ENTERPRISE_ID); - const formattedImages: ImageType[] = data.map((item) => ({ - id: item.id_foto, - uri: item.url_foto_empresa, - })); + const formattedImages: ImageType[] = data.map((item) => ({ + id: item.id_foto, + uri: item.url_foto_empresa, + })); - setImages(formattedImages); - } catch (error) { - console.error(error); - } - }; + setImages(formattedImages); + } catch (error) { + console.error(error); + } + }; - useEffect(() => { - loadImages(); - }, []); + useEffect(() => { + loadImages(); + }, []); - async function handleDelete(id: string) { - try { - await deleteImage(id); - loadImages(); - } catch (error) { - console.error('Erro ao deletar imagem:', error); - } + async function handleDelete(id: string) { + try { + await deleteImage(id); + loadImages(); + } catch (error) { + console.error('Erro ao deletar imagem:', error); } + } - return ( - - + return ( + + - - Imagens cadastradas - + Imagens cadastradas - {images.map((img) => ( - handleDelete(img.id)} - onReplace={() => {}} - /> - ))} - - ); -} \ No newline at end of file + {images.map((img) => ( + handleDelete(img.id)} + onReplace={() => {}} + /> + ))} + + ); +} diff --git a/components/overview/address.tsx b/components/overview/address.tsx index 9f8e7ae..dcd98b6 100644 --- a/components/overview/address.tsx +++ b/components/overview/address.tsx @@ -1,12 +1,18 @@ import Ionicons from '@expo/vector-icons/Ionicons'; -import { Alert, Linking, Pressable, StyleSheet, Text, View } from 'react-native'; +import { + Alert, + Linking, + Pressable, + StyleSheet, + Text, + View, +} from 'react-native'; type Props = { address: string; }; export default function Address({ address }: Props) { - const handleMapsbutton = async () => { if (!address) { Alert.alert('Erro', 'Endereço não disponível.'); @@ -49,4 +55,4 @@ const style = StyleSheet.create({ shadowRadius: 3.8, elevation: 2, }, -}); \ No newline at end of file +}); diff --git a/components/overview/carousel.tsx b/components/overview/carousel.tsx index b172127..6860a3a 100644 --- a/components/overview/carousel.tsx +++ b/components/overview/carousel.tsx @@ -51,7 +51,10 @@ const PaginationDot = ({ active }: PaginationDotProps) => { }); return ( - + ); }; @@ -61,7 +64,9 @@ export default function Carousel() { const [activeIndex, setActiveIndex] = useState(0); const [images, setImages] = useState([]); - const [loadingImages, setLoadingImages] = useState>({}); + const [loadingImages, setLoadingImages] = useState>( + {}, + ); const ENTERPRISE_ID = 'caa68f64-b68e-4327-90f0-264ca1bb73e2'; @@ -70,7 +75,7 @@ export default function Carousel() { const data = await getImagesByEnterprise(ENTERPRISE_ID); const initialLoadingState: Record = {}; - data.forEach(item => { + data.forEach((item) => { initialLoadingState[item.id_foto] = true; }); @@ -97,7 +102,7 @@ export default function Carousel() { }; const handleImageLoad = (id: string) => { - setLoadingImages(prev => ({ + setLoadingImages((prev) => ({ ...prev, [id]: false, })); @@ -137,12 +142,9 @@ export default function Carousel() { {images.map((_, index) => ( - + ))} ); -} \ No newline at end of file +} diff --git a/components/overview/editButton.tsx b/components/overview/editButton.tsx index bcec225..9a3c4cd 100644 --- a/components/overview/editButton.tsx +++ b/components/overview/editButton.tsx @@ -6,7 +6,7 @@ export default function EditButton() { return ( router.navigate('/(mybusiness)/editStory')} + onPress={() => router.navigate('/(mybusiness)/editStory')} className="flex-row justify-between items-center" > diff --git a/components/report/CardItem.tsx b/components/report/CardItem.tsx index 13906bc..be948ae 100644 --- a/components/report/CardItem.tsx +++ b/components/report/CardItem.tsx @@ -1,57 +1,64 @@ -import Ionicons from '@expo/vector-icons/Ionicons' -import { Pressable, Text, View } from 'react-native' +import Ionicons from '@expo/vector-icons/Ionicons'; +import { Pressable, Text, View } from 'react-native'; type topic = { - id: number, - text: string -} + id: number; + text: string; +}; type Props = { - icon: any, - typeCard: 'positive' | 'negative' | 'recomendation', - topics: topic[] - handlePress: ()=> void -} + icon: any; + typeCard: 'positive' | 'negative' | 'recomendation'; + topics: topic[]; + handlePress: () => void; +}; -export const CardItem = ({icon, typeCard, topics, handlePress}: Props)=> { - return( - { + return ( + + + + {typeCard === 'positive' && ( + <> + + Pontos positivos + + + + )} + {typeCard === 'negative' && ( + <> + + Pontos negativos + + + + )} + {typeCard === 'recomendation' && ( + <> + + Recomendações + + + + )} + + + {topics.map((item) => ( + - - - {typeCard === 'positive' && - <> - Pontos positivos - - - } - {typeCard === 'negative' && - <> - Pontos negativos - - - } - {typeCard === 'recomendation' && - <> - Recomendações - - - } - - - {topics.map(item=> ( - - - {item.text} - - ))} - - Ver Sugestões - - + + {item.text} - ) -} \ No newline at end of file + ))} + + Ver Sugestões + + + + ); +}; diff --git a/components/report/CardList.tsx b/components/report/CardList.tsx index 7a2db84..e6d7a59 100644 --- a/components/report/CardList.tsx +++ b/components/report/CardList.tsx @@ -1,45 +1,49 @@ -import { router } from 'expo-router' -import { View } from 'react-native' -import { CardItem } from './CardItem' +import { router } from 'expo-router'; +import { View } from 'react-native'; +import { CardItem } from './CardItem'; -export const CardList = ()=> { - const handlePresPositive = ()=> { - router.navigate('/(report)/positivePoints') - } - const handlePresNegative = ()=> { - router.navigate('/(report)/negativePoints') - } - const handlePresRecomendation = ()=> { - router.navigate('/(report)/recomendations') - } - return( - - - - - - ) -} \ No newline at end of file +export const CardList = () => { + const handlePresPositive = () => { + router.navigate('/(report)/positivePoints'); + }; + const handlePresNegative = () => { + router.navigate('/(report)/negativePoints'); + }; + const handlePresRecomendation = () => { + router.navigate('/(report)/recomendations'); + }; + return ( + + + + + + ); +}; diff --git a/components/report/cardItemSkeleton.tsx b/components/report/cardItemSkeleton.tsx index c174b1b..7422d8c 100644 --- a/components/report/cardItemSkeleton.tsx +++ b/components/report/cardItemSkeleton.tsx @@ -1,27 +1,25 @@ -import { View } from 'react-native' +import { View } from 'react-native'; export const CardItemSkeleton = () => { - return ( - - - {/* Header */} - - - - - - - {/* Topics */} - {[1,2,3].map((_, index) => ( - - - - - ))} - - {/* Button */} - + return ( + + {/* Header */} + + + + + + {/* Topics */} + {[1, 2, 3].map((_, index) => ( + + + - ) -} \ No newline at end of file + ))} + + {/* Button */} + + + ); +}; diff --git a/components/report/cardListSkeleton.tsx b/components/report/cardListSkeleton.tsx index 5377f78..d5d6edf 100644 --- a/components/report/cardListSkeleton.tsx +++ b/components/report/cardListSkeleton.tsx @@ -1,12 +1,12 @@ -import { View } from 'react-native' -import { CardItemSkeleton } from './cardItemSkeleton' +import { View } from 'react-native'; +import { CardItemSkeleton } from './cardItemSkeleton'; export const CardListSkeleton = () => { - return ( - - - - - - ) -} \ No newline at end of file + return ( + + + + + + ); +}; diff --git a/components/report/chatButton.tsx b/components/report/chatButton.tsx index 14c29c3..aa26236 100644 --- a/components/report/chatButton.tsx +++ b/components/report/chatButton.tsx @@ -1,20 +1,19 @@ -import Ionicons from '@expo/vector-icons/Ionicons' -import { Pressable, Text } from 'react-native' +import Ionicons from '@expo/vector-icons/Ionicons'; +import { Pressable, Text } from 'react-native'; type Props = { - text: string - handlePress: ()=> void -} + text: string; + handlePress: () => void; +}; -export const ChatButton = ({text, handlePress}: Props)=> { - return( - - - {text} - - - ) -} \ No newline at end of file +export const ChatButton = ({ text, handlePress }: Props) => { + return ( + + {text} + + + ); +}; diff --git a/constants/api.ts b/constants/api.ts index b85468d..be19e3d 100644 --- a/constants/api.ts +++ b/constants/api.ts @@ -1,2 +1,2 @@ export const API_URL = - process.env.EXPO_PUBLIC_API_URL ?? 'http://localhost:8000'; + process.env.EXPO_PUBLIC_API_URL ?? 'http://localhost:8000'; diff --git a/scripts/reset-project.js b/scripts/reset-project.js index 8edba94..9678791 100644 --- a/scripts/reset-project.js +++ b/scripts/reset-project.js @@ -2,10 +2,10 @@ /** * This script is used to reset the project to a blank state. - * It deletes or moves the /app, /components, /hooks, /scripts, + * It deletes or moves the /app, /components, /hooks, /scripts, * and /constants directories to /app-example based on user inpu * and creates a new /app directory with an index.tsx and _layout.tsx file. - * You can remove the `reset-project` script from package.json + * You can remove the `reset-project` script from package.json * and safely delete this file after running it. */ diff --git a/services/imagesEnterprise.ts b/services/imagesEnterprise.ts index 5cc2768..1799bc7 100644 --- a/services/imagesEnterprise.ts +++ b/services/imagesEnterprise.ts @@ -5,35 +5,37 @@ import axios from 'axios'; import { API_URL } from '@/constants/api'; -export const getImagesByEnterprise = async (enterpriseId: string): Promise => { - const response = await axios.get( - `${API_URL}/photos/enterprise/${enterpriseId}`, - ); - - return response.data; +export const getImagesByEnterprise = async ( + enterpriseId: string, +): Promise => { + const response = await axios.get( + `${API_URL}/photos/enterprise/${enterpriseId}`, + ); + + return response.data; }; export const deleteImage = async (photoId: string): Promise => { - await axios.delete(`${API_URL}/photos/${photoId}`); + await axios.delete(`${API_URL}/photos/${photoId}`); }; export const uploadImage = async ( - imageUri: string, - empresa_id: string, + imageUri: string, + empresa_id: string, ): Promise => { - const formData = new FormData(); - - formData.append('empresa_id', empresa_id); - - formData.append('files', { - uri: imageUri, - name: 'photo.jpg', - type: 'image/jpeg', - } as any); - - await axios.post(`${API_URL}/photos/`, formData, { - headers: { - 'Content-Type': 'multipart/form-data', - }, - }); -}; \ No newline at end of file + const formData = new FormData(); + + formData.append('empresa_id', empresa_id); + + formData.append('files', { + uri: imageUri, + name: 'photo.jpg', + type: 'image/jpeg', + } as any); + + await axios.post(`${API_URL}/photos/`, formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); +}; diff --git a/types/enterprise.ts b/types/enterprise.ts index 312b97c..7463472 100644 --- a/types/enterprise.ts +++ b/types/enterprise.ts @@ -1,7 +1,7 @@ export type Enterprise = { - id_empresa: string; - nome: string; - porcentagem: number; - campos_preenchidos: string[]; - campos_faltando: string[]; -}; \ No newline at end of file + id_empresa: string; + nome: string; + porcentagem: number; + campos_preenchidos: string[]; + campos_faltando: string[]; +}; diff --git a/types/imageEnterprise.ts b/types/imageEnterprise.ts index 4f55954..461dad5 100644 --- a/types/imageEnterprise.ts +++ b/types/imageEnterprise.ts @@ -1,5 +1,5 @@ export type ImageEnterprise = { - id_foto: string; - url_foto_empresa: string; - empresa_id: string; -}; \ No newline at end of file + id_foto: string; + url_foto_empresa: string; + empresa_id: string; +}; diff --git a/types/user.ts b/types/user.ts index a9f6ca3..f02e171 100644 --- a/types/user.ts +++ b/types/user.ts @@ -1,8 +1,8 @@ export type User = { - id_usuario: string; - tipo_usuario: string; - nome: string; - cpf: string; - url_foto_usuario: string; - empresa_id: string; -}; \ No newline at end of file + id_usuario: string; + tipo_usuario: string; + nome: string; + cpf: string; + url_foto_usuario: string; + empresa_id: string; +};