Skip to content

Commit

Permalink
feat(core): add useColor hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
JimmFly committed Sep 5, 2024
1 parent dd80ac7 commit 92790c2
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { useI18n } from '@affine/i18n';
import {
ConnectorMode,
LineColor,
LineColorMap,
PointStyle,
StrokeStyle,
} from '@blocksuite/blocks';
Expand All @@ -19,6 +20,7 @@ import { useCallback, useMemo } from 'react';

import { DropdownMenu } from '../menu';
import { menuTrigger, settingWrapper } from '../style.css';
import { useColor } from '../utils';
import { Point } from './point';
import { EdgelessSnapshot } from './snapshot';

Expand All @@ -32,6 +34,7 @@ export const ConnectorSettings = () => {
const framework = useFramework();
const { editorSetting } = framework.get(EditorSettingService);
const settings = useLiveData(editorSetting.settings$);
const getColorFromMap = useColor();

const connecterStyleItems = useMemo<RadioItem[]>(
() => [
Expand Down Expand Up @@ -133,8 +136,8 @@ export const ConnectorSettings = () => {

const currentColor = useMemo(() => {
const color = settings.connector.stroke;
return Object.entries(LineColor).find(([, value]) => value === color);
}, [settings]);
return getColorFromMap(color, LineColorMap);
}, [getColorFromMap, settings.connector.stroke]);

const colorItems = useMemo(() => {
const { stroke } = settings.connector;
Expand Down Expand Up @@ -204,9 +207,9 @@ export const ConnectorSettings = () => {
trigger={
<MenuTrigger
className={menuTrigger}
prefix={<Point color={currentColor[1]} />}
prefix={<Point color={currentColor.value} />}
>
{currentColor[0]}
{currentColor.key}
</MenuTrigger>
}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { useI18n } from '@affine/i18n';
import {
createEnumMap,
NoteBackgroundColor,
NoteBackgroundColorMap,
NoteShadow,
NoteShadowMap,
StrokeStyle,
Expand All @@ -20,6 +21,7 @@ import { useCallback, useMemo } from 'react';

import { DropdownMenu } from '../menu';
import { menuTrigger, settingWrapper } from '../style.css';
import { useColor } from '../utils';
import { Point } from './point';
import { EdgelessSnapshot } from './snapshot';

Expand All @@ -46,6 +48,7 @@ export const NoteSettings = () => {
const framework = useFramework();
const { editorSetting } = framework.get(EditorSettingService);
const settings = useLiveData(editorSetting.settings$);
const getColorFromMap = useColor();

const borderStyleItems = useMemo<RadioItem[]>(
() => [
Expand Down Expand Up @@ -160,10 +163,8 @@ export const NoteSettings = () => {

const currentColor = useMemo(() => {
const { background } = settings['affine:note'];
return Object.entries(NoteBackgroundColor).find(
([, value]) => value === background
);
}, [settings]);
return getColorFromMap(background, NoteBackgroundColorMap);
}, [getColorFromMap, settings]);

return (
<>
Expand All @@ -183,9 +184,9 @@ export const NoteSettings = () => {
trigger={
<MenuTrigger
className={menuTrigger}
prefix={<Point color={currentColor[1]} />}
prefix={<Point color={currentColor.value} />}
>
{currentColor[0]}
{currentColor.key}
</MenuTrigger>
}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,29 @@ import { MenuItem, MenuTrigger, Slider } from '@affine/component';
import { SettingRow } from '@affine/component/setting-components';
import { EditorSettingService } from '@affine/core/modules/editor-settting';
import { useI18n } from '@affine/i18n';
import { LineColor } from '@blocksuite/blocks';
import { LineColor, LineColorMap } from '@blocksuite/blocks';
import { useFramework, useLiveData } from '@toeverything/infra';
import { useTheme } from 'next-themes';
import { useCallback, useMemo } from 'react';

import { DropdownMenu } from '../menu';
import { menuTrigger } from '../style.css';
import { useColor } from '../utils';
import { Point } from './point';
import { EdgelessSnapshot } from './snapshot';

export const PenSettings = () => {
const t = useI18n();
const framework = useFramework();
const { editorSetting } = framework.get(EditorSettingService);
const { resolvedTheme } = useTheme();
const settings = useLiveData(editorSetting.settings$);

const color = useMemo(() => {
if (typeof settings.brush.color === 'string') {
return settings.brush.color;
} else {
return resolvedTheme === 'dark' ? LineColor.White : LineColor.Black;
}
}, [resolvedTheme, settings.brush.color]);
const getColorFromMap = useColor();

const currentColor = useMemo(() => {
return Object.entries(LineColor).find(([, value]) => value === color);
}, [color]);
return getColorFromMap(settings.brush.color, LineColorMap);
}, [getColorFromMap, settings.brush.color]);

const colorItems = useMemo(() => {
const { color } = settings.brush;
return Object.entries(LineColor).map(([name, value]) => {
const handler = () => {
editorSetting.set('brush', { color: value });
Expand All @@ -48,7 +41,7 @@ export const PenSettings = () => {
</MenuItem>
);
});
}, [color, editorSetting]);
}, [editorSetting, settings.brush]);

const borderThickness = settings.brush.lineWidth;
const setBorderThickness = useCallback(
Expand All @@ -75,9 +68,9 @@ export const PenSettings = () => {
trigger={
<MenuTrigger
className={menuTrigger}
prefix={<Point color={currentColor[1]} />}
prefix={<Point color={currentColor.value} />}
>
{currentColor[0]}
{currentColor.key}
</MenuTrigger>
}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,15 @@ import {
FontWeight,
FontWeightMap,
LineColor,
LineColorMap,
TextAlign,
} from '@blocksuite/blocks';
import { useFramework, useLiveData } from '@toeverything/infra';
import { useCallback, useMemo } from 'react';

import { DropdownMenu } from '../menu';
import { menuTrigger, settingWrapper } from '../style.css';
import { useColor } from '../utils';
import { Point } from './point';
import { EdgelessSnapshot } from './snapshot';

Expand All @@ -29,6 +31,7 @@ export const TextSettings = () => {
const framework = useFramework();
const { editorSetting } = framework.get(EditorSettingService);
const settings = useLiveData(editorSetting.settings$);
const getColorFromMap = useColor();

const alignItems = useMemo<RadioItem[]>(
() => [
Expand Down Expand Up @@ -134,8 +137,8 @@ export const TextSettings = () => {

const currentColor = useMemo(() => {
const { color } = settings['affine:edgeless-text'];
return Object.entries(LineColor).find(([, value]) => value === color);
}, [settings]);
return getColorFromMap(color, LineColorMap);
}, [getColorFromMap, settings]);
return (
<>
<EdgelessSnapshot
Expand All @@ -152,9 +155,9 @@ export const TextSettings = () => {
trigger={
<MenuTrigger
className={menuTrigger}
prefix={<Point color={currentColor[1]} />}
prefix={<Point color={currentColor.value} />}
>
{currentColor[0]}
{currentColor.key}
</MenuTrigger>
}
/>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { useTheme } from 'next-themes';

function getColorFromMap(
color: string | { normal: string } | { light: string; dark: string },
colorMap: { [key: string]: string },
theme: 'light' | 'dark' = 'light'
):
| {
value: string;
key: string;
}
| undefined {
if (typeof color === 'string') {
return { value: color, key: colorMap[color] };
}

if ('normal' in color) {
return {
value: color.normal,
key: colorMap[color.normal],
};
}

if ('light' in color && 'dark' in color) {
return {
value: color[theme],
key: colorMap[color[theme]],
};
}

return undefined;
}

export const useColor = () => {
const { resolvedTheme } = useTheme();
return (
color: string | { normal: string } | { light: string; dark: string },
colorMap: { [key: string]: string }
) =>
getColorFromMap(
color,
colorMap,
resolvedTheme as 'light' | 'dark' | undefined
);
};

0 comments on commit 92790c2

Please sign in to comment.