diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 8b9dd2ad..6f878150 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -33,7 +33,11 @@ jobs: - name: Build dashboard run: yarn build:dashboard env: - VITE_SERVER_BASE_URL: http://localhost:8000 + VITE_GOOGLE_CLIENT_ID: ${{ secrets.VITE_GOOGLE_CLIENT_ID }} + VITE_SERVER_BASE_URL: ${{ secrets.VITE_SERVER_BASE_URL }} + VITE_LINK_SURVEY_HOST: ${{ secrets.VITE_LINK_SURVEY_HOST }} + VITE_PUBLIC_POSTHOG_KEY: ${{ secrets.VITE_PUBLIC_POSTHOG_KEY }} + VITE_PUBLIC_POSTHOG_HOST: ${{ secrets.VITE_PUBLIC_POSTHOG_HOST }} - name: Start Backend Server run: docker compose -f ./docker-compose-test.yml up -d diff --git a/apps/frontend/src/layout/AuthLayout.tsx b/apps/frontend/src/layout/AuthLayout.tsx index e7ebd192..f54e23aa 100644 --- a/apps/frontend/src/layout/AuthLayout.tsx +++ b/apps/frontend/src/layout/AuthLayout.tsx @@ -6,7 +6,7 @@ import Profile2 from "../assets/images/loginScreen/profile-2.png"; import Profile3 from "../assets/images/loginScreen/profile-3.png"; import Logo from "../assets/images/logo.png"; -const clientId = import.meta.env.VITE_GOOGLE_CLIENT_ID; +const clientId = import.meta.env.VITE_GOOGLE_CLIENT_ID ?? ""; export function AuthLayout() { return ( diff --git a/apps/frontend/src/layout/partials/Navbar.tsx b/apps/frontend/src/layout/partials/Navbar.tsx index e68e8b29..a92084b7 100644 --- a/apps/frontend/src/layout/partials/Navbar.tsx +++ b/apps/frontend/src/layout/partials/Navbar.tsx @@ -248,6 +248,7 @@ export const Navbar = () => { onClick={() => { setOpenOrganizationInviteModal(true); }} + data-testid="invite-team-btn" > diff --git a/apps/frontend/src/layout/partials/UserProfile.tsx b/apps/frontend/src/layout/partials/UserProfile.tsx index 01a3fd0d..e7691016 100644 --- a/apps/frontend/src/layout/partials/UserProfile.tsx +++ b/apps/frontend/src/layout/partials/UserProfile.tsx @@ -147,6 +147,7 @@ export const UserProfile = () => { navigate( diff --git a/apps/frontend/src/modules/auth/AuthProvider.tsx b/apps/frontend/src/modules/auth/AuthProvider.tsx index 320da3fc..82ff5adf 100644 --- a/apps/frontend/src/modules/auth/AuthProvider.tsx +++ b/apps/frontend/src/modules/auth/AuthProvider.tsx @@ -291,7 +291,7 @@ export const AuthProvider = ({ children, apollo, purgePersistedCache }: AuthProv const workspace = useMemo(() => { const slug = orgSlug ?? user?.organization?.slug; - return organizations.find((organization) => organization?.slug === slug) ?? null; + return organizations.find((organization) => organization?.slug?.toLowerCase() === slug?.toLowerCase()) ?? null; }, [orgSlug, user?.organization?.slug, organizations]); const projects = useMemo(() => { @@ -313,7 +313,7 @@ export const AuthProvider = ({ children, apollo, purgePersistedCache }: AuthProv const slug = projectSlug ?? user?.project?.slug; - return projects?.find((project) => project?.slug === slug) ?? null; + return projects?.find((project) => project?.slug?.toLowerCase() === slug?.toLowerCase()) ?? null; }, [user, orgSlug, projectSlug, projects, workspace]); const handleUserUpdate = useCallback( @@ -354,7 +354,10 @@ export const AuthProvider = ({ children, apollo, purgePersistedCache }: AuthProv switchProject(project.id); } - if (orgSlug !== organization?.slug || projectSlug !== project.slug) { + if ( + orgSlug?.toLowerCase() !== organization?.slug.toLowerCase() || + projectSlug?.toLowerCase() !== project.slug.toLowerCase() + ) { redirect({ ...(user ?? {}), ...updatedUser, diff --git a/apps/frontend/src/modules/workspace/components/invite/WorkspaceInvite.tsx b/apps/frontend/src/modules/workspace/components/invite/WorkspaceInvite.tsx index 4a3a15ca..efcb69e7 100644 --- a/apps/frontend/src/modules/workspace/components/invite/WorkspaceInvite.tsx +++ b/apps/frontend/src/modules/workspace/components/invite/WorkspaceInvite.tsx @@ -1,5 +1,5 @@ import { Link, LucideMail, RefreshCcwIcon } from "lucide-react"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { OrganizationErrorCode, OrganizationInvite, OrganizationInviteCreate, User } from "@/generated/graphql"; import { useAuth } from "@/modules/auth/hooks/useAuth"; @@ -36,6 +36,10 @@ export const WorkspaceInvite = ({ open, onOpenChange }: Props) => { } }; + useEffect(() => { + handleLinkInvite(); + }, [onOpenChange]); + const handleEmailInvite = async (e: React.FormEvent) => { e.preventDefault(); if (!inviteEmail) { @@ -169,7 +173,7 @@ export const WorkspaceInvite = ({ open, onOpenChange }: Props) => { ) : ( -
+

