perf: 重写项目和会话接口数据

This commit is contained in:
kuaifan 2023-03-08 13:07:21 +08:00
parent 05b169c172
commit cb33b9fc51
12 changed files with 238 additions and 204 deletions

View File

@ -3,6 +3,7 @@
namespace App\Http\Controllers\Api;
use App\Models\AbstractModel;
use App\Models\Deleted;
use App\Models\File;
use App\Models\FileContent;
use App\Models\ProjectTask;
@ -14,6 +15,7 @@ use App\Models\WebSocketDialogMsgRead;
use App\Models\WebSocketDialogMsgTodo;
use App\Models\WebSocketDialogUser;
use App\Module\Base;
use App\Module\TimeRange;
use Carbon\Carbon;
use DB;
use Redirect;
@ -34,8 +36,10 @@ class DialogController extends AbstractController
* @apiGroup dialog
* @apiName lists
*
* @apiParam {String} [updated_at] 只读取在这个时间之后更新的对话
* @apiParam {String} [deleted_at] 读取在这个时间之后删除的对话ID返回数据: deleted_data此参数仅第1页有效
* @apiParam {String} [timerange] 时间范围1678248944,1678248944
* - 第一个时间: 读取在这个时间之后更新的数据
* - 第二个时间: 读取在这个时间之后删除的数据ID第1页附加返回数据: deleted_id
*
* @apiParam {Number} [page] 当前页,默认:1
* @apiParam {Number} [pagesize] 每页显示数量,默认:50,最大:100
*
@ -47,11 +51,13 @@ class DialogController extends AbstractController
{
$user = User::auth();
//
$timerange = TimeRange::parse(Request::input());
//
$builder = WebSocketDialog::select(['web_socket_dialogs.*', 'u.top_at', 'u.mark_unread', 'u.silence', 'u.updated_at as user_at'])
->join('web_socket_dialog_users as u', 'web_socket_dialogs.id', '=', 'u.dialog_id')
->where('u.userid', $user->userid);
if (Request::input('updated_at') || Request::input('at_after')) {
$builder->where('u.updated_at', '>', Carbon::parse(Request::input('updated_at') ?: Request::input('at_after')));
if ($timerange->updated) {
$builder->where('u.updated_at', '>', $timerange->updated);
}
$list = $builder
->orderByDesc('u.top_at')
@ -60,18 +66,10 @@ class DialogController extends AbstractController
$list->transform(function (WebSocketDialog $item) use ($user) {
return $item->formatData($user->userid);
});
$data = $list->toArray();
//
if ($list->currentPage() === 1 && Request::input('deleted_at')) {
$data['deleted_at'] = date("Y-m-d H:i:s");
$data['deleted_data'] = WebSocketDialog::select(['web_socket_dialogs.id'])
->withTrashed()
->join('web_socket_dialog_users as u', 'web_socket_dialogs.id', '=', 'u.dialog_id')
->where('u.userid', $user->userid)
->where('web_socket_dialogs.deleted_at', '>=', Carbon::parse(Request::input('deleted_at')))
->orderByDesc('web_socket_dialogs.deleted_at')
->take(100)
->pluck('id');
$data = $list->toArray();
if ($list->currentPage() === 1) {
$data['deleted_id'] = Deleted::ids('dialog', $user->userid, $timerange->deleted);
}
//
return Base::retSuccess('success', $data);

View File

@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api;
use App\Exceptions\ApiException;
use App\Models\AbstractModel;
use App\Models\Deleted;
use App\Models\File;
use App\Models\FileContent;
use App\Models\Project;
@ -21,6 +22,7 @@ use App\Models\WebSocketDialog;
use App\Module\Base;
use App\Module\BillExport;
use App\Module\BillMultipleExport;
use App\Module\TimeRange;
use Carbon\Carbon;
use Illuminate\Support\Arr;
use Madzipper;
@ -58,7 +60,9 @@ class ProjectController extends AbstractController
* - yes取列表
* @apiParam {Object} [keys] 搜索条件
* - keys.name: 项目名称
* @apiParam {String} [deleted_at] 读取在这个时间之后删除的项目ID返回数据: deleted_data此参数仅第1页有效
* @apiParam {String} [timerange] 时间范围1678248944,1678248944
* - 第一个时间: 读取在这个时间之后更新的数据
* - 第二个时间: 读取在这个时间之后删除的数据ID第1页附加返回数据: deleted_id
*
* @apiParam {Number} [page] 当前页,默认:1
* @apiParam {Number} [pagesize] 每页显示数量,默认:50,最大:100
@ -137,6 +141,11 @@ class ProjectController extends AbstractController
}
}
//
$timerange = TimeRange::parse(Request::input('timerange'));
if ($timerange->updated) {
$builder->where('projects.updated_at', '>', $timerange->updated);
}
//
$list = $builder->orderByDesc('projects.id')->paginate(Base::getPaginate(100, 50));
$list->transform(function (Project $project) use ($user) {
return array_merge($project->toArray(), $project->getTaskStatistics($user->userid));
@ -144,15 +153,8 @@ class ProjectController extends AbstractController
//
$data = $list->toArray();
$data['total_all'] = $totalAll ?? $data['total'];
//
if ($list->currentPage() === 1 && Request::input('deleted_at')) {
$data['deleted_at'] = date("Y-m-d H:i:s");
$data['deleted_data'] = Project::authData()
->withTrashed()
->where('projects.deleted_at', '>=', Carbon::parse(Request::input('deleted_at')))
->orderByDesc('projects.deleted_at')
->take(100)
->pluck('id');
if ($list->currentPage() === 1) {
$data['deleted_id'] = Deleted::ids('project', $user->userid, $timerange->deleted);
}
//
return Base::retSuccess('success', $data);
@ -842,13 +844,17 @@ class ProjectController extends AbstractController
*
* @apiParam {Object} [keys] 搜索条件
* - keys.name: 任务名称
*
* @apiParam {Number} [project_id] 项目ID
* @apiParam {Number} [parent_id] 主任务IDproject_id && parent_id 0 仅查询自己参与的任务)
* - 大于0指定主任务下的子任务
* - 等于-1:表示仅主任务
* @apiParam {String} [name] 任务描述关键词
*
* @apiParam {Array} [time] 指定时间范围,如:['2020-12-12', '2020-12-30']
* @apiParam {String} [time_before] 指定时间之前2020-12-30 00:00:00(填写此项时 time 参数无效)
* @apiParam {String} [timerange] 时间范围1678248944,1678248944
* - 第一个时间: 读取在这个时间之后更新的数据
* - 第二个时间: 读取在这个时间之后删除的数据ID第1页附加返回数据: deleted_id
*
* @apiParam {String} [complete] 完成状态
* - all所有默认
* - yes已完成
@ -861,7 +867,8 @@ class ProjectController extends AbstractController
* - all所有
* - yes已删除
* - no未删除默认
* @apiParam {Object} sorts 排序方式
*
* @apiParam {Object} [sorts] 排序方式
* - sorts.complete_at 完成时间asc|desc
* - sorts.archived_at 归档时间asc|desc
* - sorts.end_at 到期时间asc|desc
@ -872,7 +879,7 @@ class ProjectController extends AbstractController
*/
public function task__lists()
{
User::auth();
$user = User::auth();
//
$builder = ProjectTask::with(['taskUser', 'taskTag']);
//
@ -880,7 +887,7 @@ class ProjectController extends AbstractController
$project_id = intval(Request::input('project_id'));
$name = Request::input('name');
$time = Request::input('time');
$time_before = Request::input('time_before');
$timerange = TimeRange::parse(Request::input('timerange'));
$complete = Request::input('complete', 'all');
$archived = Request::input('archived', 'no');
$deleted = Request::input('deleted', 'no');
@ -920,13 +927,14 @@ class ProjectController extends AbstractController
});
}
//
if (Base::isDateOrTime($time_before)) {
$builder->whereNotNull('project_tasks.end_at')->where('project_tasks.end_at', '<', Carbon::parse($time_before));
} elseif (is_array($time)) {
if (is_array($time)) {
if (Base::isDateOrTime($time[0]) && Base::isDateOrTime($time[1])) {
$builder->betweenTime(Carbon::parse($time[0])->startOfDay(), Carbon::parse($time[1])->endOfDay());
}
}
if ($timerange->updated) {
$builder->where('project_tasks.updated_at', '>', $timerange->updated);
}
//
if ($complete === 'yes') {
$builder->whereNotNull('project_tasks.complete_at');
@ -954,7 +962,12 @@ class ProjectController extends AbstractController
//
$list = $builder->orderByDesc('project_tasks.id')->paginate(Base::getPaginate(200, 100));
//
return Base::retSuccess('success', $list);
$data = $list->toArray();
if ($list->currentPage() === 1) {
$data['deleted_id'] = Deleted::ids('projectTask', $user->userid, $timerange->deleted);
}
//
return Base::retSuccess('success', $data);
}
/**

View File

@ -1,6 +1,9 @@
<?php
namespace App\Models;
use Carbon\Carbon;
/**
* App\Models\Deleted
*
@ -23,6 +26,24 @@ class Deleted extends AbstractModel
{
const UPDATED_AT = null;
/**
* 获取删除的ID
* @param $type
* @param $userid
* @param $time
* @return array
*/
public static function ids($type, $userid, $time): array
{
if (empty($time)) {
return [];
}
return self::where([
'type' => $type,
'userid' => $userid
])->where('created_at', '>=', Carbon::parse($time))->pluck('did')->toArray();
}
/**
* 忘记(恢复或添加数据时删除记录)
* @param $type

41
app/Module/TimeRange.php Normal file
View File

@ -0,0 +1,41 @@
<?php
namespace App\Module;
use Carbon\Carbon;
class TimeRange
{
public ?Carbon $updated;
public ?Carbon $deleted;
/**
* @param $data
*/
public function __construct($data)
{
if (is_array($data)) {
$range = Base::explodeInt($data['timerange']);
if ($data['updated_at'] || $data['at_after']) {
$range[0] = $data['updated_at'] ?: $data['at_after'];
}
if ($data['deleted_at']) {
$range[1] = $data['deleted_at'];
}
} else {
$range = Base::explodeInt($data);
}
//
$this->updated = $range[0] ? Carbon::parse($range[0]) : null;
$this->deleted = $range[1] ? Carbon::parse($range[1]) : null;
}
/**
* @param $data
* @return TimeRange
*/
public static function parse($data): TimeRange
{
return new self($data);
}
}

View File

@ -1232,6 +1232,21 @@ const localforage = require("localforage");
}
}
}, 1);
},
/**
* 排序JSON对象
* @param obj
* @param ignore
* @returns {{}}
*/
sortObject(obj, ignore = []) {
return Object.keys(obj).sort().reduce(function (result, key) {
if (!ignore.includes(key)) {
result[key] = obj[key];
}
return result;
}, {});
}
});

