PromucFlow_constructor/app/client/src/utils/localStorage.tsx
Valera Melnikov 42debc6d11
chore: rename ADS package (#35583)
## Description
Rename `design-system` package to `@appsmith/ads`

## Automation

/ok-to-test tags="@tag.All"

### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/10319507327>
> Commit: 65d9664dd75b750496458a6e1652e0da858e1fc6
> <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=10319507327&attempt=1"
target="_blank">Cypress dashboard</a>.
> Tags: `@tag.All`
> Spec:
> <hr>Fri, 09 Aug 2024 13:47:50 UTC
<!-- end of auto-generated comment: Cypress test results  -->


## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [x] No
2024-08-09 17:20:29 +03:00

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 "ee/constants/messages";
import { toast } from "@appsmith/ads";
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;