mirror of
https://github.com/docmost/docmost.git
synced 2026-05-17 23:14:07 +08:00
82d065669d
The header edit/read toggle now controls only the current session's mode without saving it as the user's preference. The saved preference (set in profile settings) is applied once on initial load and sticks across page navigations within the session, so navigating to a new page no longer resets the mode mid-session. Fixes #1693
96 lines
2.8 KiB
TypeScript
96 lines
2.8 KiB
TypeScript
import { Text, MantineSize, SegmentedControl } from "@mantine/core";
|
|
import { useAtom } from "jotai";
|
|
import { userAtom } from "@/features/user/atoms/current-user-atom.ts";
|
|
import { updateUser } from "@/features/user/services/user-service.ts";
|
|
import React, { useCallback, useEffect, useState } from "react";
|
|
import { useTranslation } from "react-i18next";
|
|
import { PageEditMode } from "@/features/user/types/user.types.ts";
|
|
import { ResponsiveSettingsRow, ResponsiveSettingsContent, ResponsiveSettingsControl } from "@/components/ui/responsive-settings-row";
|
|
import { currentPageEditModeAtom } from "@/features/editor/atoms/editor-atoms.ts";
|
|
|
|
export default function PageStatePref() {
|
|
const { t } = useTranslation();
|
|
|
|
return (
|
|
<ResponsiveSettingsRow>
|
|
<ResponsiveSettingsContent>
|
|
<Text size="md">{t("Default page edit mode")}</Text>
|
|
<Text size="sm" c="dimmed">
|
|
{t("Choose your preferred page edit mode. Avoid accidental edits.")}
|
|
</Text>
|
|
</ResponsiveSettingsContent>
|
|
|
|
<ResponsiveSettingsControl>
|
|
<PageStateSegmentedControl />
|
|
</ResponsiveSettingsControl>
|
|
</ResponsiveSettingsRow>
|
|
);
|
|
}
|
|
|
|
interface PageStateSegmentedControlProps {
|
|
size?: MantineSize;
|
|
}
|
|
|
|
export function PageStateSegmentedControl({
|
|
size,
|
|
}: PageStateSegmentedControlProps) {
|
|
const { t } = useTranslation();
|
|
const [user, setUser] = useAtom(userAtom);
|
|
const pageEditMode =
|
|
user?.settings?.preferences?.pageEditMode ?? PageEditMode.Edit;
|
|
const [value, setValue] = useState(pageEditMode);
|
|
|
|
const handleChange = useCallback(
|
|
async (newValue: string) => {
|
|
const prevValue = value;
|
|
setValue(newValue);
|
|
try {
|
|
const updatedUser = await updateUser({ pageEditMode: newValue });
|
|
setUser(updatedUser);
|
|
} catch {
|
|
setValue(prevValue);
|
|
}
|
|
},
|
|
[value, setUser],
|
|
);
|
|
|
|
useEffect(() => {
|
|
if (pageEditMode !== value) {
|
|
setValue(pageEditMode);
|
|
}
|
|
}, [pageEditMode, value]);
|
|
|
|
return (
|
|
<SegmentedControl
|
|
size={size}
|
|
value={value}
|
|
onChange={handleChange}
|
|
data={[
|
|
{ label: t("Edit"), value: PageEditMode.Edit },
|
|
{ label: t("Read"), value: PageEditMode.Read },
|
|
]}
|
|
/>
|
|
);
|
|
}
|
|
|
|
// Header variant: updates the current page's mode locally without persisting
|
|
// the preference to the server.
|
|
export function PageEditModeToggle({ size }: { size?: MantineSize }) {
|
|
const { t } = useTranslation();
|
|
const [currentPageEditMode, setCurrentPageEditMode] = useAtom(
|
|
currentPageEditModeAtom,
|
|
);
|
|
|
|
return (
|
|
<SegmentedControl
|
|
size={size}
|
|
value={currentPageEditMode}
|
|
onChange={(v) => setCurrentPageEditMode(v as PageEditMode)}
|
|
data={[
|
|
{ label: t("Edit"), value: PageEditMode.Edit },
|
|
{ label: t("Read"), value: PageEditMode.Read },
|
|
]}
|
|
/>
|
|
);
|
|
}
|