index.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import dayjs from "dayjs";
  2. import PageContainerBehavior from "../../../../core/behavior/page-container.behavior";
  3. // module/chats/pages/index/index.ts
  4. interface ScrollIntoViewEvent {
  5. detail: string;
  6. }
  7. interface HandleEvent {
  8. detail: { component: 'guide' | 'questionnaire', scroll?: boolean }
  9. }
  10. interface Message extends Omit<HandleEvent['detail'], 'scroll'> {
  11. id: string;
  12. }
  13. function getScrollcontext(this: any) {
  14. return this as {
  15. scroll: WechatMiniprogram.ScrollViewContext,
  16. timer: number;
  17. }
  18. }
  19. Component({
  20. behaviors: [PageContainerBehavior],
  21. lifetimes: {
  22. attached() {
  23. this.setData({
  24. date: dayjs().format('MM-DD HH:mm:ss'),
  25. })
  26. const component = this.data.component as 'guide' | 'questionnaire'
  27. this.handle({ detail: { component, scroll: true } });
  28. },
  29. ready() {
  30. wx.createSelectorQuery().select('#scrollview').node().exec((res) => {
  31. getScrollcontext.call(this).scroll = res[0].node;
  32. })
  33. }
  34. },
  35. properties: {
  36. component: { type: String, value: 'guide' }
  37. },
  38. data: {
  39. date: '',
  40. messages: {} as Record<number, Message>,
  41. lastId: '',
  42. },
  43. observers: {
  44. 'messages.**'(messages) {
  45. const message = Object.values(messages).pop() as Message;
  46. this.setData({ lastId: message?.id });
  47. }
  48. },
  49. methods: {
  50. handle(event: HandleEvent) {
  51. const index = Object.keys(this.data.messages).length;
  52. this.setData({
  53. [`messages.${index}`]: <Message>{
  54. id: `${this.is.replace(/\//g, '_')}-${index}`,
  55. component: event.detail?.component,
  56. }
  57. });
  58. if (event.detail?.scroll) this.scrollIntoView()
  59. },
  60. scrollIntoView(event?: ScrollIntoViewEvent) {
  61. clearTimeout(getScrollcontext.call(this).timer);
  62. const id = event?.detail ?? this.data.lastId;
  63. getScrollcontext.call(this).timer = setTimeout(() => {
  64. getScrollcontext.call(this).scroll?.scrollIntoView(`#${id}`, { alignment: 'end' });
  65. }, 300)
  66. },
  67. }
  68. })