@teambit/lanes.hooks.use-lanes 0.0.203 → 0.0.204

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { LanesContext, LanesContextModel, useLanesContext } from './lanes-context';
2
2
  export { LanesProvider, LanesProviderProps, IgnoreDerivingFromUrl } from './lanes-provider';
3
3
  export { useLanes } from './use-lanes';
4
+ export type { UseLanesOptions as UseLaneOptions, UseLanes, UseLanesResult, FetchMoreLanes, FetchMoreLanesResult, SearchLanes, SearchLanesResult, } from './use-lanes';
@@ -1,10 +1,16 @@
1
1
  /// <reference types="react" />
2
2
  import { LaneId } from '@teambit/lane-id';
3
3
  import { LanesModel } from '@teambit/lanes.ui.models.lanes-model';
4
+ import { FetchMoreLanes, UseLanesOptions } from './use-lanes';
4
5
  export declare type LanesContextModel = {
5
6
  lanesModel?: LanesModel;
6
- updateLanesModel?: (updatedLanes?: LanesModel) => void;
7
7
  updateViewedLane?: (viewedLaneId?: LaneId) => void;
8
+ fetchMoreLanes?: FetchMoreLanes;
9
+ hasMore?: boolean;
10
+ loading?: boolean;
11
+ options?: UseLanesOptions;
12
+ offset?: number;
13
+ limit?: number;
8
14
  };
9
15
  export declare const LanesContext: React.Context<LanesContextModel | undefined>;
10
16
  export declare const useLanesContext: () => LanesContextModel | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"lanes-context.js","sourceRoot":"","sources":["../lanes-context.ts"],"names":[],"mappings":";;;AAEA,iCAAkD;AAQrC,QAAA,YAAY,GAAiD,IAAA,qBAAa,EACrF,SAAS,CACV,CAAC;AAEK,MAAM,eAAe,GAAwC,GAAG,EAAE;IACvE,MAAM,YAAY,GAAG,IAAA,kBAAU,EAAC,oBAAY,CAAC,CAAC;IAC9C,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAHW,QAAA,eAAe,mBAG1B"}
1
+ {"version":3,"file":"lanes-context.js","sourceRoot":"","sources":["../lanes-context.ts"],"names":[],"mappings":";;;AAEA,iCAAkD;AAcrC,QAAA,YAAY,GAAiD,IAAA,qBAAa,EACrF,SAAS,CACV,CAAC;AAEK,MAAM,eAAe,GAAwC,GAAG,EAAE;IACvE,MAAM,YAAY,GAAG,IAAA,kBAAU,EAAC,oBAAY,CAAC,CAAC;IAC9C,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAHW,QAAA,eAAe,mBAG1B"}
@@ -1,4 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
+ import { UseLaneOptions } from '@teambit/lanes.hooks.use-lanes';
2
3
  import { LanesModel } from '@teambit/lanes.ui.models.lanes-model';
3
4
  import { Location } from '@teambit/base-react.navigation.link';
4
5
  import { LaneId } from '@teambit/lane-id';
@@ -9,5 +10,9 @@ export declare type LanesProviderProps = {
9
10
  targetLanes?: LanesModel;
10
11
  skipNetworkCall?: boolean;
11
12
  ignoreDerivingFromUrl?: IgnoreDerivingFromUrl[];
13
+ options?: UseLaneOptions;
14
+ useScope?: () => {
15
+ scope?: string;
16
+ };
12
17
  };