View File

@ -248,33 +248,12 @@ export default {
return;
}
//
const timeStart = $A.Date($A.formatDate(time[0] + " 00:00:00")),
timeEnd = $A.Date($A.formatDate(time[1] + " 23:59:59")),
now = $A.Time();
const find = (item, n) => {
if (n === true && item._time < now) {
return false
}
const start = $A.Date(item.start_at),
end = $A.Date(item.end_at);
return (start <= timeStart && timeStart <= end) || (start <= timeEnd && timeEnd <= end) || (start > timeStart && timeEnd > end);
}
const currentIds = this.list.filter(item => find(item)).map(({id}) => id);
const call = () => {
const newIds = this.list.filter(item => find(item, true)).map(({id}) => id);
this.$store.dispatch("forgetTask", currentIds.filter(v => newIds.indexOf(v) == -1))
}
//
this.loadIng++;
this.$store.dispatch("getTasks", {
time,
complete: "no"
}).then(() => {
}).finally(_ => {
this.loadIng--;
call()
}).catch(() => {
this.loadIng--;
call()
})
},

View File

@ -141,7 +141,7 @@ export default {
keys: {
name: this.projectKeyValue
},
hideLoad: true,
hideload: true,
}).finally(_ => {
this.projectKeyLoading--;
});

