@crimson-education/sdk 0.3.1 → 0.3.4
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/core/auth/oauth-adapter.js +2 -0
- package/dist/core/auth/types.d.ts +2 -0
- package/dist/core/client.d.ts +21 -0
- package/dist/core/client.js +36 -0
- package/dist/core/missionLibrary.d.ts +21 -0
- package/dist/core/missionLibrary.js +35 -0
- package/dist/core/types.d.ts +12 -0
- package/dist/react/hooks/index.d.ts +1 -1
- package/dist/react/hooks/index.js +4 -1
- package/dist/react/hooks/useMissionLibrary.d.ts +8 -0
- package/dist/react/hooks/useMissionLibrary.js +55 -0
- package/dist/react/provider.d.ts +13 -1
- package/dist/react/provider.js +4 -2
- package/package.json +1 -1
|
@@ -291,6 +291,7 @@ class OAuthAdapter {
|
|
|
291
291
|
parseTokenResponse(data) {
|
|
292
292
|
var _a, _b;
|
|
293
293
|
const accessToken = data.access_token;
|
|
294
|
+
const idToken = data.id_token;
|
|
294
295
|
const expiresIn = (_a = data.expires_in) !== null && _a !== void 0 ? _a : 3600;
|
|
295
296
|
const refreshToken = data.refresh_token;
|
|
296
297
|
const scope = data.scope;
|
|
@@ -303,6 +304,7 @@ class OAuthAdapter {
|
|
|
303
304
|
}
|
|
304
305
|
return {
|
|
305
306
|
accessToken,
|
|
307
|
+
idToken,
|
|
306
308
|
refreshToken,
|
|
307
309
|
expiresAt: Date.now() + expiresIn * 1000,
|
|
308
310
|
scope: scope === null || scope === void 0 ? void 0 : scope.split(" "),
|
|
@@ -40,6 +40,8 @@ export interface OAuthConfig {
|
|
|
40
40
|
export interface OAuthTokens {
|
|
41
41
|
/** Access token */
|
|
42
42
|
accessToken: string;
|
|
43
|
+
/** ID token (if openid scope was requested) */
|
|
44
|
+
idToken?: string;
|
|
43
45
|
/** Refresh token (if granted) */
|
|
44
46
|
refreshToken?: string;
|
|
45
47
|
/** Token type (always Bearer) */
|
package/dist/core/client.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export declare class CrimsonClient {
|
|
|
16
16
|
private clientId;
|
|
17
17
|
private clientVersion;
|
|
18
18
|
private clientPlatform;
|
|
19
|
+
private appName;
|
|
20
|
+
private appTenant;
|
|
19
21
|
private oauthAdapter?;
|
|
20
22
|
constructor(config: CrimsonClientConfig);
|
|
21
23
|
/**
|
|
@@ -66,6 +68,25 @@ export declare class CrimsonClient {
|
|
|
66
68
|
* Check if user is authenticated
|
|
67
69
|
*/
|
|
68
70
|
isAuthenticated(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Get the current app name
|
|
73
|
+
*/
|
|
74
|
+
getAppName(): string;
|
|
75
|
+
/**
|
|
76
|
+
* Set the app name for multi-tenant identity resolution
|
|
77
|
+
* @param name - Application name (e.g., 'indigo')
|
|
78
|
+
*/
|
|
79
|
+
setAppName(name: string): void;
|
|
80
|
+
/**
|
|
81
|
+
* Get the current app tenant
|
|
82
|
+
*/
|
|
83
|
+
getAppTenant(): string;
|
|
84
|
+
/**
|
|
85
|
+
* Set the target tenant for multi-tenant identity resolution.
|
|
86
|
+
* Use this when switching between tenant tabs in the UI.
|
|
87
|
+
* @param tenant - Tenant name (e.g., 'crimsonapp', 'collegewise', 'indigo')
|
|
88
|
+
*/
|
|
89
|
+
setAppTenant(tenant: string): void;
|
|
69
90
|
fetch<T>(path: string, options?: RequestInit): Promise<T>;
|
|
70
91
|
/**
|
|
71
92
|
* Get the current authentication token
|
package/dist/core/client.js
CHANGED
|
@@ -58,6 +58,8 @@ class CrimsonClient {
|
|
|
58
58
|
this.clientId = config.clientId || "unknown";
|
|
59
59
|
this.clientVersion = config.clientVersion || SDK_VERSION;
|
|
60
60
|
this.clientPlatform = detectPlatform();
|
|
61
|
+
this.appName = config.appName || "";
|
|
62
|
+
this.appTenant = config.appTenant || "";
|
|
61
63
|
// Warn if clientId is not set
|
|
62
64
|
if (!config.clientId) {
|
|
63
65
|
console.warn("[CrimsonSDK] clientId not set. Consider setting it for better API tracking.");
|
|
@@ -161,6 +163,33 @@ class CrimsonClient {
|
|
|
161
163
|
// For token mode, assume authenticated (token provider handles this)
|
|
162
164
|
return true;
|
|
163
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Get the current app name
|
|
168
|
+
*/
|
|
169
|
+
getAppName() {
|
|
170
|
+
return this.appName;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Set the app name for multi-tenant identity resolution
|
|
174
|
+
* @param name - Application name (e.g., 'indigo')
|
|
175
|
+
*/
|
|
176
|
+
setAppName(name) {
|
|
177
|
+
this.appName = name;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get the current app tenant
|
|
181
|
+
*/
|
|
182
|
+
getAppTenant() {
|
|
183
|
+
return this.appTenant;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Set the target tenant for multi-tenant identity resolution.
|
|
187
|
+
* Use this when switching between tenant tabs in the UI.
|
|
188
|
+
* @param tenant - Tenant name (e.g., 'crimsonapp', 'collegewise', 'indigo')
|
|
189
|
+
*/
|
|
190
|
+
setAppTenant(tenant) {
|
|
191
|
+
this.appTenant = tenant;
|
|
192
|
+
}
|
|
164
193
|
fetch(path_1) {
|
|
165
194
|
return __awaiter(this, arguments, void 0, function* (path, options = {}) {
|
|
166
195
|
const token = yield this.getToken();
|
|
@@ -171,6 +200,13 @@ class CrimsonClient {
|
|
|
171
200
|
const headers = Object.assign({ "Content-Type": "application/json", Authorization: `${scheme} ${token}`,
|
|
172
201
|
// Client identification headers for API tracking
|
|
173
202
|
"X-Client-ID": this.clientId, "X-Client-Version": this.clientVersion, "X-Client-Platform": this.clientPlatform }, options.headers);
|
|
203
|
+
// Add app identity headers for multi-tenant resolution (required for Indigo API)
|
|
204
|
+
if (this.appName) {
|
|
205
|
+
headers["X-App-Name"] = this.appName;
|
|
206
|
+
}
|
|
207
|
+
if (this.appTenant) {
|
|
208
|
+
headers["X-App-Tenant"] = this.appTenant;
|
|
209
|
+
}
|
|
174
210
|
const url = `${this.baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
|
|
175
211
|
const response = yield fetch(url, Object.assign(Object.assign({}, options), { headers }));
|
|
176
212
|
if (!response.ok) {
|
|
@@ -50,6 +50,15 @@ export interface TemplateMissionCreateInput {
|
|
|
50
50
|
content: string;
|
|
51
51
|
}[];
|
|
52
52
|
}
|
|
53
|
+
export interface AddTemplateMissionToRoadmapInput {
|
|
54
|
+
templateMissionId: string;
|
|
55
|
+
userId: string;
|
|
56
|
+
startAt?: string | null;
|
|
57
|
+
dueDate?: string | null;
|
|
58
|
+
status?: string;
|
|
59
|
+
taskIds?: string[];
|
|
60
|
+
ignoreLink?: boolean;
|
|
61
|
+
}
|
|
53
62
|
export declare class MissionLibraryApi {
|
|
54
63
|
private client;
|
|
55
64
|
constructor(client: CrimsonClient);
|
|
@@ -57,6 +66,10 @@ export declare class MissionLibraryApi {
|
|
|
57
66
|
* List template missions with pagination
|
|
58
67
|
*/
|
|
59
68
|
listTemplateMissions(filters?: TemplateMissionFilters): Promise<PaginatedResult<TemplateMission>>;
|
|
69
|
+
/**
|
|
70
|
+
* List custom template missions with pagination
|
|
71
|
+
*/
|
|
72
|
+
listCustomTemplateMissions(filters?: TemplateMissionFilters): Promise<PaginatedResult<TemplateMission>>;
|
|
60
73
|
/**
|
|
61
74
|
* Create a new template mission
|
|
62
75
|
*/
|
|
@@ -82,6 +95,14 @@ export declare class MissionLibraryApi {
|
|
|
82
95
|
* Copy a template mission to a user's roadmap
|
|
83
96
|
*/
|
|
84
97
|
copyTemplateMission(input: CopyTemplateMissionInput): Promise<TemplateMission[]>;
|
|
98
|
+
/**
|
|
99
|
+
* Add a template mission to a user's roadmap (create or update)
|
|
100
|
+
*/
|
|
101
|
+
addToRoadmap(input: AddTemplateMissionToRoadmapInput): Promise<{
|
|
102
|
+
missionId: string;
|
|
103
|
+
isNew: boolean;
|
|
104
|
+
updated: boolean;
|
|
105
|
+
}>;
|
|
85
106
|
/**
|
|
86
107
|
* Bulk assign missions from templates
|
|
87
108
|
*/
|
|
@@ -49,6 +49,30 @@ class MissionLibraryApi {
|
|
|
49
49
|
return this.client.fetch(path);
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* List custom template missions with pagination
|
|
54
|
+
*/
|
|
55
|
+
listCustomTemplateMissions(filters) {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
const params = new URLSearchParams();
|
|
58
|
+
// Start/Limit
|
|
59
|
+
if ((filters === null || filters === void 0 ? void 0 : filters.start) !== undefined) {
|
|
60
|
+
params.append("start", String(filters.start));
|
|
61
|
+
}
|
|
62
|
+
if ((filters === null || filters === void 0 ? void 0 : filters.limit) !== undefined) {
|
|
63
|
+
params.append("limit", String(filters.limit));
|
|
64
|
+
}
|
|
65
|
+
// Keyword
|
|
66
|
+
if (filters === null || filters === void 0 ? void 0 : filters.keyword) {
|
|
67
|
+
params.append("keyword", filters.keyword);
|
|
68
|
+
}
|
|
69
|
+
const query = params.toString();
|
|
70
|
+
const path = query
|
|
71
|
+
? `/roadmap/library/custom-missions?${query}`
|
|
72
|
+
: "/roadmap/library/custom-missions";
|
|
73
|
+
return this.client.fetch(path);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
52
76
|
/**
|
|
53
77
|
* Create a new template mission
|
|
54
78
|
*/
|
|
@@ -145,6 +169,17 @@ class MissionLibraryApi {
|
|
|
145
169
|
});
|
|
146
170
|
});
|
|
147
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* Add a template mission to a user's roadmap (create or update)
|
|
174
|
+
*/
|
|
175
|
+
addToRoadmap(input) {
|
|
176
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
177
|
+
return this.client.fetch("/roadmap/library/missions/add-to-roadmap", {
|
|
178
|
+
method: "POST",
|
|
179
|
+
body: JSON.stringify(input),
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
}
|
|
148
183
|
/**
|
|
149
184
|
* Bulk assign missions from templates
|
|
150
185
|
*/
|
package/dist/core/types.d.ts
CHANGED
|
@@ -36,6 +36,18 @@ export interface CrimsonClientConfigBase {
|
|
|
36
36
|
* SDK version override. Defaults to the SDK package version.
|
|
37
37
|
*/
|
|
38
38
|
clientVersion?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Application name for multi-tenant identity resolution.
|
|
41
|
+
* Required for Indigo API endpoints.
|
|
42
|
+
* @example 'indigo'
|
|
43
|
+
*/
|
|
44
|
+
appName?: string;
|
|
45
|
+
/**
|
|
46
|
+
* Target tenant name for multi-tenant identity resolution.
|
|
47
|
+
* Required for Indigo API endpoints.
|
|
48
|
+
* @example 'crimsonapp', 'collegewise', 'indigo'
|
|
49
|
+
*/
|
|
50
|
+
appTenant?: string;
|
|
39
51
|
}
|
|
40
52
|
/**
|
|
41
53
|
* Configuration using a token provider function
|
|
@@ -7,7 +7,7 @@ export { useTasks, useAllUserTasks, useTasksByRoadmapId, useTasksInfinite, useCr
|
|
|
7
7
|
export { useUsers, useUser, userKeys } from "./useUsers";
|
|
8
8
|
export { useCurrentUserRoles, useMyStudents, accountKeys } from "./useAccount";
|
|
9
9
|
export { useRoadmapContext } from "./useRoadmapContext";
|
|
10
|
-
export { useTemplateMissions, useTemplateMissionsInfinite, useTemplateTasks, useTemplateTasksInfinite, useTemplateMissionDetail, useUpdateTemplateMission, useCopyTemplateMission, useAssignBulkMission, useAssignBulkTask, useCreateFromPredefinedTasks, missionLibraryKeys, useCreateTemplateMission, useDeleteTemplateMission, } from "./useMissionLibrary";
|
|
10
|
+
export { useTemplateMissions, useTemplateMissionsInfinite, useTemplateTasks, useTemplateTasksInfinite, useTemplateMissionDetail, useUpdateTemplateMission, useCopyTemplateMission, useAssignBulkMission, useAssignBulkTask, useCreateFromPredefinedTasks, missionLibraryKeys, useCreateTemplateMission, useDeleteTemplateMission, useTemplateMissionAddToRoadmap, useCustomTemplateMissionsInfinite, } from "./useMissionLibrary";
|
|
11
11
|
export { useStudentProfile, useStudentPrefilledInfo, studentProfileKeys, } from "./useStudentProfile";
|
|
12
12
|
export { useIndigoMe, useStudentTutors, useTutorStudents, indigoKeys, } from "./useIndigo";
|
|
13
13
|
export * from "./useGradeTemplates";
|
|
@@ -14,7 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.
|
|
17
|
+
exports.useStudentTutors = exports.useIndigoMe = exports.studentProfileKeys = exports.useStudentPrefilledInfo = exports.useStudentProfile = exports.useCustomTemplateMissionsInfinite = exports.useTemplateMissionAddToRoadmap = exports.useDeleteTemplateMission = exports.useCreateTemplateMission = exports.missionLibraryKeys = exports.useCreateFromPredefinedTasks = exports.useAssignBulkTask = exports.useAssignBulkMission = exports.useCopyTemplateMission = exports.useUpdateTemplateMission = exports.useTemplateMissionDetail = exports.useTemplateTasksInfinite = exports.useTemplateTasks = exports.useTemplateMissionsInfinite = exports.useTemplateMissions = exports.useRoadmapContext = exports.accountKeys = exports.useMyStudents = exports.useCurrentUserRoles = exports.userKeys = exports.useUser = exports.useUsers = exports.useTaskActivities = exports.useTaskCreators = exports.useGetDownloadUrl = exports.taskKeys = exports.useBulkUpdateTasks = exports.useBulkDeleteTasks = exports.useDeleteTask = exports.useUpdateTask = exports.useCreateTask = exports.useTasksInfinite = exports.useTasksByRoadmapId = exports.useAllUserTasks = exports.useTasks = exports.missionKeys = exports.useDeleteMission = exports.useUpdateMission = exports.useCreateMission = exports.useMissionsInfinite = exports.useMissions = exports.useOAuthCallback = exports.useOAuth = exports.useQueryClient = exports.useAuthState = void 0;
|
|
18
|
+
exports.indigoKeys = exports.useTutorStudents = void 0;
|
|
18
19
|
var useAuthState_1 = require("./useAuthState");
|
|
19
20
|
Object.defineProperty(exports, "useAuthState", { enumerable: true, get: function () { return useAuthState_1.useAuthState; } });
|
|
20
21
|
var react_query_1 = require("@tanstack/react-query");
|
|
@@ -67,6 +68,8 @@ Object.defineProperty(exports, "useCreateFromPredefinedTasks", { enumerable: tru
|
|
|
67
68
|
Object.defineProperty(exports, "missionLibraryKeys", { enumerable: true, get: function () { return useMissionLibrary_1.missionLibraryKeys; } });
|
|
68
69
|
Object.defineProperty(exports, "useCreateTemplateMission", { enumerable: true, get: function () { return useMissionLibrary_1.useCreateTemplateMission; } });
|
|
69
70
|
Object.defineProperty(exports, "useDeleteTemplateMission", { enumerable: true, get: function () { return useMissionLibrary_1.useDeleteTemplateMission; } });
|
|
71
|
+
Object.defineProperty(exports, "useTemplateMissionAddToRoadmap", { enumerable: true, get: function () { return useMissionLibrary_1.useTemplateMissionAddToRoadmap; } });
|
|
72
|
+
Object.defineProperty(exports, "useCustomTemplateMissionsInfinite", { enumerable: true, get: function () { return useMissionLibrary_1.useCustomTemplateMissionsInfinite; } });
|
|
70
73
|
var useStudentProfile_1 = require("./useStudentProfile");
|
|
71
74
|
Object.defineProperty(exports, "useStudentProfile", { enumerable: true, get: function () { return useStudentProfile_1.useStudentProfile; } });
|
|
72
75
|
Object.defineProperty(exports, "useStudentPrefilledInfo", { enumerable: true, get: function () { return useStudentProfile_1.useStudentPrefilledInfo; } });
|
|
@@ -13,6 +13,9 @@ export declare function useTemplateMissionsInfinite(filters?: Omit<TemplateMissi
|
|
|
13
13
|
enabled?: boolean;
|
|
14
14
|
pageSize?: number;
|
|
15
15
|
}): import("@tanstack/react-query").UseInfiniteQueryResult<import("@tanstack/react-query").InfiniteData<import("../../core/types").PaginatedResult<TemplateMission>, unknown>, Error>;
|
|
16
|
+
export declare function useCustomTemplateMissionsInfinite(filters?: Omit<TemplateMissionFilters, "start" | "limit">, options?: {
|
|
17
|
+
enabled?: boolean;
|
|
18
|
+
}): import("@tanstack/react-query").UseInfiniteQueryResult<import("@tanstack/react-query").InfiniteData<import("../../core/types").PaginatedResult<TemplateMission>, unknown>, Error>;
|
|
16
19
|
export declare function useTemplateTasks(filters?: TemplateTaskFilters, enabled?: boolean): import("@tanstack/react-query").UseQueryResult<import("../../core/types").PaginatedResult<TemplateTask>, Error>;
|
|
17
20
|
export declare function useTemplateTasksInfinite(filters?: Omit<TemplateTaskFilters, "start" | "limit">, options?: {
|
|
18
21
|
enabled?: boolean;
|
|
@@ -36,3 +39,8 @@ export declare function useAssignBulkTask(): import("@tanstack/react-query").Use
|
|
|
36
39
|
msg?: string;
|
|
37
40
|
}, Error, AssignBulkTaskInput[], unknown>;
|
|
38
41
|
export declare function useCreateFromPredefinedTasks(): import("@tanstack/react-query").UseMutationResult<TemplateTask[], Error, CreateFromPredefinedInput, unknown>;
|
|
42
|
+
export declare function useTemplateMissionAddToRoadmap(): import("@tanstack/react-query").UseMutationResult<{
|
|
43
|
+
missionId: string;
|
|
44
|
+
isNew: boolean;
|
|
45
|
+
updated: boolean;
|
|
46
|
+
}, Error, import("../../core/missionLibrary").AddTemplateMissionToRoadmapInput, unknown>;
|
|
@@ -13,6 +13,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13
13
|
exports.missionLibraryKeys = void 0;
|
|
14
14
|
exports.useTemplateMissions = useTemplateMissions;
|
|
15
15
|
exports.useTemplateMissionsInfinite = useTemplateMissionsInfinite;
|
|
16
|
+
exports.useCustomTemplateMissionsInfinite = useCustomTemplateMissionsInfinite;
|
|
16
17
|
exports.useTemplateTasks = useTemplateTasks;
|
|
17
18
|
exports.useTemplateTasksInfinite = useTemplateTasksInfinite;
|
|
18
19
|
exports.useTemplateMissionDetail = useTemplateMissionDetail;
|
|
@@ -23,6 +24,7 @@ exports.useCopyTemplateMission = useCopyTemplateMission;
|
|
|
23
24
|
exports.useAssignBulkMission = useAssignBulkMission;
|
|
24
25
|
exports.useAssignBulkTask = useAssignBulkTask;
|
|
25
26
|
exports.useCreateFromPredefinedTasks = useCreateFromPredefinedTasks;
|
|
27
|
+
exports.useTemplateMissionAddToRoadmap = useTemplateMissionAddToRoadmap;
|
|
26
28
|
const react_query_1 = require("@tanstack/react-query");
|
|
27
29
|
const provider_1 = require("../provider");
|
|
28
30
|
const useMissions_1 = require("./useMissions");
|
|
@@ -66,6 +68,26 @@ function useTemplateMissionsInfinite(filters, options) {
|
|
|
66
68
|
enabled,
|
|
67
69
|
});
|
|
68
70
|
}
|
|
71
|
+
function useCustomTemplateMissionsInfinite(filters, options) {
|
|
72
|
+
var _a;
|
|
73
|
+
const client = (0, provider_1.useCrimsonClient)();
|
|
74
|
+
const enabled = (_a = options === null || options === void 0 ? void 0 : options.enabled) !== null && _a !== void 0 ? _a : true;
|
|
75
|
+
return (0, react_query_1.useInfiniteQuery)({
|
|
76
|
+
queryKey: [...exports.missionLibraryKeys.all, "custom-missions", "infinite", filters],
|
|
77
|
+
queryFn: () => __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
return client.library.listCustomTemplateMissions(Object.assign({}, filters));
|
|
79
|
+
}),
|
|
80
|
+
initialPageParam: 0,
|
|
81
|
+
getNextPageParam: (lastPage) => {
|
|
82
|
+
if (!(lastPage === null || lastPage === void 0 ? void 0 : lastPage.pagination))
|
|
83
|
+
return undefined;
|
|
84
|
+
return lastPage.pagination.hasMore
|
|
85
|
+
? lastPage.pagination.start + lastPage.pagination.limit
|
|
86
|
+
: undefined;
|
|
87
|
+
},
|
|
88
|
+
enabled,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
69
91
|
// --- Template Tasks ---
|
|
70
92
|
function useTemplateTasks(filters, enabled = true) {
|
|
71
93
|
const client = (0, provider_1.useCrimsonClient)();
|
|
@@ -120,6 +142,8 @@ function useUpdateTemplateMission() {
|
|
|
120
142
|
groups: ['custom']
|
|
121
143
|
})
|
|
122
144
|
});
|
|
145
|
+
const customMissionsKey = [...exports.missionLibraryKeys.all, "custom-missions", "infinite"];
|
|
146
|
+
queryClient.invalidateQueries({ queryKey: customMissionsKey });
|
|
123
147
|
},
|
|
124
148
|
});
|
|
125
149
|
}
|
|
@@ -134,6 +158,8 @@ function useCreateTemplateMission() {
|
|
|
134
158
|
groups: ["custom"],
|
|
135
159
|
}),
|
|
136
160
|
});
|
|
161
|
+
const customMissionsKey = [...exports.missionLibraryKeys.all, "custom-missions", "infinite"];
|
|
162
|
+
queryClient.invalidateQueries({ queryKey: customMissionsKey });
|
|
137
163
|
},
|
|
138
164
|
});
|
|
139
165
|
}
|
|
@@ -149,6 +175,8 @@ function useDeleteTemplateMission() {
|
|
|
149
175
|
queryClient.invalidateQueries({
|
|
150
176
|
queryKey: exports.missionLibraryKeys.missions(),
|
|
151
177
|
});
|
|
178
|
+
const customMissionsKey = [...exports.missionLibraryKeys.all, "custom-missions", "infinite"];
|
|
179
|
+
queryClient.invalidateQueries({ queryKey: customMissionsKey });
|
|
152
180
|
},
|
|
153
181
|
});
|
|
154
182
|
}
|
|
@@ -230,3 +258,30 @@ function useCreateFromPredefinedTasks() {
|
|
|
230
258
|
},
|
|
231
259
|
});
|
|
232
260
|
}
|
|
261
|
+
function useTemplateMissionAddToRoadmap() {
|
|
262
|
+
const client = (0, provider_1.useCrimsonClient)();
|
|
263
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
264
|
+
return (0, react_query_1.useMutation)({
|
|
265
|
+
mutationFn: (input) => client.library.addToRoadmap(input),
|
|
266
|
+
onSuccess: (data, variables) => {
|
|
267
|
+
// Invalidate mission list for the user
|
|
268
|
+
queryClient.invalidateQueries({
|
|
269
|
+
queryKey: useMissions_1.missionKeys.list(variables.userId),
|
|
270
|
+
});
|
|
271
|
+
// Invalidate infinite query for the user
|
|
272
|
+
queryClient.invalidateQueries({
|
|
273
|
+
queryKey: [...useMissions_1.missionKeys.all, "infinite", variables.userId],
|
|
274
|
+
});
|
|
275
|
+
// Invalidate all tasks as new tasks might have been created
|
|
276
|
+
queryClient.invalidateQueries({
|
|
277
|
+
queryKey: useTasks_1.taskKeys.all,
|
|
278
|
+
});
|
|
279
|
+
// If we know the updated mission ID, invalidate its detail
|
|
280
|
+
if (data.missionId) {
|
|
281
|
+
queryClient.invalidateQueries({
|
|
282
|
+
queryKey: exports.missionLibraryKeys.missionDetail(data.missionId),
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
});
|
|
287
|
+
}
|
package/dist/react/provider.d.ts
CHANGED
|
@@ -12,5 +12,17 @@ export interface CrimsonProviderProps {
|
|
|
12
12
|
* Examples: 'new-roadmap', 'capstone', 'admin-dashboard'
|
|
13
13
|
*/
|
|
14
14
|
clientId?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Application name for multi-tenant identity resolution.
|
|
17
|
+
* Required for Indigo API endpoints.
|
|
18
|
+
* @example 'indigo'
|
|
19
|
+
*/
|
|
20
|
+
appName?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Initial target tenant for multi-tenant identity resolution.
|
|
23
|
+
* Can be changed dynamically via client.setAppTenant().
|
|
24
|
+
* @example 'crimsonapp', 'collegewise', 'indigo'
|
|
25
|
+
*/
|
|
26
|
+
appTenant?: string;
|
|
15
27
|
}
|
|
16
|
-
export declare function CrimsonProvider({ children, apiUrl, allowedParentOrigins, queryClient: externalQueryClient, clientId, }: CrimsonProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
export declare function CrimsonProvider({ children, apiUrl, allowedParentOrigins, queryClient: externalQueryClient, clientId, appName, appTenant, }: CrimsonProviderProps): import("react/jsx-runtime").JSX.Element;
|
package/dist/react/provider.js
CHANGED
|
@@ -16,7 +16,7 @@ function useCrimsonClient() {
|
|
|
16
16
|
}
|
|
17
17
|
return ctx.client;
|
|
18
18
|
}
|
|
19
|
-
function CrimsonProvider({ children, apiUrl, allowedParentOrigins, queryClient: externalQueryClient, clientId, }) {
|
|
19
|
+
function CrimsonProvider({ children, apiUrl, allowedParentOrigins, queryClient: externalQueryClient, clientId, appName, appTenant, }) {
|
|
20
20
|
const [queryClient] = (0, react_1.useState)(() => externalQueryClient ||
|
|
21
21
|
new react_query_1.QueryClient({
|
|
22
22
|
defaultOptions: {
|
|
@@ -31,7 +31,9 @@ function CrimsonProvider({ children, apiUrl, allowedParentOrigins, queryClient:
|
|
|
31
31
|
apiUrl,
|
|
32
32
|
getToken: () => (0, iframe_1.getToken)() || "",
|
|
33
33
|
clientId,
|
|
34
|
-
|
|
34
|
+
appName,
|
|
35
|
+
appTenant,
|
|
36
|
+
}), [apiUrl, clientId, appName, appTenant]);
|
|
35
37
|
(0, react_1.useEffect)(() => {
|
|
36
38
|
const origins = allowedParentOrigins || (0, iframe_1.getDefaultAllowedOrigins)();
|
|
37
39
|
const cleanup = (0, iframe_1.setupIframeListener)(origins);
|