Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
3584227
chore: cleanup test data
supalarry Sep 17, 2025
d3b544d
feat: e2e env file
supalarry Sep 17, 2025
fb0f967
feat: e2e examples app prisma client
supalarry Sep 17, 2025
0520746
fix: managed user setup from example app on any port
supalarry Sep 17, 2025
3f5fffc
chore: reduce flaky e2e tests by refreshing page
supalarry Sep 17, 2025
d7e484a
feat: e2e enable new env.e2e and data cleanup
supalarry Sep 17, 2025
4629e6e
feat: e2e oauth client in a seed
supalarry Sep 17, 2025
6cca42a
feat: run atoms e2e in CI with local v2
supalarry Sep 17, 2025
d852b6a
Merge branch 'main' into lauris/cal-6422-refactor-atoms-e2e-setup
supalarry Sep 23, 2025
58e470d
refactor: load e2e env only locally
supalarry Sep 23, 2025
32bc7c6
chore: reset test db in CI and ignore test db
supalarry Sep 23, 2025
d24c4da
refactor: remove unneeded cleanup
supalarry Sep 23, 2025
d23dfaa
refactor: db cleanup in finally statement
supalarry Sep 23, 2025
1c06815
refactor: use webserv.env instead of inline env
supalarry Sep 23, 2025
37cded3
Merge branch 'main' into lauris/cal-6422-refactor-atoms-e2e-setup
supalarry Sep 24, 2025
c3cf330
chore: temporarily dont run atoms on e2e label
supalarry Sep 24, 2025
57eb4b0
fix: self trigger path
supalarry Sep 24, 2025
5321633
fix: increase timeout
supalarry Sep 24, 2025
3302ae8
chore: add vapid env keys to workflow
supalarry Sep 24, 2025
6ea0bda
chore: add CI_JWT_SECRET to e2e atoms
ThyMinimalDev Sep 24, 2025
cf1177e
chore: add NODE_ENV env
supalarry Sep 25, 2025
b3f33b2
fix: only run atoms e2e on main repo
supalarry Sep 25, 2025
d411d1b
Merge branch 'main' into lauris/cal-6422-refactor-atoms-e2e-setup
supalarry Sep 25, 2025
0455202
fix: merge conflict
supalarry Sep 25, 2025
54ff08f
debug: add logs to check env variables
supalarry Sep 25, 2025
edb6ca8
Revert "debug: add logs to check env variables"
supalarry Sep 25, 2025
5649b61
Merge branch 'main' into lauris/cal-6422-refactor-atoms-e2e-setup
ThyMinimalDev Sep 25, 2025
6392c50
Merge branch 'main' into lauris/cal-6422-refactor-atoms-e2e-setup
ThyMinimalDev Sep 25, 2025
171cdbd
Merge branch 'main' into lauris/cal-6422-refactor-atoms-e2e-setup
supalarry Sep 26, 2025
fb3f99d
Merge branch 'main' into lauris/cal-6422-refactor-atoms-e2e-setup
supalarry Oct 3, 2025
28b8487
try to make it work
supalarry Oct 3, 2025
4aa6f96
Revert "try to make it work"
supalarry Oct 3, 2025
346be39
upload atoms dist for inspection
supalarry Oct 3, 2025
ccfd52e
experiment: set random url instead of empty
supalarry Oct 3, 2025
e202aa7
Revert "experiment: set random url instead of empty"
supalarry Oct 3, 2025
aad1c0c
try fix
supalarry Oct 3, 2025
2e9d0b3
Revert "try fix"
supalarry Oct 3, 2025
642ccb8
try fix
supalarry Oct 3, 2025
cf2dc40
Revert "try fix"
supalarry Oct 3, 2025
a82b845
try fix
supalarry Oct 3, 2025
f14758e
Revert "try fix"
supalarry Oct 3, 2025
494ea2a
try chatgpt fix
supalarry Oct 3, 2025
c2cb435
try chatgpt fix pt 2
supalarry Oct 3, 2025
9ee899c
revert: useBottomNavItems.ts
supalarry Dec 3, 2025
40de4ef
Merge branch 'main' into lauris/cal-6422-refactor-atoms-e2e-setup
supalarry Dec 3, 2025
8aec94b
seed e2e client
supalarry Dec 3, 2025
08d8c4b
example e2e env
supalarry Dec 3, 2025
1fbd3d3
rename env ci variables
supalarry Dec 3, 2025
9e91623
dont log managed test user email
supalarry Dec 3, 2025
cbf24ca
refactor: updatedAt for test schema
supalarry Dec 3, 2025
77086cf
fix: onclick sidebar item
supalarry Dec 3, 2025
1c33235
Merge branch 'main' into lauris/cal-6422-refactor-atoms-e2e-setup
supalarry Dec 3, 2025
62438e4
retrigger db setup in ci
supalarry Dec 3, 2025
6a416da
fix: e2e workflow env
supalarry Dec 3, 2025
5829d26
retrigger e2e
supalarry Dec 3, 2025
e1ce5ad
chore: check CI env value
supalarry Dec 3, 2025
5d71101
debug
supalarry Dec 3, 2025
d567be0
try to debug e2e
supalarry Dec 3, 2025
e8de71d
try to debug e2e
supalarry Dec 3, 2025
cba482a
try to fix key constraint
supalarry Dec 4, 2025
4f2ffbf
Revert "try to fix key constraint"
supalarry Dec 4, 2025
6a70eb1
try to debug
supalarry Dec 4, 2025
26c20ee
Revert "try to debug"
supalarry Dec 4, 2025
31408d5
delete logs
supalarry Dec 4, 2025
f20ee84
remove mapping
supalarry Dec 4, 2025
93adc3f
have 1 worker
supalarry Dec 4, 2025
d04256a
revert thos - trying to debug
supalarry Dec 4, 2025
356b3be
debug
supalarry Dec 4, 2025
bddd60a
debug
supalarry Dec 4, 2025
92bf962
debug
supalarry Dec 4, 2025
c1c5b3a
revert thos - trying to debug
supalarry Dec 4, 2025
d1960bb
debug
supalarry Dec 4, 2025
619c592
try running e2e without dotenv
supalarry Dec 4, 2025
411ff39
uncomment
supalarry Dec 4, 2025
617e483
debug
supalarry Dec 4, 2025
2d58c36
fix: seeding db
supalarry Dec 4, 2025
a16661b
retrigger db setup
supalarry Dec 4, 2025
22e68ae
fix: db seed env
supalarry Dec 4, 2025
aeacaa1
retrigger db seed
supalarry Dec 4, 2025
38d31b9
add seed e2e env to turob.json
supalarry Dec 4, 2025
ca8bab0
teardown env
supalarry Dec 4, 2025
9643a53
refactor: remove unused type
supalarry Dec 5, 2025
1ab0f9d
Merge branch 'main' into lauris/cal-6422-refactor-atoms-e2e-setup
supalarry Dec 9, 2025
c35f66a
Merge branch 'main' into lauris/cal-6422-refactor-atoms-e2e-setup
supalarry Dec 11, 2025
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
13 changes: 13 additions & 0 deletions .github/actions/cache-db/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ inputs:
path:
required: false
default: "backups/backup.sql"
SEED_PLATFORM_OAUTH_CLIENT_ID:
required: false
SEED_PLATFORM_OAUTH_CLIENT_SECRET:
required: false
SEED_PLATFORM_OAUTH_CLIENT_ID_E2E:
required: false
SEED_PLATFORM_OAUTH_CLIENT_SECRET_E2E:
required: false
runs:
using: "composite"
steps:
Expand All @@ -29,6 +37,11 @@ runs:
- run: yarn db-seed
if: steps.cache-db.outputs.cache-hit != 'true'
shell: bash
env:
SEED_PLATFORM_OAUTH_CLIENT_ID: ${{ inputs.SEED_PLATFORM_OAUTH_CLIENT_ID }}
SEED_PLATFORM_OAUTH_CLIENT_SECRET: ${{ inputs.SEED_PLATFORM_OAUTH_CLIENT_SECRET }}
SEED_PLATFORM_OAUTH_CLIENT_ID_E2E: ${{ inputs.SEED_PLATFORM_OAUTH_CLIENT_ID_E2E }}
SEED_PLATFORM_OAUTH_CLIENT_SECRET_E2E: ${{ inputs.SEED_PLATFORM_OAUTH_CLIENT_SECRET_E2E }}
- name: Postgres Dump Backup
if: steps.cache-db.outputs.cache-hit != 'true'
uses: tj-actions/pg-dump@v2.3
Expand Down
10 changes: 10 additions & 0 deletions .github/workflows/e2e-api-v2.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ env:
VAPID_PRIVATE_KEY: ${{ secrets.VAPID_PRIVATE_KEY }}
JWT_SECRET: ${{ secrets.CI_JWT_SECRET }}
NODE_ENV: ${{ vars.CI_NODE_ENV }}
## seed script env variables
SEED_PLATFORM_OAUTH_CLIENT_ID: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_ID }}
SEED_PLATFORM_OAUTH_CLIENT_SECRET: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_SECRET }}
SEED_PLATFORM_OAUTH_CLIENT_ID_E2E: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_ID_E2E }}
SEED_PLATFORM_OAUTH_CLIENT_SECRET_E2E: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_SECRET_E2E }}
jobs:
e2e:
timeout-minutes: 20
Expand Down Expand Up @@ -72,6 +77,11 @@ jobs:
- uses: ./.github/actions/dangerous-git-checkout
- uses: ./.github/actions/yarn-install
- uses: ./.github/actions/cache-db
with:
SEED_PLATFORM_OAUTH_CLIENT_ID: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_ID }}
SEED_PLATFORM_OAUTH_CLIENT_SECRET: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_SECRET }}
SEED_PLATFORM_OAUTH_CLIENT_ID_E2E: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_ID_E2E }}
SEED_PLATFORM_OAUTH_CLIENT_SECRET_E2E: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_SECRET_E2E }}

