diff --git a/.cspell.json b/.cspell.json index 2d252ec5b..e3d1426b9 100644 --- a/.cspell.json +++ b/.cspell.json @@ -20,7 +20,13 @@ "cloudinary", "clsx", "clsxm", + "opentelemetry", + "otlp", "commitlint", + "greenkeeper", + "classpath", + "tsbuildinfo", + "sentryclirc", "compodoc", "consectetur", "dolor", diff --git a/.deploy/k8s/k8s-manifest.dev.yaml b/.deploy/k8s/k8s-manifest.dev.yaml new file mode 100644 index 000000000..f7416b2ec --- /dev/null +++ b/.deploy/k8s/k8s-manifest.dev.yaml @@ -0,0 +1,110 @@ +--- +kind: Service +apiVersion: v1 +metadata: + name: ever-teams-dev-lb + annotations: + service.beta.kubernetes.io/do-loadbalancer-name: 'demo.ever.team' + service.beta.kubernetes.io/do-loadbalancer-protocol: 'http2' + service.beta.kubernetes.io/do-loadbalancer-http2-ports: '443' + # Replace with your Certificate Id. You can get a list of Ids with 'doctl compute certificate list' + service.beta.kubernetes.io/do-loadbalancer-certificate-id: '0c4085c5-9692-4320-86f3-34f52b775a88' + service.beta.kubernetes.io/do-loadbalancer-size-slug: 'lb-small' + service.beta.kubernetes.io/do-loadbalancer-hostname: 'demo.ever.team' +spec: + type: LoadBalancer + selector: + app: ever-teams-dev-webapp + ports: + - name: http + protocol: TCP + port: 443 + targetPort: 3000 + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ever-teams-dev-webapp +spec: + replicas: 1 + selector: + matchLabels: + app: ever-teams-dev-webapp + template: + metadata: + labels: + app: ever-teams-dev-webapp + spec: + containers: + - name: ever-teams-dev-webapp + image: registry.digitalocean.com/ever/ever-teams-webapp-dev:latest + env: + - name: DEMO + value: 'true' + - name: NEXT_PUBLIC_SENTRY_DNS + value: '$NEXT_PUBLIC_SENTRY_DNS' + - name: SENTRY_DSN + value: '$SENTRY_DSN' + - name: NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY + value: '$NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY' + - name: NEXT_PUBLIC_JITSU_BROWSER_URL + value: '$NEXT_PUBLIC_JITSU_BROWSER_URL' + - name: SENTRY_AUTH_TOKEN + value: '$SENTRY_AUTH_TOKEN' + - name: NEXT_PUBLIC_CHATWOOT_API_KEY + value: '$NEXT_PUBLIC_CHATWOOT_API_KEY' + - name: NEXT_PUBLIC_SENTRY_DEBUG + value: '$NEXT_PUBLIC_SENTRY_DEBUG' + - name: SENTRY_PROJECT + value: '$SENTRY_PROJECT' + - name: SENTRY_ORG + value: '$SENTRY_ORG' + - name: SMTP_FROM_ADDRESS + value: '$SMTP_FROM_ADDRESS' + - name: JITSU_SERVER_WRITE_KEY + value: '$JITSU_SERVER_WRITE_KEY' + - name: JITSU_SERVER_URL + value: '$JITSU_SERVER_URL' + - name: NEXT_PUBLIC_COOKIE_DOMAINS + value: '$NEXT_PUBLIC_COOKIE_DOMAINS' + - name: NEXT_PUBLIC_BOARD_FIREBASE_CONFIG + value: '$NEXT_PUBLIC_BOARD_FIREBASE_CONFIG' + - name: NEXT_PUBLIC_BOARD_BACKEND_POST_URL + value: '$NEXT_PUBLIC_BOARD_BACKEND_POST_URL' + - name: NEXT_PUBLIC_BOARD_APP_DOMAIN + value: '$NEXT_PUBLIC_BOARD_APP_DOMAIN' + - name: MEET_JWT_APP_SECRET + value: '$MEET_JWT_APP_SECRET' + - name: MEET_JWT_APP_ID + value: '$MEET_JWT_APP_ID' + - name: NEXT_PUBLIC_MEET_DOMAIN + value: '$NEXT_PUBLIC_MEET_DOMAIN' + - name: GAUZY_API_SERVER_URL + value: '$GAUZY_API_SERVER_URL' + - name: NEXT_PUBLIC_GAUZY_API_SERVER_URL + value: '$NEXT_PUBLIC_GAUZY_API_SERVER_URL' + - name: MAILCHIMP_LIST_ID + value: '$MAILCHIMP_LIST_ID' + - name: MAILCHIMP_API_KEY + value: '$MAILCHIMP_API_KEY' + - name: POSTMARK_SERVER_API_TOKEN + value: '$POSTMARK_SERVER_API_TOKEN' + - name: NEXT_PUBLIC_GA_MEASUREMENT_ID + value: '$NEXT_PUBLIC_GA_MEASUREMENT_ID' + - name: SMTP_HOST + value: '$SMTP_HOST' + - name: SMTP_SECURE + value: '$SMTP_SECURE' + - name: SMTP_USERNAME + value: '$SMTP_USERNAME' + - name: SMTP_PASSWORD + value: '$SMTP_PASSWORD' + - name: CAPTCHA_SECRET_KEY + value: '$CAPTCHA_SECRET_KEY' + - name: NEXT_PUBLIC_CAPTCHA_SITE_KEY + value: '$NEXT_PUBLIC_CAPTCHA_SITE_KEY' + + ports: + - containerPort: 3000 + protocol: TCP diff --git a/.deploy/k8s/k8s-manifest.prod.yaml b/.deploy/k8s/k8s-manifest.prod.yaml new file mode 100644 index 000000000..ef23a5e55 --- /dev/null +++ b/.deploy/k8s/k8s-manifest.prod.yaml @@ -0,0 +1,110 @@ +--- +kind: Service +apiVersion: v1 +metadata: + name: ever-teams-prod-lb + annotations: + service.beta.kubernetes.io/do-loadbalancer-name: 'app.ever.team' + service.beta.kubernetes.io/do-loadbalancer-protocol: 'http2' + service.beta.kubernetes.io/do-loadbalancer-http2-ports: '443' + # Replace with your Certificate Id. You can get a list of Ids with 'doctl compute certificate list' + service.beta.kubernetes.io/do-loadbalancer-certificate-id: '0c4085c5-9692-4320-86f3-34f52b775a88' + service.beta.kubernetes.io/do-loadbalancer-size-slug: 'lb-small' + service.beta.kubernetes.io/do-loadbalancer-hostname: 'app.ever.team' +spec: + type: LoadBalancer + selector: + app: ever-teams-prod-webapp + ports: + - name: http + protocol: TCP + port: 443 + targetPort: 3000 + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ever-teams-prod-webapp +spec: + replicas: 8 + selector: + matchLabels: + app: ever-teams-prod-webapp + template: + metadata: + labels: + app: ever-teams-prod-webapp + spec: + containers: + - name: ever-teams-prod-webapp + image: registry.digitalocean.com/ever/ever-teams-webapp:latest + env: + - name: DEMO + value: 'true' + - name: NEXT_PUBLIC_SENTRY_DNS + value: '$NEXT_PUBLIC_SENTRY_DNS' + - name: SENTRY_DSN + value: '$SENTRY_DSN' + - name: NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY + value: '$NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY' + - name: NEXT_PUBLIC_JITSU_BROWSER_URL + value: '$NEXT_PUBLIC_JITSU_BROWSER_URL' + - name: SENTRY_AUTH_TOKEN + value: '$SENTRY_AUTH_TOKEN' + - name: NEXT_PUBLIC_CHATWOOT_API_KEY + value: '$NEXT_PUBLIC_CHATWOOT_API_KEY' + - name: NEXT_PUBLIC_SENTRY_DEBUG + value: '$NEXT_PUBLIC_SENTRY_DEBUG' + - name: SENTRY_PROJECT + value: '$SENTRY_PROJECT' + - name: SENTRY_ORG + value: '$SENTRY_ORG' + - name: SMTP_FROM_ADDRESS + value: '$SMTP_FROM_ADDRESS' + - name: JITSU_SERVER_WRITE_KEY + value: '$JITSU_SERVER_WRITE_KEY' + - name: JITSU_SERVER_URL + value: '$JITSU_SERVER_URL' + - name: NEXT_PUBLIC_COOKIE_DOMAINS + value: '$NEXT_PUBLIC_COOKIE_DOMAINS' + - name: NEXT_PUBLIC_BOARD_FIREBASE_CONFIG + value: '$NEXT_PUBLIC_BOARD_FIREBASE_CONFIG' + - name: NEXT_PUBLIC_BOARD_BACKEND_POST_URL + value: '$NEXT_PUBLIC_BOARD_BACKEND_POST_URL' + - name: NEXT_PUBLIC_BOARD_APP_DOMAIN + value: '$NEXT_PUBLIC_BOARD_APP_DOMAIN' + - name: MEET_JWT_APP_SECRET + value: '$MEET_JWT_APP_SECRET' + - name: MEET_JWT_APP_ID + value: '$MEET_JWT_APP_ID' + - name: NEXT_PUBLIC_MEET_DOMAIN + value: '$NEXT_PUBLIC_MEET_DOMAIN' + - name: GAUZY_API_SERVER_URL + value: '$GAUZY_API_SERVER_URL' + - name: NEXT_PUBLIC_GAUZY_API_SERVER_URL + value: '$NEXT_PUBLIC_GAUZY_API_SERVER_URL' + - name: MAILCHIMP_LIST_ID + value: '$MAILCHIMP_LIST_ID' + - name: MAILCHIMP_API_KEY + value: '$MAILCHIMP_API_KEY' + - name: POSTMARK_SERVER_API_TOKEN + value: '$POSTMARK_SERVER_API_TOKEN' + - name: NEXT_PUBLIC_GA_MEASUREMENT_ID + value: '$NEXT_PUBLIC_GA_MEASUREMENT_ID' + - name: SMTP_HOST + value: '$SMTP_HOST' + - name: SMTP_SECURE + value: '$SMTP_SECURE' + - name: SMTP_USERNAME + value: '$SMTP_USERNAME' + - name: SMTP_PASSWORD + value: '$SMTP_PASSWORD' + - name: CAPTCHA_SECRET_KEY + value: '$CAPTCHA_SECRET_KEY' + - name: NEXT_PUBLIC_CAPTCHA_SITE_KEY + value: '$NEXT_PUBLIC_CAPTCHA_SITE_KEY' + + ports: + - containerPort: 3000 + protocol: TCP diff --git a/.dockerignore b/.dockerignore index d41865422..269196e49 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,20 +17,26 @@ Jenkinsfile **/.next **/build -**/node_modules/* **/dist **/out **/*.log **/.vscode + +**/.env **/.env.local **/.env*.local +**/.env*.sample +apps/**/.env +apps/**/.env.local +apps/**/.env*.local +apps/**/.env*.sample fly.toml node_modules - +**/node_modules/* apps/mobile/node_modules apps/desktop/node_modules apps/extensions/node_modules diff --git a/.github/workflows/deploy-do-dev.yml b/.github/workflows/deploy-do-dev.yml new file mode 100644 index 000000000..018805ecd --- /dev/null +++ b/.github/workflows/deploy-do-dev.yml @@ -0,0 +1,73 @@ +name: Deploy to DigitalOcean Dev + +on: + workflow_run: + workflows: ['Build and Publish Docker Images Dev'] + branches: [develop] + types: + - completed + +jobs: + deploy-demo: + runs-on: ubuntu-latest + + environment: dev + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install doctl + uses: digitalocean/action-doctl@v2 + with: + token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} + + - name: Log in to DigitalOcean Container Registry with short-lived credentials + run: doctl registry login --expiry-seconds 600 + + - name: Save DigitalOcean kubeconfig with short-lived credentials + run: doctl kubernetes cluster kubeconfig save --expiry-seconds 600 k8s-gauzy + + - name: Apply k8s manifests changes in DigitalOcean k8s cluster (if any) + run: | + envsubst < $GITHUB_WORKSPACE/.deploy/k8s/k8s-manifest.dev.yaml | kubectl --context do-sfo2-k8s-gauzy apply -f - + env: + # below we are using GitHub secrets for both frontend and backend + CLOUD_PROVIDER: 'DO' + NEXT_PUBLIC_SENTRY_DNS: '${{ secrets.NEXT_PUBLIC_SENTRY_DNS }}' + SENTRY_DSN: '${{ secrets.SENTRY_DSN }}' + NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY: '${{ secrets.NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY }}' + NEXT_PUBLIC_JITSU_BROWSER_URL: '${{ secrets.NEXT_PUBLIC_JITSU_BROWSER_URL }}' + SENTRY_AUTH_TOKEN: '${{ secrets.SENTRY_AUTH_TOKEN }}' + NEXT_PUBLIC_CHATWOOT_API_KEY: '${{ secrets.NEXT_PUBLIC_CHATWOOT_API_KEY }}' + NEXT_PUBLIC_SENTRY_DEBUG: '${{ secrets.NEXT_PUBLIC_SENTRY_DEBUG }}' + SENTRY_PROJECT: '${{ secrets.SENTRY_PROJECT }}' + SENTRY_ORG: '${{ secrets.SENTRY_ORG }}' + SMTP_FROM_ADDRESS: '${{ secrets.SMTP_FROM_ADDRESS }}' + JITSU_SERVER_WRITE_KEY: '${{ secrets.JITSU_SERVER_WRITE_KEY }}' + JITSU_SERVER_URL: '${{ secrets.JITSU_SERVER_URL }}' + NEXT_PUBLIC_COOKIE_DOMAINS: '${{ secrets.NEXT_PUBLIC_COOKIE_DOMAINS }}' + NEXT_PUBLIC_BOARD_FIREBASE_CONFIG: '${{ secrets.NEXT_PUBLIC_BOARD_FIREBASE_CONFIG }}' + NEXT_PUBLIC_BOARD_BACKEND_POST_URL: '${{ secrets.NEXT_PUBLIC_BOARD_BACKEND_POST_URL }}' + NEXT_PUBLIC_BOARD_APP_DOMAIN: '${{ secrets.NEXT_PUBLIC_BOARD_APP_DOMAIN }}' + MEET_JWT_APP_SECRET: '${{ secrets.MEET_JWT_APP_SECRET }}' + MEET_JWT_APP_ID: '${{ secrets.MEET_JWT_APP_ID }}' + NEXT_PUBLIC_MEET_DOMAIN: '${{ secrets.NEXT_PUBLIC_MEET_DOMAIN }}' + GAUZY_API_SERVER_URL: '${{ secrets.GAUZY_API_SERVER_URL }}' + NEXT_PUBLIC_GAUZY_API_SERVER_URL: '${{ secrets.NEXT_PUBLIC_GAUZY_API_SERVER_URL }}' + MAILCHIMP_LIST_ID: '${{ secrets.MAILCHIMP_LIST_ID }}' + MAILCHIMP_API_KEY: '${{ secrets.MAILCHIMP_API_KEY }}' + POSTMARK_SERVER_API_TOKEN: '${{ secrets.POSTMARK_SERVER_API_TOKEN }}' + NEXT_PUBLIC_GA_MEASUREMENT_ID: '${{ secrets.NEXT_PUBLIC_GA_MEASUREMENT_ID }}' + SMTP_HOST: '${{ secrets.SMTP_HOST }}' + SMTP_SECURE: '${{ secrets.SMTP_SECURE }}' + SMTP_USERNAME: '${{ secrets.SMTP_USERNAME }}' + SMTP_PASSWORD: '${{ secrets.SMTP_PASSWORD }}' + CAPTCHA_SECRET_KEY: '${{ secrets.CAPTCHA_SECRET_KEY }}' + NEXT_PUBLIC_CAPTCHA_SITE_KEY: '${{ secrets.NEXT_PUBLIC_CAPTCHA_SITE_KEY }}' + + # we need this step because for now we just use :latest tag + # note: for production we will use different strategy later + - name: Restart Pods to pick up :latest tag version + run: | + kubectl --context do-sfo2-k8s-gauzy rollout restart deployment/ever-teams-dev-webapp diff --git a/.github/workflows/deploy-do-prod.yml b/.github/workflows/deploy-do-prod.yml new file mode 100644 index 000000000..f84988474 --- /dev/null +++ b/.github/workflows/deploy-do-prod.yml @@ -0,0 +1,73 @@ +name: Deploy to DigitalOcean Prod + +on: + workflow_run: + workflows: ['Build and Publish Docker Images Prod'] + branches: [main] + types: + - completed + +jobs: + deploy-demo: + runs-on: ubuntu-latest + + environment: prod + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install doctl + uses: digitalocean/action-doctl@v2 + with: + token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} + + - name: Log in to DigitalOcean Container Registry with short-lived credentials + run: doctl registry login --expiry-seconds 600 + + - name: Save DigitalOcean kubeconfig with short-lived credentials + run: doctl kubernetes cluster kubeconfig save --expiry-seconds 600 k8s-gauzy + + - name: Apply k8s manifests changes in DigitalOcean k8s cluster (if any) + run: | + envsubst < $GITHUB_WORKSPACE/.deploy/k8s/k8s-manifest.prod.yaml | kubectl --context do-sfo2-k8s-gauzy apply -f - + env: + # below we are using GitHub secrets for both frontend and backend + CLOUD_PROVIDER: 'DO' + NEXT_PUBLIC_SENTRY_DNS: '${{ secrets.NEXT_PUBLIC_SENTRY_DNS }}' + SENTRY_DSN: '${{ secrets.SENTRY_DSN }}' + NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY: '${{ secrets.NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY }}' + NEXT_PUBLIC_JITSU_BROWSER_URL: '${{ secrets.NEXT_PUBLIC_JITSU_BROWSER_URL }}' + SENTRY_AUTH_TOKEN: '${{ secrets.SENTRY_AUTH_TOKEN }}' + NEXT_PUBLIC_CHATWOOT_API_KEY: '${{ secrets.NEXT_PUBLIC_CHATWOOT_API_KEY }}' + NEXT_PUBLIC_SENTRY_DEBUG: '${{ secrets.NEXT_PUBLIC_SENTRY_DEBUG }}' + SENTRY_PROJECT: '${{ secrets.SENTRY_PROJECT }}' + SENTRY_ORG: '${{ secrets.SENTRY_ORG }}' + SMTP_FROM_ADDRESS: '${{ secrets.SMTP_FROM_ADDRESS }}' + JITSU_SERVER_WRITE_KEY: '${{ secrets.JITSU_SERVER_WRITE_KEY }}' + JITSU_SERVER_URL: '${{ secrets.JITSU_SERVER_URL }}' + NEXT_PUBLIC_COOKIE_DOMAINS: '${{ secrets.NEXT_PUBLIC_COOKIE_DOMAINS }}' + NEXT_PUBLIC_BOARD_FIREBASE_CONFIG: '${{ secrets.NEXT_PUBLIC_BOARD_FIREBASE_CONFIG }}' + NEXT_PUBLIC_BOARD_BACKEND_POST_URL: '${{ secrets.NEXT_PUBLIC_BOARD_BACKEND_POST_URL }}' + NEXT_PUBLIC_BOARD_APP_DOMAIN: '${{ secrets.NEXT_PUBLIC_BOARD_APP_DOMAIN }}' + MEET_JWT_APP_SECRET: '${{ secrets.MEET_JWT_APP_SECRET }}' + MEET_JWT_APP_ID: '${{ secrets.MEET_JWT_APP_ID }}' + NEXT_PUBLIC_MEET_DOMAIN: '${{ secrets.NEXT_PUBLIC_MEET_DOMAIN }}' + GAUZY_API_SERVER_URL: '${{ secrets.GAUZY_API_SERVER_URL }}' + NEXT_PUBLIC_GAUZY_API_SERVER_URL: '${{ secrets.NEXT_PUBLIC_GAUZY_API_SERVER_URL }}' + MAILCHIMP_LIST_ID: '${{ secrets.MAILCHIMP_LIST_ID }}' + MAILCHIMP_API_KEY: '${{ secrets.MAILCHIMP_API_KEY }}' + POSTMARK_SERVER_API_TOKEN: '${{ secrets.POSTMARK_SERVER_API_TOKEN }}' + NEXT_PUBLIC_GA_MEASUREMENT_ID: '${{ secrets.NEXT_PUBLIC_GA_MEASUREMENT_ID }}' + SMTP_HOST: '${{ secrets.SMTP_HOST }}' + SMTP_SECURE: '${{ secrets.SMTP_SECURE }}' + SMTP_USERNAME: '${{ secrets.SMTP_USERNAME }}' + SMTP_PASSWORD: '${{ secrets.SMTP_PASSWORD }}' + CAPTCHA_SECRET_KEY: '${{ secrets.CAPTCHA_SECRET_KEY }}' + NEXT_PUBLIC_CAPTCHA_SITE_KEY: '${{ secrets.NEXT_PUBLIC_CAPTCHA_SITE_KEY }}' + + # we need this step because for now we just use :latest tag + # note: for production we will use different strategy later + - name: Restart Pods to pick up :latest tag version + run: | + kubectl --context do-sfo2-k8s-gauzy rollout restart deployment/ever-teams-prod-webapp diff --git a/.github/workflows/deploy-render-dev.yml b/.github/workflows/deploy-render-dev.yml new file mode 100644 index 000000000..49f0c0dcb --- /dev/null +++ b/.github/workflows/deploy-render-dev.yml @@ -0,0 +1,41 @@ +name: Deploy to Render Dev + +on: + workflow_run: + workflows: ['Build and Publish Docker Images Dev'] + branches: [render] + types: + - completed + +jobs: + deploy-demo: + runs-on: ubuntu-latest + + environment: dev + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Render CLI + run: | + wget -O render https://github.com/render-oss/render-cli/releases/download/v0.1.8/render-linux-x86_64 + chmod +x render + sudo mv render /usr/local/bin/render + mkdir ~/.render + cat << EOF > ~/.render/config.yaml + version: 1 + sshPreserveHosts: true + profiles: + default: + defaultRegion: oregon + apiKey: ${{ secrets.RENDER_API_KEY }} + demo: + defaultRegion: oregon + apiKey: ${{ secrets.RENDER_API_KEY }} + EOF + + - name: Deploy Services + run: | + cp .render/render.dev.yaml ./render.yaml + render blueprint launch --profile dev diff --git a/.github/workflows/web.dev.yml b/.github/workflows/deploy-vercel-dev.yml similarity index 97% rename from .github/workflows/web.dev.yml rename to .github/workflows/deploy-vercel-dev.yml index 708d06e31..2fee9532f 100644 --- a/.github/workflows/web.dev.yml +++ b/.github/workflows/deploy-vercel-dev.yml @@ -1,4 +1,4 @@ -name: Web Build & Deploy DEV +name: Web Build & Vercel Deploy DEV on: push: branches: diff --git a/.github/workflows/web.prod.yml b/.github/workflows/deploy-vercel-prod.yml similarity index 96% rename from .github/workflows/web.prod.yml rename to .github/workflows/deploy-vercel-prod.yml index e96756ccd..f6b2d4482 100644 --- a/.github/workflows/web.prod.yml +++ b/.github/workflows/deploy-vercel-prod.yml @@ -1,4 +1,4 @@ -name: Web Build & Deploy PROD +name: Web Build & Vercel Deploy PROD on: push: branches: diff --git a/.github/workflows/docker-build-publish-dev.yml b/.github/workflows/docker-build-publish-dev.yml new file mode 100644 index 000000000..574fe4cc7 --- /dev/null +++ b/.github/workflows/docker-build-publish-dev.yml @@ -0,0 +1,103 @@ +name: Build and Publish Docker Images Dev + +on: + push: + branches: [develop] + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + ever-teams-webapp: + runs-on: buildjet-8vcpu-ubuntu-2204 + + environment: dev + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Output NEXT_PUBLIC_GAUZY_API_SERVER_URL + run: echo "NEXT_PUBLIC_GAUZY_API_SERVER_URL=${{ secrets.NEXT_PUBLIC_GAUZY_API_SERVER_URL }}" + + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + file: ./Dockerfile + load: true + tags: | + ghcr.io/ever-co/ever-teams-webapp-dev:latest + everco/ever-teams-webapp-dev:latest + registry.digitalocean.com/ever/ever-teams-webapp-dev:latest + ${{ secrets.CW_DOCKER_REGISTRY }}/ever-co/ever-teams-webapp-dev:latest + cache-from: type=registry,ref=everco/ever-teams-webapp-dev:latest + cache-to: type=inline + build-args: | + NODE_ENV=development + NEXT_PUBLIC_GAUZY_API_SERVER_URL=${{ secrets.NEXT_PUBLIC_GAUZY_API_SERVER_URL }} + NEXT_PUBLIC_GA_MEASUREMENT_ID=${{ secrets.NEXT_PUBLIC_GA_MEASUREMENT_ID }} + NEXT_PUBLIC_CAPTCHA_SITE_KEY=${{ secrets.NEXT_PUBLIC_CAPTCHA_SITE_KEY }} + NEXT_PUBLIC_DISABLE_AUTO_REFRESH=false + NEXT_PUBLIC_COOKIE_DOMAINS=${{ secrets.NEXT_PUBLIC_COOKIE_DOMAINS }} + NEXT_PUBLIC_BOARD_APP_DOMAIN=${{ secrets.NEXT_PUBLIC_BOARD_APP_DOMAIN }} + NEXT_PUBLIC_BOARD_BACKEND_POST_URL=${{ secrets.NEXT_PUBLIC_BOARD_BACKEND_POST_URL }} + NEXT_PUBLIC_BOARD_FIREBASE_CONFIG=${{ secrets.NEXT_PUBLIC_BOARD_FIREBASE_CONFIG }} + NEXT_PUBLIC_MEET_DOMAIN=${{ secrets.NEXT_PUBLIC_MEET_DOMAIN }} + NEXT_PUBLIC_SENTRY_DSN=${{ secrets.NEXT_PUBLIC_SENTRY_DSN }} + NEXT_PUBLIC_SENTRY_DEBUG=${{ secrets.NEXT_PUBLIC_SENTRY_DEBUG }} + NEXT_PUBLIC_JITSU_BROWSER_URL=${{ secrets.NEXT_PUBLIC_JITSU_BROWSER_URL }} + NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY=${{ secrets.NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY }} + NEXT_PUBLIC_GITHUB_APP_NAME=ever-github + NEXT_PUBLIC_CHATWOOT_API_KEY=${{ secrets.NEXT_PUBLIC_CHATWOOT_API_KEY }} + + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Push to Docker Hub Registry + run: | + docker push everco/ever-teams-webapp-dev:latest + + - name: Install doctl + uses: digitalocean/action-doctl@v2 + with: + token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} + + - name: Log in to DigitalOcean Container Registry with short-lived credentials + run: doctl registry login --expiry-seconds 3600 + + - name: Push to DigitalOcean Registry + run: | + docker push registry.digitalocean.com/ever/ever-teams-webapp-dev:latest + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GH_TOKEN }} + + - name: Push to Github Registry + run: | + docker push ghcr.io/ever-co/ever-teams-webapp-dev:latest + + - name: Login to CW Container Registry + uses: docker/login-action@v2 + with: + registry: ${{ secrets.CW_DOCKER_REGISTRY }} + username: ${{ secrets.CW_DOCKER_USER }} + password: ${{ secrets.CW_DOCKER_USER_PASSWORD }} + + - name: Push to CW Registry + run: | + docker push ${{ secrets.CW_DOCKER_REGISTRY }}/ever-co/ever-teams-webapp-dev:latest diff --git a/.github/workflows/docker-build-publish.yml b/.github/workflows/docker-build-publish-prod.yml similarity index 62% rename from .github/workflows/docker-build-publish.yml rename to .github/workflows/docker-build-publish-prod.yml index 9888f0b7f..ad4986543 100644 --- a/.github/workflows/docker-build-publish.yml +++ b/.github/workflows/docker-build-publish-prod.yml @@ -11,6 +11,9 @@ concurrency: jobs: ever-teams-webapp: runs-on: buildjet-8vcpu-ubuntu-2204 + + environment: prod + steps: - name: Checkout uses: actions/checkout@v3 @@ -21,6 +24,9 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 + - name: Output NEXT_PUBLIC_GAUZY_API_SERVER_URL + run: echo "NEXT_PUBLIC_GAUZY_API_SERVER_URL=${{ secrets.NEXT_PUBLIC_GAUZY_API_SERVER_URL }}" + - name: Build and push uses: docker/build-push-action@v4 with: @@ -34,6 +40,23 @@ jobs: ${{ secrets.CW_DOCKER_REGISTRY }}/ever-co/ever-teams-webapp:latest cache-from: type=registry,ref=everco/ever-teams-webapp:latest cache-to: type=inline + build-args: | + NODE_ENV=production + NEXT_PUBLIC_GAUZY_API_SERVER_URL=${{ secrets.NEXT_PUBLIC_GAUZY_API_SERVER_URL }} + NEXT_PUBLIC_GA_MEASUREMENT_ID=${{ secrets.NEXT_PUBLIC_GA_MEASUREMENT_ID }} + NEXT_PUBLIC_CAPTCHA_SITE_KEY=${{ secrets.NEXT_PUBLIC_CAPTCHA_SITE_KEY }} + NEXT_PUBLIC_DISABLE_AUTO_REFRESH=false + NEXT_PUBLIC_COOKIE_DOMAINS=${{ secrets.NEXT_PUBLIC_COOKIE_DOMAINS }} + NEXT_PUBLIC_BOARD_APP_DOMAIN=${{ secrets.NEXT_PUBLIC_BOARD_APP_DOMAIN }} + NEXT_PUBLIC_BOARD_BACKEND_POST_URL=${{ secrets.NEXT_PUBLIC_BOARD_BACKEND_POST_URL }} + NEXT_PUBLIC_BOARD_FIREBASE_CONFIG=${{ secrets.NEXT_PUBLIC_BOARD_FIREBASE_CONFIG }} + NEXT_PUBLIC_MEET_DOMAIN=${{ secrets.NEXT_PUBLIC_MEET_DOMAIN }} + NEXT_PUBLIC_SENTRY_DSN=${{ secrets.NEXT_PUBLIC_SENTRY_DSN }} + NEXT_PUBLIC_SENTRY_DEBUG=${{ secrets.NEXT_PUBLIC_SENTRY_DEBUG }} + NEXT_PUBLIC_JITSU_BROWSER_URL=${{ secrets.NEXT_PUBLIC_JITSU_BROWSER_URL }} + NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY=${{ secrets.NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY }} + NEXT_PUBLIC_GITHUB_APP_NAME=ever-github + NEXT_PUBLIC_CHATWOOT_API_KEY=${{ secrets.NEXT_PUBLIC_CHATWOOT_API_KEY }} - name: Login to DockerHub uses: docker/login-action@v2 diff --git a/.render/render.dev.yaml b/.render/render.dev.yaml new file mode 100644 index 000000000..44b0641b2 --- /dev/null +++ b/.render/render.dev.yaml @@ -0,0 +1,77 @@ +services: + - type: web + runtime: node + env: node + name: ever-teams-web + region: oregon + branch: develop + rootDir: ./apps/web + buildCommand: yarn; yarn build + startCommand: yarn start + envVars: + - key: RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED + value: false + - key: NEXT_PUBLIC_GAUZY_API_SERVER_URL + value: https://apistage.gauzy.co + - key: GAUZY_API_SERVER_URL + value: https://apistage.gauzy.co/api + - key: NEXT_PUBLIC_GA_MEASUREMENT_ID + sync: false + - key: NEXT_PUBLIC_CAPTCHA_SITE_KEY + sync: false + - key: CAPTCHA_SECRET_KEY + sync: false + - key: INVITE_CALLBACK_URL + value: https://app.ever.team/auth/passcode + - key: VERIFY_EMAIL_CALLBACK_URL + value: https://app.ever.team/verify-email + - key: SMTP_FROM_ADDRESS + value: noreply@ever.team + - key: SMTP_HOST + sync: false + - key: SMTP_PORT + sync: false + - key: SMTP_SECURE + sync: false + - key: SMTP_USERNAME + sync: false + - key: SMTP_PASSWORD + sync: false + - key: NEXT_PUBLIC_DISABLE_AUTO_REFRESH + value: false + - key: APP_NAME + value: 'Ever Teams' + - key: APP_SIGNATURE + value: 'Ever Teams' + - key: APP_LOGO_URL + value: 'https://app.ever.team/assets/ever-teams.png' + - key: NEXT_PUBLIC_COOKIE_DOMAINS + value: ever.team + - key: NEXT_PUBLIC_BOARD_APP_DOMAIN + value: https://board.ever.team + - key: NEXT_PUBLIC_BOARD_BACKEND_POST_URL + value: 'https://jsonboard.ever.team/api/v2/post/' + - key: NEXT_PUBLIC_BOARD_FIREBASE_CONFIG + sync: false + - key: NEXT_PUBLIC_MEET_DOMAIN + value: 'meet.ever.team' + - key: MEET_JWT_APP_ID + value: ever_teams + - key: MEET_JWT_APP_SECRET + sync: false + - key: SENTRY_ORG + value: ever-co + - key: SENTRY_PROJECT + value: ever-teams-web + - key: NEXT_PUBLIC_SENTRY_DSN + sync: false + - key: NEXT_PUBLIC_SENTRY_DEBUG + value: false + - key: NEXT_PUBLIC_JITSU_BROWSER_URL + sync: false + - key: NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY + sync: false + - key: NEXT_PUBLIC_GITHUB_APP_NAME + value: ever-github + - key: NEXT_PUBLIC_CHATWOOT_API_KEY + sync: false diff --git a/Dockerfile b/Dockerfile index 84f4137b9..8712f6f9a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,32 @@ # syntax = docker/dockerfile:1 -# Adjust NODE_VERSION as desired +# Ever Teams Platform + ARG NODE_VERSION=18.17.1 +ARG NEXT_PUBLIC_GAUZY_API_SERVER_URL=https://api.gauzy.co +ARG NEXT_PUBLIC_GA_MEASUREMENT_ID +ARG NEXT_PUBLIC_CAPTCHA_SITE_KEY +ARG NEXT_PUBLIC_DISABLE_AUTO_REFRESH=false +ARG NEXT_PUBLIC_COOKIE_DOMAINS=ever.team +ARG NEXT_PUBLIC_BOARD_APP_DOMAIN=https://board.ever.team +ARG NEXT_PUBLIC_BOARD_BACKEND_POST_URL=https://jsonboard.ever.team/api/v2/post/ +ARG NEXT_PUBLIC_BOARD_FIREBASE_CONFIG +ARG NEXT_PUBLIC_MEET_DOMAIN=https://meet.ever.team +ARG NEXT_PUBLIC_SENTRY_DSN +ARG NEXT_PUBLIC_SENTRY_DEBUG +ARG NEXT_PUBLIC_JITSU_BROWSER_URL +ARG NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY +ARG NEXT_PUBLIC_GITHUB_APP_NAME=ever-github +ARG NEXT_PUBLIC_CHATWOOT_API_KEY + FROM node:${NODE_VERSION}-slim as base +# Output the environment variable value +RUN echo "NEXT_PUBLIC_GAUZY_API_SERVER_URL=${NEXT_PUBLIC_GAUZY_API_SERVER_URL}" + +LABEL maintainer="ever@ever.co" +LABEL org.opencontainers.image.source https://github.com/ever-co/ever-teams + # Next.js app lives here WORKDIR /app @@ -14,17 +37,33 @@ ENV NEXT_SHARP_PATH=/temp/node_modules/sharp RUN npm i -g npm@latest # Install sharp, NextJS image optimization RUN mkdir /temp && cd /temp && \ - npm i sharp + npm i sharp RUN npm cache clean --force - # Throw-away build stage to reduce size of final image FROM base as build +# We make env vars passed as build argument to be available in this build stage because we prebuild the NextJs app +ARG NEXT_PUBLIC_GAUZY_API_SERVER_URL +ARG NEXT_PUBLIC_GA_MEASUREMENT_ID +ARG NEXT_PUBLIC_CAPTCHA_SITE_KEY +ARG NEXT_PUBLIC_DISABLE_AUTO_REFRESH +ARG NEXT_PUBLIC_COOKIE_DOMAINS +ARG NEXT_PUBLIC_BOARD_APP_DOMAIN +ARG NEXT_PUBLIC_BOARD_BACKEND_POST_URL +ARG NEXT_PUBLIC_BOARD_FIREBASE_CONFIG +ARG NEXT_PUBLIC_MEET_DOMAIN +ARG NEXT_PUBLIC_SENTRY_DSN +ARG NEXT_PUBLIC_SENTRY_DEBUG +ARG NEXT_PUBLIC_JITSU_BROWSER_URL +ARG NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY +ARG NEXT_PUBLIC_GITHUB_APP_NAME +ARG NEXT_PUBLIC_CHATWOOT_API_KEY + # Install packages needed to build node modules RUN apt-get update -qq && \ - apt-get install -y build-essential pkg-config python-is-python3 + apt-get install -y build-essential pkg-config python-is-python3 # Install Yarn RUN npm install -g yarn --force @@ -35,19 +74,21 @@ COPY yarn.lock ./ COPY apps/web/package.json ./apps/web/package.json RUN cd apps/web && \ - yarn install --ignore-scripts + yarn install --ignore-scripts # Copy application code COPY . . ENV NODE_ENV=production +RUN echo $NEXT_PUBLIC_GAUZY_API_SERVER_URL + # Build application RUN yarn run build:web # Remove development dependencies RUN cd apps/web && \ - yarn install --prod --ignore-scripts + yarn install --prod --ignore-scripts RUN yarn cache clean diff --git a/Layerfile b/Layerfile index 26850d39b..5df270bf5 100644 --- a/Layerfile +++ b/Layerfile @@ -11,10 +11,9 @@ RUN apt-get update && \ apt-get update && \ apt-get install docker-ce docker-ce-cli containerd.io -COPY . . +RUN REPEATABLE docker pull everco/ever-teams-webapp -RUN REPEATABLE docker build -t ever-teams . - -RUN REPEATABLE docker run -d -p 3000:3000 ever-teams && sleep 5 +RUN REPEATABLE (docker rm ever-teams --force || true) &&\ + docker run --name ever-teams -d -p 3000:3000 everco/ever-teams-webapp && sleep 5 EXPOSE WEBSITE localhost:3000 diff --git a/Layerfile.build b/Layerfile.build new file mode 100644 index 000000000..13f4cd554 --- /dev/null +++ b/Layerfile.build @@ -0,0 +1,23 @@ +FROM vm/ubuntu:18.04 + +MEMORY 8G + +# install the latest version of Docker, as in the official Docker installation tutorial. +RUN apt-get update && \ + apt-get install ca-certificates curl gnupg lsb-release && \ + sudo mkdir -p /etc/apt/keyrings && \ + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \ + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" |\ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \ + apt-get update && \ + apt-get install docker-ce docker-ce-cli containerd.io + +COPY . . + +RUN REPEATABLE docker build -t ever-teams . + +RUN REPEATABLE (docker rm ever-teams --force || true) &&\ + docker run --name ever-teams -d -p 3000:3000 ever-teams && sleep 5 + +EXPOSE WEBSITE localhost:3000 diff --git a/Layerfile.node b/Layerfile.node new file mode 100644 index 000000000..30fd5915e --- /dev/null +++ b/Layerfile.node @@ -0,0 +1,22 @@ +FROM vm/ubuntu:22.04 + +ENV NODE_MAJOR=20 + +# install the latest version of Docker, as in the official Docker installation tutorial. +RUN apt-get update &&\ + apt-get install -y ca-certificates curl gnupg &&\ + sudo mkdir -p /etc/apt/keyrings &&\ + curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg &&\ + echo \ + "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" |\ + sudo tee /etc/apt/sources.list.d/nodesource.list &&\ + apt-get update &&\ + apt-get install nodejs yarn -y + +COPY . . + +RUN REPEATABLE cd apps/web && yarn install && yarn build + +RUN BACKGROUND yarn start:web + +EXPOSE WEBSITE localhost:3000 diff --git a/README.md b/README.md index d00d7dd6f..6ab23a1fd 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,10 @@ WIP [![Deploy to Koyeb](https://www.koyeb.com/static/images/deploy/button.svg)](https://app.koyeb.com/deploy?name=ever-teams&type=docker&builder=dockerfile&image=ghcr.io/ever-co/ever-teams-webapp:latest&env[PORT]=3000&ports=3000;http;/) +### Northflank + +[Deploy to Northflank](https://app.northflank.com/s/account/templates/new?data=656ed069216b5d387f5379c6) + ## 📄 Content - `/web` - NextJs-based (React) Web App at (deployed from `main` branch) diff --git a/apps/mobile/android/.gitignore b/apps/mobile/android/.gitignore deleted file mode 100644 index 877b87e9a..000000000 --- a/apps/mobile/android/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -# OSX -# -.DS_Store - -# Android/IntelliJ -# -build/ -.idea -.gradle -local.properties -*.iml -*.hprof - -# Bundle artifacts -*.jsbundle diff --git a/apps/mobile/android/app/build.gradle b/apps/mobile/android/app/build.gradle deleted file mode 100644 index e06fc17c8..000000000 --- a/apps/mobile/android/app/build.gradle +++ /dev/null @@ -1,236 +0,0 @@ -apply plugin: "com.android.application" -apply plugin: "com.facebook.react" - -import com.android.build.OutputFile - -def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath() -def expoDebuggableVariants = ['debug'] -// Override `debuggableVariants` for expo-updates debugging -if (System.getenv('EX_UPDATES_NATIVE_DEBUG') == "1") { - react { - expoDebuggableVariants = [] - } -} - - -/** - * This is the configuration block to customize your React Native Android app. - * By default you don't need to apply any configuration, just uncomment the lines you need. - */ -react { - entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim()) - reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() - hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc" - debuggableVariants = expoDebuggableVariants - - /* Folders */ - // The root of your project, i.e. where "package.json" lives. Default is '..' - // root = file("../") - // The folder where the react-native NPM package is. Default is ../node_modules/react-native - // reactNativeDir = file("../node_modules/react-native") - // The folder where the react-native Codegen package is. Default is ../node_modules/react-native-codegen - // codegenDir = file("../node_modules/react-native-codegen") - // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js - // cliFile = file("../node_modules/react-native/cli.js") - - /* Variants */ - // The list of variants to that are debuggable. For those we're going to - // skip the bundling of the JS bundle and the assets. By default is just 'debug'. - // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. - // debuggableVariants = ["liteDebug", "prodDebug"] - - /* Bundling */ - // A list containing the node command and its flags. Default is just 'node'. - // nodeExecutableAndArgs = ["node"] - // - // The command to run when bundling. By default is 'bundle' - // bundleCommand = "ram-bundle" - // - // The path to the CLI configuration file. Default is empty. - // bundleConfig = file(../rn-cli.config.js) - // - // The name of the generated asset file containing your JS bundle - // bundleAssetName = "MyApplication.android.bundle" - // - // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' - // entryFile = file("../js/MyApplication.android.js") - // - // A list of extra flags to pass to the 'bundle' commands. - // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle - // extraPackagerArgs = [] - - /* Hermes Commands */ - // The hermes compiler command to run. By default it is 'hermesc' - // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" - // - // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" - // hermesFlags = ["-O", "-output-source-map"] -} - -// Override `hermesEnabled` by `expo.jsEngine` -ext { - hermesEnabled = (findProperty('expo.jsEngine') ?: "hermes") == "hermes" -} - -/** - * Set this to true to create four separate APKs instead of one, - * one for each native architecture. This is useful if you don't - * use App Bundles (https://developer.android.com/guide/app-bundle/) - * and want to have separate APKs to upload to the Play Store. - */ -def enableSeparateBuildPerCPUArchitecture = false - -/** - * Set this to true to Run Proguard on Release builds to minify the Java bytecode. - */ -def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean() - -/** - * The preferred build flavor of JavaScriptCore (JSC) - * - * For example, to use the international variant, you can use: - * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` - * - * The international variant includes ICU i18n library and necessary data - * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that - * give correct results when using with locales other than en-US. Note that - * this variant is about 6MiB larger per architecture than default. - */ -def jscFlavor = 'org.webkit:android-jsc:+' - -/** - * Private function to get the list of Native Architectures you want to build. - * This reads the value from reactNativeArchitectures in your gradle.properties - * file and works together with the --active-arch-only flag of react-native run-android. - */ -def reactNativeArchitectures() { - def value = project.getProperties().get("reactNativeArchitectures") - return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] -} - -android { - ndkVersion rootProject.ext.ndkVersion - - compileSdkVersion rootProject.ext.compileSdkVersion - - namespace "ever.team" - defaultConfig { - applicationId 'ever.team' - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 11 - versionName "0.1.0" - } - - splits { - abi { - reset() - enable enableSeparateBuildPerCPUArchitecture - universalApk false // If true, also generate a universal APK - include (*reactNativeArchitectures()) - } - } - signingConfigs { - debug { - storeFile file('debug.keystore') - storePassword 'android' - keyAlias 'androiddebugkey' - keyPassword 'android' - } - } - buildTypes { - debug { - signingConfig signingConfigs.debug - } - release { - // Caution! In production, you need to generate your own keystore file. - // see https://reactnative.dev/docs/signed-apk-android. - signingConfig signingConfigs.debug - minifyEnabled enableProguardInReleaseBuilds - proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - } - } - - // applicationVariants are e.g. debug, release - applicationVariants.all { variant -> - variant.outputs.each { output -> - // For each separate APK per architecture, set a unique version code as described here: - // https://developer.android.com/studio/build/configure-apk-splits.html - // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc. - def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] - def abi = output.getFilter(OutputFile.ABI) - if (abi != null) { // null for the universal-debug, universal-release variants - output.versionCodeOverride = - defaultConfig.versionCode * 1000 + versionCodes.get(abi) - } - - } - } -} - -// Apply static values from `gradle.properties` to the `android.packagingOptions` -// Accepts values in comma delimited lists, example: -// android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini -["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop -> - // Split option: 'foo,bar' -> ['foo', 'bar'] - def options = (findProperty("android.packagingOptions.$prop") ?: "").split(","); - // Trim all elements in place. - for (i in 0.. 0) { - println "android.packagingOptions.$prop += $options ($options.length)" - // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**' - options.each { - android.packagingOptions[prop] += it - } - } -} - -dependencies { - // The version of react-native is set by the React Native Gradle Plugin - implementation("com.facebook.react:react-android") - - def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; - def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; - def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; - def frescoVersion = rootProject.ext.frescoVersion - - // If your app supports Android versions before Ice Cream Sandwich (API level 14) - if (isGifEnabled || isWebpEnabled) { - implementation("com.facebook.fresco:fresco:${frescoVersion}") - implementation("com.facebook.fresco:imagepipeline-okhttp3:${frescoVersion}") - } - - if (isGifEnabled) { - // For animated gif support - implementation("com.facebook.fresco:animated-gif:${frescoVersion}") - } - - if (isWebpEnabled) { - // For webp support - implementation("com.facebook.fresco:webpsupport:${frescoVersion}") - if (isWebpAnimatedEnabled) { - // Animated webp support - implementation("com.facebook.fresco:animated-webp:${frescoVersion}") - } - } - - implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0") - - debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") - debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { - exclude group:'com.squareup.okhttp3', module:'okhttp' - } - debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") - - if (hermesEnabled.toBoolean()) { - implementation("com.facebook.react:hermes-android") - } else { - implementation jscFlavor - } -} - -apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); -applyNativeModulesAppBuildGradle(project) diff --git a/apps/mobile/android/app/debug.keystore b/apps/mobile/android/app/debug.keystore deleted file mode 100644 index 364e105ed..000000000 Binary files a/apps/mobile/android/app/debug.keystore and /dev/null differ diff --git a/apps/mobile/android/app/proguard-rules.pro b/apps/mobile/android/app/proguard-rules.pro deleted file mode 100644 index 551eb41da..000000000 --- a/apps/mobile/android/app/proguard-rules.pro +++ /dev/null @@ -1,14 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# react-native-reanimated --keep class com.swmansion.reanimated.** { *; } --keep class com.facebook.react.turbomodule.** { *; } - -# Add any project specific keep options here: diff --git a/apps/mobile/android/app/src/debug/AndroidManifest.xml b/apps/mobile/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 99e38fc5f..000000000 --- a/apps/mobile/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/apps/mobile/android/app/src/debug/java/gauzy/team/ReactNativeFlipper.java b/apps/mobile/android/app/src/debug/java/gauzy/team/ReactNativeFlipper.java deleted file mode 100644 index 9ce1263fa..000000000 --- a/apps/mobile/android/app/src/debug/java/gauzy/team/ReactNativeFlipper.java +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - *

This source code is licensed under the MIT license found in the LICENSE file in the root - * directory of this source tree. - */ -package ever.team; - -import android.content.Context; -import com.facebook.flipper.android.AndroidFlipperClient; -import com.facebook.flipper.android.utils.FlipperUtils; -import com.facebook.flipper.core.FlipperClient; -import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; -import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; -import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; -import com.facebook.flipper.plugins.inspector.DescriptorMapping; -import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; -import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; -import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; -import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; -import com.facebook.react.ReactInstanceEventListener; -import com.facebook.react.ReactInstanceManager; -import com.facebook.react.bridge.ReactContext; -import com.facebook.react.modules.network.NetworkingModule; -import okhttp3.OkHttpClient; - -/** - * Class responsible of loading Flipper inside your React Native application. This is the debug - * flavor of it. Here you can add your own plugins and customize the Flipper setup. - */ -public class ReactNativeFlipper { - public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { - if (FlipperUtils.shouldEnableFlipper(context)) { - final FlipperClient client = AndroidFlipperClient.getInstance(context); - - client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); - client.addPlugin(new DatabasesFlipperPlugin(context)); - client.addPlugin(new SharedPreferencesFlipperPlugin(context)); - client.addPlugin(CrashReporterPlugin.getInstance()); - - NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); - NetworkingModule.setCustomClientBuilder( - new NetworkingModule.CustomClientBuilder() { - @Override - public void apply(OkHttpClient.Builder builder) { - builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); - } - }); - client.addPlugin(networkFlipperPlugin); - client.start(); - - // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized - // Hence we run if after all native modules have been initialized - ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); - if (reactContext == null) { - reactInstanceManager.addReactInstanceEventListener( - new ReactInstanceEventListener() { - @Override - public void onReactContextInitialized(ReactContext reactContext) { - reactInstanceManager.removeReactInstanceEventListener(this); - reactContext.runOnNativeModulesQueueThread( - new Runnable() { - @Override - public void run() { - client.addPlugin(new FrescoFlipperPlugin()); - } - }); - } - }); - } else { - client.addPlugin(new FrescoFlipperPlugin()); - } - } - } -} diff --git a/apps/mobile/android/app/src/main/AndroidManifest.xml b/apps/mobile/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 80f5e741c..000000000 --- a/apps/mobile/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/mobile/android/app/src/main/java/gauzy/team/MainActivity.java b/apps/mobile/android/app/src/main/java/gauzy/team/MainActivity.java deleted file mode 100644 index 15186b7b1..000000000 --- a/apps/mobile/android/app/src/main/java/gauzy/team/MainActivity.java +++ /dev/null @@ -1,68 +0,0 @@ -package ever.team; - -import android.os.Build; -import android.os.Bundle; - -import com.facebook.react.ReactActivity; -import com.facebook.react.ReactActivityDelegate; -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; -import com.facebook.react.defaults.DefaultReactActivityDelegate; - -import expo.modules.ReactActivityDelegateWrapper; - -public class MainActivity extends ReactActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - // Set the theme to AppTheme BEFORE onCreate to support - // coloring the background, status bar, and navigation bar. - // This is required for expo-splash-screen. - setTheme(R.style.AppTheme); - super.onCreate(null); - } - - /** - * Returns the name of the main component registered from JavaScript. - * This is used to schedule rendering of the component. - */ - @Override - protected String getMainComponentName() { - return "main"; - } - - /** - * Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link - * DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React - * (aka React 18) with two boolean flags. - */ - @Override - protected ReactActivityDelegate createReactActivityDelegate() { - return new ReactActivityDelegateWrapper(this, BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, new DefaultReactActivityDelegate( - this, - getMainComponentName(), - // If you opted-in for the New Architecture, we enable the Fabric Renderer. - DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled - // If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18). - DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled - )); - } - - /** - * Align the back button behavior with Android S - * where moving root activities to background instead of finishing activities. - * @see onBackPressed - */ - @Override - public void invokeDefaultOnBackPressed() { - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { - if (!moveTaskToBack(false)) { - // For non-root activities, use the default implementation to finish them. - super.invokeDefaultOnBackPressed(); - } - return; - } - - // Use the default back button implementation on Android S - // because it's doing more than {@link Activity#moveTaskToBack} in fact. - super.invokeDefaultOnBackPressed(); - } -} diff --git a/apps/mobile/android/app/src/main/java/gauzy/team/MainApplication.java b/apps/mobile/android/app/src/main/java/gauzy/team/MainApplication.java deleted file mode 100644 index 150f3ca30..000000000 --- a/apps/mobile/android/app/src/main/java/gauzy/team/MainApplication.java +++ /dev/null @@ -1,76 +0,0 @@ -package ever.team; - -import android.app.Application; -import android.content.res.Configuration; -import androidx.annotation.NonNull; - -import com.facebook.react.PackageList; -import com.facebook.react.ReactApplication; -import com.facebook.react.ReactNativeHost; -import com.facebook.react.ReactPackage; -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; -import com.facebook.react.defaults.DefaultReactNativeHost; -import com.facebook.soloader.SoLoader; - -import expo.modules.ApplicationLifecycleDispatcher; -import expo.modules.ReactNativeHostWrapper; - -import java.util.List; - -public class MainApplication extends Application implements ReactApplication { - - private final ReactNativeHost mReactNativeHost = - new ReactNativeHostWrapper(this, new DefaultReactNativeHost(this) { - @Override - public boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } - - @Override - protected List getPackages() { - @SuppressWarnings("UnnecessaryLocalVariable") - List packages = new PackageList(this).getPackages(); - // Packages that cannot be autolinked yet can be added manually here, for example: - // packages.add(new MyReactNativePackage()); - return packages; - } - - @Override - protected String getJSMainModuleName() { - return "index"; - } - - @Override - protected boolean isNewArchEnabled() { - return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; - } - - @Override - protected Boolean isHermesEnabled() { - return BuildConfig.IS_HERMES_ENABLED; - } - }); - - @Override - public ReactNativeHost getReactNativeHost() { - return mReactNativeHost; - } - - @Override - public void onCreate() { - super.onCreate(); - SoLoader.init(this, /* native exopackage */ false); - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // If you opted-in for the New Architecture, we load the native entry point for this app. - DefaultNewArchitectureEntryPoint.load(); - } - ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); - ApplicationLifecycleDispatcher.onApplicationCreate(this); - } - - @Override - public void onConfigurationChanged(@NonNull Configuration newConfig) { - super.onConfigurationChanged(newConfig); - ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig); - } -} diff --git a/apps/mobile/android/app/src/main/res/drawable-hdpi/splashscreen_image.png b/apps/mobile/android/app/src/main/res/drawable-hdpi/splashscreen_image.png deleted file mode 100644 index 4eae0b69d..000000000 Binary files a/apps/mobile/android/app/src/main/res/drawable-hdpi/splashscreen_image.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/drawable-mdpi/splashscreen_image.png b/apps/mobile/android/app/src/main/res/drawable-mdpi/splashscreen_image.png deleted file mode 100644 index bf867e754..000000000 Binary files a/apps/mobile/android/app/src/main/res/drawable-mdpi/splashscreen_image.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/drawable-xhdpi/splashscreen_image.png b/apps/mobile/android/app/src/main/res/drawable-xhdpi/splashscreen_image.png deleted file mode 100644 index bf867e754..000000000 Binary files a/apps/mobile/android/app/src/main/res/drawable-xhdpi/splashscreen_image.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png b/apps/mobile/android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png deleted file mode 100644 index bf867e754..000000000 Binary files a/apps/mobile/android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png b/apps/mobile/android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png deleted file mode 100644 index bf867e754..000000000 Binary files a/apps/mobile/android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/drawable/rn_edit_text_material.xml b/apps/mobile/android/app/src/main/res/drawable/rn_edit_text_material.xml deleted file mode 100644 index f35d99620..000000000 --- a/apps/mobile/android/app/src/main/res/drawable/rn_edit_text_material.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - diff --git a/apps/mobile/android/app/src/main/res/drawable/splashscreen.xml b/apps/mobile/android/app/src/main/res/drawable/splashscreen.xml deleted file mode 100644 index c8568e162..000000000 --- a/apps/mobile/android/app/src/main/res/drawable/splashscreen.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/apps/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 4ae7d1237..000000000 --- a/apps/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/apps/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/apps/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 4ae7d1237..000000000 --- a/apps/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/apps/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/apps/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 6de20ed02..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/apps/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png deleted file mode 100644 index 00055d142..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/apps/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index 93c06decd..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/apps/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index e0e0eb277..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/apps/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 69eb39c59..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/apps/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png deleted file mode 100644 index 0c1490fa1..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/apps/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 9f06661d9..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/apps/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 9f9dbe5bb..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/apps/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 3164265d4..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/apps/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png deleted file mode 100644 index d49e142c8..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/apps/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index 0f5a3fd6e..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/apps/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 62b5d58f1..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/apps/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 50d79db86..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/apps/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png deleted file mode 100644 index 9aadb03c2..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/apps/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 4b1bf8857..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/apps/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 685fccfed..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/apps/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 9a9727a45..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/apps/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png deleted file mode 100644 index 9906e0091..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/apps/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 594a0a86e..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/apps/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index d06ef51ea..000000000 Binary files a/apps/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/apps/mobile/android/app/src/main/res/values-night/colors.xml b/apps/mobile/android/app/src/main/res/values-night/colors.xml deleted file mode 100644 index 3c05de5be..000000000 --- a/apps/mobile/android/app/src/main/res/values-night/colors.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/mobile/android/app/src/main/res/values/colors.xml b/apps/mobile/android/app/src/main/res/values/colors.xml deleted file mode 100644 index bb2087f7b..000000000 --- a/apps/mobile/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,6 +0,0 @@ - - #ffffff - #FFFFFF - #023c69 - #ffffff - \ No newline at end of file diff --git a/apps/mobile/android/app/src/main/res/values/strings.xml b/apps/mobile/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 54ccbc9f2..000000000 --- a/apps/mobile/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - Ever Teams - cover - false - exposdk:48.0.0 - \ No newline at end of file diff --git a/apps/mobile/android/app/src/main/res/values/styles.xml b/apps/mobile/android/app/src/main/res/values/styles.xml deleted file mode 100644 index f03e23f85..000000000 --- a/apps/mobile/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/apps/mobile/android/app/src/release/java/com/gauzyteams/ReactNativeFlipper.java b/apps/mobile/android/app/src/release/java/com/gauzyteams/ReactNativeFlipper.java deleted file mode 100644 index 81755fb57..000000000 --- a/apps/mobile/android/app/src/release/java/com/gauzyteams/ReactNativeFlipper.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - *

