mirror of
https://github.com/revoltchat/revite.git
synced 2025-02-24 01:01:00 -05:00
79 lines
1.7 KiB
TypeScript
79 lines
1.7 KiB
TypeScript
|
import { action, computed, makeAutoObservable, ObservableMap } from "mobx";
|
||
|
|
||
|
import Persistent from "../Persistent";
|
||
|
|
||
|
interface Data {
|
||
|
drafts: Record<string, string>;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Handles storing draft (currently being written) messages.
|
||
|
*/
|
||
|
export default class Draft implements Persistent<Data> {
|
||
|
private drafts: ObservableMap<string, string>;
|
||
|
|
||
|
/**
|
||
|
* Construct new Draft store.
|
||
|
*/
|
||
|
constructor() {
|
||
|
this.drafts = new ObservableMap();
|
||
|
makeAutoObservable(this);
|
||
|
}
|
||
|
|
||
|
toJSON() {
|
||
|
return {
|
||
|
drafts: this.drafts,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
@action hydrate(data: Data) {
|
||
|
Object.keys(data.drafts).forEach((key) =>
|
||
|
this.drafts.set(key, data.drafts[key]),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get draft for a channel.
|
||
|
* @param channel Channel ID
|
||
|
*/
|
||
|
@computed get(channel: string) {
|
||
|
return this.drafts.get(channel);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check whether a channel has a draft.
|
||
|
* @param channel Channel ID
|
||
|
*/
|
||
|
@computed has(channel: string) {
|
||
|
return this.drafts.has(channel) && this.drafts.get(channel)!.length > 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set draft for a channel.
|
||
|
* @param channel Channel ID
|
||
|
* @param content Draft content
|
||
|
*/
|
||
|
@action set(channel: string, content?: string) {
|
||
|
if (typeof content === "undefined") {
|
||
|
return this.clear(channel);
|
||
|
}
|
||
|
|
||
|
this.drafts.set(channel, content);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Clear draft from a channel.
|
||
|
* @param channel Channel ID
|
||
|
*/
|
||
|
@action clear(channel: string) {
|
||
|
this.drafts.delete(channel);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Reset and clear all drafts.
|
||
|
*/
|
||
|
@action reset() {
|
||
|
this.drafts.clear();
|
||
|
}
|
||
|
}
|