- name: Generate Swagger
working-directory: apps/api/v2
Expand Down
129 changes: 119 additions & 10 deletions .github/workflows/e2e-atoms.yml
Original file line number Diff line number Diff line change
@@ -1,28 +1,105 @@
name: E2E Atoms

on:
workflow_call:
pull_request:
branches:
- main
paths:
- "packages/platform/atoms/**"
- "packages/platform/examples/base/**"
- "apps/api/v2/**"
- ".github/workflows/e2e-atoms.yml"

permissions:
actions: write
contents: read

env:
NODE_OPTIONS: --max-old-space-size=8096
ATOMS_E2E_OAUTH_CLIENT_ID: ${{ secrets.ATOMS_E2E_OAUTH_CLIENT_ID }}
ATOMS_E2E_OAUTH_CLIENT_SECRET: ${{ secrets.ATOMS_E2E_OAUTH_CLIENT_SECRET }}
ATOMS_E2E_API_URL: ${{ secrets.ATOMS_E2E_API_URL }}
ATOMS_E2E_ORG_ID: ${{ secrets.ATOMS_E2E_ORG_ID }}
ATOMS_E2E_OAUTH_CLIENT_ID_BOOKER_EMBED: ${{ secrets.ATOMS_E2E_OAUTH_CLIENT_ID_BOOKER_EMBED }}
ATOMS_E2E_APPLE_ID: ${{ secrets.ATOMS_E2E_APPLE_ID }}
ATOMS_E2E_APPLE_CONNECT_APP_SPECIFIC_PASSCODE: ${{ secrets.ATOMS_E2E_APPLE_CONNECT_APP_SPECIFIC_PASSCODE }}
## api v2 env
ALLOWED_HOSTNAMES: ${{ vars.CI_ALLOWED_HOSTNAMES }}
API_KEY_PREFIX: ${{ secrets.CI_API_KEY_PREFIX }}
API_PORT: ${{ vars.CI_API_V2_PORT }}
CALCOM_LICENSE_KEY: ${{ secrets.CI_CALCOM_LICENSE_KEY }}
DAILY_API_KEY: ${{ secrets.CI_DAILY_API_KEY }}
DATABASE_READ_URL: ${{ secrets.CI_DATABASE_URL }}
DATABASE_WRITE_URL: ${{ secrets.CI_DATABASE_URL }}
GOOGLE_API_CREDENTIALS: ${{ secrets.CI_GOOGLE_API_CREDENTIALS }}
IS_E2E: true
CI: true
NEXTAUTH_SECRET: ${{ secrets.CI_NEXTAUTH_SECRET }}
NEXTAUTH_URL: ${{ secrets.CI_NEXTAUTH_URL }}
REDIS_URL: "redis://localhost:6379"
LINGO_DOT_DEV_API_KEY: ${{ secrets.CI_LINGO_DOT_DEV_API_KEY }}
STRIPE_PRIVATE_KEY: ${{ secrets.CI_STRIPE_PRIVATE_KEY }}
STRIPE_API_KEY: ${{ secrets.CI_STRIPE_PRIVATE_KEY }}
STRIPE_CLIENT_ID: ${{ secrets.CI_STRIPE_CLIENT_ID }}
STRIPE_WEBHOOK_SECRET: ${{ secrets.CI_STRIPE_WEBHOOK_SECRET }}
SLOTS_CACHE_TTL: ${{ secrets.CI_SLOTS_CACHE_TTL }}
NEXT_PUBLIC_VAPID_PUBLIC_KEY: ${{ secrets.NEXT_PUBLIC_VAPID_PUBLIC_KEY }}
VAPID_PRIVATE_KEY: ${{ secrets.VAPID_PRIVATE_KEY }}
JWT_SECRET: ${{ secrets.CI_JWT_SECRET }}
NODE_ENV: ${{ vars.CI_NODE_ENV }}

