Skip to content
This repository has been archived by the owner on Mar 17, 2024. It is now read-only.

refactor(ModmailConversation): convert to TS #213

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 0 additions & 88 deletions src/objects/ModmailConversation.d.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import RedditContent from './RedditContent.js';
import RedditUser from './RedditUser.js';
import Subreddit from './Subreddit.js';
import ModmailConversationAuthor from './ModmailConversationAuthor.js';

/**
* @global
Expand All @@ -7,11 +10,11 @@ import RedditContent from './RedditContent.js';
* @summary Represents the current status of a given Modmail conversation.
* @type {Readonly<{New: number, InProgress: number, Archived: number}>}
*/
export const conversationStates = Object.freeze({
New: 0,
InProgress: 1,
Archived: 2
});
export enum conversationStates {
New = 0,
InProgress = 1,
Archived = 2,
}


/**
Expand All @@ -21,16 +24,46 @@ export const conversationStates = Object.freeze({
* @summary Represents all the possible states that is used within a Modmail conversations.
* @type {Readonly<{UnArchive: number, Highlight: number, Archive: number, ReportedToAdmins: number, Mute: number, UnHighlight: number, Unmute: number}>}
*/
export const modActionStates = Object.freeze({
Highlight: 0,
UnHighlight: 1,
Archive: 2,
UnArchive: 3,
ReportedToAdmins: 4,
Mute: 5,
Unmute: 6
});
export enum modActionStates {
Highlight = 0,
UnHighlight = 1,
Archive = 2,
UnArchive = 3,
ReportedToAdmins = 4,
Mute = 5,
Unmute = 6,
}

export interface ModmailMessage {
body: string;
bodyMarkdown: string;
author: RedditUser;
isInternal: boolean;
date: string;
id: string;
}

export interface Author {
isMod: boolean;
isAdmin: boolean;
name: string;
isOp: boolean;
isParticipant: boolean;
isHidden: boolean;
id: any;
isDeleted: boolean;
}

export interface Owner {
displayName: string;
type: string;
id: string;
}

