Skip to content

Commit ead0f94

Browse files
fix(web): use query to check if private project can be created for given workspace [VIZ-2145] (#1763)
2 parents 970618b + d09f6d4 commit ead0f94

File tree

9 files changed

+95
-26
lines changed

9 files changed

+95
-26
lines changed

web/src/app/features/Dashboard/ContentsContainer/Projects/ProjectCreatorModal.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
SelectField
1515
} from "@reearth/app/ui/fields";
1616
import TextAreaField from "@reearth/app/ui/fields/TextareaField";
17-
import { useProjectFetcher } from "@reearth/services/api";
17+
import { useProjectFetcher, useWorkspaceFetcher } from "@reearth/services/api";
1818
import { appFeature } from "@reearth/services/config/appFeatureConfig";
1919
import { useT } from "@reearth/services/i18n";
2020
import { useWorkspace } from "@reearth/services/state";
@@ -57,6 +57,11 @@ const ProjectCreatorModal: FC<ProjectCreatorModalProps> = ({
5757
const { projectVisibility } = appFeature();
5858
const { checkProjectAlias } = useProjectFetcher();
5959
const [currentWorkspace] = useWorkspace();
60+
const { useWorkspacePolicyCheck } = useWorkspaceFetcher();
61+
62+
const data = useWorkspacePolicyCheck(currentWorkspace?.id as string);
63+
const enableToCreatePrivateProject =
64+
data?.workspacePolicyCheck?.enableToCreatePrivateProject ?? false;
6065

6166
const [formState, setFormState] = useState<FormState>({
6267
projectName: "",
@@ -73,10 +78,10 @@ const ProjectCreatorModal: FC<ProjectCreatorModalProps> = ({
7378
{
7479
value: "private",
7580
label: t("Private"),
76-
disabled: !currentWorkspace?.enableToCreatePrivateProject
81+
disabled: !enableToCreatePrivateProject
7782
}
7883
],
79-
[t, currentWorkspace?.enableToCreatePrivateProject]
84+
[t, enableToCreatePrivateProject]
8085
);
8186

8287
const handleOnChange = useCallback(

web/src/app/features/Dashboard/ContentsContainer/Projects/ProjectVisibilityModal.tsx

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {
55
Typography
66
} from "@reearth/app/lib/reearth-ui";
77
import { SelectField } from "@reearth/app/ui/fields";
8+
import { useWorkspaceFetcher } from "@reearth/services/api";
9+
import { Workspace } from "@reearth/services/gql";
810
import { useT } from "@reearth/services/i18n";
911
import { styled, useTheme } from "@reearth/services/theme";
1012
import { FC, useMemo, useState } from "react";
@@ -13,24 +15,34 @@ type Props = {
1315
visibility: string;
1416
onClose: () => void;
1517
onProjectVisibilityChange: (value: string) => void;
18+
workspaceId: Workspace["id"];
1619
};
1720

1821
const ProjectVisibilityModal: FC<Props> = ({
1922
visibility,
2023
onClose,
21-
onProjectVisibilityChange
24+
onProjectVisibilityChange,
25+
workspaceId
2226
}) => {
2327
const t = useT();
2428
const theme = useTheme();
25-
29+
const { useWorkspacePolicyCheck } = useWorkspaceFetcher();
30+
const data = useWorkspacePolicyCheck(workspaceId);
31+
const enableToCreatePrivateProject =
32+
data?.workspacePolicyCheck?.enableToCreatePrivateProject ?? false;
33+
2634
const [projectVisibility, setProjectVisibility] = useState(visibility);
2735

2836
const projectVisibilityOptions = useMemo(
2937
() => [
3038
{ value: "public", label: t("Public") },
31-
{ value: "private", label: t("Private") }
39+
{
40+
value: "private",
41+
label: t("Private"),
42+
disabled: !enableToCreatePrivateProject
43+
}
3244
],
33-
[t]
45+
[t, enableToCreatePrivateProject]
3446
);
3547
return (
3648
<Modal size="small" visible={true}>
@@ -44,7 +56,11 @@ const ProjectVisibilityModal: FC<Props> = ({
4456
size="normal"
4557
title={t("Confirm visibility")}
4658
appearance="primary"
47-
disabled={projectVisibility === visibility || projectVisibility === "private"}
59+
disabled={
60+
projectVisibility === visibility ||
61+
(projectVisibility === "private" &&
62+
!enableToCreatePrivateProject)
63+
}
4864
onClick={() => onProjectVisibilityChange(projectVisibility)}
4965
/>
5066
</>

web/src/app/features/ProjectSettings/innerPages/GeneralSettings/index.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,19 @@ const GeneralSettings: FC<Props> = ({
7171
[project, onUpdateProject]
7272
);
7373

74-
const handleProjectAliasChange = useCallback(
75-
(value: string) => {
76-
setLocalAlias(value);
77-
setWarning("");
78-
},
79-
[]
80-
);
81-
74+
const handleProjectAliasChange = useCallback((value: string) => {
75+
setLocalAlias(value);
76+
setWarning("");
77+
}, []);
78+
8279
const handleProjectAliasUpdate = useCallback(
8380
async (projectAlias: string) => {
8481
if (!project) return;
85-
const result = await checkProjectAlias?.(localAlias, workspaceId, project?.id);
82+
const result = await checkProjectAlias?.(
83+
localAlias,
84+
workspaceId,
85+
project?.id
86+
);
8687

8788
if (!result?.available) {
8889
const description = result?.errors?.find(
@@ -298,6 +299,7 @@ const GeneralSettings: FC<Props> = ({
298299
)}
299300
{projectVisibilityModal && (
300301
<ProjectVisibilityModal
302+
workspaceId={workspaceId}
301303
visibility={project.visibility || "public"}
302304
onProjectVisibilityChange={handleProjectVisibiltyUpdate}
303305
onClose={handleProjectVisibilityModal}

web/src/services/api/workspacesApi.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import {
1515
DELETE_WORKSPACE,
1616
REMOVE_MEMBER_FROM_WORKSPACE,
1717
UPDATE_MEMBER_OF_WORKSPACE,
18-
UPDATE_WORKSPACE
18+
UPDATE_WORKSPACE,
19+
WORKSPACE_POLICY_CHECK
1920
} from "@reearth/services/gql/queries/workspace";
2021
import { useT } from "@reearth/services/i18n";
2122
import { useCallback } from "react";
@@ -229,7 +230,17 @@ export default () => {
229230
[updateMemberOfWorkspaceMutation, setNotification, t]
230231
);
231232

233+
const useWorkspacePolicyCheck = useCallback((workspaceId: string) => {
234+
const { data } = useQuery(WORKSPACE_POLICY_CHECK, {
235+
variables: { workspaceId },
236+
skip: !workspaceId
237+
});
238+
239+
return data;
240+
}, []);
241+
232242
return {
243+
useWorkspacePolicyCheck,
233244
useWorkspaceQuery,
234245
useWorkspacesQuery,
235246
useCreateWorkspace,

web/src/services/gql/__gen__/gql.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ const documents = {
8383
"\n mutation RemoveStoryBlock($input: RemoveStoryBlockInput!){\n removeStoryBlock(input: $input) {\n blockId\n page {\n id\n }\n story {\n id\n }\n }\n }\n": types.RemoveStoryBlockDocument,
8484
"\n query CheckStoryAlias($alias: String!, $storyId: ID) {\n checkStoryAlias(alias: $alias, storyId: $storyId) {\n alias\n available\n }\n }\n": types.CheckStoryAliasDocument,
8585
"\n query GetUserBySearch($nameOrEmail: String!) {\n searchUser(nameOrEmail: $nameOrEmail) {\n id\n name\n email\n }\n }\n": types.GetUserBySearchDocument,
86-
"\n query GetMe {\n me {\n id\n name\n email\n lang\n theme\n myWorkspace {\n id\n name\n alias\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n enableToCreatePrivateProject\n }\n workspaces {\n id\n name\n alias\n personal\n members {\n user {\n id\n name\n email\n }\n userId\n role\n }\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n enableToCreatePrivateProject\n }\n auths\n }\n }\n": types.GetMeDocument,
86+
"\n query GetMe {\n me {\n id\n name\n email\n lang\n theme\n myWorkspace {\n id\n name\n alias\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n }\n workspaces {\n id\n name\n alias\n personal\n members {\n user {\n id\n name\n email\n }\n userId\n role\n }\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n }\n auths\n }\n }\n": types.GetMeDocument,
8787
"\n mutation UpdateMe(\n $name: String\n $email: String\n $lang: Lang\n $theme: Theme\n $password: String\n $passwordConfirmation: String\n ) {\n updateMe(\n input: {\n name: $name\n email: $email\n lang: $lang\n theme: $theme\n password: $password\n passwordConfirmation: $passwordConfirmation\n }\n ) {\n me {\n id\n name\n email\n lang\n theme\n myWorkspace {\n id\n name\n }\n }\n }\n }\n": types.UpdateMeDocument,
8888
"\n mutation DeleteMe($userId: ID!) {\n deleteMe(input: { userId: $userId }) {\n userId\n }\n }\n": types.DeleteMeDocument,
8989
" mutation AddWidget($sceneId: ID!, $pluginId: ID!, $extensionId: ID!, $lang: Lang) {\n addWidget(\n input: {sceneId: $sceneId, pluginId: $pluginId, extensionId: $extensionId}\n ) {\n scene {\n id\n widgets {\n id\n enabled\n pluginId\n extensionId\n propertyId\n property {\n id\n ...PropertyFragment\n }\n }\n }\n sceneWidget {\n id\n enabled\n pluginId\n extensionId\n }\n }\n }": types.AddWidgetDocument,
@@ -96,6 +96,7 @@ const documents = {
9696
"\n mutation AddMemberToWorkspace($workspaceId: ID!, $userId: ID!, $role: Role!) {\n addMemberToWorkspace(input: { workspaceId: $workspaceId, userId: $userId, role: $role }) {\n workspace {\n id\n name\n members {\n user {\n id\n name\n email\n }\n userId\n role\n }\n personal\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n }\n }\n }\n": types.AddMemberToWorkspaceDocument,
9797
"\n mutation RemoveMemberFromWorkspace($workspaceId: ID!, $userId: ID!) {\n removeMemberFromWorkspace(input: { workspaceId: $workspaceId, userId: $userId }) {\n workspace {\n id\n name\n members {\n user {\n id\n name\n email\n }\n userId\n role\n }\n personal\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n }\n }\n }\n": types.RemoveMemberFromWorkspaceDocument,
9898
"\n mutation UpdateMemberOfWorkspace($workspaceId: ID!, $userId: ID!, $role: Role!) {\n updateMemberOfWorkspace(\n input: { workspaceId: $workspaceId, userId: $userId, role: $role }\n ) {\n workspace {\n id\n name\n members {\n user {\n id\n name\n email\n }\n userId\n role\n }\n personal\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n }\n }\n }\n": types.UpdateMemberOfWorkspaceDocument,
99+
"\n query WorkspacePolicyCheck($workspaceId: ID!) {\n workspacePolicyCheck(input: { workspaceId: $workspaceId }) {\n workspaceId\n enableToCreatePrivateProject\n }\n }\n": types.WorkspacePolicyCheckDocument,
99100
};
100101

101102
/**
@@ -395,7 +396,7 @@ export function gql(source: "\n query GetUserBySearch($nameOrEmail: String!) {\
395396
/**
396397
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
397398
*/
398-
export function gql(source: "\n query GetMe {\n me {\n id\n name\n email\n lang\n theme\n myWorkspace {\n id\n name\n alias\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n enableToCreatePrivateProject\n }\n workspaces {\n id\n name\n alias\n personal\n members {\n user {\n id\n name\n email\n }\n userId\n role\n }\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n enableToCreatePrivateProject\n }\n auths\n }\n }\n"): (typeof documents)["\n query GetMe {\n me {\n id\n name\n email\n lang\n theme\n myWorkspace {\n id\n name\n alias\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n enableToCreatePrivateProject\n }\n workspaces {\n id\n name\n alias\n personal\n members {\n user {\n id\n name\n email\n }\n userId\n role\n }\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n enableToCreatePrivateProject\n }\n auths\n }\n }\n"];
399+
export function gql(source: "\n query GetMe {\n me {\n id\n name\n email\n lang\n theme\n myWorkspace {\n id\n name\n alias\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n }\n workspaces {\n id\n name\n alias\n personal\n members {\n user {\n id\n name\n email\n }\n userId\n role\n }\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n }\n auths\n }\n }\n"): (typeof documents)["\n query GetMe {\n me {\n id\n name\n email\n lang\n theme\n myWorkspace {\n id\n name\n alias\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n }\n workspaces {\n id\n name\n alias\n personal\n members {\n user {\n id\n name\n email\n }\n userId\n role\n }\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n }\n auths\n }\n }\n"];
399400
/**
400401
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
401402
*/
@@ -444,6 +445,10 @@ export function gql(source: "\n mutation RemoveMemberFromWorkspace($workspaceId
444445
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
445446
*/
446447
export function gql(source: "\n mutation UpdateMemberOfWorkspace($workspaceId: ID!, $userId: ID!, $role: Role!) {\n updateMemberOfWorkspace(\n input: { workspaceId: $workspaceId, userId: $userId, role: $role }\n ) {\n workspace {\n id\n name\n members {\n user {\n id\n name\n email\n }\n userId\n role\n }\n personal\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n }\n }\n }\n"): (typeof documents)["\n mutation UpdateMemberOfWorkspace($workspaceId: ID!, $userId: ID!, $role: Role!) {\n updateMemberOfWorkspace(\n input: { workspaceId: $workspaceId, userId: $userId, role: $role }\n ) {\n workspace {\n id\n name\n members {\n user {\n id\n name\n email\n }\n userId\n role\n }\n personal\n policyId\n policy {\n id\n name\n projectCount\n memberCount\n publishedProjectCount\n layerCount\n assetStorageSize\n }\n }\n }\n }\n"];
448+
/**
449+
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
450+
*/
451+
export function gql(source: "\n query WorkspacePolicyCheck($workspaceId: ID!) {\n workspacePolicyCheck(input: { workspaceId: $workspaceId }) {\n workspaceId\n enableToCreatePrivateProject\n }\n }\n"): (typeof documents)["\n query WorkspacePolicyCheck($workspaceId: ID!) {\n workspacePolicyCheck(input: { workspaceId: $workspaceId }) {\n workspaceId\n enableToCreatePrivateProject\n }\n }\n"];
447452

448453
export function gql(source: string) {
449454
return (documents as any)[source] ?? {};

0 commit comments

Comments
 (0)