## atoms e2e examples app env
ATOMS_E2E_OAUTH_CLIENT_ID_2025_12: ${{ secrets.ATOMS_E2E_OAUTH_CLIENT_ID_2025_12 }}
ATOMS_E2E_OAUTH_CLIENT_SECRET_2025_12: ${{ secrets.ATOMS_E2E_OAUTH_CLIENT_SECRET_2025_12 }}
ATOMS_E2E_API_URL_2025_12: ${{ secrets.ATOMS_E2E_API_URL_2025_12 }}
ATOMS_E2E_ORG_ID_2025_12: ${{ secrets.ATOMS_E2E_ORG_ID_2025_12 }}
ATOMS_E2E_OAUTH_CLIENT_ID_BOOKER_EMBED_2025_12: ${{ secrets.ATOMS_E2E_OAUTH_CLIENT_ID_BOOKER_EMBED_2025_12 }}
ATOMS_E2E_APPLE_ID_2025_12: ${{ secrets.ATOMS_E2E_APPLE_ID_2025_12 }}
ATOMS_E2E_APPLE_CONNECT_APP_SPECIFIC_PASSCODE_2025_12: ${{ secrets.ATOMS_E2E_APPLE_CONNECT_APP_SPECIFIC_PASSCODE_2025_12 }}

