PromucFlow_constructor/app/client/src/utils/localStorage.tsx
albinAppsmith 29cc9d39d5
feat: Added split pane beta announcement modal (#31676)
## Description

This PR adds the beta announcement modal for the new split pane.

Fixes #31657  

## Automation

/ok-to-test tags="@tag.Sanity, @tag.IDE"

### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!IMPORTANT]  
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/8244295273>
> Commit: `8f20379a3f045328c0c7fa0ddce9b28d34a86348`
> Cypress dashboard url: <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=8244295273&attempt=1"
target="_blank">Click here!</a>
> All cypress tests have passed 🎉🎉🎉

<!-- end of auto-generated comment: Cypress test results  -->



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit


- **New Features**
- Introduced a beta version feature allowing users to work with code and
UI side-by-side, enhancing productivity and user experience.
- Added an announcement modal to inform users about the new split-screen
functionality, with options to try it immediately or learn more.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-03-12 15:13:52 +05:30

130 lines
3.0 KiB
TypeScript

import * as log from "loglevel";
import {
LOCAL_STORAGE_QUOTA_EXCEEDED_MESSAGE,
LOCAL_STORAGE_NO_SPACE_LEFT_ON_DEVICE_MESSAGE,
LOCAL_STORAGE_NOT_SUPPORTED_APP_MIGHT_NOT_WORK_AS_EXPECTED,
createMessage,
} from "@appsmith/constants/messages";
import { toast } from "design-system";
export const LOCAL_STORAGE_KEYS = {
CANVAS_CARDS_STATE: "CANVAS_CARDS_STATE",
SPLITPANE_ANNOUNCEMENT: "SPLITPANE_ANNOUNCEMENT",
};
class LocalStorageNotSupportedError extends Error {
name: string;
constructor() {
super();
this.name = "LOCAL_STORAGE_NOT_SUPPORTED";
}
}
class WebStorage {
private storage: Storage;
private _isSupported: boolean;
constructor(storage: Storage) {
this.storage = storage;
this._isSupported = this.isSupported();
}
// ref: https://github.com/Modernizr/Modernizr/blob/94592f279a410436530c7c06acc42a6e90c20150/feature-detects/storage/localstorage.js
isSupported = () => {
try {
this.storage.setItem("test", "testA");
this.storage.removeItem("test");
return true;
} catch (e) {
return false;
}
};
getItem = (key: string): string | null => {
try {
if (!this._isSupported) {
throw new LocalStorageNotSupportedError();
}
return this.storage.getItem(key);
} catch (error) {
this.handleError(error as Error);
}
return null;
};
handleError = (e: Error) => {
let message;
if (e.name === "QuotaExceededError") {
message = LOCAL_STORAGE_QUOTA_EXCEEDED_MESSAGE;
} else if (e.name === "NS_ERROR_FILE_NO_DEVICE_SPACE") {
message = LOCAL_STORAGE_NO_SPACE_LEFT_ON_DEVICE_MESSAGE;
} else if (e.name === "LOCAL_STORAGE_NOT_SUPPORTED") {
// Fail silently
log.error(
createMessage(
LOCAL_STORAGE_NOT_SUPPORTED_APP_MIGHT_NOT_WORK_AS_EXPECTED,
),
);
return;
}
if (message) {
toast.show(createMessage(message), {
kind: "error",
});
} else {
throw e;
}
};
setItem = (key: string, value: string) => {
try {
if (!this._isSupported) {
throw new LocalStorageNotSupportedError();
}
this.storage.setItem(key, value);
} catch (error) {
this.handleError(error as Error);
}
};
removeItem = (key: string) => {
try {
if (!this._isSupported) {
throw new LocalStorageNotSupportedError();
}
this.storage.removeItem(key);
} catch (error) {
this.handleError(error as Error);
}
};
clear = () => {
try {
if (!this._isSupported) {
throw new LocalStorageNotSupportedError();
}
this.storage.clear();
} catch (error) {
this.handleError(error as Error);
}
};
}
export class LocalStorage extends WebStorage {
constructor() {
super(window.localStorage);
}
}
class SessionStorage extends WebStorage {
constructor() {
super(window.sessionStorage);
}
}
const localStorage = new LocalStorage();
export const sessionStorage = new SessionStorage();
export default localStorage;