View File

@ -865,7 +865,7 @@ export default {
if (timeout > -1) {
this.__updateDialogs = setTimeout(_ => {
if (this.tabActive === 'dialog') {
this.$store.dispatch("getDialogs", {hideLoad: true}).catch(() => {});
this.$store.dispatch("getDialogs", {hideload: true}).catch(() => {});
}
}, timeout)
}

View File

@ -1,5 +1,6 @@
import {Store} from 'le5le-store';
import {languageType} from "../language";
import {$callData} from './utils'
export default {
/**
@ -35,9 +36,7 @@ export default {
state.dialogInputCache = await $A.IDBArray("dialogInputCache")
state.fileLists = await $A.IDBArray("fileLists")
state.userInfo = await $A.IDBJson("userInfo")
state.dialogUpdatedAt = await $A.IDBString("dialogUpdatedAt")
state.dialogDeletedAt = await $A.IDBString("dialogDeletedAt")
state.projectDeletedAt = await $A.IDBString("projectDeletedAt")
state.callAt = await $A.IDBArray("callAt")
// 会员信息
if (state.userInfo.userid) {
@ -637,9 +636,7 @@ export default {
state.cacheProjects = [];
state.cacheColumns = [];
state.cacheTasks = [];
state.dialogUpdatedAt = null;
state.dialogDeletedAt = null;
state.projectDeletedAt = null;
state.callAt = [];
// localStorage
const languageType = window.localStorage.getItem("__language:type__");
@ -706,7 +703,7 @@ export default {
forgetFile({state, dispatch}, file_id) {
$A.execMainDispatch("forgetFile", file_id)
//
let ids = $A.isArray(file_id) ? file_id : [file_id];
const ids = $A.isArray(file_id) ? file_id : [file_id];
ids.some(id => {
state.fileLists = state.fileLists.filter(file => file.id != id);
state.fileLists.some(file => {
@ -827,7 +824,7 @@ export default {
forgetProject({state}, project_id) {
$A.execMainDispatch("forgetProject", project_id)
//
let ids = $A.isArray(project_id) ? project_id : [project_id];
const ids = $A.isArray(project_id) ? project_id : [project_id];
ids.some(id => {
const index = state.cacheProjects.findIndex(project => project.id == id);
if (index > -1) {
@ -867,34 +864,23 @@ export default {
reject({msg: 'Parameter error'});
return;
}
if (!$A.isJson(requestData)) {
requestData = {}
}
if (typeof requestData.deleted_at === "undefined") {
requestData.deleted_at = state.projectDeletedAt || getters.getProjectLastAt
}
const callData = $callData('projects', requestData, state)
//
!requestData.hideLoad && state.loadProjects++;
callData.showLoad() && state.loadProjects++;
dispatch("call", {
url: 'project/lists',
data: requestData
data: callData.get()
}).then(({data}) => {
state.projectTotal = data.total_all;
dispatch("saveProject", data.data);
//
if (data.current_page === 1) {
data.deleted_at && $A.IDBSet("projectDeletedAt", data.deleted_at).then(_ => {
state.projectDeletedAt = data.deleted_at
data.deleted_data.some(id => dispatch("forgetProject", id))
});
}
callData.save(data).then(ids => dispatch("forgetProject", ids))
//
resolve(data)
}).catch(e => {
console.warn(e);
reject(e)
}).finally(_ => {
!requestData.hideLoad && state.loadProjects--;
callData.showLoad() && state.loadProjects--;
});
});
},
@ -1054,8 +1040,8 @@ export default {
forgetColumn({state, dispatch}, column_id) {
$A.execMainDispatch("forgetColumn", column_id)
//
let ids = $A.isArray(column_id) ? column_id : [column_id];
let project_ids = [];
const ids = $A.isArray(column_id) ? column_id : [column_id];
const project_ids = [];
ids.some(id => {
const index = state.cacheColumns.findIndex(column => column.id == id);
if (index > -1) {
@ -1228,9 +1214,9 @@ export default {
forgetTask({state, dispatch}, task_id) {
$A.execMainDispatch("forgetTask", task_id)
//
let ids = $A.isArray(task_id) ? task_id : [task_id];
let parent_ids = [];
let project_ids = [];
const ids = $A.isArray(task_id) ? task_id : [task_id];
const parent_ids = [];
const project_ids = [];
ids.some(id => {
const index = state.cacheTasks.findIndex(task => task.id == id);
if (index > -1) {
@ -1318,15 +1304,16 @@ export default {
* 获取任务
* @param state
* @param dispatch
* @param data
* @param requestData
* @returns {Promise<unknown>}
*/
getTasks({state, dispatch}, data) {
let taskData = [];
if ($A.isArray(data.taskData)) {
taskData = data.taskData;
delete data.taskData;
getTasks({state, dispatch}, requestData) {
const taskData = [];
if ($A.isArray(requestData.taskData)) {
taskData.push(...requestData.taskData)
delete requestData.taskData;
}
const callData = $callData('tasks', requestData, state)
//
return new Promise(function (resolve, reject) {
if (state.userId === 0) {
@ -1334,31 +1321,28 @@ export default {
reject({msg: 'Parameter error'});
return;
}
if (data.project_id) {
if (requestData.project_id) {
state.projectLoad++;
}
//
dispatch("call", {
url: 'project/task/lists',
data
}).then(result => {
if (data.project_id) {
data: callData.get()
}).then(({data}) => {
if (requestData.project_id) {
state.projectLoad--;
}
taskData.push(...data.data);
callData.save(data).then(ids => dispatch("forgetTask", ids))
//
const resData = result.data;
taskData.push(...resData.data);
//
if (resData.next_page_url) {
const nextData = Object.assign(data, {
page: resData.current_page + 1,
taskData,
});
if (resData.current_page % 5 === 0) {
if (data.next_page_url) {
requestData.page = data.current_page + 1
requestData.taskData = taskData
if (data.current_page % 10 === 0) {
$A.modalWarning({
content: "数据已超过" + resData.to + "条,是否继续加载?",
content: "数据已超过" + data.to + "条,是否继续加载?",
onOk: () => {
dispatch("getTasks", nextData).then(resolve).catch(reject)
dispatch("getTasks", requestData).then(resolve).catch(reject)
},
onCancel: () => {
dispatch("saveTask", taskData);
@ -1366,7 +1350,7 @@ export default {
}
});
} else {
dispatch("getTasks", nextData).then(resolve).catch(reject)
dispatch("getTasks", requestData).then(resolve).catch(reject)
}
} else {
dispatch("saveTask", taskData);
@ -1375,7 +1359,7 @@ export default {
}).catch(e => {
console.warn(e);
reject(e)
if (data.project_id) {
if (requestData.project_id) {
state.projectLoad--;
}
});
@ -1447,22 +1431,8 @@ export default {
}
state.loadDashboardTasks = true;
//
const time = $A.Time()
const {today, overdue, all} = getters.dashboardTask;
const currentIds = today.map(({id}) => id)
currentIds.push(...overdue.map(({id}) => id))
currentIds.push(...all.map(({id}) => id))
currentIds.push(...getters.assistTask.map(({id}) => id))
//
dispatch("getTasks", {
complete: "no",
}).then(_ => {
const {today, overdue, all} = getters.dashboardTask;
const newIds = today.filter(task => task._time >= time).map(({id}) => id)
newIds.push(...overdue.filter(task => task._time >= time).map(({id}) => id))
newIds.push(...all.filter(task => task._time >= time).map(({id}) => id))
newIds.push(...getters.assistTask.filter(task => task._time >= time).map(({id}) => id))
dispatch("forgetTask", currentIds.filter(v => newIds.indexOf(v) == -1))
}).finally(_ => {
state.loadDashboardTasks = false;
})
@ -1477,20 +1447,7 @@ export default {
*/
getTaskForProject({state, dispatch}, project_id) {
return new Promise(function (resolve, reject) {
const time = $A.Time()
const currentIds = state.cacheTasks.filter(task => task.project_id == project_id).map(({id}) => id)
//
const call = () => {
const newIds = state.cacheTasks.filter(task => task.project_id == project_id && task._time >= time).map(({id}) => id)
dispatch("forgetTask", currentIds.filter(v => newIds.indexOf(v) == -1))
}
dispatch("getTasks", {project_id}).then(() => {
call()
resolve()
}).catch(() => {
call()
reject()
})
dispatch("getTasks", {project_id}).then(resolve).catch(reject)
})
},
@ -1503,23 +1460,10 @@ export default {
*/
getTaskForParent({state, dispatch}, parent_id) {
return new Promise(function (resolve, reject) {
const time = $A.Time()
const currentIds = state.cacheTasks.filter(task => task.parent_id == parent_id).map(({id}) => id)
//
let call = () => {
const newIds = state.cacheTasks.filter(task => task.parent_id == parent_id && task._time >= time).map(({id}) => id)
dispatch("forgetTask", currentIds.filter(v => newIds.indexOf(v) == -1))
}
dispatch("getTasks", {
parent_id,
archived: 'all'
}).then(() => {
call()
resolve()
}).catch(() => {
call()
reject()
})
}).then(resolve).catch(reject)
})
},
@ -1677,7 +1621,7 @@ export default {
* @param file_id
*/
forgetTaskFile({state, dispatch}, file_id) {
let ids = $A.isArray(file_id) ? file_id : [file_id];
const ids = $A.isArray(file_id) ? file_id : [file_id];
ids.some(id => {
const index = state.taskFiles.findIndex(file => file.id == id)
if (index > -1) {
@ -2155,27 +2099,15 @@ export default {
if (typeof requestData.pagesize === "undefined") {
requestData.pagesize = 20
}
if (typeof requestData.updated_at === "undefined") {
requestData.updated_at = state.dialogUpdatedAt
}
if (typeof requestData.deleted_at === "undefined") {
requestData.deleted_at = state.dialogDeletedAt || getters.getDialogLastAt
}
const callData = $callData('dialogs', requestData, state)
//
!requestData.hideLoad && state.loadDialogs++;
callData.showLoad() && state.loadDialogs++;
dispatch("call", {
url: 'dialog/lists',
data: requestData,
data: callData.get()
}).then(({data}) => {
dispatch("saveDialog", data.data);
//
if (data.current_page === 1) {
data.deleted_at && $A.IDBSet("dialogDeletedAt", data.deleted_at).then(_ => {
state.dialogDeletedAt = data.deleted_at
data.deleted_data.some(id => dispatch("forgetDialog", id))
});
$A.IDBSet("dialogUpdatedAt", state.dialogUpdatedAt = $A.formatDate()).then(_ => {})
}
callData.save(data).then(ids => dispatch("forgetDialog", ids))
//
if (data.next_page_url && data.current_page < 5) {
requestData.page++
@ -2187,7 +2119,7 @@ export default {
console.warn(e);
reject(e)
}).finally(_ => {
!requestData.hideLoad && state.loadDialogs--;
callData.showLoad() && state.loadDialogs--;
});
});
},
@ -2317,7 +2249,7 @@ export default {
forgetDialog({state}, dialog_id) {
$A.execMainDispatch("forgetDialog", dialog_id)
//
let ids = $A.isArray(dialog_id) ? dialog_id : [dialog_id];
const ids = $A.isArray(dialog_id) ? dialog_id : [dialog_id];
ids.some(id => {
const index = state.cacheDialogs.findIndex(dialog => dialog.id == id);
if (index > -1) {

View File

@ -186,34 +186,4 @@ export default {
}
return array
},
/**
* 获取项目最后更新时间
* @param state
* @returns {*}
*/
getProjectLastAt(state) {
if (state.cacheProjects.length > 0) {
const tmpList = state.cacheProjects.sort((a, b) => {
return $A.Date(b.updated_at) - $A.Date(a.updated_at);
})
return tmpList[0].updated_at;
}
return $A.formatDate("Y-m-d H:i:s", $A.Time() - 86400 * 30)
},
/**
* 获取会话最后更新时间
* @param state
* @returns {*}
*/
getDialogLastAt(state) {
if (state.cacheDialogs.length > 0) {
const tmpList = state.cacheDialogs.sort((a, b) => {
return $A.Date(b.last_at) - $A.Date(a.last_at);
})
return tmpList[0].last_at;
}
return $A.formatDate("Y-m-d H:i:s", $A.Time() - 86400 * 30)
},
}

View File

@ -21,6 +21,9 @@ export default {
routeHistorys: [],
routeHistoryLast: {},
// 请求时间
callAt: [],
// 加载状态
loads: [],
loadDashboardTasks: false,
@ -82,8 +85,6 @@ export default {
dialogHistory: [],
dialogInputCache: [],
dialogMsgTransfer: {time: 0},
dialogUpdatedAt: null,
dialogDeletedAt: null,
// 文件
fileLists: [],
@ -92,7 +93,6 @@ export default {
projectId: 0,
projectTotal: 0,
projectLoad: 0,
projectDeletedAt: null,
taskId: 0,
taskCompleteTemps: [],
taskContents: [],

65
resources/assets/js/store/utils.js vendored Normal file
View File

@ -0,0 +1,65 @@
/**
* @param key
* @param requestData
* @param state
* @returns {$callData}
*/
function __callData(key, requestData, state) {
if (!$A.isJson(requestData)) {
requestData = {}
}
const callKey = key + "::" + encodeURIComponent(new URLSearchParams($.sortObject(requestData, [
'page',
'pagesize',
'hideload',
'timerange',
])).toString())
const callData = state.callAt.find(item => item.key === callKey) || {}
if (typeof callData.key === "undefined") {
callData.key = callKey
callData.updated = 0
callData.deleted = 0
state.callAt.push(callData)
$A.IDBSet("callAt", state.callAt).then(_ => {})
}
/**
* @returns {*}
*/
this.get = () => {
requestData.timerange = requestData.timerange || `${callData.updated},${callData.deleted}`
return requestData
}
/**
* @param current_page
* @param deleted_id
* @returns {Promise<unknown>}
*/
this.save = ({current_page, deleted_id}) => {
return new Promise(resolve => {
if (current_page === 1) {
callData.updated = $A.Time()
if ($A.isArray(deleted_id)) {
callData.deleted = callData.updated
} else {
deleted_id = []
}
$A.IDBSet("callAt", state.callAt).then(_ => resolve(deleted_id))
}
})
}
/**
* @returns {boolean}
*/
this.showLoad = () => {
return !requestData.hideload
}
return this
}
export function $callData(key, requestData, state) {
return new __callData(key, requestData, state)
}