## atoms e2e examples app env aliases for playwright
NEXT_PUBLIC_X_CAL_ID: ${{ secrets.ATOMS_E2E_OAUTH_CLIENT_ID_2025_12 }}
X_CAL_SECRET_KEY: ${{ secrets.ATOMS_E2E_OAUTH_CLIENT_SECRET_2025_12 }}
NEXT_PUBLIC_CALCOM_API_URL: ${{ secrets.ATOMS_E2E_API_URL_2025_12 }}

## env variables needed for both api v2 and examples app
DATABASE_DIRECT_URL: ${{ secrets.CI_DATABASE_URL }}
DATABASE_URL: ${{ secrets.CI_DATABASE_URL }}
NODE_OPTIONS: --max-old-space-size=29000

## seed script env variables
SEED_PLATFORM_OAUTH_CLIENT_ID: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_ID }}
SEED_PLATFORM_OAUTH_CLIENT_SECRET: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_SECRET }}
SEED_PLATFORM_OAUTH_CLIENT_ID_E2E: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_ID_E2E }}
SEED_PLATFORM_OAUTH_CLIENT_SECRET_E2E: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_SECRET_E2E }}

jobs:
e2e-atoms:
if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
timeout-minutes: 15
name: E2E Atoms
runs-on: buildjet-4vcpu-ubuntu-2204
runs-on: buildjet-16vcpu-ubuntu-2204
services:
postgres:
image: postgres:13
credentials:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: calendso
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
redis:
image: redis:latest
credentials:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: docker/login-action@v3
with:
Expand All @@ -31,10 +108,42 @@ jobs:
- uses: actions/checkout@v4
- uses: ./.github/actions/dangerous-git-checkout
- uses: ./.github/actions/yarn-install
- uses: ./.github/actions/cache-db
with:
SEED_PLATFORM_OAUTH_CLIENT_ID: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_ID }}
SEED_PLATFORM_OAUTH_CLIENT_SECRET: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_SECRET }}
SEED_PLATFORM_OAUTH_CLIENT_ID_E2E: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_ID_E2E }}
SEED_PLATFORM_OAUTH_CLIENT_SECRET_E2E: ${{ secrets.SEED_PLATFORM_OAUTH_CLIENT_SECRET_E2E }}
- uses: ./.github/actions/yarn-playwright-install
- name: Start API v2
working-directory: apps/api/v2
run: |
yarn dev:no-docker &
API_PID=$!
echo "API_PID=$API_PID" >> $GITHUB_ENV

