Skip to content

Commit 9a45edc

Browse files
committed
feat(JBU-51): allow multiple snapshots to be stored simultaneously
1 parent e6218ef commit 9a45edc

5 files changed

Lines changed: 51 additions & 19 deletions

File tree

userscript/src/components/background-actions/actions/AutoBackupBigJunctionBeforeDelete.tsx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export function AutoBackupBigJunctionBeforeDelete() {
2626

2727
const backupBigJunction = (bigJunction: BigJunctionDataModel) => {
2828
const backup = BigJunctionBackup.fromBigJunction(bigJunction);
29-
BigJunctionBackupTemplate.backup = backup;
29+
BigJunctionBackupTemplate.storeBackup(backup);
3030
Logger.info('Big Junction snapshot has been created and saved');
3131
};
3232

@@ -37,22 +37,22 @@ export function AutoBackupBigJunctionBeforeDelete() {
3737

3838
Logger.info('Automatic big junction backup script running...');
3939

40-
const storedSnapshot = BigJunctionBackupTemplate.backup;
41-
const snapshotSignatureMatch =
42-
storedSnapshot &&
43-
storedSnapshot.getOriginalBigJunction()?.getAttribute('id') ===
44-
action.bigJunction.getAttribute('id');
40+
const snapshotSignatureMatch = BigJunctionBackupTemplate.backups.some(
41+
(snapshot) =>
42+
snapshot.getOriginalBigJunction()?.getAttribute('id') ===
43+
action.bigJunction.getAttribute('id'),
44+
);
4545

46-
if (!storedSnapshot) {
47-
Logger.info('Has no snapshot stored, backing up...');
46+
if (BigJunctionBackupTemplate.canStoreMoreBackups()) {
47+
Logger.info('Has free snapshot slot, backing up...');
4848
gtag('event', 'auto_backup', { event_category: 'big_junction_backup' });
4949
backupBigJunction(action.bigJunction);
5050
addAction(action);
5151
} else if (snapshotSignatureMatch) {
5252
Logger.info('Big Junction and Snapshot signatures matches, skipping');
5353
addAction(action);
5454
} else {
55-
Logger.info('Asking the user to override the snapshot');
55+
Logger.info('Asking the user to override the oldest snapshot');
5656
new Promise<void>((resolve, reject) => {
5757
setConfirmBalloonCallback({
5858
attributes: { bigJunction: action.bigJunction },
@@ -105,10 +105,10 @@ export function AutoBackupBigJunctionBeforeDelete() {
105105
disableDontShowAgainCheckbox
106106
mapEntity={confirmBalloonCallback.attributes.bigJunction}
107107
title={t(
108-
'jb_utils.big_junction.backup_restore.confirm_overwrite_backup.title',
108+
'jb_utils.big_junction.backup_restore.confirm_overwrite_backup.title_oldest',
109109
)}
110110
details={t(
111-
'jb_utils.big_junction.backup_restore.confirm_overwrite_backup.details',
111+
'jb_utils.big_junction.backup_restore.confirm_overwrite_backup.details_oldest',
112112
)}
113113
confirmButtonText={t(
114114
'jb_utils.big_junction.backup_restore.confirm_overwrite_backup.backup_btn',

userscript/src/components/edit-panel/big-junction-backup/components/EnrollBackupButton.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { gtag } from '@/google-analytics';
1111

1212
export function EnrollBackupButton() {
1313
const buttonRef = useRef<HTMLButtonElement>();
14-
const { isBackupAvailable, setBackup } = useBackupContext();
14+
const { canStoreMoreBackups, setBackup } = useBackupContext();
1515
const [bigJunction] = useSelectedDataModelsContext<BigJunctionDataModel>();
1616
const [showOverrideConfirmation, setShowOverrideConfirmation] =
1717
useState(false);
@@ -26,7 +26,7 @@ export function EnrollBackupButton() {
2626
const handleButtonClick: MouseEventHandler<HTMLButtonElement> = (e) => {
2727
e.currentTarget.blur();
2828
gtag('event', 'backup_clicked', { event_category: 'big_junction_backup' });
29-
if (isBackupAvailable) {
29+
if (!canStoreMoreBackups()) {
3030
setShowOverrideConfirmation(true);
3131
return;
3232
}
@@ -50,10 +50,10 @@ export function EnrollBackupButton() {
5050
alarming
5151
disableDontShowAgainCheckbox
5252
title={t(
53-
'jb_utils.big_junction.backup_restore.confirm_overwrite_backup.title',
53+
'jb_utils.big_junction.backup_restore.confirm_overwrite_backup.title_oldest',
5454
)}
5555
details={t(
56-
'jb_utils.big_junction.backup_restore.confirm_overwrite_backup.details',
56+
'jb_utils.big_junction.backup_restore.confirm_overwrite_backup.details_oldest',
5757
)}
5858
onConfirmClick={() => {
5959
backupBigJunction();

userscript/src/components/edit-panel/big-junction-backup/contexts/BackupContext.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import { BigJunctionBackupTemplate } from '@/components/edit-panel/big-junction-backup';
12
import { ReactNode, createContext, useState } from 'react';
23
import { BigJunctionBackup } from '../models';
34
import { createMandatoryUseContext } from '@/utils';
45

56
interface BackupContextPayload {
67
readonly isBackupAvailable: boolean;
8+
canStoreMoreBackups(): boolean;
79
backup: BigJunctionBackup;
810
setBackup(newBackup: BigJunctionBackup): void;
911
}
@@ -25,6 +27,9 @@ export function BackupContextProvider({
2527
<BackupContext.Provider
2628
value={{
2729
isBackupAvailable: !!backup,
30+
canStoreMoreBackups() {
31+
return BigJunctionBackupTemplate.canStoreMoreBackups();
32+
},
2833
get backup() {
2934
return backup;
3035
},

userscript/src/components/edit-panel/big-junction-backup/template.tsx

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { WazeMapEditorEntityType } from '@/@waze/Waze/consts';
2+
import { BigJunctionDataModel } from '@/@waze/Waze/DataModels/BigJunctionDataModel';
3+
import { compareJunctionToBackup } from '@/components/edit-panel/big-junction-backup/utils';
24
import { EditPanelTemplate } from '@/components/edit-panel/edit-panel-template';
35
import { ReactNode } from 'react';
46
import { BackupContextProvider, RestoreContextProvider } from './contexts';
@@ -12,10 +14,14 @@ import { backupNotRestoredSaveLock } from './backup-not-restored-save-lock';
1214
import { UnverifiedTurnsListView } from './components/UnverifiedTurnsListView';
1315

1416
export const BigJunctionBackupTemplate = class implements EditPanelTemplate {
15-
static backup: BigJunctionBackup = null;
17+
static backups: BigJunctionBackup[] = [];
18+
static MAX_BACKUPS = 10;
1619

17-
constructor() {
20+
subjectBigJunction: BigJunctionDataModel;
21+
22+
constructor(bigJunctions: BigJunctionDataModel[]) {
1823
backupNotRestoredSaveLock.set();
24+
this.subjectBigJunction = bigJunctions[0];
1925
}
2026

2127
static getSupportedElementTypes(): WazeMapEditorEntityType[] {
@@ -26,16 +32,35 @@ export const BigJunctionBackupTemplate = class implements EditPanelTemplate {
2632
return true;
2733
}
2834

35+
static canStoreMoreBackups() {
36+
return this.backups.length < this.MAX_BACKUPS;
37+
}
38+
39+
static storeBackup(backup: BigJunctionBackup) {
40+
if (!this.canStoreMoreBackups()) this.backups.shift();
41+
this.backups.push(backup);
42+
}
43+
44+
static getBackupForBigJunction(
45+
bigJunction: BigJunctionDataModel,
46+
): BigJunctionBackup {
47+
return this.backups.findLast((backup) =>
48+
compareJunctionToBackup(bigJunction, backup),
49+
);
50+
}
51+
2952
getTargetElement(): HTMLElement {
3053
return document.createElement('div');
3154
}
3255

3356
render(): ReactNode {
3457
return (
3558
<BackupContextProvider
36-
initialBackup={BigJunctionBackupTemplate.backup}
59+
initialBackup={BigJunctionBackupTemplate.getBackupForBigJunction(
60+
this.subjectBigJunction,
61+
)}
3762
onBackupChanged={(backup) =>
38-
(BigJunctionBackupTemplate.backup = backup)
63+
BigJunctionBackupTemplate.storeBackup(backup)
3964
}
4065
>
4166
<RestoreContextProvider>

userscript/src/resources/localization/userscript.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@
6363
},
6464
"confirm_overwrite_backup": {
6565
"title": "Override backup?",
66+
"title_oldest": "Override oldest backup?",
6667
"details": "You're about to override a Junction Box backup. This action is irreversible",
68+
"details_oldest": "You're about to override the oldest Junction Box backup. This action is irreversible",
6769
"backup_btn": "Yes",
6870
"ignore_btn": "No"
6971
},

0 commit comments

Comments
 (0)