Files
bsky-social-app/src/storage
Eric Bailey c85a271ef6 Additional moderation (#5172)
* Set up additional mod authorities

* Filter out non-configurable mod authorities

* WIP

* Working

* Cleanup, add mod

* Cleanup

* Add more debug logs

* Tweak logs

* Filter out imperative labels from typeaheads

* Filter hideable content from notifications

* Add api

* Fall back in dev

* Remove space

* Use prod endpoint

* Add tiny notice

* Add notice to labeler card, show all labelers
2024-09-20 14:16:23 -05:00
..
2024-09-05 12:31:24 -07:00
2024-09-20 14:16:23 -05:00
2024-09-05 12:31:24 -07:00
2024-09-20 14:16:23 -05:00

#/storage

Usage

Import the correctly scoped store from #/storage. Each instance of Storage (the base class, not to be used directly), has the following interface:

  • set([...scope, key], value)
  • get([...scope, key])
  • remove([...scope, key])
  • removeMany([...scope], [...keys])

For example, using our device store looks like this, since it's scoped to the device (the most base level scope):

import { device } from '#/storage';

device.set(['foobar'], true);
device.get(['foobar']);
device.remove(['foobar']);
device.removeMany([], ['foobar']);

TypeScript

Stores are strongly typed, and when setting a given value, it will need to conform to the schemas defined in #/storage/schema. When getting a value, it will be returned to you as the type defined in its schema.

Scoped Stores

Some stores are (or might be) scoped to an account or other identifier. In this case, storage instances are created with type-guards, like this:

type AccountSchema = {
  language: `${string}-${string}`;
};

type DID = `did:${string}`;

const account = new Storage<
  [DID],
  AccountSchema
>({
  id: 'account',
});

account.set(
  ['did:plc:abc', 'language'],
  'en-US',
);

const language = account.get([
  'did:plc:abc',
  'language',
]);

Here, if ['did:plc:abc'] is not supplied along with the key of language, the get will return undefined (and TS will yell at you).