@iblai/data-layer 1.12.107 → 1.13.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iblai/data-layer",
3
- "version": "1.12.106",
3
+ "version": "1.13.0",
4
4
  "description": "ibl.ai data layer",
5
5
  "main": "dist/index.esm.js",
6
6
  "types": "dist/index.d.ts",
@@ -6,4 +6,10 @@ export default class Config {
6
6
  static mentorIframeUrl: string;
7
7
  static studioUrl: string;
8
8
  static httpErrorHandlers: {};
9
+ /**
10
+ * Optional override for how expired auth tokens are re-minted after a 401.
11
+ * Resolve `true` once fresh tokens are in storage. Left unset, the data
12
+ * layer mints them itself from the edX session.
13
+ */
14
+ static refreshAuthToken: (() => Promise<boolean>) | undefined;
9
15
  }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Refreshes the auth tokens, collapsing concurrent callers onto one request.
3
+ * A page load that fires ten requests in parallel produces ten 401s; without
4
+ * this they would mint ten token sets and race each other into storage.
5
+ *
6
+ * Never rejects — a thrown refresh resolves `false`, which callers read as
7
+ * "give up and run the registered 401 handler" (i.e. log out).
8
+ */
9
+ export declare const refreshAuthTokenOnce: () => Promise<boolean>;
10
+ /** Test hook: drops any in-flight refresh so cases start from a clean slate. */
11
+ export declare const __resetTokenRefreshState: () => void;
@@ -1,10 +1,22 @@
1
- import type { UserProfile, GetUserMetadataArgs, ResetPasswordArgs, UpdateUserRoleRequest, UpdateUserAccountRequest, UploadProfileImageResponse, RemoveProfileImageResponse, UserPlatformMetadata, GetUserPlatformMetadataArgs, UpdateUserPlatformMetadataArgs } from './types';
1
+ import type { UserProfile, GetUserMetadataArgs, ResetPasswordArgs, UpdateUserRoleRequest, UpdateUserAccountRequest, UploadProfileImageResponse, RemoveProfileImageResponse, UserPlatformMetadata, GetUserPlatformMetadataArgs, UpdateUserPlatformMetadataArgs, UserRole, GetUserRolesArgs } from './types';
2
2
  export declare const userApiSlice: import("@reduxjs/toolkit/query").Api<import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, {
3
3
  getUserMetadata: import("@reduxjs/toolkit/query").QueryDefinition<GetUserMetadataArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserProfile, "userApiSlice", unknown>;
4
4
  updateUserMetadata: import("@reduxjs/toolkit/query").MutationDefinition<UserProfile, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, unknown, "userApiSlice", unknown>;
5
5
  updateUserAccount: import("@reduxjs/toolkit/query").MutationDefinition<UpdateUserAccountRequest, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, unknown, "userApiSlice", unknown>;
6
6
  resetPassword: import("@reduxjs/toolkit/query").MutationDefinition<ResetPasswordArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, void, "userApiSlice", unknown>;
7
7
  updateUserRole: import("@reduxjs/toolkit/query").MutationDefinition<UpdateUserRoleRequest, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, unknown, "userApiSlice", unknown>;
8
+ /**
9
+ * Every role assigned to a user, across all scopes — global, organization
10
+ * and individual course. A user with no roles returns `[]`.
11
+ *
12
+ * At least one of `username`, `email` or `userId` is required (400
13
+ * otherwise). Non-staff users can only look up their own roles; asking for
14
+ * someone else's returns 404.
15
+ *
16
+ * Defaults to the CMS/Studio host, where course-creation roles are fully
17
+ * resolvable; pass `useLms` to fall back to the deprecated LMS host.
18
+ */
19
+ getUserRoles: import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>;
8
20
  getUserMetadataEdx: import("@reduxjs/toolkit/query").QueryDefinition<GetUserMetadataArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, Partial<UserProfile>, "userApiSlice", unknown>;
9
21
  uploadProfileImage: import("@reduxjs/toolkit/query").MutationDefinition<{
10
22
  file: File | Blob;
@@ -926,6 +938,269 @@ export declare const useGetUserMetadataQuery: <R extends Record<string, any> = i
926
938
  } | undefined) => readonly [(arg: UpdateUserRoleRequest) => import("@reduxjs/toolkit/query").MutationActionCreatorResult<import("@reduxjs/toolkit/query").MutationDefinition<UpdateUserRoleRequest, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, unknown, "userApiSlice", unknown>>, import("@reduxjs/toolkit/query").TSHelpersNoInfer<R> & {
927
939
  originalArgs?: UpdateUserRoleRequest | undefined;
928
940
  reset: () => void;
941
+ }], useGetUserRolesQuery: <R extends Record<string, any> = import("@reduxjs/toolkit/query").TSHelpersId<(Omit<{
942
+ status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
943
+ originalArgs?: undefined | undefined;
944
+ data?: undefined | undefined;
945
+ error?: undefined | undefined;
946
+ requestId?: undefined | undefined;
947
+ endpointName?: string | undefined;
948
+ startedTimeStamp?: undefined | undefined;
949
+ fulfilledTimeStamp?: undefined | undefined;
950
+ } & {
951
+ currentData?: UserRole[] | undefined;
952
+ isUninitialized: false;
953
+ isLoading: false;
954
+ isFetching: false;
955
+ isSuccess: false;
956
+ isError: false;
957
+ }, "isUninitialized"> & {
958
+ isUninitialized: true;
959
+ }) | import("@reduxjs/toolkit/query").TSHelpersOverride<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
960
+ currentData?: UserRole[] | undefined;
961
+ isUninitialized: false;
962
+ isLoading: false;
963
+ isFetching: false;
964
+ isSuccess: false;
965
+ isError: false;
966
+ }, {
967
+ isLoading: true;
968
+ isFetching: boolean;
969
+ data: undefined;
970
+ } | ({
971
+ isSuccess: true;
972
+ isFetching: true;
973
+ error: undefined;
974
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
975
+ currentData?: UserRole[] | undefined;
976
+ isUninitialized: false;
977
+ isLoading: false;
978
+ isFetching: false;
979
+ isSuccess: false;
980
+ isError: false;
981
+ }, "data" | "fulfilledTimeStamp">>) | ({
982
+ isSuccess: true;
983
+ isFetching: false;
984
+ error: undefined;
985
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
986
+ currentData?: UserRole[] | undefined;
987
+ isUninitialized: false;
988
+ isLoading: false;
989
+ isFetching: false;
990
+ isSuccess: false;
991
+ isError: false;
992
+ }, "data" | "fulfilledTimeStamp" | "currentData">>) | ({
993
+ isError: true;
994
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
995
+ currentData?: UserRole[] | undefined;
996
+ isUninitialized: false;
997
+ isLoading: false;
998
+ isFetching: false;
999
+ isSuccess: false;
1000
+ isError: false;
1001
+ }, "error">>)>> & {
1002
+ status: import("@reduxjs/toolkit/query").QueryStatus;
1003
+ }>(arg: GetUserRolesArgs | typeof import("@reduxjs/toolkit/query").skipToken, options?: (import("@reduxjs/toolkit/query").SubscriptionOptions & {
1004
+ skip?: boolean;
1005
+ refetchOnMountOrArgChange?: boolean | number;
1006
+ } & {
1007
+ skip?: boolean;
1008
+ selectFromResult?: ((state: import("@reduxjs/toolkit/query").TSHelpersId<(Omit<{
1009
+ status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
1010
+ originalArgs?: undefined | undefined;
1011
+ data?: undefined | undefined;
1012
+ error?: undefined | undefined;
1013
+ requestId?: undefined | undefined;
1014
+ endpointName?: string | undefined;
1015
+ startedTimeStamp?: undefined | undefined;
1016
+ fulfilledTimeStamp?: undefined | undefined;
1017
+ } & {
1018
+ currentData?: UserRole[] | undefined;
1019
+ isUninitialized: false;
1020
+ isLoading: false;
1021
+ isFetching: false;
1022
+ isSuccess: false;
1023
+ isError: false;
1024
+ }, "isUninitialized"> & {
1025
+ isUninitialized: true;
1026
+ }) | import("@reduxjs/toolkit/query").TSHelpersOverride<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
1027
+ currentData?: UserRole[] | undefined;
1028
+ isUninitialized: false;
1029
+ isLoading: false;
1030
+ isFetching: false;
1031
+ isSuccess: false;
1032
+ isError: false;
1033
+ }, {
1034
+ isLoading: true;
1035
+ isFetching: boolean;
1036
+ data: undefined;
1037
+ } | ({
1038
+ isSuccess: true;
1039
+ isFetching: true;
1040
+ error: undefined;
1041
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
1042
+ currentData?: UserRole[] | undefined;
1043
+ isUninitialized: false;
1044
+ isLoading: false;
1045
+ isFetching: false;
1046
+ isSuccess: false;
1047
+ isError: false;
1048
+ }, "data" | "fulfilledTimeStamp">>) | ({
1049
+ isSuccess: true;
1050
+ isFetching: false;
1051
+ error: undefined;
1052
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
1053
+ currentData?: UserRole[] | undefined;
1054
+ isUninitialized: false;
1055
+ isLoading: false;
1056
+ isFetching: false;
1057
+ isSuccess: false;
1058
+ isError: false;
1059
+ }, "data" | "fulfilledTimeStamp" | "currentData">>) | ({
1060
+ isError: true;
1061
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
1062
+ currentData?: UserRole[] | undefined;
1063
+ isUninitialized: false;
1064
+ isLoading: false;
1065
+ isFetching: false;
1066
+ isSuccess: false;
1067
+ isError: false;
1068
+ }, "error">>)>> & {
1069
+ status: import("@reduxjs/toolkit/query").QueryStatus;
1070
+ }) => R) | undefined;
1071
+ }) | undefined) => [R][R extends any ? 0 : never] & {
1072
+ refetch: () => import("@reduxjs/toolkit/query").QueryActionCreatorResult<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>>;
1073
+ }, useLazyGetUserRolesQuery: <R extends Record<string, any> = import("@reduxjs/toolkit/query").TSHelpersId<(Omit<{
1074
+ status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
1075
+ originalArgs?: undefined | undefined;
1076
+ data?: undefined | undefined;
1077
+ error?: undefined | undefined;
1078
+ requestId?: undefined | undefined;
1079
+ endpointName?: string | undefined;
1080
+ startedTimeStamp?: undefined | undefined;
1081
+ fulfilledTimeStamp?: undefined | undefined;
1082
+ } & {
1083
+ currentData?: UserRole[] | undefined;
1084
+ isUninitialized: false;
1085
+ isLoading: false;
1086
+ isFetching: false;
1087
+ isSuccess: false;
1088
+ isError: false;
1089
+ }, "isUninitialized"> & {
1090
+ isUninitialized: true;
1091
+ }) | import("@reduxjs/toolkit/query").TSHelpersOverride<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
1092
+ currentData?: UserRole[] | undefined;
1093
+ isUninitialized: false;
1094
+ isLoading: false;
1095
+ isFetching: false;
1096
+ isSuccess: false;
1097
+ isError: false;
1098
+ }, {
1099
+ isLoading: true;
1100
+ isFetching: boolean;
1101
+ data: undefined;
1102
+ } | ({
1103
+ isSuccess: true;
1104
+ isFetching: true;
1105
+ error: undefined;
1106
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
1107
+ currentData?: UserRole[] | undefined;
1108
+ isUninitialized: false;
1109
+ isLoading: false;
1110
+ isFetching: false;
1111
+ isSuccess: false;
1112
+ isError: false;
1113
+ }, "data" | "fulfilledTimeStamp">>) | ({
1114
+ isSuccess: true;
1115
+ isFetching: false;
1116
+ error: undefined;
1117
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
1118
+ currentData?: UserRole[] | undefined;
1119
+ isUninitialized: false;
1120
+ isLoading: false;
1121
+ isFetching: false;
1122
+ isSuccess: false;
1123
+ isError: false;
1124
+ }, "data" | "fulfilledTimeStamp" | "currentData">>) | ({
1125
+ isError: true;
1126
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
1127
+ currentData?: UserRole[] | undefined;
1128
+ isUninitialized: false;
1129
+ isLoading: false;
1130
+ isFetching: false;
1131
+ isSuccess: false;
1132
+ isError: false;
1133
+ }, "error">>)>> & {
1134
+ status: import("@reduxjs/toolkit/query").QueryStatus;
1135
+ }>(options?: (import("@reduxjs/toolkit/query").SubscriptionOptions & Omit<{
1136
+ skip?: boolean;
1137
+ selectFromResult?: ((state: import("@reduxjs/toolkit/query").TSHelpersId<(Omit<{
1138
+ status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
1139
+ originalArgs?: undefined | undefined;
1140
+ data?: undefined | undefined;
1141
+ error?: undefined | undefined;
1142
+ requestId?: undefined | undefined;
1143
+ endpointName?: string | undefined;
1144
+ startedTimeStamp?: undefined | undefined;
1145
+ fulfilledTimeStamp?: undefined | undefined;
1146
+ } & {
1147
+ currentData?: UserRole[] | undefined;
1148
+ isUninitialized: false;
1149
+ isLoading: false;
1150
+ isFetching: false;
1151
+ isSuccess: false;
1152
+ isError: false;
1153
+ }, "isUninitialized"> & {
1154
+ isUninitialized: true;
1155
+ }) | import("@reduxjs/toolkit/query").TSHelpersOverride<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
1156
+ currentData?: UserRole[] | undefined;
1157
+ isUninitialized: false;
1158
+ isLoading: false;
1159
+ isFetching: false;
1160
+ isSuccess: false;
1161
+ isError: false;
1162
+ }, {
1163
+ isLoading: true;
1164
+ isFetching: boolean;
1165
+ data: undefined;
1166
+ } | ({
1167
+ isSuccess: true;
1168
+ isFetching: true;
1169
+ error: undefined;
1170
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
1171
+ currentData?: UserRole[] | undefined;
1172
+ isUninitialized: false;
1173
+ isLoading: false;
1174
+ isFetching: false;
1175
+ isSuccess: false;
1176
+ isError: false;
1177
+ }, "data" | "fulfilledTimeStamp">>) | ({
1178
+ isSuccess: true;
1179
+ isFetching: false;
1180
+ error: undefined;
1181
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
1182
+ currentData?: UserRole[] | undefined;
1183
+ isUninitialized: false;
1184
+ isLoading: false;
1185
+ isFetching: false;
1186
+ isSuccess: false;
1187
+ isError: false;
1188
+ }, "data" | "fulfilledTimeStamp" | "currentData">>) | ({
1189
+ isError: true;
1190
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>> & {
1191
+ currentData?: UserRole[] | undefined;
1192
+ isUninitialized: false;
1193
+ isLoading: false;
1194
+ isFetching: false;
1195
+ isSuccess: false;
1196
+ isError: false;
1197
+ }, "error">>)>> & {
1198
+ status: import("@reduxjs/toolkit/query").QueryStatus;
1199
+ }) => R) | undefined;
1200
+ }, "skip">) | undefined) => [(arg: GetUserRolesArgs, preferCacheValue?: boolean) => import("@reduxjs/toolkit/query").QueryActionCreatorResult<import("@reduxjs/toolkit/query").QueryDefinition<GetUserRolesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<import("../utils").CustomQueryArgs, unknown, import("../utils").ExtendedFetchBaseQueryError, Record<string, unknown>, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, string, UserRole[], "userApiSlice", unknown>>, [R][R extends any ? 0 : never] & {
1201
+ reset: () => void;
1202
+ }, {
1203
+ lastArg: GetUserRolesArgs;
929
1204
  }], useUploadProfileImageMutation: <R extends Record<string, any> = ({
930
1205
  requestId?: undefined;
931
1206
  status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
@@ -12,6 +12,11 @@ export declare const USERS_ENDPOINTS: {
12
12
  service: SERVICES;
13
13
  path: () => string;
14
14
  };
15
+ GET_USER_ROLES: {
16
+ service: SERVICES;
17
+ lmsService: SERVICES;
18
+ path: () => string;
19
+ };
15
20
  UPLOAD_PROFILE_IMAGE: {
16
21
  service: SERVICES;
17
22
  path: (username: string) => string;
@@ -39,6 +44,7 @@ export declare const USERS_QUERY_KEYS: {
39
44
  GET_USER_METADATA_EDX: () => string[];
40
45
  RESET_PASSWORD: () => string[];
41
46
  UPDATE_USER_ROLES: () => string[];
47
+ GET_USER_ROLES: () => string[];
42
48
  UPLOAD_PROFILE_IMAGE: () => string[];
43
49
  EDX_UPDATE_USER_METADATA: () => string[];
44
50
  EDX_GET_USER_METADATA: () => string[];
@@ -132,3 +132,47 @@ export interface UpdateUserPlatformMetadataArgs {
132
132
  tenantKey: string;
133
133
  metadata: Record<string, unknown>;
134
134
  }
135
+ /** Global (platform-wide) role keys returned by the role-listing endpoint. */
136
+ export type GlobalUserRoleKey = 'staff' | 'support-staff' | 'course-creator';
137
+ /** Course-scoped role keys. */
138
+ export type CourseUserRoleKey = 'course-staff' | 'course-instructor' | 'course-limited-staff' | 'course-finance-admin' | 'course-sales-admin' | 'course-beta-tester' | 'course-library-user' | 'course-ccx-coach' | 'course-data-researcher';
139
+ /** Organization-scoped role keys. */
140
+ export type OrgUserRoleKey = 'org-staff' | 'org-instructor' | 'org-library-user' | 'org-data-researcher' | 'org-course-creator';
141
+ /**
142
+ * Known role keys. Widened with `(string & {})` so an unrecognised role from a
143
+ * newer platform release still type-checks while editors keep autocompletion.
144
+ */
145
+ export type UserRoleKey = GlobalUserRoleKey | CourseUserRoleKey | OrgUserRoleKey | (string & {});
146
+ /**
147
+ * A single role assignment. `org` and `course` are empty strings for scopes
148
+ * that don't apply:
149
+ * - global role — both empty (e.g. `staff`)
150
+ * - organization role — `org` set, `course` empty (e.g. `org-instructor`)
151
+ * - course role — both set (e.g. `course-instructor`)
152
+ */
153
+ export interface UserRole {
154
+ role: UserRoleKey;
155
+ org: string;
156
+ course: string;
157
+ }
158
+ /** Scope a {@link UserRole} applies to, derived from its `org`/`course` fields. */
159
+ export type UserRoleScope = 'global' | 'org' | 'course';
160
+ /**
161
+ * Lookup args for the role-listing endpoint. At least one of `userId`,
162
+ * `username` or `email` must be provided — the API returns 400 otherwise.
163
+ *
164
+ * Non-staff users may only look up their own roles; requesting another user's
165
+ * roles yields 404.
166
+ */
167
+ export interface GetUserRolesArgs {
168
+ username?: string;
169
+ email?: string;
170
+ /** User ID (primary key). */
171
+ userId?: number;
172
+ /**
173
+ * Query the deprecated LMS host instead of CMS/Studio. Only needed on
174
+ * deployments without a reachable Studio host; course-creation roles are not
175
+ * fully resolvable there.
176
+ */
177
+ useLms?: boolean;
178
+ }
@@ -0,0 +1,12 @@
1
+ import type { UserRole, UserRoleScope } from './types';
2
+ /**
3
+ * Scope a role row applies to, read off its `org`/`course` fields:
4
+ * both empty → global, `org` only → org, both set → course.
5
+ */
6
+ export declare const getUserRoleScope: (role: UserRole) => UserRoleScope;
7
+ /** Roles that apply platform-wide (e.g. `staff`). */
8
+ export declare const filterGlobalUserRoles: (roles: UserRole[]) => UserRole[];
9
+ /** Roles scoped to an organization, optionally narrowed to one org short name. */
10
+ export declare const filterOrgUserRoles: (roles: UserRole[], org?: string) => UserRole[];
11
+ /** Roles scoped to a course run, optionally narrowed to one course ID. */
12
+ export declare const filterCourseUserRoles: (roles: UserRole[], course?: string) => UserRole[];
@@ -15,6 +15,7 @@ export * from './features/training-documents/api-slice';
15
15
  export * from './features/platform/api-slice';
16
16
  export * from './features/user/api-slice';
17
17
  export * from './features/user/types';
18
+ export * from './features/user/utils';
18
19
  export * from './features/user/api-slice';
19
20
  export * from './features/core/api-slice';
20
21
  export * from './features/core/constants';
@@ -3,4 +3,4 @@ export declare const initializeDataLayer: (dmUrl: string, lmsUrl: string, legacy
3
3
  status: number;
4
4
  data?: unknown;
5
5
  message?: string;
6
- }) => void>, studioUrl?: string) => void;
6
+ }) => void>, studioUrl?: string, refreshAuthToken?: () => Promise<boolean>) => void;