diff --git a/App.js b/App.js index 591de398..499e48a6 100644 --- a/App.js +++ b/App.js @@ -8,7 +8,6 @@ import * as Notifications from "expo-notifications" import { initializeApp } from "firebase/app" import { getDatabase, ref, push, set } from "firebase/database" import { getAuth, signInWithEmailAndPassword } from "firebase/auth" -import { APIKEY, MESSAGING_SENDER_ID, APP_ID, MEASUREMENT_ID, FIREBASE_PASSWORD, SERVICE_ACCOUNT_ID } from "@env" import { Strings } from "./constants" import * as eva from "@eva-design/eva" import { ApplicationProvider, Icon, IconRegistry, Text } from "@ui-kitten/components" @@ -36,15 +35,15 @@ Notifications.setNotificationHandler({ }) const firebaseConfig = { - apiKey: APIKEY, + apiKey: process.env.APIKEY, authDomain: "daily-mobile-app-notifications.firebaseapp.com", databaseURL: "https://daily-mobile-app-notifications-default-rtdb.firebaseio.com", projectId: "daily-mobile-app-notifications", storageBucket: "daily-mobile-app-notifications.appspot.com", - messagingSenderId: MESSAGING_SENDER_ID, - appId: APP_ID, - measurementId: MEASUREMENT_ID, - serviceAccountId: SERVICE_ACCOUNT_ID + messagingSenderId: process.env.MESSAGING_SENDER_ID, + appId: process.env.APP_ID, + measurementId: process.env.MEASUREMENT_ID, + serviceAccountId: process.env.SERVICE_ACCOUNT_ID } const Stack = createStackNavigator() @@ -58,6 +57,7 @@ export default function App() { const colorScheme = Appearance.getColorScheme() const [theme, setTheme] = useState(colorScheme) const [deviceType, setDeviceType] = useState(Device.DeviceType.PHONE) + const [seen, setSeen] = useState(new Set()) const toggleTheme = () => { const next = theme === "light" ? "dark" : "light" @@ -129,31 +129,50 @@ export default function App() { } } + const sectionOptions = ({ route }) => ({ + headerTitle: () => {decode(route.params.category.name).replace('\'', '\u{2019}')}, + headerTitleStyle: { fontFamily: "MinionProBold" }, + headerTintColor: bread[theme]["color-primary-500"] + }) + + const authorOptions = ({ route }) => ({ + headerTitle: () => {route.params.name}, + headerTitleStyle: { fontFamily: "MinionProBold" }, + headerTintColor: bread[theme]["color-primary-500"] + }) + const searchHeaderOptions = { headerTintColor: bread[theme]["color-primary-500"] } + var events = [] + let app + let auth + let db + if (Object.keys(firebaseConfig).length > 0) { + app = initializeApp(firebaseConfig) + auth = getAuth(app) + db = getDatabase(app) + } + useEffect(() => { // Loads fonts from static resource. Font.loadAsync(minion).then(() => setFontsLoaded(true)) - registerForPushNotificationsAsync().then(token => { - setExpoPushToken(token) - if (Object.keys(firebaseConfig).length > 0) { - const app = initializeApp(firebaseConfig) - const db = getDatabase(app) - var matches = expoPushToken.match(/\[(.*?)\]/) - if (matches) { + + if (Object.keys(firebaseConfig).length > 0) { + registerForPushNotificationsAsync().then(token => { + setExpoPushToken(token) + var matches = token?.match(/\[(.*?)\]/) + + if (matches) { var submatch = matches[1] - const auth = getAuth(app) - signInWithEmailAndPassword(auth, "tech@stanforddaily.com", FIREBASE_PASSWORD).then((userCredential) => { + signInWithEmailAndPassword(auth, "tech@stanforddaily.com", process.env.FIREBASE_PASSWORD).then((userCredential) => { const tokenRef = ref(db, "ExpoPushTokens/" + submatch, userCredential) set(tokenRef, Date()) - }).catch((error) => { - console.log("Could not sign in: ", error) }) } - } - }) + }) + } Device.getDeviceTypeAsync().then(setDeviceType) @@ -169,8 +188,9 @@ export default function App() { setNotification(notification) }) - // This listener is fired whenever a user taps on or interacts with a notification (works when app is foregrounded, backgrounded or killed). + // This listener is fired whenever a user taps on or interacts with a notification. responseListener.current = Notifications.addNotificationResponseReceivedListener(response => { + // Works when app is foregrounded, backgrounded or killed. Model.posts().id(response.notification.request.trigger.payload.body.postID).embed().then((result) => { navigate(Strings.post, { item: result }) }) @@ -184,7 +204,16 @@ export default function App() { return fontsLoaded && ( - + { + const name = getActiveRouteName(e) + if (!(name in seen)) { + signInWithEmailAndPassword(auth, "tech@stanforddaily.com", process.env.FIREBASE_PASSWORD).then((userCredential) => { + const analyticsRef = ref(db, "Analytics/", userCredential) + push(analyticsRef, JSON.stringify(e)) // Still figuring out how to format as an object in Firebase. + }) + events.push(e) + } + }} theme={navigatorTheme[theme]}> @@ -204,12 +233,12 @@ export default function App() { ({ headerTitle: () => {decode(route.params.category.name).replace('\'', '\u{2019}')}, headerTitleStyle: { fontFamily: "MinionProBold" }, headerTintColor: bread[theme]["color-primary-500"] })} + options={sectionOptions} /> ({ headerTitle: () => {route.params.name}, headerTitleStyle: { fontFamily: "MinionProBold" }, headerTintColor: bread[theme]["color-primary-500"] })} + options={authorOptions} /> 3*groupSize} overdrag> {_.chunk(shelfArticles, 3*groupSize).map((triplet, index) => ( - + {_.chunk(triplet, 3).map((group, outerIndex) => ( {group.map((item) => ( diff --git a/package.json b/package.json index a6f0ec74..e043425a 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "expo": "^45.0.0", "expo-av": "~11.2.3", "expo-blur": "~11.1.0", + "expo-build-properties": "~0.2.0", "expo-constants": "~13.1.1", "expo-crypto": "~10.2.0", "expo-dev-client": "~1.0.1", @@ -51,7 +52,6 @@ "react-native-render-html": "^6.3.3", "react-native-safe-area-context": "4.2.4", "react-native-screens": "~3.11.1", - "react-native-skeleton-content": "^1.0.24", "react-native-snap-carousel": "^3.9.1", "react-native-svg": "12.3.0", "react-native-track-player": "^3.1.0", diff --git a/screens/Author.js b/screens/Author.js index 6e64373d..cd31f08a 100644 --- a/screens/Author.js +++ b/screens/Author.js @@ -24,7 +24,7 @@ export default function Author({ route, navigation }) { const [authorDetail, setAuthorDetail] = useState(null) const [possiblyReachedEnd, setPossiblyReachedEnd] = useState(false) const { deviceType } = useContext(ThemeContext) - const groupSize = deviceType === DeviceType.PHONE ? 2 : 3 + const groupSize = deviceType === DeviceType.PHONE ? 2 : 3 useEffect(() => { setArticlesLoading(true) @@ -46,7 +46,7 @@ export default function Author({ route, navigation }) { setArticlesLoading(false) // FIXME: Add clean-up function. - // Not all of the asynchronous tasks are being canceled, leadinfg to memory leaks. + // Not all of the asynchronous tasks are being canceled, leading to memory leaks. }, [pageNumber]) diff --git a/screens/Home.js b/screens/Home.js index c19bf949..c81223cc 100644 --- a/screens/Home.js +++ b/screens/Home.js @@ -64,7 +64,7 @@ export default function Home({ navigation }) { setSeeds(articles => ({ ...articles, [value.slug]: (value.slug in articles && appendItems) ? [...articles[value.slug], ...homeSeeds] : homeSeeds - })) + })) } const cultureMembers = _.shuffle(posts.filter(items => items.categories.includes(Sections.THE_GRIND.id) || items.categories.includes(Sections.ARTS_LIFE.id))).slice(0, 4) @@ -88,6 +88,7 @@ export default function Home({ navigation }) { // Retrieve second batch. // If an infrequent section is empty after initial call, retrieve more for those categories. + // TODO: Add humor and logical conditions. RSVP.hash({ posts: Model.posts().perPage(batchSize).page(2), @@ -111,7 +112,7 @@ export default function Home({ navigation }) { }, [pageNumber]) // Runs once at the beginning, and anytime pageNumber changes thereafter. - return layoutLoaded && ( + return layoutLoaded ? ( @@ -139,7 +140,7 @@ export default function Home({ navigation }) { {/* */} {_.chunk(articles.wildcard, groupSize)?.map((group, outerIndex) => ( - + {group.map((item, index) => )} @@ -148,11 +149,20 @@ export default function Home({ navigation }) { ))} + ) : ( + + + ) } const styles = StyleSheet.create({ container: { flex: 1 + }, + loading: { + flex: 1, + justifyContent: "center", + alignItems: "center", } }) \ No newline at end of file diff --git a/screens/Post.js b/screens/Post.js index 2f4ca642..88abce69 100644 --- a/screens/Post.js +++ b/screens/Post.js @@ -1,5 +1,5 @@ import React, { useContext, useEffect, useState } from "react" -import { ActivityIndicator, Appearance, Dimensions, LayoutAnimation, PixelRatio, Platform, StatusBar, StyleSheet, useColorScheme, View, UIManager } from "react-native" +import { ActivityIndicator, Appearance, Dimensions, LayoutAnimation, PixelRatio, Platform, StatusBar, StyleSheet, useColorScheme, View, UIManager, Linking } from "react-native" import { Icon, Text, useTheme } from "@ui-kitten/components" import { ImageHeaderScrollView, TriggeringView } from "react-native-image-header-scroll-view" import { Spacing } from "../constants" @@ -40,6 +40,24 @@ export default function Post({ route, navigation }) { const headerHeight = useHeaderHeight() const contentEdgeInset = deviceType === Device.DeviceType.PHONE ? 14 : 56 + const openArticleIfPresent = (url) => { + const pruned = url.slice(-1) === "/" ? url.slice(0, -1) : url + const preSlug = pruned.split("/") + const slug = (preSlug[preSlug.length - 1]) + + // Hopefully this doesn't take too long to load. Might have to preload. + + if (url.match(/stanforddaily.com\/\d{4}\/\d{2}\/\d{2}\/(.*)/)) { + Model.posts().slug(slug).embed().then(result => { + if (result.length > 0) { + navigation.push("Post", { article: result[0], sourceName: "Stanford Daily" }) + } + }).catch(error => console.trace(error)) + } else { + Linking.openURL(url) + } + } + const renderers = { // Note: Chrome URL protocol causes a crash with the renderer below. // iframe: IframeRenderer, @@ -74,8 +92,8 @@ export default function Post({ route, navigation }) { setCaption(decode(media.caption?.rendered).slice(3, -5)) LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) }) - - + + return () => { if (colorScheme === "light") { StatusBar.setBarStyle("dark-content", true) @@ -115,6 +133,7 @@ export default function Post({ route, navigation }) { baseStyle={{ fontFamily: "MinionProRegular", fontSize: 20*fontScale, color: theme["text-basic-color"], backgroundColor: theme["background-basic-color-1"] }} tagsStyles={{ a: { color: theme["color-primary-500"], textDecorationLine: "none" } }} // The font color is slightly off in Dark Mode. renderers={renderers} + renderersProps={{ a: { onPress: (e, href) => openArticleIfPresent(href) } }} WebView={WebView} backgroundColor={theme["background-color-basic-2"]} enableExperimentalMarginCollapsing diff --git a/yarn.lock b/yarn.lock index 2dce86a7..ec09762a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1136,13 +1136,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-object-assign@^7.10.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.16.7.tgz#5fe08d63dccfeb6a33aa2638faf98e5c584100f8" - integrity sha512-R8mawvm3x0COTJtveuoqZIjNypn2FjfvXZr4pSQ8VhEFBuQGBz4XhHasZtHXjgXU4XptZ4HtGof3NoYc93ZH9Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-object-super@^7.0.0": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" @@ -3005,11 +2998,6 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -abs-svg-path@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" - integrity sha1-32Acjo0roQ1KdtYl4japo5wnI78= - absolute-path@^0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" @@ -3039,6 +3027,16 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv@^8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + anser@^1.4.9: version "1.4.10" resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" @@ -4535,6 +4533,15 @@ expo-blur@~11.1.0: resolved "https://registry.yarnpkg.com/expo-blur/-/expo-blur-11.1.0.tgz#21f9f0d28da1c326646c459813c9343b6da5e20f" integrity sha512-7ClB+fIYoFXaTyY4jAMBmJmgs3Dz0EWNbpgFCC4v/sSxldg5jSbMUXLXUttnRhKRmIzPB2gufcgoOWfNwA3q7g== +expo-build-properties@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/expo-build-properties/-/expo-build-properties-0.2.0.tgz#604514bb133f6a5d082af35f80ca706446902caa" + integrity sha512-9GcZ+lReZf5mjtdu1Vn7anSMMCRzoktiJ9S4DcXEJ6as36QFPsYbpEI3xrH7VrfR6i/pdysCNgYbme+IaeEIaQ== + dependencies: + "@expo/config-plugins" "~4.1.4" + ajv "^8.11.0" + semver "^7.3.5" + expo-constants@~13.1.0, expo-constants@~13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-13.1.1.tgz#78c26c760cc63cd5608bc4b51bd159d7339d8054" @@ -4631,13 +4638,6 @@ expo-linear-gradient@^11.3.0: resolved "https://registry.yarnpkg.com/expo-linear-gradient/-/expo-linear-gradient-11.3.0.tgz#855f470c9684f5b979c3c1be0ed1fe1943d57158" integrity sha512-gm0cULqE5cTP39HZHi+eCGgQ2qMcwym92DwSzRpA5nA4Ah5oKksV+PwD7zzo6YJt3X3lgqrTYEqts9VQISCTgw== -expo-linear-gradient@~10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/expo-linear-gradient/-/expo-linear-gradient-10.0.3.tgz#06ad72e164f5bf36c4afcfc8ccd31138a3a78d6e" - integrity sha512-zKkBhHvTvDywpb0y5BJDHTbxX5/2C60qW/M8uyZXKIZcTUwY7j/9Kcx0YzoNNglq7p6aQ/DWO7sM8LHr93985Q== - dependencies: - expo-modules-core "~0.4.4" - expo-manifests@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/expo-manifests/-/expo-manifests-0.3.0.tgz#724e85a4e726cb1ef775f9846c9ecb8d243a17d7" @@ -4675,14 +4675,6 @@ expo-modules-core@0.9.2, expo-modules-core@~0.9.2: compare-versions "^3.4.0" invariant "^2.2.4" -expo-modules-core@~0.4.4: - version "0.4.10" - resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-0.4.10.tgz#6c7e7e211b3056fc23a462e9faea88cc7653fe9b" - integrity sha512-uCZA3QzF0syRaHwYY99iaNhnye4vSQGsJ/y6IAiesXdbeVahWibX4G1KoKNPUyNsKXIM4tqA+4yByUSvJe4AAw== - dependencies: - compare-versions "^3.4.0" - invariant "^2.2.4" - expo-notifications@~0.15.4: version "0.15.4" resolved "https://registry.yarnpkg.com/expo-notifications/-/expo-notifications-0.15.4.tgz#e255927a239a1b49bf6dfe3d2d6d3fee308165e2" @@ -4798,7 +4790,7 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -fast-deep-equal@^3.1.3: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -6106,6 +6098,11 @@ json-schema-deref-sync@^0.13.0: traverse "~0.6.6" valid-url "~1.0.9" +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -6818,11 +6815,6 @@ mkdirp@~0.5.1: dependencies: minimist "^1.2.6" -mockdate@^3.0.2: - version "3.0.5" - resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-3.0.5.tgz#789be686deb3149e7df2b663d2bc4392bc3284fb" - integrity sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ== - moment-timezone@^0.5.33: version "0.5.33" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.33.tgz#b252fd6bb57f341c9b59a5ab61a8e51a73bbd22c" @@ -6997,13 +6989,6 @@ normalize-path@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-svg-path@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz#0e614eca23c39f0cffe821d6be6cd17e569a766c" - integrity sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg== - dependencies: - svg-arc-to-cubic-bezier "^3.0.0" - npm-package-arg@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-7.0.0.tgz#52cdf08b491c0c59df687c4c925a89102ef794a5" @@ -7272,11 +7257,6 @@ parse-png@^2.1.0: dependencies: pngjs "^3.3.0" -parse-svg-path@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" - integrity sha1-en7A0esG+lMlx9PgCbhZoJtdSes= - parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -7515,6 +7495,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + qrcode-terminal@0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz#ffc6c28a2fc0bfb47052b47e23f4f446a5fbdb9e" @@ -7692,25 +7677,6 @@ react-native-pager-view@5.4.15: resolved "https://registry.yarnpkg.com/react-native-pager-view/-/react-native-pager-view-5.4.15.tgz#075fef5ae4ba6ecc37e49b6c4a24770131a2a3cc" integrity sha512-5NssD840wFCuOL4B1ZRiRADvt+Vx2Dgify4SmAUqHXCx03yiGPnRWmFjYXyQeK6gq/8VY+gPGE4bTy9ahzBbDw== -react-native-reanimated@~2.2.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-2.2.4.tgz#36c5d15028b0bd7d479fba5199117ac870c7a532" - integrity sha512-Nn648MfEEnTCEiWsl1YmfkojiLyV0NMY0EiRdDRbZNfJVfxBuyqhCxI/4Jd7aBi162qpgf8XK2mByYgvF4zLrQ== - dependencies: - "@babel/plugin-transform-object-assign" "^7.10.4" - fbjs "^3.0.0" - mockdate "^3.0.2" - string-hash-64 "^1.0.3" - -react-native-redash@^16.0.11: - version "16.2.3" - resolved "https://registry.yarnpkg.com/react-native-redash/-/react-native-redash-16.2.3.tgz#ee63e100c60f83275116e57d4e8bc79f26349db9" - integrity sha512-vSjHA6/mBY3IpDYPish3DlG06PKNLkb/b89hw7nsDM3yxAJ7Db+yMnEL3pp2YsoYblDc3s+0+wBRlvxay4X4vQ== - dependencies: - abs-svg-path "^0.1.1" - normalize-svg-path "^1.0.1" - parse-svg-path "^0.1.2" - react-native-render-html@^6.3.3: version "6.3.3" resolved "https://registry.yarnpkg.com/react-native-render-html/-/react-native-render-html-6.3.3.tgz#3519ee4a3fb9281f2f44014c1c350dade00a9cd1" @@ -7739,15 +7705,6 @@ react-native-screens@~3.11.1: react-freeze "^1.0.0" warn-once "^0.1.0" -react-native-skeleton-content@^1.0.24: - version "1.0.24" - resolved "https://registry.yarnpkg.com/react-native-skeleton-content/-/react-native-skeleton-content-1.0.24.tgz#28a75519ab8c4604001801fc00b5b57177bdf0ba" - integrity sha512-fMVWw63tf98q6RXkpZh/RTE9p4jagryZjjyn0SM9mUP2qCX4sYHn9QYLnlOni6UMuScBOoORE/hbBqF65BykPA== - dependencies: - expo-linear-gradient "~10.0.3" - react-native-reanimated "~2.2.0" - react-native-redash "^16.0.11" - react-native-snap-carousel@^3.9.1: version "3.9.1" resolved "https://registry.yarnpkg.com/react-native-snap-carousel/-/react-native-snap-carousel-3.9.1.tgz#6fd9bd8839546c2c6043a41d2035afbc6fe0443e" @@ -8536,11 +8493,6 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= -string-hash-64@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string-hash-64/-/string-hash-64-1.0.3.tgz#0deb56df58678640db5c479ccbbb597aaa0de322" - integrity sha512-D5OKWKvDhyVWWn2x5Y9b+37NUllks34q1dCDhk/vYcso9fmhs+Tl3KR/gE4v5UNj2UA35cnX4KdVVGkG1deKqw== - string-width@^4.1.0, string-width@^4.2.0: version "4.2.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" @@ -8711,11 +8663,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svg-arc-to-cubic-bezier@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz#390c450035ae1c4a0104d90650304c3bc814abe6" - integrity sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g== - tar@^6.0.2, tar@^6.0.5: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" @@ -9087,6 +9034,13 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + urijs@^1.19.6: version "1.19.7" resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.7.tgz#4f594e59113928fea63c00ce688fb395b1168ab9"