Skip to content
代码片段 群组 项目
提交 0218933b 编辑于 作者: Raymond Liao's avatar Raymond Liao :nerd: 提交者: Neil Wang
浏览文件

feat: #195 用户能精准跳到评论的位置

上级 c336dac8
分支
未找到相关标签
无相关合并请求
显示
131 个添加57 个删除
......@@ -3,10 +3,14 @@
<path fill="#F8F8FA" d="M0 0H375V812H0z" />
<rect fill="#FFF" x="15" y="99" width="345" height="621" rx="4" />
<g stroke="#66696D" stroke-width="1.5">
<path d="M8 2.75A1.75 1.75 0 1 0 8 6.25A1.75 1.75 0 1 0 8 2.75Z" transform="translate(30 305)"/>
<path d="M12,13 C12,10.790861 10.209139,9 8,9 C5.790861,9 4,10.790861 4,13" transform="translate(30 305)"/>
<path fill="#FFF" d="M3.5 10.75A1.75 1.75 0 1 0 3.5 14.25A1.75 1.75 0 1 0 3.5 10.75Z" transform="translate(30 305)"/>
<path fill="#FFF" d="M12.5 10.75A1.75 1.75 0 1 0 12.5 14.25A1.75 1.75 0 1 0 12.5 10.75Z" transform="translate(30 305)"/>
<path d="M8 2.75A1.75 1.75 0 1 0 8 6.25A1.75 1.75 0 1 0 8 2.75Z"
transform="translate(30 305)" />
<path d="M12,13 C12,10.790861 10.209139,9 8,9 C5.790861,9 4,10.790861 4,13"
transform="translate(30 305)" />
<path fill="#FFF" d="M3.5 10.75A1.75 1.75 0 1 0 3.5 14.25A1.75 1.75 0 1 0 3.5 10.75Z"
transform="translate(30 305)" />
<path fill="#FFF" d="M12.5 10.75A1.75 1.75 0 1 0 12.5 14.25A1.75 1.75 0 1 0 12.5 10.75Z"
transform="translate(30 305)" />
</g>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" class="design-iconfont">
<path d="M14.6627068,24.0971484 L7.56388485,26.6405783 C7.04396417,26.8268602 6.4714739,26.5563925 6.28519203,26.0364718 C6.24302883,25.9187925 6.22330341,25.7942511 6.2270381,25.6693023 L6.45232702,18.1319583 C6.45924787,17.9004123 6.38556683,17.6736453 6.24386839,17.4903886 L1.63126619,11.5249708 C1.29343728,11.0880611 1.37375813,10.4600113 1.81066781,10.1221824 C1.90955834,10.0457179 2.02190874,9.98847255 2.14189621,9.95341314 L9.37995442,7.83850826 C9.60230647,7.7735387 9.79520593,7.63338905 9.92570621,7.44199638 L14.1737833,1.2117355 C14.4849142,0.755428599 15.1070455,0.637740224 15.5633524,0.948871156 C15.6666333,1.01929281 15.7557951,1.10845459 15.8262167,1.2117355 L20.0742938,7.44199638 C20.2047941,7.63338905 20.3976935,7.7735387 20.6200456,7.83850826 L27.8581038,9.95341314 C28.3882222,10.1083097 28.6923996,10.663624 28.5375031,11.1937424 C28.5024437,11.3137298 28.4451983,11.4260802 28.3687338,11.5249708 L23.7561316,17.4903886 C23.6144332,17.6736453 23.5407521,17.9004123 23.547673,18.1319583 L23.7729619,25.6693023 C23.7894622,26.2213405 23.3553229,26.682232 22.8032847,26.6987323 C22.6783358,26.7024669 22.5537945,26.6827415 22.4361152,26.6405783 L15.3372932,24.0971484 C15.1192184,24.0190146 14.8807816,24.0190146 14.6627068,24.0971484 Z" transform="translate(0 1)" stroke="#FC6D26" stroke-width="2" fill="none" fill-rule="evenodd"/>
<path
d="M14.6627068,24.0971484 L7.56388485,26.6405783 C7.04396417,26.8268602 6.4714739,26.5563925 6.28519203,26.0364718 C6.24302883,25.9187925 6.22330341,25.7942511 6.2270381,25.6693023 L6.45232702,18.1319583 C6.45924787,17.9004123 6.38556683,17.6736453 6.24386839,17.4903886 L1.63126619,11.5249708 C1.29343728,11.0880611 1.37375813,10.4600113 1.81066781,10.1221824 C1.90955834,10.0457179 2.02190874,9.98847255 2.14189621,9.95341314 L9.37995442,7.83850826 C9.60230647,7.7735387 9.79520593,7.63338905 9.92570621,7.44199638 L14.1737833,1.2117355 C14.4849142,0.755428599 15.1070455,0.637740224 15.5633524,0.948871156 C15.6666333,1.01929281 15.7557951,1.10845459 15.8262167,1.2117355 L20.0742938,7.44199638 C20.2047941,7.63338905 20.3976935,7.7735387 20.6200456,7.83850826 L27.8581038,9.95341314 C28.3882222,10.1083097 28.6923996,10.663624 28.5375031,11.1937424 C28.5024437,11.3137298 28.4451983,11.4260802 28.3687338,11.5249708 L23.7561316,17.4903886 C23.6144332,17.6736453 23.5407521,17.9004123 23.547673,18.1319583 L23.7729619,25.6693023 C23.7894622,26.2213405 23.3553229,26.682232 22.8032847,26.6987323 C22.6783358,26.7024669 22.5537945,26.6827415 22.4361152,26.6405783 L15.3372932,24.0971484 C15.1192184,24.0190146 14.8807816,24.0190146 14.6627068,24.0971484 Z"
transform="translate(0 1)" stroke="#FC6D26" stroke-width="2" fill="none"
fill-rule="evenodd" />
</svg>
assets/images/post_sales_service_icon.png

