Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 98695fb

Browse files
committed
setup redux, sagas for the new myorg endpoint
1 parent 8b40672 commit 98695fb

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

‎client/packages/lowcoder/src/api/userApi.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,13 @@ export type GetCurrentUserResponse = GenericApiResponse<CurrentUser>;
6262

6363
export interface GetMyOrgsResponse extends ApiResponse {
6464
data: {
65-
items: Org[];
66-
totalCount: number;
67-
currentPage: number;
65+
data: Array<{
66+
orgId: string;
67+
orgName: string;
68+
}>;
69+
pageNum: number;
6870
pageSize: number;
69-
hasMore: boolean;
71+
total: number;
7072
};
7173
}
7274

‎client/packages/lowcoder/src/pages/common/profileDropdown.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Input } from "antd";
44
import { Org, OrgRoleInfo } from "constants/orgConstants";
55
import { ORGANIZATION_SETTING } from "constants/routesURL";
66
import { User } from "constants/userConstants";
7+
import { getWorkspaces } from "redux/selectors/orgSelectors";
78
import {
89
AddIcon,
910
CheckoutIcon,
@@ -17,9 +18,9 @@ import {
1718
SearchIcon,
1819
} from "lowcoder-design";
1920
import ProfileSettingModal from "pages/setting/profile";
20-
import React, { useMemo, useState } from "react";
21+
import React, { useEffect, useMemo, useState } from "react";
2122
import { useDispatch, useSelector } from "react-redux";
22-
import { createOrgAction, switchOrg } from "redux/reduxActions/orgActions";
23+
import { createOrgAction, fetchWorkspacesAction, switchOrg } from "redux/reduxActions/orgActions";
2324
import styled from "styled-components";
2425
import history from "util/history";
2526
import ProfileImage from "pages/common/profileImage";
@@ -221,6 +222,8 @@ type DropDownProps = {
221222
export default function ProfileDropdown(props: DropDownProps) {
222223
const { avatarUrl, username, orgs, currentOrgId } = props.user;
223224
const currentOrgRoleId = props.user.orgRoleMap.get(currentOrgId);
225+
const workspaces = useSelector(getWorkspaces);
226+
console.log("workspaces", workspaces);
224227
const currentOrg = useMemo(
225228
() => props.user.orgs.find((o) => o.id === currentOrgId),
226229
[props.user, currentOrgId]
@@ -231,6 +234,14 @@ export default function ProfileDropdown(props: DropDownProps) {
231234
const [searchTerm, setSearchTerm] = useState("");
232235
const [dropdownVisible, setDropdownVisible] = useState(false);
233236

237+
238+
// Load workspaces when dropdown opens for the first time
239+
useEffect(() => {
240+
if (dropdownVisible && workspaces.items.length === 0) {
241+
dispatch(fetchWorkspacesAction(1));
242+
}
243+
}, [dropdownVisible, workspaces.items.length, dispatch]);
244+
234245
const filteredOrgs = useMemo(() => {
235246
if (!searchTerm.trim()) return orgs;
236247
return orgs.filter(org =>

‎client/packages/lowcoder/src/redux/sagas/orgSagas.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -340,18 +340,29 @@ export function* fetchWorkspacesSaga(action: ReduxAction<{page: number, search?:
340340
);
341341

342342
if (validateResponse(response)) {
343+
const apiData = response.data.data;
344+
console.log("apiData", apiData);
345+
const hasMore = (apiData.pageNum * apiData.pageSize) < apiData.total;
346+
347+
// Transform orgId/orgName to match Org interface
348+
const transformedItems = apiData.data.map(item => ({
349+
id: item.orgId,
350+
name: item.orgName,
351+
// Add other Org properties if needed (logoUrl, etc.)
352+
}));
353+
343354
const actionType = isLoadMore
344355
? ReduxActionTypes.LOAD_MORE_WORKSPACES_SUCCESS
345356
: ReduxActionTypes.FETCH_WORKSPACES_SUCCESS;
346357

347358
yield put({
348359
type: actionType,
349360
payload: {
350-
items: response.data.data.items,
351-
totalCount: response.data.data.totalCount,
352-
currentPage: response.data.data.currentPage,
353-
pageSize: response.data.data.pageSize,
354-
hasMore: response.data.data.hasMore,
361+
items: transformedItems,
362+
totalCount: apiData.total,
363+
currentPage: apiData.pageNum,
364+
pageSize: apiData.pageSize,
365+
hasMore: hasMore,
355366
searchQuery: search || ""
356367
}
357368
});

0 commit comments

Comments
 (0)