3 changed files with 158 additions and 32 deletions
@ -0,0 +1,101 @@ |
|||||
|
import { Protobuf, Types } from "@meshtastic/js"; |
||||
|
|
||||
|
export interface MessageWithState extends Types.PacketMetadata<string> { |
||||
|
state: MessageState; |
||||
|
} |
||||
|
|
||||
|
export type MessageState = "ack" | "waiting" | Protobuf.Mesh.Routing_Error; |
||||
|
|
||||
|
export default class MessageStore { |
||||
|
constructor(deviceNumber: number, channelNumber: number) { |
||||
|
this.deviceNumber = deviceNumber; |
||||
|
this.channelNumber = channelNumber; |
||||
|
this.indexKey = `device/${this.deviceNumber}/group/${this.channelNumber}/index`; |
||||
|
this.messages = []; |
||||
|
|
||||
|
this.loadMessages(); |
||||
|
} |
||||
|
|
||||
|
get currentIndex(): number { |
||||
|
return parseInt(localStorage.getItem(this.indexKey)) || 0; |
||||
|
} |
||||
|
|
||||
|
messageKey(messageIndex: number): string { |
||||
|
return `device/${this.deviceNumber}/group/${this.channelNumber}/message/${messageIndex}`; |
||||
|
} |
||||
|
|
||||
|
nextIndex(): number { |
||||
|
const nextIndex = this.currentIndex + 1; |
||||
|
|
||||
|
localStorage.setItem(this.indexKey, nextIndex); |
||||
|
|
||||
|
return nextIndex; |
||||
|
} |
||||
|
|
||||
|
addMessage(message: MessageWithState): void { |
||||
|
const messageIndex = this.nextIndex(); |
||||
|
const messageKey = this.messageKey(messageIndex); |
||||
|
|
||||
|
localStorage.setItem(messageKey, JSON.stringify(message)); |
||||
|
|
||||
|
this.messages.push(message); |
||||
|
} |
||||
|
|
||||
|
getMessage(messageIndex: number): MessageWithState { |
||||
|
const messageKey = this.messageKey(messageIndex); |
||||
|
|
||||
|
const messageJSON = localStorage.getItem(messageKey); |
||||
|
|
||||
|
if (messageJSON === null) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
const message = JSON.parse(messageJSON); |
||||
|
|
||||
|
message.rxTime = new Date(message.rxTime); |
||||
|
|
||||
|
return message; |
||||
|
} |
||||
|
|
||||
|
setMessageState(messageId: number, state: MessageState): void { |
||||
|
this.messages.forEach((message, i) => { |
||||
|
if (message.id === messageId) { |
||||
|
const messageKey = this.messageKey(i + 1); |
||||
|
|
||||
|
message.state = state; |
||||
|
localStorage.setItem(messageKey, JSON.stringify(message)); |
||||
|
|
||||
|
return; |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
deleteMessage(messageIndex: number): void { |
||||
|
const messageKey = this.messageKey(messageIndex); |
||||
|
localStorage.removeItem(messageKey); |
||||
|
} |
||||
|
|
||||
|
loadMessages(): MessageWithState[] { |
||||
|
if (this.currentIndex === 0) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
for (let i = 1; i <= this.currentIndex; i++) { |
||||
|
this.messages.push(this.getMessage(i)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
clear() { |
||||
|
if (this.currentIndex === 0) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
for (let i = 1; i <= this.currentIndex; i++) { |
||||
|
this.deleteMessage(i); |
||||
|
} |
||||
|
|
||||
|
localStorage.removeItem(this.indexKey); |
||||
|
|
||||
|
this.messages = []; |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue