@sendbird/uikit-chat-hooks 1.1.2 → 1.1.3
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/lib/commonjs/common/useUserList.js +14 -4
- package/lib/commonjs/common/useUserList.js.map +1 -1
- package/lib/module/common/useUserList.js +14 -6
- package/lib/module/common/useUserList.js.map +1 -1
- package/lib/typescript/src/common/useUserList.d.ts +1 -1
- package/package.json +3 -3
- package/src/common/useUserList.ts +14 -3
|
@@ -10,7 +10,8 @@ var _react = require("react");
|
|
|
10
10
|
var _uikitUtils = require("@sendbird/uikit-utils");
|
|
11
11
|
|
|
12
12
|
const createUserQuery = (sdk, queryCreator) => {
|
|
13
|
-
if (queryCreator) return queryCreator();
|
|
13
|
+
if (queryCreator) return queryCreator(); // In order to use the API, the option must be turned on in the dashboard.
|
|
14
|
+
|
|
14
15
|
return sdk.createApplicationUserListQuery();
|
|
15
16
|
};
|
|
16
17
|
/**
|
|
@@ -59,7 +60,12 @@ const useUserList = (sdk, options) => {
|
|
|
59
60
|
if ((_query$current = query.current) !== null && _query$current !== void 0 && _query$current.hasNext) {
|
|
60
61
|
var _query$current2;
|
|
61
62
|
|
|
62
|
-
const users = await ((_query$current2 = query.current) === null || _query$current2 === void 0 ? void 0 : _query$current2.next()
|
|
63
|
+
const users = await ((_query$current2 = query.current) === null || _query$current2 === void 0 ? void 0 : _query$current2.next().catch(err => {
|
|
64
|
+
_uikitUtils.Logger.error(error);
|
|
65
|
+
|
|
66
|
+
if (err.code === _uikitUtils.SBErrorCode.NON_AUTHORIZED) _uikitUtils.Logger.warn(_uikitUtils.SBErrorMessage.ACL);
|
|
67
|
+
throw error;
|
|
68
|
+
}));
|
|
63
69
|
updateUsers(users, true);
|
|
64
70
|
}
|
|
65
71
|
}, [sdk, options === null || options === void 0 ? void 0 : options.queryCreator]);
|
|
@@ -91,9 +97,13 @@ const useUserList = (sdk, options) => {
|
|
|
91
97
|
var _query$current3;
|
|
92
98
|
|
|
93
99
|
if (query.current && (_query$current3 = query.current) !== null && _query$current3 !== void 0 && _query$current3.hasNext) {
|
|
94
|
-
|
|
100
|
+
const nextUsers = await query.current.next().catch(err => {
|
|
101
|
+
_uikitUtils.Logger.error(error);
|
|
95
102
|
|
|
96
|
-
|
|
103
|
+
if (err.code === _uikitUtils.SBErrorCode.NON_AUTHORIZED) _uikitUtils.Logger.warn(_uikitUtils.SBErrorMessage.ACL);
|
|
104
|
+
throw error;
|
|
105
|
+
});
|
|
106
|
+
updateUsers(nextUsers, false);
|
|
97
107
|
}
|
|
98
108
|
}, []);
|
|
99
109
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createUserQuery","sdk","queryCreator","createApplicationUserListQuery","useUserList","options","query","useRef","error","setError","useState","loading","setLoading","refreshing","setRefreshing","users","setUsers","sortedUsers","useMemo","sortComparator","sort","updateUsers","clearPrev","prev","concat","init","useCallback","current","hasNext","next","useAsyncEffect","e","refresh"],"sources":["useUserList.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Optional, SendbirdChatSDK, SendbirdUser, useAsyncEffect } from '@sendbird/uikit-utils';\n\nimport type { CustomQueryInterface, UseUserListOptions, UseUserListReturn } from '../types';\n\nconst createUserQuery = <User>(sdk: SendbirdChatSDK, queryCreator?: UseUserListOptions<User>['queryCreator']) => {\n if (queryCreator) return queryCreator();\n return sdk.createApplicationUserListQuery() as unknown as CustomQueryInterface<User>;\n};\n\n/**\n * Get user list from query.\n * default query uses 'instance.createApplicationUserListQuery'\n * The response type of hook is depends on return type of 'query.next()'\n *\n * You can call hook with your custom query using {@link CustomQuery}\n * Or you can create your 'CustomQueryClass' implemented {@link CustomQueryInterface}'\n *\n * ```example\n * const { users } = useUserList(sdk, {\n * queryCreator: () => {\n * const friendQuery = sdk.createFriendListQuery();\n * return new CustomQuery({\n * next: () => friendQuery.next(),\n * isLoading: () => friendQuery.isLoading,\n * hasNext: () => friendQuery.hasMore,\n * });\n * }\n * })\n * ```\n * */\nexport const useUserList = <\n Options extends UseUserListOptions<QueriedUser>,\n QueriedUser = Options['queryCreator'] extends Optional<() => CustomQueryInterface<infer User>> ? User : SendbirdUser,\n>(\n sdk: SendbirdChatSDK,\n options?: Options,\n): UseUserListReturn<QueriedUser> => {\n const query = useRef<CustomQueryInterface<QueriedUser>>();\n\n const [error, setError] = useState<unknown>(null);\n const [loading, setLoading] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n\n const [users, setUsers] = useState<QueriedUser[]>([]);\n const sortedUsers = useMemo((): QueriedUser[] => {\n if (options?.sortComparator) return users.sort(options.sortComparator);\n return users;\n }, [users, options?.sortComparator]);\n\n const updateUsers = (users: QueriedUser[], clearPrev: boolean) => {\n if (clearPrev) setUsers(users);\n else setUsers((prev) => prev.concat(users));\n };\n\n const init = useCallback(async () => {\n query.current = createUserQuery<QueriedUser>(sdk, options?.queryCreator);\n if (query.current?.hasNext) {\n const users = await query.current?.next();\n updateUsers(users, true);\n }\n }, [sdk, options?.queryCreator]);\n\n useAsyncEffect(async () => {\n setLoading(true);\n setError(null);\n try {\n await init();\n } catch (e) {\n setError(e);\n } finally {\n setLoading(false);\n }\n }, [init]);\n\n const refresh = useCallback(async () => {\n setRefreshing(true);\n setError(null);\n try {\n await init();\n } catch (e) {\n setError(e);\n } finally {\n setRefreshing(false);\n }\n }, [init]);\n\n const next = useCallback(async () => {\n if (query.current && query.current?.hasNext) {\n
|
|
1
|
+
{"version":3,"names":["createUserQuery","sdk","queryCreator","createApplicationUserListQuery","useUserList","options","query","useRef","error","setError","useState","loading","setLoading","refreshing","setRefreshing","users","setUsers","sortedUsers","useMemo","sortComparator","sort","updateUsers","clearPrev","prev","concat","init","useCallback","current","hasNext","next","catch","err","Logger","code","SBErrorCode","NON_AUTHORIZED","warn","SBErrorMessage","ACL","useAsyncEffect","e","refresh","nextUsers"],"sources":["useUserList.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\n\nimport type { Optional, SendbirdChatSDK, SendbirdUser } from '@sendbird/uikit-utils';\nimport { Logger, SBErrorCode, SBErrorMessage, useAsyncEffect } from '@sendbird/uikit-utils';\n\nimport type { CustomQueryInterface, UseUserListOptions, UseUserListReturn } from '../types';\n\nconst createUserQuery = <User>(sdk: SendbirdChatSDK, queryCreator?: UseUserListOptions<User>['queryCreator']) => {\n if (queryCreator) return queryCreator();\n // In order to use the API, the option must be turned on in the dashboard.\n return sdk.createApplicationUserListQuery() as unknown as CustomQueryInterface<User>;\n};\n\n/**\n * Get user list from query.\n * default query uses 'instance.createApplicationUserListQuery'\n * The response type of hook is depends on return type of 'query.next()'\n *\n * You can call hook with your custom query using {@link CustomQuery}\n * Or you can create your 'CustomQueryClass' implemented {@link CustomQueryInterface}'\n *\n * ```example\n * const { users } = useUserList(sdk, {\n * queryCreator: () => {\n * const friendQuery = sdk.createFriendListQuery();\n * return new CustomQuery({\n * next: () => friendQuery.next(),\n * isLoading: () => friendQuery.isLoading,\n * hasNext: () => friendQuery.hasMore,\n * });\n * }\n * })\n * ```\n * */\nexport const useUserList = <\n Options extends UseUserListOptions<QueriedUser>,\n QueriedUser = Options['queryCreator'] extends Optional<() => CustomQueryInterface<infer User>> ? User : SendbirdUser,\n>(\n sdk: SendbirdChatSDK,\n options?: Options,\n): UseUserListReturn<QueriedUser> => {\n const query = useRef<CustomQueryInterface<QueriedUser>>();\n\n const [error, setError] = useState<unknown>(null);\n const [loading, setLoading] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n\n const [users, setUsers] = useState<QueriedUser[]>([]);\n const sortedUsers = useMemo((): QueriedUser[] => {\n if (options?.sortComparator) return users.sort(options.sortComparator);\n return users;\n }, [users, options?.sortComparator]);\n\n const updateUsers = (users: QueriedUser[], clearPrev: boolean) => {\n if (clearPrev) setUsers(users);\n else setUsers((prev) => prev.concat(users));\n };\n\n const init = useCallback(async () => {\n query.current = createUserQuery<QueriedUser>(sdk, options?.queryCreator);\n if (query.current?.hasNext) {\n const users = await query.current?.next().catch((err) => {\n Logger.error(error);\n if (err.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);\n throw error;\n });\n updateUsers(users, true);\n }\n }, [sdk, options?.queryCreator]);\n\n useAsyncEffect(async () => {\n setLoading(true);\n setError(null);\n try {\n await init();\n } catch (e) {\n setError(e);\n } finally {\n setLoading(false);\n }\n }, [init]);\n\n const refresh = useCallback(async () => {\n setRefreshing(true);\n setError(null);\n try {\n await init();\n } catch (e) {\n setError(e);\n } finally {\n setRefreshing(false);\n }\n }, [init]);\n\n const next = useCallback(async () => {\n if (query.current && query.current?.hasNext) {\n const nextUsers = await query.current.next().catch((err) => {\n Logger.error(error);\n if (err.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);\n throw error;\n });\n updateUsers(nextUsers, false);\n }\n }, []);\n\n return {\n loading,\n error,\n users: sortedUsers,\n next,\n refreshing,\n refresh,\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { useCallback, useMemo, useRef, useState } from 'react';
|
|
2
|
-
import { useAsyncEffect } from '@sendbird/uikit-utils';
|
|
2
|
+
import { Logger, SBErrorCode, SBErrorMessage, useAsyncEffect } from '@sendbird/uikit-utils';
|
|
3
3
|
|
|
4
4
|
const createUserQuery = (sdk, queryCreator) => {
|
|
5
|
-
if (queryCreator) return queryCreator();
|
|
5
|
+
if (queryCreator) return queryCreator(); // In order to use the API, the option must be turned on in the dashboard.
|
|
6
|
+
|
|
6
7
|
return sdk.createApplicationUserListQuery();
|
|
7
8
|
};
|
|
8
9
|
/**
|
|
@@ -51,7 +52,11 @@ export const useUserList = (sdk, options) => {
|
|
|
51
52
|
if ((_query$current = query.current) !== null && _query$current !== void 0 && _query$current.hasNext) {
|
|
52
53
|
var _query$current2;
|
|
53
54
|
|
|
54
|
-
const users = await ((_query$current2 = query.current) === null || _query$current2 === void 0 ? void 0 : _query$current2.next()
|
|
55
|
+
const users = await ((_query$current2 = query.current) === null || _query$current2 === void 0 ? void 0 : _query$current2.next().catch(err => {
|
|
56
|
+
Logger.error(error);
|
|
57
|
+
if (err.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);
|
|
58
|
+
throw error;
|
|
59
|
+
}));
|
|
55
60
|
updateUsers(users, true);
|
|
56
61
|
}
|
|
57
62
|
}, [sdk, options === null || options === void 0 ? void 0 : options.queryCreator]);
|
|
@@ -83,9 +88,12 @@ export const useUserList = (sdk, options) => {
|
|
|
83
88
|
var _query$current3;
|
|
84
89
|
|
|
85
90
|
if (query.current && (_query$current3 = query.current) !== null && _query$current3 !== void 0 && _query$current3.hasNext) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
91
|
+
const nextUsers = await query.current.next().catch(err => {
|
|
92
|
+
Logger.error(error);
|
|
93
|
+
if (err.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);
|
|
94
|
+
throw error;
|
|
95
|
+
});
|
|
96
|
+
updateUsers(nextUsers, false);
|
|
89
97
|
}
|
|
90
98
|
}, []);
|
|
91
99
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useMemo","useRef","useState","useAsyncEffect","createUserQuery","sdk","queryCreator","createApplicationUserListQuery","useUserList","options","query","error","setError","loading","setLoading","refreshing","setRefreshing","users","setUsers","sortedUsers","sortComparator","sort","updateUsers","clearPrev","prev","concat","init","current","hasNext","next","e","refresh"],"sources":["useUserList.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Optional, SendbirdChatSDK, SendbirdUser, useAsyncEffect } from '@sendbird/uikit-utils';\n\nimport type { CustomQueryInterface, UseUserListOptions, UseUserListReturn } from '../types';\n\nconst createUserQuery = <User>(sdk: SendbirdChatSDK, queryCreator?: UseUserListOptions<User>['queryCreator']) => {\n if (queryCreator) return queryCreator();\n return sdk.createApplicationUserListQuery() as unknown as CustomQueryInterface<User>;\n};\n\n/**\n * Get user list from query.\n * default query uses 'instance.createApplicationUserListQuery'\n * The response type of hook is depends on return type of 'query.next()'\n *\n * You can call hook with your custom query using {@link CustomQuery}\n * Or you can create your 'CustomQueryClass' implemented {@link CustomQueryInterface}'\n *\n * ```example\n * const { users } = useUserList(sdk, {\n * queryCreator: () => {\n * const friendQuery = sdk.createFriendListQuery();\n * return new CustomQuery({\n * next: () => friendQuery.next(),\n * isLoading: () => friendQuery.isLoading,\n * hasNext: () => friendQuery.hasMore,\n * });\n * }\n * })\n * ```\n * */\nexport const useUserList = <\n Options extends UseUserListOptions<QueriedUser>,\n QueriedUser = Options['queryCreator'] extends Optional<() => CustomQueryInterface<infer User>> ? User : SendbirdUser,\n>(\n sdk: SendbirdChatSDK,\n options?: Options,\n): UseUserListReturn<QueriedUser> => {\n const query = useRef<CustomQueryInterface<QueriedUser>>();\n\n const [error, setError] = useState<unknown>(null);\n const [loading, setLoading] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n\n const [users, setUsers] = useState<QueriedUser[]>([]);\n const sortedUsers = useMemo((): QueriedUser[] => {\n if (options?.sortComparator) return users.sort(options.sortComparator);\n return users;\n }, [users, options?.sortComparator]);\n\n const updateUsers = (users: QueriedUser[], clearPrev: boolean) => {\n if (clearPrev) setUsers(users);\n else setUsers((prev) => prev.concat(users));\n };\n\n const init = useCallback(async () => {\n query.current = createUserQuery<QueriedUser>(sdk, options?.queryCreator);\n if (query.current?.hasNext) {\n const users = await query.current?.next();\n updateUsers(users, true);\n }\n }, [sdk, options?.queryCreator]);\n\n useAsyncEffect(async () => {\n setLoading(true);\n setError(null);\n try {\n await init();\n } catch (e) {\n setError(e);\n } finally {\n setLoading(false);\n }\n }, [init]);\n\n const refresh = useCallback(async () => {\n setRefreshing(true);\n setError(null);\n try {\n await init();\n } catch (e) {\n setError(e);\n } finally {\n setRefreshing(false);\n }\n }, [init]);\n\n const next = useCallback(async () => {\n if (query.current && query.current?.hasNext) {\n
|
|
1
|
+
{"version":3,"names":["useCallback","useMemo","useRef","useState","Logger","SBErrorCode","SBErrorMessage","useAsyncEffect","createUserQuery","sdk","queryCreator","createApplicationUserListQuery","useUserList","options","query","error","setError","loading","setLoading","refreshing","setRefreshing","users","setUsers","sortedUsers","sortComparator","sort","updateUsers","clearPrev","prev","concat","init","current","hasNext","next","catch","err","code","NON_AUTHORIZED","warn","ACL","e","refresh","nextUsers"],"sources":["useUserList.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\n\nimport type { Optional, SendbirdChatSDK, SendbirdUser } from '@sendbird/uikit-utils';\nimport { Logger, SBErrorCode, SBErrorMessage, useAsyncEffect } from '@sendbird/uikit-utils';\n\nimport type { CustomQueryInterface, UseUserListOptions, UseUserListReturn } from '../types';\n\nconst createUserQuery = <User>(sdk: SendbirdChatSDK, queryCreator?: UseUserListOptions<User>['queryCreator']) => {\n if (queryCreator) return queryCreator();\n // In order to use the API, the option must be turned on in the dashboard.\n return sdk.createApplicationUserListQuery() as unknown as CustomQueryInterface<User>;\n};\n\n/**\n * Get user list from query.\n * default query uses 'instance.createApplicationUserListQuery'\n * The response type of hook is depends on return type of 'query.next()'\n *\n * You can call hook with your custom query using {@link CustomQuery}\n * Or you can create your 'CustomQueryClass' implemented {@link CustomQueryInterface}'\n *\n * ```example\n * const { users } = useUserList(sdk, {\n * queryCreator: () => {\n * const friendQuery = sdk.createFriendListQuery();\n * return new CustomQuery({\n * next: () => friendQuery.next(),\n * isLoading: () => friendQuery.isLoading,\n * hasNext: () => friendQuery.hasMore,\n * });\n * }\n * })\n * ```\n * */\nexport const useUserList = <\n Options extends UseUserListOptions<QueriedUser>,\n QueriedUser = Options['queryCreator'] extends Optional<() => CustomQueryInterface<infer User>> ? User : SendbirdUser,\n>(\n sdk: SendbirdChatSDK,\n options?: Options,\n): UseUserListReturn<QueriedUser> => {\n const query = useRef<CustomQueryInterface<QueriedUser>>();\n\n const [error, setError] = useState<unknown>(null);\n const [loading, setLoading] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n\n const [users, setUsers] = useState<QueriedUser[]>([]);\n const sortedUsers = useMemo((): QueriedUser[] => {\n if (options?.sortComparator) return users.sort(options.sortComparator);\n return users;\n }, [users, options?.sortComparator]);\n\n const updateUsers = (users: QueriedUser[], clearPrev: boolean) => {\n if (clearPrev) setUsers(users);\n else setUsers((prev) => prev.concat(users));\n };\n\n const init = useCallback(async () => {\n query.current = createUserQuery<QueriedUser>(sdk, options?.queryCreator);\n if (query.current?.hasNext) {\n const users = await query.current?.next().catch((err) => {\n Logger.error(error);\n if (err.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);\n throw error;\n });\n updateUsers(users, true);\n }\n }, [sdk, options?.queryCreator]);\n\n useAsyncEffect(async () => {\n setLoading(true);\n setError(null);\n try {\n await init();\n } catch (e) {\n setError(e);\n } finally {\n setLoading(false);\n }\n }, [init]);\n\n const refresh = useCallback(async () => {\n setRefreshing(true);\n setError(null);\n try {\n await init();\n } catch (e) {\n setError(e);\n } finally {\n setRefreshing(false);\n }\n }, [init]);\n\n const next = useCallback(async () => {\n if (query.current && query.current?.hasNext) {\n const nextUsers = await query.current.next().catch((err) => {\n Logger.error(error);\n if (err.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);\n throw error;\n });\n updateUsers(nextUsers, false);\n }\n }, []);\n\n return {\n loading,\n error,\n users: sortedUsers,\n next,\n refreshing,\n refresh,\n };\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sendbird/uikit-chat-hooks",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "React hooks that built with SendbirdChat SDK",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"access": "public"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@sendbird/uikit-utils": "1.1.
|
|
41
|
+
"@sendbird/uikit-utils": "1.1.3"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/react": "*",
|
|
@@ -69,5 +69,5 @@
|
|
|
69
69
|
"readmeFile": "./README.md",
|
|
70
70
|
"displayName": "@sendbird/uikit-chat-hooks"
|
|
71
71
|
},
|
|
72
|
-
"gitHead": "
|
|
72
|
+
"gitHead": "99c133a8bbee3d806bf72ffc040acdd5c883d1d7"
|
|
73
73
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { useCallback, useMemo, useRef, useState } from 'react';
|
|
2
2
|
|
|
3
|
-
import { Optional, SendbirdChatSDK, SendbirdUser
|
|
3
|
+
import type { Optional, SendbirdChatSDK, SendbirdUser } from '@sendbird/uikit-utils';
|
|
4
|
+
import { Logger, SBErrorCode, SBErrorMessage, useAsyncEffect } from '@sendbird/uikit-utils';
|
|
4
5
|
|
|
5
6
|
import type { CustomQueryInterface, UseUserListOptions, UseUserListReturn } from '../types';
|
|
6
7
|
|
|
7
8
|
const createUserQuery = <User>(sdk: SendbirdChatSDK, queryCreator?: UseUserListOptions<User>['queryCreator']) => {
|
|
8
9
|
if (queryCreator) return queryCreator();
|
|
10
|
+
// In order to use the API, the option must be turned on in the dashboard.
|
|
9
11
|
return sdk.createApplicationUserListQuery() as unknown as CustomQueryInterface<User>;
|
|
10
12
|
};
|
|
11
13
|
|
|
@@ -57,7 +59,11 @@ export const useUserList = <
|
|
|
57
59
|
const init = useCallback(async () => {
|
|
58
60
|
query.current = createUserQuery<QueriedUser>(sdk, options?.queryCreator);
|
|
59
61
|
if (query.current?.hasNext) {
|
|
60
|
-
const users = await query.current?.next()
|
|
62
|
+
const users = await query.current?.next().catch((err) => {
|
|
63
|
+
Logger.error(error);
|
|
64
|
+
if (err.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);
|
|
65
|
+
throw error;
|
|
66
|
+
});
|
|
61
67
|
updateUsers(users, true);
|
|
62
68
|
}
|
|
63
69
|
}, [sdk, options?.queryCreator]);
|
|
@@ -88,7 +94,12 @@ export const useUserList = <
|
|
|
88
94
|
|
|
89
95
|
const next = useCallback(async () => {
|
|
90
96
|
if (query.current && query.current?.hasNext) {
|
|
91
|
-
|
|
97
|
+
const nextUsers = await query.current.next().catch((err) => {
|
|
98
|
+
Logger.error(error);
|
|
99
|
+
if (err.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);
|
|
100
|
+
throw error;
|
|
101
|
+
});
|
|
102
|
+
updateUsers(nextUsers, false);
|
|
92
103
|
}
|
|
93
104
|
}, []);
|
|
94
105
|
|