This source code is licensed under the MIT license found in the LICENSE file in the root - * directory of this source tree. - */ -package ever.team; - -import android.content.Context; -import com.facebook.react.ReactInstanceManager; - -/** - * Class responsible of loading Flipper inside your React Native application. This is the release - * flavor of it so it's empty as we don't want to load Flipper. - */ -public class ReactNativeFlipper { - public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { - // Do nothing as we don't want to initialize Flipper on Release. - } -} diff --git a/apps/mobile/android/build.gradle b/apps/mobile/android/build.gradle deleted file mode 100644 index e5fda8287..000000000 --- a/apps/mobile/android/build.gradle +++ /dev/null @@ -1,42 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext { - buildToolsVersion = findProperty('android.buildToolsVersion') ?: '33.0.0' - minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '21') - compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '33') - targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '33') - if (findProperty('android.kotlinVersion')) { - kotlinVersion = findProperty('android.kotlinVersion') - } - frescoVersion = findProperty('expo.frescoVersion') ?: '2.5.0' - - // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. - ndkVersion = "23.1.7779620" - } - repositories { - google() - mavenCentral() - } - dependencies { - classpath('com.android.tools.build:gradle:7.4.1') - classpath('com.facebook.react:react-native-gradle-plugin') - } -} - -allprojects { - repositories { - maven { - // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm - url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android')) - } - maven { - // Android JSC is installed from npm - url(new File(['node', '--print', "require.resolve('jsc-android/package.json')"].execute(null, rootDir).text.trim(), '../dist')) - } - - google() - mavenCentral() - maven { url 'https://www.jitpack.io' } - } -} diff --git a/apps/mobile/android/gradle.properties b/apps/mobile/android/gradle.properties deleted file mode 100644 index 9911ac4af..000000000 --- a/apps/mobile/android/gradle.properties +++ /dev/null @@ -1,53 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m -org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true - -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true - -# Version of flipper SDK to use with React Native -FLIPPER_VERSION=0.125.0 - -# Use this property to specify which architecture you want to build. -# You can also override it from the CLI using -# ./gradlew -PreactNativeArchitectures=x86_64 -reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 - -# Use this property to enable support to the new architecture. -# This will allow you to use TurboModules and the Fabric render in -# your application. You should enable this flag either if you want -# to write custom TurboModules/Fabric components OR use libraries that -# are providing them. -newArchEnabled=false - -# The hosted JavaScript engine -# Supported values: expo.jsEngine = "hermes" | "jsc" -expo.jsEngine=hermes - -# Enable GIF support in React Native images (~200 B increase) -expo.gif.enabled=true -# Enable webp support in React Native images (~85 KB increase) -expo.webp.enabled=true -# Enable animated webp support (~3.4 MB increase) -# Disabled by default because iOS doesn't support animated webp -expo.webp.animated=false diff --git a/apps/mobile/android/gradle/wrapper/gradle-wrapper.jar b/apps/mobile/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 249e5832f..000000000 Binary files a/apps/mobile/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/apps/mobile/android/gradle/wrapper/gradle-wrapper.properties b/apps/mobile/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 31cca4913..000000000 --- a/apps/mobile/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/apps/mobile/android/gradlew b/apps/mobile/android/gradlew deleted file mode 100755 index a69d9cb6c..000000000 --- a/apps/mobile/android/gradlew +++ /dev/null @@ -1,240 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/apps/mobile/android/gradlew.bat b/apps/mobile/android/gradlew.bat deleted file mode 100644 index 53a6b238d..000000000 --- a/apps/mobile/android/gradlew.bat +++ /dev/null @@ -1,91 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/apps/mobile/android/settings.gradle b/apps/mobile/android/settings.gradle deleted file mode 100644 index c1c94e319..000000000 --- a/apps/mobile/android/settings.gradle +++ /dev/null @@ -1,10 +0,0 @@ -rootProject.name = 'Ever Teams' - -apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle"); -useExpoModules() - -apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); -applyNativeModulesSettingsGradle(settings) - -include ':app' -includeBuild(new File(["node", "--print", "require.resolve('react-native-gradle-plugin/package.json')"].execute(null, rootDir).text.trim()).getParentFile()) diff --git a/apps/mobile/app.json b/apps/mobile/app.json index 59845eaf0..99d8e7859 100644 --- a/apps/mobile/app.json +++ b/apps/mobile/app.json @@ -87,17 +87,6 @@ "projectId": "2ff924e4-7a91-4b23-9db9-7453a8063bb0" } }, - "hooks": { - "postPublish": [ - { - "file": "sentry-expo/upload-sourcemaps", - "config": { - "organization": "ever-co", - "project": "ever-teams-mobile" - } - } - ] - }, "runtimeVersion": "exposdk:48.0.0" } } diff --git a/apps/mobile/app/components/Task/DetailsBlock/blocks/TaskMainInfo.tsx b/apps/mobile/app/components/Task/DetailsBlock/blocks/TaskMainInfo.tsx index 107dafe59..849dfd31d 100644 --- a/apps/mobile/app/components/Task/DetailsBlock/blocks/TaskMainInfo.tsx +++ b/apps/mobile/app/components/Task/DetailsBlock/blocks/TaskMainInfo.tsx @@ -148,6 +148,7 @@ const TaskMainInfo = observer(() => { > { > { > { > = ({ memberList, task }) => { const assignedToTaskMembers = useMemo( () => memberList?.filter((member) => - member.employee ? task?.members.map((item) => item.userId).includes(member.employee?.userId) : false + member.employee + ? task?.members.map((item) => item.userId).includes(member.employee?.userId) && + member.employee?.isActive + : false ), [memberList, task?.members] ); @@ -50,7 +53,10 @@ const ManageAssignees: React.FC = ({ memberList, task }) => { const unassignedMembers = useMemo( () => memberList?.filter((member) => - member.employee ? !task?.members.map((item) => item.userId).includes(member.employee.userId) : false + member.employee + ? !task?.members.map((item) => item.userId).includes(member.employee.userId) && + member.employee?.isActive + : false ), [memberList, task?.members] ); diff --git a/apps/mobile/app/components/TaskPriority.tsx b/apps/mobile/app/components/TaskPriority.tsx index 8a53788e1..e404f983f 100644 --- a/apps/mobile/app/components/TaskPriority.tsx +++ b/apps/mobile/app/components/TaskPriority.tsx @@ -1,53 +1,53 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useState } from "react" -import { TouchableOpacity, View, Text, StyleSheet, ViewStyle } from "react-native" -import { AntDesign, Entypo } from "@expo/vector-icons" -import { observer } from "mobx-react-lite" -import { ITeamTask } from "../services/interfaces/ITask" -import { useTeamTasks } from "../services/hooks/features/useTeamTasks" -import { typography, useAppTheme } from "../theme" -import TaskPriorityPopup from "./TaskPriorityPopup" -import { translate } from "../i18n" -import { useTaskPriorityValue } from "./StatusType" -import { limitTextCharaters } from "../helpers/sub-text" +import React, { FC, useState } from 'react'; +import { TouchableOpacity, View, Text, StyleSheet, ViewStyle } from 'react-native'; +import { AntDesign, Entypo } from '@expo/vector-icons'; +import { observer } from 'mobx-react-lite'; +import { ITeamTask } from '../services/interfaces/ITask'; +import { useTeamTasks } from '../services/hooks/features/useTeamTasks'; +import { typography, useAppTheme } from '../theme'; +import TaskPriorityPopup from './TaskPriorityPopup'; +import { translate } from '../i18n'; +import { useTaskPriorityValue } from './StatusType'; +import { limitTextCharaters } from '../helpers/sub-text'; interface TaskPriorityProps { - task?: ITeamTask - containerStyle?: ViewStyle - priority?: string - setPriority?: (priority: string) => unknown + task?: ITeamTask; + containerStyle?: ViewStyle; + priority?: string; + setPriority?: (priority: string) => unknown; + canCreatePriority?: boolean; } const TaskPriority: FC = observer( - ({ task, containerStyle, priority, setPriority }) => { - const { colors } = useAppTheme() - const { updateTask } = useTeamTasks() - const [openModal, setOpenModal] = useState(false) + ({ task, containerStyle, priority, setPriority, canCreatePriority }) => { + const { colors } = useAppTheme(); + const { updateTask } = useTeamTasks(); + const [openModal, setOpenModal] = useState(false); - const allTaskPriorities = useTaskPriorityValue() + const allTaskPriorities = useTaskPriorityValue(); const sizeValue = ( - task?.priority?.split("-").join(" ") || - (priority && priority.split("-").join(" ")) - )?.toLowerCase() + task?.priority?.split('-').join(' ') || + (priority && priority.split('-').join(' ')) + )?.toLowerCase(); const currentPriority = - allTaskPriorities && - Object.values(allTaskPriorities).find((item) => item.name.toLowerCase() === sizeValue) + allTaskPriorities && Object.values(allTaskPriorities).find((item) => item.name.toLowerCase() === sizeValue); const onChangePriority = async (text: string) => { if (task) { const taskEdit = { ...task, - priority: task?.priority === text ? null : text, - } + priority: task?.priority === text ? null : text + }; - await updateTask(taskEdit, task.id) + await updateTask(taskEdit, task.id); } else { - setPriority(text) + setPriority(text); } - } + }; return ( <> @@ -56,6 +56,7 @@ const TaskPriority: FC = observer( visible={openModal} setSelectedPriority={(e) => onChangePriority(e.value)} onDismiss={() => setOpenModal(false)} + canCreatePriority={canCreatePriority} /> setOpenModal(true)}> = observer( ...styles.container, ...containerStyle, borderColor: colors.border, - backgroundColor: currentPriority?.bgColor, + backgroundColor: currentPriority?.bgColor }} > {(task?.priority || priority) && currentPriority ? ( @@ -72,53 +73,51 @@ const TaskPriority: FC = observer( {limitTextCharaters({ text: currentPriority.name, - numChars: 15, + numChars: 15 })} ) : ( - - {translate("settingScreen.priorityScreen.priorities")} + + {translate('settingScreen.priorityScreen.priorities')} )} - ) - }, -) + ); + } +); const styles = StyleSheet.create({ container: { - alignItems: "center", - borderColor: "rgba(0,0,0,0.16)", + alignItems: 'center', + borderColor: 'rgba(0,0,0,0.16)', borderRadius: 10, borderWidth: 1, - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', minHeight: 30, minWidth: 100, - paddingHorizontal: 8, + paddingHorizontal: 8 }, text: { fontFamily: typography.fonts.PlusJakartaSans.semiBold, - fontSize: 10, + fontSize: 10 }, wrapStatus: { - alignItems: "center", - flexDirection: "row", - width: "70%", - }, -}) + alignItems: 'center', + flexDirection: 'row', + width: '70%' + } +}); -export default TaskPriority +export default TaskPriority; diff --git a/apps/mobile/app/components/TaskPriorityPopup.tsx b/apps/mobile/app/components/TaskPriorityPopup.tsx index 900fe1dc8..d492db6fd 100644 --- a/apps/mobile/app/components/TaskPriorityPopup.tsx +++ b/apps/mobile/app/components/TaskPriorityPopup.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-inline-styles */ /* eslint-disable react-native/no-color-literals */ -import React, { FC } from 'react'; +import React, { FC, useState } from 'react'; import { View, ViewStyle, @@ -12,19 +12,21 @@ import { TouchableOpacity, TouchableWithoutFeedback } from 'react-native'; -import { Feather, AntDesign } from '@expo/vector-icons'; -import { spacing, useAppTheme } from '../theme'; +import { Feather, AntDesign, Ionicons } from '@expo/vector-icons'; +import { spacing, useAppTheme, typography } from '../theme'; import { BadgedTaskPriority } from './PriorityIcon'; import { useTaskPriority } from '../services/hooks/features/useTaskPriority'; import { ITaskPriorityItem } from '../services/interfaces/ITaskPriority'; import { translate } from '../i18n'; import { BlurView } from 'expo-blur'; +import TaskPriorityForm from '../screens/Authenticated/TaskPrioritiesScreen/components/TaskPriorityForm'; export interface Props { visible: boolean; onDismiss: () => unknown; priorityName: string; setSelectedPriority: (status: ITaskPriorityItem) => unknown; + canCreatePriority?: boolean; } const ModalPopUp = ({ visible, children, onDismiss }) => { @@ -74,10 +76,15 @@ const TaskPriorityPopup: FC = function TaskPriorityPopup({ visible, onDismiss, setSelectedPriority, - priorityName + priorityName, + canCreatePriority }) { const { allTaskPriorities } = useTaskPriority(); - const { colors } = useAppTheme(); + const { colors, dark } = useAppTheme(); + const { createPriority, updatePriority } = useTaskPriority(); + + const [createPriorityMode, setCreatePriorityMode] = useState(false); + const onPrioritySelected = (size: ITaskPriorityItem) => { setSelectedPriority(size); onDismiss(); @@ -85,20 +92,61 @@ const TaskPriorityPopup: FC = function TaskPriorityPopup({ return ( - - - {translate('settingScreen.priorityScreen.priorities')} - - ( - - )} - legacyImplementation={true} - showsVerticalScrollIndicator={true} - keyExtractor={(_, index) => index.toString()} - /> + + {!createPriorityMode ? ( + <> + + {translate('settingScreen.priorityScreen.priorities')} + + ( + + )} + legacyImplementation={true} + showsVerticalScrollIndicator={true} + keyExtractor={(_, index) => index.toString()} + /> + {canCreatePriority && ( + setCreatePriorityMode(true)} + > + + + {translate('settingScreen.priorityScreen.createNewPriorityText')} + + + )} + + ) : ( + setCreatePriorityMode(false)} + onCreatePriority={createPriority} + onUpdatePriority={updatePriority} + isEdit={false} + /> + )} ); @@ -138,6 +186,12 @@ const $modalBackGround: ViewStyle = { }; const styles = StyleSheet.create({ + btnText: { + color: '#3826A6', + fontFamily: typography.primary.semiBold, + fontSize: 16, + fontStyle: 'normal' + }, colorFrame: { borderRadius: 10, height: 44, @@ -154,6 +208,18 @@ const styles = StyleSheet.create({ paddingVertical: 16, width: '90%' }, + createButton: { + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', + borderRadius: 12, + borderWidth: 2, + flexDirection: 'row', + justifyContent: 'center', + marginTop: 10, + padding: 12, + width: '80%' + }, title: { fontSize: spacing.medium - 2, marginBottom: 16, diff --git a/apps/mobile/app/components/TaskSize.tsx b/apps/mobile/app/components/TaskSize.tsx index 4d5587902..0aad6c20e 100644 --- a/apps/mobile/app/components/TaskSize.tsx +++ b/apps/mobile/app/components/TaskSize.tsx @@ -1,60 +1,57 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useState } from "react" -import { TouchableOpacity, View, Text, StyleSheet, ViewStyle, TextStyle } from "react-native" -import { AntDesign, Entypo } from "@expo/vector-icons" -import { observer } from "mobx-react-lite" -import { ITeamTask } from "../services/interfaces/ITask" -import { useTeamTasks } from "../services/hooks/features/useTeamTasks" -import { showMessage } from "react-native-flash-message" -import { typography, useAppTheme } from "../theme" -import TaskSizePopup from "./TaskSizePopup" -import { translate } from "../i18n" -import { limitTextCharaters } from "../helpers/sub-text" -import { useTaskSizeValue } from "./StatusType" +import React, { FC, useState } from 'react'; +import { TouchableOpacity, View, Text, StyleSheet, ViewStyle, TextStyle } from 'react-native'; +import { AntDesign, Entypo } from '@expo/vector-icons'; +import { observer } from 'mobx-react-lite'; +import { ITeamTask } from '../services/interfaces/ITask'; +import { useTeamTasks } from '../services/hooks/features/useTeamTasks'; +import { showMessage } from 'react-native-flash-message'; +import { typography, useAppTheme } from '../theme'; +import TaskSizePopup from './TaskSizePopup'; +import { translate } from '../i18n'; +import { limitTextCharaters } from '../helpers/sub-text'; +import { useTaskSizeValue } from './StatusType'; interface TaskSizeProps { - task?: ITeamTask - containerStyle?: ViewStyle - statusTextSyle?: TextStyle - size?: string - setSize?: (size: string) => unknown + task?: ITeamTask; + containerStyle?: ViewStyle; + statusTextSyle?: TextStyle; + size?: string; + setSize?: (size: string) => unknown; + canCreateSize?: boolean; } -const TaskSize: FC = observer(({ task, containerStyle, setSize, size }) => { - const { colors } = useAppTheme() - const { updateTask } = useTeamTasks() - const [openModal, setOpenModal] = useState(false) +const TaskSize: FC = observer(({ task, containerStyle, setSize, size, canCreateSize }) => { + const { colors } = useAppTheme(); + const { updateTask } = useTeamTasks(); + const [openModal, setOpenModal] = useState(false); - const allTaskSizes = useTaskSizeValue() + const allTaskSizes = useTaskSizeValue(); - const sizeValue = ( - task?.size?.split("-").join(" ") || - (size && size.split("-").join(" ")) - )?.toLowerCase() + const sizeValue = (task?.size?.split('-').join(' ') || (size && size.split('-').join(' ')))?.toLowerCase(); const currentSize = - allTaskSizes && - Object.values(allTaskSizes).find((item) => item.name.toLowerCase() === sizeValue) + allTaskSizes && Object.values(allTaskSizes).find((item) => item.name.toLowerCase() === sizeValue); const onChangeSize = async (text: string) => { if (task) { const taskEdit = { ...task, - size: task?.size === text ? null : text, - } + size: task?.size === text ? null : text + }; - const { response } = await updateTask(taskEdit, task.id) + const { response } = await updateTask(taskEdit, task.id); if (response.status !== 202) { showMessage({ - message: "Something went wrong", - type: "danger", - }) + message: 'Something went wrong', + type: 'danger' + }); } } else { - setSize(text) + setSize(text); } - } + }; return ( <> @@ -63,6 +60,7 @@ const TaskSize: FC = observer(({ task, containerStyle, setSize, s visible={openModal} setSelectedSize={(e) => onChangeSize(e.value)} onDismiss={() => setOpenModal(false)} + canCreateSize={canCreateSize} /> setOpenModal(true)}> = observer(({ task, containerStyle, setSize, s ...styles.container, ...containerStyle, borderColor: colors.border, - backgroundColor: currentSize?.bgColor, + backgroundColor: currentSize?.bgColor }} > {(task?.size || size) && currentSize ? ( @@ -84,42 +82,38 @@ const TaskSize: FC = observer(({ task, containerStyle, setSize, s - {translate("settingScreen.sizeScreen.sizes")} + {translate('settingScreen.sizeScreen.sizes')} )} - + - ) -}) + ); +}); const styles = StyleSheet.create({ container: { - alignItems: "center", - borderColor: "rgba(0,0,0,0.16)", + alignItems: 'center', + borderColor: 'rgba(0,0,0,0.16)', borderRadius: 10, borderWidth: 1, - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', minHeight: 30, minWidth: 100, - paddingHorizontal: 8, + paddingHorizontal: 8 }, text: { fontFamily: typography.fonts.PlusJakartaSans.semiBold, - fontSize: 10, + fontSize: 10 }, wrapStatus: { - alignItems: "center", - flexDirection: "row", - width: "70%", - }, -}) + alignItems: 'center', + flexDirection: 'row', + width: '70%' + } +}); -export default TaskSize +export default TaskSize; diff --git a/apps/mobile/app/components/TaskSizePopup.tsx b/apps/mobile/app/components/TaskSizePopup.tsx index 9e5c83896..557256607 100644 --- a/apps/mobile/app/components/TaskSizePopup.tsx +++ b/apps/mobile/app/components/TaskSizePopup.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-inline-styles */ /* eslint-disable react-native/no-color-literals */ -import React, { FC } from 'react'; +import React, { FC, useState } from 'react'; import { View, ViewStyle, @@ -12,19 +12,21 @@ import { TouchableOpacity, TouchableWithoutFeedback } from 'react-native'; -import { Feather, AntDesign } from '@expo/vector-icons'; -import { spacing, useAppTheme } from '../theme'; +import { Feather, AntDesign, Ionicons } from '@expo/vector-icons'; +import { spacing, useAppTheme, typography } from '../theme'; import { useTaskSizes } from '../services/hooks/features/useTaskSizes'; import { ITaskSizeItem } from '../services/interfaces/ITaskSize'; import { BadgedTaskSize } from './SizeIcon'; import { translate } from '../i18n'; import { BlurView } from 'expo-blur'; +import TaskSizeForm from '../screens/Authenticated/TaskSizeScreen/components/TaskSizeForm'; export interface Props { visible: boolean; onDismiss: () => unknown; sizeName: string; setSelectedSize: (status: ITaskSizeItem) => unknown; + canCreateSize?: boolean; } const ModalPopUp = ({ visible, children, onDismiss }) => { @@ -70,9 +72,19 @@ const ModalPopUp = ({ visible, children, onDismiss }) => { ); }; -const TaskStatusPopup: FC = function FilterPopup({ visible, onDismiss, setSelectedSize, sizeName }) { +const TaskStatusPopup: FC = function FilterPopup({ + visible, + onDismiss, + setSelectedSize, + sizeName, + canCreateSize +}) { const { allTaskSizes } = useTaskSizes(); - const { colors } = useAppTheme(); + const { colors, dark } = useAppTheme(); + const { createSize, updateSize } = useTaskSizes(); + + const [createSizeMode, setCreateSizeMode] = useState(false); + const onStatusSelected = (size: ITaskSizeItem) => { setSelectedSize(size); onDismiss(); @@ -80,20 +92,57 @@ const TaskStatusPopup: FC = function FilterPopup({ visible, onDismiss, se return ( - - - {translate('settingScreen.sizeScreen.sizes')} - - ( - - )} - legacyImplementation={true} - showsVerticalScrollIndicator={true} - keyExtractor={(_, index) => index.toString()} - /> + + {!createSizeMode ? ( + <> + + {translate('settingScreen.sizeScreen.sizes')} + + ( + + )} + legacyImplementation={true} + showsVerticalScrollIndicator={true} + keyExtractor={(_, index) => index.toString()} + /> + {canCreateSize && ( + setCreateSizeMode(true)} + > + + + {translate('settingScreen.sizeScreen.createNewSizeText')} + + + )} + + ) : ( + setCreateSizeMode(false)} + onCreateSize={createSize} + onUpdateSize={updateSize} + isEdit={false} + /> + )} ); @@ -133,6 +182,12 @@ const $modalBackGround: ViewStyle = { }; const styles = StyleSheet.create({ + btnText: { + color: '#3826A6', + fontFamily: typography.primary.semiBold, + fontSize: 16, + fontStyle: 'normal' + }, colorFrame: { borderRadius: 10, height: 44, @@ -149,6 +204,18 @@ const styles = StyleSheet.create({ paddingVertical: 16, width: '90%' }, + createButton: { + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', + borderRadius: 12, + borderWidth: 2, + flexDirection: 'row', + justifyContent: 'center', + marginTop: 10, + padding: 12, + width: '80%' + }, title: { fontSize: spacing.medium - 2, marginBottom: 16, diff --git a/apps/mobile/app/components/TaskStatus.tsx b/apps/mobile/app/components/TaskStatus.tsx index e2d54a7aa..e42821c89 100644 --- a/apps/mobile/app/components/TaskStatus.tsx +++ b/apps/mobile/app/components/TaskStatus.tsx @@ -1,55 +1,55 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useState } from "react" -import { TouchableOpacity, View, Text, StyleSheet, ViewStyle, TextStyle } from "react-native" -import { AntDesign, Feather } from "@expo/vector-icons" -import { ITeamTask } from "../services/interfaces/ITask" -import { observer } from "mobx-react-lite" -import { useTeamTasks } from "../services/hooks/features/useTeamTasks" -import TaskStatusPopup from "./TaskStatusPopup" -import { typography, useAppTheme } from "../theme" -import { translate } from "../i18n" -import { useTaskStatusValue } from "./StatusType" -import { limitTextCharaters } from "../helpers/sub-text" +import React, { FC, useState } from 'react'; +import { TouchableOpacity, View, Text, StyleSheet, ViewStyle, TextStyle } from 'react-native'; +import { AntDesign, Feather } from '@expo/vector-icons'; +import { ITeamTask } from '../services/interfaces/ITask'; +import { observer } from 'mobx-react-lite'; +import { useTeamTasks } from '../services/hooks/features/useTeamTasks'; +import TaskStatusPopup from './TaskStatusPopup'; +import { typography, useAppTheme } from '../theme'; +import { translate } from '../i18n'; +import { useTaskStatusValue } from './StatusType'; +import { limitTextCharaters } from '../helpers/sub-text'; interface TaskStatusProps { - task?: ITeamTask - containerStyle?: ViewStyle - statusTextSyle?: TextStyle - iconsOnly?: boolean - labelOnly?: boolean - status?: string - setStatus?: (status: string) => unknown + task?: ITeamTask; + containerStyle?: ViewStyle; + statusTextSyle?: TextStyle; + iconsOnly?: boolean; + labelOnly?: boolean; + status?: string; + setStatus?: (status: string) => unknown; + canCreateStatus?: boolean; } const TaskStatus: FC = observer( - ({ task, containerStyle, status, setStatus, iconsOnly, labelOnly }) => { - const { colors, dark } = useAppTheme() - const { updateTask } = useTeamTasks() - const [openModal, setOpenModal] = useState(false) + ({ task, containerStyle, status, setStatus, iconsOnly, labelOnly, canCreateStatus }) => { + const { colors, dark } = useAppTheme(); + const { updateTask } = useTeamTasks(); + const [openModal, setOpenModal] = useState(false); - const allStatuses = useTaskStatusValue() + const allStatuses = useTaskStatusValue(); const statusValue = ( - task?.status?.split("-").join(" ") || - (status && status.split("-").join(" ")) - )?.toLowerCase() + task?.status?.split('-').join(' ') || + (status && status.split('-').join(' ')) + )?.toLowerCase(); const statusItem = - allStatuses && - Object.values(allStatuses).find((item) => item?.name.toLowerCase() === statusValue) + allStatuses && Object.values(allStatuses).find((item) => item?.name.toLowerCase() === statusValue); const onChangeStatus = async (text: string) => { if (task) { const taskEdit = { ...task, - status: task?.status === text ? null : text, - } + status: task?.status === text ? null : text + }; - await updateTask(taskEdit, task.id) + await updateTask(taskEdit, task.id); } else { - setStatus(text) + setStatus(text); } - } + }; return ( <> @@ -58,6 +58,7 @@ const TaskStatus: FC = observer( visible={openModal} setSelectedStatus={(e) => onChangeStatus(e)} onDismiss={() => setOpenModal(false)} + canCreateStatus={canCreateStatus} /> setOpenModal(true)}> = observer( ...styles.container, borderWidth: iconsOnly ? 0 : 1, ...containerStyle, - backgroundColor: !dark ? "#F2F2F2" : colors.background, - borderColor: colors.border, + backgroundColor: !dark ? '#F2F2F2' : colors.background, + borderColor: colors.border }, - statusItem ? { backgroundColor: statusItem?.bgColor } : null, + statusItem ? { backgroundColor: statusItem?.bgColor } : null ]} > {statusItem ? ( - + {!labelOnly && statusItem.icon} {iconsOnly ? null : ( = observer( style={{ ...styles.text, marginLeft: labelOnly ? 0 : 11, - fontSize: labelOnly ? 8 : 10, + fontSize: labelOnly ? 8 : 10 }} > {limitTextCharaters({ text: statusItem?.name, - numChars: 11, + numChars: 11 })} )} @@ -96,40 +97,40 @@ const TaskStatus: FC = observer( {iconsOnly ? ( ) : ( - translate("settingScreen.statusScreen.statuses") + translate('settingScreen.statusScreen.statuses') )} )} - ) - }, -) + ); + } +); const styles = StyleSheet.create({ container: { - alignItems: "center", + alignItems: 'center', borderRadius: 10, - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', minHeight: 30, - paddingHorizontal: 8, + paddingHorizontal: 8 }, text: { fontFamily: typography.fonts.PlusJakartaSans.semiBold, fontSize: 10, - textTransform: "capitalize", + textTransform: 'capitalize' }, wrapStatus: { - alignItems: "center", - flexDirection: "row", - }, -}) + alignItems: 'center', + flexDirection: 'row' + } +}); -export default TaskStatus +export default TaskStatus; diff --git a/apps/mobile/app/components/TaskStatusPopup.tsx b/apps/mobile/app/components/TaskStatusPopup.tsx index 236277269..2caa183b9 100644 --- a/apps/mobile/app/components/TaskStatusPopup.tsx +++ b/apps/mobile/app/components/TaskStatusPopup.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-inline-styles */ /* eslint-disable react-native/no-color-literals */ -import React, { FC } from 'react'; +import React, { FC, useState } from 'react'; import { View, ViewStyle, @@ -12,19 +12,21 @@ import { TouchableOpacity, TouchableWithoutFeedback } from 'react-native'; -import { Feather, AntDesign } from '@expo/vector-icons'; +import { Feather, AntDesign, Ionicons } from '@expo/vector-icons'; import { useTaskStatus } from '../services/hooks/features/useTaskStatus'; import { ITaskStatusItem } from '../services/interfaces/ITaskStatus'; import { spacing, typography, useAppTheme } from '../theme'; import { translate } from '../i18n'; import { useTaskStatusValue } from './StatusType'; import { BlurView } from 'expo-blur'; +import TaskStatusForm from '../screens/Authenticated/TaskStatusScreen/components/TaskStatusForm'; export interface Props { visible: boolean; onDismiss: () => unknown; statusName: string; setSelectedStatus?: (status: string) => unknown; + canCreateStatus?: boolean; } const ModalPopUp = ({ visible, children, onDismiss }) => { @@ -70,9 +72,20 @@ const ModalPopUp = ({ visible, children, onDismiss }) => { ); }; -const TaskStatusPopup: FC = function FilterPopup({ visible, onDismiss, setSelectedStatus, statusName }) { +const TaskStatusPopup: FC = function FilterPopup({ + visible, + onDismiss, + setSelectedStatus, + statusName, + canCreateStatus +}) { const { allStatuses } = useTaskStatus(); - const { colors } = useAppTheme(); + const { colors, dark } = useAppTheme(); + + const [createStatusMode, setCreateStatusMode] = useState(false); + + const { createStatus, updateStatus } = useTaskStatus(); + const onStatusSelected = (status: string) => { setSelectedStatus(status); onDismiss(); @@ -80,20 +93,61 @@ const TaskStatusPopup: FC = function FilterPopup({ visible, onDismiss, se return ( - - - {translate('settingScreen.statusScreen.statuses')} - - ( - - )} - legacyImplementation={true} - showsVerticalScrollIndicator={true} - keyExtractor={(_, index) => index.toString()} - /> + + {!createStatusMode ? ( + <> + + {translate('settingScreen.statusScreen.statuses')} + + ( + + )} + legacyImplementation={true} + showsVerticalScrollIndicator={true} + keyExtractor={(_, index) => index.toString()} + /> + {canCreateStatus && ( + setCreateStatusMode(true)} + > + + + {translate('settingScreen.statusScreen.createNewStatusText')} + + + )} + + ) : ( + setCreateStatusMode(false)} + onCreateStatus={createStatus} + onUpdateStatus={updateStatus} + isEdit={false} + /> + )} ); @@ -139,6 +193,12 @@ const $modalBackGround: ViewStyle = { }; const styles = StyleSheet.create({ + btnText: { + color: '#3826A6', + fontFamily: typography.primary.semiBold, + fontSize: 16, + fontStyle: 'normal' + }, colorFrame: { alignItems: 'center', backgroundColor: '#D4EFDF', @@ -158,6 +218,18 @@ const styles = StyleSheet.create({ paddingVertical: 16, width: '90%' }, + createButton: { + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', + borderRadius: 12, + borderWidth: 2, + flexDirection: 'row', + justifyContent: 'center', + marginTop: 10, + padding: 12, + width: '80%' + }, text: { fontFamily: typography.primary.medium, fontSize: 14, diff --git a/apps/mobile/app/components/TaskVersion.tsx b/apps/mobile/app/components/TaskVersion.tsx index 1499727a0..dc1425534 100644 --- a/apps/mobile/app/components/TaskVersion.tsx +++ b/apps/mobile/app/components/TaskVersion.tsx @@ -1,50 +1,50 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useState } from "react" -import { TouchableOpacity, View, Text, StyleSheet, ViewStyle } from "react-native" -import { AntDesign, Entypo } from "@expo/vector-icons" -import { observer } from "mobx-react-lite" -import { ITeamTask } from "../services/interfaces/ITask" -import { useTeamTasks } from "../services/hooks/features/useTeamTasks" -import { typography, useAppTheme } from "../theme" -import { translate } from "../i18n" -import { useTaskVersionValue } from "./StatusType" -import { limitTextCharaters } from "../helpers/sub-text" -import TaskVersionPopup from "./TaskVersionPopup" +import React, { FC, useState } from 'react'; +import { TouchableOpacity, View, Text, StyleSheet, ViewStyle } from 'react-native'; +import { AntDesign, Entypo } from '@expo/vector-icons'; +import { observer } from 'mobx-react-lite'; +import { ITeamTask } from '../services/interfaces/ITask'; +import { useTeamTasks } from '../services/hooks/features/useTeamTasks'; +import { typography, useAppTheme } from '../theme'; +import { translate } from '../i18n'; +import { useTaskVersionValue } from './StatusType'; +import { limitTextCharaters } from '../helpers/sub-text'; +import TaskVersionPopup from './TaskVersionPopup'; interface TaskVersionProps { - task?: ITeamTask - containerStyle?: ViewStyle - version?: string - setVersion?: (priority: string) => unknown + task?: ITeamTask; + containerStyle?: ViewStyle; + version?: string; + setVersion?: (priority: string) => unknown; + canCreateVersion?: boolean; } const TaskVersion: FC = observer( - ({ task, containerStyle, version, setVersion }) => { - const { colors } = useAppTheme() - const { updateTask } = useTeamTasks() - const [openModal, setOpenModal] = useState(false) + ({ task, containerStyle, version, setVersion, canCreateVersion }) => { + const { colors } = useAppTheme(); + const { updateTask } = useTeamTasks(); + const [openModal, setOpenModal] = useState(false); - const allTaskVersions = useTaskVersionValue() + const allTaskVersions = useTaskVersionValue(); - const versionValue = (task?.version || (version && version))?.toLowerCase() + const versionValue = (task?.version || (version && version))?.toLowerCase(); const currentVersion = - allTaskVersions && - Object.values(allTaskVersions).find((item) => item.value.toLowerCase() === versionValue) + allTaskVersions && Object.values(allTaskVersions).find((item) => item.value.toLowerCase() === versionValue); const onChangeVersion = async (text: string) => { if (task) { const taskEdit = { ...task, - version: task?.version === text ? null : text, - } + version: task?.version === text ? null : text + }; - await updateTask(taskEdit, task.id) + await updateTask(taskEdit, task.id); } else { - setVersion(text) + setVersion(text); } - } + }; return ( <> @@ -53,6 +53,7 @@ const TaskVersion: FC = observer( visible={openModal} setSelectedVersion={(e) => onChangeVersion(e.value)} onDismiss={() => setOpenModal(false)} + canCreateVersion={canCreateVersion} /> setOpenModal(true)}> = observer( ...styles.container, ...containerStyle, borderColor: colors.border, - backgroundColor: colors.background, + backgroundColor: colors.background }} > {(task?.version || version) && currentVersion ? ( @@ -70,22 +71,20 @@ const TaskVersion: FC = observer( style={{ ...styles.text, marginLeft: 10, - color: colors.primary, + color: colors.primary }} > {limitTextCharaters({ text: currentVersion.name, - numChars: 15, + numChars: 15 })} ) : ( - - {translate("taskDetailsScreen.version")} + + {translate('taskDetailsScreen.version')} )} @@ -93,32 +92,32 @@ const TaskVersion: FC = observer( - ) - }, -) + ); + } +); const styles = StyleSheet.create({ container: { - alignItems: "center", - borderColor: "rgba(0,0,0,0.16)", + alignItems: 'center', + borderColor: 'rgba(0,0,0,0.16)', borderRadius: 10, borderWidth: 1, - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', minHeight: 30, minWidth: 100, - paddingHorizontal: 8, + paddingHorizontal: 8 }, text: { fontFamily: typography.fonts.PlusJakartaSans.semiBold, fontSize: 10, - textTransform: "capitalize", + textTransform: 'capitalize' }, wrapStatus: { - alignItems: "center", - flexDirection: "row", - width: "70%", - }, -}) + alignItems: 'center', + flexDirection: 'row', + width: '70%' + } +}); -export default TaskVersion +export default TaskVersion; diff --git a/apps/mobile/app/components/TaskVersionPopup.tsx b/apps/mobile/app/components/TaskVersionPopup.tsx index 3de99d19d..3c9798e26 100644 --- a/apps/mobile/app/components/TaskVersionPopup.tsx +++ b/apps/mobile/app/components/TaskVersionPopup.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-inline-styles */ /* eslint-disable react-native/no-color-literals */ -import React, { FC } from "react" +import React, { FC, useState } from 'react'; import { View, ViewStyle, @@ -10,22 +10,25 @@ import { Text, FlatList, TouchableOpacity, - TouchableWithoutFeedback, -} from "react-native" -import { Feather, AntDesign } from "@expo/vector-icons" -import { spacing, useAppTheme } from "../theme" -import { ITaskPriorityItem } from "../services/interfaces/ITaskPriority" + TouchableWithoutFeedback +} from 'react-native'; +import { Feather, AntDesign, Ionicons } from '@expo/vector-icons'; +import { spacing, useAppTheme, typography } from '../theme'; +import { ITaskPriorityItem } from '../services/interfaces/ITaskPriority'; // import { translate } from "../i18n" -import { BlurView } from "expo-blur" -import { useTaskVersion } from "../services/hooks/features/useTaskVersion" -import { BadgedTaskVersion } from "./VersionIcon" -import { ITaskVersionItemList } from "../services/interfaces/ITaskVersion" +import { BlurView } from 'expo-blur'; +import { useTaskVersion } from '../services/hooks/features/useTaskVersion'; +import { BadgedTaskVersion } from './VersionIcon'; +import { ITaskVersionItemList } from '../services/interfaces/ITaskVersion'; +import { translate } from '../i18n'; +import TaskVersionForm from '../screens/Authenticated/TaskVersionScreen/components/TaskVersionForm'; export interface Props { - visible: boolean - onDismiss: () => unknown - versionName: string - setSelectedVersion: (status: ITaskVersionItemList) => unknown + visible: boolean; + onDismiss: () => unknown; + versionName: string; + setSelectedVersion: (status: ITaskVersionItemList) => unknown; + canCreateVersion?: boolean; } const TaskVersionPopup: FC = function TaskPriorityPopup({ @@ -33,52 +36,96 @@ const TaskVersionPopup: FC = function TaskPriorityPopup({ onDismiss, setSelectedVersion, versionName, + canCreateVersion }) { - const { taskVersionList } = useTaskVersion() - const { colors } = useAppTheme() + const { taskVersionList } = useTaskVersion(); + const { colors, dark } = useAppTheme(); + const { createTaskVersion, updateTaskVersion } = useTaskVersion(); + + const [createVersionMode, setCreateVersionMode] = useState(false); + const onVersionSelected = (size: ITaskPriorityItem) => { - setSelectedVersion(size) - onDismiss() - } + setSelectedVersion(size); + onDismiss(); + setCreateVersionMode(false); + }; return ( - - Versions - ( - + {!createVersionMode ? ( + <> + Versions + ( + + )} + legacyImplementation={true} + showsVerticalScrollIndicator={true} + keyExtractor={(_, index) => index.toString()} /> - )} - legacyImplementation={true} - showsVerticalScrollIndicator={true} - keyExtractor={(_, index) => index.toString()} - /> + {canCreateVersion && ( + setCreateVersionMode(true)} + > + + + {translate('settingScreen.versionScreen.createNewVersionText')} + + + )} + + ) : ( + setCreateVersionMode(false)} + onCreateVersion={createTaskVersion} + onUpdateVersion={updateTaskVersion} + isEdit={false} + createVersionModal={true} + /> + )} - ) -} + ); +}; -export default TaskVersionPopup +export default TaskVersionPopup; interface ItemProps { - currentVersionName: string - version: ITaskPriorityItem - onVersionSelected: (size: ITaskPriorityItem) => unknown + currentVersionName: string; + version: ITaskPriorityItem; + onVersionSelected: (size: ITaskPriorityItem) => unknown; } const Item: FC = ({ currentVersionName, version, onVersionSelected }) => { - const { colors } = useAppTheme() - const selected = version.value === currentVersionName + const { colors } = useAppTheme(); + const selected = version.value === currentVersionName; return ( onVersionSelected(version)}> - + @@ -90,91 +137,107 @@ const Item: FC = ({ currentVersionName, version, onVersionSelected }) - ) -} + ); +}; const ModalPopUp = ({ visible, children, onDismiss }) => { - const [showModal, setShowModal] = React.useState(visible) - const scaleValue = React.useRef(new Animated.Value(0)).current + const [showModal, setShowModal] = React.useState(visible); + const scaleValue = React.useRef(new Animated.Value(0)).current; React.useEffect(() => { - toggleModal() - }, [visible]) + toggleModal(); + }, [visible]); const toggleModal = () => { if (visible) { - setShowModal(true) + setShowModal(true); Animated.spring(scaleValue, { toValue: 1, - useNativeDriver: true, - }).start() + useNativeDriver: true + }).start(); } else { - setTimeout(() => setShowModal(false), 200) + setTimeout(() => setShowModal(false), 200); Animated.timing(scaleValue, { toValue: 0, duration: 300, - useNativeDriver: true, - }).start() + useNativeDriver: true + }).start(); } - } + }; return ( onDismiss()}> - - {children} - + {children} - ) -} + ); +}; const $modalBackGround: ViewStyle = { flex: 1, - justifyContent: "center", -} + justifyContent: 'center' +}; const styles = StyleSheet.create({ + btnText: { + color: '#3826A6', + fontFamily: typography.primary.semiBold, + fontSize: 16, + fontStyle: 'normal' + }, colorFrame: { borderRadius: 10, height: 44, - justifyContent: "center", + justifyContent: 'center', paddingLeft: 16, - width: 180, + width: 180 }, container: { - alignSelf: "center", - backgroundColor: "#fff", + alignSelf: 'center', + backgroundColor: '#fff', borderRadius: 20, maxHeight: 396, paddingHorizontal: 6, paddingVertical: 16, - width: "90%", + width: '90%' + }, + createButton: { + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', + borderRadius: 12, + borderWidth: 2, + flexDirection: 'row', + justifyContent: 'center', + marginTop: 10, + padding: 12, + width: '80%' }, title: { fontSize: spacing.medium - 2, marginBottom: 16, - marginHorizontal: 10, + marginHorizontal: 10 }, wrapperItem: { - alignItems: "center", - borderColor: "rgba(0,0,0,0.13)", + alignItems: 'center', + borderColor: 'rgba(0,0,0,0.13)', borderRadius: 10, borderWidth: 1, - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', marginBottom: 10, padding: 6, paddingRight: 18, - width: "100%", - }, -}) + width: '100%' + } +}); diff --git a/apps/mobile/app/screens/Authenticated/TaskVersionScreen/components/TaskVersionForm.tsx b/apps/mobile/app/screens/Authenticated/TaskVersionScreen/components/TaskVersionForm.tsx index b3fa3cf6c..591b4080f 100644 --- a/apps/mobile/app/screens/Authenticated/TaskVersionScreen/components/TaskVersionForm.tsx +++ b/apps/mobile/app/screens/Authenticated/TaskVersionScreen/components/TaskVersionForm.tsx @@ -1,14 +1,11 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { useEffect, useState } from "react" -import { View, Text, TouchableOpacity, TextInput, StyleSheet, Keyboard } from "react-native" -import { translate } from "../../../../i18n" -import { typography, useAppTheme } from "../../../../theme" +import React, { useEffect, useState } from 'react'; +import { View, Text, TouchableOpacity, TextInput, StyleSheet, Keyboard } from 'react-native'; +import { translate } from '../../../../i18n'; +import { typography, useAppTheme } from '../../../../theme'; -import { - ITaskVersionCreate, - ITaskVersionItemList, -} from "../../../../services/interfaces/ITaskVersion" +import { ITaskVersionCreate, ITaskVersionItemList } from '../../../../services/interfaces/ITaskVersion'; const TaskVersionForm = ({ isEdit, @@ -16,43 +13,45 @@ const TaskVersionForm = ({ item, onCreateVersion, onUpdateVersion, + createVersionModal }: { - isEdit: boolean - onDismiss: () => unknown - item?: ITaskVersionItemList - onUpdateVersion: (id: string, data: ITaskVersionCreate) => unknown - onCreateVersion: (data: ITaskVersionCreate) => unknown + isEdit: boolean; + onDismiss: () => unknown; + item?: ITaskVersionItemList; + onUpdateVersion: (id: string, data: ITaskVersionCreate) => unknown; + onCreateVersion: (data: ITaskVersionCreate) => unknown; + createVersionModal?: boolean; }) => { - const { colors, dark } = useAppTheme() - const [versionName, setVersionName] = useState(null) + const { colors, dark } = useAppTheme(); + const [versionName, setVersionName] = useState(null); useEffect(() => { if (isEdit) { - setVersionName(item.name) + setVersionName(item.name); } else { - setVersionName(null) + setVersionName(null); } - }, [item, isEdit]) + }, [item, isEdit]); const handleSubmit = async () => { if (versionName.trim().length <= 0) { - return + return; } if (isEdit) { await onUpdateVersion(item?.id, { - name: versionName, - }) + name: versionName + }); } else { await onCreateVersion({ name: versionName, - color: "#FFFFFF", - }) + color: '#FFFFFF' + }); } - setVersionName(null) - onDismiss() - } + setVersionName(null); + onDismiss(); + }; return ( - {translate("settingScreen.versionScreen.createNewVersionText")} + {translate('settingScreen.versionScreen.createNewVersionText')} setVersionName(text)} /> - + { - onDismiss() - Keyboard.dismiss() + onDismiss(); + Keyboard.dismiss(); }} > - - {translate("settingScreen.versionScreen.cancelButtonText")} - + {translate('settingScreen.versionScreen.cancelButtonText')} { if (versionName) { - handleSubmit().finally(() => Keyboard.dismiss()) + handleSubmit().finally(() => Keyboard.dismiss()); } }} > {isEdit - ? translate("settingScreen.versionScreen.updateButtonText") - : translate("settingScreen.versionScreen.createButtonText")} + ? translate('settingScreen.versionScreen.updateButtonText') + : translate('settingScreen.versionScreen.createButtonText')} - ) -} + ); +}; -export default TaskVersionForm +export default TaskVersionForm; const styles = StyleSheet.create({ cancelBtn: { - alignItems: "center", - backgroundColor: "#E6E6E9", + alignItems: 'center', + backgroundColor: '#E6E6E9', borderRadius: 12, height: 57, - justifyContent: "center", - width: "48%", + justifyContent: 'center', + width: '48%' }, cancelTxt: { - color: "#1A1C1E", + color: '#1A1C1E', fontFamily: typography.primary.semiBold, - fontSize: 18, + fontSize: 18 }, createBtn: { - alignItems: "center", - backgroundColor: "#3826A6", + alignItems: 'center', + backgroundColor: '#3826A6', borderRadius: 12, height: 57, - justifyContent: "center", - width: "48%", + justifyContent: 'center', + width: '48%' }, createTxt: { - color: "#FFF", + color: '#FFF', fontFamily: typography.primary.semiBold, - fontSize: 18, + fontSize: 18 }, formTitle: { - color: "#1A1C1E", + color: '#1A1C1E', fontFamily: typography.primary.semiBold, - fontSize: 24, + fontSize: 24 }, versionNameInput: { - alignItems: "center", - borderColor: "#DCE4E8", + alignItems: 'center', + borderColor: '#DCE4E8', borderRadius: 12, borderWidth: 1, height: 57, marginTop: 16, paddingHorizontal: 18, - width: "100%", + width: '100%' }, wrapButtons: { - flexDirection: "row", - justifyContent: "space-between", - marginTop: 40, - width: "100%", - }, -}) + flexDirection: 'row', + justifyContent: 'space-between', + width: '100%' + } +}); diff --git a/apps/mobile/app/services/client/requests/features/smtp.ts b/apps/mobile/app/services/client/requests/features/smtp.ts index 4442f4fd3..21c7e9ace 100644 --- a/apps/mobile/app/services/client/requests/features/smtp.ts +++ b/apps/mobile/app/services/client/requests/features/smtp.ts @@ -7,7 +7,7 @@ export const smtpConfiguration: () => I_SMTPRequest = () => ({ fromAddress: SMTP_FROM_ADDRESS || '', host: SMTP_HOST || '', port: parseInt(SMTP_PORT, 10) || 0, - secure: SMTP_SECURE === 'true' ? true : false, + secure: SMTP_SECURE === 'true', username: SMTP_USERNAME || '', password: SMTP_PASSWORD || '' }); diff --git a/apps/mobile/app/utils/crashReporting.ts b/apps/mobile/app/utils/crashReporting.ts index da8d580d3..4a29877a8 100644 --- a/apps/mobile/app/utils/crashReporting.ts +++ b/apps/mobile/app/utils/crashReporting.ts @@ -26,7 +26,7 @@ export const initCrashReporting = () => { process.env.EXPO_PUBLIC_SENTRY_DSN && Sentry.init({ dsn: process.env.EXPO_PUBLIC_SENTRY_DSN, - enableInExpoDevelopment: true, + enableInExpoDevelopment: false, debug: __DEV__ // If `true`, Sentry will try to print out useful debugging information if something goes wrong with sending the event. Set it to `false` in production }); // Bugsnag.start("YOUR API KEY") diff --git a/apps/mobile/assets/images/app-icon-all.png b/apps/mobile/assets/images/app-icon-all.png index eeb64c0b7..8acfec1f2 100644 Binary files a/apps/mobile/assets/images/app-icon-all.png and b/apps/mobile/assets/images/app-icon-all.png differ diff --git a/apps/mobile/assets/images/app-icon-all@2x.png b/apps/mobile/assets/images/app-icon-all@2x.png new file mode 100644 index 000000000..c7235a7e8 Binary files /dev/null and b/apps/mobile/assets/images/app-icon-all@2x.png differ diff --git a/apps/mobile/assets/images/app-icon-all@3x.png b/apps/mobile/assets/images/app-icon-all@3x.png new file mode 100644 index 000000000..44cd5327b Binary files /dev/null and b/apps/mobile/assets/images/app-icon-all@3x.png differ diff --git a/apps/mobile/assets/images/app-icon-android-adaptive-foreground.png b/apps/mobile/assets/images/app-icon-android-adaptive-foreground.png index b367f18f1..70daa13f5 100644 Binary files a/apps/mobile/assets/images/app-icon-android-adaptive-foreground.png and b/apps/mobile/assets/images/app-icon-android-adaptive-foreground.png differ diff --git a/apps/mobile/assets/images/app-icon-android-adaptive-foreground@2x.png b/apps/mobile/assets/images/app-icon-android-adaptive-foreground@2x.png new file mode 100644 index 000000000..c82b1359c Binary files /dev/null and b/apps/mobile/assets/images/app-icon-android-adaptive-foreground@2x.png differ diff --git a/apps/mobile/assets/images/app-icon-android-adaptive-foreground@3x.png b/apps/mobile/assets/images/app-icon-android-adaptive-foreground@3x.png new file mode 100644 index 000000000..b4428aad9 Binary files /dev/null and b/apps/mobile/assets/images/app-icon-android-adaptive-foreground@3x.png differ diff --git a/apps/mobile/assets/images/app-icon-android-legacy-ever-teams.png b/apps/mobile/assets/images/app-icon-android-legacy-ever-teams.png index e6000e827..70daa13f5 100644 Binary files a/apps/mobile/assets/images/app-icon-android-legacy-ever-teams.png and b/apps/mobile/assets/images/app-icon-android-legacy-ever-teams.png differ diff --git a/apps/mobile/assets/images/app-icon-android-legacy-ever-teams@2x.png b/apps/mobile/assets/images/app-icon-android-legacy-ever-teams@2x.png new file mode 100644 index 000000000..c82b1359c Binary files /dev/null and b/apps/mobile/assets/images/app-icon-android-legacy-ever-teams@2x.png differ diff --git a/apps/mobile/assets/images/app-icon-android-legacy-ever-teams@3x.png b/apps/mobile/assets/images/app-icon-android-legacy-ever-teams@3x.png new file mode 100644 index 000000000..b4428aad9 Binary files /dev/null and b/apps/mobile/assets/images/app-icon-android-legacy-ever-teams@3x.png differ diff --git a/apps/mobile/assets/images/app-icon-android-legacy.png b/apps/mobile/assets/images/app-icon-android-legacy.png index eeb64c0b7..8acfec1f2 100644 Binary files a/apps/mobile/assets/images/app-icon-android-legacy.png and b/apps/mobile/assets/images/app-icon-android-legacy.png differ diff --git a/apps/mobile/assets/images/app-icon-android-legacy@2x.png b/apps/mobile/assets/images/app-icon-android-legacy@2x.png new file mode 100644 index 000000000..c7235a7e8 Binary files /dev/null and b/apps/mobile/assets/images/app-icon-android-legacy@2x.png differ diff --git a/apps/mobile/assets/images/app-icon-android-legacy@3x.png b/apps/mobile/assets/images/app-icon-android-legacy@3x.png new file mode 100644 index 000000000..44cd5327b Binary files /dev/null and b/apps/mobile/assets/images/app-icon-android-legacy@3x.png differ diff --git a/apps/mobile/assets/images/app-icon-ios-ever-teams.png b/apps/mobile/assets/images/app-icon-ios-ever-teams.png index 3eb708672..8acfec1f2 100644 Binary files a/apps/mobile/assets/images/app-icon-ios-ever-teams.png and b/apps/mobile/assets/images/app-icon-ios-ever-teams.png differ diff --git a/apps/mobile/assets/images/app-icon-ios-ever-teams@2x.png b/apps/mobile/assets/images/app-icon-ios-ever-teams@2x.png new file mode 100644 index 000000000..c7235a7e8 Binary files /dev/null and b/apps/mobile/assets/images/app-icon-ios-ever-teams@2x.png differ diff --git a/apps/mobile/assets/images/app-icon-ios-ever-teams@3x.png b/apps/mobile/assets/images/app-icon-ios-ever-teams@3x.png new file mode 100644 index 000000000..44cd5327b Binary files /dev/null and b/apps/mobile/assets/images/app-icon-ios-ever-teams@3x.png differ diff --git a/apps/mobile/assets/images/app-icon-ios.png b/apps/mobile/assets/images/app-icon-ios.png index eeb64c0b7..8acfec1f2 100644 Binary files a/apps/mobile/assets/images/app-icon-ios.png and b/apps/mobile/assets/images/app-icon-ios.png differ diff --git a/apps/mobile/assets/images/app-icon-ios@2x.png b/apps/mobile/assets/images/app-icon-ios@2x.png new file mode 100644 index 000000000..c7235a7e8 Binary files /dev/null and b/apps/mobile/assets/images/app-icon-ios@2x.png differ diff --git a/apps/mobile/assets/images/app-icon-ios@3x.png b/apps/mobile/assets/images/app-icon-ios@3x.png new file mode 100644 index 000000000..44cd5327b Binary files /dev/null and b/apps/mobile/assets/images/app-icon-ios@3x.png differ diff --git a/apps/mobile/ios/.gitignore b/apps/mobile/ios/.gitignore deleted file mode 100644 index 8beb34430..000000000 --- a/apps/mobile/ios/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace -.xcode.env.local - -# Bundle artifacts -*.jsbundle - -# CocoaPods -/Pods/ diff --git a/apps/mobile/ios/.xcode.env b/apps/mobile/ios/.xcode.env deleted file mode 100644 index 3d5782c71..000000000 --- a/apps/mobile/ios/.xcode.env +++ /dev/null @@ -1,11 +0,0 @@ -# This `.xcode.env` file is versioned and is used to source the environment -# used when running script phases inside Xcode. -# To customize your local environment, you can create an `.xcode.env.local` -# file that is not versioned. - -# NODE_BINARY variable contains the PATH to the node executable. -# -# Customize the NODE_BINARY variable here. -# For example, to use nvm with brew, add the following line -# . "$(brew --prefix nvm)/nvm.sh" --no-use -export NODE_BINARY=$(command -v node) diff --git a/apps/mobile/ios/GauzyTeams.xcodeproj/project.pbxproj b/apps/mobile/ios/GauzyTeams.xcodeproj/project.pbxproj deleted file mode 100644 index 24235ea30..000000000 --- a/apps/mobile/ios/GauzyTeams.xcodeproj/project.pbxproj +++ /dev/null @@ -1,557 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; - 96905EF65AED1B983A6B3ABC /* libPods-GauzyTeams.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-GauzyTeams.a */; }; - AE62F3E047214D44B138C626 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4E4E65F3D2479C94C80D4F /* noop-file.swift */; }; - B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; }; - BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; - 13B07F961A680F5B00A75B9A /* GauzyTeams.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GauzyTeams.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = GauzyTeams/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = GauzyTeams/AppDelegate.mm; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = GauzyTeams/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = GauzyTeams/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = GauzyTeams/main.m; sourceTree = ""; }; - 1F4E4E65F3D2479C94C80D4F /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "GauzyTeams/noop-file.swift"; sourceTree = ""; }; - 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-GauzyTeams.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-GauzyTeams.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 6C2E3173556A471DD304B334 /* Pods-GauzyTeams.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GauzyTeams.debug.xcconfig"; path = "Target Support Files/Pods-GauzyTeams/Pods-GauzyTeams.debug.xcconfig"; sourceTree = ""; }; - 7A4D352CD337FB3A3BF06240 /* Pods-GauzyTeams.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GauzyTeams.release.xcconfig"; path = "Target Support Files/Pods-GauzyTeams/Pods-GauzyTeams.release.xcconfig"; sourceTree = ""; }; - AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = GauzyTeams/SplashScreen.storyboard; sourceTree = ""; }; - BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; - ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; - FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-GauzyTeams/ExpoModulesProvider.swift"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 96905EF65AED1B983A6B3ABC /* libPods-GauzyTeams.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 13B07FAE1A68108700A75B9A /* GauzyTeams */ = { - isa = PBXGroup; - children = ( - BB2F792B24A3F905000567C9 /* Supporting */, - 008F07F21AC5B25A0029DE68 /* main.jsbundle */, - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.mm */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB71A68108700A75B9A /* main.m */, - AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, - 1F4E4E65F3D2479C94C80D4F /* noop-file.swift */, - ); - name = GauzyTeams; - sourceTree = ""; - }; - 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { - isa = PBXGroup; - children = ( - ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-GauzyTeams.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - ); - name = Libraries; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 13B07FAE1A68108700A75B9A /* GauzyTeams */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 83CBBA001A601CBA00E9B192 /* Products */, - 2D16E6871FA4F8E400B85C8A /* Frameworks */, - D65327D7A22EEC0BE12398D9 /* Pods */, - D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - usesTabs = 0; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* GauzyTeams.app */, - ); - name = Products; - sourceTree = ""; - }; - 92DBD88DE9BF7D494EA9DA96 /* GauzyTeams */ = { - isa = PBXGroup; - children = ( - FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */, - ); - name = GauzyTeams; - sourceTree = ""; - }; - BB2F792B24A3F905000567C9 /* Supporting */ = { - isa = PBXGroup; - children = ( - BB2F792C24A3F905000567C9 /* Expo.plist */, - ); - name = Supporting; - path = GauzyTeams/Supporting; - sourceTree = ""; - }; - D65327D7A22EEC0BE12398D9 /* Pods */ = { - isa = PBXGroup; - children = ( - 6C2E3173556A471DD304B334 /* Pods-GauzyTeams.debug.xcconfig */, - 7A4D352CD337FB3A3BF06240 /* Pods-GauzyTeams.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = { - isa = PBXGroup; - children = ( - 92DBD88DE9BF7D494EA9DA96 /* GauzyTeams */, - ); - name = ExpoModulesProviders; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 13B07F861A680F5B00A75B9A /* GauzyTeams */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "GauzyTeams" */; - buildPhases = ( - 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, - FD10A7F022414F080027D42C /* Start Packager */, - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, - 2DB642FCD18DB7E696FADA46 /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = GauzyTeams; - productName = GauzyTeams; - productReference = 13B07F961A680F5B00A75B9A /* GauzyTeams.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1130; - TargetAttributes = { - 13B07F861A680F5B00A75B9A = { - LastSwiftMigration = 1250; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "GauzyTeams" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* GauzyTeams */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BB2F792D24A3F905000567C9 /* Expo.plist in Resources */, - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" $PROJECT_ROOT ios relative | tail -n 1)\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; - }; - 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-GauzyTeams-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 2DB642FCD18DB7E696FADA46 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-GauzyTeams/Pods-GauzyTeams-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-GauzyTeams/Pods-GauzyTeams-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-GauzyTeams/Pods-GauzyTeams-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXUpdates/EXUpdates.bundle", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Feather.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXUpdates.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Feather.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Brands.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Regular.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Solid.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Fontisto.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialCommunityIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-GauzyTeams/Pods-GauzyTeams-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - FD10A7F022414F080027D42C /* Start Packager */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Start Packager"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\nexport RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/.packager.env'\"`\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/launchPackager.command'\"` || echo \"Can't start packager automatically\"\n fi\nfi\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */, - AE62F3E047214D44B138C626 /* noop-file.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-GauzyTeams.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = GauzyTeams/GauzyTeams.entitlements; - CURRENT_PROJECT_VERSION = 1; - ENABLE_BITCODE = NO; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "FB_SONARKIT_ENABLED=1", - ); - INFOPLIST_FILE = GauzyTeams/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; - PRODUCT_BUNDLE_IDENTIFIER = co.ever.teams; - PRODUCT_NAME = GauzyTeams; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-GauzyTeams.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = GauzyTeams/GauzyTeams.entitlements; - CURRENT_PROJECT_VERSION = 1; - INFOPLIST_FILE = GauzyTeams/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; - PRODUCT_BUNDLE_IDENTIFIER = co.ever.teams; - PRODUCT_NAME = GauzyTeams; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++17"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION, - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; - LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = ( - "$(inherited)", - " ", - ); - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++17"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION, - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; - LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "$(inherited)", - " ", - ); - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "GauzyTeams" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "GauzyTeams" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/apps/mobile/ios/GauzyTeams.xcodeproj/xcshareddata/xcschemes/GauzyTeams.xcscheme b/apps/mobile/ios/GauzyTeams.xcodeproj/xcshareddata/xcschemes/GauzyTeams.xcscheme deleted file mode 100644 index f553476dc..000000000 --- a/apps/mobile/ios/GauzyTeams.xcodeproj/xcshareddata/xcschemes/GauzyTeams.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/mobile/ios/GauzyTeams.xcworkspace/contents.xcworkspacedata b/apps/mobile/ios/GauzyTeams.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 60d97910b..000000000 --- a/apps/mobile/ios/GauzyTeams.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/apps/mobile/ios/GauzyTeams/AppDelegate.h b/apps/mobile/ios/GauzyTeams/AppDelegate.h deleted file mode 100644 index 1658a437e..000000000 --- a/apps/mobile/ios/GauzyTeams/AppDelegate.h +++ /dev/null @@ -1,7 +0,0 @@ -#import -#import -#import - -@interface AppDelegate : EXAppDelegateWrapper - -@end diff --git a/apps/mobile/ios/GauzyTeams/AppDelegate.mm b/apps/mobile/ios/GauzyTeams/AppDelegate.mm deleted file mode 100644 index 8cb5aef13..000000000 --- a/apps/mobile/ios/GauzyTeams/AppDelegate.mm +++ /dev/null @@ -1,67 +0,0 @@ -#import "AppDelegate.h" - -#import -#import - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.moduleName = @"main"; - - // You can add your custom initial props in the dictionary below. - // They will be passed down to the ViewController used by React Native. - self.initialProps = @{}; - - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge -{ -#if DEBUG - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; -#else - return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; -#endif -} - -/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. -/// -/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html -/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). -/// @return: `true` if the `concurrentRoot` feature is enabled. Otherwise, it returns `false`. -- (BOOL)concurrentRootEnabled -{ - return true; -} - -// Linking API -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { - return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]; -} - -// Universal Links -- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler { - BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; - return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken -{ - return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error -{ - return [super application:application didFailToRegisterForRemoteNotificationsWithError:error]; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler -{ - return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; -} - -@end diff --git a/apps/mobile/ios/GauzyTeams/GauzyTeams.entitlements b/apps/mobile/ios/GauzyTeams/GauzyTeams.entitlements deleted file mode 100644 index 018a6e20c..000000000 --- a/apps/mobile/ios/GauzyTeams/GauzyTeams.entitlements +++ /dev/null @@ -1,8 +0,0 @@ - - - - - aps-environment - development - - \ No newline at end of file diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png deleted file mode 100644 index e89dcc53d..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png deleted file mode 100644 index bfd090f71..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png deleted file mode 100644 index fd36b4aed..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png deleted file mode 100644 index f53220eff..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png deleted file mode 100644 index c54a2aef1..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png deleted file mode 100644 index 595bbbf97..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png deleted file mode 100644 index bfd090f71..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png deleted file mode 100644 index 3674826cf..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png deleted file mode 100644 index 9f500cd6a..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png deleted file mode 100644 index 9f500cd6a..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png deleted file mode 100644 index 31f1d88d7..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png deleted file mode 100644 index 6ceba47eb..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png deleted file mode 100644 index 8f27045a5..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png deleted file mode 100644 index aa10ea757..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/Contents.json b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index f920cb0ec..000000000 --- a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "images": [ - { - "idiom": "iphone", - "size": "20x20", - "scale": "2x", - "filename": "App-Icon-20x20@2x.png" - }, - { - "idiom": "iphone", - "size": "20x20", - "scale": "3x", - "filename": "App-Icon-20x20@3x.png" - }, - { - "idiom": "iphone", - "size": "29x29", - "scale": "1x", - "filename": "App-Icon-29x29@1x.png" - }, - { - "idiom": "iphone", - "size": "29x29", - "scale": "2x", - "filename": "App-Icon-29x29@2x.png" - }, - { - "idiom": "iphone", - "size": "29x29", - "scale": "3x", - "filename": "App-Icon-29x29@3x.png" - }, - { - "idiom": "iphone", - "size": "40x40", - "scale": "2x", - "filename": "App-Icon-40x40@2x.png" - }, - { - "idiom": "iphone", - "size": "40x40", - "scale": "3x", - "filename": "App-Icon-40x40@3x.png" - }, - { - "idiom": "iphone", - "size": "60x60", - "scale": "2x", - "filename": "App-Icon-60x60@2x.png" - }, - { - "idiom": "iphone", - "size": "60x60", - "scale": "3x", - "filename": "App-Icon-60x60@3x.png" - }, - { - "idiom": "ipad", - "size": "20x20", - "scale": "1x", - "filename": "App-Icon-20x20@1x.png" - }, - { - "idiom": "ipad", - "size": "20x20", - "scale": "2x", - "filename": "App-Icon-20x20@2x.png" - }, - { - "idiom": "ipad", - "size": "29x29", - "scale": "1x", - "filename": "App-Icon-29x29@1x.png" - }, - { - "idiom": "ipad", - "size": "29x29", - "scale": "2x", - "filename": "App-Icon-29x29@2x.png" - }, - { - "idiom": "ipad", - "size": "40x40", - "scale": "1x", - "filename": "App-Icon-40x40@1x.png" - }, - { - "idiom": "ipad", - "size": "40x40", - "scale": "2x", - "filename": "App-Icon-40x40@2x.png" - }, - { - "idiom": "ipad", - "size": "76x76", - "scale": "1x", - "filename": "App-Icon-76x76@1x.png" - }, - { - "idiom": "ipad", - "size": "76x76", - "scale": "2x", - "filename": "App-Icon-76x76@2x.png" - }, - { - "idiom": "ipad", - "size": "83.5x83.5", - "scale": "2x", - "filename": "App-Icon-83.5x83.5@2x.png" - }, - { - "idiom": "ios-marketing", - "size": "1024x1024", - "scale": "1x", - "filename": "ItunesArtwork@2x.png" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png deleted file mode 100644 index 3e67e11eb..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/Contents.json b/apps/mobile/ios/GauzyTeams/Images.xcassets/Contents.json deleted file mode 100644 index ed285c2e5..000000000 --- a/apps/mobile/ios/GauzyTeams/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "expo" - } -} diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreen.imageset/Contents.json b/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreen.imageset/Contents.json deleted file mode 100644 index 24e14594e..000000000 --- a/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreen.imageset/Contents.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "images": [ - { - "idiom": "universal", - "filename": "image.png", - "scale": "1x" - }, - { - "idiom": "universal", - "scale": "2x" - }, - { - "idiom": "universal", - "scale": "3x" - }, - { - "idiom": "ipad", - "filename": "tablet_image.png", - "scale": "1x" - }, - { - "idiom": "ipad", - "scale": "2x" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreen.imageset/image.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreen.imageset/image.png deleted file mode 100644 index bf867e754..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreen.imageset/image.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreen.imageset/tablet_image.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreen.imageset/tablet_image.png deleted file mode 100644 index 064f05b7d..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreen.imageset/tablet_image.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreenBackground.imageset/Contents.json b/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreenBackground.imageset/Contents.json deleted file mode 100644 index 3cf848977..000000000 --- a/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreenBackground.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images": [ - { - "idiom": "universal", - "filename": "image.png", - "scale": "1x" - }, - { - "idiom": "universal", - "scale": "2x" - }, - { - "idiom": "universal", - "scale": "3x" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreenBackground.imageset/image.png b/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreenBackground.imageset/image.png deleted file mode 100644 index 33ddf20bb..000000000 Binary files a/apps/mobile/ios/GauzyTeams/Images.xcassets/SplashScreenBackground.imageset/image.png and /dev/null differ diff --git a/apps/mobile/ios/GauzyTeams/Info.plist b/apps/mobile/ios/GauzyTeams/Info.plist deleted file mode 100644 index 117c006db..000000000 --- a/apps/mobile/ios/GauzyTeams/Info.plist +++ /dev/null @@ -1,86 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Ever Teams - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 0.1.0 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleURLSchemes - - co.ever.teams - - - - CFBundleVersion - 11 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - - - NSCameraUsageDescription - This app uses the camera to scan barcodes on event tickets. - NSMicrophoneUsageDescription - Allow $(PRODUCT_NAME) to access your microphone - NSPhotoLibraryAddUsageDescription - Allow $(PRODUCT_NAME) to save photos. - NSPhotoLibraryUsageDescription - Allow $(PRODUCT_NAME) to access your photos. - UILaunchStoryboardName - SplashScreen - UIRequiredDeviceCapabilities - - armv7 - - UIRequiresFullScreen - - UIStatusBarStyle - UIStatusBarStyleDefault - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIUserInterfaceStyle - Light - UIViewControllerBasedStatusBarAppearance - - ITSAppUsesNonExemptEncryption - - - diff --git a/apps/mobile/ios/GauzyTeams/SplashScreen.storyboard b/apps/mobile/ios/GauzyTeams/SplashScreen.storyboard deleted file mode 100644 index 6d90916e7..000000000 --- a/apps/mobile/ios/GauzyTeams/SplashScreen.storyboard +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/mobile/ios/GauzyTeams/Supporting/Expo.plist b/apps/mobile/ios/GauzyTeams/Supporting/Expo.plist deleted file mode 100644 index 1b1bfc440..000000000 --- a/apps/mobile/ios/GauzyTeams/Supporting/Expo.plist +++ /dev/null @@ -1,16 +0,0 @@ - - - - - EXUpdatesCheckOnLaunch - ALWAYS - EXUpdatesEnabled - - EXUpdatesLaunchWaitMs - 0 - EXUpdatesRuntimeVersion - exposdk:48.0.0 - EXUpdatesURL - https://u.expo.dev/2ff924e4-7a91-4b23-9db9-7453a8063bb0 - - \ No newline at end of file diff --git a/apps/mobile/ios/GauzyTeams/main.m b/apps/mobile/ios/GauzyTeams/main.m deleted file mode 100644 index 25181b6cc..000000000 --- a/apps/mobile/ios/GauzyTeams/main.m +++ /dev/null @@ -1,10 +0,0 @@ -#import - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} - diff --git a/apps/mobile/ios/GauzyTeams/noop-file.swift b/apps/mobile/ios/GauzyTeams/noop-file.swift deleted file mode 100644 index b2ffafbfc..000000000 --- a/apps/mobile/ios/GauzyTeams/noop-file.swift +++ /dev/null @@ -1,4 +0,0 @@ -// -// @generated -// A blank Swift file must be created for native modules with Swift files to work correctly. -// diff --git a/apps/mobile/ios/Podfile b/apps/mobile/ios/Podfile deleted file mode 100644 index c0b68ae7e..000000000 --- a/apps/mobile/ios/Podfile +++ /dev/null @@ -1,89 +0,0 @@ -require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") -require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") -require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules") - -require 'json' -podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {} - -ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0' - -platform :ios, podfile_properties['ios.deploymentTarget'] || '13.0' -install! 'cocoapods', - :deterministic_uuids => false - -prepare_react_native_project! - -# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. -# because `react-native-flipper` depends on (FlipperKit,...), which will be excluded. To fix this, -# you can also exclude `react-native-flipper` in `react-native.config.js` -# -# ```js -# module.exports = { -# dependencies: { -# ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), -# } -# } -# ``` -flipper_config = FlipperConfiguration.disabled -if ENV['NO_FLIPPER'] == '1' then - # Explicitly disabled through environment variables - flipper_config = FlipperConfiguration.disabled -elsif podfile_properties.key?('ios.flipper') then - # Configure Flipper in Podfile.properties.json - if podfile_properties['ios.flipper'] == 'true' then - flipper_config = FlipperConfiguration.enabled(["Debug", "Release"]) - elsif podfile_properties['ios.flipper'] != 'false' then - flipper_config = FlipperConfiguration.enabled(["Debug", "Release"], { 'Flipper' => podfile_properties['ios.flipper'] }) - end -end - -target 'GauzyTeams' do - use_expo_modules! - config = use_native_modules! - - use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] - use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] - - # Flags change depending on the env values. - flags = get_default_flags() - - use_react_native!( - :path => config[:reactNativePath], - :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', - :fabric_enabled => flags[:fabric_enabled], - # An absolute path to your application root. - :app_path => "#{Pod::Config.instance.installation_root}/..", - # Note that if you have use_frameworks! enabled, Flipper will not work if enabled - :flipper_configuration => flipper_config - ) - - post_install do |installer| - react_native_post_install( - installer, - config[:reactNativePath], - # Set `mac_catalyst_enabled` to `true` in order to apply patches - # necessary for Mac Catalyst builds - :mac_catalyst_enabled => false - ) - __apply_Xcode_12_5_M1_post_install_workaround(installer) - - # This is necessary for Xcode 14, because it signs resource bundles by default - # when building for devices. - installer.target_installation_results.pod_target_installation_results - .each do |pod_name, target_installation_result| - target_installation_result.resource_bundle_targets.each do |resource_bundle_target| - resource_bundle_target.build_configurations.each do |config| - config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' - end - end - end - end - - post_integrate do |installer| - begin - expo_patch_react_imports!(installer) - rescue => e - Pod::UI.warn e - end - end -end diff --git a/apps/mobile/ios/Podfile.lock b/apps/mobile/ios/Podfile.lock deleted file mode 100644 index 463ffd34d..000000000 --- a/apps/mobile/ios/Podfile.lock +++ /dev/null @@ -1,751 +0,0 @@ -PODS: - - ASN1Decoder (1.9.0) - - boost (1.76.0) - - DoubleConversion (1.1.6) - - EASClient (0.5.1): - - ExpoModulesCore - - EXApplication (5.1.1): - - ExpoModulesCore - - EXConstants (14.2.1): - - ExpoModulesCore - - EXFileSystem (15.2.2): - - ExpoModulesCore - - EXFont (11.1.1): - - ExpoModulesCore - - EXImageLoader (4.1.1): - - ExpoModulesCore - - React-Core - - EXJSONUtils (0.5.1) - - EXManifests (0.5.2): - - EXJSONUtils - - EXMediaLibrary (15.2.3): - - ExpoModulesCore - - React-Core - - Expo (48.0.9): - - ExpoModulesCore - - ExpoBlur (12.2.2): - - ExpoModulesCore - - ExpoClipboard (4.1.2): - - ExpoModulesCore - - ExpoDevice (5.2.1): - - ExpoModulesCore - - ExpoImagePicker (14.1.1): - - ExpoModulesCore - - ExpoKeepAwake (12.0.1): - - ExpoModulesCore - - ExpoLinearGradient (12.1.2): - - ExpoModulesCore - - ExpoLocalization (14.1.1): - - ExpoModulesCore - - ExpoModulesCore (1.2.6): - - React-Core - - React-RCTAppDelegate - - ReactCommon/turbomodule/core - - EXSplashScreen (0.18.2): - - ExpoModulesCore - - React-Core - - EXStructuredHeaders (3.1.1) - - EXUpdates (0.16.4): - - ASN1Decoder (~> 1.8) - - EASClient - - EXManifests - - ExpoModulesCore - - EXStructuredHeaders - - EXUpdatesInterface - - React-Core - - EXUpdatesInterface (0.9.1) - - FBLazyVector (0.71.14) - - FBReactNativeSpec (0.71.14): - - RCT-Folly (= 2021.07.22.00) - - RCTRequired (= 0.71.14) - - RCTTypeSafety (= 0.71.14) - - React-Core (= 0.71.14) - - React-jsi (= 0.71.14) - - ReactCommon/turbomodule/core (= 0.71.14) - - fmt (6.2.1) - - glog (0.3.5) - - hermes-engine (0.71.14): - - hermes-engine/Pre-built (= 0.71.14) - - hermes-engine/Pre-built (0.71.14) - - libevent (2.1.12) - - RCT-Folly (2021.07.22.00): - - boost - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - RCT-Folly/Default (= 2021.07.22.00) - - RCT-Folly/Default (2021.07.22.00): - - boost - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - RCT-Folly/Futures (2021.07.22.00): - - boost - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - libevent - - RCTRequired (0.71.14) - - RCTTypeSafety (0.71.14): - - FBLazyVector (= 0.71.14) - - RCTRequired (= 0.71.14) - - React-Core (= 0.71.14) - - React (0.71.14): - - React-Core (= 0.71.14) - - React-Core/DevSupport (= 0.71.14) - - React-Core/RCTWebSocket (= 0.71.14) - - React-RCTActionSheet (= 0.71.14) - - React-RCTAnimation (= 0.71.14) - - React-RCTBlob (= 0.71.14) - - React-RCTImage (= 0.71.14) - - React-RCTLinking (= 0.71.14) - - React-RCTNetwork (= 0.71.14) - - React-RCTSettings (= 0.71.14) - - React-RCTText (= 0.71.14) - - React-RCTVibration (= 0.71.14) - - React-callinvoker (0.71.14) - - React-Codegen (0.71.14): - - FBReactNativeSpec - - hermes-engine - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - React-jsi - - React-jsiexecutor - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - React-Core (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.14) - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/CoreModulesHeaders (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/Default (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/DevSupport (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.14) - - React-Core/RCTWebSocket (= 0.71.14) - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-jsinspector (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/RCTActionSheetHeaders (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/RCTAnimationHeaders (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/RCTBlobHeaders (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/RCTImageHeaders (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/RCTLinkingHeaders (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/RCTNetworkHeaders (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/RCTSettingsHeaders (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/RCTTextHeaders (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/RCTVibrationHeaders (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-Core/RCTWebSocket (0.71.14): - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.14) - - React-cxxreact (= 0.71.14) - - React-hermes - - React-jsi (= 0.71.14) - - React-jsiexecutor (= 0.71.14) - - React-perflogger (= 0.71.14) - - Yoga - - React-CoreModules (0.71.14): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.14) - - React-Codegen (= 0.71.14) - - React-Core/CoreModulesHeaders (= 0.71.14) - - React-jsi (= 0.71.14) - - React-RCTBlob - - React-RCTImage (= 0.71.14) - - ReactCommon/turbomodule/core (= 0.71.14) - - React-cxxreact (0.71.14): - - boost (= 1.76.0) - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.14) - - React-jsi (= 0.71.14) - - React-jsinspector (= 0.71.14) - - React-logger (= 0.71.14) - - React-perflogger (= 0.71.14) - - React-runtimeexecutor (= 0.71.14) - - React-hermes (0.71.14): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - RCT-Folly/Futures (= 2021.07.22.00) - - React-cxxreact (= 0.71.14) - - React-jsi - - React-jsiexecutor (= 0.71.14) - - React-jsinspector (= 0.71.14) - - React-perflogger (= 0.71.14) - - React-jsi (0.71.14): - - boost (= 1.76.0) - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-jsiexecutor (0.71.14): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.71.14) - - React-jsi (= 0.71.14) - - React-perflogger (= 0.71.14) - - React-jsinspector (0.71.14) - - React-logger (0.71.14): - - glog - - react-native-pager-view (6.1.2): - - React-Core - - react-native-safe-area-context (4.5.0): - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - ReactCommon/turbomodule/core - - react-native-webview (11.26.0): - - React-Core - - React-perflogger (0.71.14) - - React-RCTActionSheet (0.71.14): - - React-Core/RCTActionSheetHeaders (= 0.71.14) - - React-RCTAnimation (0.71.14): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.14) - - React-Codegen (= 0.71.14) - - React-Core/RCTAnimationHeaders (= 0.71.14) - - React-jsi (= 0.71.14) - - ReactCommon/turbomodule/core (= 0.71.14) - - React-RCTAppDelegate (0.71.14): - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - ReactCommon/turbomodule/core - - React-RCTBlob (0.71.14): - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.71.14) - - React-Core/RCTBlobHeaders (= 0.71.14) - - React-Core/RCTWebSocket (= 0.71.14) - - React-jsi (= 0.71.14) - - React-RCTNetwork (= 0.71.14) - - ReactCommon/turbomodule/core (= 0.71.14) - - React-RCTImage (0.71.14): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.14) - - React-Codegen (= 0.71.14) - - React-Core/RCTImageHeaders (= 0.71.14) - - React-jsi (= 0.71.14) - - React-RCTNetwork (= 0.71.14) - - ReactCommon/turbomodule/core (= 0.71.14) - - React-RCTLinking (0.71.14): - - React-Codegen (= 0.71.14) - - React-Core/RCTLinkingHeaders (= 0.71.14) - - React-jsi (= 0.71.14) - - ReactCommon/turbomodule/core (= 0.71.14) - - React-RCTNetwork (0.71.14): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.14) - - React-Codegen (= 0.71.14) - - React-Core/RCTNetworkHeaders (= 0.71.14) - - React-jsi (= 0.71.14) - - ReactCommon/turbomodule/core (= 0.71.14) - - React-RCTSettings (0.71.14): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.14) - - React-Codegen (= 0.71.14) - - React-Core/RCTSettingsHeaders (= 0.71.14) - - React-jsi (= 0.71.14) - - ReactCommon/turbomodule/core (= 0.71.14) - - React-RCTText (0.71.14): - - React-Core/RCTTextHeaders (= 0.71.14) - - React-RCTVibration (0.71.14): - - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.71.14) - - React-Core/RCTVibrationHeaders (= 0.71.14) - - React-jsi (= 0.71.14) - - ReactCommon/turbomodule/core (= 0.71.14) - - React-runtimeexecutor (0.71.14): - - React-jsi (= 0.71.14) - - ReactCommon/turbomodule/bridging (0.71.14): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.14) - - React-Core (= 0.71.14) - - React-cxxreact (= 0.71.14) - - React-jsi (= 0.71.14) - - React-logger (= 0.71.14) - - React-perflogger (= 0.71.14) - - ReactCommon/turbomodule/core (0.71.14): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.14) - - React-Core (= 0.71.14) - - React-cxxreact (= 0.71.14) - - React-jsi (= 0.71.14) - - React-logger (= 0.71.14) - - React-perflogger (= 0.71.14) - - RNBootSplash (4.5.3): - - React-Core - - RNCAsyncStorage (1.17.11): - - React-Core - - RNGestureHandler (2.9.0): - - React-Core - - RNReanimated (2.14.4): - - DoubleConversion - - FBLazyVector - - FBReactNativeSpec - - glog - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-callinvoker - - React-Core - - React-Core/DevSupport - - React-Core/RCTWebSocket - - React-CoreModules - - React-cxxreact - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-RCTActionSheet - - React-RCTAnimation - - React-RCTBlob - - React-RCTImage - - React-RCTLinking - - React-RCTNetwork - - React-RCTSettings - - React-RCTText - - ReactCommon/turbomodule/core - - Yoga - - RNScreens (3.20.0): - - React-Core - - React-RCTImage - - RNSentry (4.15.2): - - React-Core - - Sentry/HybridSDK (= 7.31.5) - - RNSVG (13.4.0): - - React-Core - - RNVectorIcons (9.2.0): - - React-Core - - Sentry/HybridSDK (7.31.5) - - Yoga (1.14.0) - -DEPENDENCIES: - - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - - EASClient (from `../node_modules/expo-eas-client/ios`) - - EXApplication (from `../node_modules/expo-application/ios`) - - EXConstants (from `../node_modules/expo-constants/ios`) - - EXFileSystem (from `../node_modules/expo-file-system/ios`) - - EXFont (from `../node_modules/expo-font/ios`) - - EXImageLoader (from `../node_modules/expo-image-loader/ios`) - - EXJSONUtils (from `../node_modules/expo-json-utils/ios`) - - EXManifests (from `../node_modules/expo-manifests/ios`) - - EXMediaLibrary (from `../node_modules/expo-media-library/ios`) - - Expo (from `../node_modules/expo`) - - ExpoBlur (from `../node_modules/expo-blur/ios`) - - ExpoClipboard (from `../node_modules/expo-clipboard/ios`) - - ExpoDevice (from `../node_modules/expo-device/ios`) - - ExpoImagePicker (from `../node_modules/expo-image-picker/ios`) - - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) - - ExpoLinearGradient (from `../node_modules/expo-linear-gradient/ios`) - - ExpoLocalization (from `../node_modules/expo-localization/ios`) - - ExpoModulesCore (from `../node_modules/expo-modules-core`) - - EXSplashScreen (from `../node_modules/expo-splash-screen/ios`) - - EXStructuredHeaders (from `../node_modules/expo-structured-headers/ios`) - - EXUpdates (from `../node_modules/expo-updates/ios`) - - EXUpdatesInterface (from `../node_modules/expo-updates-interface/ios`) - - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - - libevent (~> 2.1.12) - - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) - - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - - React (from `../node_modules/react-native/`) - - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - - React-Codegen (from `build/generated/ios`) - - React-Core (from `../node_modules/react-native/`) - - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) - - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) - - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - - react-native-pager-view (from `../node_modules/react-native-pager-view`) - - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - - react-native-webview (from `../node_modules/react-native-webview`) - - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) - - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) - - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) - - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) - - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) - - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - - RNBootSplash (from `../node_modules/react-native-bootsplash`) - - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - - RNReanimated (from `../node_modules/react-native-reanimated`) - - RNScreens (from `../node_modules/react-native-screens`) - - "RNSentry (from `../node_modules/@sentry/react-native`)" - - RNSVG (from `../node_modules/react-native-svg`) - - RNVectorIcons (from `../node_modules/react-native-vector-icons`) - - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) - -SPEC REPOS: - trunk: - - ASN1Decoder - - fmt - - libevent - - Sentry - -EXTERNAL SOURCES: - boost: - :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" - DoubleConversion: - :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" - EASClient: - :path: "../node_modules/expo-eas-client/ios" - EXApplication: - :path: "../node_modules/expo-application/ios" - EXConstants: - :path: "../node_modules/expo-constants/ios" - EXFileSystem: - :path: "../node_modules/expo-file-system/ios" - EXFont: - :path: "../node_modules/expo-font/ios" - EXImageLoader: - :path: "../node_modules/expo-image-loader/ios" - EXJSONUtils: - :path: "../node_modules/expo-json-utils/ios" - EXManifests: - :path: "../node_modules/expo-manifests/ios" - EXMediaLibrary: - :path: "../node_modules/expo-media-library/ios" - Expo: - :path: "../node_modules/expo" - ExpoBlur: - :path: "../node_modules/expo-blur/ios" - ExpoClipboard: - :path: "../node_modules/expo-clipboard/ios" - ExpoDevice: - :path: "../node_modules/expo-device/ios" - ExpoImagePicker: - :path: "../node_modules/expo-image-picker/ios" - ExpoKeepAwake: - :path: "../node_modules/expo-keep-awake/ios" - ExpoLinearGradient: - :path: "../node_modules/expo-linear-gradient/ios" - ExpoLocalization: - :path: "../node_modules/expo-localization/ios" - ExpoModulesCore: - :path: "../node_modules/expo-modules-core" - EXSplashScreen: - :path: "../node_modules/expo-splash-screen/ios" - EXStructuredHeaders: - :path: "../node_modules/expo-structured-headers/ios" - EXUpdates: - :path: "../node_modules/expo-updates/ios" - EXUpdatesInterface: - :path: "../node_modules/expo-updates-interface/ios" - FBLazyVector: - :path: "../node_modules/react-native/Libraries/FBLazyVector" - FBReactNativeSpec: - :path: "../node_modules/react-native/React/FBReactNativeSpec" - glog: - :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" - hermes-engine: - :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - RCT-Folly: - :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" - RCTRequired: - :path: "../node_modules/react-native/Libraries/RCTRequired" - RCTTypeSafety: - :path: "../node_modules/react-native/Libraries/TypeSafety" - React: - :path: "../node_modules/react-native/" - React-callinvoker: - :path: "../node_modules/react-native/ReactCommon/callinvoker" - React-Codegen: - :path: build/generated/ios - React-Core: - :path: "../node_modules/react-native/" - React-CoreModules: - :path: "../node_modules/react-native/React/CoreModules" - React-cxxreact: - :path: "../node_modules/react-native/ReactCommon/cxxreact" - React-hermes: - :path: "../node_modules/react-native/ReactCommon/hermes" - React-jsi: - :path: "../node_modules/react-native/ReactCommon/jsi" - React-jsiexecutor: - :path: "../node_modules/react-native/ReactCommon/jsiexecutor" - React-jsinspector: - :path: "../node_modules/react-native/ReactCommon/jsinspector" - React-logger: - :path: "../node_modules/react-native/ReactCommon/logger" - react-native-pager-view: - :path: "../node_modules/react-native-pager-view" - react-native-safe-area-context: - :path: "../node_modules/react-native-safe-area-context" - react-native-webview: - :path: "../node_modules/react-native-webview" - React-perflogger: - :path: "../node_modules/react-native/ReactCommon/reactperflogger" - React-RCTActionSheet: - :path: "../node_modules/react-native/Libraries/ActionSheetIOS" - React-RCTAnimation: - :path: "../node_modules/react-native/Libraries/NativeAnimation" - React-RCTAppDelegate: - :path: "../node_modules/react-native/Libraries/AppDelegate" - React-RCTBlob: - :path: "../node_modules/react-native/Libraries/Blob" - React-RCTImage: - :path: "../node_modules/react-native/Libraries/Image" - React-RCTLinking: - :path: "../node_modules/react-native/Libraries/LinkingIOS" - React-RCTNetwork: - :path: "../node_modules/react-native/Libraries/Network" - React-RCTSettings: - :path: "../node_modules/react-native/Libraries/Settings" - React-RCTText: - :path: "../node_modules/react-native/Libraries/Text" - React-RCTVibration: - :path: "../node_modules/react-native/Libraries/Vibration" - React-runtimeexecutor: - :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" - ReactCommon: - :path: "../node_modules/react-native/ReactCommon" - RNBootSplash: - :path: "../node_modules/react-native-bootsplash" - RNCAsyncStorage: - :path: "../node_modules/@react-native-async-storage/async-storage" - RNGestureHandler: - :path: "../node_modules/react-native-gesture-handler" - RNReanimated: - :path: "../node_modules/react-native-reanimated" - RNScreens: - :path: "../node_modules/react-native-screens" - RNSentry: - :path: "../node_modules/@sentry/react-native" - RNSVG: - :path: "../node_modules/react-native-svg" - RNVectorIcons: - :path: "../node_modules/react-native-vector-icons" - Yoga: - :path: "../node_modules/react-native/ReactCommon/yoga" - -SPEC CHECKSUMS: - ASN1Decoder: 4f4bbcaf1d1b8be56daa3280e82863a607f5bda9 - boost: 57d2868c099736d80fcd648bf211b4431e51a558 - DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 - EASClient: 950674e1098ebc09c4c2cf064a61e42e84d9d4c6 - EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903 - EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9 - EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d - EXFont: 6ea3800df746be7233208d80fe379b8ed74f4272 - EXImageLoader: fd053169a8ee932dd83bf1fe5487a50c26d27c2b - EXJSONUtils: 48b1e764ac35160e6f54d21ab60d7d9501f3e473 - EXManifests: 500666d48e8dd7ca5a482c9e729e4a7a6c34081b - EXMediaLibrary: 587cd8aad27a6fc8d7c38b950bc75bc1845a7480 - Expo: 863488a600a4565698a79577117c70b170054d08 - ExpoBlur: fac3c6318fdf409dd5740afd3313b2bd52a35bac - ExpoClipboard: 9b87df0ad145e3aa841614fab6aea54b7a604850 - ExpoDevice: e0bebf68f978b3d353377ce42e73c20c0a070215 - ExpoImagePicker: 270dea232b3a072d981dd564e2cafc63a864edb1 - ExpoKeepAwake: 69f5f627670d62318410392d03e0b5db0f85759a - ExpoLinearGradient: 8eaab76b7f55c612ed8348c8be8c2a18a9b4529f - ExpoLocalization: f26cd431ad9ea3533c5b08c4fabd879176a794bb - ExpoModulesCore: 6e0259511f4c4341b6b8357db393624df2280828 - EXSplashScreen: 0e0a9ba0cf7553094e93213099bd7b42e6e237e9 - EXStructuredHeaders: b1a48d732562e2cc81f11771bcfd29534f5d9254 - EXUpdates: 603c4dfec2ed9ef323dfbd9c59c946593d4d9a5c - EXUpdatesInterface: dd699d1930e28639dcbd70a402caea98e86364ca - FBLazyVector: 12ea01e587c9594e7b144e1bfc86ac4d9ac28fde - FBReactNativeSpec: b6ae48e67aaba46442f84d6f9ba598ccfbe2ee66 - fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b - hermes-engine: d7cc127932c89c53374452d6f93473f1970d8e88 - libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 - RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 - RCTRequired: e9df143e880d0e879e7a498dc06923d728809c79 - RCTTypeSafety: c2d89c8308829c12c038ec1f431191eaa0d8c15c - React: 52b89a818f4b2579c98567f3aa8bde880d9e843b - React-callinvoker: 56e399c88c05e037fe99c31978f30e75fad5c286 - React-Codegen: 7ece62f4d4896ad1933f834a7dad697676636318 - React-Core: f06b7b00e0d49433a316760ae61a0f8f5dee6629 - React-CoreModules: bd520e5688b5aa4666965a1b3b8e6d4a2e19df20 - React-cxxreact: ba6a1663685837fa4c2ac97daa95dd2e47f1acdc - React-hermes: c862e573ca0228070936b5ec4f475c3e19e900e0 - React-jsi: 533030c161bcfcbc3a4ad0b357ced8f7b2be457e - React-jsiexecutor: 94cfc1788637ceaf8841ef1f69b10cc0d62baadc - React-jsinspector: 7bf923954b4e035f494b01ac16633963412660d7 - React-logger: 655ff5db8bd922acfbe76a4983ffab048916343e - react-native-pager-view: 54bed894cecebe28cede54c01038d9d1e122de43 - react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc - react-native-webview: 994b9f8fbb504d6314dc40d83f94f27c6831b3bf - React-perflogger: 4987ad83731c23d11813c84263963b0d3028c966 - React-RCTActionSheet: 5ad952b2a9740d87a5bd77280c4bc23f6f89ea0c - React-RCTAnimation: d2de22af3f536cc80bb5b3918e1a455114d1b985 - React-RCTAppDelegate: 27f7d735cad3d522c13008ea80020d350017c422 - React-RCTBlob: b697e0e2e38ec85bd726176851a3b476a490ad33 - React-RCTImage: a07e8c7d4768f62ebc6277e4680f6b979c619967 - React-RCTLinking: d00ae55db37b2c12ebab91135f06f75391c0708d - React-RCTNetwork: b3a401276e5c08487d8a14fdec1720e78b5888db - React-RCTSettings: d606cbac31403604c5d5746e6dab53bb332f9301 - React-RCTText: b3bd40bc71bca0c3e2cc5ce2c40870a438f303b1 - React-RCTVibration: 64e412b9ac684c4edc938fa1187135ada9af7faf - React-runtimeexecutor: ffe826b7b1cfbc32a35ed5b64d5886c0ff75f501 - ReactCommon: 7f3dd5e98a9ec627c6b03d26c062bf37ea9fc888 - RNBootSplash: 8fb33325dc3620a01984c6660c42cbd93fadcc80 - RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60 - RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39 - RNReanimated: cc5e3aa479cb9170bcccf8204291a6950a3be128 - RNScreens: 218801c16a2782546d30bd2026bb625c0302d70f - RNSentry: 4ea90ea061624364637e8077d965bf2e50478066 - RNSVG: 07dbd870b0dcdecc99b3a202fa37c8ca163caec2 - RNVectorIcons: fcc2f6cb32f5735b586e66d14103a74ce6ad61f8 - Sentry: 4c9babff9034785067c896fd580b1f7de44da020 - Yoga: e71803b4c1fff832ccf9b92541e00f9b873119b9 - -PODFILE CHECKSUM: 3b35c72b749b61fbf59479bf07c13fa9d63dbdc8 - -COCOAPODS: 1.14.2 diff --git a/apps/mobile/ios/Podfile.properties.json b/apps/mobile/ios/Podfile.properties.json deleted file mode 100644 index b1bd45da5..000000000 --- a/apps/mobile/ios/Podfile.properties.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "expo.jsEngine": "hermes" -} diff --git a/apps/web/.env b/apps/web/.env index 409ebce1b..539845cf2 100644 --- a/apps/web/.env +++ b/apps/web/.env @@ -34,7 +34,7 @@ APP_LOGO_URL="https://app.ever.team/assets/ever-teams.png" NEXT_PUBLIC_COOKIE_DOMAINS=ever.team # Board -NEXT_PUBLIC_BOARD_APP_DOMAIN=https://board.ever.team +NEXT_PUBLIC_BOARD_APP_DOMAIN="https://board.ever.team" NEXT_PUBLIC_BOARD_BACKEND_POST_URL="https://jsonboard.ever.team/api/v2/post/" NEXT_PUBLIC_BOARD_FIREBASE_CONFIG= diff --git a/apps/web/app/constants.ts b/apps/web/app/constants.ts index f36e052a6..39ccdb801 100644 --- a/apps/web/app/constants.ts +++ b/apps/web/app/constants.ts @@ -32,9 +32,10 @@ export const RECAPTCHA_SITE_KEY = process.env.NEXT_PUBLIC_CAPTCHA_SITE_KEY; export const RECAPTCHA_SECRET_KEY = process.env.CAPTCHA_SECRET_KEY; export const GAUZY_API_SERVER_URL = process.env.GAUZY_API_SERVER_URL || 'https://api.gauzy.co/api'; -export const INVITE_CALLBACK_URL = process.env.INVITE_CALLBACK_URL; + +export const INVITE_CALLBACK_URL = process.env.INVITE_CALLBACK_URL || 'https://app.ever.team/auth/passcode'; export const INVITE_CALLBACK_PATH = '/auth/passcode'; -export const VERIFY_EMAIL_CALLBACK_URL = process.env.VERIFY_EMAIL_CALLBACK_URL; +export const VERIFY_EMAIL_CALLBACK_URL = process.env.VERIFY_EMAIL_CALLBACK_URL || 'https://app.ever.team/verify-email'; export const VERIFY_EMAIL_CALLBACK_PATH = '/verify-email'; export const GA_MEASUREMENT_ID = process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID; @@ -73,7 +74,7 @@ export const MEET_JWT_TOKEN_COOKIE_NAME = 'meet-jwt-session'; // BOARD board export const BOARD_APP_DOMAIN = process.env.NEXT_PUBLIC_BOARD_APP_DOMAIN || 'https://board.ever.team'; -export const BOARD_BACKEND_POST_URL = process.env.NEXT_PUBLIC_BOARD_BACKEND_POST_URL; +export const BOARD_BACKEND_POST_URL = process.env.NEXT_PUBLIC_BOARD_BACKEND_POST_URL || 'https://jsonboard.ever.team/api/v2/post/'; export const BOARD_FIREBASE_CONFIG = process.env.NEXT_PUBLIC_BOARD_FIREBASE_CONFIG; // Jitsu diff --git a/apps/web/app/helpers/validations.ts b/apps/web/app/helpers/validations.ts index 045ef0156..6971ef3f1 100644 --- a/apps/web/app/helpers/validations.ts +++ b/apps/web/app/helpers/validations.ts @@ -23,10 +23,9 @@ export const authFormValidate = (keys: (keyof IRegisterDataAPI)[], values: IRegi } break; case 'recaptcha': - if(RECAPTCHA_SITE_KEY) { + if (RECAPTCHA_SITE_KEY) { if (!values['recaptcha'] || values['recaptcha'].trim().length < 2) { - err['recaptcha'] = - 'Please check the ReCaptcha checkbox before continue'; + err['recaptcha'] = 'Please check the ReCaptcha checkbox before continue'; } } break; @@ -90,6 +89,8 @@ export function validateForm(keys: (keyof T)[], data: T) { export function validSMTPConfig() { const SMTPConfig = smtpConfiguration(); + console.log(`SMTP Config: ${JSON.stringify(SMTPConfig)}`); + const keys = Object.keys(SMTPConfig) as (keyof I_SMTPRequest)[]; if (keys.some((key) => SMTPConfig[key] === null || SMTPConfig[key] === undefined)) { diff --git a/apps/web/app/hooks/features/useAuthenticateUser.ts b/apps/web/app/hooks/features/useAuthenticateUser.ts index 974b13fca..09b5b1fdd 100644 --- a/apps/web/app/hooks/features/useAuthenticateUser.ts +++ b/apps/web/app/hooks/features/useAuthenticateUser.ts @@ -27,7 +27,7 @@ export const useAuthenticateUser = (defaultUser?: IUser) => { return; } refreshUserQueryCall().then((res) => { - setUser(res.data.user); + setUser(res.data); }); }, [refreshUserQueryCall, setUser, refreshUserLoadingRef]); diff --git a/apps/web/app/hooks/features/useEmployee.ts b/apps/web/app/hooks/features/useEmployee.ts index 0a179b51c..902699cc1 100644 --- a/apps/web/app/hooks/features/useEmployee.ts +++ b/apps/web/app/hooks/features/useEmployee.ts @@ -4,8 +4,10 @@ import { useCallback, useEffect } from 'react'; import { useRecoilState } from 'recoil'; import { useQuery } from '../useQuery'; +import { useAuthenticateUser } from './useAuthenticateUser'; export const useEmployee = () => { + const { user } = useAuthenticateUser(); const [workingEmployees, setWorkingEmployees] = useRecoilState(workingEmployeesState); const [workingEmployeesEmail, setWorkingEmployeesEmail] = useRecoilState(workingEmployeesEmailState); @@ -13,14 +15,17 @@ export const useEmployee = () => { useQuery(getWorkingEmployeesAPI); const getWorkingEmployee = useCallback(() => { - getWorkingEmployeeQueryCall().then((data) => { + if (!user?.tenantId) { + return; + } + getWorkingEmployeeQueryCall(user?.tenantId, user?.employee.organizationId).then((data) => { if (data?.data?.items && data?.data?.items?.length) { const items = data.data.items || []; setWorkingEmployees(items); - setWorkingEmployeesEmail(items.map((item) => item.user?.email || '')); + setWorkingEmployeesEmail(items.map((item: any) => item.user?.email || '')); } }); - }, [getWorkingEmployeeQueryCall, setWorkingEmployees, setWorkingEmployeesEmail]); + }, [getWorkingEmployeeQueryCall, setWorkingEmployees, setWorkingEmployeesEmail, user]); useEffect(() => { getWorkingEmployee(); diff --git a/apps/web/app/hooks/features/useKanban.ts b/apps/web/app/hooks/features/useKanban.ts new file mode 100644 index 000000000..94b0c653c --- /dev/null +++ b/apps/web/app/hooks/features/useKanban.ts @@ -0,0 +1,37 @@ +import { kanbanBoardState } from "@app/stores/kanban"; +import { useTaskStatus } from "./useTaskStatus"; +import { useRecoilState } from "recoil"; +import { useEffect, useState } from "react"; +import { ITaskStatusItemList } from "@app/interfaces"; + +export function useKanban() { + + const [loading, setLoading] = useState(true); + + const [kanbanBoard, setKanbanBoard] = useRecoilState(kanbanBoardState); + + const taskStatusHook = useTaskStatus(); + + /** + * format data for kanban board + */ + useEffect(()=> { + if(taskStatusHook.loading) { + let kanban = {}; + taskStatusHook.taskStatus.map((taskStatus: ITaskStatusItemList,)=> { + kanban = { + ...kanban, + [taskStatus.name ? taskStatus.name : ''] : [] + } + }); + setKanbanBoard(kanban) + setLoading(false) + } + },[taskStatusHook.loading]) + + return { + data: kanbanBoard, + isLoading: loading, + columns: taskStatusHook.taskStatus + } +} \ No newline at end of file diff --git a/apps/web/app/hooks/features/useLanguageSettings.ts b/apps/web/app/hooks/features/useLanguageSettings.ts index fc0a51adf..41534e576 100644 --- a/apps/web/app/hooks/features/useLanguageSettings.ts +++ b/apps/web/app/hooks/features/useLanguageSettings.ts @@ -39,7 +39,7 @@ export function useLanguageSettings() { if (user) { return queryCall(user.role.isSystem).then((res) => { setLanguages( - res?.data?.data?.items.filter((item) => APPLICATION_LANGUAGES_CODE.includes(item.code)) || [] + res?.data?.data?.items.filter((item: any) => APPLICATION_LANGUAGES_CODE.includes(item.code)) || [] ); return res; }); diff --git a/apps/web/app/hooks/features/useOrganizationTeams.ts b/apps/web/app/hooks/features/useOrganizationTeams.ts index faacc8968..a0d6b1fb7 100644 --- a/apps/web/app/hooks/features/useOrganizationTeams.ts +++ b/apps/web/app/hooks/features/useOrganizationTeams.ts @@ -226,20 +226,25 @@ export function useOrganizationTeams() { ); const loadTeamsData = useCallback(() => { - if (loadingRef.current || loadingRefTeam.current) { + if ( + loadingRef.current || + loadingRefTeam.current || + !user?.employee.organizationId || + !user?.employee.tenantId + ) { return; } let teamId = getActiveTeamIdCookie(); setActiveTeamId(teamId); - return queryCall().then((res) => { + return queryCall(user?.employee.organizationId, user?.employee.tenantId).then((res) => { if (res.data?.items && res.data?.items?.length === 0) { setIsTeamMember(false); } const latestTeams = res.data?.items || []; - const latestTeamsSorted = latestTeams.slice().sort((a, b) => a.name.localeCompare(b.name)); + const latestTeamsSorted = latestTeams.slice().sort((a: any, b: any) => a.name.localeCompare(b.name)); const teamsRefSorted = teamsRef.current.slice().sort((a, b) => a.name.localeCompare(b.name)); @@ -256,7 +261,7 @@ export function useOrganizationTeams() { // Handle case where user might Remove Account from all teams, // In such case need to update active team with Latest list of Teams - if (!latestTeams.find((team) => team.id === teamId) && latestTeams.length) { + if (!latestTeams.find((team: any) => team.id === teamId) && latestTeams.length) { setActiveTeam(latestTeams[0]); } else if (!latestTeams.length) { teamId = ''; @@ -274,7 +279,7 @@ export function useOrganizationTeams() { * (It prevents unnecessary re-rendering) */ if (!isEqual(latestTeamsSorted, teamsRefSorted)) { - setTeams([newTeam, ...latestTeams.filter((team) => team.id !== newTeam.id)]); + setTeams([newTeam, ...latestTeams.filter((team: any) => team.id !== newTeam.id)]); // Set Project Id to cookie // TODO: Make it dynamic when we add Dropdown in Navbar @@ -304,8 +309,8 @@ export function useOrganizationTeams() { loadingTeamsRef, setTeams, setTeamsUpdate, - user?.employee.organizationId, - user?.employee.tenantId + user?.employee?.organizationId, + user?.employee?.tenantId ]); const editOrganizationTeam = useCallback( diff --git a/apps/web/app/hooks/features/useSettings.ts b/apps/web/app/hooks/features/useSettings.ts index 55c1721b8..4c5af9828 100644 --- a/apps/web/app/hooks/features/useSettings.ts +++ b/apps/web/app/hooks/features/useSettings.ts @@ -17,7 +17,7 @@ export function useSettings() { (userData: Partial & { id: string }) => { return updateAvatarQueryCall(userData.id, userData).then((res) => { refreshUserQueryCall().then((result) => { - setUser(result.data.user); + setUser(result.data); }); return res; }); diff --git a/apps/web/app/hooks/features/useTaskStatistics.ts b/apps/web/app/hooks/features/useTaskStatistics.ts index b5c9fa256..fd44986a7 100644 --- a/apps/web/app/hooks/features/useTaskStatistics.ts +++ b/apps/web/app/hooks/features/useTaskStatistics.ts @@ -21,8 +21,10 @@ import { useSyncRef } from '../useSyncRef'; import { Nullable } from '@app/interfaces'; import { useRefreshInterval } from './useRefreshInterval'; import { useOrganizationTeams } from './useOrganizationTeams'; +import { useAuthenticateUser } from './useAuthenticateUser'; export function useTaskStatistics(addSeconds = 0) { + const { user } = useAuthenticateUser(); const [statActiveTask, setStatActiveTask] = useRecoilState(activeTaskStatisticsState); const [statTasks, setStatTasks] = useRecoilState(tasksStatisticsState); const setTasksFetching = useSetRecoilState(tasksFetchingState); @@ -45,14 +47,19 @@ export function useTaskStatistics(addSeconds = 0) { */ const getTasksStatsData = useCallback( (employeeId?: string) => { - tasksTimesheetStatisticsAPI(employeeId).then(({ data }) => { - setStatTasks({ - all: data.global || [], - today: data.today || [] - }); - }); + if (!user?.employee.tenantId) { + return; + } + tasksTimesheetStatisticsAPI(user?.employee.tenantId, '', user?.employee.organizationId, employeeId).then( + ({ data }) => { + setStatTasks({ + all: data.global || [], + today: data.today || [] + }); + } + ); }, - [setStatTasks] + [setStatTasks, user?.employee.organizationId, user?.employee.tenantId] ); const getAllTasksStatsData = useCallback(() => { allTaskTimesheetStatisticsAPI().then(({ data }) => { @@ -78,8 +85,20 @@ export function useTaskStatistics(addSeconds = 0) { * Get statistics of the active tasks fresh (API Call) */ const getActiveTaskStatData = useCallback(() => { + if (!user?.employee.tenantId || !user?.employee.organizationId) { + return new Promise((resolve) => { + resolve(true); + }); + } + setTasksFetching(true); - const promise = activeTaskTimesheetStatisticsAPI(); + + const promise = activeTaskTimesheetStatisticsAPI( + user?.employee.tenantId, + '', + user?.employee.organizationId, + '' + ); promise.then(({ data }) => { setStatActiveTask({ total: data.global ? data.global[0] || null : null, @@ -90,7 +109,7 @@ export function useTaskStatistics(addSeconds = 0) { setTasksFetching(false); }); return promise; - }, [setStatActiveTask, setTasksFetching]); + }, [setStatActiveTask, setTasksFetching, user?.employee.organizationId, user?.employee.tenantId]); // eslint-disable-next-line react-hooks/exhaustive-deps const debounceLoadActiveTaskStat = useCallback(debounce(getActiveTaskStatData, 100), []); @@ -104,7 +123,7 @@ export function useTaskStatistics(addSeconds = 0) { initialLoad.current = true; }); } - }, [firstLoad, getActiveTaskStatData]); + }, [firstLoad, getActiveTaskStatData, user?.employee.organizationId, user?.employee.tenantId]); /** * Get fresh statistic of the active task diff --git a/apps/web/app/hooks/features/useTeamInvitations.ts b/apps/web/app/hooks/features/useTeamInvitations.ts index f6c2d2da0..6559b6159 100644 --- a/apps/web/app/hooks/features/useTeamInvitations.ts +++ b/apps/web/app/hooks/features/useTeamInvitations.ts @@ -46,23 +46,33 @@ export function useTeamInvitations() { const { queryCall: acceptRejectMyInvitationsQueryCall, loading: acceptRejectMyInvitationsLoading } = useQuery(acceptRejectMyInvitationsAPI); + const { user } = useAuthenticateUser(); + const inviteUser = useCallback( (email: string, name: string) => { - return inviteQueryCall({ email, name }).then((res) => { - setTeamInvitations(res.data?.items || []); + return inviteQueryCall( + { + email, + name, + organizationId: user?.employee.organizationId as string, + teamId: activeTeamId as string + }, + user?.tenantId as string + ).then((res) => { + setTeamInvitations((prev) => [...prev, ...(res.data?.items || [])]); return res; }); }, - [inviteQueryCall, setTeamInvitations] + [inviteQueryCall, setTeamInvitations, user?.tenantId, activeTeamId, user?.employee.organizationId] ); useEffect(() => { - if (activeTeamId && firstLoad && isTeamManager) { - queryCall().then((res) => { + if (activeTeamId && firstLoad && isTeamManager && user?.tenantId) { + queryCall(user?.tenantId, user.employee.organizationId, 'EMPLOYEE', activeTeamId).then((res) => { setTeamInvitations(res.data?.items || []); }); } - }, [activeTeamId, firstLoad, isTeamManager, queryCall, setTeamInvitations]); + }, [activeTeamId, firstLoad, isTeamManager, queryCall, setTeamInvitations, user]); useEffect(() => { if (firstLoad) { @@ -87,11 +97,15 @@ export function useTeamInvitations() { ); const myInvitations = useCallback(() => { - myInvitationsQueryCall().then((res) => { + if (!user?.tenantId) { + return; + } + + myInvitationsQueryCall(user.tenantId).then((res) => { setMyInvitationsList(res.data.items); return res.data; }); - }, [myInvitationsQueryCall, setMyInvitationsList]); + }, [myInvitationsQueryCall, setMyInvitationsList, user]); const removeMyInvitation = useCallback( (id: string) => { setMyInvitationsList(myInvitationsList.filter((invitation) => invitation.id !== id)); diff --git a/apps/web/app/hooks/features/useTeamTasks.ts b/apps/web/app/hooks/features/useTeamTasks.ts index d8755c3f6..140b1f0df 100644 --- a/apps/web/app/hooks/features/useTeamTasks.ts +++ b/apps/web/app/hooks/features/useTeamTasks.ts @@ -23,9 +23,11 @@ import { useFirstLoad } from '../useFirstLoad'; import { useQuery } from '../useQuery'; import { useSyncRef } from '../useSyncRef'; import { useOrganizationEmployeeTeams } from './useOrganizatioTeamsEmployee'; +import { useAuthenticateUser } from './useAuthenticateUser'; export function useTeamTasks() { const { updateOrganizationTeamEmployeeActiveTask } = useOrganizationEmployeeTeams(); + const { user } = useAuthenticateUser(); const setAllTasks = useSetRecoilState(teamTasksState); const tasks = useRecoilValue(tasksByTeamState); @@ -109,12 +111,26 @@ export function useTeamTasks() { response(true); }); } - return queryCall().then((res) => { + + if (!user || !activeTeamRef.current?.id) { + return new Promise((response) => { + response(true); + }); + } + + return queryCall( + user?.employee.organizationId, + user?.employee.tenantId, + activeTeamRef.current?.projects && activeTeamRef.current?.projects.length + ? activeTeamRef.current?.projects[0].id + : '', + activeTeamRef.current?.id || '' + ).then((res) => { deepCheckAndUpdateTasks(res?.data?.items || [], deepCheck); return res; }); }, - [queryCall, deepCheckAndUpdateTasks, loadingRef] + [queryCall, deepCheckAndUpdateTasks, loadingRef, user, activeTeamRef] ); // Global loading state diff --git a/apps/web/app/hooks/features/useTimer.ts b/apps/web/app/hooks/features/useTimer.ts index 38eb65a5e..516be6730 100644 --- a/apps/web/app/hooks/features/useTimer.ts +++ b/apps/web/app/hooks/features/useTimer.ts @@ -178,9 +178,10 @@ export function useTimer() { const lastActiveTeamId = useRef(null); const lastActiveTaskId = useRef(null); const canRunTimer = - (!!activeTeamTask && activeTeamTask.status !== 'closed') || - // If timer is running at some other source and user may or may not have selected the task - timerStatusRef.current?.lastLog?.source !== TimerSource.TEAMS; + user?.isEmailVerified && + ((!!activeTeamTask && activeTeamTask.status !== 'closed') || + // If timer is running at some other source and user may or may not have selected the task + timerStatusRef.current?.lastLog?.source !== TimerSource.TEAMS); // Local time status const { timeCounter, updateLocalTimerStatus, timerSeconds } = useLocalTimeCounter( @@ -191,10 +192,10 @@ export function useTimer() { const getTimerStatus = useCallback( (deepCheck?: boolean) => { - if (loadingRef.current) { + if (loadingRef.current || !user?.tenantId) { return; } - return queryCall().then((res) => { + return queryCall(user?.tenantId, user?.employee.organizationId).then((res) => { if (res.data && !isEqual(timerStatus, res.data)) { setTimerStatus((t) => { if (deepCheck) { @@ -206,7 +207,7 @@ export function useTimer() { return res; }); }, - [timerStatus, setTimerStatus, queryCall, loadingRef] + [timerStatus, setTimerStatus, queryCall, loadingRef, user] ); const toggleTimer = useCallback( diff --git a/apps/web/app/interfaces/IKanban.ts b/apps/web/app/interfaces/IKanban.ts new file mode 100644 index 000000000..2d17b3da5 --- /dev/null +++ b/apps/web/app/interfaces/IKanban.ts @@ -0,0 +1,5 @@ +import { ITeamTask } from "./ITask"; + +export interface IKanban { + [key: string]: ITeamTask[] +} \ No newline at end of file diff --git a/apps/web/app/services/client/api/auth.ts b/apps/web/app/services/client/api/auth.ts index dea6fe2e7..e45048331 100644 --- a/apps/web/app/services/client/api/auth.ts +++ b/apps/web/app/services/client/api/auth.ts @@ -1,7 +1,7 @@ import { getRefreshTokenCookie } from '@app/helpers/cookies'; import { ISuccessResponse } from '@app/interfaces'; import { ILoginResponse, IRegisterDataAPI, ISigninEmailConfirmResponse } from '@app/interfaces/IAuthentication'; -import api from '../axios'; +import api, { get } from '../axios'; export const signInWithEmailAndCodeAPI = (email: string, code: string) => { return api.post(`/auth/login`, { @@ -31,8 +31,20 @@ export const signInEmailAPI = (email: string) => { }); }; -export const getAuthenticatedUserDataAPI = () => { - return api.get>(`/user/me`); +export const getAuthenticatedUserDataAPI = async () => { + const params = {} as { [x: string]: string }; + const relations = ['employee', 'role', 'tenant']; + + relations.forEach((rl, i) => { + params[`relations[${i}]`] = rl; + }); + + const query = new URLSearchParams(params); + + const endpoint = `/user/me?${query.toString()}`; + const data = await get(endpoint, true); + + return process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL ? data.data : data; }; export const verifyUserEmailByCodeAPI = (code: string) => { diff --git a/apps/web/app/services/client/api/employee.ts b/apps/web/app/services/client/api/employee.ts index 6f94e8ef5..54f942a91 100644 --- a/apps/web/app/services/client/api/employee.ts +++ b/apps/web/app/services/client/api/employee.ts @@ -1,6 +1,17 @@ -import { PaginationResponse, IWorkingEmployee } from '@app/interfaces'; -import api from '../axios'; +import { get } from '../axios'; -export function getWorkingEmployeesAPI() { - return api.get>('/employee/working'); +export async function getWorkingEmployeesAPI(tenantId: string, organizationId: string) { + const params = { + 'where[tenantId]': tenantId, + 'where[organizationId]': organizationId, + 'relations[0]': 'user' + }; + const query = new URLSearchParams(params); + + const endpoint = process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL + ? `/employee/pagination?${query.toString()}` + : '/employee/working'; + const data = await get(endpoint, true, { tenantId }); + + return process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL ? data.data : data; } diff --git a/apps/web/app/services/client/api/invite.ts b/apps/web/app/services/client/api/invite.ts index 7764b1c03..73e46035c 100644 --- a/apps/web/app/services/client/api/invite.ts +++ b/apps/web/app/services/client/api/invite.ts @@ -1,13 +1,62 @@ import { PaginationResponse } from '@app/interfaces/IDataResponse'; -import { IInvitation, IInviteRequest, IMyInvitations, MyInvitationActionEnum, CreateResponse } from '@app/interfaces'; -import api from '../axios'; +import { IInvitation, MyInvitationActionEnum, CreateResponse, IInviteCreate, IRole } from '@app/interfaces'; +import { INVITE_CALLBACK_URL } from '@app/constants'; +import api, { get, post } from '../axios'; +import { AxiosResponse } from 'axios'; -export function inviteByEmailsAPI(data: IInviteRequest) { - return api.post>('/invite/emails', data); +interface IIInviteRequest { + email: string; + name: string; + teamId: string; + organizationId: string; } -export function getTeamInvitationsAPI() { - return api.get>('/invite'); +export async function inviteByEmailsAPI(data: IIInviteRequest, tenantId: string) { + const endpoint = '/invite/emails'; + + const date = new Date(); + date.setDate(date.getDate() - 1); + + const getRoleEndpoint = '/roles/options?name=EMPLOYEE'; + + const employeeRole: AxiosResponse = (await get(getRoleEndpoint, true, { tenantId })).data; + + const dataToInviteUser: IInviteCreate & { tenantId: string } = { + emailIds: [data.email], + projectIds: [], + departmentIds: [], + organizationContactIds: [], + teamIds: [data.teamId], + roleId: employeeRole.data.id || '', + invitationExpirationPeriod: 'Never', + inviteType: 'TEAM', + appliedDate: null, + fullName: data.name, + callbackUrl: INVITE_CALLBACK_URL, + organizationId: data.organizationId, + tenantId, + startedWorkOn: date.toISOString() + }; + + // for not direct call we need to adjust data to include name and email only + const fetchData = await post(endpoint, dataToInviteUser, true, { tenantId }); + + return process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL ? fetchData.data : fetchData; +} + +export async function getTeamInvitationsAPI(tenantId: string, organizationId: string, role: string, teamId: string) { + const query = new URLSearchParams({ + 'where[tenantId]': tenantId, + 'where[organizationId]': organizationId, + 'where[role][name]': role, + 'where[teams][id][0]': teamId, + 'where[status]': 'INVITED' + }); + + const endpoint = `/invite?${query.toString()}`; + const data = await get(endpoint, true, { tenantId }); + + return process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL ? data.data : data; } export function removeTeamInvitationsAPI(invitationId: string) { @@ -20,8 +69,11 @@ export function resendTeamInvitationsAPI(inviteId: string) { }); } -export function getMyInvitationsAPI() { - return api.get>('/invite/me'); +export async function getMyInvitationsAPI(tenantId: string) { + const endpoint = '/invite/me'; + const data = await get(endpoint, true, { tenantId }); + + return process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL ? data.data : data; } export function acceptRejectMyInvitationsAPI(invitationId: string, action: MyInvitationActionEnum) { diff --git a/apps/web/app/services/client/api/issue-type.ts b/apps/web/app/services/client/api/issue-type.ts index 709088ff2..59d7b7734 100644 --- a/apps/web/app/services/client/api/issue-type.ts +++ b/apps/web/app/services/client/api/issue-type.ts @@ -1,5 +1,5 @@ import { CreateResponse, DeleteResponse, IIssueTypesCreate } from '@app/interfaces'; -import api from '../axios'; +import api, { get } from '../axios'; export function createIssueTypeAPI(data: IIssueTypesCreate, tenantId?: string) { return api.post>('/issue-types', data, { @@ -21,6 +21,9 @@ export function deleteIssueTypeAPI(id: string) { return api.delete(`/issue-types/${id}`); } -export function getIssueTypeList(tenantId: string, organizationId: string, activeTeamId: string | null) { - return api.get(`/issue-types?tenantId=${tenantId}&organizationId=${organizationId}&activeTeamId=${activeTeamId}`); +export async function getIssueTypeList(tenantId: string, organizationId: string, activeTeamId: string | null) { + const endpoint = `/issue-types?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${activeTeamId}`; + const data = await get(endpoint, true, { tenantId }); + + return data; } diff --git a/apps/web/app/services/client/api/languages.ts b/apps/web/app/services/client/api/languages.ts index e07c98399..48a158c1f 100644 --- a/apps/web/app/services/client/api/languages.ts +++ b/apps/web/app/services/client/api/languages.ts @@ -1,6 +1,8 @@ -import { ILanguageItemList, CreateResponse, PaginationResponse } from '@app/interfaces'; -import api from '../axios'; +import { get } from '../axios'; -export function getLanguageListAPI(is_system: boolean) { - return api.get>>(`/languages?is_system=${is_system}`); +export async function getLanguageListAPI(is_system: boolean) { + const endpoint = `/languages?is_system=${is_system}`; + const data = await get(endpoint, true); + + return process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL ? data.data : data; } diff --git a/apps/web/app/services/client/api/organization-team.ts b/apps/web/app/services/client/api/organization-team.ts index dd7412d67..f9222f3b0 100644 --- a/apps/web/app/services/client/api/organization-team.ts +++ b/apps/web/app/services/client/api/organization-team.ts @@ -4,13 +4,39 @@ import { IOrganizationTeamList, IOrganizationTeamWithMStatus, IOrganizationTeamUpdate, - IOrganizationTeam + IOrganizationTeam, + TimerSource } from '@app/interfaces'; import moment from 'moment'; import api, { get } from '../axios'; -export function getOrganizationTeamsAPI() { - return api.get>('/organization-team'); +export async function getOrganizationTeamsAPI(organizationId: string, tenantId: string) { + const relations = [ + 'members', + 'members.role', + 'members.employee', + 'members.employee.user', + 'createdBy', + 'createdBy.employee', + 'projects', + 'projects.repository' + ]; + + const params = { + 'where[organizationId]': organizationId, + 'where[tenantId]': tenantId, + source: TimerSource.TEAMS, + withLaskWorkedTask: 'true' + } as { [x: string]: string }; + + relations.forEach((rl, i) => { + params[`relations[${i}]`] = rl; + }); + const query = new URLSearchParams(params); + const endpoint = `/organization-team?${query.toString()}`; + + const data = await get(endpoint, true, { tenantId }); + return process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL ? data.data : data; } export function createOrganizationTeamAPI(name: string) { diff --git a/apps/web/app/services/client/api/task-labels.ts b/apps/web/app/services/client/api/task-labels.ts index 6aa94c6c6..6ad7bcd15 100644 --- a/apps/web/app/services/client/api/task-labels.ts +++ b/apps/web/app/services/client/api/task-labels.ts @@ -1,5 +1,5 @@ import { CreateResponse, DeleteResponse, ITaskLabelsCreate } from '@app/interfaces'; -import api from '../axios'; +import api, { get } from '../axios'; export function createTaskLabelsAPI(data: ITaskLabelsCreate, tenantId?: string) { return api.post>('/tags', data, { @@ -21,6 +21,9 @@ export function deleteTaskLabelsAPI(id: string) { return api.delete(`/tags/${id}`); } -export function getTaskLabelsList(tenantId: string, organizationId: string, activeTeamId: string | null) { - return api.get(`/tags/level?tenantId=${tenantId}&organizationId=${organizationId}&activeTeamId=${activeTeamId}`); +export async function getTaskLabelsList(tenantId: string, organizationId: string, organizationTeamId: string | null) { + const endpoint = `/tags/level?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${organizationTeamId}`; + const data = await get(endpoint, true, { tenantId }); + + return data; } diff --git a/apps/web/app/services/client/api/task-priorities.ts b/apps/web/app/services/client/api/task-priorities.ts index 9c299cb4d..84a557d0c 100644 --- a/apps/web/app/services/client/api/task-priorities.ts +++ b/apps/web/app/services/client/api/task-priorities.ts @@ -1,5 +1,5 @@ import { CreateResponse, DeleteResponse, ITaskPrioritiesCreate } from '@app/interfaces'; -import api from '../axios'; +import api, { get } from '../axios'; export function createTaskPrioritiesAPI(data: ITaskPrioritiesCreate, tenantId?: string) { return api.post>('/task-priorities', data, { @@ -21,8 +21,14 @@ export function deleteTaskPrioritiesAPI(id: string) { return api.delete(`/task-priorities/${id}`); } -export function getTaskPrioritiesList(tenantId: string, organizationId: string, activeTeamId: string | null) { - return api.get( - `/task-priorities?tenantId=${tenantId}&organizationId=${organizationId}&activeTeamId=${activeTeamId}` - ); +export async function getTaskPrioritiesList( + tenantId: string, + organizationId: string, + organizationTeamId: string | null +) { + const endpoint = `/task-priorities?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${organizationTeamId}`; + + const data = await get(endpoint, true, { tenantId }); + + return data; } diff --git a/apps/web/app/services/client/api/task-related-issue-type.ts b/apps/web/app/services/client/api/task-related-issue-type.ts index 155e6424d..e7ace2daf 100644 --- a/apps/web/app/services/client/api/task-related-issue-type.ts +++ b/apps/web/app/services/client/api/task-related-issue-type.ts @@ -1,5 +1,5 @@ import { CreateResponse, DeleteResponse, ITaskRelatedIssueTypeCreate } from '@app/interfaces'; -import api from '../axios'; +import api, { get } from '../axios'; export function createTaskRelatedIssueTypeAPI(data: ITaskRelatedIssueTypeCreate, tenantId?: string) { return api.post>('/task-related-issue-types', data, { @@ -21,8 +21,14 @@ export function deleteTaskRelatedIssueTypeAPI(id: string) { return api.delete(`/task-related-issue-types/${id}`); } -export function getTaskRelatedIssueTypeList(tenantId: string, organizationId: string, activeTeamId: string | null) { - return api.get( - `/task-related-issue-types?tenantId=${tenantId}&organizationId=${organizationId}&activeTeamId=${activeTeamId}` - ); +export async function getTaskRelatedIssueTypeList( + tenantId: string, + organizationId: string, + organizationTeamId: string | null +) { + const endpoint = `/task-related-issue-types?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${organizationTeamId}`; + + const data = await get(endpoint, true, { tenantId }); + + return data; } diff --git a/apps/web/app/services/client/api/task-status.ts b/apps/web/app/services/client/api/task-status.ts index 4dafd1542..b523f9656 100644 --- a/apps/web/app/services/client/api/task-status.ts +++ b/apps/web/app/services/client/api/task-status.ts @@ -1,5 +1,5 @@ import { CreateResponse, DeleteResponse, ITaskStatusCreate } from '@app/interfaces'; -import api from '../axios'; +import api, { get } from '../axios'; export function createTaskStatusAPI(data: ITaskStatusCreate, tenantId?: string) { return api.post>('/task-statuses', data, { @@ -21,6 +21,10 @@ export function deleteTaskStatusAPI(id: string) { return api.delete(`/task-statuses/${id}`); } -export function getTaskStatusList(tenantId: string, organizationId: string, activeTeamId: string | null) { - return api.get(`/task-statuses?tenantId=${tenantId}&organizationId=${organizationId}&activeTeamId=${activeTeamId}`); +export async function getTaskStatusList(tenantId: string, organizationId: string, organizationTeamId: string | null) { + const endpoint = `/task-statuses?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${organizationTeamId}`; + + const data = await get(endpoint, true, { tenantId }); + + return data; } diff --git a/apps/web/app/services/client/api/task-version.ts b/apps/web/app/services/client/api/task-version.ts index 34e67aad8..a5ae1614a 100644 --- a/apps/web/app/services/client/api/task-version.ts +++ b/apps/web/app/services/client/api/task-version.ts @@ -1,5 +1,5 @@ import { CreateResponse, DeleteResponse, ITaskVersionCreate } from '@app/interfaces'; -import api from '../axios'; +import api, { get } from '../axios'; export function createTaskVersionAPI(data: ITaskVersionCreate, tenantId?: string) { return api.post>('/task-versions', data, { @@ -21,6 +21,10 @@ export function deleteTaskVersionAPI(id: string) { return api.delete(`/task-versions/${id}`); } -export function getTaskVersionList(tenantId: string, organizationId: string, activeTeamId: string | null) { - return api.get(`/task-versions?tenantId=${tenantId}&organizationId=${organizationId}&activeTeamId=${activeTeamId}`); +export async function getTaskVersionList(tenantId: string, organizationId: string, organizationTeamId: string | null) { + const endpoint = `/task-versions?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${organizationTeamId}`; + + const data = await get(endpoint, true, { tenantId }); + + return data; } diff --git a/apps/web/app/services/client/api/tasks.ts b/apps/web/app/services/client/api/tasks.ts index d8fedf87d..62c81e640 100644 --- a/apps/web/app/services/client/api/tasks.ts +++ b/apps/web/app/services/client/api/tasks.ts @@ -1,14 +1,46 @@ +/* eslint-disable no-mixed-spaces-and-tabs */ import { CreateResponse, DeleteResponse, PaginationResponse } from '@app/interfaces/IDataResponse'; import { ICreateTask, ITeamTask } from '@app/interfaces/ITask'; import { ITasksTimesheet } from '@app/interfaces/ITimer'; -import api from '../axios'; +import api, { get } from '../axios'; export function getTasksByIdAPI(taskId: string) { return api.get>(`/tasks/${taskId}`); } -export function getTeamTasksAPI() { - return api.get>('/tasks/team'); +export async function getTeamTasksAPI(organizationId: string, tenantId: string, projectId: string, teamId: string) { + const relations = [ + 'tags', + 'teams', + 'members', + 'members.user', + 'creator', + 'linkedIssues', + 'linkedIssues.taskTo', + 'linkedIssues.taskFrom', + 'parent', + 'children' + ]; + + const obj = { + 'where[organizationId]': organizationId, + 'where[tenantId]': tenantId, + 'where[projectId]': projectId, + 'join[alias]': 'task', + 'join[leftJoinAndSelect][members]': 'task.members', + 'join[leftJoinAndSelect][user]': 'members.user', + 'where[teams][0]': teamId + } as Record; + + relations.forEach((rl, i) => { + obj[`relations[${i}]`] = rl; + }); + + const query = new URLSearchParams(obj); + const endpoint = `/tasks/team?${query.toString()}`; + const data = await get(endpoint, true, { tenantId }); + + return process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL ? data.data : data; } export function deleteTaskAPI(taskId: string) { @@ -23,16 +55,97 @@ export function createTeamTaskAPI(body: Partial & { title: string } return api.post>('/tasks/team', body); } -export function tasksTimesheetStatisticsAPI(employeeId?: string) { - return api.get<{ global: ITasksTimesheet[]; today: ITasksTimesheet[] }>( - `/timer/timesheet/statistics-tasks${employeeId ? '?employeeId=' + employeeId : ''}` - ); +export async function tasksTimesheetStatisticsAPI( + tenantId: string, + activeTaskId: string, + organizationId: string, + employeeId?: string +) { + if (process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL) { + const employeesParams = employeeId + ? [employeeId].reduce((acc: any, v, i) => { + acc[`employeeIds[${i}]`] = v; + return acc; + }) + : {}; + const commonParams = { + tenantId, + organizationId, + // ...(activeTaskId ? { 'taskIds[0]': activeTaskId } : {}), + ...employeesParams + }; + const globalQueries = new URLSearchParams({ + ...commonParams, + defaultRange: 'false' + }); + const globalData = await get(`/timesheet/statistics/tasks?${globalQueries.toString()}`, true, { + tenantId + }); + + const todayQueries = new URLSearchParams({ + defaultRange: 'true', + unitOfTime: 'day' + }); + const todayData = await get(`/timesheet/statistics/tasks?${todayQueries.toString()}`, true, { + tenantId + }); + + return { + data: { + global: globalData.data, + today: todayData.data + } + }; + } else { + return api.get<{ global: ITasksTimesheet[]; today: ITasksTimesheet[] }>( + `/timer/timesheet/statistics-tasks${employeeId ? '?employeeId=' + employeeId : ''}` + ); + } } -export function activeTaskTimesheetStatisticsAPI() { - return api.get<{ global: ITasksTimesheet[]; today: ITasksTimesheet[] }>( - `/timer/timesheet/statistics-tasks?activeTask=true` - ); +export async function activeTaskTimesheetStatisticsAPI( + tenantId: string, + activeTaskId: string, + organizationId: string, + employeeId?: string +) { + if (process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL) { + const employeesParams = employeeId + ? [employeeId].reduce((acc: any, v, i) => { + acc[`employeeIds[${i}]`] = v; + return acc; + }) + : {}; + const commonParams = { + tenantId, + organizationId, + ...(activeTaskId ? { 'taskIds[0]': activeTaskId } : {}), + ...employeesParams + }; + const globalQueries = new URLSearchParams({ + ...commonParams, + defaultRange: 'false' + }); + const globalData = await get(`/timesheet/statistics/tasks?${globalQueries.toString()}`, true, { + tenantId + }); + + const todayQueries = new URLSearchParams({ ...commonParams, defaultRange: 'true', unitOfTime: 'day' }); + const todayData = await get(`/timesheet/statistics/tasks?${todayQueries.toString()}`, true, { + tenantId + }); + + return { + data: { + global: globalData.data, + today: todayData.data + } + }; + } else { + return api.get<{ global: ITasksTimesheet[]; today: ITasksTimesheet[] }>( + `/timer/timesheet/statistics-tasks?activeTask=true` + ); + } } export function allTaskTimesheetStatisticsAPI() { diff --git a/apps/web/app/services/client/api/timer.ts b/apps/web/app/services/client/api/timer.ts index 759957888..45928cadb 100644 --- a/apps/web/app/services/client/api/timer.ts +++ b/apps/web/app/services/client/api/timer.ts @@ -1,8 +1,14 @@ import { ITimerStatus, IToggleTimerParams, TimerSource } from '@app/interfaces/ITimer'; -import api from '../axios'; +import api, { get } from '../axios'; -export function getTimerStatusAPI() { - return api.get('/timer/status'); +export async function getTimerStatusAPI(tenantId: string, organizationId: string) { + const params = new URLSearchParams({ tenantId, organizationId }); + const endpoint = process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL + ? `/timesheet/timer/status?${params.toString()}` + : '/timer/status'; + const data = await get(endpoint, true); + + return process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL ? data.data : data; } export function toggleTimerAPI(body: Pick) { diff --git a/apps/web/app/services/client/axios.ts b/apps/web/app/services/client/axios.ts index 216232ef2..bd53becb2 100644 --- a/apps/web/app/services/client/axios.ts +++ b/apps/web/app/services/client/axios.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-mixed-spaces-and-tabs */ import { API_BASE_URL, DEFAULT_APP_PATH } from '@app/constants'; import { getAccessTokenCookie, getActiveTeamIdCookie } from '@app/helpers/cookies'; import axios, { AxiosResponse } from 'axios'; @@ -70,10 +71,39 @@ apiDirect.interceptors.response.use( } ); -function get(endpoint: string, isDirect: boolean) { - return isDirect && process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL ? apiDirect.get(endpoint) : api.get(endpoint); +function get( + endpoint: string, + isDirect: boolean, + extras?: { + tenantId: string; + } +) { + return isDirect && process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL + ? apiDirect.get(endpoint, { + headers: { + ...(extras?.tenantId ? { 'tenant-id': extras?.tenantId } : {}) + } + }) + : api.get(endpoint); +} + +function post( + endpoint: string, + data: any, + isDirect: boolean, + extras?: { + tenantId: string; + } +) { + return isDirect && process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL + ? apiDirect.post(endpoint, data, { + headers: { + ...(extras?.tenantId ? { 'tenant-id': extras?.tenantId } : {}) + } + }) + : api.post(endpoint, data); } export default api; -export { apiDirect, get }; +export { apiDirect, get, post }; diff --git a/apps/web/app/services/server/requests/issue-type.ts b/apps/web/app/services/server/requests/issue-type.ts index 48efbfa13..3ee5a737d 100644 --- a/apps/web/app/services/server/requests/issue-type.ts +++ b/apps/web/app/services/server/requests/issue-type.ts @@ -52,12 +52,12 @@ export function getIssueTypesListRequest( { organizationId, tenantId, - activeTeamId - }: { tenantId: string; organizationId: string; activeTeamId: string | null }, + organizationTeamId + }: { tenantId: string; organizationId: string; organizationTeamId: string | null }, bearer_token: string ) { return serverFetch({ - path: `/issue-types?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${activeTeamId}`, + path: `/issue-types?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${organizationTeamId}`, method: 'GET', bearer_token }); diff --git a/apps/web/app/services/server/requests/smtp.ts b/apps/web/app/services/server/requests/smtp.ts index 79e9a5b05..d0e1cd695 100644 --- a/apps/web/app/services/server/requests/smtp.ts +++ b/apps/web/app/services/server/requests/smtp.ts @@ -4,6 +4,9 @@ import { serverFetch } from '../fetch'; export function createTenantSmtpRequest({ tenantId, access_token }: { tenantId: string; access_token: string }) { const config = smtpConfiguration(); + + console.log(`SMTP Config: ${JSON.stringify(config)}`); + return serverFetch({ path: '/smtp', method: 'POST', diff --git a/apps/web/app/services/server/requests/task-labels.ts b/apps/web/app/services/server/requests/task-labels.ts index 08063489e..28ec48bd9 100644 --- a/apps/web/app/services/server/requests/task-labels.ts +++ b/apps/web/app/services/server/requests/task-labels.ts @@ -52,8 +52,8 @@ export function getTaskLabelsListRequest( { organizationId, tenantId, - activeTeamId: organizationTeamId - }: { tenantId: string; organizationId: string; activeTeamId: string | null }, + organizationTeamId: organizationTeamId + }: { tenantId: string; organizationId: string; organizationTeamId: string | null }, bearer_token: string ) { const params = new URLSearchParams({ diff --git a/apps/web/app/services/server/requests/task-priorities.ts b/apps/web/app/services/server/requests/task-priorities.ts index 149062218..e4098116b 100644 --- a/apps/web/app/services/server/requests/task-priorities.ts +++ b/apps/web/app/services/server/requests/task-priorities.ts @@ -52,12 +52,12 @@ export function getTaskPrioritiesListRequest( { organizationId, tenantId, - activeTeamId - }: { tenantId: string; organizationId: string; activeTeamId: string | null }, + organizationTeamId + }: { tenantId: string; organizationId: string; organizationTeamId: string | null }, bearer_token: string ) { return serverFetch({ - path: `/task-priorities?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${activeTeamId}`, + path: `/task-priorities?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${organizationTeamId}`, method: 'GET', bearer_token }); diff --git a/apps/web/app/services/server/requests/task-related-issue-type.ts b/apps/web/app/services/server/requests/task-related-issue-type.ts index 32f5feb88..c0cb5744b 100644 --- a/apps/web/app/services/server/requests/task-related-issue-type.ts +++ b/apps/web/app/services/server/requests/task-related-issue-type.ts @@ -56,16 +56,16 @@ export function getTaskRelatedIssueTypeListRequest( { organizationId, tenantId, - activeTeamId + organizationTeamId }: { tenantId: string; organizationId: string; - activeTeamId: string | null; + organizationTeamId: string | null; }, bearer_token: string ) { return serverFetch({ - path: `/task-related-issue-types?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${activeTeamId}`, + path: `/task-related-issue-types?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${organizationTeamId}`, method: 'GET', bearer_token }); diff --git a/apps/web/app/services/server/requests/task-version.ts b/apps/web/app/services/server/requests/task-version.ts index e18a22d12..2e037b804 100644 --- a/apps/web/app/services/server/requests/task-version.ts +++ b/apps/web/app/services/server/requests/task-version.ts @@ -52,16 +52,16 @@ export function getTaskVersionListRequest( { organizationId, tenantId, - activeTeamId + organizationTeamId }: { tenantId: string; organizationId: string; - activeTeamId: string | null; + organizationTeamId: string | null; }, bearer_token: string ) { return serverFetch({ - path: `/task-versions?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${activeTeamId}`, + path: `/task-versions?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${organizationTeamId}`, method: 'GET', bearer_token }); diff --git a/apps/web/app/services/server/requests/taskStatus.ts b/apps/web/app/services/server/requests/taskStatus.ts index 737401ae4..7d8b860d8 100644 --- a/apps/web/app/services/server/requests/taskStatus.ts +++ b/apps/web/app/services/server/requests/taskStatus.ts @@ -52,16 +52,16 @@ export function getTaskStatusListRequest( { organizationId, tenantId, - activeTeamId + organizationTeamId }: { tenantId: string; organizationId: string; - activeTeamId: string | null; + organizationTeamId: string | null; }, bearer_token: string ) { return serverFetch({ - path: `/task-statuses?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${activeTeamId}`, + path: `/task-statuses?tenantId=${tenantId}&organizationId=${organizationId}&organizationTeamId=${organizationTeamId}`, method: 'GET', bearer_token }); diff --git a/apps/web/app/services/server/requests/timesheet.ts b/apps/web/app/services/server/requests/timesheet.ts index 6b602c895..7b17116a2 100644 --- a/apps/web/app/services/server/requests/timesheet.ts +++ b/apps/web/app/services/server/requests/timesheet.ts @@ -1,7 +1,7 @@ import { ITasksTimesheet } from '@app/interfaces/ITimer'; import { serverFetch } from '../fetch'; -type TTasksTimesheetStatisticsParams = { +export type TTasksTimesheetStatisticsParams = { tenantId: string; organizationId: string; startDate?: string; diff --git a/apps/web/app/stores/kanban.ts b/apps/web/app/stores/kanban.ts new file mode 100644 index 000000000..0badd4c91 --- /dev/null +++ b/apps/web/app/stores/kanban.ts @@ -0,0 +1,7 @@ +import { IKanban } from "@app/interfaces/IKanban"; +import { atom } from "recoil"; + +export const kanbanBoardState = atom({ + key: 'kanbanBoardState', + default: {} +}) \ No newline at end of file diff --git a/apps/web/app/stores/task-filter.ts b/apps/web/app/stores/task-filter.ts new file mode 100644 index 000000000..35a4a2afb --- /dev/null +++ b/apps/web/app/stores/task-filter.ts @@ -0,0 +1,6 @@ +import { atom } from 'recoil'; + +export const taskBlockFilterState = atom<'all' | 'running' | 'online' | 'pause' | 'idle' | 'suspended'>({ + key: 'taskBlockFilterState', + default: 'all' +}); diff --git a/apps/web/components/pages/main/no-team.tsx b/apps/web/components/pages/main/no-team.tsx index b74203855..82763de76 100644 --- a/apps/web/components/pages/main/no-team.tsx +++ b/apps/web/components/pages/main/no-team.tsx @@ -1,6 +1,6 @@ -import { useModal } from '@app/hooks'; +import { useAuthenticateUser, useModal } from '@app/hooks'; import { clsxm } from '@app/utils'; -import { Avatar, Button, Text } from 'lib/components'; +import { Avatar, Button, Text, Tooltip } from 'lib/components'; import { CreateTeamModal } from 'lib/features'; import { PropsWithChildren } from 'react'; import { useTranslation } from 'react-i18next'; @@ -10,6 +10,7 @@ type Props = PropsWithChildren & React.ComponentPropsWithRef<'div'>; const NoTeam = ({ className, ...rest }: Props) => { const { t } = useTranslation(); const { isOpen, closeModal, openModal } = useModal(); + const { user } = useAuthenticateUser(); return (

@@ -22,9 +23,16 @@ const NoTeam = ({ className, ...rest }: Props) => { {t('common.NO_TEAM_SUB')}

- + + + + ); diff --git a/apps/web/components/pages/task/details-section/blocks/task-main-info.tsx b/apps/web/components/pages/task/details-section/blocks/task-main-info.tsx index cc08ecc02..bc86add07 100644 --- a/apps/web/components/pages/task/details-section/blocks/task-main-info.tsx +++ b/apps/web/components/pages/task/details-section/blocks/task-main-info.tsx @@ -1,3 +1,4 @@ +/* eslint-disable no-mixed-spaces-and-tabs */ import { calculateRemainingDays, formatDateString } from '@app/helpers'; import { useOrganizationTeams, useSyncRef, useTeamMemberCard, useTeamTasks } from '@app/hooks'; import { ITeamTask, OT_Member } from '@app/interfaces'; @@ -217,7 +218,10 @@ const ManageMembersPopover = (memberList: OT_Member[], task: ITeamTask | null) = const unassignedMembers = useMemo( () => memberList.filter((member) => - member.employee ? !task?.members.map((item) => item.userId).includes(member.employee.userId) : false + member.employee + ? !task?.members.map((item) => item.userId).includes(member.employee.userId) && + member.employee?.isActive + : false ), [memberList, task?.members] ); @@ -225,7 +229,10 @@ const ManageMembersPopover = (memberList: OT_Member[], task: ITeamTask | null) = const assignedTaskMembers = useMemo( () => memberList.filter((member) => - member.employee ? task?.members.map((item) => item.userId).includes(member.employee?.userId) : false + member.employee + ? task?.members.map((item) => item.userId).includes(member.employee?.userId) && + member.employee?.isActive + : false ), [memberList, task?.members] ); diff --git a/apps/web/lib/app/authenticator.tsx b/apps/web/lib/app/authenticator.tsx index 83d180411..ea2dd9b17 100644 --- a/apps/web/lib/app/authenticator.tsx +++ b/apps/web/lib/app/authenticator.tsx @@ -47,7 +47,7 @@ export function withAuthentication(Component: NextPage, params: Params useEffect(() => { if (!user) { queryCall().then((res) => { - setUser(res.data.user); + setUser(res.data); }); } }, [queryCall, setUser, user]); diff --git a/apps/web/lib/components/Kanban.tsx b/apps/web/lib/components/Kanban.tsx index b6b0a42d9..37d11a5d7 100644 --- a/apps/web/lib/components/Kanban.tsx +++ b/apps/web/lib/components/Kanban.tsx @@ -206,7 +206,7 @@ export const EmptyKanbanDroppable = ({index,title, items}: { { title.length > 0 ? <>
@@ -220,24 +220,28 @@ export const EmptyKanbanDroppable = ({index,title, items}: {
-
- {items.length} -
-
-

- {title} -

+
+
+ {items.length} +
+
+

+ + {title} + +

+
diff --git a/apps/web/lib/components/radial-progress.tsx b/apps/web/lib/components/radial-progress.tsx new file mode 100644 index 000000000..f15d10d24 --- /dev/null +++ b/apps/web/lib/components/radial-progress.tsx @@ -0,0 +1,52 @@ +export default function RadialProgress({ + radius = 24, + cx = 24, + cy = 24, + percentage = 55 +}: { + radius?: number; + cx?: number; + cy?: number; + percentage: number; +}) { + const circumference = radius * 2 * Math.PI; + + return ( + <> +
+ + + + + + {percentage}% + +
+ + ); +} diff --git a/apps/web/lib/components/separator.tsx b/apps/web/lib/components/separator.tsx index 394bb8e12..fb26b2f0c 100644 --- a/apps/web/lib/components/separator.tsx +++ b/apps/web/lib/components/separator.tsx @@ -4,3 +4,11 @@ import { clsxm } from '@app/utils'; export const VerticalSeparator = ({ className }: IClassName) => { return
; }; + +export const HorizontalSeparator = ({ className }: IClassName) => { + return ( +
+
+
+ ); +}; diff --git a/apps/web/lib/components/svgs/icons.tsx b/apps/web/lib/components/svgs/icons.tsx index 83e8afe54..d2b2b186b 100644 --- a/apps/web/lib/components/svgs/icons.tsx +++ b/apps/web/lib/components/svgs/icons.tsx @@ -1305,6 +1305,46 @@ export function StopCircleIcon({ className }: IClassName) { ); } +export function NotWorkingIcon({ className }: IClassName) { + return ( + + ); +} + +export function OnlineIcon({ className }: IClassName) { + return ( + + ); +} + // ============================= Settings 4 Icon ============================= // export function Settings4Icon({ className }: IClassName) { @@ -2221,13 +2261,13 @@ export function QuoteBlockIcon({ className }: IClassName) { ); } -export function AddIcon({ +export function AddIcon({ className, - width=14, - height=14 + width = 14, + height = 14 }: IClassName<{ - width?: number, - height?: number, + width?: number; + height?: number; }>) { return ( ; showStatus?: boolean }) { +export function TaskAllStatusTypes({ + task, + showStatus = false, + toBlockCard = false +}: { + task?: Nullable; + showStatus?: boolean; + toBlockCard?: boolean; +}) { const taskPriorities = useTaskPrioritiesValue(); const taskSizes = useTaskSizesValue(); const taskLabels = useTaskLabelsValue(); @@ -64,7 +72,7 @@ export function TaskAllStatusTypes({ task, showStatus = false }: { task?: Nullab /> )} - {task?.size && ( + {task?.size && !toBlockCard && ( 60) || false}> @@ -30,6 +55,7 @@ export function TaskNameInfoDisplay({ task, className, taskTitleClassName, taskN #{task?.taskNumber} {dash && '-'} {task?.title} + {showSize && {size && ' ' + short}} diff --git a/apps/web/lib/features/task/task-filters.tsx b/apps/web/lib/features/task/task-filters.tsx index d5430d436..fdaff4a8d 100644 --- a/apps/web/lib/features/task/task-filters.tsx +++ b/apps/web/lib/features/task/task-filters.tsx @@ -396,14 +396,16 @@ function TaskStatusFilter({ hook }: { hook: I_TaskFilter }) { ); } -function TaskNameFilter({ +export function TaskNameFilter({ value, setValue, - close + close, + fullWidth = false }: { value: string; setValue: (v: string) => void; close: () => void; + fullWidth?: boolean; }) { const { t } = useTranslation(); @@ -426,7 +428,7 @@ function TaskNameFilter({ }; return ( -
+
; + return radial ? ( + + ) : ( + + ); } diff --git a/apps/web/lib/features/task/task-times.tsx b/apps/web/lib/features/task/task-times.tsx index f5784fd6e..e3382025f 100644 --- a/apps/web/lib/features/task/task-times.tsx +++ b/apps/web/lib/features/task/task-times.tsx @@ -12,9 +12,10 @@ type Props = { memberInfo?: I_TeamMemberCardHook | OT_Member | any; showDaily?: boolean; showTotal?: boolean; + isBlock?: boolean; } & IClassName; -export function TaskTimes({ className, task, memberInfo, showDaily = true, showTotal = true }: Props) { +export function TaskTimes({ className, task, memberInfo, showDaily = true, showTotal = true, isBlock = false }: Props) { // For public page const { activeTeam } = useOrganizationTeams(); const currentMember = activeTeam?.members.find((member) => member.id === memberInfo?.member?.id || memberInfo?.id); @@ -38,7 +39,11 @@ export function TaskTimes({ className, task, memberInfo, showDaily = true, showT return (
- + {isBlock ? ( + + ) : ( + + )}
); } @@ -59,7 +64,7 @@ function TimeInfo({ <> {showDaily && (
- {t('common.TODAY')}: + {t('common.TODAY')}: {daily.h}h : {daily.m}m @@ -73,7 +78,7 @@ function TimeInfo({ // showDaily && ['text-sm'] )} > - {t('common.TOTAL')}: + {t('common.TOTAL')}: {total.h}h : {total.m}m @@ -83,6 +88,50 @@ function TimeInfo({ ); } +function TimeBlockInfo({ + daily, + total, + showDaily = true, + showTotal = true +}: { + daily: { h: number; m: number }; + total: { h: number; m: number }; + showDaily?: boolean; + showTotal?: boolean; +}) { + const { t } = useTranslation(); + return ( +
+ {showDaily && ( +
+ + {t('common.WORKED_ON_TASK')} {t('common.TODAY')}: + + + {daily.h}h : {daily.m}m + +
+ )} + + {showTotal && ( +
+ + {t('common.WORKED_ON_TASK')} {t('common.TOTAL')}: + + + {total.h}h : {total.m}m + +
+ )} +
+ ); +} + export function TodayWorkedTime({ className, memberInfo }: Omit) { // Get current timer seconds const { activeTeam } = useOrganizationTeams(); diff --git a/apps/web/lib/features/team-members-block-view.tsx b/apps/web/lib/features/team-members-block-view.tsx new file mode 100644 index 000000000..4ca828133 --- /dev/null +++ b/apps/web/lib/features/team-members-block-view.tsx @@ -0,0 +1,72 @@ +import * as React from 'react'; +import { OT_Member } from '@app/interfaces'; +import { Transition } from '@headlessui/react'; +import { UserTeamBlock } from './team/user-team-block'; +import UserTeamCardSkeletonCard from '@components/shared/skeleton/UserTeamCardSkeleton'; + +interface Props { + teamMembers: OT_Member[]; + publicTeam: boolean; + currentUser: OT_Member | undefined; + teamsFetching: boolean; +} + +const TeamMembersBlockView: React.FC = ({ teamMembers: members, publicTeam = false, currentUser }) => { + return ( +
+ {/* Current authenticated user members */} + + {/* */} + +
+ {members.map((member) => { + return ( +
+ + + +
+ ); + })} +
+
+ + {new Array(3).fill(0).map((_, i) => { + return ( +
+ +
+ ); + })} +
+
+
+ ); +}; + +export default TeamMembersBlockView; diff --git a/apps/web/lib/features/team-members-kanban-view.tsx b/apps/web/lib/features/team-members-kanban-view.tsx index cad9ba0b9..9b116c7c3 100644 --- a/apps/web/lib/features/team-members-kanban-view.tsx +++ b/apps/web/lib/features/team-members-kanban-view.tsx @@ -1,7 +1,7 @@ +import { useKanban } from "@app/hooks/features/useKanban"; import { clsxm } from "@app/utils"; import KanbanDraggable, { EmptyKanbanDroppable } from "lib/components/Kanban" import { AddIcon } from "lib/components/svgs"; -import { state } from "pages/kanban"; import React from "react"; import { useEffect, useState } from "react"; import { DragDropContext, DropResult, Droppable, DroppableProvided, DroppableStateSnapshot } from "react-beautiful-dnd"; @@ -53,19 +53,22 @@ const reorderItemMap = ({ itemMap, source, destination }: { }; }; -const getHeaderBackground = (column: any) => { - const selectState = state.filter((item: any)=> { +const getHeaderBackground = (columns: any, column: any) => { + const selectState = columns.filter((item: any)=> { return item.name === column.toUpperCase() }); - return selectState[0].backgroundColor + return selectState[0].color } export const KanbanView = ({ itemsArray }: { itemsArray: any}) => { - const [items, setItems] = useState(itemsArray); + const { columns:kanbanColumns } = useKanban(); + const [items, setItems] = useState(itemsArray); + const [columns, setColumn] = useState(Object.keys(itemsArray)); + /** * This function handles all drag and drop logic * on the kanban board. @@ -156,7 +159,7 @@ export const KanbanView = ({ itemsArray }: { itemsArray: any}) => { > {(provided: DroppableProvided, snapshot: DroppableStateSnapshot) => (
@@ -172,7 +175,7 @@ export const KanbanView = ({ itemsArray }: { itemsArray: any}) => { index={index} title={column} items={items[column]} - backgroundColor={getHeaderBackground(column)} + backgroundColor={getHeaderBackground(kanbanColumns, column)} />
diff --git a/apps/web/lib/features/team-members-table-view.tsx b/apps/web/lib/features/team-members-table-view.tsx index 2d5e939bf..601e774a2 100644 --- a/apps/web/lib/features/team-members-table-view.tsx +++ b/apps/web/lib/features/team-members-table-view.tsx @@ -55,8 +55,6 @@ const TeamMembersTableView = ({ [] ); - const footerRows = React.useMemo(() => [], []); - const sortedTeamMembers: OT_Member[] = []; if (currentUser) { sortedTeamMembers.push(currentUser); @@ -64,15 +62,17 @@ const TeamMembersTableView = ({ sortedTeamMembers.push(...teamMembers); return ( - []} - data={sortedTeamMembers} - footerRows={footerRows} - noResultsMessage={{ - heading: 'No team members found', - content: 'Try adjusting your search or filter to find what you’re looking for.' - }} - /> + <> + []} + data={sortedTeamMembers} + noResultsMessage={{ + heading: 'No team members found', + content: 'Try adjusting your search or filter to find what you’re looking for.' + }} + /> + + ); }; @@ -81,10 +81,10 @@ function Invite() { const { openModal, isOpen, closeModal } = useModal(); return ( - <> +
- +
); } diff --git a/apps/web/lib/features/team-members.tsx b/apps/web/lib/features/team-members.tsx index 0370171ee..b5212fed2 100644 --- a/apps/web/lib/features/team-members.tsx +++ b/apps/web/lib/features/team-members.tsx @@ -6,17 +6,25 @@ import { UserCard } from '@components/shared/skeleton/TeamPageSkeleton'; import TeamMembersTableView from './team-members-table-view'; import TeamMembersCardView from './team-members-card-view'; import { IssuesView } from '@app/constants'; +import TeamMembersBlockView from './team-members-block-view'; +import { useRecoilValue } from 'recoil'; +import { taskBlockFilterState } from '@app/stores/task-filter'; type TeamMembersProps = { publicTeam?: boolean; kanbanView?: IssuesView; }; -export function TeamMembers({ publicTeam = false, kanbanView: kanbanView = IssuesView.CARDS }: TeamMembersProps) { +export function TeamMembers({ publicTeam = false, kanbanView: view = IssuesView.CARDS }: TeamMembersProps) { const { user } = useAuthenticateUser(); + const activeFilter = useRecoilValue(taskBlockFilterState); const { activeTeam } = useOrganizationTeams(); const { teamsFetching } = useOrganizationTeams(); const members = activeTeam?.members || []; + + const blockViewMembers = + activeFilter == 'all' ? members : members.filter((m) => m.timerStatus == activeFilter) || []; + const currentUser = members.find((m) => m.employee.userId === user?.id); const $members = members.filter((member) => member.id !== currentUser?.id); const $teamsFetching = teamsFetching && members.length === 0; @@ -34,11 +42,12 @@ export function TeamMembers({ publicTeam = false, kanbanView: kanbanView = Issue
+
); break; - case kanbanView === IssuesView.CARDS: + case view === IssuesView.CARDS: teamMembersView = ( ); break; - case kanbanView === IssuesView.TABLE: + case view === IssuesView.TABLE: teamMembersView = ( ); break; + + case view == IssuesView.BLOCKS: + teamMembersView = ( + + ); + break; default: teamMembersView = (
- {/* Show user name, email and image */}
diff --git a/apps/web/lib/features/team/team-item.tsx b/apps/web/lib/features/team/team-item.tsx index 1c8683dd2..ab274ae03 100644 --- a/apps/web/lib/features/team/team-item.tsx +++ b/apps/web/lib/features/team/team-item.tsx @@ -25,7 +25,7 @@ export function mapTeamItems(teams: IOrganizationTeamList[], onChangeActiveTeam:
{ + return getTimerStatusValue(timerStatus, member, publicTeam); + }, [timerStatus, member, publicTeam]); + + let totalWork = <>; + if (memberInfo.isAuthUser) { + const { h, m } = secondsToTime( + ((member?.totalTodayTasks && + member?.totalTodayTasks.reduce( + (previousValue, currentValue) => previousValue + currentValue.duration, + 0 + )) || + activeTaskTotalStat?.duration || + 0) + addSeconds + ); + + totalWork = ( +
+ {t('common.TOTAL_WORKED_TODAY')}: + + {h}h : {m}m + +
+ ); + } + + const menu = ( + <> + {(!collaborativeSelect || active) && } + + {collaborativeSelect && !active && ( + + )} + + ); + + return ( +
+ + {/* flex */} +
+ + {/* total time */} +
+ {totalWork} +
{menu}
+
+
+ + + + {/* Task information */} + + + + + {/* flex */} +
+
+ {/* total time */} + + {/* today time */} +
+ {/* progress time */} + +
+
+
+ ); +} diff --git a/apps/web/lib/features/team/user-team-block/task-info.tsx b/apps/web/lib/features/team/user-team-block/task-info.tsx new file mode 100644 index 000000000..2438e9fba --- /dev/null +++ b/apps/web/lib/features/team/user-team-block/task-info.tsx @@ -0,0 +1,102 @@ +import React from 'react'; +import { I_TeamMemberCardHook, I_TMCardTaskEditHook } from '@app/hooks'; +import { IClassName } from '@app/interfaces'; +import { clsxm } from '@app/utils'; +import { TaskAllStatusTypes, TaskInput, TaskNameInfoDisplay } from 'lib/features'; +import { useRouter } from 'next/router'; + +type Props = IClassName & { + edition: I_TMCardTaskEditHook; + memberInfo: I_TeamMemberCardHook; + publicTeam?: boolean; +}; + +export function TaskInfo({ className, memberInfo, edition, publicTeam }: Props) { + return ( +
+ {/* task */} +
+ {edition.task && ( + + )} + {!edition.task &&
--
} +
+ + {edition.task && } + {!edition.task &&
--
} +
+ ); +} + +export function TaskBlockInfo({ className, memberInfo, edition, publicTeam }: Props) { + return ( +
+ {/* task */} +
+ {edition.task && ( + + )} + {!edition.task &&
--
} +
+ + {edition.task && } + {!edition.task &&
--
} +
+ ); +} + +/** + * A component that is used to display the task name and also allow the user to edit the task name. + */ +function TaskDetailAndEdition({ edition, publicTeam }: Props) { + const task = edition.task; + const hasEditMode = edition.editMode && task; + const router = useRouter(); + + edition.taskEditIgnoreElement.onOutsideClick(() => { + edition.setEditMode(false); + }); + + return ( + <> + {/* Task value */} +
null : () => task && router.push(`/task/${task?.id}`)} + > + +
+ + {/* Show task input combobox when in edit mode */} +
+ {hasEditMode && ( + { + console.log(e); + }} + onEnterKey={() => { + edition.setEditMode(false); + }} + /> + )} +
+ + ); +} diff --git a/apps/web/lib/features/team/user-team-block/user-info.tsx b/apps/web/lib/features/team/user-team-block/user-info.tsx new file mode 100644 index 000000000..4b7cfbc2f --- /dev/null +++ b/apps/web/lib/features/team/user-team-block/user-info.tsx @@ -0,0 +1,64 @@ +/* eslint-disable no-mixed-spaces-and-tabs */ +import { I_TeamMemberCardHook, useTimer } from '@app/hooks'; +import { IClassName, ITimerStatusEnum } from '@app/interfaces'; +import { clsxm, isValidUrl } from '@app/utils'; +import { Avatar } from 'lib/components'; +// import { MailIcon } from 'lib/components/svgs'; +import { getTimerStatusValue, TimerStatus } from 'lib/features'; +import Link from 'next/link'; +import { useMemo } from 'react'; +import stc from 'string-to-color'; +import { imgTitle } from '@app/helpers'; + +type Props = { + memberInfo: I_TeamMemberCardHook; + publicTeam?: boolean; +} & IClassName; + +export function UserBoxInfo({ className, memberInfo, publicTeam = false }: Props) { + const { memberUser, member } = memberInfo; + const fullname = `${memberUser?.firstName || ''} ${memberUser?.lastName || ''}`; + + const imageUrl = useMemo(() => { + return memberUser?.image?.thumbUrl || memberUser?.image?.fullUrl || memberUser?.imageUrl || ''; + }, [memberUser?.image?.thumbUrl, memberUser?.image?.fullUrl, memberUser?.imageUrl]); + + const { timerStatus } = useTimer(); + const timerStatusValue: ITimerStatusEnum = useMemo(() => { + return getTimerStatusValue(timerStatus, member, publicTeam); + }, [timerStatus, member, publicTeam]); + + return ( + +
+ {imageUrl && isValidUrl(imageUrl) ? ( + + ) : ( +
+ {imgTitle(fullname).charAt(0)} +
+ )} + +
+ +

{fullname}

+ + ); +} diff --git a/apps/web/lib/features/team/user-team-block/user-team-block-header.tsx b/apps/web/lib/features/team/user-team-block/user-team-block-header.tsx new file mode 100644 index 000000000..93eea739f --- /dev/null +++ b/apps/web/lib/features/team/user-team-block/user-team-block-header.tsx @@ -0,0 +1,231 @@ +import React from 'react'; +import { useOrganizationTeams, useAuthenticateUser, useModal, useUserProfilePage } from '@app/hooks'; +import { clsxm } from '@app/utils'; +import { InviteFormModal } from '../invite/invite-form-modal'; +import { taskBlockFilterState } from '@app/stores/task-filter'; +import { + PauseIcon, + SearchNormalIcon, + TimerPlayIcon, + StopCircleIcon, + NotWorkingIcon, + OnlineIcon +} from 'lib/components/svgs'; +import { Transition } from '@headlessui/react'; +import { Button, VerticalSeparator } from 'lib/components'; +import { useTaskFilter, TaskNameFilter } from 'lib/features'; +import { useRecoilState } from 'recoil'; + +interface IFilter { + running: number; + online: number; + pause: number; + idle: number; + suspended: number; +} + +export function UserTeamBlockHeader() { + // const { t } = useTranslation(); + const { activeTeam } = useOrganizationTeams(); + const { user } = useAuthenticateUser(); + const { openModal, isOpen, closeModal } = useModal(); + const [activeFilter, setActiveFilter] = useRecoilState< + 'all' | 'running' | 'online' | 'pause' | 'idle' | 'suspended' + >(taskBlockFilterState); + + const profile = useUserProfilePage(); + const hook = useTaskFilter(profile); + + const membersStatusNumber: IFilter = { + running: 0, + online: 0, + pause: 0, + idle: 0, + suspended: 0 + }; + + const members = activeTeam?.members ? activeTeam?.members : []; + members?.map((item) => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + membersStatusNumber[item.timerStatus!]++; + }); + + return ( + <> +
+
+
setActiveFilter('all')} + > + +

All members

+ + {members?.length} + +
+
setActiveFilter('idle')} + > + +

Not working

+ + {membersStatusNumber.idle} + +
+
setActiveFilter('running')} + > + +

Working

+ + {membersStatusNumber.running} + +
+
setActiveFilter('pause')} + > + +

Paused

+ + {membersStatusNumber.pause} + +
+
setActiveFilter('online')} + > + +

Online

+ + {membersStatusNumber.online} + +
+
+
+ {/* */} + + + + + +
+
+
+ + {hook.filterType === 'search' && ( + { + hook.toggleFilterType('search'); + }} + /> + )} + +
+ + + ); +} diff --git a/apps/web/lib/features/team/user-team-block/user-team-card-menu.tsx b/apps/web/lib/features/team/user-team-block/user-team-card-menu.tsx new file mode 100644 index 000000000..b2729f60f --- /dev/null +++ b/apps/web/lib/features/team/user-team-block/user-team-card-menu.tsx @@ -0,0 +1,231 @@ +import { mergeRefs } from '@app/helpers'; +import { I_TeamMemberCardHook, I_TMCardTaskEditHook } from '@app/hooks'; +import { IClassName, ITeamTask } from '@app/interfaces'; +import { clsxm } from '@app/utils'; +import { Popover, Transition } from '@headlessui/react'; +import { Card, ConfirmDropdown, SpinnerLoader, Text } from 'lib/components'; +import { MoreIcon } from 'lib/components/svgs'; +import { TaskUnOrAssignPopover } from 'lib/features/task/task-assign-popover'; +import { useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; + +type Props = IClassName & { + memberInfo: I_TeamMemberCardHook; + edition: I_TMCardTaskEditHook; +}; + +export function UserTeamCardMenu(props: Props) { + return ; +} + +function DropdownMenu({ edition, memberInfo }: Props) { + const { onAssignTask, onUnAssignTask, onRemoveMember } = useDropdownAction({ + edition, + memberInfo + }); + + const { t } = useTranslation(); + const loading = edition.loading || memberInfo.updateOTeamLoading; + + const menu = [ + { + name: t('common.EDIT_TASK'), + closable: true, + onClick: () => { + edition.task && edition.setEditMode(true); + }, + active: (memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && edition.task + }, + { + name: t('common.ESTIMATE'), + closable: true, + onClick: () => { + edition.task && edition.setEstimateEditMode(true); + }, + active: (memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && edition.task + }, + { + name: t('common.ASSIGN_TASK'), + action: 'assign', + onClick: onAssignTask, + + active: (memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && memberInfo.memberUnassignTasks.length > 0 + }, + { + name: t('common.UNASSIGN_TASK'), + action: 'unassign', + closable: true, + onClick: onUnAssignTask, + + active: (memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && !!memberInfo.memberTask + }, + { + name: memberInfo.isTeamManager ? t('common.UNMAKE_A_MANAGER') : t('common.MAKE_A_MANAGER'), + // MAke or unmake member a manager + onClick: memberInfo.isTeamManager ? memberInfo.unMakeMemberManager : memberInfo.makeMemberManager, + active: memberInfo.isAuthTeamManager && !memberInfo.isAuthUser && !memberInfo.isTeamCreator, + closable: true + }, + { + name: t('common.REMOVE'), + type: 'danger', + action: 'remove', + active: memberInfo.isAuthTeamManager && !memberInfo.isAuthUser && !memberInfo.isTeamOwner, + onClick: onRemoveMember + } + ].filter((item) => item.active || item.active === undefined); + + return ( + + {!loading && ( + + + + )} + {loading && } + + + + {({ close }) => { + return ( + +
    + {menu.map((item, i) => { + const text = ( + + {item.name} + + ); + + // When true show combobox component (AssignActionMenu) + const assignAction = item.action === 'assign'; + + const removeAction = item.action === 'remove'; + + return ( +
  • + {assignAction && ( + // Show only for item with combobox menu + { + // Can close all open combobox + item.onClick && + item.onClick({ + task, + closeCombobox1: closeCmbx, + closeCombobox2: close + }); + }} + userProfile={memberInfo.member} + usersTaskCreatedAssignTo={ + memberInfo.member?.employeeId + ? [{ id: memberInfo.member?.employeeId }] + : undefined + } + > + {text} + + )} + + {removeAction && ( + { + item.onClick && item.onClick({ close }); + }} + > + {text} + + )} + + {/* WHen hasn't an action */} + {!assignAction && !removeAction && ( + + )} +
  • + ); + })} +
+
+ ); + }} +
+
+
+ ); +} + +type IAssignCall = (params: { task?: ITeamTask; closeCombobox1?: () => void; closeCombobox2?: () => void }) => void; + +export function useDropdownAction({ edition, memberInfo }: Pick) { + const onAssignTask: IAssignCall = useCallback( + ({ task, closeCombobox1, closeCombobox2 }) => { + if (!task) return; + + edition.setLoading(true); + memberInfo.assignTask(task).finally(() => edition.setLoading(false)); + + closeCombobox1 && closeCombobox1(); + closeCombobox2 && closeCombobox2(); + }, + [edition, memberInfo] + ); + + const onUnAssignTask: IAssignCall = useCallback(() => { + if (!memberInfo.memberTask) return; + edition.setLoading(true); + + memberInfo.unassignTask(memberInfo.memberTask).finally(() => edition.setLoading(false)); + }, [memberInfo, edition]); + + const onRemoveMember = useCallback( + ({ close }: { close?: () => void }) => { + memberInfo.removeMemberFromTeam(); + close && close(); + }, + [memberInfo] + ); + + return { + onAssignTask, + onUnAssignTask, + onRemoveMember + }; +} diff --git a/apps/web/lib/features/team/user-team-card/task-estimate.tsx b/apps/web/lib/features/team/user-team-card/task-estimate.tsx index f56e9f26a..9e2e89dab 100644 --- a/apps/web/lib/features/team/user-team-card/task-estimate.tsx +++ b/apps/web/lib/features/team/user-team-card/task-estimate.tsx @@ -12,19 +12,22 @@ type Props = IClassName & { memberInfo: I_TeamMemberCardHook; edition: I_TMCardTaskEditHook; activeAuthTask: boolean; + showTime?: boolean; + radial?: boolean; }; -export function TaskEstimateInfo({ className, activeAuthTask, ...rest }: Props) { +export function TaskEstimateInfo({ className, activeAuthTask, showTime = true, radial = false, ...rest }: Props) { return (
- + {showTime && }
diff --git a/apps/web/lib/features/timer/timer-status.tsx b/apps/web/lib/features/timer/timer-status.tsx index 32737d224..402316c4f 100644 --- a/apps/web/lib/features/timer/timer-status.tsx +++ b/apps/web/lib/features/timer/timer-status.tsx @@ -3,6 +3,7 @@ import { IClassName, ITimerStatus, ITimerStatusEnum, OT_Member } from '@app/inte import { clsxm } from '@app/utils'; import { Tooltip } from 'lib/components'; import { PauseIcon, StopCircleIcon, TimerPlayIcon, UserOnlineAndTrackingTimeIcon } from 'lib/components/svgs'; +import { capitalize } from 'lodash'; import moment from 'moment'; type Props = { @@ -15,7 +16,7 @@ type Props = { export function TimerStatus({ status, className, showIcon = true, tooltipClassName, labelContainerClassName }: Props) { return ( diff --git a/apps/web/lib/layout/main-layout.tsx b/apps/web/lib/layout/main-layout.tsx index 07e4a1b6b..27e398c26 100644 --- a/apps/web/lib/layout/main-layout.tsx +++ b/apps/web/lib/layout/main-layout.tsx @@ -34,7 +34,7 @@ export function MainLayout({ children, title, showTimer, publicTeam, notFound, c
diff --git a/apps/web/next.config.js b/apps/web/next.config.js index c1c53edea..eabcfd6e9 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -1,6 +1,8 @@ /* eslint-disable @typescript-eslint/no-var-requires */ const path = require('path'); +console.log(`NEXT_PUBLIC_GAUZY_API_SERVER_URL: ${process.env.NEXT_PUBLIC_GAUZY_API_SERVER_URL}`); + // eslint-disable-next-line @typescript-eslint/no-var-requires /** @type {import('next').NextConfig} */ const nextConfig = { @@ -29,19 +31,19 @@ const nextConfig = { }, // Optional build-time configuration options sentry: { // For all available options, see: https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/ - + // Upload a larger set of source maps for prettier stack traces (increases build time) widenClientFileUpload: true, - + // Transpiles SDK to be compatible with IE11 (increases bundle size) transpileClientSDK: true, - + // Routes browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers (increases server load) tunnelRoute: '/monitoring', - + // Hides source maps from generated client bundles hideSourceMaps: true, - + // Automatically tree-shake Sentry logger statements to reduce bundle size disableLogger: true } @@ -50,9 +52,9 @@ const nextConfig = { // Injected content via Sentry wizard below const { withSentryConfig } = require('@sentry/nextjs'); -const sentryWebpackPluginOptions = { - org: process.env.SENTRY_ORG, - project: process.env.SENTRY_PROJECT, +const sentryWebpackPluginOptions = { + org: process.env.SENTRY_ORG || 'ever-co', + project: process.env.SENTRY_PROJECT || 'ever-teams-web', // An auth token is required for uploading source maps. authToken: process.env.SENTRY_AUTH_TOKEN, @@ -60,8 +62,8 @@ const sentryWebpackPluginOptions = { silent: true, // Suppresses all logs dryRun: process.env.NODE_ENV !== "production" - - // Additional config options for the Sentry Webpack plugin. + + // Additional config options for the Sentry Webpack plugin. // Keep in mind that https://github.com/getsentry/sentry-webpack-plugin#options. }; diff --git a/apps/web/package.json b/apps/web/package.json index 19d83883b..dc0391870 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -22,6 +22,12 @@ "@heroicons/react": "^2.0.12", "@jitsi/react-sdk": "^1.3.0", "@jitsu/jitsu-react": "^1.3.0", + "@opentelemetry/api": "^1.7.0", + "@opentelemetry/auto-instrumentations-node": "^0.40.1", + "@opentelemetry/exporter-trace-otlp-http": "^0.45.1", + "@opentelemetry/resources": "^1.18.1", + "@opentelemetry/sdk-node": "^0.45.1", + "@opentelemetry/semantic-conventions": "^1.18.1", "@popperjs/core": "^2.11.6", "@radix-ui/react-avatar": "^1.0.3", "@radix-ui/react-dialog": "^1.0.4", @@ -34,6 +40,7 @@ "@sentry/nextjs": "^7.80.0", "@tanstack/react-table": "^8.10.7", "@types/react-google-recaptcha": "^2.1.5", + "@uidotdev/usehooks": "^2.4.1", "@vercel/analytics": "^0.1.6", "autoprefixer": "^10.4.12", "axios": "^1.1.2", diff --git a/apps/web/pages/_app.tsx b/apps/web/pages/_app.tsx index fd09b3eac..845ca8655 100644 --- a/apps/web/pages/_app.tsx +++ b/apps/web/pages/_app.tsx @@ -86,6 +86,12 @@ MyApp.getInitialProps = async ({ Component, ctx }: { Component: NextPage(IssuesView.CARDS); + const { online } = useNetworkState(); + + if (!online) { + return ( +
You are Currently Offline
+ ); + } return ( @@ -44,7 +53,7 @@ function MainPage() { )} onClick={() => setView(IssuesView.CARDS)} > - + +
@@ -66,13 +86,17 @@ function MainPage() {
{isTeamMember ? : null} {/* Header user card list */} - {view === IssuesView.CARDS && isTeamMember ? : null} + {view === IssuesView.CARDS && isTeamMember ? ( + + ) : view === IssuesView.BLOCKS ? ( + + ) : null} {/* Divider */} diff --git a/apps/web/pages/kanban/index.tsx b/apps/web/pages/kanban/index.tsx index 128eb1f55..589389ca3 100644 --- a/apps/web/pages/kanban/index.tsx +++ b/apps/web/pages/kanban/index.tsx @@ -1,173 +1,17 @@ +import { useKanban } from "@app/hooks/features/useKanban"; import { withAuthentication } from "lib/app/authenticator"; import { KanbanView } from "lib/features/team-members-kanban-view" import { MainLayout } from "lib/layout"; -import { useRouter } from "next/router"; -import { useEffect, useState } from "react"; - -const todo = { - id: 'status-1', - name: 'TODO', - backgroundColor: '#8154BA', -} - -const ongoing = { - id: 'status-2', - name: 'ONGOING', - backgroundColor: '#D7EBDF', -} - -const review = { - id: 'status-3', - name: 'REVIEW', - backgroundColor: '#EAD2D5', -} - -export const state = [ todo, ongoing, review] - -const demoData = { - todo: [ - { - id: '1', - content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', - hasComment: "tagged", - tags: [ - { - id: 'tag-1', - title: 'User Profile', - backgroundColor: '#8154BA', - color: '#fff' - }, - { - id: 'tag-2', - title: 'BackEnd', - backgroundColor: '#EAD2D5', - color: '#DD2F44' - }, - ], - status: todo - }, - { - id: '4', - content: 'demo content2', - hasComment: "none", - tags: [ - { - id: 'tag-1', - title: 'User Profile', - backgroundColor: '#D7EBDF', - color: '#3D9360' - }, - { - id: 'tag-2', - title: 'BackEnd', - backgroundColor: '#EAD9EE', - color: '#9641AB' - }, - ], - status: todo - } - ], - ongoing: [ - { - id: '2', - content: 'another content', - hasComment: "untagged", - tags: [ - { - id: 'tag-1', - title: 'User Profile', - backgroundColor: '#EAD9EE', - color: '#9641AB' - }, - { - id: 'tag-2', - title: 'BackEnd', - backgroundColor: '#EAD2D5', - color: '#DD2F44' - }, - ], - status: ongoing - }, - { - id: '5', - content: 'another content2', - hasComment: "none", - tags: [ - { - id: 'tag-1', - title: 'User Profile', - backgroundColor: '#8154BA', - color: '#fff' - }, - { - id: 'tag-2', - title: 'BackEnd', - backgroundColor: '#D7EBDF', - color: '#3D9360' - }, - ], - status: ongoing - } - ], - review: [ - { - id: '3', - content: 'a simple tes', - hasComment: "none", - tags: [ - { - id: 'tag-1', - title: 'User Profile', - backgroundColor: '#D7EBDF', - color: '#3D9360' - }, - { - id: 'tag-2', - title: 'BackEnd', - backgroundColor: '#D7EBDF', - color: '#3D9360' - }, - ], - status: review - }, - { - id: '6', - content: 'a simple tes', - hasComment: "none", - tags: [ - { - id: 'tag-1', - title: 'User Profile', - backgroundColor: '#D7EBDF', - color: '#3D9360' - }, - { - id: 'tag-2', - title: 'BackEnd', - backgroundColor: '#D7EBDF', - color: '#3D9360' - }, - ], - status: review - } - ]} const Kanban= () => { - const router = useRouter() - const [winReady, setwinReady] = useState(false); - - useEffect(() => { - - setwinReady(true); - - - }, [router.isReady]); - + + const { data } = useKanban(); + return ( <> - {winReady ? - + {Object.keys(data).length > 0 ? + : null } diff --git a/apps/web/public/locales/ar/common.json b/apps/web/public/locales/ar/common.json index 25723e096..06e0fd6f7 100644 --- a/apps/web/public/locales/ar/common.json +++ b/apps/web/public/locales/ar/common.json @@ -132,7 +132,8 @@ "TRANSFER_TEAM": "نقل الفريق", "TEAM_MEMBERS": "أعضاء الفريق", "NO_TEAM": "أنشئ فريقك الخاص أو انضم إلى فريق موجود", - "NO_TEAM_SUB": "نص توضيحي مؤقت هنا", + "NO_TEAM_SUB": "من الرائع العمل مع الآخرين، لذا قم بإنشاء فريق وادعو الجميع للتعاون!", + "NO_TEAM_TOOLTIP": "تحتاج إلى التحقق من عنوان بريدك الإلكتروني", "CANCEL": "إلغاء", "DISCARD": "تجاهل", "EXISTING_MEMBER": "عضو بالفعل", diff --git a/apps/web/public/locales/bg/common.json b/apps/web/public/locales/bg/common.json index f58bf56a2..eb09aeb2e 100644 --- a/apps/web/public/locales/bg/common.json +++ b/apps/web/public/locales/bg/common.json @@ -130,7 +130,8 @@ "TRANSFER_TEAM": "Прехвърляне на отбор", "TEAM_MEMBERS": "Членове на отбора", "NO_TEAM": "Създайте собствен отбор или се присъединете към съществуващ", - "NO_TEAM_SUB": "Lorem ipsum dolor sit amet consectetur. Blandit lobortis dui risus neque.", + "NO_TEAM_SUB": "Прекрасно е да се работи с други, затова създайте екип и поканете всички за сътрудничество!", + "NO_TEAM_TOOLTIP": "You need to verify your email address", "CANCEL": "Отказ", "DISCARD": "Изхвърляне", "EXISTING_MEMBER": "Вече член", diff --git a/apps/web/public/locales/de/common.json b/apps/web/public/locales/de/common.json index 69b0753e0..b0d614157 100644 --- a/apps/web/public/locales/de/common.json +++ b/apps/web/public/locales/de/common.json @@ -131,7 +131,8 @@ "TRANSFER_TEAM": "Team übertragen", "TEAM_MEMBERS": "Teammitglieder", "NO_TEAM": "Erstellen Sie Ihr eigenes Team oder treten Sie einem bestehenden bei", - "NO_TEAM_SUB": "Lorem ipsum dolor sit amet consectetur. Blandit lobortis dui risus neque.", + "NO_TEAM_SUB": "Es ist großartig, mit anderen zusammenzuarbeiten, also erstelle ein Team und lade alle zur Zusammenarbeit ein!", + "NO_TEAM_TOOLTIP": "Sie müssen Ihre E-Mail-Adresse bestätigen", "CANCEL": "Abbrechen", "DISCARD": "Verwerfen", "EXISTING_MEMBER": "Bereits Mitglied", diff --git a/apps/web/public/locales/en/common.json b/apps/web/public/locales/en/common.json index eb95b39a4..812911aaa 100644 --- a/apps/web/public/locales/en/common.json +++ b/apps/web/public/locales/en/common.json @@ -132,7 +132,8 @@ "TRANSFER_TEAM": "Transfer Team", "TEAM_MEMBERS": "Team Members", "NO_TEAM": "Create your own team or join existed", - "NO_TEAM_SUB": "Lorem ipsum dolor sit amet consectetur. Blandit lobortis dui risus neque.", + "NO_TEAM_SUB": "It's great to work with others so create a team and invite everyone to collaborate!", + "NO_TEAM_TOOLTIP": "You need to verify your email address", "CANCEL": "Cancel", "DISCARD": "Discard", "EXISTING_MEMBER": "Already a Member", diff --git a/apps/web/public/locales/es/common.json b/apps/web/public/locales/es/common.json index d7b79d306..d7352b283 100644 --- a/apps/web/public/locales/es/common.json +++ b/apps/web/public/locales/es/common.json @@ -130,7 +130,8 @@ "TRANSFER_TEAM": "Transferir equipo", "TEAM_MEMBERS": "Miembros del equipo", "NO_TEAM": "Crea tu propio equipo o únete a uno existente", - "NO_TEAM_SUB": "Lorem ipsum dolor sit amet consectetur. Blandit lobortis dui risus neque.", + "NO_TEAM_SUB": "Es genial trabajar con otros, así que ¡crea un equipo e invita a todos a colaborar!", + "NO_TEAM_TOOLTIP": "Necesitas verificar tu dirección de correo electrónico", "CANCEL": "Cancelar", "DISCARD": "Descartar", "EXISTING_MEMBER": "Ya es miembro", diff --git a/apps/web/public/locales/fr/common.json b/apps/web/public/locales/fr/common.json index c8c968cc0..9e72f2651 100644 --- a/apps/web/public/locales/fr/common.json +++ b/apps/web/public/locales/fr/common.json @@ -130,7 +130,8 @@ "TRANSFER_TEAM": "Transférer l'équipe", "TEAM_MEMBERS": "Membres de l'équipe", "NO_TEAM": "Créez votre propre équipe ou rejoignez une équipe existante", - "NO_TEAM_SUB": "Lorem ipsum dolor sit amet consectetur. Blandit lobortis dui risus neque.", + "NO_TEAM_SUB": "Il est génial de travailler avec d'autres, alors créez une équipe et invitez tout le monde à collaborer !", + "NO_TEAM_TOOLTIP": "Vous devez vérifier votre adresse e-mail", "CANCEL": "Annuler", "DISCARD": "Annuler", "EXISTING_MEMBER": "Déjà membre", diff --git a/apps/web/public/locales/he/common.json b/apps/web/public/locales/he/common.json index f149b5bba..aada3d6ee 100644 --- a/apps/web/public/locales/he/common.json +++ b/apps/web/public/locales/he/common.json @@ -131,7 +131,8 @@ "TRANSFER_TEAM": "העבר צוות", "TEAM_MEMBERS": "חברי צוות", "NO_TEAM": "צור צוות משלך או הצטרף לקיים", - "NO_TEAM_SUB": "Lorem ipsum dolor sit amet consectetur. Blandit lobortis dui risus neque.", + "NO_TEAM_SUB": "זה נהדר לעבוד עם אחרים, לכן צור צוות והזמן את כולם לשתף פעולה!", + "NO_TEAM_TOOLTIP": "עליך לאמת את כתובת האימייל שלך", "CANCEL": "בטל", "DISCARD": "בטל", "EXISTING_MEMBER": "כבר חבר", diff --git a/apps/web/public/locales/it/common.json b/apps/web/public/locales/it/common.json index 7d18b8d2b..652fb9be6 100644 --- a/apps/web/public/locales/it/common.json +++ b/apps/web/public/locales/it/common.json @@ -131,7 +131,8 @@ "TRANSFER_TEAM": "Transfer Team", "TEAM_MEMBERS": "Team Members", "NO_TEAM": "Create your own team or join existed", - "NO_TEAM_SUB": "Lorem ipsum dolor sit amet consectetur. Blandit lobortis dui risus neque.", + "NO_TEAM_SUB": "È fantastico lavorare con gli altri, quindi crea un team e invita tutti a collaborare!", + "NO_TEAM_TOOLTIP": "È necessario verificare il tuo indirizzo email", "CANCEL": "Cancel", "DISCARD": "Discard", "EXISTING_MEMBER": "Already a Member", diff --git a/apps/web/public/locales/nl/common.json b/apps/web/public/locales/nl/common.json index b6d7c13fb..8b156ff2a 100644 --- a/apps/web/public/locales/nl/common.json +++ b/apps/web/public/locales/nl/common.json @@ -131,7 +131,8 @@ "TRANSFER_TEAM": "Team overdragen", "TEAM_MEMBERS": "Teamleden", "NO_TEAM": "Maak uw eigen team of sluit u aan bij een bestaand team", - "NO_TEAM_SUB": "Lorem ipsum dolor sit amet consectetur. Blandit lobortis dui risus neque.", + "NO_TEAM_SUB": "Het is geweldig om met anderen samen te werken, dus creëer een team en nodig iedereen uit om samen te werken!", + "NO_TEAM_TOOLTIP": "Je moet je e-mailadres verifiëren", "CANCEL": "Annuleren", "DISCARD": "Negeren", "EXISTING_MEMBER": "Al lid", diff --git a/apps/web/public/locales/pl/common.json b/apps/web/public/locales/pl/common.json index 535c44020..5eb383e2b 100644 --- a/apps/web/public/locales/pl/common.json +++ b/apps/web/public/locales/pl/common.json @@ -131,7 +131,8 @@ "TRANSFER_TEAM": "Transfer Team", "TEAM_MEMBERS": "Team Members", "NO_TEAM": "Create your own team or join existed", - "NO_TEAM_SUB": "Lorem ipsum dolor sit amet consectetur. Blandit lobortis dui risus neque.", + "NO_TEAM_SUB": "Świetnie jest pracować z innymi, więc stwórz zespół i zaproś wszystkich do współpracy!", + "NO_TEAM_TOOLTIP": "Musisz zweryfikować swój adres e-mail", "CANCEL": "Cancel", "DISCARD": "Discard", "EXISTING_MEMBER": "Already a Member", diff --git a/apps/web/public/locales/pt/common.json b/apps/web/public/locales/pt/common.json index 73e4fb0ba..33cec78fe 100644 --- a/apps/web/public/locales/pt/common.json +++ b/apps/web/public/locales/pt/common.json @@ -131,7 +131,8 @@ "TRANSFER_TEAM": "Transfer Team", "TEAM_MEMBERS": "Team Members", "NO_TEAM": "Create your own team or join existed", - "NO_TEAM_SUB": "Lorem ipsum dolor sit amet consectetur. Blandit lobortis dui risus neque.", + "NO_TEAM_SUB": "É ótimo trabalhar com os outros, então crie uma equipe e convide todos para colaborar!", + "NO_TEAM_TOOLTIP": "Você precisa verificar seu endereço de e-mail", "CANCEL": "Cancel", "DISCARD": "Discard", "EXISTING_MEMBER": "Already a Member", diff --git a/apps/web/public/locales/ru/common.json b/apps/web/public/locales/ru/common.json index 65359fe53..bae449628 100644 --- a/apps/web/public/locales/ru/common.json +++ b/apps/web/public/locales/ru/common.json @@ -131,7 +131,8 @@ "TRANSFER_TEAM": "Transfer Team", "TEAM_MEMBERS": "Team Members", "NO_TEAM": "Create your own team or join existed", - "NO_TEAM_SUB": "Lorem ipsum dolor sit amet consectetur. Blandit lobortis dui risus neque.", + "NO_TEAM_SUB": "Замечательно работать с другими, поэтому создайте команду и пригласите всех к сотрудничеству!", + "NO_TEAM_TOOLTIP": "Вы должны подтвердить свой адрес электронной почты", "CANCEL": "Cancel", "DISCARD": "Discard", "EXISTING_MEMBER": "Already a Member", diff --git a/apps/web/public/locales/zh/common.json b/apps/web/public/locales/zh/common.json index a1118a05e..f9bb24a2e 100644 --- a/apps/web/public/locales/zh/common.json +++ b/apps/web/public/locales/zh/common.json @@ -131,7 +131,8 @@ "TRANSFER_TEAM": "转让团队", "TEAM_MEMBERS": "团队成员", "NO_TEAM": "创建您自己的团队或加入已有团队", - "NO_TEAM_SUB": "Lorem ipsum dolor sit amet consectetur. Blandit lobortis dui risus neque.", + "NO_TEAM_SUB": "与他人合作是很棒的,所以创建一个团队,邀请每个人一起合作!", + "NO_TEAM_TOOLTIP": "您需要验证您的电子邮件地址", "CANCEL": "取消", "DISCARD": "放弃", "EXISTING_MEMBER": "已是成员", diff --git a/apps/web/styles/globals.css b/apps/web/styles/globals.css index d89958e13..3645fa0be 100644 --- a/apps/web/styles/globals.css +++ b/apps/web/styles/globals.css @@ -9,6 +9,10 @@ --tooltipBackground: #000; } +body { + @apply bg-[#F2F2F2]; +} + html.dark { --tooltipBackground: #000; } @@ -297,3 +301,10 @@ html.dark { transform: scale(1.2); } } + +.progress-ring__circle { + stroke-dasharray: 400, 400; + transition: stroke-dashoffset 0.35s; + transform: rotate(-90deg); + transform-origin: 50% 50%; +} diff --git a/northflank-template.json b/northflank-template.json new file mode 100644 index 000000000..64de68c2d --- /dev/null +++ b/northflank-template.json @@ -0,0 +1,59 @@ +{ + "apiVersion": "v1", + "spec": { + "kind": "Workflow", + "spec": { + "type": "sequential", + "steps": [ + { + "kind": "DeploymentService", + "spec": { + "deployment": { + "instances": 1, + "docker": { + "configType": "default" + }, + "external": { + "imagePath": "ghcr.io/ever-co/ever-teams-webapp:latest" + } + }, + "runtimeEnvironment": {}, + "runtimeFiles": {}, + "billing": { + "deploymentPlan": "nf-compute-10" + }, + "name": "ever-teams-web", + "ports": [ + { + "internalPort": 3000, + "protocol": "HTTP", + "public": true, + "name": "p01", + "domains": [], + "security": { + "policies": [], + "credentials": [] + }, + "disableNfDomain": false + } + ] + } + } + ] + } + }, + "name": "ever-teams-template", + "description": "Open Work and Project Management Platform.", + "project": { + "spec": { + "name": "Ever Teams Template", + "region": "europe-west", + "description": "Open Work and Project Management Platform.", + "color": "#3826A6", + "networking": { + "allowedIngressProjects": [] + } + } + }, + "$schema": "https://api.northflank.com/v1/schemas/template" +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 94a10c29b..16cd73a86 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2364,6 +2364,14 @@ "@grpc/proto-loader" "^0.7.8" "@types/node" ">=12.12.47" +"@grpc/grpc-js@^1.7.1": + version "1.9.12" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.12.tgz#a45b23a7d9ee1eadc9fa8fe480e27edbc6544cdd" + integrity sha512-Um5MBuge32TS3lAKX02PGCnFM4xPT996yLgZNb5H03pn6NyJ4Iwn5YcPq6Jj9yxGRk7WOgaZFtVRH5iTdYBeUg== + dependencies: + "@grpc/proto-loader" "^0.7.8" + "@types/node" ">=12.12.47" + "@grpc/proto-loader@^0.5.0": version "0.5.6" resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.6.tgz#1dea4b8a6412b05e2d58514d507137b63a52a98d" @@ -2382,6 +2390,77 @@ protobufjs "^7.2.4" yargs "^17.7.2" +"@hapi/b64@5.x.x": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-5.0.0.tgz#b8210cbd72f4774985e78569b77e97498d24277d" + integrity sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/boom@9.x.x", "@hapi/boom@^9.0.0": + version "9.1.4" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6" + integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/bourne@2.x.x": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.1.0.tgz#66aff77094dc3080bd5df44ec63881f2676eb020" + integrity sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q== + +"@hapi/cryptiles@5.x.x": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-5.1.0.tgz#655de4cbbc052c947f696148c83b187fc2be8f43" + integrity sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA== + dependencies: + "@hapi/boom" "9.x.x" + +"@hapi/hoek@9.x.x", "@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/iron@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-6.0.0.tgz#ca3f9136cda655bdd6028de0045da0de3d14436f" + integrity sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw== + dependencies: + "@hapi/b64" "5.x.x" + "@hapi/boom" "9.x.x" + "@hapi/bourne" "2.x.x" + "@hapi/cryptiles" "5.x.x" + "@hapi/hoek" "9.x.x" + +"@hapi/podium@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-4.1.3.tgz#91e20838fc2b5437f511d664aabebbb393578a26" + integrity sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g== + dependencies: + "@hapi/hoek" "9.x.x" + "@hapi/teamwork" "5.x.x" + "@hapi/validate" "1.x.x" + +"@hapi/teamwork@5.x.x": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-5.1.1.tgz#4d2ba3cac19118a36c44bf49a3a47674de52e4e4" + integrity sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@hapi/validate@1.x.x": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@hapi/validate/-/validate-1.1.3.tgz#f750a07283929e09b51aa16be34affb44e1931ad" + integrity sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@headlessui/react@^1.7.7": version "1.7.17" resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.17.tgz#a0ec23af21b527c030967245fd99776aa7352bc6" @@ -4320,6 +4399,643 @@ dependencies: "@octokit/openapi-types" "^18.0.0" +"@opentelemetry/api-logs@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.45.1.tgz#9e4f2c652dcce798c5627939b22304c2b5ce19c5" + integrity sha512-zVGq/k70l+kB/Wuv3O/zhptP2hvDhEbhDu9EtHde1iWZJf3FedeYS/nWVcMBkkyPAjS/JKNk86WN4CBQLGUuOw== + dependencies: + "@opentelemetry/api" "^1.0.0" + +"@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.7.0.tgz#b139c81999c23e3c8d3c0a7234480e945920fc40" + integrity sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw== + +"@opentelemetry/auto-instrumentations-node@^0.40.1": + version "0.40.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.40.1.tgz#806204b0580c7f7269c8e4c42a0de11b4cddfc93" + integrity sha512-GlXxM3zVSeJn9uKFc9T+FqVrDrnDTGOrZVC3EYX1c+ocl7zoIeyoLiGKNgY/0GkngbyqoDb1O//qtWA58TI91g== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/instrumentation-amqplib" "^0.33.4" + "@opentelemetry/instrumentation-aws-lambda" "^0.37.2" + "@opentelemetry/instrumentation-aws-sdk" "^0.37.0" + "@opentelemetry/instrumentation-bunyan" "^0.33.0" + "@opentelemetry/instrumentation-cassandra-driver" "^0.34.1" + "@opentelemetry/instrumentation-connect" "^0.32.3" + "@opentelemetry/instrumentation-cucumber" "^0.1.2" + "@opentelemetry/instrumentation-dataloader" "^0.5.3" + "@opentelemetry/instrumentation-dns" "^0.32.4" + "@opentelemetry/instrumentation-express" "^0.33.3" + "@opentelemetry/instrumentation-fastify" "^0.32.4" + "@opentelemetry/instrumentation-fs" "^0.8.3" + "@opentelemetry/instrumentation-generic-pool" "^0.32.4" + "@opentelemetry/instrumentation-graphql" "^0.36.0" + "@opentelemetry/instrumentation-grpc" "^0.45.1" + "@opentelemetry/instrumentation-hapi" "^0.33.2" + "@opentelemetry/instrumentation-http" "^0.45.1" + "@opentelemetry/instrumentation-ioredis" "^0.36.0" + "@opentelemetry/instrumentation-knex" "^0.32.3" + "@opentelemetry/instrumentation-koa" "^0.36.2" + "@opentelemetry/instrumentation-lru-memoizer" "^0.33.4" + "@opentelemetry/instrumentation-memcached" "^0.32.4" + "@opentelemetry/instrumentation-mongodb" "^0.37.3" + "@opentelemetry/instrumentation-mongoose" "^0.33.4" + "@opentelemetry/instrumentation-mysql" "^0.34.4" + "@opentelemetry/instrumentation-mysql2" "^0.34.4" + "@opentelemetry/instrumentation-nestjs-core" "^0.33.3" + "@opentelemetry/instrumentation-net" "^0.32.3" + "@opentelemetry/instrumentation-pg" "^0.37.1" + "@opentelemetry/instrumentation-pino" "^0.34.3" + "@opentelemetry/instrumentation-redis" "^0.35.4" + "@opentelemetry/instrumentation-redis-4" "^0.35.5" + "@opentelemetry/instrumentation-restify" "^0.34.2" + "@opentelemetry/instrumentation-router" "^0.33.3" + "@opentelemetry/instrumentation-socket.io" "^0.34.4" + "@opentelemetry/instrumentation-tedious" "^0.6.4" + "@opentelemetry/instrumentation-winston" "^0.33.0" + "@opentelemetry/resource-detector-alibaba-cloud" "^0.28.4" + "@opentelemetry/resource-detector-aws" "^1.3.4" + "@opentelemetry/resource-detector-container" "^0.3.4" + "@opentelemetry/resource-detector-gcp" "^0.29.4" + "@opentelemetry/resources" "^1.12.0" + "@opentelemetry/sdk-node" "^0.45.1" + +"@opentelemetry/context-async-hooks@1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.18.1.tgz#d9eb17e23e469f85b44ca1c4788c42a06a62cc84" + integrity sha512-HHfJR32NH2x0b69CACCwH8m1dpNALoCTtpgmIWMNkeMGNUeKT48d4AX4xsF4uIRuUoRTbTgtSBRvS+cF97qwCQ== + +"@opentelemetry/core@1.18.1", "@opentelemetry/core@^1.0.0", "@opentelemetry/core@^1.1.0", "@opentelemetry/core@^1.8.0": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.18.1.tgz#d2e45f6bd6be4f00d20d18d4f1b230ec33805ae9" + integrity sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg== + dependencies: + "@opentelemetry/semantic-conventions" "1.18.1" + +"@opentelemetry/exporter-trace-otlp-grpc@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.45.1.tgz#46d2336444bbf1f33ab1ffa565dcb32460323c94" + integrity sha512-c/Wrn6LUqPiRgKhvMydau6kPz4ih6b/uwospiavjXju98ZfVv+KjaIF13cblW+4cQ6ZR3lm7t66umQfXrGBhPQ== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.18.1" + "@opentelemetry/otlp-grpc-exporter-base" "0.45.1" + "@opentelemetry/otlp-transformer" "0.45.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + +"@opentelemetry/exporter-trace-otlp-http@0.45.1", "@opentelemetry/exporter-trace-otlp-http@^0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.45.1.tgz#2265181bd4787dc6660bdac33d658490a883283a" + integrity sha512-a6CGqSG66n5R1mghzLMzyzn3iGap1b0v+0PjKFjfYuwLtpHQBxh2PHxItu+m2mXSwnM4R0GJlk9oUW5sQkCE0w== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/otlp-exporter-base" "0.45.1" + "@opentelemetry/otlp-transformer" "0.45.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + +"@opentelemetry/exporter-trace-otlp-proto@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.45.1.tgz#57f786815ae0b5884459195e2044f58c6ba57e7b" + integrity sha512-8QI6QARxNP4y9RUpuQxXjw2HyRNyeuD9CWEhS5ON44Mt+XP7YbOZR3GLx2Ml2JZ8uzB5dd2EGlMgaMuZe36D5Q== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/otlp-exporter-base" "0.45.1" + "@opentelemetry/otlp-proto-exporter-base" "0.45.1" + "@opentelemetry/otlp-transformer" "0.45.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + +"@opentelemetry/exporter-zipkin@1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.18.1.tgz#01e7bd854971a81ae22ac1b3417e61017d074d44" + integrity sha512-RmoWVFXFhvIh3q4szUe8I+/vxuMR0HNsOm39zNxnWJcK7JDwnPra9cLY/M78u6bTgB6Fte8GKgU128vvDzz0Iw== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + "@opentelemetry/semantic-conventions" "1.18.1" + +"@opentelemetry/instrumentation-amqplib@^0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.33.4.tgz#1acccf3ae3efb41a56faf9be1460ef15ffb72caf" + integrity sha512-fL+WrEsIM3cP4VTOsqR8enlT/4VX+OCVF7WALN85bgdFPSRpv2X7ZqsXOdYd358cAp4KO9MiveSkAKwKcTXKLw== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-aws-lambda@^0.37.2": + version "0.37.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.37.2.tgz#37f4f0a4d6bd7f02276ec0aaa1264a92c0af7938" + integrity sha512-PJnbfI2A/0t3HY/iMwtBzMYEhhNkdqu4eXkAt7d8x2atUwGYN/OfQXnyKy0+OHxjL62Ek9eab8AFxNHzJID0kA== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/propagator-aws-xray" "^1.3.1" + "@opentelemetry/resources" "^1.8.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/aws-lambda" "8.10.122" + +"@opentelemetry/instrumentation-aws-sdk@^0.37.0": + version "0.37.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.37.0.tgz#646504798ce397321bac66efde88a77fdc250269" + integrity sha512-xtu7RKk4sYqJVe0PAhIC2m/ag9JO2XyZKjV2P1iOT029ZYOfDQ1RPMFHtm9z73uC9WggPS0eqQYVKP25E5ocwA== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/propagation-utils" "^0.30.4" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-bunyan@^0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.33.0.tgz#6df62168a7cc6ff3f3fc323e6398ccfc8a51a176" + integrity sha512-i3xfmhajtOEuFO+9yMU/wJiH0tY4VtIlbJKGIKVHFOsoNqPQpG7iUQP01p0FRoje+UB+ZUvs4hU7fCZzwtnC1g== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@types/bunyan" "1.8.9" + +"@opentelemetry/instrumentation-cassandra-driver@^0.34.1": + version "0.34.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.34.1.tgz#d81b4e5c1b1061e92d99e342e87a9e853de8876c" + integrity sha512-n2bjMeKctNpXYW/vHURMCOXm56HFgQiD4fyIWioUvLROaPunKDvQpJlCLS88QMQ3f3pz/fp8Bde6gXuciLePxQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-connect@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.32.3.tgz#cf9d20ebc4e01670af8df4eec92f8f91a28d6bf5" + integrity sha512-5BK52mIjNuKgY/RV8h0GLmS4qunXqkCIL7NZ73dJ40pnKMA8jqF5D5A2tFjWkCCQ4BdYfAfyjjiA+uTGoL3ZGg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/connect" "3.4.36" + +"@opentelemetry/instrumentation-cucumber@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.1.2.tgz#171759a79391fc619eeb51b46895dfb21ec669e9" + integrity sha512-+TaM9hD256nuPrcnuy8UpiJbuMFUR/zW0K1nLgcDvJyR5TEhKmBPqDfUQzy1i+zyeJM4NiyqZoOCW6iTQnMPoA== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-dataloader@^0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.5.3.tgz#b50d80f2c9937014c5199bcee1fe1f751100bf69" + integrity sha512-tHpLbcjtdiDFLHFfYjmyKjnDYCQLmp6ceflsA9H4BEEwSE2p5ZW512TQl3abzb3EQK2V7+I1gqIuMGHKxmKIlg== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + +"@opentelemetry/instrumentation-dns@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.32.4.tgz#58e872c0a781d9d95916841cab2b5a12fb5e3f83" + integrity sha512-04DTRKFDEpKgYpCqPGlnpCS0atuRUmAPj35xNGV/H7bZTCA3ZR77NeR3f4tYVfqlnsi3KiM1HzgrhwNBskVIEw== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + semver "^7.5.4" + +"@opentelemetry/instrumentation-express@^0.33.3": + version "0.33.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-express/-/instrumentation-express-0.33.3.tgz#3786aa443652207edcd9e86d10ae74dda8001004" + integrity sha512-Vnt2KT/HnFo0533vyr1l4CV46dBp2KfVVVgu3wdo0ORr1FBhThCw5yvfBUffK/ZS0aTzfJ1ZyJm10qm4h6Prgg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/express" "4.17.18" + +"@opentelemetry/instrumentation-fastify@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.32.4.tgz#5c183a65a28cc4d09d3d1f41e76e4e79370b4ce2" + integrity sha512-uAgH8M483yP2eezc+xnuViOkIq3kzD3+gX9RfPCp9zNA1JV/CIe3i34+CkelBRtI62PyiTijrCxHykCcm5uAXQ== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-fs@^0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.8.3.tgz#f801c895c366ca5aa2c3f4e93ed44bb579a5ec70" + integrity sha512-o5uy91VAvXl1i71/AH3C6KV/6KQVGsnuNmjfUAJo4QqY2ta0Uzlpa0wy0nXvQUAP/3QbTx7NcF3rk3mVxLmgeg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-generic-pool@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.32.4.tgz#9267f22e0b46f4778120fe8b53939f3eafa80dbe" + integrity sha512-NDNzoZ0MCmHeMQRxm1eL0l8fCoHIYFiugu5AZ4wt+S2wbgyh5BCd+ZAqTzSFEJGKGg7KZMfHgVRTiCsj+ljfvA== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-graphql@^0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.36.0.tgz#e885fcca849ab63c81a0f2eae31ef6f2f3ab9c67" + integrity sha512-H5nezZCV4HUjmPi4o2QlFXGzvldZiJ7hAEldy+37qMmm5PaqLmFW4w084/C+4IdPoxm4gJRtI8vkXJQJqqyktQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + +"@opentelemetry/instrumentation-grpc@^0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.45.1.tgz#e4ae7285d8fff0d7c93db1c9c1e7b0164748520f" + integrity sha512-KyssKMi+cMAWc+9buGs7nHjnHm4wQPH99etunFblZCKQlzgPB+s8Q6aIlJ3LCkCaOGAhofpr4IkWh7dMcapJJQ== + dependencies: + "@opentelemetry/instrumentation" "0.45.1" + "@opentelemetry/semantic-conventions" "1.18.1" + +"@opentelemetry/instrumentation-hapi@^0.33.2": + version "0.33.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.33.2.tgz#59fc1c54e5d496c9c5e7eb6ed1225e1d14d24b5e" + integrity sha512-XSe1/emVguKMEiV+ctva+Z9GI/3scPBwtNFAVcJFpM4ekK0SiIF73uBKmaC0mVnU+TIToPlkOC7nbkEbXq6y1g== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/hapi__hapi" "20.0.13" + +"@opentelemetry/instrumentation-http@^0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-http/-/instrumentation-http-0.45.1.tgz#d337aac0e46ded596db594ed587035a993b78707" + integrity sha512-ph7kv38Lipg/ggvoNJrwc3RCceLnTkVZwRbE5iu6w7fGsMjjc9jwlSmaOXKxUJjIimil2hL1qBm8xg2lmOVwxg== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/instrumentation" "0.45.1" + "@opentelemetry/semantic-conventions" "1.18.1" + semver "^7.5.2" + +"@opentelemetry/instrumentation-ioredis@^0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.36.0.tgz#53fc0f0342b25813b2db7378c7b2d37e678ac0e8" + integrity sha512-LmEHE3w8JzPpm2TEPiwjAjOSIPWM6t39TFNXu796IJba35k0ZZG9qQRaxv8CS61EZIT1eH7qgExHwEmPHsOl8Q== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/redis-common" "^0.36.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/ioredis4" "npm:@types/ioredis@^4.28.10" + +"@opentelemetry/instrumentation-knex@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.32.3.tgz#c2e51f2f0563834a1d963d811cac02ff33ee819b" + integrity sha512-8+JvZ1Gs9pMe6pgQfMVjth52WCUuKUu0L0tx237VAA53HHUtsCNPznBHp2EAlsLGSLLptfPvzXz/Bdp009ja8w== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-koa@^0.36.2": + version "0.36.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.36.2.tgz#141ee9a4a25bfd01b283c9ec07e302a3bc90f6e5" + integrity sha512-93DjNOvZRBoqIRg4B+HI6k9vV7FcxfhN8c5/7HvzdUyaQ+GJzWMhTwpz9/P1K9NTEZA4+mNuD/BR3kzKJo52EQ== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/koa" "2.13.9" + "@types/koa__router" "12.0.3" + +"@opentelemetry/instrumentation-lru-memoizer@^0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.33.4.tgz#e41c63fe2ec105aa7f6ea8604f75f04b1818eb10" + integrity sha512-SOO9y15z27n5VpjjHiT1r1H+uNxBHRaHX1z6DhGG0BjaJkyu9p6CSjXhsXu2gsAoubRKMSAd0Q+axf1MiVqhvw== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + +"@opentelemetry/instrumentation-memcached@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.32.4.tgz#1bd7ff775c089dabe771191ba76b4164eea25685" + integrity sha512-q9uswokVrtgKFiVNb3QoTFFulXiHpm6FDOvI/3uO8/TnhhpUh776EuD5kDI0YWZ3J+gkN2Dj82KrmOfqBS5o1A== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/memcached" "^2.2.6" + +"@opentelemetry/instrumentation-mongodb@^0.37.3": + version "0.37.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.37.3.tgz#1a6690c4e8b7844b04db51a00ce9c75abd8300a6" + integrity sha512-RraVhFVy+vD4nApxORSqnKTWJ+tQLn1w+ipAXwk2IWgcDDCurfaIg6xIYzowvmx7rSkP2phUF07kAcQXiPapMQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/sdk-metrics" "^1.9.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-mongoose@^0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.33.4.tgz#ab275cb9452f034fea1fbb0305bd1f5d6dc97f94" + integrity sha512-qPwurJjzxJVIzvlRmN4KADQ+BeD2KsDcEH7fMRPMZ35R90+0fQO3RFmINaO5zUpmYY1tHsw3zhnQVD23Dq+pfA== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-mysql2@^0.34.4": + version "0.34.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.34.4.tgz#cdfe4d6c127a1287e5618f8b3b2e662f66c46bb2" + integrity sha512-pgf7UUMiQFUbfzj2WkjOdzT8IoffsqlAbIdMobyAc2Ca90fIYrpEeIpurkzDJWsw1x4GaQRXmJuERhccgr5BSg== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@opentelemetry/sql-common" "^0.40.0" + +"@opentelemetry/instrumentation-mysql@^0.34.4": + version "0.34.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.34.4.tgz#24a5fe176b23cecc6ac5f4ee665ad4d4ac211bd3" + integrity sha512-LWpCGoKuSoHYIzI/SN3unkNkthdFHGyA3vJJWPmtLPxEP9qtCc2gAJUQQ6Q+73YJmHZdXlZSe7sOqGdKx/KyjQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/mysql" "2.15.22" + +"@opentelemetry/instrumentation-nestjs-core@^0.33.3": + version "0.33.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.33.3.tgz#40bbf1acfccee2e371af71ef6f7edcd5dfc3d80f" + integrity sha512-B5v8Qi0chpHHgp/BeL5EcxQnnjm6OTYiMlGk6rM5X/xz9AdB60fAIXWerKKrG1QQ8JVcS5O4nhP4NzPC0JLjWw== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-net@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-net/-/instrumentation-net-0.32.3.tgz#10214094bab7a30d6ed6e4dcefe2f7c146f1239e" + integrity sha512-v8TiTNk0v78HPsrKclGOwtMQXSfCKBIsZ0IP6dweTHtwdrX905BBdsnnCLyo28UkqybJ1BH0ulf7uk6BrqjfmA== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-pg@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.37.1.tgz#d889691f699718cbbf672f52dcf15ab9d1fd39b2" + integrity sha512-yJcTdwsnFqHLFR+uaS2mIvXfHnlzSD2VWgSvka9Y3SSZepcpiEbVs9G897p0XVNpNImo4+CfhOD6Mh5kL6o7Vg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@opentelemetry/sql-common" "^0.40.0" + "@types/pg" "8.6.1" + "@types/pg-pool" "2.0.4" + +"@opentelemetry/instrumentation-pino@^0.34.3": + version "0.34.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.34.3.tgz#86a3b704b9af6c89f1b487ef2effa885d17dc4bf" + integrity sha512-b2ZWogLb8JsdiB//cb1/8Fq3nXKnejSrNy5iArpC5eapVkJ7zq9jj7/Y0q8nKcK5I5bud1aztRe5K754SQ5LlQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + +"@opentelemetry/instrumentation-redis-4@^0.35.5": + version "0.35.5" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.35.5.tgz#b0f00f055be05c1662636d4312c6f10a81e092cc" + integrity sha512-+CuWyS1QOc/RYGSyLr/3VkXiNVU4rstsJi+b5j1sh4Mzy4sIrOtRQRcl74PXh06vOnSyGTToyQ9n4BKZuHODbQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/redis-common" "^0.36.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-redis@^0.35.4": + version "0.35.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.35.4.tgz#818d62b49294eed308aa4387e4e3d2c6a2c0935d" + integrity sha512-MNO/cuHQMeafNu+K8PdrZDGPjWLsQTmyfJzzjasQgm6ELe+/6deNZzsAXkRK4e4sx+FJH7NDnyyqti/dhB4IeQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/redis-common" "^0.36.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-restify@^0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.34.2.tgz#f1fa78ad188441b5d65c85657f7c869479ffd62e" + integrity sha512-W9fZJ6hH7PNIhzcKcmFjUgU87vnM1gPa/YTW724lZ9ItHPUol4wAcnv/F88xM+eouuZKLmCaCahZYp0tx7D/Ig== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-router@^0.33.3": + version "0.33.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-router/-/instrumentation-router-0.33.3.tgz#ffd3a9a224a95249c88e35e317ed69223d4b6a88" + integrity sha512-LbD+9YBx4SKK10WQ06s2iy9/tN9lQmlgneqem46WKi8rX0W2vo1VX5TEM+Bvn7d5lM5uaPDFGosQR++g52BSDQ== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-socket.io@^0.34.4": + version "0.34.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.34.4.tgz#de8d93e70f8520c7de017766afa8c873076551f9" + integrity sha512-r56esRFNEULo8p4iJ0xsd3JkzUPPtLrIeiX0YnqI5hzaoOz3bmUO7qu6/iiEX9/Ej9/rL0U5ZaEIEmagJIUcIw== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-tedious@^0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.6.4.tgz#b7eafdbf514c0cc88146c4fbd44553acd8dfb6f6" + integrity sha512-bjoagT4AO26QXpv7bE4Vyrwcqxq0ntA2pWCLDHuXRnlt+iWyQm4dS/ExjQR4OuO8aRgeuk/3YC7dSl1rtdO7Kg== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/tedious" "^4.0.10" + +"@opentelemetry/instrumentation-winston@^0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.33.0.tgz#b93979eb8e908d964035ffbd70205985bf9c71c1" + integrity sha512-kf4GC6/IVDt+XumUZ54kB3G+1Kc3TfaLY63uZ+9Qi25LBPeBSYJHQugSvxZ9mK/5Uyf9rPxW2FevjblNyaY54w== + dependencies: + "@opentelemetry/instrumentation" "^0.45.1" + +"@opentelemetry/instrumentation@0.45.1", "@opentelemetry/instrumentation@^0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.45.1.tgz#043ac90a889fae8a551c8d06e16be443984449af" + integrity sha512-V1Cr0g8hSg35lpW3G/GYVZurrhHrQZJdmP68WyJ83f1FDn3iru+/Vnlto9kiOSm7PHhW+pZGdb9Fbv+mkQ31CA== + dependencies: + "@types/shimmer" "^1.0.2" + import-in-the-middle "1.4.2" + require-in-the-middle "^7.1.1" + semver "^7.5.2" + shimmer "^1.2.1" + +"@opentelemetry/otlp-exporter-base@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.45.1.tgz#7170ec200152f89d74b2cf82fcf21fd32deebf03" + integrity sha512-Jvd6x8EwWGKEPWF4tkP4LpTPXiIkkafMNMvMJUfJd5DyNAftL1vAz+48jmi3URL2LMPkGryrvWPz8Tdu917gQw== + dependencies: + "@opentelemetry/core" "1.18.1" + +"@opentelemetry/otlp-grpc-exporter-base@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.45.1.tgz#2b2cb53cbedd169d7638b81c1253ae7e99a4b2d3" + integrity sha512-81X4mlzaAFoQCSXCgvYoMFyTy3mBhf8DD3J8bjW6/PH/rGZPJJkyYW0/YzepMrmBZXqlKZpTOU1aJ8sebVvDvw== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.18.1" + "@opentelemetry/otlp-exporter-base" "0.45.1" + protobufjs "^7.2.3" + +"@opentelemetry/otlp-proto-exporter-base@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.45.1.tgz#791129f256f6c3ae298e0cd96020eaa65d7a0689" + integrity sha512-jtDkly6EW8TZHpbPpwJV9YT5PgbtL5B2UU8zcyGDiLT1wkIAYjFJZ1AqWmROIpydu8ohMq0dRwe4u0izNMdHpA== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/otlp-exporter-base" "0.45.1" + protobufjs "^7.2.3" + +"@opentelemetry/otlp-transformer@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.45.1.tgz#8f6590b93f177510983bea3055e5a3f3d30faad2" + integrity sha512-FhIHgfC0b0XtoBrS5ISfva939yWffNl47ypXR8I7Ru+dunlySpmf2TLocKHYLHGcWiuoeSNO5O4dZCmSKOtpXw== + dependencies: + "@opentelemetry/api-logs" "0.45.1" + "@opentelemetry/core" "1.18.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/sdk-logs" "0.45.1" + "@opentelemetry/sdk-metrics" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + +"@opentelemetry/propagation-utils@^0.30.4": + version "0.30.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagation-utils/-/propagation-utils-0.30.4.tgz#a5f28249066374742608b91a8bad02f945e8dc00" + integrity sha512-drYvwfhdXZ6ax5xnpuEQ/0C0AaCcxXcf47wZFNIK4DZu2RJmGk24XUSGWg5XI9gMKBe5qwXWBh9aSlSLWdA/Ww== + +"@opentelemetry/propagator-aws-xray@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz#7fc77a95fe89c705442b0e5a4218422c2954cc07" + integrity sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ== + dependencies: + "@opentelemetry/core" "^1.0.0" + +"@opentelemetry/propagator-b3@1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.18.1.tgz#e7be021bebdb1851eb9322a6f70bbc8d688b6ec8" + integrity sha512-oSTUOsnt31JDx5SoEy27B5jE1/tiPvvE46w7CDKj0R5oZhCCfYH2bbSGa7NOOyDXDNqQDkgqU1DIV/xOd3f8pw== + dependencies: + "@opentelemetry/core" "1.18.1" + +"@opentelemetry/propagator-jaeger@1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.18.1.tgz#9ce06ba88a375a27d9e0670280307d88c5c99951" + integrity sha512-Kh4M1Qewv0Tbmts6D8LgNzx99IjdE18LCmY/utMkgVyU7Bg31Yuj+X6ZyoIRKPcD2EV4rVkuRI16WVMRuGbhWA== + dependencies: + "@opentelemetry/core" "1.18.1" + +"@opentelemetry/redis-common@^0.36.1": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/redis-common/-/redis-common-0.36.1.tgz#79bca902603dd27862223a751be0f4bb0be54c2b" + integrity sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw== + +"@opentelemetry/resource-detector-alibaba-cloud@^0.28.4": + version "0.28.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.4.tgz#2396ef2d86ca1e541099abba691955b17ad12e90" + integrity sha512-acesz8NgW6asYZNWJvLT/PwaM18iFaVgiEkhPEVtAberyl9+l+e8FBSvCFgV6KSAPnBMbdv11dkN1dSAAqqREg== + dependencies: + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/resource-detector-aws@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.3.4.tgz#5b851817b58217daae9c5498533176884dee07ad" + integrity sha512-G6QK5kcLbqxF4zNFfuXyqZtWecNzwKVVqo/gEXlF3EZSIImPH2bGkElL8HpW9OGktWCqbbjYRTSo8VEjs6PxWA== + dependencies: + "@opentelemetry/core" "^1.0.0" + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/resource-detector-container@^0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.4.tgz#eb9d3bc503bb94de2994874f353f49b13a850ceb" + integrity sha512-p04SnseEk5P18T+90LscSdMYmehrn+paoLgE3s0BEusA+FDail1jRD0SsnoTHO94SM0XePIeaG6ip2n4Id9+8Q== + dependencies: + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/resource-detector-gcp@^0.29.4": + version "0.29.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.4.tgz#1b5aee09bc520c9b3c902c5f2cd0ea6bff2a98a7" + integrity sha512-YoUYYwjcCRRxkHHFco29Hli+dVrIPMDTkJqQ0BaH4MDkfFg4HEbO/WarNHxSv5wAIl3SiI4sYyNJ6qfK5Z92zQ== + dependencies: + "@opentelemetry/core" "^1.0.0" + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + gcp-metadata "^6.0.0" + +"@opentelemetry/resources@1.18.1", "@opentelemetry/resources@^1.0.0", "@opentelemetry/resources@^1.12.0", "@opentelemetry/resources@^1.18.1", "@opentelemetry/resources@^1.8.0": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.18.1.tgz#e27bdc4715bccc8cd4a72d4aca3995ad0a496fe7" + integrity sha512-JjbcQLYMttXcIabflLRuaw5oof5gToYV9fuXbcsoOeQ0BlbwUn6DAZi++PNsSz2jjPeASfDls10iaO/8BRIPRA== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/semantic-conventions" "1.18.1" + +"@opentelemetry/sdk-logs@0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.45.1.tgz#d59a99147ab15eb36757932517dfc9a10e1645e9" + integrity sha512-z0RRgW4LeKEKnhXS4F/HnqB6+7gsy63YK47F4XAJYHs4s1KKg8XnQ2RkbuL31i/a9nXkylttYtvsT50CGr487g== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/resources" "1.18.1" + +"@opentelemetry/sdk-metrics@1.18.1", "@opentelemetry/sdk-metrics@^1.9.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.18.1.tgz#1dd334744a1e5d2eec27e9e9765c73cd2f43aef3" + integrity sha512-TEFgeNFhdULBYiCoHbz31Y4PDsfjjxRp8Wmdp6ybLQZPqMNEb+dRq+XN8Xw3ivIgTaf9gYsomgV5ensX99RuEQ== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/resources" "1.18.1" + lodash.merge "^4.6.2" + +"@opentelemetry/sdk-node@^0.45.1": + version "0.45.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-node/-/sdk-node-0.45.1.tgz#86e238e9dae5187132d0a2a506caeedd098071c3" + integrity sha512-VtYvlz2ydfJLuOUhCnGER69mz2KUYk3/kpbqI1FWlUP+kzTwivMuy7hIPPv6KmuOIMYWmW4lM+WyJACHqNvROw== + dependencies: + "@opentelemetry/api-logs" "0.45.1" + "@opentelemetry/core" "1.18.1" + "@opentelemetry/exporter-trace-otlp-grpc" "0.45.1" + "@opentelemetry/exporter-trace-otlp-http" "0.45.1" + "@opentelemetry/exporter-trace-otlp-proto" "0.45.1" + "@opentelemetry/exporter-zipkin" "1.18.1" + "@opentelemetry/instrumentation" "0.45.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/sdk-logs" "0.45.1" + "@opentelemetry/sdk-metrics" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + "@opentelemetry/sdk-trace-node" "1.18.1" + "@opentelemetry/semantic-conventions" "1.18.1" + +"@opentelemetry/sdk-trace-base@1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.18.1.tgz#256605d90b202002d5672305c66dbcf377132379" + integrity sha512-tRHfDxN5dO+nop78EWJpzZwHsN1ewrZRVVwo03VJa3JQZxToRDH29/+MB24+yoa+IArerdr7INFJiX/iN4gjqg== + dependencies: + "@opentelemetry/core" "1.18.1" + "@opentelemetry/resources" "1.18.1" + "@opentelemetry/semantic-conventions" "1.18.1" + +"@opentelemetry/sdk-trace-node@1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.18.1.tgz#ec35ff9abf89244c4fde1c550645d4effa2d7aba" + integrity sha512-ML0l9TNlfLoplLF1F8lb95NGKgdm6OezDS3Ymqav9sYxMd5bnH2LZVzd4xEF+ov5vpZJOGdWxJMs2nC9no7+xA== + dependencies: + "@opentelemetry/context-async-hooks" "1.18.1" + "@opentelemetry/core" "1.18.1" + "@opentelemetry/propagator-b3" "1.18.1" + "@opentelemetry/propagator-jaeger" "1.18.1" + "@opentelemetry/sdk-trace-base" "1.18.1" + semver "^7.5.2" + +"@opentelemetry/semantic-conventions@1.18.1", "@opentelemetry/semantic-conventions@^1.0.0", "@opentelemetry/semantic-conventions@^1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz#8e47caf57a84b1dcc1722b2025693348cdf443b4" + integrity sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA== + +"@opentelemetry/sql-common@^0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sql-common/-/sql-common-0.40.0.tgz#8cbed0722354d62997c3b9e1adf0e16257be6b15" + integrity sha512-vSqRJYUPJVjMFQpYkQS3ruexCPSZJ8esne3LazLwtCPaPRvzZ7WG3tX44RouAn7w4wMp8orKguBqtt+ng2UTnw== + dependencies: + "@opentelemetry/core" "^1.1.0" + "@parcel/watcher@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" @@ -5258,6 +5974,23 @@ "@sentry/cli" "^1.74.6" webpack-sources "^2.0.0 || ^3.0.0" +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "@sigstore/bundle@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-1.1.0.tgz#17f8d813b09348b16eeed66a8cf1c3d6bd3d04f1" @@ -5527,11 +6260,23 @@ "@tufjs/canonical-json" "1.0.0" minimatch "^9.0.0" +"@types/accepts@*": + version "1.3.7" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.7.tgz#3b98b1889d2b2386604c2bbbe62e4fb51e95b265" + integrity sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ== + dependencies: + "@types/node" "*" + "@types/aria-query@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== +"@types/aws-lambda@8.10.122": + version "8.10.122" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.122.tgz#206c8d71b09325d26a458dba27db842afdc54df1" + integrity sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw== + "@types/babel__core@^7.1.14": version "7.20.1" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" @@ -5580,6 +6325,13 @@ dependencies: "@types/node" "*" +"@types/bunyan@1.8.9": + version "1.8.9" + resolved "https://registry.yarnpkg.com/@types/bunyan/-/bunyan-1.8.9.tgz#22d4517f3217b7c8f5a69bbc8c9f6df79779dcb5" + integrity sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw== + dependencies: + "@types/node" "*" + "@types/connect-history-api-fallback@^1.3.5": version "1.5.0" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" @@ -5595,6 +6347,18 @@ dependencies: "@types/node" "*" +"@types/connect@3.4.36": + version "3.4.36" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" + integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== + dependencies: + "@types/node" "*" + +"@types/content-disposition@*": + version "0.5.8" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.8.tgz#6742a5971f490dc41e59d277eee71361fea0b537" + integrity sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg== + "@types/cookie@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" @@ -5605,6 +6369,16 @@ resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.5.1.tgz#b29aa1f91a59f35e29ff8f7cb24faf1a3a750554" integrity sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g== +"@types/cookies@*": + version "0.7.10" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.10.tgz#c4881dca4dd913420c488508d192496c46eb4fd0" + integrity sha512-hmUCjAk2fwZVPPkkPBcI7jGLIR5mg4OVoNMBwU6aVsMm/iNPY7z9/R+x2fSwLt/ZXoGua6C5Zy2k5xOo9jUyhQ== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + "@types/detox@^18.1.0": version "18.1.0" resolved "https://registry.yarnpkg.com/@types/detox/-/detox-18.1.0.tgz#5d204f08c8db3a03827f9146b043fc2421327753" @@ -5653,6 +6427,16 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/express@4.17.18": + version "4.17.18" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" + integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/graceful-fs@^4.1.3": version "4.1.6" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" @@ -5660,6 +6444,39 @@ dependencies: "@types/node" "*" +"@types/hapi__catbox@*": + version "10.2.6" + resolved "https://registry.yarnpkg.com/@types/hapi__catbox/-/hapi__catbox-10.2.6.tgz#e516bfb4e461441b4ea7f9be870e48864a289494" + integrity sha512-qdMHk4fBlwRfnBBDJaoaxb+fU9Ewi2xqkXD3mNjSPl2v/G/8IJbDpVRBuIcF7oXrcE8YebU5M8cCeKh1NXEn0w== + +"@types/hapi__hapi@20.0.13": + version "20.0.13" + resolved "https://registry.yarnpkg.com/@types/hapi__hapi/-/hapi__hapi-20.0.13.tgz#ea8ce83c192f6e8106f6e76e40f795e7e36d0615" + integrity sha512-LP4IPfhIO5ZPVOrJo7H8c8Slc0WYTFAUNQX1U0LBPKyXioXhH5H2TawIgxKujIyOhbwoBbpvOsBf6o5+ToJIrQ== + dependencies: + "@hapi/boom" "^9.0.0" + "@hapi/iron" "^6.0.0" + "@hapi/podium" "^4.1.3" + "@types/hapi__catbox" "*" + "@types/hapi__mimos" "*" + "@types/hapi__shot" "*" + "@types/node" "*" + joi "^17.3.0" + +"@types/hapi__mimos@*": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz#4f8a1c58345fc468553708d3cb508724aa081bd9" + integrity sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ== + dependencies: + "@types/mime-db" "*" + +"@types/hapi__shot@*": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/hapi__shot/-/hapi__shot-4.1.6.tgz#ee45d9a4a4e109a8d623e4f5f58ae2d8bd7c0773" + integrity sha512-h33NBjx2WyOs/9JgcFeFhkxnioYWQAZxOHdmqDuoJ1Qjxpcs+JGvSjEEoDeWfcrF+1n47kKgqph5IpfmPOnzbg== + dependencies: + "@types/node" "*" + "@types/hoist-non-react-statics@^3.3.0": version "3.3.4" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.4.tgz#cc477ce0283bb9d19ea0cbfa2941fe2c8493a1be" @@ -5668,6 +6485,11 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" +"@types/http-assert@*": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.5.tgz#dfb1063eb7c240ee3d3fe213dac5671cfb6a8dbf" + integrity sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g== + "@types/http-errors@*": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" @@ -5680,6 +6502,13 @@ dependencies: "@types/node" "*" +"@types/ioredis4@npm:@types/ioredis@^4.28.10": + version "4.28.10" + resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.28.10.tgz#40ceb157a4141088d1394bb87c98ed09a75a06ff" + integrity sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ== + dependencies: + "@types/node" "*" + "@types/is-hotkey@^0.1.1": version "0.1.7" resolved "https://registry.yarnpkg.com/@types/is-hotkey/-/is-hotkey-0.1.7.tgz#30ec6d4234895230b576728ef77e70a52962f3b3" @@ -5726,6 +6555,53 @@ dependencies: "@types/node" "*" +"@types/keygrip@*": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.6.tgz#1749535181a2a9b02ac04a797550a8787345b740" + integrity sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ== + +"@types/koa-compose@*": + version "3.2.8" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.8.tgz#dec48de1f6b3d87f87320097686a915f1e954b57" + integrity sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA== + dependencies: + "@types/koa" "*" + +"@types/koa@*": + version "2.13.12" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.12.tgz#70d87a9061a81909e0ee11ca50168416e8d3e795" + integrity sha512-vAo1KuDSYWFDB4Cs80CHvfmzSQWeUb909aQib0C0aFx4sw0K9UZFz2m5jaEP+b3X1+yr904iQiruS0hXi31jbw== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/koa@2.13.9": + version "2.13.9" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.9.tgz#8d989ac17d7f033475fbe34c4f906c9287c2041a" + integrity sha512-tPX3cN1dGrMn+sjCDEiQqXH2AqlPoPd594S/8zxwUm/ZbPsQXKqHPUypr2gjCPhHUc+nDJLduhh5lXI/1olnGQ== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/koa__router@12.0.3": + version "12.0.3" + resolved "https://registry.yarnpkg.com/@types/koa__router/-/koa__router-12.0.3.tgz#3fb74ea1991cadd6c6712b6106657aa6e64afca4" + integrity sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw== + dependencies: + "@types/koa" "*" + "@types/lodash@^4.14.149", "@types/lodash@^4.14.175": version "4.14.197" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.197.tgz#e95c5ddcc814ec3e84c891910a01e0c8a378c54b" @@ -5736,6 +6612,18 @@ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== +"@types/memcached@^2.2.6": + version "2.2.10" + resolved "https://registry.yarnpkg.com/@types/memcached/-/memcached-2.2.10.tgz#113f9e3a451d6b5e0a3822e06d9feb52e63e954a" + integrity sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg== + dependencies: + "@types/node" "*" + +"@types/mime-db@*": + version "1.43.5" + resolved "https://registry.yarnpkg.com/@types/mime-db/-/mime-db-1.43.5.tgz#7a3f53dc2125a91f4e0e41f1353f60f8b6af609e" + integrity sha512-/bfTiIUTNPUBnwnYvUxXAre5MhD88jgagLEQiQtIASjU+bwxd8kS/ASDA4a8ufd8m0Lheu6eeMJHEUpLHoJ28A== + "@types/mime@*": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" @@ -5756,6 +6644,13 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== +"@types/mysql@2.15.22": + version "2.15.22" + resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.22.tgz#8705edb9872bf4aa9dbc004cd494e00334e5cdb4" + integrity sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ== + dependencies: + "@types/node" "*" + "@types/node@*": version "20.5.9" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.9.tgz#a70ec9d8fa0180a314c3ede0e20ea56ff71aed9a" @@ -5806,6 +6701,31 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/pg-pool@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/pg-pool/-/pg-pool-2.0.4.tgz#b5c60f678094ff3acf3442628a7f708928fcf263" + integrity sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ== + dependencies: + "@types/pg" "*" + +"@types/pg@*": + version "8.10.9" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.10.9.tgz#d20bb948c6268c5bd847e2bf968f1194c5a2355a" + integrity sha512-UksbANNE/f8w0wOMxVKKIrLCbEMV+oM1uKejmwXr39olg4xqcfBDbXxObJAt6XxHbDa4XTKOlUEcEltXDX+XLQ== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^4.0.1" + +"@types/pg@8.6.1": + version "8.6.1" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.1.tgz#099450b8dc977e8197a44f5229cedef95c8747f9" + integrity sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^2.2.0" + "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" @@ -5916,6 +6836,11 @@ "@types/mime" "*" "@types/node" "*" +"@types/shimmer@^1.0.2": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.0.5.tgz#491d8984d4510e550bfeb02d518791d7f59d2b88" + integrity sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww== + "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" @@ -5938,6 +6863,13 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/tedious@^4.0.10": + version "4.0.14" + resolved "https://registry.yarnpkg.com/@types/tedious/-/tedious-4.0.14.tgz#868118e7a67808258c05158e9cad89ca58a2aec1" + integrity sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw== + dependencies: + "@types/node" "*" + "@types/uuid@8.3.4": version "8.3.4" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" @@ -6203,6 +7135,11 @@ "@typescript-eslint/types" "6.8.0" eslint-visitor-keys "^3.4.1" +"@uidotdev/usehooks@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@uidotdev/usehooks/-/usehooks-2.4.1.tgz#4b733eaeae09a7be143c6c9ca158b56cc1ea75bf" + integrity sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg== + "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" @@ -7211,6 +8148,11 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bignumber.js@^9.0.0: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + bin-links@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-2.3.0.tgz#1ff241c86d2c29b24ae52f49544db5d78a4eb967" @@ -8037,7 +8979,7 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -cjs-module-lexer@^1.0.0: +cjs-module-lexer@^1.0.0, cjs-module-lexer@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== @@ -10951,7 +11893,7 @@ ext@^1.1.2: dependencies: type "^2.7.2" -extend@~3.0.2: +extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -11547,6 +12489,24 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +gaxios@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.1.1.tgz#549629f86a13e756b900f9ff7c94624670102938" + integrity sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w== + dependencies: + extend "^3.0.2" + https-proxy-agent "^7.0.1" + is-stream "^2.0.0" + node-fetch "^2.6.9" + +gcp-metadata@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.0.tgz#9b0dd2b2445258e7597f2024332d20611cbd6b8c" + integrity sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg== + dependencies: + gaxios "^6.0.0" + json-bigint "^1.0.0" + gensequence@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-6.0.0.tgz#ae46a0f89ebd7cc334e45cfb8f1c99a65248694e" @@ -12373,7 +13333,7 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -https-proxy-agent@^7.0.0: +https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1: version "7.0.2" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== @@ -12524,6 +13484,16 @@ import-from@4.0.0, import-from@^4.0.0: resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== +import-in-the-middle@1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz#2a266676e3495e72c04bbaa5ec14756ba168391b" + integrity sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw== + dependencies: + acorn "^8.8.2" + acorn-import-assertions "^1.9.0" + cjs-module-lexer "^1.2.2" + module-details-from-path "^1.0.3" + import-local@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" @@ -13586,6 +14556,17 @@ jiti@^1.18.2: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.3.tgz#ef554f76465b3c2b222dc077834a71f0d4a37569" integrity sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== +joi@^17.3.0: + version "17.11.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" + integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + js-cookie@^3.0.1: version "3.0.5" resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" @@ -13638,6 +14619,13 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -15243,6 +16231,11 @@ module-deps@^6.2.3: through2 "^2.0.0" xtend "^4.0.0" +module-details-from-path@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" + integrity sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== + moment-timezone@^0.5.42: version "0.5.43" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.43.tgz#3dd7f3d0c67f78c23cd1906b9b2137a09b3c4790" @@ -15516,7 +16509,7 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.11, node-fetch@^2.6.7: +node-fetch@^2.6.11, node-fetch@^2.6.7, node-fetch@^2.6.9: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -16339,7 +17332,7 @@ object.values@^1.1.6: define-properties "^1.2.0" es-abstract "^1.22.1" -obuf@^1.0.0, obuf@^1.1.2: +obuf@^1.0.0, obuf@^1.1.2, obuf@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== @@ -17004,6 +17997,45 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-numeric@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a" + integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== + +pg-protocol@*: + version "1.6.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" + integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== + +pg-types@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg-types@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-4.0.1.tgz#31857e89d00a6c66b06a14e907c3deec03889542" + integrity sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g== + dependencies: + pg-int8 "1.0.1" + pg-numeric "1.0.2" + postgres-array "~3.0.1" + postgres-bytea "~3.0.0" + postgres-date "~2.0.1" + postgres-interval "^3.0.0" + postgres-range "^1.1.1" + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -17397,6 +18429,55 @@ postcss@8.4.31, postcss@^8.4.14, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4. picocolors "^1.0.0" source-map-js "^1.0.2" +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-array@~3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-3.0.2.tgz#68d6182cb0f7f152a7e60dc6a6889ed74b0a5f98" + integrity sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-bytea@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-3.0.0.tgz#9048dc461ac7ba70a6a42d109221619ecd1cb089" + integrity sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw== + dependencies: + obuf "~1.1.2" + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-date@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-2.0.1.tgz#638b62e5c33764c292d37b08f5257ecb09231457" + integrity sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + +postgres-interval@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-3.0.0.tgz#baf7a8b3ebab19b7f38f07566c7aab0962f0c86a" + integrity sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw== + +postgres-range@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/postgres-range/-/postgres-range-1.1.3.tgz#9ccd7b01ca2789eb3c2e0888b3184225fa859f76" + integrity sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g== + prebuild-install@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" @@ -17636,7 +18717,7 @@ protobufjs@^6.8.6: "@types/node" ">=13.7.0" long "^4.0.0" -protobufjs@^7.2.4: +protobufjs@^7.2.3, protobufjs@^7.2.4: version "7.2.5" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d" integrity sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A== @@ -18386,6 +19467,15 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-in-the-middle@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz#b539de8f00955444dc8aed95e17c69b0a4f10fcf" + integrity sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw== + dependencies: + debug "^4.1.1" + module-details-from-path "^1.0.3" + resolve "^1.22.1" + require-relative@^0.8.7: version "0.8.7" resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" @@ -18455,7 +19545,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== -resolve@1.22.8, resolve@^1.1.4, resolve@^1.1.5, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.4.0: +resolve@1.22.8, resolve@^1.1.4, resolve@^1.1.5, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.4.0: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -18779,7 +19869,7 @@ semver@7.5.3: dependencies: lru-cache "^6.0.0" -semver@7.5.4, semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.6, semver@^7.3.7, semver@^7.3.8, semver@^7.5.1, semver@^7.5.3, semver@^7.5.4: +semver@7.5.4, semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.6, semver@^7.3.7, semver@^7.3.8, semver@^7.5.1, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -18928,6 +20018,11 @@ shell-quote@^1.4.2, shell-quote@^1.6.1, shell-quote@^1.7.2, shell-quote@^1.7.3: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== +shimmer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" + integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"