Skip to content

Commit c6a6d46

Browse files
committed
Typescript timeeeeeeeeeeeeeeeeeeeeee
1 parent 142ddd7 commit c6a6d46

16 files changed

Lines changed: 265 additions & 240 deletions

Build/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,6 @@ <h3>Select a Note or Create New</h3>
127127
</div>
128128
<div id="toastContainer" class="toast-container"></div>
129129

130-
<script type="module" src="./src/main.js"></script>
130+
<script type="module" src="./src/main.ts"></script>
131131
</body>
132132
</html>

Build/package-lock.json

Lines changed: 0 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Build/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
"homepage": "https://github.com/NellowTCS/HTMLNotes#readme",
2222
"dependencies": {
2323
"marked": "^16.3.0",
24-
"tiny-markdown-editor": "^0.2.3",
2524
"vite": "^7.1.3"
2625
},
2726
"devDependencies": {
Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,47 @@
1-
// database.js - IndexedDB operations for notes
2-
3-
let db;
1+
// database.ts - IndexedDB operations for notes
2+
let db: IDBDatabase;
43
const DB_NAME = "HTMLNotesDB";
54
const DB_VERSION = 1;
65
const OBJECT_STORE_NAME = "notes";
76

8-
export function openDatabase() {
7+
export function openDatabase(): Promise<IDBDatabase> {
98
return new Promise((resolve, reject) => {
109
const request = indexedDB.open(DB_NAME, DB_VERSION);
1110
request.onerror = () => {
1211
console.error("IndexedDB error:", request.error);
1312
reject("Database error");
1413
};
15-
request.onupgradeneeded = (event) => {
16-
db = event.target.result;
14+
request.onupgradeneeded = (event: IDBVersionChangeEvent) => {
15+
if (!event.target) {
16+
reject("Database upgrade event target is null");
17+
return;
18+
}
19+
db = (event.target as IDBOpenDBRequest).result;
1720
const objectStore = db.createObjectStore(OBJECT_STORE_NAME, {
1821
keyPath: "id",
1922
autoIncrement: true,
2023
});
2124
objectStore.createIndex("date", "date", { unique: false });
2225
objectStore.createIndex("category", "category", { unique: false });
2326
};
24-
request.onsuccess = () => {
25-
db = event.target.result;
27+
request.onsuccess = (event: Event) => {
28+
db = (event.target as IDBOpenDBRequest).result;
2629
resolve(db);
2730
};
2831
});
2932
}
3033

31-
export function addNote(note) {
34+
export function addNote(note: Note): Promise<number> {
3235
return new Promise((resolve, reject) => {
3336
const transaction = db.transaction([OBJECT_STORE_NAME], "readwrite");
3437
const objectStore = transaction.objectStore(OBJECT_STORE_NAME);
3538
const request = objectStore.add(note);
36-
request.onsuccess = () => resolve(request.result);
39+
request.onsuccess = () => resolve(request.result as number);
3740
request.onerror = () => reject("Error adding note");
3841
});
3942
}
4043

41-
export function updateNote(note) {
44+
export function updateNote(note: Note): Promise<void> {
4245
return new Promise((resolve, reject) => {
4346
const transaction = db.transaction([OBJECT_STORE_NAME], "readwrite");
4447
const objectStore = transaction.objectStore(OBJECT_STORE_NAME);
@@ -48,7 +51,7 @@ export function updateNote(note) {
4851
});
4952
}
5053

51-
export function deleteNote(id) {
54+
export function deleteNote(id: number): Promise<void> {
5255
return new Promise((resolve, reject) => {
5356
const transaction = db.transaction([OBJECT_STORE_NAME], "readwrite");
5457
const objectStore = transaction.objectStore(OBJECT_STORE_NAME);
@@ -58,24 +61,22 @@ export function deleteNote(id) {
5861
});
5962
}
6063

61-
export function getAllNotes() {
64+
export function getAllNotes(): Promise<Note[]> {
6265
return new Promise((resolve, reject) => {
6366
const transaction = db.transaction([OBJECT_STORE_NAME], "readonly");
6467
const objectStore = transaction.objectStore(OBJECT_STORE_NAME);
6568
const request = objectStore.getAll();
66-
request.onsuccess = () => resolve(request.result);
69+
request.onsuccess = () => resolve(request.result as Note[]);
6770
request.onerror = () => reject("Error getting all notes");
6871
});
6972
}
7073

71-
export function getNoteById(id) {
72-
const noteId = parseInt(id);
73-
if (isNaN(noteId)) return Promise.reject("Invalid note ID");
74+
export function getNoteById(id: number): Promise<Note | undefined> {
7475
return new Promise((resolve, reject) => {
7576
const transaction = db.transaction([OBJECT_STORE_NAME], "readonly");
7677
const objectStore = transaction.objectStore(OBJECT_STORE_NAME);
77-
const request = objectStore.get(noteId);
78-
request.onsuccess = () => resolve(request.result);
78+
const request = objectStore.get(id);
79+
request.onsuccess = () => resolve(request.result as Note | undefined);
7980
request.onerror = () => reject("Error getting note by ID");
8081
});
8182
}
Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
// editor.js - TinyMDE editor functions
1+
// editor.ts - TinyMDE editor functions
22
const TinyMDE = window.TinyMDE;
33
import { showToast } from "./notifications.js";
44
import { showSavingIndicator, hideSavingIndicator } from "./ui.js";
55

6-
let tinyMdeEditor = null;
6+
let tinyMdeEditor: any = null;
77

8-
export function initializeTinyMDE(debounceCallback, attempts = 3) {
9-
const editorContainer = document.getElementById("tinymde-editor");
8+
export function initializeTinyMDE(debounceCallback: () => void, attempts: number = 3): void {
9+
const editorContainer = document.getElementById("tinymde-editor") as HTMLElement;
1010
if (!editorContainer) {
1111
if (attempts > 0) {
12-
setTimeout(() => initializeTinyMDE(attempts - 1), 100);
12+
setTimeout(() => initializeTinyMDE(debounceCallback, attempts - 1), 100);
1313
return;
1414
}
1515
showToast("Editor container not found.", "error");
@@ -51,75 +51,75 @@ export function initializeTinyMDE(debounceCallback, attempts = 3) {
5151
editor: tinyMdeEditor,
5252
});
5353

54-
const observer = new MutationObserver((mutations) => {
54+
const observer = new MutationObserver((mutations: MutationRecord[]) => {
5555
if (
5656
mutations.some(
5757
(m) =>
5858
m.type === "childList" ||
5959
(m.type === "characterData" &&
60-
m.target.parentNode?.closest(".TinyMDE"))
60+
(m.target as Element).parentElement?.closest(".TinyMDE"))
6161
)
6262
) {
63-
if (!window.isSettingEditorContent) debounceCallback();
63+
if (!(window as any).isSettingEditorContent) debounceCallback();
6464
}
6565
});
6666

67-
const editorContent = editorContainer.querySelector(".TinyMDE");
67+
const editorContent = editorContainer.querySelector(".TinyMDE") as Element;
6868
if (editorContent) {
6969
observer.observe(editorContent, {
7070
childList: true,
7171
subtree: true,
7272
characterData: true,
7373
});
7474
}
75-
window.editorObserver = observer;
75+
(window as any).editorObserver = observer;
7676
} catch (error) {
7777
console.error("Error initializing TinyMDE:", error);
7878
showToast("Error initializing editor.", "error");
7979
}
8080
}
8181

82-
export function setEditorContent(content) {
82+
export function setEditorContent(content: string): void {
8383
if (!tinyMdeEditor) return;
8484
try {
85-
window.isSettingEditorContent = true;
85+
(window as any).isSettingEditorContent = true;
8686
tinyMdeEditor.setContent(content || "");
87-
setTimeout(() => (window.isSettingEditorContent = false), 100);
87+
setTimeout(() => ((window as any).isSettingEditorContent = false), 100);
8888
} catch (error) {
8989
console.error("Error setting editor content:", error);
90-
window.isSettingEditorContent = false;
90+
(window as any).isSettingEditorContent = false;
9191
}
9292
}
9393

94-
export function getEditorContent() {
94+
export function getEditorContent(): string {
9595
return tinyMdeEditor ? tinyMdeEditor.getContent().trim() : "";
9696
}
9797

98-
export function enableEditor() {
98+
export function enableEditor(): void {
9999
if (tinyMdeEditor && typeof tinyMdeEditor.enable === "function") {
100100
tinyMdeEditor.enable();
101101
}
102102
}
103103

104-
export function focusEditor() {
104+
export function focusEditor(): void {
105105
if (tinyMdeEditor && tinyMdeEditor.codemirror) {
106106
tinyMdeEditor.codemirror.focus();
107107
}
108108
}
109109

110-
export function createDebounceAutosave(handleSaveNoteCallback) {
111-
let timeout;
110+
export function createDebounceAutosave(handleSaveNoteCallback: (showNotification: boolean) => Promise<void>): () => void {
111+
let timeout: number;
112112
let lastContent = "";
113113
let lastTitle = "";
114114
let lastTags = "";
115-
let saveQueue = [];
115+
let saveQueue: { currentContent: string; currentTitle: string; currentTags: string }[] = [];
116116
let isSaving = false;
117117

118118
return () => {
119119
clearTimeout(timeout);
120120
const currentContent = getEditorContent();
121-
const noteTitleInput = document.getElementById("noteTitle");
122-
const noteTagsInput = document.getElementById("noteTags");
121+
const noteTitleInput = document.getElementById("noteTitle") as HTMLInputElement;
122+
const noteTagsInput = document.getElementById("noteTags") as HTMLInputElement;
123123
const currentTitle = noteTitleInput ? noteTitleInput.value.trim() : "";
124124
const currentTags = noteTagsInput ? noteTagsInput.value.trim() : "";
125125

@@ -135,7 +135,7 @@ export function createDebounceAutosave(handleSaveNoteCallback) {
135135
const processQueue = async () => {
136136
if (saveQueue.length === 0 || isSaving) return;
137137
isSaving = true;
138-
const addNoteBtn = document.getElementById("addNoteBtn");
138+
const addNoteBtn = document.getElementById("addNoteBtn") as HTMLButtonElement;
139139
addNoteBtn.disabled = true;
140140
addNoteBtn.setAttribute("aria-disabled", "true");
141141
const timeoutId = setTimeout(() => {
@@ -147,10 +147,7 @@ export function createDebounceAutosave(handleSaveNoteCallback) {
147147
}
148148
}, 5000);
149149

150-
const { currentContent, currentTitle, currentTags } = saveQueue.shift();
151-
const { showSavingIndicator, hideSavingIndicator } = await import(
152-
"./ui.js"
153-
);
150+
const { currentContent, currentTitle, currentTags } = saveQueue.shift()!;
154151
showSavingIndicator();
155152
try {
156153
await handleSaveNoteCallback(false);

0 commit comments

Comments
 (0)