diff --git a/server/src/main/java/org/eclipse/openvsx/UserAPI.java b/server/src/main/java/org/eclipse/openvsx/UserAPI.java index a9e12d535..1ed50c1f4 100644 --- a/server/src/main/java/org/eclipse/openvsx/UserAPI.java +++ b/server/src/main/java/org/eclipse/openvsx/UserAPI.java @@ -230,6 +230,7 @@ public List<NamespaceJson> getOwnNamespaces() { if(isOwner) { json.setMembersUrl(createApiUrl(serverUrl, "user", "namespace", namespace.getName(), "members")); json.setRoleUrl(createApiUrl(serverUrl, "user", "namespace", namespace.getName(), "role")); + json.setDetailsUrl(createApiUrl(serverUrl, "user", "namespace", namespace.getName(), "details")); } return json; diff --git a/server/src/main/java/org/eclipse/openvsx/json/NamespaceJson.java b/server/src/main/java/org/eclipse/openvsx/json/NamespaceJson.java index 154652f21..c0b1a80e0 100644 --- a/server/src/main/java/org/eclipse/openvsx/json/NamespaceJson.java +++ b/server/src/main/java/org/eclipse/openvsx/json/NamespaceJson.java @@ -55,6 +55,9 @@ public static NamespaceJson error(String message) { @Schema(hidden = true) private String roleUrl; + @Schema(hidden = true) + private String detailsUrl; + public String getName() { return name; } @@ -102,4 +105,12 @@ public String getRoleUrl() { public void setRoleUrl(String roleUrl) { this.roleUrl = roleUrl; } + + public String getDetailsUrl() { + return detailsUrl; + } + + public void setDetailsUrl(String detailsUrl) { + this.detailsUrl = detailsUrl; + } } \ No newline at end of file diff --git a/webui/src/extension-registry-service.ts b/webui/src/extension-registry-service.ts index 6bb3144fb..ff872535a 100644 --- a/webui/src/extension-registry-service.ts +++ b/webui/src/extension-registry-service.ts @@ -49,7 +49,7 @@ export class ExtensionRegistryService { return sendRequest({ abortController, endpoint }); } - async setNamespaceDetails(abortController: AbortController, details: NamespaceDetails): Promise<Readonly<SuccessResult | ErrorResult>> { + async setNamespaceDetails(abortController: AbortController, endpoint: string, details: NamespaceDetails): Promise<Readonly<SuccessResult | ErrorResult>> { const csrfResponse = await this.getCsrfToken(abortController); const headers: Record<string, string> = { 'Content-Type': 'application/json;charset=UTF-8' @@ -59,7 +59,6 @@ export class ExtensionRegistryService { headers[csrfToken.header] = csrfToken.value; } - const endpoint = createAbsoluteURL([this.serverUrl, 'user', 'namespace', details.name, 'details']); return sendRequest({ abortController, method: 'POST', @@ -70,7 +69,7 @@ export class ExtensionRegistryService { }); } - async setNamespaceLogo(abortController: AbortController, namespace: string, logoFile: Blob, logoName: string): Promise<Readonly<SuccessResult | ErrorResult>> { + async setNamespaceLogo(abortController: AbortController, endpoint: string, logoFile: Blob, logoName: string): Promise<Readonly<SuccessResult | ErrorResult>> { const csrfResponse = await this.getCsrfToken(abortController); const headers: Record<string, string> = {}; if (!isError(csrfResponse)) { @@ -80,7 +79,7 @@ export class ExtensionRegistryService { const form = new FormData(); form.append('file', logoFile, logoName); - const endpoint = createAbsoluteURL([this.serverUrl, 'user', 'namespace', namespace, 'details', 'logo']); + endpoint = createAbsoluteURL([endpoint, 'logo']); return sendRequest({ abortController, method: 'POST', diff --git a/webui/src/extension-registry-types.ts b/webui/src/extension-registry-types.ts index 45fecbe0b..cd8b862a8 100644 --- a/webui/src/extension-registry-types.ts +++ b/webui/src/extension-registry-types.ts @@ -220,6 +220,7 @@ export interface Namespace { verified: boolean; membersUrl: UrlString; roleUrl: UrlString; + detailsUrl: UrlString; } export interface NamespaceDetails { diff --git a/webui/src/pages/user/user-namespace-details.tsx b/webui/src/pages/user/user-namespace-details.tsx index a2821514a..35c29c72a 100644 --- a/webui/src/pages/user/user-namespace-details.tsx +++ b/webui/src/pages/user/user-namespace-details.tsx @@ -194,14 +194,14 @@ export const UserNamespaceDetails: FunctionComponent<UserNamespaceDetailsProps> ? 'https://twitter.com/' + details.socialLinks.twitter : undefined; - const result = await context.service.setNamespaceDetails(abortController.current, details); + const result = await context.service.setNamespaceDetails(abortController.current, props.namespace.detailsUrl, details); if (isError(result)) { throw result; } if (logoPreview) { const logoFile = await (await fetch(logoPreview)).blob(); - await context.service.setNamespaceLogo(abortController.current, details.name, logoFile, details.logo as string); + await context.service.setNamespaceLogo(abortController.current, props.namespace.detailsUrl, logoFile, details.logo as string); await getNamespaceDetails(); } else { setCurrentDetails(copy(newDetails)); diff --git a/webui/src/pages/user/user-settings-namespace-detail.tsx b/webui/src/pages/user/user-settings-namespace-detail.tsx index b23beba13..68f752863 100644 --- a/webui/src/pages/user/user-settings-namespace-detail.tsx +++ b/webui/src/pages/user/user-settings-namespace-detail.tsx @@ -108,18 +108,20 @@ export const NamespaceDetail: FunctionComponent<NamespaceDetailProps> = props => </Grid> { props.namespace.membersUrl - ? <> - <Grid item> - <UserNamespaceMemberList - setLoadingState={props.setLoadingState} - namespace={props.namespace} - filterUsers={props.filterUsers} - fixSelf={props.fixSelf} /> - </Grid> - <Grid item> - <UserNamespaceDetails namespace={props.namespace}/> - </Grid> - </> + ? <Grid item> + <UserNamespaceMemberList + setLoadingState={props.setLoadingState} + namespace={props.namespace} + filterUsers={props.filterUsers} + fixSelf={props.fixSelf} /> + </Grid> + : null + } + { + props.namespace.detailsUrl + ? <Grid item> + <UserNamespaceDetails namespace={props.namespace}/> + </Grid> : null } <Grid item>