0?c:["plain"],e=u):(c=Q(c,u.type),u.alias&&(c=Q(c,u.alias)),e=u.content),"string"!=typeof e){i++,t.push(c),n.push(e),r.push(0),o.push(e.length);continue}const d=e.split(K),p=d.length;s.push({types:c,content:d[0]});for(let t=1;t{const a=t.toLowerCase(),i=((e,t)=>{const[n,r]=(0,u.useState)(Y(t,e)),o=(0,u.useRef)(),a=(0,u.useRef)();return(0,u.useEffect)((()=>{t===o.current&&e===a.current||(o.current=t,a.current=e,r(Y(t,e)))}),[e,t]),n})(a,r),s=(e=>(0,u.useCallback)((t=>{var n=t,{className:r,style:o,line:a}=n,i=T(n,["className","style","line"]);const s=E(k({},i),{className:(0,d.c)("token-line",r)});return"object"==typeof e&&"plain"in e&&(s.style=e.plain),"object"==typeof o&&(s.style=k(k({},s.style||{}),o)),s}),[e]))(i),l=(e=>{const t=(0,u.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,u.useCallback)((e=>{var n=e,{token:r,className:o,style:a}=n,i=T(n,["token","className","style"]);const s=E(k({},i),{className:(0,d.c)("token",...r.types,o),children:r.content,style:t(r)});return null!=a&&(s.style=k(k({},s.style||{}),a)),s}),[t])})(i),c=(({prism:e,code:t,grammar:n,language:r})=>{const o=(0,u.useRef)(e);return(0,u.useMemo)((()=>{if(null==n)return Z([t]);const e={code:t,grammar:n,language:r,tokens:[]};return o.current.hooks.run("before-tokenize",e),e.tokens=o.current.tokenize(t,n),o.current.hooks.run("after-tokenize",e),Z(e.tokens)}),[t,n,r])})({prism:o,language:a,code:n,grammar:o.languages[a]});return e({tokens:c,className:`prism-code language-${a}`,style:null!=i?i.root:{},getLineProps:s,getTokenProps:l})},ee=e=>(0,u.createElement)(J,E(k({},e),{prism:e.prism||_,theme:e.theme||U,code:e.code,language:e.language}))},144:e=>{"use strict";e.exports={}},4504:e=>{"use strict";e.exports=JSON.parse('{"/search-437":{"__comp":"1a4e3797","__context":{"plugin":"abaad534"}},"/docs-d53":{"__comp":"5e95c892","__context":{"plugin":"e7928ab4"}},"/docs-195":{"__comp":"a7bd4aaa","version":"935f2afb"},"/docs/tags-0cc":{"__comp":"3720c009","tags":"55960ee5"},"/docs/tags/accessibility-8aa":{"__comp":"df203c0f","tag":"4a4fb967"},"/docs/tags/android-e3a":{"__comp":"df203c0f","tag":"6728e797"},"/docs/tags/apisauce-143":{"__comp":"df203c0f","tag":"1ab29606"},"/docs/tags/archive-51b":{"__comp":"df203c0f","tag":"985027d8"},"/docs/tags/async-storage-afc":{"__comp":"df203c0f","tag":"d01c4de2"},"/docs/tags/authentication-587":{"__comp":"df203c0f","tag":"ecce3b64"},"/docs/tags/babel-e90":{"__comp":"df203c0f","tag":"b3d1732c"},"/docs/tags/ci-cd-56c":{"__comp":"df203c0f","tag":"a951c726"},"/docs/tags/cng-581":{"__comp":"df203c0f","tag":"31ac2bc7"},"/docs/tags/debug-888":{"__comp":"df203c0f","tag":"e1b6b0a8"},"/docs/tags/dependencies-c34":{"__comp":"df203c0f","tag":"8b0d950b"},"/docs/tags/eas-17a":{"__comp":"df203c0f","tag":"99d16955"},"/docs/tags/eas-update-632":{"__comp":"df203c0f","tag":"33f24359"},"/docs/tags/environment-variables-0f3":{"__comp":"df203c0f","tag":"fd1937a7"},"/docs/tags/expo-a41":{"__comp":"df203c0f","tag":"ce17b301"},"/docs/tags/expo-dev-client-0df":{"__comp":"df203c0f","tag":"a0d6a633"},"/docs/tags/expo-router-257":{"__comp":"df203c0f","tag":"c5ca3bf3"},"/docs/tags/expo-updates-807":{"__comp":"df203c0f","tag":"08a54ed9"},"/docs/tags/flat-list-5a7":{"__comp":"df203c0f","tag":"e0854532"},"/docs/tags/generator-80e":{"__comp":"df203c0f","tag":"24a07a83"},"/docs/tags/guide-cea":{"__comp":"df203c0f","tag":"b8c37621"},"/docs/tags/hardware-303":{"__comp":"df203c0f","tag":"569bff92"},"/docs/tags/i-os-96e":{"__comp":"df203c0f","tag":"3bb7a4af"},"/docs/tags/imports-887":{"__comp":"df203c0f","tag":"b832b2ff"},"/docs/tags/intro-b42":{"__comp":"df203c0f","tag":"51658ad1"},"/docs/tags/maestro-034":{"__comp":"df203c0f","tag":"dec1aed8"},"/docs/tags/mmkv-f7e":{"__comp":"df203c0f","tag":"a8646ade"},"/docs/tags/mob-x-a01":{"__comp":"df203c0f","tag":"51ea30c5"},"/docs/tags/prebuild-83d":{"__comp":"df203c0f","tag":"f50f3884"},"/docs/tags/prettier-db7":{"__comp":"df203c0f","tag":"69dd30cd"},"/docs/tags/react-native-vision-camera-ea0":{"__comp":"df203c0f","tag":"82139467"},"/docs/tags/react-navigation-0ad":{"__comp":"df203c0f","tag":"94ee064e"},"/docs/tags/redux-c5e":{"__comp":"df203c0f","tag":"e2041b9b"},"/docs/tags/scroll-to-f32":{"__comp":"df203c0f","tag":"a8f9d519"},"/docs/tags/section-list-8de":{"__comp":"df203c0f","tag":"9dc0f37b"},"/docs/tags/select-field-5f4":{"__comp":"df203c0f","tag":"dce6faa4"},"/docs/tags/state-management-181":{"__comp":"df203c0f","tag":"18d888f3"},"/docs/tags/testing-b53":{"__comp":"df203c0f","tag":"47a03c7f"},"/docs/tags/text-field-782":{"__comp":"df203c0f","tag":"72dfd944"},"/docs/tags/type-script-825":{"__comp":"df203c0f","tag":"ff2c7cca"},"/docs/tags/ui-020":{"__comp":"df203c0f","tag":"19d620af"},"/docs/tags/ui-required-device-capabilities-73a":{"__comp":"df203c0f","tag":"ccf3150e"},"/docs/tags/uses-feature-f1a":{"__comp":"df203c0f","tag":"d699663a"},"/docs/tags/vision-camera-e9b":{"__comp":"df203c0f","tag":"c5abe9fe"},"/docs/tags/yarn-e4e":{"__comp":"df203c0f","tag":"7acb6f50"},"/docs/tags/zustand-24d":{"__comp":"df203c0f","tag":"954f316d"},"/docs-05b":{"__comp":"a94703ab"},"/docs/archive/-ab8":{"__comp":"17896441","content":"dd3340a6"},"/docs/archive/PristineExpoProject-afa":{"__comp":"17896441","content":"b33180cb"},"/docs/intro-194":{"__comp":"17896441","content":"0e384e19"},"/docs/recipes/AccessibilityFontSizes-872":{"__comp":"17896441","content":"145425bc"},"/docs/recipes/CircleCIRNSetup-ce2":{"__comp":"17896441","content":"fe9b09bf"},"/docs/recipes/CreatingGreateExperienceForScreenReaders-752":{"__comp":"17896441","content":"f523b160"},"/docs/recipes/DetoxIntro-700":{"__comp":"17896441","content":"03224537"},"/docs/recipes/DistributingAuthTokenToAPI-298":{"__comp":"17896441","content":"24c3776a"},"/docs/recipes/EASUpdate-938":{"__comp":"17896441","content":"9fc76e3d"},"/docs/recipes/EnforcingImportOrder-713":{"__comp":"17896441","content":"d7af48b9"},"/docs/recipes/EnvironmentVariables-92b":{"__comp":"17896441","content":"d6ab422f"},"/docs/recipes/ExpoRouter-0b5":{"__comp":"17896441","content":"c47fa949"},"/docs/recipes/GeneratorComponentTests-e55":{"__comp":"17896441","content":"7b45617e"},"/docs/recipes/MaestroSetup-237":{"__comp":"17896441","content":"51e76fb5"},"/docs/recipes/MigratingToMMKV-9d0":{"__comp":"17896441","content":"657027a7"},"/docs/recipes/PatchingBuildingAndroid-ac8":{"__comp":"17896441","content":"d0e08e4a"},"/docs/recipes/PrepForEASBuild-64a":{"__comp":"17896441","content":"54a9c7e8"},"/docs/recipes/ReactNativeVisionCamera-e2e":{"__comp":"17896441","content":"cc1d3934"},"/docs/recipes/Redux-0f8":{"__comp":"17896441","content":"a2f5d017"},"/docs/recipes/RemoveMobxStateTree-50f":{"__comp":"17896441","content":"c75b21fd"},"/docs/recipes/RequiringHardwareFeaturesWithExpo-2fd":{"__comp":"17896441","content":"cecd52bc"},"/docs/recipes/SampleYAMLCircleCI-30a":{"__comp":"17896441","content":"4e09609f"},"/docs/recipes/SelectFieldWithBottomSheet-ca3":{"__comp":"17896441","content":"d63d2b89"},"/docs/recipes/SwitchBetweenExpoGoCNG-695":{"__comp":"17896441","content":"78a0b2f7"},"/docs/recipes/TypeScriptBaseURL-986":{"__comp":"17896441","content":"1c9ea255"},"/docs/recipes/UnrenderedItemInScrollView-c15":{"__comp":"17896441","content":"c3e2f4d4"},"/docs/recipes/UpdatingDependencies-21c":{"__comp":"17896441","content":"da9277bc"},"/docs/recipes/UpdatingIgnite-f0c":{"__comp":"17896441","content":"6fd287af"},"/docs/recipes/UsingScreenReaders-324":{"__comp":"17896441","content":"63181745"},"/docs/recipes/Zustand-0e1":{"__comp":"17896441","content":"e33e793e"},"/-703":{"__comp":"1df93b7f","__context":{"plugin":"3192f89a"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[2176],(()=>{return t=8808,e(e.s=t);var t}));e.O()}]);
\ No newline at end of file
diff --git a/assets/js/main.e67a6a10.js.LICENSE.txt b/assets/js/main.389a2d66.js.LICENSE.txt
similarity index 100%
rename from assets/js/main.e67a6a10.js.LICENSE.txt
rename to assets/js/main.389a2d66.js.LICENSE.txt
diff --git a/assets/js/main.e67a6a10.js b/assets/js/main.e67a6a10.js
deleted file mode 100644
index f3367380..00000000
--- a/assets/js/main.e67a6a10.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! For license information please see main.e67a6a10.js.LICENSE.txt */
-(self.webpackChunkignite_cookbook=self.webpackChunkignite_cookbook||[]).push([[1590],{5052:(e,t,n)=>{"use strict";n.d(t,{I:()=>o});var r=n(1504);function o(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},628:(e,t,n)=>{"use strict";n.d(t,{c:()=>p});n(1504);var r=n(8852),o=n.n(r),a=n(4504);const i={"03224537":[()=>n.e(5284).then(n.bind(n,4024)),"@site/docs/recipes/DetoxIntro.md",4024],"08a54ed9":[()=>n.e(5156).then(n.t.bind(n,1128,19)),"~docs/default/tag-docs-tags-expo-updates-8e6.json",1128],"0e384e19":[()=>n.e(6328).then(n.bind(n,9404)),"@site/docs/intro.md",9404],"145425bc":[()=>n.e(16).then(n.bind(n,9856)),"@site/docs/recipes/AccessibilityFontSizes.md",9856],17896441:[()=>Promise.all([n.e(2176),n.e(4912),n.e(6752)]).then(n.bind(n,4276)),"@theme/DocItem",4276],"18d888f3":[()=>n.e(5640).then(n.t.bind(n,9584,19)),"~docs/default/tag-docs-tags-state-management-fd9.json",9584],"19d620af":[()=>n.e(3966).then(n.t.bind(n,5568,19)),"~docs/default/tag-docs-tags-ui-22c.json",5568],"1a4e3797":[()=>Promise.all([n.e(2176),n.e(9648)]).then(n.bind(n,3416)),"@theme/SearchPage",3416],"1ab29606":[()=>n.e(6928).then(n.t.bind(n,7704,19)),"~docs/default/tag-docs-tags-apisauce-8de.json",7704],"1c9ea255":[()=>n.e(8636).then(n.bind(n,620)),"@site/docs/recipes/TypeScriptBaseURL.md",620],"1df93b7f":[()=>Promise.all([n.e(2176),n.e(2096),n.e(8552)]).then(n.bind(n,9184)),"@site/src/pages/index.tsx",9184],"24a07a83":[()=>n.e(4424).then(n.t.bind(n,4136,19)),"~docs/default/tag-docs-tags-generator-e43.json",4136],"24c3776a":[()=>n.e(9828).then(n.bind(n,176)),"@site/docs/recipes/DistributingAuthTokenToAPI.md",176],"3192f89a":[()=>n.e(4992).then(n.t.bind(n,590,19)),"/home/runner/work/ignite-cookbook/ignite-cookbook/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",590],"31ac2bc7":[()=>n.e(9632).then(n.t.bind(n,9010,19)),"~docs/default/tag-docs-tags-cng-585.json",9010],"33f24359":[()=>n.e(222).then(n.t.bind(n,1592,19)),"~docs/default/tag-docs-tags-eas-update-bce.json",1592],"3720c009":[()=>Promise.all([n.e(2176),n.e(4492)]).then(n.bind(n,2808)),"@theme/DocTagsListPage",2808],"3bb7a4af":[()=>n.e(2008).then(n.t.bind(n,7264,19)),"~docs/default/tag-docs-tags-i-os-d44.json",7264],"47a03c7f":[()=>n.e(3336).then(n.t.bind(n,7536,19)),"~docs/default/tag-docs-tags-testing-194.json",7536],"4a4fb967":[()=>n.e(6756).then(n.t.bind(n,9056,19)),"~docs/default/tag-docs-tags-accessibility-83c.json",9056],"4e09609f":[()=>n.e(3128).then(n.bind(n,8220)),"@site/docs/recipes/SampleYAMLCircleCI.md",8220],"51658ad1":[()=>n.e(9576).then(n.t.bind(n,5752,19)),"~docs/default/tag-docs-tags-intro-ce4.json",5752],"51e76fb5":[()=>n.e(5064).then(n.bind(n,4488)),"@site/docs/recipes/MaestroSetup.md",4488],"51ea30c5":[()=>n.e(2324).then(n.t.bind(n,162,19)),"~docs/default/tag-docs-tags-mob-x-748.json",162],"54a9c7e8":[()=>n.e(8576).then(n.bind(n,2716)),"@site/docs/recipes/PrepForEASBuild.md",2716],"55960ee5":[()=>n.e(4296).then(n.t.bind(n,2416,19)),"~docs/default/tags-list-current-prop-15a.json",2416],"569bff92":[()=>n.e(5320).then(n.t.bind(n,2968,19)),"~docs/default/tag-docs-tags-hardware-92c.json",2968],"5e95c892":[()=>n.e(4304).then(n.bind(n,3564)),"@theme/DocsRoot",3564],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,7768)),"@generated/docusaurus.config",7768],63181745:[()=>n.e(5548).then(n.bind(n,9108)),"@site/docs/recipes/UsingScreenReaders.md",9108],"657027a7":[()=>n.e(3180).then(n.bind(n,8232)),"@site/docs/recipes/MigratingToMMKV.md",8232],"6728e797":[()=>n.e(8616).then(n.t.bind(n,6824,19)),"~docs/default/tag-docs-tags-android-593.json",6824],"69dd30cd":[()=>n.e(4e3).then(n.t.bind(n,7672,19)),"~docs/default/tag-docs-tags-prettier-367.json",7672],"6fd287af":[()=>n.e(4264).then(n.bind(n,9700)),"@site/docs/recipes/UpdatingIgnite.md",9700],"72dfd944":[()=>n.e(40).then(n.t.bind(n,8466,19)),"~docs/default/tag-docs-tags-text-field-8cc.json",8466],"78a0b2f7":[()=>n.e(4224).then(n.bind(n,4068)),"@site/docs/recipes/SwitchBetweenExpoGoCNG.md",4068],"7acb6f50":[()=>n.e(56).then(n.t.bind(n,9200,19)),"~docs/default/tag-docs-tags-yarn-9bd.json",9200],"7b45617e":[()=>n.e(8436).then(n.bind(n,9368)),"@site/docs/recipes/GeneratorComponentTests.md",9368],82139467:[()=>n.e(7820).then(n.t.bind(n,5688,19)),"~docs/default/tag-docs-tags-react-native-vision-camera-af5.json",5688],"8b0d950b":[()=>n.e(3960).then(n.t.bind(n,4832,19)),"~docs/default/tag-docs-tags-dependencies-d4f.json",4832],"935f2afb":[()=>n.e(5696).then(n.t.bind(n,5988,19)),"~docs/default/version-current-metadata-prop-751.json",5988],"94ee064e":[()=>n.e(7300).then(n.t.bind(n,5683,19)),"~docs/default/tag-docs-tags-react-navigation-23c.json",5683],"954f316d":[()=>n.e(6044).then(n.t.bind(n,9272,19)),"~docs/default/tag-docs-tags-zustand-18e.json",9272],"985027d8":[()=>n.e(2160).then(n.t.bind(n,6843,19)),"~docs/default/tag-docs-tags-archive-6cf.json",6843],"99d16955":[()=>n.e(622).then(n.t.bind(n,5004,19)),"~docs/default/tag-docs-tags-eas-228.json",5004],"9dc0f37b":[()=>n.e(6704).then(n.t.bind(n,6154,19)),"~docs/default/tag-docs-tags-section-list-198.json",6154],"9fc76e3d":[()=>n.e(900).then(n.bind(n,8468)),"@site/docs/recipes/EASUpdate.md",8468],a0d6a633:[()=>n.e(7732).then(n.t.bind(n,1284,19)),"~docs/default/tag-docs-tags-expo-dev-client-4bf.json",1284],a2f5d017:[()=>n.e(916).then(n.bind(n,3884)),"@site/docs/recipes/Redux.md",3884],a7bd4aaa:[()=>n.e(6500).then(n.bind(n,2e3)),"@theme/DocVersionRoot",2e3],a8646ade:[()=>n.e(3008).then(n.t.bind(n,1492,19)),"~docs/default/tag-docs-tags-mmkv-046.json",1492],a8f9d519:[()=>n.e(6216).then(n.t.bind(n,606,19)),"~docs/default/tag-docs-tags-scroll-to-8d4.json",606],a94703ab:[()=>Promise.all([n.e(2176),n.e(4666)]).then(n.bind(n,996)),"@theme/DocRoot",996],a951c726:[()=>n.e(8200).then(n.t.bind(n,7976,19)),"~docs/default/tag-docs-tags-ci-cd-ed9.json",7976],abaad534:[()=>n.e(2464).then(n.t.bind(n,4684,19)),"/home/runner/work/ignite-cookbook/ignite-cookbook/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",4684],b33180cb:[()=>n.e(1528).then(n.bind(n,7160)),"@site/docs/archive/PristineExpoProject.md",7160],b3d1732c:[()=>n.e(95).then(n.t.bind(n,2464,19)),"~docs/default/tag-docs-tags-babel-ecc.json",2464],b832b2ff:[()=>n.e(4822).then(n.t.bind(n,2962,19)),"~docs/default/tag-docs-tags-imports-63f.json",2962],b8c37621:[()=>n.e(2372).then(n.t.bind(n,4328,19)),"~docs/default/tag-docs-tags-guide-a32.json",4328],c3e2f4d4:[()=>n.e(1264).then(n.bind(n,5800)),"@site/docs/recipes/UnrenderedItemInScrollView.md",5800],c47fa949:[()=>n.e(5032).then(n.bind(n,8332)),"@site/docs/recipes/ExpoRouter.md",8332],c5abe9fe:[()=>n.e(9607).then(n.t.bind(n,1344,19)),"~docs/default/tag-docs-tags-vision-camera-2ad.json",1344],c5ca3bf3:[()=>n.e(8872).then(n.t.bind(n,872,19)),"~docs/default/tag-docs-tags-expo-router-e61.json",872],c75b21fd:[()=>n.e(1412).then(n.bind(n,6188)),"@site/docs/recipes/RemoveMobxStateTree.md",6188],cc1d3934:[()=>n.e(8500).then(n.bind(n,5220)),"@site/docs/recipes/ReactNativeVisionCamera.md",5220],ccf3150e:[()=>n.e(7600).then(n.t.bind(n,3030,19)),"~docs/default/tag-docs-tags-ui-required-device-capabilities-7ff.json",3030],ce17b301:[()=>n.e(1388).then(n.t.bind(n,1540,19)),"~docs/default/tag-docs-tags-expo-4de.json",1540],cecd52bc:[()=>n.e(8).then(n.bind(n,6040)),"@site/docs/recipes/RequiringHardwareFeaturesWithExpo.md",6040],d01c4de2:[()=>n.e(7224).then(n.t.bind(n,488,19)),"~docs/default/tag-docs-tags-async-storage-da0.json",488],d0e08e4a:[()=>n.e(9016).then(n.bind(n,2980)),"@site/docs/recipes/PatchingBuildingAndroid.md",2980],d63d2b89:[()=>Promise.all([n.e(6432),n.e(5276)]).then(n.bind(n,6960)),"@site/docs/recipes/SelectFieldWithBottomSheet.mdx",6960],d699663a:[()=>n.e(1784).then(n.t.bind(n,5820,19)),"~docs/default/tag-docs-tags-uses-feature-818.json",5820],d6ab422f:[()=>n.e(8762).then(n.bind(n,7748)),"@site/docs/recipes/EnvironmentVariables.md",7748],d7af48b9:[()=>n.e(6264).then(n.bind(n,2508)),"@site/docs/recipes/EnforcingImportOrder.md",2508],da9277bc:[()=>n.e(5856).then(n.bind(n,1188)),"@site/docs/recipes/UpdatingDependencies.md",1188],dce6faa4:[()=>n.e(2596).then(n.t.bind(n,5892,19)),"~docs/default/tag-docs-tags-select-field-e86.json",5892],dd3340a6:[()=>n.e(7572).then(n.bind(n,8508)),"@site/docs/archive/index.md",8508],dec1aed8:[()=>n.e(9144).then(n.t.bind(n,4986,19)),"~docs/default/tag-docs-tags-maestro-a0f.json",4986],df203c0f:[()=>Promise.all([n.e(2176),n.e(3400)]).then(n.bind(n,8614)),"@theme/DocTagDocListPage",8614],e0854532:[()=>n.e(2288).then(n.t.bind(n,2456,19)),"~docs/default/tag-docs-tags-flat-list-bca.json",2456],e1b6b0a8:[()=>n.e(328).then(n.t.bind(n,2984,19)),"~docs/default/tag-docs-tags-debug-69b.json",2984],e2041b9b:[()=>n.e(7164).then(n.t.bind(n,9680,19)),"~docs/default/tag-docs-tags-redux-49b.json",9680],e33e793e:[()=>n.e(5708).then(n.bind(n,3356)),"@site/docs/recipes/Zustand.md",3356],e7928ab4:[()=>n.e(6460).then(n.t.bind(n,2080,19)),"/home/runner/work/ignite-cookbook/ignite-cookbook/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",2080],ecce3b64:[()=>n.e(3324).then(n.t.bind(n,4640,19)),"~docs/default/tag-docs-tags-authentication-9a3.json",4640],f50f3884:[()=>n.e(1236).then(n.t.bind(n,9720,19)),"~docs/default/tag-docs-tags-prebuild-64b.json",9720],f523b160:[()=>n.e(3504).then(n.bind(n,2232)),"@site/docs/recipes/CreatingGreateExperienceForScreenReaders.md",2232],fd1937a7:[()=>n.e(4116).then(n.t.bind(n,7472,19)),"~docs/default/tag-docs-tags-environment-variables-3be.json",7472],fe9b09bf:[()=>n.e(140).then(n.bind(n,1204)),"@site/docs/recipes/CircleCIRNSetup.md",1204],ff2c7cca:[()=>n.e(6252).then(n.t.bind(n,2248,19)),"~docs/default/tag-docs-tags-type-script-6e5.json",2248]};var s=n(7624);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(8120),u=n(5548);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(4552).then(n.bind(n,4552)),modules:["@theme/NotFound"],webpack:()=>[4552],render(e,t){const n=e.default;return(0,s.jsx)(u.Y,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],m=(0,c.c)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;return delete o.__context,(0,s.jsx)(u.Y,{value:i,children:(0,s.jsx)(a,{...o,...n})})}})}const p=[{path:"/search",component:d("/search","437"),exact:!0},{path:"/docs",component:d("/docs","d53"),routes:[{path:"/docs",component:d("/docs","195"),routes:[{path:"/docs/tags",component:d("/docs/tags","0cc"),exact:!0},{path:"/docs/tags/accessibility",component:d("/docs/tags/accessibility","8aa"),exact:!0},{path:"/docs/tags/android",component:d("/docs/tags/android","e3a"),exact:!0},{path:"/docs/tags/apisauce",component:d("/docs/tags/apisauce","143"),exact:!0},{path:"/docs/tags/archive",component:d("/docs/tags/archive","51b"),exact:!0},{path:"/docs/tags/async-storage",component:d("/docs/tags/async-storage","afc"),exact:!0},{path:"/docs/tags/authentication",component:d("/docs/tags/authentication","587"),exact:!0},{path:"/docs/tags/babel",component:d("/docs/tags/babel","e90"),exact:!0},{path:"/docs/tags/ci-cd",component:d("/docs/tags/ci-cd","56c"),exact:!0},{path:"/docs/tags/cng",component:d("/docs/tags/cng","581"),exact:!0},{path:"/docs/tags/debug",component:d("/docs/tags/debug","888"),exact:!0},{path:"/docs/tags/dependencies",component:d("/docs/tags/dependencies","c34"),exact:!0},{path:"/docs/tags/eas",component:d("/docs/tags/eas","17a"),exact:!0},{path:"/docs/tags/eas-update",component:d("/docs/tags/eas-update","632"),exact:!0},{path:"/docs/tags/environment-variables",component:d("/docs/tags/environment-variables","0f3"),exact:!0},{path:"/docs/tags/expo",component:d("/docs/tags/expo","a41"),exact:!0},{path:"/docs/tags/expo-dev-client",component:d("/docs/tags/expo-dev-client","0df"),exact:!0},{path:"/docs/tags/expo-router",component:d("/docs/tags/expo-router","257"),exact:!0},{path:"/docs/tags/expo-updates",component:d("/docs/tags/expo-updates","807"),exact:!0},{path:"/docs/tags/flat-list",component:d("/docs/tags/flat-list","5a7"),exact:!0},{path:"/docs/tags/generator",component:d("/docs/tags/generator","80e"),exact:!0},{path:"/docs/tags/guide",component:d("/docs/tags/guide","cea"),exact:!0},{path:"/docs/tags/hardware",component:d("/docs/tags/hardware","303"),exact:!0},{path:"/docs/tags/i-os",component:d("/docs/tags/i-os","96e"),exact:!0},{path:"/docs/tags/imports",component:d("/docs/tags/imports","887"),exact:!0},{path:"/docs/tags/intro",component:d("/docs/tags/intro","b42"),exact:!0},{path:"/docs/tags/maestro",component:d("/docs/tags/maestro","034"),exact:!0},{path:"/docs/tags/mmkv",component:d("/docs/tags/mmkv","f7e"),exact:!0},{path:"/docs/tags/mob-x",component:d("/docs/tags/mob-x","a01"),exact:!0},{path:"/docs/tags/prebuild",component:d("/docs/tags/prebuild","83d"),exact:!0},{path:"/docs/tags/prettier",component:d("/docs/tags/prettier","db7"),exact:!0},{path:"/docs/tags/react-native-vision-camera",component:d("/docs/tags/react-native-vision-camera","ea0"),exact:!0},{path:"/docs/tags/react-navigation",component:d("/docs/tags/react-navigation","0ad"),exact:!0},{path:"/docs/tags/redux",component:d("/docs/tags/redux","c5e"),exact:!0},{path:"/docs/tags/scroll-to",component:d("/docs/tags/scroll-to","f32"),exact:!0},{path:"/docs/tags/section-list",component:d("/docs/tags/section-list","8de"),exact:!0},{path:"/docs/tags/select-field",component:d("/docs/tags/select-field","5f4"),exact:!0},{path:"/docs/tags/state-management",component:d("/docs/tags/state-management","181"),exact:!0},{path:"/docs/tags/testing",component:d("/docs/tags/testing","b53"),exact:!0},{path:"/docs/tags/text-field",component:d("/docs/tags/text-field","782"),exact:!0},{path:"/docs/tags/type-script",component:d("/docs/tags/type-script","825"),exact:!0},{path:"/docs/tags/ui",component:d("/docs/tags/ui","020"),exact:!0},{path:"/docs/tags/ui-required-device-capabilities",component:d("/docs/tags/ui-required-device-capabilities","73a"),exact:!0},{path:"/docs/tags/uses-feature",component:d("/docs/tags/uses-feature","f1a"),exact:!0},{path:"/docs/tags/vision-camera",component:d("/docs/tags/vision-camera","e9b"),exact:!0},{path:"/docs/tags/yarn",component:d("/docs/tags/yarn","e4e"),exact:!0},{path:"/docs/tags/zustand",component:d("/docs/tags/zustand","24d"),exact:!0},{path:"/docs",component:d("/docs","05b"),routes:[{path:"/docs/archive/",component:d("/docs/archive/","ab8"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/archive/PristineExpoProject",component:d("/docs/archive/PristineExpoProject","afa"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/intro",component:d("/docs/intro","194"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/AccessibilityFontSizes",component:d("/docs/recipes/AccessibilityFontSizes","872"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/CircleCIRNSetup",component:d("/docs/recipes/CircleCIRNSetup","ce2"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/CreatingGreateExperienceForScreenReaders",component:d("/docs/recipes/CreatingGreateExperienceForScreenReaders","752"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/DetoxIntro",component:d("/docs/recipes/DetoxIntro","700"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/DistributingAuthTokenToAPI",component:d("/docs/recipes/DistributingAuthTokenToAPI","298"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/EASUpdate",component:d("/docs/recipes/EASUpdate","938"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/EnforcingImportOrder",component:d("/docs/recipes/EnforcingImportOrder","713"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/EnvironmentVariables",component:d("/docs/recipes/EnvironmentVariables","92b"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/ExpoRouter",component:d("/docs/recipes/ExpoRouter","0b5"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/GeneratorComponentTests",component:d("/docs/recipes/GeneratorComponentTests","e55"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/MaestroSetup",component:d("/docs/recipes/MaestroSetup","237"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/MigratingToMMKV",component:d("/docs/recipes/MigratingToMMKV","9d0"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/PatchingBuildingAndroid",component:d("/docs/recipes/PatchingBuildingAndroid","ac8"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/PrepForEASBuild",component:d("/docs/recipes/PrepForEASBuild","64a"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/ReactNativeVisionCamera",component:d("/docs/recipes/ReactNativeVisionCamera","e2e"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/Redux",component:d("/docs/recipes/Redux","0f8"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/RemoveMobxStateTree",component:d("/docs/recipes/RemoveMobxStateTree","50f"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/RequiringHardwareFeaturesWithExpo",component:d("/docs/recipes/RequiringHardwareFeaturesWithExpo","2fd"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/SampleYAMLCircleCI",component:d("/docs/recipes/SampleYAMLCircleCI","30a"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/SelectFieldWithBottomSheet",component:d("/docs/recipes/SelectFieldWithBottomSheet","ca3"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/SwitchBetweenExpoGoCNG",component:d("/docs/recipes/SwitchBetweenExpoGoCNG","695"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/TypeScriptBaseURL",component:d("/docs/recipes/TypeScriptBaseURL","986"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/UnrenderedItemInScrollView",component:d("/docs/recipes/UnrenderedItemInScrollView","c15"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/UpdatingDependencies",component:d("/docs/recipes/UpdatingDependencies","21c"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/UpdatingIgnite",component:d("/docs/recipes/UpdatingIgnite","f0c"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/UsingScreenReaders",component:d("/docs/recipes/UsingScreenReaders","324"),exact:!0,sidebar:"mainSidebar"},{path:"/docs/recipes/Zustand",component:d("/docs/recipes/Zustand","0e1"),exact:!0,sidebar:"mainSidebar"}]}]}]},{path:"/",component:d("/","703"),exact:!0},{path:"*",component:d("*")}]},240:(e,t,n)=>{"use strict";n.d(t,{e:()=>a,g:()=>i});var r=n(1504),o=n(7624);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},8808:(e,t,n)=>{"use strict";var r=n(1504),o=n(8352),a=n(440),i=n(2160),s=n(8684);const l=[n(7483),n(1462),n(5396),n(1976),n(9115)];var c=n(628),u=n(5592),d=n(5464),p=n(7624);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(6952),g=n(8264),h=n(964),y=n(1824),b=n(5008),v=n(1616),S=n(204),w=n(4456),x=n(5684),k=n(8712);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.c)(),r=(0,v.D)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(m.c,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function T(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.c)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.c)(),{pathname:r}=(0,u.IT)();return e+(0,x.applyTrailingSlash)((0,h.c)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(m.c,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function C(){const{i18n:{currentLocale:e}}=(0,g.c)(),{metadata:t,image:n}=(0,y.y)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.c,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:S.m})]}),n&&(0,p.jsx)(b.U7,{image:n}),(0,p.jsx)(T,{}),(0,p.jsx)(E,{}),(0,p.jsx)(k.c,{tag:w.e6,locale:e}),(0,p.jsx)(m.c,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const _=new Map;function A(e){if(_.has(e.pathname))return{...e,pathname:_.get(e.pathname)};if((0,d.C)(c.c,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return _.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return _.set(e.pathname,t),{...e,pathname:t}}var I=n(240),R=n(136),P=n(5288);function L(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,P.c)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),L("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function F(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.C)(c.c,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.c.canUseDOM?L("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=L("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),F(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(N,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(u.kX,{location:t,render:()=>e})})}}const j=O,M="__docusaurus-base-url-issue-banner-container",D="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container";function $(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n\n
Your Docusaurus site did not load properly.
\n
A very common reason is a wrong site baseUrl configuration.
\n
Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}
\n
We suggest trying baseUrl =
\n
\n`}(e)).replace(/{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(8120);const Q=new Set,Z=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!Z.has(e)&&!Q.has(e))(e))return!1;Q.add(e);const t=(0,d.C)(c.c,e).flatMap((e=>{return t=e.route.path,Object.entries(Y).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.c)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!Z.has(e))(e)&&(Z.add(e),F(e))},te=Object.freeze(ee),ne=Boolean(!0);if(s.c.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.EN,{children:(0,p.jsx)(a.kn,{children:(0,p.jsx)(q,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{if(ne)r.startTransition((()=>{o.hydrateRoot(e,t,{onRecoverableError:n})}));else{const a=o.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{a.render(t)}))}};F(window.location.pathname).then(s)}},136:(e,t,n)=>{"use strict";n.d(t,{e:()=>d,y:()=>p});var r=n(1504),o=n(7768);const a=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-1NP64B0XVM"],"anonymizeIP":true,"id":"default"}},"example-code-snippets":{"default":{"snippets":[{"author":"Mark Rickert","content":"import * as React from \\"react\\";\\nimport { View, TextProps, PixelRatio, AppState } from \\"react-native\\";\\nimport { MaterialTopTabNavigationOptions } from \\"@react-navigation/material-top-tabs\\";\\nimport { StackNavigationOptions } from \\"@react-navigation/stack\\";\\nimport { BottomTabNavigationOptions } from \\"@react-navigation/bottom-tabs\\";\\nimport { DrawerNavigationOptions } from \\"@react-navigation/drawer\\";\\nimport { Text } from \\"./Text\\";\\n\\n// These constants determine how much bigger the font size should get based on the user\'s\\n// accessibility settings. Even if they turn the dial all the way to 11, we will only ever\\n// scale the fonts by these factors. This is to prevent the font size from getting too large\\n// and completely breaking the layout.\\nconst MAX_FONT_SCALE = 1.2;\\nconst MIN_FONT_SCALE = 0.8;\\n\\n// Returns fontScaling props for Text and TextInput components\\n// Usage:\\n// const fontProps = useFontScaling();\\n// return Text Here;\\nexport const useFontScaling = (): Partial => {\\n // You probably want to get this value from your user\'s preferences\\n const [allowFontScaling,] = React.useState(true);\\n\\n const fontScaling: Partial = React.useMemo(() => {\\n return {\\n minimumFontScale: allowFontScaling ? MIN_FONT_SCALE : 1, // This prevents the font from getting too small.\\n maxFontSizeMultiplier: allowFontScaling ? MAX_FONT_SCALE : 1, // This prevents the font from getting too big.\\n allowFontScaling, // This allows the font to be scaled or not.\\n };\\n }, [allowFontScaling]);\\n\\n return fontScaling;\\n};\\n\\n// Returns fontScaling props for Navigator components\\nexport const useNavigatorFontScalingScreenOptions =\\n (): Partial => {\\n // You probably want to get this value from your user\'s preferences\\n const [allowFontScaling,] = React.useState(true);\\n\\n const fontScaling: Partial = React.useMemo(() => {\\n return {\\n headerBackAllowFontScaling: allowFontScaling,\\n headerTitleAllowFontScaling: allowFontScaling,\\n };\\n }, [allowFontScaling]);\\n\\n return fontScaling;\\n };\\n\\n// Returns fontScaling props for Top Tab Navigator components\\nexport const useTopTabNavigatorFontScalingScreenOptions =\\n (): Partial => {\\n // You probably want to get this value from your user\'s preferences\\n const [allowFontScaling,] = React.useState(true);\\n\\n const fontScaling: Partial =\\n React.useMemo(() => {\\n return {\\n tabBarAllowFontScaling: allowFontScaling,\\n };\\n }, [allowFontScaling]);\\n\\n return fontScaling;\\n };\\n\\n// Returns fontScaling props for Tab Navigator components\\nexport const useTabNavigatorFontScalingScreenOptions =\\n (): Partial => {\\n // You probably want to get this value from your user\'s preferences\\n const [allowFontScaling,] = React.useState(true);\\n\\n const fontScaling: Partial =\\n React.useMemo(() => {\\n return {\\n tabBarAllowFontScaling: fontScaling,\\n headerTitleAllowFontScaling: fontScaling,\\n };\\n }, [allowFontScaling]);\\n\\n return fontScaling;\\n };\\n\\n// Returns fontScaling props for Tab Navigator components\\nexport const useDrawerNavigatorFontScalingScreenOptions =\\n (): Partial => {\\n const [allowFontScaling,] = React.useState(true);\\n\\n const fontScaling: Partial = React.useMemo(() => {\\n return {\\n drawerAllowFontScaling: allowFontScaling,\\n headerTitleAllowFontScaling: allowFontScaling,\\n };\\n }, [allowFontScaling]);\\n\\n return fontScaling;\\n };\\n\\n// Use this handy __DEV__ mode only component to figure out what the font size is actually doing.\\nexport const DevFontSize = () => {\\n const [allowFontScaling,] = React.useState(true);\\n const [appStateVisible, setAppStateVisible] = React.useState(\\n AppState.currentState\\n );\\n\\n React.useEffect(() => {\\n const subscription = AppState.addEventListener(\\"change\\", (nextAppState) => {\\n setAppStateVisible(nextAppState);\\n });\\n\\n return () => subscription.remove();\\n }, []);\\n\\n // This memo has to listen to appStateVisible even though it\'s not a direct dependency\\n // so that we can reload the font size when the app switches back from user settings.\\n const fontSize = React.useMemo(() => {\\n if (allowFontScaling) {\\n return Math.min(\\n Math.max(PixelRatio.getFontScale(), MIN_FONT_SCALE),\\n MAX_FONT_SCALE\\n );\\n } else {\\n return 1.0;\\n }\\n }, [allowFontScaling, appStateVisible]); // eslint-disable-line react-hooks/exhaustive-deps\\n\\n return __DEV__ ? (\\n \\n \\n User Font Setting: {Math.trunc(PixelRatio.getFontScale() * 100) / 100}\\n \\n \\n Currently limiting ratio to: {Math.trunc(fontSize * 100) / 100}\\n \\n \\n ) : null;\\n};\\n\\n","lastUpdated":"1 year ago","title":"Accessiblity Font Sizes","publish_date":"2022-10-09","doc_name":"AccessibilityFontSizes.md"},{"author":"Robin Heinze","content":"defaults: &defaults\\n docker:\\n # Choose the version of Node you want here\\n - image: circleci/node:10.11\\n working_directory: ~/repo\\n\\nversion: 2\\njobs:\\n setup:\\n <<: *defaults\\n steps:\\n - checkout\\n - restore_cache:\\n keys:\\n - v1-dependencies-node-{{ checksum \\"package.json\\" }}\\n # fallback to using the latest cache if no exact match is found\\n - v1-dependencies-node-\\n - run:\\n name: Install dependencies\\n command: yarn install\\n - save_cache:\\n name: Save node modules\\n paths:\\n - node_modules\\n key: v1-dependencies-node-{{ checksum \\"package.json\\" }}\\n\\n tests:\\n <<: *defaults\\n steps:\\n - checkout\\n - restore_cache:\\n keys:\\n - v1-dependencies-node-{{ checksum \\"package.json\\" }}\\n # fallback to using the latest cache if no exact match is found\\n - v1-dependencies-node-\\n - run:\\n name: Run tests\\n command: yarn ci:test # this command will be added to/found in your package.json scripts\\n\\nworkflows:\\n version: 2\\n test_and_release:\\n jobs:\\n - setup\\n - tests:\\n requires:\\n - setup\\n\\n {\\n ...\\n \\"scripts\\": {\\n ...\\n \\"ci:test\\": \\"\\" <<-- if you don\'t already have this one\\n },\\n ...\\n }\\n\\nbefore_all do\\n setup_circle_ci\\nend\\n\\nPROJECT = \\"YourProject\\"\\nXCODE_PROJECT = \\"#{PROJECT}.xcodeproj\\"\\n lane :beta do\\n increment_build_number(xcodeproj: \\"./#{XCODE_PROJECT}\\")\\n match(type: \\"appstore\\")\\n build_ios_app(\\n scheme: PROJECT,\\n workspace: \\"./YourProject.xcworkspace\\",\\n xcargs: \\"-UseNewBuildSystem=NO -allowProvisioningUpdates\\",\\n export_method: \\"app-store\\"\\n )\\n # Ship it!\\n upload_to_testflight(\\n skip_waiting_for_build_processing: true\\n )\\n commit_version_bump(\\n xcodeproj: \\"./#{XCODE_PROJECT}\\",\\n ignore: /tvOS/,\\n force: true,\\n message: \\"[skip ci] Version bump\\"\\n )\\n end\\n\\n {\\n ...\\n \\"scripts\\": {\\n ...\\n \\"ci:setup\\": \\"touch .env && echo \\\\\\"ENV_VAR=\\\\\\"$ENV_VAR >> .env\\",\\n },\\n ...\\n }\\n\\ndefaults: ...\\n\\nmac: &mac\\n macos:\\n xcode: \\"10.1.0\\"\\n working_directory: ~/repo\\n environment:\\n FL_OUTPUT_DIR: output\\n shell: /bin/bash --login -o pipefail\\n\\nversion: 2\\njobs:\\n setup: ...\\n\\n tests: ...\\n\\n deploy_ios:\\n <<: *mac\\n steps:\\n - checkout\\n - add_ssh_keys:\\n fingerprints: \u2014 \u201cSSH_FINGERPRINT_HERE\u201d\\n - run:\\n name: Git configuration\\n command: git config user.email \\"ci@your.domain\\" && git config user.name \\"CircleCI\\"\\n - run:\\n name: Set upstream branch\\n command: git branch --set-upstream-to origin ${CIRCLE_BRANCH}\\n # Node modules\\n - restore_cache:\\n name: Restore node modules\\n keys:\\n - v1-dependencies-mac-{{ checksum \\"package.json\\" }}\\n # fallback to using the latest cache if no exact match is found\\n - v1-dependencies-mac-\\n - run:\\n name: Install dependencies\\n command: NOYARNPOSTINSTALL=1 yarn install\\n - save_cache:\\n name: Save node modules\\n paths:\\n - node_modules\\n key: v1-dependencies-mac-{{ checksum \\"package.json\\" }}\\n\\n # Cocoapods\\n - run:\\n name: Fetch CocoaPods Specs\\n command: |\\n curl https://cocoapods-specs.circleci.com/fetch-cocoapods-repo-from-s3.sh | bash -s cf\\n - run:\\n working_directory: ios\\n name: Install CocoaPods\\n command: pod install --verbose\\n\\n # Gems\\n - restore_cache:\\n name: Restore gems\\n key: bundle-v1-{{ checksum \\"ios/Gemfile.lock\\" }}-{{ arch }}\\n - run:\\n name: Bundle Install\\n command: bundle install\\n working_directory: ios\\n - save_cache:\\n key: bundle-v1-{{ checksum \\"ios/Gemfile.lock\\" }}-{{ arch }}\\n paths:\\n - vendor/bundle\\n\\n # Misc setup\\n - run:\\n name: Misc setup\\n command: yarn ci:setup\\n\\n # Git grooming\\n - run:\\n name: Pull latest git\\n command: git stash && git pull && git stash pop\\n\\n # Run Fastlane\\n - run:\\n working_directory: ios\\n name: Fastlane\\n command: bundle exec fastlane ios beta\\n\\n # Git cleanup\\n - run:\\n name: Pull latest git\\n command: git stash && git pull && git stash pop\\n - run:\\n name: Push version bump commit\\n command: git push\\n - store_artifacts:\\n path: output\\n\\nworkflows:\\n version: 2\\n test_and_release:\\n jobs:\\n - setup\\n - tests:\\n requires:\\n - setup\\n - deploy_ios:\\n filters:\\n branches:\\n only: master\\n\\n\\n**Troubleshooting tips**\\n\\n- If you need to debug failed builds, you can use the \\"Rebuild with SSH\\" option in CircleCI. See [https://circleci.com/docs/2.0/ssh-access-jobs/](https://circleci.com/docs/2.0/ssh-access-jobs/) for more info.\\n- Tip: make sure you are logged in to Github/CircleCI as yourself (not the CI user) when you hit the button to rebuild with SSH.\\n- If you get a vague error saying `File main.jsbundle does not exist`, that means there was an error while building the app and you can view the more detailed message by inspecting the log files with the following command (while in SSH mode). Increase the number of lines from 50 as needed.\\n- `tail -50 ios/output/buildlogs/gym/YourProject-YourProject.log`\\n","lastUpdated":"1 year, 1 month ago","title":"CircleCI CD Setup - React Native","publish_date":"2022-10-09","doc_name":"CircleCIRNSetup.md"},{"author":"Ellie Croce","content":"export const DEFAULT_API_CONFIG: ApiConfig = {\\n url: Config.API_URL,\\n timeout: 10000,\\n}\\n\\n\\nexport class Api {\\n apisauce: ApisauceInstance\\n config: ApiConfig\\n\\n constructor(config: ApiConfig = DEFAULT_API_CONFIG) {\\n this.config = config\\n this.apisauce = create({\\n baseURL: this.config.url,\\n timeout: this.config.timeout,\\n headers: {\\n Accept: \\"application/json\\",\\n },\\n })\\n }\\n\\n async getEpisodes(): Promise<{ kind: \\"ok\\"; episodes: EpisodeSnapshotIn[] } | GeneralApiProblem> {\\n ... // example API call that needs authenticating\\n }\\n\\n}\\n\\n// Singleton instance of the API for convenience\\nexport const api = new Api()\\n\\nimport { Instance, SnapshotOut, types } from \\"mobx-state-tree\\";\\n\\nexport const AuthenticationStoreModel = types\\n .model(\\"AuthenticationStore\\")\\n .props({\\n authToken: types.maybe(types.string),\\n authEmail: \\"\\",\\n })\\n .views((store) => ({}))\\n .actions((store) => ({\\n setAuthToken(value?: string) {\\n store.authToken = value;\\n },\\n }));\\n\\nexport interface AuthenticationStore\\n extends Instance {}\\nexport interface AuthenticationStoreSnapshot\\n extends SnapshotOut {}\\n\\n\\t// We will need to import the api from the service\\n\\timport { api } from \\"app/services/api\\"\\n\\n ...\\n\\n // then update the Authentication Model actions\\n .actions((store) => ({\\n setAuthToken(value?: string) {\\n store.authToken = value;\\n },\\n distributeAuthToken(value?: string) {\\n // optionally grab the store\'s authToken if not passing a value\\n const token = value || store.authToken;\\n api.apiSauce.setHeader(\\"Authorization\\", `Bearer ${token}`);\\n },\\n })\\n\\n\\t// We can update `authenticationStore` from the useStores hook to include `distributeAuthToken`\\n\\tconst {\\n\\t authenticationStore: { authEmail, setAuthEmail, setAuthToken, distributeAuthToken, validationError },\\n\\t } = useStores()\\n\\n\\t ...\\n\\n function login() {\\n setIsSubmitted(true);\\n setAttemptsCount(attemptsCount + 1);\\n\\n if (validationError) return;\\n\\n // Make a request to your server to get an authentication token.\\n // If successful, reset the fields and set the token.\\n setIsSubmitted(false);\\n setAuthPassword(\\"\\");\\n setAuthEmail(\\"\\");\\n\\n // We\'ll mock this with a fake token.\\n const token = String(Date.now());\\n setAuthToken(token);\\n distributeAuthToken(token);\\n }\\n\\n","lastUpdated":"10 months ago","title":"Distributing Auth Token to APIs","publish_date":"2023-05-09","doc_name":"DistributingAuthTokenToAPI.md"},{"author":"Frank Calise","content":"npm install -g eas-cli\\n\\nnpx expo install expo-updates\\neas build:configure\\n\\neas update:configure\\n\\n{\\n \\"cli\\": {\\n \\"version\\": \\">= 3.0.0\\"\\n },\\n \\"build\\": {\\n \\"development\\": {\\n \\"developmentClient\\": true,\\n \\"distribution\\": \\"internal\\"\\n },\\n \\"preview\\": {\\n \\"channel\\": \\"preview\\",\\n \\"android\\": { \\"buildType\\": \\"apk\\" },\\n \\"ios\\": { \\"simulator\\": false }\\n },\\n \\"production\\": {}\\n },\\n \\"submit\\": {\\n \\"production\\": {}\\n }\\n}\\n\\n# via EAS\\neas build --profile preview -p android\\n\\n# locally\\neas build --profile preview -p android --local\\n\\n// error-line\\n\\n// success-line\\n\\n\\neas channel:create preview\\n\\neas update --branch preview --message \\"update login screen\\"\\n\\n{\\n // ...\\n \\"updates\\": {\\n \\"checkAutomatically\\": \\"ON_ERROR_RECOVERY\\"\\n // ...\\n }\\n}\\n\\n","lastUpdated":"3 weeks ago","title":"EAS Update","publish_date":"2023-01-06","doc_name":"EASUpdate.md"},{"author":"Mark Rickert","content":"npx ignite-cli new PizzaApp --workflow=cng --yes\\ncd PizzaApp\\n\\nyarn add --dev @serverless-guru/prettier-plugin-import-order\\n\\n// @ts-check\\n/** @type {import(\\"@serverless-guru/prettier-plugin-import-order\\").PrettierConfig} */\\nmodule.exports = {\\n // begin: settings from the package.json file\\n printWidth: 100,\\n semi: false,\\n singleQuote: false,\\n trailingComma: \\"all\\",\\n // end: settings from the package.json file\\n\\n // Sort and group imports using the @serverless-guru/prettier-import-order plugin.\\n // https://github.com/serverless-guru/prettier-import-order\\n //\\n // See documentation and usage: https://www.npmjs.com/package/@serverless-guru/prettier-plugin-import-order#usage\\n importOrder: [\\n \\"^react(-native)?$\\", // React and react-native stuff goes at the top\\n \\"\\", // use empty strings to separate groups with empty lines\\n \\"\\", // Third party modules (this is a plugin keyword)\\n \\"\\",\\n \\"^app/(.*)$\\",\\n \\"\\",\\n \\"^../(.*)$\\", // Local imports in parent directories\\n \\"^./(.*)$\\", // Local imports in current directory\\n ],\\n importOrderSeparation: false, // turn this on to see the sorting groups.\\n importOrderSortIndividualImports: true,\\n importOrderMergeDuplicateImports: true,\\n importOrderTypeImportsToTop: true, // Set this to false if you want type imports to be sorted with the rest of the imports\\n importOrderCaseInsensitive: true,\\n importOrderParserPlugins: [\\"typescript\\", \\"jsx\\"],\\n // End sort options\\n}\\n\\nyarn format\\n\\n","lastUpdated":"11 days ago","title":"Enforcing JS/TS Import Order","publish_date":"2024-02-29","doc_name":"EnforcingImportOrder.md"},{"author":"Frank Calise","content":"yarn add -D dotenv babel-plugin-inline-dotenv\\n\\n// babel.config.js\\n\\nconst plugins = [\\n [\\n \\"@babel/plugin-proposal-decorators\\",\\n {\\n legacy: true,\\n },\\n ],\\n [\\"@babel/plugin-proposal-optional-catch-binding\\"],\\n \\"inline-dotenv\\",\\n \\"react-native-reanimated/plugin\\", // NOTE: this must be last in the plugins\\n];\\n\\nconst expoConfig = {\\n presets: [\\"babel-preset-expo\\"],\\n env: {\\n production: {},\\n },\\n plugins,\\n};\\n\\nMY_VAR=\\"MY_VALUE\\"\\nKEEP_IN_MIND=\\"THESE ARE NOT SECURE\\"\\n\\nconsole.log(process.env.MY_VAR); // results in: MY_VALUE\\nconsole.log(process.env.KEEP_IN_MIND); // results in: THESE ARE NOT SECURE\\n\\n","lastUpdated":"1 year, 2 months ago","title":"Environment Variables","publish_date":"2022-10-11","doc_name":"EnvironmentVariables.md"},{"author":"Frank Calise & Justin Poliachik","content":"npx ignite-cli@next new pizza-router --yes\\ncd pizza-router\\n\\nnpx expo install expo-router expo-constants\\n\\n\\"plugins\\": [\\n ...\\n \\"expo-font\\",\\n // success-line\\n \\"expo-router\\"\\n],\\n\\n// error-line\\n\\"main\\": \\"node_modules/expo/AppEntry.js\\",\\n// success-line\\n\\"main\\": \\"expo-router/entry\\",\\n\\n{\\n \\"expo\\": {\\n \\"experiments\\": {\\n \\"tsconfigPaths\\": true,\\n // success-line\\n \\"typedRoutes\\": true\\n }\\n }\\n}\\n\\nrm App.tsx\\nmv app src\\nmkdir src/app\\n\\n{\\n \\"compilerOptions\\": {\\n // ...\\n \\"paths\\": {\\n // error-line\\n \\"app/*\\": [\\"./app/*\\"],\\n // success-line\\n \\"src/*\\": [\\"./src/*\\"],\\n // ...\\n },\\n }\\n // error-line-start\\n \\"include\\": [\\n \\"index.js\\",\\n \\"App.tsx\\",\\n \\"app\\",\\n \\"types\\",\\n \\"plugins\\",\\n \\"app.config.ts\\",\\n \\".expo/types/**/*.ts\\",\\n \\"expo-env.d.ts\\"\\n ],\\n // error-line-end\\n // success-line\\n \\"include\\": [\\"**/*.ts\\", \\"**/*.tsx\\"],\\n // ...\\n}\\n\\n// error-line-start\\n\\"format\\": \\"prettier --write \\\\\\"app/**/*.{js,jsx,json,md,ts,tsx}\\\\\\"\\",\\n\\"lint\\": \\"eslint App.tsx app test --fix --ext .js,.ts,.tsx && npm run format\\",\\n// error-line-end\\n// success-line-start\\n\\"format\\": \\"prettier --write \\\\\\"src/**/*.{js,jsx,json,md,ts,tsx}\\\\\\"\\",\\n\\"lint\\": \\"eslint src test --fix --ext .js,.ts,.tsx && npm run format\\",\\n// success-line-end\\n\\n// error-line-start\\nimport { clear } from \\"app/utils/storage\\";\\nimport { goBack, resetRoot, navigate } from \\"app/navigators/navigationUtilities\\";\\n// error-line-end\\n// success-line-start\\nimport { clear } from \\"src/utils/storage\\";\\nimport { goBack, resetRoot, navigate } from \\"src/navigators/navigationUtilities\\";\\n// success-line-end\\n\\n// error-line\\nimport { isRTL } from \\"app/i18n\\";\\n// success-line\\nimport { isRTL } from \\"src/i18n\\";\\n\\n// error-line\\nimport en from \\"../app/i18n/en\\";\\n// success-line\\nimport en from \\"../src/i18n/en\\";\\nimport { exec } from \\"child_process\\";\\n\\n---\\npatch:\\n // error-line\\n path: \\"app/components/index.ts\\"\\n // success-line\\n path: \\"src/components/index.ts\\"\\n append: \\"export * from \\\\\\"./<%= props.subdirectory %><%= props.pascalCaseName %>\\\\\\"\\\\n\\"\\n skip: <%= props.skipIndexFile %>\\n---\\nimport * as React from \\"react\\"\\nimport { StyleProp, TextStyle, View, ViewStyle } from \\"react-native\\"\\nimport { observer } from \\"mobx-react-lite\\"\\n// error-line-start\\nimport { colors, typography } from \\"app/theme\\"\\nimport { Text } from \\"app/components/Text\\"\\n// error-line-end\\n// success-line-start\\nimport { colors, typography } from \\"src/theme\\"\\nimport { Text } from \\"src/components/Text\\"\\n// success-line-end\\n\\n---\\npatches:\\n// error-line\\n- path: \\"app/models/RootStore.ts\\"\\n// success-line\\n- path: \\"src/models/RootStore.ts\\"\\n after: \\"from \\\\\\"mobx-state-tree\\\\\\"\\\\n\\"\\n insert: \\"import { <%= props.pascalCaseName %>Model } from \\\\\\"./<%= props.pascalCaseName %>\\\\\\"\\\\n\\"\\n skip: <%= !props.pascalCaseName.endsWith(\'Store\') %>\\n// error-line\\n- path: \\"app/models/RootStore.ts\\"\\n// success-line\\n- path: \\"src/models/RootStore.ts\\"\\n after: \\"types.model(\\\\\\"RootStore\\\\\\").props({\\\\n\\"\\n insert: \\" <%= props.camelCaseName %>: types.optional(<%= props.pascalCaseName %>Model, {} as any),\\\\n\\"\\n skip: <%= !props.pascalCaseName.endsWith(\'Store\') %>\\n// error-line\\n- path: \\"app/models/index.ts\\"\\n// success-line\\n- path: \\"src/models/index.ts\\"\\n\\n\\n// app/_layout.tsx\\nimport React from \\"react\\";\\nimport { Slot, SplashScreen } from \\"expo-router\\";\\nimport { useInitialRootStore } from \\"src/models\\";\\n\\nSplashScreen.preventAutoHideAsync();\\n\\nif (__DEV__) {\\n // Load Reactotron configuration in development. We don\'t want to\\n // include this in our production bundle, so we are using `if (__DEV__)`\\n // to only execute this in development.\\n require(\\"src/devtools/ReactotronConfig.ts\\");\\n}\\n\\nexport { ErrorBoundary } from \\"src/components/ErrorBoundary/ErrorBoundary\\";\\n\\nexport default function Root() {\\n // Wait for stores to load and render our layout inside of it so we have access\\n // to auth info etc\\n const { rehydrated } = useInitialRootStore();\\n if (!rehydrated) {\\n return null;\\n }\\n\\n return ;\\n}\\n\\nmkdir src/components/ErrorBoundary\\nmv src/screens/ErrorScreen/* src/components/ErrorBoundary\\n\\nimport React from \\"react\\";\\nimport { Redirect, SplashScreen, Stack } from \\"expo-router\\";\\nimport { observer } from \\"mobx-react-lite\\";\\nimport { useStores } from \\"src/models\\";\\nimport { useFonts } from \\"expo-font\\";\\nimport { customFontsToLoad } from \\"src/theme\\";\\n\\nexport default observer(function Layout() {\\n const {\\n authenticationStore: { isAuthenticated },\\n } = useStores();\\n\\n const [fontsLoaded, fontError] = useFonts(customFontsToLoad);\\n\\n React.useEffect(() => {\\n if (fontsLoaded || fontError) {\\n // Hide the splash screen after the fonts have loaded and the UI is ready.\\n SplashScreen.hideAsync();\\n }\\n }, [fontsLoaded, fontError]);\\n\\n if (!fontsLoaded && !fontError) {\\n return null;\\n }\\n\\n if (!isAuthenticated) {\\n return ;\\n }\\n\\n return ;\\n});\\n\\nimport { router } from \\"expo-router\\";\\nimport { observer } from \\"mobx-react-lite\\";\\nimport React, { ComponentType, useEffect, useMemo, useRef, useState } from \\"react\\";\\nimport { TextInput, TextStyle, ViewStyle } from \\"react-native\\";\\nimport { Button, Icon, Screen, Text, TextField, TextFieldAccessoryProps } from \\"src/components\\";\\nimport { useStores } from \\"src/models\\";\\nimport { colors, spacing } from \\"src/theme\\";\\n\\nexport default observer(function Login(_props) {\\n const authPasswordInput = useRef(null);\\n\\n const [authPassword, setAuthPassword] = useState(\\"\\");\\n const [isAuthPasswordHidden, setIsAuthPasswordHidden] = useState(true);\\n const [isSubmitted, setIsSubmitted] = useState(false);\\n const [attemptsCount, setAttemptsCount] = useState(0);\\n const {\\n authenticationStore: { authEmail, setAuthEmail, setAuthToken, validationError },\\n } = useStores();\\n\\n useEffect(() => {\\n // Here is where you could fetch credentials from keychain or storage\\n // and pre-fill the form fields.\\n setAuthEmail(\\"ignite@infinite.red\\");\\n setAuthPassword(\\"ign1teIsAwes0m3\\");\\n\\n // Return a \\"cleanup\\" function that React will run when the component unmounts\\n return () => {\\n setAuthPassword(\\"\\");\\n setAuthEmail(\\"\\");\\n };\\n }, []);\\n\\n const error = isSubmitted ? validationError : \\"\\";\\n\\n function login() {\\n setIsSubmitted(true);\\n setAttemptsCount(attemptsCount + 1);\\n\\n if (validationError) return;\\n\\n // Make a request to your server to get an authentication token.\\n // If successful, reset the fields and set the token.\\n setIsSubmitted(false);\\n setAuthPassword(\\"\\");\\n setAuthEmail(\\"\\");\\n\\n // We\'ll mock this with a fake token.\\n setAuthToken(String(Date.now()));\\n\\n // navigate to the main screen\\n router.replace(\\"/\\");\\n }\\n\\n const PasswordRightAccessory: ComponentType = useMemo(\\n () =>\\n function PasswordRightAccessory(props: TextFieldAccessoryProps) {\\n return (\\n setIsAuthPasswordHidden(!isAuthPasswordHidden)}\\n />\\n );\\n },\\n [isAuthPasswordHidden]\\n );\\n\\n return (\\n \\n \\n \\n {attemptsCount > 2 && }\\n\\n authPasswordInput.current?.focus()}\\n />\\n\\n \\n\\n \\n \\n );\\n});\\n\\nconst $screenContentContainer: ViewStyle = {\\n paddingVertical: spacing.xxl,\\n paddingHorizontal: spacing.lg,\\n};\\n\\nconst $signIn: TextStyle = {\\n marginBottom: spacing.sm,\\n};\\n\\nconst $enterDetails: TextStyle = {\\n marginBottom: spacing.lg,\\n};\\n\\nconst $hint: TextStyle = {\\n color: colors.tint,\\n marginBottom: spacing.md,\\n};\\n\\nconst $textField: ViewStyle = {\\n marginBottom: spacing.lg,\\n};\\n\\nconst $tapButton: ViewStyle = {\\n marginTop: spacing.xs,\\n};\\n\\nimport { router } from \\"expo-router\\";\\nimport { observer } from \\"mobx-react-lite\\";\\nimport React from \\"react\\";\\nimport { Image, ImageStyle, TextStyle, View, ViewStyle } from \\"react-native\\";\\nimport { Button, Text } from \\"src/components\\";\\nimport { isRTL } from \\"src/i18n\\";\\nimport { useStores } from \\"src/models\\";\\nimport { colors, spacing } from \\"src/theme\\";\\nimport { useHeader } from \\"src/utils/useHeader\\";\\nimport { useSafeAreaInsetsStyle } from \\"src/utils/useSafeAreaInsetsStyle\\";\\n\\nconst welcomeLogo = require(\\"assets/images/logo.png\\");\\nconst welcomeFace = require(\\"assets/images/welcome-face.png\\");\\n\\nexport default observer(function WelcomeScreen() {\\n const {\\n authenticationStore: { logout },\\n } = useStores();\\n\\n function goNext() {\\n router.replace(\\"/showroom\\");\\n }\\n\\n useHeader(\\n {\\n rightTx: \\"common.logOut\\",\\n onRightPress: logout,\\n },\\n [logout]\\n );\\n\\n const $bottomContainerInsets = useSafeAreaInsetsStyle([\\"bottom\\"]);\\n\\n return (\\n \\n \\n \\n \\n \\n \\n \\n\\n \\n \\n \\n \\n \\n );\\n});\\n\\nconst $container: ViewStyle = {\\n flex: 1,\\n backgroundColor: colors.background,\\n};\\n\\nconst $topContainer: ViewStyle = {\\n flexShrink: 1,\\n flexGrow: 1,\\n flexBasis: \\"57%\\",\\n justifyContent: \\"center\\",\\n paddingHorizontal: spacing.lg,\\n};\\n\\nconst $bottomContainer: ViewStyle = {\\n flexShrink: 1,\\n flexGrow: 0,\\n flexBasis: \\"43%\\",\\n backgroundColor: colors.palette.neutral100,\\n borderTopLeftRadius: 16,\\n borderTopRightRadius: 16,\\n paddingHorizontal: spacing.lg,\\n justifyContent: \\"space-around\\",\\n};\\nconst $welcomeLogo: ImageStyle = {\\n height: 88,\\n width: \\"100%\\",\\n marginBottom: spacing.xxl,\\n};\\n\\nconst $welcomeFace: ImageStyle = {\\n height: 169,\\n width: 269,\\n position: \\"absolute\\",\\n bottom: -47,\\n right: -80,\\n transform: [{ scaleX: isRTL ? -1 : 1 }],\\n};\\n\\nconst $welcomeHeading: TextStyle = {\\n marginBottom: spacing.md,\\n};\\n\\nimport React from \\"react\\";\\nimport { Tabs } from \\"expo-router/tabs\\";\\nimport { observer } from \\"mobx-react-lite\\";\\nimport { Icon } from \\"src/components\\";\\nimport { translate } from \\"src/i18n\\";\\nimport { colors, spacing, typography } from \\"src/theme\\";\\nimport { TextStyle, ViewStyle } from \\"react-native\\";\\nimport { useSafeAreaInsets } from \\"react-native-safe-area-context\\";\\n\\nexport default observer(function Layout() {\\n const { bottom } = useSafeAreaInsets();\\n\\n return (\\n \\n ,\\n }}\\n />\\n ,\\n }}\\n />\\n ,\\n }}\\n />\\n