Skip to content

Commit a2d0cbf

Browse files
committed
Merge branch 'release/0.2.2'
2 parents e6cb86b + 576f41b commit a2d0cbf

File tree

5 files changed

+61
-16
lines changed

5 files changed

+61
-16
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lagrange",
3-
"version": "0.2.1",
3+
"version": "0.2.2",
44
"private": true,
55
"type": "module",
66
"scripts": {

src/core/import.helper.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import type { IDBPlanet } from '@/dexie.config'
2+
import PlanetData from './models/planet-data.model'
3+
import pako from 'pako'
4+
import { nanoid } from 'nanoid'
5+
6+
export function readFileData(buf: ArrayBuffer): IDBPlanet | undefined {
7+
const rawData = JSON.parse(pako.inflate(buf, { to: 'string' }))
8+
if (rawData.version || rawData.data) {
9+
return readFileV2(rawData)
10+
} else {
11+
return readFileV1(rawData) // Only v1 files have no version attached
12+
}
13+
}
14+
15+
function readFileV2(rawData: IDBPlanet): IDBPlanet | undefined {
16+
try {
17+
const newIdb: IDBPlanet = {
18+
id: rawData.id,
19+
data: PlanetData.createFrom(rawData.data),
20+
preview: rawData.preview,
21+
}
22+
console.debug('[import] Read file data as version 2')
23+
return newIdb
24+
} catch (err) {
25+
console.error(err)
26+
return undefined
27+
}
28+
}
29+
30+
function readFileV1(rawData: PlanetData): IDBPlanet | undefined {
31+
try {
32+
const newIdb: IDBPlanet = {
33+
id: nanoid(),
34+
data: PlanetData.createFrom(rawData),
35+
}
36+
console.debug('[import] Read file data as version 1')
37+
return newIdb
38+
} catch (err) {
39+
console.error(err)
40+
return undefined
41+
}
42+
}

src/dexie.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ interface IDBSettings {
2828

2929
interface IDBPlanet {
3030
id: string
31+
version?: string
3132
preview?: string
3233
data: PlanetData
3334
}

src/views/CodexView.vue

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import { saveAs } from 'file-saver'
6464
import PlanetData from '@/core/models/planet-data.model'
6565
import JSZip from 'jszip'
6666
import NewCardElement from '@/components/elements/NewCardElement.vue'
67+
import { readFileData } from '@/core/import.helper'
6768
6869
const i18n = useI18n()
6970
const fileInput: Ref<HTMLInputElement | null> = ref(null)
@@ -125,17 +126,10 @@ async function importPlanetFile(event: Event) {
125126
const reader = new FileReader()
126127
return new Promise<IDBPlanet>((resolve, reject) => {
127128
reader.onload = async (e) => {
128-
try {
129-
const data = JSON.parse(pako.inflate(e.target?.result as ArrayBuffer, { to: 'string' })) as IDBPlanet
130-
const newIdb: IDBPlanet = {
131-
id: data.id,
132-
data: PlanetData.createFrom(data.data),
133-
preview: data.preview,
134-
}
135-
console.info(`Imported planet (ID=${newIdb.id}): [${newIdb.data.planetName}]`)
136-
resolve(newIdb)
137-
} catch (err) {
138-
console.error(err)
129+
const data = readFileData(e.target?.result as ArrayBuffer)
130+
if (data) {
131+
resolve(data)
132+
} else {
139133
reject()
140134
}
141135
}
@@ -145,21 +139,28 @@ async function importPlanetFile(event: Event) {
145139
146140
try {
147141
const newPlanets: PromiseSettledResult<IDBPlanet>[] = await Promise.allSettled(readPromises)
148-
if (newPlanets.every((p) => p.status === 'rejected')) {
142+
const rejectedFiles = newPlanets.filter((p) => p.status === 'rejected')
143+
if (rejectedFiles.length === newPlanets.length) {
149144
EventBus.sendToastEvent('warn', 'toast.import_failure', 3000)
150145
return
151146
}
152-
await idb.planets.bulkAdd(
147+
148+
const allAdded = await idb.planets.bulkPut(
153149
newPlanets
154150
.filter((np) => np.status === 'fulfilled')
155-
.map((np: PromiseSettledResult<IDBPlanet>) => (np as PromiseFulfilledResult<IDBPlanet>).value),
151+
.map((np: PromiseSettledResult<IDBPlanet>) => (np as PromiseFulfilledResult<IDBPlanet>).value)
152+
.map((np) => ({ ...np, version: np.version ?? '1' })),
156153
)
154+
if (allAdded && rejectedFiles.length === 0) {
155+
EventBus.sendToastEvent('success', 'toast.import_success', 3000)
156+
} else {
157+
EventBus.sendToastEvent('warn', 'toast.import_partial', 3000)
158+
}
157159
} catch (_) {
158160
EventBus.sendToastEvent('warn', 'toast.import_partial', 3000)
159161
} finally {
160162
await loadPlanets()
161163
fileInput.value!.value = ''
162-
EventBus.sendToastEvent('success', 'toast.import_success', 3000)
163164
}
164165
}
165166

src/views/PlanetEditorView.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@ async function savePlanet() {
318318
const localData = toRaw(JSON.stringify(LG_PLANET_DATA.value))
319319
const idbData: IDBPlanet = {
320320
id: $planetEntityId.value.length > 0 ? $planetEntityId.value : nanoid(),
321+
version: '2',
321322
data: JSON.parse(localData),
322323
preview: previewDataString,
323324
}

0 commit comments

Comments
 (0)