Skip to content

Commit 0ee5203

Browse files
committed
Moves InitializeNeoPlugin to plugin-state to remove dependency cycle
1 parent dfee6d8 commit 0ee5203

File tree

4 files changed

+96
-100
lines changed

4 files changed

+96
-100
lines changed

src/components/app.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useEffect } from "react";
2+
import { initializeNeoPlugin } from "../models/plugin-state";
23
import { isNonEmbedded } from "../utils/embed-check";
3-
import { initializeNeoPlugin } from "../utils/codap-utils";
44
import { TabContainer } from "./tabs/tab-container";
55
import { Provider } from "./ui/provider";
66

src/models/data-manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import {
1212
import { decodePng } from "@concord-consortium/png-codec";
1313
import { kChartGraphName, kDataContextName, kMapPinsCollectionName, kXYGraphName } from "../data/constants";
1414
import { createOrUpdateGraphs, createOrUpdateDateSlider, createOrUpdateMap, addConnectingLinesToGraph,
15-
addRegionOfInterestToGraphs, updateGraphRegionOfInterest, updateLocationColorMap, rescaleGraph
16-
} from "../utils/codap-utils";
15+
addRegionOfInterestToGraphs, updateGraphRegionOfInterest, updateLocationColorMap, rescaleGraph
16+
} from "../utils/codap-utils";
1717
import { GeoImage } from "./geo-image";
1818
import { NeoDataset, NeoImageInfo } from "./neo-types";
1919
import { kImageLoadDelay, kMaxSerialImages, kParallelLoad } from "./config";

src/models/plugin-state.ts

Lines changed: 90 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
import { getAllItems, getCaseBySearch, IResult } from "@concord-consortium/codap-plugin-api";
1+
import { addDataContextChangeListener, getAllItems, getCaseByID, getCaseBySearch, getSelectionList, initializePlugin,
2+
IResult, sendMessage } from "@concord-consortium/codap-plugin-api";
23
import { makeAutoObservable, reaction } from "mobx";
34
import {
45
kDataContextName,
6+
kInitialDimensions,
57
kMapPinsCollectionName,
6-
kPinColorAttributeName, kPinDataContextName, kPinLatAttributeName, kPinLongAttributeName
8+
kPinColorAttributeName, kPinDataContextName, kPinLatAttributeName, kPinLongAttributeName,
9+
kPluginName,
10+
kVersion
711
} from "../data/constants";
8-
import { createSelectionList, deleteSelectionList, updateSelectionList } from "../utils/codap-utils";
12+
import { createOrUpdateMap, createSelectionList, deleteSelectionList, updateSelectionList } from "../utils/codap-utils";
913
import { NeoDataset } from "./neo-types";
1014

1115
export interface IMapPin {
@@ -117,4 +121,87 @@ class PluginState {
117121
}
118122
}
119123

124+
export async function initializeNeoPlugin() {
125+
initializePlugin({ pluginName: kPluginName, version: kVersion, dimensions: kInitialDimensions });
126+
127+
// Create the pin dataset
128+
await sendMessage("create", `dataContext`, {
129+
name: kPinDataContextName,
130+
collections: [
131+
{
132+
name: "Map Pins",
133+
attrs: [
134+
{ name: kPinLatAttributeName, type: "numeric" },
135+
{ name: kPinLongAttributeName, type: "numeric" },
136+
{ name: kPinColorAttributeName, type: "color" }
137+
]
138+
}
139+
]
140+
});
141+
142+
// Create map if it doesn't exist
143+
await createOrUpdateMap("Map");
144+
145+
// See if there are any existing pins
146+
pluginState.updatePins();
147+
148+
// Set up a listener for changes to the pin dataset
149+
addDataContextChangeListener(kPinDataContextName, notification => {
150+
const { operation } = notification.values;
151+
152+
if (["createCases", "deleteCases", "updateCases"].includes(operation)) {
153+
pluginState.updatePins();
154+
}
155+
});
156+
// Set up a listener for pin selection
157+
addDataContextChangeListener(kPinDataContextName, async notification => {
158+
const { operation, result } = notification.values;
159+
if (operation === "selectCases" && result.success) {
160+
const selectedPins = await getSelectionList(kPinDataContextName);
161+
const selectedPinValues: IMapPin[] = await Promise.all(
162+
selectedPins.values.map(async (pin: any) => {
163+
const pinItem = await getCaseByID(kPinDataContextName, pin.caseID);
164+
if (pinItem.success) {
165+
const pinValues = pinItem.values;
166+
const pinCase = (pinValues as any).case;
167+
return {
168+
id: pinCase.id,
169+
lat: pinCase.values.pinLat,
170+
long: pinCase.values.pinLong,
171+
color: pinCase.values.pinColor,
172+
};
173+
}
174+
return null;
175+
})
176+
);
177+
pluginState.setSelectedPins(selectedPinValues);
178+
}
179+
});
180+
181+
// Set up a listener for case selection
182+
addDataContextChangeListener(kDataContextName, async notification => {
183+
const { operation, result } = notification.values;
184+
if (operation === "selectCases" && result.success) {
185+
const selectedCases = await getSelectionList(kDataContextName);
186+
const selectedPinCases = selectedCases.values
187+
.filter((sCase: any) => sCase.collectionName === kMapPinsCollectionName);
188+
const selectedCaseValues: any[] = await Promise.all(
189+
selectedPinCases.map(async (sCase: any) => {
190+
const caseItem = await getCaseByID(kDataContextName, sCase.caseID);
191+
if (caseItem.success) {
192+
const caseValues = caseItem.values;
193+
return {
194+
id: caseValues.id,
195+
label: caseValues.case.values.label,
196+
pinColor: caseValues.case.values.pinColor,
197+
};
198+
}
199+
return null;
200+
})
201+
);
202+
pluginState.setSelectedCases(selectedCaseValues);
203+
}
204+
});
205+
}
206+
120207
export const pluginState = new PluginState();

