diff --git a/src/components/conversations/ConversationSidebar.tsx b/src/components/conversations/ConversationSidebar.tsx index c700cee..de63aea 100644 --- a/src/components/conversations/ConversationSidebar.tsx +++ b/src/components/conversations/ConversationSidebar.tsx @@ -1,14 +1,53 @@ -import { For } from 'solid-js' +import { For, onMount } from 'solid-js' import { useStore } from '@nanostores/solid' import { useI18n } from '@/hooks' import { conversationMapSortList } from '@/stores/conversation' import ConversationSidebarItem from './ConversationSidebarItem' import ConversationSidebarAdd from './ConversationSidebarAdd' +import { addConversation } from '@/stores/conversation' export default () => { const { t } = useI18n() const $conversationMapSortList = useStore(conversationMapSortList) + //设置副标题数字 + const setNameNum = (setName: string, numList: any) => { + let list = conversationMapSortList.get() + let title = '' + let count = 0 + numList.map((res: number) => { + let regex1 = new RegExp("" + setName + '\\(\\d+\\)', 'g') + let seachText = list[res].name.match(regex1) || 'null' + let num = seachText[0].match(/\(\d+\)/g) || 'null' + if (num !== 'null') { + count = Math.max(count, Number(num[0].replace('(', '').replace(')', ''))) + console.log(count, Number(num[0].replace('(', '').replace(')', ''))) + } + }) + title = `${setName}(${count + 1})` + return title + } + + //查重 + const checkName = (name: string, setName: string) => { + let setNameReg = new RegExp(setName, 'g') + if (setNameReg.test(name) && name.replace(/\(\d+\)/g, '') === setName) { + return true + } + } + + onMount(() => { + setTimeout(() => { + let itemList = conversationMapSortList.get() + let setName = '1' + let numList: number[] = [] + itemList.map((res, i) => { + if (checkName(res.name, setName)) numList.push(i) + }) + addConversation({name:setNameNum(setName, numList)}) + }, 1000) + }) + return ( <div class="h-full flex flex-col bg-sidebar"> <header class="h-14 fi justify-between px-4 text-xs uppercase"> diff --git a/src/components/conversations/ConversationSidebarAdd.tsx b/src/components/conversations/ConversationSidebarAdd.tsx index c10481a..14dca6d 100644 --- a/src/components/conversations/ConversationSidebarAdd.tsx +++ b/src/components/conversations/ConversationSidebarAdd.tsx @@ -1,13 +1,14 @@ import { useI18n } from '@/hooks' import { addConversation } from '@/stores/conversation' import Button from '../ui/Button' +import { onMount } from 'solid-js' export default () => { const { t } = useI18n() const handleAdd = () => { addConversation() } - + return ( <Button icon="i-carbon-add" diff --git a/src/pages/chat/components/dataList.tsx b/src/pages/chat/components/dataList.tsx new file mode 100644 index 0000000..49c2099 --- /dev/null +++ b/src/pages/chat/components/dataList.tsx @@ -0,0 +1,26 @@ +import { For, createSignal, createEffect } from 'solid-js' +import ConversationSidebarItem from './listItem' +import { createStore } from "solid-js/store"; +import '../css/list.css' + + +export default () => { + // dataItemLists.set([{id:'1'},{id:'2'},{id:'3'},{id:'4'},{id:'5'},{id:'6'}]) + const [list, setList] = createStore({ + data: [{ id: '1', Topping: false }, { id: '2', Topping: false }, { id: '3', Topping: false }, { id: '4', Topping: false }, { id: '5', Topping: false }, { id: '6', Topping: false }] + }) + + return ( + <div class="h-full flex flex-col bg-sidebar max-w-350 min-w-260"> + <div class="flex-1 overflow-auto"> + <div class="px-2"> + <For each={list.data}> + {(instance, i) => ( + <ConversationSidebarItem instanceData={{ ...instance }} infoList={list.data} key={i as any} setList={setList} /> + )} + </For> + </div> + </div> + </div> + ) +} diff --git a/src/pages/chat/components/listItem.tsx b/src/pages/chat/components/listItem.tsx new file mode 100644 index 0000000..b65b611 --- /dev/null +++ b/src/pages/chat/components/listItem.tsx @@ -0,0 +1,106 @@ +import { keys } from 'idb-keyval' +import '../css/list.css' +import { createSignal } from 'solid-js' + +type dataList = { + id: string +} + +interface Props { + instanceData: Omit<dataList, 'messages'> & { + current?: boolean, + Topping:boolean + }, + key: any, + setList:Function, + infoList:any +} + +export default ({ instanceData, key,setList,infoList }: Props) => { + + //设置数据 + const instanceItem=instanceData + let instance = instanceItem||{id:'',name:''} + const isTouchDevice = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0 + + const handleClick = () => { + // console.log(dataList) + } + + //获取置顶数据 + const getToppingItem=(arr:any)=>{ + let toppingArr: {id:string,Topping:boolean}[]=[] + arr.map((res: { Topping: boolean; id: string },i:number)=>{ + if(res.Topping){ + toppingArr.push(arr.splice(i,1)[0] as {Topping: boolean; id: string}) + } + }) + return toppingArr + } + + //删除记录 + const handleDelete = (e: MouseEvent, key:string) => { + let arr=JSON.parse(JSON.stringify(infoList)) + arr.splice(key,1) + setList('data',(list: null[])=> [...arr]) + e.stopPropagation() + } + + //置顶排序 + const setDataTop=(e:MouseEvent,key:string)=>{ + let arr=JSON.parse(JSON.stringify(infoList)) + let item = arr[key] + + item.Topping=!item.Topping + let toppindItem=getToppingItem(arr) + + setList('data',(list: null[])=> [...toppindItem,...arr]) + e.stopPropagation() + } + + //新建对话框 + const newlyAdded=()=>{ + window.open(`${location.protocol}//${location.host}` ) + } + + return ( + <div + class={[ + 'group fi h-10 my-0.5 px-2 gap-2 hv-base rounded-md' + ].join(' ')} + onClick={handleClick} + > + <div class="fcc w-8 h-8 rounded-full text-xl shrink-0"> + <div class="text-base i-carbon-chat" /> + </div> + <div class="flex-1 truncate text-sm">{instance.id as any}-{key}-{instance.Topping.toString()}</div> + + <div class={[isTouchDevice||instance.Topping.toString()=='true' ? '' : 'hidden group-hover:block'].join('')}> + <div + class="inline-flex p-2 items-center gap-1 rounded-md hv-base" + onClick={()=>newlyAdded()} + > + <div class='add-new-icon'></div> + </div> + </div> + + <div class={[isTouchDevice||instance.Topping.toString()=='true' ? '' : 'hidden group-hover:block'].join('')}> + <div + class="inline-flex p-2 items-center gap-1 rounded-md hv-base" + onClick={e => setDataTop(e,key())} + > + <div class='list-top-icon'></div> + </div> + </div> + + <div class={isTouchDevice ? '' : 'hidden group-hover:block'}> + <div + class="inline-flex p-2 items-center gap-1 rounded-md hv-base" + onClick={e => handleDelete(e, key())} + > + <div class="i-carbon-close" /> + </div> + </div> + </div> + ) +} diff --git a/src/pages/chat/css/list.css b/src/pages/chat/css/list.css new file mode 100644 index 0000000..4068f11 --- /dev/null +++ b/src/pages/chat/css/list.css @@ -0,0 +1,26 @@ +.w-100{ + width:100%; +} +.max-w-350{ + max-width: 22rem; +} +.min-w-260{ + min-width: 16.25rem; +} +.list-top-icon{ + width:1rem ; + height:1rem; + background: url('../img/posTop.svg') no-repeat; + background-position: center; + background-size: 1rem 1rem; +} +.add-new-icon{ + width:1rem ; + height:1rem; + background: url('../img/addIcon.svg') no-repeat; + background-position: center; + background-size: 1rem 1rem; +} +.block{ + display: block !important; +} \ No newline at end of file diff --git a/src/pages/chat/datalist.astro b/src/pages/chat/datalist.astro new file mode 100644 index 0000000..b435cbb --- /dev/null +++ b/src/pages/chat/datalist.astro @@ -0,0 +1,21 @@ +--- +import Layout from '@/layouts/Layout.astro' +import Main from '@/components/Main.astro' +import ConversationSidebar from './components/dataList' +import ModalsLayer from '@/components/ModalsLayer' +import Sidebar from '@/components/ui/Sidebar' +import BuildStores from '@/components/client-only/BuildStores' +import './css/list.css' + +--- + +<Layout title="Ansnid"> + <div class="h-100vh w-screen flex"> + <Sidebar direction="left" class='w-100'> + <ConversationSidebar client:only="solid-js" /> + </Sidebar> + <!-- <Main /> --> + </div> + <!-- <ModalsLayer client:only /> + <BuildStores client:only /> --> +</Layout> diff --git a/src/pages/chat/img/addIcon.svg b/src/pages/chat/img/addIcon.svg new file mode 100644 index 0000000..2f6e8ee --- /dev/null +++ b/src/pages/chat/img/addIcon.svg @@ -0,0 +1 @@ +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1692260674514" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2533" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M801.171 483.589H544V226.418c0-17.673-14.327-32-32-32s-32 14.327-32 32v257.171H222.83c-17.673 0-32 14.327-32 32s14.327 32 32 32H480v257.17c0 17.673 14.327 32 32 32s32-14.327 32-32v-257.17h257.171c17.673 0 32-14.327 32-32s-14.327-32-32-32z" fill="#7f7f7f" p-id="2534"></path></svg> \ No newline at end of file diff --git a/src/pages/chat/img/posTop.svg b/src/pages/chat/img/posTop.svg new file mode 100644 index 0000000..eb32bdc --- /dev/null +++ b/src/pages/chat/img/posTop.svg @@ -0,0 +1 @@ +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1692176199970" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4216" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M43.072 974.72l380.864-301.952 151.936 161.6c0 0 63.424 17.28 67.328-30.72l-3.904-163.584 225.088-259.648 98.048-5.696c0 0 76.928-15.488 21.184-82.752l-275.072-276.928c0 0-74.944-9.6-69.248 59.584l0 75.008L383.552 367.104 225.856 376.64c0 0-57.728 19.2-36.608 69.248l148.16 146.176L43.072 974.72 43.072 974.72z" fill="#7F7F7F" p-id="4217"></path></svg> \ No newline at end of file