Skip to content

Add storage implementation if localStorage is not available #113

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

GeekaN2
Copy link
Member

@GeekaN2 GeekaN2 commented Dec 25, 2024

Allows to use catcher in node.js like environment.
Needed for react-native catcher

@GeekaN2 GeekaN2 requested a review from neSpecc December 25, 2024 17:03
Comment on lines +5 to +27
class CatcherStorage implements Storage {
private items: { [key: string]: string } = {};

/**
* Returns the value of the item with the specified key.
*
* @param key - The key of the item you want to retrieve
*/
public getItem(key: string): string | null {
if (this.isLocalStorageAvailable()) {
return localStorage.getItem(key);
}

return this.items[key] || null;
}

/**
* Sets the value of the pair identified by key to value, creating a new key/value pair if none existed for key previously.
*
* @param key - The key of the item you want to store
* @param value - The value of the item you want to store
*/
public setItem(key: string, value: string): void {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lets make this class more abstract:

export interface HawkStorageLike {
  getItem: (key: string) => string | undefined;
  setItem(key: string) => boolean;
}

export class CatcherStorage {
  constructor(private readonly storage: HawkStorageLike){}
  
  getItem(){
    return this.storage.getItem()
  }
  
  setItem(){
    return this.storage.setItem()
  }
}

and catcher will set available implementation:

// catcher.ts

prepateStorage(){
  const isLocalStorageAvailable = ...
  const storageImplementation = isLocalStorageAvailable ? LocalStorage : CustomStorage

  this.storage = new CatcherStorage(storageImplementation)
}

and user can pass own implementation through the catcher initial settings:

import { HawkCatcher, type HawkStorageLike } from '@hawk.so/javascript'

class ReactNativeStorage implements HawkStorageLike {
 ...
}

new HawkCatcher {
  //...
  storage: new ReactNativeStorge()
}

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants