Skip to content

Commit

Permalink
TechIsHiring website release 2.0.7 (#161)
Browse files Browse the repository at this point in the history
* Added Code Quality GitHub Action (#56)

* Added GitHub Action that runs tests and linters on PRs going to dev and main.

* Updating code quality GitHub Action to remove strategy section.

* Forgot to remove strategy from linter GitHub Action.

* Added specific GitHub Action for running Cypress tests.

* Added proper name to Cypress GitHub Action. Updated Cypress to run tests on chrome.

* Changing cy.visit to check if this would solve the failing test.

* Trying to add timeout to fix cypress error.

* Adding start to Cypress GitHub Action.

* Adding GitHub Action to build next project before running Cypress.

* Removing npm build to try and run dev server to run Cypress test.

* Completed Hero Section component (#52)

* finished building the hero section, need to review

* made suggested changes

* made small changes on index.ts

* #57 - Added prettier and prettier-plugin-tailwindcss (#58)

* Added prettier and prettier-plugin-tailwindcss, added baseline rules, ran files through prettier

* Moved eslint-disable-next-line rule down

This is correcting an error caused by prettier formatting.

* Feature: Added the contact page (#53)

* feature: added the contact page and added the head component to particles

* feature: completed the contact page and made it responsive

* feature: added the contact page and added the head component to particles

* fix: fixed issues generated in pr but left the nextjs config issues unresolved

* fix: added stories to the storybook

* fix: fixed issue generated in the pr

* fix: fixed issue generated in the pr

---------

Co-authored-by: Chad Rhonan Stewart <chadrhonanstewart@gmail.com>

* #60 Remove Arbitrary blockers to deploying code (#61)

* Updated eslintrc file to remove rules that are now being managed by prettier.

* Forgot that I had deleted the noEmitOnError in tsconfig.

* feat: completed the header component (#63)

* feat: completed the header component

* addressed merge conflicts

* fix: making recommended changes

* fix: adding back the accessibilit icon on main nav

* Updated the CONTRIBUTING.MD (#66)

* Refactor: Cleaned up Icon to remove Link, useNav to have external link alt text and updated PR Template (#71)

* Refactored icon to no longer have a link component inside of it and updated Footer component accordingly.

* Added external link alt text to useNav and updated mainNav to use external link alt text from hook. Need to work on type definitions to force defining an external link alt text when defining an external link.

* Updated Pull Request Template to add a guide to linking issues so that they automatically close when the PR is merged.

* Forgot to update story on icon. Removed the Link story.

* Feat: added the about-page and refactored contact layout (#72)

* feature: added the contact page and added the head component to particles

* feature: completed the contact page and made it responsive

* feature: added the contact page and added the head component to particles

* fix: fixed issues generated in pr but left the nextjs config issues unresolved

* fix: added stories to the storybook

* feature: added about page

* feature: added the about page

* fix: fixed issues generated in the PR

* feat: added a preloader to the tweet feed

* fix: fixed issues generated in the PR

* fixed contact-stories issue

* feat: added about page

* fixed issues generated in PR

* fixed issues generated in PR

* refactored the about page

* fixed issues generated in the PR

* fix: fixed issues generated in the PR

---------

Co-authored-by: Chad Rhonan Stewart <chadrhonanstewart@gmail.com>

* fix: fixed issue on preloader (#78)

* Fix the background image in contact page (#79)

* increase the height of the image

* .

* Delete yarn.lock

Just deleting the yarn.lock file.

---------

Co-authored-by: Chad Rhonan Stewart <chadrhonanstewart@gmail.com>

* feat: added "why choose TechIsHiring" section (#77)

* feat: completed the header component

* addressed merge conflicts

* fix: making recommended changes

* fix: adding back the accessibilit icon on main nav

* feat: adding why-choose section of the home page

* fixed the large hero section

* fix: added changes to why choose us section

* feat: completed the footer section (#81)

* feat: completed the header component

* addressed merge conflicts

* fix: making recommended changes

* fix: adding back the accessibilit icon on main nav

* updating my dev branch

* feat:adding footer section

* fix: added requested changes to the component

* Fix: Fixed issue where Social Media icons and Contact Us Button didn't link anywhere. (#83)

* Fixed issue where social links where not working.

* Fixed issue where Contact Us button in desktop navbar did not have a link.

* Added external link icon to newsletter link in footer.

* Forgot that 'Contact Us' text was hard coded and removed that to dynamically use the text from the use-nav hook.

* Fix: Replaced Hero Section background image (#85)

* Initial commit to resolve issue #80.

* Replaced hero background image and did some clean up to the app.

* Fixing some typos because they irk me, lol.

* Updated the README to add a link to the dev environment.

* Make contact page mobile bg image visible up to 1024px width #90 (#91)

* Make contact page mobile bg image visible up to 1024px width #90

* done the suggested change

* Making Footer Nav mirror Home Nav and fixing some bugs (#92)

* Added useMainNav to footer so that when the nav hook is updated, both the main nav and the footer is updated automatically.

* Commented out search bar until a decision is made on the Twitter API. Very likely we won't use it further but until a decision is concrete, let's keep the code.

* Updated storybook titles to match previous storybook titles.

* Updated structure of app so that why choose section is not embedded in another folder. Also created story for why choose section.

* Fixed issue where contact page image was not fitting design properly in smaller windows sizes.

* Fixed issue where underline would appear under contact us button.

* Made some changes to about page where media query was at 768px instead of 1024px.

* Made a 'Hire Chad' Page (#94)

* Starting to make the hire-chad page.

* Continuing work on hire-chad page. Added image and about to add content.

* Added basic set up for hire-chad page.

* Doing some updates.

* Making my profile mobile friendly.

* Just cleaning up some css.

* Added some links to about page.

* Deleted test image to clean up image folder.

* Fixing my profile pic and the head content.

* Fixed meta tag stuff.

* Added link to hire chad page in about page.

* Updated social links for hire chad page.

* Updated hire chad page with description and some minor css updates.

* Fixed issue with footer nav being too small.

* Added stories for the hire chad page.

* Fixing an issue with about page.

* Fixed another issue I found with the about page.

* Update API Layer (#95)

* Beginning work to update api layer.

* Updated API Layer to use fetch api instead of axios.

* Updated api layer documentation and deleted newsletter page and related api files.

* Adding blank file to external-apis folder to preserve the folder structure in git.

* Removing newsletter issue api return types and putting an example in place for when new types are added.

* Removing newsletter components and respective stories.

* Forgot to remove axios from the README.

* Added async & await to get example request documentation.

* Upgrade to Next.js 13 and TypeScript 5 (#96)

* Upgraded to Next.js 13 and TypeScript 5

* Starting conversion of link tag to fit Next.js 13 standard.

* Updated interfaces, moving url to navlink interface. Continuing update to Next.js 13 standard.

* Completed Link conversion to Next.js 13 standard. Removed newsletter entry component as I forgot to remove it in earlier PR.

* Updating image in hero section based off of Next.js 13 warning.

* Fixed issue with storybook failing to build because of a React Docgen error involving TypeScript 5. Current solution will be easy to remove once the issue is resolved or in upgrading to Storybook 7.

* Updated storybook to latest stable version.

* Moved active link from link interface to navlink interface and removed reference from atom. Fixed a few other minor issues.

* Updating issue templates and a quick fix in project. (#99)

* Make Contact Us Page functional (#100)

* Did initial work to set up Contact page. Successfully integrated Sendgrid. Just need to set up sending the email through the form now.

* Working on creating email endpoint.

* Added the endpoint function to the function. Now need to verify data.

* Successfully added endpoint to form. Just need to test that it sends the data correctly.

* Successfully sent message to backend. Just putting together email now.

* Successfully make contact us form functional. Will likely need to work on more validation.

* Updating documentation for creating api endpoints.

* Adding max length to input boxes so messages aren't too big.

* Added error messages to each input field in contact us page.

* Added form validation to contact us form.

* Added messages on different api states, a success message and an error message.

* Fixed issue where div would become small when error message appeared on mobile.

* Fixed an issue that I caused when trying to fix the previous issue, lol. Also removed base url cause I just realized I don't need that, double lol.

* Added Zod and SendGrid to list of technologies in README. Added guard clause to process-email serverless function to not send an email if the request is invalid.

* Making some changes based on code review.

* Forgot to clean something up, lol.

* Fixing an issue with contact us page. (#104)

* Fixing an issue with contact us page.

* Change I made messed up the error message window. Had to fix that really quickly.

* Added spinner to contact us form. Updated Spinner for Twitter Feed. (#107)

* Fixed issue where height in hero page was a static number.

* Added spinner to contact us form. Updated Spinner for Twitter Feed.

* Updated Spinner to be it's own atom and made storybook story for it.

* Added 'TechIsHiring Highlights' Component (#109)

* Added highlight content component for TechIsHiring highlights.

* Added basic structure of TechIsHiring highlights.

* Completed basic styling of highlights component. Just adding loading state and choosing tweets to highlight.

* Completed loading state for tweets.

* Added specific Tweets to be featured.

* Fixed issue with hero section where it was too large in desktop view.

* Added stories for highlights details and highlights content. Also made some minor updates to other stories titles.

* Adjusting TechIsHiring Highlights header text

* Updating stories that were .jsx to .tsx.

* Updated headers for sections of front page so they are more similar to each other.

* Updating social card location because it is no longer working.

* Adding a social card for the hire-chad page.

* Updating TechIsHiring newsletter link to use new subdomain. (#112)

* Fix: #75 Website no longer stretches past 1920px (#114)

* Fixed issue where the site would stretch to fill screen size and look distorted at large screen sizes.

* Moved padding in header component so that the header still has proper padding beyond max screen size.

* Updated cypress test because header changed and forgot cypress test was checking for it.

* Changed max screen width to 1920px from 1440px.

* Removing border from card component and updating comments in tailwind config.

* Fixed issue with width in footer where the footer wasn't taking up all the available space when the window size is less than 1920px. (#118)

* added contact us image (#141)

* test: set up cypress component testing and test footer (#140)

* add cypress asset folders to .gitignore

* update cypress to latest

* set up Cypress component testing

* remove red squiglies

* add custom cy.validateLink command for this project

* add data-cy attributes for testing

* add validateFooter util and footer component test

* test homepage footer from e2e homepage test

* minor tweaks

* use cy.within() to simplify selector code

* add check-ts for easy typescript validation

* add declarations.d.ts

* add devcontainer to project #120 (#145)

* add devcontainer to project

* add codespaces instructions to readme

* Update README.md (#149)

Fixed Markdown formatting

* refactor: import Heading instead of Text from chakra-ui for rendering h1 (#151)

* refactor: import Heading instead of Text from chakra-ui for rendering h1

* edit cypress e2e testing for heading vs text

* test: update cypress, add component testing in CI, add Cypress Cloud (#153)

* configure baseUrl in one place for e2e tests

* update Cypress version to latest

* add component testing to the github action

* add cypress project id

* add steps to run tests in parallel

* skip building

* skip building

* remove extra branch, update container count

* 144 process-email type validation with zod (#157)

* adding type validation with Zod for process-email

* Feature: Type validation with zod for process-email api

* Dg fix issue 159 (#160)

* Fix Code of Conduct link

* Revert "Fix Code of Conduct link"

This reverts commit 7279538.

* Fix for issue 159

---------

Co-authored-by: Hassan Shan <hassanshan675@gmail.com>
Co-authored-by: Roy Anger <roy@royanger.com>
Co-authored-by: Elimihele God's favour <godsfavour1975@gmail.com>
Co-authored-by: Demehin Ibukunoluwa George <ibk2k7@gmail.com>
Co-authored-by: DevTofunmi <98407328+devtofunmi@users.noreply.github.com>
Co-authored-by: himanshukrmr <100120679+himanshukrmr@users.noreply.github.com>
Co-authored-by: Cynthia Iradukunda <37863089+ciradu2204@users.noreply.github.com>
Co-authored-by: Mark Noonan <mark@cypress.io>
Co-authored-by: Kedasha Kerr <47188731+LadyKerr@users.noreply.github.com>
Co-authored-by: René Preuß <rene@preuss.io>
Co-authored-by: Yire Morlans <93563580+yiremorlans@users.noreply.github.com>
Co-authored-by: Sadaf Ahmed <119438857+Sadaf-A@users.noreply.github.com>
Co-authored-by: dgodongm <123777263+dgodongm@users.noreply.github.com>
  • Loading branch information
14 people committed Sep 14, 2023
1 parent fd0bbc7 commit 5272406
Show file tree
Hide file tree
Showing 21 changed files with 350 additions and 72 deletions.
36 changes: 36 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node
{
"name": "TechisHiring Website",
"image": "mcr.microsoft.com/devcontainers/typescript-node:0-20",
"hostRequirements": {
"cpus": 4
},
// install dependencies and start storybook
"updateContentCommand": "npm install",
"postAttachCommand": "npm run storybook",
"customizations": {
"codespaces": {
"openFiles": [
"src/stories/pages/home.stories.tsx"
]
},
// install some vscode extensions
"vscode": {
"extensions": [
"dbaeumer.vscode-eslint",
"github.vscode-pull-request-github",
"eamodio.gitlens",
"christian-kohler.npm-intellisense"
]
}
},
// connect to remote server
"forwardPorts": [6006],
"portsAttributes": {
"6006": {
"label": "Storybook",
"onAutoForward": "openPreview"
}
}
}
65 changes: 57 additions & 8 deletions .github/workflows/code-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,74 @@ jobs:
- run: npm ci
- run: npm run format

cypress-install:
runs-on: ubuntu-latest
container: cypress/browsers:node16.16.0-chrome107-ff107-edge
steps:
- name: Checkout
uses: actions/checkout@v3

- name: Cypress install
uses: cypress-io/github-action@v5.8.3
with:
# Disable running of tests within install job
runTests: false

cypress-run:
cypress-run-e2e:

name: Run Cypress Tests
name: Run End-to-End Tests
needs: cypress-install
runs-on: ubuntu-latest
container: cypress/browsers:node12.18.3-chrome87-ff82
container: cypress/browsers:node16.16.0-chrome107-ff107-edge
strategy:
# don't fail the entire matrix on failure
fail-fast: false
matrix:
# run copies of the current job in parallel
containers: [1, 2, 3]
steps:
- name: Checkout
uses: actions/checkout@v3

- name: Use Node.js
uses: actions/setup-node@v3
- name: Cypress run
uses: cypress-io/github-action@v5.0.9
with:
node-version: 16
- run: npm ci
# Specify Browser since container image is compile with Firefox
browser: chrome
start: npm run dev
wait-on: 'http://localhost:3000'
record: true
parallel: true
group: e2e
env:
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

cypress-run-component:

name: Run Component Tests
needs: cypress-install
runs-on: ubuntu-latest
container: cypress/browsers:node16.16.0-chrome107-ff107-edge
strategy:
# don't fail the entire matrix on failure
fail-fast: false
matrix:
# run copies of the current job in parallel
containers: [1, 2, 3]
steps:
- name: Checkout
uses: actions/checkout@v3

- name: Cypress run
uses: cypress-io/github-action@v5.0.9
with:
# Specify Browser since container image is compile with Firefox
browser: chrome
start: npm run dev
component: true
record: true
parallel: true
group: component
env:
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,8 @@ next-env.d.ts

# VSCODE
*.code-workspace
.vscode
.vscode

# cypress
cypress/videos
cypress/screenshots
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ All types of contributions are encouraged and valued. See the [Table of Contents
## Code of Conduct

This project and everyone participating in it is governed by the
[TechIsHiring Website Code of Conduct](https://github.com/techishiring/techishiring-websiteblob/dev/CODE_OF_CONDUCT.md).
[TechIsHiring Website Code of Conduct](https://github.com/TechIsHiring/techishiring-website/blob/dev/CODE_OF_CONDUCT.md).
By participating, you are expected to uphold this code. Please report unacceptable behavior
to <techishiring@gmail.com>.

Expand Down
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

TechIsHiring's website, focusing on showcasing the top tweets from the Twitter account and the TechIsHiring newsletter.

[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/TechIsHiring/techishiring-website)

## Technologies Used

- Next.js
Expand Down Expand Up @@ -32,6 +34,20 @@ This project uses Atomic Design for it's Components. Here are several resources

Check out what the we're currently work on at [https://dev.techishiring.com](https://dev.techishiring.com)

## GitHub Codespaces Setup

_A codespace is a development environment that's hosted in the cloud. You can build and run this plugin via a GitHub Codespace by following the directions below:_

1. To open this environment, click the "Open in GitHub Codespaces" button at the top of this README or click on the green "Code" button on the repository > select the Codespaces tab > "Create new Codepsace on dev" button.

2. Allow this Codespace a few minutes to complete installing all needed dependencies. The first time you do this, it may take a while, so be patient.

3. Once the installation is complete, you should see a terminal window open in the bottom of the screen. You can click the link to open up the storybook in a new tab or your can go to the forward port tab to see the link to the storybook.

A simple browser window will automatically open up for you so you can view the stories seamlessly.

4. You are now ready to start developing!

## Storybook

The Stoybook for this project can be found at [https://stories.techishiring.com](https://stories.techishiring.com)
Expand Down
13 changes: 11 additions & 2 deletions cypress.config.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
import { defineConfig } from "cypress";

export default defineConfig({
projectId: "1nng13",
e2e: {
baseUrl: 'http://localhost:3000',
setupNodeEvents(on, config) {
// implement node event listeners here
}
}
},
},

component: {
devServer: {
framework: "next",
bundler: "webpack",
},
},
});
22 changes: 22 additions & 0 deletions cypress/e2e/contactuspage.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

describe("Contact Us Image Rendering", () => {
beforeEach(() => {
cy.visit("/contact", { timeout: 30000 });
});

it("Image rendering on desktop", () =>{
cy.viewport('macbook-11')
cy.get('[data-testid="desktop"] > img')
.should('be.visible')
.and('have.prop', 'naturalWidth')
.should('be.greaterThan', 0)
})

it("Background Image rendering on mobile", () =>{
cy.viewport('iphone-5')
cy.get('[data-testid="mobile"] > img')
.should("be.visible")
.and('have.prop', 'naturalWidth')
.should('be.greaterThan', 0)
})
})
8 changes: 6 additions & 2 deletions cypress/e2e/homepage.cy.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import validateFooter from "../util/validateFooter";

describe("Homepage", () => {
beforeEach(() => {
cy.visit("http://localhost:3000", { timeout: 30000 });
cy.visit("/", { timeout: 30000 });
});

it("should display the homepage", () => {
cy.title().should("include", "TechIsHiring");
cy.get("header").should("be.visible");
cy.get('.sticky > :nth-child(1) > a > .chakra-text').contains('TechIsHiring');
cy.get('.sticky > :nth-child(1) > a > .chakra-heading').contains('TechIsHiring');
cy.get('header > div > nav > ul').should('be.visible');

validateFooter('desktop')
});
});
29 changes: 29 additions & 0 deletions cypress/support/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,32 @@
// }
// }
// }
export {};

declare global {
namespace Cypress {
interface Chainable {
validateLink(name: string, destination : string, target?: 'new tab'): Chainable<void>
}
}
}


/**
*
* @param name - the name of the link
* @param destination - the URL the link navigates to
* @param target - target attribute - e.g. "new tab" or not
*/
const validateLink = (name: string, destination : string, target?: 'new tab') => {
const shouldOpenInNewTab = target === 'new tab'
const targetAssertion = shouldOpenInNewTab ? 'have.attr' : 'not.have.attr'

// find a link with the expected name
cy.contains(`a`, name)
.should('be.visible') // make sure it is visible
.and('have.attr', 'href', destination) // and has the right href
.and(targetAssertion, 'target', '_blank') // and opens in a new tab, or not
}

Cypress.Commands.add('validateLink', validateLink)
14 changes: 14 additions & 0 deletions cypress/support/component-index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Components App</title>
<!-- Used by Next.js to inject CSS. -->
<div id="__next_css__DO_NOT_USE__"></div>
</head>
<body>
<div data-cy-root></div>
</body>
</html>
44 changes: 44 additions & 0 deletions cypress/support/component.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// ***********************************************************
// This example support/component.ts is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************

// Import commands.js using ES2015 syntax:
import './commands'
import { ChakraProvider } from "@chakra-ui/react";
import { createElement } from "react";
import theme from "../../src/styles/globals.css";

// Alternatively you can use CommonJS syntax:
// require('./commands')

import { mount } from 'cypress/react18'

// Augment the Cypress namespace to include type definitions for
// your custom command.
// Alternatively, can be defined in cypress/support/component.d.ts
// with a <reference path="./component" /> at the top of your spec.
declare global {
namespace Cypress {
interface Chainable {
mount: typeof mount
}
}
}


Cypress.Commands.add("mount", (component, options) => {
const wrappedComponent = createElement(ChakraProvider, {theme}, component);

return mount(wrappedComponent, options);
});
28 changes: 28 additions & 0 deletions cypress/util/validateFooter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
type Size = 'mobile' | 'desktop'

const validateFooter = (size: Size) => {

cy.log('-----START FOOTER-----')
// since both mobile and desktop versions are in the DOM as the same time, we scope with [data-cy]
cy.get(`[data-cy=${size}-footer]`).within(() => {
cy.validateLink('Home', '/')
cy.validateLink('TechIsHiring', '/')
cy.validateLink('Newsletter', 'https://newsletter.techishiring.com/', 'new tab')
cy.validateLink('About', '/about')
cy.validateLink('Contact Us', '/contact')

// now test the SVG icon links at the bottom
cy.validateLink('Twitter for Tech Is Hiring', 'https://www.twitter.com/techishiring', 'new tab')
cy.validateLink('GitHub for Tech Is Hiring', 'https://www.github.com/techishiring', 'new tab')
cy.validateLink('LinkedIn for Tech Is Hiring', 'https://www.linkedin.com/company/techishiring', 'new tab')
cy.validateLink('Patreon for Tech Is Hiring', 'https://www.patreon.com/techishiring', 'new tab')
cy.validateLink('Tech Is Hiring Newsletter on Substack', 'https://newsletter.techishiring.com/', 'new tab')

cy.contains(`p`, `© Copyright ${new Date().getFullYear()}, All rights reserved.`).should('be.visible')
cy.contains(`p`, `Website designed by Inetimi Ade (aidinetimi@gmail.com)`).should('be.visible')
})
// test the main navigation links for the site
cy.log('-----END FOOTER-----')
}

export default validateFooter
1 change: 1 addition & 0 deletions declarations.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
declare module '*.css'; // needed for Cypress component tests to import CSS files

1 comment on commit 5272406

@vercel
Copy link

@vercel vercel bot commented on 5272406 Sep 14, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.