Repository navigation
Connect interview requests to the private Google Sheet - #3
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f2d6f2b476
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if ( | ||
| typeof data.linkedin !== "string" || | ||
| data.linkedin.length > 500 || | ||
| (data.linkedin && !/^https:\/\/(www\.)?linkedin\.com(?:\/[^\s]*)?\/?$/.test(data.linkedin)) |
There was a problem hiding this comment.
Accept client-valid LinkedIn URLs in the writer
When a user enters a syntactically valid LinkedIn URL with a capitalized scheme or hostname, such as https://LinkedIn.com/in/example, validateInterview accepts it because URL normalizes those components, but this case-sensitive regular expression rejects it. The form therefore passes local validation and then reports the generic save failure even though the input is valid; normalize the URL before checking it or make the server validation match the client.
Useful? React with 👍 / 👎.
| if ( | ||
| typeof data.timezone !== "string" || | ||
| data.timezone.length > 100 || | ||
| !/^(UTC|[A-Za-z0-9_+\-]+(?:\/[A-Za-z0-9_+\-]+)+)$/.test(data.timezone) | ||
| ) |
There was a problem hiding this comment.
Keep timezone validation consistent with the form
When a user edits the detected timezone to a valid identifier without a slash, such as GMT, CET, or EST, the client accepts it through Intl.DateTimeFormat, but this additional regular expression rejects it before the writer performs the same Intl validation. Such requests pass the visible form validation and then fail with a generic save error; rely on the Intl check or otherwise use the same accepted set on both sides.
Useful? React with 👍 / 👎.
Visitors can now request an interview through a branded form on the official Contact page. Requests are validated and posted to the Google Apps Script Web App; the site shows success only after Google confirms the spreadsheet write. The private spreadsheet is not embedded, and no shared secret or private credentials are sent by the browser.
The Contact page provides visible email contact and an expandable interview form with natural-language availability, editable detected timezone, consent, and a honeypot. Homepage and participation CTAs link directly to /contact#schedule-interview and retain the GitHub Pages project prefix.
Validation: ESLint, TypeScript, Prettier, 41 Vitest tests including event classification and interview validation, production static export, and real Apps Script browser acknowledgement tested locally. The owner confirmed the marked local test row in the private spreadsheet. The production Actions variable contains only the public Web App URL. A marked request will be verified again on deployed GitHub Pages after CI succeeds.
The existing dependency lockfile is repaired and production dependencies updated to resolve the deployment audit. Existing unformatted source is normalized for the added Prettier CI check.