Skip to content

Commit 464a6e8

Browse files
committed
fix rendering issue from v1 to current
1 parent d0b4b1a commit 464a6e8

File tree

5 files changed

+62
-42
lines changed

5 files changed

+62
-42
lines changed

apps/web/src/app/projects/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -862,7 +862,7 @@ function ProjectsSkeleton() {
862862
);
863863

864864
return (
865-
<div className="xs:grid-cols-2 grid grid-cols-1 gap-6 sm:grid-cols-3 lg:grid-cols-4">
865+
<div className="px-4 xs:grid-cols-2 grid grid-cols-1 gap-6 sm:grid-cols-3 lg:grid-cols-4">
866866
{skeletonIds.map((skeletonId) => (
867867
<Card
868868
key={skeletonId}

apps/web/src/services/renderer/scene-builder.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ export function buildScene(params: BuildSceneParams) {
2929
(track) => !("hidden" in track && track.hidden),
3030
);
3131

32-
const mainTrack = visibleTracks.find((track) => isMainTrack(track)) ?? null;
3332
const orderedTracksTopToBottom = [
3433
...visibleTracks.filter((track) => !isMainTrack(track)),
35-
...(mainTrack ? [mainTrack] : []),
34+
...visibleTracks.filter((track) => isMainTrack(track)),
3635
];
3736

3837
const orderedTracksBottomToTop = orderedTracksTopToBottom.slice().reverse();

apps/web/src/services/storage/migrations/runner.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ export interface MigrationProgress {
1919

2020
let hasCleanedUpMetaDb = false;
2121

22+
const MIN_MIGRATION_DISPLAY_MS = 1000;
23+
2224
export async function runStorageMigrations({
2325
migrations,
2426
onProgress,
@@ -45,6 +47,7 @@ export async function runStorageMigrations({
4547

4648
const orderedMigrations = [...migrations].sort((a, b) => a.from - b.from);
4749
let migratedCount = 0;
50+
let migrationStartTime: number | null = null;
4851

4952
for (const project of projects) {
5053
if (typeof project !== "object" || project === null) {
@@ -59,6 +62,11 @@ export async function runStorageMigrations({
5962
continue;
6063
}
6164

65+
// Track when we first showed the migration dialog
66+
if (migrationStartTime === null) {
67+
migrationStartTime = Date.now();
68+
}
69+
6270
const projectName = getProjectName({ project: projectRecord });
6371
onProgress?.({
6472
isMigrating: true,
@@ -90,6 +98,16 @@ export async function runStorageMigrations({
9098
}
9199
}
92100

101+
// Ensure dialog is visible for minimum time so users can see it
102+
if (migrationStartTime !== null) {
103+
const elapsed = Date.now() - migrationStartTime;
104+
if (elapsed < MIN_MIGRATION_DISPLAY_MS) {
105+
await new Promise((resolve) =>
106+
setTimeout(resolve, MIN_MIGRATION_DISPLAY_MS - elapsed),
107+
);
108+
}
109+
}
110+
93111
onProgress?.({
94112
isMigrating: false,
95113
fromVersion: null,

apps/web/src/services/storage/migrations/transformers/v1-to-v2.ts

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ interface LegacyMediaElement {
2626
type: "media";
2727
mediaId: string;
2828
muted?: boolean;
29-
[id: string]: unknown;
29+
[key: string]: unknown;
3030
}
3131

3232
interface LegacyTextElement {
@@ -35,19 +35,19 @@ interface LegacyTextElement {
3535
y: number;
3636
rotation: number;
3737
opacity: number;
38-
[id: string]: unknown;
38+
[key: string]: unknown;
3939
}
4040

4141
interface LegacyAudioElement {
4242
type: "audio";
4343
mediaId: string;
44-
[id: string]: unknown;
44+
[key: string]: unknown;
4545
}
4646

4747
interface LegacyMediaTrack {
4848
type: "media";
4949
elements: unknown[];
50-
[id: string]: unknown;
50+
[key: string]: unknown;
5151
}
5252

5353
export interface TransformV1ToV2Options {
@@ -265,35 +265,38 @@ async function transformTracks({
265265
}
266266

267267
let isFirstVideoTrackFound = false;
268+
const transformedTracks: (TimelineTrack | null)[] = [];
268269

269-
const transformedTracks = await Promise.all(
270-
tracks.map(async (track) => {
271-
if (!isRecord(track)) {
272-
return null;
273-
}
270+
for (const track of tracks) {
271+
if (!isRecord(track)) {
272+
transformedTracks.push(null);
273+
continue;
274+
}
274275

275-
const trackType = track.type;
276-
if (trackType === "media") {
277-
const videoTrack = await transformMediaTrack({
278-
track: track as LegacyMediaTrack,
279-
loadMediaAsset,
280-
isMain: !isFirstVideoTrackFound,
281-
});
282-
isFirstVideoTrackFound = true;
283-
return videoTrack;
284-
}
276+
const trackType = track.type;
277+
if (trackType === "media") {
278+
const videoTrack = await transformMediaTrack({
279+
track: track as LegacyMediaTrack,
280+
loadMediaAsset,
281+
isMain: !isFirstVideoTrackFound,
282+
});
283+
isFirstVideoTrackFound = true;
284+
transformedTracks.push(videoTrack);
285+
continue;
286+
}
285287

286-
if (trackType === "text") {
287-
return transformTextTrack({ track });
288-
}
288+
if (trackType === "text") {
289+
transformedTracks.push(transformTextTrack({ track }));
290+
continue;
291+
}
289292

290-
if (trackType === "audio") {
291-
return transformAudioTrack({ track });
292-
}
293+
if (trackType === "audio") {
294+
transformedTracks.push(transformAudioTrack({ track }));
295+
continue;
296+
}
293297

294-
return null;
295-
}),
296-
);
298+
transformedTracks.push(null);
299+
}
297300

298301
return transformedTracks.filter(
299302
(track): track is TimelineTrack => track !== null,

apps/web/src/services/storage/migrations/v1-to-v2.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ export class V1toV2Migration extends StorageMigration {
3333
});
3434

3535
if (!result.skipped) {
36-
// cleanup legacy timeline DBs after successful transformation
37-
await cleanupLegacyTimelineDBs({
36+
void cleanupLegacyTimelineDBs({
3837
projectId,
3938
project: result.project,
4039
});
@@ -60,13 +59,13 @@ function createMediaAssetLoader({
6059
};
6160
}
6261

63-
async function cleanupLegacyTimelineDBs({
62+
function cleanupLegacyTimelineDBs({
6463
projectId,
6564
project,
6665
}: {
6766
projectId: string;
6867
project: ProjectRecord;
69-
}): Promise<void> {
68+
}): void {
7069
const scenes = project.scenes;
7170
if (!Array.isArray(scenes)) {
7271
return;
@@ -89,11 +88,12 @@ async function cleanupLegacyTimelineDBs({
8988
const projectDbName = `video-editor-timelines-${projectId}`;
9089
dbNamesToDelete.push(projectDbName);
9190

92-
for (const dbName of dbNamesToDelete) {
93-
try {
94-
await deleteDatabase({ dbName });
95-
} catch {
96-
// ignore errors, DB might not exist or already deleted
97-
}
98-
}
91+
// Fire-and-forget: delete in parallel, don't block migration
92+
void Promise.all(
93+
dbNamesToDelete.map((dbName) =>
94+
deleteDatabase({ dbName }).catch(() => {
95+
// ignore errors, DB might not exist or already deleted
96+
}),
97+
),
98+
);
9999
}

0 commit comments

Comments
 (0)