diff --git a/web/src/beta/features/Editor/tabs/widgets/SidePanel/Settings/hooks.ts b/web/src/beta/components/fields/PropertyFields/hooks.ts similarity index 91% rename from web/src/beta/features/Editor/tabs/widgets/SidePanel/Settings/hooks.ts rename to web/src/beta/components/fields/PropertyFields/hooks.ts index d3d2beed4..1a553e230 100644 --- a/web/src/beta/features/Editor/tabs/widgets/SidePanel/Settings/hooks.ts +++ b/web/src/beta/components/fields/PropertyFields/hooks.ts @@ -14,8 +14,9 @@ export default () => { vt: ValueType, itemId?: string, ) => { - return async (v?: ValueTypes[ValueType]) => + return async (v?: ValueTypes[ValueType]) => { await useUpdatePropertyValue(propertyId, schemaGroupId, itemId, fieldId, "en", v, vt); + }; }, [useUpdatePropertyValue], ); diff --git a/web/src/beta/components/fields/PropertyFields/index.tsx b/web/src/beta/components/fields/PropertyFields/index.tsx new file mode 100644 index 000000000..d927a6f49 --- /dev/null +++ b/web/src/beta/components/fields/PropertyFields/index.tsx @@ -0,0 +1,51 @@ +import TextInput from "@reearth/beta/components/fields/TextInput"; +import { type Item } from "@reearth/services/api/propertyApi/utils"; + +import ColorField from "../ColorField"; + +import useHooks from "./hooks"; + +type Props = { + propertyId: string; + item?: Item; +}; + +const PropertyFields: React.FC = ({ propertyId, item }) => { + const { handlePropertyValueUpdate } = useHooks(); + + return ( + <> + {item?.schemaFields.map(sf => { + const isList = item && "items" in item; + const value = !isList ? item.fields.find(f => f.id === sf.id)?.value : sf.defaultValue; + return sf.type === "string" ? ( + sf.ui === "color" ? ( + + ) : sf.ui === "selection" || sf.choices ? ( +

Selection or choices field

+ ) : sf.ui === "buttons" ? ( +

Button radio field

+ ) : ( + + ) + ) : ( +

{sf.name} field

+ ); + })} + + ); +}; + +export default PropertyFields; diff --git a/web/src/beta/features/Editor/StoryPanel/Block/Template.tsx b/web/src/beta/features/Editor/StoryPanel/Block/Template.tsx index 80133cbcb..391e36ff4 100644 --- a/web/src/beta/features/Editor/StoryPanel/Block/Template.tsx +++ b/web/src/beta/features/Editor/StoryPanel/Block/Template.tsx @@ -17,6 +17,7 @@ export default Template; const Wrapper = styled.div` display: flex; + height: 255px; justify-content: center; align-items: center; flex: 1; diff --git a/web/src/beta/features/Editor/StoryPanel/Block/builtin/Image/index.tsx b/web/src/beta/features/Editor/StoryPanel/Block/builtin/Image/index.tsx index c496cc29a..8d3148e01 100644 --- a/web/src/beta/features/Editor/StoryPanel/Block/builtin/Image/index.tsx +++ b/web/src/beta/features/Editor/StoryPanel/Block/builtin/Image/index.tsx @@ -1,41 +1,26 @@ -import { useCallback } from "react"; +import { useMemo } from "react"; +import { ValueTypes } from "@reearth/beta/utils/value"; import { styled } from "@reearth/services/theme"; import { CommonProps as BlockProps } from "../../types"; -import BlockWrapper from "../Builtin/Wrapper"; +import BlockWrapper from "../common/Wrapper"; +import { getFieldValue } from "../utils"; -export type Props = BlockProps; - -type Spacing = { - top: number; - bottom: number; - left: number; - right: number; -}; - -export type Property = { - src?: string; - padding: Spacing; -}; - -const ImageBlock: React.FC = ({ block, isSelected, onClick, onRemove }) => { - const { - // src = "https://upload.wikimedia.org/wikipedia/en/a/a5/Pok%C3%A9mon_Charmander_art.png", - src, - padding = { top: 10, bottom: 20, left: 30, right: 10 }, - } = block?.property ?? {}; - - const handleRemove = useCallback(() => onRemove?.(block?.id), [block?.id, onRemove]); +const ImageBlock: React.FC = ({ block, isSelected, ...props }) => { + const src = useMemo( + () => getFieldValue(block?.property?.items ?? [], "src") as ValueTypes["string"], + [block?.property?.items], + ); return ( + propertyId={block?.property?.id} + propertyItems={block?.property?.items} + {...props}> {src && } ); diff --git a/web/src/beta/features/Editor/StoryPanel/Block/builtin/Text/index.tsx b/web/src/beta/features/Editor/StoryPanel/Block/builtin/Text/index.tsx index 3a53bc7af..a6f8936fc 100644 --- a/web/src/beta/features/Editor/StoryPanel/Block/builtin/Text/index.tsx +++ b/web/src/beta/features/Editor/StoryPanel/Block/builtin/Text/index.tsx @@ -1,23 +1,34 @@ -import { useCallback } from "react"; +import { useMemo } from "react"; -import { CommonProps as BlockProps } from "../../types"; -import BlockWrapper from "../Builtin/Wrapper"; +import Text from "@reearth/beta/components/Text"; +import { ValueTypes } from "@reearth/beta/utils/value"; -export type Props = BlockProps; +import { CommonProps as BlockProps } from "../../types"; +import BlockWrapper from "../common/Wrapper"; +import { getFieldValue } from "../utils"; -export type Property = {}; +export type Props = BlockProps; -const TextBlock: React.FC = ({ block, isSelected, onClick, onRemove }) => { - const handleRemove = useCallback(() => onRemove?.(block?.id), [block?.id, onRemove]); +const TextBlock: React.FC = ({ block, isSelected, ...props }) => { + const text = useMemo( + () => getFieldValue(block?.property?.items ?? [], "text") as ValueTypes["string"], + [block?.property?.items], + ); return ( + propertyId={block?.property?.id} + propertyItems={block?.property?.items} + {...props}> + {text && ( + + {text} + + )} + ); }; diff --git a/web/src/beta/features/Editor/StoryPanel/Block/builtin/Builtin/ActionPanel/hooks.ts b/web/src/beta/features/Editor/StoryPanel/Block/builtin/common/ActionPanel/hooks.ts similarity index 100% rename from web/src/beta/features/Editor/StoryPanel/Block/builtin/Builtin/ActionPanel/hooks.ts rename to web/src/beta/features/Editor/StoryPanel/Block/builtin/common/ActionPanel/hooks.ts diff --git a/web/src/beta/features/Editor/StoryPanel/Block/builtin/Builtin/ActionPanel/index.tsx b/web/src/beta/features/Editor/StoryPanel/Block/builtin/common/ActionPanel/index.tsx similarity index 89% rename from web/src/beta/features/Editor/StoryPanel/Block/builtin/Builtin/ActionPanel/index.tsx rename to web/src/beta/features/Editor/StoryPanel/Block/builtin/common/ActionPanel/index.tsx index ca4738142..ae0f4c553 100644 --- a/web/src/beta/features/Editor/StoryPanel/Block/builtin/Builtin/ActionPanel/index.tsx +++ b/web/src/beta/features/Editor/StoryPanel/Block/builtin/common/ActionPanel/index.tsx @@ -1,9 +1,11 @@ import { Dispatch, Fragment, SetStateAction } from "react"; +import FieldComponents from "@reearth/beta/components/fields/PropertyFields"; import Icon from "@reearth/beta/components/Icon"; import * as Popover from "@reearth/beta/components/Popover"; import PopoverMenuContent from "@reearth/beta/components/PopoverMenuContent"; import Text from "@reearth/beta/components/Text"; +import { Item } from "@reearth/services/api/propertyApi/utils"; import { useT } from "@reearth/services/i18n"; import { styled } from "@reearth/services/theme"; @@ -16,6 +18,8 @@ type Props = { showSettings?: boolean; showPadding?: boolean; editMode: boolean; + propertyId?: string; + panelSettings?: Item; setShowPadding: Dispatch>; onEditModeToggle: () => void; onSettingsToggle: () => void; @@ -29,6 +33,8 @@ const ActionPanel: React.FC = ({ showSettings, showPadding, editMode, + propertyId, + panelSettings, setShowPadding, onEditModeToggle, onSettingsToggle, @@ -75,11 +81,15 @@ const ActionPanel: React.FC = ({ - Padding settings + {panelSettings?.title} setShowPadding(false)} /> - Padding + {propertyId && panelSettings && ( + + + + )} ) : ( void) | undefined; + propertyId?: string; + propertyItems?: Item[]; + onClick?: () => void; + onClickAway?: () => void; onRemove?: () => void; }; const BlockWrapper: React.FC = ({ title, icon, - padding, isSelected, children, + propertyId, + propertyItems, onClick, + onClickAway, onRemove, }) => { const { @@ -38,6 +45,9 @@ const BlockWrapper: React.FC = ({ editMode, showSettings, showPadding, + defaultSettings, + panelSettings, + padding, setShowPadding, handleMouseEnter, handleMouseLeave, @@ -46,37 +56,42 @@ const BlockWrapper: React.FC = ({ handleSettingsToggle, } = useHooks({ isSelected, + propertyItems, onClick, }); return ( - - {(isHovered || isSelected) && ( - - )} - - {children ??