Skip to content

Commit a058a50

Browse files
committed
reworked map managment
1 parent 933308f commit a058a50

3 files changed

Lines changed: 70 additions & 32 deletions

File tree

platforms/web/src/Teach.tsx

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -84,19 +84,21 @@ function Teach() {
8484
}
8585

8686
const roadmapData = await response.json();
87-
const storageId = roadmapData.settings?.id || jsonId;
87+
const settingsId = roadmapData.settings?.id || jsonId;
8888

89-
// Check if map already exists
90-
const existingMap = await db.getTeacherMap(storageId);
89+
// Check if a map with the same settings.id already exists
90+
const existingMap = await db.findTeacherMapBySettingsId(settingsId);
9191
if (existingMap) {
9292
// Show conflict dialog
93-
setConflictData({ storageId, roadmapData, jsonId, existingMap });
93+
setConflictData({ storageId: existingMap.id, roadmapData, jsonId, existingMap });
9494
setShowConflictDialog(true);
9595
setLoading(false);
9696
return;
9797
}
9898

99-
await db.addTeacherMap(storageId, roadmapData, jsonId);
99+
// Generate a unique database ID
100+
const dbId = `map-${Date.now()}`;
101+
await db.addTeacherMap(dbId, roadmapData, jsonId);
100102
const maps = await db.getAllTeacherMaps();
101103
setAllMaps(maps);
102104
setNewMapUrl('');
@@ -123,20 +125,20 @@ function Teach() {
123125
const content = e.target?.result as string;
124126
const json = JSON.parse(content);
125127

126-
// Generate a unique ID for this uploaded map
127-
const uploadId = `upload-${Date.now()}`;
128-
const storageId = json.settings?.id || uploadId;
128+
const settingsId = json.settings?.id;
129129

130-
// Check if map already exists
131-
const existingMap = await db.getTeacherMap(storageId);
130+
// Check if a map with the same settings.id already exists
131+
const existingMap = settingsId ? await db.findTeacherMapBySettingsId(settingsId) : undefined;
132132
if (existingMap) {
133133
// Show conflict dialog
134-
setConflictData({ storageId, roadmapData: json, existingMap });
134+
setConflictData({ storageId: existingMap.id, roadmapData: json, existingMap });
135135
setShowConflictDialog(true);
136136
return;
137137
}
138138

139-
await db.addTeacherMap(storageId, json, undefined);
139+
// Generate a unique database ID
140+
const dbId = `map-${Date.now()}`;
141+
await db.addTeacherMap(dbId, json, undefined);
140142
const maps = await db.getAllTeacherMaps();
141143
setAllMaps(maps);
142144
setShowAddDialog(false);
@@ -158,6 +160,7 @@ function Teach() {
158160
const handleConflictOverwrite = async () => {
159161
if (!conflictData) return;
160162

163+
// Overwrite the existing map (keep same database ID)
161164
await db.addTeacherMap(conflictData.storageId, conflictData.roadmapData, conflictData.jsonId);
162165
const maps = await db.getAllTeacherMaps();
163166
setAllMaps(maps);
@@ -170,19 +173,23 @@ function Teach() {
170173
const handleConflictNewId = async () => {
171174
if (!conflictData) return;
172175

173-
// Generate a new unique ID
174-
const newId = `${conflictData.storageId}-${Date.now()}`;
176+
// Generate a new unique database ID
177+
const newDbId = `map-${Date.now()}`;
178+
179+
// Generate a new settings.id to avoid conflicts
180+
const currentSettingsId = conflictData.roadmapData.settings?.id || 'map';
181+
const newSettingsId = `${currentSettingsId}-${Date.now()}`;
175182

176183
// Update the ID in the roadmap settings
177184
const updatedRoadmapData = {
178185
...conflictData.roadmapData,
179186
settings: {
180187
...conflictData.roadmapData.settings,
181-
id: newId,
188+
id: newSettingsId,
182189
},
183190
};
184191

185-
await db.addTeacherMap(newId, updatedRoadmapData, conflictData.jsonId);
192+
await db.addTeacherMap(newDbId, updatedRoadmapData, conflictData.jsonId);
186193
const maps = await db.getAllTeacherMaps();
187194
setAllMaps(maps);
188195
setNewMapUrl('');

platforms/web/src/TeacherEditor.tsx

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -77,25 +77,35 @@ function TeacherEditorInner() {
7777
saveTimeoutRef.current = window.setTimeout(async () => {
7878
const roadmapData = getRoadmapData();
7979

80-
// Generate a storage ID for this map
81-
let storageId: string;
80+
// Determine the database ID for this map
81+
let dbId: string;
8282
if (mapId) {
83-
// Use mapId if available (editing existing map)
84-
storageId = roadmapData.settings?.id || mapId;
83+
// Editing existing map - use the database ID from URL
84+
dbId = mapId;
8585
} else {
86-
// For new maps without mapId, use or create a unique ID
87-
storageId = roadmapData.settings?.id || `local-${Date.now()}`;
88-
// Update settings with the generated ID if it doesn't have one
89-
if (!roadmapData.settings?.id) {
90-
roadmapData.settings = { ...roadmapData.settings, id: storageId };
86+
// New map - check if we already created a database entry
87+
// Look for existing map with matching settings.id
88+
const settingsId = roadmapData.settings?.id;
89+
const existingMap = settingsId ? await db.findTeacherMapBySettingsId(settingsId) : undefined;
90+
91+
if (existingMap) {
92+
// Already saved - update existing
93+
dbId = existingMap.id;
94+
} else {
95+
// First save - generate new database ID
96+
dbId = `map-${Date.now()}`;
97+
// Ensure settings.id is set
98+
if (!roadmapData.settings?.id) {
99+
roadmapData.settings = { ...roadmapData.settings, id: `map-${Date.now()}` };
100+
}
91101
}
92102
}
93103

94104
try {
95-
// Check if this map exists in teacher's collection
96-
const existingMap = await db.getTeacherMap(storageId);
105+
// Get existing map to preserve jsonId
106+
const existingMap = await db.getTeacherMap(dbId);
97107
// Save or update the map
98-
await db.addTeacherMap(storageId, roadmapData, existingMap?.jsonId || undefined);
108+
await db.addTeacherMap(dbId, roadmapData, existingMap?.jsonId || undefined);
99109
} catch (err) {
100110
console.error('Failed to auto-save map:', err);
101111
}
@@ -121,13 +131,28 @@ function TeacherEditorInner() {
121131
lastSavedRef.current = jsonId;
122132

123133
// Get current roadmap data and save to teacher collection
124-
const roadmapData = getRoadmapData();
125-
const storageId = roadmapData.settings?.id || jsonId;
134+
const saveSharedMap = async () => {
135+
const roadmapData = getRoadmapData();
136+
const settingsId = roadmapData.settings?.id;
137+
138+
// Find existing map by database ID or settings ID
139+
let dbId: string;
140+
if (mapId) {
141+
// Editing existing map - use the database ID from URL
142+
dbId = mapId;
143+
} else {
144+
// New map - look for existing by settings.id
145+
const existingMap = settingsId ? await db.findTeacherMapBySettingsId(settingsId) : undefined;
146+
dbId = existingMap?.id || `map-${Date.now()}`;
147+
}
148+
149+
await db.addTeacherMap(dbId, roadmapData, jsonId);
150+
};
126151

127-
db.addTeacherMap(storageId, roadmapData, jsonId);
152+
saveSharedMap();
128153
}
129154
}
130-
}, [shareLink, shareDialogOpen, getRoadmapData]);
155+
}, [shareLink, shareDialogOpen, getRoadmapData, mapId]);
131156

132157
return null;
133158
}

platforms/web/src/db.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,12 @@ export async function getAllTeacherMaps(): Promise<TeacherMapEntry[]> {
122122
return allMaps.reverse(); // Most recent first
123123
}
124124

125+
export async function findTeacherMapBySettingsId(settingsId: string): Promise<TeacherMapEntry | undefined> {
126+
const db = await getDB();
127+
const allMaps = await db.getAll('teacherMaps');
128+
return allMaps.find(map => map.roadmapData.settings?.id === settingsId);
129+
}
130+
125131
export async function removeTeacherMap(id: string) {
126132
const db = await getDB();
127133
await db.delete('teacherMaps', id);

0 commit comments

Comments
 (0)