Skip to content

Commit d54708a

Browse files
committed
feat: enhance general settings with compact timeline option
- Added a new setting to show timeline items in the subscription column while reading, improving user experience for content navigation. - Updated localization files to include descriptions and labels for the new setting in English, Japanese, Chinese (Simplified and Traditional). - Refactored the settings structure to utilize a new hook for enhanced settings management, streamlining the codebase. These changes provide users with more control over their reading layout, enhancing the overall functionality of the application. Signed-off-by: Innei <tukon479@gmail.com>
1 parent 1dadedf commit d54708a

12 files changed

Lines changed: 235 additions & 189 deletions

File tree

Lines changed: 56 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
import { createSettingAtom } from "@follow/atoms/helper/setting.js"
22
import type { SupportedLanguages } from "@follow/models"
33
import { defaultGeneralSettings } from "@follow/shared/settings/defaults"
4-
import { enhancedGeneralSettingKeys } from "@follow/shared/settings/enhanced"
5-
import type { GeneralSettings } from "@follow/shared/settings/interface"
6-
import { useCallback, useMemo } from "react"
4+
import { hookEnhancedSettings as baseHookEnhancedSettings } from "@follow/shared/settings/hook"
5+
import type { GeneralSettings as BaseGeneralSettings } from "@follow/shared/settings/interface"
76

87
import { jotaiStore } from "~/lib/jotai"
98
import { getDefaultLanguage } from "~/lib/language"
109

1110
export const DEFAULT_ACTION_LANGUAGE = "default"
1211

12+
export interface GeneralSettings extends BaseGeneralSettings {
13+
showCompactTimelineInSub: boolean
14+
}
1315
export const createDefaultGeneralSettings = (): GeneralSettings => ({
1416
...defaultGeneralSettings,
1517
language: getDefaultLanguage(),
18+
showCompactTimelineInSub: false,
1619
})
1720

1821
const {
@@ -27,35 +30,7 @@ const {
2730

2831
settingAtom: __generalSettingAtom,
2932
} = createSettingAtom("general", createDefaultGeneralSettings)
30-
31-
const [
32-
useGeneralSettingKey,
33-
useGeneralSettingSelector,
34-
useGeneralSettingKeys,
35-
getGeneralSettings,
36-
useGeneralSettingValue,
37-
] = hookEnhancedSettings(
38-
useGeneralSettingKeyInternal,
39-
useGeneralSettingSelectorInternal,
40-
useGeneralSettingKeysInternal,
41-
getGeneralSettingsInternal,
42-
useGeneralSettingValueInternal,
43-
44-
enhancedGeneralSettingKeys,
45-
defaultGeneralSettings,
46-
)
47-
export {
48-
__generalSettingAtom,
49-
clearGeneralSettings,
50-
getGeneralSettings,
51-
initializeDefaultGeneralSettings,
52-
setGeneralSetting,
53-
useGeneralSettingKey,
54-
useGeneralSettingKeys,
55-
useGeneralSettingSelector,
56-
useGeneralSettingValue,
57-
}
58-
export function hookEnhancedSettings<
33+
export const hookEnhancedSettings = <
5934
T1 extends (key: any) => any,
6035
T2 extends (selector: (s: any) => any) => any,
6136
T3 extends (keys: any) => any,
@@ -70,108 +45,21 @@ export function hookEnhancedSettings<
7045

7146
enhancedSettingKeys: Set<string>,
7247
defaultSettings: Record<string, any>,
73-
): [T1, T2, T3, T4, T5] {
74-
const useNextSettingKey = (key: string) => {
75-
const enableEnhancedSettings = useGeneralSettingKeyInternal("enhancedSettings")
76-
const settingValue = useSettingKey(key)
77-
const shouldBackToDefault = enhancedSettingKeys.has(key) && !enableEnhancedSettings
78-
if (!shouldBackToDefault) {
79-
return settingValue
80-
}
81-
82-
return defaultSettings[key] === undefined ? settingValue : defaultSettings[key]
83-
}
84-
85-
const useNextSettingSelector = (selector: (s: any) => any) => {
86-
const enableEnhancedSettings = useGeneralSettingKeyInternal("enhancedSettings")
87-
return useSettingSelector(
88-
useCallback(
89-
(settings) => {
90-
if (enableEnhancedSettings) {
91-
return selector(settings)
92-
}
93-
94-
const enhancedSettings = { ...settings }
95-
for (const key of enhancedSettingKeys) {
96-
if (defaultSettings[key] !== undefined) {
97-
enhancedSettings[key] = defaultSettings[key]
98-
}
99-
}
100-
101-
return selector(enhancedSettings)
102-
},
103-
[enableEnhancedSettings, selector],
104-
),
105-
)
106-
}
107-
108-
const useNextSettingKeys = (keys: string[]) => {
109-
const enableEnhancedSettings = useGeneralSettingKeyInternal("enhancedSettings")
110-
const rawSettingValues: string[] = useSettingKeys(keys)
111-
112-
return useMemo(() => {
113-
if (enableEnhancedSettings) {
114-
return rawSettingValues
115-
}
116-
117-
const result: string[] = []
118-
119-
for (const [i, key] of keys.entries()) {
120-
if (enhancedSettingKeys.has(key) && defaultSettings[key] !== undefined) {
121-
result.push(defaultSettings[key])
122-
} else if (rawSettingValues[i] !== undefined) {
123-
result.push(rawSettingValues[i])
124-
}
125-
}
126-
127-
return result
128-
}, [enableEnhancedSettings, keys, rawSettingValues])
129-
}
130-
131-
const getNextSettings = () => {
132-
const settings = getSettings()
133-
const enableEnhancedSettings = jotaiStore.get(__generalSettingAtom).enhancedSettings
134-
135-
if (enableEnhancedSettings) {
136-
return settings
137-
}
138-
139-
const enhancedSettings = { ...settings }
140-
for (const key of enhancedSettingKeys) {
141-
if (defaultSettings[key] !== undefined) {
142-
enhancedSettings[key] = defaultSettings[key]
143-
}
144-
}
145-
146-
return enhancedSettings
147-
}
148-
149-
const useNextSettingValue = () => {
150-
const settingValues = useSettingValue()
151-
const enableEnhancedSettings = useGeneralSettingKeyInternal("enhancedSettings")
152-
153-
return useMemo(() => {
154-
if (enableEnhancedSettings) {
155-
return settingValues
156-
}
157-
158-
const result = { ...settingValues }
159-
for (const key of enhancedSettingKeys) {
160-
if (defaultSettings[key] !== undefined) {
161-
result[key] = defaultSettings[key]
162-
}
163-
}
164-
165-
return result
166-
}, [enableEnhancedSettings, settingValues])
167-
}
168-
return [
169-
useNextSettingKey as T1,
170-
useNextSettingSelector as T2,
171-
useNextSettingKeys as T3,
172-
getNextSettings as T4,
173-
useNextSettingValue as T5,
174-
]
48+
): [T1, T2, T3, T4, T5] => {
49+
return baseHookEnhancedSettings(
50+
useSettingKey,
51+
useSettingSelector,
52+
useSettingKeys,
53+
getSettings,
54+
useSettingValue,
55+
56+
enhancedSettingKeys,
57+
defaultSettings,
58+
{
59+
useEnhancedEnabled: () => useGeneralSettingKeyInternal("enhancedSettings"),
60+
getEnhancedEnabled: () => jotaiStore.get(__generalSettingAtom).enhancedSettings,
61+
},
62+
)
17563
}
17664

