Use native view drawing instead of svg

This commit is contained in:
xmflsct 2022-08-19 01:58:17 +02:00
parent 244eda3d12
commit 9ed6343eb7
7 changed files with 116 additions and 231 deletions

View File

@ -572,8 +572,6 @@ PODS:
- Sentry (= 7.23.0) - Sentry (= 7.23.0)
- RNShareMenu (6.0.0): - RNShareMenu (6.0.0):
- React - React
- RNSVG (12.4.4):
- React-Core
- SDWebImage (5.13.2): - SDWebImage (5.13.2):
- SDWebImage/Core (= 5.13.2) - SDWebImage/Core (= 5.13.2)
- SDWebImage/Core (5.13.2) - SDWebImage/Core (5.13.2)
@ -670,7 +668,6 @@ DEPENDENCIES:
- RNScreens (from `../node_modules/react-native-screens`) - RNScreens (from `../node_modules/react-native-screens`)
- "RNSentry (from `../node_modules/@sentry/react-native`)" - "RNSentry (from `../node_modules/@sentry/react-native`)"
- RNShareMenu (from `../node_modules/react-native-share-menu`) - RNShareMenu (from `../node_modules/react-native-share-menu`)
- RNSVG (from `../node_modules/react-native-svg`)
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
SPEC REPOS: SPEC REPOS:
@ -857,8 +854,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/@sentry/react-native" :path: "../node_modules/@sentry/react-native"
RNShareMenu: RNShareMenu:
:path: "../node_modules/react-native-share-menu" :path: "../node_modules/react-native-share-menu"
RNSVG:
:path: "../node_modules/react-native-svg"
Yoga: Yoga:
:path: "../node_modules/react-native/ReactCommon/yoga" :path: "../node_modules/react-native/ReactCommon/yoga"
@ -958,7 +953,6 @@ SPEC CHECKSUMS:
RNScreens: 4a1af06327774490d97342c00aee0c2bafb497b7 RNScreens: 4a1af06327774490d97342c00aee0c2bafb497b7
RNSentry: 6798624706227656d942849d593f89c8ca3bdde5 RNSentry: 6798624706227656d942849d593f89c8ca3bdde5
RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3 RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3
RNSVG: ecd661f380a07ba690c9c5929c475a44f432d674
SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866 SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866
SDWebImageWebPCoder: 3dc350894112feab5375cfba9ce0986544a66a69 SDWebImageWebPCoder: 3dc350894112feab5375cfba9ce0986544a66a69
Sentry: a0d4563fa4ddacba31fdcc35daaa8573d87224d6 Sentry: a0d4563fa4ddacba31fdcc35daaa8573d87224d6

View File

@ -3,7 +3,7 @@
"versions": { "versions": {
"major": 4, "major": 4,
"minor": 2, "minor": 2,
"patch": 0 "patch": 1
}, },
"description": "tooot app for Mastodon", "description": "tooot app for Mastodon",
"author": "xmflsct <me@xmflsct.com>", "author": "xmflsct <me@xmflsct.com>",
@ -89,7 +89,6 @@
"react-native-safe-area-context": "^4.3.1", "react-native-safe-area-context": "^4.3.1",
"react-native-screens": "^3.15.0", "react-native-screens": "^3.15.0",
"react-native-share-menu": "^6.0.0", "react-native-share-menu": "^6.0.0",
"react-native-svg": "^12.4.4",
"react-native-swipe-list-view": "^3.2.9", "react-native-swipe-list-view": "^3.2.9",
"react-native-tab-view": "^3.1.1", "react-native-tab-view": "^3.1.1",
"react-query": "^3.39.2", "react-query": "^3.39.2",

View File

@ -18,44 +18,32 @@ const ComposeEditAttachment: React.FC<ScreenComposeStackScreenProps<
}, },
navigation navigation
}) => { }) => {
const { t } = useTranslation('screenCompose') const { t } = useTranslation('screenCompose')
const headerLeft = useCallback( return (
() => ( <KeyboardAvoidingView
<HeaderLeft behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
type='icon' style={{ flex: 1 }}
content='ChevronDown' >
onPress={() => navigation.goBack()} <SafeAreaView style={{ flex: 1 }} edges={['left', 'right', 'bottom']}>
/> <Stack.Navigator>
), <Stack.Screen
[] name='Screen-Compose-EditAttachment-Root'
) children={() => <ComposeEditAttachmentRoot index={index} />}
options={{
const children = useCallback( headerLeft: () => <HeaderLeft
() => <ComposeEditAttachmentRoot index={index} />, type='icon'
[] content='ChevronDown'
) onPress={() => navigation.goBack()}
/>,
return ( headerRight: () => <ComposeEditAttachmentSubmit index={index} />,
<KeyboardAvoidingView title: t('content.editAttachment.header.title')
behavior={Platform.OS === 'ios' ? 'padding' : 'height'} }}
style={{ flex: 1 }} />
> </Stack.Navigator>
<SafeAreaView style={{ flex: 1 }} edges={['left', 'right', 'bottom']}> </SafeAreaView>
<Stack.Navigator> </KeyboardAvoidingView>
<Stack.Screen )
name='Screen-Compose-EditAttachment-Root' }
children={children}
options={{
headerLeft,
headerRight: () => <ComposeEditAttachmentSubmit index={index} />,
title: t('content.editAttachment.header.title')
}}
/>
</Stack.Navigator>
</SafeAreaView>
</KeyboardAvoidingView>
)
}
export default ComposeEditAttachment export default ComposeEditAttachment

