mirror of
https://github.com/qinglong-app/qinglong_app.git
synced 2025-10-09 16:48:19 +08:00
增加剪切板控制
This commit is contained in:
@@ -4,3 +4,4 @@ String spUserName = "username";
|
|||||||
String spPassWord = "password";
|
String spPassWord = "password";
|
||||||
String spTheme = "dart_mode";
|
String spTheme = "dart_mode";
|
||||||
String spSecretLogined = "secret_logined";
|
String spSecretLogined = "secret_logined";
|
||||||
|
String spForbidClipBoard = "forbid_read_clipboard";
|
||||||
|
|||||||
@@ -8,11 +8,16 @@ class UserInfoViewModel {
|
|||||||
String? _userName;
|
String? _userName;
|
||||||
String? _passWord;
|
String? _passWord;
|
||||||
bool _useSecertLogined = false;
|
bool _useSecertLogined = false;
|
||||||
|
bool _forbidReadClipBoard = false;
|
||||||
|
|
||||||
UserInfoViewModel() {
|
UserInfoViewModel() {
|
||||||
String userInfoJson = SpUtil.getString(spUserInfo);
|
String userInfoJson = SpUtil.getString(spUserInfo);
|
||||||
_userName = SpUtil.getString(spUserName);
|
_userName = SpUtil.getString(spUserName);
|
||||||
_passWord = SpUtil.getString(spPassWord);
|
_passWord = SpUtil.getString(spPassWord);
|
||||||
|
_forbidReadClipBoard = SpUtil.getBool(
|
||||||
|
spForbidClipBoard,
|
||||||
|
defValue: false,
|
||||||
|
);
|
||||||
|
|
||||||
_useSecertLogined = SpUtil.getBool(spSecretLogined, defValue: false);
|
_useSecertLogined = SpUtil.getBool(spSecretLogined, defValue: false);
|
||||||
_host = SpUtil.getString(spHost, defValue: '');
|
_host = SpUtil.getString(spHost, defValue: '');
|
||||||
@@ -34,6 +39,11 @@ class UserInfoViewModel {
|
|||||||
SpUtil.putString(spPassWord, password);
|
SpUtil.putString(spPassWord, password);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void forbidReadClipBoard(bool forbid) {
|
||||||
|
_forbidReadClipBoard = forbid;
|
||||||
|
SpUtil.putBool(spForbidClipBoard, forbid);
|
||||||
|
}
|
||||||
|
|
||||||
void useSecretLogin(bool use) {
|
void useSecretLogin(bool use) {
|
||||||
_useSecertLogined = use;
|
_useSecertLogined = use;
|
||||||
SpUtil.putBool(spSecretLogined, _useSecertLogined);
|
SpUtil.putBool(spSecretLogined, _useSecertLogined);
|
||||||
@@ -54,6 +64,8 @@ class UserInfoViewModel {
|
|||||||
|
|
||||||
bool get useSecretLogined => _useSecertLogined;
|
bool get useSecretLogined => _useSecertLogined;
|
||||||
|
|
||||||
|
bool get forbidReadClipBoarded => _forbidReadClipBoard;
|
||||||
|
|
||||||
bool isLogined() {
|
bool isLogined() {
|
||||||
return token != null && token!.isNotEmpty;
|
return token != null && token!.isNotEmpty;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,12 @@ import 'package:qinglong_app/base/http/api.dart';
|
|||||||
import 'package:qinglong_app/base/http/http.dart';
|
import 'package:qinglong_app/base/http/http.dart';
|
||||||
import 'package:qinglong_app/base/ql_app_bar.dart';
|
import 'package:qinglong_app/base/ql_app_bar.dart';
|
||||||
import 'package:qinglong_app/base/theme.dart';
|
import 'package:qinglong_app/base/theme.dart';
|
||||||
|
import 'package:qinglong_app/base/userinfo_viewmodel.dart';
|
||||||
import 'package:qinglong_app/module/config/config_viewmodel.dart';
|
import 'package:qinglong_app/module/config/config_viewmodel.dart';
|
||||||
import 'package:qinglong_app/utils/extension.dart';
|
import 'package:qinglong_app/utils/extension.dart';
|
||||||
|
|
||||||
|
import '../../main.dart';
|
||||||
|
|
||||||
class ConfigEditPage extends ConsumerStatefulWidget {
|
class ConfigEditPage extends ConsumerStatefulWidget {
|
||||||
final String content;
|
final String content;
|
||||||
final String title;
|
final String title;
|
||||||
@@ -44,8 +47,7 @@ class _ConfigEditPageState extends ConsumerState<ConfigEditPage> {
|
|||||||
actions: [
|
actions: [
|
||||||
InkWell(
|
InkWell(
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
HttpResponse<NullResponse> response =
|
HttpResponse<NullResponse> response = await Api.saveFile(widget.title, _controller.text);
|
||||||
await Api.saveFile(widget.title, _controller.text);
|
|
||||||
if (response.success) {
|
if (response.success) {
|
||||||
"提交成功".toast();
|
"提交成功".toast();
|
||||||
ref.read(configProvider).loadContent(widget.title);
|
ref.read(configProvider).loadContent(widget.title);
|
||||||
@@ -78,6 +80,7 @@ class _ConfigEditPageState extends ConsumerState<ConfigEditPage> {
|
|||||||
),
|
),
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
child: TextField(
|
child: TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
focusNode: node,
|
focusNode: node,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: ref.read(themeProvider).themeColor.descColor(),
|
color: ref.read(themeProvider).themeColor.descColor(),
|
||||||
|
|||||||
6
lib/module/env/add_env_page.dart
vendored
6
lib/module/env/add_env_page.dart
vendored
@@ -3,10 +3,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||||||
import 'package:qinglong_app/base/http/api.dart';
|
import 'package:qinglong_app/base/http/api.dart';
|
||||||
import 'package:qinglong_app/base/http/http.dart';
|
import 'package:qinglong_app/base/http/http.dart';
|
||||||
import 'package:qinglong_app/base/ql_app_bar.dart';
|
import 'package:qinglong_app/base/ql_app_bar.dart';
|
||||||
|
import 'package:qinglong_app/base/userinfo_viewmodel.dart';
|
||||||
import 'package:qinglong_app/module/env/env_bean.dart';
|
import 'package:qinglong_app/module/env/env_bean.dart';
|
||||||
import 'package:qinglong_app/module/env/env_viewmodel.dart';
|
import 'package:qinglong_app/module/env/env_viewmodel.dart';
|
||||||
import 'package:qinglong_app/utils/extension.dart';
|
import 'package:qinglong_app/utils/extension.dart';
|
||||||
|
|
||||||
|
import '../../main.dart';
|
||||||
|
|
||||||
class AddEnvPage extends ConsumerStatefulWidget {
|
class AddEnvPage extends ConsumerStatefulWidget {
|
||||||
final EnvBean? envBean;
|
final EnvBean? envBean;
|
||||||
|
|
||||||
@@ -98,6 +101,7 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
focusNode: focusNode,
|
focusNode: focusNode,
|
||||||
controller: _nameController,
|
controller: _nameController,
|
||||||
decoration: const InputDecoration(
|
decoration: const InputDecoration(
|
||||||
@@ -127,6 +131,7 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
controller: _valueController,
|
controller: _valueController,
|
||||||
maxLines: 8,
|
maxLines: 8,
|
||||||
minLines: 1,
|
minLines: 1,
|
||||||
@@ -157,6 +162,7 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
controller: _remarkController,
|
controller: _remarkController,
|
||||||
decoration: const InputDecoration(
|
decoration: const InputDecoration(
|
||||||
hintText: "请输入备注",
|
hintText: "请输入备注",
|
||||||
|
|||||||
@@ -142,6 +142,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
onChanged: (_) {
|
onChanged: (_) {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
@@ -177,6 +178,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
onChanged: (_) {
|
onChanged: (_) {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
@@ -198,6 +200,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
onChanged: (_) {
|
onChanged: (_) {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
@@ -233,6 +236,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
onChanged: (_) {
|
onChanged: (_) {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
@@ -254,6 +258,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
onChanged: (_) {
|
onChanged: (_) {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
@@ -276,7 +281,9 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 25,),
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 25,
|
||||||
|
),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Checkbox(
|
Checkbox(
|
||||||
@@ -307,7 +314,9 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(width: 10,),
|
SizedBox(
|
||||||
|
width: 10,
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -316,7 +325,9 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
|||||||
),
|
),
|
||||||
Container(
|
Container(
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 40,),
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 40,
|
||||||
|
),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width: MediaQuery.of(context).size.width - 80,
|
width: MediaQuery.of(context).size.width - 80,
|
||||||
child: IgnorePointer(
|
child: IgnorePointer(
|
||||||
@@ -396,6 +407,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
|||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
twoFact = value;
|
twoFact = value;
|
||||||
},
|
},
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
keyboardType: TextInputType.number,
|
keyboardType: TextInputType.number,
|
||||||
decoration: const InputDecoration(
|
decoration: const InputDecoration(
|
||||||
|
|||||||
@@ -4,9 +4,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||||||
import 'package:qinglong_app/base/http/api.dart';
|
import 'package:qinglong_app/base/http/api.dart';
|
||||||
import 'package:qinglong_app/base/http/http.dart';
|
import 'package:qinglong_app/base/http/http.dart';
|
||||||
import 'package:qinglong_app/base/ql_app_bar.dart';
|
import 'package:qinglong_app/base/ql_app_bar.dart';
|
||||||
|
import 'package:qinglong_app/base/userinfo_viewmodel.dart';
|
||||||
import 'package:qinglong_app/module/others/dependencies/dependency_viewmodel.dart';
|
import 'package:qinglong_app/module/others/dependencies/dependency_viewmodel.dart';
|
||||||
import 'package:qinglong_app/utils/extension.dart';
|
import 'package:qinglong_app/utils/extension.dart';
|
||||||
|
|
||||||
|
import '../../../main.dart';
|
||||||
|
|
||||||
class AddDependencyPage extends ConsumerStatefulWidget {
|
class AddDependencyPage extends ConsumerStatefulWidget {
|
||||||
const AddDependencyPage({
|
const AddDependencyPage({
|
||||||
Key? key,
|
Key? key,
|
||||||
@@ -132,6 +135,7 @@ class _AddDependencyPageState extends ConsumerState<AddDependencyPage> {
|
|||||||
height: 10,
|
height: 10,
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
controller: _nameController,
|
controller: _nameController,
|
||||||
decoration: const InputDecoration(
|
decoration: const InputDecoration(
|
||||||
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
|
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
|
||||||
|
|||||||
@@ -278,6 +278,53 @@ class _OtherPageState extends ConsumerState<OtherPage> {
|
|||||||
const Divider(
|
const Divider(
|
||||||
indent: 15,
|
indent: 15,
|
||||||
),
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(
|
||||||
|
left: 15,
|
||||||
|
right: 15,
|
||||||
|
top: 5,
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"禁止读取剪切板",
|
||||||
|
style: TextStyle(
|
||||||
|
color: ref.watch(themeProvider).themeColor.titleColor(),
|
||||||
|
fontSize: 16,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"开启后输入框无法使用系统自带的复制粘贴功能,输入法的复制粘贴功能不受影响",
|
||||||
|
style: TextStyle(
|
||||||
|
color: ref.watch(themeProvider).themeColor.descColor(),
|
||||||
|
fontSize: 12,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
CupertinoSwitch(
|
||||||
|
value: getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
|
onChanged: (forbid) {
|
||||||
|
getIt<UserInfoViewModel>().forbidReadClipBoard(forbid);
|
||||||
|
setState(() {
|
||||||
|
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Divider(
|
||||||
|
indent: 15,
|
||||||
|
),
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
behavior: HitTestBehavior.opaque,
|
behavior: HitTestBehavior.opaque,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
|||||||
@@ -4,9 +4,12 @@ import 'package:qinglong_app/base/http/api.dart';
|
|||||||
import 'package:qinglong_app/base/http/http.dart';
|
import 'package:qinglong_app/base/http/http.dart';
|
||||||
import 'package:qinglong_app/base/ql_app_bar.dart';
|
import 'package:qinglong_app/base/ql_app_bar.dart';
|
||||||
import 'package:qinglong_app/base/theme.dart';
|
import 'package:qinglong_app/base/theme.dart';
|
||||||
|
import 'package:qinglong_app/base/userinfo_viewmodel.dart';
|
||||||
import 'package:qinglong_app/module/config/config_viewmodel.dart';
|
import 'package:qinglong_app/module/config/config_viewmodel.dart';
|
||||||
import 'package:qinglong_app/utils/extension.dart';
|
import 'package:qinglong_app/utils/extension.dart';
|
||||||
|
|
||||||
|
import '../../../main.dart';
|
||||||
|
|
||||||
class ScriptEditPage extends ConsumerStatefulWidget {
|
class ScriptEditPage extends ConsumerStatefulWidget {
|
||||||
final String content;
|
final String content;
|
||||||
final String title;
|
final String title;
|
||||||
@@ -77,6 +80,7 @@ class _ScriptEditPageState extends ConsumerState<ScriptEditPage> {
|
|||||||
),
|
),
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
child: TextField(
|
child: TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
focusNode: node,
|
focusNode: node,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: ref.read(themeProvider).themeColor.descColor(),
|
color: ref.read(themeProvider).themeColor.descColor(),
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ class _UpdatePasswordPageState extends ConsumerState<UpdatePasswordPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
focusNode: focusNode,
|
focusNode: focusNode,
|
||||||
controller: _nameController,
|
controller: _nameController,
|
||||||
decoration: const InputDecoration(
|
decoration: const InputDecoration(
|
||||||
@@ -122,6 +123,7 @@ class _UpdatePasswordPageState extends ConsumerState<UpdatePasswordPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
obscureText: true,
|
obscureText: true,
|
||||||
controller: _passwordController,
|
controller: _passwordController,
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
@@ -153,6 +155,7 @@ class _UpdatePasswordPageState extends ConsumerState<UpdatePasswordPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: false,
|
||||||
obscureText: true,
|
obscureText: true,
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
controller: _passwordAgainController,
|
controller: _passwordAgainController,
|
||||||
|
|||||||
@@ -3,10 +3,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||||||
import 'package:qinglong_app/base/http/api.dart';
|
import 'package:qinglong_app/base/http/api.dart';
|
||||||
import 'package:qinglong_app/base/http/http.dart';
|
import 'package:qinglong_app/base/http/http.dart';
|
||||||
import 'package:qinglong_app/base/ql_app_bar.dart';
|
import 'package:qinglong_app/base/ql_app_bar.dart';
|
||||||
|
import 'package:qinglong_app/base/userinfo_viewmodel.dart';
|
||||||
import 'package:qinglong_app/module/task/task_bean.dart';
|
import 'package:qinglong_app/module/task/task_bean.dart';
|
||||||
import 'package:qinglong_app/module/task/task_viewmodel.dart';
|
import 'package:qinglong_app/module/task/task_viewmodel.dart';
|
||||||
import 'package:qinglong_app/utils/extension.dart';
|
import 'package:qinglong_app/utils/extension.dart';
|
||||||
|
|
||||||
|
import '../../main.dart';
|
||||||
|
|
||||||
class AddTaskPage extends ConsumerStatefulWidget {
|
class AddTaskPage extends ConsumerStatefulWidget {
|
||||||
final TaskBean? taskBean;
|
final TaskBean? taskBean;
|
||||||
|
|
||||||
@@ -98,6 +101,7 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
focusNode: focusNode,
|
focusNode: focusNode,
|
||||||
controller: _nameController,
|
controller: _nameController,
|
||||||
decoration: const InputDecoration(
|
decoration: const InputDecoration(
|
||||||
@@ -128,6 +132,7 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
controller: _commandController,
|
controller: _commandController,
|
||||||
maxLines: 4,
|
maxLines: 4,
|
||||||
minLines: 1,
|
minLines: 1,
|
||||||
@@ -159,6 +164,7 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
|
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||||
controller: _cronController,
|
controller: _cronController,
|
||||||
decoration: const InputDecoration(
|
decoration: const InputDecoration(
|
||||||
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
|
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
|
||||||
|
|||||||
Reference in New Issue
Block a user