diff --git a/__mocks__/react-native-iphone-x-helper.ts b/__mocks__/react-native-iphone-x-helper.ts index 73676f7..e603dfb 100644 --- a/__mocks__/react-native-iphone-x-helper.ts +++ b/__mocks__/react-native-iphone-x-helper.ts @@ -1,4 +1,5 @@ jest.mock('react-native-iphone-x-helper', () => ({ getStatusBarHeight: jest.fn(), - isIphoneX: () => true + ifIphoneX: jest.fn(), + isIphoneX: jest.fn() })) diff --git a/__mocks__/react-native-ultimate-config.ts b/__mocks__/react-native-ultimate-config.ts new file mode 100644 index 0000000..b479643 --- /dev/null +++ b/__mocks__/react-native-ultimate-config.ts @@ -0,0 +1,3 @@ +jest.mock("react-native-ultimate-config", () => ({ + +})) \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 2ced5de..caebac0 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -184,7 +184,7 @@ PODS: - GoogleUtilities/Logger - GoogleUtilities/UserDefaults (6.7.2): - GoogleUtilities/Logger - - Intercom (7.1.2) + - Intercom (7.1.3) - JKBigInteger2 (0.0.5) - libwebp (1.1.0): - libwebp/demux (= 1.1.0) @@ -880,7 +880,7 @@ SPEC CHECKSUMS: GoogleDataTransport: 9a8a16f79feffc7f42096743de2a7c4815e84020 GoogleDataTransportCCTSupport: 0f39025e8cf51f168711bd3fb773938d7e62ddb5 GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3 - Intercom: ce4923a73543fe70c805635846b6dadf03b0b847 + Intercom: e44b10bbc38ccf6494c76f9bee4e2e3d7d007153 JKBigInteger2: e91672035c42328c48b7dd015b66812ddf40ca9b libwebp: 946cb3063cea9236285f7e9a8505d806d30e07f3 nanopb: 18003b5e52dab79db540fe93fe9579f399bd1ccd @@ -958,4 +958,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 7bde1e2e4860e9ae214605a1416d0954a9c0af97 -COCOAPODS: 1.9.3 +COCOAPODS: 1.9.1 diff --git a/src/API.ts b/src/API.ts index 10bdd1c..f474649 100644 --- a/src/API.ts +++ b/src/API.ts @@ -299,8 +299,7 @@ export type CreateLikedContentInput = { id?: string | null, name?: string | null, type?: string | null, - slug?: string | null, - cover?: string | null, + slug: string, excerpt?: string | null, }; @@ -309,7 +308,6 @@ export type UpdateLikedContentInput = { name?: string | null, type?: string | null, slug?: string | null, - cover?: string | null, excerpt?: string | null, }; @@ -317,6 +315,24 @@ export type DeleteLikedContentInput = { id?: string | null, }; +export type CreateNightRatingInput = { + id?: string | null, + userId: string, + rating: number, + date: string, +}; + +export type UpdateNightRatingInput = { + id: string, + userId?: string | null, + rating?: number | null, + date?: string | null, +}; + +export type DeleteNightRatingInput = { + id?: string | null, +}; + export type ModelRequestFilterInput = { id?: ModelIDFilterInput | null, requesterName?: ModelStringFilterInput | null, @@ -354,19 +370,38 @@ export type ModelLikedContentFilterInput = { name?: ModelStringFilterInput | null, type?: ModelStringFilterInput | null, slug?: ModelStringFilterInput | null, - cover?: ModelStringFilterInput | null, excerpt?: ModelStringFilterInput | null, and?: Array< ModelLikedContentFilterInput | null > | null, or?: Array< ModelLikedContentFilterInput | null > | null, not?: ModelLikedContentFilterInput | null, }; +export type ModelNightRatingFilterInput = { + id?: ModelIDFilterInput | null, + userId?: ModelIDFilterInput | null, + rating?: ModelIntFilterInput | null, + date?: ModelStringFilterInput | null, + and?: Array< ModelNightRatingFilterInput | null > | null, + or?: Array< ModelNightRatingFilterInput | null > | null, + not?: ModelNightRatingFilterInput | null, +}; + export enum ModelSortDirection { ASC = "ASC", DESC = "DESC", } +export type ModelStringKeyConditionInput = { + eq?: string | null, + le?: string | null, + lt?: string | null, + ge?: string | null, + gt?: string | null, + between?: Array< string | null > | null, + beginsWith?: string | null, +}; + export type UpdateConnectionIDMutationVariables = { input: UpdateUserInput, }; @@ -1036,8 +1071,7 @@ export type CreateLikedContentMutation = { id: string | null, name: string | null, type: string | null, - slug: string | null, - cover: string | null, + slug: string, excerpt: string | null, owner: string | null, } | null, @@ -1053,8 +1087,7 @@ export type UpdateLikedContentMutation = { id: string | null, name: string | null, type: string | null, - slug: string | null, - cover: string | null, + slug: string, excerpt: string | null, owner: string | null, } | null, @@ -1070,13 +1103,84 @@ export type DeleteLikedContentMutation = { id: string | null, name: string | null, type: string | null, - slug: string | null, - cover: string | null, + slug: string, excerpt: string | null, owner: string | null, } | null, }; +export type CreateNightRatingMutationVariables = { + input: CreateNightRatingInput, +}; + +export type CreateNightRatingMutation = { + createNightRating: { + __typename: "NightRating", + id: string, + userId: string, + user: { + __typename: "User", + connectionId: string | null, + id: string, + email: string, + nickname: string | null, + darkMode: boolean | null, + intercomId: string | null, + }, + rating: number, + date: string, + owner: string | null, + } | null, +}; + +export type UpdateNightRatingMutationVariables = { + input: UpdateNightRatingInput, +}; + +export type UpdateNightRatingMutation = { + updateNightRating: { + __typename: "NightRating", + id: string, + userId: string, + user: { + __typename: "User", + connectionId: string | null, + id: string, + email: string, + nickname: string | null, + darkMode: boolean | null, + intercomId: string | null, + }, + rating: number, + date: string, + owner: string | null, + } | null, +}; + +export type DeleteNightRatingMutationVariables = { + input: DeleteNightRatingInput, +}; + +export type DeleteNightRatingMutation = { + deleteNightRating: { + __typename: "NightRating", + id: string, + userId: string, + user: { + __typename: "User", + connectionId: string | null, + id: string, + email: string, + nickname: string | null, + darkMode: boolean | null, + intercomId: string | null, + }, + rating: number, + date: string, + owner: string | null, + } | null, +}; + export type GetSleepDataQueryVariables = { id: string, }; @@ -1391,8 +1495,7 @@ export type GetLikedContentQuery = { id: string | null, name: string | null, type: string | null, - slug: string | null, - cover: string | null, + slug: string, excerpt: string | null, owner: string | null, } | null, @@ -1412,8 +1515,7 @@ export type ListLikedContentsQuery = { id: string | null, name: string | null, type: string | null, - slug: string | null, - cover: string | null, + slug: string, excerpt: string | null, owner: string | null, } | null > | null, @@ -1421,6 +1523,51 @@ export type ListLikedContentsQuery = { } | null, }; +export type GetNightRatingQueryVariables = { + id: string, +}; + +export type GetNightRatingQuery = { + getNightRating: { + __typename: "NightRating", + id: string, + userId: string, + user: { + __typename: "User", + connectionId: string | null, + id: string, + email: string, + nickname: string | null, + darkMode: boolean | null, + intercomId: string | null, + }, + rating: number, + date: string, + owner: string | null, + } | null, +}; + +export type ListNightRatingsQueryVariables = { + filter?: ModelNightRatingFilterInput | null, + limit?: number | null, + nextToken?: string | null, +}; + +export type ListNightRatingsQuery = { + listNightRatings: { + __typename: "ModelNightRatingConnection", + items: Array< { + __typename: "NightRating", + id: string, + userId: string, + rating: number, + date: string, + owner: string | null, + } | null > | null, + nextToken: string | null, + } | null, +}; + export type UserByConnectionIdQueryVariables = { connectionId?: string | null, sortDirection?: ModelSortDirection | null, @@ -1471,6 +1618,31 @@ export type CoachingByUserQuery = { } | null, }; +export type LikedContentBySlugQueryVariables = { + slug?: string | null, + id?: ModelStringKeyConditionInput | null, + sortDirection?: ModelSortDirection | null, + filter?: ModelLikedContentFilterInput | null, + limit?: number | null, + nextToken?: string | null, +}; + +export type LikedContentBySlugQuery = { + likedContentBySlug: { + __typename: "ModelLikedContentConnection", + items: Array< { + __typename: "LikedContent", + id: string | null, + name: string | null, + type: string | null, + slug: string, + excerpt: string | null, + owner: string | null, + } | null > | null, + nextToken: string | null, + } | null, +}; + export type OnCreateSleepDataSubscriptionVariables = { owner: string, }; @@ -1963,8 +2135,7 @@ export type OnCreateLikedContentSubscription = { id: string | null, name: string | null, type: string | null, - slug: string | null, - cover: string | null, + slug: string, excerpt: string | null, owner: string | null, } | null, @@ -1980,8 +2151,7 @@ export type OnUpdateLikedContentSubscription = { id: string | null, name: string | null, type: string | null, - slug: string | null, - cover: string | null, + slug: string, excerpt: string | null, owner: string | null, } | null, @@ -1997,9 +2167,80 @@ export type OnDeleteLikedContentSubscription = { id: string | null, name: string | null, type: string | null, - slug: string | null, - cover: string | null, + slug: string, excerpt: string | null, owner: string | null, } | null, }; + +export type OnCreateNightRatingSubscriptionVariables = { + owner: string, +}; + +export type OnCreateNightRatingSubscription = { + onCreateNightRating: { + __typename: "NightRating", + id: string, + userId: string, + user: { + __typename: "User", + connectionId: string | null, + id: string, + email: string, + nickname: string | null, + darkMode: boolean | null, + intercomId: string | null, + }, + rating: number, + date: string, + owner: string | null, + } | null, +}; + +export type OnUpdateNightRatingSubscriptionVariables = { + owner: string, +}; + +export type OnUpdateNightRatingSubscription = { + onUpdateNightRating: { + __typename: "NightRating", + id: string, + userId: string, + user: { + __typename: "User", + connectionId: string | null, + id: string, + email: string, + nickname: string | null, + darkMode: boolean | null, + intercomId: string | null, + }, + rating: number, + date: string, + owner: string | null, + } | null, +}; + +export type OnDeleteNightRatingSubscriptionVariables = { + owner?: string | null, +}; + +export type OnDeleteNightRatingSubscription = { + onDeleteNightRating: { + __typename: "NightRating", + id: string, + userId: string, + user: { + __typename: "User", + connectionId: string | null, + id: string, + email: string, + nickname: string | null, + darkMode: boolean | null, + intercomId: string | null, + }, + rating: number, + date: string, + owner: string | null, + } | null, +}; diff --git a/src/Types/ModalState.ts b/src/Types/ModalState.ts index 43e0b0f..ee8dc04 100644 --- a/src/Types/ModalState.ts +++ b/src/Types/ModalState.ts @@ -4,4 +4,5 @@ export interface ModalState { newHabitModal: boolean editHabitModal: boolean explanationsModal: boolean + ratingDate?: string } diff --git a/src/Types/Sleep/NightQuality.ts b/src/Types/Sleep/NightQuality.ts new file mode 100644 index 0000000..b28b539 --- /dev/null +++ b/src/Types/Sleep/NightQuality.ts @@ -0,0 +1,9 @@ +export interface NightQualityState { + records: Map +} + +export interface NightQuality { + id: string + rating: number // 1 - sad, 2 - nothing new, 3 - smirk, 4 - happy + date: string +} diff --git a/src/Types/State.ts b/src/Types/State.ts index a4b417a..38e95b3 100644 --- a/src/Types/State.ts +++ b/src/Types/State.ts @@ -31,6 +31,7 @@ import { TrackingState, TrackingState } from './TrackingState' import { UserState, UserState } from './UserState' import { InsightState } from './State/insight-state' +import { NightQualityState } from './Sleep/NightQuality' export interface State { // User @@ -53,6 +54,7 @@ export interface State { calendar: CalendarState sleepclock: SleepClockState sleepscore: any + nightQuality: NightQualityState // heartRate: any; tracking: TrackingState manualData: ManualDataState diff --git a/src/components/Buttons/RatingButton.tsx b/src/components/Buttons/RatingButton.tsx index 6b72566..c7b01e7 100644 --- a/src/components/Buttons/RatingButton.tsx +++ b/src/components/Buttons/RatingButton.tsx @@ -1,11 +1,14 @@ import React, { FC } from 'react' -import { useDispatch } from 'react-redux' +import { useDispatch, useSelector } from 'react-redux' import styled from 'styled-components/native' import { rateDay } from '@actions/sleep/sleep-data-actions' import { fonts } from '../../styles/themes' import IconBold from '../iconBold' import TranslatedText from '../TranslatedText' import ScalingButton from './ScalingButton' +import { rateNight } from 'store/actions/sleep/night-quality-actions' +import { NightQuality } from 'Types/Sleep/NightQuality' +import { getRatingDate } from 'store/Selectors/ModalSelectors' type Props = { selected: boolean @@ -15,11 +18,13 @@ type Props = { color: string } -const RatingButton: FC = ({ selected, value, title, icon, color }) => { +const RatingButton: FC = ({ value, title, icon, color }) => { const dispatch = useDispatch() + const ratingDate = useSelector(getRatingDate) const handlePress = () => { dispatch(rateDay(value)) + dispatch(rateNight({ rating: value, date: ratingDate })) } return ( diff --git a/src/components/Charts/SleepChart.tsx b/src/components/Charts/SleepChart.tsx index 94fb3d3..fc607c3 100644 --- a/src/components/Charts/SleepChart.tsx +++ b/src/components/Charts/SleepChart.tsx @@ -57,7 +57,9 @@ const SleepTimeChart: FC = () => { ) ) as number ] - const scaleX = scaleTime().domain(xDomain).range([paddingLeft, chartWidth]) + const scaleX = scaleTime() + .domain(xDomain) + .range([paddingLeft, chartWidth - paddingRight]) const scaleY = scaleTime() .domain(yDomain) @@ -152,6 +154,7 @@ type NormalizedDay = Day & { const normalizeSleepData = (days: Day[]): NormalizedDay[] => { const normalized = days.map((day) => { + day.night = day.night ? day.night : [] // Some nights return as undefined const normalizedNights = day.night.map((night) => { const trueDate = moment(day.date) diff --git a/src/components/Charts/SleepTimeChart/XTicks.tsx b/src/components/Charts/SleepTimeChart/XTicks.tsx index ff44eec..d8a623c 100644 --- a/src/components/Charts/SleepTimeChart/XTicks.tsx +++ b/src/components/Charts/SleepTimeChart/XTicks.tsx @@ -1,9 +1,11 @@ import { ScaleTime } from 'd3' import moment from 'moment' +import { View } from 'react-native' import React, { memo, FC } from 'react' import { G, Text } from 'react-native-svg' import styled from 'styled-components/native' import { fonts } from '../../../styles/themes' +import NightRating from 'components/clock/NightRating' type Props = { scaleX: ScaleTime @@ -15,6 +17,7 @@ type Props = { const XTicks: FC = ({ scaleX, chartHeight, barWidth, ticks }) => { const tickElements = ticks.map((tick) => { const x = scaleX(tick) + barWidth / 2 + const date = moment(tick).toISOString() return ( @@ -22,7 +25,7 @@ const XTicks: FC = ({ scaleX, chartHeight, barWidth, ticks }) => { fontFamily={fonts.medium} textAnchor="middle" x={x} - y={chartHeight - 5}> + y={chartHeight - 35}> {moment(tick).format('ddd')} = ({ scaleX, chartHeight, barWidth, ticks }) => { fontWeight="bold" textAnchor="middle" x={x} - y={chartHeight - 20}> + y={chartHeight - 50}> {moment(tick).format('DD')} + + + + ) }) @@ -48,4 +58,24 @@ const LongDate = styled(Text).attrs(({ theme }) => ({ fill: theme.PRIMARY_TEXT_COLOR }))`` +interface RatingIconContainerProps { + x: number + y: number + children: React.ReactNode + barWidth: number +} + +const RatingIconContainer = (props: RatingIconContainerProps) => ( + + {props.children} + +) + export default memo(XTicks) diff --git a/src/components/Clock.tsx b/src/components/Clock.tsx index e488ba5..8a2aea5 100644 --- a/src/components/Clock.tsx +++ b/src/components/Clock.tsx @@ -102,7 +102,9 @@ const Clock: FC = () => { /> )} - + + + {editMode && ( ` + justify-content: center; + align-items: center; + position: absolute; + top: 90px; + right: ${({ x }) => x - 5}px; + z-index: 20; +` diff --git a/src/components/DayStrip.tsx b/src/components/DayStrip.tsx index 076e7f3..0d76d23 100644 --- a/src/components/DayStrip.tsx +++ b/src/components/DayStrip.tsx @@ -9,34 +9,48 @@ import { Day } from 'Types/Sleepdata' import { WIDTH } from '@helpers/Dimensions' import keyExtractor from '@helpers/KeyExtractor' import { fonts, StyleProps } from '../styles/themes' +import NightRating from './clock/NightRating' const dayWidth = WIDTH / 7 +const spacerHeight = 7 const cardMargin = 5 const DayStrip: FC = () => { const days = useSelector(getAllDays) const dispatch = useDispatch() const { date } = useSelector(getSelectedDay) + const renderItem = ({ item }: { item: Day }) => { const isToday = moment(item.date).isSame(new Date(), 'day') - const handleOnPress = () => { dispatch(setSelectedDay(item.date)) } return ( - - - {moment(item.date).format('ddd')} - - - {moment(item.date).format('DD.MM.')} - - + + + + {moment(item.date).format('ddd')} + + + {moment(item.date).format('DD.MM.')} + + + + + + + + ) } @@ -63,10 +77,14 @@ const DayStrip: FC = () => { export default DayStrip +const Container = styled.View` + flex-direction: column; +` + const Segments = styled(FlatList)` width: ${WIDTH}px; - height: ${dayWidth + 30}px; margin: 20px 0px; + padding: 10px 0px; ` interface SegmentProps extends StyleProps { @@ -89,6 +107,13 @@ const Segment = styled.TouchableOpacity` : props.theme.PRIMARY_BACKGROUND_COLOR}; ` +const RatingSegment = styled.View` + width: ${dayWidth}px; + flex-direction: column; + justify-content: center; + align-items: center; +` + const DateText = styled.Text` font-size: 12px; color: ${(props: SegmentProps) => @@ -110,3 +135,7 @@ const DateNumber = styled.Text` ? props.theme.PRIMARY_BACKGROUND_COLOR : props.theme.SECONDARY_TEXT_COLOR}; ` + +const Spacer = styled.View` + height: ${spacerHeight}px; +` diff --git a/src/components/IAPComponents/PerkList.spec.tsx b/src/components/IAPComponents/PerkList.spec.tsx index de8d729..2d1c13c 100644 --- a/src/components/IAPComponents/PerkList.spec.tsx +++ b/src/components/IAPComponents/PerkList.spec.tsx @@ -3,6 +3,12 @@ import React from 'react' import { matchComponentToSnapshot } from '@helpers/snapshot' import PerkList from './PerkList' +jest.mock('react-native-iphone-x-helper', () => ({ + getStatusBarHeight: jest.fn(), + ifIphoneX: jest.fn(), + isIphoneX: jest.fn() +})) + describe('', () => { it('it renders correctly', () => { matchComponentToSnapshot() diff --git a/src/components/SettingsSpecific/__tests__/SettingRow.spec.tsx b/src/components/SettingsSpecific/__tests__/SettingRow.spec.tsx index cd1284d..70da96d 100644 --- a/src/components/SettingsSpecific/__tests__/SettingRow.spec.tsx +++ b/src/components/SettingsSpecific/__tests__/SettingRow.spec.tsx @@ -4,6 +4,11 @@ import React from 'react' import { matchComponentToSnapshot } from '@helpers/snapshot' import SettingRow from '../settingRow' +jest.mock('react-native-iphone-x-helper', () => ({ + getStatusBarHeight: jest.fn(), + isIphoneX: () => true +})) + describe('', () => { it('should render correctly', () => { matchComponentToSnapshot( diff --git a/src/components/SettingsSpecific/__tests__/VersionInformation.test.tsx b/src/components/SettingsSpecific/__tests__/VersionInformation.test.tsx index 4ba6345..18f53a1 100644 --- a/src/components/SettingsSpecific/__tests__/VersionInformation.test.tsx +++ b/src/components/SettingsSpecific/__tests__/VersionInformation.test.tsx @@ -15,6 +15,11 @@ jest.mock('react-native-device-info', () => ({ getDevice: jest.fn() })) +jest.mock('react-native-iphone-x-helper', () => ({ + getStatusBarHeight: jest.fn(), + isIphoneX: () => true +})) + describe('', () => { it('Should render correctly', () => { matchComponentToSnapshot() diff --git a/src/components/__tests__/SvgIcon.test.tsx b/src/components/__tests__/SvgIcon.test.tsx index 00b7c9b..9e0dd19 100644 --- a/src/components/__tests__/SvgIcon.test.tsx +++ b/src/components/__tests__/SvgIcon.test.tsx @@ -3,6 +3,13 @@ import * as React from 'react' import SvgIcon from '../SvgIcon' import { matchComponentToSnapshot } from '@helpers/snapshot' +jest.mock('react-native-iphone-x-helper', () => ({ + getStatusBarHeight: jest.fn(), + ifIphoneX: jest.fn(), + isIphoneX: jest.fn() +})) + + describe('', () => { it('it renders correctly', () => { matchComponentToSnapshot( diff --git a/src/components/__tests__/TranslatedText.test.tsx b/src/components/__tests__/TranslatedText.test.tsx index 3105e08..5ad9577 100644 --- a/src/components/__tests__/TranslatedText.test.tsx +++ b/src/components/__tests__/TranslatedText.test.tsx @@ -8,6 +8,11 @@ jest.mock('moment', () => ({ locale: () => {} })) +jest.mock('react-native-iphone-x-helper', () => ({ + getStatusBarHeight: jest.fn(), + isIphoneX: () => true +})) + describe('', () => { it('it renders correctly', () => { matchComponentToSnapshot( diff --git a/src/components/clock/NightRating.tsx b/src/components/clock/NightRating.tsx index 9be5c75..ed5130c 100644 --- a/src/components/clock/NightRating.tsx +++ b/src/components/clock/NightRating.tsx @@ -1,29 +1,43 @@ -import React, { FC, memo } from 'react' -import { useDispatch } from 'react-redux' +import React, { FC, memo, useMemo } from 'react' +import { useDispatch, useSelector } from 'react-redux' import styled from 'styled-components/native' -import { toggleRatingModal } from '@actions/modal/modal-actions' +import { + toggleRatingModal, + updateRatingDate +} from '@actions/modal/modal-actions' import getRating from '@helpers/rating' -import { Day } from 'Types/Sleepdata' import ScalingButton from '../Buttons/ScalingButton' import { IconBold } from '../iconRegular' +import { makeGetRatingOnDate } from 'store/Selectors/night-quality-selectors/night-quality-selector' +import { State } from 'Types/State' type Props = { - day: Day - x: number + date: string + height: number + width: number + unClickable?: boolean } -const NightRating: FC = ({ day: { rating = 0 }, x }) => { - const { icon, color } = getRating(rating) +const NightRating: FC = ({ date, unClickable, height, width }) => { + const getRatingOnDate = useMemo(makeGetRatingOnDate, []) + const ratingDate = useSelector((state: State) => + getRatingOnDate(state, { date }) + ) + const { icon, color } = getRating(ratingDate?.rating) const dispatch = useDispatch() const openModal = () => { + dispatch(updateRatingDate(date)) dispatch(toggleRatingModal()) } return ( - - + + - + @@ -32,16 +46,7 @@ const NightRating: FC = ({ day: { rating = 0 }, x }) => { export default memo(NightRating) -type ContainerProps = { - readonly x: number -} - -const Container = styled.View` - position: absolute; - top: 90px; - right: ${({ x }) => x - 5}px; - z-index: 20; -` +const Container = styled.View`` interface RatingButtonProps { readonly color?: string } diff --git a/src/graphql/mutations.ts b/src/graphql/mutations.ts index e437bab..27666c3 100644 --- a/src/graphql/mutations.ts +++ b/src/graphql/mutations.ts @@ -1,4 +1,5 @@ // tslint:disable +// eslint-disable // this is an auto generated file. This will be overwritten export const createSleepData = /* GraphQL */ ` @@ -26,7 +27,7 @@ export const createSleepData = /* GraphQL */ ` owner } } -` +`; export const updateSleepData = /* GraphQL */ ` mutation UpdateSleepData($input: UpdateSleepDataInput!) { updateSleepData(input: $input) { @@ -52,7 +53,7 @@ export const updateSleepData = /* GraphQL */ ` owner } } -` +`; export const deleteSleepData = /* GraphQL */ ` mutation DeleteSleepData($input: DeleteSleepDataInput!) { deleteSleepData(input: $input) { @@ -78,7 +79,7 @@ export const deleteSleepData = /* GraphQL */ ` owner } } -` +`; export const createRequest = /* GraphQL */ ` mutation CreateRequest($input: CreateRequestInput!) { createRequest(input: $input) { @@ -90,7 +91,7 @@ export const createRequest = /* GraphQL */ ` accepted } } -` +`; export const updateRequest = /* GraphQL */ ` mutation UpdateRequest($input: UpdateRequestInput!) { updateRequest(input: $input) { @@ -102,7 +103,7 @@ export const updateRequest = /* GraphQL */ ` accepted } } -` +`; export const deleteRequest = /* GraphQL */ ` mutation DeleteRequest($input: DeleteRequestInput!) { deleteRequest(input: $input) { @@ -114,7 +115,7 @@ export const deleteRequest = /* GraphQL */ ` accepted } } -` +`; export const createUser = /* GraphQL */ ` mutation CreateUser($input: CreateUserInput!) { createUser(input: $input) { @@ -126,7 +127,7 @@ export const createUser = /* GraphQL */ ` intercomId } } -` +`; export const updateUser = /* GraphQL */ ` mutation UpdateUser($input: UpdateUserInput!) { updateUser(input: $input) { @@ -138,7 +139,7 @@ export const updateUser = /* GraphQL */ ` intercomId } } -` +`; export const deleteUser = /* GraphQL */ ` mutation DeleteUser($input: DeleteUserInput!) { deleteUser(input: $input) { @@ -150,7 +151,7 @@ export const deleteUser = /* GraphQL */ ` intercomId } } -` +`; export const createCoachingData = /* GraphQL */ ` mutation CreateCoachingData($input: CreateCoachingDataInput!) { createCoachingData(input: $input) { @@ -178,7 +179,7 @@ export const createCoachingData = /* GraphQL */ ` owner } } -` +`; export const updateCoachingData = /* GraphQL */ ` mutation UpdateCoachingData($input: UpdateCoachingDataInput!) { updateCoachingData(input: $input) { @@ -206,7 +207,7 @@ export const updateCoachingData = /* GraphQL */ ` owner } } -` +`; export const deleteCoachingData = /* GraphQL */ ` mutation DeleteCoachingData($input: DeleteCoachingDataInput!) { deleteCoachingData(input: $input) { @@ -234,7 +235,7 @@ export const deleteCoachingData = /* GraphQL */ ` owner } } -` +`; export const createHabit = /* GraphQL */ ` mutation CreateHabit($input: CreateHabitInput!) { createHabit(input: $input) { @@ -263,7 +264,7 @@ export const createHabit = /* GraphQL */ ` owner } } -` +`; export const updateHabit = /* GraphQL */ ` mutation UpdateHabit($input: UpdateHabitInput!) { updateHabit(input: $input) { @@ -292,7 +293,7 @@ export const updateHabit = /* GraphQL */ ` owner } } -` +`; export const deleteHabit = /* GraphQL */ ` mutation DeleteHabit($input: DeleteHabitInput!) { deleteHabit(input: $input) { @@ -321,7 +322,7 @@ export const deleteHabit = /* GraphQL */ ` owner } } -` +`; export const createNight = /* GraphQL */ ` mutation CreateNight($input: CreateNightInput!) { createNight(input: $input) { @@ -345,7 +346,7 @@ export const createNight = /* GraphQL */ ` owner } } -` +`; export const updateNight = /* GraphQL */ ` mutation UpdateNight($input: UpdateNightInput!) { updateNight(input: $input) { @@ -369,7 +370,7 @@ export const updateNight = /* GraphQL */ ` owner } } -` +`; export const deleteNight = /* GraphQL */ ` mutation DeleteNight($input: DeleteNightInput!) { deleteNight(input: $input) { @@ -393,7 +394,7 @@ export const deleteNight = /* GraphQL */ ` owner } } -` +`; export const createLikedContent = /* GraphQL */ ` mutation CreateLikedContent($input: CreateLikedContentInput!) { createLikedContent(input: $input) { @@ -401,12 +402,11 @@ export const createLikedContent = /* GraphQL */ ` name type slug - cover excerpt owner } } -` +`; export const updateLikedContent = /* GraphQL */ ` mutation UpdateLikedContent($input: UpdateLikedContentInput!) { updateLikedContent(input: $input) { @@ -414,12 +414,11 @@ export const updateLikedContent = /* GraphQL */ ` name type slug - cover excerpt owner } } -` +`; export const deleteLikedContent = /* GraphQL */ ` mutation DeleteLikedContent($input: DeleteLikedContentInput!) { deleteLikedContent(input: $input) { @@ -427,9 +426,65 @@ export const deleteLikedContent = /* GraphQL */ ` name type slug - cover excerpt owner } } -` +`; +export const createNightRating = /* GraphQL */ ` + mutation CreateNightRating($input: CreateNightRatingInput!) { + createNightRating(input: $input) { + id + userId + user { + connectionId + id + email + nickname + darkMode + intercomId + } + rating + date + owner + } + } +`; +export const updateNightRating = /* GraphQL */ ` + mutation UpdateNightRating($input: UpdateNightRatingInput!) { + updateNightRating(input: $input) { + id + userId + user { + connectionId + id + email + nickname + darkMode + intercomId + } + rating + date + owner + } + } +`; +export const deleteNightRating = /* GraphQL */ ` + mutation DeleteNightRating($input: DeleteNightRatingInput!) { + deleteNightRating(input: $input) { + id + userId + user { + connectionId + id + email + nickname + darkMode + intercomId + } + rating + date + owner + } + } +`; diff --git a/src/graphql/queries.ts b/src/graphql/queries.ts index 6119b72..169b68e 100644 --- a/src/graphql/queries.ts +++ b/src/graphql/queries.ts @@ -1,4 +1,5 @@ // tslint:disable +// eslint-disable // this is an auto generated file. This will be overwritten export const getSleepData = /* GraphQL */ ` @@ -26,7 +27,7 @@ export const getSleepData = /* GraphQL */ ` owner } } -` +`; export const listSleepDatas = /* GraphQL */ ` query ListSleepDatas( $filter: ModelSleepDataFilterInput @@ -44,7 +45,7 @@ export const listSleepDatas = /* GraphQL */ ` nextToken } } -` +`; export const getRequest = /* GraphQL */ ` query GetRequest($id: ID!) { getRequest(id: $id) { @@ -56,7 +57,7 @@ export const getRequest = /* GraphQL */ ` accepted } } -` +`; export const listRequests = /* GraphQL */ ` query ListRequests( $filter: ModelRequestFilterInput @@ -75,7 +76,7 @@ export const listRequests = /* GraphQL */ ` nextToken } } -` +`; export const getUser = /* GraphQL */ ` query GetUser($id: ID!) { getUser(id: $id) { @@ -87,7 +88,7 @@ export const getUser = /* GraphQL */ ` intercomId } } -` +`; export const listUsers = /* GraphQL */ ` query ListUsers( $filter: ModelUserFilterInput @@ -106,7 +107,7 @@ export const listUsers = /* GraphQL */ ` nextToken } } -` +`; export const getCoachingData = /* GraphQL */ ` query GetCoachingData($id: ID!) { getCoachingData(id: $id) { @@ -134,7 +135,7 @@ export const getCoachingData = /* GraphQL */ ` owner } } -` +`; export const listCoachingDatas = /* GraphQL */ ` query ListCoachingDatas( $filter: ModelCoachingDataFilterInput @@ -155,7 +156,7 @@ export const listCoachingDatas = /* GraphQL */ ` nextToken } } -` +`; export const getHabit = /* GraphQL */ ` query GetHabit($id: ID!) { getHabit(id: $id) { @@ -184,7 +185,7 @@ export const getHabit = /* GraphQL */ ` owner } } -` +`; export const listHabits = /* GraphQL */ ` query ListHabits( $filter: ModelHabitFilterInput @@ -208,7 +209,7 @@ export const listHabits = /* GraphQL */ ` nextToken } } -` +`; export const getNight = /* GraphQL */ ` query GetNight($id: ID!) { getNight(id: $id) { @@ -232,7 +233,7 @@ export const getNight = /* GraphQL */ ` owner } } -` +`; export const listNights = /* GraphQL */ ` query ListNights( $filter: ModelNightFilterInput @@ -255,7 +256,7 @@ export const listNights = /* GraphQL */ ` nextToken } } -` +`; export const getLikedContent = /* GraphQL */ ` query GetLikedContent($id: ID!) { getLikedContent(id: $id) { @@ -263,12 +264,11 @@ export const getLikedContent = /* GraphQL */ ` name type slug - cover excerpt owner } } -` +`; export const listLikedContents = /* GraphQL */ ` query ListLikedContents( $filter: ModelLikedContentFilterInput @@ -281,14 +281,50 @@ export const listLikedContents = /* GraphQL */ ` name type slug - cover excerpt owner } nextToken } } -` +`; +export const getNightRating = /* GraphQL */ ` + query GetNightRating($id: ID!) { + getNightRating(id: $id) { + id + userId + user { + connectionId + id + email + nickname + darkMode + intercomId + } + rating + date + owner + } + } +`; +export const listNightRatings = /* GraphQL */ ` + query ListNightRatings( + $filter: ModelNightRatingFilterInput + $limit: Int + $nextToken: String + ) { + listNightRatings(filter: $filter, limit: $limit, nextToken: $nextToken) { + items { + id + userId + rating + date + owner + } + nextToken + } + } +`; export const userByConnectionId = /* GraphQL */ ` query UserByConnectionId( $connectionId: String @@ -315,7 +351,7 @@ export const userByConnectionId = /* GraphQL */ ` nextToken } } -` +`; export const coachingByUser = /* GraphQL */ ` query CoachingByUser( $userId: ID @@ -344,4 +380,33 @@ export const coachingByUser = /* GraphQL */ ` nextToken } } -` +`; +export const likedContentBySlug = /* GraphQL */ ` + query LikedContentBySlug( + $slug: String + $id: ModelStringKeyConditionInput + $sortDirection: ModelSortDirection + $filter: ModelLikedContentFilterInput + $limit: Int + $nextToken: String + ) { + likedContentBySlug( + slug: $slug + id: $id + sortDirection: $sortDirection + filter: $filter + limit: $limit + nextToken: $nextToken + ) { + items { + id + name + type + slug + excerpt + owner + } + nextToken + } + } +`; diff --git a/src/graphql/subscriptions.ts b/src/graphql/subscriptions.ts index 2d5203c..b5f2a71 100644 --- a/src/graphql/subscriptions.ts +++ b/src/graphql/subscriptions.ts @@ -1,4 +1,5 @@ // tslint:disable +// eslint-disable // this is an auto generated file. This will be overwritten export const onCreateSleepData = /* GraphQL */ ` @@ -26,7 +27,7 @@ export const onCreateSleepData = /* GraphQL */ ` owner } } -` +`; export const onUpdateSleepData = /* GraphQL */ ` subscription OnUpdateSleepData($owner: String!) { onUpdateSleepData(owner: $owner) { @@ -52,7 +53,7 @@ export const onUpdateSleepData = /* GraphQL */ ` owner } } -` +`; export const onDeleteSleepData = /* GraphQL */ ` subscription OnDeleteSleepData($owner: String) { onDeleteSleepData(owner: $owner) { @@ -78,7 +79,7 @@ export const onDeleteSleepData = /* GraphQL */ ` owner } } -` +`; export const onCreateRequest = /* GraphQL */ ` subscription OnCreateRequest($owner: String!) { onCreateRequest(owner: $owner) { @@ -90,7 +91,7 @@ export const onCreateRequest = /* GraphQL */ ` accepted } } -` +`; export const onUpdateRequest = /* GraphQL */ ` subscription OnUpdateRequest($userId: String!) { onUpdateRequest(userId: $userId) { @@ -102,7 +103,7 @@ export const onUpdateRequest = /* GraphQL */ ` accepted } } -` +`; export const onDeleteRequest = /* GraphQL */ ` subscription OnDeleteRequest($userId: String) { onDeleteRequest(userId: $userId) { @@ -114,7 +115,7 @@ export const onDeleteRequest = /* GraphQL */ ` accepted } } -` +`; export const onCreateUser = /* GraphQL */ ` subscription OnCreateUser { onCreateUser { @@ -126,7 +127,7 @@ export const onCreateUser = /* GraphQL */ ` intercomId } } -` +`; export const onUpdateUser = /* GraphQL */ ` subscription OnUpdateUser($owner: String!) { onUpdateUser(owner: $owner) { @@ -138,7 +139,7 @@ export const onUpdateUser = /* GraphQL */ ` intercomId } } -` +`; export const onDeleteUser = /* GraphQL */ ` subscription OnDeleteUser($owner: String) { onDeleteUser(owner: $owner) { @@ -150,7 +151,7 @@ export const onDeleteUser = /* GraphQL */ ` intercomId } } -` +`; export const onCreateCoachingData = /* GraphQL */ ` subscription OnCreateCoachingData($owner: String!) { onCreateCoachingData(owner: $owner) { @@ -178,7 +179,7 @@ export const onCreateCoachingData = /* GraphQL */ ` owner } } -` +`; export const onUpdateCoachingData = /* GraphQL */ ` subscription OnUpdateCoachingData($owner: String!) { onUpdateCoachingData(owner: $owner) { @@ -206,7 +207,7 @@ export const onUpdateCoachingData = /* GraphQL */ ` owner } } -` +`; export const onDeleteCoachingData = /* GraphQL */ ` subscription OnDeleteCoachingData($owner: String) { onDeleteCoachingData(owner: $owner) { @@ -234,7 +235,7 @@ export const onDeleteCoachingData = /* GraphQL */ ` owner } } -` +`; export const onCreateHabit = /* GraphQL */ ` subscription OnCreateHabit($owner: String!) { onCreateHabit(owner: $owner) { @@ -263,7 +264,7 @@ export const onCreateHabit = /* GraphQL */ ` owner } } -` +`; export const onUpdateHabit = /* GraphQL */ ` subscription OnUpdateHabit($owner: String!) { onUpdateHabit(owner: $owner) { @@ -292,7 +293,7 @@ export const onUpdateHabit = /* GraphQL */ ` owner } } -` +`; export const onDeleteHabit = /* GraphQL */ ` subscription OnDeleteHabit($owner: String) { onDeleteHabit(owner: $owner) { @@ -321,7 +322,7 @@ export const onDeleteHabit = /* GraphQL */ ` owner } } -` +`; export const onCreateNight = /* GraphQL */ ` subscription OnCreateNight($owner: String!) { onCreateNight(owner: $owner) { @@ -345,7 +346,7 @@ export const onCreateNight = /* GraphQL */ ` owner } } -` +`; export const onUpdateNight = /* GraphQL */ ` subscription OnUpdateNight($owner: String!) { onUpdateNight(owner: $owner) { @@ -369,7 +370,7 @@ export const onUpdateNight = /* GraphQL */ ` owner } } -` +`; export const onDeleteNight = /* GraphQL */ ` subscription OnDeleteNight($owner: String) { onDeleteNight(owner: $owner) { @@ -393,7 +394,7 @@ export const onDeleteNight = /* GraphQL */ ` owner } } -` +`; export const onCreateLikedContent = /* GraphQL */ ` subscription OnCreateLikedContent($owner: String) { onCreateLikedContent(owner: $owner) { @@ -401,12 +402,11 @@ export const onCreateLikedContent = /* GraphQL */ ` name type slug - cover excerpt owner } } -` +`; export const onUpdateLikedContent = /* GraphQL */ ` subscription OnUpdateLikedContent($owner: String) { onUpdateLikedContent(owner: $owner) { @@ -414,12 +414,11 @@ export const onUpdateLikedContent = /* GraphQL */ ` name type slug - cover excerpt owner } } -` +`; export const onDeleteLikedContent = /* GraphQL */ ` subscription OnDeleteLikedContent($owner: String) { onDeleteLikedContent(owner: $owner) { @@ -427,9 +426,65 @@ export const onDeleteLikedContent = /* GraphQL */ ` name type slug - cover excerpt owner } } -` +`; +export const onCreateNightRating = /* GraphQL */ ` + subscription OnCreateNightRating($owner: String!) { + onCreateNightRating(owner: $owner) { + id + userId + user { + connectionId + id + email + nickname + darkMode + intercomId + } + rating + date + owner + } + } +`; +export const onUpdateNightRating = /* GraphQL */ ` + subscription OnUpdateNightRating($owner: String!) { + onUpdateNightRating(owner: $owner) { + id + userId + user { + connectionId + id + email + nickname + darkMode + intercomId + } + rating + date + owner + } + } +`; +export const onDeleteNightRating = /* GraphQL */ ` + subscription OnDeleteNightRating($owner: String) { + onDeleteNightRating(owner: $owner) { + id + userId + user { + connectionId + id + email + nickname + darkMode + intercomId + } + rating + date + owner + } + } +`; diff --git a/src/screens/main/main.tsx b/src/screens/main/main.tsx index 4e323c0..d595123 100644 --- a/src/screens/main/main.tsx +++ b/src/screens/main/main.tsx @@ -28,12 +28,15 @@ import NewHabitModal from '@components/modals/HabitModal/NewHabitModal' import { SafeAreaView } from '@components/Primitives/Primitives' import TopInfo from '@components/TopInfo' import colors from '../../styles/colors' +import { getAuthState } from 'store/selectors/auth-selectors/auth-selectors' +import { getNightRatingsFromCloud } from 'store/actions/sleep/night-quality-actions' const MainScreen = () => { const isLoadingSleepData = useSelector(getHealthKitLoading) const isLoadingFitbit = useSelector(getLoadingFitbit) const isLoadingGoogleFit = useSelector(getLoadingGoogleFit) const dispatch = useDispatch() + const authenticated = useSelector(getAuthState) useNotificationEventHandlers() @@ -48,6 +51,9 @@ const MainScreen = () => { const checkSleepData = async () => { await dispatch(fetchSleepData()) await dispatch(updateCalendar()) + if (authenticated) { + await dispatch(getNightRatingsFromCloud()) + } } return ( diff --git a/src/store/Reducers/api-reducer/api-reducer.spec.ts b/src/store/Reducers/api-reducer/api-reducer.spec.ts index 6888b24..f0fe986 100644 --- a/src/store/Reducers/api-reducer/api-reducer.spec.ts +++ b/src/store/Reducers/api-reducer/api-reducer.spec.ts @@ -5,6 +5,12 @@ import { import reducer, { initialState } from './api-reducer' import { ResponseBase } from '../../../Types/State/api-state' +jest.mock('react-native-iphone-x-helper', () => ({ + getStatusBarHeight: jest.fn(), + ifIphoneX: jest.fn(), + isIphoneX: jest.fn() +})) + const fitbitMock: ResponseBase = { enabled: true } diff --git a/src/store/Reducers/auth-reducer/auth-reducer.spec.ts b/src/store/Reducers/auth-reducer/auth-reducer.spec.ts index 534900d..8c65085 100644 --- a/src/store/Reducers/auth-reducer/auth-reducer.spec.ts +++ b/src/store/Reducers/auth-reducer/auth-reducer.spec.ts @@ -10,9 +10,25 @@ import { } from '@actions/auth/auth-actions' import reducer, { initialState } from './auth-reducer' +jest.mock('react-native', () => ({ + NativeModules: { + RNCNetInfo: jest.fn() + }, + StyleSheet: { + hairlineWidth: 10 + } +})) + NativeModules.RNCNetInfo = RNCNetInfoMock + jest.mock('@react-native-community/netinfo', () => ({})) +jest.mock('react-native-iphone-x-helper', () => ({ + getStatusBarHeight: jest.fn(), + ifIphoneX: jest.fn(), + isIphoneX: jest.fn() +})) + describe('Auth reducer', () => { it('should return the initial state', () => { expect(reducer(undefined, {})).toEqual(initialState) diff --git a/src/store/Reducers/modal/modal-reducer.spec.ts b/src/store/Reducers/modal/modal-reducer.spec.ts index b1cea7b..bf94c0c 100644 --- a/src/store/Reducers/modal/modal-reducer.spec.ts +++ b/src/store/Reducers/modal/modal-reducer.spec.ts @@ -1,6 +1,11 @@ import { TOGGLE_RATING_MODAL } from '@actions/modal/modal-actions' import reducer, { initialState } from './modal-reducer' +jest.mock('react-native-iphone-x-helper', () => ({ + getStatusBarHeight: jest.fn(), + isIphoneX: () => true +})) + describe('Coaching notification reducer', () => { it('should return the initial state', () => { expect(reducer(undefined, {})).toEqual(initialState) diff --git a/src/store/Reducers/modal/modal-reducer.ts b/src/store/Reducers/modal/modal-reducer.ts index 89fcee3..7918956 100644 --- a/src/store/Reducers/modal/modal-reducer.ts +++ b/src/store/Reducers/modal/modal-reducer.ts @@ -6,7 +6,8 @@ import { TOGGLE_EDIT_HABIT_MODAL, TOGGLE_NEW_HABIT_MODAL, TOGGLE_RATING_MODAL, - TOGGLE_EXPLANATIONS_MODAL + TOGGLE_EXPLANATIONS_MODAL, + UPDATE_RATING_DATE } from '@actions/modal/modal-actions' export const initialState: ModalState = { @@ -40,6 +41,9 @@ const ModalReducer = ( case TOGGLE_NEW_HABIT_MODAL: return { ...state, newHabitModal: !state.newHabitModal } + case UPDATE_RATING_DATE: + return { ...state, ratingDate: payload } + default: return state } diff --git a/src/store/Reducers/sleep/night-quality-reducer.spec.ts b/src/store/Reducers/sleep/night-quality-reducer.spec.ts new file mode 100644 index 0000000..eee9d6b --- /dev/null +++ b/src/store/Reducers/sleep/night-quality-reducer.spec.ts @@ -0,0 +1,83 @@ +import NightQualityReducer from '@reducers/sleep/night-quality-reducer' +import { NightQualityState, NightQuality } from 'Types/Sleep/NightQuality' +import { + updateNightQuality, + pushNightQuality, + loadNightQualityFromCloud +} from 'store/actions/sleep/night-quality-actions' + +const initialState: NightQualityState = { + records: new Map() +} + +describe('Night Quality Reducer', () => { + it('should return initial state', () => { + expect( + NightQualityReducer( + { + records: new Map() + }, + { type: 'NOTHING' } + ) + ).toEqual(initialState) + }) + + const inputPayload: NightQuality = { + id: 'uniq_id', + date: 'uniq_date', + rating: 3 + } + + it('should handle UPDATE_NIGHT_QUALITY', () => { + const records = new Map().set(inputPayload.date, inputPayload) + const newInputPayload: NightQuality = { + id: 'new_uniq_id', + date: inputPayload.date, + rating: 5 + } + const expected: NightQualityState = { + records: records.set(newInputPayload.date, newInputPayload) + } + + expect( + NightQualityReducer( + { + records + }, + updateNightQuality(newInputPayload) + ) + ).toEqual(expected) + }) + + it('should handle PUSH_NIGHT_QUALITY', () => { + const expected: NightQualityState = { + records: new Map().set(inputPayload.date, inputPayload) + } + + expect( + NightQualityReducer( + { + records: new Map() + }, + pushNightQuality(inputPayload) + ) + ).toEqual(expected) + }) + + it('should handle LOAD_NIGHT_QUALITY_FROM_CLOUD', () => { + const payload = new Map().set(inputPayload.date, inputPayload) + + const expected: NightQualityState = { + records: payload + } + + expect( + NightQualityReducer( + { + records: new Map() + }, + loadNightQualityFromCloud(payload) + ) + ).toEqual(expected) + }) +}) diff --git a/src/store/Reducers/sleep/night-quality-reducer.ts b/src/store/Reducers/sleep/night-quality-reducer.ts new file mode 100644 index 0000000..d3efaed --- /dev/null +++ b/src/store/Reducers/sleep/night-quality-reducer.ts @@ -0,0 +1,34 @@ +import ReduxAction from 'Types/ReduxActions' +import { NightQualityState } from 'Types/Sleep/NightQuality' +import { produce, enableMapSet } from 'immer' +import { + UPDATE_NIGHT_QUALITY, + PUSH_NIGHT_QUALITY, + LOAD_NIGHT_QUALITY_FROM_CLOUD +} from 'store/actions/sleep/night-quality-actions' + +enableMapSet() + +const initialState: NightQualityState = { + records: new Map() +} + +const reducer = produce((draft: NightQualityState, action: ReduxAction) => { + const { payload, type } = action + + switch (type) { + case UPDATE_NIGHT_QUALITY: + draft.records.set(payload.date, payload) + break + + case PUSH_NIGHT_QUALITY: + draft.records.set(payload.date, payload) + break + + case LOAD_NIGHT_QUALITY_FROM_CLOUD: + draft.records = payload + break + } +}, initialState) + +export default reducer diff --git a/src/store/Reducers/user/user-reducer.spec.ts b/src/store/Reducers/user/user-reducer.spec.ts index 7048efa..0bd54c3 100644 --- a/src/store/Reducers/user/user-reducer.spec.ts +++ b/src/store/Reducers/user/user-reducer.spec.ts @@ -12,6 +12,13 @@ jest.mock('react-native', () => ({ } })) +jest.mock('react-native-iphone-x-helper', () => ({ + getStatusBarHeight: jest.fn(), + ifIphoneX: jest.fn(), + isIphoneX: jest.fn() +})) + + describe('User reducer', () => { it('should return the initial state', () => { expect(reducer(undefined, { type: '' })).toEqual(initialState) diff --git a/src/store/Selectors/ModalSelectors.ts b/src/store/Selectors/ModalSelectors.ts index e5ba9a9..ba58e48 100644 --- a/src/store/Selectors/ModalSelectors.ts +++ b/src/store/Selectors/ModalSelectors.ts @@ -28,3 +28,8 @@ export const getExplanationsModal = createSelector( getModalState, (modalState: ModalState) => modalState.explanationsModal ) + +export const getRatingDate = createSelector( + getModalState, + (modalState: ModalState) => modalState.ratingDate +) diff --git a/src/store/Selectors/night-quality-selectors/night-quality-selector.ts b/src/store/Selectors/night-quality-selectors/night-quality-selector.ts new file mode 100644 index 0000000..6a77084 --- /dev/null +++ b/src/store/Selectors/night-quality-selectors/night-quality-selector.ts @@ -0,0 +1,15 @@ +import { createSelector } from 'reselect' +import { State } from 'Types/State' +import { NightQualityState } from 'Types/Sleep/NightQuality' + +const getNightQualityState = (state: State) => state.nightQuality +const getProps = (state: State, { date }: { date: string }) => date + +export const makeGetRatingOnDate = () => + createSelector( + getNightQualityState, + getProps, + (nightQualityState: NightQualityState, date: string) => { + return nightQualityState.records.get(date) + } + ) diff --git a/src/store/actions/StartupActions.ts b/src/store/actions/StartupActions.ts index 0f441a1..09e8017 100644 --- a/src/store/actions/StartupActions.ts +++ b/src/store/actions/StartupActions.ts @@ -23,6 +23,7 @@ import { import { prepareSleepDataFetching } from './sleep/health-kit-actions' import { fetchSleepData, updateCalendar } from './sleep/sleep-data-actions' import { updateSubscriptionStatus } from './subscription/subscription-actions' +import { getNightRatingsFromCloud } from './sleep/night-quality-actions' export const startup = (): Thunk => async ( dispatch: Dispatch, @@ -59,6 +60,9 @@ export const startup = (): Thunk => async ( if (isAuthenticated) { await dispatch(updateCoachingInCloud()) + + // Get Night Ratings from Cloud + await dispatch(getNightRatingsFromCloud()) } await dispatch(calculateInsights()) diff --git a/src/store/actions/auth/auth-actions.ts b/src/store/actions/auth/auth-actions.ts index 44be5ee..0c98f41 100644 --- a/src/store/actions/auth/auth-actions.ts +++ b/src/store/actions/auth/auth-actions.ts @@ -14,6 +14,7 @@ import Purchases from 'react-native-purchases' import { GetState } from 'Types/GetState' import { NotificationType } from 'Types/NotificationState' import { updateEmail } from '../user/user-actions' +import { getNightRatingsFromCloud } from '../sleep/night-quality-actions' /* ACTION TYPES */ @@ -163,6 +164,7 @@ export const login = (loginEmail: string, loginPassword: string) => async ( await NavigationService.navigate(ROUTE.SLEEP, {}) } + await dispatch(getNightRatingsFromCloud(username)) await dispatch(loginSuccess(true, email, username)) } catch (error) { console.warn(error) diff --git a/src/store/actions/habit/habit-actions.spec.ts b/src/store/actions/habit/habit-actions.spec.ts index 0a552d4..44b971e 100644 --- a/src/store/actions/habit/habit-actions.spec.ts +++ b/src/store/actions/habit/habit-actions.spec.ts @@ -40,6 +40,12 @@ jest.mock('moment', () => () => ({ toISOString: () => '2020-05-07T21:00:00.000Z' })) +jest.mock('react-native-iphone-x-helper', () => ({ + getStatusBarHeight: jest.fn(), + ifIphoneX: jest.fn(), + isIphoneX: jest.fn() +})) + const middlewares = [thunk] const startOfTodayString = '2020-05-07T21:00:00.000Z' diff --git a/src/store/actions/manual-sleep/manual-sleep-actions.spec.ts b/src/store/actions/manual-sleep/manual-sleep-actions.spec.ts index 4229799..2a83e59 100644 --- a/src/store/actions/manual-sleep/manual-sleep-actions.spec.ts +++ b/src/store/actions/manual-sleep/manual-sleep-actions.spec.ts @@ -10,6 +10,11 @@ const testValues = { end: { h: 12, m: 0 } } +jest.mock('react-native-iphone-x-helper', () => ({ + getStatusBarHeight: jest.fn(), + isIphoneX: () => true +})) + describe('Manual sleep actions', () => { it('should create an action to set values', () => { const expectedAction = { diff --git a/src/store/actions/modal/modal-actions.ts b/src/store/actions/modal/modal-actions.ts index 40d9107..c0f20b4 100644 --- a/src/store/actions/modal/modal-actions.ts +++ b/src/store/actions/modal/modal-actions.ts @@ -2,6 +2,7 @@ export const TOGGLE_NEW_HABIT_MODAL = 'TOGGLE_NEW_HABIT_MODAL' export const TOGGLE_EDIT_HABIT_MODAL = 'TOGGLE_EDIT_HABIT_MODAL' export const TOGGLE_RATING_MODAL = 'TOGGLE_RATING_MODAL' export const TOGGLE_EXPLANATIONS_MODAL = 'TOGGLE_EXPLANATIONS_MODAL' +export const UPDATE_RATING_DATE = 'UPDATE_RATING_DATE' export const toggleNewHabitModal = (value?: boolean) => { return { type: TOGGLE_NEW_HABIT_MODAL, payload: value } @@ -19,3 +20,8 @@ export const toggleExplanationsModal = (value?: boolean) => ({ type: TOGGLE_EXPLANATIONS_MODAL, payload: value }) + +export const updateRatingDate = (ratingDate: string) => ({ + type: UPDATE_RATING_DATE, + payload: ratingDate +}) diff --git a/src/store/actions/sleep/night-quality-actions.spec.ts b/src/store/actions/sleep/night-quality-actions.spec.ts new file mode 100644 index 0000000..6da763b --- /dev/null +++ b/src/store/actions/sleep/night-quality-actions.spec.ts @@ -0,0 +1,99 @@ +import { + getNightRatingsFromCloud, + loadNightQualityFromCloud, + convertNightQualityFromCloudToMap, + rateNight, + updateNightQuality +} from './night-quality-actions' +import configureMockStore from 'redux-mock-store' +import thunk from 'redux-thunk' +import { AnyAction } from 'redux' +import { NightQuality } from 'Types/Sleep/NightQuality' + +const middlewares = [thunk] +const mockStore = configureMockStore(middlewares) + +const mockedRemoteData = { + data: { + listNightRatings: { + items: [ + { date: 'uniq_date_1', id: 'uniq_id_1', rating: 0 }, + { date: 'uniq_date_2', id: 'uniq_id_2', rating: 1 }, + { date: 'uniq_date_3', id: 'uniq_id_3', rating: 2 } + ] + } + } +} + +jest.mock('aws-amplify', () => ({ + API: { + graphql: () => mockedRemoteData + }, + + graphqlOperation: jest.fn() +})) + +describe('Night Quality Action', () => { + it('should handle getNightRatingsFromCloud function', () => { + const store = mockStore({ + user: { + authenticated: true, + username: 'uniq_username' + }, + nightQuality: { + records: new Map() + } + }) + + return store + .dispatch((getNightRatingsFromCloud())) + .then(() => { + const actions = store.getActions() + + expect(actions[0]).toEqual( + loadNightQualityFromCloud( + convertNightQualityFromCloudToMap( + mockedRemoteData.data.listNightRatings.items + ) + ) + ) + }) + }) + + it('should handle rateNight function', () => { + const inputNightQuality: NightQuality = { + id: 'uniq_id_1', + date: 'uniq_date_1', + rating: 0 + } + const records: Map = new Map().set( + inputNightQuality.date, + inputNightQuality + ) + + const store = mockStore({ + user: { + authenticated: true, + username: 'uniq_username' + }, + nightQuality: { + records: records + } + }) + + const updateNight = { + date: inputNightQuality.date, + rating: inputNightQuality.rating + } + + return store + .dispatch((rateNight(updateNight))) + .then(() => { + const actions = store.getActions() + + expect(actions[0]).toEqual( + updateNightQuality({ ...updateNight, id: inputNightQuality.id }) + ) + }) + }) +}) diff --git a/src/store/actions/sleep/night-quality-actions.ts b/src/store/actions/sleep/night-quality-actions.ts new file mode 100644 index 0000000..6349d60 --- /dev/null +++ b/src/store/actions/sleep/night-quality-actions.ts @@ -0,0 +1,162 @@ +import { NightQuality, NightQualityState } from 'Types/Sleep/NightQuality' +import { Dispatch } from 'redux' +import { GetState } from 'Types/GetState' +import { API, graphqlOperation } from 'aws-amplify' +import { createNightRating, updateNightRating } from 'graphql/mutations' +import { + CreateNightRatingInput, + ModelNightRatingFilterInput, + UpdateNightRatingInput +} from 'API' +import { listNightRatings } from 'graphql/queries' +import { v4 } from 'uuid' + +export const UPDATE_NIGHT_QUALITY = 'UPDATE_NIGHT_QUALITY' +export const PUSH_NIGHT_QUALITY = 'PUSH_NIGHT_QUALITY' +export const LOAD_NIGHT_QUALITY_FROM_CLOUD = 'LOAD_NIGHT_QUALITY_FROM_CLOUD' +export const UPDATE_NIGHT_QUALITY_LOCAL = 'UPDATE_NIGHT_QUALITY_LOCAL' +export const PUSH_NIGHT_QUALITY_LOCAL = 'PUSH_NIGHT_QUALITY_LOCAL' +export const POP_NIGHT_QUALITY_LOCAL = 'POP_NIGHT_QUALITY_LOCAL' + +export const updateNightQuality = (nightQuality: NightQuality) => ({ + type: UPDATE_NIGHT_QUALITY, + payload: nightQuality +}) + +export const pushNightQuality = (nightQuality: NightQuality) => ({ + type: PUSH_NIGHT_QUALITY, + payload: nightQuality +}) + +export const loadNightQualityFromCloud = ( + nightQualityFromCloud: Map +) => ({ + type: LOAD_NIGHT_QUALITY_FROM_CLOUD, + payload: nightQualityFromCloud +}) + +export const getNightRatingsFromCloud = (username?: string) => async ( + dispatch: Dispatch, + getState: GetState +) => { + try { + if (!username) { + const { + user: { authenticated } + } = getState() + + if (authenticated) + username = getState().user.username as string | undefined + else username = 'unknown' + } + + const variables: { + filter: ModelNightRatingFilterInput + limit?: number + nextToken?: string + } = { + filter: { + userId: { + eq: username + } + } + } + const response = (await API.graphql( + graphqlOperation(listNightRatings, variables) + )) as any + + const cloudNightRatings: Array = + response.data.listNightRatings.items + + await dispatch( + loadNightQualityFromCloud( + convertNightQualityFromCloudToMap(cloudNightRatings) + ) + ) + } catch (err) { + console.log('getNightRatingsFromCloud', err) + } +} + +export const convertNightQualityFromCloudToMap = ( + cloudNightRatings: Array +) => { + const map = new Map() + + cloudNightRatings.forEach((rating) => { + map.set(rating.date, rating) + }) + + return map +} + +export const rateNight = ({ + rating, + date +}: { + rating: number + date: string | undefined +}) => async (dispatch: Dispatch, getState: GetState) => { + const { + user: { authenticated, username }, + nightQuality + } = getState() + + date = date && date.length > 0 ? date : 'undefined' //Because aws doesn't accept empty string + + try { + // Handle cloud update if user is logged in + if (authenticated) { + // We check to see if the rating for date already exists + // If it exists, we update its data in the cloud + if (checkRecordExists(nightQuality, date)) { + const newNightRating: NightQuality = { + id: nightQuality.records.get(date)?.id as string, + rating, + date + } + + const updateNightRatingInput: UpdateNightRatingInput = { + date, + userId: username as string, + rating, + id: nightQuality.records.get(date)?.id as string + } + + await API.graphql( + graphqlOperation(updateNightRating, { input: updateNightRatingInput }) + ) + + await dispatch(updateNightQuality(newNightRating)) + } + + // If it doesn't exist, we create a new one in the cloud + else { + const createNightRatingInput: CreateNightRatingInput = { + date, + userId: username as string, + rating, + id: v4() + } + + const newNightRating: NightQuality = { + id: createNightRatingInput.id as string, + rating, + date + } + + await API.graphql( + graphqlOperation(createNightRating, { input: createNightRatingInput }) + ) + + await dispatch(pushNightQuality(newNightRating)) + } + } + } catch (err) { + console.log('rateNight', err) + } +} + +const checkRecordExists = ({ records }: NightQualityState, date: string) => { + return records.has(date) +} diff --git a/src/store/index.ts b/src/store/index.ts index 5e0bbdd..9a523e9 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -18,6 +18,7 @@ import HealthKitReducer from '@reducers/sleep/health-kit-reducer' import sleepclock from '@reducers/sleepclockReducer' import SubscriptionReducer from '@reducers/subscription/subscription-reducer' import user from '@reducers/user/user-reducer' +import NightQuality from '@reducers/sleep/night-quality-reducer' import { enableES5, enableMapSet } from 'immer' import { reducer as network } from 'react-native-offline' import { @@ -92,7 +93,10 @@ const rootReducer = combineReducers({ linking: makePersisted('linking', LinkingReducer, undefined), sleepSources: makePersisted('sleepSources', SleepSourceReducer, undefined), healthKit: makePersisted('healthKit', HealthKitReducer, undefined), - insights: makePersisted('insights', InsightsReducer, undefined) + insights: makePersisted('insights', InsightsReducer, undefined), + nightQuality: makePersisted('nightQuality', NightQuality, undefined, [ + serializeTransform + ]) }) const middleware = applyMiddleware(thunk, batchDispatchMiddleware) diff --git a/yarn.lock b/yarn.lock index 18a3e8e..10a1c2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,71 +2,72 @@ # yarn lockfile v1 -"@aws-amplify/analytics@^3.2.7": - version "3.2.7" - resolved "https://registry.yarnpkg.com/@aws-amplify/analytics/-/analytics-3.2.7.tgz#2a89eea258f53c7d1ece9dba31cdbc66ef286629" - integrity sha512-NfV9+CK6y1VRZaFjIZnSi2E+ycT8C3hDdJNN/Z5UFytdjXzVpHfaiw4juQv8yJAZ46FPDg8wJ5zhcQkLvLDHfA== +"@aws-amplify/analytics@^3.2.8": + version "3.2.8" + resolved "https://registry.yarnpkg.com/@aws-amplify/analytics/-/analytics-3.2.8.tgz#0ea57bd00062a57c7bfc26bac4136da706dde17e" + integrity sha512-bsrZgWJnsbaSQ96xr3nMHpGIPWbqUyLYg/gmY0tkHSuHtvl2CoJ1A4J4ru+6n5kWKZZKK03u3EbaxuK5XwnhMQ== dependencies: - "@aws-amplify/cache" "^3.1.23" - "@aws-amplify/core" "^3.4.6" + "@aws-amplify/cache" "^3.1.24" + "@aws-amplify/core" "^3.4.7" "@aws-sdk/client-firehose" "1.0.0-gamma.4" "@aws-sdk/client-kinesis" "1.0.0-gamma.4" "@aws-sdk/client-personalize-events" "1.0.0-gamma.4" "@aws-sdk/client-pinpoint" "1.0.0-gamma.4" "@aws-sdk/util-utf8-browser" "1.0.0-gamma.3" + lodash "^4.17.20" uuid "^3.2.1" -"@aws-amplify/api-graphql@^1.1.6": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@aws-amplify/api-graphql/-/api-graphql-1.1.6.tgz#4eed739f5f6e8c47a6a323ed88c2390280bbe647" - integrity sha512-EL2SXGd9HThd492stKW9kdIJtd4rLCoxfFBUlm6QR0IfKYiXFBWoXs/Jx3sWQ2xB8PpB4uV5z6LbhWIuFmbhZQ== - dependencies: - "@aws-amplify/api-rest" "^1.1.6" - "@aws-amplify/auth" "^3.3.5" - "@aws-amplify/cache" "^3.1.23" - "@aws-amplify/core" "^3.4.6" - "@aws-amplify/pubsub" "^3.0.24" +"@aws-amplify/api-graphql@^1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@aws-amplify/api-graphql/-/api-graphql-1.1.7.tgz#9d26e255f9f57628f2ded0b2267cc13d8fb3b9ae" + integrity sha512-DzuQr87464Gi/zmk7462cTEROI249jriNjUxgSPJ7+mA2osFiU973gr+oZSNgDm7idzuueDLabcV/7eEBT4GXA== + dependencies: + "@aws-amplify/api-rest" "^1.1.7" + "@aws-amplify/auth" "^3.3.6" + "@aws-amplify/cache" "^3.1.24" + "@aws-amplify/core" "^3.4.7" + "@aws-amplify/pubsub" "^3.0.25" graphql "14.0.0" uuid "^3.2.1" zen-observable-ts "0.8.19" -"@aws-amplify/api-rest@^1.1.6": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@aws-amplify/api-rest/-/api-rest-1.1.6.tgz#c79398ea051c1d871086164ee0dec8e22072aebe" - integrity sha512-kyshfxAsjKsh0EOIKQJO5deT9cXRLMOQ2Z4syTEDVfwPRwv1w3LtouVEwF6PweB9CkqunfBEOkAOkrJuftK1ug== +"@aws-amplify/api-rest@^1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@aws-amplify/api-rest/-/api-rest-1.1.7.tgz#0e7609e0e07331e64355114eb8c8bcc227703367" + integrity sha512-V8W1UvYAYi9JbCosAqjyk3+uQ7C6cKJR5mSiHj1q7VlOkzFH8yObyUYwbrt+HQKND71I+O+jBbiPONSX5p5dWQ== dependencies: - "@aws-amplify/core" "^3.4.6" + "@aws-amplify/core" "^3.4.7" axios "0.19.0" -"@aws-amplify/api@^3.1.23": - version "3.1.23" - resolved "https://registry.yarnpkg.com/@aws-amplify/api/-/api-3.1.23.tgz#f1c301b44eb9e0c26970e1dd18d44b94d94840a1" - integrity sha512-OWmcaUoiKWwm1GEUp2xS4ptPeiwIXXCuO39Crub6KyetA+aWmSfX0i5ZQa/0GOFMRqwFYB5eU6+qLIt/LBqG1g== +"@aws-amplify/api@^3.1.24": + version "3.1.24" + resolved "https://registry.yarnpkg.com/@aws-amplify/api/-/api-3.1.24.tgz#17f86c0936dbb74cc456a198704fd6313385c89c" + integrity sha512-B4NH+tEXIjnp9FQRDTHEnkApv17JBhqY25Qb0w+X7wroQ1llvre5Ryon7uGNStgfGZKRvAXO+P7QdQH4x2o0rA== dependencies: - "@aws-amplify/api-graphql" "^1.1.6" - "@aws-amplify/api-rest" "^1.1.6" + "@aws-amplify/api-graphql" "^1.1.7" + "@aws-amplify/api-rest" "^1.1.7" -"@aws-amplify/auth@^3.3.5": - version "3.3.5" - resolved "https://registry.yarnpkg.com/@aws-amplify/auth/-/auth-3.3.5.tgz#d6a546a61ab1149d74e60c98e3d123dcc5a22e52" - integrity sha512-O/uRfdC2RkDLwwUjsXuTgIbI0uIRAVNv6GxvoGp78le1/ySzDepULuJiNIvp6kI1alpVm0iAoyhk0fyyzvMSyg== +"@aws-amplify/auth@^3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@aws-amplify/auth/-/auth-3.3.6.tgz#ecdc3ad70da42ea20ac200248b12533e002ab210" + integrity sha512-pxcbSzy3WrDU9NswvrdffvUV0lHxhCIXCerEUmD7S5qRObjAaIYBNsFU2PcB1auwWdI0WCOf2y+4tFaLOikddw== dependencies: - "@aws-amplify/cache" "^3.1.23" - "@aws-amplify/core" "^3.4.6" - amazon-cognito-identity-js "^4.3.4" + "@aws-amplify/cache" "^3.1.24" + "@aws-amplify/core" "^3.4.7" + amazon-cognito-identity-js "^4.3.5" crypto-js "^3.3.0" -"@aws-amplify/cache@^3.1.23": - version "3.1.23" - resolved "https://registry.yarnpkg.com/@aws-amplify/cache/-/cache-3.1.23.tgz#709fe67d1cbaa9b0889fc8c2101cc16c11e8cd86" - integrity sha512-mk4oRYrbXq8VK9yVJ515i7oc1J86K8g8mKkCiyanitsYS6E6Sh7hgTBVV+nA3wgBW77yAF6GEwGSFeroEkKNIQ== +"@aws-amplify/cache@^3.1.24": + version "3.1.24" + resolved "https://registry.yarnpkg.com/@aws-amplify/cache/-/cache-3.1.24.tgz#fc0dc064c5fcf7be122e080516f65d57f536a9b4" + integrity sha512-qTuJvcvllL25J2YtKaGtoAxihcD6E3UaCOf6D4rwxtccbCk90yxbqIOCq+0d78QVI++hjIgmlqpM7EU8UiqzDQ== dependencies: - "@aws-amplify/core" "^3.4.6" + "@aws-amplify/core" "^3.4.7" -"@aws-amplify/core@^3.2.1", "@aws-amplify/core@^3.4.6": - version "3.4.6" - resolved "https://registry.yarnpkg.com/@aws-amplify/core/-/core-3.4.6.tgz#c4cfeb33ce193366d13f309c58ce59edb0f76c03" - integrity sha512-4z1pQvvv19vHq7eUWsEbW64RBLWQ5nyH4VOvfSe5vMEYX9JsUrOfghuougMEH4DkZSZ2w2T761GKUJs2A43o2w== +"@aws-amplify/core@^3.2.1", "@aws-amplify/core@^3.4.7": + version "3.4.7" + resolved "https://registry.yarnpkg.com/@aws-amplify/core/-/core-3.4.7.tgz#fddd554ff23446910724374e563b8a8614b05c16" + integrity sha512-cqbDQoXrQ2n4DhaLqQIxb1LvcOXKg5I6s1ZM1mdPbMDm2dP33DYyP8JC1HKrYSi/cf5U9lkSET27pSK/WRMSyg== dependencies: "@aws-crypto/sha256-js" "1.0.0-alpha.0" "@aws-sdk/client-cognito-identity" "1.0.0-gamma.4" @@ -78,14 +79,14 @@ url "^0.11.0" zen-observable-ts "0.8.19" -"@aws-amplify/datastore@^2.2.10": - version "2.2.10" - resolved "https://registry.yarnpkg.com/@aws-amplify/datastore/-/datastore-2.2.10.tgz#98fd24998bd94d9610e10e87ff2c25e4bb4fa982" - integrity sha512-k1qm4hRp2WvTipqa653magbOeyTN2dqG1uMCv8+rig34HK4+jz4SGLab1YQDlgO+MxjsvOHYv9AeYjQYum5tRw== +"@aws-amplify/datastore@^2.2.11": + version "2.2.11" + resolved "https://registry.yarnpkg.com/@aws-amplify/datastore/-/datastore-2.2.11.tgz#c5b5c59051be724e40e719610bf33cc908859957" + integrity sha512-qBM6gpZrb3eA6TBG4KwJ4j9VN3u+V3AI45UNElflcA6vJVz8Apa/kDtCMVe4ocHZvOrH91Nlb+Mm69Y04RqcuQ== dependencies: - "@aws-amplify/api" "^3.1.23" - "@aws-amplify/core" "^3.4.6" - "@aws-amplify/pubsub" "^3.0.24" + "@aws-amplify/api" "^3.1.24" + "@aws-amplify/core" "^3.4.7" + "@aws-amplify/pubsub" "^3.0.25" idb "5.0.2" immer "6.0.1" ulid "2.3.0" @@ -93,21 +94,21 @@ zen-observable-ts "0.8.19" zen-push "0.2.1" -"@aws-amplify/interactions@^3.1.23": - version "3.1.23" - resolved "https://registry.yarnpkg.com/@aws-amplify/interactions/-/interactions-3.1.23.tgz#1a5b4227c6dc865d5bf428e206b2f02df4975596" - integrity sha512-TQXXVYpA3fwgE8WZNBbn4ozN+7t4iNF1NgM+1JwB+2QXlYV3j/rqPgbg2eOjAT5utALWY8XsYdEThbNRJer55A== +"@aws-amplify/interactions@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@aws-amplify/interactions/-/interactions-3.2.0.tgz#bff57fb997f9acb5447ae2bf74b4297e4ce5b0e9" + integrity sha512-URvnwKcOdHPacRi/r7LXZz2jwlEjKxHT9jcY37taFqR+qcuxJIg6dDouSaQOU0ne497UtWhC1T3x1VnlYXZi+Q== dependencies: - "@aws-amplify/core" "^3.4.6" + "@aws-amplify/core" "^3.4.7" "@aws-sdk/client-lex-runtime-service" "1.0.0-gamma.4" -"@aws-amplify/predictions@^3.1.23": - version "3.1.23" - resolved "https://registry.yarnpkg.com/@aws-amplify/predictions/-/predictions-3.1.23.tgz#8930f716d16533cbf3c2e4b70abed91032356d9e" - integrity sha512-R/yccT/ZvDgyJgsaMDaQZ/TZeoR9/IWqpUOYtAhVh4z/AykUYayTIVTN7BuKyFfZH2zdvUVuojZxoewb88Prcg== +"@aws-amplify/predictions@^3.1.24": + version "3.1.24" + resolved "https://registry.yarnpkg.com/@aws-amplify/predictions/-/predictions-3.1.24.tgz#1d5ab57b734f12bd58ddc3fd42d0baf9c811d44b" + integrity sha512-Vb5Pg22k08CvoDbF9fcfcWS22Z8Tj7bdMpeA+Fg/yIUXYXsVlY/qb2+NkAP894l/lK+cKhrsUNIF/faKtS57jQ== dependencies: - "@aws-amplify/core" "^3.4.6" - "@aws-amplify/storage" "^3.2.13" + "@aws-amplify/core" "^3.4.7" + "@aws-amplify/storage" "^3.2.14" "@aws-sdk/client-comprehend" "1.0.0-gamma.4" "@aws-sdk/client-polly" "1.0.0-gamma.4" "@aws-sdk/client-rekognition" "1.0.0-gamma.4" @@ -117,25 +118,25 @@ "@aws-sdk/util-utf8-node" "1.0.0-gamma.3" uuid "^3.2.1" -"@aws-amplify/pubsub@^3.0.24": - version "3.0.24" - resolved "https://registry.yarnpkg.com/@aws-amplify/pubsub/-/pubsub-3.0.24.tgz#19bcb38a9baa2b6387be1668ad053081b0db7ae8" - integrity sha512-5CdLR/omYNjUctb0wrhHDYstlKc8mxg1pByB07MosL3l1yvM8gWDeeZ/BiBsZfLpqbRHH5590NYxWCtSCtnD7g== +"@aws-amplify/pubsub@^3.0.25": + version "3.0.25" + resolved "https://registry.yarnpkg.com/@aws-amplify/pubsub/-/pubsub-3.0.25.tgz#ba79099e45702a398e5fe20ea11e98ce04b813f5" + integrity sha512-/RHjbRNxBedKYV8I+FPZnAdI2l3AGMKE6ipTV7xlkoAi33nTpz6VaLCFmchyDYXU9RtLTyWFCK8LENwdN+I0Ew== dependencies: - "@aws-amplify/auth" "^3.3.5" - "@aws-amplify/cache" "^3.1.23" - "@aws-amplify/core" "^3.4.6" + "@aws-amplify/auth" "^3.3.6" + "@aws-amplify/cache" "^3.1.24" + "@aws-amplify/core" "^3.4.7" graphql "14.0.0" paho-mqtt "^1.1.0" uuid "^3.2.1" zen-observable-ts "0.8.19" -"@aws-amplify/storage@^3.2.13": - version "3.2.13" - resolved "https://registry.yarnpkg.com/@aws-amplify/storage/-/storage-3.2.13.tgz#5c93427ad15a062da8474e7f69736af26d175d87" - integrity sha512-MJHYpkr8j4BtW+LBk147t6gLkp0XfEezmYuwQmxhS2zppHxPM/yIXdp/mjcSTYpJ3Em10bHOr/FmfJli6LztYw== +"@aws-amplify/storage@^3.2.14": + version "3.2.14" + resolved "https://registry.yarnpkg.com/@aws-amplify/storage/-/storage-3.2.14.tgz#45cb20ddc38dd5d1fa12caad0392365ea88301b7" + integrity sha512-PwEde33h2p8gcmREaUIEMiqfTQ7tkkTNGbG1kISxjdBBdXFqEY3++bd4IFcJIZHxhKwiW6RwwKYukf8XZbg1Qg== dependencies: - "@aws-amplify/core" "^3.4.6" + "@aws-amplify/core" "^3.4.7" "@aws-sdk/client-s3" "1.0.0-gamma.4" "@aws-sdk/s3-request-presigner" "1.0.0-gamma.3" "@aws-sdk/util-create-request" "1.0.0-gamma.3" @@ -149,12 +150,12 @@ resolved "https://registry.yarnpkg.com/@aws-amplify/ui/-/ui-2.0.2.tgz#56bfc3674454f2a12d1cec247f38a444aa13ea09" integrity sha512-OLdZmUCVK29+JV8PrkgVPjg+GIFtBnNjhC0JSRgrps+ynOFkibMQQPKeFXlTYtlukuCuepCelPSkjxvhcLq2ZA== -"@aws-amplify/xr@^2.1.23": - version "2.1.23" - resolved "https://registry.yarnpkg.com/@aws-amplify/xr/-/xr-2.1.23.tgz#f1b36e5859c45ba947d2b22211872ecb6279acc6" - integrity sha512-yrQMaIlzxKIGAV31ScbjTPsZ14mT2y+P9H3eh4R65riX9MXmqZyMV32B9kVlPO9MFnzCkdK9gEnK5GZd0+4CYg== +"@aws-amplify/xr@^2.1.24": + version "2.1.24" + resolved "https://registry.yarnpkg.com/@aws-amplify/xr/-/xr-2.1.24.tgz#65d4d368ab24a70553f9e49453bb771d178332f8" + integrity sha512-a8FYtTpnA0fI2UYIQyST8TbL6s3lJa4ngzj1Bxnzcf4LKv8E63A1l9VxU2U5qf0Zgb/uTMJtkon7qLqCUZN6kg== dependencies: - "@aws-amplify/core" "^3.4.6" + "@aws-amplify/core" "^3.4.7" "@aws-crypto/crc32@^1.0.0-alpha.0": version "1.0.0-alpha.0" @@ -1104,9 +1105,9 @@ integrity sha512-6Zu64X/6I8Y0gO/+J2CGXjYUmYkiI89MX3BEgRcQRh3jUNpKnOm1j4r40w4qsu1QAYxwWJL1M/rjLJPOQPV7zw== "@aws-sdk/types@^1.0.0-alpha.0": - version "1.0.0-gamma.5" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-1.0.0-gamma.5.tgz#fa73cb21856da93873598694eff559702a36761c" - integrity sha512-waKbEd7clRocNPAW8NXPHJs2jgyvSfpR0Jfd4dm3R1EygkEa6aM0ct1bNvCEcnOfQFbytvfNiZK5vbLssuYmSA== + version "1.0.0-gamma.6" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-1.0.0-gamma.6.tgz#ec2bbf8abe05632a1fb2468dbd76096691dcfb89" + integrity sha512-5mQGLqXw269oXH4bxA3iK+Pnhy72wjIa6ccsLJVypyk1ZYiJq8Xk/ratosvZ4CDAnSwnUS1BibtxP8zrY14HnA== "@aws-sdk/url-parser-browser@1.0.0-gamma.3": version "1.0.0-gamma.3" @@ -1273,18 +1274,18 @@ semver "^5.5.0" "@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.4.5", "@babel/core@^7.6.2", "@babel/core@^7.7.5": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.4.tgz#4301dfdfafa01eeb97f1896c5501a3f0655d4229" - integrity sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg== + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.5.tgz#6ad96e2f71899ea3f9b651f0a911e85205d1ff6d" + integrity sha512-fsEANVOcZHzrsV6dMVWqpSeXClq3lNbYrfFGme6DE25FQWe7pyeYpXyx9guqUnpy466JLzZ8z4uwSr2iv60V5Q== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.4" + "@babel/generator" "^7.11.5" "@babel/helper-module-transforms" "^7.11.0" "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.4" + "@babel/parser" "^7.11.5" "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.0" - "@babel/types" "^7.11.0" + "@babel/traverse" "^7.11.5" + "@babel/types" "^7.11.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -1292,7 +1293,7 @@ lodash "^4.17.19" resolve "^1.3.2" semver "^5.4.1" - source-map "^0.5.0" + source-map "^0.6.1" "@babel/generator@7.0.0-beta.47": version "7.0.0-beta.47" @@ -1305,14 +1306,14 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/generator@^7.11.0", "@babel/generator@^7.11.4", "@babel/generator@^7.4.0", "@babel/generator@^7.5.0": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.4.tgz#1ec7eec00defba5d6f83e50e3ee72ae2fee482be" - integrity sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g== +"@babel/generator@^7.11.5", "@babel/generator@^7.4.0", "@babel/generator@^7.5.0": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.5.tgz#a5582773425a468e4ba269d9a1f701fbca6a7a82" + integrity sha512-9UqHWJ4IwRTy4l0o8gq2ef8ws8UPzvtMkVKjTLAiRmza9p9V6Z+OfuNd9fB1j5Q67F+dVJtPC2sZXI8NM9br4g== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.11.5" jsesc "^2.5.1" - source-map "^0.5.0" + source-map "^0.6.1" "@babel/helper-annotate-as-pure@7.0.0-beta.47": version "7.0.0-beta.47" @@ -1344,14 +1345,14 @@ "@babel/helper-explode-assignable-expression" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-builder-react-jsx-experimental@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz#f35e956a19955ff08c1258e44a515a6d6248646b" - integrity sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg== +"@babel/helper-builder-react-jsx-experimental@^7.10.4", "@babel/helper-builder-react-jsx-experimental@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz#4ea43dd63857b0a35cd1f1b161dc29b43414e79f" + integrity sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-module-imports" "^7.10.4" - "@babel/types" "^7.10.5" + "@babel/types" "^7.11.5" "@babel/helper-builder-react-jsx@7.0.0-beta.47": version "7.0.0-beta.47" @@ -1691,10 +1692,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.4", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.4.tgz#6fa1a118b8b0d80d0267b719213dc947e88cc0ca" - integrity sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" + integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== "@babel/plugin-external-helpers@^7.0.0": version "7.10.4" @@ -2340,11 +2341,11 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-react-jsx-development@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz#6ec90f244394604623880e15ebc3c34c356258ba" - integrity sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ== + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz#e1439e6a57ee3d43e9f54ace363fb29cefe5d7b6" + integrity sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw== dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.10.4" + "@babel/helper-builder-react-jsx-experimental" "^7.11.5" "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.10.4" @@ -2421,9 +2422,9 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-runtime@^7.0.0", "@babel/plugin-transform-runtime@^7.9.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz#e27f78eb36f19448636e05c33c90fd9ad9b8bccf" - integrity sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw== + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz#f108bc8e0cf33c37da031c097d1df470b3a293fc" + integrity sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg== dependencies: "@babel/helper-module-imports" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" @@ -2532,17 +2533,17 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/polyfill@^7.0.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.10.4.tgz#915e5bfe61490ac0199008e35ca9d7d151a8e45a" - integrity sha512-8BYcnVqQ5kMD2HXoHInBH7H1b/uP3KdnwCYXOqFnXqguOyuu443WXusbIUbWEfY3Z0Txk0M1uG/8YuAMhNl6zg== + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.11.5.tgz#df550b2ec53abbc2ed599367ec59e64c7a707bb5" + integrity sha512-FunXnE0Sgpd61pKSj2OSOs1D44rKTD3pGOfGilZ6LGrrIH0QEtJlTjqOqdF8Bs98JmjfGhni2BBkTfv9KcKJ9g== dependencies: core-js "^2.6.5" regenerator-runtime "^0.13.4" "@babel/preset-env@^7.5.0", "@babel/preset-env@^7.9.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796" - integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg== + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.5.tgz#18cb4b9379e3e92ffea92c07471a99a2914e4272" + integrity sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA== dependencies: "@babel/compat-data" "^7.11.0" "@babel/helper-compilation-targets" "^7.10.4" @@ -2606,7 +2607,7 @@ "@babel/plugin-transform-unicode-escapes" "^7.10.4" "@babel/plugin-transform-unicode-regex" "^7.10.4" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.11.0" + "@babel/types" "^7.11.5" browserslist "^4.12.0" core-js-compat "^3.6.2" invariant "^2.2.2" @@ -2646,9 +2647,9 @@ "@babel/plugin-transform-typescript" "^7.10.4" "@babel/register@^7.0.0", "@babel/register@^7.4.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.5.tgz#354f3574895f1307f79efe37a51525e52fd38d89" - integrity sha512-eYHdLv43nyvmPn9bfNfrcC4+iYNwdQ8Pxk1MFJuU/U5LpSYl/PH4dFMazCYZDFVi8ueG3shvO+AQfLrxpYulQw== + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.11.5.tgz#79becf89e0ddd0fba8b92bc279bc0f5d2d7ce2ea" + integrity sha512-CAml0ioKX+kOAvBQDHa/+t1fgOt3qkTIz0TrRtRAT6XY0m5qYZXR85k6/sLCNPMGhYDlCFHCYuU0ybTJbvlC6w== dependencies: find-cache-dir "^2.0.0" lodash "^4.17.19" @@ -2706,17 +2707,17 @@ invariant "^2.2.0" lodash "^4.17.5" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" - integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" + integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" + "@babel/generator" "^7.11.5" "@babel/helper-function-name" "^7.10.4" "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.0" - "@babel/types" "^7.11.0" + "@babel/parser" "^7.11.5" + "@babel/types" "^7.11.5" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" @@ -2730,10 +2731,10 @@ lodash "^4.17.5" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" - integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" + integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== dependencies: "@babel/helper-validator-identifier" "^7.10.4" lodash "^4.17.19" @@ -3399,9 +3400,9 @@ tslib "^1.9.3" "@sentry/cli@^1.52.4": - version "1.55.2" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.55.2.tgz#d7c32c87be1fb5b7469b3c57229177296ad9a364" - integrity sha512-XLHlqLUY3E/ggYvTqAy76sbUDzr3yxXD7cSeyT2e3rxORSVwMkP2MqMeRJ8sCmQ0DXMdMHfbFOKMDwMqmRZeqQ== + version "1.56.0" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.56.0.tgz#23c6dae6eddaf38c57187a8c98033e7dbbf01a31" + integrity sha512-URo4zk35Tieo95nTANd9PzumWcAQt3I83yGQfL3ICe28PfbgNS14p88VXq7eOyK6nMZV/J3kfpqDCf3Wka2VNQ== dependencies: https-proxy-agent "^5.0.0" mkdirp "^0.5.5" @@ -3992,9 +3993,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@26.x": - version "26.0.10" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.10.tgz#8faf7e9756c033c39014ae76a7329efea00ea607" - integrity sha512-i2m0oyh8w/Lum7wWK/YOZJakYF8Mx08UaKA1CtbmFeDquVhAEdA7znacsVSf2hJ1OQ/OfVMGN90pw/AtzF8s/Q== + version "26.0.13" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.13.tgz#5a7b9d5312f5dd521a38329c38ee9d3802a0b85e" + integrity sha512-sCzjKow4z9LILc6DhBvn5AkIfmQzDZkgtVVKmGwVrs5tuid38ws281D4l+7x1kP487+FlKDh5kfMZ8WSPAdmdA== dependencies: jest-diff "^25.2.1" pretty-format "^25.2.1" @@ -4008,9 +4009,9 @@ pretty-format "^25.2.1" "@types/json-schema@^7.0.3": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== "@types/json5@^0.0.29": version "0.0.29" @@ -4035,9 +4036,9 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "14.6.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.2.tgz#264b44c5a28dfa80198fc2f7b6d3c8a054b9491f" - integrity sha512-onlIwbaeqvZyniGPfdw/TEhKIh79pz66L1q06WUQqJLnAb6wbjvOtepLYTGHTqzdXgBYIE3ZdmqHDGsRsbBz7A== + version "14.6.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.3.tgz#cc4f979548ca4d8e7b90bc0180052ab99ee64224" + integrity sha512-pC/hkcREG6YfDfui1FBmj8e20jFU5Exjw4NYDm8kEdrW+mOh0T1Zve8DWKnS7ZIZvgncrctcNCXF4Q2I+loyww== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -4065,9 +4066,9 @@ integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== "@types/react-native@*": - version "0.63.11" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.63.11.tgz#0965552aa4cfe8a7c0c64f1afb1c101d2fa7510a" - integrity sha512-OjYwDiMZGENGd5P+su0OZY0t0ctTnmmToS/mJOAErktpZWqfDj99Q2hy3M09tQj+h2KnpsT+WUPozUKoossSxw== + version "0.63.13" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.63.13.tgz#e119c6921c78abdde52a68d0bd7f0effc6191f51" + integrity sha512-diqOQUlMB4+l5tldIP38fTkjtPn6pnFMMLfewiMtpUYwB1ID7snQ/ePN98a+3BFG87v8H62Rp/Q1xuudvG4MSg== dependencies: "@types/react" "*" @@ -4103,9 +4104,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^16.9.19": - version "16.9.48" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.48.tgz#d3387329f070d1b1bc0ff4a54a54ceefd5a8485c" - integrity sha512-4ykBVswgYitPGMXFRxJCHkxJDU2rjfU3/zw67f8+dB7sNdVJXsrwqoYxz/stkAucymnEEbRPFmX7Ce5Mc/kJCw== + version "16.9.49" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.49.tgz#09db021cf8089aba0cdb12a49f8021a69cce4872" + integrity sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -4123,9 +4124,9 @@ integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== "@types/styled-components@^5.1.0": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.2.tgz#652af475b4af917b355ea1c3068acae63d46455f" - integrity sha512-HNocYLfrsnNNm8NTS/W53OERSjRA8dx5Bn6wBd2rXXwt4Z3s+oqvY6/PbVt3e6sgtzI63GX//WiWiRhWur08qQ== + version "5.1.3" + resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.3.tgz#6fab3d9c8f7d9a15cbb89d379d850c985002f363" + integrity sha512-HGpirof3WOhiX17lb61Q/tpgqn48jxO8EfZkdJ8ueYqwLbK2AHQe/G08DasdA2IdKnmwOIP1s9X2bopxKXgjRw== dependencies: "@types/hoist-non-react-statics" "*" "@types/react" "*" @@ -4358,10 +4359,10 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -amazon-cognito-identity-js@^4.2.1, amazon-cognito-identity-js@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-4.3.4.tgz#e21afbe79ee16a2cb8e2804635d68fee97157a5a" - integrity sha512-GO6tOjH6ySiPI0+3UwqLzpdH6nCKQPMm6SYiFZzQCSVblztQ1AEK8HBAFKClz5bhNx66eJlXq86aa7f9aun29w== +amazon-cognito-identity-js@^4.2.1, amazon-cognito-identity-js@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-4.3.5.tgz#eac8781acdfc8269f7954909c4b31943f05df907" + integrity sha512-NrghoxDhmh+E70fNsjcbHNweFaQS8xePe7DqsnqD3SQu01XLBrbIj2ScbynK2iH/zjQFIq2wxBbcfUACwRViCw== dependencies: buffer "4.9.1" crypto-js "^3.3.0" @@ -4759,22 +4760,22 @@ aws-amplify-react-native@^4.0.3: react-native-vector-icons "6.6.0" aws-amplify@^3.0.7: - version "3.0.24" - resolved "https://registry.yarnpkg.com/aws-amplify/-/aws-amplify-3.0.24.tgz#083d1ab58a585c18dc3bab06fe2dc2339473bf47" - integrity sha512-WQDxD+5sVdfHHPY31jmDMWlEshvMewovCs15h/ugUak61Anv/x5Z3Kf2klxeiVx6KPZ+/aGCNNw66b1YjRB1Sg== - dependencies: - "@aws-amplify/analytics" "^3.2.7" - "@aws-amplify/api" "^3.1.23" - "@aws-amplify/auth" "^3.3.5" - "@aws-amplify/cache" "^3.1.23" - "@aws-amplify/core" "^3.4.6" - "@aws-amplify/datastore" "^2.2.10" - "@aws-amplify/interactions" "^3.1.23" - "@aws-amplify/predictions" "^3.1.23" - "@aws-amplify/pubsub" "^3.0.24" - "@aws-amplify/storage" "^3.2.13" + version "3.0.25" + resolved "https://registry.yarnpkg.com/aws-amplify/-/aws-amplify-3.0.25.tgz#e75a15fdf91130197796b444853d668149788802" + integrity sha512-fPWJmr+b28oAeIkulqgj0MqJ4QbB9rcvhMsyXwrYhFDNThXUNy82Bqa/kyNc6kmHdVDDU0kceZmJzk5jbID+2Q== + dependencies: + "@aws-amplify/analytics" "^3.2.8" + "@aws-amplify/api" "^3.1.24" + "@aws-amplify/auth" "^3.3.6" + "@aws-amplify/cache" "^3.1.24" + "@aws-amplify/core" "^3.4.7" + "@aws-amplify/datastore" "^2.2.11" + "@aws-amplify/interactions" "^3.2.0" + "@aws-amplify/predictions" "^3.1.24" + "@aws-amplify/pubsub" "^3.0.25" + "@aws-amplify/storage" "^3.2.14" "@aws-amplify/ui" "^2.0.2" - "@aws-amplify/xr" "^2.1.23" + "@aws-amplify/xr" "^2.1.24" aws-sign2@~0.7.0: version "0.7.0" @@ -5995,9 +5996,9 @@ camelize@^1.0.0: integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= caniuse-lite@^1.0.30001111: - version "1.0.30001120" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001120.tgz#cd21d35e537214e19f7b9f4f161f7b0f2710d46c" - integrity sha512-JBP68okZs1X8D7MQTY602jxMYBmXEKOFkzTBaNSkubooMPFOAv2TXWaKle7qgHpjLDhUzA/TMT0qsNleVyXGUQ== + version "1.0.30001122" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001122.tgz#2c8ff631330d986a07a7ba7125cce77a1373b475" + integrity sha512-pxjw28CThdrqfz06nJkpAc5SXM404TXB/h5f4UJX+rrXJKE/1bu/KAILc2AY+O6cQIFtRjV9qOR2vaEp9LDGUA== capture-exit@^2.0.0: version "2.0.0" @@ -7025,14 +7026,14 @@ data-urls@^2.0.0: whatwg-url "^8.0.0" date-fns@^2.15.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.0.tgz#d34f0f5f2fd498c984513042e8f7247ea86c4cb7" - integrity sha512-DWTRyfOA85sZ4IiXPHhiRIOs3fW5U6Msrp+gElXARa6EpoQTXPyHQmh7hr+ssw2nx9FtOQWnAMJKgL5vaJqILw== + version "2.16.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz#05775792c3f3331da812af253e1a935851d3834b" + integrity sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ== dayjs@^1.8.15: - version "1.8.34" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.34.tgz#d3ad33cc43d6b0f24cb8686b90aad2c653708069" - integrity sha512-Olb+E6EoMvdPmAMq2QoucuyZycKHjTlBXmRx8Ada+wGtq4SIXuDCdtoaX4KkK0yjf1fJLnwXQURr8gQKWKaybw== + version "1.8.35" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.35.tgz#67118378f15d31623f3ee2992f5244b887606888" + integrity sha512-isAbIEenO4ilm6f8cpqvgjZCsuerDAz2Kb7ri201AiNn58aqXuaLJEnCtfIMdCvERZHNGRY5lDMTr/jdAnKSWQ== debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" @@ -7368,9 +7369,9 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.523: - version "1.3.555" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.555.tgz#a096716ff77cf8da9a608eb628fd6927869503d2" - integrity sha512-/55x3nF2feXFZ5tdGUOr00TxnUjUgdxhrn+eCJ1FAcoAt+cKQTjQkUC5XF4frMWE1R5sjHk+JueuBalimfe5Pg== + version "1.3.558" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.558.tgz#a329d3139cb33e8652a7e7db4c5ae26e294b9f60" + integrity sha512-r6th6b/TU2udqVoUDGWHF/z2ACJVnEei0wvWZf/nt+Qql1Vxh60ZYPhQP46j4D73T/Jou7hl4TqQfxben+qJTg== emittery@^0.7.1: version "0.7.1" @@ -7448,9 +7449,9 @@ envinfo@^7.7.2: integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA== enzyme-adapter-react-16@^1.15.2: - version "1.15.3" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.3.tgz#90154055be3318d70a51df61ac89cfa22e3d5f60" - integrity sha512-98rqNI4n9HZslWIPuuwy4hK1bxRuMy+XX0CU1dS8iUqcgisTxeBaap6oPp2r4MWC8OphCbbqAT8EU/xHz3zIaQ== + version "1.15.4" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.4.tgz#328a782365a363ecb424f99283c4833dd92c0f21" + integrity sha512-wPzxs+JaGDK2TPYzl5a9YWGce6i2SQ3Cg51ScLeyj2WotUZ8Obcq1ke/U1Y2VGpYlb9rrX2yCjzSMgtKCeAt5w== dependencies: enzyme-adapter-utils "^1.13.1" enzyme-shallow-equal "^1.0.4" @@ -7917,18 +7918,18 @@ esquery@^1.0.1: estraverse "^5.1.0" esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -10292,9 +10293,9 @@ json-parse-better-errors@^1.0.1: integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-parse-even-better-errors@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz#371873c5ffa44304a6ba12419bcfa95f404ae081" - integrity sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q== + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" @@ -10717,7 +10718,7 @@ lodash.times@^4.3.2: resolved "https://registry.yarnpkg.com/lodash.times/-/lodash.times-4.3.2.tgz#3e1f2565c431754d54ab57f2ed1741939285ca1d" integrity sha1-Ph8lZcQxdU1Uq1fy7RdBk5KFyh0= -lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.1: +lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.1: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -12529,9 +12530,9 @@ react-native-app-intro-slider@^4.0.2: integrity sha512-Zkjaol6X3BbZkHUpVDj2LjdidpS6rCgKi0fx80xgGKa0pHxBRd4swWTv2bHnnvu5k1/HXwYk0mY2TbK+2jHl5w== react-native-autoheight-webview@^1.4.1: - version "1.5.3" - resolved "https://registry.yarnpkg.com/react-native-autoheight-webview/-/react-native-autoheight-webview-1.5.3.tgz#180837a71c2f8f4ef692cbcc92e65c867953aab9" - integrity sha512-EC9RAmsqit1fuXsFNqJt7w/WlLC9iRQcE+8Wk7+Mj+ptxK7wf9Q4Ohzp71/QYsdDvPEifg+Txw5xSBgcjeWrhQ== + version "1.5.4" + resolved "https://registry.yarnpkg.com/react-native-autoheight-webview/-/react-native-autoheight-webview-1.5.4.tgz#3b16418cc699ca3e87617313ab966264d20eaf1a" + integrity sha512-MIab40JTyQwaD97fCWv1OoRpNwKzeaL4hMP25dBgFaJbeUEXZ1mORgcwu+IrQOLHihC+fFru5KqjAwvLu4iimQ== dependencies: prop-types "^15.7.2" @@ -12995,9 +12996,9 @@ react-proxy@^1.1.7: react-deep-force-update "^1.0.0" react-query@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/react-query/-/react-query-2.13.1.tgz#1232dadcfded18d7bd886f421a4a4662f0992830" - integrity sha512-PosCQJ3ENaT6+vVaN79rGtpZ0BOeaREQuM/iiuNMQi+XWQVWMJBmDiZin4yk046CjbSTQy6lm7kS8QI5XiuivA== + version "2.14.1" + resolved "https://registry.yarnpkg.com/react-query/-/react-query-2.14.1.tgz#d4a0a721c6155fc7dc682e036c284243ff48f74e" + integrity sha512-3NONArLC0SrYSOmdJMHBGkQBNFo76YjLgN38bpWXz5NIeK0qaVxjwqobfipSX3N7dsHbLGFV9jImkky0DHLfoA== react-redux@^7.0.0, react-redux@^7.1.3: version "7.2.1" @@ -14910,9 +14911,9 @@ uglify-es@^3.1.9: source-map "~0.6.1" uglify-js@^3.1.4: - version "3.10.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.2.tgz#8cfa1209fd04199cc8a7f9930ddedb30b0f1912d" - integrity sha512-GXCYNwqoo0MbLARghYjxVBxDCnU0tLqN7IPLdHHbibCb1NI5zBkU2EPcy/GaVxc0BtTjqyGXJCINe6JMR2Dpow== + version "3.10.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.3.tgz#f0d2f99736c14de46d2d24649ba328be3e71c3bf" + integrity sha512-Lh00i69Uf6G74mvYpHCI9KVVXLcHW/xu79YTvH7Mkc9zyKUeSPz0owW0dguj0Scavns3ZOh3wY63J0Zb97Za2g== ulid@2.3.0: version "2.3.0" @@ -15071,9 +15072,9 @@ uri-js@^3.0.2: punycode "^2.1.0" uri-js@^4.2.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.3.0.tgz#e16cb9ef7b4036d74be59dc7342258e6f1aca20e" - integrity sha512-Q9Q9RlMM08eWfdPPmDDrXd8Ny3R1sY/DaRDR2zTPPneJ6GYiLx3++fPiZobv49ovkYAnHl/P72Ie3HWXIRVVYA== + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== dependencies: punycode "^2.1.0"