# Wait for API to be ready
echo "Waiting for API v2 to be ready on port ${{ vars.CI_API_V2_PORT }}..."
timeout 300 bash -c 'until curl -f http://localhost:${{ vars.CI_API_V2_PORT }}/health > /dev/null 2>&1; do sleep 2; done'
echo "API v2 is ready!"
- name: Run E2E Atoms Tests
working-directory: packages/platform/examples/base
run: yarn test:e2e
- name: Upload Atoms dist (entire folder)
uses: actions/upload-artifact@v4
if: always()
with:
name: atoms-dist-${{ github.sha }}
path: packages/platform/atoms/dist
retention-days: 7
if-no-files-found: warn

- name: Stop API v2
if: always()
run: |
if [ ! -z "$API_PID" ]; then
kill $API_PID || true
fi
- name: Upload Test Results
uses: actions/upload-artifact@v4
if: always()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -824,6 +824,11 @@ describe("OAuth Client Users Endpoints", () => {
} catch (e) {
console.log(e);
}
try {
await userRepositoryFixture.delete(postResponseDataTwo.user.id);
} catch (e) {
// User might have been deleted by the test
}
try {
await userRepositoryFixture.delete(platformAdmin.id);
} catch (e) {
Expand Down
101 changes: 71 additions & 30 deletions packages/features/shell/SideBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,21 +43,31 @@ export type SideBarProps = {
export function SideBarContainer({ bannersHeight, isPlatformUser = false }: SideBarContainerProps) {
const { status, data } = useSession();

// Make sure that Sidebar is rendered optimistically so that a refresh of pages when logged in have SideBar from the beginning.
// This improves the experience of refresh on app store pages(when logged in) which are SSG.
// Though when logged out, app store pages would temporarily show SideBar until session status is confirmed.
// Render nothing once we know the user isn't authenticated.
if (status !== "loading" && status !== "authenticated") return null;
return <SideBar isPlatformUser={isPlatformUser} bannersHeight={bannersHeight} user={data?.user} />;
}

// Build a safe absolute public page URL, or empty string if we can't.
const buildPublicPageUrl = (user?: UserAuth | null): string => {
const base =
getBookerBaseUrlSync(user?.org?.slug ?? null) ||
process.env.NEXT_PUBLIC_WEBAPP_URL ||
process.env.NEXTAUTH_URL ||
"";
const username = user?.orgAwareUsername;
if (!base || !username) return "";
return `${String(base).replace(/\/+$/, "")}/${username}`;
};

export function SideBar({ bannersHeight, user }: SideBarProps) {
const session = useSession();
const { t, isLocaleReady } = useLocale();
const pathname = usePathname();
const isPlatformPages = pathname?.startsWith("/settings/platform");
const isAdmin = session.data?.user.role === UserPermissionRole.ADMIN;

const publicPageUrl = `${getBookerBaseUrlSync(user?.org?.slug ?? null)}/${user?.orgAwareUsername}`;
const publicPageUrl = buildPublicPageUrl(user);

const bottomNavItems = useBottomNavItems({
publicPageUrl,
Expand Down Expand Up @@ -112,19 +122,13 @@ export function SideBar({ bannersHeight, user }: SideBarProps) {
color="minimal"
onClick={() => window.history.back()}
className="todesktop:block hover:text-emphasis text-subtle group hidden text-sm font-medium">
<Icon
name="arrow-left"
className="group-hover:text-emphasis text-subtle h-4 w-4 shrink-0"
/>
<Icon name="arrow-left" className="group-hover:text-emphasis text-subtle h-4 w-4 shrink-0" />
</button>
<button
color="minimal"
onClick={() => window.history.forward()}
className="todesktop:block hover:text-emphasis text-subtle group hidden text-sm font-medium">
<Icon
name="arrow-right"
className="group-hover:text-emphasis text-subtle h-4 w-4 shrink-0"
/>
<Icon name="arrow-right" className="group-hover:text-emphasis text-subtle h-4 w-4 shrink-0" />
</button>
{!!user?.org && (
<div data-testid="user-dropdown-trigger" className="flex items-center">
Expand All @@ -134,10 +138,12 @@ export function SideBar({ bannersHeight, user }: SideBarProps) {
<KBarTrigger />
</div>
</header>

{/* logo icon for tablet */}
<Link href="/event-types" className="text-center md:inline lg:hidden">
<Logo small icon />
</Link>

<Navigation isPlatformNavigation={isPlatformPages} />
</div>

Expand All @@ -146,21 +152,13 @@ export function SideBar({ bannersHeight, user }: SideBarProps) {
<div className="overflow-hidden">
<Tips />
</div>
{bottomNavItems.map((item, index) => (
<Tooltip side="right" content={t(item.name)} className="lg:hidden" key={item.name}>
<ButtonOrLink
id={item.name}
href={item.href || undefined}
aria-label={t(item.name)}
target={item.target}
className={classNames(
"text-left",
"[&[aria-current='page']]:bg-emphasis text-default justify-right group flex items-center rounded-md px-2 py-1.5 text-sm font-medium transition",
"[&[aria-current='page']]:text-emphasis mt-0.5 w-full text-sm",
isLocaleReady ? "hover:bg-emphasis hover:text-emphasis" : "",
index === 0 && "mt-3"
)}
onClick={item.onClick}>

{bottomNavItems.map((item, index) => {
const isActionOnly = !item.href;
const isInternal = !!item.href && item.href.startsWith("/");

const content = (
<>
{!!item.icon && (
<Icon
name={item.isLoading ? "rotate-cw" : item.icon}
Expand All @@ -179,9 +177,52 @@ export function SideBar({ bannersHeight, user }: SideBarProps) {
) : (
<SkeletonText className="h-[20px] w-full" />
)}
</ButtonOrLink>
</Tooltip>
))}
</>
);

const commonClassName = classNames(
"text-left",
"[&[aria-current='page']]:bg-emphasis text-default justify-right group flex items-center rounded-md px-2 py-1.5 text-sm font-medium transition",
"[&[aria-current='page']]:text-emphasis mt-0.5 w-full text-sm",
isLocaleReady ? "hover:bg-emphasis hover:text-emphasis" : "",
index === 0 && "mt-3"
);

return (
<Tooltip side="right" content={t(item.name)} className="lg:hidden" key={item.name}>
{isActionOnly ? (
<button
id={item.name}
type="button"
onClick={item.onClick}
className={commonClassName}
aria-label={t(item.name)}
disabled={item.isLoading}>
{content}
</button>
) : isInternal ? (
<Link
href={item.href!}
className={commonClassName}
aria-label={t(item.name)}
onClick={item.onClick}>
{content}
</Link>
) : (
<ButtonOrLink
id={item.name}
href={item.href!} // external/absolute only
target={item.target === "__blank" ? "_blank" : item.target}
onClick={item.onClick}
className={commonClassName}
aria-label={t(item.name)}>
{content}
</ButtonOrLink>
)}
</Tooltip>
);
})}

{!IS_VISUAL_REGRESSION_TESTING && <Credits />}
</div>
)}
Expand Down
10 changes: 10 additions & 0 deletions packages/platform/examples/base/.env.e2e.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
NEXT_PUBLIC_X_CAL_ID=
X_CAL_SECRET_KEY=
NEXT_PUBLIC_CALCOM_API_URL=
VITE_BOOKER_EMBED_OAUTH_CLIENT_ID=
VITE_BOOKER_EMBED_API_URL=
ORGANIZATION_ID=
ATOMS_E2E_APPLE_ID=
ATOMS_E2E_APPLE_CONNECT_APP_SPECIFIC_PASSCODE=
NEXT_PUBLIC_IS_E2E="1"
NODE_ENV="test"
Loading
Loading