diff --git a/api/package.json b/api/package.json index ed517bd..382b477 100644 --- a/api/package.json +++ b/api/package.json @@ -10,6 +10,7 @@ "@corecodeio/libraries": "^1.0.5", "apollo-server-express": "^2.16.1", "awesome-phonenumber": "^2.37.1", + "axios": "^0.21.0", "convict": "^6.0.0", "express": "^4.17.1", "express-jwt": "^6.0.0", diff --git a/api/src/__test__/feature/onboarding/resolver/registerStore.test.ts b/api/src/__test__/feature/onboarding/resolver/registerStore.test.ts new file mode 100644 index 0000000..ef5ea3a --- /dev/null +++ b/api/src/__test__/feature/onboarding/resolver/registerStore.test.ts @@ -0,0 +1,55 @@ +import { MutationVerifyPhoneNumberCode } from "@corecodeio/libraries/api/onboarding"; +import { Dependencies } from "@corecodeio/libraries/di"; +import { createTestClient } from "apollo-server-testing"; +import axios from "axios"; +import * as faker from "faker"; +import { createApolloServer } from "../../../../server"; +import { TwilioSMSVerificationInjectionKey } from "../../../../util/twilio/InjectionKeys"; +import { ISMSVerification } from "../../../../util/twilio/interface/ISMSVerification"; +import { smsVerificationMock } from "../../../mock/smsVerificationMock"; + +const dependencies = new Dependencies(); +const apolloServer = createApolloServer(dependencies); + +dependencies.override( + TwilioSMSVerificationInjectionKey, + smsVerificationMock +); + +describe("registerStore", () => { + test("success", async () => { + const { mutate } = createTestClient(apolloServer); + + const res = await mutate({ + mutation: MutationVerifyPhoneNumberCode, + variables: { + input: { + phoneNumber: faker.phone.phoneNumber("+5023#######"), + code: "123", + }, + }, + }); + + const token = res.data.verifyPhoneNumberCode.token; + + const result = await axios("http://localhost:8001/graphql", { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + data: JSON.stringify({ + query: ` + mutation RegisterStore($input: RegisterStoreInput!) { + registerStore(input: $input) + } + `, + variables: { + input: { + url: "https://www.amazon.com", + }, + }, + }), + }); + }); +}); diff --git a/api/src/__test__/feature/onboarding/resolver/sendPhoneNumberVerificationCode.test.ts b/api/src/__test__/feature/onboarding/resolver/sendPhoneNumberVerificationCode.test.ts index cf289ed..76bb6ad 100644 --- a/api/src/__test__/feature/onboarding/resolver/sendPhoneNumberVerificationCode.test.ts +++ b/api/src/__test__/feature/onboarding/resolver/sendPhoneNumberVerificationCode.test.ts @@ -5,14 +5,15 @@ import * as faker from "faker"; import { createApolloServer } from "../../../../server"; import { TwilioSMSVerificationInjectionKey } from "../../../../util/twilio/InjectionKeys"; import { ISMSVerification } from "../../../../util/twilio/interface/ISMSVerification"; +import { smsVerificationMock } from "../../../mock/smsVerificationMock"; const dependencies = new Dependencies(); const apolloServer = createApolloServer(dependencies); -dependencies.override(TwilioSMSVerificationInjectionKey, { - send: jest.fn(() => Promise.resolve(true)), - verify: jest.fn(() => Promise.resolve(true)), -}); +dependencies.override( + TwilioSMSVerificationInjectionKey, + smsVerificationMock +); describe("sendPhoneNumberVerificationCode", () => { test("Should return a response with code 200", async () => { diff --git a/api/src/__test__/feature/onboarding/resolver/verifyPhoneNumberCode.test.ts b/api/src/__test__/feature/onboarding/resolver/verifyPhoneNumberCode.test.ts index 99a5596..e79466a 100644 --- a/api/src/__test__/feature/onboarding/resolver/verifyPhoneNumberCode.test.ts +++ b/api/src/__test__/feature/onboarding/resolver/verifyPhoneNumberCode.test.ts @@ -5,14 +5,15 @@ import * as faker from "faker"; import { createApolloServer } from "../../../../server"; import { TwilioSMSVerificationInjectionKey } from "../../../../util/twilio/InjectionKeys"; import { ISMSVerification } from "../../../../util/twilio/interface/ISMSVerification"; +import { smsVerificationMock } from "../../../mock/smsVerificationMock"; const dependencies = new Dependencies(); const apolloServer = createApolloServer(dependencies); -dependencies.override(TwilioSMSVerificationInjectionKey, { - send: jest.fn(() => Promise.resolve(true)), - verify: jest.fn(() => Promise.resolve(true)), -}); +dependencies.override( + TwilioSMSVerificationInjectionKey, + smsVerificationMock +); describe("verifyPhoneNumberCode", () => { test("Should return a response of type OnboardingSession", async () => { diff --git a/api/src/__test__/mock/smsVerificationMock.ts b/api/src/__test__/mock/smsVerificationMock.ts new file mode 100644 index 0000000..662cde7 --- /dev/null +++ b/api/src/__test__/mock/smsVerificationMock.ts @@ -0,0 +1,4 @@ +export const smsVerificationMock = { + send: jest.fn(() => Promise.resolve(true)), + verify: jest.fn(() => Promise.resolve(true)), +}; diff --git a/api/src/feature/onboarding/controller/OnboardingController.ts b/api/src/feature/onboarding/controller/OnboardingController.ts index 04599af..38af20c 100644 --- a/api/src/feature/onboarding/controller/OnboardingController.ts +++ b/api/src/feature/onboarding/controller/OnboardingController.ts @@ -20,10 +20,9 @@ export class OnboardingController implements IOnboardingController { } async verifyPhoneNumberCode({ phoneNumber, code }) { - const isTwilioVerified = await this.twilioSMSVerification.verify( - phoneNumber, - code - ); + const isTwilioVerified = this.verifiedPhoneNumbers.includes(phoneNumber) + ? true + : await this.twilioSMSVerification.verify(phoneNumber, code); if (!isTwilioVerified) { throw new Error("Error al verificar"); @@ -50,7 +49,7 @@ export class OnboardingController implements IOnboardingController { } async sendPhoneNumberVerificationCode({ phoneNumber }) { - if (await this.verifiedPhoneNumbers.includes(phoneNumber)) { + if (this.verifiedPhoneNumbers.includes(phoneNumber)) { return true; } diff --git a/api/src/feature/onboarding/resolver/index.ts b/api/src/feature/onboarding/resolver/index.ts index 401c1dc..7f5f938 100644 --- a/api/src/feature/onboarding/resolver/index.ts +++ b/api/src/feature/onboarding/resolver/index.ts @@ -1,3 +1,4 @@ +import { registerStore } from "./registerStore"; import { sendPhoneNumberVerificationCode } from "./sendPhoneNumberVerificationCode"; import { verifyPhoneNumberCode } from "./verifyPhoneNumberCode"; @@ -7,4 +8,5 @@ export const queries = { export const mutations = { verifyPhoneNumberCode, + registerStore, }; diff --git a/api/src/feature/onboarding/resolver/registerStore.ts b/api/src/feature/onboarding/resolver/registerStore.ts new file mode 100644 index 0000000..6a5b0f7 --- /dev/null +++ b/api/src/feature/onboarding/resolver/registerStore.ts @@ -0,0 +1,13 @@ +import { MutationResolvers } from "@corecodeio/libraries/api"; +import { IContext } from "../../../server/interface/IContext"; + +export const registerStore: MutationResolvers< + IContext +>["registerStore"] = async (parent, { input }, { dependencies, req }) => { + try { + // req.headers.authorization; + return true; + } catch (error) { + return error; + } +}; diff --git a/api/src/server/createApolloServer.ts b/api/src/server/createApolloServer.ts index b912caa..1516e87 100644 --- a/api/src/server/createApolloServer.ts +++ b/api/src/server/createApolloServer.ts @@ -1,14 +1,14 @@ -import { IDependencies } from "@corecodeio/libraries/di"; -import { ApolloServer } from "apollo-server-express"; -import { IContext } from "./interface/IContext"; -import { resolvers } from "./resolvers"; -import { schema as typeDefs } from "./schema"; +import { IDependencies } from '@corecodeio/libraries/di'; +import { ApolloServer } from 'apollo-server-express'; +import { IContext } from './interface/IContext'; +import { resolvers } from './resolvers'; +import { schema as typeDefs } from './schema'; export const createApolloServer = (dependencies: IDependencies) => - new ApolloServer({ - typeDefs, - resolvers, - context: { - dependencies, - } as IContext, - }); + new ApolloServer({ + typeDefs, + resolvers, + context: (expressContext) => { + return { ...expressContext, dependencies } as IContext; + }, + }); diff --git a/api/src/server/interface/IContext.ts b/api/src/server/interface/IContext.ts index 945160d..109acbe 100644 --- a/api/src/server/interface/IContext.ts +++ b/api/src/server/interface/IContext.ts @@ -1,5 +1,6 @@ -import { IDependencies } from "@corecodeio/libraries/di"; +import { IDependencies } from '@corecodeio/libraries/di'; +import { ExpressContext } from 'apollo-server-express/dist/ApolloServer'; -export interface IContext { - dependencies: IDependencies; +export interface IContext extends ExpressContext { + dependencies: IDependencies; } diff --git a/api/src/server/schema.ts b/api/src/server/schema.ts index 572068e..adfdba9 100644 --- a/api/src/server/schema.ts +++ b/api/src/server/schema.ts @@ -1,28 +1,30 @@ -import { gql } from "apollo-server-express"; +import { gql } from 'apollo-server-express'; export const schema = gql` - type Query { - sendPhoneNumberVerificationCode( - input: SendPhoneNumberVerificatioCodeInput! - ): Boolean! - } + type Query { + sendPhoneNumberVerificationCode(input: SendPhoneNumberVerificatioCodeInput!): Boolean! + } - type Mutation { - verifyPhoneNumberCode( - input: VerifyPhoneNumberCodeInput! - ): OnboardingSession! - } + type Mutation { + verifyPhoneNumberCode(input: VerifyPhoneNumberCodeInput!): OnboardingSession! - input SendPhoneNumberVerificatioCodeInput { - phoneNumber: String! - } + registerStore(input: RegisterStoreInput!): Boolean! + } - input VerifyPhoneNumberCodeInput { - phoneNumber: String! - code: String! - } + input SendPhoneNumberVerificatioCodeInput { + phoneNumber: String! + } - type OnboardingSession { - token: String! - } + input VerifyPhoneNumberCodeInput { + phoneNumber: String! + code: String! + } + + input RegisterStoreInput { + url: String! + } + + type OnboardingSession { + token: String! + } `; diff --git a/api/src/util/config.ts b/api/src/util/config.ts index 60cbd57..c2efff1 100644 --- a/api/src/util/config.ts +++ b/api/src/util/config.ts @@ -14,7 +14,7 @@ const config = convict({ format: "*", default: Array(15) .fill(null) - .map((_, i) => `+5020000000${i}`), + .map((_, i) => `+5023000000${i}`), env: "VERIFIED_PHONE_NUMBERS", }, }, diff --git a/api/yarn.lock b/api/yarn.lock index d936ef7..bdd412f 100644 --- a/api/yarn.lock +++ b/api/yarn.lock @@ -2029,6 +2029,13 @@ axios@^0.19.2: dependencies: follow-redirects "1.5.10" +axios@^0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.0.tgz#26df088803a2350dff2c27f96fef99fe49442aca" + integrity sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw== + dependencies: + follow-redirects "^1.10.0" + babel-jest@^26.1.0: version "26.1.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.1.0.tgz#b20751185fc7569a0f135730584044d1cb934328" @@ -3387,6 +3394,11 @@ follow-redirects@1.5.10: dependencies: debug "=3.1.0" +follow-redirects@^1.10.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" diff --git a/native/App.tsx b/native/App.tsx index d3f44ef..cebb00d 100644 --- a/native/App.tsx +++ b/native/App.tsx @@ -6,16 +6,36 @@ import { DependencyContext, } from "./src/common/context/DependencyContext"; import OnboardingNavigator from "./src/navigation/navigator/OnboardingNavigator"; +import { AuthTokenInjectionKey } from "./src/util/auth/InjectionKey"; -const client = new ApolloClient({ - uri: `http://localhost:8001/graphql`, - cache: new InMemoryCache(), -}); +/** + * rxjs observer https://rxjs-dev.firebaseapp.com/guide/overview + * behavior subject + * useState + * useEffect + */ + +export const App: React.FC = () => { + const authToken = dependencies.provide(AuthTokenInjectionKey); + + const token = authToken.useAuthToken(); + + const getApolloClient = () => { + const options = { + uri: `http://49f093574f64.ngrok.io/graphql`, + cache: new InMemoryCache(), + }; + + if (Boolean(token)) { + options["headers"] = { authorization: `Bearer ${token}` }; + } + + return new ApolloClient(options); + }; -export const App: React.FC<{}> = () => { return ( - + diff --git a/native/package.json b/native/package.json index 6d5c1e3..0855c32 100644 --- a/native/package.json +++ b/native/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@apollo/client": "^3.1.3", - "@corecodeio/libraries": "1.0.5", + "@corecodeio/libraries": "file:../../libraries/lib", "@react-native-community/masked-view": "0.1.10", "@react-navigation/native": "^5.7.1", "@react-navigation/stack": "^5.7.1", @@ -26,11 +26,11 @@ "react-native": "https://github.com/expo/react-native/archive/sdk-38.0.2.tar.gz", "react-native-confirmation-code-field": "^6.5.0", "react-native-gesture-handler": "~1.6.0", + "react-native-phone-number-input": "^1.1.0", "react-native-reanimated": "~1.9.0", "react-native-safe-area-context": "~3.0.7", "react-native-screens": "~2.9.0", "react-native-web": "~0.11.7", - "react-phone-number-input": "^3.0.25", "rxjs": "^6.6.3", "styled-components": "^5.1.1", "styled-system": "^5.1.5" @@ -39,7 +39,6 @@ "@babel/core": "^7.8.6", "@types/react": "~16.9.41", "@types/react-native": "~0.62.13", - "@types/react-phone-number-input": "^3.0.5", "jest-expo": "^38.0.2", "typescript": "~3.9.5" }, diff --git a/native/src/feature/onboarding/component/CodeInput.tsx b/native/src/feature/onboarding/component/CodeInput.tsx index 23568d7..2dcd6f0 100644 --- a/native/src/feature/onboarding/component/CodeInput.tsx +++ b/native/src/feature/onboarding/component/CodeInput.tsx @@ -8,7 +8,7 @@ import { } from "react-native-confirmation-code-field"; import styles from "./styles"; -const CELL_COUNT = 6; +export const CELL_COUNT = 6; type Props = { onChangeText: (text: string) => void | undefined; @@ -22,7 +22,7 @@ const CodeInput: React.FC = ({ onChangeText }) => { setValue, }); - const onSetVerifcationCode = (code: string) => { + const onSetVerificationCode = (code: string) => { onChangeText(code); setValue(code); }; @@ -32,7 +32,7 @@ const CodeInput: React.FC = ({ onChangeText }) => { {...props} ref={ref} value={value} - onChangeText={onSetVerifcationCode} + onChangeText={onSetVerificationCode} cellCount={CELL_COUNT} rootStyle={styles.codeFiledRoot} keyboardType="number-pad" diff --git a/native/src/feature/onboarding/component/IntlTelInput.tsx b/native/src/feature/onboarding/component/IntlTelInput.tsx index dd89153..a72830a 100644 --- a/native/src/feature/onboarding/component/IntlTelInput.tsx +++ b/native/src/feature/onboarding/component/IntlTelInput.tsx @@ -1,27 +1,56 @@ -import React, { useState } from "react"; -import PhoneInput, { isValidPhoneNumber } from "react-phone-number-input"; -import "react-phone-number-input/style.css"; +import React from "react"; +import { StyleSheet } from "react-native"; +import PhoneInput from "react-native-phone-number-input"; type Props = { onSetPhoneNumber: (text: string) => void }; const IntlTelInput: React.FC = ({ onSetPhoneNumber }) => { - const [phoneNumber, setPhoneNumber] = useState(""); + const [value, setValue] = React.useState(""); + const [, setFormattedValue] = React.useState(""); + const phoneInput = React.useRef(null); + const onChangePhoneNumber = (number: string) => { - setPhoneNumber(number); - { - isValidPhoneNumber(number) - ? onSetPhoneNumber(number) - : onSetPhoneNumber(""); - } + setValue(number); + }; + + const onChangeFormattedText = (text: string) => { + setFormattedValue(text); + onSetPhoneNumber(text); }; + return ( ); }; +const styles = StyleSheet.create({ + textInput: { + fontSize: 12, + }, + container: { + marginLeft: 19, + justifyContent: "center", + alignItems: "center", + }, + textContainer: { + flex: 1, + justifyContent: "center", + alignItems: "center", + backgroundColor: "#fff", + }, +}); + export default IntlTelInput; diff --git a/native/src/feature/onboarding/model/Onboarding.ts b/native/src/feature/onboarding/model/Onboarding.ts index 0006d1b..fc224e4 100644 --- a/native/src/feature/onboarding/model/Onboarding.ts +++ b/native/src/feature/onboarding/model/Onboarding.ts @@ -1,14 +1,18 @@ -import { LazyQueryResult, useLazyQuery } from "@apollo/client"; +import { + LazyQueryResult, + MutationResult, + useLazyQuery, + useMutation, +} from "@apollo/client"; import { Mutation, MutationVerifyPhoneNumberCodeArgs, - OnboardingSession, Query, QuerySendPhoneNumberVerificationCodeArgs, } from "@corecodeio/libraries/api"; import { + MutationVerifyPhoneNumberCode, QuerySendPhoneNumberVerificationCode, - QueryVerifyPhoneNumberCode, } from "@corecodeio/libraries/api/onboarding"; import React from "react"; import { AuthToken } from "../../../util/auth/model/AuthToken"; @@ -52,22 +56,21 @@ export class Onboarding { executeVerifyPhoneNumberCode: ( input: MutationVerifyPhoneNumberCodeArgs ) => void; - result: Mutation["verifyPhoneNumberCode"] | undefined; + result: Mutation["verifyPhoneNumberCode"] | null | undefined; error: Error | null; - queryResult: LazyQueryResult< - Mutation["verifyPhoneNumberCode"], - MutationVerifyPhoneNumberCodeArgs - >; + queryResult: MutationResult>; } { const [error, setError] = React.useState(null); - - const [execute, queryResult] = useLazyQuery< - Mutation["verifyPhoneNumberCode"], + const [execute, queryResult] = useMutation< + Pick, MutationVerifyPhoneNumberCodeArgs - >(QueryVerifyPhoneNumberCode); + >(MutationVerifyPhoneNumberCode); - if (Boolean(queryResult?.data?.token)) { - this.authToken.set((queryResult.data as OnboardingSession).token); + if (Boolean(queryResult?.data?.verifyPhoneNumberCode?.token)) { + this.authToken.set( + (queryResult.data as Pick) + .verifyPhoneNumberCode.token + ); } return { @@ -82,7 +85,7 @@ export class Onboarding { setError(new Error("Algo salió mal. Intenta de nuevo")); } }, - result: queryResult.data, + result: queryResult?.data?.verifyPhoneNumberCode, error: queryResult.error ?? error, queryResult, }; diff --git a/native/src/feature/onboarding/screen/SendPhoneNumberVerificationCode.tsx b/native/src/feature/onboarding/screen/SendPhoneNumberVerificationCode.tsx index 0f3c1a3..e6ea387 100644 --- a/native/src/feature/onboarding/screen/SendPhoneNumberVerificationCode.tsx +++ b/native/src/feature/onboarding/screen/SendPhoneNumberVerificationCode.tsx @@ -61,9 +61,7 @@ export const SendPhoneNumberVerificationCode: React.FC = ({ const onSendPhoneNumberVerificationCode = async () => { try { await executeSendPhoneNumberVerificationCode(args); - } catch (error) { - // TODO handle error - } + } catch (error) {} }; return ( @@ -72,6 +70,7 @@ export const SendPhoneNumberVerificationCode: React.FC = ({ Selecciona tu código de país e ingresa tu numero de teléfono + {/* onSetPhoneNumber(e.target.valueOf())} /> */} {sendPhoneNumberVerificationCodeError && ( Error al enviar el SMS. Intenta de nuevo. diff --git a/native/src/feature/onboarding/screen/VerifyPhoneNumberCode.tsx b/native/src/feature/onboarding/screen/VerifyPhoneNumberCode.tsx index 02fced0..d96fc2e 100644 --- a/native/src/feature/onboarding/screen/VerifyPhoneNumberCode.tsx +++ b/native/src/feature/onboarding/screen/VerifyPhoneNumberCode.tsx @@ -18,7 +18,7 @@ import { import { DependencyContext } from "../../../common/context/DependencyContext"; import { OnboardingStackScreenName } from "../../../navigation/model/OnboardingStackScreenName"; import { OnboardingStackParamList } from "../../../navigation/types/OnboardingStackParamList"; -import CodeInput from "../component/CodeInput"; +import CodeInput, { CELL_COUNT } from "../component/CodeInput"; import { OnboardingInjectionKey } from "../InjectionKey"; type Props = { @@ -40,10 +40,7 @@ export const VerifyPhoneNumberCode: React.FC = ({ const onboarding = dependencies.provide(OnboardingInjectionKey); const [args, setInput] = React.useState({ - input: { - phoneNumber: route.params.phoneNumber, - code: "", - }, + input: { phoneNumber: route.params.phoneNumber, code: "" }, }); const { @@ -66,6 +63,12 @@ export const VerifyPhoneNumberCode: React.FC = ({ handleError(); }, [error]); + React.useEffect(() => { + if (args.input.code.length === CELL_COUNT) { + onSendPhoneNumberVerificationCode(); + } + }, [args.input.code]); + const handleError = () => { Alert.alert("Oops!", error?.message, [ { text: "Entendido", onPress: () => null }, @@ -77,7 +80,11 @@ export const VerifyPhoneNumberCode: React.FC = ({ }; const onSendPhoneNumberVerificationCode = async () => { - await executeVerifyPhoneNumberCode(args); + try { + await executeVerifyPhoneNumberCode(args); + } catch (error) { + console.log(error); // TODO handle error + } }; return ( @@ -95,7 +102,7 @@ export const VerifyPhoneNumberCode: React.FC = ({ MariaApp Introduce el código que hemos enviado a tu{"\n"} - número +502 01020304 + número {args.input.phoneNumber} diff --git a/native/src/util/auth/model/AuthToken.ts b/native/src/util/auth/model/AuthToken.ts index 2ff2405..9d1fde1 100644 --- a/native/src/util/auth/model/AuthToken.ts +++ b/native/src/util/auth/model/AuthToken.ts @@ -1,3 +1,5 @@ +import React from "react"; +import { BehaviorSubject, Observable } from "rxjs"; import { Store } from "../../store/model/Store"; enum StoreKeyName { @@ -6,12 +8,29 @@ enum StoreKeyName { export class AuthToken { private store: Store; + private observable: Observable = new Observable(); constructor(store: Store) { this.store = store; } async set(token: string) { + const behavior = new BehaviorSubject(token); + this.observable = behavior.asObservable(); await this.store.set(StoreKeyName.authToken, token); + behavior.next(token); + } + + async get() { + return await this.store.get(StoreKeyName.authToken); + } + + useAuthToken() { + const [token, setToken] = React.useState(""); + const subscription = this.observable.subscribe(setToken); + + React.useEffect(() => subscription.unsubscribe(), []); + + return token; } } diff --git a/native/src/util/store/model/Store.ts b/native/src/util/store/model/Store.ts index 81ea41c..2fe95a0 100644 --- a/native/src/util/store/model/Store.ts +++ b/native/src/util/store/model/Store.ts @@ -4,4 +4,8 @@ export class Store { async set(key: string, value: string) { await SecureStore.setItemAsync(key, value); } + + async get(key: string) { + return await SecureStore.getItemAsync(key); + } } diff --git a/native/yarn.lock b/native/yarn.lock index 18589e1..5c9a55f 100644 --- a/native/yarn.lock +++ b/native/yarn.lock @@ -1020,6 +1020,15 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@callstack/react-theme-provider@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@callstack/react-theme-provider/-/react-theme-provider-3.0.3.tgz#f964dda28cd6e731c3fbcf916b0579c6f9fb2db7" + integrity sha512-B+9JBK7zsND/AdVkjwHvbb4cR05fJofLFG30hOeoXke8WkKAWN36yFljauAhI8qwlXlGFGZMYE1wQvsqBSccrA== + dependencies: + "@types/hoist-non-react-statics" "^3.3.1" + deepmerge "^3.2.0" + hoist-non-react-statics "^3.3.0" + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -1028,11 +1037,10 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@corecodeio/libraries@1.0.5": - version "1.0.5" - resolved "https://npm.pkg.github.com/download/@corecodeio/libraries/1.0.5/29b2a406b765654e6029f384e9a9065c0d60f76e68962a2cd3074964ff96ca48#f363ca8dda179ad983db92a3f446fddebf2944ef" - integrity sha512-MbfVN7gIC1ePCODG4Wi8d052/oQkU7kJDfMlK1aH3W1JlXnoJDE6DhtlB811rB1xAWkQ8PKdvBDcnFcNlkcDwQ== +"@corecodeio/libraries@file:../../libraries/lib": + version "1.0.7" dependencies: + awesome-phonenumber "^2.39.0" graphql-tag "^2.11.0" "@egjs/hammerjs@^2.0.17": @@ -2060,7 +2068,7 @@ resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.36.tgz#17ce0a235e9ffbcdcdf5095646b374c2bf615a4c" integrity sha512-7TUK/k2/QGpEAv/BCwSHlYu3NXZhQ9ZwBYpzr9tjlPIL2C5BeGhH3DmVavRx3ZNyELX5TLC91JTz/cen6AAtIQ== -"@types/hoist-non-react-statics@*": +"@types/hoist-non-react-statics@*", "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== @@ -2517,6 +2525,11 @@ available-typed-arrays@^1.0.0, available-typed-arrays@^1.0.2: dependencies: array-filter "^1.0.0" +awesome-phonenumber@^2.39.0: + version "2.39.0" + resolved "https://registry.yarnpkg.com/awesome-phonenumber/-/awesome-phonenumber-2.39.0.tgz#7a6f3ef04df7e6168407ab73ac68a882e04ef5e7" + integrity sha512-GV1GZ/AZfsBU6EIYF4TlFhOuZus9IOT6wyVmFmFZvpUFCwsx8TRsyhEOhPxSUSdPgd/h4RehQmwgrWI/S26WKw== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -4216,6 +4229,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +fuse.js@3.4.5: + version "3.4.5" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.4.5.tgz#8954fb43f9729bd5dbcb8c08f251db552595a7a6" + integrity sha512-s9PGTaQIkT69HaeoTVjwGsLfb8V8ScJLx5XGFcKHg0MqLUH/UZ4EKOtqtXX9k7AFqCGxD1aJmYb8Q5VYDibVRQ== + gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" @@ -4287,6 +4305,11 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +google-libphonenumber@^3.2.10: + version "3.2.13" + resolved "https://registry.yarnpkg.com/google-libphonenumber/-/google-libphonenumber-3.2.13.tgz#8f41f2ce1739d40e2b9ebccc75dca95474cdf0b5" + integrity sha512-USnpjJkD8St+wyshy154lF74JeauNCd8vrcusSlWjSFWitXzl7ZSuCunA/XxeVLqBv6DShrSfFMYdwGZ7x4hOw== + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" @@ -5676,6 +5699,11 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= + lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.0: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" @@ -6098,6 +6126,13 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.5" +modal-react-native-web@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/modal-react-native-web/-/modal-react-native-web-0.2.0.tgz#5daaa76213218fd25df739a267b11aed37e8c0c2" + integrity sha512-sC0/jL3ZL4bGtv1VS43TnrH7/FHUqgb7IU3VYWNDzuR223fYlpG5Gc974GsTP172Vi+lnnBL/G70xONmaggxeQ== + dependencies: + warning "^4.0.1" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -6160,6 +6195,13 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-emoji@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" + integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== + dependencies: + lodash.toarray "^4.4.0" + node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -6804,6 +6846,11 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== +react-async-hook@3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/react-async-hook/-/react-async-hook-3.6.1.tgz#aed3e492d87319392865c83ed7cef3609e2a7fef" + integrity sha512-YWBB2feVQF79t5u2raMPHlZ8975Jds+guCvkWVC4kRLDlSCouLsYpQm4DGSqPeHvoHYVVcDfqNayLZAXQmnxnw== + react-devtools-core@^4.0.6: version "4.8.2" resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.8.2.tgz#4465f2e8de7795564aa20f28b2f3a9737586db23" @@ -6841,6 +6888,18 @@ react-native-confirmation-code-field@^6.5.0: resolved "https://registry.yarnpkg.com/react-native-confirmation-code-field/-/react-native-confirmation-code-field-6.5.0.tgz#f5579ee66b3f902724f5596a7ea3c87308c4d6d9" integrity sha512-thOctQtpkx5bcXIj6+S+gIKw7Z/jMBFf9FtqkiRQaZI1+IoMoA+n5CK4aYoosPQW4oAPTivL1mxOyA8T1kqmtA== +react-native-country-picker-modal@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/react-native-country-picker-modal/-/react-native-country-picker-modal-1.11.0.tgz#14056cbbd83477549aa9b5449570fff4ef3c7d5d" + integrity sha512-4+WXRlCaDIWgN0m+zIEznliY+ZHlAnkBVd14WojOALE2DcXTCuWERbF0Z8ST+/6jwxkkYTNAkk3cbIP0V+7ZoQ== + dependencies: + "@callstack/react-theme-provider" "3.0.3" + fuse.js "3.4.5" + modal-react-native-web "0.2.0" + node-emoji "1.10.0" + prop-types "15.7.2" + react-async-hook "3.6.1" + react-native-gesture-handler@~1.6.0: version "1.6.1" resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-1.6.1.tgz#678e2dce250ed66e93af409759be22cd6375dd17" @@ -6856,6 +6915,14 @@ react-native-iphone-x-helper@^1.2.1: resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.2.1.tgz#645e2ffbbb49e80844bb4cbbe34a126fda1e6772" integrity sha512-/VbpIEp8tSNNHIvstuA3Swx610whci1Zpc9mqNkqn14DkMbw+ORviln2u0XyHG1kPvvwTNGZY6QpeFwxYaSdbQ== +react-native-phone-number-input@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/react-native-phone-number-input/-/react-native-phone-number-input-1.1.0.tgz#6b77b27a2342198f9d5bc62c01f8cfbc992457c7" + integrity sha512-PKbWN8LGj193xhsy0cq9n48r2TAunrqAnjoAQC2OLcJW/581S9auPh8IdsOi9xNXKiGFH64HoxUo/1n3sOqPfw== + dependencies: + google-libphonenumber "^3.2.10" + react-native-country-picker-modal "^1.11.0" + react-native-reanimated@~1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-1.9.0.tgz#38676c99dd585504fdc7331efb45e5f48ec7339a" @@ -8342,6 +8409,13 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +warning@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"