17765
export function useActionLanguage() {
@@ -201,3 +89,37 @@ export const generalServerSyncWhiteListKeys: (keyof GeneralSettings)[] = [
20189
"language",
20290
"voice",
20391
]
92+
93+
export const enhancedGeneralSettingKeys = new Set<keyof GeneralSettings>([
94+
"groupByDate",
95+
"autoExpandLongSocialMedia",
96+
"showCompactTimelineInSub",
97+
])
98+
99+
const [
100+
useGeneralSettingKey,
101+
useGeneralSettingSelector,
102+
useGeneralSettingKeys,
103+
getGeneralSettings,
104+
useGeneralSettingValue,
105+
] = hookEnhancedSettings(
106+
useGeneralSettingKeyInternal,
107+
useGeneralSettingSelectorInternal,
108+
useGeneralSettingKeysInternal,
109+
getGeneralSettingsInternal,
110+
useGeneralSettingValueInternal,
111+
112+
enhancedGeneralSettingKeys,
113+
defaultGeneralSettings,
114+
)
115+
export {
116+
__generalSettingAtom,
117+
clearGeneralSettings,
118+
getGeneralSettings,
119+
initializeDefaultGeneralSettings,
120+
setGeneralSetting,
121+
useGeneralSettingKey,
122+
useGeneralSettingKeys,
123+
useGeneralSettingSelector,
124+
useGeneralSettingValue,
125+
}

apps/desktop/layer/renderer/src/atoms/settings/ui.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { createSettingAtom } from "@follow/atoms/helper/setting.js"
22
import { defaultUISettings } from "@follow/shared/settings/defaults"
3-
import { enhancedUISettingKeys } from "@follow/shared/settings/enhanced"
43
import type { UISettings } from "@follow/shared/settings/interface"
54

65
import { getDefaultLanguage } from "~/lib/language"
@@ -29,6 +28,26 @@ const {
2928
settingAtom: __uiSettingAtom,
3029
} = createSettingAtom("ui", createDefaultUISettings)
3130

31+
export const uiServerSyncWhiteListKeys: (keyof UISettings)[] = [
32+
"uiFontFamily",
33+
"readerFontFamily",
34+
"opaqueSidebar",
35+
"accentColor",
36+
// "customCSS",
37+
]
38+
39+
export const enhancedUISettingKeys = new Set<keyof UISettings>([
40+
"hideExtraBadge",
41+
"codeHighlightThemeLight",
42+
"codeHighlightThemeDark",
43+
"dateFormat",
44+
"readerRenderInlineStyle",
45+
"modalOverlay",
46+
"reduceMotion",
47+
"usePointerCursor",
48+
"opaqueSidebar",
49+
])
50+
3251
const [useUISettingKey, useUISettingSelector, useUISettingKeys, getUISettings, useUISettingValue] =
3352
hookEnhancedSettings(
3453
useUISettingKeyInternal,
@@ -51,11 +70,3 @@ export {
5170
useUISettingSelector,
5271
useUISettingValue,
5372
}
54-
55-
export const uiServerSyncWhiteListKeys: (keyof UISettings)[] = [
56-
"uiFontFamily",
57-
"readerFontFamily",
58-
"opaqueSidebar",
59-
"accentColor",
60-
// "customCSS",
61-
]

apps/desktop/layer/renderer/src/i18n.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ if (import.meta.hot) {
8686
console.info("reload", lang, nsName)
8787
await i18next.reloadResources(lang, nsName)
8888

89-
import.meta.env.DEV && EventBus.dispatch("I18N_UPDATE", "")
89+
EventBus.dispatch("I18N_UPDATE", "")
9090
},
9191
)
9292
}