View File

@ -5,16 +5,14 @@ import { useTheme } from '@utils/styles/ThemeManager'
import React, { useContext } from 'react' import React, { useContext } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { Dimensions, Image, View } from 'react-native' import { Dimensions, Image, View } from 'react-native'
import { PanGestureHandler } from 'react-native-gesture-handler' import { Gesture, GestureDetector } from 'react-native-gesture-handler'
import Animated, { import Animated, {
Extrapolate, Extrapolate,
interpolate, interpolate,
runOnJS, runOnJS,
useAnimatedGestureHandler,
useAnimatedStyle, useAnimatedStyle,
useSharedValue useSharedValue
} from 'react-native-reanimated' } from 'react-native-reanimated'
import Svg, { Circle, G, Path } from 'react-native-svg'
import ComposeContext from '../utils/createContext' import ComposeContext from '../utils/createContext'
export interface Props { export interface Props {
@ -30,30 +28,19 @@ const ComposeEditAttachmentImage: React.FC<Props> = ({ index }) => {
const theAttachmentRemote = composeState.attachments.uploads[index].remote! const theAttachmentRemote = composeState.attachments.uploads[index].remote!
const theAttachmentLocal = composeState.attachments.uploads[index].local const theAttachmentLocal = composeState.attachments.uploads[index].local
const windowWidth = Dimensions.get('window').width
const imageWidthBase = const imageWidthBase =
theAttachmentRemote?.meta?.original?.aspect < 1 theAttachmentRemote?.meta?.original?.aspect < 1
? Dimensions.get('screen').width * ? windowWidth * theAttachmentRemote?.meta?.original?.aspect
theAttachmentRemote?.meta?.original?.aspect : windowWidth
: Dimensions.get('screen').width
const padding = (Dimensions.get('screen').width - imageWidthBase) / 2
const imageDimensionis = { const imageDimensionis = {
width: imageWidthBase, width: imageWidthBase,
height: height:
imageWidthBase / imageWidthBase /
((theAttachmentRemote as Mastodon.AttachmentImage)?.meta?.original ((theAttachmentRemote as Mastodon.AttachmentImage)?.meta?.original?.aspect || 1)
?.aspect || 1)
} }
const panX = useSharedValue(
(((theAttachmentRemote as Mastodon.AttachmentImage)?.meta?.focus?.x || 0) *
imageDimensionis.width) /
2
)
const panY = useSharedValue(
(((theAttachmentRemote as Mastodon.AttachmentImage)?.meta?.focus?.y || 0) *
imageDimensionis.height) /
2
)
const updateFocus = ({ x, y }: { x: number; y: number }) => { const updateFocus = ({ x, y }: { x: number; y: number }) => {
composeDispatch({ composeDispatch({
type: 'attachment/edit', type: 'attachment/edit',
@ -70,46 +57,50 @@ const ComposeEditAttachmentImage: React.FC<Props> = ({ index }) => {
}) })
} }
type PanContext = { const pan = useSharedValue({
startX: number x:
startY: number (((theAttachmentRemote as Mastodon.AttachmentImage)?.meta?.focus?.x || 0) *
} imageDimensionis.width) /
const onGestureEvent = useAnimatedGestureHandler({ 2,
onStart: (_, context: PanContext) => { y:
context.startX = panX.value (((theAttachmentRemote as Mastodon.AttachmentImage)?.meta?.focus?.y || 0) *
context.startY = panY.value imageDimensionis.height) /
}, 2
onActive: ({ translationX, translationY }, context: PanContext) => {
panX.value = context.startX + translationX
panY.value = context.startY + translationY
},
onEnd: ({ translationX, translationY }, context: PanContext) => {
runOnJS(updateFocus)({
x: (context.startX + translationX) / (imageDimensionis.width / 2),
y: (context.startY + translationY) / (imageDimensionis.height / 2)
})
}
}) })
const start = useSharedValue({ x: 0, y: 0 })
const gesture = Gesture.Pan()
.onBegin(() => {
start.value = pan.value
})
.onUpdate(e => {
pan.value = {
x: e.translationX + start.value.x,
y: e.translationY + start.value.y
}
})
.onEnd(() => {
runOnJS(updateFocus)({
x: pan.value.x / (imageDimensionis.width / 2),
y: pan.value.y / (imageDimensionis.height / 2)
})
})
.onFinalize(() => {
start.value = pan.value
})
const styleTransform = useAnimatedStyle(() => { const styleTransform = useAnimatedStyle(() => {
return { return {
transform: [ transform: [
{ {
translateX: interpolate( translateX: interpolate(
panX.value, pan.value.x,
[ [-imageDimensionis.width / 2, imageDimensionis.width / 2],
-imageDimensionis.width / 2 + padding, [-imageDimensionis.width / 2, imageDimensionis.width / 2],
imageDimensionis.width / 2 + padding
],
[
-imageDimensionis.width / 2 + padding,
imageDimensionis.width / 2 + padding
],
Extrapolate.CLAMP Extrapolate.CLAMP
) )
}, },
{ {
translateY: interpolate( translateY: interpolate(
panY.value, pan.value.y,
[-imageDimensionis.height / 2, imageDimensionis.height / 2], [-imageDimensionis.height / 2, imageDimensionis.height / 2],
[-imageDimensionis.height / 2, imageDimensionis.height / 2], [-imageDimensionis.height / 2, imageDimensionis.height / 2],
Extrapolate.CLAMP Extrapolate.CLAMP
@ -128,47 +119,41 @@ const ComposeEditAttachmentImage: React.FC<Props> = ({ index }) => {
height: imageDimensionis.height height: imageDimensionis.height
}} }}
source={{ source={{
uri: theAttachmentLocal?.uri uri: theAttachmentLocal?.uri ? theAttachmentLocal.uri : theAttachmentRemote?.preview_url
? theAttachmentLocal.uri
: theAttachmentRemote?.preview_url
}} }}
/> />
<PanGestureHandler onGestureEvent={onGestureEvent}> <GestureDetector gesture={gesture}>
<Animated.View <Animated.View
style={[ style={[
styleTransform, styleTransform,
{ {
width: windowWidth * 2,
height: imageDimensionis.height * 2,
position: 'absolute', position: 'absolute',
top: -500 + imageDimensionis.height / 2, left: -windowWidth / 2,
left: -500 + imageDimensionis.width / 2 top: -imageDimensionis.height / 2,
backgroundColor: colors.backgroundOverlayInvert,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center'
} }
]} ]}
> children={
<Svg width='1000' height='1000' viewBox='0 0 1000 1000'> <View
<G stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'> style={{
<G> width: 48,
<Path height: 48,
d='M1000,0 L1000,1000 L0,1000 L0,0 L1000,0 Z M500,475 C486.192881,475 475,486.192881 475,500 C475,513.807119 486.192881,525 500,525 C513.807119,525 525,513.807119 525,500 C525,486.192881 513.807119,475 500,475 Z' borderRadius: 24,
fill={colors.backgroundOverlayInvert} borderWidth: 2,
/> borderColor: colors.primaryOverlay,
<Circle flexDirection: 'row',
stroke={colors.primaryOverlay} alignItems: 'center',
stroke-width='2' justifyContent: 'center'
cx='500' }}
cy='500' />
r='24' }
/> />
<Circle </GestureDetector>
fill={colors.primaryOverlay}
cx='500'
cy='500'
r='2'
/>
</G>
</G>
</Svg>
</Animated.View>
</PanGestureHandler>
</View> </View>
{screenReaderEnabled ? null : ( {screenReaderEnabled ? null : (
<CustomText <CustomText

View File

@ -2,7 +2,7 @@ import CustomText from '@components/Text'
import AttachmentVideo from '@components/Timeline/Shared/Attachment/Video' import AttachmentVideo from '@components/Timeline/Shared/Attachment/Video'
import { StyleConstants } from '@utils/styles/constants' import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager' import { useTheme } from '@utils/styles/ThemeManager'
import React, { useContext, useMemo, useRef } from 'react' import React, { useContext, useRef } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { ScrollView, StyleSheet, TextInput, View } from 'react-native' import { ScrollView, StyleSheet, TextInput, View } from 'react-native'
import ComposeContext from '../utils/createContext' import ComposeContext from '../utils/createContext'
@ -18,7 +18,7 @@ const ComposeEditAttachmentRoot: React.FC<Props> = ({ index }) => {
const { composeState, composeDispatch } = useContext(ComposeContext) const { composeState, composeDispatch } = useContext(ComposeContext)
const theAttachment = composeState.attachments.uploads[index].remote! const theAttachment = composeState.attachments.uploads[index].remote!
const mediaDisplay = useMemo(() => { const mediaDisplay = () => {
if (theAttachment) { if (theAttachment) {
switch (theAttachment.type) { switch (theAttachment.type) {
case 'image': case 'image':
@ -34,10 +34,10 @@ const ComposeEditAttachmentRoot: React.FC<Props> = ({ index }) => {
video={ video={
video.local video.local
? ({ ? ({
url: video.local.uri, url: video.local.uri,
preview_url: video.local.thumbnail, preview_url: video.local.thumbnail,
blurhash: video.remote?.blurhash blurhash: video.remote?.blurhash
} as Mastodon.AttachmentVideo) } as Mastodon.AttachmentVideo)
: (video.remote as Mastodon.AttachmentVideo) : (video.remote as Mastodon.AttachmentVideo)
} }
/> />
@ -45,22 +45,13 @@ const ComposeEditAttachmentRoot: React.FC<Props> = ({ index }) => {
} }
} }
return null return null
}, []) }
const onChangeText = (e: any) =>
composeDispatch({
type: 'attachment/edit',
payload: {
...theAttachment,
description: e
}
})
const scrollViewRef = useRef<ScrollView>(null) const scrollViewRef = useRef<ScrollView>(null)
return ( return (
<ScrollView ref={scrollViewRef}> <ScrollView ref={scrollViewRef}>
{mediaDisplay} {mediaDisplay()}
<View style={{ padding: StyleConstants.Spacing.Global.PagePadding }}> <View style={{ padding: StyleConstants.Spacing.Global.PagePadding }}>
<CustomText <CustomText
fontStyle='M' fontStyle='M'
@ -86,7 +77,14 @@ const ComposeEditAttachmentRoot: React.FC<Props> = ({ index }) => {
autoCorrect={false} autoCorrect={false}
maxLength={1500} maxLength={1500}
multiline multiline
onChangeText={onChangeText} onChangeText={(e) =>
composeDispatch({
type: 'attachment/edit',
payload: {
...theAttachment,
description: e
}
})}
placeholder={t('content.editAttachment.content.altText.placeholder')} placeholder={t('content.editAttachment.content.altText.placeholder')}
placeholderTextColor={colors.secondary} placeholderTextColor={colors.secondary}
scrollEnabled scrollEnabled

View File

@ -5,12 +5,12 @@ import log from './log'
const dev = () => { const dev = () => {
if (__DEV__) { if (__DEV__) {
log('log', 'devs', 'initializing wdyr') // log('log', 'devs', 'initializing wdyr')
const whyDidYouRender = require('@welldone-software/why-did-you-render') // const whyDidYouRender = require('@welldone-software/why-did-you-render')
whyDidYouRender(React, { // whyDidYouRender(React, {
trackHooks: true, // trackHooks: true,
hotReloadBufferMs: 1000 // hotReloadBufferMs: 1000
}) // })
} }
} }

View File

@ -2916,11 +2916,6 @@ body-parser@1.19.0:
raw-body "2.4.0" raw-body "2.4.0"
type-is "~1.6.17" type-is "~1.6.17"
boolbase@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
bplist-creator@0.1.0: bplist-creator@0.1.0:
version "0.1.0" version "0.1.0"
resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e" resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e"
@ -3508,30 +3503,6 @@ crypto-random-string@^2.0.0:
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
css-select@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6"
integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==
dependencies:
boolbase "^1.0.0"
css-what "^6.1.0"
domhandler "^5.0.2"
domutils "^3.0.1"
nth-check "^2.0.1"
css-tree@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
dependencies:
mdn-data "2.0.14"
source-map "^0.6.1"
css-what@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
csstype@^3.0.2: csstype@^3.0.2:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2"
@ -3711,21 +3682,12 @@ dom-serializer@0:
domelementtype "^2.0.1" domelementtype "^2.0.1"
entities "^2.0.0" entities "^2.0.0"
dom-serializer@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53"
integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
dependencies:
domelementtype "^2.3.0"
domhandler "^5.0.2"
entities "^4.2.0"
domelementtype@1, domelementtype@^1.3.0: domelementtype@1, domelementtype@^1.3.0:
version "1.3.1" version "1.3.1"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
domelementtype@^2.0.1, domelementtype@^2.3.0: domelementtype@^2.0.1:
version "2.3.0" version "2.3.0"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
@ -3737,13 +3699,6 @@ domhandler@^2.3.0:
dependencies: dependencies:
domelementtype "1" domelementtype "1"
domhandler@^5.0.1, domhandler@^5.0.2:
version "5.0.3"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
dependencies:
domelementtype "^2.3.0"
domutils@^1.5.1: domutils@^1.5.1:
version "1.7.0" version "1.7.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
@ -3752,15 +3707,6 @@ domutils@^1.5.1:
dom-serializer "0" dom-serializer "0"
domelementtype "1" domelementtype "1"
domutils@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c"
integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==
dependencies:
dom-serializer "^2.0.0"
domelementtype "^2.3.0"
domhandler "^5.0.1"
dotenv@^16.0.1: dotenv@^16.0.1:
version "16.0.1" version "16.0.1"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d"
@ -3803,11 +3749,6 @@ entities@^2.0.0:
resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
entities@^4.2.0:
version "4.3.1"
resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.1.tgz#c34062a94c865c322f9d67b4384e4169bcede6a4"
integrity sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==
env-editor@^0.4.1: env-editor@^0.4.1:
version "0.4.2" version "0.4.2"
resolved "https://registry.yarnpkg.com/env-editor/-/env-editor-0.4.2.tgz#4e76568d0bd8f5c2b6d314a9412c8fe9aa3ae861" resolved "https://registry.yarnpkg.com/env-editor/-/env-editor-0.4.2.tgz#4e76568d0bd8f5c2b6d314a9412c8fe9aa3ae861"
@ -5835,11 +5776,6 @@ md5hex@^1.0.0:
resolved "https://registry.yarnpkg.com/md5hex/-/md5hex-1.0.0.tgz#ed74b477a2ee9369f75efee2f08d5915e52a42e8" resolved "https://registry.yarnpkg.com/md5hex/-/md5hex-1.0.0.tgz#ed74b477a2ee9369f75efee2f08d5915e52a42e8"
integrity sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ== integrity sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==
mdn-data@2.0.14:
version "2.0.14"
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
media-typer@0.3.0: media-typer@0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@ -6433,13 +6369,6 @@ npmlog@^4.1.2:
gauge "~2.7.3" gauge "~2.7.3"
set-blocking "~2.0.0" set-blocking "~2.0.0"
nth-check@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
dependencies:
boolbase "^1.0.0"
nullthrows@^1.1.1: nullthrows@^1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1"
@ -7190,14 +7119,6 @@ react-native-share-menu@^6.0.0:
resolved "https://registry.yarnpkg.com/react-native-share-menu/-/react-native-share-menu-6.0.0.tgz#0398dd4537ca1138b774fcbff9b05a88c8329cf6" resolved "https://registry.yarnpkg.com/react-native-share-menu/-/react-native-share-menu-6.0.0.tgz#0398dd4537ca1138b774fcbff9b05a88c8329cf6"
integrity sha512-KdmRnqjI/B2MigSxGmhbYJ3WMJxKXj+0c47ANcVZ/PTzc2vtz6d1r4KQJgkBImXgNC+vowpuD2UGdPllxadr2A== integrity sha512-KdmRnqjI/B2MigSxGmhbYJ3WMJxKXj+0c47ANcVZ/PTzc2vtz6d1r4KQJgkBImXgNC+vowpuD2UGdPllxadr2A==
react-native-svg@^12.4.4:
version "12.4.4"
resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-12.4.4.tgz#2ba684eaea9a7402fbbe0ed9737e77284631d00e"
integrity sha512-LpcNlEVCURexqPAvQ9ne8KrPVfYz0wIDygwud8VMRmXLezysXzyQN/DTsjm1BO9lIfYp55WQsr3u3yW/vk6iiA==
dependencies:
css-select "^5.1.0"
css-tree "^1.1.3"
react-native-swipe-list-view@^3.2.9: react-native-swipe-list-view@^3.2.9:
version "3.2.9" version "3.2.9"
resolved "https://registry.yarnpkg.com/react-native-swipe-list-view/-/react-native-swipe-list-view-3.2.9.tgz#d725c7cdf481dd5df12a00dbfe0120013b5f2e59" resolved "https://registry.yarnpkg.com/react-native-swipe-list-view/-/react-native-swipe-list-view-3.2.9.tgz#d725c7cdf481dd5df12a00dbfe0120013b5f2e59"
@ -7907,7 +7828,7 @@ source-map@^0.5.6:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: source-map@^0.6.0, source-map@~0.6.1:
version "0.6.1" version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==