diff --git a/.eslintrc.json b/.eslintrc.json index aa278779..735968d5 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -90,6 +90,7 @@ "react/react-in-jsx-scope": "off", "react/require-default-props": "off", "react/state-in-constructor": "off", + "camelcase": "off", "react/no-unescaped-entities": [ "error", { diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d89362b4..c0ade563 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -64,3 +64,17 @@ jobs: - name: tsc run: yarn tsc + + - name: 🏗 Setup EAS + uses: expo/expo-github-action@v8 + with: + eas-version: latest + eas-cache: true + expo-cache: true + token: ${{ secrets.FOAM_RELEASE_TOKEN }} + + - name: 🚀 Create preview + uses: expo/expo-github-action/preview@v8 + with: + command: eas update --auto + github-token: ${{ secrets.FOAM_GITHUB_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..0e8b97d0 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,100 @@ +name: Release app +on: + workflow_dispatch: +env: + NODE_VERSION: 18.18.0 + FOAM_RELEASE_TOKEN: ${{ secrets.FOAM_RELEASE_TOKEN }} + +jobs: + release: + concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-${{ github.sha }}-release + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + + name: Build + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - name: Check for FOAM_RELEASE_TOKEN + run: | + if [ -z "${{ secrets.FOAM_RELEASE_TOKEN }}" ]; then + echo "You must provide an FOAM_RELEASE_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" + exit 1 + fi + + - name: Install moreutils + run: sudo apt install moreutils + + # https://github.com/actions/virtual-environments/issues/1187 + - name: tune linux network + run: sudo ethtool -K eth0 tx off rx off + + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Checkout + uses: actions/checkout@v4 + + - name: get yarn cache directory + id: cache + run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT + shell: bash + working-directory: ./ + + - name: setup yarn cache + uses: actions/cache@v3 + id: yarn-cache + with: + path: ${{ steps.cache.outputs.dir }} + key: yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + yarn- + + - name: install yarn + run: corepack enable + + - name: Install dependencies + run: yarn + + - name: format:check + run: yarn format:check + + - name: lint + run: yarn lint + + - name: jest + run: yarn test + + - name: tsc + run: yarn tsc + + # PUBLISH + - name: new version + run: | + git config user.name "${{ github.actor }}" + git config user.email "${{ github.actor }}@users.noreply.github.com" + npx lerna publish --yes --conventional-commits --force-publish --no-push --create-release github + git push -u origin main --force --no-verify --follow-tags + + - name: get release version + id: get_release_version + run: echo "release_version=$(cat lerna.json | jq -r '.version')" >> $GITHUB_ENV + shell: bash + working-directory: ./ + + - name: 🏗 Setup EAS + uses: expo/expo-github-action@v8 + with: + eas-version: latest + token: ${{ secrets.FOAM_RELEASE_TOKEN }} + + - name: 🚀 Build app version ${{ github.env.get_release_version.outputs.release_version}} + run: eas build --non-interactive + + - name: 🚀 Submit app version ${{ github.env.get_release_version.outputs.release_version}} to play store + run: eas submit --latest -p android + + - name: Submit app version ${{ github.env.get_release_version.outputs.release_version}} to app store + run: eas submit --latest -p ios diff --git a/.yarn/cache/@hutson-parse-repository-url-npm-3.0.2-ae5ef1b671-39992c5f18.zip b/.yarn/cache/@hutson-parse-repository-url-npm-3.0.2-ae5ef1b671-39992c5f18.zip new file mode 100644 index 00000000..62c9ed24 Binary files /dev/null and b/.yarn/cache/@hutson-parse-repository-url-npm-3.0.2-ae5ef1b671-39992c5f18.zip differ diff --git a/.yarn/cache/@lerna-child-process-npm-7.4.2-9b29f94231-0ddd978006.zip b/.yarn/cache/@lerna-child-process-npm-7.4.2-9b29f94231-0ddd978006.zip new file mode 100644 index 00000000..4166d67d Binary files /dev/null and b/.yarn/cache/@lerna-child-process-npm-7.4.2-9b29f94231-0ddd978006.zip differ diff --git a/.yarn/cache/@lerna-create-npm-7.4.2-cc2233a595-1b8acfde0f.zip b/.yarn/cache/@lerna-create-npm-7.4.2-cc2233a595-1b8acfde0f.zip new file mode 100644 index 00000000..9f8e2c1b Binary files /dev/null and b/.yarn/cache/@lerna-create-npm-7.4.2-cc2233a595-1b8acfde0f.zip differ diff --git a/.yarn/cache/@npmcli-fs-npm-2.1.2-08d434e77b-405074965e.zip b/.yarn/cache/@npmcli-fs-npm-2.1.2-08d434e77b-405074965e.zip new file mode 100644 index 00000000..2d9040ce Binary files /dev/null and b/.yarn/cache/@npmcli-fs-npm-2.1.2-08d434e77b-405074965e.zip differ diff --git a/.yarn/cache/@npmcli-git-npm-4.1.0-f7322fced9-37efb92659.zip b/.yarn/cache/@npmcli-git-npm-4.1.0-f7322fced9-37efb92659.zip new file mode 100644 index 00000000..8a2d17e2 Binary files /dev/null and b/.yarn/cache/@npmcli-git-npm-4.1.0-f7322fced9-37efb92659.zip differ diff --git a/.yarn/cache/@npmcli-installed-package-contents-npm-2.0.2-99564e3824-60789d5ed2.zip b/.yarn/cache/@npmcli-installed-package-contents-npm-2.0.2-99564e3824-60789d5ed2.zip new file mode 100644 index 00000000..466a0209 Binary files /dev/null and b/.yarn/cache/@npmcli-installed-package-contents-npm-2.0.2-99564e3824-60789d5ed2.zip differ diff --git a/.yarn/cache/@npmcli-move-file-npm-2.0.1-b593d8f741-52dc02259d.zip b/.yarn/cache/@npmcli-move-file-npm-2.0.1-b593d8f741-52dc02259d.zip new file mode 100644 index 00000000..f6a649e3 Binary files /dev/null and b/.yarn/cache/@npmcli-move-file-npm-2.0.1-b593d8f741-52dc02259d.zip differ diff --git a/.yarn/cache/@npmcli-node-gyp-npm-3.0.0-b160a0116c-fe3802b813.zip b/.yarn/cache/@npmcli-node-gyp-npm-3.0.0-b160a0116c-fe3802b813.zip new file mode 100644 index 00000000..1cd5b6fa Binary files /dev/null and b/.yarn/cache/@npmcli-node-gyp-npm-3.0.0-b160a0116c-fe3802b813.zip differ diff --git a/.yarn/cache/@npmcli-promise-spawn-npm-6.0.2-c9941b207c-aa725780c1.zip b/.yarn/cache/@npmcli-promise-spawn-npm-6.0.2-c9941b207c-aa725780c1.zip new file mode 100644 index 00000000..04b7468e Binary files /dev/null and b/.yarn/cache/@npmcli-promise-spawn-npm-6.0.2-c9941b207c-aa725780c1.zip differ diff --git a/.yarn/cache/@npmcli-run-script-npm-6.0.2-6a98dec431-7a671d7dbe.zip b/.yarn/cache/@npmcli-run-script-npm-6.0.2-6a98dec431-7a671d7dbe.zip new file mode 100644 index 00000000..777e7a47 Binary files /dev/null and b/.yarn/cache/@npmcli-run-script-npm-6.0.2-6a98dec431-7a671d7dbe.zip differ diff --git a/.yarn/cache/@nrwl-devkit-npm-16.10.0-fcd08ec770-92c40138f7.zip b/.yarn/cache/@nrwl-devkit-npm-16.10.0-fcd08ec770-92c40138f7.zip new file mode 100644 index 00000000..6e92abfe Binary files /dev/null and b/.yarn/cache/@nrwl-devkit-npm-16.10.0-fcd08ec770-92c40138f7.zip differ diff --git a/.yarn/cache/@nrwl-tao-npm-16.10.0-c76633addf-a973a9fbed.zip b/.yarn/cache/@nrwl-tao-npm-16.10.0-c76633addf-a973a9fbed.zip new file mode 100644 index 00000000..3da518f2 Binary files /dev/null and b/.yarn/cache/@nrwl-tao-npm-16.10.0-c76633addf-a973a9fbed.zip differ diff --git a/.yarn/cache/@nx-devkit-npm-16.10.0-8a86522e83-f79f22be16.zip b/.yarn/cache/@nx-devkit-npm-16.10.0-8a86522e83-f79f22be16.zip new file mode 100644 index 00000000..1669f771 Binary files /dev/null and b/.yarn/cache/@nx-devkit-npm-16.10.0-8a86522e83-f79f22be16.zip differ diff --git a/.yarn/cache/@nx-nx-darwin-arm64-npm-16.10.0-93d4911bae-8.zip b/.yarn/cache/@nx-nx-darwin-arm64-npm-16.10.0-93d4911bae-8.zip new file mode 100644 index 00000000..24d866cc Binary files /dev/null and b/.yarn/cache/@nx-nx-darwin-arm64-npm-16.10.0-93d4911bae-8.zip differ diff --git a/.yarn/cache/@octokit-auth-token-npm-3.0.4-2b669244cb-42f533a873.zip b/.yarn/cache/@octokit-auth-token-npm-3.0.4-2b669244cb-42f533a873.zip new file mode 100644 index 00000000..8c3c9bf0 Binary files /dev/null and b/.yarn/cache/@octokit-auth-token-npm-3.0.4-2b669244cb-42f533a873.zip differ diff --git a/.yarn/cache/@octokit-core-npm-4.2.4-25aeed316b-ac8ab47440.zip b/.yarn/cache/@octokit-core-npm-4.2.4-25aeed316b-ac8ab47440.zip new file mode 100644 index 00000000..e7c2ae44 Binary files /dev/null and b/.yarn/cache/@octokit-core-npm-4.2.4-25aeed316b-ac8ab47440.zip differ diff --git a/.yarn/cache/@octokit-endpoint-npm-7.0.6-ff8dba936f-7caebf30ce.zip b/.yarn/cache/@octokit-endpoint-npm-7.0.6-ff8dba936f-7caebf30ce.zip new file mode 100644 index 00000000..378acc7f Binary files /dev/null and b/.yarn/cache/@octokit-endpoint-npm-7.0.6-ff8dba936f-7caebf30ce.zip differ diff --git a/.yarn/cache/@octokit-graphql-npm-5.0.6-26fb5b6074-7be545d348.zip b/.yarn/cache/@octokit-graphql-npm-5.0.6-26fb5b6074-7be545d348.zip new file mode 100644 index 00000000..b063521d Binary files /dev/null and b/.yarn/cache/@octokit-graphql-npm-5.0.6-26fb5b6074-7be545d348.zip differ diff --git a/.yarn/cache/@octokit-openapi-types-npm-18.1.1-18b6c70735-94f42977fd.zip b/.yarn/cache/@octokit-openapi-types-npm-18.1.1-18b6c70735-94f42977fd.zip new file mode 100644 index 00000000..3ed946be Binary files /dev/null and b/.yarn/cache/@octokit-openapi-types-npm-18.1.1-18b6c70735-94f42977fd.zip differ diff --git a/.yarn/cache/@octokit-plugin-enterprise-rest-npm-6.0.1-e1c802acb0-1c9720002f.zip b/.yarn/cache/@octokit-plugin-enterprise-rest-npm-6.0.1-e1c802acb0-1c9720002f.zip new file mode 100644 index 00000000..5fd3632d Binary files /dev/null and b/.yarn/cache/@octokit-plugin-enterprise-rest-npm-6.0.1-e1c802acb0-1c9720002f.zip differ diff --git a/.yarn/cache/@octokit-plugin-paginate-rest-npm-6.1.2-3b2443d1e8-a7b3e686c7.zip b/.yarn/cache/@octokit-plugin-paginate-rest-npm-6.1.2-3b2443d1e8-a7b3e686c7.zip new file mode 100644 index 00000000..ca2514b4 Binary files /dev/null and b/.yarn/cache/@octokit-plugin-paginate-rest-npm-6.1.2-3b2443d1e8-a7b3e686c7.zip differ diff --git a/.yarn/cache/@octokit-plugin-request-log-npm-1.0.4-9ab5a2f888-2086db0005.zip b/.yarn/cache/@octokit-plugin-request-log-npm-1.0.4-9ab5a2f888-2086db0005.zip new file mode 100644 index 00000000..93a50364 Binary files /dev/null and b/.yarn/cache/@octokit-plugin-request-log-npm-1.0.4-9ab5a2f888-2086db0005.zip differ diff --git a/.yarn/cache/@octokit-plugin-rest-endpoint-methods-npm-7.2.3-c54ecf5d8d-21dfb98514.zip b/.yarn/cache/@octokit-plugin-rest-endpoint-methods-npm-7.2.3-c54ecf5d8d-21dfb98514.zip new file mode 100644 index 00000000..5736bab7 Binary files /dev/null and b/.yarn/cache/@octokit-plugin-rest-endpoint-methods-npm-7.2.3-c54ecf5d8d-21dfb98514.zip differ diff --git a/.yarn/cache/@octokit-request-error-npm-3.0.3-cbba4d6220-5db0b51473.zip b/.yarn/cache/@octokit-request-error-npm-3.0.3-cbba4d6220-5db0b51473.zip new file mode 100644 index 00000000..a8ffdc9c Binary files /dev/null and b/.yarn/cache/@octokit-request-error-npm-3.0.3-cbba4d6220-5db0b51473.zip differ diff --git a/.yarn/cache/@octokit-request-npm-6.2.8-fbcbb43713-3747106f50.zip b/.yarn/cache/@octokit-request-npm-6.2.8-fbcbb43713-3747106f50.zip new file mode 100644 index 00000000..d2b5d2a7 Binary files /dev/null and b/.yarn/cache/@octokit-request-npm-6.2.8-fbcbb43713-3747106f50.zip differ diff --git a/.yarn/cache/@octokit-rest-npm-19.0.11-6a50f10c37-147518ad51.zip b/.yarn/cache/@octokit-rest-npm-19.0.11-6a50f10c37-147518ad51.zip new file mode 100644 index 00000000..ba68086d Binary files /dev/null and b/.yarn/cache/@octokit-rest-npm-19.0.11-6a50f10c37-147518ad51.zip differ diff --git a/.yarn/cache/@octokit-tsconfig-npm-1.0.2-abab4615e2-74d56f3e9f.zip b/.yarn/cache/@octokit-tsconfig-npm-1.0.2-abab4615e2-74d56f3e9f.zip new file mode 100644 index 00000000..412105bf Binary files /dev/null and b/.yarn/cache/@octokit-tsconfig-npm-1.0.2-abab4615e2-74d56f3e9f.zip differ diff --git a/.yarn/cache/@octokit-types-npm-10.0.0-8ea850424d-8aafba2ff0.zip b/.yarn/cache/@octokit-types-npm-10.0.0-8ea850424d-8aafba2ff0.zip new file mode 100644 index 00000000..b4dc5c89 Binary files /dev/null and b/.yarn/cache/@octokit-types-npm-10.0.0-8ea850424d-8aafba2ff0.zip differ diff --git a/.yarn/cache/@octokit-types-npm-9.3.2-0c1714b849-f55d096aae.zip b/.yarn/cache/@octokit-types-npm-9.3.2-0c1714b849-f55d096aae.zip new file mode 100644 index 00000000..2562f359 Binary files /dev/null and b/.yarn/cache/@octokit-types-npm-9.3.2-0c1714b849-f55d096aae.zip differ diff --git a/.yarn/cache/@parcel-watcher-npm-2.0.4-e2975fa1d0-890bdc69a5.zip b/.yarn/cache/@parcel-watcher-npm-2.0.4-e2975fa1d0-890bdc69a5.zip new file mode 100644 index 00000000..9065e440 Binary files /dev/null and b/.yarn/cache/@parcel-watcher-npm-2.0.4-e2975fa1d0-890bdc69a5.zip differ diff --git a/.yarn/cache/@sigstore-bundle-npm-1.1.0-b2cf24a13e-9bdd829f28.zip b/.yarn/cache/@sigstore-bundle-npm-1.1.0-b2cf24a13e-9bdd829f28.zip new file mode 100644 index 00000000..774f8b65 Binary files /dev/null and b/.yarn/cache/@sigstore-bundle-npm-1.1.0-b2cf24a13e-9bdd829f28.zip differ diff --git a/.yarn/cache/@sigstore-protobuf-specs-npm-0.2.1-feecdcc08c-ddb7c829c7.zip b/.yarn/cache/@sigstore-protobuf-specs-npm-0.2.1-feecdcc08c-ddb7c829c7.zip new file mode 100644 index 00000000..0ef66021 Binary files /dev/null and b/.yarn/cache/@sigstore-protobuf-specs-npm-0.2.1-feecdcc08c-ddb7c829c7.zip differ diff --git a/.yarn/cache/@sigstore-sign-npm-1.0.0-d4cabc7c0c-cbdf409c39.zip b/.yarn/cache/@sigstore-sign-npm-1.0.0-d4cabc7c0c-cbdf409c39.zip new file mode 100644 index 00000000..b55b2290 Binary files /dev/null and b/.yarn/cache/@sigstore-sign-npm-1.0.0-d4cabc7c0c-cbdf409c39.zip differ diff --git a/.yarn/cache/@sigstore-tuf-npm-1.0.3-9a2b6b14aa-0a32594b73.zip b/.yarn/cache/@sigstore-tuf-npm-1.0.3-9a2b6b14aa-0a32594b73.zip new file mode 100644 index 00000000..9084a47b Binary files /dev/null and b/.yarn/cache/@sigstore-tuf-npm-1.0.3-9a2b6b14aa-0a32594b73.zip differ diff --git a/.yarn/cache/@tufjs-canonical-json-npm-1.0.0-66d27d850f-9ff3bcd129.zip b/.yarn/cache/@tufjs-canonical-json-npm-1.0.0-66d27d850f-9ff3bcd129.zip new file mode 100644 index 00000000..980393d7 Binary files /dev/null and b/.yarn/cache/@tufjs-canonical-json-npm-1.0.0-66d27d850f-9ff3bcd129.zip differ diff --git a/.yarn/cache/@tufjs-models-npm-1.0.4-a1dddaf561-b489baa854.zip b/.yarn/cache/@tufjs-models-npm-1.0.4-a1dddaf561-b489baa854.zip new file mode 100644 index 00000000..facd63c6 Binary files /dev/null and b/.yarn/cache/@tufjs-models-npm-1.0.4-a1dddaf561-b489baa854.zip differ diff --git a/.yarn/cache/@types-minimatch-npm-3.0.5-802bb0797f-c41d136f67.zip b/.yarn/cache/@types-minimatch-npm-3.0.5-802bb0797f-c41d136f67.zip new file mode 100644 index 00000000..11730d3c Binary files /dev/null and b/.yarn/cache/@types-minimatch-npm-3.0.5-802bb0797f-c41d136f67.zip differ diff --git a/.yarn/cache/@yarnpkg-lockfile-npm-1.1.0-6e0da4acd2-05b881b486.zip b/.yarn/cache/@yarnpkg-lockfile-npm-1.1.0-6e0da4acd2-05b881b486.zip new file mode 100644 index 00000000..cdfd56f8 Binary files /dev/null and b/.yarn/cache/@yarnpkg-lockfile-npm-1.1.0-6e0da4acd2-05b881b486.zip differ diff --git a/.yarn/cache/@yarnpkg-parsers-npm-3.0.0-rc.46-79a7571b99-35dfd1b1ac.zip b/.yarn/cache/@yarnpkg-parsers-npm-3.0.0-rc.46-79a7571b99-35dfd1b1ac.zip new file mode 100644 index 00000000..5af344ce Binary files /dev/null and b/.yarn/cache/@yarnpkg-parsers-npm-3.0.0-rc.46-79a7571b99-35dfd1b1ac.zip differ diff --git a/.yarn/cache/@zkochan-js-yaml-npm-0.0.6-3eced3a388-51b81597a1.zip b/.yarn/cache/@zkochan-js-yaml-npm-0.0.6-3eced3a388-51b81597a1.zip new file mode 100644 index 00000000..b87c1314 Binary files /dev/null and b/.yarn/cache/@zkochan-js-yaml-npm-0.0.6-3eced3a388-51b81597a1.zip differ diff --git a/.yarn/cache/JSONStream-npm-1.3.5-1987f2e6dd-2605fa1242.zip b/.yarn/cache/JSONStream-npm-1.3.5-1987f2e6dd-2605fa1242.zip new file mode 100644 index 00000000..bd4533e7 Binary files /dev/null and b/.yarn/cache/JSONStream-npm-1.3.5-1987f2e6dd-2605fa1242.zip differ diff --git a/.yarn/cache/add-stream-npm-1.0.0-a5a0c0498c-3e9e8b0b8f.zip b/.yarn/cache/add-stream-npm-1.0.0-a5a0c0498c-3e9e8b0b8f.zip new file mode 100644 index 00000000..a013e55d Binary files /dev/null and b/.yarn/cache/add-stream-npm-1.0.0-a5a0c0498c-3e9e8b0b8f.zip differ diff --git a/.yarn/cache/array-differ-npm-3.0.0-ddc0d89007-117edd9df5.zip b/.yarn/cache/array-differ-npm-3.0.0-ddc0d89007-117edd9df5.zip new file mode 100644 index 00000000..292ae640 Binary files /dev/null and b/.yarn/cache/array-differ-npm-3.0.0-ddc0d89007-117edd9df5.zip differ diff --git a/.yarn/cache/array-ify-npm-1.0.0-e09a371977-c0502015b3.zip b/.yarn/cache/array-ify-npm-1.0.0-e09a371977-c0502015b3.zip new file mode 100644 index 00000000..7b98d69a Binary files /dev/null and b/.yarn/cache/array-ify-npm-1.0.0-e09a371977-c0502015b3.zip differ diff --git a/.yarn/cache/arrify-npm-2.0.1-38c408f77c-067c4c1afd.zip b/.yarn/cache/arrify-npm-2.0.1-38c408f77c-067c4c1afd.zip new file mode 100644 index 00000000..5dbd5402 Binary files /dev/null and b/.yarn/cache/arrify-npm-2.0.1-38c408f77c-067c4c1afd.zip differ diff --git a/.yarn/cache/async-npm-3.2.5-f5dbdabdfc-5ec77f1312.zip b/.yarn/cache/async-npm-3.2.5-f5dbdabdfc-5ec77f1312.zip new file mode 100644 index 00000000..a0ee3e0f Binary files /dev/null and b/.yarn/cache/async-npm-3.2.5-f5dbdabdfc-5ec77f1312.zip differ diff --git a/.yarn/cache/axios-npm-1.6.2-2334cb6eee-4a7429e2b7.zip b/.yarn/cache/axios-npm-1.6.2-2334cb6eee-4a7429e2b7.zip new file mode 100644 index 00000000..e616f86c Binary files /dev/null and b/.yarn/cache/axios-npm-1.6.2-2334cb6eee-4a7429e2b7.zip differ diff --git a/.yarn/cache/before-after-hook-npm-2.2.3-d79e3d6608-a1a2430976.zip b/.yarn/cache/before-after-hook-npm-2.2.3-d79e3d6608-a1a2430976.zip new file mode 100644 index 00000000..b03fd8f3 Binary files /dev/null and b/.yarn/cache/before-after-hook-npm-2.2.3-d79e3d6608-a1a2430976.zip differ diff --git a/.yarn/cache/builtins-npm-5.0.1-6d4820dd76-66d204657f.zip b/.yarn/cache/builtins-npm-5.0.1-6d4820dd76-66d204657f.zip new file mode 100644 index 00000000..9c03e474 Binary files /dev/null and b/.yarn/cache/builtins-npm-5.0.1-6d4820dd76-66d204657f.zip differ diff --git a/.yarn/cache/byte-size-npm-8.1.1-d16084355d-65f00881ff.zip b/.yarn/cache/byte-size-npm-8.1.1-d16084355d-65f00881ff.zip new file mode 100644 index 00000000..d1196d07 Binary files /dev/null and b/.yarn/cache/byte-size-npm-8.1.1-d16084355d-65f00881ff.zip differ diff --git a/.yarn/cache/cacache-npm-16.1.3-4e2088ed0d-d91409e6e5.zip b/.yarn/cache/cacache-npm-16.1.3-4e2088ed0d-d91409e6e5.zip new file mode 100644 index 00000000..2bba5de7 Binary files /dev/null and b/.yarn/cache/cacache-npm-16.1.3-4e2088ed0d-d91409e6e5.zip differ diff --git a/.yarn/cache/chalk-npm-4.1.0-c746e252ba-5561c7b4c0.zip b/.yarn/cache/chalk-npm-4.1.0-c746e252ba-5561c7b4c0.zip new file mode 100644 index 00000000..4a3ac97e Binary files /dev/null and b/.yarn/cache/chalk-npm-4.1.0-c746e252ba-5561c7b4c0.zip differ diff --git a/.yarn/cache/cli-spinners-npm-2.6.1-33ce2bad0f-423409baaa.zip b/.yarn/cache/cli-spinners-npm-2.6.1-33ce2bad0f-423409baaa.zip new file mode 100644 index 00000000..485c09ed Binary files /dev/null and b/.yarn/cache/cli-spinners-npm-2.6.1-33ce2bad0f-423409baaa.zip differ diff --git a/.yarn/cache/cli-width-npm-3.0.0-387b3f68f9-4c94af3769.zip b/.yarn/cache/cli-width-npm-3.0.0-387b3f68f9-4c94af3769.zip new file mode 100644 index 00000000..b652c4f7 Binary files /dev/null and b/.yarn/cache/cli-width-npm-3.0.0-387b3f68f9-4c94af3769.zip differ diff --git a/.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-ce2e8f578a.zip b/.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-ce2e8f578a.zip new file mode 100644 index 00000000..24f58564 Binary files /dev/null and b/.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-ce2e8f578a.zip differ diff --git a/.yarn/cache/cmd-shim-npm-6.0.1-87ebf774a0-359006b3a5.zip b/.yarn/cache/cmd-shim-npm-6.0.1-87ebf774a0-359006b3a5.zip new file mode 100644 index 00000000..42d75f0c Binary files /dev/null and b/.yarn/cache/cmd-shim-npm-6.0.1-87ebf774a0-359006b3a5.zip differ diff --git a/.yarn/cache/columnify-npm-1.6.0-aa925d932b-0d59002361.zip b/.yarn/cache/columnify-npm-1.6.0-aa925d932b-0d59002361.zip new file mode 100644 index 00000000..978e2632 Binary files /dev/null and b/.yarn/cache/columnify-npm-1.6.0-aa925d932b-0d59002361.zip differ diff --git a/.yarn/cache/compare-func-npm-2.0.0-9cd7852f23-fb71d70632.zip b/.yarn/cache/compare-func-npm-2.0.0-9cd7852f23-fb71d70632.zip new file mode 100644 index 00000000..5919970e Binary files /dev/null and b/.yarn/cache/compare-func-npm-2.0.0-9cd7852f23-fb71d70632.zip differ diff --git a/.yarn/cache/concat-stream-npm-2.0.0-8bb2ad5aa0-d7f75d48f0.zip b/.yarn/cache/concat-stream-npm-2.0.0-8bb2ad5aa0-d7f75d48f0.zip new file mode 100644 index 00000000..4f602256 Binary files /dev/null and b/.yarn/cache/concat-stream-npm-2.0.0-8bb2ad5aa0-d7f75d48f0.zip differ diff --git a/.yarn/cache/conventional-changelog-angular-npm-7.0.0-de5edb79f0-2478962ad7.zip b/.yarn/cache/conventional-changelog-angular-npm-7.0.0-de5edb79f0-2478962ad7.zip new file mode 100644 index 00000000..126dc597 Binary files /dev/null and b/.yarn/cache/conventional-changelog-angular-npm-7.0.0-de5edb79f0-2478962ad7.zip differ diff --git a/.yarn/cache/conventional-changelog-core-npm-5.0.1-29a3502d64-5f37f14f8d.zip b/.yarn/cache/conventional-changelog-core-npm-5.0.1-29a3502d64-5f37f14f8d.zip new file mode 100644 index 00000000..01759b8f Binary files /dev/null and b/.yarn/cache/conventional-changelog-core-npm-5.0.1-29a3502d64-5f37f14f8d.zip differ diff --git a/.yarn/cache/conventional-changelog-preset-loader-npm-3.0.0-cafa12f2b8-199c4730c5.zip b/.yarn/cache/conventional-changelog-preset-loader-npm-3.0.0-cafa12f2b8-199c4730c5.zip new file mode 100644 index 00000000..66a157fc Binary files /dev/null and b/.yarn/cache/conventional-changelog-preset-loader-npm-3.0.0-cafa12f2b8-199c4730c5.zip differ diff --git a/.yarn/cache/conventional-changelog-writer-npm-6.0.1-11f2e19df2-d8619ff744.zip b/.yarn/cache/conventional-changelog-writer-npm-6.0.1-11f2e19df2-d8619ff744.zip new file mode 100644 index 00000000..d65f96e4 Binary files /dev/null and b/.yarn/cache/conventional-changelog-writer-npm-6.0.1-11f2e19df2-d8619ff744.zip differ diff --git a/.yarn/cache/conventional-commits-filter-npm-3.0.0-814899c1e8-73337f42ac.zip b/.yarn/cache/conventional-commits-filter-npm-3.0.0-814899c1e8-73337f42ac.zip new file mode 100644 index 00000000..c3babccb Binary files /dev/null and b/.yarn/cache/conventional-commits-filter-npm-3.0.0-814899c1e8-73337f42ac.zip differ diff --git a/.yarn/cache/conventional-commits-parser-npm-4.0.0-bc0a9be0fa-12d95b5ba8.zip b/.yarn/cache/conventional-commits-parser-npm-4.0.0-bc0a9be0fa-12d95b5ba8.zip new file mode 100644 index 00000000..bc2310e2 Binary files /dev/null and b/.yarn/cache/conventional-commits-parser-npm-4.0.0-bc0a9be0fa-12d95b5ba8.zip differ diff --git a/.yarn/cache/conventional-recommended-bump-npm-7.0.1-2ed39b8c92-e2d1f2f40f.zip b/.yarn/cache/conventional-recommended-bump-npm-7.0.1-2ed39b8c92-e2d1f2f40f.zip new file mode 100644 index 00000000..bafcae59 Binary files /dev/null and b/.yarn/cache/conventional-recommended-bump-npm-7.0.1-2ed39b8c92-e2d1f2f40f.zip differ diff --git a/.yarn/cache/cosmiconfig-npm-8.3.6-a5566e2779-dc339ebea4.zip b/.yarn/cache/cosmiconfig-npm-8.3.6-a5566e2779-dc339ebea4.zip new file mode 100644 index 00000000..d8849f72 Binary files /dev/null and b/.yarn/cache/cosmiconfig-npm-8.3.6-a5566e2779-dc339ebea4.zip differ diff --git a/.yarn/cache/dargs-npm-7.0.0-62701e0c7a-b8f1e3cba5.zip b/.yarn/cache/dargs-npm-7.0.0-62701e0c7a-b8f1e3cba5.zip new file mode 100644 index 00000000..004e5a48 Binary files /dev/null and b/.yarn/cache/dargs-npm-7.0.0-62701e0c7a-b8f1e3cba5.zip differ diff --git a/.yarn/cache/dateformat-npm-3.0.3-ed02e5ddbd-ca4911148a.zip b/.yarn/cache/dateformat-npm-3.0.3-ed02e5ddbd-ca4911148a.zip new file mode 100644 index 00000000..5747aa69 Binary files /dev/null and b/.yarn/cache/dateformat-npm-3.0.3-ed02e5ddbd-ca4911148a.zip differ diff --git a/.yarn/cache/dedent-npm-0.7.0-2dbb45a4c5-87de191050.zip b/.yarn/cache/dedent-npm-0.7.0-2dbb45a4c5-87de191050.zip new file mode 100644 index 00000000..64afea83 Binary files /dev/null and b/.yarn/cache/dedent-npm-0.7.0-2dbb45a4c5-87de191050.zip differ diff --git a/.yarn/cache/deprecation-npm-2.3.1-e19c92d6e7-f56a05e182.zip b/.yarn/cache/deprecation-npm-2.3.1-e19c92d6e7-f56a05e182.zip new file mode 100644 index 00000000..943bc441 Binary files /dev/null and b/.yarn/cache/deprecation-npm-2.3.1-e19c92d6e7-f56a05e182.zip differ diff --git a/.yarn/cache/detect-indent-npm-5.0.0-123fa3fd0b-61763211da.zip b/.yarn/cache/detect-indent-npm-5.0.0-123fa3fd0b-61763211da.zip new file mode 100644 index 00000000..ff9b1bb7 Binary files /dev/null and b/.yarn/cache/detect-indent-npm-5.0.0-123fa3fd0b-61763211da.zip differ diff --git a/.yarn/cache/dot-prop-npm-5.3.0-7bf6ee1eb8-d577579009.zip b/.yarn/cache/dot-prop-npm-5.3.0-7bf6ee1eb8-d577579009.zip new file mode 100644 index 00000000..4b2860f7 Binary files /dev/null and b/.yarn/cache/dot-prop-npm-5.3.0-7bf6ee1eb8-d577579009.zip differ diff --git a/.yarn/cache/dotenv-npm-16.3.1-e6d380a398-15d75e7279.zip b/.yarn/cache/dotenv-npm-16.3.1-e6d380a398-15d75e7279.zip new file mode 100644 index 00000000..7bdd10c0 Binary files /dev/null and b/.yarn/cache/dotenv-npm-16.3.1-e6d380a398-15d75e7279.zip differ diff --git a/.yarn/cache/duplexer-npm-0.1.2-952c810235-62ba61a830.zip b/.yarn/cache/duplexer-npm-0.1.2-952c810235-62ba61a830.zip new file mode 100644 index 00000000..c6deccf4 Binary files /dev/null and b/.yarn/cache/duplexer-npm-0.1.2-952c810235-62ba61a830.zip differ diff --git a/.yarn/cache/ejs-npm-3.1.9-e201b2088c-af6f10eb81.zip b/.yarn/cache/ejs-npm-3.1.9-e201b2088c-af6f10eb81.zip new file mode 100644 index 00000000..3f5e3828 Binary files /dev/null and b/.yarn/cache/ejs-npm-3.1.9-e201b2088c-af6f10eb81.zip differ diff --git a/.yarn/cache/enquirer-npm-2.3.6-7899175762-1c0911e14a.zip b/.yarn/cache/enquirer-npm-2.3.6-7899175762-1c0911e14a.zip new file mode 100644 index 00000000..22c981f2 Binary files /dev/null and b/.yarn/cache/enquirer-npm-2.3.6-7899175762-1c0911e14a.zip differ diff --git a/.yarn/cache/envinfo-npm-7.8.1-f320033691-de736c98d6.zip b/.yarn/cache/envinfo-npm-7.8.1-f320033691-de736c98d6.zip new file mode 100644 index 00000000..006bb8e7 Binary files /dev/null and b/.yarn/cache/envinfo-npm-7.8.1-f320033691-de736c98d6.zip differ diff --git a/.yarn/cache/eventemitter3-npm-4.0.7-7afcdd74ae-1875311c42.zip b/.yarn/cache/eventemitter3-npm-4.0.7-7afcdd74ae-1875311c42.zip new file mode 100644 index 00000000..0cfd591e Binary files /dev/null and b/.yarn/cache/eventemitter3-npm-4.0.7-7afcdd74ae-1875311c42.zip differ diff --git a/.yarn/cache/execa-npm-5.0.0-4ee568fb49-a044367ebd.zip b/.yarn/cache/execa-npm-5.0.0-4ee568fb49-a044367ebd.zip new file mode 100644 index 00000000..ead4682a Binary files /dev/null and b/.yarn/cache/execa-npm-5.0.0-4ee568fb49-a044367ebd.zip differ diff --git a/.yarn/cache/expo-dev-client-npm-2.4.12-1aa23ffed1-08d67234cc.zip b/.yarn/cache/expo-dev-client-npm-2.4.12-1aa23ffed1-08d67234cc.zip new file mode 100644 index 00000000..759b0818 Binary files /dev/null and b/.yarn/cache/expo-dev-client-npm-2.4.12-1aa23ffed1-08d67234cc.zip differ diff --git a/.yarn/cache/expo-dev-launcher-npm-2.4.14-bdbe3b15d0-577ca5b744.zip b/.yarn/cache/expo-dev-launcher-npm-2.4.14-bdbe3b15d0-577ca5b744.zip new file mode 100644 index 00000000..b7206e8b Binary files /dev/null and b/.yarn/cache/expo-dev-launcher-npm-2.4.14-bdbe3b15d0-577ca5b744.zip differ diff --git a/.yarn/cache/expo-dev-menu-interface-npm-1.3.0-09ef52ecde-74fbe9849b.zip b/.yarn/cache/expo-dev-menu-interface-npm-1.3.0-09ef52ecde-74fbe9849b.zip new file mode 100644 index 00000000..8356b9f3 Binary files /dev/null and b/.yarn/cache/expo-dev-menu-interface-npm-1.3.0-09ef52ecde-74fbe9849b.zip differ diff --git a/.yarn/cache/expo-dev-menu-npm-3.2.2-35e9ba6776-72f15549a2.zip b/.yarn/cache/expo-dev-menu-npm-3.2.2-35e9ba6776-72f15549a2.zip new file mode 100644 index 00000000..58627b48 Binary files /dev/null and b/.yarn/cache/expo-dev-menu-npm-3.2.2-35e9ba6776-72f15549a2.zip differ diff --git a/.yarn/cache/expo-json-utils-npm-0.7.1-8a0f23da68-0586f3e159.zip b/.yarn/cache/expo-json-utils-npm-0.7.1-8a0f23da68-0586f3e159.zip new file mode 100644 index 00000000..e4a04aad Binary files /dev/null and b/.yarn/cache/expo-json-utils-npm-0.7.1-8a0f23da68-0586f3e159.zip differ diff --git a/.yarn/cache/expo-manifests-npm-0.7.2-2358319a24-935c542241.zip b/.yarn/cache/expo-manifests-npm-0.7.2-2358319a24-935c542241.zip new file mode 100644 index 00000000..46a98cc0 Binary files /dev/null and b/.yarn/cache/expo-manifests-npm-0.7.2-2358319a24-935c542241.zip differ diff --git a/.yarn/cache/expo-updates-interface-npm-0.10.1-2675cc0c1d-7fe5ac9d65.zip b/.yarn/cache/expo-updates-interface-npm-0.10.1-2675cc0c1d-7fe5ac9d65.zip new file mode 100644 index 00000000..7aa40eb4 Binary files /dev/null and b/.yarn/cache/expo-updates-interface-npm-0.10.1-2675cc0c1d-7fe5ac9d65.zip differ diff --git a/.yarn/cache/figures-npm-3.2.0-85d357e955-85a6ad29e9.zip b/.yarn/cache/figures-npm-3.2.0-85d357e955-85a6ad29e9.zip new file mode 100644 index 00000000..eac0ef72 Binary files /dev/null and b/.yarn/cache/figures-npm-3.2.0-85d357e955-85a6ad29e9.zip differ diff --git a/.yarn/cache/filelist-npm-1.0.4-3a835ae0a7-a303573b08.zip b/.yarn/cache/filelist-npm-1.0.4-3a835ae0a7-a303573b08.zip new file mode 100644 index 00000000..407ca833 Binary files /dev/null and b/.yarn/cache/filelist-npm-1.0.4-3a835ae0a7-a303573b08.zip differ diff --git a/.yarn/cache/find-up-npm-2.1.0-9f6cb1765c-43284fe4da.zip b/.yarn/cache/find-up-npm-2.1.0-9f6cb1765c-43284fe4da.zip new file mode 100644 index 00000000..6b2c2d9d Binary files /dev/null and b/.yarn/cache/find-up-npm-2.1.0-9f6cb1765c-43284fe4da.zip differ diff --git a/.yarn/cache/flat-npm-5.0.2-12748102a5-12a1536ac7.zip b/.yarn/cache/flat-npm-5.0.2-12748102a5-12a1536ac7.zip new file mode 100644 index 00000000..e3295fae Binary files /dev/null and b/.yarn/cache/flat-npm-5.0.2-12748102a5-12a1536ac7.zip differ diff --git a/.yarn/cache/fs-constants-npm-1.0.0-59576b2177-18f5b71837.zip b/.yarn/cache/fs-constants-npm-1.0.0-59576b2177-18f5b71837.zip new file mode 100644 index 00000000..91f5b6f1 Binary files /dev/null and b/.yarn/cache/fs-constants-npm-1.0.0-59576b2177-18f5b71837.zip differ diff --git a/.yarn/cache/fs-extra-npm-11.1.1-ca44602180-fb883c6824.zip b/.yarn/cache/fs-extra-npm-11.1.1-ca44602180-fb883c6824.zip new file mode 100644 index 00000000..a1b88a31 Binary files /dev/null and b/.yarn/cache/fs-extra-npm-11.1.1-ca44602180-fb883c6824.zip differ diff --git a/.yarn/cache/get-pkg-repo-npm-4.2.1-b1cd052cb4-5abf169137.zip b/.yarn/cache/get-pkg-repo-npm-4.2.1-b1cd052cb4-5abf169137.zip new file mode 100644 index 00000000..bb0c9ba6 Binary files /dev/null and b/.yarn/cache/get-pkg-repo-npm-4.2.1-b1cd052cb4-5abf169137.zip differ diff --git a/.yarn/cache/get-port-npm-5.1.1-2f6074007a-0162663ffe.zip b/.yarn/cache/get-port-npm-5.1.1-2f6074007a-0162663ffe.zip new file mode 100644 index 00000000..bfec402a Binary files /dev/null and b/.yarn/cache/get-port-npm-5.1.1-2f6074007a-0162663ffe.zip differ diff --git a/.yarn/cache/get-stream-npm-6.0.0-ca30041dff-587e6a9312.zip b/.yarn/cache/get-stream-npm-6.0.0-ca30041dff-587e6a9312.zip new file mode 100644 index 00000000..58d173e8 Binary files /dev/null and b/.yarn/cache/get-stream-npm-6.0.0-ca30041dff-587e6a9312.zip differ diff --git a/.yarn/cache/git-raw-commits-npm-3.0.0-7cba1ec0d5-198892f307.zip b/.yarn/cache/git-raw-commits-npm-3.0.0-7cba1ec0d5-198892f307.zip new file mode 100644 index 00000000..9ed6e20f Binary files /dev/null and b/.yarn/cache/git-raw-commits-npm-3.0.0-7cba1ec0d5-198892f307.zip differ diff --git a/.yarn/cache/git-remote-origin-url-npm-2.0.0-319debe0d1-85263a09c0.zip b/.yarn/cache/git-remote-origin-url-npm-2.0.0-319debe0d1-85263a09c0.zip new file mode 100644 index 00000000..dff9fcc5 Binary files /dev/null and b/.yarn/cache/git-remote-origin-url-npm-2.0.0-319debe0d1-85263a09c0.zip differ diff --git a/.yarn/cache/git-semver-tags-npm-5.0.1-e2e36d6d4c-c181e1d9e7.zip b/.yarn/cache/git-semver-tags-npm-5.0.1-e2e36d6d4c-c181e1d9e7.zip new file mode 100644 index 00000000..3f79366a Binary files /dev/null and b/.yarn/cache/git-semver-tags-npm-5.0.1-e2e36d6d4c-c181e1d9e7.zip differ diff --git a/.yarn/cache/git-up-npm-7.0.0-5e37fa590f-2faadbab51.zip b/.yarn/cache/git-up-npm-7.0.0-5e37fa590f-2faadbab51.zip new file mode 100644 index 00000000..9085a8d1 Binary files /dev/null and b/.yarn/cache/git-up-npm-7.0.0-5e37fa590f-2faadbab51.zip differ diff --git a/.yarn/cache/git-url-parse-npm-13.1.0-724765d793-212a9b0343.zip b/.yarn/cache/git-url-parse-npm-13.1.0-724765d793-212a9b0343.zip new file mode 100644 index 00000000..316c23b1 Binary files /dev/null and b/.yarn/cache/git-url-parse-npm-13.1.0-724765d793-212a9b0343.zip differ diff --git a/.yarn/cache/gitconfiglocal-npm-1.0.0-905970379d-e6d2764c15.zip b/.yarn/cache/gitconfiglocal-npm-1.0.0-905970379d-e6d2764c15.zip new file mode 100644 index 00000000..f7f12690 Binary files /dev/null and b/.yarn/cache/gitconfiglocal-npm-1.0.0-905970379d-e6d2764c15.zip differ diff --git a/.yarn/cache/glob-npm-7.1.4-8bd8317a74-f52480fc82.zip b/.yarn/cache/glob-npm-7.1.4-8bd8317a74-f52480fc82.zip new file mode 100644 index 00000000..5ce86956 Binary files /dev/null and b/.yarn/cache/glob-npm-7.1.4-8bd8317a74-f52480fc82.zip differ diff --git a/.yarn/cache/glob-npm-9.3.5-2f602083f0-94b093adbc.zip b/.yarn/cache/glob-npm-9.3.5-2f602083f0-94b093adbc.zip new file mode 100644 index 00000000..40333953 Binary files /dev/null and b/.yarn/cache/glob-npm-9.3.5-2f602083f0-94b093adbc.zip differ diff --git a/.yarn/cache/handlebars-npm-4.7.8-25244c2c82-00e68bb5c1.zip b/.yarn/cache/handlebars-npm-4.7.8-25244c2c82-00e68bb5c1.zip new file mode 100644 index 00000000..b9f0b1e6 Binary files /dev/null and b/.yarn/cache/handlebars-npm-4.7.8-25244c2c82-00e68bb5c1.zip differ diff --git a/.yarn/cache/hosted-git-info-npm-4.1.0-4efcdf8fd3-c3f87b3c2f.zip b/.yarn/cache/hosted-git-info-npm-4.1.0-4efcdf8fd3-c3f87b3c2f.zip new file mode 100644 index 00000000..b3f995f3 Binary files /dev/null and b/.yarn/cache/hosted-git-info-npm-4.1.0-4efcdf8fd3-c3f87b3c2f.zip differ diff --git a/.yarn/cache/hosted-git-info-npm-6.1.1-d57807f6a5-fcd3ca2eaa.zip b/.yarn/cache/hosted-git-info-npm-6.1.1-d57807f6a5-fcd3ca2eaa.zip new file mode 100644 index 00000000..cb3b2863 Binary files /dev/null and b/.yarn/cache/hosted-git-info-npm-6.1.1-d57807f6a5-fcd3ca2eaa.zip differ diff --git a/.yarn/cache/ignore-npm-5.3.0-fb0f5fa062-2736da6621.zip b/.yarn/cache/ignore-npm-5.3.0-fb0f5fa062-2736da6621.zip new file mode 100644 index 00000000..87f79cff Binary files /dev/null and b/.yarn/cache/ignore-npm-5.3.0-fb0f5fa062-2736da6621.zip differ diff --git a/.yarn/cache/ignore-walk-npm-5.0.1-58258fb4ca-1a4ef35174.zip b/.yarn/cache/ignore-walk-npm-5.0.1-58258fb4ca-1a4ef35174.zip new file mode 100644 index 00000000..54c71e5a Binary files /dev/null and b/.yarn/cache/ignore-walk-npm-5.0.1-58258fb4ca-1a4ef35174.zip differ diff --git a/.yarn/cache/ignore-walk-npm-6.0.3-ebca6b06c4-d8ba534beb.zip b/.yarn/cache/ignore-walk-npm-6.0.3-ebca6b06c4-d8ba534beb.zip new file mode 100644 index 00000000..a5bad04b Binary files /dev/null and b/.yarn/cache/ignore-walk-npm-6.0.3-ebca6b06c4-d8ba534beb.zip differ diff --git a/.yarn/cache/init-package-json-npm-5.0.0-0656c8f580-ad601c717d.zip b/.yarn/cache/init-package-json-npm-5.0.0-0656c8f580-ad601c717d.zip new file mode 100644 index 00000000..1b25ea9d Binary files /dev/null and b/.yarn/cache/init-package-json-npm-5.0.0-0656c8f580-ad601c717d.zip differ diff --git a/.yarn/cache/inquirer-npm-8.2.6-dad82b499b-387ffb0a51.zip b/.yarn/cache/inquirer-npm-8.2.6-dad82b499b-387ffb0a51.zip new file mode 100644 index 00000000..7a834c23 Binary files /dev/null and b/.yarn/cache/inquirer-npm-8.2.6-dad82b499b-387ffb0a51.zip differ diff --git a/.yarn/cache/is-obj-npm-2.0.0-3d95e053f4-c9916ac8f4.zip b/.yarn/cache/is-obj-npm-2.0.0-3d95e053f4-c9916ac8f4.zip new file mode 100644 index 00000000..a7f0e896 Binary files /dev/null and b/.yarn/cache/is-obj-npm-2.0.0-3d95e053f4-c9916ac8f4.zip differ diff --git a/.yarn/cache/is-plain-object-npm-5.0.0-285b70faa3-e32d27061e.zip b/.yarn/cache/is-plain-object-npm-5.0.0-285b70faa3-e32d27061e.zip new file mode 100644 index 00000000..fd9d03a7 Binary files /dev/null and b/.yarn/cache/is-plain-object-npm-5.0.0-285b70faa3-e32d27061e.zip differ diff --git a/.yarn/cache/is-ssh-npm-1.4.0-c6d7eec087-75eaa17b53.zip b/.yarn/cache/is-ssh-npm-1.4.0-c6d7eec087-75eaa17b53.zip new file mode 100644 index 00000000..2dd44b62 Binary files /dev/null and b/.yarn/cache/is-ssh-npm-1.4.0-c6d7eec087-75eaa17b53.zip differ diff --git a/.yarn/cache/is-stream-npm-2.0.0-1401f82ad7-4dc47738e2.zip b/.yarn/cache/is-stream-npm-2.0.0-1401f82ad7-4dc47738e2.zip new file mode 100644 index 00000000..4604ffcf Binary files /dev/null and b/.yarn/cache/is-stream-npm-2.0.0-1401f82ad7-4dc47738e2.zip differ diff --git a/.yarn/cache/is-text-path-npm-1.0.1-92c78fe58d-fb5d78752c.zip b/.yarn/cache/is-text-path-npm-1.0.1-92c78fe58d-fb5d78752c.zip new file mode 100644 index 00000000..03514391 Binary files /dev/null and b/.yarn/cache/is-text-path-npm-1.0.1-92c78fe58d-fb5d78752c.zip differ diff --git a/.yarn/cache/jake-npm-10.8.7-1caf9b4534-a23fd2273f.zip b/.yarn/cache/jake-npm-10.8.7-1caf9b4534-a23fd2273f.zip new file mode 100644 index 00000000..41c1dea0 Binary files /dev/null and b/.yarn/cache/jake-npm-10.8.7-1caf9b4534-a23fd2273f.zip differ diff --git a/.yarn/cache/json-parse-even-better-errors-npm-3.0.0-3675833c0a-f1970b5220.zip b/.yarn/cache/json-parse-even-better-errors-npm-3.0.0-3675833c0a-f1970b5220.zip new file mode 100644 index 00000000..8aa941bd Binary files /dev/null and b/.yarn/cache/json-parse-even-better-errors-npm-3.0.0-3675833c0a-f1970b5220.zip differ diff --git a/.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-48ec0adad5.zip b/.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-48ec0adad5.zip new file mode 100644 index 00000000..bda01edf Binary files /dev/null and b/.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-48ec0adad5.zip differ diff --git a/.yarn/cache/jsonc-parser-npm-3.2.0-1896ece3b7-946dd9a5f3.zip b/.yarn/cache/jsonc-parser-npm-3.2.0-1896ece3b7-946dd9a5f3.zip new file mode 100644 index 00000000..82b3a9da Binary files /dev/null and b/.yarn/cache/jsonc-parser-npm-3.2.0-1896ece3b7-946dd9a5f3.zip differ diff --git a/.yarn/cache/jsonparse-npm-1.3.1-b6fde74828-6514a7be46.zip b/.yarn/cache/jsonparse-npm-1.3.1-b6fde74828-6514a7be46.zip new file mode 100644 index 00000000..fb66b389 Binary files /dev/null and b/.yarn/cache/jsonparse-npm-1.3.1-b6fde74828-6514a7be46.zip differ diff --git a/.yarn/cache/lerna-npm-7.4.2-863b7710cf-c534250058.zip b/.yarn/cache/lerna-npm-7.4.2-863b7710cf-c534250058.zip new file mode 100644 index 00000000..259168d1 Binary files /dev/null and b/.yarn/cache/lerna-npm-7.4.2-863b7710cf-c534250058.zip differ diff --git a/.yarn/cache/libnpmaccess-npm-7.0.2-57b91bfda5-73d49f3939.zip b/.yarn/cache/libnpmaccess-npm-7.0.2-57b91bfda5-73d49f3939.zip new file mode 100644 index 00000000..58e75dbe Binary files /dev/null and b/.yarn/cache/libnpmaccess-npm-7.0.2-57b91bfda5-73d49f3939.zip differ diff --git a/.yarn/cache/libnpmpublish-npm-7.3.0-006fc4afe8-03bedb65eb.zip b/.yarn/cache/libnpmpublish-npm-7.3.0-006fc4afe8-03bedb65eb.zip new file mode 100644 index 00000000..81a309e3 Binary files /dev/null and b/.yarn/cache/libnpmpublish-npm-7.3.0-006fc4afe8-03bedb65eb.zip differ diff --git a/.yarn/cache/lines-and-columns-npm-2.0.4-e433f5a96f-f5e3e20746.zip b/.yarn/cache/lines-and-columns-npm-2.0.4-e433f5a96f-f5e3e20746.zip new file mode 100644 index 00000000..d4f3e47c Binary files /dev/null and b/.yarn/cache/lines-and-columns-npm-2.0.4-e433f5a96f-f5e3e20746.zip differ diff --git a/.yarn/cache/load-json-file-npm-4.0.0-c9f09d85eb-8f5d6d93ba.zip b/.yarn/cache/load-json-file-npm-4.0.0-c9f09d85eb-8f5d6d93ba.zip new file mode 100644 index 00000000..48ad7d38 Binary files /dev/null and b/.yarn/cache/load-json-file-npm-4.0.0-c9f09d85eb-8f5d6d93ba.zip differ diff --git a/.yarn/cache/load-json-file-npm-6.2.0-516f143724-4429e430eb.zip b/.yarn/cache/load-json-file-npm-6.2.0-516f143724-4429e430eb.zip new file mode 100644 index 00000000..5daf3f6a Binary files /dev/null and b/.yarn/cache/load-json-file-npm-6.2.0-516f143724-4429e430eb.zip differ diff --git a/.yarn/cache/locate-path-npm-2.0.0-673d28b0ea-02d581edbb.zip b/.yarn/cache/locate-path-npm-2.0.0-673d28b0ea-02d581edbb.zip new file mode 100644 index 00000000..0841fd1c Binary files /dev/null and b/.yarn/cache/locate-path-npm-2.0.0-673d28b0ea-02d581edbb.zip differ diff --git a/.yarn/cache/lodash.ismatch-npm-4.4.0-e538fd6c3d-a393917578.zip b/.yarn/cache/lodash.ismatch-npm-4.4.0-e538fd6c3d-a393917578.zip new file mode 100644 index 00000000..223a6692 Binary files /dev/null and b/.yarn/cache/lodash.ismatch-npm-4.4.0-e538fd6c3d-a393917578.zip differ diff --git a/.yarn/cache/make-fetch-happen-npm-10.2.1-f1cc7cd2df-2332eb9a8e.zip b/.yarn/cache/make-fetch-happen-npm-10.2.1-f1cc7cd2df-2332eb9a8e.zip new file mode 100644 index 00000000..f257e35c Binary files /dev/null and b/.yarn/cache/make-fetch-happen-npm-10.2.1-f1cc7cd2df-2332eb9a8e.zip differ diff --git a/.yarn/cache/meow-npm-8.1.2-bcfe48d4f3-bc23bf1b44.zip b/.yarn/cache/meow-npm-8.1.2-bcfe48d4f3-bc23bf1b44.zip new file mode 100644 index 00000000..26b795a8 Binary files /dev/null and b/.yarn/cache/meow-npm-8.1.2-bcfe48d4f3-bc23bf1b44.zip differ diff --git a/.yarn/cache/minimatch-npm-3.0.5-a20094d35f-a3b84b426e.zip b/.yarn/cache/minimatch-npm-3.0.5-a20094d35f-a3b84b426e.zip new file mode 100644 index 00000000..51f688ff Binary files /dev/null and b/.yarn/cache/minimatch-npm-3.0.5-a20094d35f-a3b84b426e.zip differ diff --git a/.yarn/cache/minimatch-npm-8.0.4-bf57f0e98a-2e46cffb86.zip b/.yarn/cache/minimatch-npm-8.0.4-bf57f0e98a-2e46cffb86.zip new file mode 100644 index 00000000..8fbf0b8d Binary files /dev/null and b/.yarn/cache/minimatch-npm-8.0.4-bf57f0e98a-2e46cffb86.zip differ diff --git a/.yarn/cache/minipass-fetch-npm-2.1.2-9b21a5c930-3f216be791.zip b/.yarn/cache/minipass-fetch-npm-2.1.2-9b21a5c930-3f216be791.zip new file mode 100644 index 00000000..59a89f1b Binary files /dev/null and b/.yarn/cache/minipass-fetch-npm-2.1.2-9b21a5c930-3f216be791.zip differ diff --git a/.yarn/cache/minipass-json-stream-npm-1.0.1-96490706d6-791b696a27.zip b/.yarn/cache/minipass-json-stream-npm-1.0.1-96490706d6-791b696a27.zip new file mode 100644 index 00000000..8f95147b Binary files /dev/null and b/.yarn/cache/minipass-json-stream-npm-1.0.1-96490706d6-791b696a27.zip differ diff --git a/.yarn/cache/minipass-npm-4.2.8-f05abfe254-7f4914d529.zip b/.yarn/cache/minipass-npm-4.2.8-f05abfe254-7f4914d529.zip new file mode 100644 index 00000000..625abfa9 Binary files /dev/null and b/.yarn/cache/minipass-npm-4.2.8-f05abfe254-7f4914d529.zip differ diff --git a/.yarn/cache/modify-values-npm-1.0.1-9b2377e166-8296610c60.zip b/.yarn/cache/modify-values-npm-1.0.1-9b2377e166-8296610c60.zip new file mode 100644 index 00000000..759e1f53 Binary files /dev/null and b/.yarn/cache/modify-values-npm-1.0.1-9b2377e166-8296610c60.zip differ diff --git a/.yarn/cache/multimatch-npm-5.0.0-9938abf6fa-82c8030a53.zip b/.yarn/cache/multimatch-npm-5.0.0-9938abf6fa-82c8030a53.zip new file mode 100644 index 00000000..ac8e20c5 Binary files /dev/null and b/.yarn/cache/multimatch-npm-5.0.0-9938abf6fa-82c8030a53.zip differ diff --git a/.yarn/cache/mute-stream-npm-0.0.8-489a7d6c2b-ff48d251fc.zip b/.yarn/cache/mute-stream-npm-0.0.8-489a7d6c2b-ff48d251fc.zip new file mode 100644 index 00000000..33156aea Binary files /dev/null and b/.yarn/cache/mute-stream-npm-0.0.8-489a7d6c2b-ff48d251fc.zip differ diff --git a/.yarn/cache/mute-stream-npm-1.0.0-b6e846d471-36fc968b0e.zip b/.yarn/cache/mute-stream-npm-1.0.0-b6e846d471-36fc968b0e.zip new file mode 100644 index 00000000..3d01d4b4 Binary files /dev/null and b/.yarn/cache/mute-stream-npm-1.0.0-b6e846d471-36fc968b0e.zip differ diff --git a/.yarn/cache/node-addon-api-npm-3.2.1-a29528f81d-2369986bb0.zip b/.yarn/cache/node-addon-api-npm-3.2.1-a29528f81d-2369986bb0.zip new file mode 100644 index 00000000..038beb4a Binary files /dev/null and b/.yarn/cache/node-addon-api-npm-3.2.1-a29528f81d-2369986bb0.zip differ diff --git a/.yarn/cache/node-fetch-npm-2.6.7-777aa2a6df-8d816ffd1e.zip b/.yarn/cache/node-fetch-npm-2.6.7-777aa2a6df-8d816ffd1e.zip new file mode 100644 index 00000000..db222e2a Binary files /dev/null and b/.yarn/cache/node-fetch-npm-2.6.7-777aa2a6df-8d816ffd1e.zip differ diff --git a/.yarn/cache/node-gyp-build-npm-4.7.0-24b849bb3c-5b0417487c.zip b/.yarn/cache/node-gyp-build-npm-4.7.0-24b849bb3c-5b0417487c.zip new file mode 100644 index 00000000..e6d65cdc Binary files /dev/null and b/.yarn/cache/node-gyp-build-npm-4.7.0-24b849bb3c-5b0417487c.zip differ diff --git a/.yarn/cache/node-gyp-npm-9.4.1-15a6f0e8e4-8576c439e9.zip b/.yarn/cache/node-gyp-npm-9.4.1-15a6f0e8e4-8576c439e9.zip new file mode 100644 index 00000000..1fc56e9c Binary files /dev/null and b/.yarn/cache/node-gyp-npm-9.4.1-15a6f0e8e4-8576c439e9.zip differ diff --git a/.yarn/cache/node-machine-id-npm-1.1.12-ad6d29fa15-e23088a0fb.zip b/.yarn/cache/node-machine-id-npm-1.1.12-ad6d29fa15-e23088a0fb.zip new file mode 100644 index 00000000..303742a2 Binary files /dev/null and b/.yarn/cache/node-machine-id-npm-1.1.12-ad6d29fa15-e23088a0fb.zip differ diff --git a/.yarn/cache/normalize-package-data-npm-3.0.3-1a49056685-bbcee00339.zip b/.yarn/cache/normalize-package-data-npm-3.0.3-1a49056685-bbcee00339.zip new file mode 100644 index 00000000..6f43f295 Binary files /dev/null and b/.yarn/cache/normalize-package-data-npm-3.0.3-1a49056685-bbcee00339.zip differ diff --git a/.yarn/cache/normalize-package-data-npm-5.0.0-6327e2af68-a459f05eaf.zip b/.yarn/cache/normalize-package-data-npm-5.0.0-6327e2af68-a459f05eaf.zip new file mode 100644 index 00000000..3ac72bdb Binary files /dev/null and b/.yarn/cache/normalize-package-data-npm-5.0.0-6327e2af68-a459f05eaf.zip differ diff --git a/.yarn/cache/npm-bundled-npm-1.1.2-e299e533ef-6e599155ef.zip b/.yarn/cache/npm-bundled-npm-1.1.2-e299e533ef-6e599155ef.zip new file mode 100644 index 00000000..65958555 Binary files /dev/null and b/.yarn/cache/npm-bundled-npm-1.1.2-e299e533ef-6e599155ef.zip differ diff --git a/.yarn/cache/npm-bundled-npm-3.0.0-0b3c5ee4f3-110859c2d6.zip b/.yarn/cache/npm-bundled-npm-3.0.0-0b3c5ee4f3-110859c2d6.zip new file mode 100644 index 00000000..d1e7a9bd Binary files /dev/null and b/.yarn/cache/npm-bundled-npm-3.0.0-0b3c5ee4f3-110859c2d6.zip differ diff --git a/.yarn/cache/npm-install-checks-npm-6.3.0-d093d4e008-6c20dadb87.zip b/.yarn/cache/npm-install-checks-npm-6.3.0-d093d4e008-6c20dadb87.zip new file mode 100644 index 00000000..95ac8acf Binary files /dev/null and b/.yarn/cache/npm-install-checks-npm-6.3.0-d093d4e008-6c20dadb87.zip differ diff --git a/.yarn/cache/npm-normalize-package-bin-npm-1.0.1-2cf38a5d95-ae7f15155a.zip b/.yarn/cache/npm-normalize-package-bin-npm-1.0.1-2cf38a5d95-ae7f15155a.zip new file mode 100644 index 00000000..e76c781b Binary files /dev/null and b/.yarn/cache/npm-normalize-package-bin-npm-1.0.1-2cf38a5d95-ae7f15155a.zip differ diff --git a/.yarn/cache/npm-normalize-package-bin-npm-3.0.1-6c120b50f7-de416d720a.zip b/.yarn/cache/npm-normalize-package-bin-npm-3.0.1-6c120b50f7-de416d720a.zip new file mode 100644 index 00000000..b1936ffe Binary files /dev/null and b/.yarn/cache/npm-normalize-package-bin-npm-3.0.1-6c120b50f7-de416d720a.zip differ diff --git a/.yarn/cache/npm-package-arg-npm-10.1.0-e9f0aaa69d-8fe4b6a742.zip b/.yarn/cache/npm-package-arg-npm-10.1.0-e9f0aaa69d-8fe4b6a742.zip new file mode 100644 index 00000000..4c424d9a Binary files /dev/null and b/.yarn/cache/npm-package-arg-npm-10.1.0-e9f0aaa69d-8fe4b6a742.zip differ diff --git a/.yarn/cache/npm-package-arg-npm-8.1.1-044819f446-406c59f92d.zip b/.yarn/cache/npm-package-arg-npm-8.1.1-044819f446-406c59f92d.zip new file mode 100644 index 00000000..1c5ba562 Binary files /dev/null and b/.yarn/cache/npm-package-arg-npm-8.1.1-044819f446-406c59f92d.zip differ diff --git a/.yarn/cache/npm-packlist-npm-5.1.1-38389ac20f-28dab15374.zip b/.yarn/cache/npm-packlist-npm-5.1.1-38389ac20f-28dab15374.zip new file mode 100644 index 00000000..55a089b5 Binary files /dev/null and b/.yarn/cache/npm-packlist-npm-5.1.1-38389ac20f-28dab15374.zip differ diff --git a/.yarn/cache/npm-packlist-npm-7.0.4-1c0b919056-5ffa1f8f0b.zip b/.yarn/cache/npm-packlist-npm-7.0.4-1c0b919056-5ffa1f8f0b.zip new file mode 100644 index 00000000..f2f4c2a3 Binary files /dev/null and b/.yarn/cache/npm-packlist-npm-7.0.4-1c0b919056-5ffa1f8f0b.zip differ diff --git a/.yarn/cache/npm-pick-manifest-npm-8.0.2-ec194cb513-c9f71b5735.zip b/.yarn/cache/npm-pick-manifest-npm-8.0.2-ec194cb513-c9f71b5735.zip new file mode 100644 index 00000000..034b1a3f Binary files /dev/null and b/.yarn/cache/npm-pick-manifest-npm-8.0.2-ec194cb513-c9f71b5735.zip differ diff --git a/.yarn/cache/npm-registry-fetch-npm-14.0.5-6b3e6c0dd0-c636496429.zip b/.yarn/cache/npm-registry-fetch-npm-14.0.5-6b3e6c0dd0-c636496429.zip new file mode 100644 index 00000000..7f6498c3 Binary files /dev/null and b/.yarn/cache/npm-registry-fetch-npm-14.0.5-6b3e6c0dd0-c636496429.zip differ diff --git a/.yarn/cache/nx-npm-16.10.0-f47ffca030-961b290f65.zip b/.yarn/cache/nx-npm-16.10.0-f47ffca030-961b290f65.zip new file mode 100644 index 00000000..47e5693f Binary files /dev/null and b/.yarn/cache/nx-npm-16.10.0-f47ffca030-961b290f65.zip differ diff --git a/.yarn/cache/p-limit-npm-1.3.0-fdb471d864-281c1c0b8c.zip b/.yarn/cache/p-limit-npm-1.3.0-fdb471d864-281c1c0b8c.zip new file mode 100644 index 00000000..96906bab Binary files /dev/null and b/.yarn/cache/p-limit-npm-1.3.0-fdb471d864-281c1c0b8c.zip differ diff --git a/.yarn/cache/p-locate-npm-2.0.0-3a2ee263dd-e2dceb9b49.zip b/.yarn/cache/p-locate-npm-2.0.0-3a2ee263dd-e2dceb9b49.zip new file mode 100644 index 00000000..f6f9f09b Binary files /dev/null and b/.yarn/cache/p-locate-npm-2.0.0-3a2ee263dd-e2dceb9b49.zip differ diff --git a/.yarn/cache/p-map-series-npm-2.1.0-ae4fbfa711-69d4efbb69.zip b/.yarn/cache/p-map-series-npm-2.1.0-ae4fbfa711-69d4efbb69.zip new file mode 100644 index 00000000..b82ab0ea Binary files /dev/null and b/.yarn/cache/p-map-series-npm-2.1.0-ae4fbfa711-69d4efbb69.zip differ diff --git a/.yarn/cache/p-pipe-npm-3.1.0-147ab7fff2-ee9a260968.zip b/.yarn/cache/p-pipe-npm-3.1.0-147ab7fff2-ee9a260968.zip new file mode 100644 index 00000000..7699896b Binary files /dev/null and b/.yarn/cache/p-pipe-npm-3.1.0-147ab7fff2-ee9a260968.zip differ diff --git a/.yarn/cache/p-queue-npm-6.6.2-b173c5bfa8-832642fcc4.zip b/.yarn/cache/p-queue-npm-6.6.2-b173c5bfa8-832642fcc4.zip new file mode 100644 index 00000000..da69f775 Binary files /dev/null and b/.yarn/cache/p-queue-npm-6.6.2-b173c5bfa8-832642fcc4.zip differ diff --git a/.yarn/cache/p-reduce-npm-2.1.0-f5593a333c-99b26d3606.zip b/.yarn/cache/p-reduce-npm-2.1.0-f5593a333c-99b26d3606.zip new file mode 100644 index 00000000..13d12a3c Binary files /dev/null and b/.yarn/cache/p-reduce-npm-2.1.0-f5593a333c-99b26d3606.zip differ diff --git a/.yarn/cache/p-timeout-npm-3.2.0-7fdb33f733-3dd0eaa048.zip b/.yarn/cache/p-timeout-npm-3.2.0-7fdb33f733-3dd0eaa048.zip new file mode 100644 index 00000000..eaf8f71c Binary files /dev/null and b/.yarn/cache/p-timeout-npm-3.2.0-7fdb33f733-3dd0eaa048.zip differ diff --git a/.yarn/cache/p-try-npm-1.0.0-7373139e40-3b5303f77e.zip b/.yarn/cache/p-try-npm-1.0.0-7373139e40-3b5303f77e.zip new file mode 100644 index 00000000..e12bd247 Binary files /dev/null and b/.yarn/cache/p-try-npm-1.0.0-7373139e40-3b5303f77e.zip differ diff --git a/.yarn/cache/p-waterfall-npm-2.1.1-83bd225df0-8588bb8b00.zip b/.yarn/cache/p-waterfall-npm-2.1.1-83bd225df0-8588bb8b00.zip new file mode 100644 index 00000000..e5d4d91d Binary files /dev/null and b/.yarn/cache/p-waterfall-npm-2.1.1-83bd225df0-8588bb8b00.zip differ diff --git a/.yarn/cache/pacote-npm-15.2.0-b9ed3321e9-c731572be2.zip b/.yarn/cache/pacote-npm-15.2.0-b9ed3321e9-c731572be2.zip new file mode 100644 index 00000000..fc173032 Binary files /dev/null and b/.yarn/cache/pacote-npm-15.2.0-b9ed3321e9-c731572be2.zip differ diff --git a/.yarn/cache/parse-path-npm-7.0.0-ceda41e594-244b46523a.zip b/.yarn/cache/parse-path-npm-7.0.0-ceda41e594-244b46523a.zip new file mode 100644 index 00000000..f11412e1 Binary files /dev/null and b/.yarn/cache/parse-path-npm-7.0.0-ceda41e594-244b46523a.zip differ diff --git a/.yarn/cache/parse-url-npm-8.1.0-0995f15c34-b93e21ab4c.zip b/.yarn/cache/parse-url-npm-8.1.0-0995f15c34-b93e21ab4c.zip new file mode 100644 index 00000000..1b5684a5 Binary files /dev/null and b/.yarn/cache/parse-url-npm-8.1.0-0995f15c34-b93e21ab4c.zip differ diff --git a/.yarn/cache/path-type-npm-3.0.0-252361a0eb-735b35e256.zip b/.yarn/cache/path-type-npm-3.0.0-252361a0eb-735b35e256.zip new file mode 100644 index 00000000..3a59d9b0 Binary files /dev/null and b/.yarn/cache/path-type-npm-3.0.0-252361a0eb-735b35e256.zip differ diff --git a/.yarn/cache/pify-npm-2.3.0-8b63310934-9503aaeaf4.zip b/.yarn/cache/pify-npm-2.3.0-8b63310934-9503aaeaf4.zip new file mode 100644 index 00000000..4cbc70a0 Binary files /dev/null and b/.yarn/cache/pify-npm-2.3.0-8b63310934-9503aaeaf4.zip differ diff --git a/.yarn/cache/pify-npm-3.0.0-679ee405c8-6cdcbc3567.zip b/.yarn/cache/pify-npm-3.0.0-679ee405c8-6cdcbc3567.zip new file mode 100644 index 00000000..95bf8418 Binary files /dev/null and b/.yarn/cache/pify-npm-3.0.0-679ee405c8-6cdcbc3567.zip differ diff --git a/.yarn/cache/pify-npm-5.0.0-f5abe8ab8d-443e3e198a.zip b/.yarn/cache/pify-npm-5.0.0-f5abe8ab8d-443e3e198a.zip new file mode 100644 index 00000000..dabc1ec9 Binary files /dev/null and b/.yarn/cache/pify-npm-5.0.0-f5abe8ab8d-443e3e198a.zip differ diff --git a/.yarn/cache/proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip b/.yarn/cache/proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip new file mode 100644 index 00000000..0436b176 Binary files /dev/null and b/.yarn/cache/proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip differ diff --git a/.yarn/cache/promzard-npm-1.0.0-a0d17e2d53-c069488271.zip b/.yarn/cache/promzard-npm-1.0.0-a0d17e2d53-c069488271.zip new file mode 100644 index 00000000..55ceade3 Binary files /dev/null and b/.yarn/cache/promzard-npm-1.0.0-a0d17e2d53-c069488271.zip differ diff --git a/.yarn/cache/protocols-npm-2.0.1-e2bc74d1c1-4a9bef6aa0.zip b/.yarn/cache/protocols-npm-2.0.1-e2bc74d1c1-4a9bef6aa0.zip new file mode 100644 index 00000000..b4d812c5 Binary files /dev/null and b/.yarn/cache/protocols-npm-2.0.1-e2bc74d1c1-4a9bef6aa0.zip differ diff --git a/.yarn/cache/react-native-fast-image-npm-8.6.3-03ee2d23c0-29289cb6b2.zip b/.yarn/cache/react-native-fast-image-npm-8.6.3-03ee2d23c0-29289cb6b2.zip new file mode 100644 index 00000000..6dcbcd3d Binary files /dev/null and b/.yarn/cache/react-native-fast-image-npm-8.6.3-03ee2d23c0-29289cb6b2.zip differ diff --git a/.yarn/cache/read-cmd-shim-npm-4.0.0-2339b15fb0-2fb5a8a389.zip b/.yarn/cache/read-cmd-shim-npm-4.0.0-2339b15fb0-2fb5a8a389.zip new file mode 100644 index 00000000..c3575906 Binary files /dev/null and b/.yarn/cache/read-cmd-shim-npm-4.0.0-2339b15fb0-2fb5a8a389.zip differ diff --git a/.yarn/cache/read-npm-2.1.0-0e0cb8a375-e745999138.zip b/.yarn/cache/read-npm-2.1.0-0e0cb8a375-e745999138.zip new file mode 100644 index 00000000..4b1550e1 Binary files /dev/null and b/.yarn/cache/read-npm-2.1.0-0e0cb8a375-e745999138.zip differ diff --git a/.yarn/cache/read-package-json-fast-npm-3.0.2-1232471a07-8d406869f0.zip b/.yarn/cache/read-package-json-fast-npm-3.0.2-1232471a07-8d406869f0.zip new file mode 100644 index 00000000..45cbd959 Binary files /dev/null and b/.yarn/cache/read-package-json-fast-npm-3.0.2-1232471a07-8d406869f0.zip differ diff --git a/.yarn/cache/read-package-json-npm-6.0.4-bf5c705b94-ce40c46712.zip b/.yarn/cache/read-package-json-npm-6.0.4-bf5c705b94-ce40c46712.zip new file mode 100644 index 00000000..2e65e862 Binary files /dev/null and b/.yarn/cache/read-package-json-npm-6.0.4-bf5c705b94-ce40c46712.zip differ diff --git a/.yarn/cache/read-pkg-npm-3.0.0-41471436cb-398903ebae.zip b/.yarn/cache/read-pkg-npm-3.0.0-41471436cb-398903ebae.zip new file mode 100644 index 00000000..e0a22aff Binary files /dev/null and b/.yarn/cache/read-pkg-npm-3.0.0-41471436cb-398903ebae.zip differ diff --git a/.yarn/cache/read-pkg-up-npm-3.0.0-3d7faf047f-16175573f2.zip b/.yarn/cache/read-pkg-up-npm-3.0.0-3d7faf047f-16175573f2.zip new file mode 100644 index 00000000..f1f0a309 Binary files /dev/null and b/.yarn/cache/read-pkg-up-npm-3.0.0-3d7faf047f-16175573f2.zip differ diff --git a/.yarn/cache/rimraf-npm-4.4.1-80b02e041a-b786adc026.zip b/.yarn/cache/rimraf-npm-4.4.1-80b02e041a-b786adc026.zip new file mode 100644 index 00000000..bc4f5075 Binary files /dev/null and b/.yarn/cache/rimraf-npm-4.4.1-80b02e041a-b786adc026.zip differ diff --git a/.yarn/cache/run-async-npm-2.4.1-a94bb90861-a2c88aa15d.zip b/.yarn/cache/run-async-npm-2.4.1-a94bb90861-a2c88aa15d.zip new file mode 100644 index 00000000..34c485e0 Binary files /dev/null and b/.yarn/cache/run-async-npm-2.4.1-a94bb90861-a2c88aa15d.zip differ diff --git a/.yarn/cache/rxjs-npm-7.8.1-41c443a75b-de4b53db10.zip b/.yarn/cache/rxjs-npm-7.8.1-41c443a75b-de4b53db10.zip new file mode 100644 index 00000000..0bd98bad Binary files /dev/null and b/.yarn/cache/rxjs-npm-7.8.1-41c443a75b-de4b53db10.zip differ diff --git a/.yarn/cache/sigstore-npm-1.9.0-bf939b66bb-b3f1ccf4d2.zip b/.yarn/cache/sigstore-npm-1.9.0-bf939b66bb-b3f1ccf4d2.zip new file mode 100644 index 00000000..4f00dc1b Binary files /dev/null and b/.yarn/cache/sigstore-npm-1.9.0-bf939b66bb-b3f1ccf4d2.zip differ diff --git a/.yarn/cache/split2-npm-3.2.2-4ccd21b4f7-8127ddbedd.zip b/.yarn/cache/split2-npm-3.2.2-4ccd21b4f7-8127ddbedd.zip new file mode 100644 index 00000000..1dddb3f7 Binary files /dev/null and b/.yarn/cache/split2-npm-3.2.2-4ccd21b4f7-8127ddbedd.zip differ diff --git a/.yarn/cache/ssri-npm-9.0.1-33ce27f4f8-fb58f5e46b.zip b/.yarn/cache/ssri-npm-9.0.1-33ce27f4f8-fb58f5e46b.zip new file mode 100644 index 00000000..4af584ce Binary files /dev/null and b/.yarn/cache/ssri-npm-9.0.1-33ce27f4f8-fb58f5e46b.zip differ diff --git a/.yarn/cache/strong-log-transformer-npm-2.1.0-45addd9278-abf9a4ac14.zip b/.yarn/cache/strong-log-transformer-npm-2.1.0-45addd9278-abf9a4ac14.zip new file mode 100644 index 00000000..07cf54ca Binary files /dev/null and b/.yarn/cache/strong-log-transformer-npm-2.1.0-45addd9278-abf9a4ac14.zip differ diff --git a/.yarn/cache/tar-npm-6.1.11-e6ac3cba9c-a04c07bb9e.zip b/.yarn/cache/tar-npm-6.1.11-e6ac3cba9c-a04c07bb9e.zip new file mode 100644 index 00000000..d4e5d8f3 Binary files /dev/null and b/.yarn/cache/tar-npm-6.1.11-e6ac3cba9c-a04c07bb9e.zip differ diff --git a/.yarn/cache/tar-stream-npm-2.2.0-884c79b510-699831a8b9.zip b/.yarn/cache/tar-stream-npm-2.2.0-884c79b510-699831a8b9.zip new file mode 100644 index 00000000..6d7267b3 Binary files /dev/null and b/.yarn/cache/tar-stream-npm-2.2.0-884c79b510-699831a8b9.zip differ diff --git a/.yarn/cache/text-extensions-npm-1.9.0-87655d768f-56a9962c1b.zip b/.yarn/cache/text-extensions-npm-1.9.0-87655d768f-56a9962c1b.zip new file mode 100644 index 00000000..0c2ccda3 Binary files /dev/null and b/.yarn/cache/text-extensions-npm-1.9.0-87655d768f-56a9962c1b.zip differ diff --git a/.yarn/cache/tmp-npm-0.2.1-a9c8d9c0ca-8b12146541.zip b/.yarn/cache/tmp-npm-0.2.1-a9c8d9c0ca-8b12146541.zip new file mode 100644 index 00000000..d47a2298 Binary files /dev/null and b/.yarn/cache/tmp-npm-0.2.1-a9c8d9c0ca-8b12146541.zip differ diff --git a/.yarn/cache/tsconfig-paths-npm-4.2.0-ac1edf8677-28c5f7bbbc.zip b/.yarn/cache/tsconfig-paths-npm-4.2.0-ac1edf8677-28c5f7bbbc.zip new file mode 100644 index 00000000..0d3418a2 Binary files /dev/null and b/.yarn/cache/tsconfig-paths-npm-4.2.0-ac1edf8677-28c5f7bbbc.zip differ diff --git a/.yarn/cache/tuf-js-npm-1.1.7-045f70823d-089fc0dabe.zip b/.yarn/cache/tuf-js-npm-1.1.7-045f70823d-089fc0dabe.zip new file mode 100644 index 00000000..2d30149c Binary files /dev/null and b/.yarn/cache/tuf-js-npm-1.1.7-045f70823d-089fc0dabe.zip differ diff --git a/.yarn/cache/type-fest-npm-0.18.1-47b079775d-e96dcee18a.zip b/.yarn/cache/type-fest-npm-0.18.1-47b079775d-e96dcee18a.zip new file mode 100644 index 00000000..e1ed2390 Binary files /dev/null and b/.yarn/cache/type-fest-npm-0.18.1-47b079775d-e96dcee18a.zip differ diff --git a/.yarn/cache/type-fest-npm-0.4.1-bf35530fbf-25f882d9cc.zip b/.yarn/cache/type-fest-npm-0.4.1-bf35530fbf-25f882d9cc.zip new file mode 100644 index 00000000..c4ae8121 Binary files /dev/null and b/.yarn/cache/type-fest-npm-0.4.1-bf35530fbf-25f882d9cc.zip differ diff --git a/.yarn/cache/typedarray-npm-0.0.6-37638b2241-33b39f3d0e.zip b/.yarn/cache/typedarray-npm-0.0.6-37638b2241-33b39f3d0e.zip new file mode 100644 index 00000000..d03674ea Binary files /dev/null and b/.yarn/cache/typedarray-npm-0.0.6-37638b2241-33b39f3d0e.zip differ diff --git a/.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-7b3897df38.zip b/.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-7b3897df38.zip new file mode 100644 index 00000000..c3d1c955 Binary files /dev/null and b/.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-7b3897df38.zip differ diff --git a/.yarn/cache/unique-filename-npm-2.0.1-183c6c7c2b-807acf3381.zip b/.yarn/cache/unique-filename-npm-2.0.1-183c6c7c2b-807acf3381.zip new file mode 100644 index 00000000..1d4f4195 Binary files /dev/null and b/.yarn/cache/unique-filename-npm-2.0.1-183c6c7c2b-807acf3381.zip differ diff --git a/.yarn/cache/unique-slug-npm-3.0.0-0b82e51577-49f8d915ba.zip b/.yarn/cache/unique-slug-npm-3.0.0-0b82e51577-49f8d915ba.zip new file mode 100644 index 00000000..9e3f7f2f Binary files /dev/null and b/.yarn/cache/unique-slug-npm-3.0.0-0b82e51577-49f8d915ba.zip differ diff --git a/.yarn/cache/universal-user-agent-npm-6.0.1-0388aac597-fdc8e1ae48.zip b/.yarn/cache/universal-user-agent-npm-6.0.1-0388aac597-fdc8e1ae48.zip new file mode 100644 index 00000000..363fb285 Binary files /dev/null and b/.yarn/cache/universal-user-agent-npm-6.0.1-0388aac597-fdc8e1ae48.zip differ diff --git a/.yarn/cache/upath-npm-2.0.1-f0ea260247-2db04f24a0.zip b/.yarn/cache/upath-npm-2.0.1-f0ea260247-2db04f24a0.zip new file mode 100644 index 00000000..fd8f6502 Binary files /dev/null and b/.yarn/cache/upath-npm-2.0.1-f0ea260247-2db04f24a0.zip differ diff --git a/.yarn/cache/uuid-npm-9.0.1-39a8442bc6-39931f6da7.zip b/.yarn/cache/uuid-npm-9.0.1-39a8442bc6-39931f6da7.zip new file mode 100644 index 00000000..9a64a742 Binary files /dev/null and b/.yarn/cache/uuid-npm-9.0.1-39a8442bc6-39931f6da7.zip differ diff --git a/.yarn/cache/v8-compile-cache-npm-2.3.0-961375f150-adb0a271ea.zip b/.yarn/cache/v8-compile-cache-npm-2.3.0-961375f150-adb0a271ea.zip new file mode 100644 index 00000000..0e04423c Binary files /dev/null and b/.yarn/cache/v8-compile-cache-npm-2.3.0-961375f150-adb0a271ea.zip differ diff --git a/.yarn/cache/validate-npm-package-name-npm-5.0.0-fc061c1b84-5342a99498.zip b/.yarn/cache/validate-npm-package-name-npm-5.0.0-fc061c1b84-5342a99498.zip new file mode 100644 index 00000000..7ccf34ce Binary files /dev/null and b/.yarn/cache/validate-npm-package-name-npm-5.0.0-fc061c1b84-5342a99498.zip differ diff --git a/.yarn/cache/which-npm-3.0.1-b2b0f09ace-adf720fe9d.zip b/.yarn/cache/which-npm-3.0.1-b2b0f09ace-adf720fe9d.zip new file mode 100644 index 00000000..bb7aab33 Binary files /dev/null and b/.yarn/cache/which-npm-3.0.1-b2b0f09ace-adf720fe9d.zip differ diff --git a/.yarn/cache/wordwrap-npm-1.0.0-ae57a645e8-2a44b27881.zip b/.yarn/cache/wordwrap-npm-1.0.0-ae57a645e8-2a44b27881.zip new file mode 100644 index 00000000..5463df0b Binary files /dev/null and b/.yarn/cache/wordwrap-npm-1.0.0-ae57a645e8-2a44b27881.zip differ diff --git a/.yarn/cache/write-file-atomic-npm-5.0.1-52283db6ee-8dbb0e2512.zip b/.yarn/cache/write-file-atomic-npm-5.0.1-52283db6ee-8dbb0e2512.zip new file mode 100644 index 00000000..9d67de9b Binary files /dev/null and b/.yarn/cache/write-file-atomic-npm-5.0.1-52283db6ee-8dbb0e2512.zip differ diff --git a/.yarn/cache/write-json-file-npm-3.2.0-965d80a41e-2b97ce2027.zip b/.yarn/cache/write-json-file-npm-3.2.0-965d80a41e-2b97ce2027.zip new file mode 100644 index 00000000..11c41f83 Binary files /dev/null and b/.yarn/cache/write-json-file-npm-3.2.0-965d80a41e-2b97ce2027.zip differ diff --git a/.yarn/cache/write-pkg-npm-4.0.0-731dd7a942-7864d44370.zip b/.yarn/cache/write-pkg-npm-4.0.0-731dd7a942-7864d44370.zip new file mode 100644 index 00000000..c76865b8 Binary files /dev/null and b/.yarn/cache/write-pkg-npm-4.0.0-731dd7a942-7864d44370.zip differ diff --git a/.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip b/.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip new file mode 100644 index 00000000..d11c27d5 Binary files /dev/null and b/.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip differ diff --git a/.yarn/cache/yargs-parser-npm-20.2.4-1de20916a6-d251998a37.zip b/.yarn/cache/yargs-parser-npm-20.2.4-1de20916a6-d251998a37.zip new file mode 100644 index 00000000..fe57a9c8 Binary files /dev/null and b/.yarn/cache/yargs-parser-npm-20.2.4-1de20916a6-d251998a37.zip differ diff --git a/.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-8bb69015f2.zip b/.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-8bb69015f2.zip new file mode 100644 index 00000000..f230038c Binary files /dev/null and b/.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-8bb69015f2.zip differ diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index 05875b5c..43b9d8d1 100644 Binary files a/.yarn/install-state.gz and b/.yarn/install-state.gz differ diff --git a/App.tsx b/App.tsx index 1429afec..4a00a99d 100644 --- a/App.tsx +++ b/App.tsx @@ -1,8 +1,23 @@ +import 'expo-dev-client'; import { NavigationContainer } from '@react-navigation/native'; +import { activateKeepAwakeAsync } from 'expo-keep-awake'; +import React from 'react'; +import { connectToDevTools } from 'react-devtools-core'; +import { LogBox } from 'react-native'; import { AuthContextProvider } from './src/context/AuthContext'; import RootNavigator from './src/navigation/RootNavigator'; export default function App() { + if (__DEV__) { + connectToDevTools({ + host: 'localhost', + port: 8097, + }); + + LogBox.ignoreAllLogs(); + activateKeepAwakeAsync(); + // AsyncStorage.clear().then(() => console.log('AsyncStorage cleared')).catch(e => console.error(e)) + } return ( diff --git a/api.json b/api.json new file mode 100644 index 00000000..418c4712 --- /dev/null +++ b/api.json @@ -0,0 +1,19 @@ +{ + "data": [ + { + "broadcaster_language": "en", + "broadcaster_login": "a_seagull", + "display_name": "A_Seagull", + "game_id": "506442", + "game_name": "DOOM Eternal", + "id": "19070311", + "is_live": true, + "tag_ids": [], + "tags": ["English"], + "thumbnail_url": "https://static-cdn.jtvnw.net/jtv_user_pictures/a_seagull-profile_image-4d2d235688c7dc66-300x300.png", + "title": "a_seagull", + "started_at": "2020-03-18T17:56:00Z" + } + ], + "pagination": {} +} diff --git a/app.json b/app.json index 39e2d325..2ee228d5 100644 --- a/app.json +++ b/app.json @@ -23,10 +23,16 @@ "adaptiveIcon": { "foregroundImage": "./assets/adaptive-icon.png", "backgroundColor": "#ffffff" - } + }, + "package": "com.foam" }, "web": { "favicon": "./assets/favicon.png" + }, + "extra": { + "eas": { + "projectId": "950a1e2f-6b25-4be7-adb2-3c16287a2b5e" + } } } } diff --git a/eas.json b/eas.json new file mode 100644 index 00000000..c27dca6c --- /dev/null +++ b/eas.json @@ -0,0 +1,18 @@ +{ + "cli": { + "version": ">= 5.9.0" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal" + }, + "preview": { + "distribution": "internal" + }, + "production": {} + }, + "submit": { + "production": {} + } +} diff --git a/lerna.json b/lerna.json new file mode 100644 index 00000000..2a49ded2 --- /dev/null +++ b/lerna.json @@ -0,0 +1,12 @@ +{ + "command": { + "publish": { + "conventionalCommits": true, + "message": "chore(release): publish %s [skip ci]", + "allowBranch": ["main"], + "registry": "https://npm.pkg.github.com" + } + }, + "npmClient": "yarn", + "version": "0.1.0" +} diff --git a/package.json b/package.json index 6998c9d5..687ed341 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "foam", - "version": "1.0.0", + "version": "0.1.0", "main": "node_modules/expo/AppEntry.js", "scripts": { "start": "expo start", @@ -14,7 +14,8 @@ "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,html}\"", "format:check": "prettier --list-different \"src/**/*.{js,jsx,ts,tsx,css,scss,html}\"", "prepare": "husky install", - "clean": "rm -rf node_modules ios android .expo && yarn install" + "clean": "rm -rf node_modules ios android .expo && yarn install", + "version": "printf 'export const version = \"%s\";\n' \"$(node -p \"require('./package.json').version\")\" > src/version.ts && git add ." }, "dependencies": { "@expo/vector-icons": "^13.0.0", @@ -32,15 +33,18 @@ "expo-auth-session": "~5.0.2", "expo-clipboard": "~4.3.1", "expo-constants": "^14.4.2", + "expo-dev-client": "~2.4.12", "expo-font": "~11.4.0", "expo-image": "~1.3.4", "expo-linking": "~5.0.2", "expo-screen-orientation": "~6.0.6", "expo-splash-screen": "~0.20.5", "expo-status-bar": "~1.6.0", + "lerna": "^7.4.2", "react": "18.2.0", "react-native": "0.72.6", "react-native-app-auth": "^7.1.0", + "react-native-fast-image": "^8.6.3", "react-native-gesture-handler": "~2.12.0", "react-native-reanimated": "~3.3.0", "react-native-reanimated-carousel": "^3.5.1", diff --git a/set-secrets.sh b/set-secrets.sh new file mode 100755 index 00000000..6cdcaa90 --- /dev/null +++ b/set-secrets.sh @@ -0,0 +1,2 @@ +eas secret:create --scope project --name EXPO_PUBLIC_TWITCH_CLIENT_ID --value --type string +eas secret:create --scope project --name EXPO_PUBLIC_TWITCH_CLIENT_SECRET --value --type string diff --git a/src/components/CategoryItem.tsx b/src/components/CategoryItem.tsx index 48ebf6d5..1bde3a28 100644 --- a/src/components/CategoryItem.tsx +++ b/src/components/CategoryItem.tsx @@ -1,27 +1,31 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import { Image, StyleSheet, Text, View } from 'react-native'; import { TouchableOpacity } from 'react-native-gesture-handler'; +import { Category } from '../services/twitchService'; import colors from '../styles/colors'; -export interface Category { - name: string; - source: string; +interface Props { + category: Category; } -interface Props extends Category {} - -const CategoryItem = ({ name, source }: Props) => { +const CategoryItem = ({ category }: Props) => { return ( - {/* @ts-expect-error */} - + - {name} + {category.name} - - - 51.9k - + ); }; diff --git a/src/components/CategoryList.tsx b/src/components/CategoryList.tsx index 57bb8f57..faea4681 100644 --- a/src/components/CategoryList.tsx +++ b/src/components/CategoryList.tsx @@ -1,32 +1,25 @@ -import { FlatList, StyleSheet } from 'react-native'; -import apex from '../../assets/data/category_apex.jpg'; -import csgo from '../../assets/data/category_csgo.jpg'; -import fallguys from '../../assets/data/category_fallguys.jpg'; -import fortnite from '../../assets/data/category_fortnite.jpg'; -import lol from '../../assets/data/category_lol.jpg'; -import valorant from '../../assets/data/category_valorant.jpg'; -import CategoryItem, { Category } from './CategoryItem'; +import { FlatList, KeyboardAvoidingView, StyleSheet, View } from 'react-native'; +import { Category } from '../services/twitchService'; +import CategoryItem from './CategoryItem'; -const data: Category[] = [ - { name: 'League of Legends', source: lol }, - { name: 'VALORANT', source: valorant }, - { name: 'Counter-Strike: Global Offensive', source: csgo }, - { name: 'Fortnite', source: fortnite }, - { name: 'Fall Guys', source: fallguys }, - { name: 'Apex Legends', source: apex }, -]; +interface Props { + categories: Category[]; +} -const CategoryList = () => { +const CategoryList = ({ categories }: Props) => { return ( - - style={styles.list} - numColumns={3} - data={data} - // eslint-disable-next-line no-shadow - renderItem={data => ( - - )} - /> + + + + style={styles.list} + numColumns={3} + data={categories} + // eslint-disable-next-line no-shadow + renderItem={data => } + keyExtractor={item => item.id} + /> + + ); }; @@ -39,7 +32,7 @@ const styles = StyleSheet.create({ paddingLeft: 0, paddingRight: 0, paddingTop: 24, - paddingBottom: 24, + paddingBottom: 32, }, }); diff --git a/src/components/StreamItem.tsx b/src/components/StreamItem.tsx new file mode 100644 index 00000000..1950b0d5 --- /dev/null +++ b/src/components/StreamItem.tsx @@ -0,0 +1,120 @@ +import { FlatList, Image, StyleSheet, Text, View } from 'react-native'; +import { Stream } from '../services/twitchService'; +import colors from '../styles/colors'; + +interface Props { + stream: Stream; +} + +const StreamItem = ({ stream }: Props) => { + return ( + + + + + + + + + + {stream.user_name} + + {stream.title} + {stream.game_name} + + + ( + + {item} + + )} + keyExtractor={item => item} + horizontal + /> + + + + ); +}; +export default StreamItem; + +export const styles = StyleSheet.create({ + channelBox: { + width: '100%', + flexDirection: 'row', + alignItems: 'center', + marginBottom: 20, + cursor: 'pointer', + zIndex: 2, + color: colors.gray, + }, + liveScreen: { + position: 'relative', + width: '35%', + minWidth: 150, + minHeight: 50, + backgroundColor: 'black', + borderRadius: 3, + overflow: 'hidden', + zIndex: -1, + color: colors.gray, + }, + + liveIcon: { + color: colors.red, + fontSize: 9, + }, + liveInfo: { + flex: 1, + paddingHorizontal: 10, + color: colors.gray, + }, + user: { + flexDirection: 'row', + color: colors.gray, + }, + userPp: { + width: 15, + height: 15, + borderRadius: 999, + overflow: 'hidden', + }, + userName: { + // paddingLeft: 5, + fontWeight: '600', + color: colors.gray, + }, + titleGame: { + fontSize: 14, + color: colors.gray, + }, + tagRow: { + marginTop: 17, + flexDirection: 'row', + height: 20, + }, + tag: { + backgroundColor: colors.tag, + paddingVertical: 2, + paddingHorizontal: 8, + borderRadius: 10, + marginRight: 10, + }, + tagText: { + color: colors.black, + fontSize: 13, + }, +}); diff --git a/src/components/StreamList.tsx b/src/components/StreamList.tsx index 20a1361d..c4514af0 100644 --- a/src/components/StreamList.tsx +++ b/src/components/StreamList.tsx @@ -1,14 +1,19 @@ -import { StyleSheet, View } from 'react-native'; +import { FlatList, StyleSheet, View } from 'react-native'; +import { Stream } from '../services/twitchService'; import StreamListItem from './StreamListItem'; -const StreamList = () => { +interface Props { + streams: Stream[]; +} + +const StreamList = ({ streams }: Props) => { return ( - - - - - + } + keyExtractor={item => item.id} + /> ); }; diff --git a/src/components/StreamListItem.tsx b/src/components/StreamListItem.tsx index c72f74fd..2652d7b9 100644 --- a/src/components/StreamListItem.tsx +++ b/src/components/StreamListItem.tsx @@ -1,30 +1,46 @@ -import { Image, StyleSheet, Text, View } from 'react-native'; +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { useEffect, useState } from 'react'; +import { FlatList, Image, StyleSheet, Text, View } from 'react-native'; +import FastImage from 'react-native-fast-image'; +import { useAuthContext } from '../context/AuthContext'; +import twitchService, { Stream, UserResponse } from '../services/twitchService'; import colors from '../styles/colors'; +import elapsedStreamTime from '../utils/elapsedStreamTime'; +import viewFormatter from '../utils/viewFormatter'; -const StreamListItem = () => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const tags = [ - 'gaming', - 'chatting', - 'english', - 'dutch', - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', - 'Evil', - 'Evil', - 'Unhygienic', - 'Unholy', - 'English', - 'Geriatric', - ]; +interface Props { + stream: Stream; +} + +const StreamListItem = ({ stream }: Props) => { + const { auth } = useAuthContext(); + const [userImage, setUserImage] = useState(); + + // const getUserProfilePictures = async () => { + // const res = await twitchService.getUser( + // stream.user_login, + // (auth?.anonToken as string) ?? (auth?.token?.accessToken as string), + // ); + + // setUsers(res); + // }; + + // useEffect(() => { + // getUserProfilePictures(); + // // eslint-disable-next-line react-hooks/exhaustive-deps + // }, [stream]); return ( @@ -32,27 +48,59 @@ const StreamListItem = () => { - username + {stream.user_name} - 🔥CLICK🔥LIVE🔥ASAP🔥DRAMA🔥JUICE🔥VIDEOS🔥REACT🔥GAMES🔥HIGH - IQ🔥WISDOM🔥GIVEN🔥FOR🔥FREE🔥FROM🔥JUICE WARLORD🔥POG + {stream.title} - Just Chatting + {stream.game_name} + + + + + {elapsedStreamTime(stream.started_at)} + + + + {viewFormatter(stream.viewer_count, 1)} viewers - - yo yo yo - - - hi - + ( + + {item} + + )} + keyExtractor={item => item} + horizontal + /> @@ -62,6 +110,12 @@ const StreamListItem = () => { export default StreamListItem; const styles = StyleSheet.create({ + viewCount: { + color: colors.gray, + marginTop: 4, + fontSize: 12, + marginBottom: 8, + }, streamContainer: { flexDirection: 'row', flex: 1, @@ -73,7 +127,7 @@ const styles = StyleSheet.create({ flex: 1, }, streamRow: { - height: 66, + // height: 66, justifyContent: 'space-between', }, streamHeader: { @@ -99,7 +153,7 @@ const styles = StyleSheet.create({ color: colors.gray, }, tagRow: { - marginTop: 8, + marginTop: 17, flexDirection: 'row', }, tag: { @@ -113,4 +167,9 @@ const styles = StyleSheet.create({ color: colors.black, fontSize: 13, }, + streamImage: { + width: 360, + height: 200, + borderRadius: 10, + }, }); diff --git a/src/components/Title.tsx b/src/components/Title.tsx index 860783ec..934f9fe2 100644 --- a/src/components/Title.tsx +++ b/src/components/Title.tsx @@ -4,10 +4,15 @@ import colors from '../styles/colors'; interface Props { children: ReactNode; + underline?: boolean; } -const Title = ({ children }: Props) => { - return {children}; +const Title = ({ children, underline }: Props) => { + return ( + + {children} + + ); }; export default Title; @@ -23,4 +28,9 @@ const styles = StyleSheet.create({ paddingLeft: 0, paddingRight: 0, }, + underline: { + textDecorationLine: 'underline', + textDecorationColor: colors.purple, + textDecorationStyle: 'double', + }, }); diff --git a/src/context/AuthContext.tsx b/src/context/AuthContext.tsx index b046324c..ebf2b333 100644 --- a/src/context/AuthContext.tsx +++ b/src/context/AuthContext.tsx @@ -1,33 +1,29 @@ -import { TokenResponse } from 'expo-auth-session'; +/* eslint-disable no-console */ +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { AuthSessionResult, TokenResponse } from 'expo-auth-session'; import React, { createContext, - Dispatch, ReactNode, - SetStateAction, useContext, + useEffect, useMemo, useState, } from 'react'; +import { twitchApi } from '../services/Client'; +import twitchService, { UserInfoResponse } from '../services/twitchService'; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -interface User { - authentication: { - accessToken: string; - expiresIn?: number; - idToken?: string; - issuedAt: number; - refreshToken?: string; - scope: string; - state: string; - tokenType: 'Bearer'; - }; - error: string | null; - errorCode: string | null; -} +const StorageKeys = { + anonToken: 'anonToken', + authToken: 'authToken', +} as const; + +type StorageKey = keyof typeof StorageKeys; interface AuthContextState { - token?: TokenResponse; - setToken: Dispatch>; + auth?: Auth; + user?: UserInfoResponse; + login: (response: AuthSessionResult | null) => Promise; + getToken: (key: StorageKey) => Promise; } export const AuthContext = createContext( @@ -38,30 +34,228 @@ interface Props { children?: ReactNode; } +interface Auth { + token?: TokenResponse; + anonToken?: string; + isAnonAuth?: boolean; + isAuth?: boolean; +} +interface State { + auth?: Auth; + ready: boolean; +} + export const AuthContextProvider = ({ children }: Props) => { - const [token, setToken] = useState(); + const [state, setState] = useState({ + ready: false, + }); + const [user, setUser] = useState(); + const [authToken, setAuthToken] = useState(); + const [anonToken, setAnonToken] = useState(); + + const isValidToken = async (token: string | null) => { + if (!token) { + return false; + } + return twitchService.validateToken(token); + }; + + useEffect(() => { + const getTokens = async () => { + // eslint-disable-next-line no-shadow + + // eslint-disable-next-line no-shadow + const [anonToken, authToken] = await Promise.all([ + await AsyncStorage.getItem(StorageKeys.anonToken), + await AsyncStorage.getItem(StorageKeys.authToken), + ]); + + if (!authToken && !isValidToken(authToken) && anonToken) { + setAnonToken(JSON.stringify(anonToken)); + setState({ + ready: true, + auth: { + anonToken, + isAnonAuth: true, + isAuth: false, + }, + }); + + twitchApi.defaults.headers.common.Authorization = `Bearer ${anonToken}`; + } + + if (authToken && (await isValidToken(authToken))) { + setAuthToken(authToken as unknown as TokenResponse); + setState({ + ready: true, + auth: { + token: authToken as unknown as TokenResponse, + isAnonAuth: false, + isAuth: true, + }, + }); + + const userInfo = await twitchService.getUserInfo(authToken); + + setUser(userInfo); + twitchApi.defaults.headers.common.Authorization = `Bearer ${authToken}`; + } + }; + + getTokens(); + }, [authToken, anonToken]); + + const getAnonToken = async () => { + const res = await twitchService.getDefaultToken(); + setState({ + ready: true, + auth: { + anonToken: res.access_token, + isAnonAuth: true, + isAuth: false, + }, + }); + + AsyncStorage.setItem(StorageKeys.anonToken, res.access_token); + twitchApi.defaults.headers.common.Authorization = `Bearer ${res.access_token}`; + }; - // eslint-disable-next-line no-shadow + const validateToken = async () => { + if (!state.auth?.token) { + return; + } + + const isValid = await twitchService.validateToken( + state.auth.token.accessToken, + ); + + if (!isValid) { + // token is invalid, remove it and get anon token + setState({ + ready: false, + auth: { + isAuth: false, + token: undefined, + }, + }); + getAnonToken(); + } + + // token needs to be refreshed as it has expired + if ( + state.auth.token && + (state.auth.token.expiresIn as number) < Date.now() + ) { + const refreshedToken = await twitchService.getRefreshToken( + state.auth.token.refreshToken as string, + ); + setState({ + ready: true, + auth: { + isAuth: true, + isAnonAuth: false, + token: refreshedToken, + }, + }); + console.log('refreshing token'); + setUser(await twitchService.getUserInfo(refreshedToken.accessToken)); + + AsyncStorage.setItem(StorageKeys.authToken, refreshedToken); + twitchApi.defaults.headers.common.Authorization = `Bearer ${state.auth.token.accessToken}`; + } + + // token is valid and not expired + setState({ + ready: true, + auth: { + isAuth: true, + isAnonAuth: false, + token: state.auth.token, + }, + }); + + setUser(await twitchService.getUserInfo(state.auth.token.accessToken)); + + AsyncStorage.setItem(StorageKeys.authToken, state.auth.token.accessToken); + setAuthToken(state.auth.token); + twitchApi.defaults.headers.common.Authorization = `Bearer ${state.auth.token.accessToken}`; + }; + + const getToken = async (key: StorageKey) => { + return AsyncStorage.getItem(key); + }; + + const login = async (response: AuthSessionResult | null) => { + console.log('[authcontext] login'); + if (response?.type !== 'success') { + return null; + } + + if (!response.authentication) { + return null; + } + + setState({ + ready: true, + auth: { + isAuth: true, + isAnonAuth: false, + token: response.authentication, + }, + }); + + setUser( + await twitchService.getUserInfo(response.authentication.accessToken), + ); + + twitchApi.defaults.headers.common.Authorization = `Bearer ${response.authentication.accessToken}`; + + AsyncStorage.setItem( + StorageKeys.authToken, + JSON.stringify(response.authentication), + ); + + return null; + }; + + useEffect(() => { + if (!state.auth?.token) { + console.info('no token, getting anon token'); + const runAnonToken = async () => { + await getAnonToken(); + }; + + runAnonToken(); + } else { + console.info('found token, validating'); + + const runValidateToken = async () => { + await validateToken(); + }; + runValidateToken(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore const contextState: AuthContextState = useMemo(() => { return { - setToken, - token, + auth: state.auth, + user, + login, + getToken, }; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [token]); + }, [state.auth, user]); - return ( + return state.ready ? ( {children} - ); + ) : null; }; export function useAuthContext() { const context = useContext(AuthContext); - if (context === undefined) { + if (!context) { throw new Error('useAuthContext must be used within a AuthContextProvider'); } diff --git a/src/hooks/useDebouncedCallback.ts b/src/hooks/useDebouncedCallback.ts new file mode 100644 index 00000000..723f0fac --- /dev/null +++ b/src/hooks/useDebouncedCallback.ts @@ -0,0 +1,58 @@ +import { useCallback, useEffect, useRef } from 'react'; +import useMountedRef from './useMountedRef'; + +export type UseDebouncedCallbackReturn = [ + (...args: Args) => Promise, + () => void, +]; + +/** + * Debounce a {@param callback} so that it will only run + * after a specified {@param timeout} has passed (in milliseconds). + * + * If the debounced callback is run again, it will reset the + * current timeout and start again with the new callback arguments. + */ +export default function useDebouncedCallback( + callback: (...args: Args) => void, + timeout = 0, +): UseDebouncedCallbackReturn { + const timeoutRef = useRef>(); + const callbackRef = useRef(callback); + const mountedRef = useMountedRef(); + + callbackRef.current = callback; + + const run = useCallback( + async (...args: Args) => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + + return new Promise(resolve => { + timeoutRef.current = setTimeout(() => { + if (mountedRef.current) { + callbackRef.current(...args); + timeoutRef.current = undefined; + } + resolve(); + }, timeout); + }); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [timeout], + ); + + const cancel = useCallback(() => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + timeoutRef.current = undefined; + } + }, []); + + useEffect(() => { + return cancel; + }, [cancel, run]); + + return [run, cancel]; +} diff --git a/src/hooks/useMountedRef.ts b/src/hooks/useMountedRef.ts new file mode 100644 index 00000000..bcc37b8c --- /dev/null +++ b/src/hooks/useMountedRef.ts @@ -0,0 +1,18 @@ +import { RefObject, useEffect, useRef } from 'react'; + +/** + * Returns a ref that can be used to determine if the + * component is currently mounted or not. + */ +export default function useMountedRef(): RefObject { + const isMountedRef = useRef(false); + + useEffect(() => { + isMountedRef.current = true; + + return () => { + isMountedRef.current = false; + }; + }); + return isMountedRef; +} diff --git a/src/navigation/Home/HomeTabsNavigator.tsx b/src/navigation/Home/HomeTabsNavigator.tsx index 1499b185..5ba3dacc 100644 --- a/src/navigation/Home/HomeTabsNavigator.tsx +++ b/src/navigation/Home/HomeTabsNavigator.tsx @@ -1,6 +1,7 @@ /* eslint-disable react/no-unstable-nested-components */ import { AntDesign, Feather } from '@expo/vector-icons'; // import BrowseScreen from '../../screens/BrowseScreen'; +import { useAuthContext } from '../../context/AuthContext'; import FollowingScreen from '../../screens/FollowingScreen'; import SearchScreen from '../../screens/SearchScreen'; import TopScreen from '../../screens/TopScreen'; @@ -12,6 +13,7 @@ const HomeTabsNavigator = ({ // eslint-disable-next-line @typescript-eslint/no-unused-vars navigation, }: RootStackScreenProps) => { + const { auth } = useAuthContext(); return ( - ( - - ), - }} - /> + {auth?.isAuth && ( + ( + + ), + }} + /> + )} + { name={RootRoutes.SettingsModal} component={SettingsModal} /> + {/* @ts-ignore */} ); diff --git a/src/screens/FollowingScreen.tsx b/src/screens/FollowingScreen.tsx index f247f9b4..ea3b2cc9 100644 --- a/src/screens/FollowingScreen.tsx +++ b/src/screens/FollowingScreen.tsx @@ -2,7 +2,7 @@ import { BottomTabScreenProps } from '@react-navigation/bottom-tabs'; import { CompositeScreenProps } from '@react-navigation/native'; import Constants from 'expo-constants'; -import { useMemo } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { FlatList, SafeAreaView, @@ -19,6 +19,7 @@ import { HomeTabsRoutes, HomeTabsScreenProps, } from '../navigation/Home/HomeTabs'; +import twitchService, { Stream } from '../services/twitchService'; import colors from '../styles/colors'; export interface Section { @@ -33,13 +34,30 @@ const FollowingScreen = ({ HomeTabsScreenProps, BottomTabScreenProps >) => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { token } = useAuthContext(); + const { user } = useAuthContext(); + const [streams, setStreams] = useState([]); + + const fetchFollowedStreams = async () => { + try { + console.log('user is', user); + console.log('user id', user?.id); + const res = await twitchService.getFollowedStreams(user?.id as string); + console.log(res); + setStreams(res.data); + } catch (e) { + console.error(e); + } + }; + + useEffect(() => { + fetchFollowedStreams(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); const { data, stickyHeaderIndicies } = useMemo(() => { // eslint-disable-next-line no-shadow const data: Section[] = [ - { key: 'C2', render: () => }, + { key: 'C2', render: () => }, // { // key: 'FOLLOWED_CATEGORIES', @@ -84,7 +102,7 @@ const FollowingScreen = ({ data, stickyHeaderIndicies, }; - }, []); + }, [streams]); return ( diff --git a/src/screens/SearchScreen.tsx b/src/screens/SearchScreen.tsx index a1da9115..ba8cf51a 100644 --- a/src/screens/SearchScreen.tsx +++ b/src/screens/SearchScreen.tsx @@ -1,11 +1,11 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import { Feather, Entypo } from '@expo/vector-icons'; import { BottomTabScreenProps } from '@react-navigation/bottom-tabs'; -import { useHeaderHeight } from '@react-navigation/elements'; import { CompositeScreenProps } from '@react-navigation/native'; +import { useState } from 'react'; import { FlatList, - KeyboardAvoidingView, + Image, SafeAreaView, ScrollView, StyleSheet, @@ -15,12 +15,18 @@ import { } from 'react-native'; import DismissableKeyboard from '../components/DismissableKeyboard'; import Header from '../components/Header'; +import Title from '../components/Title'; +import useDebouncedCallback from '../hooks/useDebouncedCallback'; import { HomeTabsParamList, HomeTabsRoutes, HomeTabsScreenProps, } from '../navigation/Home/HomeTabs'; +import twitchService, { + SearchChannelResponse, +} from '../services/twitchService'; import colors from '../styles/colors'; +import elapsedStreamTime from '../utils/elapsedStreamTime'; import { statusBarHeight } from './FollowingScreen'; const SearchScreen = ({ @@ -29,6 +35,10 @@ const SearchScreen = ({ HomeTabsScreenProps, BottomTabScreenProps >) => { + const [searchResults, setSearchResults] = useState( + [], + ); + const previousSearches = [ 'psp1g', 'poke', @@ -38,7 +48,21 @@ const SearchScreen = ({ 'nadia', ] as const; - const height = useHeaderHeight(); + const [search] = useDebouncedCallback(async (value: string) => { + if (value.length < 2) { + setSearchResults([]); + // eslint-disable-next-line no-useless-return + return; + } + + const results = await twitchService.searchChannels(value); + + setSearchResults(results); + + console.log('---------------------------------'); + console.log('results.data is:', results); + console.log('---------------------------------'); + }, 400); return ( @@ -54,38 +78,87 @@ const SearchScreen = ({ style={{ marginLeft: 16, alignSelf: 'center' }} /> - - + + search(text.toLowerCase())} /> - - + + - - - data={previousSearches} + + Channels + ( - - + - {item} + + {item.display_name} + + {/* drop onto next line */} + {item.is_live && ( + + + + {elapsedStreamTime(item.started_at)} + + + )} )} - keyExtractor={item => item} /> + {!searchResults.length && ( + + + data={previousSearches} + renderItem={({ item }) => ( + + + {item} + + )} + keyExtractor={item => item} + /> + + )} ); }; @@ -97,12 +170,14 @@ const styles = StyleSheet.create({ }, input: { borderRadius: 4, - borderWidth: 1, borderColor: colors.gray, - padding: 4, width: '90%', alignSelf: 'center', color: colors.gray, + height: 40, + margin: 12, + borderWidth: 1, + padding: 10, }, wrapper: { backgroundColor: colors.primary, diff --git a/src/screens/TopScreen.tsx b/src/screens/TopScreen.tsx index 0a88212f..a96950fe 100644 --- a/src/screens/TopScreen.tsx +++ b/src/screens/TopScreen.tsx @@ -1,15 +1,27 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import { BottomTabScreenProps } from '@react-navigation/bottom-tabs'; import { CompositeScreenProps } from '@react-navigation/native'; -import { SafeAreaView, StyleSheet, View } from 'react-native'; +import { useEffect, useState } from 'react'; +import { + FlatList, + SafeAreaView, + StyleSheet, + TouchableOpacity, + View, +} from 'react-native'; import CategoryList from '../components/CategoryList'; import Header from '../components/Header'; +import StreamListItem from '../components/StreamListItem'; +import Title from '../components/Title'; +import { useAuthContext } from '../context/AuthContext'; import { HomeTabsParamList, HomeTabsRoutes, HomeTabsScreenProps, } from '../navigation/Home/HomeTabs'; +import twitchService, { Category, Stream } from '../services/twitchService'; import colors from '../styles/colors'; +import getTokens from '../utils/getTokens'; import { statusBarHeight } from './FollowingScreen'; const TopScreen = ({ @@ -18,14 +30,85 @@ const TopScreen = ({ HomeTabsScreenProps, BottomTabScreenProps >) => { + const [streams, setStreams] = useState([]); + const [categories, setCategories] = useState([]); + const [showStreams, setShowStreams] = useState(true); + const [showCategories, setShowCategories] = useState(false); + const { auth } = useAuthContext(); + + const fetchTopStreams = async () => { + const { anonToken, token } = await getTokens(); + if (auth?.isAuth) { + const res = await twitchService.getTopStreams(undefined, token as string); + setStreams(res); + } else { + const res = await twitchService.getTopStreams( + undefined, + anonToken as string, + ); + setStreams(res); + } + }; + + const fetchTopCategories = async () => { + const { anonToken, token } = await getTokens(); + + if (auth?.isAuth) { + const res = await twitchService.getTopCategories(token as string); + setCategories(res); + } else { + const res = await twitchService.getTopCategories(anonToken as string); + setCategories(res); + } + }; + + useEffect(() => { + fetchTopStreams(); + fetchTopCategories(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + return ( {/* @ts-ignore */}
- - + + { + setShowStreams(true); + setShowCategories(false); + }} + > + Streams + + { + setShowCategories(true); + setShowStreams(false); + }} + > + Categories + + {showStreams && ( + + + data={streams} + renderItem={({ item }) => } + keyExtractor={item => item.id} + /> + {/* {streams && + streams.map(stream => ( + + ))} */} + + )} + {showCategories && ( + + + + )} ); @@ -33,6 +116,11 @@ const TopScreen = ({ export default TopScreen; const styles = StyleSheet.create({ + nav: { + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-evenly', + }, wrapper: { backgroundColor: colors.primary, flex: 1, diff --git a/src/screens/authentication/LoginScreen.tsx b/src/screens/authentication/LoginScreen.tsx index 5ebd9d09..c34af08b 100644 --- a/src/screens/authentication/LoginScreen.tsx +++ b/src/screens/authentication/LoginScreen.tsx @@ -1,25 +1,34 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable no-console */ +import { BottomTabScreenProps } from '@react-navigation/bottom-tabs'; +import { CompositeScreenProps } from '@react-navigation/native'; import { makeRedirectUri, useAuthRequest } from 'expo-auth-session'; import * as WebBrowser from 'expo-web-browser'; import { useEffect, useState } from 'react'; -import { View, Button, Text } from 'react-native'; +import { View, Button } from 'react-native'; import { useAuthContext } from '../../context/AuthContext'; -import { RootRoutes, RootStackScreenProps } from '../../navigation/RootStack'; -import twitchService from '../../services/twitchService'; +import { + HomeTabs, + HomeTabsParamList, + HomeTabsRoutes, + HomeTabsScreenProps, +} from '../../navigation/Home/HomeTabs'; WebBrowser.maybeCompleteAuthSession(); const LoginScreen = ({ navigation, -}: RootStackScreenProps) => { - const { setToken, token } = useAuthContext(); - const [valid, setValid] = useState(token?.accessToken ?? false); +}: CompositeScreenProps< + HomeTabsScreenProps, + BottomTabScreenProps +>) => { + const { login } = useAuthContext(); const discovery = { authorizationEndpoint: 'https://id.twitch.tv/oauth2/authorize', tokenEndpoint: 'https://id.twitch.tv/oauth2/token', revocationEndpoint: 'https://id.twitch.tv/oauth2/revoke', - }; + } as const; const [request, response, promptAsync] = useAuthRequest( { @@ -33,7 +42,7 @@ const LoginScreen = ({ extraParams: { // @ts-expect-error - Twitch requires force_verify to be a boolean whereas // the types are Record - force_verify: false, + force_verify: true, }, }, discovery, @@ -41,42 +50,22 @@ const LoginScreen = ({ useEffect(() => { if (response?.type === 'success') { - if (!response.authentication) { - console.log('no authentication'); - return; - } + login(response); - console.log(response); - setToken(response.authentication); - navigation.navigate(RootRoutes.Home); + navigation.navigate(HomeTabsRoutes.Top); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [response]); return ( - {!token?.accessToken && ( -