diff --git a/.circleci/config.yml b/.circleci/config.yml index c388a1ce..faa040a9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -29,19 +29,17 @@ jobs: paths: - node_modules - - run: - name: jest tests - command: | - mkdir -p test-results/jest - yarn run test - environment: - JEST_JUNIT_OUTPUT: test-results/jest/junit.xml - - persist_to_workspace: root: ~/dooboo paths: - node_modules + - run: + name: Generate fbt + working_directory: . + command: | + yarn fbt:all + - run: name: ESLint Test working_directory: . @@ -110,6 +108,13 @@ jobs: # paths: # - android/vendor/bundle + - run: + name: Generate fbt + working_directory: . + command: | + yarn fbt:all && yarn fbt:android + + - run: name: Check MD5 on files command: | diff --git a/.gitignore b/.gitignore index 41f14643..d95acaf5 100644 --- a/.gitignore +++ b/.gitignore @@ -63,4 +63,7 @@ package-lock.json ios/Pods/ -.vscode \ No newline at end of file +# fbt +i18n/fbt/.enum_manifest.json +i18n/fbt/.source_strings.json +i18n/fbt/.src_manifest.json diff --git a/@types/fbt/globals.d.ts b/@types/fbt/globals.d.ts new file mode 100644 index 00000000..34f65f09 --- /dev/null +++ b/@types/fbt/globals.d.ts @@ -0,0 +1,92 @@ +/// + +declare namespace FBT { + type $Values = T[keyof T]; + + // https://github.com/facebookincubator/fbt/blob/e9c591f451dbfc91852e316869ae39ad41848c55/runtime/nonfb/GenderConst.js#L9-L23 + interface GenderConst { + NOT_A_PERSON: 0; + FEMALE_SINGULAR: 1; + MALE_SINGULAR: 2; + FEMALE_SINGULAR_GUESS: 3; + MALE_SINGULAR_GUESS: 4; + MIXED_SINGULAR: 5; + MIXED_PLURAL: 5; + NEUTER_SINGULAR: 6; + UNKNOWN_SINGULAR: 7; + FEMALE_PLURAL: 8; + MALE_PLURAL: 9; + NEUTER_PLURAL: 10; + UNKNOWN_PLURAL: 11; + } + + interface IntlVariationsGender { + GENDER_MALE: 1; + GENDER_FEMALE: 2; + GENDER_UNKNOWN: 3; + } + + // https://github.com/facebookincubator/fbt/blob/e9c591f451dbfc91852e316869ae39ad41848c55/runtime/nonfb/IntlVariations.js#L9-L21 + interface IntlVariations extends IntlVariationsGender { + BITMASK_NUMBER: 28; + BITMASK_GENDER: 3; + NUMBER_ZERO: 16; + NUMBER_ONE: 4; + NUMBER_TWO: 8; + NUMBER_FEW: 20; + NUMBER_MANY: 12; + NUMBER_OTHER: 24; + } + + // https://github.com/facebookincubator/fbt/blob/c2d363a40b622d5aaf80ff1d249b38604fd869f6/transform/babel-plugin-fbt/FbtConstants.js#L22-L27 + type PronounType = 'object' | 'possessive' | 'reflexive' | 'subject'; + + type IntlVariationsGenderValues = $Values; + + interface IntlViewerContext { + GENDER: IntlVariationsGenderValues; + locale: string; + } + + type IntlVariationsValues = $Values; + type GenderConstValues = $Values; + + type Translations = { [locale: string]: { [key: string]: string } }; + + interface Options { + author?: string; + common?: boolean; + doNotExtract?: boolean; + preserveWhitespace?: boolean; + project?: string; + subject?: IntlVariationsGenderValues; + } + + interface PluralOptions { + many?: string; + showCount?: 'yes' | 'no' | 'ifMany'; + name?: string; + value?: any; + } + + interface ParamOptions { + gender?: IntlVariationsGenderValues; + number?: number | true; + } + + interface PronounOptions { + human?: boolean; + capitalize?: boolean; + } + + type FbtResult = string; +} + +declare namespace JSX { + interface IntrinsicElements { + fbt: { + desc: string; + children: React.ReactNode | React.ReactNode[]; + } & FBT.Options; + } +} diff --git a/@types/fbt/index.d.ts b/@types/fbt/index.d.ts new file mode 100644 index 00000000..44664a56 --- /dev/null +++ b/@types/fbt/index.d.ts @@ -0,0 +1,76 @@ +/// + +declare module 'fbt' { + export const GenderConst: FBT.GenderConst; + export const IntlVariations: FBT.IntlVariations; + export const IntlViewerContext: FBT.IntlViewerContext; + + // These exports (Fbt*) isn't real! It is only syntax abstraction + // https://github.com/facebookincubator/fbt/blob/8607c1f2798ef18c6142a2cf1c5a9351c6d7df69/transform/babel-plugin-fbt/FbtUtil.js#L28-L40 + export const FbtEnum: React.FC<{ + 'enum-range': Array | { [enumKey: string]: string }; + value: string; + }>; + export const FbtParam: React.FC< + FBT.ParamOptions & { name: string; children: React.ReactNode } + >; + export const FbtPlural: React.FC< + FBT.PluralOptions & { count: number; children: string } + >; + export const FbtPronoun: React.FC< + FBT.PronounOptions & { + type: FBT.PronounType; + gender: FBT.GenderConstValues; + } + >; + export const FbtName: React.FC< + Omit & { + name: string; + gender: FBT.IntlVariationsGenderValues; + children: React.ReactNode; + } + >; + export const FbtSameParam: React.FC<{ + name: string; + }>; + + export interface Fbt { + (source: string, desc: string, options?: FBT.Options): FBT.FbtResult; + + param( + paramName: string, + value: any, + options?: FBT.ParamOptions, + ): FBT.FbtResult; + sameParam(paramName: string): FBT.FbtResult; + name(name: string, gender: FBT.IntlVariationsGenderValues): FBT.FbtResult; + plural( + singularPhrase: string, + count: number, + options?: FBT.PluralOptions, + ): FBT.FbtResult; + enum< + Range extends { [enumKey: string]: string }, + RangeKeys extends keyof Range + >( + enumKey: RangeKeys, + enumRange: Range, + ): FBT.FbtResult; + enum(index: string, enumRange: Array): FBT.FbtResult; + pronoun( + type: FBT.PronounType, + gender: FBT.GenderConstValues, + options: FBT.PronounOptions, + ): FBT.FbtResult; + } + + export const init: (options: { translations: FBT.Translations, hooks: { getViewerContext: () => any} }) => void; + + export const fbt: Fbt; +} + +declare namespace JSX { + interface IntrinsicElements { + fbt: any; + } +} diff --git a/README.md b/README.md index 74f32e7b..29e8a973 100644 --- a/README.md +++ b/README.md @@ -198,117 +198,10 @@ const component = (props): React.ReactElement => { ### Localization -We've defined Localization strings in `STRINGS.js` which is in root dir. -We used [react-native-localize](https://github.com/react-native-community/react-native-localize) pacakage for this one which use [i18n-js](https://github.com/fnando/i18n-js) together. - -- How it is installed - - ```tsx - import * as Localization from 'react-native-localize'; - - import en from './assets/langs/en.json'; - import i18n from 'i18n-js'; - import ja from './assets/langs/ja.json'; - import ko from './assets/langs/ko.json'; - - const locales = Localization.getLocales(); - - if (Array.isArray(locales)) { - i18n.locale = locales[0].languageTag; - } - - i18n.fallbacks = true; - i18n.translations = { en, ko, ja }; - - export const getString = (param: string, mapObj?: Record): string => { - if (mapObj) { - return i18n.t(param, mapObj); - } - return i18n.t(param); - }; - ``` - -- How it is used - - > Import locales in `assets/langs`. Currently, `ko.json` and `en.json` is installed. If you want to add more languages you can add it in `STRINGS.ts` and `i18n.translations = { en, ko };` add more languages inside `i18n.translations`. - - ```ts - import { getString } from '../../../STRINGS'; - - getString('LOGIN'); - ``` - -- How it is mocked - - > Fixed jest setup by adding following in `__mocks__/react-native-localize.ts`. - - ```ts - interface Locale { - countryCode: string; - languageTag: string; - languageCode: string; - isRTL: boolean; - } - const getLocales = (): Locale[] => [ - { - countryCode: 'US', - languageTag: 'en-US', - languageCode: 'en', - isRTL: false, - }, - { - countryCode: 'EC', - languageTag: 'es-EC', - languageCode: 'es', - isRTL: false, - }, - ]; - - const findBestAvailableLanguage = (): Partial => ({ - languageTag: 'es', - isRTL: false, - }); - - const getNumberFormatSettings = (): Record => ({ - decimalSeparator: '.', - groupingSeparator: ',', - }); - - const getCalendar = (): string => 'gregorian'; // or "japanese", "buddhist" - const getCountry = (): string => 'ES'; // the country code you want - const getCurrencies = (): [string] => ['USD']; // can be empty array - const getTemperatureUnit = (): string => 'celsius'; // or "fahrenheit" - const getTimeZone = (): string => 'Ecuador/Guayaquil'; // the timezone you want - const uses24HourClock = (): boolean => true; - const usesMetricSystem = (): boolean => true; - - const addEventListener = jest.fn(); - const removeEventListener = jest.fn(); - - export { - findBestAvailableLanguage, - getLocales, - getNumberFormatSettings, - getCalendar, - getCountry, - getCurrencies, - getTemperatureUnit, - getTimeZone, - uses24HourClock, - usesMetricSystem, - addEventListener, - removeEventListener, - }; - ``` - -### React version - -16.9 - -### React Native version - -0.61 - -### React navigation - -4 +Previously, we used `i18n-j` to localize our app and we decided to switch to [fbt](https://github.com/facebook/fbt). If you want to understand why, you may see our blog for [Localizing react app with FBT instead of i18n](https://medium.com/dooboolab/localizing-react-app-with-fbt-instead-of-i18n-90822e0cb373). + +We've defined localized strings in `assets/translations/en.json` for English and `assets/translations/ko.json` for Korean. Since the `en` is default locale setup in current project, you do not need to localize this file. However, you still should not delete this if you don't want to see missing localization warning messages when you are running jest. + +We are using [fbt](https://github.com/facebook/fbt) to localize our app which is maintained by Facebook team. Simply running `yarn fbt-all` will generate `i18n/fbt/translatedFbts.json` which has all the localized strings. + +If you find trouble using it, you may follow [Integrate FBT into your React Native Application](https://medium.com/translate-your-react-native-application-with/integrate-fbt-into-your-react-native-application-2bac420e8e0c). diff --git a/STRINGS.ts b/STRINGS.ts deleted file mode 100644 index 461ce842..00000000 --- a/STRINGS.ts +++ /dev/null @@ -1,21 +0,0 @@ -import * as Localization from 'react-native-localize'; - -import en from './assets/langs/en.json'; -import i18n from 'i18n-js'; -import ko from './assets/langs/ko.json'; - -const locales = Localization.getLocales(); - -if (Array.isArray(locales)) { - i18n.locale = locales[0].languageTag; -} - -i18n.fallbacks = true; -i18n.translations = { en, ko }; - -export const getString = (param: string, mapObj?: Record): string => { - if (mapObj) { - return i18n.t(param, mapObj); - } - return i18n.t(param); -}; diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 87d1e943..6baa3370 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ diff --git a/android/app/src/main/java/com/dooboo/MainActivity.java b/android/app/src/main/java/com/dooboo/MainActivity.java index 21ab5d9b..d121f950 100644 --- a/android/app/src/main/java/com/dooboo/MainActivity.java +++ b/android/app/src/main/java/com/dooboo/MainActivity.java @@ -1,12 +1,17 @@ package com.dooboo; +import android.content.res.Configuration; + import com.facebook.react.ReactActivity; import com.facebook.react.ReactActivityDelegate; +import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactRootView; import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView; public class MainActivity extends ReactActivity { + static String currentLocale; + /** * Returns the name of the main component registered from JavaScript. This is * used to schedule rendering of the component. @@ -25,4 +30,16 @@ protected ReactRootView createRootView() { } }; } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + String locale = newConfig.locale.toString(); + if (!locale.equals(MainActivity.currentLocale)) { + MainActivity.currentLocale = locale; + final ReactInstanceManager instanceManager = getReactInstanceManager(); + instanceManager.recreateReactContextInBackground(); + } + } } diff --git a/android/app/src/main/res/raw-en-rUS/localizable.json b/android/app/src/main/res/raw-en-rUS/localizable.json new file mode 100644 index 00000000..04dcab6f --- /dev/null +++ b/android/app/src/main/res/raw-en-rUS/localizable.json @@ -0,0 +1 @@ +{"18yDJU":"\"Go Back\"","4rqrl3":"\"Sign In\"","3fayOT":"\"Navigate\"","zcXn6":"\"Change Theme\""} \ No newline at end of file diff --git a/android/app/src/main/res/raw-ko-rKR/localizable.json b/android/app/src/main/res/raw-ko-rKR/localizable.json new file mode 100644 index 00000000..36fc07e4 --- /dev/null +++ b/android/app/src/main/res/raw-ko-rKR/localizable.json @@ -0,0 +1 @@ +{"18yDJU":"\"뒤로가기\"","4rqrl3":"\"로그인\"","3fayOT":"\"화면 전환\"","zcXn6":"\"테마 변경\""} \ No newline at end of file diff --git a/android/app/src/main/res/raw/localizable.json b/android/app/src/main/res/raw/localizable.json new file mode 100644 index 00000000..e69de29b diff --git a/android/drawable-hdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png b/android/drawable-hdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png new file mode 100644 index 00000000..ad03a63b Binary files /dev/null and b/android/drawable-hdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png differ diff --git a/android/drawable-mdpi/assets_icons_mask.png b/android/drawable-mdpi/assets_icons_mask.png new file mode 100644 index 00000000..8d67eb81 Binary files /dev/null and b/android/drawable-mdpi/assets_icons_mask.png differ diff --git a/android/drawable-mdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png b/android/drawable-mdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png new file mode 100644 index 00000000..083db295 Binary files /dev/null and b/android/drawable-mdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png differ diff --git a/android/drawable-mdpi/node_modules_reactnavigation_stack_src_views_assets_backiconmask.png b/android/drawable-mdpi/node_modules_reactnavigation_stack_src_views_assets_backiconmask.png new file mode 100644 index 00000000..9de72420 Binary files /dev/null and b/android/drawable-mdpi/node_modules_reactnavigation_stack_src_views_assets_backiconmask.png differ diff --git a/android/drawable-xhdpi/assets_icons_mask.png b/android/drawable-xhdpi/assets_icons_mask.png new file mode 100644 index 00000000..99d12240 Binary files /dev/null and b/android/drawable-xhdpi/assets_icons_mask.png differ diff --git a/android/drawable-xhdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png b/android/drawable-xhdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png new file mode 100644 index 00000000..6de0a1cb Binary files /dev/null and b/android/drawable-xhdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png differ diff --git a/android/drawable-xxhdpi/assets_icons_mask.png b/android/drawable-xxhdpi/assets_icons_mask.png new file mode 100644 index 00000000..eec61342 Binary files /dev/null and b/android/drawable-xxhdpi/assets_icons_mask.png differ diff --git a/android/drawable-xxhdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png b/android/drawable-xxhdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png new file mode 100644 index 00000000..15a983a6 Binary files /dev/null and b/android/drawable-xxhdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png differ diff --git a/android/drawable-xxxhdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png b/android/drawable-xxxhdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png new file mode 100644 index 00000000..17e52e85 Binary files /dev/null and b/android/drawable-xxxhdpi/node_modules_reactnavigation_stack_src_views_assets_backicon.png differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 1ba7206f..a4b44297 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/android/raw/i18n_fbt_translatedfbts.json b/android/raw/i18n_fbt_translatedfbts.json new file mode 100644 index 00000000..f5372106 --- /dev/null +++ b/android/raw/i18n_fbt_translatedfbts.json @@ -0,0 +1 @@ +{"en_US":{"18yDJU":"Go Back","4rqrl3":"Sign In","3fayOT":"Navigate","zcXn6":"Change Theme"},"ko_KR":{"18yDJU":"뒤로가기","4rqrl3":"로그인","3fayOT":"화면 전환","zcXn6":"테마 변경"}} \ No newline at end of file diff --git a/android/raw/node_modules_csscolorkeywords_colors.json b/android/raw/node_modules_csscolorkeywords_colors.json new file mode 100644 index 00000000..6637d25d --- /dev/null +++ b/android/raw/node_modules_csscolorkeywords_colors.json @@ -0,0 +1,148 @@ +{ + "black": "#000000", + "silver": "#c0c0c0", + "gray": "#808080", + "white": "#ffffff", + "maroon": "#800000", + "red": "#ff0000", + "purple": "#800080", + "fuchsia": "#ff00ff", + "green": "#008000", + "lime": "#00ff00", + "olive": "#808000", + "yellow": "#ffff00", + "navy": "#000080", + "blue": "#0000ff", + "teal": "#008080", + "aqua": "#00ffff", + "orange": "#ffa500", + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "blanchedalmond": "#ffebcd", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkgrey": "#a9a9a9", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkslategrey": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dimgrey": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "greenyellow": "#adff2f", + "grey": "#808080", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgray": "#d3d3d3", + "lightgreen": "#90ee90", + "lightgrey": "#d3d3d3", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightslategrey": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370db", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "oldlace": "#fdf5e6", + "olivedrab": "#6b8e23", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#db7093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "slategrey": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "whitesmoke": "#f5f5f5", + "yellowgreen": "#9acd32", + "rebeccapurple": "#663399" +} diff --git a/app.config.js b/app.config.js new file mode 100644 index 00000000..f5182ac9 --- /dev/null +++ b/app.config.js @@ -0,0 +1,11 @@ +import 'dotenv/config'; + +export default { + name: 'dooboo', + displayName: 'dooboo', + entryPoint: 'index.js', + packagerOpts: { + assetExts: ['ttf', 'png'], + sourceExts: ['ts', 'tsx'], + }, +}; diff --git a/app.json b/app.json deleted file mode 100644 index 58c36cba..00000000 --- a/app.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "dooboo", - "displayName": "dooboo", - "entryPoint": "index.js", - "packagerOpts": { - "assetExts": ["ttf", "png"], - "sourceExts": ["ts", "tsx"] - } -} diff --git a/assets/langs/en.json b/assets/langs/en.json deleted file mode 100644 index 54d34e02..00000000 --- a/assets/langs/en.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "HELLO": "Hello", - "LOGIN": "Login", - "EMAIL": "Email", - "PASSWORD": "Password", - "SIGNUP": "SIGN UP", - "FORGOT_PW": "Forgot password?", - "NAVIGATE": "Navigate to %{name}", - "CHANGE_THEME": "Change theme" -} diff --git a/assets/langs/ko.json b/assets/langs/ko.json deleted file mode 100644 index f2151ca8..00000000 --- a/assets/langs/ko.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "HELLO": "안녕하세요", - "LOGIN": "로그인", - "EMAIL": "이메일", - "PASSWORD": "패스워드", - "SIGNUP": "회원가입", - "FORGOT_PW": "비밀번호를 잊어버리셨나요?", - "NAVIGATE": "%{name}으로 이동", - "CHANGE_THEME": "테마 변경" -} diff --git a/assets/translations/en.json b/assets/translations/en.json new file mode 100644 index 00000000..3da3cfbe --- /dev/null +++ b/assets/translations/en.json @@ -0,0 +1,15 @@ +{ + "fb-locale": "en_US", + "translations": { + "8187f7a32af24a016622027a1aaf7c49": { + "tokens": [], + "types": [], + "translations": [ + { + "translation": "Sign In", + "variations": {} + } + ] + } + } +} \ No newline at end of file diff --git a/assets/translations/ko.json b/assets/translations/ko.json new file mode 100644 index 00000000..7b882998 --- /dev/null +++ b/assets/translations/ko.json @@ -0,0 +1,45 @@ +{ + "fb-locale": "ko_KR", + "translations": { + "8187f7a32af24a016622027a1aaf7c49": { + "tokens": [], + "types": [], + "translations": [ + { + "translation": "로그인", + "variations": {} + } + ] + }, + "579290b3f62f0fd93162fd1c69667b80": { + "tokens": [], + "types": [], + "translations": [ + { + "translation": "화면 전환", + "variations": {} + } + ] + }, + "266e827836b82d38073d828285fd7b08": { + "tokens": [], + "types": [], + "translations": [ + { + "translation": "테마 변경", + "variations": {} + } + ] + }, + "d045dda0e2a4f8df14e676e3adbcf94d": { + "tokens": [], + "types": [], + "translations": [ + { + "translation": "뒤로가기", + "variations": {} + } + ] + } + } +} \ No newline at end of file diff --git a/babel.config.js b/babel.config.js index 7f36c258..47791c68 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,6 +1,16 @@ +const path = require('path'); + module.exports = { presets: [ 'module:metro-react-native-babel-preset', '@babel/preset-typescript', ], + plugins: [ + 'babel-plugin-fbt-runtime', + ['babel-plugin-fbt', { + fbtEnumPath: path.join(__dirname, 'i18n/fbt/.enum_manifest.json'), + extraOptions: { __self: true }, + }, + ], + ], }; diff --git a/i18n/FbtI18nNativeAssets.js b/i18n/FbtI18nNativeAssets.js new file mode 100644 index 00000000..1356f8d1 --- /dev/null +++ b/i18n/FbtI18nNativeAssets.js @@ -0,0 +1,48 @@ +/** + * @generated SignedSource<> + * + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * !! This file is synchronized from fbsource. You should not !! + * !! modify it directly. Instead: !! + * !! !! + * !! 1) Update this file on fbsource and land your change there. !! + * !! 2) A sync diff should be created and accepted automatically !! + * !! within 30 minutes that copies the changes you made on !! + * !! fbsource to www. All that's left is to verify the !! + * !! revision is good land it on www. !! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + */ + +'use strict'; + +import NativeFbtModule from './NativeFbtModule'; + +const _translationsDictionary: {[hashKey: string]: ?string} = {}; + +export default class FbtI18nNativeAssets { + static getString = (hashKey: string): ?string => { + let translatedPayload; + if (hashKey in _translationsDictionary) { + translatedPayload = _translationsDictionary[hashKey]; + } else { + if (__DEV__ && !global.nativeExtensions && !global.nativeCallSyncHook) { + // Chrome debugger does not support synchronous native method. + // Thus do not use getString in Chrome debugger. + // **Translations will not work while debugging** + translatedPayload = null; + } else if (NativeFbtModule != null) { + translatedPayload = NativeFbtModule.getString(hashKey); + } + _translationsDictionary[hashKey] = translatedPayload; + } + + return translatedPayload; + }; +} diff --git a/i18n/NativeFbtModule.js b/i18n/NativeFbtModule.js new file mode 100644 index 00000000..13934417 --- /dev/null +++ b/i18n/NativeFbtModule.js @@ -0,0 +1,32 @@ +/** + * @generated SignedSource<> + * + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * !! This file is synchronized from fbsource. You should not !! + * !! modify it directly. Instead: !! + * !! !! + * !! 1) Update this file on fbsource and land your change there. !! + * !! 2) A sync diff should be created and accepted automatically !! + * !! within 30 minutes that copies the changes you made on !! + * !! fbsource to www. All that's left is to verify the !! + * !! revision is good land it on www. !! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + */ + +'use strict'; + +import {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; +import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; + +export interface Spec extends TurboModule { + getString: (hashKey: string) => string; +} + +export default (TurboModuleRegistry.get('FbtModule'): ?Spec); diff --git a/i18n/fbt/translatedFbts.json b/i18n/fbt/translatedFbts.json new file mode 100644 index 00000000..f5372106 --- /dev/null +++ b/i18n/fbt/translatedFbts.json @@ -0,0 +1 @@ +{"en_US":{"18yDJU":"Go Back","4rqrl3":"Sign In","3fayOT":"Navigate","zcXn6":"Change Theme"},"ko_KR":{"18yDJU":"뒤로가기","4rqrl3":"로그인","3fayOT":"화면 전환","zcXn6":"테마 변경"}} \ No newline at end of file diff --git a/i18n/getTranslatedInput.js b/i18n/getTranslatedInput.js new file mode 100644 index 00000000..edb09d4b --- /dev/null +++ b/i18n/getTranslatedInput.js @@ -0,0 +1,42 @@ +/** + * @generated SignedSource<<64f5f834628fc680784f95cc3842b80e>> + * + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * !! This file is synchronized from fbsource. You should not !! + * !! modify it directly. Instead: !! + * !! !! + * !! 1) Update this file on fbsource and land your change there. !! + * !! 2) A sync diff should be created and accepted automatically !! + * !! within 30 minutes that copies the changes you made on !! + * !! fbsource to www. All that's left is to verify the !! + * !! revision is good land it on www. !! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + */ + +'use strict'; + +import type {FbtRuntimeCallInput, FbtTranslatedInput} from 'fbt/lib/FbtHooks'; + +import FbtI18nNativeAssets from './FbtI18nNativeAssets'; + +function getTranslatedInput( + input: FbtRuntimeCallInput, +): ?FbtTranslatedInput { + const {options} = input; + if (options.hk != null) { + let translatedPayload = FbtI18nNativeAssets.getString(options.hk); + if (translatedPayload) { + return {table: JSON.parse(translatedPayload), args: input.args}; + } + } + return null; +} + +export {getTranslatedInput}; diff --git a/i18n/scripts/generate-android-localizables-executor.js b/i18n/scripts/generate-android-localizables-executor.js new file mode 100644 index 00000000..c7f93382 --- /dev/null +++ b/i18n/scripts/generate-android-localizables-executor.js @@ -0,0 +1,71 @@ +/** + * @generated SignedSource<<342c45ee3cb664f60d81eea85f914c6f>> + * + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * !! This file is synchronized from fbsource. You should not !! + * !! modify it directly. Instead: !! + * !! !! + * !! 1) Update this file on fbsource and land your change there. !! + * !! 2) A sync diff should be created and accepted automatically !! + * !! within 30 minutes that copies the changes you made on !! + * !! fbsource to www. All that's left is to verify the !! + * !! revision is good land it on www. !! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * Nice wraper to use generate-android-localizables from babel node directly + */ + +'use strict'; + +const { + generateAndroidLocalizableFiles, +} = require('./generate-android-localizables'); +const fs = require('fs'); +const yargs = require('yargs'); + +const args = { + HELP: 'h', + TRANSLATION_OUTPUT: 'translationOutput', + ANDROID_RES_DIR: 'androidResDir', + TRANSLATIONS_FILENAME: 'translationsFilename', +}; + +const argv = yargs + .usage( + 'Take translations output, and write individual JSON files for each ' + + 'locale: raw-es_rES/localizable.json => {: translatedString}', + ) + .string(args.TRANSLATION_OUTPUT) + .default(args.TRANSLATION_OUTPUT, './i18n/fbt/translatedFbts.json') + .describe(args.TRANSLATION_OUTPUT, `path to the translatedFbts`) + .string(args.ANDROID_RES_DIR) + .default(args.ANDROID_RES_DIR, 'android/app/src/main/res') + .describe( + args.ANDROID_RES_DIR, + `path to the res folder of your android application`, + ) + .string(args.TRANSLATIONS_FILENAME) + .default(args.TRANSLATIONS_FILENAME, 'localizable.json') + .describe( + args.TRANSLATIONS_FILENAME, + `name that json translation files should take`, + ).argv; + +if (argv[args.HELP]) { + yargs.showHelp(); + process.exit(0); +} + +generateAndroidLocalizableFiles( + JSON.parse( + fs.readFileSync(argv[args.TRANSLATION_OUTPUT], {encoding: 'utf8'}), + ), + argv[args.ANDROID_RES_DIR], + argv[args.TRANSLATIONS_FILENAME], +); diff --git a/i18n/scripts/generate-android-localizables.js b/i18n/scripts/generate-android-localizables.js new file mode 100644 index 00000000..8a431bae --- /dev/null +++ b/i18n/scripts/generate-android-localizables.js @@ -0,0 +1,87 @@ +/** + * @generated SignedSource<<8eb51a2ebfe40bc40fca79cd0f9cc1fc>> + * + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * !! This file is synchronized from fbsource. You should not !! + * !! modify it directly. Instead: !! + * !! !! + * !! 1) Update this file on fbsource and land your change there. !! + * !! 2) A sync diff should be created and accepted automatically !! + * !! within 30 minutes that copies the changes you made on !! + * !! fbsource to www. All that's left is to verify the !! + * !! revision is good land it on www. !! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + */ + +import type {TranslationScriptOutput} from './translate-fbts'; + +const invariant = require('invariant'); +const fs = require('fs'); +const path = require('path'); + +/** + * Generates locales that comply with Android resources format + * https://developer.android.com/guide/topics/resources/providing-resources + * + * @param locale Locale in the form langCode_regionCode. + * @return Locale in the form langCode-rRegionCode. + */ +function generateAndroidLocale(locale: string): string { + const langRegionCode = locale.split('_'); + invariant( + langRegionCode.length == 2, + 'Lang-region array must have two items', + ); + return `${langRegionCode[0]}-r${langRegionCode[1]}`; +} + +function jsonEncodeValues(localeValues) { + const encodedValues = {}; + for (const hash in localeValues) { + encodedValues[hash] = JSON.stringify(localeValues[hash]); + } + return encodedValues; +} + +/** + * Take translations output, and write individual JSON files for each locale + * raw-es_rES/localizable.json => {: translatedString} + * raw-ru_rRU/localizable.json + */ +function generateAndroidLocalizableFiles( + translationOutput: TranslationScriptOutput, + androidResDir: string, + translationsFileName: string, +) { + try { + for (const locale in translationOutput) { + const androidLocale = generateAndroidLocale(locale); + const rawXXDir = path.join(androidResDir, `raw-${androidLocale}`); + + if (!fs.existsSync(rawXXDir)) { + fs.mkdirSync(rawXXDir); + } + fs.writeFileSync( + path.join(rawXXDir, translationsFileName), + JSON.stringify(jsonEncodeValues(translationOutput[locale])), + {encoding: 'utf8'}, + ); + } + } catch (error) { + console.error('An error ocurred while generating the android localizables'); + console.error(error); + process.exit(1); + throw error; + } +} + +module.exports = { + generateAndroidLocalizableFiles, +}; diff --git a/ios/Podfile b/ios/Podfile index 1f61546d..97bdf23e 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,7 +1,7 @@ require_relative '../node_modules/react-native/scripts/react_native_pods' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' -platform :ios, '10.0' +platform :ios, '11.0' target 'dooboo' do config = use_native_modules! @@ -20,14 +20,12 @@ target 'dooboo' do use_flipper! post_install do |installer| flipper_post_install(installer) - end -end - -target 'dooboo-tvOS' do - # Pods for dooboo-tvOS - - target 'dooboo-tvOSTests' do - inherit! :search_paths - # Pods for testing + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' + config.build_settings["ONLY_ACTIVE_ARCH"] = "YES" + config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" + end + end end end diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 9ac9553b..83f3f38e 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3,58 +3,58 @@ PODS: - CocoaAsyncSocket (7.6.4) - CocoaLibEvent (1.0.0) - DoubleConversion (1.1.6) - - FBLazyVector (0.63.2) - - FBReactNativeSpec (0.63.2): + - FBLazyVector (0.63.4) + - FBReactNativeSpec (0.63.4): - Folly (= 2020.01.13.00) - - RCTRequired (= 0.63.2) - - RCTTypeSafety (= 0.63.2) - - React-Core (= 0.63.2) - - React-jsi (= 0.63.2) - - ReactCommon/turbomodule/core (= 0.63.2) - - Flipper (0.41.5): + - RCTRequired (= 0.63.4) + - RCTTypeSafety (= 0.63.4) + - React-Core (= 0.63.4) + - React-jsi (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - Flipper (0.54.0): - Flipper-Folly (~> 2.2) - Flipper-RSocket (~> 1.1) - Flipper-DoubleConversion (1.1.7) - - Flipper-Folly (2.2.0): + - Flipper-Folly (2.3.0): - boost-for-react-native - CocoaLibEvent (~> 1.0) - Flipper-DoubleConversion - Flipper-Glog - - OpenSSL-Universal (= 1.0.2.19) + - OpenSSL-Universal (= 1.0.2.20) - Flipper-Glog (0.3.6) - Flipper-PeerTalk (0.0.4) - Flipper-RSocket (1.1.0): - Flipper-Folly (~> 2.2) - - FlipperKit (0.41.5): - - FlipperKit/Core (= 0.41.5) - - FlipperKit/Core (0.41.5): - - Flipper (~> 0.41.5) + - FlipperKit (0.54.0): + - FlipperKit/Core (= 0.54.0) + - FlipperKit/Core (0.54.0): + - Flipper (~> 0.54.0) - FlipperKit/CppBridge - FlipperKit/FBCxxFollyDynamicConvert - FlipperKit/FBDefines - FlipperKit/FKPortForwarding - - FlipperKit/CppBridge (0.41.5): - - Flipper (~> 0.41.5) - - FlipperKit/FBCxxFollyDynamicConvert (0.41.5): + - FlipperKit/CppBridge (0.54.0): + - Flipper (~> 0.54.0) + - FlipperKit/FBCxxFollyDynamicConvert (0.54.0): - Flipper-Folly (~> 2.2) - - FlipperKit/FBDefines (0.41.5) - - FlipperKit/FKPortForwarding (0.41.5): + - FlipperKit/FBDefines (0.54.0) + - FlipperKit/FKPortForwarding (0.54.0): - CocoaAsyncSocket (~> 7.6) - Flipper-PeerTalk (~> 0.0.4) - - FlipperKit/FlipperKitHighlightOverlay (0.41.5) - - FlipperKit/FlipperKitLayoutPlugin (0.41.5): + - FlipperKit/FlipperKitHighlightOverlay (0.54.0) + - FlipperKit/FlipperKitLayoutPlugin (0.54.0): - FlipperKit/Core - FlipperKit/FlipperKitHighlightOverlay - FlipperKit/FlipperKitLayoutTextSearchable - YogaKit (~> 1.18) - - FlipperKit/FlipperKitLayoutTextSearchable (0.41.5) - - FlipperKit/FlipperKitNetworkPlugin (0.41.5): + - FlipperKit/FlipperKitLayoutTextSearchable (0.54.0) + - FlipperKit/FlipperKitNetworkPlugin (0.54.0): - FlipperKit/Core - - FlipperKit/FlipperKitReactPlugin (0.41.5): + - FlipperKit/FlipperKitReactPlugin (0.54.0): - FlipperKit/Core - - FlipperKit/FlipperKitUserDefaultsPlugin (0.41.5): + - FlipperKit/FlipperKitUserDefaultsPlugin (0.54.0): - FlipperKit/Core - - FlipperKit/SKIOSNetworkPlugin (0.41.5): + - FlipperKit/SKIOSNetworkPlugin (0.54.0): - FlipperKit/Core - FlipperKit/FlipperKitNetworkPlugin - Folly (2020.01.13.00): @@ -67,249 +67,249 @@ PODS: - DoubleConversion - glog - glog (0.3.5) - - OpenSSL-Universal (1.0.2.19): - - OpenSSL-Universal/Static (= 1.0.2.19) - - OpenSSL-Universal/Static (1.0.2.19) - - RCTRequired (0.63.2) - - RCTTypeSafety (0.63.2): - - FBLazyVector (= 0.63.2) + - OpenSSL-Universal (1.0.2.20): + - OpenSSL-Universal/Static (= 1.0.2.20) + - OpenSSL-Universal/Static (1.0.2.20) + - RCTRequired (0.63.4) + - RCTTypeSafety (0.63.4): + - FBLazyVector (= 0.63.4) - Folly (= 2020.01.13.00) - - RCTRequired (= 0.63.2) - - React-Core (= 0.63.2) - - React (0.63.2): - - React-Core (= 0.63.2) - - React-Core/DevSupport (= 0.63.2) - - React-Core/RCTWebSocket (= 0.63.2) - - React-RCTActionSheet (= 0.63.2) - - React-RCTAnimation (= 0.63.2) - - React-RCTBlob (= 0.63.2) - - React-RCTImage (= 0.63.2) - - React-RCTLinking (= 0.63.2) - - React-RCTNetwork (= 0.63.2) - - React-RCTSettings (= 0.63.2) - - React-RCTText (= 0.63.2) - - React-RCTVibration (= 0.63.2) - - React-callinvoker (0.63.2) - - React-Core (0.63.2): + - RCTRequired (= 0.63.4) + - React-Core (= 0.63.4) + - React (0.63.4): + - React-Core (= 0.63.4) + - React-Core/DevSupport (= 0.63.4) + - React-Core/RCTWebSocket (= 0.63.4) + - React-RCTActionSheet (= 0.63.4) + - React-RCTAnimation (= 0.63.4) + - React-RCTBlob (= 0.63.4) + - React-RCTImage (= 0.63.4) + - React-RCTLinking (= 0.63.4) + - React-RCTNetwork (= 0.63.4) + - React-RCTSettings (= 0.63.4) + - React-RCTText (= 0.63.4) + - React-RCTVibration (= 0.63.4) + - React-callinvoker (0.63.4) + - React-Core (0.63.4): - Folly (= 2020.01.13.00) - glog - - React-Core/Default (= 0.63.2) - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-Core/Default (= 0.63.4) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/CoreModulesHeaders (0.63.2): + - React-Core/CoreModulesHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/Default (0.63.2): + - React-Core/Default (0.63.4): - Folly (= 2020.01.13.00) - glog - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/DevSupport (0.63.2): + - React-Core/DevSupport (0.63.4): - Folly (= 2020.01.13.00) - glog - - React-Core/Default (= 0.63.2) - - React-Core/RCTWebSocket (= 0.63.2) - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) - - React-jsinspector (= 0.63.2) + - React-Core/Default (= 0.63.4) + - React-Core/RCTWebSocket (= 0.63.4) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) + - React-jsinspector (= 0.63.4) - Yoga - - React-Core/RCTActionSheetHeaders (0.63.2): + - React-Core/RCTActionSheetHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTAnimationHeaders (0.63.2): + - React-Core/RCTAnimationHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTBlobHeaders (0.63.2): + - React-Core/RCTBlobHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTImageHeaders (0.63.2): + - React-Core/RCTImageHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTLinkingHeaders (0.63.2): + - React-Core/RCTLinkingHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTNetworkHeaders (0.63.2): + - React-Core/RCTNetworkHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTSettingsHeaders (0.63.2): + - React-Core/RCTSettingsHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTTextHeaders (0.63.2): + - React-Core/RCTTextHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTVibrationHeaders (0.63.2): + - React-Core/RCTVibrationHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTWebSocket (0.63.2): + - React-Core/RCTWebSocket (0.63.4): - Folly (= 2020.01.13.00) - glog - - React-Core/Default (= 0.63.2) - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsiexecutor (= 0.63.2) + - React-Core/Default (= 0.63.4) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-CoreModules (0.63.2): - - FBReactNativeSpec (= 0.63.2) + - React-CoreModules (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.2) - - React-Core/CoreModulesHeaders (= 0.63.2) - - React-jsi (= 0.63.2) - - React-RCTImage (= 0.63.2) - - ReactCommon/turbomodule/core (= 0.63.2) - - React-cxxreact (0.63.2): + - RCTTypeSafety (= 0.63.4) + - React-Core/CoreModulesHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - React-RCTImage (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-cxxreact (0.63.4): - boost-for-react-native (= 1.63.0) - DoubleConversion - Folly (= 2020.01.13.00) - glog - - React-callinvoker (= 0.63.2) - - React-jsinspector (= 0.63.2) - - React-jsi (0.63.2): + - React-callinvoker (= 0.63.4) + - React-jsinspector (= 0.63.4) + - React-jsi (0.63.4): - boost-for-react-native (= 1.63.0) - DoubleConversion - Folly (= 2020.01.13.00) - glog - - React-jsi/Default (= 0.63.2) - - React-jsi/Default (0.63.2): + - React-jsi/Default (= 0.63.4) + - React-jsi/Default (0.63.4): - boost-for-react-native (= 1.63.0) - DoubleConversion - Folly (= 2020.01.13.00) - glog - - React-jsiexecutor (0.63.2): + - React-jsiexecutor (0.63.4): - DoubleConversion - Folly (= 2020.01.13.00) - glog - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - React-jsinspector (0.63.2) - - react-native-safe-area-context (3.1.8): + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsinspector (0.63.4) + - react-native-fbt (0.0.1): + - React + - react-native-safe-area-context (3.1.9): - React-Core - - React-RCTActionSheet (0.63.2): - - React-Core/RCTActionSheetHeaders (= 0.63.2) - - React-RCTAnimation (0.63.2): - - FBReactNativeSpec (= 0.63.2) + - React-RCTActionSheet (0.63.4): + - React-Core/RCTActionSheetHeaders (= 0.63.4) + - React-RCTAnimation (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.2) - - React-Core/RCTAnimationHeaders (= 0.63.2) - - React-jsi (= 0.63.2) - - ReactCommon/turbomodule/core (= 0.63.2) - - React-RCTBlob (0.63.2): - - FBReactNativeSpec (= 0.63.2) + - RCTTypeSafety (= 0.63.4) + - React-Core/RCTAnimationHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-RCTBlob (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - React-Core/RCTBlobHeaders (= 0.63.2) - - React-Core/RCTWebSocket (= 0.63.2) - - React-jsi (= 0.63.2) - - React-RCTNetwork (= 0.63.2) - - ReactCommon/turbomodule/core (= 0.63.2) - - React-RCTImage (0.63.2): - - FBReactNativeSpec (= 0.63.2) + - React-Core/RCTBlobHeaders (= 0.63.4) + - React-Core/RCTWebSocket (= 0.63.4) + - React-jsi (= 0.63.4) + - React-RCTNetwork (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-RCTImage (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.2) - - React-Core/RCTImageHeaders (= 0.63.2) - - React-jsi (= 0.63.2) - - React-RCTNetwork (= 0.63.2) - - ReactCommon/turbomodule/core (= 0.63.2) - - React-RCTLinking (0.63.2): - - FBReactNativeSpec (= 0.63.2) - - React-Core/RCTLinkingHeaders (= 0.63.2) - - React-jsi (= 0.63.2) - - ReactCommon/turbomodule/core (= 0.63.2) - - React-RCTNetwork (0.63.2): - - FBReactNativeSpec (= 0.63.2) + - RCTTypeSafety (= 0.63.4) + - React-Core/RCTImageHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - React-RCTNetwork (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-RCTLinking (0.63.4): + - FBReactNativeSpec (= 0.63.4) + - React-Core/RCTLinkingHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-RCTNetwork (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.2) - - React-Core/RCTNetworkHeaders (= 0.63.2) - - React-jsi (= 0.63.2) - - ReactCommon/turbomodule/core (= 0.63.2) - - React-RCTSettings (0.63.2): - - FBReactNativeSpec (= 0.63.2) + - RCTTypeSafety (= 0.63.4) + - React-Core/RCTNetworkHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-RCTSettings (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.2) - - React-Core/RCTSettingsHeaders (= 0.63.2) - - React-jsi (= 0.63.2) - - ReactCommon/turbomodule/core (= 0.63.2) - - React-RCTText (0.63.2): - - React-Core/RCTTextHeaders (= 0.63.2) - - React-RCTVibration (0.63.2): - - FBReactNativeSpec (= 0.63.2) + - RCTTypeSafety (= 0.63.4) + - React-Core/RCTSettingsHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-RCTText (0.63.4): + - React-Core/RCTTextHeaders (= 0.63.4) + - React-RCTVibration (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - React-Core/RCTVibrationHeaders (= 0.63.2) - - React-jsi (= 0.63.2) - - ReactCommon/turbomodule/core (= 0.63.2) - - ReactCommon/turbomodule/core (0.63.2): + - React-Core/RCTVibrationHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - ReactCommon/turbomodule/core (0.63.4): - DoubleConversion - Folly (= 2020.01.13.00) - glog - - React-callinvoker (= 0.63.2) - - React-Core (= 0.63.2) - - React-cxxreact (= 0.63.2) - - React-jsi (= 0.63.2) - - RNCAsyncStorage (1.12.0): - - React + - React-callinvoker (= 0.63.4) + - React-Core (= 0.63.4) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - RNCAsyncStorage (1.12.1): + - React-Core - RNCMaskedView (0.1.10): - React - - RNGestureHandler (1.8.0): - - React - - RNLocalize (1.4.1): - - React - - RNReanimated (1.13.1): - - React - - RNScreens (2.11.0): - - React + - RNGestureHandler (1.9.0): + - React-Core + - RNReanimated (1.13.2): + - React-Core + - RNScreens (2.16.1): + - React-Core - Yoga (1.14.0) - YogaKit (1.18.1): - Yoga (~> 1.14) @@ -318,25 +318,25 @@ DEPENDENCIES: - 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/Libraries/FBReactNativeSpec`) - - Flipper (~> 0.41.1) + - Flipper (~> 0.54.0) - Flipper-DoubleConversion (= 1.1.7) - Flipper-Folly (~> 2.2) - Flipper-Glog (= 0.3.6) - Flipper-PeerTalk (~> 0.0.4) - Flipper-RSocket (~> 1.1) - - FlipperKit (~> 0.41.1) - - FlipperKit/Core (~> 0.41.1) - - FlipperKit/CppBridge (~> 0.41.1) - - FlipperKit/FBCxxFollyDynamicConvert (~> 0.41.1) - - FlipperKit/FBDefines (~> 0.41.1) - - FlipperKit/FKPortForwarding (~> 0.41.1) - - FlipperKit/FlipperKitHighlightOverlay (~> 0.41.1) - - FlipperKit/FlipperKitLayoutPlugin (~> 0.41.1) - - FlipperKit/FlipperKitLayoutTextSearchable (~> 0.41.1) - - FlipperKit/FlipperKitNetworkPlugin (~> 0.41.1) - - FlipperKit/FlipperKitReactPlugin (~> 0.41.1) - - FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.41.1) - - FlipperKit/SKIOSNetworkPlugin (~> 0.41.1) + - FlipperKit (~> 0.54.0) + - FlipperKit/Core (~> 0.54.0) + - FlipperKit/CppBridge (~> 0.54.0) + - FlipperKit/FBCxxFollyDynamicConvert (~> 0.54.0) + - FlipperKit/FBDefines (~> 0.54.0) + - FlipperKit/FKPortForwarding (~> 0.54.0) + - FlipperKit/FlipperKitHighlightOverlay (~> 0.54.0) + - FlipperKit/FlipperKitLayoutPlugin (~> 0.54.0) + - FlipperKit/FlipperKitLayoutTextSearchable (~> 0.54.0) + - FlipperKit/FlipperKitNetworkPlugin (~> 0.54.0) + - FlipperKit/FlipperKitReactPlugin (~> 0.54.0) + - FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.54.0) + - FlipperKit/SKIOSNetworkPlugin (~> 0.54.0) - Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) @@ -351,6 +351,7 @@ DEPENDENCIES: - 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-native-fbt (from `../node_modules/react-native-fbt`) - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) @@ -365,7 +366,6 @@ DEPENDENCIES: - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" - "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)" - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - - RNLocalize (from `../node_modules/react-native-localize`) - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) @@ -416,6 +416,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: :path: "../node_modules/react-native/ReactCommon/jsinspector" + react-native-fbt: + :path: "../node_modules/react-native-fbt" react-native-safe-area-context: :path: "../node_modules/react-native-safe-area-context" React-RCTActionSheet: @@ -444,8 +446,6 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-community/masked-view" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" - RNLocalize: - :path: "../node_modules/react-native-localize" RNReanimated: :path: "../node_modules/react-native-reanimated" RNScreens: @@ -458,48 +458,48 @@ SPEC CHECKSUMS: CocoaAsyncSocket: 694058e7c0ed05a9e217d1b3c7ded962f4180845 CocoaLibEvent: 2fab71b8bd46dd33ddb959f7928ec5909f838e3f DoubleConversion: cde416483dac037923206447da6e1454df403714 - FBLazyVector: 3ef4a7f62e7db01092f9d517d2ebc0d0677c4a37 - FBReactNativeSpec: dc7fa9088f0f2a998503a352b0554d69a4391c5a - Flipper: 33585e2d9810fe5528346be33bcf71b37bb7ae13 + FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e + FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e + Flipper: be611d4b742d8c87fbae2ca5f44603a02539e365 Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41 - Flipper-Folly: c12092ea368353b58e992843a990a3225d4533c3 + Flipper-Folly: e4493b013c02d9347d5e0cb4d128680239f6c78a Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6 Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 Flipper-RSocket: 64e7431a55835eb953b0bf984ef3b90ae9fdddd7 - FlipperKit: bc68102cd4952a258a23c9c1b316c7bec1fecf83 + FlipperKit: ab353d41aea8aae2ea6daaf813e67496642f3d7d Folly: b73c3869541e86821df3c387eb0af5f65addfab4 glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 - OpenSSL-Universal: 8b48cc0d10c1b2923617dfe5c178aa9ed2689355 - RCTRequired: f13f25e7b12f925f1f6a6a8c69d929a03c0129fe - RCTTypeSafety: 44982c5c8e43ff4141eb519a8ddc88059acd1f3a - React: e1c65dd41cb9db13b99f24608e47dd595f28ca9a - React-callinvoker: 552a6a6bc8b3bb794cf108ad59e5a9e2e3b4fc98 - React-Core: 9d341e725dc9cd2f49e4c49ad1fc4e8776aa2639 - React-CoreModules: 5335e168165da7f7083ce7147768d36d3e292318 - React-cxxreact: d3261ec5f7d11743fbf21e263a34ea51d1f13ebc - React-jsi: 54245e1d5f4b690dec614a73a3795964eeef13a8 - React-jsiexecutor: 8ca588cc921e70590820ce72b8789b02c67cce38 - React-jsinspector: b14e62ebe7a66e9231e9581279909f2fc3db6606 - react-native-safe-area-context: 79fea126c6830c85f65947c223a5e3058a666937 - React-RCTActionSheet: 910163b6b09685a35c4ebbc52b66d1bfbbe39fc5 - React-RCTAnimation: 9a883bbe1e9d2e158d4fb53765ed64c8dc2200c6 - React-RCTBlob: 39cf0ece1927996c4466510e25d2105f67010e13 - React-RCTImage: de355d738727b09ad3692f2a979affbd54b5f378 - React-RCTLinking: 8122f221d395a63364b2c0078ce284214bd04575 - React-RCTNetwork: 8f96c7b49ea6a0f28f98258f347b6ad218bc0830 - React-RCTSettings: 8a49622aff9c1925f5455fa340b6fe4853d64ab6 - React-RCTText: 1b6773e776e4b33f90468c20fe3b16ca3e224bb8 - React-RCTVibration: 4d2e726957f4087449739b595f107c0d4b6c2d2d - ReactCommon: a0a1edbebcac5e91338371b72ffc66aa822792ce - RNCAsyncStorage: 2a692bcb9b69b76a2f1a95f33db057129700af64 + OpenSSL-Universal: ff34003318d5e1163e9529b08470708e389ffcdd + RCTRequired: 082f10cd3f905d6c124597fd1c14f6f2655ff65e + RCTTypeSafety: 8c9c544ecbf20337d069e4ae7fd9a377aadf504b + React: b0a957a2c44da4113b0c4c9853d8387f8e64e615 + React-callinvoker: c3f44dd3cb195b6aa46621fff95ded79d59043fe + React-Core: d3b2a1ac9a2c13c3bcde712d9281fc1c8a5b315b + React-CoreModules: 0581ff36cb797da0943d424f69e7098e43e9be60 + React-cxxreact: c1480d4fda5720086c90df537ee7d285d4c57ac3 + React-jsi: a0418934cf48f25b485631deb27c64dc40fb4c31 + React-jsiexecutor: 93bd528844ad21dc07aab1c67cb10abae6df6949 + React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a + react-native-fbt: 6f5cf86b6c1f407856dd2ae68024d2a1f49a33b3 + react-native-safe-area-context: b6e0e284002381d2ff29fa4fff42b4d8282e3c94 + React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336 + React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b + React-RCTBlob: a97d378b527740cc667e03ebfa183a75231ab0f0 + React-RCTImage: c1b1f2d3f43a4a528c8946d6092384b5c880d2f0 + React-RCTLinking: 35ae4ab9dc0410d1fcbdce4d7623194a27214fb2 + React-RCTNetwork: 29ec2696f8d8cfff7331fac83d3e893c95ef43ae + React-RCTSettings: 60f0691bba2074ef394f95d4c2265ec284e0a46a + React-RCTText: 5c51df3f08cb9dedc6e790161195d12bac06101c + React-RCTVibration: ae4f914cfe8de7d4de95ae1ea6cc8f6315d73d9d + ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b + RNCAsyncStorage: b03032fdbdb725bea0bd9e5ec5a7272865ae7398 RNCMaskedView: 5a8ec07677aa885546a0d98da336457e2bea557f - RNGestureHandler: 7a5833d0f788dbd107fbb913e09aa0c1ff333c39 - RNLocalize: 49634a6a605dcdeb319e9c42a5c2f1aec508694b - RNReanimated: dd8c286ab5dd4ba36d3a7fef8bff7e08711b5476 - RNScreens: 0e91da98ab26d5d04c7b59a9b6bd694124caf88c - Yoga: 7740b94929bbacbddda59bf115b5317e9a161598 + RNGestureHandler: 9b7e605a741412e20e13c512738a31bd1611759b + RNReanimated: e03f7425cb7a38dcf1b644d680d1bfc91c3337ad + RNScreens: 45c457af3d2ee9e08fc01e70da87e653d46b1198 + Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: 73f909c2b4533e55ed87d09d4f712b98f76fa947 +PODFILE CHECKSUM: 01b4c2c0870cfc4db814a311c242840c221c0baa -COCOAPODS: 1.9.3 +COCOAPODS: 1.10.0 diff --git a/ios/dooboo.xcodeproj/project.pbxproj b/ios/dooboo.xcodeproj/project.pbxproj index 1fa8aeb0..d747b0c0 100644 --- a/ios/dooboo.xcodeproj/project.pbxproj +++ b/ios/dooboo.xcodeproj/project.pbxproj @@ -12,13 +12,11 @@ 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 2C2F24E9C70DB46763B59EBD /* libPods-dooboo-tvOSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 12E824000AE1642C8D8AE62F /* libPods-dooboo-tvOSTests.a */; }; 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 2DCD954D1E0B4F2C00145EB5 /* doobooTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* doobooTests.m */; }; 386370538CEF1D2DCB8A5E71 /* libPods-dooboo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F97A477A04E5A0CE527DC64B /* libPods-dooboo.a */; }; - 3D43E79D64940A68AE921F45 /* libPods-dooboo-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DC92724D93ECB64F4F8D5C98 /* libPods-dooboo-tvOS.a */; }; 7ED01A28318BAEC924CF05DC /* libPods-dooboo-doobooTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D1E2A78FA19AD6D2670147 /* libPods-dooboo-doobooTests.a */; }; /* End PBXBuildFile section */ @@ -44,9 +42,6 @@ 00E356EE1AD99517003FC87E /* doobooTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = doobooTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* doobooTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = doobooTests.m; sourceTree = ""; }; - 0BAA10794AB471D92AE08F3E /* Pods-dooboo-tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-dooboo-tvOSTests.release.xcconfig"; path = "Target Support Files/Pods-dooboo-tvOSTests/Pods-dooboo-tvOSTests.release.xcconfig"; sourceTree = ""; }; - 12E0E58F6E4EA64DC50675A9 /* Pods-dooboo-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-dooboo-tvOS.release.xcconfig"; path = "Target Support Files/Pods-dooboo-tvOS/Pods-dooboo-tvOS.release.xcconfig"; sourceTree = ""; }; - 12E824000AE1642C8D8AE62F /* libPods-dooboo-tvOSTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-dooboo-tvOSTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07F961A680F5B00A75B9A /* dooboo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = dooboo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = dooboo/AppDelegate.h; sourceTree = ""; }; 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = dooboo/AppDelegate.m; sourceTree = ""; }; @@ -56,14 +51,11 @@ 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = dooboo/main.m; sourceTree = ""; }; 24FE732FDF9BA60D44E52033 /* Pods-dooboo-doobooTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-dooboo-doobooTests.debug.xcconfig"; path = "Target Support Files/Pods-dooboo-doobooTests/Pods-dooboo-doobooTests.debug.xcconfig"; sourceTree = ""; }; 27D1E2A78FA19AD6D2670147 /* libPods-dooboo-doobooTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-dooboo-doobooTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 2984CEDFA03E33646B8EE484 /* Pods-dooboo-tvOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-dooboo-tvOSTests.debug.xcconfig"; path = "Target Support Files/Pods-dooboo-tvOSTests/Pods-dooboo-tvOSTests.debug.xcconfig"; sourceTree = ""; }; 2D02E47B1E0B4A5D006451C7 /* dooboo-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "dooboo-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 2D02E4901E0B4A5D006451C7 /* dooboo-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "dooboo-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 48CBD2C8CC19555343597BB2 /* Pods-dooboo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-dooboo.release.xcconfig"; path = "Target Support Files/Pods-dooboo/Pods-dooboo.release.xcconfig"; sourceTree = ""; }; 55B7D9F61F111B13C977C0DE /* Pods-dooboo-doobooTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-dooboo-doobooTests.release.xcconfig"; path = "Target Support Files/Pods-dooboo-doobooTests/Pods-dooboo-doobooTests.release.xcconfig"; sourceTree = ""; }; - 8585EE60D8938FD9B7BF8684 /* Pods-dooboo-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-dooboo-tvOS.debug.xcconfig"; path = "Target Support Files/Pods-dooboo-tvOS/Pods-dooboo-tvOS.debug.xcconfig"; sourceTree = ""; }; 921D8784156B2139E974811E /* Pods-dooboo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-dooboo.debug.xcconfig"; path = "Target Support Files/Pods-dooboo/Pods-dooboo.debug.xcconfig"; sourceTree = ""; }; - DC92724D93ECB64F4F8D5C98 /* libPods-dooboo-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-dooboo-tvOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; F97A477A04E5A0CE527DC64B /* libPods-dooboo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-dooboo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -90,7 +82,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3D43E79D64940A68AE921F45 /* libPods-dooboo-tvOS.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -98,7 +89,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2C2F24E9C70DB46763B59EBD /* libPods-dooboo-tvOSTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -143,10 +133,6 @@ 48CBD2C8CC19555343597BB2 /* Pods-dooboo.release.xcconfig */, 24FE732FDF9BA60D44E52033 /* Pods-dooboo-doobooTests.debug.xcconfig */, 55B7D9F61F111B13C977C0DE /* Pods-dooboo-doobooTests.release.xcconfig */, - 8585EE60D8938FD9B7BF8684 /* Pods-dooboo-tvOS.debug.xcconfig */, - 12E0E58F6E4EA64DC50675A9 /* Pods-dooboo-tvOS.release.xcconfig */, - 2984CEDFA03E33646B8EE484 /* Pods-dooboo-tvOSTests.debug.xcconfig */, - 0BAA10794AB471D92AE08F3E /* Pods-dooboo-tvOSTests.release.xcconfig */, ); name = Pods; path = Pods; @@ -159,8 +145,6 @@ ED2971642150620600B7C4FE /* JavaScriptCore.framework */, F97A477A04E5A0CE527DC64B /* libPods-dooboo.a */, 27D1E2A78FA19AD6D2670147 /* libPods-dooboo-doobooTests.a */, - DC92724D93ECB64F4F8D5C98 /* libPods-dooboo-tvOS.a */, - 12E824000AE1642C8D8AE62F /* libPods-dooboo-tvOSTests.a */, ); name = Frameworks; sourceTree = ""; @@ -246,7 +230,6 @@ isa = PBXNativeTarget; buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "dooboo-tvOS" */; buildPhases = ( - 2DE459A6844CB2A9CB9C1F07 /* [CP] Check Pods Manifest.lock */, FD10A7F122414F3F0027D42C /* Start Packager */, 2D02E4771E0B4A5D006451C7 /* Sources */, 2D02E4781E0B4A5D006451C7 /* Frameworks */, @@ -266,7 +249,6 @@ isa = PBXNativeTarget; buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "dooboo-tvOSTests" */; buildPhases = ( - 705AC4BDDB402A7C8D7237C2 /* [CP] Check Pods Manifest.lock */, 2D02E48C1E0B4A5D006451C7 /* Sources */, 2D02E48D1E0B4A5D006451C7 /* Frameworks */, 2D02E48E1E0B4A5D006451C7 /* Resources */, @@ -391,50 +373,6 @@ shellPath = /bin/sh; shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; }; - 2DE459A6844CB2A9CB9C1F07 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-dooboo-tvOS-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 705AC4BDDB402A7C8D7237C2 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-dooboo-tvOSTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 7D6619BBAE3F2D6D5FAE2DCF /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -711,7 +649,6 @@ }; 2D02E4971E0B4A5E006451C7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8585EE60D8938FD9B7BF8684 /* Pods-dooboo-tvOS.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; @@ -739,7 +676,6 @@ }; 2D02E4981E0B4A5E006451C7 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 12E0E58F6E4EA64DC50675A9 /* Pods-dooboo-tvOS.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; @@ -767,7 +703,6 @@ }; 2D02E4991E0B4A5E006451C7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2984CEDFA03E33646B8EE484 /* Pods-dooboo-tvOSTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; @@ -794,7 +729,6 @@ }; 2D02E49A1E0B4A5E006451C7 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0BAA10794AB471D92AE08F3E /* Pods-dooboo-tvOSTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; diff --git a/package.json b/package.json index 8dbb3962..8794906f 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "private": true, "postinstall": "npx jetify", "scripts": { + "postinstall": "yarn fbt:all", "dev": "node node_modules/react-native/local-cli/cli.js start", "tsc": "tsc", "watch": "tsc -w", @@ -31,51 +32,63 @@ "ios:reset": "rm -rf ios/build/ModuleCache", "lint": "eslint src --ext .ts,.tsx,.js,.jsx", "build:ios": "react-native bundle --entry-file index.js --platform ios --dev false --bundle-output ios/main.jsbundle --assets-dest ./ios", - "build:android": "react-native bundle --entry-file index.js --platform android --dev false --bundle-output android/main.jsbundle --assets-dest ./android" + "build:android": "react-native bundle --entry-file index.js --platform android --dev false --bundle-output android/main.jsbundle --assets-dest ./android", + "manifest": "babel-node ./node_modules/babel-plugin-fbt/bin/manifest --src src/ --enum-manifest i18n/fbt/.enum_manifest.json --src-manifest i18n/fbt/.src_manifest.json", + "collect-fbts": "babel-node ./node_modules/babel-plugin-fbt/bin/collectFBT --hash-module 'fb-tiger-hash/src/hashPhrases' --react-native-mode --manifest --options __self < i18n/fbt/.src_manifest.json > i18n/fbt/.source_strings.json", + "translate-fbts": "babel-node ./node_modules/babel-plugin-fbt/bin/translate.js --jenkins --source-strings i18n/fbt/.source_strings.json --translations assets/translations/*.json > i18n/fbt/translatedFbts.json", + "clean-fbts": "rm i18n/fbt/.enum_manifest.json i18n/fbt/.src_manifest.json i18n/fbt/.source_strings.json assets/translatedFbts.json 2&> /dev/null || exit 0", + "fbt:all": "yarn manifest && yarn collect-fbts && yarn translate-fbts", + "fbt:android": "babel-node i18n/scripts/generate-android-localizables-executor.js" }, "dependencies": { - "@dooboo-ui/native-theme": "^0.1.7", + "@dooboo-ui/theme": "^0.0.3", "@react-native-community/async-storage": "^1.12.0", "@react-native-community/masked-view": "^0.1.10", - "@react-navigation/core": "^5.14.1", - "@react-navigation/native": "^5.8.7", - "@react-navigation/stack": "^5.12.4", - "i18n-js": "^3.8.0", + "@react-navigation/core": "^5.14.4", + "@react-navigation/native": "^5.8.10", + "@react-navigation/stack": "^5.12.8", + "fbt": "^0.16.0", "react": "16.13.1", - "react-native": "0.63.3", - "react-native-gesture-handler": "^1.8.0", - "react-native-localize": "^1.4.3", - "react-native-reanimated": "^1.13.1", - "react-native-safe-area-context": "^3.1.8", - "react-native-screens": "^2.13.0", + "react-native": "0.63.4", + "react-native-gesture-handler": "^1.9.0", + "react-native-reanimated": "^1.13.2", + "react-native-safe-area-context": "^3.1.9", + "react-native-screens": "^2.16.1", "styled-components": "^5.2.1" }, "devDependencies": { - "@babel/cli": "^7.12.1", - "@babel/core": "^7.12.3", - "@babel/preset-typescript": "^7.12.1", + "@babel/cli": "^7.12.10", + "@babel/core": "^7.12.10", + "@babel/node": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", "@babel/runtime": "^7.12.5", - "@dooboo/eslint-config": "^0.5.4", + "@dooboo/eslint-config": "^0.5.8", "@testing-library/jest-native": "^3.4.3", "@testing-library/react-native": "^7.1.0", - "@types/i18n-js": "^3.0.3", - "@types/jest": "^26.0.15", - "@types/react": "^16.9.56", - "@types/react-native": "^0.63.33", - "@types/react-test-renderer": "^16.9.3", - "@types/styled-components": "^5.1.4", + "@types/jest": "^26.0.19", + "@types/react": "^17.0.0", + "@types/react-native": "^0.63.43", + "@types/react-test-renderer": "^17.0.0", + "@types/styled-components": "^5.1.7", "babel-jest": "^26.6.3", + "babel-plugin-fbt": "^0.16.0", + "babel-plugin-fbt-runtime": "^0.9.12", + "babel-preset-react-native": "^4.0.1", "codecov": "^3.8.1", - "eslint": "^7.13.0", + "eslint": "^7.16.0", + "fb-tiger-hash": "^0.1.6", + "fbt-generate-translations": "^0.0.4", "jest": "^26.6.3", "jest-fetch-mock": "^3.0.3", "jest-styled-components": "^7.0.3", "jetifier": "^1.6.6", - "metro-react-native-babel-preset": "^0.63.0", - "prettier": "^2.1.2", + "metro-react-native-babel-preset": "^0.64.0", + "prettier": "^2.2.1", "react-dom": "^16.13.1", + "react-native-fbt": "^0.0.1", "react-test-renderer": "16.13.1", + "shelljs": "^0.8.4", "ts-jest": "^26.4.4", - "typescript": "4.0.5" + "typescript": "4.1.3" } } diff --git a/src/App.tsx b/src/App.tsx index 4432cae6..345d8d1f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,9 @@ import React from 'react'; import RootNavigator from './components/navigation/RootStackNavigator'; import RootProvider from './providers'; +import { initFbt } from './utils/fbt'; + +initFbt(); function App(): React.ReactElement { return ; diff --git a/src/components/navigation/RootStackNavigator.tsx b/src/components/navigation/RootStackNavigator.tsx index 3c3ecc79..a5d83117 100644 --- a/src/components/navigation/RootStackNavigator.tsx +++ b/src/components/navigation/RootStackNavigator.tsx @@ -1,7 +1,7 @@ import 'react-native-gesture-handler'; import { StackNavigationProp, createStackNavigator } from '@react-navigation/stack'; -import { ThemeType, useThemeContext } from '@dooboo-ui/native-theme'; +import { ThemeType, useThemeContext } from '@dooboo-ui/theme'; import Intro from '../screen/Intro'; import { NavigationContainer } from '@react-navigation/native'; diff --git a/src/components/navigation/__tests__/RootStackNavigator.test.tsx b/src/components/navigation/__tests__/RootStackNavigator.test.tsx index 502310ab..f457c01e 100644 --- a/src/components/navigation/__tests__/RootStackNavigator.test.tsx +++ b/src/components/navigation/__tests__/RootStackNavigator.test.tsx @@ -4,7 +4,7 @@ import React, { ReactElement } from 'react'; import { createTestElement, createTestProps } from '../../../../test/testUtils'; import StackNavigator from '../RootStackNavigator'; -import { ThemeType } from '@dooboo-ui/native-theme'; +import { ThemeType } from '@dooboo-ui/theme'; import renderer from 'react-test-renderer'; // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/components/navigation/__tests__/__snapshots__/RootStackNavigator.test.tsx.snap b/src/components/navigation/__tests__/__snapshots__/RootStackNavigator.test.tsx.snap index ec263d0c..e68537cf 100644 --- a/src/components/navigation/__tests__/__snapshots__/RootStackNavigator.test.tsx.snap +++ b/src/components/navigation/__tests__/__snapshots__/RootStackNavigator.test.tsx.snap @@ -57,16 +57,21 @@ exports[`[Stack] navigator should renders [Dark] mode 1`] = ` onGestureCanceled={[Function]} onGestureEnd={[Function]} onOpen={[Function]} - onTransitionStart={[Function]} + onTransition={[Function]} pointerEvents="box-none" style={ - Object { - "bottom": 0, - "left": 0, - "position": "absolute", - "right": 0, - "top": 0, - } + Array [ + Object { + "overflow": undefined, + }, + Object { + "bottom": 0, + "left": 0, + "position": "absolute", + "right": 0, + "top": 0, + }, + ] } transitionSpec={ Object { @@ -355,7 +360,7 @@ exports[`[Stack] navigator should renders [Dark] mode 1`] = ` ] } > - Navigate to Temp + Navigate @@ -398,7 +403,7 @@ exports[`[Stack] navigator should renders [Dark] mode 1`] = ` ] } > - Change theme + Change Theme @@ -678,16 +683,21 @@ exports[`[Stack] navigator should renders without crashing 1`] = ` onGestureCanceled={[Function]} onGestureEnd={[Function]} onOpen={[Function]} - onTransitionStart={[Function]} + onTransition={[Function]} pointerEvents="box-none" style={ - Object { - "bottom": 0, - "left": 0, - "position": "absolute", - "right": 0, - "top": 0, - } + Array [ + Object { + "overflow": undefined, + }, + Object { + "bottom": 0, + "left": 0, + "position": "absolute", + "right": 0, + "top": 0, + }, + ] } transitionSpec={ Object { @@ -976,7 +986,7 @@ exports[`[Stack] navigator should renders without crashing 1`] = ` ] } > - Navigate to Temp + Navigate @@ -1019,7 +1029,7 @@ exports[`[Stack] navigator should renders without crashing 1`] = ` ] } > - Change theme + Change Theme diff --git a/src/components/screen/Intro.tsx b/src/components/screen/Intro.tsx index 89c938aa..e3def2ef 100644 --- a/src/components/screen/Intro.tsx +++ b/src/components/screen/Intro.tsx @@ -4,10 +4,10 @@ import React from 'react'; import { RootStackNavigationProps } from '../navigation/RootStackNavigator'; import { User } from '../../types'; import { View } from 'react-native'; -import { getString } from '../../../STRINGS'; +import { fbt } from 'fbt'; import styled from 'styled-components/native'; import { useAppContext } from '../../providers/AppProvider'; -import { useThemeContext } from '@dooboo-ui/native-theme'; +import { useThemeContext } from '@dooboo-ui/theme'; const Container = styled.View` flex: 1; @@ -48,7 +48,7 @@ interface Props { } function Intro(props: Props): React.ReactElement { - let timer: NodeJS.Timeout; + let timer: number; const { state: { user }, setUser } = useAppContext(); const { changeThemeType } = useThemeContext(); const [isLoggingIn, setIsLoggingIn] = React.useState(false); @@ -88,21 +88,21 @@ function Intro(props: Props): React.ReactElement { imgLeftSrc={IC_MASK} isLoading={isLoggingIn} onClick={(): void => onLogin()} - text={getString('LOGIN')} + text={fbt('Login', 'login')} />