1.6 KB

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" class="design-iconfont">
<path d="M12.75,0 C14.2687831,0 15.5,1.23121694 15.5,2.75 L15.5,2.75 L15.5,13.5961538 C15.5,15.1149369 14.2687831,16.3461538 12.75,16.3461538 L12.75,16.3461538 L2.75,16.3461538 C1.23121694,16.3461538 0,15.1149369 0,13.5961538 L0,13.5961538 L0,2.75 C0,1.23121694 1.23121694,0 2.75,0 L2.75,0 Z M12.75,1.5 L2.75,1.5 C2.05964406,1.5 1.5,2.05964406 1.5,2.75 L1.5,2.75 L1.5,13.5961538 C1.5,14.2865098 2.05964406,14.8461538 2.75,14.8461538 L2.75,14.8461538 L12.75,14.8461538 C13.4403559,14.8461538 14,14.2865098 14,13.5961538 L14,13.5961538 L14,2.75 C14,2.05964406 13.4403559,1.5 12.75,1.5 L12.75,1.5 Z M9.75,10.4763342 C10.1642136,10.4763342 10.5,10.8121207 10.5,11.2263342 C10.5,11.60603 10.2178461,11.9198252 9.85177056,11.9694876 L9.75,11.9763342 L3.75,11.9763342 C3.33578644,11.9763342 3,11.6405478 3,11.2263342 C3,10.8466385 3.28215388,10.5328433 3.64822944,10.4831808 L3.75,10.4763342 L9.75,10.4763342 Z M6.75,6.47633422 C7.16421356,6.47633422 7.5,6.81212066 7.5,7.22633422 C7.5,7.60602999 7.21784612,7.91982518 6.85177056,7.96948761 L6.75,7.97633422 L3.75,7.97633422 C3.33578644,7.97633422 3,7.64054778 3,7.22633422 C3,6.84663846 3.28215388,6.53284326 3.64822944,6.48318084 L3.75,6.47633422 L6.75,6.47633422 Z" transform="translate(1.25 .75)" fill="#66696D" fill-rule="nonzero"/>
<path
d="M12.75,0 C14.2687831,0 15.5,1.23121694 15.5,2.75 L15.5,2.75 L15.5,13.5961538 C15.5,15.1149369 14.2687831,16.3461538 12.75,16.3461538 L12.75,16.3461538 L2.75,16.3461538 C1.23121694,16.3461538 0,15.1149369 0,13.5961538 L0,13.5961538 L0,2.75 C0,1.23121694 1.23121694,0 2.75,0 L2.75,0 Z M12.75,1.5 L2.75,1.5 C2.05964406,1.5 1.5,2.05964406 1.5,2.75 L1.5,2.75 L1.5,13.5961538 C1.5,14.2865098 2.05964406,14.8461538 2.75,14.8461538 L2.75,14.8461538 L12.75,14.8461538 C13.4403559,14.8461538 14,14.2865098 14,13.5961538 L14,13.5961538 L14,2.75 C14,2.05964406 13.4403559,1.5 12.75,1.5 L12.75,1.5 Z M9.75,10.4763342 C10.1642136,10.4763342 10.5,10.8121207 10.5,11.2263342 C10.5,11.60603 10.2178461,11.9198252 9.85177056,11.9694876 L9.75,11.9763342 L3.75,11.9763342 C3.33578644,11.9763342 3,11.6405478 3,11.2263342 C3,10.8466385 3.28215388,10.5328433 3.64822944,10.4831808 L3.75,10.4763342 L9.75,10.4763342 Z M6.75,6.47633422 C7.16421356,6.47633422 7.5,6.81212066 7.5,7.22633422 C7.5,7.60602999 7.21784612,7.91982518 6.85177056,7.96948761 L6.75,7.97633422 L3.75,7.97633422 C3.33578644,7.97633422 3,7.64054778 3,7.22633422 C3,6.84663846 3.28215388,6.53284326 3.64822944,6.48318084 L3.75,6.47633422 L6.75,6.47633422 Z"
transform="translate(1.25 .75)" fill="#66696D" fill-rule="nonzero" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="design-iconfont">
<path d="M6.38190803,0.5 C6.74943101,0.5 7.08733676,0.701599442 7.26190355,1.02501802 L7.75745221,1.94311726 C7.77490889,1.97545911 7.80869946,1.99561906 7.84545176,1.99561906 L10.7993448,1.99561906 C11.3516296,1.99561906 11.7993448,2.44333431 11.7993448,2.99561906 L11.799,4.746 L12.3936765,4.74621722 C12.9459613,4.74621722 13.3936765,5.19393247 13.3936765,5.74621722 L13.3921915,5.80069459 L12.6691677,12.4207687 C12.6136638,12.9279195 12.1852823,13.3119757 11.6751032,13.3119757 L2.21865946,13.3119757 C1.70848039,13.3119757 1.28009891,12.9279195 1.22459503,12.4207687 L0.506021727,5.85501016 C0.445937046,5.30600354 0.842286594,4.81223747 1.39129322,4.75215279 L1.50008616,4.74621722 L2.078,4.746 L2.07868624,1.5 C2.07868624,0.94771525 2.52640149,0.5 3.07868624,0.5 L6.38190803,0.5 Z M11.835007,6.24525732 L2.05800695,6.24525732 L2.66600695,11.8112573 L11.227007,11.8112573 L11.835007,6.24525732 Z M6.08300695,1.99925732 L3.57800695,1.99925732 L3.57800695,4.72025732 L10.299007,4.72025732 L10.299007,3.49525732 L7.84545176,3.49561906 C7.30641806,3.49561906 6.80720308,3.22457981 6.51260646,2.78082315 L6.43745893,2.65559023 L6.08300695,1.99925732 Z" transform="translate(1 1)" fill="#66696D" fill-rule="nonzero"/>
<path
d="M6.38190803,0.5 C6.74943101,0.5 7.08733676,0.701599442 7.26190355,1.02501802 L7.75745221,1.94311726 C7.77490889,1.97545911 7.80869946,1.99561906 7.84545176,1.99561906 L10.7993448,1.99561906 C11.3516296,1.99561906 11.7993448,2.44333431 11.7993448,2.99561906 L11.799,4.746 L12.3936765,4.74621722 C12.9459613,4.74621722 13.3936765,5.19393247 13.3936765,5.74621722 L13.3921915,5.80069459 L12.6691677,12.4207687 C12.6136638,12.9279195 12.1852823,13.3119757 11.6751032,13.3119757 L2.21865946,13.3119757 C1.70848039,13.3119757 1.28009891,12.9279195 1.22459503,12.4207687 L0.506021727,5.85501016 C0.445937046,5.30600354 0.842286594,4.81223747 1.39129322,4.75215279 L1.50008616,4.74621722 L2.078,4.746 L2.07868624,1.5 C2.07868624,0.94771525 2.52640149,0.5 3.07868624,0.5 L6.38190803,0.5 Z M11.835007,6.24525732 L2.05800695,6.24525732 L2.66600695,11.8112573 L11.227007,11.8112573 L11.835007,6.24525732 Z M6.08300695,1.99925732 L3.57800695,1.99925732 L3.57800695,4.72025732 L10.299007,4.72025732 L10.299007,3.49525732 L7.84545176,3.49561906 C7.30641806,3.49561906 6.80720308,3.22457981 6.51260646,2.78082315 L6.43745893,2.65559023 L6.08300695,1.99925732 Z"
transform="translate(1 1)" fill="#66696D" fill-rule="nonzero" />
</svg>
import 'package:flutter/material.dart';
import 'package:jihu_gitlab_app/modules/issues/issue_draft_entity.dart';
import 'package:jihu_gitlab_app/modules/issues/member/member_entity.dart';
import 'package:jihu_gitlab_app/modules/projects/group_and_project.dart';
import 'package:jihu_gitlab_app/modules/todo_list/widgets/member_entity.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
......
......@@ -12,6 +12,7 @@ Map<String, WidgetBuilder> routes = {
SelfManagedLoginPage.routeName: (context, {arguments}) => const SelfManagedLoginPage(),
PostSalesServicePage.routeName: (context, {arguments}) => const PostSalesServicePage(),
PrivacyPolicyPage.routeName: (context, {arguments}) => const PrivacyPolicyPage(),
IssueDetailsPage.routeName: (context, {arguments}) => IssueDetailsPage(arguments: arguments),
};
Route<dynamic>? Function(RouteSettings settings) onGenerateRoute = (RouteSettings settings) {
......
......@@ -9,8 +9,8 @@ import 'package:jihu_gitlab_app/core/widgets/photo_picker.dart';
import 'package:jihu_gitlab_app/core/widgets/selector/selector.dart';
import 'package:jihu_gitlab_app/core/widgets/toast.dart';
import 'package:jihu_gitlab_app/generated/l10n.dart';
import 'package:jihu_gitlab_app/modules/todo_list/widgets/member.dart';
import 'package:jihu_gitlab_app/modules/todo_list/widgets/member_provider.dart';
import 'package:jihu_gitlab_app/modules/issues/member/member.dart';
import 'package:jihu_gitlab_app/modules/issues/member/member_provider.dart';
class MarkdownInputBox extends StatefulWidget {
const MarkdownInputBox({super.key, required this.controller, required this.projectId});
......
......@@ -21,6 +21,7 @@ class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'zh';
final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"agree": MessageLookupByLibrary.simpleMessage("同意"),
"approvalRequired": MessageLookupByLibrary.simpleMessage(" 设置您为核准人 "),
......
......@@ -4,47 +4,51 @@ import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:jihu_gitlab_app/core/load_state.dart';
import 'package:jihu_gitlab_app/core/widgets/avatar/avatar.dart';
import 'package:jihu_gitlab_app/core/widgets/avatar_and_name.dart';
import 'package:jihu_gitlab_app/core/widgets/changeable_time.dart';
import 'package:jihu_gitlab_app/core/widgets/common_app_bar.dart';
import 'package:jihu_gitlab_app/core/widgets/loading_button.dart';
import 'package:jihu_gitlab_app/core/widgets/selector/selector.dart';
import 'package:jihu_gitlab_app/core/widgets/toast.dart';
import 'package:jihu_gitlab_app/domain/discussions.dart';
import 'package:jihu_gitlab_app/domain/note.dart';
import 'package:jihu_gitlab_app/generated/l10n.dart';
import 'package:jihu_gitlab_app/modules/todo_list/todo_param.dart';
import 'package:jihu_gitlab_app/modules/todo_list/widgets/member.dart';
import 'package:jihu_gitlab_app/modules/todo_list/widgets/member_provider.dart';
import 'package:jihu_gitlab_app/modules/issues/details/issue_details_param.dart';
import 'package:jihu_gitlab_app/modules/issues/details/model/discussions.dart';
import 'package:jihu_gitlab_app/modules/issues/details/model/note.dart';
import 'package:jihu_gitlab_app/modules/issues/member/member.dart';
import 'package:jihu_gitlab_app/modules/issues/member/member_provider.dart';
import '../../../core/widgets/changeable_time.dart';
import 'discussions_model.dart';
import 'model/issue_details_model.dart';
class DiscussionsPage extends StatefulWidget {
final TodoParam param;
class IssueDetailsPage extends StatefulWidget {
static const String routeName = 'IssueDetailsPage';
final Map arguments;
const DiscussionsPage({super.key, required this.param});
const IssueDetailsPage({super.key, required this.arguments});
@override
State<StatefulWidget> createState() => _DiscussionsPageState();
State<StatefulWidget> createState() => _IssueDetailsPageState();
}
class _DiscussionsPageState extends State<DiscussionsPage> {
class _IssueDetailsPageState extends State<IssueDetailsPage> {
final TextEditingController _commentController = TextEditingController();
final DiscussionsModel _model = DiscussionsModel();
final IssueDetailsModel _model = IssueDetailsModel();
FocusNode commentFocusNode = FocusNode();
String placeholder = S.current.commentPlaceholder;
int _inputTextLength = 0;
bool _submittable = false;
late ScrollController _controller;
late IssueDetailsParam _param;
@override
void initState() {
super.initState();
_controller = ScrollController()..addListener(_loadMore);
_param = IssueDetailsParam.fromJson(widget.arguments);
_toggleLoading(true);
_model.config(widget.param);
_model.config(_param);
_model.getIssueInfo().then((value) => _toggleLoading(false)).catchError((e) => _toggleLoading(false));
_onRefresh();
}
......@@ -73,7 +77,7 @@ class _DiscussionsPageState extends State<DiscussionsPage> {
behavior: HitTestBehavior.opaque,
onTap: () {
placeholder = "Write a comment ...";
_model.selectedNoteId = null;
_model.selectedNoteId = 0;
FocusScope.of(context).requestFocus(FocusNode());
},
child: Scaffold(appBar: _buildAppBar(context), backgroundColor: const Color(0xF8F8FAFF), body: SafeArea(child: _buildBody())));
......@@ -92,7 +96,7 @@ class _DiscussionsPageState extends State<DiscussionsPage> {
CommonAppBar _buildAppBar(BuildContext context) {
return CommonAppBar(
title: Text(_model.issueDetail.iid == 0 ? "" : '${_model.issueDetail.projectName} #${_model.issueDetail.iid}'),
title: Text(_model.issueInfo.iid == 0 ? "" : '${_model.issueInfo.projectName} #${_model.issueInfo.iid}'),
showLeading: true,
actions: [
Container(
......@@ -103,7 +107,7 @@ class _DiscussionsPageState extends State<DiscussionsPage> {
itemBuilder: (context) => [S.of(context).copyLink, S.of(context).copyLinkAndTitle]
.map((item) => PopupMenuItem<String>(
onTap: () {
Clipboard.setData(ClipboardData(text: item == S.of(context).copyLink ? _model.issueDetail.webUrl : _model.issueDetail.title + _model.issueDetail.webUrl));
Clipboard.setData(ClipboardData(text: item == S.of(context).copyLink ? _model.issueInfo.webUrl : _model.issueInfo.title + _model.issueInfo.webUrl));
Toast.success(context, S.of(context).copyToast);
},
value: item,
......@@ -177,7 +181,7 @@ class _DiscussionsPageState extends State<DiscussionsPage> {
void _updateButtonState(String text) {
setState(() {
_model.submittable = text.isNotEmpty;
_submittable = text.isNotEmpty;
});
}
......@@ -237,7 +241,7 @@ class _DiscussionsPageState extends State<DiscussionsPage> {
Widget _buildAddCommentButton() {
return LoadingButton(
isLoading: _model.isLoading,
disabled: !_model.submittable,
disabled: !_submittable,
text: Text(S.current.comment, style: const TextStyle(color: Colors.white, fontSize: 12)),
onPressed: () {
_saveCommentAndRefresh();
......@@ -254,19 +258,19 @@ class _DiscussionsPageState extends State<DiscussionsPage> {
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Row(children: [
Expanded(child: Text.rich(TextSpan(text: _model.issueDetail.title, style: const TextStyle(fontSize: 18, color: Color(0xFF1A1B36), fontWeight: FontWeight.w600)))),
Expanded(child: Text.rich(TextSpan(text: _model.issueInfo.title, style: const TextStyle(fontSize: 18, color: Color(0xFF1A1B36), fontWeight: FontWeight.w600)))),
]),
Markdown(
padding: const EdgeInsets.only(left: 0, top: 12, right: 16, bottom: 16),
shrinkWrap: true,
data: _model.issueDetail.description,
data: _model.issueInfo.description,
selectable: true,
physics: const NeverScrollableScrollPhysics(),
),
Row(
children: [
Text(_model.issueDetail.recentActivities(), style: const TextStyle(color: Color(0xFF87878C), fontWeight: FontWeight.w400, fontSize: 12)),
ChangeableTime.show(() => setState(() {}), true, _model.issueDetail.recentActivityTimes(), const Color(0xFF87878C), FontWeight.w400, 12)
Text(_model.issueInfo.recentActivities(), style: const TextStyle(color: Color(0xFF87878C), fontWeight: FontWeight.w400, fontSize: 12)),
ChangeableTime.show(() => setState(() {}), true, _model.issueInfo.recentActivityTimes(), const Color(0xFF87878C), FontWeight.w400, 12)
],
),
],
......@@ -360,7 +364,7 @@ class _DiscussionsPageState extends State<DiscussionsPage> {
return Selector<int, Member>(
itemBuilder: (BuildContext context, int index, dynamic member) => AvatarAndName(username: member.username, avatarUrl: member.avatarUrl),
filter: (keyword, member) => member.username.toLowerCase().contains(keyword.toLowerCase()),
dataProvider: MemberProvider(projectId: widget.param.projectId),
dataProvider: MemberProvider(projectId: _param.projectId),
keyMapper: (member) => member.id,
title: S.current.selectContact,
key: const Key('member-selector'),
......
class IssueDetailsParam {
int projectId;
int targetIid;
int issueIid;
String pathWithNamespace;
IssueDetailsParam(this.projectId, this.issueIid, this.targetIid, this.pathWithNamespace);
factory IssueDetailsParam.fromJson(Map json) {
return IssueDetailsParam(json['projectId'] ?? 0, json['issueIid'] ?? 0, json['targetIid'] ?? 0, json['pathWithNamespace'] ?? '');
}
}
import 'package:flutter/material.dart';
import 'package:jihu_gitlab_app/core/load_state.dart';
import 'package:jihu_gitlab_app/core/net/http_client.dart';
import 'package:jihu_gitlab_app/domain/discussions.dart';
import 'package:jihu_gitlab_app/domain/issue_detail.dart';
import 'package:jihu_gitlab_app/modules/todo_list/todo_param.dart';
import 'package:jihu_gitlab_app/modules/issues/details/model/discussions.dart';
import 'package:jihu_gitlab_app/modules/issues/details/model/issue_info.dart';
import 'package:jihu_gitlab_app/modules/issues/details/issue_details_param.dart';
class DiscussionsModel {
class IssueDetailsModel {
// TODO: Should be removed
IssueDetail issueDetail = IssueDetail.empty();
IssueInfo issueInfo = IssueInfo.empty();
LoadState _loadState = LoadState.loadingState;
bool isLoading = false;
......@@ -16,18 +16,17 @@ class DiscussionsModel {
int _page = 1;
bool _hasNextPage = false;
int _lastAllCommentsLength = 0;
List<Discussion> _comments = [];
LoadState _discussionsLoadState = LoadState.loadingState;
List<Discussion> comments = [];
bool submittable = false;
int? selectedNoteId;
String selectedDiscussionId = "";
LoadState _discussionsLoadState = LoadState.loadingState;
late int _projectId;
late int _issueIid;
late String _pathWithNamespace;
config(TodoParam param) {
config(IssueDetailsParam param) {
_projectId = param.projectId;
_issueIid = param.targetIid == 0 ? param.issueIid : param.targetIid;
_pathWithNamespace = param.pathWithNamespace;
......@@ -37,7 +36,7 @@ class DiscussionsModel {
try {
_page = 1;
_lastAllCommentsLength = 0;
comments = await _getDiscussions();
_comments = await _getDiscussions();
_hasNextPage = _lastAllCommentsLength >= _size;
_discussionsLoadState = LoadState.successState;
return Future.value(true);
......@@ -53,7 +52,7 @@ class DiscussionsModel {
_discussionsLoadState = LoadState.loadingState;
_page++;
List<Discussion> list = await _getDiscussions();
comments.addAll(list);
_comments.addAll(list);
_hasNextPage = _lastAllCommentsLength >= _size;
_discussionsLoadState = LoadState.successState;
return Future.value(true);
......@@ -68,7 +67,7 @@ class DiscussionsModel {
try {
var issueResponse = await HttpClient.instance().get<Map<String, dynamic>>("/api/v4/projects/$_projectId/issues/$_issueIid");
var projectResponse = await HttpClient.instance().get<Map<String, dynamic>>("/api/v4/projects/$_projectId");
issueDetail = IssueDetail.fromJson(issueResponse.body(), projectResponse.body());
issueInfo = IssueInfo.fromJson(issueResponse.body(), projectResponse.body());
_loadState = LoadState.successState;
} catch (e) {
_loadState = LoadState.errorState;
......@@ -110,9 +109,9 @@ class DiscussionsModel {
Future<void> saveComment(String commentContent) async {
if (selectedNoteId != null) {
await _saveReplyComment(issueDetail.projectId, issueDetail.iid, selectedDiscussionId, selectedNoteId!, commentContent).then((value) => selectedNoteId = null);
await _saveReplyComment(issueInfo.projectId, issueInfo.iid, selectedDiscussionId, selectedNoteId!, commentContent).then((value) => selectedNoteId = null);
} else {
await _saveComment(issueDetail.projectId, issueDetail.iid, commentContent);
await _saveComment(issueInfo.projectId, issueInfo.iid, commentContent);
}
}
......@@ -121,4 +120,6 @@ class DiscussionsModel {
LoadState get discussionsLoadState => _discussionsLoadState;
bool get hasNextPage => _hasNextPage;
List<Discussion> get comments => _comments;
}
import 'package:jihu_gitlab_app/core/time.dart';
import 'package:jihu_gitlab_app/domain/description_content.dart';
import 'package:jihu_gitlab_app/modules/issues/details/model/description_content.dart';
import 'assignee.dart';
import '../../../../domain/assignee.dart';
class IssueDetail {
class IssueInfo {
int id;
int iid;
int projectId;
......@@ -14,7 +14,7 @@ class IssueDetail {
Assignee author;
String webUrl;
IssueDetail._(this.id, this.iid, this.projectId, this.title, this.description, this.createdAt, this.projectName, this.author, this.webUrl);
IssueInfo._(this.id, this.iid, this.projectId, this.title, this.description, this.createdAt, this.projectName, this.author, this.webUrl);
String recentActivities() {
return "${author.name} created ";
......@@ -24,13 +24,13 @@ class IssueDetail {
return Time.init(createdAt);
}
factory IssueDetail.fromJson(Map<String, dynamic> issueJson, Map<String, dynamic> projectJson) {
factory IssueInfo.fromJson(Map<String, dynamic> issueJson, Map<String, dynamic> projectJson) {
String description = DescriptionContent.init(issueJson['description'] ?? '', projectJson['path_with_namespace']).value;
return IssueDetail._(issueJson['id'] ?? 0, issueJson['iid'] ?? 0, issueJson['project_id'] ?? 0, issueJson['title'] ?? '', description, issueJson['created_at'] ?? '', projectJson['name'] ?? '',
return IssueInfo._(issueJson['id'] ?? 0, issueJson['iid'] ?? 0, issueJson['project_id'] ?? 0, issueJson['title'] ?? '', description, issueJson['created_at'] ?? '', projectJson['name'] ?? '',
Assignee.fromJson(issueJson['author']), issueJson['web_url'] ?? '');
}
factory IssueDetail.empty() {
return IssueDetail._(0, 0, 0, '标题', '', '2022-10-14T15:46:18.762+08:00', '项目名', Assignee.empty(), "");
factory IssueInfo.empty() {
return IssueInfo._(0, 0, 0, '标题', '', '2022-10-14T15:46:18.762+08:00', '项目名', Assignee.empty(), "");
}
}
import 'package:jihu_gitlab_app/core/time.dart';
import 'package:jihu_gitlab_app/domain/description_content.dart';
import 'package:jihu_gitlab_app/modules/issues/details/model/description_content.dart';
import 'assignee.dart';
import '../../../../domain/assignee.dart';
class Note {
int id;
......
export 'details/issue_details_page.dart';
export 'member/member.dart';
export 'member/member_entity.dart';
export 'member/member_provider.dart';
export 'member/member_repository.dart';
export 'issue_creation_page.dart';
export 'description_selector.dart';
export 'label_selector.dart';
......@@ -6,7 +6,7 @@ import 'package:jihu_gitlab_app/core/user_provider.dart';
import 'package:jihu_gitlab_app/modules/issues/issue_draft_entity.dart';
import 'package:jihu_gitlab_app/modules/issues/issue_draft_repository.dart';
import 'package:jihu_gitlab_app/modules/issues/label.dart';
import 'package:jihu_gitlab_app/modules/todo_list/widgets/member.dart';
import 'package:jihu_gitlab_app/modules/issues/member/member.dart';
class IssueCreationModel {
late int _projectId;
......
......@@ -16,8 +16,8 @@ import 'package:jihu_gitlab_app/modules/issues/issue_creation_model.dart';
import 'package:jihu_gitlab_app/modules/issues/label.dart';
import 'package:jihu_gitlab_app/modules/issues/label_selector.dart';
import 'package:jihu_gitlab_app/modules/issues/selectable.dart';
import 'package:jihu_gitlab_app/modules/todo_list/widgets/member.dart';
import 'package:jihu_gitlab_app/modules/todo_list/widgets/member_provider.dart';
import 'package:jihu_gitlab_app/modules/issues/member/member.dart';
import 'package:jihu_gitlab_app/modules/issues/member/member_provider.dart';
import 'package:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
......
import 'dart:convert';
import 'package:jihu_gitlab_app/modules/issues/label.dart';
import 'package:jihu_gitlab_app/modules/todo_list/widgets/member.dart';
import 'package:jihu_gitlab_app/modules/issues/member/member.dart';
class IssueDraftEntity {
static const tableName = "issue_drafts";
......
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
想要评论请 注册