diff --git a/navigation/assets/book-deactive.png b/navigation/assets/book-deactive.png
new file mode 100644
index 0000000..3bfbc86
Binary files /dev/null and b/navigation/assets/book-deactive.png differ
diff --git a/navigation/assets/test-deactive.png b/navigation/assets/test-deactive.png
new file mode 100644
index 0000000..894ead8
Binary files /dev/null and b/navigation/assets/test-deactive.png differ
diff --git a/navigation/index.js b/navigation/index.js
index fc2d372..cf213f7 100644
--- a/navigation/index.js
+++ b/navigation/index.js
@@ -18,6 +18,7 @@ import Products from "../src/screens/Products";
import Login from "../src/screens/Login";
import Otp from "../src/screens/Otp";
import Product from "../src/screens/Product";
+import AR from "../src/screens/AR";
import QR from "../src/screens/QR";
import QRContent from "../src/screens/QRContent";
import Faq from "../src/screens/Faq";
@@ -30,6 +31,7 @@ import ShoppingCart from "../src/screens/ShoppingCart";
import Video from "../src/screens/Video";
import VideoDisplay from "../src/screens/VideoDisplay";
import Contact from "../src/screens/Contact";
+import Tests from "../src/screens/Tests";
import { user } from "../src/redux/actions";
//assets
@@ -37,6 +39,9 @@ import homeDeactiveIcon from "./assets/home-deactive.png";
import homeActiveIcon from "./assets/home-active.png";
import videoActiveIcon from "./assets/video-active.png";
import videoDeactiveIcon from "./assets/video-deactive.png";
+import bookDeactiveIcon from "./assets/book-deactive.png";
+
+import testDeactiveIcon from "./assets/test-deactive.png";
const width = Dimensions.get("window").width;
@@ -52,13 +57,12 @@ const BottomTabNavigator = () => {
tabBarStyle: {
backgroundColor: "#CCE6FF",
zIndex: 10,
- paddingVertical: 10,
- height: 60,
+ height: 70,
},
tabBarLabelStyle: {
- fontSize: width / 36,
+ fontSize: width / 34,
fontFamily: "regular",
- marginTop: 5,
+ transform: [{translateY : -7}]
},
tabBarShowLabel: true,
// tabBarLabel : 'reza'
@@ -68,19 +72,44 @@ const BottomTabNavigator = () => {
name="ShoppingCartTab"
component={ShoppingCart}
options={{
+ tabBarStyle: {
+ flex : 'flex-col',
+ display: 'flex',
+
+ },
+ title : 'سبد خرید',
tabBarIcon: ({ focused, color }) => (
),
}}
/>
+ ( focused ?
+ :
+
+ ),
+ }}
+ />
focused ? (
{
name="ProductsTab"
component={ProductsStackScreen}
options={{
- tabBarIcon: ({ focused, color }) => (
-
+ title : 'کتابها',
+ tabBarIcon: ({ focused, color }) => ( focused ?
+ :
+
),
}}
/>
@@ -108,6 +142,7 @@ const BottomTabNavigator = () => {
name="HomeTab"
component={HomeStackScreen}
options={{
+ title : "خانه",
tabBarIcon: ({ focused, color }) =>
focused ? (
{
+
);
diff --git a/package.json b/package.json
index 1e6eecc..a64b329 100644
--- a/package.json
+++ b/package.json
@@ -35,6 +35,7 @@
"react-i18next": "^11.15.1",
"react-native": "0.64.3",
"react-native-awesome-alerts": "^1.5.2",
+ "react-native-openanything": "^0.0.6",
"react-native-qrcode-scanner": "^1.5.4",
"react-native-restart": "^0.0.22",
"react-native-safe-area-context": "3.3.2",
diff --git a/src/components/Drawer.js b/src/components/Drawer.js
index 45f8c56..e67fa80 100644
--- a/src/components/Drawer.js
+++ b/src/components/Drawer.js
@@ -95,7 +95,6 @@ const Drawer = ({ position, setBoxPosition }) => {
};
return (
console.log(e.currentTarget._nativeTag)}
style={[
tw(`absolute z-50 top-0 flex flex-row justify-end `),
{
diff --git a/src/components/MusicPlayer.js b/src/components/MusicPlayer.js
index 653aa6b..e1e0af3 100644
--- a/src/components/MusicPlayer.js
+++ b/src/components/MusicPlayer.js
@@ -1,185 +1,31 @@
-import React, { useState, useEffect } from "react";
-import { StyleSheet, TouchableOpacity, View, Image, Text } from "react-native";
-import { Ionicons } from "@expo/vector-icons";
-import { Audio } from "expo-av";
+import * as React from 'react';
+import { View, Button } from 'react-native';
+import { Audio } from 'expo-av';
+
+export default function VoicePlayer({fileIds}) {
+ const [sound, setSound] = React.useState();
+
+ async function playSound() {
+ console.log('Loading Sound');
+ const { sound } = await Audio.Sound.createAsync(
+ {uri : `https://dnvn.ir/api/v1/file/${fileIds}`}
+ );
+ setSound(sound);
+
+ console.log('Playing Sound');
+ await sound.playAsync(); }
+
+ React.useEffect(() => {
+ return sound
+ ? () => {
+ console.log('Unloading Sound');
+ sound.unloadAsync(); }
+ : undefined;
+ }, [sound]);
-const audioBookPlaylist = [
- {
- title: "Hamlet - Act I",
- author: "William Shakespeare",
- source: "Librivox",
- uri: "",
- imageSource:
- "http://www.archive.org/download/LibrivoxCdCoverArt8/hamlet_1104.jpg",
- },
-
-];
-
-const MusicPlayer = () => {
- const [isPlaying, setIsPlaying] = useState(false);
- const [playbackInstance, setPlaybackInstance] = useState(null);
- const [currentIndex, setCurrentIndex] = useState(0);
- const [volume, setVolume] = useState(1.0);
- const [isBuffering, setIsBuffering] = useState(true);
-
- useEffect( async () => {
- try {
- await Audio.setAudioModeAsync({
- allowsRecordingIOS: false,
- interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DO_NOT_MIX,
- playsInSilentModeIOS: true,
- interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DO_NOT_MIX,
- shouldDuckAndroid: true,
- staysActiveInBackground: true,
- playThroughEarpieceAndroid: true,
- });
-
- loadAudio();
- } catch (e) {
- console.log(e);
- }
- });
-
- const loadAudio = async () => {
- try {
- const playbackInstance = new Audio.Sound();
- const source = {
- uri: audioBookPlaylist[currentIndex].uri,
- };
-
- const status = {
- shouldPlay: isPlaying,
- volume: volume,
- };
-
- playbackInstance.setOnPlaybackStatusUpdate(onPlaybackStatusUpdate);
- await playbackInstance.loadAsync(source, status, false);
- setPlaybackInstance(playbackInstance);
- } catch (e) {
- console.log(e);
- }
- };
-
- const onPlaybackStatusUpdate = (status) => {
- setIsBuffering(status.isBuffering);
- };
-
- const handlePlayPause = async () => {
- if(isPlaying) {
- await playbackInstance.pauseAsync();
- }else{
- await playbackInstance.playAsync();
- }
-
- setIsPlaying(() => !isPlaying);
- };
-
- const handlePreviousTrack = async () => {
- let { playbackInstance, currentIndex } = state;
- if (playbackInstance) {
- await playbackInstance.unloadAsync();
- setCurrentIndex(
- currentIndex === 0 ? audioBookPlaylist.length - 1 : currentIndex - 1
- );
- loadAudio();
- }
- };
-
- const handleNextTrack = async () => {
- if (playbackInstance) {
- await playbackInstance.unloadAsync();
- setCurrentIndex(
- currentIndex + 1 > audioBookPlaylist.length - 1 ? 0 : currentIndex + 1
- );
- loadAudio();
- }
- };
-
- const renderFileInfo = () => {
- return playbackInstance ? (
-
-
- {audioBookPlaylist[currentIndex].title}
-
-
- {audioBookPlaylist[currentIndex].author}
-
-
- {audioBookPlaylist[currentIndex].source}
-
-
- ) : null;
- };
return (
-
-
- handlePreviousTrack()}
- >
-
-
- handlePlayPause()}
- >
- {isPlaying ? (
-
- ) : (
-
- )}
-
- handleNextTrack()}
- >
-
-
-
- {renderFileInfo()}
+
);
-};
-
-const styles = StyleSheet.create({
- container: {
- flex: 1,
- backgroundColor: "#fff",
- alignItems: "center",
- justifyContent: "center",
- },
- albumCover: {
- width: 250,
- height: 250,
- },
- trackInfo: {
- padding: 40,
- backgroundColor: "#fff",
- },
-
- trackInfoText: {
- textAlign: "center",
- flexWrap: "wrap",
- color: "#550088",
- },
- largeText: {
- fontSize: 22,
- },
- smallText: {
- fontSize: 16,
- },
- control: {
- margin: 20,
- },
- controls: {
- flexDirection: "row",
- },
-});
-
-export default MusicPlayer;
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/src/components/Navbar.js b/src/components/Navbar.js
index 624e4f0..e7b0f9c 100644
--- a/src/components/Navbar.js
+++ b/src/components/Navbar.js
@@ -10,6 +10,7 @@ import {
import { useNavigation } from "@react-navigation/native";
import { Ionicons, Entypo } from "@expo/vector-icons";
import tw from "tailwind-rn";
+import fontSize from '../constants/fontSize';
import { connect } from "react-redux";
const { width, height } = Dimensions.get("window");
@@ -35,12 +36,12 @@ const Navbar = ({ notification, setBoxPosition, headerOptions }) => {
backgroundColor: Color.theme1.light.blue1,
borderColor: Color.theme1.light.blue2,
borderWidth: 1,
- marginLeft: route === "ar" ? 10 : 0,
+ marginLeft: route === "AR" ? 10 : 0,
},
]}
onPress={() => navigation.navigate(route)}
>
-
+
);
}, []);
@@ -63,7 +64,7 @@ const Navbar = ({ notification, setBoxPosition, headerOptions }) => {
{
{headerOptions?.qr && (
<>
-
+
>
)}
{headerOptions?.bookmark && (
diff --git a/src/components/Pressable.js b/src/components/Pressable.js
index ddd4af5..d77f12f 100644
--- a/src/components/Pressable.js
+++ b/src/components/Pressable.js
@@ -1,5 +1,5 @@
import React from 'react';
-import {Pressable, Text, Dimensions} from 'react-native';
+import {TouchableOpacity, Text, Dimensions} from 'react-native';
import tw from 'tailwind-react-native-classnames';
const fullWidth = Dimensions.get('window').width;
@@ -13,7 +13,7 @@ export default function Pressable1({
onPress,
}) {
return (
- onPress()}
style={[
tw.style('rounded-md py-3 flex flex-row justify-center mb-3'),
@@ -25,6 +25,6 @@ export default function Pressable1({
},
]}>
{title}
-
+
);
}
diff --git a/src/redux/actions/public.js b/src/redux/actions/public.js
index 3fd91d3..9ddc853 100644
--- a/src/redux/actions/public.js
+++ b/src/redux/actions/public.js
@@ -43,6 +43,8 @@ const publicApi = {
await dispatch({ type: "active/category", data: data }),
setVideoActive: (data) => async (dispatch) =>
await dispatch({ type: "active/video", data: data }),
+ getArList: (data, history) => async (dispatch) =>
+ await proxy.get("public/ar", data, { history, dispatch }),
};
export default publicApi;
diff --git a/src/redux/reducers/public.js b/src/redux/reducers/public.js
index 8b90f6c..959b419 100644
--- a/src/redux/reducers/public.js
+++ b/src/redux/reducers/public.js
@@ -141,7 +141,8 @@ const publicApi = (state = initialState, action) => {
error: null,
homeData: data,
};
-
+ case "public/ar":
+ return { ...state, loading: false, error: null, arList: data };
case "public/contact":
return { ...state, loading: false, error: null, contactData: data };
case "public/blogList":
diff --git a/src/screens/AR/components/Book.js b/src/screens/AR/components/Book.js
new file mode 100644
index 0000000..166a9e8
--- /dev/null
+++ b/src/screens/AR/components/Book.js
@@ -0,0 +1,26 @@
+import { View, Text, Image, Dimensions } from "react-native";
+import React from "react";
+import tw from "tailwind-rn";
+import fontSize from '../../../constants/fontSize';
+import Colors from '../../../constants/Colors';
+
+const { width } = Dimensions.get("window");
+
+const Book = ({ book }) => {
+ return (
+
+
+ {book.title}
+
+ );
+};
+
+export default Book;
diff --git a/src/screens/AR/index.js b/src/screens/AR/index.js
index 318a4d7..850f32f 100644
--- a/src/screens/AR/index.js
+++ b/src/screens/AR/index.js
@@ -1,13 +1,76 @@
-import React from 'react'
-import { View, Text } from 'react-native';
-import {connect} from 'react-redux';
+import React, { useState, useEffect } from "react";
+import {
+ SafeAreaView,
+ ScrollView,
+ StatusBar,
+ LayoutAnimation,
+ Platform,
+ Dimensions,
+} from "react-native";
+import { connect } from "react-redux";
+import { publicApi } from "../../redux/actions";
+
+import Navbar from "../../components/Navbar";
+import Drawer from "../../components/Drawer";
+import Book from "./components/Book";
+
+const { height } = Dimensions.get("window");
+
+function AR({ getArList, arList }) {
+ const [position, setPosition] = useState("100%");
+
+ useEffect(() => {
+ getArList();
+ }, []);
+
+ const setBoxPosition = () => {
+ LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
+ setPosition(position === "100%" ? "0%" : "100%");
+ };
-function AR({}) {
return (
-
-
-
- )
+
+
+
+
+ {arList.length > 0 &&
+ arList.map((book, index) => )}
+
+
+ );
}
-export default AR;
\ No newline at end of file
+const mapStateToProps = (state) => ({
+ arList: state.publicApi.arList,
+});
+
+const mapDispatchToProps = {
+ getArList: publicApi.getArList,
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(AR);
diff --git a/src/screens/Home/index.js b/src/screens/Home/index.js
index 065ab72..54d3e88 100644
--- a/src/screens/Home/index.js
+++ b/src/screens/Home/index.js
@@ -38,7 +38,6 @@ const Home = ({
getBlogs();
getBooks();
getUserProducts();
- // getVideos();
}, []);
const setBoxPosition = () => {
diff --git a/src/screens/OrdersFollowUp/index.js b/src/screens/OrdersFollowUp/index.js
index 51af90b..1b5b919 100644
--- a/src/screens/OrdersFollowUp/index.js
+++ b/src/screens/OrdersFollowUp/index.js
@@ -32,13 +32,13 @@ function OrdersFollowUp({ orders }) {
diff --git a/src/screens/Product/components/Book.js b/src/screens/Product/components/Book.js
index 4987da8..0d7fdce 100644
--- a/src/screens/Product/components/Book.js
+++ b/src/screens/Product/components/Book.js
@@ -4,8 +4,9 @@ import {
Text,
Image,
ScrollView,
- Pressable,
+ TouchableOpacity
} from "react-native";
+import { useNavigation } from "@react-navigation/native";
import { Entypo } from "@expo/vector-icons";
import CustomPressable from "../../../components/Pressable";
import Description from "./Description";
@@ -18,6 +19,7 @@ import { product, userProduct } from "../../../redux/actions";
import { connect } from "react-redux";
function Book({ book, grades, pushToCart, userId }) {
+ const navigation = useNavigation();
const [type, setType] = useState(1);
return (
@@ -170,13 +172,14 @@ function Book({ book, grades, pushToCart, userId }) {
border={{ color: "#196EC0", width: 1 }}
width={"33%"}
/>
- navigation.navigate("Video", {id : book.id})}
>
مشاهده دوره ویدئویی این محصول
-
+
{book.product[type].description && (
diff --git a/src/screens/Product/index.js b/src/screens/Product/index.js
index 8153841..6b20d79 100644
--- a/src/screens/Product/index.js
+++ b/src/screens/Product/index.js
@@ -54,7 +54,6 @@ function Product({
contentContainerStyle={styles.contentContainerStyle}
style={styles.container}
>
-
{book && (route.params.type === 'video' ? (
) : (
diff --git a/src/screens/Products/index.js b/src/screens/Products/index.js
index 3cdcd8d..fa9d169 100644
--- a/src/screens/Products/index.js
+++ b/src/screens/Products/index.js
@@ -64,7 +64,7 @@ function Products({ grades, productTypes, books }) {
/>
-
+
{
setScanned(true);
- navigation.navigate("QRContent", {data});
+ navigation.navigate("QRContent", { data });
};
if (hasPermission === null) {
@@ -63,7 +64,7 @@ export default function Scan({}) {
navigation.goBack()}
style={[
- tw("py-2.5 rounded-full flex justify-center flex-row"),
+ tw("py-2.5 rounded-full flex justify-center flex-row items-center"),
{
width: height / 3.5,
borderWidth: 1,
@@ -71,7 +72,15 @@ export default function Scan({}) {
},
]}
>
- بازگشت
+
+
+ بازگشت
+
+
{/* )} */}
diff --git a/src/screens/QR/assets/laptop.png b/src/screens/QR/assets/laptop.png
index a9f2435..13dec00 100644
Binary files a/src/screens/QR/assets/laptop.png and b/src/screens/QR/assets/laptop.png differ
diff --git a/src/screens/QRContent/Content/PDF.js b/src/screens/QRContent/Content/PDF.js
index 57648e8..af70f59 100644
--- a/src/screens/QRContent/Content/PDF.js
+++ b/src/screens/QRContent/Content/PDF.js
@@ -1,17 +1,19 @@
import React from "react";
-import { View, Text, Image, Dimensions } from "react-native";
+import { View, Text, Image, Dimensions, TouchableOpacity } from "react-native";
import tw from "tailwind-rn";
+import * as OpenAnything from 'react-native-openanything';
import pdfIcon from "../../../assets/icons/pdf.png";
-const {width} = Dimensions.get("window");
+const { width } = Dimensions.get("window");
-export default function PDF({ name, file }) {
+export default function PDF({ data }) {
return (
- OpenAnything.Pdf(`https://dnvn.ir/api/v1/file/${data.fileIds}`)}
>
- {name}
+ {data.name}
-
+
);
}
diff --git a/src/screens/QRContent/Content/Video.js b/src/screens/QRContent/Content/Video.js
index 5643178..bf7fc4f 100644
--- a/src/screens/QRContent/Content/Video.js
+++ b/src/screens/QRContent/Content/Video.js
@@ -1,23 +1,37 @@
import React from "react";
import { View, Text, Dimensions } from "react-native";
import tw from "tailwind-rn";
+import { Video } from "expo-av";
const {width} = Dimensions.get("window");
-export default function Video({ name, file }) {
+export default function VideoContent({ data }) {
+ const [status, setStatus] = React.useState({});
+ const video = React.useRef(null);
return (
- {name}
+ {'موضوع:' + ' ' + data.name}
-
+
+
);
}
diff --git a/src/screens/QRContent/Content/Voice.js b/src/screens/QRContent/Content/Voice.js
index 8aaf69f..8b754b6 100644
--- a/src/screens/QRContent/Content/Voice.js
+++ b/src/screens/QRContent/Content/Voice.js
@@ -1,11 +1,11 @@
import React from "react";
import { View, Text, Dimensions } from "react-native";
import tw from "tailwind-rn";
-// import MusicPlayer from "../../../components/MusicPlayer";
+import MusicPlayer from "../../../components/MusicPlayer";
const { width } = Dimensions.get("window");
-export default function Voice({ name, file }) {
+export default function Voice({ data }) {
return (
- {name}
+ {data.name}
- {/* */}
+
);
}
diff --git a/src/screens/QRContent/Content/index.js b/src/screens/QRContent/Content/index.js
index 6fc6f55..ecd4e50 100644
--- a/src/screens/QRContent/Content/index.js
+++ b/src/screens/QRContent/Content/index.js
@@ -6,7 +6,7 @@ import Colors from "../../../constants/Colors";
const { width} = Dimensions.get("window");
-export default function Content({ data }) {
+export default function Content({ data, grades }) {
return (
@@ -24,7 +24,7 @@ export default function Content({ data }) {
color: Colors.theme1.light.blue6,
}}
>
- {data.name}
+ {data.book.name}
- {data.grade}
+ { 'پایه' + ' ' + grades[data.book.gradeId]}
{`شما در حال مشاهده صفحه ${data.page} هستید.`}
+ >{`شما در حال مشاهده صفحه ${data.qr.pageNumber} هستید.`}
obj.type === 'voice')[0],
+ video: data.qr.content.filter((obj) => obj.type === 'video')[0],
+ pdf: data.qr.content.filter((obj) => obj.type === 'pdf')[0],
+ ppt: data.qr.content.filter((obj) => obj.type === 'ppt')[0],
+ links: data.qr.content.filter((obj) => obj.type === 'links')[0],
}}
/>
diff --git a/src/screens/QRContent/Tab/index.js b/src/screens/QRContent/Tab/index.js
index c0330b3..282cd51 100644
--- a/src/screens/QRContent/Tab/index.js
+++ b/src/screens/QRContent/Tab/index.js
@@ -14,6 +14,7 @@ const { width} = Dimensions.get("window");
export default function Tab({ data }) {
const [dataType, setDataType] = useState("all");
+ console.log(data);
return (
{data.voice && (
-
+
)}
{data.video && (
-
+
)}
- {data.ppt && }
- {data.pdf && }
- {data.links && }
+ {data.ppt && }
+ {data.pdf && }
+ {data.links && }
>
)}
{dataType === "voice" && (
<>
{data.voice ? (
-
+
) : (
{data.video ? (
-
+
) : (
{data.ppt ? (
-
+
) : (
{data.pdf ? (
-
+
) : (
{data.links ? (
-
+
) : (
{
- getQrData({tail : 'zist10_14'});
- },[]);
+ getQrData({ tail: "zist10-17" });
+ }, []);
useEffect(() => {
- console.log(data);
- },[data]);
+ if (data) {
+ // console.log(data.qr.content);
+ }
+ }, [data]);
return (
-
+ {data && }
);
}
const mapStateToProps = (state) => ({
- data : state.qr.list
+ data: state.qr.list,
+ grades : state.publicApi.grades
});
const mapDispatchToProps = {
- getQrData : qr.info
-}
+ getQrData: qr.info,
+};
export default connect(mapStateToProps, mapDispatchToProps)(QRContent);
-
-const styles = StyleSheet.create({
- contentContainerStyle: {
- paddingBottom: 0,
- },
- container: {
- width: Dimensions.get("window").width,
- backgroundColor: "white",
- flexDirection: "column",
- paddingVertical: 5,
- paddingHorizontal: 0,
- },
-});
diff --git a/src/screens/Tests/index.js b/src/screens/Tests/index.js
new file mode 100644
index 0000000..d09eecc
--- /dev/null
+++ b/src/screens/Tests/index.js
@@ -0,0 +1,12 @@
+import { View, Text } from 'react-native';
+import React from 'react';
+
+const Tests = () => {
+ return (
+
+
+
+ );
+};
+
+export default Tests;
diff --git a/src/screens/Video/index.js b/src/screens/Video/index.js
index 492f689..8f75e2b 100644
--- a/src/screens/Video/index.js
+++ b/src/screens/Video/index.js
@@ -50,11 +50,11 @@ function Product({
headerOptions={{
logo: true,
menu: false,
- hamburgerMenu: true,
+ hamburgerMenu: false,
title: "",
bookmark: false,
qr: true,
- back: false,
+ back: true,
}}
/>
diff --git a/yarn.lock b/yarn.lock
index 211a145..0357415 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4116,7 +4116,7 @@ lodash.topath@^4.5.2:
resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009"
integrity sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=
-lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21:
+lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -5249,6 +5249,14 @@ react-native-codegen@^0.0.6:
jscodeshift "^0.11.0"
nullthrows "^1.1.1"
+react-native-openanything@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/react-native-openanything/-/react-native-openanything-0.0.6.tgz#7b694a28ce6de0363d46474ab3c72f5c0d14e658"
+ integrity sha512-ZFTYFFPH5j0VNpZDxd7jlaFz8qz1NMgXaHPioynAErk3CWyj6y261H1R06+nyoq7i0tJFKJXhuQzUrNemwcelQ==
+ dependencies:
+ lodash "^4.17.4"
+ prop-types "^15.6.0"
+
react-native-permissions@^2.0.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/react-native-permissions/-/react-native-permissions-2.2.2.tgz#3d2a63f6b7d6be52fc86e30f77412a9566283028"