Invite link will provide a unique URL that allows anyone to join your organization.

@@ -185,6 +189,7 @@ export const WorkspaceInvite = ({ open, onOpenChange }: Props) => { size="sm" disabled={loading} onClick={handleInviteLinkRefresh} + data-testid="refresh-invite-link" icon={ { } /> } + data-testid="invite-link" />
diff --git a/apps/frontend/src/modules/workspace/components/settings/Workspace/General.tsx b/apps/frontend/src/modules/workspace/components/settings/Workspace/General.tsx index 494495b4..954bfff3 100644 --- a/apps/frontend/src/modules/workspace/components/settings/Workspace/General.tsx +++ b/apps/frontend/src/modules/workspace/components/settings/Workspace/General.tsx @@ -1,7 +1,10 @@ +import { useProject } from "@/modules/projects/hooks/useProject"; import { useWorkspace } from "@/modules/workspace/hooks/useWorkspace"; -import { Button, TextInput } from "@/ui"; +import { ROUTES } from "@/routes"; +import { Button, GlobalSpinner, TextInput } from "@/ui"; import { toast } from "@/utils/toast"; import { useForm } from "react-hook-form"; +import { useNavigate } from "react-router-dom"; type WorkspaceData = { workspaceName: string | undefined; @@ -9,7 +12,9 @@ type WorkspaceData = { }; export const General = () => { - const { workspace, updateWorkspace } = useWorkspace(); + const { project } = useProject(); + const { workspace, updateWorkspace, loading } = useWorkspace(); + const navigate = useNavigate(); const { register, @@ -28,15 +33,26 @@ export const General = () => { return; } - await updateWorkspace( + const response = await updateWorkspace( { name: formInfo.workspaceName, slug: formInfo.workspaceUrl, }, false, ); + if (response?.data?.organizationUpdate) { + navigate( + `${ROUTES.WORKSPACE_SETTINGS}` + .replace(":orgSlug", response?.data?.organizationUpdate?.organization?.slug!) + .replace(":projectSlug", project?.slug!), + ); + } toast.success(`Your organization name has been updated`); }; + + if (loading) { + return ; + } return (
@@ -60,6 +76,7 @@ export const General = () => { defaultValue={workspace?.name} error={!!errors.workspaceName?.message} errorMessage={errors.workspaceName?.message} + data-testid="workspace-name" /> { })} error={!!errors.workspaceUrl?.message} errorMessage={errors.workspaceUrl?.message} + data-testid="workspace-url" />