Skip to content

Commit 6cf4ca3

Browse files
authored
Merge pull request #49 from typelets/chore/update-dependencies
Chore/update dependencies
2 parents f0644eb + bd4560f commit 6cf4ca3

17 files changed

Lines changed: 3169 additions & 3172 deletions

File tree

.husky/pre-commit

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
#!/usr/bin/env sh
2-
. "$(dirname "$0")/_/husky.sh"
3-
41
# Load nvm
52
export NVM_DIR="$HOME/.nvm"
63
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

.husky/pre-push

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
#!/usr/bin/env sh
2-
. "$(dirname "$0")/_/husky.sh"
3-
41
# Load nvm
52
export NVM_DIR="$HOME/.nvm"
63
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@
5656
},
5757
"pnpm": {
5858
"overrides": {
59-
"tmp": ">=0.2.4"
59+
"tmp": ">=0.2.4",
60+
"glob": ">=11.1.0",
61+
"js-yaml": ">=4.1.1"
6062
}
6163
},
6264
"dependencies": {
@@ -131,7 +133,7 @@
131133
"lint-staged": "^15.5.2",
132134
"prettier": "^3.6.2",
133135
"prettier-plugin-tailwindcss": "^0.6.14",
134-
"rimraf": "^6.0.1",
136+
"rimraf": "^6.1.2",
135137
"semantic-release": "^24.2.9",
136138
"tw-animate-css": "^1.3.8",
137139
"typescript": "~5.9.2",

pnpm-lock.yaml

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

src/components/common/MobileAppBanner/index.tsx

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState, useEffect } from 'react';
1+
import { useState } from 'react';
22
import { X, Smartphone } from 'lucide-react';
33
import { Button } from '@/components/ui/button';
44
import { useMobilePlatform } from '@/hooks/useIsMobile';
@@ -10,15 +10,11 @@ const BANNER_DISMISSED_KEY = 'typelets_mobile_banner_dismissed';
1010

1111
export function MobileAppBanner() {
1212
const platform = useMobilePlatform();
13-
const [isDismissed, setIsDismissed] = useState(true);
14-
15-
useEffect(() => {
16-
// Check if banner was previously dismissed
13+
// Initialize state based on localStorage to avoid setState in effect
14+
const [isDismissed, setIsDismissed] = useState(() => {
1715
const dismissed = localStorage.getItem(BANNER_DISMISSED_KEY);
18-
if (!dismissed && platform) {
19-
setIsDismissed(false);
20-
}
21-
}, [platform]);
16+
return !!dismissed || !platform;
17+
});
2218

2319
const handleDismiss = () => {
2420
setIsDismissed(true);

src/components/editor/extensions/NoteLinkSuggestionList.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,12 @@ export const NoteLinkSuggestionList = forwardRef<
5959
);
6060
}, [filteredItems.length]);
6161

62-
// Reset selection when items change
62+
// Reset selection when filtered items change
63+
/* eslint-disable react-hooks/set-state-in-effect -- Legitimate reset on data change */
6364
useEffect(() => {
6465
setSelectedIndex(0);
6566
}, [filteredItems]);
67+
/* eslint-enable react-hooks/set-state-in-effect */
6668

6769
useImperativeHandle(
6870
ref,

src/components/editor/extensions/ResizableImage.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Node, mergeAttributes } from '@tiptap/core';
22
import { ReactNodeViewRenderer } from '@tiptap/react';
33
import { NodeViewWrapper } from '@tiptap/react';
4-
import { useState, useRef, useEffect } from 'react';
4+
import { useState, useEffect, useRef } from 'react';
55
import { X, Maximize2 } from 'lucide-react';
66

