diff --git a/src/components/conversations/ConversationSidebar.tsx b/src/components/conversations/ConversationSidebar.tsx index de63aea..bd7032a 100644 --- a/src/components/conversations/ConversationSidebar.tsx +++ b/src/components/conversations/ConversationSidebar.tsx @@ -24,7 +24,7 @@ export default () => { console.log(count, Number(num[0].replace('(', '').replace(')', ''))) } }) - title = `${setName}(${count + 1})` + title =count?`${setName}(${count + 1})`:`${setName}` return title } @@ -39,12 +39,17 @@ export default () => { onMount(() => { setTimeout(() => { let itemList = conversationMapSortList.get() - let setName = '1' + let setName = JSON.parse(sessionStorage.getItem('dialogueName') as any)||'未命名对话' let numList: number[] = [] itemList.map((res, i) => { - if (checkName(res.name, setName)) numList.push(i) + if (checkName(res.name, setName.name)) numList.push(i) }) - addConversation({name:setNameNum(setName, numList)}) + + if(setName.switch){ + addConversation({name:setNameNum(setName.name, numList)}) + setName.switch=false + sessionStorage.setItem('dialogueName',JSON.stringify({name:setName.name,switch:false})) + } }, 1000) }) diff --git a/src/http/api.ts b/src/http/api.ts index 217c310..a6d6c09 100644 --- a/src/http/api.ts +++ b/src/http/api.ts @@ -20,8 +20,8 @@ export function generateSessionId() { export function baseUrl(){ - // return 'https://ansnid.com'; - return ''; + return 'https://ansnid.com'; + // return ''; } export function getToken(){ diff --git a/src/pages/chat/components/dataList.tsx b/src/pages/chat/components/dataList.tsx index 49c2099..58b1237 100644 --- a/src/pages/chat/components/dataList.tsx +++ b/src/pages/chat/components/dataList.tsx @@ -1,7 +1,8 @@ -import { For, createSignal, createEffect } from 'solid-js' +import { For, createSignal, createEffect, Show, onMount } from 'solid-js' import ConversationSidebarItem from './listItem' import { createStore } from "solid-js/store"; import '../css/list.css' +import { fetchData } from '../../../http/api' export default () => { @@ -10,13 +11,143 @@ export default () => { 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 }] }) + type errorObj={ + show:boolean, + message:string + } + + let [errorShow, setErrorShow] = createSignal({ + show: false, + message: '' + }) + + const getList = () => { + fetchData({}, function (data) { + if (data.code === 200) { + setList('data', () => [...data.data]) + } + }, '/chat/api', 'GET'); + } + + //标题 + let dialogueName = '' + + //新建对话框 + const newlyAdded = () => { + window.open(`${location.protocol}//${location.host}`) + } + + //删除记录 + let deleteItem = { key: null, e: null } + const handleDelete = (e: MouseEvent, key: string) => { + let arr = JSON.parse(JSON.stringify(list)).data + fetchData({ + uniqid: arr[key].uniqid + }, function (data) { + if (data.code === 200) { + arr.splice(key, 1) + setList('data', (list) => [...arr]) + } + }, '/chat/delete', 'POST'); + + e.stopPropagation() + } + + //判断平台 + const isMobile = () => { + let flag = navigator.userAgent.match( + /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i + ); + return flag; + } + //弹窗 + let [pop, setPop] = createSignal(false) + let [popType, setPopType] = createSignal('open') + + const popShow = (type: string, e: any, key: number, name: string = '未命名对话') => { + setPopType(type) + if (type == 'delete') { + deleteItem['key'] = key as any + deleteItem['e'] = e + } + if (type === 'open') dialogueName = name + setPop(!pop()) + } + + //确认按钮 + const determineBtn = () => { + if (popType() === 'open') { + sessionStorage.setItem('dialogueName', JSON.stringify({ name: dialogueName, switch: true })) + if (isMobile()) { + location.pathname = '/' + } else { + newlyAdded() + } + } else if (popType() === 'delete') { + handleDelete(deleteItem['e'] as any, deleteItem['key'] as any) + } + setPop(false) + } + + //显示错误提示 + const setErrorFun=(message:string)=>{ + setErrorShow({ + message, + show:true + }) + } + + //提示弹窗 + const ErrorState = () => ( + <div class='tps-error-box'> + <div class="max-w-base h-full flex items-end flex-col justify-between gap-8 sm:(flex-row items-center) py-4 text-error text-sm" style="padding: 1rem;"> + <div class="flex-1 w-full"> + <div class="fi gap-0.5 mb-1"> + <span i-carbon-warning /> + <span class="font-semibold">{errorShow().message}</span> + </div> + </div> + <div class="border border-error px-2 py-1 rounded-md hv-base hover:bg-white" onClick={() => { setErrorShow({ show: false, message: errorShow().message }) }} > + Dismiss + </div> + </div> + </div> + ) + + onMount(() => { + getList() + }) + return ( <div class="h-full flex flex-col bg-sidebar max-w-350 min-w-260"> + <Show when={pop()}> + <div class='pop center-f'> + <div class='center-f text-box'> + <div> + <div class='pop-title'> + <Show when={popType() == 'open'}> + 是否创建新的窗口? + </Show> + <Show when={popType() == 'delete'}> + 是否删除分享记录? + </Show> + </div> + <div class='btn-box'> + <div class='btn center-f' onClick={determineBtn}>确认</div> + <div class='btn mg-l-80 center-f' onClick={() => setPop(false)}>取消</div> + </div> + </div> + </div> + </div> + </Show> + <Show when={errorShow().show}> + <ErrorState /> + </Show> <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} /> + <ConversationSidebarItem popShow={popShow} setErrorFun={setErrorFun} instanceData={{ ...instance }} infoList={list.data} key={i as any} setList={setList} /> )} </For> </div> diff --git a/src/pages/chat/components/listItem.tsx b/src/pages/chat/components/listItem.tsx index b65b611..4c75e0e 100644 --- a/src/pages/chat/components/listItem.tsx +++ b/src/pages/chat/components/listItem.tsx @@ -1,26 +1,26 @@ import { keys } from 'idb-keyval' import '../css/list.css' import { createSignal } from 'solid-js' +import { fetchData } from '../../../http/api' type dataList = { id: string } interface Props { - instanceData: Omit<dataList, 'messages'> & { - current?: boolean, - Topping:boolean - }, + instanceData: Omit<dataList, 'messages'> & {}, key: any, - setList:Function, - infoList:any + setList: Function, + infoList: any, + popShow: Function, + setErrorFun:Function } -export default ({ instanceData, key,setList,infoList }: Props) => { +export default ({ instanceData, key, setList, infoList, popShow,setErrorFun }: Props) => { //设置数据 - const instanceItem=instanceData - let instance = instanceItem||{id:'',name:''} + const instanceItem = instanceData + let instance = instanceItem || { id: '', name: '' } const isTouchDevice = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0 const handleClick = () => { @@ -28,41 +28,41 @@ export default ({ instanceData, key,setList,infoList }: Props) => { } //获取置顶数据 - 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}) + const getToppingItem = (arr: any) => { + let toppingArr: { id: string, istop: boolean }[] = [] + arr.map((res: { istop: boolean; id: string }, i: number) => { + if (res.istop) { + toppingArr.push(arr.splice(i, 1)[0] as { istop: 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 setItemTop = (uniqid: string, item: any) => { + return new Promise((res, rej) => { + fetchData({ uniqid }, function (data) { + if (data.code === 200) { + item.istop = item.istop ? 0 : 1 + } else { + setErrorFun(data.message) + } + res(null) + }, '/chat/top', 'GET'); + }) } //置顶排序 - const setDataTop=(e:MouseEvent,key:string)=>{ - let arr=JSON.parse(JSON.stringify(infoList)) + 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]) + setItemTop(item.uniqid, item).then(res=>{ + let toppindItem = getToppingItem(arr) + setList('data', (list: null[]) => [...toppindItem, ...arr]) + }) e.stopPropagation() } - //新建对话框 - const newlyAdded=()=>{ - window.open(`${location.protocol}//${location.host}` ) - } - return ( <div class={[ @@ -73,21 +73,21 @@ export default ({ instanceData, key,setList,infoList }: Props) => { <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="flex-1 truncate text-sm">{instance.title as any}</div> - <div class={[isTouchDevice||instance.Topping.toString()=='true' ? '' : 'hidden group-hover:block'].join('')}> + <div class={[isTouchDevice ? '' : 'hidden group-hover:block'].join('')}> <div class="inline-flex p-2 items-center gap-1 rounded-md hv-base" - onClick={()=>newlyAdded()} + onClick={() => popShow('open', null, null, instance.title)} > <div class='add-new-icon'></div> </div> </div> - <div class={[isTouchDevice||instance.Topping.toString()=='true' ? '' : 'hidden group-hover:block'].join('')}> + <div class={[isTouchDevice || instance.istop === 1 ? '' : 'hidden group-hover:block'].join('')}> <div class="inline-flex p-2 items-center gap-1 rounded-md hv-base" - onClick={e => setDataTop(e,key())} + onClick={e => setDataTop(e, key())} > <div class='list-top-icon'></div> </div> @@ -96,7 +96,7 @@ export default ({ instanceData, key,setList,infoList }: Props) => { <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())} + onClick={e => popShow('delete', e, key())} > <div class="i-carbon-close" /> </div> diff --git a/src/pages/chat/css/list.css b/src/pages/chat/css/list.css index 4068f11..5249a8c 100644 --- a/src/pages/chat/css/list.css +++ b/src/pages/chat/css/list.css @@ -1,26 +1,93 @@ -.w-100{ - width:100%; +.w-100 { + width: 100%; } -.max-w-350{ + +.max-w-350 { max-width: 22rem; } -.min-w-260{ + +.min-w-260 { min-width: 16.25rem; } -.list-top-icon{ - width:1rem ; - height:1rem; + +.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; + +.add-new-icon { + width: 1rem; + height: 1rem; background: url('../img/addIcon.svg') no-repeat; background-position: center; background-size: 1rem 1rem; } -.block{ + +.block { display: block !important; +} + +.center-f { + display: flex; + justify-content: center; + align-items: center; +} + +.pop { + position: fixed; + top: 0; + left: 0; + background: rgba(33, 33, 33, 0.5); + width: 100vw; + height: 100vh; + z-index: 666; + +} + +.pop-title{ + font-size:1rem; + text-align: center; + word-wrap: break-word; +} + +.text-box { + border-radius: 0.625rem; + width: 17.5rem; + height: 11.25rem; + background: #fff; + +} + +.btn{ + border-radius: 0.5rem; + border:1px solid #222; + padding:0.2rem 0.625rem; + font-size:0.8125rem; + cursor: pointer; + height:1.7425rem; + line-height:1.8rem; +} + +.btn :hover{ + background: rgba(245, 245, 245, 0.5); +} + +.btn-box{ + display: flex; + align-items: center; + margin-top:1.875rem; +} +.mg-l-80{ + margin-left:5rem; +} +.tps-error-box{ + position: fixed; + bottom: 0; + left:0; + height:10rem; + background:rgba(246, 246, 246, 1); + width:100%; } \ No newline at end of file