13
- export declare function LanesProvider({ children, viewedLaneId: viewedIdFromProps, targetLanes, ignoreDerivingFromUrl: ignoreDerivingFromUrlFromProps, skipNetworkCall, }: LanesProviderProps): JSX.Element;
18
+ export declare function LanesProvider({ children, viewedLaneId: viewedIdFromProps, targetLanes, ignoreDerivingFromUrl: ignoreDerivingFromUrlFromProps, skipNetworkCall, options: optionsFromProps, useScope, }: LanesProviderProps): JSX.Element;
@@ -30,10 +30,21 @@ const lanes_ui_models_lanes_model_1 = require("@teambit/lanes.ui.models.lanes-mo
30
30
  const ui_foundation_ui_react_router_use_query_1 = require("@teambit/ui-foundation.ui.react-router.use-query");
31
31
  const base_react_navigation_link_1 = require("@teambit/base-react.navigation.link");
32
32
  const lanes_context_1 = require("./lanes-context");
33
- function LanesProvider({ children, viewedLaneId: viewedIdFromProps, targetLanes, ignoreDerivingFromUrl: ignoreDerivingFromUrlFromProps, skipNetworkCall, }) {
34
- const { lanesModel, loading } = (0, lanes_hooks_use_lanes_1.useLanes)(targetLanes, skipNetworkCall);
35
- const [lanesState, setLanesState] = (0, react_1.useState)(lanesModel);
33
+ function LanesProvider({ children, viewedLaneId: viewedIdFromProps, targetLanes, ignoreDerivingFromUrl: ignoreDerivingFromUrlFromProps, skipNetworkCall, options: optionsFromProps = {}, useScope, }) {
34
+ var _a;
35
+ const [lanesState, setLanesState] = (0, react_1.useState)();
36
36
  const [viewedLaneId, setViewedLaneId] = (0, react_1.useState)(viewedIdFromProps);
37
+ const { scope } = (useScope === null || useScope === void 0 ? void 0 : useScope()) || {};
38
+ const skip = skipNetworkCall || !!targetLanes;
39
+ const options = (0, react_1.useMemo)(() => {
40
+ var _a, _b, _c;
41
+ return (Object.assign({ skip, ids: (_a = optionsFromProps.ids) !== null && _a !== void 0 ? _a : (viewedLaneId ? [viewedLaneId.toString()] : undefined), offset: (_b = optionsFromProps.offset) !== null && _b !== void 0 ? _b : 0, limit: (_c = optionsFromProps.limit) !== null && _c !== void 0 ? _c : 10 }, optionsFromProps));
42
+ }, [skip, optionsFromProps.ids, (_a = optionsFromProps.ids) === null || _a === void 0 ? void 0 : _a.length, viewedLaneId === null || viewedLaneId === void 0 ? void 0 : viewedLaneId.toString()]);
43
+ const { lanesModel, loading, hasMore, fetchMoreLanes, offset, limit } = (0, lanes_hooks_use_lanes_1.useLanes)(targetLanes, skipNetworkCall, options, undefined, scope);
44
+ (0, react_1.useEffect)(() => {
45
+ if (!loading && lanesModel)
46
+ setLanesState(lanesModel);
47
+ }, [lanesModel, loading]);
37
48
  const updateViewedLane = (0, react_1.useCallback)((lane) => {
38
49
  setViewedLaneId(lane);
39
50
  setLanesState((state) => {
@@ -81,8 +92,13 @@ function LanesProvider({ children, viewedLaneId: viewedIdFromProps, targetLanes,
81
92
  }, [loading, lanesModel === null || lanesModel === void 0 ? void 0 : lanesModel.lanes.length, viewedLaneId]);
82
93
  const lanesContextModel = {
83
94
  lanesModel: lanesState,
84
- updateLanesModel: setLanesState,
85
95
  updateViewedLane,
96
+ loading,
97
+ hasMore,
98
+ fetchMoreLanes,
99
+ options,
100
+ offset,
101
+ limit,
86
102
  };
87
103
  return react_1.default.createElement(lanes_context_1.LanesContext.Provider, { value: lanesContextModel }, children);
88
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lanes-provider.js","sourceRoot":"","sources":["../lanes-provider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lanes-provider.js","sourceRoot":"","sources":["../lanes-provider.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +1,39 @@
1
- import { LanesModel, LanesQuery } from '@teambit/lanes.ui.models.lanes-model';
2
- import { QueryResult } from '@apollo/client';
3
- import { LanesContextModel } from './lanes-context';
4
- export declare function useLanes(targetLanes?: LanesModel, skip?: boolean): LanesContextModel & Omit<QueryResult<LanesQuery & {
5
- getHost: {
6
- id: string;
7
- };
8
- }>, 'data'>;
1
+ import { LaneModel, LanesModel } from '@teambit/lanes.ui.models.lanes-model';
2
+ export declare type LaneSort = {
3
+ by?: Exclude<keyof LaneModel, 'components' | 'readmeComponent'>;
4
+ direction?: string;
5
+ };
6
+ export declare type UseLanesOptions = {
7
+ ids?: string[];
8
+ offset?: number;
9
+ limit?: number;
10
+ sort?: LaneSort;
11
+ search?: string;
12
+ };
13
+ export declare type FetchMoreLanesResult = {
14
+ lanesModel?: LanesModel;
15
+ loading?: boolean;
16
+ hasMore?: boolean;
17
+ nextOffset?: number;
18
+ currentLimit?: number;
19
+ };
20
+ export declare type SearchLanesResult = {
21
+ lanesModel?: LanesModel;
22
+ loading?: boolean;
23
+ };
24
+ export declare type FetchMoreLanes = (offset: number, limit: number, sort?: LaneSort) => Promise<FetchMoreLanesResult>;
25
+ export declare type SearchLanes = (search?: string, skip?: boolean) => SearchLanesResult;
26
+ export declare type UseLanesResult = UseRootLanesResult & {
27
+ searchResult?: SearchLanesResult;
28
+ };
29
+ export declare type UseRootLanesResult = {
30
+ lanesModel?: LanesModel;
31
+ loading?: boolean;
32
+ fetchMoreLanes?: FetchMoreLanes;
33
+ hasMore?: boolean;
34
+ offset?: number;
35
+ limit?: number;
36
+ };
37
+ export declare type UseLanes = (targetLanes?: LanesModel, skip?: boolean, options?: UseLanesOptions, useContext?: boolean, scope?: string) => UseLanesResult;
38
+ export declare const useSearchLanes: SearchLanes;
39
+ export declare const useLanes: UseLanes;
package/dist/use-lanes.js CHANGED
@@ -1,26 +1,60 @@
1
1
  "use strict";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
12
10
  };
13
11
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.useLanes = void 0;
12
+ exports.useLanes = exports.useSearchLanes = void 0;
13
+ const react_1 = require("react");
15
14
  const ui_foundation_ui_hooks_use_data_query_1 = require("@teambit/ui-foundation.ui.hooks.use-data-query");
16
15
  const lanes_ui_models_lanes_model_1 = require("@teambit/lanes.ui.models.lanes-model");
17
16
  const client_1 = require("@apollo/client");
17
+ const lodash_1 = require("lodash");
18
18
  const lanes_context_1 = require("./lanes-context");
19
19
  const GET_LANES = (0, client_1.gql) `
20
- query Lanes($extensionId: String) {
20
+ query Lanes(
21
+ $extensionId: String
22
+ $laneIds: [String!]
23
+ $offset: Int
24
+ $limit: Int
25
+ $sort: LaneSort
26
+ $search: String
27
+ $viewedLaneId: [String!]
28
+ $skipViewedLane: Boolean!
29
+ ) {
21
30
  lanes {
22
31
  id
23
- list {
32
+ viewedLane: list(ids: $viewedLaneId) @skip(if: $skipViewedLane) {
33
+ id {
34
+ name
35
+ scope
36
+ }
37
+ hash
38
+ createdAt
39
+ createdBy {
40
+ name
41
+ email
42
+ profileImage
43
+ }
44
+ readmeComponent {
45
+ id {
46
+ name
47
+ scope
48
+ version
49
+ }
50
+ }
51
+ laneComponentIds {
52
+ name
53
+ scope
54
+ version
55
+ }
56
+ }
57
+ list(ids: $laneIds, offset: $offset, limit: $limit, sort: $sort, search: $search) {
24
58
  id {
25
59
  name
26
60
  scope
@@ -50,6 +84,34 @@ const GET_LANES = (0, client_1.gql) `
50
84
  name
51
85
  scope
52
86
  }
87
+ createdAt
88
+ createdBy {
89
+ name
90
+ email
91
+ profileImage
92
+ }
93
+ laneComponentIds {
94
+ name
95
+ scope
96
+ version
97
+ }
98
+ }
99
+ default {
100
+ id {
101
+ name
102
+ scope
103
+ }
104
+ createdAt
105
+ createdBy {
106
+ name
107
+ email
108
+ profileImage
109
+ }
110
+ laneComponentIds {
111
+ name
112
+ scope
113
+ version
114
+ }
53
115
  }
54
116
  }
55
117
  getHost(id: $extensionId) {
@@ -57,20 +119,128 @@ const GET_LANES = (0, client_1.gql) `
57
119
  }
58
120
  }
59
121
  `;
60
- function useLanes(targetLanes, skip) {
61
- var _a;
62
- const lanesContext = (0, lanes_context_1.useLanesContext)();
63
- const shouldSkip = skip || !!targetLanes || !!(lanesContext === null || lanesContext === void 0 ? void 0 : lanesContext.lanesModel);
64
- const _b = (0, ui_foundation_ui_hooks_use_data_query_1.useDataQuery)(GET_LANES, {
65
- skip: shouldSkip,
66
- }), { data, loading } = _b, rest = __rest(_b, ["data", "loading"]);
67
- let lanesModel;
68
- if (lanesContext)
69
- lanesModel = lanesContext.lanesModel;
70
- else
71
- lanesModel = (data && lanes_ui_models_lanes_model_1.LanesModel.from({ data, host: (_a = data === null || data === void 0 ? void 0 : data.getHost) === null || _a === void 0 ? void 0 : _a.id })) || targetLanes;
72
- return Object.assign(Object.assign(Object.assign({}, rest), (lanesContext || {})), { loading,
73
- lanesModel });
74
- }
122
+ const useRootLanes = (viewedLaneId, skip, options = {}, scope) => {
123
+ const { ids, offset, limit, sort } = options;
124
+ const { data, fetchMore, loading } = (0, ui_foundation_ui_hooks_use_data_query_1.useDataQuery)(GET_LANES, {
125
+ variables: {
126
+ laneIds: ids,
127
+ offset,
128
+ limit,
129
+ sort,
130
+ skipViewedLane: !viewedLaneId || viewedLaneId.isDefault(),
131
+ viewedLaneId: viewedLaneId ? [viewedLaneId === null || viewedLaneId === void 0 ? void 0 : viewedLaneId.toString()] : undefined,
132
+ },
133
+ skip,
134
+ errorPolicy: 'all',
135
+ fetchPolicy: 'cache-and-network',
136
+ });
137
+ const lanesModel = (0, react_1.useMemo)(() => {
138
+ if (!loading && !!data) {
139
+ const newLanesModel = lanes_ui_models_lanes_model_1.LanesModel.from({ data, scope });
140
+ return newLanesModel;
141
+ }
142
+ return undefined;
143
+ }, [loading, data, viewedLaneId === null || viewedLaneId === void 0 ? void 0 : viewedLaneId.toString(), scope]);
144
+ const hasMore = (0, react_1.useMemo)(() => {
145
+ var _a, _b, _c, _d, _e, _f;
146
+ if (loading)
147
+ return true;
148
+ if (!limit)
149
+ return false;
150
+ if (ids === null || ids === void 0 ? void 0 : ids.length)
151
+ return ((_c = (_b = (_a = data === null || data === void 0 ? void 0 : data.lanes) === null || _a === void 0 ? void 0 : _a.list) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0) === ids.length;
152
+ return ((_f = (_e = (_d = data === null || data === void 0 ? void 0 : data.lanes) === null || _d === void 0 ? void 0 : _d.list) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0) >= limit;
153
+ }, [loading, data]);
154
+ const fetchMoreLanes = (0, react_1.useCallback)((newOffset, newLimit) => __awaiter(void 0, void 0, void 0, function* () {
155
+ var _a, _b;
156
+ if (hasMore) {
157
+ try {
158
+ const { data: moreData, networkStatus } = yield fetchMore({
159
+ variables: {
160
+ offset: newOffset,
161
+ limit: newLimit,
162
+ laneIds: [],
163
+ skipViewedLane: !viewedLaneId || viewedLaneId.isDefault(),
164
+ viewedLaneId: viewedLaneId ? [viewedLaneId === null || viewedLaneId === void 0 ? void 0 : viewedLaneId.toString()] : undefined,
165
+ },
166
+ });
167
+ // === NetworkStatus.fetchMore
168
+ const loadingMore = networkStatus === 3;
169
+ if (!loadingMore && moreData.lanes) {
170
+ const newLanesModel = lanes_ui_models_lanes_model_1.LanesModel.from({ data: moreData });
171
+ return {
172
+ lanesModel: newLanesModel,
173
+ loading: loadingMore,
174
+ hasMore: ((_b = (_a = moreData.lanes.list) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) >= newLimit,
175
+ nextOffset: newOffset + newLimit,
176
+ };
177
+ }
178
+ return {
179
+ lanesModel,
180
+ loading: loadingMore,
181
+ nextOffset: newOffset,
182
+ currentLimit: newLimit,
183
+ };
184
+ }
185
+ catch (err) {
186
+ // eslint-disable-next-line no-console
187
+ console.error(err);
188
+ return {};
189
+ }
190
+ }
191
+ return {
192
+ lanesModel,
193
+ loading: false,
194
+ hasMore: false,
195
+ nextOffset: newOffset,
196
+ currentLimit: newLimit,
197
+ };
198
+ }), [hasMore, viewedLaneId === null || viewedLaneId === void 0 ? void 0 : viewedLaneId.toString(), lanesModel]);
199
+ return {
200
+ loading,
201
+ lanesModel,
202
+ fetchMoreLanes,
203
+ hasMore,
204
+ offset,
205
+ limit,
206
+ };
207
+ };
208
+ const useSearchLanes = (search, skip) => {
209
+ const { data: searchData, loading: loadingSearch } = (0, ui_foundation_ui_hooks_use_data_query_1.useDataQuery)(GET_LANES, {
210
+ variables: {
211
+ search,
212
+ skipViewedLane: true,
213
+ },
214
+ skip: skip || !search,
215
+ errorPolicy: 'all',
216
+ fetchPolicy: 'cache-and-network',
217
+ });
218
+ if (!search) {
219
+ return {};
220
+ }
221
+ return {
222
+ loading: loadingSearch,
223
+ lanesModel: searchData &&
224
+ lanes_ui_models_lanes_model_1.LanesModel.from({ data: { lanes: Object.assign(Object.assign({}, searchData.lanes), { current: undefined, default: undefined }) } }),
225
+ };
226
+ };
227
+ exports.useSearchLanes = useSearchLanes;
228
+ const useLanes = (targetLanes, skip, optionsFromProps, useContextFromProps = true, scope) => {
229
+ var _a, _b;
230
+ const context = (0, lanes_context_1.useLanesContext)() || {};
231
+ const options = optionsFromProps || (context === null || context === void 0 ? void 0 : context.options);
232
+ const isSameOptions = (0, lodash_1.isEqual)(options, context === null || context === void 0 ? void 0 : context.options);
233
+ const useContext = useContextFromProps && !!context && isSameOptions;
234
+ const shouldSkip = skip || !!targetLanes || useContext;
235
+ const rootLanesData = useRootLanes((_b = (_a = context === null || context === void 0 ? void 0 : context.lanesModel) === null || _a === void 0 ? void 0 : _a.viewedLane) === null || _b === void 0 ? void 0 : _b.id, shouldSkip, options, scope);
236
+ const searchResult = (0, exports.useSearchLanes)(options === null || options === void 0 ? void 0 : options.search, shouldSkip);
237
+ if (targetLanes) {
238
+ return Object.assign(Object.assign(Object.assign({}, context), rootLanesData), { lanesModel: targetLanes, searchResult });
239
+ }
240
+ if (useContext) {
241
+ return Object.assign(Object.assign({}, context), { searchResult });
242
+ }
243
+ return Object.assign(Object.assign(Object.assign({}, context), rootLanesData), { searchResult });
244
+ };
75
245
  exports.useLanes = useLanes;
76
246
  //# sourceMappingURL=use-lanes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-lanes.js","sourceRoot":"","sources":["../use-lanes.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,0GAA8E;AAC9E,sFAA8E;AAC9E,2CAAkD;AAClD,mDAAqE;AAErE,MAAM,SAAS,GAAG,IAAA,YAAG,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCpB,CAAC;AAEF,SAAgB,QAAQ,CACtB,WAAwB,EACxB,IAAc;;IAEd,MAAM,YAAY,GAAG,IAAA,+BAAe,GAAE,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,CAAA,CAAC;IAEvE,MAAM,KAA6B,IAAA,oDAAY,EAA2C,SAAS,EAAE;QACnG,IAAI,EAAE,UAAU;KACjB,CAAC,EAFI,EAAE,IAAI,EAAE,OAAO,OAEnB,EAFwB,IAAI,cAAxB,mBAA0B,CAE9B,CAAC;IAEH,IAAI,UAAkC,CAAC;IACvC,IAAI,YAAY;QAAE,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;;QAClD,UAAU,GAAG,CAAC,IAAI,IAAI,wCAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,0CAAE,EAAE,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC;IAE9F,qDACK,IAAI,GACJ,CAAC,YAAY,IAAI,EAAE,CAAC,KACvB,OAAO;QACP,UAAU,IACV;AACJ,CAAC;AArBD,4BAqBC"}
1
+ {"version":3,"file":"use-lanes.js","sourceRoot":"","sources":["../use-lanes.tsx"],"names":[],"mappings":"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"}
package/index.ts CHANGED
@@ -1,3 +1,12 @@
1
1
  export { LanesContext, LanesContextModel, useLanesContext } from './lanes-context';
2
2
  export { LanesProvider, LanesProviderProps, IgnoreDerivingFromUrl } from './lanes-provider';
3
3
  export { useLanes } from './use-lanes';
4
+ export type {
5
+ UseLanesOptions as UseLaneOptions,
6
+ UseLanes,
7
+ UseLanesResult,
8
+ FetchMoreLanes,
9
+ FetchMoreLanesResult,
10
+ SearchLanes,
11
+ SearchLanesResult,
12
+ } from './use-lanes';
package/lanes-context.ts CHANGED
@@ -1,11 +1,17 @@
1
1
  import { LaneId } from '@teambit/lane-id';
2
2
  import { LanesModel } from '@teambit/lanes.ui.models.lanes-model';
3
3
  import { createContext, useContext } from 'react';
4
+ import { FetchMoreLanes, UseLanesOptions } from './use-lanes';
4
5
 
5
6
  export type LanesContextModel = {
6
7
  lanesModel?: LanesModel;
7
- updateLanesModel?: (updatedLanes?: LanesModel) => void;
8
8
  updateViewedLane?: (viewedLaneId?: LaneId) => void;
9
+ fetchMoreLanes?: FetchMoreLanes;
10
+ hasMore?: boolean;
11
+ loading?: boolean;
12
+ options?: UseLanesOptions;
13
+ offset?: number;
14
+ limit?: number;
9
15
  };
10
16
 
11
17
  export const LanesContext: React.Context<LanesContextModel | undefined> = createContext<LanesContextModel | undefined>(
@@ -1,5 +1,5 @@
1
- import React, { ReactNode, useState, useEffect, useCallback } from 'react';
2
- import { useLanes } from '@teambit/lanes.hooks.use-lanes';
1
+ import React, { ReactNode, useState, useEffect, useCallback, useMemo } from 'react';
2
+ import { UseLaneOptions, useLanes } from '@teambit/lanes.hooks.use-lanes';
3
3
  import { LanesModel } from '@teambit/lanes.ui.models.lanes-model';
4
4
  import { useQuery } from '@teambit/ui-foundation.ui.react-router.use-query';
5
5
  import { useLocation, Location } from '@teambit/base-react.navigation.link';
@@ -14,6 +14,8 @@ export type LanesProviderProps = {
14
14
  targetLanes?: LanesModel;
15
15
  skipNetworkCall?: boolean;
16
16
  ignoreDerivingFromUrl?: IgnoreDerivingFromUrl[];
17
+ options?: UseLaneOptions;
18
+ useScope?: () => { scope?: string };
17
19
  };
18
20
 
19
21
  export function LanesProvider({
@@ -22,11 +24,38 @@ export function LanesProvider({
22
24
  targetLanes,
23
25
  ignoreDerivingFromUrl: ignoreDerivingFromUrlFromProps,
24
26
  skipNetworkCall,
27
+ options: optionsFromProps = {},
28
+ useScope,
25
29
  }: LanesProviderProps) {
26
- const { lanesModel, loading } = useLanes(targetLanes, skipNetworkCall);
27
-
28
- const [lanesState, setLanesState] = useState<LanesModel | undefined>(lanesModel);
30
+ const [lanesState, setLanesState] = useState<LanesModel | undefined>();
29
31
  const [viewedLaneId, setViewedLaneId] = useState<LaneId | undefined>(viewedIdFromProps);
32
+ const { scope } = useScope?.() || {};
33
+
34
+ const skip = skipNetworkCall || !!targetLanes;
35
+
36
+ const options = useMemo(
37
+ () => ({
38
+ skip,
39
+ ids: optionsFromProps.ids ?? (viewedLaneId ? [viewedLaneId.toString()] : undefined),
40
+ offset: optionsFromProps.offset ?? 0,
41
+ limit: optionsFromProps.limit ?? 10,
42
+ ...optionsFromProps,
43
+ }),
44
+ [skip, optionsFromProps.ids, optionsFromProps.ids?.length, viewedLaneId?.toString()]
45
+ );
46
+
47
+ const { lanesModel, loading, hasMore, fetchMoreLanes, offset, limit } = useLanes(
48
+ targetLanes,
49
+ skipNetworkCall,
50
+ options,
51
+ undefined,
52
+ scope
53
+ );
54
+
55
+ useEffect(() => {
56
+ if (!loading && lanesModel) setLanesState(lanesModel);
57
+ }, [lanesModel, loading]);
58
+
30
59
  const updateViewedLane = useCallback(
31
60
  (lane?: LaneId) => {
32
61
  setViewedLaneId(lane);
@@ -82,8 +111,13 @@ export function LanesProvider({
82
111
 
83
112
  const lanesContextModel: LanesContextModel = {
84
113
  lanesModel: lanesState,
85
- updateLanesModel: setLanesState,
86
114
  updateViewedLane,
115
+ loading,
116
+ hasMore,
117
+ fetchMoreLanes,
118
+ options,
119
+ offset,
120
+ limit,
87
121
  };
88
122
 
89
123
  return <LanesContext.Provider value={lanesContextModel}>{children}</LanesContext.Provider>;
package/package.json CHANGED
@@ -1,23 +1,25 @@
1
1
  {
2
2
  "name": "@teambit/lanes.hooks.use-lanes",
3
- "version": "0.0.203",
3
+ "version": "0.0.204",
4
4
  "homepage": "https://bit.cloud/teambit/lanes/hooks/use-lanes",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.lanes",
8
8
  "name": "hooks/use-lanes",
9
- "version": "0.0.203"
9
+ "version": "0.0.204"
10
10
  },
11
11
  "dependencies": {
12
+ "lodash": "4.17.21",
12
13
  "core-js": "^3.0.0",
13
14
  "@teambit/base-react.navigation.link": "2.0.27",
14
- "@teambit/lane-id": "0.0.256",
15
- "@teambit/lanes.ui.models.lanes-model": "0.0.156",
15
+ "@teambit/lane-id": "0.0.257",
16
+ "@teambit/lanes.ui.models.lanes-model": "0.0.157",
16
17
  "@teambit/ui-foundation.ui.react-router.use-query": "0.0.496",
17
18
  "@teambit/ui-foundation.ui.hooks.use-data-query": "0.0.500"
18
19
  },
19
20
  "devDependencies": {
20
21
  "@types/react": "^17.0.8",
22
+ "@types/lodash": "4.14.165",
21
23
  "@types/mocha": "9.1.0",
22
24
  "@types/node": "12.20.4",
23
25
  "@types/react-dom": "^17.0.5",
package/use-lanes.tsx CHANGED
@@ -1,13 +1,50 @@
1
+ import { useMemo, useCallback } from 'react';
1
2
  import { useDataQuery } from '@teambit/ui-foundation.ui.hooks.use-data-query';
2
- import { LanesModel, LanesQuery } from '@teambit/lanes.ui.models.lanes-model';
3
- import { gql, QueryResult } from '@apollo/client';
4
- import { LanesContextModel, useLanesContext } from './lanes-context';
3
+ import { LaneModel, LanesModel, LanesQuery } from '@teambit/lanes.ui.models.lanes-model';
4
+ import { gql } from '@apollo/client';
5
+ import { LaneId } from '@teambit/lane-id';
6
+ import { isEqual } from 'lodash';
7
+ import { useLanesContext } from './lanes-context';
5
8
 
6
9
  const GET_LANES = gql`
7
- query Lanes($extensionId: String) {
10
+ query Lanes(
11
+ $extensionId: String
12
+ $laneIds: [String!]
13
+ $offset: Int
14
+ $limit: Int
15
+ $sort: LaneSort
16
+ $search: String
17
+ $viewedLaneId: [String!]
18
+ $skipViewedLane: Boolean!
19
+ ) {
8
20
  lanes {
9
21
  id
10
- list {
22
+ viewedLane: list(ids: $viewedLaneId) @skip(if: $skipViewedLane) {
23
+ id {
24
+ name
25
+ scope
26
+ }
27
+ hash
28
+ createdAt
29
+ createdBy {
30
+ name
31
+ email
32
+ profileImage
33
+ }
34
+ readmeComponent {
35
+ id {
36
+ name
37
+ scope
38
+ version
39
+ }
40
+ }
41
+ laneComponentIds {
42
+ name
43
+ scope
44
+ version
45
+ }
46
+ }
47
+ list(ids: $laneIds, offset: $offset, limit: $limit, sort: $sort, search: $search) {
11
48
  id {
12
49
  name
13
50
  scope
@@ -37,6 +74,34 @@ const GET_LANES = gql`
37
74
  name
38
75
  scope
39
76
  }
77
+ createdAt
78
+ createdBy {
79
+ name
80
+ email
81
+ profileImage
82
+ }
83
+ laneComponentIds {
84
+ name
85
+ scope
86
+ version
87
+ }
88
+ }
89
+ default {
90
+ id {
91
+ name
92
+ scope
93
+ }
94
+ createdAt
95
+ createdBy {
96
+ name
97
+ email
98
+ profileImage
99
+ }
100
+ laneComponentIds {
101
+ name
102
+ scope
103
+ version
104
+ }
40
105
  }
41
106
  }
42
107
  getHost(id: $extensionId) {
@@ -45,25 +110,202 @@ const GET_LANES = gql`
45
110
  }
46
111
  `;
47
112
 
48
- export function useLanes(
113
+ export type LaneSort = {
114
+ by?: Exclude<keyof LaneModel, 'components' | 'readmeComponent'>;
115
+ direction?: string;
116
+ };
117
+ export type UseLanesOptions = {
118
+ ids?: string[];
119
+ offset?: number;
120
+ limit?: number;
121
+ sort?: LaneSort;
122
+ search?: string;
123
+ };
124
+
125
+ export type FetchMoreLanesResult = {
126
+ lanesModel?: LanesModel;
127
+ loading?: boolean;
128
+ hasMore?: boolean;
129
+ nextOffset?: number;
130
+ currentLimit?: number;
131
+ };
132
+
133
+ export type SearchLanesResult = {
134
+ lanesModel?: LanesModel;
135
+ loading?: boolean;
136
+ };
137
+
138
+ export type FetchMoreLanes = (offset: number, limit: number, sort?: LaneSort) => Promise<FetchMoreLanesResult>;
139
+
140
+ export type SearchLanes = (search?: string, skip?: boolean) => SearchLanesResult;
141
+
142
+ export type UseLanesResult = UseRootLanesResult & {
143
+ searchResult?: SearchLanesResult;
144
+ };
145
+
146
+ export type UseRootLanesResult = {
147
+ lanesModel?: LanesModel;
148
+ loading?: boolean;
149
+ fetchMoreLanes?: FetchMoreLanes;
150
+ hasMore?: boolean;
151
+ offset?: number;
152
+ limit?: number;
153
+ };
154
+
155
+ export type UseLanes = (
49
156
  targetLanes?: LanesModel,
50
- skip?: boolean
51
- ): LanesContextModel & Omit<QueryResult<LanesQuery & { getHost: { id: string } }>, 'data'> {
52
- const lanesContext = useLanesContext();
53
- const shouldSkip = skip || !!targetLanes || !!lanesContext?.lanesModel;
157
+ skip?: boolean,
158
+ options?: UseLanesOptions,
159
+ useContext?: boolean,
160
+ scope?: string
161
+ ) => UseLanesResult;
162
+
163
+ type UseRootLanes = (
164
+ viewedLaneId?: LaneId,
165
+ skip?: boolean,
166
+ options?: UseLanesOptions,
167
+ scope?: string
168
+ ) => UseRootLanesResult;
169
+
170
+ const useRootLanes: UseRootLanes = (viewedLaneId, skip, options = {}, scope) => {
171
+ const { ids, offset, limit, sort } = options;
54
172
 
55
- const { data, loading, ...rest } = useDataQuery<LanesQuery & { getHost: { id: string } }>(GET_LANES, {
56
- skip: shouldSkip,
173
+ const { data, fetchMore, loading } = useDataQuery<LanesQuery>(GET_LANES, {
174
+ variables: {
175
+ laneIds: ids,
176
+ offset,
177
+ limit,
178
+ sort,
179
+ skipViewedLane: !viewedLaneId || viewedLaneId.isDefault(),
180
+ viewedLaneId: viewedLaneId ? [viewedLaneId?.toString()] : undefined,
181
+ },
182
+ skip,
183
+ errorPolicy: 'all',
184
+ fetchPolicy: 'cache-and-network',
57
185
  });
58
186
 
59
- let lanesModel: LanesModel | undefined;
60
- if (lanesContext) lanesModel = lanesContext.lanesModel;
61
- else lanesModel = (data && LanesModel.from({ data, host: data?.getHost?.id })) || targetLanes;
187
+ const lanesModel = useMemo(() => {
188
+ if (!loading && !!data) {
189
+ const newLanesModel = LanesModel.from({ data, scope });
190
+ return newLanesModel;
191
+ }
192
+ return undefined;
193
+ }, [loading, data, viewedLaneId?.toString(), scope]);
194
+
195
+ const hasMore = useMemo(() => {
196
+ if (loading) return true;
197
+ if (!limit) return false;
198
+ if (ids?.length) return (data?.lanes?.list?.length ?? 0) === ids.length;
199
+ return (data?.lanes?.list?.length ?? 0) >= limit;
200
+ }, [loading, data]);
201
+
202
+ const fetchMoreLanes: FetchMoreLanes = useCallback(
203
+ async (newOffset, newLimit) => {
204
+ if (hasMore) {
205
+ try {
206
+ const { data: moreData, networkStatus } = await fetchMore({
207
+ variables: {
208
+ offset: newOffset,
209
+ limit: newLimit,
210
+ laneIds: [],
211
+ skipViewedLane: !viewedLaneId || viewedLaneId.isDefault(),
212
+ viewedLaneId: viewedLaneId ? [viewedLaneId?.toString()] : undefined,
213
+ },
214
+ });
215
+ // === NetworkStatus.fetchMore
216
+ const loadingMore = networkStatus === 3;
217
+
218
+ if (!loadingMore && moreData.lanes) {
219
+ const newLanesModel = LanesModel.from({ data: moreData });
220
+ return {
221
+ lanesModel: newLanesModel,
222
+ loading: loadingMore,
223
+ hasMore: (moreData.lanes.list?.length ?? 0) >= newLimit,
224
+ nextOffset: newOffset + newLimit,
225
+ };
226
+ }
227
+ return {
228
+ lanesModel,
229
+ loading: loadingMore,
230
+ nextOffset: newOffset,
231
+ currentLimit: newLimit,
232
+ };
233
+ } catch (err) {
234
+ // eslint-disable-next-line no-console
235
+ console.error(err);
236
+ return {};
237
+ }
238
+ }
239
+ return {
240
+ lanesModel,
241
+ loading: false,
242
+ hasMore: false,
243
+ nextOffset: newOffset,
244
+ currentLimit: newLimit,
245
+ };
246
+ },
247
+ [hasMore, viewedLaneId?.toString(), lanesModel]
248
+ );
62
249
 
63
250
  return {
64
- ...rest,
65
- ...(lanesContext || {}),
66
251
  loading,
67
252
  lanesModel,
253
+ fetchMoreLanes,
254
+ hasMore,
255
+ offset,
256
+ limit,
257
+ };
258
+ };
259
+
260
+ export const useSearchLanes: SearchLanes = (search, skip) => {
261
+ const { data: searchData, loading: loadingSearch } = useDataQuery<LanesQuery>(GET_LANES, {
262
+ variables: {
263
+ search,
264
+ skipViewedLane: true,
265
+ },
266
+ skip: skip || !search,
267
+ errorPolicy: 'all',
268
+ fetchPolicy: 'cache-and-network',
269
+ });
270
+
271
+ if (!search) {
272
+ return {};
273
+ }
274
+
275
+ return {
276
+ loading: loadingSearch,
277
+ lanesModel:
278
+ searchData &&
279
+ LanesModel.from({ data: { lanes: { ...searchData.lanes, current: undefined, default: undefined } } }),
280
+ };
281
+ };
282
+
283
+ export const useLanes: UseLanes = (targetLanes, skip, optionsFromProps, useContextFromProps = true, scope) => {
284
+ const context = useLanesContext() || {};
285
+ const options = optionsFromProps || context?.options;
286
+ const isSameOptions = isEqual(options, context?.options);
287
+ const useContext = useContextFromProps && !!context && isSameOptions;
288
+ const shouldSkip = skip || !!targetLanes || useContext;
289
+ const rootLanesData = useRootLanes(context?.lanesModel?.viewedLane?.id, shouldSkip, options, scope);
290
+ const searchResult = useSearchLanes(options?.search, shouldSkip);
291
+
292
+ if (targetLanes) {
293
+ return {
294
+ ...context,
295
+ ...rootLanesData,
296
+ lanesModel: targetLanes,
297
+ searchResult,
298
+ };
299
+ }
300
+ if (useContext) {
301
+ return {
302
+ ...context,
303
+ searchResult,
304
+ };
305
+ }
306
+ return {
307
+ ...context,
308
+ ...rootLanesData,
309
+ searchResult,
68
310
  };
69
- }
311
+ };