parent
e654cee3c8
commit
aeb986243c
@ -0,0 +1,100 @@
|
|||||||
|
.new-chat {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
padding-top: 80px;
|
||||||
|
|
||||||
|
.mask-cards {
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.mask-card {
|
||||||
|
padding: 20px 10px;
|
||||||
|
border: var(--border-in-light);
|
||||||
|
box-shadow: var(--card-shadow);
|
||||||
|
border-radius: 14px;
|
||||||
|
background-color: var(--white);
|
||||||
|
transform: scale(1);
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
transform: rotate(-15deg) translateY(5px);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
transform: rotate(15deg) translateY(5px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 32px;
|
||||||
|
font-weight: bolder;
|
||||||
|
animation: slide-in ease 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sub-title {
|
||||||
|
animation: slide-in ease 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-bar {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.masks {
|
||||||
|
flex-grow: 1;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
align-items: center;
|
||||||
|
padding-top: 20px;
|
||||||
|
|
||||||
|
animation: slide-in ease 0.3s;
|
||||||
|
|
||||||
|
.mask-row {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
@for $i from 1 to 10 {
|
||||||
|
&:nth-child(#{$i * 2}) {
|
||||||
|
margin-left: 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mask {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 10px 16px;
|
||||||
|
border: var(--border-in-light);
|
||||||
|
box-shadow: var(--card-shadow);
|
||||||
|
background-color: var(--white);
|
||||||
|
border-radius: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
width: 100px;
|
||||||
|
transform: scale(1);
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all ease 0.3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-5px) scale(1.1);
|
||||||
|
z-index: 999;
|
||||||
|
border-color: var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.mask-avatar {
|
||||||
|
display: flex;
|
||||||
|
min-width: 18px;
|
||||||
|
min-height: 18px;
|
||||||
|
background-color: #eee;
|
||||||
|
border-radius: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mask-name {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
import { Mask } from "./store/mask";
|
||||||
|
|
||||||
|
export const BUILT_IN_MASKS: Mask[] = [];
|
||||||
@ -0,0 +1,81 @@
|
|||||||
|
import { create } from "zustand";
|
||||||
|
import { persist } from "zustand/middleware";
|
||||||
|
import { getLang, Lang } from "../locales";
|
||||||
|
import { Message } from "./chat";
|
||||||
|
import { ModelConfig, useAppConfig } from "./config";
|
||||||
|
|
||||||
|
export const MASK_KEY = "mask-store";
|
||||||
|
|
||||||
|
export type Mask = {
|
||||||
|
id: number;
|
||||||
|
avatar: string;
|
||||||
|
name: string;
|
||||||
|
context: Message[];
|
||||||
|
config: ModelConfig;
|
||||||
|
lang: Lang;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const DEFAULT_MASK_STATE = {
|
||||||
|
masks: {} as Record<number, Mask>,
|
||||||
|
globalMaskId: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
export type MaskState = typeof DEFAULT_MASK_STATE;
|
||||||
|
type MaskStore = MaskState & {
|
||||||
|
create: (mask: Partial<Mask>) => Mask;
|
||||||
|
update: (id: number, updater: (mask: Mask) => void) => void;
|
||||||
|
delete: (id: number) => void;
|
||||||
|
search: (text: string) => Mask[];
|
||||||
|
getAll: () => Mask[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useMaskStore = create<MaskStore>()(
|
||||||
|
persist(
|
||||||
|
(set, get) => ({
|
||||||
|
...DEFAULT_MASK_STATE,
|
||||||
|
|
||||||
|
create(mask) {
|
||||||
|
set(() => ({ globalMaskId: get().globalMaskId + 1 }));
|
||||||
|
const id = get().globalMaskId;
|
||||||
|
const masks = get().masks;
|
||||||
|
masks[id] = {
|
||||||
|
id,
|
||||||
|
avatar: "1f916",
|
||||||
|
name: "",
|
||||||
|
config: useAppConfig.getState().modelConfig,
|
||||||
|
context: [],
|
||||||
|
lang: getLang(),
|
||||||
|
...mask,
|
||||||
|
};
|
||||||
|
|
||||||
|
set(() => ({ masks }));
|
||||||
|
|
||||||
|
return masks[id];
|
||||||
|
},
|
||||||
|
update(id, updater) {
|
||||||
|
const masks = get().masks;
|
||||||
|
const mask = masks[id];
|
||||||
|
if (!mask) return;
|
||||||
|
const updateMask = { ...mask };
|
||||||
|
updater(updateMask);
|
||||||
|
masks[id] = updateMask;
|
||||||
|
set(() => ({ masks }));
|
||||||
|
},
|
||||||
|
delete(id) {
|
||||||
|
const masks = get().masks;
|
||||||
|
delete masks[id];
|
||||||
|
set(() => ({ masks }));
|
||||||
|
},
|
||||||
|
getAll() {
|
||||||
|
return Object.values(get().masks).sort((a, b) => a.id - b.id);
|
||||||
|
},
|
||||||
|
search(text) {
|
||||||
|
return Object.values(get().masks);
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
name: MASK_KEY,
|
||||||
|
version: 2,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
Loading…
Reference in new issue