src/utils/codap-utils.ts

Lines changed: 3 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,7 @@
1-
import { addDataContextChangeListener, codapInterface, getCaseByID, initializePlugin, sendMessage }
1+
import { codapInterface, sendMessage }
22
from "@concord-consortium/codap-plugin-api";
3-
// import {
4-
// kPinDataContextName, kPinLatAttributeName, kPinLongAttributeName, kPinColorAttributeName,
5-
// kPluginName, kInitialDimensions, kVersion,
6-
// kDataContextName, kMapPinsCollectionName, kOneMonthInSeconds,
7-
// kMapName, kSliderComponentName, kChartGraphName, kXYGraphName,
8-
// } from "../data/constants";
9-
import { kPluginName, kInitialDimensions, kVersion, kOneMonthInSeconds, kMapName,
10-
kMapPinsCollectionName, kPinColorAttributeName, kPinDataContextName, kPinLatAttributeName, kPinLongAttributeName,
11-
kDataContextName, kSliderComponentName, kChartGraphName, kXYGraphName } from "../data/constants";
12-
import { IMapPin, pluginState } from "../models/plugin-state";
13-
14-
15-
export async function initializeNeoPlugin() {
16-
initializePlugin({ pluginName: kPluginName, version: kVersion, dimensions: kInitialDimensions });
17-
18-
// Create the pin dataset
19-
await sendMessage("create", `dataContext`, {
20-
name: kPinDataContextName,
21-
collections: [
22-
{
23-
name: "Map Pins",
24-
attrs: [
25-
{ name: kPinLatAttributeName, type: "numeric" },
26-
{ name: kPinLongAttributeName, type: "numeric" },
27-
{ name: kPinColorAttributeName, type: "color" }
28-
]
29-
}
30-
]
31-
});
32-
33-
// Create map if it doesn't exist
34-
await createOrUpdateMap("Map");
35-
36-
// See if there are any existing pins
37-
pluginState.updatePins();
38-
39-
// Set up a listener for changes to the pin dataset
40-
addDataContextChangeListener(kPinDataContextName, notification => {
41-
const { operation } = notification.values;
42-
43-
if (["createCases", "deleteCases", "updateCases"].includes(operation)) {
44-
pluginState.updatePins();
45-
}
46-
});
47-
// Set up a listener for pin selection
48-
addDataContextChangeListener(kPinDataContextName, async notification => {
49-
const { operation, result } = notification.values;
50-
if (operation === "selectCases" && result.success) {
51-
const selectedPins = await getSelectionList(kPinDataContextName);
52-
const selectedPinValues: IMapPin[] = await Promise.all(
53-
selectedPins.map(async (pin: any) => {
54-
const pinItem = await getCaseByID(kPinDataContextName, pin.caseID);
55-
if (pinItem.success) {
56-
const pinValues = pinItem.values;
57-
const pinCase = (pinValues as any).case;
58-
return {
59-
id: pinCase.id,
60-
lat: pinCase.values.pinLat,
61-
long: pinCase.values.pinLong,
62-
color: pinCase.values.pinColor,
63-
};
64-
}
65-
return null;
66-
})
67-
);
68-
pluginState.setSelectedPins(selectedPinValues);
69-
}
70-
});
71-
72-
// Set up a listener for case selection
73-
addDataContextChangeListener(kDataContextName, async notification => {
74-
const { operation, result } = notification.values;
75-
if (operation === "selectCases" && result.success) {
76-
const selectedCases = await getSelectionList(kDataContextName);
77-
const selectedPinCases = selectedCases.filter((sCase: any) => sCase.collectionName === kMapPinsCollectionName);
78-
const selectedCaseValues: any[] = await Promise.all(
79-
selectedPinCases.map(async (sCase: any) => {
80-
const caseItem = await getCaseByID(kDataContextName, sCase.caseID);
81-
if (caseItem.success) {
82-
const caseValues = caseItem.values;
83-
return {
84-
id: caseValues.id,
85-
label: caseValues.case.values.label,
86-
pinColor: caseValues.case.values.pinColor,
87-
};
88-
}
89-
return null;
90-
})
91-
);
92-
pluginState.setSelectedCases(selectedCaseValues);
93-
}
94-
});
95-
}
3+
import { kOneMonthInSeconds, kMapName, kMapPinsCollectionName, kDataContextName, kSliderComponentName,
4+
kChartGraphName, kXYGraphName } from "../data/constants";
965

976
export async function createOrUpdateMap(title: string, url?: string): Promise<void> {
987
const mapProps: Record<string, any> = {

0 commit comments

Comments
 (0)