Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 54 additions & 54 deletions .github/perf/pr-boot-size-delta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* the PR has the bundle-size-ok label.
*/
import { execFileSync } from "node:child_process";
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import path from "node:path";

Expand Down Expand Up @@ -56,14 +56,6 @@ function measureBootGzip(cwd: string, metricsPath: string): BootMetrics {
return parseMetricsFile(metricsPath);
}

function ghJson(args: string[]): unknown {
const out = execFileSync("gh", args, {
encoding: "utf8",
cwd: repoRoot,
}).trim();
return out ? JSON.parse(out) : null;
}

function hasOverrideLabel(prNumber: string): boolean {
const out = execFileSync(
"gh",
Expand All @@ -73,48 +65,41 @@ function hasOverrideLabel(prNumber: string): boolean {
return out.split("\n").filter(Boolean).includes(overrideLabel);
}

function listPrComments(
prNumber: string,
): Array<{ id: number; body?: string }> {
const out = execFileSync(
"gh",
[
"api",
`repos/${process.env.GITHUB_REPOSITORY}/issues/${prNumber}/comments`,
"--paginate",
],
{ encoding: "utf8", cwd: repoRoot },
).trim();
return out ? (JSON.parse(out) as Array<{ id: number; body?: string }>) : [];
}

function upsertStickyComment(prNumber: string, body: string): void {
const marker = commentMarker;
const fullBody = `${marker}\n${body}`;
const comments = ghJson([
"api",
`repos/${process.env.GITHUB_REPOSITORY}/issues/${prNumber}/comments`,
"--paginate",
]) as Array<{ id: number; body?: string }> | null;

const existing = (comments ?? []).find((comment) =>
(comment.body ?? "").includes(marker),
const fullBody = `${commentMarker}\n${body}`;
const existing = listPrComments(prNumber).find((comment) =>
(comment.body ?? "").includes(commentMarker),
);
if (existing) {
execFileSync(
"gh",
[
"api",
"--method",
"PATCH",
`repos/${process.env.GITHUB_REPOSITORY}/issues/comments/${existing.id}`,
"-f",
`body=${fullBody}`,
],
{ cwd: repoRoot, stdio: "inherit" },
);
return;
}

const commentFile = path.join(
tmpdir(),
`compass-boot-comment-${process.pid}.md`,
const repo = process.env.GITHUB_REPOSITORY;
execFileSync(
"gh",
[
"api",
"--method",
existing ? "PATCH" : "POST",
existing
? `repos/${repo}/issues/comments/${existing.id}`
: `repos/${repo}/issues/${prNumber}/comments`,
"-f",
`body=${fullBody}`,
],
{ cwd: repoRoot, stdio: "inherit" },
);
writeFileSync(commentFile, fullBody, "utf8");
try {
execFileSync(
"gh",
["pr", "comment", prNumber, "--body-file", commentFile],
{ cwd: repoRoot, stdio: "inherit" },
);
} finally {
rmSync(commentFile, { force: true });
}
}

function main(): void {
Expand All @@ -137,6 +122,8 @@ function main(): void {
const headMetrics = measureBootGzip(repoRoot, headMetricsPath);

const baseWorktree = mkdtempSync(path.join(tmpdir(), "compass-boot-base-"));
let worktreeAdded = false;
let overBudget = false;
try {
execFileSync(
"git",
Expand All @@ -146,6 +133,7 @@ function main(): void {
stdio: "inherit",
},
);
worktreeAdded = true;
execFileSync("bun", ["install", "--frozen-lockfile"], {
cwd: baseWorktree,
stdio: "inherit",
Expand All @@ -170,18 +158,30 @@ function main(): void {
}

const overridden = prNumber ? hasOverrideLabel(prNumber) : false;
if (deltaBytes > maxDeltaBytes && !overridden) {
overBudget = deltaBytes > maxDeltaBytes && !overridden;
if (overBudget) {
console.error(
`Boot gzip grew ${deltaBytes} B (> ${maxDeltaBytes} B) vs ${baseSha}.`,
);
process.exit(1);
}
} finally {
rmSync(headMetricsPath, { force: true });
execFileSync("git", ["worktree", "remove", "--force", baseWorktree], {
cwd: repoRoot,
stdio: "inherit",
});
// `git worktree add` can fail (bad sha, dirty state); removing a worktree
// that was never added throws over the real error, so clean up the bare
// mkdtemp directory instead.
if (worktreeAdded) {
execFileSync("git", ["worktree", "remove", "--force", baseWorktree], {
cwd: repoRoot,
stdio: "inherit",
});
} else {
rmSync(baseWorktree, { force: true, recursive: true });
}
}

// Exiting inside the try above would skip the cleanup in `finally`.
if (overBudget) {
process.exit(1);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { notificationActions } from "@web/notifications/notification.state";
import { type NotificationBlockedBannerKind } from "@web/notifications/notification-blocked-banner.util";

export function NotificationPermissionBanner({
kind,
onDismiss,
}: {
kind: "permission" | "show_blocked";
kind: NotificationBlockedBannerKind;
onDismiss: () => void;
}) {
const message =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,28 @@ import dayjs from "@core/util/date/dayjs";
import { shouldAdjustComplimentDate } from "@web/common/utils/datetime/web.datetime.util";
import { type GridEventDraft } from "@web/events/event-draft.types";
import { EventFormDateField } from "@web/views/Forms/EventForm/DateControlsSection/DateTimeSection/EventFormDateField";
import { type OpenDatePickerSide } from "@web/views/Forms/EventForm/DateControlsSection/DateTimeSection/useOpenDatePickerSide";
import { type OnEventFormScheduleChange } from "@web/views/Forms/EventForm/types";

interface Props {
datePickers: OpenDatePickerSide;
displayEndDate: Date;
draft: GridEventDraft;
isEndDatePickerOpen: boolean;
isStartDatePickerOpen: boolean;
selectedEndDate: Date;
selectedStartDate: Date;
onScheduleChange: OnEventFormScheduleChange;
setIsStartDatePickerOpen: (arg0: boolean) => void;
setIsEndDatePickerOpen: (arg0: boolean) => void;
}

export const DatePickers: FC<Props> = ({
datePickers,
displayEndDate,
draft,
isEndDatePickerOpen,
isStartDatePickerOpen,
selectedEndDate,
selectedStartDate,
onScheduleChange,
setIsEndDatePickerOpen,
setIsStartDatePickerOpen,
}) => {
const { openSide, open, close, closeAll } = datePickers;

const toAllDayDate = (date: Date) =>
dayjs(dayjs(date).format(dayjs.DateFormat.YEAR_MONTH_DAY_FORMAT)).toDate();

Expand All @@ -41,7 +38,7 @@ export const DatePickers: FC<Props> = ({
};

const onSelectStartDate = (start: Date) => {
setIsStartDatePickerOpen(false);
close("start");

const { shouldAdjust: shouldAdjustEnd, compliment } =
shouldAdjustComplimentDate("start", {
Expand All @@ -59,7 +56,7 @@ export const DatePickers: FC<Props> = ({
};

const onSelectEndDate = (end: Date) => {
setIsEndDatePickerOpen(false);
close("end");

const { shouldAdjust, compliment } = shouldAdjustComplimentDate("end", {
start: selectedStartDate,
Expand All @@ -81,15 +78,8 @@ export const DatePickers: FC<Props> = ({
}
};

const closeOpenPickers = () => {
const wasOpen = isStartDatePickerOpen || isEndDatePickerOpen;
setIsStartDatePickerOpen(false);
setIsEndDatePickerOpen(false);
return wasOpen;
};

const onPickerEscape = (event: React.KeyboardEvent<HTMLDivElement>) => {
if (event.key === "Escape" && closeOpenPickers()) {
if (event.key === "Escape" && closeAll()) {
event.stopPropagation();
}
};
Expand All @@ -100,12 +90,9 @@ export const DatePickers: FC<Props> = ({
arrowDownOpensCalendar
calendarClassName="startDatePicker"
inputId="eventFormStartDate"
isOpen={isStartDatePickerOpen}
onCalendarClose={() => setIsStartDatePickerOpen(false)}
onCalendarOpen={() => {
setIsEndDatePickerOpen(false);
setIsStartDatePickerOpen(true);
}}
isOpen={openSide === "start"}
onCalendarClose={() => close("start")}
onCalendarOpen={() => open("start")}
onCommit={onSelectStartDate}
onKeyDown={onPickerEscape}
selected={selectedStartDate}
Expand All @@ -116,12 +103,9 @@ export const DatePickers: FC<Props> = ({
arrowDownOpensCalendar
calendarClassName="endDatePicker"
inputId="eventFormEndDate"
isOpen={isEndDatePickerOpen}
onCalendarClose={() => setIsEndDatePickerOpen(false)}
onCalendarOpen={() => {
setIsStartDatePickerOpen(false);
setIsEndDatePickerOpen(true);
}}
isOpen={openSide === "end"}
onCalendarClose={() => close("end")}
onCalendarOpen={() => open("end")}
onCommit={onSelectEndDate}
onKeyDown={onPickerEscape}
selected={displayEndDate}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,31 @@ import { type SelectOption } from "@web/common/types/component.types";
import { type GridEventDraft } from "@web/events/event-draft.types";
import { DatePickers } from "@web/views/Forms/EventForm/DateControlsSection/DateTimeSection/DatePickers/DatePickers";
import { TimePickers } from "@web/views/Forms/EventForm/DateControlsSection/DateTimeSection/TimePicker/TimePickers";
import { type OpenDatePickerSide } from "@web/views/Forms/EventForm/DateControlsSection/DateTimeSection/useOpenDatePickerSide";
import { type OnEventFormScheduleChange } from "@web/views/Forms/EventForm/types";

export interface Props {
datePickers: OpenDatePickerSide;
displayEndDate: Date;
draft: GridEventDraft;
endTime: SelectOption<string>;
isEndDatePickerOpen: boolean;
isStartDatePickerOpen: boolean;
onScheduleChange: OnEventFormScheduleChange;
scheduleEnd: Date;
scheduleStart: Date;
selectedEndDate: Date;
selectedStartDate: Date;
setIsEndDatePickerOpen: (arg0: boolean) => void;
setIsStartDatePickerOpen: (arg0: boolean) => void;
startTime: SelectOption<string>;
}

export const DateTimeSection: FC<Props> = ({
datePickers,
displayEndDate,
draft,
isEndDatePickerOpen,
isStartDatePickerOpen,
selectedEndDate,
selectedStartDate,
onScheduleChange,
scheduleEnd,
scheduleStart,
setIsStartDatePickerOpen,
setIsEndDatePickerOpen,
startTime,
endTime,
}) => {
Expand All @@ -43,15 +38,12 @@ export const DateTimeSection: FC<Props> = ({
{isAllDay && (
<div className="flex items-center gap-2">
<DatePickers
datePickers={datePickers}
displayEndDate={displayEndDate}
draft={draft}
isEndDatePickerOpen={isEndDatePickerOpen}
isStartDatePickerOpen={isStartDatePickerOpen}
selectedEndDate={selectedEndDate}
selectedStartDate={selectedStartDate}
onScheduleChange={onScheduleChange}
setIsEndDatePickerOpen={setIsEndDatePickerOpen}
setIsStartDatePickerOpen={setIsStartDatePickerOpen}
/>
</div>
)}
Expand Down
Loading
Loading