@ -1,2 +1,2 @@
|
||||
FLUTTER_VERSION=3.32.1
|
||||
FLUTTER_VERSION=3.32.4
|
||||
JAVA_VERSION=17
|
||||
|
||||
@ -0,0 +1 @@
|
||||
vodozemac_bindings_dart*
|
||||
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 433 KiB |
|
After Width: | Height: | Size: 385 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 557 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 408 KiB |
|
After Width: | Height: | Size: 288 KiB |
|
After Width: | Height: | Size: 555 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 556 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 389 KiB |
|
After Width: | Height: | Size: 274 KiB |
|
After Width: | Height: | Size: 542 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 435 KiB |
|
After Width: | Height: | Size: 952 KiB |
|
After Width: | Height: | Size: 248 KiB |
|
After Width: | Height: | Size: 426 KiB |
|
After Width: | Height: | Size: 951 KiB |
|
After Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 258 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 518 KiB |
|
Before Width: | Height: | Size: 370 KiB |
|
Before Width: | Height: | Size: 358 KiB |
|
Before Width: | Height: | Size: 170 KiB |
|
Before Width: | Height: | Size: 258 KiB |
|
Before Width: | Height: | Size: 206 KiB |
|
Before Width: | Height: | Size: 345 KiB |
@ -1,3 +1,8 @@
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "fastlane"
|
||||
|
||||
# Workaround for ruby 3.4 https://github.com/fastlane/fastlane/issues/29183
|
||||
gem "abbrev"
|
||||
gem "mutex_m"
|
||||
gem "ostruct"
|
||||
@ -1,29 +1,35 @@
|
||||
{
|
||||
"repeatPassword": "Gentag password",
|
||||
"@repeatPassword": {},
|
||||
"notAnImage": "Ikke en billedfil.",
|
||||
"@notAnImage": {},
|
||||
"setCustomPermissionLevel": "Indstil særligt tilladelsesniveau",
|
||||
"@setCustomPermissionLevel": {},
|
||||
"setPermissionsLevelDescription": "Vælg en prædefineret rolle herunder eller indtaste et særligt tilladelsesniveau mellem 0 og 100.",
|
||||
"@setPermissionsLevelDescription": {},
|
||||
"ignoreUser": "Ignorér bruger",
|
||||
"@ignoreUser": {},
|
||||
"remove": "Fjern",
|
||||
"@remove": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"importNow": "Importer nu",
|
||||
"@importNow": {},
|
||||
"importEmojis": "Importer emojis",
|
||||
"@importEmojis": {},
|
||||
"normalUser": "Normal bruger",
|
||||
"@normalUser": {},
|
||||
"importFromZipFile": "Importer fra .zip fil",
|
||||
"@importFromZipFile": {},
|
||||
"alwaysUse24HourFormat": "true",
|
||||
"@alwaysUse24HourFormat": {
|
||||
"description": "Set to true to always display time of day in 24 hour format."
|
||||
}
|
||||
}
|
||||
"repeatPassword": "Gentag password",
|
||||
"@repeatPassword": {},
|
||||
"notAnImage": "Ikke en billedfil.",
|
||||
"@notAnImage": {},
|
||||
"setCustomPermissionLevel": "Indstil særligt tilladelsesniveau",
|
||||
"@setCustomPermissionLevel": {},
|
||||
"setPermissionsLevelDescription": "Vælg en prædefineret rolle herunder eller indtaste et særligt tilladelsesniveau mellem 0 og 100.",
|
||||
"@setPermissionsLevelDescription": {},
|
||||
"ignoreUser": "Ignorér bruger",
|
||||
"@ignoreUser": {},
|
||||
"remove": "Fjern",
|
||||
"@remove": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"importNow": "Importer nu",
|
||||
"@importNow": {},
|
||||
"importEmojis": "Importer emojis",
|
||||
"@importEmojis": {},
|
||||
"normalUser": "Normal bruger",
|
||||
"@normalUser": {},
|
||||
"importFromZipFile": "Importer fra .zip fil",
|
||||
"@importFromZipFile": {},
|
||||
"alwaysUse24HourFormat": "true",
|
||||
"@alwaysUse24HourFormat": {
|
||||
"description": "Set to true to always display time of day in 24 hour format."
|
||||
},
|
||||
"exportEmotePack": "Eksportér Emote-pakke som .zip-fil",
|
||||
"@exportEmotePack": {},
|
||||
"replace": "Erstat",
|
||||
"@replace": {},
|
||||
"about": "Om",
|
||||
"@about": {}
|
||||
}
|
||||
|
||||
@ -1,119 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/config/app_emojis.dart';
|
||||
import 'package:fluffychat/pages/chat/chat.dart';
|
||||
import '../../config/themes.dart';
|
||||
|
||||
class ReactionsPicker extends StatelessWidget {
|
||||
final ChatController controller;
|
||||
|
||||
const ReactionsPicker(this.controller, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final theme = Theme.of(context);
|
||||
|
||||
if (controller.showEmojiPicker) return const SizedBox.shrink();
|
||||
final display = controller.editEvent == null &&
|
||||
controller.replyEvent == null &&
|
||||
controller.room.canSendDefaultMessages &&
|
||||
controller.selectedEvents.isNotEmpty;
|
||||
return AnimatedContainer(
|
||||
duration: FluffyThemes.animationDuration,
|
||||
curve: FluffyThemes.animationCurve,
|
||||
// #Pangea
|
||||
// height: (display) ? 56 : 0,
|
||||
height: (display) ? AppConfig.reactionsPickerHeight : 0,
|
||||
// Pangea#
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
child: Builder(
|
||||
builder: (context) {
|
||||
if (!display) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
final emojis = List<String>.from(AppEmojis.emojis);
|
||||
final allReactionEvents = controller.selectedEvents.first
|
||||
.aggregatedEvents(
|
||||
controller.timeline!,
|
||||
RelationshipTypes.reaction,
|
||||
)
|
||||
.where(
|
||||
(event) =>
|
||||
event.senderId == event.room.client.userID &&
|
||||
event.type == 'm.reaction',
|
||||
);
|
||||
|
||||
for (final event in allReactionEvents) {
|
||||
try {
|
||||
emojis.remove(event.content.tryGetMap('m.relates_to')!['key']);
|
||||
} catch (_) {}
|
||||
}
|
||||
return Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Container(
|
||||
decoration: const BoxDecoration(
|
||||
// #Pangea
|
||||
// color: theme.colorScheme.onInverseSurface,
|
||||
// Pangea#
|
||||
borderRadius: BorderRadius.only(
|
||||
bottomRight: Radius.circular(AppConfig.borderRadius),
|
||||
),
|
||||
),
|
||||
padding: const EdgeInsets.only(right: 1),
|
||||
child: ListView.builder(
|
||||
scrollDirection: Axis.horizontal,
|
||||
itemCount: emojis.length,
|
||||
itemBuilder: (c, i) => InkWell(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
onTap: () => controller.sendEmojiAction(emojis[i]),
|
||||
child: Container(
|
||||
// #Pangea
|
||||
// width: 56,
|
||||
// height: 56,
|
||||
width: AppConfig.reactionsPickerHeight,
|
||||
height: AppConfig.reactionsPickerHeight,
|
||||
// Pangea#
|
||||
alignment: Alignment.center,
|
||||
child: Text(
|
||||
emojis[i],
|
||||
// #Pangea
|
||||
// style: const TextStyle(fontSize: 30),
|
||||
style: const TextStyle(fontSize: 20),
|
||||
// Pangea#
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
InkWell(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
child: Container(
|
||||
margin: const EdgeInsets.symmetric(horizontal: 8),
|
||||
width: 36,
|
||||
// #Pangea
|
||||
// height: 56,
|
||||
height: AppConfig.reactionsPickerHeight,
|
||||
// Pangea#
|
||||
decoration: BoxDecoration(
|
||||
color: theme.colorScheme.onInverseSurface,
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: const Icon(Icons.add_outlined),
|
||||
),
|
||||
onTap: () =>
|
||||
controller.pickEmojiReactionAction(allReactionEvents),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,153 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pages/login/login.dart';
|
||||
import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart';
|
||||
import 'package:fluffychat/widgets/future_loading_dialog.dart';
|
||||
import '../../../widgets/matrix.dart';
|
||||
|
||||
extension PangeaPasswordForgotten on LoginController {
|
||||
void pangeaPasswordForgotten() async {
|
||||
final TextEditingController emailController = TextEditingController();
|
||||
final TextEditingController newPasswordController = TextEditingController();
|
||||
showDialog(
|
||||
context: context,
|
||||
useRootNavigator: false,
|
||||
builder: (BuildContext context) => Scaffold(
|
||||
backgroundColor: Colors.transparent,
|
||||
body: AlertDialog(
|
||||
title: Text(L10n.of(context).passwordForgotten),
|
||||
content: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(L10n.of(context).enterAnEmailAddress),
|
||||
const SizedBox(height: 12),
|
||||
TextField(
|
||||
controller: emailController,
|
||||
decoration: InputDecoration(
|
||||
hintText: L10n.of(context).enterAnEmailAddress,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
child: Text(L10n.of(context).cancel),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
return;
|
||||
},
|
||||
),
|
||||
TextButton(
|
||||
child: Text(L10n.of(context).ok),
|
||||
onPressed: () async {
|
||||
if (emailController.text == "") return;
|
||||
final clientSecret =
|
||||
DateTime.now().millisecondsSinceEpoch.toString();
|
||||
final response = await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => Matrix.of(context)
|
||||
.getLoginClient()
|
||||
.requestTokenToResetPasswordEmail(
|
||||
clientSecret,
|
||||
emailController.text,
|
||||
LoginController.sendAttempt++,
|
||||
),
|
||||
);
|
||||
if (response.error != null) {
|
||||
return;
|
||||
}
|
||||
Navigator.of(context).pop();
|
||||
showDialog(
|
||||
context: context,
|
||||
useRootNavigator: false,
|
||||
builder: (BuildContext context) => Scaffold(
|
||||
backgroundColor: Colors.transparent,
|
||||
body: AlertDialog(
|
||||
title: Text(L10n.of(context).passwordForgotten),
|
||||
content: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(L10n.of(context).chooseAStrongPassword),
|
||||
const SizedBox(height: 12),
|
||||
TextField(
|
||||
obscureText: true,
|
||||
controller: newPasswordController,
|
||||
decoration: const InputDecoration(
|
||||
hintText: "******",
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
child: Text(L10n.of(context).cancel),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
return;
|
||||
},
|
||||
),
|
||||
TextButton(
|
||||
child: Text(L10n.of(context).ok),
|
||||
onPressed: () async {
|
||||
if (newPasswordController.text == "") return;
|
||||
final ok = await showOkAlertDialog(
|
||||
useRootNavigator: false,
|
||||
context: context,
|
||||
title: L10n.of(context).weSentYouAnEmail,
|
||||
// #Pangea
|
||||
// message: L10n.of(context).pleaseClickOnLink,
|
||||
message: L10n.of(context).clickOnEmailLink,
|
||||
// Pangea#
|
||||
okLabel: L10n.of(context).iHaveClickedOnLink,
|
||||
);
|
||||
if (ok != OkCancelResult.ok) return;
|
||||
final data = <String, dynamic>{
|
||||
'new_password': newPasswordController.text,
|
||||
'logout_devices': false,
|
||||
"auth": AuthenticationThreePidCreds(
|
||||
type: AuthenticationTypes.emailIdentity,
|
||||
threepidCreds: ThreepidCreds(
|
||||
sid: response.result!.sid,
|
||||
clientSecret: clientSecret,
|
||||
),
|
||||
).toJson(),
|
||||
};
|
||||
final success = await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () =>
|
||||
Matrix.of(context).getLoginClient().request(
|
||||
RequestType.POST,
|
||||
'/client/r0/account/password',
|
||||
data: data,
|
||||
),
|
||||
);
|
||||
if (success.error == null) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(
|
||||
L10n.of(context).passwordHasBeenChanged,
|
||||
),
|
||||
),
|
||||
);
|
||||
usernameController.text = emailController.text;
|
||||
passwordController.text =
|
||||
newPasswordController.text;
|
||||
login();
|
||||
}
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||