feat: manually mirror opencoze's code from bytedance
Change-Id: I09a73aadda978ad9511264a756b2ce51f5761adf
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
.mask {
|
||||
pointer-events: none;
|
||||
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
|
||||
width: 100%;
|
||||
height: 216px;
|
||||
|
||||
background: linear-gradient(180deg, rgba(99, 99, 99, 40%) 0%, rgba(99, 99, 99, 0%) 100%);
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright 2025 coze-dev Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { useShallow } from 'zustand/react/shallow';
|
||||
import { WithRuleImgBackground } from '@coze-common/chat-uikit';
|
||||
import {
|
||||
type CustomComponent,
|
||||
useReadonlyPlugin,
|
||||
PluginName,
|
||||
} from '@coze-common/chat-area';
|
||||
|
||||
import { type BackgroundPluginBizContext } from '../../types/biz-context';
|
||||
|
||||
import styles from './index.module.less';
|
||||
|
||||
export const ChatBackgroundUI: CustomComponent['MessageListFloatSlot'] = ({
|
||||
headerNode,
|
||||
}) => {
|
||||
const plugin = useReadonlyPlugin<BackgroundPluginBizContext>(
|
||||
PluginName.ChatBackground,
|
||||
);
|
||||
const { useChatBackgroundContext } = plugin.pluginBizContext.storeSet;
|
||||
const backgroundImageInfo = useChatBackgroundContext(
|
||||
useShallow(state => state.backgroundImageInfo),
|
||||
);
|
||||
const isBackgroundMode =
|
||||
!!backgroundImageInfo?.mobile_background_image?.origin_image_url;
|
||||
|
||||
return isBackgroundMode ? (
|
||||
<>
|
||||
{headerNode ? <div className={styles.mask}></div> : null}
|
||||
<WithRuleImgBackground backgroundInfo={backgroundImageInfo} />
|
||||
</>
|
||||
) : null;
|
||||
};
|
||||
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright 2025 coze-dev Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import mitt from 'mitt';
|
||||
import { type PluginRegistryEntry } from '@coze-common/chat-area';
|
||||
|
||||
import {
|
||||
type BackgroundPluginBizContext,
|
||||
type ChatBackgroundEvent,
|
||||
} from './types/biz-context';
|
||||
import { createBackgroundImageStore } from './store';
|
||||
import { BizPlugin } from './plugin';
|
||||
|
||||
export const chatBackgroundEvent = mitt<ChatBackgroundEvent>();
|
||||
export {
|
||||
ChatBackgroundEvent,
|
||||
ChatBackgroundEventName,
|
||||
} from './types/biz-context';
|
||||
|
||||
export const createChatBackgroundPlugin = () => {
|
||||
const useChatBackgroundContext = createBackgroundImageStore('chatBackground');
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention -- 插件命名大写开头符合预期
|
||||
const ChatBackgroundPlugin: PluginRegistryEntry<BackgroundPluginBizContext> =
|
||||
{
|
||||
createPluginBizContext() {
|
||||
return {
|
||||
storeSet: {
|
||||
useChatBackgroundContext,
|
||||
},
|
||||
chatBackgroundEvent,
|
||||
};
|
||||
},
|
||||
Plugin: BizPlugin,
|
||||
};
|
||||
return {
|
||||
ChatBackgroundPlugin,
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright 2025 coze-dev Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import {
|
||||
PluginMode,
|
||||
PluginName,
|
||||
ReadonlyChatAreaPlugin,
|
||||
createCustomComponents,
|
||||
createReadonlyLifeCycleServices,
|
||||
type ReadonlyLifeCycleServiceGenerator,
|
||||
} from '@coze-common/chat-area';
|
||||
|
||||
import { type BackgroundPluginBizContext } from './types/biz-context';
|
||||
import { bizAppLifeCycleService } from './services/life-cycle/app';
|
||||
import { ChatBackgroundUI } from './custom-components/chat-background-ui';
|
||||
|
||||
export const bizLifeCycleServiceGenerator: ReadonlyLifeCycleServiceGenerator<
|
||||
BackgroundPluginBizContext
|
||||
> = plugin => ({
|
||||
appLifeCycleService: bizAppLifeCycleService(plugin),
|
||||
});
|
||||
|
||||
export class BizPlugin extends ReadonlyChatAreaPlugin<BackgroundPluginBizContext> {
|
||||
public pluginMode = PluginMode.Readonly;
|
||||
|
||||
public pluginName = PluginName.ChatBackground;
|
||||
|
||||
public lifeCycleServices = createReadonlyLifeCycleServices(
|
||||
this,
|
||||
bizLifeCycleServiceGenerator,
|
||||
);
|
||||
|
||||
public customComponents = createCustomComponents({
|
||||
MessageListFloatSlot: ChatBackgroundUI,
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright 2025 coze-dev Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { type ReadonlyAppLifeCycleServiceGenerator } from '@coze-common/chat-area';
|
||||
|
||||
import {
|
||||
ChatBackgroundEventName,
|
||||
type BackgroundPluginBizContext,
|
||||
} from '../../types/biz-context';
|
||||
|
||||
export const bizAppLifeCycleService: ReadonlyAppLifeCycleServiceGenerator<
|
||||
BackgroundPluginBizContext
|
||||
> = plugin => ({
|
||||
onBeforeInitial: () => {
|
||||
const { chatBackgroundEvent, storeSet } = plugin.pluginBizContext;
|
||||
|
||||
const { setBackgroundInfo } = storeSet.useChatBackgroundContext.getState();
|
||||
|
||||
chatBackgroundEvent.on(
|
||||
ChatBackgroundEventName.OnBackgroundChange,
|
||||
backgroundInfo => {
|
||||
setBackgroundInfo(backgroundInfo);
|
||||
},
|
||||
);
|
||||
},
|
||||
|
||||
onAfterInitial: ctx => {
|
||||
const { setBackgroundInfo, clearBackgroundStore } =
|
||||
plugin.pluginBizContext.storeSet.useChatBackgroundContext.getState();
|
||||
const ctxBackgroundInfo = ctx.messageListFromService.backgroundInfo;
|
||||
if (ctxBackgroundInfo) {
|
||||
setBackgroundInfo(ctxBackgroundInfo);
|
||||
} else {
|
||||
clearBackgroundStore();
|
||||
}
|
||||
},
|
||||
|
||||
onBeforeDestroy: () => {
|
||||
const { chatBackgroundEvent } = plugin.pluginBizContext;
|
||||
chatBackgroundEvent.all.clear();
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright 2025 coze-dev Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { devtools } from 'zustand/middleware';
|
||||
import { create } from 'zustand';
|
||||
import { type BackgroundImageInfo } from '@coze-arch/bot-api/developer_api';
|
||||
|
||||
interface BackgroundImageState {
|
||||
backgroundImageInfo: BackgroundImageInfo;
|
||||
}
|
||||
|
||||
interface BackgroundImageAction {
|
||||
setBackgroundInfo: (backgroundImageInfo: BackgroundImageInfo) => void;
|
||||
clearBackgroundStore: () => void;
|
||||
}
|
||||
|
||||
export const createBackgroundImageStore = (mark: string) =>
|
||||
create<BackgroundImageState & BackgroundImageAction>()(
|
||||
devtools(
|
||||
set => ({
|
||||
backgroundImageInfo: {
|
||||
mobile_background_image: {},
|
||||
web_background_image: {},
|
||||
},
|
||||
clearBackgroundStore: () =>
|
||||
set(
|
||||
{
|
||||
backgroundImageInfo: {
|
||||
mobile_background_image: {},
|
||||
web_background_image: {},
|
||||
},
|
||||
},
|
||||
false,
|
||||
'clearBackgroundStore',
|
||||
),
|
||||
setBackgroundInfo: info => {
|
||||
set({ backgroundImageInfo: info }, false, 'setBackgroundInfo');
|
||||
},
|
||||
}),
|
||||
{
|
||||
name: `botStudio.ChatBackground.${mark}`,
|
||||
enabled: IS_DEV_MODE,
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
export type BackgroundImageStore = ReturnType<
|
||||
typeof createBackgroundImageStore
|
||||
>;
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright 2025 coze-dev Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { type Emitter } from 'mitt';
|
||||
import { type BackgroundImageInfo } from '@coze-arch/bot-api/developer_api';
|
||||
|
||||
import { type BackgroundImageStore } from '../store';
|
||||
|
||||
export enum ChatBackgroundEventName {
|
||||
OnBackgroundChange = 'onBackgroundChange',
|
||||
}
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
|
||||
export type ChatBackgroundEvent = {
|
||||
[ChatBackgroundEventName.OnBackgroundChange]: BackgroundImageInfo;
|
||||
};
|
||||
|
||||
export interface BackgroundPluginBizContext {
|
||||
storeSet: {
|
||||
useChatBackgroundContext: BackgroundImageStore;
|
||||
};
|
||||
chatBackgroundEvent: Emitter<ChatBackgroundEvent>;
|
||||
}
|
||||
17
frontend/packages/common/chat-area/plugin-chat-background/src/typings.d.ts
vendored
Normal file
17
frontend/packages/common/chat-area/plugin-chat-background/src/typings.d.ts
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Copyright 2025 coze-dev Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/// <reference types='@coze-arch/bot-typings' />
|
||||
Reference in New Issue
Block a user