apps/desktop/layer/renderer/src/modules/app-layout/ai-enhanced-timeline/AIEnhancedTimelineLayout.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { memo, startTransition, useCallback, useEffect, useMemo, useRef } from "
88
import { useResizable } from "react-resizable-layout"
99

1010
import { AIChatPanelStyle, useAIChatPanelStyle, useAIPanelVisibility } from "~/atoms/settings/ai"
11+
import { useGeneralSettingKey } from "~/atoms/settings/general"
1112
import { getUISettings, setUISetting } from "~/atoms/settings/ui"
1213
import { setSubscriptionColumnApronNode, useSubscriptionEntryPlaneVisible } from "~/atoms/sidebar"
1314
import { m } from "~/components/common/Motion"
@@ -114,6 +115,8 @@ const AIEnhancedTimelineLayoutImpl = () => {
114115
// Trigger layout update
115116
window.dispatchEvent(new Event("resize"))
116117
}, [resolvePreferredWidth])
118+
119+
const showCompactTimelineColumn = useGeneralSettingKey("showCompactTimelineInSub")
117120
return (
118121
<div className="relative flex min-w-0 grow">
119122
<div className={cn("h-full flex-1", aiPanelStyle === AIChatPanelStyle.Fixed && "border-r")}>
@@ -182,7 +185,7 @@ const AIEnhancedTimelineLayoutImpl = () => {
182185

183186
{/* Floating panel - renders outside layout flow */}
184187
{aiPanelStyle === AIChatPanelStyle.Floating && <AIChatLayout key="ai-chat-layout" />}
185-
<SubscriptionColumnToggler />
188+
{showCompactTimelineColumn && <SubscriptionColumnToggler />}
186189
</div>
187190
)
188191
}

apps/desktop/layer/renderer/src/modules/settings/hooks/useWrapEnhancedSettingItem.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import { defaultSettings } from "@follow/shared/settings/defaults"
2-
import { enhancedSettingKeys } from "@follow/shared/settings/enhanced"
32
import { useCallback } from "react"
43

5-
import { useGeneralSettingKey } from "~/atoms/settings/general"
4+
import { enhancedGeneralSettingKeys, useGeneralSettingKey } from "~/atoms/settings/general"
5+
import { enhancedUISettingKeys } from "~/atoms/settings/ui"
66

77
export enum WrapEnhancedSettingTab {
88
General,
99
Appearance,
1010
}
1111

1212
const enhancedSettingMapper: Record<WrapEnhancedSettingTab, Set<keyof any>> = {
13-
[WrapEnhancedSettingTab.General]: enhancedSettingKeys.general,
14-
[WrapEnhancedSettingTab.Appearance]: enhancedSettingKeys.ui,
13+
[WrapEnhancedSettingTab.General]: enhancedGeneralSettingKeys,
14+
[WrapEnhancedSettingTab.Appearance]: enhancedUISettingKeys,
1515
}
1616
const defaultSettingMapper: Record<WrapEnhancedSettingTab, Record<keyof any, any>> = {
1717
[WrapEnhancedSettingTab.General]: defaultSettings.general,

0 commit comments

Comments
 (0)