From 766729d5d32c80449a7dc8759d503ea51765c3f9 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sun, 31 Jul 2022 12:38:42 -0500 Subject: [PATCH 001/128] Naming standards --- squarenotsquare/{Launcher.js => SquareNotSquare.js} | 0 squarenotsquare/__tests__/DB-test.js | 12 ++++++------ squarenotsquare/index.js | 8 ++++---- squarenotsquare/src/navigation/SquareNav.js | 4 ++-- squarenotsquare/src/navigation/SquareStack.js | 4 ++-- squarenotsquare/src/realm/{dbAPI.js => DbAPI.js} | 8 ++++---- squarenotsquare/src/realm/{dbInit.js => DbInit.js} | 0 squarenotsquare/src/redux/CreateStore.js | 4 ++-- squarenotsquare/src/redux/actions/SystemActions.js | 6 +++--- 9 files changed, 23 insertions(+), 23 deletions(-) rename squarenotsquare/{Launcher.js => SquareNotSquare.js} (100%) rename squarenotsquare/src/realm/{dbAPI.js => DbAPI.js} (85%) rename squarenotsquare/src/realm/{dbInit.js => DbInit.js} (100%) diff --git a/squarenotsquare/Launcher.js b/squarenotsquare/SquareNotSquare.js similarity index 100% rename from squarenotsquare/Launcher.js rename to squarenotsquare/SquareNotSquare.js diff --git a/squarenotsquare/__tests__/DB-test.js b/squarenotsquare/__tests__/DB-test.js index 09c6dbe..a34b916 100644 --- a/squarenotsquare/__tests__/DB-test.js +++ b/squarenotsquare/__tests__/DB-test.js @@ -1,5 +1,5 @@ -import { initDB } from '../src/realm/dbInit'; -import dbAPI from '../src/realm/dbAPI'; +import { initDB } from '../src/realm/DbInit'; +import DbAPI from '../src/realm/DbAPI'; test('Realm DB inits', () => { return initDB('negTest', 'negTest') @@ -32,7 +32,7 @@ test('Realm DB returns null after exceptions', () => { test('dbAPI calls system repo getAllSystemValues()', () => { return initDB('isNull', 'isNull') .then( () => { - let returned = dbAPI.getAllSystemValues(); + let returned = DbAPI.getAllSystemValues(); expect(returned).toEqual({}); }); }); @@ -40,7 +40,7 @@ test('dbAPI calls system repo getAllSystemValues()', () => { test('dbAPI calls system repo createSystemValue()', () => { return initDB('isNull', 'isNull') .then( () => { - let returned = dbAPI.createSystemValue(); + let returned = DbAPI.createSystemValue(); expect(returned).toEqual(true); }); }); @@ -48,7 +48,7 @@ test('dbAPI calls system repo createSystemValue()', () => { test('dbAPI calls system repo deleteSystemValue()', () => { return initDB('isNull', 'isNull') .then( () => { - let returned = dbAPI.deleteSystemValue(); + let returned = DbAPI.deleteSystemValue(); expect(returned).toEqual(true); }); }); @@ -56,7 +56,7 @@ test('dbAPI calls system repo deleteSystemValue()', () => { test('dbAPI calls system repo getSystemValue()', () => { return initDB('isNull', 'isNull') .then( () => { - let returned = dbAPI.getSystemValue('notakey'); + let returned = DbAPI.getSystemValue('notakey'); expect(returned.id).toEqual(null); }); }); \ No newline at end of file diff --git a/squarenotsquare/index.js b/squarenotsquare/index.js index 16b4988..a5e1ef4 100644 --- a/squarenotsquare/index.js +++ b/squarenotsquare/index.js @@ -1,12 +1,12 @@ import React from 'react'; import {AppRegistry} from 'react-native'; import {name as appName} from './app.json'; -import SquareNotSquare from './Launcher'; -import configStore from './src/redux/CreateStore'; +import SquareNotSquare from './SquareNotSquare'; +import ConfigStore from './src/redux/CreateStore'; import { appInit } from './src/redux/actions/SystemActions'; -const squareStore = configStore; -squareStore.dispatch(appInit()); +const ConfigStore = configStore; +ConfigStore.dispatch(appInit()); const ProppedContainer = () => { return ; diff --git a/squarenotsquare/src/navigation/SquareNav.js b/squarenotsquare/src/navigation/SquareNav.js index 9030f3a..f23c207 100644 --- a/squarenotsquare/src/navigation/SquareNav.js +++ b/squarenotsquare/src/navigation/SquareNav.js @@ -1,8 +1,8 @@ import { createRef } from "react"; -export const squareRef = createRef(); +export const SquareRef = createRef(); export function navigate(name, params) { - squareRef.current?.navigate(name, params); + SquareRef.current?.navigate(name, params); return true; } \ No newline at end of file diff --git a/squarenotsquare/src/navigation/SquareStack.js b/squarenotsquare/src/navigation/SquareStack.js index 28bce3f..0152129 100644 --- a/squarenotsquare/src/navigation/SquareStack.js +++ b/squarenotsquare/src/navigation/SquareStack.js @@ -1,7 +1,7 @@ import React from 'react'; import {NavigationContainer} from '@react-navigation/native'; import {createStackNavigator} from '@react-navigation/stack'; -import {squareRef} from './SquareNav'; +import {SquareRef} from './SquareNav'; import Home from '../screens/Home'; import Game from '../screens/Game'; @@ -15,7 +15,7 @@ function SquareStack() { let noHeader = {headerShown: false}; return ( - + { - await dbAPI.initDB(); + await DbAPI.initDB(); dispatch(onInit()); } } -- 2.20.1 From 92ba010d447511c7f0da82dd5e94a2917cd417f7 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sun, 31 Jul 2022 12:50:28 -0500 Subject: [PATCH 002/128] square readme --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index a328e9d..4711e52 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,7 @@ # squarenotsquare +Coding conventions: +- Lower-case single-word folder names +- Upper-case single-word file names +- Upper-case exports IF export is an object or reference +- Lower-case exports IF export is a function \ No newline at end of file -- 2.20.1 From 90e49a65047c9fbdc3d260a4174e4973c48609d6 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sun, 31 Jul 2022 13:06:48 -0500 Subject: [PATCH 003/128] readme updates --- README.md | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4711e52..62d8dd2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,32 @@ # squarenotsquare -Coding conventions: +## Dependencies +- Node version 18 + +## Running the app +- Clone the repo +- Navigate to the directory in a cli with node accessible +- Run the command **npm install** +- Wait for the installation to complete +- Start an Android or iOS simulator (or connect a device with USB debugging configured) +- In the cli, pass the command **npm run android** or **npm run ios** +- Wait for the build to complete and install on the device + +## Coding Conventions - Lower-case single-word folder names - Upper-case single-word file names - Upper-case exports IF export is an object or reference -- Lower-case exports IF export is a function \ No newline at end of file +- Lower-case exports IF export is a function + +## Testing Scripts +- "npm run **test**": run all tests with minimal console output +- "npm run **testVerbose**": run all tests with all console output +- "npm run **testCoverage**": produce coverage report for all project code +- "npm run **testActionCreators**": only test action creators +- "npm run **testApp**": only test app screens and components +- "npm run **testMigrations**": only test database migrations +- "npm run **testRepos**": only test database repositories +- "npm run **testDB**": only test database setup and API calls +- "npm run **testNav**": only test navigation +- "npm run **testThemes**": only test app theming and styles setup +- "npm run **testServices**": only test app services \ No newline at end of file -- 2.20.1 From cf354d58800c8e3ab2c2b65efa289ef2f5acb69f Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sun, 31 Jul 2022 23:27:37 -0500 Subject: [PATCH 004/128] cryptographically secure RNG --- squarenotsquare/src/libs/Random.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/libs/Random.js b/squarenotsquare/src/libs/Random.js index aeea885..ceec7c6 100644 --- a/squarenotsquare/src/libs/Random.js +++ b/squarenotsquare/src/libs/Random.js @@ -1,11 +1,20 @@ +import 'react-native-get-random-values'; + export function generateKey() { let result = []; const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let charactersLength = characters.length; + + let uintArray = new Uint8Array(64); + let newKey = crypto.getRandomValues(uintArray); for (let i = 0; i < 64; i++) { + let newCharIndex = newKey[i]; + while(newCharIndex > charactersLength){ + newCharIndex -= charactersLength; + } result.push( - characters.charAt(Math.floor(Math.random() * charactersLength)), + characters.charAt(newCharIndex), ); } -- 2.20.1 From e37eeacdec76f371cd1c5c59523f7a573fbd45cd Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 00:14:27 -0500 Subject: [PATCH 005/128] calculate dimensions in metrics constructor --- squarenotsquare/src/themes/Metrics.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index 98fcf37..9484858 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -14,16 +14,20 @@ class AppMetrics { this.screenWidth = width; this.screenHeight = height; } + + this.screenSections = { + headerHeight: this.normalize(20), + sectionWidth: this.screenWidth + } + + this.icons = { + splashIcon: this.normalize(100) + } } normalize(size){ return (size * this.scalar); } - - screenSections = { - headerHeight: this.normalize(20), - sectionWidth: this.screenWidth - } } const Metrics = new AppMetrics(); -- 2.20.1 From 909dd3699fd3ec78c5c03b62e9c5c08f9a521ff9 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 00:14:33 -0500 Subject: [PATCH 006/128] icons --- squarenotsquare/src/themes/Icons.js | 1 + 1 file changed, 1 insertion(+) diff --git a/squarenotsquare/src/themes/Icons.js b/squarenotsquare/src/themes/Icons.js index 6820b80..1e20525 100644 --- a/squarenotsquare/src/themes/Icons.js +++ b/squarenotsquare/src/themes/Icons.js @@ -1,5 +1,6 @@ class AppIcons { squareIcons = { + square: 'square', settings: 'cog-outline', toggleOn: 'toggle-switch-on', toggleOfff: 'toggle-switch-off' -- 2.20.1 From da55313a1b257758d878e0aae0588ca10ecb40f9 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 00:14:39 -0500 Subject: [PATCH 007/128] dark font style --- squarenotsquare/src/screens/styles/AppStyles.js | 1 + 1 file changed, 1 insertion(+) diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index 1fee9d5..2ac49d9 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -50,6 +50,7 @@ export const styles = StyleSheet.create({ subFont: {fontSize: Fonts.subFont.size}, italic: {fontStyle: 'italic'}, + darkText: {color: Colors.fonts.dark}, greyText: {color: Colors.material.grey600}, redText: {color: Colors.material.red800}, blueText: {color: Colors.material.blue400}, -- 2.20.1 From 0d1c32e3a38ebff080b9f4c66b0bcc0e50fbaa63 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 00:14:53 -0500 Subject: [PATCH 008/128] include vector icons in android build --- squarenotsquare/android/app/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/squarenotsquare/android/app/build.gradle b/squarenotsquare/android/app/build.gradle index 9117853..180c638 100644 --- a/squarenotsquare/android/app/build.gradle +++ b/squarenotsquare/android/app/build.gradle @@ -310,6 +310,7 @@ task copyDownloadableDepsToLibs(type: Copy) { } apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) +apply from: "../../node_modules/react-native-vector-icons/fonts.gradle" def isNewArchitectureEnabled() { // To opt-in for the New Architecture, you can either: -- 2.20.1 From 5dc4a4bc57adea9bb49a341f568529e37fca50dd Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 00:15:01 -0500 Subject: [PATCH 009/128] store rename --- squarenotsquare/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/index.js b/squarenotsquare/index.js index a5e1ef4..07b87ea 100644 --- a/squarenotsquare/index.js +++ b/squarenotsquare/index.js @@ -5,8 +5,8 @@ import SquareNotSquare from './SquareNotSquare'; import ConfigStore from './src/redux/CreateStore'; import { appInit } from './src/redux/actions/SystemActions'; -const ConfigStore = configStore; -ConfigStore.dispatch(appInit()); +const squareStore = ConfigStore; +squareStore.dispatch(appInit()); const ProppedContainer = () => { return ; -- 2.20.1 From 558218d577c7a96d4229d97272534725c6ac27b0 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 00:27:01 -0500 Subject: [PATCH 010/128] Basic animated view --- squarenotsquare/src/screens/Splash.js | 47 ++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/squarenotsquare/src/screens/Splash.js b/squarenotsquare/src/screens/Splash.js index fa261a7..53113a9 100644 --- a/squarenotsquare/src/screens/Splash.js +++ b/squarenotsquare/src/screens/Splash.js @@ -1,12 +1,51 @@ import React from "react"; -import { Text, View } from "react-native"; -import { useState } from "react"; +import { Animated, Easing, Text, View } from "react-native"; +import { useEffect, useState } from "react"; +import { styles } from './styles/AppStyles'; +import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; +import Icons from '../themes/Icons'; +import Colors from "../themes/Colors"; +import Metrics from "../themes/Metrics"; +const spinValue = new Animated.Value(0); function Splash(props){ + useEffect(() => { + Animated.loop( + Animated.timing(spinValue, { + toValue: 1, + duration: 3000, + easing: Easing.linear, + useNativeDriver: true, + })).start(); + }, []); + + const spin = spinValue.interpolate({ + inputRange: [0, 1], + outputRange: ['0deg', '360deg'], + }); + return ( - - test + + + + Square Not Square + + + + + Loading... + + + + + + + ); } -- 2.20.1 From 0a5b60aed610a07546b3be0c7c0fbc322d69c9de Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 17:39:50 -0500 Subject: [PATCH 011/128] drop shadows --- squarenotsquare/src/screens/styles/AppStyles.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index 2ac49d9..2120d01 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -33,6 +33,17 @@ export const styles = StyleSheet.create({ left: 0, right: 0, }, + + dropShadow: { + elevation: Metrics.shadows.elevation, + shadowOffset: { + width: Metrics.shadows.offsetWidth, + height: Metrics.shadows.offsetHeight + }, + shadowColor: Colors.material.dark, + shadowOpacity: Metrics.shadows.opacity, + shadowRadius: Metrics.shadows.radius + }, spaceBetween: {justifyContent: 'space-between'}, spaceEvenly: {justifyContent: 'space-evenly'}, -- 2.20.1 From 5221c0a0aed8f93ee83386893e8f970207a28274 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 21:38:05 -0500 Subject: [PATCH 012/128] square logo --- .../android/app/src/main/assets/squarelogo.png | Bin 0 -> 11592 bytes squarenotsquare/src/assets/squarelogo.png | Bin 0 -> 11592 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 squarenotsquare/android/app/src/main/assets/squarelogo.png create mode 100644 squarenotsquare/src/assets/squarelogo.png diff --git a/squarenotsquare/android/app/src/main/assets/squarelogo.png b/squarenotsquare/android/app/src/main/assets/squarelogo.png new file mode 100644 index 0000000000000000000000000000000000000000..7f3925c2479a18db1f415e88ad563b6f4f961a1f GIT binary patch literal 11592 zcmeHtcT`hZzi23e49&675fubcDT+WS0TdOGrlR!TA<}zC`IHe51`v=gqM%f%p+!I^ zNKKHcbRiU}5(pUT-RFRF?;rQBb-%gaTkpR0X0hOqoxOj(@ALSkmJ0JPT)!X?2xc|a ztG5vdni=T#ARSoI%vd<#mKw#>~l_M1*9&zf*?hxhdJEDs<$E6y_|g*{=^+X*iVcSmr1Q zMF{)$^`pqQhjD(1KBJkv`9w{+AGG5JIoxc^bjzzbuRKPCqTj~7Jd}APhRgHvxJpr* zXuX@L?EG}{ul(^DLeYm9aV&{)&k~ptd?S!Kuel~S%S6wmVUYO=Tfhkn%yu{kUM2oLF8jwHsl+@<6HNS$}{q)hO4#UCi6GI5!& zf)9@c@wtra&)rmg*{35xdaOb8K!rSYdEgHSjtp-S}N?|l~V=b-1`i~kdW zC_Sh7d7M`Er#%1bMI}Bi@y2}2VkNoo7}#x!eZuZ^rr`T*RT!iUYTlp9IMGQ3{)IL4 z|HP)%C z25#zS#oQxJa4fM@3R#Ct5tZa5HwP!&pQop7bGG02zP*NtC*96_NIx)(G1aQrc=dD| z+m&edF3u8f9}$(Kn)*`p;_p&44jvila@kpS{7UC*PhY^vI{S;9|Be@MlzDn8{5EmYT5G`3DXv0sJG{PW{zb6kEjQQUo6D{J(`;hXKP*FR z*~P4Nm+uI&*KQ%GfW0?-E-MaF&TxKoaR}cW-%&0_`q@jzFl5FGd*DT zfX?E*oF$CvE{8L{=#LxN=bG3P>`!yGP`UoI4R3m}Z%B1+kj%tQ>pC-1mio`R2cUKb zco)VJ*uJ^=NOiA|e$gPreR^ePXteNdw%swn_9!bC9mIoGud9dmVsX;cBY$VPxc4Wl z+M~U{w}$YdmRlP?U8}B>Ez`e?O3Wgeet_KFyui0qM$xBV-CYOuQF*lKe(X_-A*y)W z5G9tR+ZO4O&uehUS&9iti5tE6sSb)WRshpi_Kx(x=m|A!Yc^)Jr`G%Ih&7)M9N)PfN8Ipt4$uh-EaK3=oo2Fq z0x0hKeYY2vs1QoK4i{zCpO~f)o)lo$+Omay^9aVPMg;n;{$tI9A6<-fS?#)%eD5d+ z{m^B4#Ee9Y6xw}rrpqri)uFbqvA8swx6XZHrt}=aWeRU5_x*EsTdU@E*!kwjfdPh6 zF&P=fy(>ZZw9)1%+kwRn{&Opfj=^p_4XhGnz71!@>HH$)5K4TXbO3N_MDCK!0ZhEc9|E! zLt6fuioCMbK`JZt5t6+$GVg|LVL=C3YGO3&KyF>qCVdiU+ZIO}zPm+msJ~V0hcsA8 z2D#;jWp2nb&36|M0pn4^SSUOt65<1!xje1?;zA631~;SyDT81ehZMsqdnS+_lH|72 zC$KAs|8|7$2FV56e;P{6f*NVNx8g!HPd%Cua?vCeWBY|Vh3as;h_U8>P}&7TVu>I6 zo@c9AYdNi#`J?u^o_I&?H;f~*mMA}9Da1CDj;tAPNR4TGwzNJY( zPe1GeF+zYlpx6vvrXWK?;zBgsGbA~}@NL>7q@7?L$dWnQ+;;5L6f&(#Bso5?2~h%< z$V@yo#}CsZzHht_bd0ONLHZRfuEi5ibmL2JYa&*pAA9_GsJia$138L{BwlY)Xw*X#|8<&wyI3B{0uDBOidfO{ zcUzR0{vIhhcde$_oCd@?*Q*nO7Gii*A#ZTC5BXG3mM|nQp2x_{fk=;050?6oP5)Sh z-lGs27EJvO_X^IjyR|hw!%$cs`>qdkt*B1=RlUJwo*z3$4`DBs!;fYX#YCuzznHBR z@k8+HrjYe@?9(6hX-vzk{9}WwVJvlt$PlZz7$Jju%)Y}w_`XXu)DWTh(JRSVq#}XK z^>bQ(t;@_1mDC##^iHPbLBLkS)zZRuND$Ys6}%hm9prg$qo9&KXpJii4%Kd}e-OZ#?kCwo!8?>b zy7PnX{pXk&?Aflw#V|Kiyq`SS1sGA;jbd(Q+&y^<+%?Kh8 zP4Phs5kq&xYWfa~S3*y3v)cEEAS+%TAK8eSx2G>Ir;QSk8)!VYR7en~1u`_3_pLEV zpS#ZPE6x*jtN)3peWtT6H#JbHc;B#z7(w+Ht7F&J4$cz!a3~H-fRJ_=TCMCWb)Ps5iBMR~7RlBryFe z#TB#~OwhAXq8pY_@QQhmw|9A%o*}j1BPc1e_8n&nhXRA#dJkicK9%u0#DMIjp|p6p z)Nh+2R7cvxeXZXj73>{Zc?Xvu zVI+(1Y^RuY5ovH>WLa>=w-$MK*(4%%Q~E1`M`ZJ-gp;4QhSl=L~b0;kgP$k0=CE1(v(q7(;ug2Q35_yS?BB;PS(8 zdF_RO2BY_6s~Gkl*MZFU*GI+rex6ObEmBTB#sfRbypqv&BB1FY#D$euuA$R`2AKzt zWR1bQwLNRVe!(&Rx!!SB{tw=L^-EWOPKb|)MW3hI64W|-y(rmue$Q`Q4Rz~QsQ`n_ zkPJVvC2Rr)VUsoCCOsG0x6zS0_s>8Fdlu(_i*dKSK)MSEZhDMs*2_JnxbK6=!l7ML z0E-cZmH0zmc&rX~Vi$|*kHBK#cv1nnz?|GSB2-&vySsaoC#7I+qo1DQH!xY`eoOm3 zzd&@I`6%aJC{Z=MrC|5dmj^6I(M(7o*r8I*Mv@-lvbX^pA2zmd=QOhsJJ_N>x$083 zCVxhZ=)yCZ7pV7RiIW@UH{eikErtHbCRbJ&m<15-8XCR3$zwEsX)k!mVo6fE4b^ag zHdIP-0~$O4G1Q;K&N}&?guAScP; z&VW)zn^7x@9pr}`%+ml-o@S4|z#k@&Cj?Sj2#kdL>{82t$w(b2JwVTJ&?mxyMritu zHt$>Ns>MA|?3o=oFMR!-HN!KG#H0LXvK2M`dud2#l2TCUZDs?$=+mt&&Lh=<+zuv1 zGoT@)>*k_vs%|WoDI0Kx(@A~GE%|3{`KX7d%>!%e26Wob9ESz>JhL$GxCHfnesp?W zC!M5AsEK5m=y}y!hP(Ogt1A>sE_@ww4F9!(%nS#$$kqgw(x+ zuRcN)<*q7%$#!w`(-U=L=WTkTo`=PalSKCt_KOwyZ=Cy?AM}n=d_HTn3#8NP z4WCP2a!|Uy^s??j63aO@=;1&n-c1ZGne3Wv$p@eJDAm?w4wRct+MI$aqm{Ox6+Py_ zK_Jy52*kt^ds>(Q)C7W477Gnl+DS6@2e)>U7(i`gZ%{3~ROB6C&a+zWqgNYgGby-V zovqLZKYN91WKIm-DKAG>ecigx#|0I^;v*gBk2l-UXa{y4?#vYB_8kwCh@@wNYsZ7S zx)@@dV=<;iIkWoZfKfq#^Il1J%0LJ8^hks<#t;;h47e<#{yVIkFtktYKn&?La$=RV ztKmK@^L4(a)xC#6h!1^i@8#t&atk$AxY$|ZbBDl|pP#x{qBi&4VHIfk0193Cp;{Km zbTzC$CJn|BCBRZ(jt?&so1e`{nU;TzR8z2HK+Y=k*Y3czx=u(c(a1J5d&&qq#{wCb zV%hQw<_~HL>DEc03?ED&cJF^tf9Tuj>@`_e>!2DREX3Vd()A7YxUI0$W4}?tN4)4D zGcucVi8HpNL(Uh?nV3PI`hyH%r3hr+D8+#;;hq}l%?SAbv{jGy+vwc24J~xTTxA*i z^r!^9+JE?)v;f6APOktoCFj%>zSM%t5YSVk@NY+ARq0JrwSP7$i>kY|0+|)GTTKds zwZYIP*UwvCap-nL@qi?Djt*iboX`|0HNS*wN-CtP?@Nl`@>;5aCP57rF{>t6)m?3L zgBUpziyXE21=_B1v5Rl^+QyTwd0Mgn43z_aa(VS zZ^My(DfZpDmP`Rkfh0$`LMl<)zu05!42L)sqG2v#bz5!66AY5q1u1O;AN3zzSWFPe z90Hwiy~F_?6KJ%|lW`LWj!&bsn=8sfE(HBkvR^C zGAo5H7u8bH7Oy^YrfSianvpqnXn8`gt3HXy3bZfDL9=tRg>TgqqZBSL0BV8es~an7 z3Z-Bs5hFm+k9(+_MVP-q`UZ_69tb~Igy$R9%G-=;!HO-Ig3Ejq-MCTqX{d$~G<+Fy zu4U;oB~5aMCR3dh0EQ2pD)5wH=IVxP+%6UX9aV=09fj|2t+~b#d~e7>rnK|+&5Tq} zObdIagKn^!P7pi;*;Ybw0dFxXcyqjYd9u>FTak-)<0+;JNWca-2dPMHH&!uiRn_f^ z+l+3c>&vv8JT+uiA=K?UbXUlh0RH~FDQKdjqN^uuXHl{-u1OZIuFhC+mJRPc-8*8b zNxliqv8b&6AqV8ao1*93v81)JUXZ!!S^~mDl*FL>kfxEni zdJ|jjqgxd;F(_=okTnye3La4~%aU>UzL-0T+!(}Zl3$>Gpw{K#E;or9BSohH=vQWxmGcr7ceJLRO9S<84MD|1=Q%eq4*mCMO(v?;l15mAfm1) z(p65cx_i0#VCDP!J%SX19t7A`fDhxTW6_`?ddPoR7$!N z5V=1Rgvs=DvZy{?Z{*w})0-Lz8b9~^n|$j~av8a^&fo`)hy*l(-g^QXA)6DP$b2+DVMJ9X07XR9P zEN&`ooSys`>h+?(dXG`hd7@u)U{^#YGZ+c4Gn#Mu#axD>l(@x%w{=3wlPH5!19k=D z;?_$4Ghm|Z_j>5oS|zF4(nc~3Dm$7z=-^28$2M-MI?XUhE?2ijZr~V>zoYaXX!dHd zlNBt}`6oc#)0ohkp)8aXV+$z_;$v)D^IWCf-3nBG9*@6Xz>Q^lkK4iee3^r(oQnnZ zTIe?Ri0*v5(t<$w?#OT^YT!W#)AVmRWrMq@r+4p?7QNj{%4B2)QztykBvu}oEWB(x zznU*{o@LkwaJ1y9R!Au%FpfQcJbkNK)hdueLVck{)H*>9O=F zZ_J=Jj^H~w_J<`gKR01>wDzU%Nyau5=UL3F-(nV^QZY38C}+z9QpWi+@gBh>%t-Bj zev1;*yW0en*onu)g3NDKiz(w6ll55a443&8;ZC-5H0PLNYx%5-48<;Fj)s2lA)jxN z$?w>ODEV%!j*PX>OrU$i$1f0{1PnS}?hl#za&5ck#rRlF)_6iOLBtfljN54!HEk{! zf1@GlP08A`3k&y>bIQ0PrtPiK9sjsuzI)ouJMAs^y&cyuA19UMWHu$9(JZ{2cM+O= zb%&9)yw?Sr=12yOSHLR~Lf~m!+NYzOnz2%9vDPP?=(?t!l@pHZTpCpr?MSrJaY?`3 zv+HF%YoZgWoP3+7wI|B@hMTxfWYWb~pEKY1NySIe_bH3W5LIvsEUB@9>8ljkhlH4_|FQY zhT*3w{+8vx%#NV4=dWd&?;(R_VO$`A&{;Ot&sbP8$Qv?jnh5@{&LptOL6!NQ5B_!L z|5Cz)s=2>kd4tN}e_{6i>#-SD$N$~q&+X#$p~@@T@9&fVYL0(#T>od?n@67rb+zb<`GbE0^VBIl literal 0 HcmV?d00001 diff --git a/squarenotsquare/src/assets/squarelogo.png b/squarenotsquare/src/assets/squarelogo.png new file mode 100644 index 0000000000000000000000000000000000000000..7f3925c2479a18db1f415e88ad563b6f4f961a1f GIT binary patch literal 11592 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 literal 0 HcmV?d00001 -- 2.20.1 From ce740c773619abf8610284ffe57161867827914c Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 21:38:15 -0500 Subject: [PATCH 013/128] added to gitignore --- squarenotsquare/.gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/squarenotsquare/.gitignore b/squarenotsquare/.gitignore index 0574a1a..ff0a04c 100644 --- a/squarenotsquare/.gitignore +++ b/squarenotsquare/.gitignore @@ -63,8 +63,7 @@ buck-out/ /vendor/bundle/ #VScode -launch.json -settings.json +/.vscode/ #jest coverage/ \ No newline at end of file -- 2.20.1 From 49c7c0a6ca8b77ea65ea61509cd1397afa9adf5c Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 21:38:29 -0500 Subject: [PATCH 014/128] move spinner to separate class --- squarenotsquare/src/components/Spinner.js | 39 +++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 squarenotsquare/src/components/Spinner.js diff --git a/squarenotsquare/src/components/Spinner.js b/squarenotsquare/src/components/Spinner.js new file mode 100644 index 0000000..0f23561 --- /dev/null +++ b/squarenotsquare/src/components/Spinner.js @@ -0,0 +1,39 @@ +import React from "react"; +import { Animated, Easing} from "react-native"; +import { useEffect } from "react"; +import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; +import Icons from '../themes/Icons'; +import Colors from "../themes/Colors"; +import Metrics from "../themes/Metrics"; + +const spinValue = new Animated.Value(0); + +function Spinner(){ + + useEffect(() => { + Animated.loop( + Animated.timing(spinValue, { + toValue: 1, + duration: 3000, + easing: Easing.linear, + useNativeDriver: true, + })).start(); + }, []); + + const spin = spinValue.interpolate({ + inputRange: [0, 1], + outputRange: ['0deg', '360deg'], + }); + + return ( + + + + ) +} + +export default Spinner; \ No newline at end of file -- 2.20.1 From 5180a6baf893c33130846adeb19cf958bfcce382 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 21:38:37 -0500 Subject: [PATCH 015/128] Splash screen --- squarenotsquare/src/screens/Splash.js | 53 ++++++--------------------- 1 file changed, 12 insertions(+), 41 deletions(-) diff --git a/squarenotsquare/src/screens/Splash.js b/squarenotsquare/src/screens/Splash.js index 53113a9..d84906a 100644 --- a/squarenotsquare/src/screens/Splash.js +++ b/squarenotsquare/src/screens/Splash.js @@ -1,51 +1,22 @@ import React from "react"; -import { Animated, Easing, Text, View } from "react-native"; +import { Image, Platform, Text, View } from "react-native"; import { useEffect, useState } from "react"; import { styles } from './styles/AppStyles'; -import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; -import Icons from '../themes/Icons'; -import Colors from "../themes/Colors"; -import Metrics from "../themes/Metrics"; -const spinValue = new Animated.Value(0); function Splash(props){ + let splashLogo = null; - useEffect(() => { - Animated.loop( - Animated.timing(spinValue, { - toValue: 1, - duration: 3000, - easing: Easing.linear, - useNativeDriver: true, - })).start(); - }, []); - - const spin = spinValue.interpolate({ - inputRange: [0, 1], - outputRange: ['0deg', '360deg'], - }); - + if (Platform.OS === 'android') { + splashLogo = {uri: 'asset:/squarelogo.png'}; + } else { + splashLogo = {url: 'squarelogo'} + } return ( - - - - Square Not Square - - - - - Loading... - - - - - - - + + ); } -- 2.20.1 From ed540ae799f55be3246da451745a9438c8dab965 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 21:38:53 -0500 Subject: [PATCH 016/128] Splash logo metrics --- squarenotsquare/src/screens/styles/AppStyles.js | 5 +++++ squarenotsquare/src/themes/Colors.js | 3 +++ squarenotsquare/src/themes/Metrics.js | 15 +++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index 2120d01..f3675a2 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -69,5 +69,10 @@ export const styles = StyleSheet.create({ body: { backgroundColor: Colors.material.light, + }, + + splashLogo: { + width: Metrics.images.splashLogo.width, + height: Metrics.images.splashLogo.height } }) \ No newline at end of file diff --git a/squarenotsquare/src/themes/Colors.js b/squarenotsquare/src/themes/Colors.js index 157821a..1c9545a 100644 --- a/squarenotsquare/src/themes/Colors.js +++ b/squarenotsquare/src/themes/Colors.js @@ -9,6 +9,9 @@ class AppColors { //400 blue400: '#5c6bc0', grey400: '#bdbdbd', + green400: '#66bb6a', + green400light: '#98ee99', + green400dark: '#338a3e', //600 grey600: '#757575', diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index 9484858..f150814 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -15,6 +15,14 @@ class AppMetrics { this.screenHeight = height; } + this.shadows = { + elevation: 10, + offsetWidth: 10, + offsetHeight: 10, + opacity: 1, + radius: 0 + } + this.screenSections = { headerHeight: this.normalize(20), sectionWidth: this.screenWidth @@ -23,6 +31,13 @@ class AppMetrics { this.icons = { splashIcon: this.normalize(100) } + + this.images = { + splashLogo: { + width: this.screenWidth * 0.33, + height: this.screenWidth * 0.33 + } + } } normalize(size){ -- 2.20.1 From 861de15c652fdce7ad0e6a53f20be4b2616f222c Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 21:49:35 -0500 Subject: [PATCH 017/128] square icons --- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3056 -> 849 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2096 -> 702 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4569 -> 942 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6464 -> 1179 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9250 -> 1387 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/squarenotsquare/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/squarenotsquare/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index a2f5908281d070150700378b64a84c7db1f97aa1..385a506e5c4d4d2620e404f7519bea49d3b8b8e6 100644 GIT binary patch delta 827 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 anRn7Gp~$zJpS^p)00f?{elF{r5}E)#n2#m^ literal 4569 zcmV;~5hm`5P)gh-ObE_muwxq>sEpX)ywtgCHKIATY}p&%F4bRV>R9rYpeWbT(xnE7}?(HDXFgNDdC^@gUdK& zk=MolYT3>rpR*$Ell2!`c zjrIZftl&PUxlH2EgV+3VfQy&FjhL&5*Zg&R8xrSx?WgB?YuLO-JDaP3jr*I~qiywy z`-52AwB_6L#X ztms{{yRkRfQLbsb#Ov%`)acN(OCewI3Ex__xed17hg#g4c1blx?sK}UQg%PM@N;5d zsg{y6(|`H1Xfbz@5x{1688tu7TGkzFEBhOPDdFK(H_NQIFf|(>)ltFd!WdnkrY&mp z0y@5yU2;u1_enx%+U9tyY-LNWrd4^Wi?x<^r`QbaLBngWL`HzX@G550 zrdyNjhPTknrrJn#jT0WD0Z)WJRi&3FKJ#Sa&|883%QxM-?S%4niK{~k81<(c11sLk|!_7%s zH>c$`*nP-wA8Dx-K(HE~JG_@Yxxa;J+2yr+*iVlh;2Eiw?e`D1vu6*qY1+XTe8RVu z?RV%L|Mk!wO}j^S)p4H%?G37StD0Rx{_Y00%3a+V^SyOkfV@ZuFlEc;vR9r-D>cYU&plUkXL|M%1AYBQ3DI;;hF%_X@m*cTQAMZ4+FO74@AQB{A*_HtoXT@}l=8awaa7{RHC>07s?E%G{iSeRbh z?h#NM)bP`z`zdp5lij!N*df;4+sgz&U_JEr?N9#1{+UG3^11oQUOvU4W%tD1Cie3; z4zcz0SIrK-PG0(mp9gTYr(4ngx;ieH{NLq{* z;Pd=vS6KZYPV?DLbo^)~2dTpiKVBOh?|v2XNA)li)4V6B6PA!iq#XV5eO{{vL%OmU z0z3ZE2kcEkZ`kK(g^#s)#&#Zn5zw!R93cW^4+g0D=ydf&j4o_ti<@2WbzC>{(QhCL z(=%Zb;Ax8U=sdec9pkk|cW)1Ko;gK{-575HsDZ!w@WOQ^Up)GGorc38cGxe<$8O!6 zmQ`=@;TG{FjWq(s0eBn5I~vVgoE}un8+#YuR$Asq?lobvVAO-`SBs3!&;QEKT>gZ0T)jG^Foo~J2YkV&mi-axlvC}-(J4S2 z;opuO)+FIV#}&4;wwisb>{XU+FJ~tyK7UaG@ZD^C1^brazu7Xkh5Od}&P)GufW=u# zMxOwfWJ3a^MZha>9OmQ)@!Y;v*4@+dg~s~NQ;q@hV~l>lw`P)d`4XF9rE?aEFe(JV zI>11}Ny%^CkO=VN>wCV?P!-?VdT3vWe4zBLV*?6XPqsC%n93bQXvydh0Mo+tXHO4^ zxQ{x0?CG{fmToCyYny7>*-tNh;Sh9=THLzkS~lBiV9)IKa^C~_p8MVZWAUb)Btjt< zVZ;l7?_KnLHelj>)M1|Q_%pk5b?Bod_&86o-#36xIEag%b+8JqlDy@B^*YS*1; zGYT`@5nPgt)S^6Ap@b160C4d9do0iE;wYdn_Tr(vY{MS!ja!t*Z7G=Vz-=j5Z⁣ zwiG+x#%j}{0gU~J8;<|!B1@-XaB@{KORFwrYg_8rOv({b0EO#DbeQRm;B6_9=mXGf z-x|VL{zd`)#@yN}HkCSJbjbNlE|zL3Wm9Q8HY`sV)}3%pgN>cL^67{Z;PPL(*wT8N zUjXU{@|*hvm}({wsAC=x0^ok0%UAz0;sogW{B!nDqk|JJ5x~4NfTDgP49^zeu`csl?5mY@JdQdISc zFs!E{^grmkLnUk9 zny~m)1vws@5BFI<-0Tuo2JWX(0v`W|t(wg;s--L47WTvTMz-8l#TL^=OJNRS2?_Qj z3AKT+gvbyBi#H*-tJ%tWD|>EV3wy|8qxfzS!5RW;Jpl5*zo&^UBU=fG#2}UvRyNkK zA06Dy9;K1ca@r2T>yThYgI!ont$(G{6q#2QT+00r_x0(b)gsE`lBB?2gr55gq^D3Fi&p%E(p9>U%bv zkg1Jco(RbyTX7FDHOnl7-O@ zI$AaIl?9NJKPm(WiBP`1-#CB1QzU>&hKm)fpa5DKE{2$X0hGz-0uZ?cyTk(YC!Y&| zL=1VrNERSA5NA2jq7FACfX4JfPyj5XXl1yv0>~s;eF7L2$>&oMqeTFT2m$y7FlkON z_yurD1yIOvA;5C6016pyxBznGUt0kJ&k5r#;&>Jow`r)sp9R~PmK~lz$3xH%LT*1U zJdOyABZ3!FvNoR*vN$5ykHS8f`jA4zV+|L}i1C4`B2c{R0;UdYxaU|H)2avz@ z=mEYc|2S<+(B2Tj+FkX+2D+yFI!k9lWMA61DJ{)e;lum$(;O87?vGJJe!KtK04+N_ zI*P~t@dUb>9Xh{dbyl{-ZQ(UMgz7$|QfL5XSPkskt^NgctYC#;4WcZB1@%@wy@2t3 z2z0DI7&%b$*Aw~abe?GxE`ez@+6hOh-6*8fHRV{1os$EL@}uUZeG4h1&Be`98q*7j z=3-v+lhIjfWVo12!<>%V^a6lTgW3+_#W6n|p*~==zOH7z$0{LSZk(Tpd7EaD04hnA zL;#fxS0aD{`5^&D`}>0Uq?byDD-l2=!wm_bLcUl4gc(% za1p|itVANvFF>hghAS07Im1;IK;|b*W)}VDyI;BIp2=K*yu2a)j?B|f<44NI$NbmJ z#dE0>jI$fMr&@>4kN8MLFb4&2O9fEKaQg%(QO$4_1rVQywG^CmBLh#}_7gKW3vd?| z2?1^&KWq8}8I^_S0|)MowU_pw$q@nl@Nkn$z>BQq_KA^9yaR`(R3u{{Ig;cwt z@AJ^{ODQCm^neroM9nKNUAXi9RCK`OsP_LuR0PUR(YZCCX5dNF6VzcoK&=b^r`W?ltt|*F zpkoae%ZT{C1h~EcFui~b7fF`vb<<~j_VquuUA$}QqIKYELPp#;{u?q8Dz}WAG-(3; zjrm$i%7UbyZMM(Y{>!uJ#vNB?R~B{6Htp=>e*<{fQQ5W7V(1coCWlOON!MzZxhum| ztZBQpGR z;~#ur^&PockKdV{Q6R>o`Pl{0x!DEbpZ7y9Y;*ZvE!*gU`V1W3znva{f=?WO5I&>B z&hw6}tjECtaghm5z|C#%M;Yf_*pI^};h}Vl=^r9EN=tVDj86D;C$jIJ?K7VP+00000NkvXXu0mjf D5i!M* diff --git a/squarenotsquare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/squarenotsquare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 8ca12fe024be86e868d14e91120a6902f8e88ac6..fd7f31cc3ead97e89922f503edb5c0a81662dc0c 100644 GIT binary patch literal 1179 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 B0*L?s diff --git a/squarenotsquare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/squarenotsquare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index b824ebdd48db917eea2e67a82260a100371f8a24..b9db5c39cd4cf78f7f98524aceaeae24e2e9903d 100644 GIT binary patch literal 1387 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zf+;U~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)MBDvkU9MVuWdemA0Y?uut>{=Bwva>AY3+qo%_o=EUs$5(Sy(6%!_D_k zCrmbGPHAa@D9b^40e5wES8>gcyO&&0I%eHhUGcs;{@p(2ma3VVVaF{Nyxca^>&Q`` zvd}kGt{hBf19?uKF?yz=$$9@{X+OjL_enOV_rE)Taq%-9HWrshk!dr`KC*rMvMjgY zo_gPgMQeoS3-`|~aeU;yPFrq&q23Oi4`(`N`kfVa?>Oott(|+OYnhvkt4yfr+)u4N z$F-j8o{QRfYS#BB`aI9SOif*PS;~c}JEDn2kZYC3LLOGnTU ztqeYUR;^v?+TU<5_rarGOEs$xJmtIaKjp--H(riWPImlz=3g{VZQK{Vp!)3V=+83C z`5k6eP2I!D$JaQKDRuqtJ=Rz5ZLiOs_4hZUb5PNgx{7xmz<6Ox@^*J&_z!{$_AZ|c z6yYrJh%9Dc&{GCs#)_r(Wk5mp5>H=O_GcVSOnNe1MgbK-A;}Wgh!W@g+}zZ>5(ej@ z)Wnk16ovB4k_-iRPv3y>Mm}){24*Ku7srr_TW{}f%)8~l(D2Z@PyP+w!j7h>!TfFT{sSAsUnsO( zzF(NY-{7o(q}_qxg2&rkJWDd~8?O7q^<&X4d-JT2%lY>2bzA%T=huaq&%dq0 za4vnzTmAT;-_LH`pT9qD`Oh>7Cys@}-&g0)-(SCxeZe=j*@;i{x9YE~{rvsC-@0Rg z3?dsp@bC3or^ulY&fd3BztGO~2G8Y#pXa%XFsT1mcxc&jVef<2%LNYQ6#f4);k4Oj z!;E6F`dv>R)i0lYS-pxW2HO7cP$J81w_5JJ(WH|atYB7V%FNxI*T~UA1cby15 zG=tUQBFlrhTV8DBW~gTPWN_=-^k)hUNq^7({qqbML=Nkg?Vh)jV?m7kU%vG_;o$`d zK4?f@xg47}$ zoO)k<*3A*y$56EW$M>k&F|8HvmT&Y~cg#@dm?OiL6>jR_;$&zWZMLf7hQtm(KpOcFQf+36D9iMBWW6SNZ(o`SXsqe-{_d zzIuFth%X{dfc%)TZgM>5zAI~YCh()C8_XnxmZB)*avV@2)&NtHV6SaV-%!&tLi5gF Zyy_)qE5E+%NCsv(22WQ%mvv4FO#p8U7!&{i literal 9250 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 -- 2.20.1 From ac5bd273444e75c10fcb0d4621d02a2e84a97412 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 22:06:43 -0500 Subject: [PATCH 018/128] app icons --- .../res/mipmap-hdpi/ic_launcher_round.png | Bin 5024 -> 5672 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2858 -> 4303 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 7098 -> 5225 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10676 -> 5281 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15523 -> 1719 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/squarenotsquare/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/squarenotsquare/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index 1b523998081149a985cef0cdf89045b9ed29964a..966a881a159eb81bdea9153d5f7be4ead05941a1 100644 GIT binary patch literal 5672 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 diff --git a/squarenotsquare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/squarenotsquare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 8e19b410a1b15ff180f3dacac19395fe3046cdec..da91d480f92821ba3069354791280d9688155109 100644 GIT binary patch literal 5281 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 BynFxv literal 10676 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

Drbn!|_nQowx=@9qUWLFc!=z z2azC@*FRw3p*pqn5?Lfgj*8tAA*|5YJ#gmcLgRyQ0o<`FueT+UP++&PMwkJLJ>j2W zJqHCO11OoQqboT)!aMa8_eKc$sqOtpr8zZO;gXZj*-3)g_uXIQ9YLVEE;m|}#N5fq z8$9x&!*EKegc&oKVqGAfbrK2}+R!~wDc6;6ec?RT^oR*vtWDGxPV0f9@!{S((TdMU z_s{b8QvQBV0BMHncDbE4tKr*ezb#U!t%FSFDEwCfermGo9wmbg2kZ(xUGPmGzjj=0 z`+SBrgVJw|+CGX_6*fk@f;FfAh1N1c{|(;%+Wk>MA*nCH&V3T)f%u8%pN?I@mE~o< i)0+(aMEFW05TUJR1sAtvUou{5Uw~w3OT0~>#{L6+Bg^Ih literal 15523 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 BIP(Ai -- 2.20.1 From c5def9e99a69284933422e9a4d6412ef10dd4347 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 22:18:30 -0500 Subject: [PATCH 019/128] splash screen unused items --- squarenotsquare/src/screens/Splash.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/squarenotsquare/src/screens/Splash.js b/squarenotsquare/src/screens/Splash.js index d84906a..7386c22 100644 --- a/squarenotsquare/src/screens/Splash.js +++ b/squarenotsquare/src/screens/Splash.js @@ -1,6 +1,5 @@ import React from "react"; -import { Image, Platform, Text, View } from "react-native"; -import { useEffect, useState } from "react"; +import { Image, Platform, View } from "react-native"; import { styles } from './styles/AppStyles'; function Splash(props){ -- 2.20.1 From e0ed4f7c3082081fa5ebd83489befaa719d5fd31 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 22:18:38 -0500 Subject: [PATCH 020/128] navigate home after a timeout --- squarenotsquare/src/redux/actions/SystemActions.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/redux/actions/SystemActions.js b/squarenotsquare/src/redux/actions/SystemActions.js index e9708d6..6a00bb0 100644 --- a/squarenotsquare/src/redux/actions/SystemActions.js +++ b/squarenotsquare/src/redux/actions/SystemActions.js @@ -1,11 +1,12 @@ -import { initDB } from "../../realm/DbInit"; import DbAPI from "../../realm/DbAPI"; import { APP_INIT } from "../types/SystemTypes"; +import { squareNav } from "../../navigation/SquareNav"; export function appInit() { return async (dispatch) => { await DbAPI.initDB(); dispatch(onInit()); + setTimeout(() => squareNav('Home'), 1000); } } -- 2.20.1 From 4bfc978d2cc778c732890b1ef4e3eebabccc4ccd Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 22:18:46 -0500 Subject: [PATCH 021/128] rename square nav --- squarenotsquare/src/navigation/SquareNav.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/squarenotsquare/src/navigation/SquareNav.js b/squarenotsquare/src/navigation/SquareNav.js index f23c207..7b22de2 100644 --- a/squarenotsquare/src/navigation/SquareNav.js +++ b/squarenotsquare/src/navigation/SquareNav.js @@ -2,7 +2,7 @@ import { createRef } from "react"; export const SquareRef = createRef(); -export function navigate(name, params) { +export function squareNav(name, params) { SquareRef.current?.navigate(name, params); return true; } \ No newline at end of file -- 2.20.1 From d8328760e25443ad9b3cec1be18f067ba3ec1e2b Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 22:18:52 -0500 Subject: [PATCH 022/128] update unit tests --- squarenotsquare/__tests__/Nav-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/__tests__/Nav-test.js b/squarenotsquare/__tests__/Nav-test.js index aaf784a..72a9255 100644 --- a/squarenotsquare/__tests__/Nav-test.js +++ b/squarenotsquare/__tests__/Nav-test.js @@ -1,6 +1,6 @@ -import { squareRef, navigate } from "../src/navigation/SquareNav"; +import { squareRef, squareNav } from "../src/navigation/SquareNav"; test('SquareNav calls navigation ref', () => { - let postNav = navigate('notascreen', {}); + let postNav = squareNav('notascreen', {}); expect(postNav).toEqual(true); }); \ No newline at end of file -- 2.20.1 From 6fa6a060038c33cd847634ab4eedf99657194a6c Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 22:44:13 -0500 Subject: [PATCH 023/128] square not square header --- squarenotsquare/src/screens/Home.js | 22 ++++++++++++++++--- .../src/screens/styles/AppStyles.js | 9 ++++++++ squarenotsquare/src/themes/Metrics.js | 4 ++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index e836d60..9991e18 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -1,14 +1,30 @@ import React from "react"; import { Text, View } from "react-native"; import { useState } from "react"; +import { styles } from './styles/AppStyles'; function Home(props){ return ( - - test + + + + Square + + {' not '} + + + Square + + + + + + Loading... + + - ); + ) } export default Home; \ No newline at end of file diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index f3675a2..e0b39bb 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -62,6 +62,7 @@ export const styles = StyleSheet.create({ italic: {fontStyle: 'italic'}, darkText: {color: Colors.fonts.dark}, + lightText: {color: Colors.fonts.light}, greyText: {color: Colors.material.grey600}, redText: {color: Colors.material.red800}, blueText: {color: Colors.material.blue400}, @@ -71,8 +72,16 @@ export const styles = StyleSheet.create({ backgroundColor: Colors.material.light, }, + green: { + backgroundColor: Colors.material.green400 + }, + splashLogo: { width: Metrics.images.splashLogo.width, height: Metrics.images.splashLogo.height + }, + + smallMargin: { + margin: Metrics.margins.default } }) \ No newline at end of file diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index f150814..c7c08d1 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -38,6 +38,10 @@ class AppMetrics { height: this.screenWidth * 0.33 } } + + this.margins = { + default: this.normalize(5) + } } normalize(size){ -- 2.20.1 From 8c2de9046acfc2effe2e083edf67d95fb0cf0a13 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 22:55:32 -0500 Subject: [PATCH 024/128] home screen buttons --- squarenotsquare/src/screens/Home.js | 18 +++++++++++++----- .../src/screens/styles/AppStyles.js | 10 ++++++++++ squarenotsquare/src/themes/Metrics.js | 8 ++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 9991e18..ba59372 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -2,13 +2,14 @@ import React from "react"; import { Text, View } from "react-native"; import { useState } from "react"; import { styles } from './styles/AppStyles'; +import { TouchableOpacity } from "react-native-gesture-handler"; function Home(props){ return ( - + Square {' not '} @@ -18,10 +19,17 @@ function Home(props){ - - - Loading... - + + + + Start + + + + + High Scores + + ) diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index e0b39bb..9ca9ad0 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -76,6 +76,10 @@ export const styles = StyleSheet.create({ backgroundColor: Colors.material.green400 }, + darkGreen: { + backgroundColor: Colors.material.green400dark + }, + splashLogo: { width: Metrics.images.splashLogo.width, height: Metrics.images.splashLogo.height @@ -83,5 +87,11 @@ export const styles = StyleSheet.create({ smallMargin: { margin: Metrics.margins.default + }, + + menuButton: { + borderRadius: Metrics.buttons.borderRadius, + width: Metrics.buttons.menuButton.width, + height: Metrics.buttons.menuButton.height } }) \ No newline at end of file diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index c7c08d1..3b9e926 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -42,6 +42,14 @@ class AppMetrics { this.margins = { default: this.normalize(5) } + + this.buttons = { + borderRadius: 10, + menuButton: { + height: this.normalize(30), + width: this.screenWidth * 0.7 + } + } } normalize(size){ -- 2.20.1 From 0010cf7ee5942a7d4372aecf0fd99632a108953d Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 1 Aug 2022 23:12:38 -0500 Subject: [PATCH 025/128] back handler handling --- squarenotsquare/src/screens/Home.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index ba59372..8e825f6 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -1,11 +1,15 @@ -import React from "react"; -import { Text, View } from "react-native"; +import React, { useEffect } from "react"; +import { BackHandler, Text, View } from "react-native"; import { useState } from "react"; import { styles } from './styles/AppStyles'; import { TouchableOpacity } from "react-native-gesture-handler"; function Home(props){ + useEffect(() => { + BackHandler.addEventListener('hardwareBackPress', () => {return true}); + }, []) + return ( -- 2.20.1 From 25037d45904597b99c065dbe0e2d8dc9d688566b Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 2 Aug 2022 19:30:51 -0500 Subject: [PATCH 026/128] settings icon --- squarenotsquare/src/screens/Home.js | 10 ++++++++++ squarenotsquare/src/screens/styles/AppStyles.js | 15 ++++----------- squarenotsquare/src/themes/Colors.js | 1 + squarenotsquare/src/themes/Metrics.js | 3 ++- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 8e825f6..9327bf2 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -3,6 +3,10 @@ import { BackHandler, Text, View } from "react-native"; import { useState } from "react"; import { styles } from './styles/AppStyles'; import { TouchableOpacity } from "react-native-gesture-handler"; +import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; +import Icons from '../themes/Icons'; +import Colors from "../themes/Colors"; +import Metrics from "../themes/Metrics"; function Home(props){ @@ -12,6 +16,12 @@ function Home(props){ return ( + Square diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index 9ca9ad0..e7421a9 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -68,17 +68,10 @@ export const styles = StyleSheet.create({ blueText: {color: Colors.material.blue400}, boldText: {fontWeight: 'bold'}, - body: { - backgroundColor: Colors.material.light, - }, - - green: { - backgroundColor: Colors.material.green400 - }, - - darkGreen: { - backgroundColor: Colors.material.green400dark - }, + body: {backgroundColor: Colors.material.grey400}, + lightBackground: {backgroundColor: Colors.material.light}, + green: {backgroundColor: Colors.material.green400}, + darkGreen: {backgroundColor: Colors.material.green400dark}, splashLogo: { width: Metrics.images.splashLogo.width, diff --git a/squarenotsquare/src/themes/Colors.js b/squarenotsquare/src/themes/Colors.js index 1c9545a..ab7f64f 100644 --- a/squarenotsquare/src/themes/Colors.js +++ b/squarenotsquare/src/themes/Colors.js @@ -5,6 +5,7 @@ class AppColors { //200 blue200: '#90caf9', + grey200: '#eeeeee', //400 blue400: '#5c6bc0', diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index 3b9e926..13e84d5 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -29,7 +29,8 @@ class AppMetrics { } this.icons = { - splashIcon: this.normalize(100) + splashIcon: this.normalize(100), + buttonIcon: this.normalize(20) } this.images = { -- 2.20.1 From b8cd404ecbdc6712435f411c9cf6bd65f517d530 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 2 Aug 2022 21:15:08 -0500 Subject: [PATCH 027/128] Home screen footer --- squarenotsquare/src/screens/Home.js | 5 +++++ squarenotsquare/src/screens/styles/AppStyles.js | 9 ++++++++- squarenotsquare/src/themes/Colors.js | 1 + squarenotsquare/src/themes/Metrics.js | 7 ++++++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 9327bf2..6200581 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -45,6 +45,11 @@ function Home(props){ + + + 0.0.1a Atonal Software August 2, 2022 + + ) } diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index e7421a9..a1e5b65 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -63,7 +63,7 @@ export const styles = StyleSheet.create({ italic: {fontStyle: 'italic'}, darkText: {color: Colors.fonts.dark}, lightText: {color: Colors.fonts.light}, - greyText: {color: Colors.material.grey600}, + greyText: {color: Colors.fonts.grey}, redText: {color: Colors.material.red800}, blueText: {color: Colors.material.blue400}, boldText: {fontWeight: 'bold'}, @@ -82,6 +82,13 @@ export const styles = StyleSheet.create({ margin: Metrics.margins.default }, + footer: { + margin: Metrics.margins.default, + height: Metrics.screenSections.footerHeight, + borderTopWidth: Metrics.borders.width, + borderTopColor: Colors.material.grey400 + }, + menuButton: { borderRadius: Metrics.buttons.borderRadius, width: Metrics.buttons.menuButton.width, diff --git a/squarenotsquare/src/themes/Colors.js b/squarenotsquare/src/themes/Colors.js index ab7f64f..aad1233 100644 --- a/squarenotsquare/src/themes/Colors.js +++ b/squarenotsquare/src/themes/Colors.js @@ -32,6 +32,7 @@ class AppColors { fonts = { dark: '#000000', + grey: '#757575', light: '#ffffff' }; } diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index 13e84d5..4138996 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -25,7 +25,8 @@ class AppMetrics { this.screenSections = { headerHeight: this.normalize(20), - sectionWidth: this.screenWidth + sectionWidth: this.screenWidth, + footerHeight: this.normalize(10) } this.icons = { @@ -51,6 +52,10 @@ class AppMetrics { width: this.screenWidth * 0.7 } } + + this.borders = { + width: 1 + } } normalize(size){ -- 2.20.1 From 11a499c67de9f9eea3400acaa375de236dc3cab5 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 2 Aug 2022 21:43:47 -0500 Subject: [PATCH 028/128] Absolute position settings button --- squarenotsquare/src/screens/Home.js | 17 +++++++++-------- squarenotsquare/src/screens/styles/AppStyles.js | 12 ++++++++---- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 6200581..d5b0ec3 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -1,8 +1,7 @@ import React, { useEffect } from "react"; -import { BackHandler, Text, View } from "react-native"; +import { BackHandler, Text, TouchableOpacity, View } from "react-native"; import { useState } from "react"; import { styles } from './styles/AppStyles'; -import { TouchableOpacity } from "react-native-gesture-handler"; import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; import Icons from '../themes/Icons'; import Colors from "../themes/Colors"; @@ -16,12 +15,14 @@ function Home(props){ return ( - + + + Square diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index a1e5b65..45d342a 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -28,10 +28,8 @@ export const styles = StyleSheet.create({ stretch: {alignSelf: 'stretch'}, absolute: { position: 'absolute', - top: Metrics.screenSections.headerHeight, - bottom: 0, - left: 0, - right: 0, + top: 0, + right: 0 }, dropShadow: { @@ -93,5 +91,11 @@ export const styles = StyleSheet.create({ borderRadius: Metrics.buttons.borderRadius, width: Metrics.buttons.menuButton.width, height: Metrics.buttons.menuButton.height + }, + + settingsContainer: { + zIndex: 1000, + width: Metrics.icons.buttonIcon, + height: Metrics.icons.buttonIcon } }) \ No newline at end of file -- 2.20.1 From f9d1086f4aa023d7d75d0f685c4a716fa40e75d6 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 2 Aug 2022 22:16:44 -0500 Subject: [PATCH 029/128] Sliders --- squarenotsquare/src/components/Slider.js | 25 ++++++++++++++++++++++++ squarenotsquare/src/screens/Home.js | 25 ++++++++++++++---------- 2 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 squarenotsquare/src/components/Slider.js diff --git a/squarenotsquare/src/components/Slider.js b/squarenotsquare/src/components/Slider.js new file mode 100644 index 0000000..b0942b6 --- /dev/null +++ b/squarenotsquare/src/components/Slider.js @@ -0,0 +1,25 @@ +import React from "react"; +import { Animated, Easing} from "react-native"; +import { useEffect, useState } from "react"; + +function LeftToRight(props){ + const [xPosition, setXPosition] = useState(new Animated.Value(props.origin)); + + useEffect(() => { + Animated.timing(xPosition, { + toValue: 0, + easing: Easing.back(), + duration: props.duration, + useNativeDriver: true + }).start(); + }, []); + + + return ( + + {props.children} + + ) +} + +export default LeftToRight; \ No newline at end of file diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index d5b0ec3..8333bb6 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -6,6 +6,7 @@ import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; import Icons from '../themes/Icons'; import Colors from "../themes/Colors"; import Metrics from "../themes/Metrics"; +import Slider from "../components/Slider"; function Home(props){ @@ -35,16 +36,20 @@ function Home(props){ - - - Start - - - - - High Scores - - + + + + Start + + + + + + + High Scores + + + -- 2.20.1 From 0106e685d0b7ae0935fe12582272ee21fec58160 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 2 Aug 2022 22:42:22 -0500 Subject: [PATCH 030/128] slider easing --- squarenotsquare/src/components/Slider.js | 15 +++++++++------ squarenotsquare/src/screens/Home.js | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/squarenotsquare/src/components/Slider.js b/squarenotsquare/src/components/Slider.js index b0942b6..ff790ce 100644 --- a/squarenotsquare/src/components/Slider.js +++ b/squarenotsquare/src/components/Slider.js @@ -6,12 +6,15 @@ function LeftToRight(props){ const [xPosition, setXPosition] = useState(new Animated.Value(props.origin)); useEffect(() => { - Animated.timing(xPosition, { - toValue: 0, - easing: Easing.back(), - duration: props.duration, - useNativeDriver: true - }).start(); + Animated.sequence([ + Animated.delay(props.delay), + Animated.timing(xPosition, { + toValue: 0, + // easing: Easing.back(), + duration: props.duration, + useNativeDriver: true + }) + ]).start(); }, []); diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 8333bb6..1a0c55a 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -36,14 +36,14 @@ function Home(props){ - + Start - + High Scores -- 2.20.1 From c9bba78aaea306326ecdc0dccc8dd084f6426d4d Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 2 Aug 2022 22:42:34 -0500 Subject: [PATCH 031/128] slider easing --- squarenotsquare/src/components/Slider.js | 1 - 1 file changed, 1 deletion(-) diff --git a/squarenotsquare/src/components/Slider.js b/squarenotsquare/src/components/Slider.js index ff790ce..a0ecbe4 100644 --- a/squarenotsquare/src/components/Slider.js +++ b/squarenotsquare/src/components/Slider.js @@ -10,7 +10,6 @@ function LeftToRight(props){ Animated.delay(props.delay), Animated.timing(xPosition, { toValue: 0, - // easing: Easing.back(), duration: props.duration, useNativeDriver: true }) -- 2.20.1 From 0364db310a248b27ebb44ca01389d6cd08682025 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 3 Aug 2022 17:24:49 -0500 Subject: [PATCH 032/128] square challenge generator --- squarenotsquare/src/libs/Random.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/squarenotsquare/src/libs/Random.js b/squarenotsquare/src/libs/Random.js index ceec7c6..9da374b 100644 --- a/squarenotsquare/src/libs/Random.js +++ b/squarenotsquare/src/libs/Random.js @@ -19,4 +19,17 @@ export function generateKey() { } return result.join(''); +} + +export function generateSquareChallenge(){ + let result = []; + let uintArray = new Uint8Array(20); + let newChallenge = crypto.getRandomValues(uintArray); + + for(let i = 0; i < 20; ++i){ + let position = newChallenge[i] % 2; + result.push(position); + } + + return result; } \ No newline at end of file -- 2.20.1 From 50031bc2491575b0c55b4c73f3f4c80d1ff046bb Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 3 Aug 2022 23:24:45 -0500 Subject: [PATCH 033/128] button metrics --- squarenotsquare/src/themes/Metrics.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index 4138996..58b3afa 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -42,7 +42,8 @@ class AppMetrics { } this.margins = { - default: this.normalize(5) + default: this.normalize(5), + buttonMargin: this.normalize(20) } this.buttons = { @@ -50,6 +51,10 @@ class AppMetrics { menuButton: { height: this.normalize(30), width: this.screenWidth * 0.7 + }, + answerButton: { + width: this.normalize(40), + height: this.normalize(40) } } -- 2.20.1 From bca84fc6a90bda60a0deeb726ac7e8148045b58c Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 3 Aug 2022 23:24:51 -0500 Subject: [PATCH 034/128] shape icons --- squarenotsquare/src/themes/Icons.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/themes/Icons.js b/squarenotsquare/src/themes/Icons.js index 1e20525..9f67027 100644 --- a/squarenotsquare/src/themes/Icons.js +++ b/squarenotsquare/src/themes/Icons.js @@ -3,8 +3,17 @@ class AppIcons { square: 'square', settings: 'cog-outline', toggleOn: 'toggle-switch-on', - toggleOfff: 'toggle-switch-off' + toggleOfff: 'toggle-switch-off', }; + + wrongShapes = { + rectangle: 'rectangle', + triangle: 'triangle', + circle: 'circle', + hexagon: 'hexagon', + pentagon: 'pentagon', + octagon: 'octagon' + } } const Icons = new AppIcons(); -- 2.20.1 From 644e43dd3745d02f770bd759b4e647ebf6a49905 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 3 Aug 2022 23:24:56 -0500 Subject: [PATCH 035/128] game styles --- squarenotsquare/src/screens/styles/AppStyles.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index 45d342a..303039b 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -76,8 +76,10 @@ export const styles = StyleSheet.create({ height: Metrics.images.splashLogo.height }, - smallMargin: { - margin: Metrics.margins.default + smallMargin: {margin: Metrics.margins.default}, + buttonMargin: { + marginBottom: Metrics.margins.buttonMargin, + marginTop: Metrics.margins.buttonMargin }, footer: { @@ -93,6 +95,12 @@ export const styles = StyleSheet.create({ height: Metrics.buttons.menuButton.height }, + answerButton: { + borderRadius: Metrics.buttons.borderRadius, + width: Metrics.buttons.answerButton.width, + height: Metrics.buttons.answerButton.height + }, + settingsContainer: { zIndex: 1000, width: Metrics.icons.buttonIcon, -- 2.20.1 From 05252b83a9eba99c9ee31164f706c5725df4f09d Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 3 Aug 2022 23:25:03 -0500 Subject: [PATCH 036/128] home navigation --- squarenotsquare/src/screens/Home.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 1a0c55a..6193f73 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -1,19 +1,25 @@ import React, { useEffect } from "react"; import { BackHandler, Text, TouchableOpacity, View } from "react-native"; -import { useState } from "react"; import { styles } from './styles/AppStyles'; import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; import Icons from '../themes/Icons'; import Colors from "../themes/Colors"; import Metrics from "../themes/Metrics"; import Slider from "../components/Slider"; +import { useDispatch } from "react-redux"; +import {squareStartPressed} from '../redux/actions/UserActions'; -function Home(props){ +function Home(){ + const dispatch = useDispatch(); useEffect(() => { BackHandler.addEventListener('hardwareBackPress', () => {return true}); }, []) + function onPressStart(){ + dispatch(squareStartPressed()); + } + return ( @@ -37,7 +43,10 @@ function Home(props){ - + Start -- 2.20.1 From ed5c3c5860e68deb6d7c3268831d6ba56eefcbba Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 3 Aug 2022 23:25:09 -0500 Subject: [PATCH 037/128] game buttons --- squarenotsquare/src/screens/Game.js | 67 +++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index 106d1d5..69c7a36 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -1,13 +1,72 @@ import React from "react"; -import { Text, View } from "react-native"; +import { Text, TouchableOpacity, View } from "react-native"; +import { ScrollView } from "react-native-gesture-handler"; import { useState } from "react"; +import {genSquareChallenge} from '../libs/Random'; +import {shapes} from '../libs/ShapeEnum'; +import { styles } from "./styles/AppStyles"; +import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; +import Icons from '../themes/Icons'; +import Colors from "../themes/Colors"; +import Metrics from "../themes/Metrics"; function Game(props){ + const squareChallenge = genSquareChallenge(); + const [startTime, setStartTime] = useState(0); + + function generateSquare(){ + return ( + + + + ) + } + + function generateShape(index){ + return ( + + + + ) + } + + function generatePair(answer, shapeIndex) { + if (answer === 0) { + return ( + + {generateSquare()} + {generateShape(shapeIndex)} + + ); + } else { + return ( + + {generateShape(shapeIndex)} + {generateSquare()} + + ); + } + } + + function renderPairs(){ + return squareChallenge.map((pair, index) => { + return generatePair(pair.squarePos, pair.shapeType); + }); + } + return ( - - test - + + {renderPairs()} + ); } -- 2.20.1 From 705af6e0ba8d6e12c71496239d00cff0116c926a Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 3 Aug 2022 23:25:17 -0500 Subject: [PATCH 038/128] square start redux type --- squarenotsquare/src/redux/types/SystemTypes.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/redux/types/SystemTypes.js b/squarenotsquare/src/redux/types/SystemTypes.js index a75ea52..6f34657 100644 --- a/squarenotsquare/src/redux/types/SystemTypes.js +++ b/squarenotsquare/src/redux/types/SystemTypes.js @@ -1 +1,2 @@ -export const APP_INIT = 'app-init'; \ No newline at end of file +export const APP_INIT = 'app-init'; +export const SQUARE_START = 'square-start'; \ No newline at end of file -- 2.20.1 From 976c0c7d90784a1ca66947e40fb0c3cead01c8d1 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 3 Aug 2022 23:25:40 -0500 Subject: [PATCH 039/128] square start pressed user action creator --- squarenotsquare/src/redux/actions/UserActions.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/squarenotsquare/src/redux/actions/UserActions.js b/squarenotsquare/src/redux/actions/UserActions.js index e69de29..afb8299 100644 --- a/squarenotsquare/src/redux/actions/UserActions.js +++ b/squarenotsquare/src/redux/actions/UserActions.js @@ -0,0 +1,11 @@ +import { squareNav } from "../../navigation/SquareNav"; +import { SQUARE_START } from "../types/SystemTypes"; + +export function squareStartPressed() { + return (dispatch) => { + squareNav('Game'); + dispatch({ + type: SQUARE_START + }); + } +} \ No newline at end of file -- 2.20.1 From bef99b2b31207e6f98b81c645a8c25ca7ecd3f61 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 3 Aug 2022 23:26:00 -0500 Subject: [PATCH 040/128] shape enum --- squarenotsquare/src/libs/ShapeEnum.js | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 squarenotsquare/src/libs/ShapeEnum.js diff --git a/squarenotsquare/src/libs/ShapeEnum.js b/squarenotsquare/src/libs/ShapeEnum.js new file mode 100644 index 0000000..7ed6f19 --- /dev/null +++ b/squarenotsquare/src/libs/ShapeEnum.js @@ -0,0 +1,10 @@ +import Icons from "../themes/Icons"; + +export const shapes = { + '0': Icons.wrongShapes.rectangle, + '1': Icons.wrongShapes.triangle, + '2': Icons.wrongShapes.circle, + '3': Icons.wrongShapes.hexagon, + '4': Icons.wrongShapes.pentagon, + '5': Icons.wrongShapes.octagon +} \ No newline at end of file -- 2.20.1 From a5685b4a2ccc42b96f6c2c55a9fd23bb6eb11584 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 3 Aug 2022 23:26:09 -0500 Subject: [PATCH 041/128] square question generator --- squarenotsquare/src/libs/Random.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/squarenotsquare/src/libs/Random.js b/squarenotsquare/src/libs/Random.js index 9da374b..0123815 100644 --- a/squarenotsquare/src/libs/Random.js +++ b/squarenotsquare/src/libs/Random.js @@ -21,14 +21,19 @@ export function generateKey() { return result.join(''); } -export function generateSquareChallenge(){ +export function genSquareChallenge(){ let result = []; let uintArray = new Uint8Array(20); - let newChallenge = crypto.getRandomValues(uintArray); + let squares = crypto.getRandomValues(uintArray); + let shapes = crypto.getRandomValues(uintArray); for(let i = 0; i < 20; ++i){ - let position = newChallenge[i] % 2; - result.push(position); + let squarePos = squares[i] % 2; + let shapeType = shapes[i] % 6; + result.push({ + squarePos: squarePos, + shapeType: shapeType + }); } return result; -- 2.20.1 From 554eb36467dcdf9ab700f4f0cc9dadbc3700144c Mon Sep 17 00:00:00 2001 From: Timothy Glasgow Date: Thu, 4 Aug 2022 17:40:39 -0500 Subject: [PATCH 042/128] ios build files --- .../squarenotsquare.xcodeproj/project.pbxproj | 6 ++++++ .../ios/squarenotsquare/squarelogo.png | Bin 0 -> 11592 bytes 2 files changed, 6 insertions(+) create mode 100644 squarenotsquare/ios/squarenotsquare/squarelogo.png diff --git a/squarenotsquare/ios/squarenotsquare.xcodeproj/project.pbxproj b/squarenotsquare/ios/squarenotsquare.xcodeproj/project.pbxproj index c3505fb..c5e0267 100644 --- a/squarenotsquare/ios/squarenotsquare.xcodeproj/project.pbxproj +++ b/squarenotsquare/ios/squarenotsquare.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 7699B88040F8A987B510C191 /* libPods-squarenotsquare-squarenotsquareTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-squarenotsquare-squarenotsquareTests.a */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; + A00B4610289C8148008607EC /* squarelogo.png in Resources */ = {isa = PBXBuildFile; fileRef = A00B460F289C8148008607EC /* squarelogo.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -43,6 +44,7 @@ 5DCACB8F33CDC322A6C60F78 /* libPods-squarenotsquare.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-squarenotsquare.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = squarenotsquare/LaunchScreen.storyboard; sourceTree = ""; }; 89C6BE57DB24E9ADA2F236DE /* Pods-squarenotsquare-squarenotsquareTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-squarenotsquare-squarenotsquareTests.release.xcconfig"; path = "Target Support Files/Pods-squarenotsquare-squarenotsquareTests/Pods-squarenotsquare-squarenotsquareTests.release.xcconfig"; sourceTree = ""; }; + A00B460F289C8148008607EC /* squarelogo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = squarelogo.png; path = squarenotsquare/squarelogo.png; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ @@ -89,6 +91,7 @@ 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 13B07FB01A68108700A75B9A /* AppDelegate.mm */, 13B07FB51A68108700A75B9A /* Images.xcassets */, + A00B460F289C8148008607EC /* squarelogo.png */, 13B07FB61A68108700A75B9A /* Info.plist */, 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, 13B07FB71A68108700A75B9A /* main.m */, @@ -243,6 +246,7 @@ buildActionMask = 2147483647; files = ( 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, + A00B4610289C8148008607EC /* squarelogo.png in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -596,6 +600,7 @@ "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; }; name = Debug; @@ -659,6 +664,7 @@ "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; diff --git a/squarenotsquare/ios/squarenotsquare/squarelogo.png b/squarenotsquare/ios/squarenotsquare/squarelogo.png new file mode 100644 index 0000000000000000000000000000000000000000..7f3925c2479a18db1f415e88ad563b6f4f961a1f GIT binary patch literal 11592 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 literal 0 HcmV?d00001 -- 2.20.1 From 6f055e7bc3cbfd559900b8196421d4e3379dd953 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 16:41:39 -0500 Subject: [PATCH 043/128] switch to rn keychain --- squarenotsquare/package-lock.json | 2121 +++++++++++++++++++++++++---- squarenotsquare/package.json | 5 +- 2 files changed, 1861 insertions(+), 265 deletions(-) diff --git a/squarenotsquare/package-lock.json b/squarenotsquare/package-lock.json index d2b1e74..986c99b 100644 --- a/squarenotsquare/package-lock.json +++ b/squarenotsquare/package-lock.json @@ -15,9 +15,9 @@ "react-native": "0.69.2", "react-native-gesture-handler": "^2.5.0", "react-native-get-random-values": "^1.8.0", + "react-native-keychain": "^8.1.1", "react-native-safe-area-context": "^4.3.1", "react-native-screens": "^3.15.0", - "react-native-secure-key-store": "^2.0.9", "react-native-vector-icons": "^9.2.0", "react-redux": "^8.0.2", "realm": "^10.19.5", @@ -28,11 +28,14 @@ "devDependencies": { "@babel/core": "^7.12.9", "@babel/runtime": "^7.12.5", + "@react-native-community/cli": "^8.0.1", + "@react-native-community/cli-platform-ios": "^7.0.1", "@react-native-community/eslint-config": "^2.0.0", "babel-jest": "^28.0.0", "eslint": "^7.32.0", "jest": "^28.0.0", "metro-react-native-babel-preset": "^0.70.3", + "react-native-cli": "^2.0.1", "react-test-renderer": "18.0.0", "redux-logger": "^3.0.6", "redux-mock-store": "^1.5.4", @@ -3288,15 +3291,16 @@ } }, "node_modules/@react-native-community/cli": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-8.0.3.tgz", - "integrity": "sha512-7gY7QCEdpYDbvbdZBt6w64YPExLoiUpH/lVRaR4tKl6JalqXzrUotOJnBOS/qEC4q0nk0WXsiC5EkuiSliKS5Q==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-8.0.1.tgz", + "integrity": "sha512-0bZ2x2MPQPdVOxv80WsD22pvMqcs9MnKwfWbQ+vavEr5OEd4H60r4rgl/LaiSq+f22+RHm9CAe9r4EDlLMC/Ag==", + "dev": true, "dependencies": { "@react-native-community/cli-clean": "^8.0.0", - "@react-native-community/cli-config": "^8.0.3", + "@react-native-community/cli-config": "^8.0.1", "@react-native-community/cli-debugger-ui": "^8.0.0", - "@react-native-community/cli-doctor": "^8.0.3", - "@react-native-community/cli-hermes": "^8.0.2", + "@react-native-community/cli-doctor": "^8.0.1", + "@react-native-community/cli-hermes": "^8.0.0", "@react-native-community/cli-plugin-metro": "^8.0.0", "@react-native-community/cli-server-api": "^8.0.0", "@react-native-community/cli-tools": "^8.0.0", @@ -3324,11 +3328,11 @@ } }, "node_modules/@react-native-community/cli-clean": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-8.0.0.tgz", - "integrity": "sha512-VY/kwyH5xp6oXiB9bcwa+I9W5k6WR/nX3s85FuMW76hSlgG1UVAGL04uZPwYlSmMZuSOSuoXOaIjJ7wAvQMBpg==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-8.0.4.tgz", + "integrity": "sha512-IwS1M1NHg6+qL8PThZYMSIMYbZ6Zbx+lIck9PLBskbosFo24M3lCOflOl++Bggjakp6mR+sRXxLMexid/GeOsQ==", "dependencies": { - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-tools": "^8.0.4", "chalk": "^4.1.2", "execa": "^1.0.0", "prompts": "^2.4.0" @@ -3507,11 +3511,11 @@ } }, "node_modules/@react-native-community/cli-config": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-8.0.3.tgz", - "integrity": "sha512-QhLU6QZywkoO4FzpeEkdoYml0nE9tBwhmOUI/c5iYPOtKhhXiW8kNCLiX96TJDiZonalzptkkNiRZkipdz/8hw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-8.0.4.tgz", + "integrity": "sha512-0vcrIETka1Tr0blr0AjVkoP/1yynvarJQXi8Yry/XB3BLenrkUFxolqqA3Ff55KFQ7t1IzAuFtfuVZs25LvyDQ==", "dependencies": { - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-tools": "^8.0.4", "cosmiconfig": "^5.1.0", "deepmerge": "^3.2.0", "glob": "^7.1.3", @@ -3535,13 +3539,13 @@ } }, "node_modules/@react-native-community/cli-doctor": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-8.0.3.tgz", - "integrity": "sha512-ndISZhZqOoeSuQCm5KLwJNkckk14Bqn1N8LHJbC6l4zAyDU0nQRO1IVPoV5uyaANMzMqSNzS6k9N4M0PpcuhIQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-8.0.4.tgz", + "integrity": "sha512-Blw/66qwoEoKrtwn3O9iTtXbt4YWlwqNse5BJeRDzlSdutWTX4PgJu/34gyvOHGysNlrf+GYkeyqqxI/y0s07A==", "dependencies": { - "@react-native-community/cli-config": "^8.0.3", - "@react-native-community/cli-platform-ios": "^8.0.2", - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-config": "^8.0.4", + "@react-native-community/cli-platform-ios": "^8.0.4", + "@react-native-community/cli-tools": "^8.0.4", "chalk": "^4.1.2", "command-exists": "^1.2.8", "envinfo": "^7.7.2", @@ -3557,6 +3561,21 @@ "wcwidth": "^1.0.1" } }, + "node_modules/@react-native-community/cli-doctor/node_modules/@react-native-community/cli-platform-ios": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-8.0.4.tgz", + "integrity": "sha512-7Jdptedfg/J0Xo2rQbJ4jmo+PMYOiIiRcNDCSI5dBcNkQfSq4MMYUnKQx5DdZHgrfxE0O1vE4iNmJdd4wePz8w==", + "dependencies": { + "@react-native-community/cli-tools": "^8.0.4", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "glob": "^7.1.3", + "js-yaml": "^3.13.1", + "lodash": "^4.17.15", + "ora": "^5.4.1", + "plist": "^3.0.2" + } + }, "node_modules/@react-native-community/cli-doctor/node_modules/ansi-regex": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", @@ -3749,12 +3768,12 @@ } }, "node_modules/@react-native-community/cli-hermes": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-8.0.2.tgz", - "integrity": "sha512-RZ9uHTf3UFtGTYxq88uENJEdaDB8ab+YPBDn+Li1u78IKwNeL04F0A1A3ab3hYUkG4PEPnL2rkYSlzzNFLOSPQ==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-8.0.5.tgz", + "integrity": "sha512-Zm0wM6SfgYAEX1kfJ1QBvTayabvh79GzmjHyuSnEROVNPbl4PeCG4WFbwy489tGwOP9Qx9fMT5tRIFCD8bp6/g==", "dependencies": { - "@react-native-community/cli-platform-android": "^8.0.2", - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-platform-android": "^8.0.5", + "@react-native-community/cli-tools": "^8.0.4", "chalk": "^4.1.2", "hermes-profile-transformer": "^0.0.6", "ip": "^1.1.5" @@ -3825,11 +3844,11 @@ } }, "node_modules/@react-native-community/cli-platform-android": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-8.0.2.tgz", - "integrity": "sha512-pAEkt+GULesr8FphTpaNYSmu+O1CPQ2zCXkAg4kRd0WXpq3BsVqomyDWd/eMXTkY/yYQMGl6KilU2p9r/hnfhA==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-8.0.5.tgz", + "integrity": "sha512-z1YNE4T1lG5o9acoQR1GBvf7mq6Tzayqo/za5sHVSOJAC9SZOuVN/gg/nkBa9a8n5U7qOMFXfwhTMNqA474gXA==", "dependencies": { - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-tools": "^8.0.4", "chalk": "^4.1.2", "execa": "^1.0.0", "fs-extra": "^8.1.0", @@ -4013,24 +4032,53 @@ } }, "node_modules/@react-native-community/cli-platform-ios": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-8.0.2.tgz", - "integrity": "sha512-LxWzj6jIZr5Ot893TKFbt0/T3WkVe6pbc/FSTo+TDQq1FQr/Urv16Uqn0AcL4IX2O1g3Qd13d0vtR/Cdpn3VNw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-7.0.1.tgz", + "integrity": "sha512-PLRIbzrCzSedmpjuFtQqcqUD45G8q7sEciI1lf5zUbVMXqjIBwJWS7iz8235PyWwj8J4MNHohLC+oyRueFtbGg==", + "dev": true, "dependencies": { - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-tools": "^7.0.1", "chalk": "^4.1.2", "execa": "^1.0.0", "glob": "^7.1.3", "js-yaml": "^3.13.1", "lodash": "^4.17.15", "ora": "^5.4.1", - "plist": "^3.0.2" + "plist": "^3.0.2", + "xcode": "^3.0.0" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/@react-native-community/cli-tools": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-7.0.1.tgz", + "integrity": "sha512-0xra4hKNA5PR2zYVXsDMNiXMGaDNoNRYMY6eTP2aVIxQbqIcVMDWSyCA8wMWX5iOpMWg0cZGaQ6a77f3Rlb34g==", + "dev": true, + "dependencies": { + "appdirsjs": "^1.2.4", + "chalk": "^4.1.2", + "lodash": "^4.17.15", + "mime": "^2.4.1", + "node-fetch": "^2.6.0", + "open": "^6.2.0", + "ora": "^5.4.1", + "semver": "^6.3.0", + "shell-quote": "^1.7.3" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/@react-native-community/cli-tools/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@react-native-community/cli-platform-ios/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -4045,6 +4093,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4060,6 +4109,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -4070,12 +4120,14 @@ "node_modules/@react-native-community/cli-platform-ios/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@react-native-community/cli-platform-ios/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -4091,6 +4143,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -4108,6 +4161,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, "dependencies": { "pump": "^3.0.0" }, @@ -4119,6 +4173,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -4127,6 +4182,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4135,6 +4191,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, "dependencies": { "path-key": "^2.0.0" }, @@ -4146,6 +4203,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, "engines": { "node": ">=4" } @@ -4154,6 +4212,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, "bin": { "semver": "bin/semver" } @@ -4162,6 +4221,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, "dependencies": { "shebang-regex": "^1.0.0" }, @@ -4173,6 +4233,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4181,6 +4242,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -4192,6 +4254,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -4200,12 +4263,12 @@ } }, "node_modules/@react-native-community/cli-plugin-metro": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-8.0.0.tgz", - "integrity": "sha512-eIowV2ZRbzIWL3RIKVUUSahntXTuAeKzBSsFuhffLZphsV+UdKdtg5ATR9zbq7nsKap4ZseO5DkVqZngUkC7iQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-8.0.4.tgz", + "integrity": "sha512-UWzY1eMcEr/6262R2+d0Is5M3L/7Y/xXSDIFMoc5Rv5Wucl3hJM/TxHXmByvHpuJf6fJAfqOskyt4bZCvbI+wQ==", "dependencies": { - "@react-native-community/cli-server-api": "^8.0.0", - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-server-api": "^8.0.4", + "@react-native-community/cli-tools": "^8.0.4", "chalk": "^4.1.2", "metro": "^0.70.1", "metro-config": "^0.70.1", @@ -4281,12 +4344,12 @@ } }, "node_modules/@react-native-community/cli-server-api": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-8.0.0.tgz", - "integrity": "sha512-TxUs3sMl9clt7sdv30XETc6VRzyaEli2vDrk3TB5W5o5nSd1PmQdP4ccdGLO/nDRXwOy72QmmXlYWMg1XGU0Gg==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-8.0.4.tgz", + "integrity": "sha512-Orr14njx1E70CVrUA8bFdl+mrnbuXUjf1Rhhm0RxUadFpvkHuOi5dh8Bryj2MKtf8eZrpEwZ7tuQPhJEULW16A==", "dependencies": { "@react-native-community/cli-debugger-ui": "^8.0.0", - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-tools": "^8.0.4", "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.0", @@ -4297,12 +4360,13 @@ } }, "node_modules/@react-native-community/cli-tools": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-8.0.0.tgz", - "integrity": "sha512-jA4y8CebrRZaOJFjc5zMOnls4KfHkBl2FUtBZV2vcWuedQHa6JVwo+KO88ta3Ysby3uY0+mrZagZfXk7c0mrBw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-8.0.4.tgz", + "integrity": "sha512-ePN9lGxh6LRFiotyddEkSmuqpQhnq2iw9oiXYr4EFWpIEy0yCigTuSTiDF68+c8M9B+7bTwkRpz/rMPC4ViO5Q==", "dependencies": { "appdirsjs": "^1.2.4", "chalk": "^4.1.2", + "find-up": "^5.0.0", "lodash": "^4.17.15", "mime": "^2.4.1", "node-fetch": "^2.6.0", @@ -4357,6 +4421,21 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/@react-native-community/cli-tools/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@react-native-community/cli-tools/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4365,6 +4444,48 @@ "node": ">=8" } }, + "node_modules/@react-native-community/cli-tools/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@react-native-community/cli-tools/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4388,6 +4509,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -4402,6 +4524,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4417,6 +4540,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -4427,12 +4551,14 @@ "node_modules/@react-native-community/cli/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@react-native-community/cli/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -4448,6 +4574,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, "bin": { "semver": "bin/semver" } @@ -4456,6 +4583,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -4473,6 +4601,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, "dependencies": { "pump": "^3.0.0" }, @@ -4484,6 +4613,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -4492,6 +4622,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4500,6 +4631,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, "dependencies": { "path-key": "^2.0.0" }, @@ -4511,6 +4643,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, "engines": { "node": ">=4" } @@ -4519,6 +4652,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, "dependencies": { "shebang-regex": "^1.0.0" }, @@ -4530,6 +4664,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4538,6 +4673,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -4549,6 +4685,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -5401,6 +5538,18 @@ "node": ">= 4.5.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -5750,6 +5899,15 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -5768,6 +5926,27 @@ "readable-stream": "^3.4.0" } }, + "node_modules/bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "dev": true, + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "dev": true, + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -6262,6 +6441,15 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" }, + "node_modules/colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -6511,6 +6699,15 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, + "node_modules/cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -6593,6 +6790,38 @@ "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==", "dev": true }, + "node_modules/deep-equal": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", + "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "es-get-iterator": "^1.1.1", + "get-intrinsic": "^1.0.1", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.1.1", + "isarray": "^2.0.5", + "object-is": "^1.1.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.3", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -6859,6 +7088,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -7671,6 +7925,15 @@ "node >=0.6.0" ] }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "dev": true, + "engines": { + "node": "> 0.1.90" + } + }, "node_modules/fast-base64-decode": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", @@ -7930,6 +8193,15 @@ "node": ">=0.4.0" } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -8233,6 +8505,27 @@ "node": ">= 0.4.0" } }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -8467,6 +8760,15 @@ "node": ">=10.17.0" } }, + "node_modules/i": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", + "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -8624,6 +8926,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -8789,6 +9107,15 @@ "node": ">=8" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -8851,6 +9178,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -8905,11 +9241,30 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, + "node_modules/is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -8921,6 +9276,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -8933,6 +9297,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -11283,6 +11660,18 @@ "node": ">=8" } }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/jest-snapshot": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", @@ -12731,18 +13120,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/metro-core/node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/metro-core/node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -13128,18 +13505,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/metro/node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/metro/node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -13364,6 +13729,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, "node_modules/nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -13407,6 +13778,15 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/ncp": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", + "integrity": "sha512-PfGU8jYWdRl4FqJfCy0IzbkGyFHntfWygZg46nFk/dJD/XRrk2cj0SsKSX9n5u5gE0E0YfEpKWrEkfjnlZSTXA==", + "dev": true, + "bin": { + "ncp": "bin/ncp" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -13690,6 +14070,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -14135,6 +14531,15 @@ "node": ">=8" } }, + "node_modules/pkginfo": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", + "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/plist": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", @@ -14281,6 +14686,22 @@ "asap": "~2.0.6" } }, + "node_modules/prompt": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", + "integrity": "sha512-jDK5yEbAakJmNm+260gZG1+PuzX3jT5Jy0VZAUGrrW9RQ1JEWEDEVNnhO70mL3+U5r6bSJo02xsE34wOS/LnrA==", + "dev": true, + "dependencies": { + "pkginfo": "0.x.x", + "read": "1.0.x", + "revalidator": "0.1.x", + "utile": "0.2.x", + "winston": "0.8.x" + }, + "engines": { + "node": ">= 0.6.6" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -14464,6 +14885,88 @@ "react": "18.0.0" } }, + "node_modules/react-native-cli": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-native-cli/-/react-native-cli-2.0.1.tgz", + "integrity": "sha512-QgkB1urUhGe9q1vcqQLIfNdCd/Qf3MdNQe19QO6lVjhIVKljlVMKtaK8RaZ8PCNB/cdXlO/G3tKUGk+ghMXE6w==", + "dev": true, + "dependencies": { + "chalk": "^1.1.1", + "minimist": "^1.2.0", + "prompt": "^0.2.14", + "semver": "^5.0.3" + }, + "bin": { + "react-native": "index.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-native-cli/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-cli/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-cli/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-cli/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/react-native-cli/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-cli/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/react-native-codegen": { "version": "0.69.1", "resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.69.1.tgz", @@ -14507,6 +15010,11 @@ "resolved": "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.0.7.tgz", "integrity": "sha512-+4JpbIx42zGTONhBTIXSyfyHICHC29VTvhkkoUOJAh/XHPEixpuBduYgf6Y4y9wsN1ARlQhBBoptTvXvAFQf5g==" }, + "node_modules/react-native-keychain": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/react-native-keychain/-/react-native-keychain-8.1.1.tgz", + "integrity": "sha512-8fxgeHKwGcL657eAYpdBTkDIxNhbIHI+kyyO0Yac2dgVAN184JoIwQcW2z6snahwDaCObQOu0biLFHnsH+4KSg==" + }, "node_modules/react-native-safe-area-context": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.3.1.tgz", @@ -14540,11 +15048,6 @@ "react": "^17.0.0" } }, - "node_modules/react-native-secure-key-store": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/react-native-secure-key-store/-/react-native-secure-key-store-2.0.9.tgz", - "integrity": "sha512-9qi1rOlv4qNSpJIjqcIB7d0EQSwo2Yho8NVBT/Jc9NeYibDLHdArLXl8jn8H6nlf+8alk/bXqr4rPINrCTtmog==" - }, "node_modules/react-native-vector-icons": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-9.2.0.tgz", @@ -14647,97 +15150,332 @@ "node": ">=10" } }, - "node_modules/react-native/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/react-redux": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.2.tgz", - "integrity": "sha512-nBwiscMw3NoP59NFCXFf02f8xdo+vSHT/uZ1ldDwF7XaTpzm+Phk97VT4urYBl5TYAPNVaFm12UHAEyzkpNzRA==", + "node_modules/react-native/node_modules/@react-native-community/cli": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-8.0.5.tgz", + "integrity": "sha512-X0AMNK+sKDJQX8eQRkqgddJsZPWlHgLryX7O9usj78UFEK8VqVYtpv08piWecfAhC2mZU4/Lww4bKu9uJ1rdyQ==", "dependencies": { - "@babel/runtime": "^7.12.1", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/use-sync-external-store": "^0.0.3", - "hoist-non-react-statics": "^3.3.2", - "react-is": "^18.0.0", - "use-sync-external-store": "^1.0.0" + "@react-native-community/cli-clean": "^8.0.4", + "@react-native-community/cli-config": "^8.0.4", + "@react-native-community/cli-debugger-ui": "^8.0.0", + "@react-native-community/cli-doctor": "^8.0.4", + "@react-native-community/cli-hermes": "^8.0.5", + "@react-native-community/cli-plugin-metro": "^8.0.4", + "@react-native-community/cli-server-api": "^8.0.4", + "@react-native-community/cli-tools": "^8.0.4", + "@react-native-community/cli-types": "^8.0.0", + "chalk": "^4.1.2", + "commander": "^2.19.0", + "execa": "^1.0.0", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "graceful-fs": "^4.1.3", + "leven": "^3.1.0", + "lodash": "^4.17.15", + "minimist": "^1.2.0", + "prompts": "^2.4.0", + "semver": "^6.3.0" }, - "peerDependencies": { - "@types/react": "^16.8 || ^17.0 || ^18.0", - "@types/react-dom": "^16.8 || ^17.0 || ^18.0", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0", - "react-native": ">=0.59", - "redux": "^4" + "bin": { + "react-native": "build/bin.js" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-redux/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", - "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-shallow-renderer": { - "version": "16.15.0", - "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", - "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", - "dependencies": { - "object-assign": "^4.1.1", - "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" + "node": ">=12" }, "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + "react-native": "*" } }, - "node_modules/react-test-renderer": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.0.0.tgz", - "integrity": "sha512-SyZTP/FSkwfiKOZuTZiISzsrC8A80KNlQ8PyyoGoOq+VzMAab6Em1POK/CiX3+XyXG6oiJa1C53zYDbdrJu9fw==", - "dev": true, + "node_modules/react-native/node_modules/@react-native-community/cli-platform-ios": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-8.0.4.tgz", + "integrity": "sha512-7Jdptedfg/J0Xo2rQbJ4jmo+PMYOiIiRcNDCSI5dBcNkQfSq4MMYUnKQx5DdZHgrfxE0O1vE4iNmJdd4wePz8w==", "dependencies": { - "react-is": "^18.0.0", - "react-shallow-renderer": "^16.13.1", - "scheduler": "^0.21.0" - }, - "peerDependencies": { - "react": "^18.0.0" + "@react-native-community/cli-tools": "^8.0.4", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "glob": "^7.1.3", + "js-yaml": "^3.13.1", + "lodash": "^4.17.15", + "ora": "^5.4.1", + "plist": "^3.0.2" + } + }, + "node_modules/react-native/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-native/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/react-native/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/react-native/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/react-native/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/react-native/node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/react-native/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-native/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-native/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-native/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/react-native/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/react-native/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/react-redux": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.2.tgz", + "integrity": "sha512-nBwiscMw3NoP59NFCXFf02f8xdo+vSHT/uZ1ldDwF7XaTpzm+Phk97VT4urYBl5TYAPNVaFm12UHAEyzkpNzRA==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", + "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-shallow-renderer": { + "version": "16.15.0", + "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", + "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-test-renderer": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.0.0.tgz", + "integrity": "sha512-SyZTP/FSkwfiKOZuTZiISzsrC8A80KNlQ8PyyoGoOq+VzMAab6Em1POK/CiX3+XyXG6oiJa1C53zYDbdrJu9fw==", + "dev": true, + "dependencies": { + "react-is": "^18.0.0", + "react-shallow-renderer": "^16.13.1", + "scheduler": "^0.21.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/react-test-renderer/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" } }, - "node_modules/react-test-renderer/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -15184,6 +15922,15 @@ "node": ">=0.12" } }, + "node_modules/revalidator": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", + "integrity": "sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -15468,6 +16215,17 @@ "simple-concat": "^1.0.0" } }, + "node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "dev": true, + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -15771,6 +16529,15 @@ "node": ">=0.10.0" } }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/stack-utils": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", @@ -15912,6 +16679,15 @@ "node": ">= 0.6" } }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/stream-counter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz", @@ -16910,6 +17686,41 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/utile": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", + "integrity": "sha512-ltfvuCJNa/JFOhKBBiQ9qDyyFwLstoMMO1ru0Yg/Mcl8dp1Z3IBaL7n+5dHpyma+d3lCogkgBQnWKtGxzNyqhg==", + "dev": true, + "dependencies": { + "async": "~0.2.9", + "deep-equal": "*", + "i": "0.3.x", + "mkdirp": "0.x.x", + "ncp": "0.4.x", + "rimraf": "2.x.x" + }, + "engines": { + "node": ">= 0.6.4" + } + }, + "node_modules/utile/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "node_modules/utile/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -17026,26 +17837,94 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + }, + "node_modules/which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/winston": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", + "integrity": "sha512-fPoamsHq8leJ62D1M9V/f15mjQ1UHe4+7j1wpAT3fqgA5JqhJkk4aIfPEjfMTI9x6ZTjaLOpMAjluLtmgO5b6g==", "dev": true, "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "async": "0.2.x", + "colors": "0.6.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "pkginfo": "0.3.x", + "stack-trace": "0.0.x" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.6.0" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + "node_modules/winston/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "node_modules/winston/node_modules/pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } }, "node_modules/word-wrap": { "version": "1.2.3", @@ -17137,6 +18016,28 @@ } } }, + "node_modules/xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "dev": true, + "dependencies": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xcode/node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", @@ -17200,7 +18101,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, @@ -19541,15 +20441,16 @@ } }, "@react-native-community/cli": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-8.0.3.tgz", - "integrity": "sha512-7gY7QCEdpYDbvbdZBt6w64YPExLoiUpH/lVRaR4tKl6JalqXzrUotOJnBOS/qEC4q0nk0WXsiC5EkuiSliKS5Q==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-8.0.1.tgz", + "integrity": "sha512-0bZ2x2MPQPdVOxv80WsD22pvMqcs9MnKwfWbQ+vavEr5OEd4H60r4rgl/LaiSq+f22+RHm9CAe9r4EDlLMC/Ag==", + "dev": true, "requires": { "@react-native-community/cli-clean": "^8.0.0", - "@react-native-community/cli-config": "^8.0.3", + "@react-native-community/cli-config": "^8.0.1", "@react-native-community/cli-debugger-ui": "^8.0.0", - "@react-native-community/cli-doctor": "^8.0.3", - "@react-native-community/cli-hermes": "^8.0.2", + "@react-native-community/cli-doctor": "^8.0.1", + "@react-native-community/cli-hermes": "^8.0.0", "@react-native-community/cli-plugin-metro": "^8.0.0", "@react-native-community/cli-server-api": "^8.0.0", "@react-native-community/cli-tools": "^8.0.0", @@ -19571,6 +20472,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -19579,6 +20481,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19588,6 +20491,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -19595,12 +20499,14 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -19612,7 +20518,8 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -19620,6 +20527,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -19634,6 +20542,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, "requires": { "pump": "^3.0.0" } @@ -19641,17 +20550,20 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, "requires": { "path-key": "^2.0.0" } @@ -19659,12 +20571,14 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -19672,12 +20586,14 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -19686,6 +20602,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -19693,11 +20610,11 @@ } }, "@react-native-community/cli-clean": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-8.0.0.tgz", - "integrity": "sha512-VY/kwyH5xp6oXiB9bcwa+I9W5k6WR/nX3s85FuMW76hSlgG1UVAGL04uZPwYlSmMZuSOSuoXOaIjJ7wAvQMBpg==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-8.0.4.tgz", + "integrity": "sha512-IwS1M1NHg6+qL8PThZYMSIMYbZ6Zbx+lIck9PLBskbosFo24M3lCOflOl++Bggjakp6mR+sRXxLMexid/GeOsQ==", "requires": { - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-tools": "^8.0.4", "chalk": "^4.1.2", "execa": "^1.0.0", "prompts": "^2.4.0" @@ -19827,11 +20744,11 @@ } }, "@react-native-community/cli-config": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-8.0.3.tgz", - "integrity": "sha512-QhLU6QZywkoO4FzpeEkdoYml0nE9tBwhmOUI/c5iYPOtKhhXiW8kNCLiX96TJDiZonalzptkkNiRZkipdz/8hw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-8.0.4.tgz", + "integrity": "sha512-0vcrIETka1Tr0blr0AjVkoP/1yynvarJQXi8Yry/XB3BLenrkUFxolqqA3Ff55KFQ7t1IzAuFtfuVZs25LvyDQ==", "requires": { - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-tools": "^8.0.4", "cosmiconfig": "^5.1.0", "deepmerge": "^3.2.0", "glob": "^7.1.3", @@ -19854,13 +20771,13 @@ } }, "@react-native-community/cli-doctor": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-8.0.3.tgz", - "integrity": "sha512-ndISZhZqOoeSuQCm5KLwJNkckk14Bqn1N8LHJbC6l4zAyDU0nQRO1IVPoV5uyaANMzMqSNzS6k9N4M0PpcuhIQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-8.0.4.tgz", + "integrity": "sha512-Blw/66qwoEoKrtwn3O9iTtXbt4YWlwqNse5BJeRDzlSdutWTX4PgJu/34gyvOHGysNlrf+GYkeyqqxI/y0s07A==", "requires": { - "@react-native-community/cli-config": "^8.0.3", - "@react-native-community/cli-platform-ios": "^8.0.2", - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-config": "^8.0.4", + "@react-native-community/cli-platform-ios": "^8.0.4", + "@react-native-community/cli-tools": "^8.0.4", "chalk": "^4.1.2", "command-exists": "^1.2.8", "envinfo": "^7.7.2", @@ -19876,6 +20793,21 @@ "wcwidth": "^1.0.1" }, "dependencies": { + "@react-native-community/cli-platform-ios": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-8.0.4.tgz", + "integrity": "sha512-7Jdptedfg/J0Xo2rQbJ4jmo+PMYOiIiRcNDCSI5dBcNkQfSq4MMYUnKQx5DdZHgrfxE0O1vE4iNmJdd4wePz8w==", + "requires": { + "@react-native-community/cli-tools": "^8.0.4", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "glob": "^7.1.3", + "js-yaml": "^3.13.1", + "lodash": "^4.17.15", + "ora": "^5.4.1", + "plist": "^3.0.2" + } + }, "ansi-regex": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", @@ -20015,12 +20947,12 @@ } }, "@react-native-community/cli-hermes": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-8.0.2.tgz", - "integrity": "sha512-RZ9uHTf3UFtGTYxq88uENJEdaDB8ab+YPBDn+Li1u78IKwNeL04F0A1A3ab3hYUkG4PEPnL2rkYSlzzNFLOSPQ==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-8.0.5.tgz", + "integrity": "sha512-Zm0wM6SfgYAEX1kfJ1QBvTayabvh79GzmjHyuSnEROVNPbl4PeCG4WFbwy489tGwOP9Qx9fMT5tRIFCD8bp6/g==", "requires": { - "@react-native-community/cli-platform-android": "^8.0.2", - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-platform-android": "^8.0.5", + "@react-native-community/cli-tools": "^8.0.4", "chalk": "^4.1.2", "hermes-profile-transformer": "^0.0.6", "ip": "^1.1.5" @@ -20072,11 +21004,11 @@ } }, "@react-native-community/cli-platform-android": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-8.0.2.tgz", - "integrity": "sha512-pAEkt+GULesr8FphTpaNYSmu+O1CPQ2zCXkAg4kRd0WXpq3BsVqomyDWd/eMXTkY/yYQMGl6KilU2p9r/hnfhA==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-8.0.5.tgz", + "integrity": "sha512-z1YNE4T1lG5o9acoQR1GBvf7mq6Tzayqo/za5sHVSOJAC9SZOuVN/gg/nkBa9a8n5U7qOMFXfwhTMNqA474gXA==", "requires": { - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-tools": "^8.0.4", "chalk": "^4.1.2", "execa": "^1.0.0", "fs-extra": "^8.1.0", @@ -20211,24 +21143,52 @@ } }, "@react-native-community/cli-platform-ios": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-8.0.2.tgz", - "integrity": "sha512-LxWzj6jIZr5Ot893TKFbt0/T3WkVe6pbc/FSTo+TDQq1FQr/Urv16Uqn0AcL4IX2O1g3Qd13d0vtR/Cdpn3VNw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-7.0.1.tgz", + "integrity": "sha512-PLRIbzrCzSedmpjuFtQqcqUD45G8q7sEciI1lf5zUbVMXqjIBwJWS7iz8235PyWwj8J4MNHohLC+oyRueFtbGg==", + "dev": true, "requires": { - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-tools": "^7.0.1", "chalk": "^4.1.2", "execa": "^1.0.0", "glob": "^7.1.3", "js-yaml": "^3.13.1", "lodash": "^4.17.15", "ora": "^5.4.1", - "plist": "^3.0.2" + "plist": "^3.0.2", + "xcode": "^3.0.0" }, "dependencies": { + "@react-native-community/cli-tools": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-7.0.1.tgz", + "integrity": "sha512-0xra4hKNA5PR2zYVXsDMNiXMGaDNoNRYMY6eTP2aVIxQbqIcVMDWSyCA8wMWX5iOpMWg0cZGaQ6a77f3Rlb34g==", + "dev": true, + "requires": { + "appdirsjs": "^1.2.4", + "chalk": "^4.1.2", + "lodash": "^4.17.15", + "mime": "^2.4.1", + "node-fetch": "^2.6.0", + "open": "^6.2.0", + "ora": "^5.4.1", + "semver": "^6.3.0", + "shell-quote": "^1.7.3" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -20237,6 +21197,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -20246,6 +21207,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -20253,12 +21215,14 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -20271,6 +21235,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -20285,6 +21250,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, "requires": { "pump": "^3.0.0" } @@ -20292,17 +21258,20 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, "requires": { "path-key": "^2.0.0" } @@ -20310,17 +21279,20 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -20328,12 +21300,14 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -20342,6 +21316,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -20349,12 +21324,12 @@ } }, "@react-native-community/cli-plugin-metro": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-8.0.0.tgz", - "integrity": "sha512-eIowV2ZRbzIWL3RIKVUUSahntXTuAeKzBSsFuhffLZphsV+UdKdtg5ATR9zbq7nsKap4ZseO5DkVqZngUkC7iQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-8.0.4.tgz", + "integrity": "sha512-UWzY1eMcEr/6262R2+d0Is5M3L/7Y/xXSDIFMoc5Rv5Wucl3hJM/TxHXmByvHpuJf6fJAfqOskyt4bZCvbI+wQ==", "requires": { - "@react-native-community/cli-server-api": "^8.0.0", - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-server-api": "^8.0.4", + "@react-native-community/cli-tools": "^8.0.4", "chalk": "^4.1.2", "metro": "^0.70.1", "metro-config": "^0.70.1", @@ -20411,12 +21386,12 @@ } }, "@react-native-community/cli-server-api": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-8.0.0.tgz", - "integrity": "sha512-TxUs3sMl9clt7sdv30XETc6VRzyaEli2vDrk3TB5W5o5nSd1PmQdP4ccdGLO/nDRXwOy72QmmXlYWMg1XGU0Gg==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-8.0.4.tgz", + "integrity": "sha512-Orr14njx1E70CVrUA8bFdl+mrnbuXUjf1Rhhm0RxUadFpvkHuOi5dh8Bryj2MKtf8eZrpEwZ7tuQPhJEULW16A==", "requires": { "@react-native-community/cli-debugger-ui": "^8.0.0", - "@react-native-community/cli-tools": "^8.0.0", + "@react-native-community/cli-tools": "^8.0.4", "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.0", @@ -20427,12 +21402,13 @@ } }, "@react-native-community/cli-tools": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-8.0.0.tgz", - "integrity": "sha512-jA4y8CebrRZaOJFjc5zMOnls4KfHkBl2FUtBZV2vcWuedQHa6JVwo+KO88ta3Ysby3uY0+mrZagZfXk7c0mrBw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-8.0.4.tgz", + "integrity": "sha512-ePN9lGxh6LRFiotyddEkSmuqpQhnq2iw9oiXYr4EFWpIEy0yCigTuSTiDF68+c8M9B+7bTwkRpz/rMPC4ViO5Q==", "requires": { "appdirsjs": "^1.2.4", "chalk": "^4.1.2", + "find-up": "^5.0.0", "lodash": "^4.17.15", "mime": "^2.4.1", "node-fetch": "^2.6.0", @@ -20472,11 +21448,44 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -21137,6 +22146,12 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -21404,6 +22419,12 @@ "tweetnacl": "^0.14.3" } }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, "bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -21422,6 +22443,24 @@ "readable-stream": "^3.4.0" } }, + "bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "dev": true, + "requires": { + "stream-buffers": "2.2.x" + } + }, + "bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "dev": true, + "requires": { + "big-integer": "1.6.x" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -21787,6 +22826,12 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -22006,6 +23051,12 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -22062,6 +23113,37 @@ "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==", "dev": true }, + "deep-equal": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", + "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "es-get-iterator": "^1.1.1", + "get-intrinsic": "^1.0.1", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.1.1", + "isarray": "^2.0.5", + "object-is": "^1.1.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.3", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -22264,6 +23346,30 @@ "unbox-primitive": "^1.0.2" } }, + "es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, "es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -22857,6 +23963,12 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "dev": true + }, "fast-base64-decode": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", @@ -23059,6 +24171,15 @@ "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.121.0.tgz", "integrity": "sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg==" }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -23273,6 +24394,23 @@ "function-bind": "^1.1.1" } }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + } + } + }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -23464,6 +24602,12 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "i": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", + "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", + "dev": true + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -23569,6 +24713,16 @@ "kind-of": "^6.0.0" } }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -23683,6 +24837,12 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -23721,6 +24881,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -23754,6 +24920,19 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -23764,6 +24943,12 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -23773,6 +24958,16 @@ "call-bind": "^1.0.2" } }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -25558,6 +26753,15 @@ } } }, + "jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + } + }, "jest-snapshot": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", @@ -26660,15 +27864,6 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" }, - "jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - } - }, "jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -26885,17 +28080,8 @@ }, "jest-regex-util": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" - }, - "jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - } + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" }, "jest-util": { "version": "27.5.1", @@ -27223,6 +28409,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, "nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -27257,6 +28449,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "ncp": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", + "integrity": "sha512-PfGU8jYWdRl4FqJfCy0IzbkGyFHntfWygZg46nFk/dJD/XRrk2cj0SsKSX9n5u5gE0E0YfEpKWrEkfjnlZSTXA==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -27463,6 +28661,16 @@ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -27777,6 +28985,12 @@ "find-up": "^4.0.0" } }, + "pkginfo": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", + "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==", + "dev": true + }, "plist": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", @@ -27883,6 +29097,19 @@ "asap": "~2.0.6" } }, + "prompt": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", + "integrity": "sha512-jDK5yEbAakJmNm+260gZG1+PuzX3jT5Jy0VZAUGrrW9RQ1JEWEDEVNnhO70mL3+U5r6bSJo02xsE34wOS/LnrA==", + "dev": true, + "requires": { + "pkginfo": "0.x.x", + "read": "1.0.x", + "revalidator": "0.1.x", + "utile": "0.2.x", + "winston": "0.8.x" + } + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -28034,6 +29261,171 @@ "ws": "^6.1.4" }, "dependencies": { + "@react-native-community/cli": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-8.0.5.tgz", + "integrity": "sha512-X0AMNK+sKDJQX8eQRkqgddJsZPWlHgLryX7O9usj78UFEK8VqVYtpv08piWecfAhC2mZU4/Lww4bKu9uJ1rdyQ==", + "requires": { + "@react-native-community/cli-clean": "^8.0.4", + "@react-native-community/cli-config": "^8.0.4", + "@react-native-community/cli-debugger-ui": "^8.0.0", + "@react-native-community/cli-doctor": "^8.0.4", + "@react-native-community/cli-hermes": "^8.0.5", + "@react-native-community/cli-plugin-metro": "^8.0.4", + "@react-native-community/cli-server-api": "^8.0.4", + "@react-native-community/cli-tools": "^8.0.4", + "@react-native-community/cli-types": "^8.0.0", + "chalk": "^4.1.2", + "commander": "^2.19.0", + "execa": "^1.0.0", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "graceful-fs": "^4.1.3", + "leven": "^3.1.0", + "lodash": "^4.17.15", + "minimist": "^1.2.0", + "prompts": "^2.4.0", + "semver": "^6.3.0" + } + }, + "@react-native-community/cli-platform-ios": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-8.0.4.tgz", + "integrity": "sha512-7Jdptedfg/J0Xo2rQbJ4jmo+PMYOiIiRcNDCSI5dBcNkQfSq4MMYUnKQx5DdZHgrfxE0O1vE4iNmJdd4wePz8w==", + "requires": { + "@react-native-community/cli-tools": "^8.0.4", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "glob": "^7.1.3", + "js-yaml": "^3.13.1", + "lodash": "^4.17.15", + "ora": "^5.4.1", + "plist": "^3.0.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, "ws": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", @@ -28044,6 +29436,66 @@ } } }, + "react-native-cli": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-native-cli/-/react-native-cli-2.0.1.tgz", + "integrity": "sha512-QgkB1urUhGe9q1vcqQLIfNdCd/Qf3MdNQe19QO6lVjhIVKljlVMKtaK8RaZ8PCNB/cdXlO/G3tKUGk+ghMXE6w==", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "minimist": "^1.2.0", + "prompt": "^0.2.14", + "semver": "^5.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, "react-native-codegen": { "version": "0.69.1", "resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.69.1.tgz", @@ -28080,6 +29532,11 @@ "resolved": "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.0.7.tgz", "integrity": "sha512-+4JpbIx42zGTONhBTIXSyfyHICHC29VTvhkkoUOJAh/XHPEixpuBduYgf6Y4y9wsN1ARlQhBBoptTvXvAFQf5g==" }, + "react-native-keychain": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/react-native-keychain/-/react-native-keychain-8.1.1.tgz", + "integrity": "sha512-8fxgeHKwGcL657eAYpdBTkDIxNhbIHI+kyyO0Yac2dgVAN184JoIwQcW2z6snahwDaCObQOu0biLFHnsH+4KSg==" + }, "react-native-safe-area-context": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.3.1.tgz", @@ -28103,11 +29560,6 @@ } } }, - "react-native-secure-key-store": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/react-native-secure-key-store/-/react-native-secure-key-store-2.0.9.tgz", - "integrity": "sha512-9qi1rOlv4qNSpJIjqcIB7d0EQSwo2Yho8NVBT/Jc9NeYibDLHdArLXl8jn8H6nlf+8alk/bXqr4rPINrCTtmog==" - }, "react-native-vector-icons": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-9.2.0.tgz", @@ -28237,6 +29689,15 @@ } } }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -28583,6 +30044,12 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "revalidator": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", + "integrity": "sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -28794,6 +30261,17 @@ "simple-concat": "^1.0.0" } }, + "simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "dev": true, + "requires": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -29039,6 +30517,12 @@ "tweetnacl": "~0.14.0" } }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true + }, "stack-utils": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", @@ -29151,6 +30635,12 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" }, + "stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "dev": true + }, "stream-counter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz", @@ -29896,6 +31386,37 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "utile": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", + "integrity": "sha512-ltfvuCJNa/JFOhKBBiQ9qDyyFwLstoMMO1ru0Yg/Mcl8dp1Z3IBaL7n+5dHpyma+d3lCogkgBQnWKtGxzNyqhg==", + "dev": true, + "requires": { + "async": "~0.2.9", + "deep-equal": "*", + "i": "0.3.x", + "mkdirp": "0.x.x", + "ncp": "0.4.x", + "rimraf": "2.x.x" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -30003,11 +31524,66 @@ "is-symbol": "^1.0.3" } }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, + "which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + } + }, + "winston": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", + "integrity": "sha512-fPoamsHq8leJ62D1M9V/f15mjQ1UHe4+7j1wpAT3fqgA5JqhJkk4aIfPEjfMTI9x6ZTjaLOpMAjluLtmgO5b6g==", + "dev": true, + "requires": { + "async": "0.2.x", + "colors": "0.6.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "pkginfo": "0.3.x", + "stack-trace": "0.0.x" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==", + "dev": true + } + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -30068,6 +31644,24 @@ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "requires": {} }, + "xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "dev": true, + "requires": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "dependencies": { + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true + } + } + }, "xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", @@ -30118,8 +31712,7 @@ "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/squarenotsquare/package.json b/squarenotsquare/package.json index e479f83..3707151 100644 --- a/squarenotsquare/package.json +++ b/squarenotsquare/package.json @@ -26,9 +26,9 @@ "react-native": "0.69.2", "react-native-gesture-handler": "^2.5.0", "react-native-get-random-values": "^1.8.0", + "react-native-keychain": "^8.1.1", "react-native-safe-area-context": "^4.3.1", "react-native-screens": "^3.15.0", - "react-native-secure-key-store": "^2.0.9", "react-native-vector-icons": "^9.2.0", "react-redux": "^8.0.2", "realm": "^10.19.5", @@ -39,11 +39,14 @@ "devDependencies": { "@babel/core": "^7.12.9", "@babel/runtime": "^7.12.5", + "@react-native-community/cli": "^8.0.1", + "@react-native-community/cli-platform-ios": "^7.0.1", "@react-native-community/eslint-config": "^2.0.0", "babel-jest": "^28.0.0", "eslint": "^7.32.0", "jest": "^28.0.0", "metro-react-native-babel-preset": "^0.70.3", + "react-native-cli": "^2.0.1", "react-test-renderer": "18.0.0", "redux-logger": "^3.0.6", "redux-mock-store": "^1.5.4", -- 2.20.1 From c912470d4bb59e7ea4394d88db2f322896ee6bf7 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 16:50:57 -0500 Subject: [PATCH 044/128] use keystore internet creds for keystore --- squarenotsquare/src/services/Keystore.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/squarenotsquare/src/services/Keystore.js b/squarenotsquare/src/services/Keystore.js index 70cd3f3..6b5f696 100644 --- a/squarenotsquare/src/services/Keystore.js +++ b/squarenotsquare/src/services/Keystore.js @@ -1,8 +1,13 @@ -import RNSecureKeyStore, {ACCESSIBLE} from 'react-native-secure-key-store'; +import { + setInternetCredentials, + getInternetCredentials, + resetInternetCredentials, + ACCESSIBLE +} from "react-native-keychain"; export async function removeKey(key) { let outcome = null; - await RNSecureKeyStore.remove(key).then( + await resetInternetCredentials(key).then( (res) => { outcome = true; }, @@ -16,7 +21,7 @@ export async function removeKey(key) { export async function setKey(key, value) { let outcome = null; - await RNSecureKeyStore.set(key, value, { + await setInternetCredentials(key, value, 'none', { accessible: ACCESSIBLE.WHEN_UNLOCKED_THIS_DEVICE_ONLY, }).then( (res) => { @@ -32,9 +37,9 @@ export async function setKey(key, value) { export async function getKey(key) { let value = null; - await RNSecureKeyStore.get(key).then( + await getInternetCredentials(key).then( (res) => { - value = res; + value = res.username; }, (err) => { value = null; -- 2.20.1 From df9f07a1fd726876849561eca3a0b5bb14703305 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 17:17:09 -0500 Subject: [PATCH 045/128] update for keychain --- squarenotsquare/__mock__/mockKeyStore.js | 45 +++++++++++------------- squarenotsquare/jest.config.js | 2 +- squarenotsquare/src/realm/DbInit.js | 6 ++-- squarenotsquare/src/services/Keystore.js | 6 +++- 4 files changed, 30 insertions(+), 29 deletions(-) diff --git a/squarenotsquare/__mock__/mockKeyStore.js b/squarenotsquare/__mock__/mockKeyStore.js index 4f681f4..60369e3 100644 --- a/squarenotsquare/__mock__/mockKeyStore.js +++ b/squarenotsquare/__mock__/mockKeyStore.js @@ -1,32 +1,29 @@ -class MockKeyStore { - async remove(key) { - if (key === 'notakey') { - throw ('Key not found'); - } - return true; + +export async function resetInternetCredentials(key) { + if (key === 'notakey') { + throw ('Key not found'); } + return true; +} - async set(key, value) { - if (key === 'savefailed'){ - throw ('Failed to save key'); - } - return true; +export async function setInternetCredentials(key, value, placeholder) { + if (key === 'savefailed'){ + throw ('Failed to save key'); } - - async get(key) { - if (key === 'isNull'){ - return null; - } else if (key === 'negTest') { - return '-1'; - } else if (key === 'notakey') { - throw ('Key not found'); - } else { - return '1234567890'; - } - } + return true; } -export default RNSecureKeyStore = new MockKeyStore(); +export async function getInternetCredentials(key) { + if (key === 'isNull'){ + return false; + } else if (key === 'negTest') { + return {username: '-1'}; + } else if (key === 'notakey') { + throw ('Key not found'); + } else { + return {username: '1234567890'}; + } +} export const ACCESSIBLE = { AFTER_FIRST_UNLOCK :'AccessibleAfterFirstUnlock', diff --git a/squarenotsquare/jest.config.js b/squarenotsquare/jest.config.js index 9e0fac9..3b8666c 100644 --- a/squarenotsquare/jest.config.js +++ b/squarenotsquare/jest.config.js @@ -6,7 +6,7 @@ module.exports = { moduleDirectories: ['node_modules', 'src'], moduleNameMapper: { // '@react-native-firebase/messaging: '/__mock__/mockFirebase.js', - 'react-native-secure-key-store': '/__mock__/mockKeyStore.js', + 'react-native-keychain': '/__mock__/mockKeyStore.js', '\\.(jpg|ico|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/__mock__/file.js', '^(realm)': '/__mock__/mockRealmObject' }, diff --git a/squarenotsquare/src/realm/DbInit.js b/squarenotsquare/src/realm/DbInit.js index d0ceb7a..d67ac30 100644 --- a/squarenotsquare/src/realm/DbInit.js +++ b/squarenotsquare/src/realm/DbInit.js @@ -22,14 +22,14 @@ export async function initDB(dbKeyRef = 'squareDB', dbLocation = Realm.defaultPa try { let fromStore = await KeyStore.getKey(dbKeyRef); - if (fromStore === null) { + if (fromStore === false) { let newKey = generateKey(); await KeyStore.setKey(dbKeyRef, newKey); - fromStore = await KeyStore.getKey(dbKeyRef); + fromStore = newKey; } let dbKey = new Uint8Array(64); - if (fromStore !== null){ + if (fromStore !== false){ for (let i = 0; i < 64; ++i){ dbKey[i] = fromStore.charAt(i); } diff --git a/squarenotsquare/src/services/Keystore.js b/squarenotsquare/src/services/Keystore.js index 6b5f696..32d4f37 100644 --- a/squarenotsquare/src/services/Keystore.js +++ b/squarenotsquare/src/services/Keystore.js @@ -39,7 +39,11 @@ export async function getKey(key) { let value = null; await getInternetCredentials(key).then( (res) => { - value = res.username; + if (res === false) { + value = false; + } else { + value = res.username; + } }, (err) => { value = null; -- 2.20.1 From 99e880c1f66bf11369871b9f80250892ac83890d Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 17:37:49 -0500 Subject: [PATCH 046/128] ios vector icon fix --- squarenotsquare/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/squarenotsquare/index.js b/squarenotsquare/index.js index 07b87ea..0b2853c 100644 --- a/squarenotsquare/index.js +++ b/squarenotsquare/index.js @@ -4,7 +4,10 @@ import {name as appName} from './app.json'; import SquareNotSquare from './SquareNotSquare'; import ConfigStore from './src/redux/CreateStore'; import { appInit } from './src/redux/actions/SystemActions'; +import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; +//fix vector icons bug +MaterialIcon.loadFont(); const squareStore = ConfigStore; squareStore.dispatch(appInit()); -- 2.20.1 From 0f69d2db57cafda3929580c018dec80981ee834e Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 17:37:59 -0500 Subject: [PATCH 047/128] shadow metrics --- squarenotsquare/src/themes/Metrics.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index 58b3afa..d2dbddd 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -16,11 +16,11 @@ class AppMetrics { } this.shadows = { - elevation: 10, - offsetWidth: 10, - offsetHeight: 10, - opacity: 1, - radius: 0 + elevation: 5, + offsetWidth: 5, + offsetHeight: 5, + opacity: 0.5, + radius: 5 } this.screenSections = { -- 2.20.1 From 188c9240e9a7df710e3f44a01ff9833168bf30e6 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 17:54:11 -0500 Subject: [PATCH 048/128] safe area view --- squarenotsquare/src/screens/Home.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 6193f73..930dc09 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -1,5 +1,5 @@ import React, { useEffect } from "react"; -import { BackHandler, Text, TouchableOpacity, View } from "react-native"; +import { BackHandler, SafeAreaView, Text, TouchableOpacity, View } from "react-native"; import { styles } from './styles/AppStyles'; import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; import Icons from '../themes/Icons'; @@ -21,13 +21,12 @@ function Home(){ } return ( - - + + @@ -65,7 +64,7 @@ function Home(){ 0.0.1a Atonal Software August 2, 2022 - + ) } -- 2.20.1 From 3a932bcdc5c258aefd8a67fbe958c342fad32879 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 17:57:04 -0500 Subject: [PATCH 049/128] Date string footer --- squarenotsquare/src/screens/Home.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 930dc09..684dcad 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -20,6 +20,8 @@ function Home(){ dispatch(squareStartPressed()); } + const now = new Date(Date.now()); + return ( @@ -61,7 +63,7 @@ function Home(){ - 0.0.1a Atonal Software August 2, 2022 + 0.0.1a Atonal Software {now.toDateString()} -- 2.20.1 From d657bc09d6ce04bd005f07e5a06393ff95d08b9f Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 18:00:51 -0500 Subject: [PATCH 050/128] podfile --- .gitignore | 4 + squarenotsquare/ios/Podfile.lock | 604 +++++++++++++++++++++++++++++++ 2 files changed, 608 insertions(+) create mode 100644 .gitignore create mode 100644 squarenotsquare/ios/Podfile.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cfac840 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +squarenotsquare/ios/squarenotsquare.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +squarenotsquare/ios/squarenotsquare.xcworkspace/contents.xcworkspacedata +squarenotsquare/ios/squarenotsquare.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +.DS_Store diff --git a/squarenotsquare/ios/Podfile.lock b/squarenotsquare/ios/Podfile.lock new file mode 100644 index 0000000..83e107e --- /dev/null +++ b/squarenotsquare/ios/Podfile.lock @@ -0,0 +1,604 @@ +PODS: + - boost (1.76.0) + - CocoaAsyncSocket (7.6.5) + - DoubleConversion (1.1.6) + - FBLazyVector (0.69.2) + - FBReactNativeSpec (0.69.2): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired (= 0.69.2) + - RCTTypeSafety (= 0.69.2) + - React-Core (= 0.69.2) + - React-jsi (= 0.69.2) + - ReactCommon/turbomodule/core (= 0.69.2) + - Flipper (0.125.0): + - Flipper-Folly (~> 2.6) + - Flipper-RSocket (~> 1.4) + - Flipper-Boost-iOSX (1.76.0.1.11) + - Flipper-DoubleConversion (3.2.0.1) + - Flipper-Fmt (7.1.7) + - Flipper-Folly (2.6.10): + - Flipper-Boost-iOSX + - Flipper-DoubleConversion + - Flipper-Fmt (= 7.1.7) + - Flipper-Glog + - libevent (~> 2.1.12) + - OpenSSL-Universal (= 1.1.1100) + - Flipper-Glog (0.5.0.5) + - Flipper-PeerTalk (0.0.4) + - Flipper-RSocket (1.4.3): + - Flipper-Folly (~> 2.6) + - FlipperKit (0.125.0): + - FlipperKit/Core (= 0.125.0) + - FlipperKit/Core (0.125.0): + - Flipper (~> 0.125.0) + - FlipperKit/CppBridge + - FlipperKit/FBCxxFollyDynamicConvert + - FlipperKit/FBDefines + - FlipperKit/FKPortForwarding + - SocketRocket (~> 0.6.0) + - FlipperKit/CppBridge (0.125.0): + - Flipper (~> 0.125.0) + - FlipperKit/FBCxxFollyDynamicConvert (0.125.0): + - Flipper-Folly (~> 2.6) + - FlipperKit/FBDefines (0.125.0) + - FlipperKit/FKPortForwarding (0.125.0): + - CocoaAsyncSocket (~> 7.6) + - Flipper-PeerTalk (~> 0.0.4) + - FlipperKit/FlipperKitHighlightOverlay (0.125.0) + - FlipperKit/FlipperKitLayoutHelpers (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutTextSearchable + - FlipperKit/FlipperKitLayoutIOSDescriptors (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutHelpers + - YogaKit (~> 1.18) + - FlipperKit/FlipperKitLayoutPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutHelpers + - FlipperKit/FlipperKitLayoutIOSDescriptors + - FlipperKit/FlipperKitLayoutTextSearchable + - YogaKit (~> 1.18) + - FlipperKit/FlipperKitLayoutTextSearchable (0.125.0) + - FlipperKit/FlipperKitNetworkPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitReactPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitUserDefaultsPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/SKIOSNetworkPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitNetworkPlugin + - fmt (6.2.1) + - GCDWebServer (3.5.4): + - GCDWebServer/Core (= 3.5.4) + - GCDWebServer/Core (3.5.4) + - glog (0.3.5) + - libevent (2.1.12) + - OpenSSL-Universal (1.1.1100) + - RCT-Folly (2021.06.28.00-v2): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCT-Folly/Default (= 2021.06.28.00-v2) + - RCT-Folly/Default (2021.06.28.00-v2): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCTRequired (0.69.2) + - RCTTypeSafety (0.69.2): + - FBLazyVector (= 0.69.2) + - RCTRequired (= 0.69.2) + - React-Core (= 0.69.2) + - React (0.69.2): + - React-Core (= 0.69.2) + - React-Core/DevSupport (= 0.69.2) + - React-Core/RCTWebSocket (= 0.69.2) + - React-RCTActionSheet (= 0.69.2) + - React-RCTAnimation (= 0.69.2) + - React-RCTBlob (= 0.69.2) + - React-RCTImage (= 0.69.2) + - React-RCTLinking (= 0.69.2) + - React-RCTNetwork (= 0.69.2) + - React-RCTSettings (= 0.69.2) + - React-RCTText (= 0.69.2) + - React-RCTVibration (= 0.69.2) + - React-bridging (0.69.2): + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsi (= 0.69.2) + - React-callinvoker (0.69.2) + - React-Codegen (0.69.2): + - FBReactNativeSpec (= 0.69.2) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired (= 0.69.2) + - RCTTypeSafety (= 0.69.2) + - React-Core (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - ReactCommon/turbomodule/core (= 0.69.2) + - React-Core (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.69.2) + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/CoreModulesHeaders (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/Default (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/DevSupport (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.69.2) + - React-Core/RCTWebSocket (= 0.69.2) + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-jsinspector (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/RCTActionSheetHeaders (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/RCTAnimationHeaders (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/RCTBlobHeaders (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/RCTImageHeaders (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/RCTLinkingHeaders (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/RCTNetworkHeaders (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/RCTSettingsHeaders (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/RCTTextHeaders (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/RCTVibrationHeaders (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-Core/RCTWebSocket (0.69.2): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.69.2) + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsiexecutor (= 0.69.2) + - React-perflogger (= 0.69.2) + - Yoga + - React-CoreModules (0.69.2): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.69.2) + - React-Codegen (= 0.69.2) + - React-Core/CoreModulesHeaders (= 0.69.2) + - React-jsi (= 0.69.2) + - React-RCTImage (= 0.69.2) + - ReactCommon/turbomodule/core (= 0.69.2) + - React-cxxreact (0.69.2): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-callinvoker (= 0.69.2) + - React-jsi (= 0.69.2) + - React-jsinspector (= 0.69.2) + - React-logger (= 0.69.2) + - React-perflogger (= 0.69.2) + - React-runtimeexecutor (= 0.69.2) + - React-jsi (0.69.2): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsi/Default (= 0.69.2) + - React-jsi/Default (0.69.2): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsiexecutor (0.69.2): + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-perflogger (= 0.69.2) + - React-jsinspector (0.69.2) + - React-logger (0.69.2): + - glog + - react-native-get-random-values (1.8.0): + - React-Core + - react-native-safe-area-context (4.3.1): + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React + - ReactCommon/turbomodule/core + - React-perflogger (0.69.2) + - React-RCTActionSheet (0.69.2): + - React-Core/RCTActionSheetHeaders (= 0.69.2) + - React-RCTAnimation (0.69.2): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.69.2) + - React-Codegen (= 0.69.2) + - React-Core/RCTAnimationHeaders (= 0.69.2) + - React-jsi (= 0.69.2) + - ReactCommon/turbomodule/core (= 0.69.2) + - React-RCTBlob (0.69.2): + - RCT-Folly (= 2021.06.28.00-v2) + - React-Codegen (= 0.69.2) + - React-Core/RCTBlobHeaders (= 0.69.2) + - React-Core/RCTWebSocket (= 0.69.2) + - React-jsi (= 0.69.2) + - React-RCTNetwork (= 0.69.2) + - ReactCommon/turbomodule/core (= 0.69.2) + - React-RCTImage (0.69.2): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.69.2) + - React-Codegen (= 0.69.2) + - React-Core/RCTImageHeaders (= 0.69.2) + - React-jsi (= 0.69.2) + - React-RCTNetwork (= 0.69.2) + - ReactCommon/turbomodule/core (= 0.69.2) + - React-RCTLinking (0.69.2): + - React-Codegen (= 0.69.2) + - React-Core/RCTLinkingHeaders (= 0.69.2) + - React-jsi (= 0.69.2) + - ReactCommon/turbomodule/core (= 0.69.2) + - React-RCTNetwork (0.69.2): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.69.2) + - React-Codegen (= 0.69.2) + - React-Core/RCTNetworkHeaders (= 0.69.2) + - React-jsi (= 0.69.2) + - ReactCommon/turbomodule/core (= 0.69.2) + - React-RCTSettings (0.69.2): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.69.2) + - React-Codegen (= 0.69.2) + - React-Core/RCTSettingsHeaders (= 0.69.2) + - React-jsi (= 0.69.2) + - ReactCommon/turbomodule/core (= 0.69.2) + - React-RCTText (0.69.2): + - React-Core/RCTTextHeaders (= 0.69.2) + - React-RCTVibration (0.69.2): + - RCT-Folly (= 2021.06.28.00-v2) + - React-Codegen (= 0.69.2) + - React-Core/RCTVibrationHeaders (= 0.69.2) + - React-jsi (= 0.69.2) + - ReactCommon/turbomodule/core (= 0.69.2) + - React-runtimeexecutor (0.69.2): + - React-jsi (= 0.69.2) + - ReactCommon/turbomodule/core (0.69.2): + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-bridging (= 0.69.2) + - React-callinvoker (= 0.69.2) + - React-Core (= 0.69.2) + - React-cxxreact (= 0.69.2) + - React-jsi (= 0.69.2) + - React-logger (= 0.69.2) + - React-perflogger (= 0.69.2) + - RealmJS (10.19.5): + - GCDWebServer + - React + - RNGestureHandler (2.5.0): + - React-Core + - RNKeychain (8.1.1): + - React-Core + - RNScreens (3.15.0): + - React-Core + - React-RCTImage + - RNVectorIcons (9.2.0): + - React-Core + - SocketRocket (0.6.0) + - Yoga (1.14.0) + - YogaKit (1.18.1): + - Yoga (~> 1.14) + +DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) + - Flipper (= 0.125.0) + - Flipper-Boost-iOSX (= 1.76.0.1.11) + - Flipper-DoubleConversion (= 3.2.0.1) + - Flipper-Fmt (= 7.1.7) + - Flipper-Folly (= 2.6.10) + - Flipper-Glog (= 0.5.0.5) + - Flipper-PeerTalk (= 0.0.4) + - Flipper-RSocket (= 1.4.3) + - FlipperKit (= 0.125.0) + - FlipperKit/Core (= 0.125.0) + - FlipperKit/CppBridge (= 0.125.0) + - FlipperKit/FBCxxFollyDynamicConvert (= 0.125.0) + - FlipperKit/FBDefines (= 0.125.0) + - FlipperKit/FKPortForwarding (= 0.125.0) + - FlipperKit/FlipperKitHighlightOverlay (= 0.125.0) + - FlipperKit/FlipperKitLayoutPlugin (= 0.125.0) + - FlipperKit/FlipperKitLayoutTextSearchable (= 0.125.0) + - FlipperKit/FlipperKitNetworkPlugin (= 0.125.0) + - FlipperKit/FlipperKitReactPlugin (= 0.125.0) + - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.125.0) + - FlipperKit/SKIOSNetworkPlugin (= 0.125.0) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - OpenSSL-Universal (= 1.1.1100) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-bridging (from `../node_modules/react-native/ReactCommon`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Codegen (from `build/generated/ios`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/DevSupport (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - react-native-get-random-values (from `../node_modules/react-native-get-random-values`) + - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - RealmJS (from `../node_modules/realm`) + - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) + - RNKeychain (from `../node_modules/react-native-keychain`) + - RNScreens (from `../node_modules/react-native-screens`) + - RNVectorIcons (from `../node_modules/react-native-vector-icons`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - CocoaAsyncSocket + - Flipper + - Flipper-Boost-iOSX + - Flipper-DoubleConversion + - Flipper-Fmt + - Flipper-Folly + - Flipper-Glog + - Flipper-PeerTalk + - Flipper-RSocket + - FlipperKit + - fmt + - GCDWebServer + - libevent + - OpenSSL-Universal + - SocketRocket + - YogaKit + +EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + FBReactNativeSpec: + :path: "../node_modules/react-native/React/FBReactNativeSpec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTRequired: + :path: "../node_modules/react-native/Libraries/RCTRequired" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-bridging: + :path: "../node_modules/react-native/ReactCommon" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Codegen: + :path: build/generated/ios + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" + react-native-get-random-values: + :path: "../node_modules/react-native-get-random-values" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + RealmJS: + :path: "../node_modules/realm" + RNGestureHandler: + :path: "../node_modules/react-native-gesture-handler" + RNKeychain: + :path: "../node_modules/react-native-keychain" + RNScreens: + :path: "../node_modules/react-native-screens" + RNVectorIcons: + :path: "../node_modules/react-native-vector-icons" + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost: a7c83b31436843459a1961bfd74b96033dc77234 + CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 + DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 + FBLazyVector: e3c1479be506060131807f2f2435af5107c58410 + FBReactNativeSpec: 1381e8c4230895b6c2d20cea6b216ac7096a95f0 + Flipper: 26fc4b7382499f1281eb8cb921e5c3ad6de91fe0 + Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c + Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30 + Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b + Flipper-Folly: 584845625005ff068a6ebf41f857f468decd26b3 + Flipper-Glog: 70c50ce58ddaf67dc35180db05f191692570f446 + Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 + Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541 + FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86 + fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 + GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4 + glog: 3d02b25ca00c2d456734d0bcff864cbc62f6ae1a + libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 + OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c + RCT-Folly: b9d9fe1fc70114b751c076104e52f3b1b5e5a95a + RCTRequired: b723d4d6da2795df58189a01f92856b6912cf256 + RCTTypeSafety: 3973d2fcf39f43f7819e840d56ea6b2fe45996a0 + React: 242d4ffb093ed57c4761307a69b23b2479930ae9 + React-bridging: 66938204bc9d703b9c357201a40bf498aeb14412 + React-callinvoker: bf0a87845bc3158eec32be848bd9546e79d6dd25 + React-Codegen: e5c04fc987e909433915f247699402ece1955aa0 + React-Core: 5acd5715010b56d23846859b3a68c316dad09d5b + React-CoreModules: 73db18e3aaf5e29f73e4b7c9ddf6ead823795d06 + React-cxxreact: 0fc57a199d2d69c0e0401c9eab944be9b972bf1b + React-jsi: f845df5e8fd5688cab3cdaaa06f5413e791a01bd + React-jsiexecutor: 7c23e92591431ac925f430b3118de934cb816ac0 + React-jsinspector: 31e53f048cc8f32605de36981903a7bbf9456892 + React-logger: 9a6c684d5cd56c4129e0c2842dba75c4bfb1e981 + react-native-get-random-values: a6ea6a8a65dc93e96e24a11105b1a9c8cfe1d72a + react-native-safe-area-context: 6c12e3859b6f27b25de4fee8201cfb858432d8de + React-perflogger: 281c34e42f13245c7a4d6932364d9182f8655e1a + React-RCTActionSheet: 92f4292754a1b4a0e42bf9b1489206a06f878929 + React-RCTAnimation: 2a5bb5549758e4e594481633f3db649d11519f75 + React-RCTBlob: cf573ac95fc612ed4440cad0b92161722430de87 + React-RCTImage: af8b9a46a743937db396fcb43320f57b570661dc + React-RCTLinking: 81029ed5767d2a2c13c03caeed32f87b72e73838 + React-RCTNetwork: 24c2b13acdcd43af39b2da90584c92e7799ee366 + React-RCTSettings: 028b0e20ff60d2c7ba47cedec8e99e69b6691c40 + React-RCTText: 6d17c2aead07b9de7ddc8765b580d0fb4b1d2e50 + React-RCTVibration: 0d07f00705b5f11e88aaaaf9131f5e1785d4bd6e + React-runtimeexecutor: 8030b9cf9b9e87b878d92da680b55b5e74c58e70 + ReactCommon: a9414b91f0d19de002b55d9f4f6cb176d6dd8452 + RealmJS: 400aac2267a47b25fcc2b6321e8a419282719d16 + RNGestureHandler: bad495418bcbd3ab47017a38d93d290ebd406f50 + RNKeychain: ff836453cba46938e0e9e4c22e43d43fa2c90333 + RNScreens: 4a1af06327774490d97342c00aee0c2bafb497b7 + RNVectorIcons: fcc2f6cb32f5735b586e66d14103a74ce6ad61f8 + SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 + Yoga: 236056dd74cda4d9d76c20306fd8c20bb087614d + YogaKit: f782866e155069a2cca2517aafea43200b01fd5a + +PODFILE CHECKSUM: d581c290a90c94822dda89c7b1468491518584f1 + +COCOAPODS: 1.11.3 -- 2.20.1 From 7a4e9a8c47abbbca48dbf03daffe325728c91e16 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 18:37:53 -0500 Subject: [PATCH 051/128] Render key indices --- squarenotsquare/src/screens/Game.js | 32 +++++++++++++------ .../src/screens/styles/AppStyles.js | 5 +++ squarenotsquare/src/themes/Metrics.js | 3 +- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index 69c7a36..a9faaf8 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -1,7 +1,7 @@ import React from "react"; -import { Text, TouchableOpacity, View } from "react-native"; +import { Text, TouchableOpacity, View, SafeAreaView } from "react-native"; import { ScrollView } from "react-native-gesture-handler"; -import { useState } from "react"; +import { useState, useEffect } from "react"; import {genSquareChallenge} from '../libs/Random'; import {shapes} from '../libs/ShapeEnum'; import { styles } from "./styles/AppStyles"; @@ -13,7 +13,12 @@ import Metrics from "../themes/Metrics"; function Game(props){ const squareChallenge = genSquareChallenge(); - const [startTime, setStartTime] = useState(0); + const [startTime, setStartTime] = useState(Date.now()); + const [headerText, setHeaderText] = useState('Ready?'); + const [headerColor, setHeaderColor] = useState(styles.green); + const [headerTextColor, setHeaderTextColor] = useState(styles.darkText); + + useEffect function generateSquare(){ return ( @@ -39,17 +44,17 @@ function Game(props){ ) } - function generatePair(answer, shapeIndex) { + function generatePair(answer, shapeIndex, pairIndex) { if (answer === 0) { return ( - + {generateSquare()} {generateShape(shapeIndex)} ); } else { return ( - + {generateShape(shapeIndex)} {generateSquare()} @@ -59,14 +64,21 @@ function Game(props){ function renderPairs(){ return squareChallenge.map((pair, index) => { - return generatePair(pair.squarePos, pair.shapeType); + return generatePair(pair.squarePos, pair.shapeType, index); }); } return ( - - {renderPairs()} - + + + + {headerText} + + + + {renderPairs()} + + ); } diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index 303039b..089f472 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -70,6 +70,7 @@ export const styles = StyleSheet.create({ lightBackground: {backgroundColor: Colors.material.light}, green: {backgroundColor: Colors.material.green400}, darkGreen: {backgroundColor: Colors.material.green400dark}, + dark: {backgroundColor: Colors.material.dark}, splashLogo: { width: Metrics.images.splashLogo.width, @@ -105,5 +106,9 @@ export const styles = StyleSheet.create({ zIndex: 1000, width: Metrics.icons.buttonIcon, height: Metrics.icons.buttonIcon + }, + + timerView: { + height: Metrics.screenSections.timerHeight } }) \ No newline at end of file diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index d2dbddd..95ac0ae 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -26,7 +26,8 @@ class AppMetrics { this.screenSections = { headerHeight: this.normalize(20), sectionWidth: this.screenWidth, - footerHeight: this.normalize(10) + footerHeight: this.normalize(10), + timerHeight: this.normalize(20) } this.icons = { -- 2.20.1 From b84129b9f2128cd4aa2b1cccbe591134cdfb06a4 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 22:48:54 -0500 Subject: [PATCH 052/128] calculated scroll interval --- squarenotsquare/src/themes/Metrics.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index 95ac0ae..f12b1e1 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -44,7 +44,8 @@ class AppMetrics { this.margins = { default: this.normalize(5), - buttonMargin: this.normalize(20) + buttonMargin: this.normalize(20), + gameStartMargin: this.normalize(30) } this.buttons = { @@ -59,6 +60,10 @@ class AppMetrics { } } + this.animated = { + gameScrollInterval: (this.answerButtonHeight + (this.buttonMargin * 2)) + } + this.borders = { width: 1 } -- 2.20.1 From 18605b0fa614a2b0ef8e29e1d2798f303699b11a Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 22:49:01 -0500 Subject: [PATCH 053/128] yellow game color --- squarenotsquare/src/themes/Colors.js | 1 + 1 file changed, 1 insertion(+) diff --git a/squarenotsquare/src/themes/Colors.js b/squarenotsquare/src/themes/Colors.js index aad1233..a81f16c 100644 --- a/squarenotsquare/src/themes/Colors.js +++ b/squarenotsquare/src/themes/Colors.js @@ -16,6 +16,7 @@ class AppColors { //600 grey600: '#757575', + yellow600: '#fdd835', //700 grey700: '#616161', -- 2.20.1 From 53aeb2b5eda80e874f4efda6e340be4d80f6c7f5 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 22:49:07 -0500 Subject: [PATCH 054/128] game styles --- squarenotsquare/src/screens/styles/AppStyles.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index 089f472..3ae74b4 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -69,6 +69,8 @@ export const styles = StyleSheet.create({ body: {backgroundColor: Colors.material.grey400}, lightBackground: {backgroundColor: Colors.material.light}, green: {backgroundColor: Colors.material.green400}, + yellow: {backgroundColor: Colors.material.yellow600}, + red: {backgroundColor: Colors.material.red800}, darkGreen: {backgroundColor: Colors.material.green400dark}, dark: {backgroundColor: Colors.material.dark}, @@ -78,6 +80,7 @@ export const styles = StyleSheet.create({ }, smallMargin: {margin: Metrics.margins.default}, + gameStart: {margin: Metrics.margins.gameStartMargin}, buttonMargin: { marginBottom: Metrics.margins.buttonMargin, marginTop: Metrics.margins.buttonMargin -- 2.20.1 From 3f5eeec7c5ffd8cec7dab905577203a597178533 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 22:49:20 -0500 Subject: [PATCH 055/128] game screen timer --- squarenotsquare/src/screens/Game.js | 59 ++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index a9faaf8..63f9426 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -1,7 +1,7 @@ import React from "react"; import { Text, TouchableOpacity, View, SafeAreaView } from "react-native"; import { ScrollView } from "react-native-gesture-handler"; -import { useState, useEffect } from "react"; +import { useState, useEffect, useRef, useMemo } from "react"; import {genSquareChallenge} from '../libs/Random'; import {shapes} from '../libs/ShapeEnum'; import { styles } from "./styles/AppStyles"; @@ -12,13 +12,59 @@ import Metrics from "../themes/Metrics"; function Game(props){ - const squareChallenge = genSquareChallenge(); - const [startTime, setStartTime] = useState(Date.now()); + const squareChallenge = useRef(genSquareChallenge()); + const squareMemo = useMemo(renderPairs, [squareChallenge]); + const [timerState, setTimerState] = useState(0); + const localTimer = useRef(null); + const startTime = useRef(0); const [headerText, setHeaderText] = useState('Ready?'); const [headerColor, setHeaderColor] = useState(styles.green); const [headerTextColor, setHeaderTextColor] = useState(styles.darkText); - useEffect + useEffect(() => { + let headerTimeout = null; + + switch(timerState){ + case 0: + headerTimeout = setTimeout(() => { + setHeaderColor(styles.yellow); + setHeaderText('Set'); + setTimerState(1); + }, 1000); + break; + case 1: + headerTimeout = setTimeout(() => { + setHeaderColor(styles.red); + setHeaderTextColor(styles.lightText); + setHeaderText('Go!'); + setTimerState(2); + }, 1000); + break; + case 2: + headerTimeout = setTimeout(() => { + setHeaderColor(styles.dark); + startTime.current = (Date.now()); + setHeaderText(0 + ' s'); + setTimerState(3); + }, 1000); + break; + case 3: + headerTimeout = setInterval(() => { + let elapsed = Math.round((Date.now() - startTime.current) / (1000)); + setHeaderText(elapsed + ' s'); + }, 1000); + break; + default: + break; + } + + localTimer.current = (headerTimeout); + + return () => { + clearTimeout(localTimer.current); + clearInterval(localTimer.current); + } + }, [timerState]); function generateSquare(){ return ( @@ -63,7 +109,7 @@ function Game(props){ } function renderPairs(){ - return squareChallenge.map((pair, index) => { + return squareChallenge.current.map((pair, index) => { return generatePair(pair.squarePos, pair.shapeType, index); }); } @@ -76,7 +122,8 @@ function Game(props){ - {renderPairs()} + + {squareMemo} ); -- 2.20.1 From 0aee69d9aa709678ef8cca4961e8749da1977a83 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 22:52:19 -0500 Subject: [PATCH 056/128] rename slider --- squarenotsquare/src/components/Slider.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/components/Slider.js b/squarenotsquare/src/components/Slider.js index a0ecbe4..bc95f15 100644 --- a/squarenotsquare/src/components/Slider.js +++ b/squarenotsquare/src/components/Slider.js @@ -2,7 +2,7 @@ import React from "react"; import { Animated, Easing} from "react-native"; import { useEffect, useState } from "react"; -function LeftToRight(props){ +function Slider(props){ const [xPosition, setXPosition] = useState(new Animated.Value(props.origin)); useEffect(() => { @@ -24,4 +24,4 @@ function LeftToRight(props){ ) } -export default LeftToRight; \ No newline at end of file +export default Slider; \ No newline at end of file -- 2.20.1 From 2aea828b9ce89eb6368e9e8bc27e0f58ae2c4eaa Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 23:36:06 -0500 Subject: [PATCH 057/128] autoscroller --- squarenotsquare/src/components/Autoscroll.js | 25 ++++++++++++++ squarenotsquare/src/screens/Game.js | 35 ++++++++++++++++---- squarenotsquare/src/themes/Metrics.js | 5 ++- 3 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 squarenotsquare/src/components/Autoscroll.js diff --git a/squarenotsquare/src/components/Autoscroll.js b/squarenotsquare/src/components/Autoscroll.js new file mode 100644 index 0000000..7652d02 --- /dev/null +++ b/squarenotsquare/src/components/Autoscroll.js @@ -0,0 +1,25 @@ +import React from "react"; +import { Animated, Easing} from "react-native"; +import { useEffect, useRef } from "react"; +import Metrics from "../themes/Metrics"; + +function Autoscroll(props){ + const yPosition = useRef(new Animated.Value(props.origin)); + + useEffect(() => { + Animated.timing(yPosition.current, { + toValue: props.destination - Metrics.animated.gameScrollInterval, + duration: props.duration, + useNativeDriver: true + }).start(); + }, [props.origin]) + + + return ( + + {props.children} + + ) +} + +export default Autoscroll; \ No newline at end of file diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index 63f9426..ab7f9c2 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -5,6 +5,7 @@ import { useState, useEffect, useRef, useMemo } from "react"; import {genSquareChallenge} from '../libs/Random'; import {shapes} from '../libs/ShapeEnum'; import { styles } from "./styles/AppStyles"; +import Autoscroll from "../components/Autoscroll"; import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; import Icons from '../themes/Icons'; import Colors from "../themes/Colors"; @@ -17,6 +18,8 @@ function Game(props){ const [timerState, setTimerState] = useState(0); const localTimer = useRef(null); const startTime = useRef(0); + const [scrollOrigin, setScrollOrigin] = useState(0); + const scrollDestination = useRef(Metrics.animated.gameScrollInterval); const [headerText, setHeaderText] = useState('Ready?'); const [headerColor, setHeaderColor] = useState(styles.green); const [headerTextColor, setHeaderTextColor] = useState(styles.darkText); @@ -66,9 +69,20 @@ function Game(props){ } }, [timerState]); + function scroll(){ + let newOrigin = scrollDestination.current; + let newDestination = scrollDestination.current - Metrics.animated.gameScrollInterval; + + scrollDestination.current = newDestination; + setScrollOrigin(newOrigin); + } + function generateSquare(){ return ( - + + - - - {squareMemo} - + + + + {squareMemo} + + ); } diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index f12b1e1..a5dd8e8 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -61,7 +61,10 @@ class AppMetrics { } this.animated = { - gameScrollInterval: (this.answerButtonHeight + (this.buttonMargin * 2)) + gameScrollInterval: ( + this.buttons.answerButton.height + + (this.margins.buttonMargin * 2) + ) } this.borders = { -- 2.20.1 From 3bec8706ffa0c6fef3a4bd86c64bb7d109cfc613 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 07:40:23 -0500 Subject: [PATCH 058/128] unused import --- squarenotsquare/src/screens/Game.js | 1 - 1 file changed, 1 deletion(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index ab7f9c2..81c25e7 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -1,6 +1,5 @@ import React from "react"; import { Text, TouchableOpacity, View, SafeAreaView } from "react-native"; -import { ScrollView } from "react-native-gesture-handler"; import { useState, useEffect, useRef, useMemo } from "react"; import {genSquareChallenge} from '../libs/Random'; import {shapes} from '../libs/ShapeEnum'; -- 2.20.1 From 14fa12e9ced4578b84d54ffe98030520ca689f78 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 08:05:43 -0500 Subject: [PATCH 059/128] conditional scrolling --- squarenotsquare/src/screens/Game.js | 32 ++++++++++++++++------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index 81c25e7..8ae9dfb 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -14,6 +14,7 @@ function Game(props){ const squareChallenge = useRef(genSquareChallenge()); const squareMemo = useMemo(renderPairs, [squareChallenge]); + const challengeState = useRef(0); const [timerState, setTimerState] = useState(0); const localTimer = useRef(null); const startTime = useRef(0); @@ -68,18 +69,21 @@ function Game(props){ } }, [timerState]); - function scroll(){ - let newOrigin = scrollDestination.current; - let newDestination = scrollDestination.current - Metrics.animated.gameScrollInterval; - - scrollDestination.current = newDestination; - setScrollOrigin(newOrigin); + function scroll(pairIndex){ + if (pairIndex === challengeState.current){ + let newOrigin = scrollDestination.current; + let newDestination = scrollDestination.current - Metrics.animated.gameScrollInterval; + + scrollDestination.current = newDestination; + challengeState.current = challengeState.current + 1; + setScrollOrigin(newOrigin); + } } - function generateSquare(){ + function generateSquare(pairIndex){ return ( scroll(pairIndex)} style={[styles.darkGreen, styles.answerButton, styles.dropShadow, styles.centeredItems, styles.centeredJustify]} > scroll(pairIndex)} style={[styles.darkGreen, styles.answerButton, styles.dropShadow, styles.centeredItems, styles.centeredJustify]} > - {generateSquare()} - {generateShape(shapeIndex)} + {generateSquare(pairIndex)} + {generateShape(shapeIndex, pairIndex)} ); } else { return ( - {generateShape(shapeIndex)} - {generateSquare()} + {generateShape(shapeIndex, pairIndex)} + {generateSquare(pairIndex)} ); } -- 2.20.1 From aa6db16a256a5f24e45c4d92f11fcdf658460048 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 09:55:46 -0500 Subject: [PATCH 060/128] faded square buttons --- squarenotsquare/src/screens/Game.js | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index 8ae9dfb..d8533cb 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -5,6 +5,7 @@ import {genSquareChallenge} from '../libs/Random'; import {shapes} from '../libs/ShapeEnum'; import { styles } from "./styles/AppStyles"; import Autoscroll from "../components/Autoscroll"; +import Fade from "../components/Fade"; import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; import Icons from '../themes/Icons'; import Colors from "../themes/Colors"; @@ -13,8 +14,8 @@ import Metrics from "../themes/Metrics"; function Game(props){ const squareChallenge = useRef(genSquareChallenge()); - const squareMemo = useMemo(renderPairs, [squareChallenge]); const challengeState = useRef(0); + const squareMemo = useMemo(renderPairs, [challengeState.current]); const [timerState, setTimerState] = useState(0); const localTimer = useRef(null); const startTime = useRef(0); @@ -113,17 +114,21 @@ function Game(props){ function generatePair(answer, shapeIndex, pairIndex) { if (answer === 0) { return ( - - {generateSquare(pairIndex)} - {generateShape(shapeIndex, pairIndex)} - + + + {generateSquare(pairIndex)} + {generateShape(shapeIndex, pairIndex)} + + ); } else { return ( - - {generateShape(shapeIndex, pairIndex)} - {generateSquare(pairIndex)} - + + + {generateShape(shapeIndex, pairIndex)} + {generateSquare(pairIndex)} + + ); } } -- 2.20.1 From 7e3ba477c1a158dee38e6fa2225fb9124561f778 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 09:55:51 -0500 Subject: [PATCH 061/128] fade component --- squarenotsquare/src/components/Fade.js | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 squarenotsquare/src/components/Fade.js diff --git a/squarenotsquare/src/components/Fade.js b/squarenotsquare/src/components/Fade.js new file mode 100644 index 0000000..250a78f --- /dev/null +++ b/squarenotsquare/src/components/Fade.js @@ -0,0 +1,39 @@ +import React from "react"; +import { Animated} from "react-native"; +import { useEffect, useRef } from "react"; + +function Fade(props){ + const faded = useRef(new Animated.Value(0.25)); + const opaque = useRef(new Animated.Value(1)); + + useEffect(() => { + if (props.faded) { + Animated.timing( + opaque.current, + { + toValue: 0.25, + duration: props.duration, + useNativeDriver: true + } + ).start(); + } else { + Animated.timing( + faded.current, + { + toValue: 1, + duration: props.duration, + useNativeDriver: true + } + ).start(); + } + }, [props.faded]) + + + return ( + + {props.children} + + ) +} + +export default Fade; \ No newline at end of file -- 2.20.1 From 976a5b69bacbf599107d1204246da210d2f8f7f6 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 09:58:29 -0500 Subject: [PATCH 062/128] default state --- squarenotsquare/src/components/Fade.js | 2 +- squarenotsquare/src/screens/Game.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/components/Fade.js b/squarenotsquare/src/components/Fade.js index 250a78f..06fcde9 100644 --- a/squarenotsquare/src/components/Fade.js +++ b/squarenotsquare/src/components/Fade.js @@ -3,7 +3,7 @@ import { Animated} from "react-native"; import { useEffect, useRef } from "react"; function Fade(props){ - const faded = useRef(new Animated.Value(0.25)); + const faded = useRef(new Animated.Value(0.1)); const opaque = useRef(new Animated.Value(1)); useEffect(() => { diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index d8533cb..bd8de74 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -14,7 +14,7 @@ import Metrics from "../themes/Metrics"; function Game(props){ const squareChallenge = useRef(genSquareChallenge()); - const challengeState = useRef(0); + const challengeState = useRef(-1); const squareMemo = useMemo(renderPairs, [challengeState.current]); const [timerState, setTimerState] = useState(0); const localTimer = useRef(null); @@ -41,6 +41,7 @@ function Game(props){ setHeaderColor(styles.red); setHeaderTextColor(styles.lightText); setHeaderText('Go!'); + challengeState.current = 0; setTimerState(2); }, 1000); break; -- 2.20.1 From 0ed28e7c09c4d0a643dc8d188938cb3a03183c53 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 10:41:02 -0500 Subject: [PATCH 063/128] stop game after completed --- squarenotsquare/src/screens/Game.js | 21 ++++++++++++++++++- .../src/screens/styles/AppStyles.js | 2 +- squarenotsquare/src/themes/Icons.js | 3 ++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index bd8de74..6ffe40d 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -79,9 +79,18 @@ function Game(props){ scrollDestination.current = newDestination; challengeState.current = challengeState.current + 1; setScrollOrigin(newOrigin); + + if (challengeState.current >= 20) { + completeChallenge(); + } } } + function completeChallenge(){ + clearInterval(localTimer.current); + setTimerState(4); + } + function generateSquare(pairIndex){ return ( - + {squareMemo} + + + + Finish + + diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index 3ae74b4..aeac431 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -80,7 +80,7 @@ export const styles = StyleSheet.create({ }, smallMargin: {margin: Metrics.margins.default}, - gameStart: {margin: Metrics.margins.gameStartMargin}, + gameView: {margin: Metrics.margins.gameStartMargin}, buttonMargin: { marginBottom: Metrics.margins.buttonMargin, marginTop: Metrics.margins.buttonMargin diff --git a/squarenotsquare/src/themes/Icons.js b/squarenotsquare/src/themes/Icons.js index 9f67027..91ddd10 100644 --- a/squarenotsquare/src/themes/Icons.js +++ b/squarenotsquare/src/themes/Icons.js @@ -3,7 +3,8 @@ class AppIcons { square: 'square', settings: 'cog-outline', toggleOn: 'toggle-switch-on', - toggleOfff: 'toggle-switch-off', + toggleOff: 'toggle-switch-off', + check: 'check' }; wrongShapes = { -- 2.20.1 From be57e47866aa356785d3734f472a620ae2d381cb Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 10:43:55 -0500 Subject: [PATCH 064/128] header style on finish --- squarenotsquare/src/screens/Game.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index 6ffe40d..8099f3f 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -88,6 +88,8 @@ function Game(props){ function completeChallenge(){ clearInterval(localTimer.current); + setHeaderColor(styles.darkGreen); + setHeaderText((Date.now() - startTime.current) / (1000) + ' s'); setTimerState(4); } -- 2.20.1 From cf130e6fbc40c541fe8bd32576038e313660ab40 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 12:47:26 -0500 Subject: [PATCH 065/128] scoring --- squarenotsquare/src/screens/Game.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index 8099f3f..f605b9e 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -19,6 +19,7 @@ function Game(props){ const [timerState, setTimerState] = useState(0); const localTimer = useRef(null); const startTime = useRef(0); + const score = useRef(0); const [scrollOrigin, setScrollOrigin] = useState(0); const scrollDestination = useRef(Metrics.animated.gameScrollInterval); const [headerText, setHeaderText] = useState('Ready?'); @@ -71,8 +72,14 @@ function Game(props){ } }, [timerState]); - function scroll(pairIndex){ + + + function selectAnswer(pairIndex, correct){ if (pairIndex === challengeState.current){ + if (correct) { + score.current = score.current + 1; + } + let newOrigin = scrollDestination.current; let newDestination = scrollDestination.current - Metrics.animated.gameScrollInterval; @@ -96,7 +103,7 @@ function Game(props){ function generateSquare(pairIndex){ return ( scroll(pairIndex)} + onPress={() => selectAnswer(pairIndex, true)} style={[styles.darkGreen, styles.answerButton, styles.dropShadow, styles.centeredItems, styles.centeredJustify]} > scroll(pairIndex)} + onPress={() => selectAnswer(pairIndex, false)} style={[styles.darkGreen, styles.answerButton, styles.dropShadow, styles.centeredItems, styles.centeredJustify]} > + + + {score.current + ' / ' + squareChallenge.current.length} + + ); } -- 2.20.1 From 55cbed09a945e31d3752e7a2c9c6ae557dc63248 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:50:08 -0500 Subject: [PATCH 066/128] remove nav reducer --- squarenotsquare/src/redux/reducers/NavReducer.js | 15 --------------- squarenotsquare/src/redux/reducers/RootReducer.js | 4 ++-- 2 files changed, 2 insertions(+), 17 deletions(-) delete mode 100644 squarenotsquare/src/redux/reducers/NavReducer.js diff --git a/squarenotsquare/src/redux/reducers/NavReducer.js b/squarenotsquare/src/redux/reducers/NavReducer.js deleted file mode 100644 index 16f162a..0000000 --- a/squarenotsquare/src/redux/reducers/NavReducer.js +++ /dev/null @@ -1,15 +0,0 @@ -import * as SquareNav from '../../navigation/SquareNav'; - -import { APP_INIT } from '../types/SystemTypes'; - -export function navReducer(state = {}, action){ - switch (action.type) { - case APP_INIT: - //SquareNav.navigate('Home'); - break; - default: - break; - } - - return state; -} \ No newline at end of file diff --git a/squarenotsquare/src/redux/reducers/RootReducer.js b/squarenotsquare/src/redux/reducers/RootReducer.js index 8b54e1f..af7f207 100644 --- a/squarenotsquare/src/redux/reducers/RootReducer.js +++ b/squarenotsquare/src/redux/reducers/RootReducer.js @@ -1,10 +1,10 @@ import { combineReducers } from 'redux'; import { systemReducer } from './SystemReducer'; -import { navReducer } from './NavReducer'; +import { userReducer } from './UserReducer'; const rootReducer = combineReducers({ ...systemReducer, - navReducer + ...userReducer }); export default rootReducer; \ No newline at end of file -- 2.20.1 From e472a6737d20660bab6135739bca75a6c495151c Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:50:15 -0500 Subject: [PATCH 067/128] add score screen --- squarenotsquare/src/navigation/SquareStack.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/squarenotsquare/src/navigation/SquareStack.js b/squarenotsquare/src/navigation/SquareStack.js index 0152129..5eee0cb 100644 --- a/squarenotsquare/src/navigation/SquareStack.js +++ b/squarenotsquare/src/navigation/SquareStack.js @@ -8,6 +8,7 @@ import Game from '../screens/Game'; import HighScore from '../screens/HighScore'; import Settings from '../screens/Settings'; import Splash from '../screens/Splash'; +import Score from '../screens/Score'; const SquareNav = createStackNavigator(); @@ -42,6 +43,11 @@ function SquareStack() { component={Game} options={noHeader} /> + ) -- 2.20.1 From 80f15d61ed9a118e538d31fccebddf45bf19f783 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:50:21 -0500 Subject: [PATCH 068/128] score component --- squarenotsquare/src/screens/Score.js | 80 ++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 squarenotsquare/src/screens/Score.js diff --git a/squarenotsquare/src/screens/Score.js b/squarenotsquare/src/screens/Score.js new file mode 100644 index 0000000..2ed3d13 --- /dev/null +++ b/squarenotsquare/src/screens/Score.js @@ -0,0 +1,80 @@ +import React, { useEffect } from "react"; +import { BackHandler, SafeAreaView, Text, TouchableOpacity, View } from "react-native"; +import { styles } from './styles/AppStyles'; +import Slider from "../components/Slider"; +import { useDispatch } from "react-redux"; +import {goHome, goToScores} from '../redux/actions/SystemActions'; + +function Score(){ + const dispatch = useDispatch(); + + useEffect(() => { + BackHandler.addEventListener('hardwareBackPress', () => {return true}); + }, []) + + function onPressMainMenu(){ + dispatch(goHome()); + } + + function onPressHighScores(){ + dispatch(goToScores()); + } + + const now = new Date(Date.now()); + + return ( + + + + + TIME + + + {'(60 - 9.500) X 1000 = 50500'} + + + + + ANSWERS + + + {'20 X 1000 = 20000'} + + + + + + TOTAL + + + {'70500'} + + + + + + + + Main Menu + + + + + + + High Scores + + + + + + ) +} + +export default Score; \ No newline at end of file -- 2.20.1 From cab42670755334ea8035a38bdf8bee8d3d592369 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:50:28 -0500 Subject: [PATCH 069/128] game screen navigation --- squarenotsquare/src/screens/Game.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index f605b9e..c584b75 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -1,9 +1,11 @@ import React from "react"; import { Text, TouchableOpacity, View, SafeAreaView } from "react-native"; import { useState, useEffect, useRef, useMemo } from "react"; +import { useDispatch } from "react-redux"; import {genSquareChallenge} from '../libs/Random'; import {shapes} from '../libs/ShapeEnum'; import { styles } from "./styles/AppStyles"; +import { squareFinished } from "../redux/actions/UserActions"; import Autoscroll from "../components/Autoscroll"; import Fade from "../components/Fade"; import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; @@ -25,6 +27,7 @@ function Game(props){ const [headerText, setHeaderText] = useState('Ready?'); const [headerColor, setHeaderColor] = useState(styles.green); const [headerTextColor, setHeaderTextColor] = useState(styles.darkText); + const dispatch = useDispatch(); useEffect(() => { let headerTimeout = null; @@ -64,7 +67,7 @@ function Game(props){ break; } - localTimer.current = (headerTimeout); + localTimer.current = headerTimeout; return () => { clearTimeout(localTimer.current); @@ -98,6 +101,9 @@ function Game(props){ setHeaderColor(styles.darkGreen); setHeaderText((Date.now() - startTime.current) / (1000) + ' s'); setTimerState(4); + setTimeout(() => { + dispatch(squareFinished(score.current)); + }, 3000); } function generateSquare(pairIndex){ -- 2.20.1 From e716506f75dfde84fd1b7fd604c6cb9d173e00e2 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:50:34 -0500 Subject: [PATCH 070/128] user types --- squarenotsquare/src/redux/types/UserTypes.js | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 squarenotsquare/src/redux/types/UserTypes.js diff --git a/squarenotsquare/src/redux/types/UserTypes.js b/squarenotsquare/src/redux/types/UserTypes.js new file mode 100644 index 0000000..1f20595 --- /dev/null +++ b/squarenotsquare/src/redux/types/UserTypes.js @@ -0,0 +1,2 @@ +export const SQUARE_START = 'square-start'; +export const SQUARE_FINISHED = 'square-finished'; \ No newline at end of file -- 2.20.1 From b3e9720d33dd021889dcb56178d97487f592591a Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:50:39 -0500 Subject: [PATCH 071/128] system nav types --- squarenotsquare/src/redux/types/SystemTypes.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/redux/types/SystemTypes.js b/squarenotsquare/src/redux/types/SystemTypes.js index 6f34657..0669679 100644 --- a/squarenotsquare/src/redux/types/SystemTypes.js +++ b/squarenotsquare/src/redux/types/SystemTypes.js @@ -1,2 +1,3 @@ export const APP_INIT = 'app-init'; -export const SQUARE_START = 'square-start'; \ No newline at end of file +export const NAV_HOME = 'go-home'; +export const NAV_SCORES = 'nav-scores'; \ No newline at end of file -- 2.20.1 From c636951f67755d0f0facef286edc2d5c78bd8ce6 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:50:48 -0500 Subject: [PATCH 072/128] user reducer --- .../src/redux/reducers/UserReducer.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/squarenotsquare/src/redux/reducers/UserReducer.js b/squarenotsquare/src/redux/reducers/UserReducer.js index e69de29..5b79559 100644 --- a/squarenotsquare/src/redux/reducers/UserReducer.js +++ b/squarenotsquare/src/redux/reducers/UserReducer.js @@ -0,0 +1,19 @@ +import { APP_INIT } from "../types/SystemTypes"; +import { + SQUARE_START, + SQUARE_FINISHED +} from '../types/UserTypes'; + +function usr(state = {}, action) { + switch (action.type) { + case SQUARE_START: + case SQUARE_FINISHED: + return {...state, ...action.user}; + default: + return state; + } +} + +export const userReducer = { + user: usr +}; \ No newline at end of file -- 2.20.1 From 70062398051d453e7a42e1859f00cf57d96c6377 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:50:59 -0500 Subject: [PATCH 073/128] change import source --- squarenotsquare/src/redux/reducers/SystemReducer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/squarenotsquare/src/redux/reducers/SystemReducer.js b/squarenotsquare/src/redux/reducers/SystemReducer.js index 013edc1..a69d614 100644 --- a/squarenotsquare/src/redux/reducers/SystemReducer.js +++ b/squarenotsquare/src/redux/reducers/SystemReducer.js @@ -1,4 +1,4 @@ -import { APP_INIT } from "../types/SystemTypes"; +import { APP_INIT } from "../types/UserTypes"; function sys(state = {}, action) { switch (action.type) { -- 2.20.1 From 900ee7f4d6817f42ac2bbbfe4da5cacdb1a6740f Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:51:08 -0500 Subject: [PATCH 074/128] add square finished action creator --- squarenotsquare/src/redux/actions/UserActions.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/redux/actions/UserActions.js b/squarenotsquare/src/redux/actions/UserActions.js index afb8299..920fd4f 100644 --- a/squarenotsquare/src/redux/actions/UserActions.js +++ b/squarenotsquare/src/redux/actions/UserActions.js @@ -1,5 +1,5 @@ import { squareNav } from "../../navigation/SquareNav"; -import { SQUARE_START } from "../types/SystemTypes"; +import { SQUARE_FINISHED, SQUARE_START } from "../types/UserTypes"; export function squareStartPressed() { return (dispatch) => { @@ -8,4 +8,13 @@ export function squareStartPressed() { type: SQUARE_START }); } +} + +export function squareFinished(score) { + return (dispatch) => { + squareNav('Score'); + dispatch({ + type: SQUARE_FINISHED + }); + } } \ No newline at end of file -- 2.20.1 From d6f81b7ab283c34c85fa0425d765a7f5feb1f848 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:51:17 -0500 Subject: [PATCH 075/128] home and score action creators --- .../src/redux/actions/SystemActions.js | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/squarenotsquare/src/redux/actions/SystemActions.js b/squarenotsquare/src/redux/actions/SystemActions.js index 6a00bb0..557ba64 100644 --- a/squarenotsquare/src/redux/actions/SystemActions.js +++ b/squarenotsquare/src/redux/actions/SystemActions.js @@ -1,5 +1,5 @@ import DbAPI from "../../realm/DbAPI"; -import { APP_INIT } from "../types/SystemTypes"; +import { APP_INIT, NAV_HOME, NAV_SCORES } from "../types/SystemTypes"; import { squareNav } from "../../navigation/SquareNav"; export function appInit() { @@ -10,13 +10,29 @@ export function appInit() { } } +export function goHome() { + return (dispatch) => { + squareNav('Home'); + dispatch({ + type: NAV_HOME + }) + } +} + +export function goToScores() { + return (dispatch) => { + squareNav('HighScores'); + dispatch({ + NAV_SCORES + }) + } +} + function onInit() { return (dispatch) => { dispatch({ type: APP_INIT //system: system - //user: user - //score: score }); } } \ No newline at end of file -- 2.20.1 From fda3390cd29b786f97a25a6d74f78a3b4d8a5440 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:57:27 -0500 Subject: [PATCH 076/128] initial user state --- squarenotsquare/src/redux/reducers/UserReducer.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/redux/reducers/UserReducer.js b/squarenotsquare/src/redux/reducers/UserReducer.js index 5b79559..4346c1a 100644 --- a/squarenotsquare/src/redux/reducers/UserReducer.js +++ b/squarenotsquare/src/redux/reducers/UserReducer.js @@ -4,7 +4,12 @@ import { SQUARE_FINISHED } from '../types/UserTypes'; -function usr(state = {}, action) { +const initialUserState = { + lastGameTime: null, + lastGameScore: null +} + +function usr(state = initialUserState, action) { switch (action.type) { case SQUARE_START: case SQUARE_FINISHED: -- 2.20.1 From 335b75f1f0117f56e4cc44b61c5354e0ec6199f8 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:57:34 -0500 Subject: [PATCH 077/128] pass game outcome --- squarenotsquare/src/screens/Game.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index c584b75..cac52ab 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -97,12 +97,13 @@ function Game(props){ } function completeChallenge(){ + let finalTime = (Date.now() - startTime.current) / (1000); clearInterval(localTimer.current); setHeaderColor(styles.darkGreen); - setHeaderText((Date.now() - startTime.current) / (1000) + ' s'); + setHeaderText(finalTime + ' s'); setTimerState(4); setTimeout(() => { - dispatch(squareFinished(score.current)); + dispatch(squareFinished(score.current, finalTime)); }, 3000); } -- 2.20.1 From 955dc17abccf6d1b352e159c3c6a775ae4506817 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 13:57:42 -0500 Subject: [PATCH 078/128] updated user state --- squarenotsquare/src/redux/actions/UserActions.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/redux/actions/UserActions.js b/squarenotsquare/src/redux/actions/UserActions.js index 920fd4f..7bd1930 100644 --- a/squarenotsquare/src/redux/actions/UserActions.js +++ b/squarenotsquare/src/redux/actions/UserActions.js @@ -10,9 +10,12 @@ export function squareStartPressed() { } } -export function squareFinished(score) { - return (dispatch) => { +export function squareFinished(score, finalTime) { + return (dispatch, getState) => { squareNav('Score'); + let newUser = getState().user; + newUser.lastGameTime = finalTime; + newUser.lastGameScore = score; dispatch({ type: SQUARE_FINISHED }); -- 2.20.1 From 6bd822948be9faf8120b186748342187dea7d901 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 14:32:02 -0500 Subject: [PATCH 079/128] score component values --- squarenotsquare/src/screens/Score.js | 43 ++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/squarenotsquare/src/screens/Score.js b/squarenotsquare/src/screens/Score.js index 2ed3d13..72f2bf3 100644 --- a/squarenotsquare/src/screens/Score.js +++ b/squarenotsquare/src/screens/Score.js @@ -1,17 +1,50 @@ -import React, { useEffect } from "react"; +import React, { useEffect, useRef } from "react"; +import { useSelector } from "react-redux"; import { BackHandler, SafeAreaView, Text, TouchableOpacity, View } from "react-native"; import { styles } from './styles/AppStyles'; import Slider from "../components/Slider"; import { useDispatch } from "react-redux"; import {goHome, goToScores} from '../redux/actions/SystemActions'; -function Score(){ +function Score(props){ const dispatch = useDispatch(); + const userRedux = useSelector((state) => state.user); + const timerScore = useRef(calculateTimerScore()); + const answerScore = useRef(calculateAnswerScore()); + const finalScore = useRef(calculateFinalScore(timerScore.current, answerScore.current)); + useEffect(() => { BackHandler.addEventListener('hardwareBackPress', () => {return true}); }, []) + function calculateTimerScore(user = userRedux){ + if (user !== null){ + let score = (60 - user.lastGameTime); + if (score < 0) { + return 0; + } else { + return score; + } + } else { + return 0; + } + } + + function calculateAnswerScore(user = userRedux) { + if (user !== null) { + let score = (user.lastGameAnswers * 1000); + return score; + } else { + return 0; + } + } + + function calculateFinalScore(timerScore, answerScore) { + let score = timerScore + answerScore; + return score; + } + function onPressMainMenu(){ dispatch(goHome()); } @@ -30,7 +63,7 @@ function Score(){ TIME - {'(60 - 9.500) X 1000 = 50500'} + {'(60 - ' + userRedux.lastGameTime + ') X 1000 = ' + timerScore.current} @@ -38,7 +71,7 @@ function Score(){ ANSWERS - {'20 X 1000 = 20000'} + {'('+ userRedux.lastGameAnswers + ') X 1000 = ' + answerScore.current} @@ -47,7 +80,7 @@ function Score(){ TOTAL - {'70500'} + {finalScore.current} -- 2.20.1 From 31234ed027900e6b69ae4bf8b35cc23ffdda6524 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 14:32:13 -0500 Subject: [PATCH 080/128] rename game ref --- squarenotsquare/src/screens/Game.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index cac52ab..ab44a1d 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -21,7 +21,7 @@ function Game(props){ const [timerState, setTimerState] = useState(0); const localTimer = useRef(null); const startTime = useRef(0); - const score = useRef(0); + const answers = useRef(0); const [scrollOrigin, setScrollOrigin] = useState(0); const scrollDestination = useRef(Metrics.animated.gameScrollInterval); const [headerText, setHeaderText] = useState('Ready?'); @@ -80,7 +80,7 @@ function Game(props){ function selectAnswer(pairIndex, correct){ if (pairIndex === challengeState.current){ if (correct) { - score.current = score.current + 1; + answers.current = answers.current + 1; } let newOrigin = scrollDestination.current; @@ -102,9 +102,7 @@ function Game(props){ setHeaderColor(styles.darkGreen); setHeaderText(finalTime + ' s'); setTimerState(4); - setTimeout(() => { - dispatch(squareFinished(score.current, finalTime)); - }, 3000); + dispatch(squareFinished(answers.current, finalTime)); } function generateSquare(pairIndex){ @@ -194,7 +192,7 @@ function Game(props){ - {score.current + ' / ' + squareChallenge.current.length} + {answers.current + ' / ' + squareChallenge.current.length} -- 2.20.1 From 22999bb6dc03221dc110da8bba9ce4483ba5de07 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 14:32:47 -0500 Subject: [PATCH 081/128] syntax --- squarenotsquare/src/redux/actions/SystemActions.js | 2 +- squarenotsquare/src/redux/reducers/UserReducer.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/redux/actions/SystemActions.js b/squarenotsquare/src/redux/actions/SystemActions.js index 557ba64..4cc5387 100644 --- a/squarenotsquare/src/redux/actions/SystemActions.js +++ b/squarenotsquare/src/redux/actions/SystemActions.js @@ -23,7 +23,7 @@ export function goToScores() { return (dispatch) => { squareNav('HighScores'); dispatch({ - NAV_SCORES + type: NAV_SCORES }) } } diff --git a/squarenotsquare/src/redux/reducers/UserReducer.js b/squarenotsquare/src/redux/reducers/UserReducer.js index 4346c1a..4b40b7a 100644 --- a/squarenotsquare/src/redux/reducers/UserReducer.js +++ b/squarenotsquare/src/redux/reducers/UserReducer.js @@ -6,6 +6,7 @@ import { const initialUserState = { lastGameTime: null, + lastGameAnswers: null, lastGameScore: null } -- 2.20.1 From ca93360971096f72e2b67f084fa34f4781c4851d Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 14:32:58 -0500 Subject: [PATCH 082/128] shallow copy redux state --- squarenotsquare/src/redux/actions/UserActions.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/squarenotsquare/src/redux/actions/UserActions.js b/squarenotsquare/src/redux/actions/UserActions.js index 7bd1930..d64eadf 100644 --- a/squarenotsquare/src/redux/actions/UserActions.js +++ b/squarenotsquare/src/redux/actions/UserActions.js @@ -10,14 +10,16 @@ export function squareStartPressed() { } } -export function squareFinished(score, finalTime) { +export function squareFinished(answers, finalTime) { return (dispatch, getState) => { - squareNav('Score'); - let newUser = getState().user; + setTimeout(() => squareNav('Score'), 3000); + const userState = getState().user; + let newUser = {...userState}; newUser.lastGameTime = finalTime; - newUser.lastGameScore = score; + newUser.lastGameAnswers = answers; dispatch({ - type: SQUARE_FINISHED + type: SQUARE_FINISHED, + user: newUser }); } } \ No newline at end of file -- 2.20.1 From 7f64752f83ee686a301ee8f69a6f514eb2f285a3 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 14:34:50 -0500 Subject: [PATCH 083/128] high score nav name --- squarenotsquare/src/redux/actions/SystemActions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/squarenotsquare/src/redux/actions/SystemActions.js b/squarenotsquare/src/redux/actions/SystemActions.js index 4cc5387..0ce28d6 100644 --- a/squarenotsquare/src/redux/actions/SystemActions.js +++ b/squarenotsquare/src/redux/actions/SystemActions.js @@ -21,7 +21,7 @@ export function goHome() { export function goToScores() { return (dispatch) => { - squareNav('HighScores'); + squareNav('HighScore'); dispatch({ type: NAV_SCORES }) -- 2.20.1 From 3c6a93848150682d2de9f15578ded09a560a99d1 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 14:39:30 -0500 Subject: [PATCH 084/128] rounding --- squarenotsquare/src/screens/Game.js | 3 ++- squarenotsquare/src/screens/Score.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index ab44a1d..fb11017 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -97,7 +97,8 @@ function Game(props){ } function completeChallenge(){ - let finalTime = (Date.now() - startTime.current) / (1000); + let unformatted = (Date.now() - startTime.current) / (1000); + let finalTime = Number.parseFloat(unformatted).toFixed(3); clearInterval(localTimer.current); setHeaderColor(styles.darkGreen); setHeaderText(finalTime + ' s'); diff --git a/squarenotsquare/src/screens/Score.js b/squarenotsquare/src/screens/Score.js index 72f2bf3..93d2862 100644 --- a/squarenotsquare/src/screens/Score.js +++ b/squarenotsquare/src/screens/Score.js @@ -20,7 +20,7 @@ function Score(props){ function calculateTimerScore(user = userRedux){ if (user !== null){ - let score = (60 - user.lastGameTime); + let score = (60 - user.lastGameTime) * 1000; if (score < 0) { return 0; } else { -- 2.20.1 From 9895a5e444ee8b190805696849b233b0ea9b4f04 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 14:41:44 -0500 Subject: [PATCH 085/128] keys --- squarenotsquare/src/screens/Game.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index fb11017..865e34d 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -139,8 +139,8 @@ function Game(props){ function generatePair(answer, shapeIndex, pairIndex) { if (answer === 0) { return ( - - + + {generateSquare(pairIndex)} {generateShape(shapeIndex, pairIndex)} @@ -148,8 +148,8 @@ function Game(props){ ); } else { return ( - - + + {generateShape(shapeIndex, pairIndex)} {generateSquare(pairIndex)} -- 2.20.1 From 2b6b18d53ec04cb93a7c7fc53f70a4c06852704c Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 15:05:12 -0500 Subject: [PATCH 086/128] High score placeholder --- squarenotsquare/src/screens/HighScore.js | 46 +++++++++++++++++++----- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/squarenotsquare/src/screens/HighScore.js b/squarenotsquare/src/screens/HighScore.js index 4ec3a80..c251e56 100644 --- a/squarenotsquare/src/screens/HighScore.js +++ b/squarenotsquare/src/screens/HighScore.js @@ -1,14 +1,44 @@ -import React from "react"; -import { Text, View } from "react-native"; -import { useState } from "react"; +import React, { useEffect } from "react"; +import { BackHandler, SafeAreaView, Text, TouchableOpacity, View } from "react-native"; +import { styles } from './styles/AppStyles'; +import Slider from "../components/Slider"; +import { useDispatch } from "react-redux"; +import {goHome} from '../redux/actions/SystemActions'; -function HighScore(props){ +function HighScore(){ + const dispatch = useDispatch(); + + useEffect(() => { + BackHandler.addEventListener('hardwareBackPress', () => {return true}); + }, []) + + function onPressMainMenu(){ + dispatch(goHome()); + } + + const now = new Date(Date.now()); return ( - - test - - ); + + + + Not Implemented + + + + + + + Main Menu + + + + + + ) } export default HighScore; \ No newline at end of file -- 2.20.1 From 4af2ed65fa1b85c53afcf52a6a15acab2c26b6f6 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 16:56:10 -0500 Subject: [PATCH 087/128] connect highscores button --- squarenotsquare/src/screens/Home.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 684dcad..512ef1d 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -8,6 +8,7 @@ import Metrics from "../themes/Metrics"; import Slider from "../components/Slider"; import { useDispatch } from "react-redux"; import {squareStartPressed} from '../redux/actions/UserActions'; +import { goToScores } from "../redux/actions/SystemActions"; function Home(){ const dispatch = useDispatch(); @@ -20,6 +21,10 @@ function Home(){ dispatch(squareStartPressed()); } + function onPressHighScores(){ + dispatch(goToScores()); + } + const now = new Date(Date.now()); return ( @@ -54,7 +59,10 @@ function Home(){ - + High Scores -- 2.20.1 From ef8e629ce3e0495236e9d8e476a03cad412c431b Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 17:10:09 -0500 Subject: [PATCH 088/128] system reducer type import --- squarenotsquare/__tests__/Redux-test.js | 6 ------ squarenotsquare/src/redux/reducers/SystemReducer.js | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/squarenotsquare/__tests__/Redux-test.js b/squarenotsquare/__tests__/Redux-test.js index 6a4d7d5..63139ed 100644 --- a/squarenotsquare/__tests__/Redux-test.js +++ b/squarenotsquare/__tests__/Redux-test.js @@ -1,5 +1,4 @@ import configStore from '../src/redux/CreateStore'; -import {navReducer} from '../src/redux/reducers/NavReducer'; import {systemReducer} from '../src/redux/reducers/SystemReducer'; import rootReducer from '../src/redux/reducers/RootReducer'; import { APP_INIT } from '../src/redux/types/SystemTypes'; @@ -13,11 +12,6 @@ test('rootReducer constructs', () => { expect(rootReducer).toEqual(expect.anything()); }) -test('navReducer response to app-init', () => { - let nextState = navReducer({}, {type: APP_INIT}); - expect(nextState).toEqual({}); -}) - test('systemReducer response to app-init', () => { let nextState = systemReducer.system({}, {type: APP_INIT, system: {value: 0}}); expect(nextState.value).toEqual(0); diff --git a/squarenotsquare/src/redux/reducers/SystemReducer.js b/squarenotsquare/src/redux/reducers/SystemReducer.js index a69d614..013edc1 100644 --- a/squarenotsquare/src/redux/reducers/SystemReducer.js +++ b/squarenotsquare/src/redux/reducers/SystemReducer.js @@ -1,4 +1,4 @@ -import { APP_INIT } from "../types/UserTypes"; +import { APP_INIT } from "../types/SystemTypes"; function sys(state = {}, action) { switch (action.type) { -- 2.20.1 From d938a7b62b4b8c9f3c7b53f130cbe0d57abede5d Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 17:25:55 -0500 Subject: [PATCH 089/128] create score object --- squarenotsquare/src/realm/repos/ScoreRepo.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/squarenotsquare/src/realm/repos/ScoreRepo.js b/squarenotsquare/src/realm/repos/ScoreRepo.js index 51c89c7..d1e70d7 100644 --- a/squarenotsquare/src/realm/repos/ScoreRepo.js +++ b/squarenotsquare/src/realm/repos/ScoreRepo.js @@ -8,4 +8,20 @@ export default class ScoreRepo { constructor(db) { this.realmDB = db; } + + createScore = (user, score) => { + let scoreID = uuidv4(); + + this.realmDB.write(() => { + this.realmDB.create( + ScoreEntity.name, + { + id: scoreID, + user: user, + value: score, + }, + true, + ); + }); + }; } \ No newline at end of file -- 2.20.1 From 5a0f9393acfe5d5a8dabfcf091d0e907dc1c7583 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 17:27:48 -0500 Subject: [PATCH 090/128] create score db api call --- squarenotsquare/src/realm/DbAPI.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/squarenotsquare/src/realm/DbAPI.js b/squarenotsquare/src/realm/DbAPI.js index f85a4d0..fc6e746 100644 --- a/squarenotsquare/src/realm/DbAPI.js +++ b/squarenotsquare/src/realm/DbAPI.js @@ -8,21 +8,26 @@ class DatabaseAPI { } getAllSystemValues() { - return systemRepo.getAllSystemValues(); + return this.systemRepo.getAllSystemValues(); } createSystemValue(key, value) { - systemRepo.createSystemValue(key, value); + this.systemRepo.createSystemValue(key, value); return true; } deleteSystemValue(key) { - systemRepo.deleteSystemValue(key); + this.systemRepo.deleteSystemValue(key); return true; } getSystemValue(key) { - return systemRepo.getSystemKeyValue(key); + return this.systemRepo.getSystemKeyValue(key); + } + + createScore(user, score) { + this.scoreRepo.createScore(user, score); + return true; } async initDB() { -- 2.20.1 From d20c7238766aa36ebb3e4d3a29a64721cd61205c Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 17:37:13 -0500 Subject: [PATCH 091/128] score calculator --- squarenotsquare/src/libs/CalculateScore.js | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 squarenotsquare/src/libs/CalculateScore.js diff --git a/squarenotsquare/src/libs/CalculateScore.js b/squarenotsquare/src/libs/CalculateScore.js new file mode 100644 index 0000000..8918179 --- /dev/null +++ b/squarenotsquare/src/libs/CalculateScore.js @@ -0,0 +1,6 @@ +export function calculateSquareScore (answers, finalTime) { + let timeScore = (60 - finalTime) * 1000; + let answerScore = answers * 1000; + let finalScore = timeScore + answerScore; + return finalScore; +} \ No newline at end of file -- 2.20.1 From 182fbd63785785e9ec1f99f2d54ac3c061d16282 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 17:37:19 -0500 Subject: [PATCH 092/128] default username --- squarenotsquare/src/redux/reducers/UserReducer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/squarenotsquare/src/redux/reducers/UserReducer.js b/squarenotsquare/src/redux/reducers/UserReducer.js index 4b40b7a..ae2d033 100644 --- a/squarenotsquare/src/redux/reducers/UserReducer.js +++ b/squarenotsquare/src/redux/reducers/UserReducer.js @@ -7,7 +7,8 @@ import { const initialUserState = { lastGameTime: null, lastGameAnswers: null, - lastGameScore: null + lastGameScore: null, + username: 'noname' } function usr(state = initialUserState, action) { -- 2.20.1 From 9ec386414c21f436d50309b716063f3366a9f8f1 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 17:37:52 -0500 Subject: [PATCH 093/128] commit scores to realm --- squarenotsquare/src/redux/actions/UserActions.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/squarenotsquare/src/redux/actions/UserActions.js b/squarenotsquare/src/redux/actions/UserActions.js index d64eadf..66d0c40 100644 --- a/squarenotsquare/src/redux/actions/UserActions.js +++ b/squarenotsquare/src/redux/actions/UserActions.js @@ -1,5 +1,7 @@ import { squareNav } from "../../navigation/SquareNav"; import { SQUARE_FINISHED, SQUARE_START } from "../types/UserTypes"; +import { calculateSquareScore } from "../../libs/CalculateScore"; +import DbAPI from "../../realm/DbAPI"; export function squareStartPressed() { return (dispatch) => { @@ -17,6 +19,9 @@ export function squareFinished(answers, finalTime) { let newUser = {...userState}; newUser.lastGameTime = finalTime; newUser.lastGameAnswers = answers; + + let finalScore = calculateSquareScore(answers, finalTime); + DbAPI.createScore(userState.username, finalScore); dispatch({ type: SQUARE_FINISHED, user: newUser -- 2.20.1 From bfd2bdad45ac994007b35eacc5c42cdd018b717e Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 17:52:06 -0500 Subject: [PATCH 094/128] load all scores on highscore screen --- squarenotsquare/src/realm/DbAPI.js | 4 ++++ squarenotsquare/src/realm/repos/ScoreRepo.js | 9 +++++++++ squarenotsquare/src/redux/actions/UserActions.js | 2 +- squarenotsquare/src/screens/HighScore.js | 4 +++- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/realm/DbAPI.js b/squarenotsquare/src/realm/DbAPI.js index fc6e746..5e14479 100644 --- a/squarenotsquare/src/realm/DbAPI.js +++ b/squarenotsquare/src/realm/DbAPI.js @@ -30,6 +30,10 @@ class DatabaseAPI { return true; } + getHighScores() { + return this.scoreRepo.getHighScores(); + } + async initDB() { let repos = await initDB(); this.systemRepo = repos.systemRepo; diff --git a/squarenotsquare/src/realm/repos/ScoreRepo.js b/squarenotsquare/src/realm/repos/ScoreRepo.js index d1e70d7..60fe8b6 100644 --- a/squarenotsquare/src/realm/repos/ScoreRepo.js +++ b/squarenotsquare/src/realm/repos/ScoreRepo.js @@ -24,4 +24,13 @@ export default class ScoreRepo { ); }); }; + + getHighScores = () => { + let score = this.realmDB.objects(ScoreEntity.name); + let highScores = []; + score.forEach((row) => { + highScores.push({user: row.user, value: row.value}); + }); + return highScores; + }; } \ No newline at end of file diff --git a/squarenotsquare/src/redux/actions/UserActions.js b/squarenotsquare/src/redux/actions/UserActions.js index 66d0c40..4bc9444 100644 --- a/squarenotsquare/src/redux/actions/UserActions.js +++ b/squarenotsquare/src/redux/actions/UserActions.js @@ -21,7 +21,7 @@ export function squareFinished(answers, finalTime) { newUser.lastGameAnswers = answers; let finalScore = calculateSquareScore(answers, finalTime); - DbAPI.createScore(userState.username, finalScore); + DbAPI.createScore(userState.username, finalScore.toString()); dispatch({ type: SQUARE_FINISHED, user: newUser diff --git a/squarenotsquare/src/screens/HighScore.js b/squarenotsquare/src/screens/HighScore.js index c251e56..b2ce8d7 100644 --- a/squarenotsquare/src/screens/HighScore.js +++ b/squarenotsquare/src/screens/HighScore.js @@ -1,12 +1,14 @@ -import React, { useEffect } from "react"; +import React, { useEffect, useRef } from "react"; import { BackHandler, SafeAreaView, Text, TouchableOpacity, View } from "react-native"; import { styles } from './styles/AppStyles'; import Slider from "../components/Slider"; import { useDispatch } from "react-redux"; import {goHome} from '../redux/actions/SystemActions'; +import DbAPI from "../realm/DbAPI"; function HighScore(){ const dispatch = useDispatch(); + const scores = useRef(DbAPI.getHighScores()); useEffect(() => { BackHandler.addEventListener('hardwareBackPress', () => {return true}); -- 2.20.1 From 95b9ef3de65a97f8259aefff994f8a901e852336 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sat, 6 Aug 2022 19:44:56 -0500 Subject: [PATCH 095/128] display high scores --- squarenotsquare/src/screens/HighScore.js | 47 +++++++++++++++++++----- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/squarenotsquare/src/screens/HighScore.js b/squarenotsquare/src/screens/HighScore.js index b2ce8d7..516f66d 100644 --- a/squarenotsquare/src/screens/HighScore.js +++ b/squarenotsquare/src/screens/HighScore.js @@ -1,4 +1,4 @@ -import React, { useEffect, useRef } from "react"; +import React, { useEffect, useRef, useState } from "react"; import { BackHandler, SafeAreaView, Text, TouchableOpacity, View } from "react-native"; import { styles } from './styles/AppStyles'; import Slider from "../components/Slider"; @@ -8,36 +8,65 @@ import DbAPI from "../realm/DbAPI"; function HighScore(){ const dispatch = useDispatch(); - const scores = useRef(DbAPI.getHighScores()); + const scores = useRef([]); + const [scoresLoaded, setScoresLoaded] = useState(false); useEffect(() => { BackHandler.addEventListener('hardwareBackPress', () => {return true}); }, []) + useEffect(() => { + if (!scoresLoaded) { + loadScores() + .then(() => { + setTimeout( () => { + setScoresLoaded(true); + }, 1000) + }); + } + }, [scoresLoaded]) + function onPressMainMenu(){ dispatch(goHome()); } - const now = new Date(Date.now()); + async function loadScores(){ + scores.current = DbAPI.getHighScores(); + } + + function renderScore(score, index){ + return ( + + {(index+1) + '. '} + + {score.value + ' - ' + score.user} + + + ) + } + + function renderScores(){ + return scores.current.map((score, index) => { + return renderScore(score, index); + }) + } return ( - - - Not Implemented - - Main Menu + + {renderScores()} + ) -- 2.20.1 From d45b3ea98c3ed7bc63b7ac8a93df4a5e8e02221d Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sun, 7 Aug 2022 08:01:13 -0500 Subject: [PATCH 096/128] round displayed score --- squarenotsquare/src/screens/Score.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/squarenotsquare/src/screens/Score.js b/squarenotsquare/src/screens/Score.js index 93d2862..acdfbe8 100644 --- a/squarenotsquare/src/screens/Score.js +++ b/squarenotsquare/src/screens/Score.js @@ -20,7 +20,7 @@ function Score(props){ function calculateTimerScore(user = userRedux){ if (user !== null){ - let score = (60 - user.lastGameTime) * 1000; + let score = Math.round((60 - user.lastGameTime) * 1000); if (score < 0) { return 0; } else { -- 2.20.1 From 1c9a7c1294035befa5665494940ef45bc561fa64 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Sun, 7 Aug 2022 08:05:08 -0500 Subject: [PATCH 097/128] round calculated score --- squarenotsquare/src/libs/CalculateScore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/squarenotsquare/src/libs/CalculateScore.js b/squarenotsquare/src/libs/CalculateScore.js index 8918179..0dfc6c0 100644 --- a/squarenotsquare/src/libs/CalculateScore.js +++ b/squarenotsquare/src/libs/CalculateScore.js @@ -1,5 +1,5 @@ export function calculateSquareScore (answers, finalTime) { - let timeScore = (60 - finalTime) * 1000; + let timeScore = Math.round((60 - finalTime) * 1000); let answerScore = answers * 1000; let finalScore = timeScore + answerScore; return finalScore; -- 2.20.1 From 200d044f8ed6ef6820b61aaeddee8e9a8dbfea71 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 8 Aug 2022 17:14:48 -0500 Subject: [PATCH 098/128] sort high scores --- squarenotsquare/src/realm/repos/ScoreRepo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/squarenotsquare/src/realm/repos/ScoreRepo.js b/squarenotsquare/src/realm/repos/ScoreRepo.js index 60fe8b6..e4a202e 100644 --- a/squarenotsquare/src/realm/repos/ScoreRepo.js +++ b/squarenotsquare/src/realm/repos/ScoreRepo.js @@ -26,7 +26,7 @@ export default class ScoreRepo { }; getHighScores = () => { - let score = this.realmDB.objects(ScoreEntity.name); + let score = this.realmDB.objects(ScoreEntity.name).sorted('value', true); let highScores = []; score.forEach((row) => { highScores.push({user: row.user, value: row.value}); -- 2.20.1 From 3c81d81fd4087b890dfcf26a4cf573bb03ff2b89 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 8 Aug 2022 17:43:15 -0500 Subject: [PATCH 099/128] limit high scores to 100 --- squarenotsquare/src/realm/repos/ScoreRepo.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/squarenotsquare/src/realm/repos/ScoreRepo.js b/squarenotsquare/src/realm/repos/ScoreRepo.js index e4a202e..5050c80 100644 --- a/squarenotsquare/src/realm/repos/ScoreRepo.js +++ b/squarenotsquare/src/realm/repos/ScoreRepo.js @@ -28,7 +28,11 @@ export default class ScoreRepo { getHighScores = () => { let score = this.realmDB.objects(ScoreEntity.name).sorted('value', true); let highScores = []; + let i = 0; score.forEach((row) => { + if (i > 99){ + return highScores; + } highScores.push({user: row.user, value: row.value}); }); return highScores; -- 2.20.1 From 87403a8b7985bcb7c1ae3f2d825f4d303670c425 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Mon, 8 Aug 2022 22:07:08 -0500 Subject: [PATCH 100/128] fade optimizations --- squarenotsquare/src/components/Fade.js | 7 +++---- squarenotsquare/src/screens/Game.js | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/squarenotsquare/src/components/Fade.js b/squarenotsquare/src/components/Fade.js index 06fcde9..1b3fe46 100644 --- a/squarenotsquare/src/components/Fade.js +++ b/squarenotsquare/src/components/Fade.js @@ -4,14 +4,13 @@ import { useEffect, useRef } from "react"; function Fade(props){ const faded = useRef(new Animated.Value(0.1)); - const opaque = useRef(new Animated.Value(1)); useEffect(() => { if (props.faded) { Animated.timing( - opaque.current, + faded.current, { - toValue: 0.25, + toValue: 0.1, duration: props.duration, useNativeDriver: true } @@ -30,7 +29,7 @@ function Fade(props){ return ( - + {props.children} ) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index 865e34d..052f011 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -139,7 +139,7 @@ function Game(props){ function generatePair(answer, shapeIndex, pairIndex) { if (answer === 0) { return ( - + {generateSquare(pairIndex)} {generateShape(shapeIndex, pairIndex)} @@ -148,7 +148,7 @@ function Game(props){ ); } else { return ( - + {generateShape(shapeIndex, pairIndex)} {generateSquare(pairIndex)} -- 2.20.1 From bec4b55cfd12647b54b52659af1c52c43ac754c8 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 07:27:21 -0500 Subject: [PATCH 101/128] Score caching --- squarenotsquare/src/realm/DbAPI.js | 4 ++- squarenotsquare/src/realm/repos/ScoreRepo.js | 32 ++++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/squarenotsquare/src/realm/DbAPI.js b/squarenotsquare/src/realm/DbAPI.js index 5e14479..cf78b87 100644 --- a/squarenotsquare/src/realm/DbAPI.js +++ b/squarenotsquare/src/realm/DbAPI.js @@ -31,7 +31,7 @@ class DatabaseAPI { } getHighScores() { - return this.scoreRepo.getHighScores(); + return this.scoreRepo.getCachedScores(); } async initDB() { @@ -39,6 +39,8 @@ class DatabaseAPI { this.systemRepo = repos.systemRepo; this.scoreRepo = repos.scoreRepo; this.userRepo = repos.userRepo; + + this.scoreRepo.loadCache(); } } diff --git a/squarenotsquare/src/realm/repos/ScoreRepo.js b/squarenotsquare/src/realm/repos/ScoreRepo.js index 5050c80..5063065 100644 --- a/squarenotsquare/src/realm/repos/ScoreRepo.js +++ b/squarenotsquare/src/realm/repos/ScoreRepo.js @@ -7,11 +7,31 @@ export default class ScoreRepo { constructor(db) { this.realmDB = db; + this.scoreCache = []; + } + + updateScoreCache = (newScore) => { + this.scoreCache.push(newScore); + this.scoreCache.sort((a, b) => { + a.value < b.value + }); + + if (this.scoreCache.length > 99) { + this.scoreCache = this.scoreCache.slice(99, this.scoreCache.length - 1); + } } createScore = (user, score) => { let scoreID = uuidv4(); + let newScore = { + id: scoreID, + user: user, + value: score + }; + + this.updateScoreCache(newScore); + this.realmDB.write(() => { this.realmDB.create( ScoreEntity.name, @@ -23,7 +43,7 @@ export default class ScoreRepo { true, ); }); - }; + } getHighScores = () => { let score = this.realmDB.objects(ScoreEntity.name).sorted('value', true); @@ -36,5 +56,13 @@ export default class ScoreRepo { highScores.push({user: row.user, value: row.value}); }); return highScores; - }; + } + + loadCache = () => { + this.scoreCache = this.getHighScores(); + } + + getCachedScores = () => { + return this.scoreCache; + } } \ No newline at end of file -- 2.20.1 From 5b585254a498dcfd7ca7fb052c7f30fe3a06de4b Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 07:39:19 -0500 Subject: [PATCH 102/128] score typing --- squarenotsquare/src/realm/entities/Score.js | 2 +- squarenotsquare/src/redux/actions/UserActions.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/realm/entities/Score.js b/squarenotsquare/src/realm/entities/Score.js index 81425c2..449777e 100644 --- a/squarenotsquare/src/realm/entities/Score.js +++ b/squarenotsquare/src/realm/entities/Score.js @@ -4,6 +4,6 @@ export const ScoreEntity = { properties: { id: 'string', user: 'string', - value: 'string' + value: 'int' } }; \ No newline at end of file diff --git a/squarenotsquare/src/redux/actions/UserActions.js b/squarenotsquare/src/redux/actions/UserActions.js index 4bc9444..66d0c40 100644 --- a/squarenotsquare/src/redux/actions/UserActions.js +++ b/squarenotsquare/src/redux/actions/UserActions.js @@ -21,7 +21,7 @@ export function squareFinished(answers, finalTime) { newUser.lastGameAnswers = answers; let finalScore = calculateSquareScore(answers, finalTime); - DbAPI.createScore(userState.username, finalScore.toString()); + DbAPI.createScore(userState.username, finalScore); dispatch({ type: SQUARE_FINISHED, user: newUser -- 2.20.1 From 1b10a176bad54a88c2a71112513bf7483a019e89 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 07:39:26 -0500 Subject: [PATCH 103/128] remove home screen timeout --- squarenotsquare/src/redux/actions/SystemActions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/squarenotsquare/src/redux/actions/SystemActions.js b/squarenotsquare/src/redux/actions/SystemActions.js index 0ce28d6..8366943 100644 --- a/squarenotsquare/src/redux/actions/SystemActions.js +++ b/squarenotsquare/src/redux/actions/SystemActions.js @@ -6,7 +6,7 @@ export function appInit() { return async (dispatch) => { await DbAPI.initDB(); dispatch(onInit()); - setTimeout(() => squareNav('Home'), 1000); + squareNav('Home'); } } -- 2.20.1 From ad8904832066adcb0157e1493fe357418548f33f Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 09:27:49 -0500 Subject: [PATCH 104/128] score cache sorting --- squarenotsquare/src/realm/repos/ScoreRepo.js | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/squarenotsquare/src/realm/repos/ScoreRepo.js b/squarenotsquare/src/realm/repos/ScoreRepo.js index 5063065..9138270 100644 --- a/squarenotsquare/src/realm/repos/ScoreRepo.js +++ b/squarenotsquare/src/realm/repos/ScoreRepo.js @@ -12,9 +12,7 @@ export default class ScoreRepo { updateScoreCache = (newScore) => { this.scoreCache.push(newScore); - this.scoreCache.sort((a, b) => { - a.value < b.value - }); + this.scoreCache.sort((a, b) => b.value - a.value); if (this.scoreCache.length > 99) { this.scoreCache = this.scoreCache.slice(99, this.scoreCache.length - 1); @@ -33,15 +31,7 @@ export default class ScoreRepo { this.updateScoreCache(newScore); this.realmDB.write(() => { - this.realmDB.create( - ScoreEntity.name, - { - id: scoreID, - user: user, - value: score, - }, - true, - ); + this.realmDB.create( ScoreEntity.name, newScore, true); }); } -- 2.20.1 From a8f2791cb230c0d48c04dc731450b5e2963612fe Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 14:42:18 -0500 Subject: [PATCH 105/128] white icons --- squarenotsquare/src/screens/Game.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index 052f011..a310918 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -114,7 +114,7 @@ function Game(props){ > @@ -129,7 +129,7 @@ function Game(props){ > -- 2.20.1 From 807e7ba86be8899dfedb8d88642226b7bbc795a2 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 14:44:52 -0500 Subject: [PATCH 106/128] score screen styling --- squarenotsquare/src/screens/HighScore.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/squarenotsquare/src/screens/HighScore.js b/squarenotsquare/src/screens/HighScore.js index 516f66d..1da0ceb 100644 --- a/squarenotsquare/src/screens/HighScore.js +++ b/squarenotsquare/src/screens/HighScore.js @@ -5,6 +5,7 @@ import Slider from "../components/Slider"; import { useDispatch } from "react-redux"; import {goHome} from '../redux/actions/SystemActions'; import DbAPI from "../realm/DbAPI"; +import { ScrollView } from "react-native-gesture-handler"; function HighScore(){ const dispatch = useDispatch(); @@ -53,20 +54,20 @@ function HighScore(){ return ( - + Main Menu - + {renderScores()} - + ) -- 2.20.1 From 9bae90809fa6570e17fa0a76d654c8433cb9ce20 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 17:48:19 -0500 Subject: [PATCH 107/128] implement scroll picker --- .../src/components/ScrollingPicker.js | 58 +++++++++++++++++++ squarenotsquare/src/screens/Home.js | 22 ++++--- .../src/screens/styles/AppStyles.js | 5 ++ squarenotsquare/src/themes/Icons.js | 3 +- 4 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 squarenotsquare/src/components/ScrollingPicker.js diff --git a/squarenotsquare/src/components/ScrollingPicker.js b/squarenotsquare/src/components/ScrollingPicker.js new file mode 100644 index 0000000..6d90801 --- /dev/null +++ b/squarenotsquare/src/components/ScrollingPicker.js @@ -0,0 +1,58 @@ +import React, { useRef, useState } from "react"; +import { + ScrollView, + Animated, +} from "react-native"; +import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; +import Icons from '../themes/Icons'; +import Colors from "../themes/Colors"; +import Metrics from "../themes/Metrics"; +import { styles } from "../screens/styles/AppStyles"; + +function ScrollingPicker() { + const scrollX = useRef(new Animated.Value(0)).current; + const [selected, setSelected] = useState(0); + + function onScroll(event){ + if (event.nativeEvent.contentOffset.x === 0) { + setSelected(0); + } else if (event.nativeEvent.contentOffset.x === Metrics.icons.buttonIcon) { + setSelected(1); + } + Animated.event([ + { + nativeEvent: { + contentOffset: { + x: scrollX + } + } + } + ], {useNativeDriver: true}) + } + + return ( + + + + + ); +} + +export default ScrollingPicker; \ No newline at end of file diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 512ef1d..0a1bb49 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -9,6 +9,7 @@ import Slider from "../components/Slider"; import { useDispatch } from "react-redux"; import {squareStartPressed} from '../redux/actions/UserActions'; import { goToScores } from "../redux/actions/SystemActions"; +import ModePicker from '../components/ScrollingPicker'; function Home(){ const dispatch = useDispatch(); @@ -36,16 +37,21 @@ function Home(){ size={Metrics.icons.buttonIcon} /> - - - Square - - {' not '} - - + + + Square + + {' not '} + + + Square + - + + + + diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index aeac431..f11ec28 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -111,6 +111,11 @@ export const styles = StyleSheet.create({ height: Metrics.icons.buttonIcon }, + modePicker: { + width: Metrics.icons.buttonIcon, + overflow: "visible" + }, + timerView: { height: Metrics.screenSections.timerHeight } diff --git a/squarenotsquare/src/themes/Icons.js b/squarenotsquare/src/themes/Icons.js index 91ddd10..19d1a79 100644 --- a/squarenotsquare/src/themes/Icons.js +++ b/squarenotsquare/src/themes/Icons.js @@ -4,7 +4,8 @@ class AppIcons { settings: 'cog-outline', toggleOn: 'toggle-switch-on', toggleOff: 'toggle-switch-off', - check: 'check' + check: 'check', + plus: 'plus' }; wrongShapes = { -- 2.20.1 From a09e61cc7c5bcccd61b3fb1729bd28bd4dced741 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 17:51:20 -0500 Subject: [PATCH 108/128] scroll picker styles --- squarenotsquare/src/components/ScrollingPicker.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/squarenotsquare/src/components/ScrollingPicker.js b/squarenotsquare/src/components/ScrollingPicker.js index 6d90801..0e61660 100644 --- a/squarenotsquare/src/components/ScrollingPicker.js +++ b/squarenotsquare/src/components/ScrollingPicker.js @@ -40,15 +40,13 @@ function ScrollingPicker() { scrollEventThrottle={0} > -- 2.20.1 From e61e558029916bc7ed6037a7404fb85fb02f185b Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 18:00:02 -0500 Subject: [PATCH 109/128] Scroll picker width --- squarenotsquare/src/components/ScrollingPicker.js | 4 +++- squarenotsquare/src/screens/styles/AppStyles.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/components/ScrollingPicker.js b/squarenotsquare/src/components/ScrollingPicker.js index 0e61660..8ce4292 100644 --- a/squarenotsquare/src/components/ScrollingPicker.js +++ b/squarenotsquare/src/components/ScrollingPicker.js @@ -16,7 +16,7 @@ function ScrollingPicker() { function onScroll(event){ if (event.nativeEvent.contentOffset.x === 0) { setSelected(0); - } else if (event.nativeEvent.contentOffset.x === Metrics.icons.buttonIcon) { + } else if (event.nativeEvent.contentOffset.x === (Metrics.icons.buttonIcon * 2)) { setSelected(1); } Animated.event([ @@ -43,11 +43,13 @@ function ScrollingPicker() { name={Icons.squareIcons.square} color={Colors.material.dark} size={Metrics.icons.buttonIcon} + style={{marginLeft: Metrics.icons.buttonIcon * 0.5, marginRight: Metrics.icons.buttonIcon * 0.5}} /> ); diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index f11ec28..031953c 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -112,7 +112,7 @@ export const styles = StyleSheet.create({ }, modePicker: { - width: Metrics.icons.buttonIcon, + width: Metrics.icons.buttonIcon * 2, overflow: "visible" }, -- 2.20.1 From dc7c93d813ba67c7d073c2da3099b85098175537 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 18:05:04 -0500 Subject: [PATCH 110/128] Mode text and setter --- squarenotsquare/src/components/ScrollingPicker.js | 11 ++++++----- squarenotsquare/src/screens/Home.js | 8 ++++++-- squarenotsquare/src/screens/styles/AppStyles.js | 4 ++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/squarenotsquare/src/components/ScrollingPicker.js b/squarenotsquare/src/components/ScrollingPicker.js index 8ce4292..9a929ad 100644 --- a/squarenotsquare/src/components/ScrollingPicker.js +++ b/squarenotsquare/src/components/ScrollingPicker.js @@ -8,16 +8,17 @@ import Icons from '../themes/Icons'; import Colors from "../themes/Colors"; import Metrics from "../themes/Metrics"; import { styles } from "../screens/styles/AppStyles"; +import finalPropsSelectorFactory from "react-redux/es/connect/selectorFactory"; -function ScrollingPicker() { +function ScrollingPicker(props) { const scrollX = useRef(new Animated.Value(0)).current; const [selected, setSelected] = useState(0); function onScroll(event){ if (event.nativeEvent.contentOffset.x === 0) { - setSelected(0); + props.modeSetter(0); } else if (event.nativeEvent.contentOffset.x === (Metrics.icons.buttonIcon * 2)) { - setSelected(1); + props.modeSetter(1); } Animated.event([ { @@ -43,13 +44,13 @@ function ScrollingPicker() { name={Icons.squareIcons.square} color={Colors.material.dark} size={Metrics.icons.buttonIcon} - style={{marginLeft: Metrics.icons.buttonIcon * 0.5, marginRight: Metrics.icons.buttonIcon * 0.5}} + style={styles.modePickerMargin} /> ); diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 0a1bb49..ce905eb 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -1,4 +1,4 @@ -import React, { useEffect } from "react"; +import React, { useEffect, useState } from "react"; import { BackHandler, SafeAreaView, Text, TouchableOpacity, View } from "react-native"; import { styles } from './styles/AppStyles'; import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; @@ -13,6 +13,7 @@ import ModePicker from '../components/ScrollingPicker'; function Home(){ const dispatch = useDispatch(); + const [mode, setMode] = useState(0); useEffect(() => { BackHandler.addEventListener('hardwareBackPress', () => {return true}); @@ -50,7 +51,10 @@ function Home(){ - + + + {mode === 0 ? 'Squares' : 'Addition'} + diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index 031953c..2953771 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -85,6 +85,10 @@ export const styles = StyleSheet.create({ marginBottom: Metrics.margins.buttonMargin, marginTop: Metrics.margins.buttonMargin }, + modePickerMargin: { + marginLeft: Metrics.icons.buttonIcon * 0.5, + marginRight: Metrics.icons.buttonIcon * 0.5 + }, footer: { margin: Metrics.margins.default, -- 2.20.1 From ff475a5238771530b99fb2182f0b765d02f04001 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 18:09:30 -0500 Subject: [PATCH 111/128] Faded picker --- .../src/components/ScrollingPicker.js | 31 ++++++++++--------- squarenotsquare/src/screens/Home.js | 2 +- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/squarenotsquare/src/components/ScrollingPicker.js b/squarenotsquare/src/components/ScrollingPicker.js index 9a929ad..95e20eb 100644 --- a/squarenotsquare/src/components/ScrollingPicker.js +++ b/squarenotsquare/src/components/ScrollingPicker.js @@ -8,11 +8,10 @@ import Icons from '../themes/Icons'; import Colors from "../themes/Colors"; import Metrics from "../themes/Metrics"; import { styles } from "../screens/styles/AppStyles"; -import finalPropsSelectorFactory from "react-redux/es/connect/selectorFactory"; +import Fade from "./Fade"; function ScrollingPicker(props) { const scrollX = useRef(new Animated.Value(0)).current; - const [selected, setSelected] = useState(0); function onScroll(event){ if (event.nativeEvent.contentOffset.x === 0) { @@ -40,18 +39,22 @@ function ScrollingPicker(props) { onScroll={onScroll} scrollEventThrottle={0} > - - + + + + + + ); } diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index ce905eb..d9835e0 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -51,7 +51,7 @@ function Home(){ - + {mode === 0 ? 'Squares' : 'Addition'} -- 2.20.1 From efec9f91c7ae35f9a13931137a4e77117b4c6b04 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 18:49:39 -0500 Subject: [PATCH 112/128] Addition game navigation and redux action --- .../src/components/ScrollingPicker.js | 8 ++++---- squarenotsquare/src/libs/Random.js | 17 +++++++++++++++++ squarenotsquare/src/navigation/SquareStack.js | 6 ++++++ .../src/redux/actions/UserActions.js | 19 +++++++++++++------ squarenotsquare/src/redux/types/UserTypes.js | 4 +++- squarenotsquare/src/screens/Game.js | 4 ++-- squarenotsquare/src/screens/Home.js | 12 ++++++++---- 7 files changed, 53 insertions(+), 17 deletions(-) diff --git a/squarenotsquare/src/components/ScrollingPicker.js b/squarenotsquare/src/components/ScrollingPicker.js index 95e20eb..8122f33 100644 --- a/squarenotsquare/src/components/ScrollingPicker.js +++ b/squarenotsquare/src/components/ScrollingPicker.js @@ -15,9 +15,9 @@ function ScrollingPicker(props) { function onScroll(event){ if (event.nativeEvent.contentOffset.x === 0) { - props.modeSetter(0); + props.modeSetter('square'); } else if (event.nativeEvent.contentOffset.x === (Metrics.icons.buttonIcon * 2)) { - props.modeSetter(1); + props.modeSetter('addition'); } Animated.event([ { @@ -39,7 +39,7 @@ function ScrollingPicker(props) { onScroll={onScroll} scrollEventThrottle={0} > - + - + = 10); + + result.push({left: left, right: right}); + } + return result; } \ No newline at end of file diff --git a/squarenotsquare/src/navigation/SquareStack.js b/squarenotsquare/src/navigation/SquareStack.js index 5eee0cb..379fa99 100644 --- a/squarenotsquare/src/navigation/SquareStack.js +++ b/squarenotsquare/src/navigation/SquareStack.js @@ -9,6 +9,7 @@ import HighScore from '../screens/HighScore'; import Settings from '../screens/Settings'; import Splash from '../screens/Splash'; import Score from '../screens/Score'; +import AdditionGame from '../screens/AdditionGame'; const SquareNav = createStackNavigator(); @@ -43,6 +44,11 @@ function SquareStack() { component={Game} options={noHeader} /> + { - squareNav('Game'); - dispatch({ - type: SQUARE_START - }); + if (mode === 'square') { + squareNav('Game'); + dispatch({ + type: SQUARE_START + }); + } else if (mode === 'addition') { + squareNav('AdditionGame'); + dispatch({ + type: ADDITION_START + }) + } } } diff --git a/squarenotsquare/src/redux/types/UserTypes.js b/squarenotsquare/src/redux/types/UserTypes.js index 1f20595..bba52a3 100644 --- a/squarenotsquare/src/redux/types/UserTypes.js +++ b/squarenotsquare/src/redux/types/UserTypes.js @@ -1,2 +1,4 @@ export const SQUARE_START = 'square-start'; -export const SQUARE_FINISHED = 'square-finished'; \ No newline at end of file +export const SQUARE_FINISHED = 'square-finished'; +export const ADDITION_START = 'addition-start'; +export const ADDITION_FINISHED = 'addition-finished'; \ No newline at end of file diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index a310918..468766c 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -139,7 +139,7 @@ function Game(props){ function generatePair(answer, shapeIndex, pairIndex) { if (answer === 0) { return ( - + {generateSquare(pairIndex)} {generateShape(shapeIndex, pairIndex)} @@ -148,7 +148,7 @@ function Game(props){ ); } else { return ( - + {generateShape(shapeIndex, pairIndex)} {generateSquare(pairIndex)} diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index d9835e0..37c4a98 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -13,20 +13,24 @@ import ModePicker from '../components/ScrollingPicker'; function Home(){ const dispatch = useDispatch(); - const [mode, setMode] = useState(0); + const [mode, setMode] = useState('square'); useEffect(() => { BackHandler.addEventListener('hardwareBackPress', () => {return true}); }, []) function onPressStart(){ - dispatch(squareStartPressed()); + dispatch(squareStartPressed(mode)); } function onPressHighScores(){ dispatch(goToScores()); } + function setGameMode(newMode) { + setMode(newMode); + } + const now = new Date(Date.now()); return ( @@ -51,9 +55,9 @@ function Home(){ - + - {mode === 0 ? 'Squares' : 'Addition'} + {mode === 'square' ? 'Squares' : 'Addition'} -- 2.20.1 From f06648cf167101c2884e9498a7e828c7805f1803 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 21:41:05 -0500 Subject: [PATCH 113/128] square challenge generation correction --- squarenotsquare/src/screens/Game.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index 468766c..6632002 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -15,7 +15,7 @@ import Metrics from "../themes/Metrics"; function Game(props){ - const squareChallenge = useRef(genSquareChallenge()); + const [squareChallenge, setSquareChallenge] = useState(() => {return genSquareChallenge()}); const challengeState = useRef(-1); const squareMemo = useMemo(renderPairs, [challengeState.current]); const [timerState, setTimerState] = useState(0); @@ -159,7 +159,7 @@ function Game(props){ } function renderPairs(){ - return squareChallenge.current.map((pair, index) => { + return squareChallenge.map((pair, index) => { return generatePair(pair.squarePos, pair.shapeType, index); }); } @@ -193,7 +193,7 @@ function Game(props){ - {answers.current + ' / ' + squareChallenge.current.length} + {answers.current + ' / ' + squareChallenge.length} -- 2.20.1 From e618cb7511bf439e88b11ecd6b0bcedf75087997 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 22:29:16 -0500 Subject: [PATCH 114/128] ninekey component --- squarenotsquare/src/components/NineKey.js | 47 +++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 squarenotsquare/src/components/NineKey.js diff --git a/squarenotsquare/src/components/NineKey.js b/squarenotsquare/src/components/NineKey.js new file mode 100644 index 0000000..7231da1 --- /dev/null +++ b/squarenotsquare/src/components/NineKey.js @@ -0,0 +1,47 @@ +import React from "react"; +import { Text, View } from "react-native"; +import { TouchableOpacity } from "react-native-gesture-handler"; +import { styles } from "../screens/styles/AppStyles"; + +function NineKey(props){ + + function generateKey(value){ + return ( + props.onPress(value)} + > + + {value} + + + ); + } + + return ( + + + {generateKey(7)} + {generateKey(8)} + {generateKey(9)} + + + {generateKey(4)} + {generateKey(5)} + {generateKey(6)} + + + {generateKey(1)} + {generateKey(2)} + {generateKey(3)} + + + + {generateKey(0)} + + + + ); +} + +export default NineKey; \ No newline at end of file -- 2.20.1 From a0a7726142f5f1b9fa7a0041360c0df2744c5a58 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 22:29:29 -0500 Subject: [PATCH 115/128] ninekey metrics --- squarenotsquare/src/themes/Metrics.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index a5dd8e8..73830ff 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -45,7 +45,8 @@ class AppMetrics { this.margins = { default: this.normalize(5), buttonMargin: this.normalize(20), - gameStartMargin: this.normalize(30) + gameStartMargin: this.normalize(30), + nineKeyMargin: this.normalize(2) } this.buttons = { @@ -57,11 +58,15 @@ class AppMetrics { answerButton: { width: this.normalize(40), height: this.normalize(40) + }, + nineKeyButton: { + width: this.screenWidth * 0.28, + height: this.screenHeight * 0.08 } } this.animated = { - gameScrollInterval: ( + squareInterval: ( this.buttons.answerButton.height + (this.margins.buttonMargin * 2) ) -- 2.20.1 From 82cce5f72c5f4e2ce13270647e4e0a0258ae2215 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 22:29:35 -0500 Subject: [PATCH 116/128] ninekey styles --- squarenotsquare/src/screens/styles/AppStyles.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index 2953771..6094229 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -109,6 +109,13 @@ export const styles = StyleSheet.create({ height: Metrics.buttons.answerButton.height }, + nineKeyButton: { + borderRadius: Metrics.buttons.borderRadius, + width: Metrics.buttons.nineKeyButton.width, + height: Metrics.buttons.nineKeyButton.height, + margin: Metrics.margins.nineKeyMargin + }, + settingsContainer: { zIndex: 1000, width: Metrics.icons.buttonIcon, -- 2.20.1 From f7b4224cb93b21d17e4dbd36dd20fd9ccd2bf083 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 22:35:00 -0500 Subject: [PATCH 117/128] addition game component --- squarenotsquare/src/screens/AdditionGame.js | 162 ++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 squarenotsquare/src/screens/AdditionGame.js diff --git a/squarenotsquare/src/screens/AdditionGame.js b/squarenotsquare/src/screens/AdditionGame.js new file mode 100644 index 0000000..ee9f762 --- /dev/null +++ b/squarenotsquare/src/screens/AdditionGame.js @@ -0,0 +1,162 @@ +import React from "react"; +import { Text, TouchableOpacity, View, SafeAreaView } from "react-native"; +import { useState, useEffect, useRef, useMemo } from "react"; +import { useDispatch } from "react-redux"; +import {generateAdditionChallenge} from '../libs/Random'; +import { styles } from "./styles/AppStyles"; +import NineKey from "../components/NineKey"; +import Autoscroll from "../components/Autoscroll"; +import Fade from "../components/Fade"; +import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; +import Icons from '../themes/Icons'; +import Colors from "../themes/Colors"; +import Metrics from "../themes/Metrics"; + +function AdditionGame(props){ + + const [addChallenge, setAddChallenge]= useState(() => {return generateAdditionChallenge()}); + const challengeState = useRef(-1); + const squareMemo = useMemo(renderPairs, [challengeState.current]); + const [timerState, setTimerState] = useState(0); + const localTimer = useRef(null); + const startTime = useRef(0); + const answers = useRef(0); + const [scrollOrigin, setScrollOrigin] = useState(0); + const scrollDestination = useRef(Metrics.animated.gameScrollInterval); + const [headerText, setHeaderText] = useState('Ready?'); + const [headerColor, setHeaderColor] = useState(styles.green); + const [headerTextColor, setHeaderTextColor] = useState(styles.darkText); + const dispatch = useDispatch(); + + useEffect(() => { + let headerTimeout = null; + + switch(timerState){ + case 0: + headerTimeout = setTimeout(() => { + setHeaderColor(styles.yellow); + setHeaderText('Set'); + setTimerState(1); + }, 1000); + break; + case 1: + headerTimeout = setTimeout(() => { + setHeaderColor(styles.red); + setHeaderTextColor(styles.lightText); + setHeaderText('Go!'); + challengeState.current = 0; + setTimerState(2); + }, 1000); + break; + case 2: + headerTimeout = setTimeout(() => { + setHeaderColor(styles.dark); + startTime.current = (Date.now()); + setHeaderText(0 + ' s'); + setTimerState(3); + }, 1000); + break; + case 3: + headerTimeout = setInterval(() => { + let elapsed = Math.round((Date.now() - startTime.current) / (1000)); + setHeaderText(elapsed + ' s'); + }, 1000); + break; + default: + break; + } + + localTimer.current = headerTimeout; + + return () => { + clearTimeout(localTimer.current); + clearInterval(localTimer.current); + } + }, [timerState]); + + + + function selectAnswer(answer){ + //fix + if (true) { + answers.current = answers.current + 1; + } + + let newOrigin = scrollDestination.current; + let newDestination = scrollDestination.current - Metrics.animated.gameScrollInterval; + + scrollDestination.current = newDestination; + challengeState.current = challengeState.current + 1; + setScrollOrigin(newOrigin); + + if (challengeState.current >= 20) { + completeChallenge(); + } + } + + function completeChallenge(){ + let unformatted = (Date.now() - startTime.current) / (1000); + let finalTime = Number.parseFloat(unformatted).toFixed(3); + clearInterval(localTimer.current); + setHeaderColor(styles.darkGreen); + setHeaderText(finalTime + ' s'); + setTimerState(4); + // dispatch(squareFinished(answers.current, finalTime)); + } + + function generateLine(left, right, pairIndex) { + return ( + + + + {left + ' + ' + right + ' = '} + + + + ); + } + + function renderPairs(){ + return addChallenge.map((pair, index) => { + return generateLine(pair.left, pair.right, index); + }); + } + + return ( + + + + {headerText} + + + + + + {squareMemo} + + + + Finish + + + + + + + {answers.current + ' / ' + addChallenge.length} + + + + + ); +} + +export default AdditionGame; \ No newline at end of file -- 2.20.1 From 86b5233c8f144719245ae5f654ae09bd1561d93e Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 23:13:21 -0500 Subject: [PATCH 118/128] Addition screen implementation --- .../src/redux/actions/UserActions.js | 19 ++++++++- .../src/redux/reducers/UserReducer.js | 4 +- squarenotsquare/src/screens/AdditionGame.js | 39 ++++++++++++------- .../src/screens/styles/AppStyles.js | 4 ++ squarenotsquare/src/themes/Metrics.js | 17 ++++---- 5 files changed, 58 insertions(+), 25 deletions(-) diff --git a/squarenotsquare/src/redux/actions/UserActions.js b/squarenotsquare/src/redux/actions/UserActions.js index cde80a9..8533f8c 100644 --- a/squarenotsquare/src/redux/actions/UserActions.js +++ b/squarenotsquare/src/redux/actions/UserActions.js @@ -1,5 +1,5 @@ import { squareNav } from "../../navigation/SquareNav"; -import { ADDITION_START, SQUARE_FINISHED, SQUARE_START } from "../types/UserTypes"; +import { ADDITION_FINISHED, ADDITION_START, SQUARE_FINISHED, SQUARE_START } from "../types/UserTypes"; import { calculateSquareScore } from "../../libs/CalculateScore"; import DbAPI from "../../realm/DbAPI"; @@ -34,4 +34,21 @@ export function squareFinished(answers, finalTime) { user: newUser }); } +} + +export function addFinished(answers, finalTime) { + return (dispatch, getState) => { + setTimeout(() => squareNav('Score'), 3000); + const userState = getState().user; + let newUser = {...userState}; + newUser.lastGameTime = finalTime; + newUser.lastGameAnswers = answers; + + let finalScore = calculateSquareScore(answers, finalTime); + DbAPI.createScore(userState.username, finalScore); + dispatch({ + type: ADDITION_FINISHED, + user: newUser + }); + } } \ No newline at end of file diff --git a/squarenotsquare/src/redux/reducers/UserReducer.js b/squarenotsquare/src/redux/reducers/UserReducer.js index ae2d033..2c79b00 100644 --- a/squarenotsquare/src/redux/reducers/UserReducer.js +++ b/squarenotsquare/src/redux/reducers/UserReducer.js @@ -1,7 +1,8 @@ import { APP_INIT } from "../types/SystemTypes"; import { SQUARE_START, - SQUARE_FINISHED + SQUARE_FINISHED, + ADDITION_FINISHED } from '../types/UserTypes'; const initialUserState = { @@ -15,6 +16,7 @@ function usr(state = initialUserState, action) { switch (action.type) { case SQUARE_START: case SQUARE_FINISHED: + case ADDITION_FINISHED: return {...state, ...action.user}; default: return state; diff --git a/squarenotsquare/src/screens/AdditionGame.js b/squarenotsquare/src/screens/AdditionGame.js index ee9f762..3750184 100644 --- a/squarenotsquare/src/screens/AdditionGame.js +++ b/squarenotsquare/src/screens/AdditionGame.js @@ -11,6 +11,7 @@ import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; import Icons from '../themes/Icons'; import Colors from "../themes/Colors"; import Metrics from "../themes/Metrics"; +import { addFinished } from "../redux/actions/UserActions"; function AdditionGame(props){ @@ -77,8 +78,14 @@ function AdditionGame(props){ function selectAnswer(answer){ - //fix - if (true) { + let currentChallenge = addChallenge[challengeState.current]; + let outcome = ( + answer === ( + currentChallenge.left + currentChallenge.right + ) + ); + + if (outcome) { answers.current = answers.current + 1; } @@ -101,13 +108,13 @@ function AdditionGame(props){ setHeaderColor(styles.darkGreen); setHeaderText(finalTime + ' s'); setTimerState(4); - // dispatch(squareFinished(answers.current, finalTime)); + dispatch(addFinished(answers.current, finalTime)); } function generateLine(left, right, pairIndex) { return ( - + {left + ' + ' + right + ' = '} @@ -134,19 +141,21 @@ function AdditionGame(props){ origin={scrollOrigin} destination={scrollDestination.current} duration={250} + style={{overflow: 'hidden'}} > - {squareMemo} - - - - Finish - - + + + + + Finish + + + diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index 6094229..d2bf232 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -109,6 +109,10 @@ export const styles = StyleSheet.create({ height: Metrics.buttons.answerButton.height }, + addQuestionHeight: { + height: Metrics.screenSections.addQuestionHeight + }, + nineKeyButton: { borderRadius: Metrics.buttons.borderRadius, width: Metrics.buttons.nineKeyButton.width, diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index 73830ff..3da47d8 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -22,13 +22,6 @@ class AppMetrics { opacity: 0.5, radius: 5 } - - this.screenSections = { - headerHeight: this.normalize(20), - sectionWidth: this.screenWidth, - footerHeight: this.normalize(10), - timerHeight: this.normalize(20) - } this.icons = { splashIcon: this.normalize(100), @@ -66,12 +59,20 @@ class AppMetrics { } this.animated = { - squareInterval: ( + gameScrollInterval: ( this.buttons.answerButton.height + (this.margins.buttonMargin * 2) ) } + this.screenSections = { + headerHeight: this.normalize(20), + sectionWidth: this.screenWidth, + footerHeight: this.normalize(10), + timerHeight: this.normalize(20), + addQuestionHeight: this.buttons.answerButton.height + } + this.borders = { width: 1 } -- 2.20.1 From 248d209dd677f3314492675efe73420e7a99fb52 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 23:39:04 -0500 Subject: [PATCH 119/128] round scroll event offset --- squarenotsquare/src/components/ScrollingPicker.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/squarenotsquare/src/components/ScrollingPicker.js b/squarenotsquare/src/components/ScrollingPicker.js index 8122f33..624d7de 100644 --- a/squarenotsquare/src/components/ScrollingPicker.js +++ b/squarenotsquare/src/components/ScrollingPicker.js @@ -14,9 +14,10 @@ function ScrollingPicker(props) { const scrollX = useRef(new Animated.Value(0)).current; function onScroll(event){ - if (event.nativeEvent.contentOffset.x === 0) { + let rounded = Math.round(event.nativeEvent.contentOffset.x); + if (rounded === 0) { props.modeSetter('square'); - } else if (event.nativeEvent.contentOffset.x === (Metrics.icons.buttonIcon * 2)) { + } else if (rounded === (Metrics.icons.buttonIcon * 2)) { props.modeSetter('addition'); } Animated.event([ -- 2.20.1 From 853c6208a3ae6abd7f533af3abd6e8da1fc90449 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Tue, 9 Aug 2022 23:41:23 -0500 Subject: [PATCH 120/128] build date --- squarenotsquare/src/screens/Home.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 37c4a98..66bed85 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -85,7 +85,7 @@ function Home(){ - 0.0.1a Atonal Software {now.toDateString()} + 0.0.1a Atonal Software Aug 9 2022 -- 2.20.1 From 7caf907238b59e0b0702c0b3f8c3282c46c2a168 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 10 Aug 2022 07:28:11 -0500 Subject: [PATCH 121/128] Remove settings --- squarenotsquare/src/screens/Home.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 66bed85..6712a9a 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -35,13 +35,6 @@ function Home(){ return ( - - - -- 2.20.1 From 2fa7ddf395baaa4ad6396ee5a6b98c11eaf2fb3c Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 10 Aug 2022 13:44:19 -0500 Subject: [PATCH 122/128] username input on home screen --- .../src/realm/migrations/MigrateV1.js | 2 +- .../src/redux/actions/SystemActions.js | 13 +++++++----- .../src/redux/actions/UserActions.js | 13 ++++++++---- .../src/redux/reducers/UserReducer.js | 5 ++++- squarenotsquare/src/screens/Home.js | 21 ++++++++++++++++--- .../src/screens/styles/AppStyles.js | 5 +++++ squarenotsquare/src/themes/Icons.js | 3 ++- squarenotsquare/src/themes/Metrics.js | 3 ++- 8 files changed, 49 insertions(+), 16 deletions(-) diff --git a/squarenotsquare/src/realm/migrations/MigrateV1.js b/squarenotsquare/src/realm/migrations/MigrateV1.js index f48dabe..49948c0 100644 --- a/squarenotsquare/src/realm/migrations/MigrateV1.js +++ b/squarenotsquare/src/realm/migrations/MigrateV1.js @@ -7,7 +7,7 @@ export function migratev1(oldRealm, newRealm) { newRealm.create(SystemEntity.name, { id: uuidv4(), key: 'username', - value: 'changeme' + value: 'noname' }); } } diff --git a/squarenotsquare/src/redux/actions/SystemActions.js b/squarenotsquare/src/redux/actions/SystemActions.js index 8366943..3859b5d 100644 --- a/squarenotsquare/src/redux/actions/SystemActions.js +++ b/squarenotsquare/src/redux/actions/SystemActions.js @@ -5,7 +5,8 @@ import { squareNav } from "../../navigation/SquareNav"; export function appInit() { return async (dispatch) => { await DbAPI.initDB(); - dispatch(onInit()); + let lastUsername = DbAPI.getSystemValue('username').value; + dispatch(onInit(lastUsername)); squareNav('Home'); } } @@ -28,11 +29,13 @@ export function goToScores() { } } -function onInit() { - return (dispatch) => { +function onInit(lastUsername) { + return (dispatch, getState) => { + let currentUser = {...getState().user}; + currentUser.username = lastUsername; dispatch({ - type: APP_INIT - //system: system + type: APP_INIT, + user: currentUser }); } } \ No newline at end of file diff --git a/squarenotsquare/src/redux/actions/UserActions.js b/squarenotsquare/src/redux/actions/UserActions.js index 8533f8c..6729c11 100644 --- a/squarenotsquare/src/redux/actions/UserActions.js +++ b/squarenotsquare/src/redux/actions/UserActions.js @@ -3,17 +3,22 @@ import { ADDITION_FINISHED, ADDITION_START, SQUARE_FINISHED, SQUARE_START } from import { calculateSquareScore } from "../../libs/CalculateScore"; import DbAPI from "../../realm/DbAPI"; -export function squareStartPressed(mode) { - return (dispatch) => { +export function squareStartPressed(mode, username) { + return (dispatch, getState) => { + DbAPI.createSystemValue('username', username); + let userState = {...getState().user}; + userState.username = username; if (mode === 'square') { squareNav('Game'); dispatch({ - type: SQUARE_START + type: SQUARE_START, + user: userState }); } else if (mode === 'addition') { squareNav('AdditionGame'); dispatch({ - type: ADDITION_START + type: ADDITION_START, + user: userState }) } } diff --git a/squarenotsquare/src/redux/reducers/UserReducer.js b/squarenotsquare/src/redux/reducers/UserReducer.js index 2c79b00..3c3a711 100644 --- a/squarenotsquare/src/redux/reducers/UserReducer.js +++ b/squarenotsquare/src/redux/reducers/UserReducer.js @@ -2,7 +2,8 @@ import { APP_INIT } from "../types/SystemTypes"; import { SQUARE_START, SQUARE_FINISHED, - ADDITION_FINISHED + ADDITION_FINISHED, + ADDITION_START } from '../types/UserTypes'; const initialUserState = { @@ -14,7 +15,9 @@ const initialUserState = { function usr(state = initialUserState, action) { switch (action.type) { + case APP_INIT: case SQUARE_START: + case ADDITION_START: case SQUARE_FINISHED: case ADDITION_FINISHED: return {...state, ...action.user}; diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 6712a9a..9c75a68 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -1,12 +1,12 @@ import React, { useEffect, useState } from "react"; -import { BackHandler, SafeAreaView, Text, TouchableOpacity, View } from "react-native"; +import { BackHandler, SafeAreaView, Text, TextInput, TouchableOpacity, View } from "react-native"; import { styles } from './styles/AppStyles'; import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; import Icons from '../themes/Icons'; import Colors from "../themes/Colors"; import Metrics from "../themes/Metrics"; import Slider from "../components/Slider"; -import { useDispatch } from "react-redux"; +import { useDispatch, useSelector } from "react-redux"; import {squareStartPressed} from '../redux/actions/UserActions'; import { goToScores } from "../redux/actions/SystemActions"; import ModePicker from '../components/ScrollingPicker'; @@ -14,13 +14,15 @@ import ModePicker from '../components/ScrollingPicker'; function Home(){ const dispatch = useDispatch(); const [mode, setMode] = useState('square'); + const userRedux = useSelector((state) => state.user); + const [username, setUsername] = useState(() => {return userRedux.username}) useEffect(() => { BackHandler.addEventListener('hardwareBackPress', () => {return true}); }, []) function onPressStart(){ - dispatch(squareStartPressed(mode)); + dispatch(squareStartPressed(mode, username)); } function onPressHighScores(){ @@ -76,6 +78,19 @@ function Home(){ + + + setUsername(updated)} + /> + 0.0.1a Atonal Software Aug 9 2022 diff --git a/squarenotsquare/src/screens/styles/AppStyles.js b/squarenotsquare/src/screens/styles/AppStyles.js index d2bf232..2f6240a 100644 --- a/squarenotsquare/src/screens/styles/AppStyles.js +++ b/squarenotsquare/src/screens/styles/AppStyles.js @@ -109,6 +109,11 @@ export const styles = StyleSheet.create({ height: Metrics.buttons.answerButton.height }, + usernameInput: { + borderBottomWidth: Metrics.borders.width, + borderBottomColor: Colors.material.grey400 + }, + addQuestionHeight: { height: Metrics.screenSections.addQuestionHeight }, diff --git a/squarenotsquare/src/themes/Icons.js b/squarenotsquare/src/themes/Icons.js index 19d1a79..1e74f22 100644 --- a/squarenotsquare/src/themes/Icons.js +++ b/squarenotsquare/src/themes/Icons.js @@ -5,7 +5,8 @@ class AppIcons { toggleOn: 'toggle-switch-on', toggleOff: 'toggle-switch-off', check: 'check', - plus: 'plus' + plus: 'plus', + edit: 'pencil' }; wrongShapes = { diff --git a/squarenotsquare/src/themes/Metrics.js b/squarenotsquare/src/themes/Metrics.js index 3da47d8..c2ef277 100644 --- a/squarenotsquare/src/themes/Metrics.js +++ b/squarenotsquare/src/themes/Metrics.js @@ -25,7 +25,8 @@ class AppMetrics { this.icons = { splashIcon: this.normalize(100), - buttonIcon: this.normalize(20) + buttonIcon: this.normalize(20), + inputIcon: this.normalize(15) } this.images = { -- 2.20.1 From b254fc86eae60050741dfa5f68b6d616d0496cf5 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 10 Aug 2022 14:13:13 -0500 Subject: [PATCH 123/128] update db unit tests --- squarenotsquare/__mock__/mockMaterialIcons.js | 7 + squarenotsquare/__mock__/mockRealm.js | 135 ------------------ squarenotsquare/__mock__/mockRealmObject.js | 1 + squarenotsquare/__tests__/DB-test.js | 8 +- squarenotsquare/__tests__/Migration-test.js | 2 +- squarenotsquare/jest.config.js | 3 +- 6 files changed, 15 insertions(+), 141 deletions(-) create mode 100644 squarenotsquare/__mock__/mockMaterialIcons.js delete mode 100644 squarenotsquare/__mock__/mockRealm.js diff --git a/squarenotsquare/__mock__/mockMaterialIcons.js b/squarenotsquare/__mock__/mockMaterialIcons.js new file mode 100644 index 0000000..3f3d1b9 --- /dev/null +++ b/squarenotsquare/__mock__/mockMaterialIcons.js @@ -0,0 +1,7 @@ +class MaterialIcon { + loadFont(){ + return true; + } +} + +export default MaterialIcon; \ No newline at end of file diff --git a/squarenotsquare/__mock__/mockRealm.js b/squarenotsquare/__mock__/mockRealm.js deleted file mode 100644 index e9fe715..0000000 --- a/squarenotsquare/__mock__/mockRealm.js +++ /dev/null @@ -1,135 +0,0 @@ -// https://github.com/realm/realm-js/issues/370#issuecomment-270849466 -export default class MockRealm { - constructor(params) { - this.schema = {}; - this.schemaVersion = params.schemaVersion; - this.callbackList = []; - this.data = {}; - this.schemaCallbackList = {}; - params.schema.forEach((schema) => { - this.data[schema.name] = {}; - }); - params.schema.forEach((schema) => { - this.schema[schema.name] = schema; - }); - this.lastLookedUpModel = null; - } - - objects(schemaName) { - this.lastLookedUpModel = schemaName; - const objects = Object.values(this.data[schemaName]); - objects.values = () => objects; - objects.sorted = () => this.compareFunc ? objects.sort(this.compareFunc) : objects.sort(); - objects.addListener = (cb) => { - if (this.schemaCallbackList[schemaName]) { - this.schemaCallbackList[schemaName].push(cb); - } else { - this.schemaCallbackList[schemaName] = [cb]; - } - }; - objects.removeListener = () => {}; - objects.filtered = this.filtered ? this.filtered.bind(this, schemaName) : () => objects; - return objects; - } - - write(fn) { - this.writing = true; - fn(); - this.writing = false; - } - - create(schemaName, object) { - const modelObject = object; - const properties = this.schema[schemaName].schema.properties; - Object.keys(properties).forEach((key) => { - if (modelObject[key] && modelObject[key].model) { - this.data[modelObject[key].model][modelObject[key].id] = this.create( - modelObject[key].model, modelObject[key], - ); - } else if (modelObject[key] && modelObject[key].length && modelObject[key][0].model) { - modelObject[key].forEach((obj) => { - this.data[modelObject[key][0].model][obj.id] = obj; - }); - modelObject[key].filtered = this.filtered ? this.filtered : () => modelObject[key]; - modelObject[key].sorted = () => modelObject[key].sort(); - } else if (modelObject[key] === undefined) { - if (typeof properties[key] === 'object' && properties[key].optional) { - modelObject[key] = null; - } - if (typeof properties[key] === 'object' && ['list', 'linkingObjects'].includes(properties[key].type)) { - modelObject[key] = []; - modelObject[key].filtered = () => []; - modelObject[key].sorted = () => []; - } - } - }); - - this.data[schemaName][modelObject.id] = modelObject; - if (this.writing) { - if (this.schemaCallbackList[schemaName]) { - this.schemaCallbackList[schemaName].forEach(cb => cb(schemaName, { - insertions: { length: 1 }, - modifications: { length: 0 }, - deletions: { length: 0 }, - })); - } - this.callbackList.forEach((cb) => { cb(); }); - } - return modelObject; - } - - objectForPrimaryKey(model, id) { - this.lastLookedUpModel = model; - return this.data[model][id]; - } - - delete(object) { - if (this.lastLookedUpModel || object.model) { - const model = object.model ? object.model : this.lastLookedUpModel - if (Array.isArray(object)) { - object.forEach((item) => { - delete this.data[model][item.id]; - }); - } - delete this.data[model][object.id]; - if (this.writing) { - if (this.schemaCallbackList[model]) { - this.schemaCallbackList[model].forEach(cb => cb(model, { - insertions: { length: 0 }, - modifications: { length: 0 }, - deletions: { length: 1 }, - })); - } - this.callbackList.forEach((cb) => { cb(); }); - } - } - } - - deleteAll() { - Object.keys(this.schema).forEach((key) => { - if (this.writing && this.schemaCallbackList[this.schema[key].name]) { - this.schemaCallbackList[this.schema[key].name].forEach(cb => cb(key, { - insertions: { length: 0 }, - modifications: { length: 0 }, - deletions: { length: Object.values(this.data[this.schema[key].name]).length }, - })); - } - this.data[this.schema[key].name] = {}; - }); - if (this.writing) this.callbackList.forEach((cb) => { cb(); }); - } - - addListener(event, callback) { - this.callbackList.push(callback); - } - - prepareData(schemaName, objects) { - objects.forEach((object) => { - this.create(schemaName, object); - }); - } - } - - MockRealm.Object = class Object { - isValid() { return true; } - }; \ No newline at end of file diff --git a/squarenotsquare/__mock__/mockRealmObject.js b/squarenotsquare/__mock__/mockRealmObject.js index cebcc79..3337e6a 100644 --- a/squarenotsquare/__mock__/mockRealmObject.js +++ b/squarenotsquare/__mock__/mockRealmObject.js @@ -19,6 +19,7 @@ export default class MockRealm{ objects(repoName){ let objects = this[repoName]; objects.filtered = this.filtered ? this.filtered.bind(this, repoName) : () => objects; + objects.sorted = this.sorted ? this.sorted.bind(this, repoName) : () => objects; return objects; } diff --git a/squarenotsquare/__tests__/DB-test.js b/squarenotsquare/__tests__/DB-test.js index a34b916..0907577 100644 --- a/squarenotsquare/__tests__/DB-test.js +++ b/squarenotsquare/__tests__/DB-test.js @@ -30,7 +30,7 @@ test('Realm DB returns null after exceptions', () => { }); test('dbAPI calls system repo getAllSystemValues()', () => { - return initDB('isNull', 'isNull') + return DbAPI.initDB('isNull', 'isNull') .then( () => { let returned = DbAPI.getAllSystemValues(); expect(returned).toEqual({}); @@ -38,7 +38,7 @@ test('dbAPI calls system repo getAllSystemValues()', () => { }); test('dbAPI calls system repo createSystemValue()', () => { - return initDB('isNull', 'isNull') + return DbAPI.initDB('isNull', 'isNull') .then( () => { let returned = DbAPI.createSystemValue(); expect(returned).toEqual(true); @@ -46,7 +46,7 @@ test('dbAPI calls system repo createSystemValue()', () => { }); test('dbAPI calls system repo deleteSystemValue()', () => { - return initDB('isNull', 'isNull') + return DbAPI.initDB('isNull', 'isNull') .then( () => { let returned = DbAPI.deleteSystemValue(); expect(returned).toEqual(true); @@ -54,7 +54,7 @@ test('dbAPI calls system repo deleteSystemValue()', () => { }); test('dbAPI calls system repo getSystemValue()', () => { - return initDB('isNull', 'isNull') + return DbAPI.initDB('isNull', 'isNull') .then( () => { let returned = DbAPI.getSystemValue('notakey'); expect(returned.id).toEqual(null); diff --git a/squarenotsquare/__tests__/Migration-test.js b/squarenotsquare/__tests__/Migration-test.js index 0448971..262e634 100644 --- a/squarenotsquare/__tests__/Migration-test.js +++ b/squarenotsquare/__tests__/Migration-test.js @@ -20,7 +20,7 @@ test('Realm migrates to V1', () => { migratev1(oldRealm, newRealm); expect(newRealm[SystemEntity.name][0].key).toBe('username'); - expect(newRealm[SystemEntity.name][0].value).toBe('changeme'); + expect(newRealm[SystemEntity.name][0].value).toBe('noname'); }) test('Realm halts V1 migration when schema is V2+', () => { diff --git a/squarenotsquare/jest.config.js b/squarenotsquare/jest.config.js index 3b8666c..9a7b2dd 100644 --- a/squarenotsquare/jest.config.js +++ b/squarenotsquare/jest.config.js @@ -8,7 +8,8 @@ module.exports = { // '@react-native-firebase/messaging: '/__mock__/mockFirebase.js', 'react-native-keychain': '/__mock__/mockKeyStore.js', '\\.(jpg|ico|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/__mock__/file.js', - '^(realm)': '/__mock__/mockRealmObject' + '^(realm)': '/__mock__/mockRealmObject', + 'react-native-vector-icons/MaterialCommunityIcons': '/__mock__/mockMaterialIcons' }, transform: { '^.+\\.(ts|tsx)?$': 'ts-jest', -- 2.20.1 From 05060f8329da30bae83b7e9750c090d3b25ecc45 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 10 Aug 2022 14:28:43 -0500 Subject: [PATCH 124/128] update rendering tests --- squarenotsquare/__mock__/mockMaterialIcons.js | 13 ++++++-- squarenotsquare/__tests__/App-test.js | 30 +++++++++++++++---- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/squarenotsquare/__mock__/mockMaterialIcons.js b/squarenotsquare/__mock__/mockMaterialIcons.js index 3f3d1b9..7a1dc3a 100644 --- a/squarenotsquare/__mock__/mockMaterialIcons.js +++ b/squarenotsquare/__mock__/mockMaterialIcons.js @@ -1,7 +1,16 @@ -class MaterialIcon { - loadFont(){ +import React from "react"; +import { View } from "react-native"; + +function MaterialIcon (props) { + function loadFont(){ return true; } + + return ( + + + + ) } export default MaterialIcon; \ No newline at end of file diff --git a/squarenotsquare/__tests__/App-test.js b/squarenotsquare/__tests__/App-test.js index 6ecec53..07a1366 100644 --- a/squarenotsquare/__tests__/App-test.js +++ b/squarenotsquare/__tests__/App-test.js @@ -1,5 +1,7 @@ import 'react-native'; import React from 'react'; +import { Provider } from 'react-redux'; +import ConfigStore from '../src/redux/CreateStore'; // Note: test renderer must be required after react-native. import renderer from 'react-test-renderer'; @@ -11,25 +13,41 @@ import Settings from '../src/screens/Settings'; import Splash from '../src/screens/Splash'; it('renders square stack', () => { - renderer.create(); + const mockStore = ConfigStore; + renderer.create(); }); it('renders game component', () => { - renderer.create(); + const mockStore = ConfigStore; + return renderer.create( + + + ); }); it('renders highscore component', () => { - renderer.create(); + const mockStore = ConfigStore; + return renderer.create( + + + + ); }); it('renders home component', () => { - renderer.create(); + const mockStore = ConfigStore; + return renderer.create( + + + + ); }); it('renders settings component', () => { - renderer.create(); + const mockStore = ConfigStore; + return renderer.create(); }); it('renders splash component', () => { - renderer.create(); + return renderer.create(); }); \ No newline at end of file -- 2.20.1 From 294a04550515569db720ffbc2ffe16ea6ce1cc0e Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 10 Aug 2022 14:31:48 -0500 Subject: [PATCH 125/128] unused component --- squarenotsquare/__tests__/App-test.js | 6 +----- squarenotsquare/src/navigation/SquareStack.js | 6 ------ squarenotsquare/src/screens/Settings.js | 14 -------------- 3 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 squarenotsquare/src/screens/Settings.js diff --git a/squarenotsquare/__tests__/App-test.js b/squarenotsquare/__tests__/App-test.js index 07a1366..9d4eafd 100644 --- a/squarenotsquare/__tests__/App-test.js +++ b/squarenotsquare/__tests__/App-test.js @@ -11,6 +11,7 @@ import HighScore from '../src/screens/HighScore'; import Home from '../src/screens/Home'; import Settings from '../src/screens/Settings'; import Splash from '../src/screens/Splash'; +jest.useFakeTimers() it('renders square stack', () => { const mockStore = ConfigStore; @@ -43,11 +44,6 @@ it('renders home component', () => { ); }); -it('renders settings component', () => { - const mockStore = ConfigStore; - return renderer.create(); -}); - it('renders splash component', () => { return renderer.create(); }); \ No newline at end of file diff --git a/squarenotsquare/src/navigation/SquareStack.js b/squarenotsquare/src/navigation/SquareStack.js index 379fa99..ba56a1d 100644 --- a/squarenotsquare/src/navigation/SquareStack.js +++ b/squarenotsquare/src/navigation/SquareStack.js @@ -6,7 +6,6 @@ import {SquareRef} from './SquareNav'; import Home from '../screens/Home'; import Game from '../screens/Game'; import HighScore from '../screens/HighScore'; -import Settings from '../screens/Settings'; import Splash from '../screens/Splash'; import Score from '../screens/Score'; import AdditionGame from '../screens/AdditionGame'; @@ -34,11 +33,6 @@ function SquareStack() { component={HighScore} options={noHeader} /> - - test - - ); -} - -export default Settings; \ No newline at end of file -- 2.20.1 From af253eed53ccffee2e14abd81027fde3b654a166 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 10 Aug 2022 14:33:56 -0500 Subject: [PATCH 126/128] fixed app rendering unit tests --- squarenotsquare/__tests__/App-test.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/squarenotsquare/__tests__/App-test.js b/squarenotsquare/__tests__/App-test.js index 9d4eafd..ba745e2 100644 --- a/squarenotsquare/__tests__/App-test.js +++ b/squarenotsquare/__tests__/App-test.js @@ -9,7 +9,6 @@ import SquareStack from '../src/navigation/SquareStack'; import Game from '../src/screens/Game'; import HighScore from '../src/screens/HighScore'; import Home from '../src/screens/Home'; -import Settings from '../src/screens/Settings'; import Splash from '../src/screens/Splash'; jest.useFakeTimers() @@ -20,7 +19,7 @@ it('renders square stack', () => { it('renders game component', () => { const mockStore = ConfigStore; - return renderer.create( + renderer.create( ); @@ -28,7 +27,7 @@ it('renders game component', () => { it('renders highscore component', () => { const mockStore = ConfigStore; - return renderer.create( + renderer.create( @@ -37,7 +36,7 @@ it('renders highscore component', () => { it('renders home component', () => { const mockStore = ConfigStore; - return renderer.create( + renderer.create( @@ -45,5 +44,5 @@ it('renders home component', () => { }); it('renders splash component', () => { - return renderer.create(); + renderer.create(); }); \ No newline at end of file -- 2.20.1 From d30405e5bac82064d15f0350c39fd365155fffd1 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 10 Aug 2022 14:37:46 -0500 Subject: [PATCH 127/128] remove placeholder timer on high score screen --- squarenotsquare/src/screens/HighScore.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/squarenotsquare/src/screens/HighScore.js b/squarenotsquare/src/screens/HighScore.js index 1da0ceb..cf4ec72 100644 --- a/squarenotsquare/src/screens/HighScore.js +++ b/squarenotsquare/src/screens/HighScore.js @@ -20,9 +20,7 @@ function HighScore(){ if (!scoresLoaded) { loadScores() .then(() => { - setTimeout( () => { - setScoresLoaded(true); - }, 1000) + setScoresLoaded(true); }); } }, [scoresLoaded]) -- 2.20.1 From 27d32068363f2107735c3f1234e0b80f080da876 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Wed, 10 Aug 2022 14:42:50 -0500 Subject: [PATCH 128/128] build date --- squarenotsquare/src/screens/Home.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/squarenotsquare/src/screens/Home.js b/squarenotsquare/src/screens/Home.js index 9c75a68..911fc96 100644 --- a/squarenotsquare/src/screens/Home.js +++ b/squarenotsquare/src/screens/Home.js @@ -93,7 +93,7 @@ function Home(){ - 0.0.1a Atonal Software Aug 9 2022 + 0.0.1a Atonal Software Aug 10 2022 -- 2.20.1