export interface ObjId {
id: string;
key: string;
}
/**
* @class
* A class representing a conversation from new modmail
Expand All @@ -42,7 +75,7 @@ export const modActionStates = Object.freeze({
* r.getNewModmailConversation('75hxt')
* @extends RedditContent
*/
const ModmailConversation = class ModmailConversation extends RedditContent {
export default class ModmailConversation extends RedditContent<ModmailConversation> {
static get conversationStates () {
return conversationStates;
}
Expand All @@ -51,6 +84,25 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
return modActionStates;
}

isAuto!: boolean;
objIds!: ObjId[];
isRepliable!: boolean;
lastUserUpdate?: any;
isInternal!: boolean;
lastModUpdate!: Date;
lastUpdated!: Date;
authors!: Author[];
// sometimes an Owner, sometimes a Subreddit
owner!: Owner | Subreddit;
id!: string;
isHighlighted!: boolean;
subject!: string;
participant!: ModmailConversationAuthor;
state!: number;
lastUnread?: any;
numMessages!: number;
messages?: ModmailMessage[];

get _uri () {
return `api/mod/conversations/${this.id}?markRead=false`;
}
Expand All @@ -61,7 +113,7 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
* @return {ModmailConversation}
* @private
*/
_transformApiResponse (response) {
_transformApiResponse (response: any): ModmailConversation {
response.conversation.owner = this._r._newObject('Subreddit', {
id: response.conversation.owner.id,
display_name: response.conversation.owner.displayName
Expand All @@ -75,7 +127,7 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
return this._r._newObject('ModmailConversation', {
...conversationObjects,
...response.conversation
}, true);
}, true) as ModmailConversation;
}

/**
Expand All @@ -85,8 +137,8 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
* @return {object}
* @private
*/
static _getConversationObjects (conversation, response) {
const conversationObjects = {};
static _getConversationObjects (conversation: any, response: any): object {
const conversationObjects: { [x: string]: any[]; } = {};
for (const objId of conversation.objIds) {
if (!conversationObjects[objId.key]) {
conversationObjects[objId.key] = [];
Expand All @@ -103,7 +155,7 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
*
* r.getNewModmailConversation('75hxt').archive()
*/
archive () {
archive (): Promise<ModmailConversation> {
return this._post({uri: `api/mod/conversations/${this.id}/archive`});
}

Expand All @@ -114,7 +166,7 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
*
* r.getNewModmailConversation('75hxt').unarchive()
*/
unarchive () {
unarchive (): Promise<ModmailConversation> {
return this._post({uri: `api/mod/conversations/${this.id}/unarchive`});
}

Expand All @@ -125,7 +177,7 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
*
* r.getNewModmailConversation('75hxt').highlight()
*/
highlight () {
highlight (): Promise<ModmailConversation> {
return this._post({uri: `api/mod/conversations/${this.id}/highlight`});
}

Expand All @@ -136,7 +188,7 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
*
* r.getNewModmailConversation('75hxt').unhighlight()
*/
unhighlight () {
unhighlight (): Promise<ModmailConversation> {
return this._delete({uri: `api/mod/conversations/${this.id}/highlight`});
}

Expand All @@ -147,7 +199,7 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
*
* r.getNewModmailConversation('75hxt').mute()
*/
mute () {
mute (): Promise<ModmailConversation> {
return this._post({uri: `api/mod/conversations/${this.id}/mute`});
}

Expand All @@ -158,7 +210,7 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
*
* r.getNewModmailConversation('75hxt').unmute()
*/
unmute () {
unmute (): Promise<ModmailConversation> {
return this._post({uri: `api/mod/conversations/${this.id}/unmute`});
}

Expand All @@ -169,7 +221,7 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
*
* r.getNewModmailConversation('75hxt').read()
*/
read () {
read (): Promise<void> {
return this._r.markNewModmailConversationsAsRead([this.id]);
}

Expand All @@ -180,7 +232,7 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
*
* r.getNewModmailConversation('75hxt').unread()
*/
unread () {
unread (): Promise<void> {
return this._r.markNewModmailConversationsAsUnread([this.id]);
}

Expand All @@ -192,18 +244,18 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
* r.getNewModmailConversation('75hxt').getParticipant().then(console.log)
* // ModmailConversationAuthor { muteStatus: {...}, name: "SpyTec13", created: '2015-11-22T14:30:38.821292+00:00', ...}
*/
getParticipant () {
getParticipant (): Promise<ModmailConversationAuthor> {
return this._get({uri: `api/mod/conversations/${this.id}/user`})
.then(res => {
return this._r._newObject('ModmailConversationAuthor', res, true);
return this._r._newObject('ModmailConversationAuthor', res, true) as ModmailConversationAuthor;
});
}

/**
* @summary Returns whether the ModmailConversation is read.
* @return {boolean} true, if read. false otherwise
*/
isRead () {
isRead (): boolean {
return this.lastUnread === null;
}

Expand All @@ -212,4 +264,3 @@ const ModmailConversation = class ModmailConversation extends RedditContent {
}
};

export default ModmailConversation;
4 changes: 4 additions & 0 deletions src/objects/RedditContent.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as Snoowrap from '../snoowrap';
import { Options as RequestOptions } from 'request';

export default class RedditContent<T> extends Promise<T> {
created_utc: number;
Expand All @@ -10,6 +11,9 @@ export default class RedditContent<T> extends Promise<T> {
protected _hasFetched: boolean;

constructor(options: any, _r: Snoowrap, _hasFetched: boolean);
_get(options: RequestOptions): Promise<T>;
_post(options: RequestOptions): Promise<T>;
_delete(options: RequestOptions): Promise<T>;
fetch(): Promise<T>;
refresh(): Promise<T>;
toJSON(): T;
Expand Down
4 changes: 2 additions & 2 deletions src/snoowrap.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ declare class Snoowrap {
getNewModmailConversations(options?: ListingOptions & { entity?: string }): Promise<_Listing<_ModmailConversation>>;
createModmailDiscussion(options: { body: string, subject: string, srName: string }): Promise<_ModmailConversation>;
getNewModmailConversation(id: string): Promise<_ModmailConversation>;
markNewModmailConversationsAsRead(convs: _ModmailConversation[]): Promise<void>;
markNewModmailConversationsAsUnread(convs: _ModmailConversation[]): Promise<void>;
markNewModmailConversationsAsRead(conversations: _ModmailConversation[]|string[]): Promise<void>;
markNewModmailConversationsAsUnread(conversations: _ModmailConversation[]|string[]): Promise<void>;
getNewModmailSubreddits(): Promise<_Subreddit[]>;
getUnreadNewModmailConversationsCount(): Promise<{ highlighted: number, notifications: number, archived: number, new: number, inprogress: number, mod: number }>;
bulkReadNewModmail(subs: Array<_Subreddit | string>, state: 'new'|'inprogress'|'mod'|'notifications'|'archived'|'highlighted'|'all'): Promise<_Listing<_ModmailConversation>>;
Expand Down
4 changes: 2 additions & 2 deletions src/snoowrap.js
Original file line number Diff line number Diff line change
Expand Up @@ -1112,7 +1112,7 @@ can get a post and a comment * @returns {Promise<Listing<Submission|Comment>>

/**
* @summary Marks all conversations in array as read.
* @param {ModmailConversation[]} conversations to mark as read
* @param {ModmailConversation[]|string[]} conversations to mark as read
* @example
*
* r.markNewModmailConversationsAsRead(['pics', 'sweden'])
Expand All @@ -1124,7 +1124,7 @@ can get a post and a comment * @returns {Promise<Listing<Submission|Comment>>

/**
* @summary Marks all conversations in array as unread.
* @param {ModmailConversation[]} conversations to mark as unread
* @param {ModmailConversation[]|string[]} conversations to mark as unread
* @example
*
* r.markNewModmailConversationsAsUnread(['pics', 'sweden'])
Expand Down