77
const ImageComponent = (props: {
@@ -19,15 +19,16 @@ const ImageComponent = (props: {
1919
const { node, deleteNode, updateAttributes } = props;
2020
const [showControls, setShowControls] = useState(false);
2121
const [isResizing, setIsResizing] = useState(false);
22+
const [width, setWidth] = useState(node.attrs.width || 'auto');
2223
const imageRef = useRef<HTMLImageElement>(null);
2324
const containerRef = useRef<HTMLDivElement>(null);
2425

25-
const initialWidth = node.attrs.width || 'auto';
26-
const [width, setWidth] = useState(initialWidth);
27-
26+
// Sync width with node attrs
27+
/* eslint-disable react-hooks/set-state-in-effect -- Sync external prop to local state */
2828
useEffect(() => {
2929
setWidth(node.attrs.width || 'auto');
3030
}, [node.attrs.width]);
31+
/* eslint-enable react-hooks/set-state-in-effect */
3132

3233
const handleResize = (e: React.MouseEvent) => {
3334
e.preventDefault();

src/components/editor/extensions/SlashCommands.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {
22
useState,
3-
useEffect,
43
useImperativeHandle,
54
forwardRef,
65
useCallback,
@@ -277,10 +276,6 @@ export const SlashCommandsList = forwardRef<
277276
setSelectedIndex((selectedIndex + 1) % commands.length);
278277
}, [selectedIndex]);
279278

280-
useEffect(() => {
281-
setSelectedIndex(0);
282-
}, []);
283-
284279
useImperativeHandle(
285280
ref,
286281
() => ({

src/components/editor/hooks/useEditorEffects.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ export function useEditorEffects({
151151

152152
const editorElement = editor.view.dom as HTMLElement;
153153

154+
/* eslint-disable react-hooks/immutability -- Modifying DOM element style, not React state */
154155
if (zoomLevel === 100) {
155156
// At 100%, use the original font size
156157
editorElement.style.fontSize = baseFontSize;
@@ -161,6 +162,7 @@ export function useEditorEffects({
161162
const newSize = baseSize * scaleFactor;
162163
editorElement.style.fontSize = `${newSize}px`;
163164
}
165+
/* eslint-enable react-hooks/immutability */
164166
} catch {
165167
// Silently ignore zoom level application errors
166168
}

src/components/layout/MainLayout.tsx

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,18 @@ export default function MainLayout() {
3434
const [activeTabId, setActiveTabId] = useState<string | null>(null);
3535

3636
// Sync responsive panel states with local states for desktop
37+
/* eslint-disable react-hooks/set-state-in-effect -- Sync external state to local state */
3738
useEffect(() => {
3839
if (!isMobile) {
39-
setFolderSidebarOpen(responsiveFolderPanel.isOpen);
40-
setFilesPanelOpen(responsiveNotesPanel.isOpen);
40+
if (folderSidebarOpen !== responsiveFolderPanel.isOpen) {
41+
setFolderSidebarOpen(responsiveFolderPanel.isOpen);
42+
}
43+
if (filesPanelOpen !== responsiveNotesPanel.isOpen) {
44+
setFilesPanelOpen(responsiveNotesPanel.isOpen);
45+
}
4146
}
42-
}, [isMobile, responsiveFolderPanel.isOpen, responsiveNotesPanel.isOpen]);
47+
}, [isMobile, responsiveFolderPanel.isOpen, responsiveNotesPanel.isOpen, folderSidebarOpen, filesPanelOpen]);
48+
/* eslint-enable react-hooks/set-state-in-effect */
4349

4450
const {
4551
notes,
@@ -280,17 +286,19 @@ export default function MainLayout() {
280286
}, [selectedNote]);
281287

282288
// Update tab properties when note changes
289+
/* eslint-disable react-hooks/set-state-in-effect -- Sync note properties to tab state */
283290
useEffect(() => {
284-
if (!selectedNote?.id) return;
285-
286-
setOpenTabs(tabs =>
287-
tabs.map(tab =>
288-
tab.noteId === selectedNote.id
289-
? { ...tab, title: selectedNote.title || 'Untitled', type: selectedNote.type || 'note', isPublished: selectedNote.isPublished }
290-
: tab
291-
)
292-
);
293-
}, [selectedNote]);
291+
if (selectedNote?.id) {
292+
setOpenTabs(tabs =>
293+
tabs.map(tab =>
294+
tab.noteId === selectedNote.id
295+
? { ...tab, title: selectedNote.title || 'Untitled', type: selectedNote.type || 'note', isPublished: selectedNote.isPublished }
296+
: tab
297+
)
298+
);
299+
}
300+
}, [selectedNote?.id, selectedNote?.title, selectedNote?.type, selectedNote?.isPublished]);
301+
/* eslint-enable react-hooks/set-state-in-effect */
294302

295303
const handlePasswordChange = useCallback(() => {
296304
setSelectedNote(null);

0 commit comments

Comments
 (0)