From 61b129a89c94cafaafca397aeffce30c943c1a2d Mon Sep 17 00:00:00 2001 From: yaoweiprc <6896642+yaoweiprc@users.noreply.github.com> Date: Mon, 12 Jan 2026 17:22:01 +0800 Subject: [PATCH] Hide the git-repo form in the create project modal [INS-1900] (#9558) * Hide the git-repo form in the create project modal when the git-sync feature is disabled, remove redundant props * Fix type error --- ...ganizationId.project.$projectId._index.tsx | 8 ++----- ...ization.$organizationId.project._index.tsx | 8 ++----- .../dropdowns/git-project-sync-dropdown.tsx | 5 ---- .../components/dropdowns/project-dropdown.tsx | 4 +--- .../ui/components/modals/project-modal.tsx | 4 ---- .../ui/components/panes/no-project-view.tsx | 4 +--- .../project/project-create-form.tsx | 23 ++++--------------- .../project/project-settings-form.tsx | 19 ++------------- .../ui/hooks/use-organization-features.tsx | 13 +++++++++++ 9 files changed, 25 insertions(+), 63 deletions(-) diff --git a/packages/insomnia/src/routes/organization.$organizationId.project.$projectId._index.tsx b/packages/insomnia/src/routes/organization.$organizationId.project.$projectId._index.tsx index c4adfb3ad2..0e35a3f330 100644 --- a/packages/insomnia/src/routes/organization.$organizationId.project.$projectId._index.tsx +++ b/packages/insomnia/src/routes/organization.$organizationId.project.$projectId._index.tsx @@ -519,7 +519,7 @@ const Component = () => { const { presence } = useInsomniaEventStreamContext(); const storageRuleFetcher = useStorageRulesLoaderFetcher({ key: `storage-rule:${organizationId}` }); const createNewWorkspaceFetcher = useWorkspaceNewActionFetcher(); - const { billing, features } = useOrganizationPermissions(); + const { billing } = useOrganizationPermissions(); useEffect(() => { if (!isScratchpadOrganizationId(organizationId)) { @@ -668,7 +668,6 @@ const Component = () => { }; const canCreateMockServer = activeProject?._id; - const isGitSyncEnabled = features.gitSync.enabled; const createInProjectActionList: { id: string; @@ -934,7 +933,6 @@ const Component = () => { organizationId={organizationId} project={item} storageRules={storageRules} - isGitSyncEnabled={isGitSyncEnabled} /> )} @@ -1332,7 +1330,7 @@ const Component = () => { ) : projects.length ? ( ) : ( - + )} @@ -1341,7 +1339,6 @@ const Component = () => { isOpen={isNewProjectModalOpen} onOpenChange={setIsNewProjectModalOpen} storageRules={storageRules} - isGitSyncEnabled={isGitSyncEnabled} /> )} {isUpdateProjectModalOpen && ( @@ -1351,7 +1348,6 @@ const Component = () => { project={activeProject} gitRepository={activeProjectGitRepository || undefined} storageRules={storageRules} - isGitSyncEnabled={isGitSyncEnabled} /> )} {activeProject && newWorkspaceModalState?.isOpen && ( diff --git a/packages/insomnia/src/routes/organization.$organizationId.project._index.tsx b/packages/insomnia/src/routes/organization.$organizationId.project._index.tsx index 8b1eba05a4..01e9709a2d 100644 --- a/packages/insomnia/src/routes/organization.$organizationId.project._index.tsx +++ b/packages/insomnia/src/routes/organization.$organizationId.project._index.tsx @@ -497,7 +497,7 @@ const Component = () => { const { presence } = useInsomniaEventStreamContext(); const storageRuleFetcher = useStorageRulesLoaderFetcher({ key: `storage-rule:${organizationId}` }); const createNewWorkspaceFetcher = useWorkspaceNewActionFetcher(); - const { billing, features } = useOrganizationPermissions(); + const { billing } = useOrganizationPermissions(); useEffect(() => { if (!isScratchpadOrganizationId(organizationId)) { @@ -651,7 +651,6 @@ const Component = () => { }; const canCreateMockServer = activeProject?._id; - const isGitSyncEnabled = features.gitSync.enabled; const createInProjectActionList: { id: string; @@ -901,7 +900,6 @@ const Component = () => { organizationId={organizationId} project={item} storageRules={storageRules} - isGitSyncEnabled={isGitSyncEnabled} /> )} @@ -1297,7 +1295,7 @@ const Component = () => { ) : ( - + )} @@ -1306,7 +1304,6 @@ const Component = () => { isOpen={isNewProjectModalOpen} onOpenChange={setIsNewProjectModalOpen} storageRules={storageRules} - isGitSyncEnabled={isGitSyncEnabled} /> )} {isUpdateProjectModalOpen && ( @@ -1316,7 +1313,6 @@ const Component = () => { project={activeProject} gitRepository={activeProjectGitRepository || undefined} storageRules={storageRules} - isGitSyncEnabled={isGitSyncEnabled} /> )} {activeProject && newWorkspaceModalState?.isOpen && ( diff --git a/packages/insomnia/src/ui/components/dropdowns/git-project-sync-dropdown.tsx b/packages/insomnia/src/ui/components/dropdowns/git-project-sync-dropdown.tsx index 4707f287b2..9153a026d5 100644 --- a/packages/insomnia/src/ui/components/dropdowns/git-project-sync-dropdown.tsx +++ b/packages/insomnia/src/ui/components/dropdowns/git-project-sync-dropdown.tsx @@ -28,7 +28,6 @@ import { SegmentEvent } from '~/ui/analytics'; import { ProjectModal } from '~/ui/components/modals/project-modal'; import { useGitCredentials } from '~/ui/hooks/use-git-credentials'; import { useLoaderDeferData } from '~/ui/hooks/use-loader-defer-data'; -import { useOrganizationPermissions } from '~/ui/hooks/use-organization-features'; import { DEFAULT_STORAGE_RULES } from '~/ui/organization-utils'; import type { GitRepository } from '../../../models/git-repository'; @@ -70,9 +69,6 @@ export const GitProjectSyncDropdown: FC = ({ gitRepository, activeProject const gitStatusFetcher = useGitProjectStatusActionFetcher(); const [isUpdateProjectModalOpen, setIsUpdateProjectModalOpen] = useState(false); - const { features } = useOrganizationPermissions(); - const isGitSyncEnabled = features.gitSync.enabled; - const storageRuleFetcher = useStorageRulesLoaderFetcher({ key: `storage-rule:${organizationId}` }); useEffect(() => { if (!isScratchpadOrganizationId(organizationId)) { @@ -652,7 +648,6 @@ export const GitProjectSyncDropdown: FC = ({ gitRepository, activeProject project={activeProject} gitRepository={gitRepository || undefined} storageRules={storageRules} - isGitSyncEnabled={isGitSyncEnabled} /> )} {isGitBranchesModalOpen && gitRepository && currentBranch && ( diff --git a/packages/insomnia/src/ui/components/dropdowns/project-dropdown.tsx b/packages/insomnia/src/ui/components/dropdowns/project-dropdown.tsx index 874ff6dcab..b151059194 100644 --- a/packages/insomnia/src/ui/components/dropdowns/project-dropdown.tsx +++ b/packages/insomnia/src/ui/components/dropdowns/project-dropdown.tsx @@ -17,7 +17,6 @@ interface Props { project: Project & { hasUncommittedOrUnpushedChanges?: boolean; gitRepository?: GitRepository }; organizationId: string; storageRules: StorageRules; - isGitSyncEnabled: boolean; } interface ProjectActionItem { @@ -27,7 +26,7 @@ interface ProjectActionItem { action: (projectId: string, projectName: string) => void; } -export const ProjectDropdown: FC = ({ project, organizationId, storageRules, isGitSyncEnabled }) => { +export const ProjectDropdown: FC = ({ project, organizationId, storageRules }) => { const [isProjectSettingsModalOpen, setIsProjectSettingsModalOpen] = useState(false); const deleteProjectFetcher = useProjectDeleteActionFetcher(); @@ -141,7 +140,6 @@ export const ProjectDropdown: FC = ({ project, organizationId, storageRul {isProjectSettingsModalOpen && ( void; storageRules: StorageRules; - isGitSyncEnabled: boolean; project?: Project; gitRepository?: GitRepository; }) => { @@ -75,7 +73,6 @@ export const ProjectModal = ({ {project ? ( = ({ storageRules, isGitSyncEnabled }) => { +export const NoProjectView: FC = ({ storageRules }) => { const { credentials, providers } = useGitCredentials(); return ( @@ -21,7 +20,6 @@ export const NoProjectView: FC = ({ storageRules, isGitSyncEnabled }) => ; @@ -35,7 +30,6 @@ interface Props { export const ProjectCreateForm: FC = ({ storageRules, - isGitSyncEnabled, defaultProjectName = 'My Project', onCancel, activeViewObj, @@ -44,17 +38,7 @@ export const ProjectCreateForm: FC = ({ }) => { const { organizationId } = useParams() as { organizationId: string }; - // Reload isGitSyncEnabled everytime this component is mounted - const permissionsFetcher = useOrganizationPermissionsLoaderFetcher({ key: `permissions:${organizationId}` }); - const permissionsFetcherLoad = permissionsFetcher.load; - useEffect(() => { - permissionsFetcherLoad({ - organizationId, - }); - }, [organizationId, permissionsFetcherLoad]); - const { featuresPromise } = permissionsFetcher.data || {}; - const [features = fallbackFeatures] = useLoaderDeferData(featuresPromise, organizationId); - isGitSyncEnabled = features.gitSync.enabled; + const isGitSyncEnabled = useIsGitSyncEnabled(organizationId); const [storageType, setStorageType] = useState(); @@ -140,7 +124,7 @@ export const ProjectCreateForm: FC = ({ storageType={storageType} storageRules={storageRules} /> - {storageType === 'git' && ( + {storageType === 'git' && isGitSyncEnabled && ( = ({ Scan for files diff --git a/packages/insomnia/src/ui/components/project/project-settings-form.tsx b/packages/insomnia/src/ui/components/project/project-settings-form.tsx index d3db60a941..9ba8e90178 100644 --- a/packages/insomnia/src/ui/components/project/project-settings-form.tsx +++ b/packages/insomnia/src/ui/components/project/project-settings-form.tsx @@ -9,10 +9,6 @@ import { LearnMoreLink } from '~/basic-components/link'; import type { GitCredentials } from '~/models/git-credentials'; import type { StorageRules } from '~/models/organization'; import { useGitProjectInitCloneActionFetcher } from '~/routes/git.init-clone'; -import { - fallbackFeatures, - useOrganizationPermissionsLoaderFetcher, -} from '~/routes/organization.$organizationId.permissions'; import type { GitProviderOption } from '~/sync/git/providers/types'; import { GitConnectionInfo } from '~/ui/components/git/connection-info'; import { GitRepoForm } from '~/ui/components/project/git-repo-form'; @@ -21,7 +17,7 @@ import { ProjectTypeSelect } from '~/ui/components/project/project-type-select'; import { ProjectTypeWarning } from '~/ui/components/project/project-type-warning'; import { useActiveView } from '~/ui/components/project/utils'; import { useIsLightTheme } from '~/ui/hooks/theme'; -import { useLoaderDeferData } from '~/ui/hooks/use-loader-defer-data'; +import { useIsGitSyncEnabled } from '~/ui/hooks/use-organization-features'; import type { GitRepository } from '../../../models/git-repository'; import { @@ -54,7 +50,6 @@ function isSwitchingStorageType(project: Project, storageType: 'local' | 'remote interface Props { storageRules: StorageRules; - isGitSyncEnabled: boolean; project?: Project; gitRepository?: GitRepository; defaultProjectName?: string; @@ -66,7 +61,6 @@ interface Props { export const ProjectSettingsForm: FC = ({ storageRules, - isGitSyncEnabled, project, gitRepository, defaultProjectName = 'My Project', @@ -77,16 +71,7 @@ export const ProjectSettingsForm: FC = ({ }) => { const { organizationId } = useParams() as { organizationId: string }; - const permissionsFetcher = useOrganizationPermissionsLoaderFetcher({ key: `permissions:${organizationId}` }); - const permissionsFetcherLoad = permissionsFetcher.load; - useEffect(() => { - permissionsFetcherLoad({ - organizationId, - }); - }, [organizationId, permissionsFetcherLoad]); - const { featuresPromise } = permissionsFetcher.data || {}; - const [features = fallbackFeatures] = useLoaderDeferData(featuresPromise, organizationId); - isGitSyncEnabled = features.gitSync.enabled; + const isGitSyncEnabled = useIsGitSyncEnabled(organizationId); const isLightTheme = useIsLightTheme(); diff --git a/packages/insomnia/src/ui/hooks/use-organization-features.tsx b/packages/insomnia/src/ui/hooks/use-organization-features.tsx index 6b02c310c2..50251e759c 100644 --- a/packages/insomnia/src/ui/hooks/use-organization-features.tsx +++ b/packages/insomnia/src/ui/hooks/use-organization-features.tsx @@ -87,3 +87,16 @@ export function useAIFeatureStatus(): AIFeatureStatus { isMCPWithAIEnabled: mcpClientWithAIAllowedByOrg && mcpIntegrationWithAIEnabledByUser && hasActiveLLM, }; } + +export function useIsGitSyncEnabled(organizationId: string) { + const permissionsFetcher = useOrganizationPermissionsLoaderFetcher({ key: `permissions:${organizationId}` }); + const permissionsFetcherLoad = permissionsFetcher.load; + useEffect(() => { + permissionsFetcherLoad({ + organizationId, + }); + }, [organizationId, permissionsFetcherLoad]); + const { featuresPromise } = permissionsFetcher.data || {}; + const [features = fallbackFeatures] = useLoaderDeferData(featuresPromise, organizationId); + return features.gitSync.enabled; +}