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
1 change: 1 addition & 0 deletions apps/web/scripts/trigger-task-suggestions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ function buildAuth(user: typeof users.$inferSelect): UserAuthSuccess {
primaryEmail: email,
featureFlags: {} as Record<FeatureFlag, boolean>,
anonymousAnalyticsEnabled: false,
cloudEnabled: false,
resource: {
username,
fullName: name,
Expand Down
6 changes: 4 additions & 2 deletions apps/web/src/app/(onboarding)/onboarding/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { useRedirectToSignIn } from '@/hooks/useSignInRedirect';
import { useUser } from '@/hooks/useUser';
import { DEFAULT_SETUP_REDIRECT_PATH, requiresSetup } from '@/lib/setup-status';
import { useTRPC } from '@/trpc/client';
import { FramedSurface, UserMenu } from '@/components/layout';
import { FramedSurface, RoomoteWordmark, UserMenu } from '@/components/layout';

export default function Layout({ children }: { children: React.ReactNode }) {
const router = useRouter();
Expand Down Expand Up @@ -86,13 +86,15 @@ export default function Layout({ children }: { children: React.ReactNode }) {

return (
<div className="light text-foreground relative min-h-viewport w-full overflow-hidden bg-white md:h-viewport">
<RoomoteWordmark className="absolute top-8 left-8 h-8 hidden lg:block" />
<div ref={setUserMenuPortalContainer} className="light text-foreground" />
<FramedSurface
variant="bold"
frameClassName="m-0.5 md:m-2 h-[calc(var(--effective-viewport-height)-0.25rem)] w-[calc(100svw-0.25rem)] scroll-minimal overflow-hidden md:m-4 md:h-[calc(var(--effective-viewport-height)-2rem)] md:w-[calc(100vw-2rem)]"
surfaceClassName="flex flex-col !overflow-y-auto !overflow-x-hidden md:items-center"
>
<div className="z-50 flex w-full justify-end px-4 pt-4 md:fixed md:right-9 md:top-9 md:w-auto md:px-0 md:pt-0">
<div className="z-50 flex w-full gap-2 justify-end px-4 pt-4 md:fixed md:right-9 md:top-9 md:w-auto md:px-0 md:pt-0 ">
<RoomoteWordmark className="h-8 hidden sm:block lg:hidden" />
<UserMenu portalContainer={userMenuPortalContainer} />
</div>
<div className="relative flex w-full max-w-3xl flex-col md:min-h-full">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,6 @@ export function StepCommunicationConnect({
</Button>
<Button
type="button"
className="w-full sm:w-auto"
onClick={onContinue}
disabled={!primaryConversationReady}
>
Expand Down Expand Up @@ -157,7 +156,6 @@ export function StepCommunicationConnect({
</p>
<SetupFooter onBack={onBack}>
<Button
className="w-full sm:w-auto"
onClick={() => connectSlack.mutate()}
disabled={connectSlack.isPending}
>
Expand Down
19 changes: 19 additions & 0 deletions apps/web/src/app/(onboarding)/setup/StepInvoke.client.test.tsx

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

47 changes: 26 additions & 21 deletions apps/web/src/app/(onboarding)/setup/StepInvoke.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
} from '@/components/system';
import { useTRPC } from '@/trpc/client';
import { useEnvironments } from '@/hooks/environments/useEnvironments';
import { useUser } from '@/hooks/useUser';
import { buildInvokeMethods } from '../invokeMethods';
import { StepTitle } from './StepTitle';
import { getSetupStepDefinition } from './types';
Expand Down Expand Up @@ -48,6 +49,7 @@ export function StepInvoke({
} = {}) {
const router = useRouter();
const trpc = useTRPC();
const { user } = useUser();
const queryClient = useQueryClient();
const environments = useEnvironments({ enabled: !onboardingTaskId });
const commsStatus = useQuery(trpc.comms.status.queryOptions());
Expand Down Expand Up @@ -194,33 +196,36 @@ export function StepInvoke({
))}
</div>

<div className="mt-4 flex items-start gap-2 border-t border-foreground/20 pt-4">
<Checkbox
aria-label="Toggle anonymous analytics"
className="mt-0.5"
checked={anonymousAnalyticsEnabled}
onCheckedChange={(checked) =>
setAnonymousAnalyticsEnabled(checked === true)
}
/>
<div className="space-y-0.5">
<p className="text-sm font-semibold">Anonymous analytics</p>
<p className="text-sm text-muted-foreground">
Share usage stats with the {PRODUCT_NAME} team for product
improvements.
<br />
No PII, code or conversation content is ever shared. Accrues good
karma.
</p>
{!user?.cloudEnabled && (
<div className="mt-4 flex items-start gap-2 border-t border-foreground/20 pt-4">
<Checkbox
aria-label="Toggle anonymous analytics"
className="mt-0.5"
checked={anonymousAnalyticsEnabled}
onCheckedChange={(checked) =>
setAnonymousAnalyticsEnabled(checked === true)
}
/>
<div className="space-y-0.5">
<p className="text-sm font-semibold">Anonymous analytics</p>
<p className="text-sm text-muted-foreground">
Share usage stats with the {PRODUCT_NAME} team for product
improvements.
<br />
No PII, code or conversation content is ever shared. Accrues good
karma.
</p>
</div>
</div>
</div>
)}

<div className="mt-3 flex">
<Button
className="w-full sm:w-auto"
onClick={() => {
onTryItOut?.();
completeSetup.mutate({ anonymousAnalyticsEnabled });
completeSetup.mutate(
user?.cloudEnabled ? {} : { anonymousAnalyticsEnabled },
);
}}
disabled={completeSetup.isPending}
>
Expand Down
6 changes: 1 addition & 5 deletions apps/web/src/app/(onboarding)/setup/StepSetupToken.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,7 @@ export function StepSetupToken({
placeholder="Setup token"
data-1p-ignore
/>
<Button
type="submit"
className="w-full sm:w-auto"
disabled={trimmedValue.length === 0}
>
<Button type="submit" disabled={trimmedValue.length === 0}>
Continue
<ArrowRight />
</Button>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,6 @@ export function StepSourceControlConnect({
</p>
) : (
<Button
className="w-full sm:w-auto"
onClick={() =>
authenticateAdoAccount.mutate(
`${window.location.pathname}?step=source-control-connect`,
Expand All @@ -360,7 +359,6 @@ export function StepSourceControlConnect({
<p>{githubCopy}</p>
<SetupFooter onBack={onBack}>
<Button
className="w-full sm:w-auto"
onClick={() =>
createInstallation.mutate(
`${window.location.pathname}?step=source-control-connect`,
Expand All @@ -384,7 +382,6 @@ export function StepSourceControlConnect({
) : null}
<SetupFooter onBack={onBack}>
<Button
className="w-full sm:w-auto"
onClick={() => void handleSyncRepositories()}
disabled={
syncRepositories.isPending || saveAdoLinkedAccount.isPending
Expand Down
1 change: 0 additions & 1 deletion apps/web/src/app/(onboarding)/setup/StepWelcome.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ export function StepWelcome({ onContinue }: { onContinue: () => void }) {
</p>
<Button
size="default"
className="w-full sm:w-auto"
onClick={() => {
markSetupWelcomeSeen();
onContinue();
Expand Down
6 changes: 3 additions & 3 deletions apps/web/src/app/(onboarding)/setup/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,17 @@ export default function Layout({ children }: { children: React.ReactNode }) {
translate="no"
className="notranslate light text-foreground relative min-h-viewport w-full overflow-hidden bg-white md:h-viewport"
>
<RoomoteWordmark className="absolute top-8 left-8 h-8 hidden lg:block" />
<div ref={setUserMenuPortalContainer} className="light text-foreground" />
<FramedSurface
variant="bold"
frameClassName="h-[calc(var(--effective-viewport-height)-0.25rem)] w-[calc(100svw-0.25rem)] scroll-minimal overflow-hidden"
surfaceClassName="flex flex-col !overflow-y-auto !overflow-x-hidden md:items-center"
>
<RoomoteWordmark className="absolute right-9 bottom-7 h-8 hidden md:block" />

{isSignedIn ? (
<>
<div className="z-50 flex w-full justify-end px-4 pt-4 md:fixed md:right-9 md:top-9 md:w-auto md:px-0 md:pt-0 ">
<div className="z-50 flex w-full gap-2 justify-end px-4 pt-4 md:fixed md:right-9 md:top-9 md:w-auto md:px-0 md:pt-0 ">
<RoomoteWordmark className="h-8 hidden sm:block lg:hidden" />
<UserMenu portalContainer={userMenuPortalContainer} />
</div>
</>
Expand Down
8 changes: 7 additions & 1 deletion apps/web/src/app/api/telemetry/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
} from '@roomote/telemetry/server';

import { authorize } from '@/lib/server/auth-context';
import { Env, isRoomoteCloudEnabled } from '@/lib/server/env';

export const runtime = 'nodejs';

Expand Down Expand Up @@ -54,12 +55,17 @@ export async function POST(request: NextRequest) {

// captureEvent re-checks this per event; checking once up front just
// avoids pointless id resolution work when analytics is disabled.
if (!(await isAnonymousAnalyticsEnabled())) {
if (
!(await isAnonymousAnalyticsEnabled(
isRoomoteCloudEnabled(Env.R_CLOUD_ENABLED),
))
) {
return NextResponse.json({ accepted: 0 }, { status: 202 });
}

for (const event of parsed.data.events) {
void captureEvent(event.event, {
cloudEnabled: isRoomoteCloudEnabled(Env.R_CLOUD_ENABLED),
userId: authResult.userId,
properties: event.properties,
timestamp: event.timestamp,
Expand Down
5 changes: 5 additions & 0 deletions apps/web/src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { RootProviders } from '@/components/layout/RootProviders';
import { RouteTitle } from '@/components/layout/RouteTitle';
import { getAppIcons } from '@/lib/app-icons';
import { resolveAppEnv } from '@/lib/app-env';
import { Env, isRoomoteCloudEnabled } from '@/lib/server/env';
import { authorize } from '@/lib/server/auth-context';
import { isSetupBootstrapOpen } from '@/lib/server/setup-bootstrap';
import { getThemeBootScript } from '@/lib/shared/theme-boot';
Expand Down Expand Up @@ -126,6 +127,10 @@ export default async function RootLayout({
<RootProviders
authStatus={authStatus}
authUser={authUser}
cloudEnabled={isRoomoteCloudEnabled(Env.R_CLOUD_ENABLED)}
intercomAppId={Env.R_INTERCOM_APP_ID}
posthogProjectKey={Env.R_POSTHOG_PROJECT_KEY}
posthogHost={Env.R_POSTHOG_HOST}
setupBootstrapOpen={setupBootstrapOpen}
>
{children}
Expand Down
Loading
Loading