Skip to content

Commit e0ae400

Browse files
committed
add date function
1 parent 5d50ed2 commit e0ae400

6 files changed

Lines changed: 57 additions & 24 deletions

File tree

electron-src/data/database.ts

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,24 @@ export class SQLDatabase {
303303
return this.enhanceMessageResponses<typeof messages[number]>(allMessages);
304304
};
305305

306+
private addDateToMessage = (message: {
307+
date?: number | null;
308+
date_delivered?: number | null;
309+
date_read?: number | null;
310+
date_obj?: Date;
311+
date_obj_delivered?: Date;
312+
date_obj_read?: Date;
313+
}) => {
314+
if (message.date) {
315+
message.date_obj = new Date(message.date / 1000000 + 978307200000);
316+
}
317+
if (message.date_delivered) {
318+
message.date_obj_delivered = new Date(message.date_delivered / 1000000 + 978307200000);
319+
}
320+
if (message.date_read) {
321+
message.date_obj_read = new Date(message.date_read / 1000000 + 978307200000);
322+
}
323+
};
306324
private enhanceMessageResponses = async <T extends JoinedMessageType = JoinedMessageType>(messages: T[]) => {
307325
type EnhancedMessage = T & {
308326
attachmentMessages?: EnhancedMessage[];
@@ -315,15 +333,7 @@ export class SQLDatabase {
315333

316334
await Promise.all(
317335
enhancedMessages.map(async (message) => {
318-
if (message.date) {
319-
message.date_obj = new Date(message.date / 1000000 + 978307200000);
320-
}
321-
if (message.date_delivered) {
322-
message.date_obj_delivered = new Date(message.date_delivered / 1000000 + 978307200000);
323-
}
324-
if (message.date_read) {
325-
message.date_obj_read = new Date(message.date_read / 1000000 + 978307200000);
326-
}
336+
this.addDateToMessage(message);
327337
if (message.text) {
328338
message.text = message.text.replace(/[\u{FFFC}-\u{FFFD}]/gu, "");
329339
}
@@ -608,6 +618,16 @@ export class SQLDatabase {
608618
topEmojis,
609619
};
610620
};
621+
622+
getMessageDates = async (year: number, chatIds?: number[]) => {
623+
const query = this.getMessageQueryByYear(year, chatIds).select("date");
624+
const data = await query.execute();
625+
for (const message of data) {
626+
// maybe this is slow and its better not to pay serialization cost? idk
627+
this.addDateToMessage(message);
628+
}
629+
return data[0];
630+
};
611631
}
612632

613633
const db = new SQLDatabase();

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"author": "JonLuca DeCaro <mimessage@jonlu.ca>",
44
"main": "build/electron-src/index.js",
55
"name": "Mimessage",
6-
"version": "0.1.13",
6+
"version": "0.1.14",
77
"productName": "Mimessage",
88
"description": "Apple Messages UI alternative, with export, search, and more.",
99
"scripts": {

src/components/message/BaseAvatar.tsx

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import type { AvatarClasses } from "@mui/material/Avatar/avatarClasses";
77
import type { SxProps } from "@mui/system";
88
import type { OverridableStringUnion } from "@mui/types";
99
import type { OverrideProps } from "@mui/material/OverridableComponent";
10-
import { unstable_generateUtilityClasses as generateUtilityClasses } from "@mui/utils";
1110
import { useThemeProps } from "@mui/material/styles";
1211
const defaultGenerator = (componentName: string) => componentName;
1312

@@ -64,15 +63,7 @@ function generateUtilityClass(componentName: string, slot: string, globalStatePr
6463
function getAvatarUtilityClass(slot: string) {
6564
return generateUtilityClass("MuiAvatar", slot);
6665
}
67-
const avatarClasses = generateUtilityClasses("MuiAvatar", [
68-
"root",
69-
"colorDefault",
70-
"circular",
71-
"rounded",
72-
"square",
73-
"img",
74-
"fallback",
75-
]);
66+
7667
export interface AvatarPropsVariantOverrides {}
7768

7869
export interface AvatarTypeMap<P = object> {

src/components/wrapped/SelectedWrap.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ const TwoSidedSection = ({
110110
};
111111
const MessageCount = () => {
112112
const { data: wrappedStats } = useWrappedStats();
113+
const chatId = useMimessage((state) => state.chatId);
113114

114115
const chatMap = useChatMap();
115116
const contacts = React.useMemo(() => {
@@ -142,10 +143,12 @@ const MessageCount = () => {
142143
<SectionHeader>Received</SectionHeader>
143144
<Typography sx={sx}>{(wrappedStats?.messageCount?.received || 0).toLocaleString()}</Typography>
144145
</SectionWrapper>
145-
<SectionWrapper sx={wrapperStyle}>
146-
<SectionHeader>People</SectionHeader>
147-
<Typography sx={sx}>{(uniqueContacts?.size || 0).toLocaleString()}</Typography>
148-
</SectionWrapper>
146+
{!chatId && (
147+
<SectionWrapper sx={wrapperStyle}>
148+
<SectionHeader>People</SectionHeader>
149+
<Typography sx={sx}>{(uniqueContacts?.size || 0).toLocaleString()}</Typography>
150+
</SectionWrapper>
151+
)}
149152
</Box>
150153
</>
151154
);

src/hooks/dataHooks.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import type { GlobalSearchResponse } from "../interfaces";
1616
import { shallow } from "zustand/shallow";
1717
import type { SemanticSearchStats } from "../interfaces";
1818
import type { SlowWrappedStats } from "../interfaces";
19+
import type { MessageDates } from "../interfaces";
1920

2021
const ipcRenderer = global.ipcRenderer;
2122
const useDbChatList = () => {
@@ -441,6 +442,23 @@ export const useSlowWrappedStats = () => {
441442
{ enabled: isInWrapped },
442443
);
443444
};
445+
export const useWrappedDates = () => {
446+
const wrappedYear = useMimessage((state) => state.wrappedYear);
447+
const chatId = useMimessage((state) => state.chatId);
448+
const chatMap = useChatMap();
449+
const chat = chatMap?.get(chatId!);
450+
const ids = chatId ? chat?.sameParticipantChatIds || [chatId] : null;
451+
const isInWrapped = useMimessage((state) => state.isInWrapped);
452+
return useQuery<MessageDates>(
453+
["getMessageDates", wrappedYear, ids],
454+
async () => {
455+
const resp = (await ipcRenderer.invoke("getMessageDates", wrappedYear, ids)) as MessageDates;
456+
console.log(resp);
457+
return resp;
458+
},
459+
{ enabled: isInWrapped },
460+
);
461+
};
444462

445463
interface Permissions {
446464
contactsStatus: PermissionType | "not determined";

src/interfaces/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { Contact } from "electron-mac-contacts";
44
export type ChatList = NonNullable<Awaited<ReturnType<SQLDatabase["getChatList"]>>>;
55
export type WrappedStats = NonNullable<Awaited<ReturnType<SQLDatabase["calculateWrappedStats"]>>>;
66
export type SlowWrappedStats = NonNullable<Awaited<ReturnType<SQLDatabase["calculateSlowWrappedStats"]>>>;
7+
export type MessageDates = NonNullable<Awaited<ReturnType<SQLDatabase["getMessageDates"]>>>;
78
export type MessagesForChat = NonNullable<Awaited<ReturnType<SQLDatabase["getMessagesForChatId"]>>>;
89
export type GlobalSearchResponse = NonNullable<Awaited<ReturnType<SQLDatabase["fullTextMessageSearch"]>>>;
910
export type SemanticSearchStats = NonNullable<Awaited<ReturnType<SQLDatabase["calculateSemanticSearchStats"]>>>;

0 commit comments

Comments
 (0)