TTeamDesk 学习手册

src/features/tasks/reminder.tsx

此代码来自构建时的仓库快照。修改源码后重新构建即可更新。

tsx
'use client';
import { useState } from 'react';
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { App, Button, Card, InputNumber, Space } from 'antd';
import dayjs from 'dayjs';
import { useTRPC } from '@/trpc/client';
import { useTeam } from '@/features/teams/team-workspace';
export function ReminderSettings({
  id,
  version,
  dueAt,
  inactive,
}: {
  id: string;
  version: number;
  dueAt: string | null;
  inactive: boolean;
}) {
  const team = useTeam();
  const trpc = useTRPC();
  const cache = useQueryClient();
  const { message } = App.useApp();
  const [minutes, setMinutes] = useState<number | null>(60);
  const schedule = useMutation(
    trpc.task.schedule.mutationOptions({
      async onSuccess() {
        await Promise.all([
          cache.invalidateQueries({ queryKey: trpc.ticket.detail.queryKey() }),
          cache.invalidateQueries({ queryKey: trpc.ticket.events.queryKey() }),
          cache.invalidateQueries({ queryKey: trpc.task.list.queryKey() }),
        ]);
        void message.success('提醒设置已更新');
      },
      onError(error) {
        void message.error(error.message);
        void cache.invalidateQueries({
          queryKey: trpc.ticket.detail.queryKey(),
        });
      },
    }),
  );
  return (
    <Card title="超时提醒">
      <div className="space-y-3">
        <p>
          {inactive
            ? '工单已解决或关闭,提醒已失效。'
            : dueAt
              ? `到期:${dayjs(dueAt).format('YYYY-MM-DD HH:mm')}`
              : '尚未设置提醒'}
        </p>
        {!inactive && (
          <>
            <Space>
              <InputNumber
                aria-label="提醒分钟数"
                min={1}
                max={10080}
                value={minutes}
                onChange={setMinutes}
                disabled={schedule.isPending}
              />
              <span>分钟后提醒</span>
            </Space>
            <Space>
              <Button
                type="primary"
                disabled={!minutes}
                loading={schedule.isPending}
                onClick={() => {
                  if (minutes)
                    schedule.mutate({ teamId: team.id, id, version, minutes });
                }}
              >
                设置提醒
              </Button>
              <Button
                disabled={!dueAt || schedule.isPending}
                onClick={() =>
                  schedule.mutate({
                    teamId: team.id,
                    id,
                    version,
                    minutes: null,
                  })
                }
              >
                取消提醒
              </Button>
            </Space>
          </>
        )}
        <p className="text-xs text-slate-500">
          到期后站内提醒负责人;未分配时提醒团队管理员。新工单默认按优先级计时。
        </p>
      </div>
    </Card>
  );
}

搜索教程

输入关键词,搜索全部章节。

阅读设置

外观
正文字号

从一张工单出发,读懂数据如何流转。

设置与进度仅保存在当前浏览器。