Compare commits

..

139 commits

Author SHA1 Message Date
Krille-chan
03c0b8736c
Merge pull request #2719 from krille-chan/krille/add-changelog-2-5-0
build: Add changelog and update kotlin
2026-03-17 08:43:28 +01:00
Christian Kußowski
9fde066a5b
build: Add changelog 2026-03-16 13:09:53 +01:00
Krille-chan
344e84ae3e
Merge pull request #2716 from krille-chan/krille/remove-unused-dependencies
refactor: Remove unused dependencies and add CI check
2026-03-16 12:13:03 +01:00
Christian Kußowski
7128ba98b2
refactor: Remove unused dependencies and add CI check 2026-03-16 09:44:00 +01:00
Krille-chan
2f35f07252
Merge pull request #2715 from krille-chan/krille/fix-release-web-job
chore: Fix releas web job
2026-03-16 09:42:55 +01:00
Christian Kußowski
9e29533502
chore: Fix releas web job 2026-03-16 09:17:00 +01:00
Krille-chan
e0738cca97
Merge pull request #2714 from weblate/weblate-fluffychat-translations
Translations update from Hosted Weblate
2026-03-16 08:44:41 +01:00
Jelv
14ef8a1d0e
chore(translations): Translated using Weblate (Dutch)
Currently translated at 100.0% (755 of 755 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/
2026-03-16 07:10:03 +00:00
Priit Jõerüüt
0134e9c367
chore(translations): Translated using Weblate (Estonian)
Currently translated at 100.0% (755 of 755 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/
2026-03-16 07:10:02 +00:00
Frank Paul Silye
682090c6d7
chore(translations): Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (755 of 755 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/
2026-03-16 07:10:01 +00:00
Krille-chan
6223ea85b5
Merge pull request #2705 from weblate/weblate-fluffychat-translations
Translations update from Hosted Weblate
2026-03-15 07:15:02 +01:00
Krille-chan
0493e24b08
Merge pull request #2702 from krille-chan/release/v2.5.0
chore: Add changelog for 2.5.0
2026-03-15 07:13:26 +01:00
Krille-chan
8aee82dd6f
Merge pull request #2707 from Aegeontis/patch-1
Small fix: Invert condition for creating voipPlugin
2026-03-15 07:05:35 +01:00
josé m.
eab984541e
chore(translations): Translated using Weblate (Galician)
Currently translated at 100.0% (755 of 755 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/
2026-03-15 03:23:24 +01:00
大王叫我来巡山
dda8e6cbc7
chore(translations): Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (755 of 755 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/
2026-03-15 03:23:24 +01:00
Aegeontis
f9bb2715b0
fix: invert condition for creating voipPlugin 2026-03-14 16:26:12 +01:00
josé m.
f6c4e69302
chore(translations): Translated using Weblate (Galician)
Currently translated at 100.0% (753 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/
2026-03-14 12:10:16 +00:00
大王叫我来巡山
b8a2d19d2f
chore(translations): Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (753 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/
2026-03-14 12:10:15 +00:00
Jelv
df9325a5e4
chore(translations): Translated using Weblate (Dutch)
Currently translated at 100.0% (753 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/
2026-03-14 12:10:14 +00:00
Priit Jõerüüt
b333d78c8c
chore(translations): Translated using Weblate (Estonian)
Currently translated at 100.0% (753 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/
2026-03-14 12:10:13 +00:00
Frank Paul Silye
358c7f25d4
chore(translations): Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (753 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/
2026-03-14 12:10:12 +00:00
Christian
1bd1298443
chore(translations): Translated using Weblate (German)
Currently translated at 100.0% (753 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/
2026-03-14 12:10:11 +00:00
Aindriú Mac Giolla Eoin
f6a739b78e
chore(translations): Translated using Weblate (Irish)
Currently translated at 100.0% (753 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/
2026-03-14 12:10:10 +00:00
Krille-chan
4a8773c67b
Merge pull request #2703 from krille-chan/krille/follow-up-low-priority
chore: Follow up low priority
2026-03-13 19:37:32 +01:00
Christian Kußowski
ac24b86a3a
chore: Follow up low priority 2026-03-13 19:12:38 +01:00
Christian Kußowski
17b5304995
chore: Add changelog for 2.5.0 2026-03-13 18:43:55 +01:00
Krille-chan
74c3277eb6
Merge pull request #2694 from krille-chan/dependabot/pub/wakelock_plus-1.5.0
build: (deps): bump wakelock_plus from 1.4.0 to 1.5.0
2026-03-13 18:09:53 +01:00
dependabot[bot]
c9e16cc469
build: (deps): bump wakelock_plus from 1.4.0 to 1.5.0
Bumps [wakelock_plus](https://github.com/fluttercommunity/wakelock_plus) from 1.4.0 to 1.5.0.
- [Commits](https://github.com/fluttercommunity/wakelock_plus/compare/wakelock_plus_1.4.0...wakelock_plus_1.5.0)

---
updated-dependencies:
- dependency-name: wakelock_plus
  dependency-version: 1.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-13 17:44:52 +01:00
Krille-chan
4b676cc23b
Merge pull request #2701 from krille-chan/krille/follow-up-43
chore: Introduce tool versions file
2026-03-13 17:43:05 +01:00
Christian Kußowski
f961b22435
feat: Implement low priority for rooms 2026-03-13 17:21:00 +01:00
Christian Kußowski
de96b27e29
build: Update matrix dart sdk to 6.2.0 2026-03-13 16:21:04 +01:00
Christian Kußowski
06827038d8
chore: Introduce tool versions file 2026-03-13 16:21:04 +01:00
Christian Kußowski
3b204373e9
chore: Make banner light red 2026-03-13 16:21:04 +01:00
Krille-chan
aa605ae0c1
Merge pull request #2700 from weblate/weblate-fluffychat-translations
Translations update from Hosted Weblate
2026-03-13 13:31:47 +01:00
Christian
f64cc1e996
chore(translations): Translated using Weblate (German)
Currently translated at 100.0% (753 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/
2026-03-13 12:32:58 +01:00
大王叫我来巡山
25814f4a52
chore(translations): Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (752 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/
2026-03-13 12:32:58 +01:00
Jelv
77fbf33f90
chore(translations): Translated using Weblate (Dutch)
Currently translated at 99.6% (750 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/
2026-03-13 12:32:58 +01:00
Christian
46b1a4846d
chore(translations): Translated using Weblate (English)
Currently translated at 100.0% (753 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/en/
2026-03-13 12:32:58 +01:00
Krille-chan
33d28c2f94
Merge pull request #2699 from weblate/weblate-fluffychat-translations
Translations update from Hosted Weblate
2026-03-13 11:27:01 +01:00
Christian
1157cf96b3 chore(translations): Translated using Weblate (German)
Currently translated at 100.0% (753 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/
2026-03-13 10:48:01 +01:00
Christian
0294b8d29b chore(translations): Translated using Weblate (English)
Currently translated at 100.0% (753 of 753 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/en/
2026-03-13 10:48:01 +01:00
Krille-chan
4f09b43f0e
Merge pull request #2697 from krille-chan/krille/switch-flutter-constraints
build: Use flutter constraints instead of fixed in pubspec.yaml
2026-03-13 10:32:10 +01:00
Krille-chan
e68424e1e8
Merge pull request #2698 from krille-chan/krille/add-config-search-field
chore: Add config search textfield
2026-03-13 09:41:05 +01:00
Christian Kußowski
54a7b4ea69
chore: Add config search textfield 2026-03-13 09:16:54 +01:00
Christian Kußowski
1f42aa3605
build: Update dart to 3.11.1 2026-03-13 08:57:08 +01:00
Krille-chan
9c28e5ed6e
Merge pull request #2696 from krille-chan/krille/adjust-designs-42
chore: Adjust support button design
2026-03-13 08:56:35 +01:00
Christian Kußowski
54ba19d39e
chore: Adjust support button design 2026-03-13 08:30:47 +01:00
Krille-chan
eea4e431b4
Merge pull request #2693 from krille-chan/krille/login-with-localhost
chore: Login with localhost
2026-03-12 18:31:12 +01:00
Krille-chan
e95069478d
Merge pull request #2692 from krille-chan/krille/support-button-everywhere
chore: Add support button everywhere
2026-03-12 18:20:27 +01:00
Christian Kußowski
9ede56427f
chore: Login with localhost 2026-03-12 17:55:50 +01:00
Christian Kußowski
6c05ed8aaa
chore: Add support button everywhere 2026-03-12 17:48:31 +01:00
Krille-chan
76fdabecaa
Merge pull request #2690 from krille-chan/krille/build-website-in-release-job
chore: Adjust styles and animations
2026-03-12 16:52:02 +01:00
Krille-chan
4ed353fbbd
Merge pull request #2689 from weblate/weblate-fluffychat-translations
Translations update from Hosted Weblate
2026-03-12 13:59:00 +01:00
Christian Kußowski
9724b852bb
chore: Adjust styles and animations 2026-03-12 12:03:03 +01:00
xabirequejo
a8a0212d3d
chore(translations): Translated using Weblate (Basque)
Currently translated at 99.8% (747 of 748 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/eu/
2026-03-12 10:09:59 +01:00
Christian Kußowski
5c88133691
build: Build website in release job 2026-03-12 09:54:52 +01:00
Krille-chan
9b531179a4
Merge pull request #2688 from krille-chan/dependabot/pub/video_player-2.11.1
build: (deps): Bump video_player from 2.11.0 to 2.11.1
2026-03-12 09:05:29 +01:00
Christian Kußowski
a8aadc834f
refactor: Remove animation dependency 2026-03-12 08:35:27 +01:00
dependabot[bot]
38cda39672
build: Try out flutter contraints 2026-03-12 08:33:39 +01:00
Krille-chan
1770f3e17c
Merge pull request #2663 from krille-chan/dependabot/pub/flutter_local_notifications-21.0.0
build: (deps): Bump flutter_local_notifications from 20.1.0 to 21.0.0
2026-03-11 09:49:57 +01:00
Krille-chan
096a995b89
Merge pull request #2679 from krille-chan/dependabot/pub/translations_cleaner-0.1.1
build: (deps): Bump translations_cleaner from 0.1.0 to 0.1.1
2026-03-11 09:48:46 +01:00
dependabot[bot]
5cc8ab636c
build: (deps): Bump flutter_local_notifications from 20.1.0 to 21.0.0
Bumps [flutter_local_notifications](https://github.com/MaikuB/flutter_local_notifications) from 20.1.0 to 21.0.0.
- [Release notes](https://github.com/MaikuB/flutter_local_notifications/releases)
- [Commits](https://github.com/MaikuB/flutter_local_notifications/compare/flutter_local_notifications-v20.1.0...flutter_local_notifications-v21.0.0)

---
updated-dependencies:
- dependency-name: flutter_local_notifications
  dependency-version: 21.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-11 09:13:38 +01:00
dependabot[bot]
922156498f
build: (deps): Bump translations_cleaner from 0.1.0 to 0.1.1
Bumps [translations_cleaner](https://github.com/Chinmay-KB/translations_cleaner) from 0.1.0 to 0.1.1.
- [Changelog](https://github.com/Chinmay-KB/translations_cleaner/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Chinmay-KB/translations_cleaner/commits/v0.1.1)

---
updated-dependencies:
- dependency-name: translations_cleaner
  dependency-version: 0.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-11 09:13:16 +01:00
Krille-chan
ba06e09b9e
Merge pull request #2678 from weblate/weblate-fluffychat-translations
Translations update from Hosted Weblate
2026-03-11 08:12:51 +01:00
Ettore Atalan
b99b23c652
chore(translations): Translated using Weblate (German)
Currently translated at 98.6% (738 of 748 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/
2026-03-11 01:10:12 +01:00
Jelv
0eecc9597b
chore(translations): Translated using Weblate (Dutch)
Currently translated at 100.0% (748 of 748 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/
2026-03-11 01:10:11 +01:00
Aindriú Mac Giolla Eoin
5fd377a611
chore(translations): Translated using Weblate (Irish)
Currently translated at 100.0% (748 of 748 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/
2026-03-11 01:10:10 +01:00
大王叫我来巡山
26e72d789f
chore(translations): Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (748 of 748 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/
2026-03-11 01:10:08 +01:00
Frank Paul Silye
04edda0b1a
chore(translations): Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (748 of 748 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/
2026-03-11 01:10:07 +01:00
Priit Jõerüüt
657143b3b6
chore(translations): Translated using Weblate (Estonian)
Currently translated at 100.0% (747 of 747 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/
2026-03-11 01:10:06 +01:00
josé m.
d1c96b1c45
chore(translations): Translated using Weblate (Galician)
Currently translated at 100.0% (747 of 747 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/
2026-03-11 01:10:05 +01:00
தமிழ்நேரம்
2d9710d2b4
chore(translations): Translated using Weblate (Tamil)
Currently translated at 100.0% (747 of 747 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ta/
2026-03-11 01:10:04 +01:00
Krille-chan
46bf54e540
Merge pull request #2683 from krille-chan/krille/sso-follow-up
chore: Follow up sso on android
2026-03-10 19:10:44 +01:00
Christian Kußowski
5e368b9df0
chore: Follow up sso on android 2026-03-10 15:51:33 +01:00
Krille-chan
150ab800ee
Merge pull request #2682 from krille-chan/krille/fix-sso-android
chore: Follow up sso on android
2026-03-10 15:00:29 +01:00
Christian Kußowski
14ce0a5927
chore: Follow up sso on android 2026-03-10 14:24:30 +01:00
Krille-chan
57044f01d8
Merge pull request #2681 from krille-chan/krille/small-adjustments
refactor: Disable custom image resizer for macOS and windows
2026-03-10 10:58:34 +01:00
Christian Kußowski
a7c89418eb
chore: Implement pick SSO provider from dialog and add tchncs.de 2026-03-10 10:07:43 +01:00
Christian Kußowski
210ebdae6e
chore: Added deeplinks to test protocol 2026-03-10 09:45:07 +01:00
Christian Kußowski
cd99f6a460
chore: Remove converser from recommended homeservers as it doesn't have open registration 2026-03-10 09:38:13 +01:00
Christian Kußowski
a490a40379
chore: Adjust design 2026-03-10 09:29:45 +01:00
Christian Kußowski
c90fdc3e75
chore: make sendTimelineEventTimeout configurable 2026-03-10 09:13:57 +01:00
Christian Kußowski
e8ee58d6d9
refactor: Disable custom image resizer for macOS and windows 2026-03-10 09:06:03 +01:00
Krille-chan
8571c42ba4
Merge pull request #2676 from krille-chan/krille/minor-fixes
chore: Move website back to fluffychat.im
2026-03-09 18:21:44 +01:00
Christian Kußowski
a2857ef36a
chore: Follow up user viewer 2026-03-09 17:44:11 +01:00
Christian Kußowski
1e763f05f5
fix: Open deep links 2026-03-09 17:42:54 +01:00
Christian Kußowski
47ac9c8f97
chore: Skip matrix notify for events from myself 2026-03-09 17:35:25 +01:00
Christian Kußowski
85c21e61c3
chore: Move website back to fluffychat.im 2026-03-09 17:07:55 +01:00
Christian Kußowski
fc7eb6954c
refactor: Make file events more fail safe for failed to send 2026-03-09 17:01:11 +01:00
Krille-chan
084801fd84
Merge pull request #2670 from weblate/weblate-fluffychat-translations
Translations update from Hosted Weblate
2026-03-09 08:13:00 +01:00
Krille-chan
d2cb802436
Merge pull request #2672 from krille-chan/krille/multiple-fixes
chore: Add reset button for config viewer
2026-03-08 12:11:49 +01:00
Aindriú Mac Giolla Eoin
9438594fa2
chore(translations): Translated using Weblate (Irish)
Currently translated at 100.0% (747 of 747 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/
2026-03-08 11:10:03 +00:00
Frank Paul Silye
1cfda2e338
chore(translations): Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (747 of 747 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/
2026-03-08 11:10:02 +00:00
Jelv
4825135de2
chore(translations): Translated using Weblate (Dutch)
Currently translated at 100.0% (747 of 747 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/
2026-03-08 11:10:01 +00:00
大王叫我来巡山
8f8309aa63
chore(translations): Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (747 of 747 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/
2026-03-08 11:09:59 +00:00
Christian Kußowski
a3a2a37a14
chore: Add reset button for config viewer 2026-03-08 11:12:32 +01:00
Christian Kußowski
bad0a549cb
chore: Follow up remote logout handling 2026-03-08 11:01:38 +01:00
Krille-chan
71bbe4ad74
Merge pull request #2671 from krille-chan/krille/follow-up-fix-oidc
chore: Follow up matrix native oidc
2026-03-08 10:42:44 +01:00
Christian Kußowski
aba8c3faf2
chore: Follow up matrix native oidc 2026-03-08 10:15:45 +01:00
Krille-chan
9c49141f9e
Merge pull request #2669 from krille-chan/krille/mobile-redirect-scheme
chore: Update redirect android scheme
2026-03-07 08:59:34 +01:00
Krille-chan
d2777cacee
Merge pull request #2662 from krille-chan/dependabot/github_actions/docker/build-push-action-7
build: (deps): Bump docker/build-push-action from 6 to 7
2026-03-07 08:45:44 +01:00
Krille-chan
c9e32cdad8
Merge pull request #2666 from weblate/weblate-fluffychat-translations
Translations update from Hosted Weblate
2026-03-07 08:32:50 +01:00
Christian Kußowski
e0c20f249b
chore: Update redirect android scheme 2026-03-07 08:21:50 +01:00
dependabot[bot]
ece4628751
build: (deps): Bump docker/build-push-action from 6 to 7
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6 to 7.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6...v7)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-07 07:56:19 +01:00
gredzikk
edf7d81b60
chore(translations): Translated using Weblate (Polish)
Currently translated at 99.2% (845 of 851 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/pl/
2026-03-07 07:55:48 +01:00
Krille-chan
9d229e04c6
Merge pull request #2665 from krille-chan/krille/retry-sign-in-tap-in-tests
chore: Retry sign in tap in tests
2026-03-06 09:27:37 +01:00
Christian Kußowski
89864cfd0c
chore: Retry sign in tap in tests 2026-03-06 08:52:05 +01:00
Krille-chan
9f9111dac2
Merge pull request #2661 from krille-chan/dependabot/github_actions/docker/metadata-action-6
build: (deps): Bump docker/metadata-action from 5 to 6
2026-03-06 08:24:39 +01:00
Krille-chan
43ba692a21
Merge pull request #2656 from krille-chan/krille/follow-up-search-homeserver
chore: Follow up search for homeserver
2026-03-06 07:17:34 +01:00
Krille-chan
39845d95ab
Merge pull request #2659 from krille-chan/krille-chan-patch-1
chore: follow up borderradius
2026-03-06 07:13:45 +01:00
dependabot[bot]
d0901da51e
build: (deps): Bump docker/metadata-action from 5 to 6
Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 5 to 6.
- [Release notes](https://github.com/docker/metadata-action/releases)
- [Commits](https://github.com/docker/metadata-action/compare/v5...v6)

---
updated-dependencies:
- dependency-name: docker/metadata-action
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-05 21:33:52 +00:00
Krille-chan
424d4eef40
Merge pull request #2660 from krille-chan/krille-chan-patch-2
chore: follow up user dialog
2026-03-05 21:02:15 +01:00
Krille-chan
dba3553a59
chore: follow up user dialog 2026-03-05 18:56:33 +01:00
Krille-chan
cb8b3be205
chore: follow up borderradius 2026-03-05 18:55:13 +01:00
Krille-chan
661339f7ab
Merge pull request #2657 from krille-chan/krille/follow-up-user-dialog
chore: Follow up user dialog
2026-03-05 16:06:49 +01:00
Christian Kußowski
0fe91bfe14
chore: Follow up user dialog 2026-03-05 15:28:42 +01:00
Krille-chan
993e12a946
Merge pull request #2655 from krille-chan/krille/add-mute-notification-action
feat: Add mute notification action
2026-03-05 15:08:13 +01:00
Christian Kußowski
18d98d96c6
chore: Follow up search for homeserver 2026-03-05 14:36:18 +01:00
Christian Kußowski
d1abd71527
feat: Add mute notification action 2026-03-05 14:35:08 +01:00
Krille-chan
febd0e6b41
Merge pull request #2654 from krille-chan/krille/uri-data-from-bytes
refactor: Use native uri data from bytes instead of html
2026-03-05 13:56:49 +01:00
Krille-chan
d69b42e1c5
Merge pull request #2653 from krille-chan/krille/remove-web-notification-sound
chore: Remove web notification custom sound
2026-03-05 13:53:40 +01:00
Christian Kußowski
bfcd78fcdf
refactor: Use native uri data from bytes instead of html 2026-03-05 13:18:50 +01:00
Christian Kußowski
58d5de4aba
chore: Remove web notification custom sound
Sound is now played on macOS
and Windows by default.
On some Linux distro it may
differ but there it should be
possible to configure it.
2026-03-05 13:12:53 +01:00
Krille-chan
e311c9573e
Merge pull request #2651 from krille-chan/krille/do-not-cancel-on-notification-reply
fix: Do not cancel notification on reply
2026-03-05 13:03:21 +01:00
Krille-chan
8fdf58e071
Merge pull request #2650 from krille-chan/krille/flutter-3-41-4
build: Update to flutter 3.41.4
2026-03-05 12:59:03 +01:00
Christian Kußowski
a22c8fa6fa
fix: Do not cancel notification on reply 2026-03-05 12:38:46 +01:00
Christian Kußowski
9d8c332fc3
build: Update to flutter 3.41.4 2026-03-05 12:21:14 +01:00
Krille-chan
9f5250ee04
Merge pull request #2649 from krille-chan/krille/use-flutter-version-from-pubspec
build: Use flutter version from pubspec.yaml instead of env file
2026-03-05 10:55:08 +01:00
Christian Kußowski
386d01296f
build: Use flutter version from pubspec.yaml instead of env file 2026-03-05 10:24:40 +01:00
Krille-chan
127c3fd7bf
Merge pull request #2648 from krille-chan/krille/use-correct-person-for-android-notification-reply
fix: Use correct own person for android notification replies
2026-03-05 10:09:59 +01:00
Christian Kußowski
c206a51515
fix: Use correct own person for android notification replies 2026-03-05 09:37:38 +01:00
Krille-chan
3165cd6fb6
Merge pull request #2647 from krille-chan/dependabot/github_actions/docker/login-action-4
build: (deps): Bump docker/login-action from 3 to 4
2026-03-05 05:32:58 +01:00
dependabot[bot]
de76969993
build: (deps): Bump docker/login-action from 3 to 4
Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-04 21:33:46 +00:00
Krille-chan
4bbba18cc0
Merge pull request #2645 from krille-chan/krille/set-web-audio-player-mimetype
chore: Follow up audio player mimetype
2026-03-04 15:01:09 +01:00
Christian Kußowski
03f8f98e03
chore: Follow up audio player mimetype 2026-03-04 14:11:51 +01:00
Krille-chan
3c77e2f457
Merge pull request #2643 from krille-chan/krille/check-for-unused-localizations
chore: Check of unused localizations
2026-03-04 08:32:01 +01:00
Christian Kußowski
4dfa9873ee
refactor: Remove unused translations 2026-03-04 07:58:18 +01:00
Christian Kußowski
08e396c02c
refactor: Remove unused localizations 2026-03-04 07:58:08 +01:00
Christian Kußowski
7f7e7eb928
chore: Check of unused localizations 2026-03-04 07:57:03 +01:00
120 changed files with 109959 additions and 106855 deletions

View file

@ -39,3 +39,6 @@ labels: test
10. Drag&Drop to send a file into a chat still works:
- [ ] Web
- [ ] Linux
11. Deeplinks are still working? https://matrix.to/#/@krille:janian.de
- [ ] Android
- [ ] iOS

View file

@ -12,16 +12,15 @@ jobs:
- uses: webiny/action-conventional-commits@v1.3.1
- run: ./scripts/generate-locale-config.sh
- run: git diff --exit-code
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
- uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
flutter-version-file: .tool_versions.yaml
cache: true
- name: Check for unused translations
run: flutter pub run translations_cleaner list-unused-terms -a
- run: flutter pub get
- name: Check if pubspec.lock is up to date
run: git diff --exit-code pubspec.lock
- name: Check for unused localizations
run: dart run remove_unused_localizations --keep-unused && test -z "$(git status --porcelain -- unused_localization_keys.txt)"
- name: Check formatting
run: dart format lib/ test/ --set-exit-if-changed
- name: Check import formatting
@ -29,6 +28,10 @@ jobs:
- name: Check license compliance
run: dart run license_checker check-licenses -c licenses.yaml --problematic
- run: flutter analyze
- name: Search unused dependencies
run: |
dart pub global activate dependency_validator
dart pub global run dependency_validator
- run: dart run dart_code_linter:metrics analyze lib --reporter=github
- run: dart run dart_code_linter:metrics check-unused-code lib
- run: dart run dart_code_linter:metrics check-unused-files lib
@ -51,14 +54,9 @@ jobs:
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/free_up_space
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
- uses: actions/setup-java@v5
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: "zulu"
- uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
flutter-version-file: .tool_versions.yaml
cache: true
- uses: moonrepo/setup-rust@v1
with:
@ -84,10 +82,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
- uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
flutter-version-file: .tool_versions.yaml
cache: true
- uses: moonrepo/setup-rust@v1
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
@ -109,9 +106,9 @@ jobs:
runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}}
steps:
- uses: actions/checkout@v6
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
- name: Install dependencies
run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y
- run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV
- name: Install Flutter
run: |
git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git
@ -125,10 +122,9 @@ jobs:
runs-on: macos-15
steps:
- uses: actions/checkout@v6
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
- uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
flutter-version-file: .tool_versions.yaml
cache: true
- name: Use Xcode 16.4
run: sudo xcode-select --switch /Applications/Xcode_16.4.app
@ -202,7 +198,7 @@ jobs:
echo "Generated AVD snapshot for caching."
- uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
flutter-version-file: .tool_versions.yaml
cache: true
- uses: remarkablemark/setup-maestro-cli@v1
- name: Load integration test env
@ -241,7 +237,6 @@ jobs:
script: |
flutter run --use-application-binary=$PWD/app-debug.apk > flutter_logs.txt 2>&1 &
FLUTTER_PID=$!
sleep 10
maestro test integration_test/login.yaml --env HOMESERVER=10.0.2.2 --env USER1_NAME=${USER1_NAME} --env USER1_PW=${USER1_PW}
kill $FLUTTER_PID 2>/dev/null || true
cp flutter_logs.txt ~/.maestro/tests/

View file

@ -15,10 +15,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
- uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
flutter-version-file: .tool_versions.yaml
- uses: moonrepo/setup-rust@v1
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
- name: Prepare web
@ -40,14 +39,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
- uses: actions/setup-java@v5
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'zulu'
- uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
flutter-version-file: .tool_versions.yaml
cache: true
- name: Set up Ruby
uses: ruby/setup-ruby@v1

View file

@ -8,6 +8,7 @@ on:
jobs:
notify:
if: ${{ (github.event_name == 'issues' && github.event.issue.user.login != 'krille-chan') || (github.event_name == 'pull_request_target' && github.event.pull_request.user.login != 'krille-chan') }}
runs-on: ubuntu-latest
steps:
- name: Send notification to Matrix room

View file

@ -18,10 +18,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
- uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
flutter-version-file: .tool_versions.yaml
cache: true
- uses: moonrepo/setup-rust@v1
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
@ -47,13 +46,25 @@ jobs:
asset_path: fluffychat-web.tar.gz
asset_name: fluffychat-web.tar.gz
asset_content_type: application/gzip
- name: Build Website
- name: Clone fluffychat website
run: |
mkdir public
git clone https://github.com/krille-chan/fluffychat-website.git
cp CHANGELOG.md fluffychat-website/
cp PRIVACY.md fluffychat-website/
- name: Build website
working-directory: fluffychat-website
run: |
npm install tailwindcss @tailwindcss/cli
npx tailwindcss -i ./src/styles.css -o ./src/assets/tailwind.css --minify
npx @11ty/eleventy
mv public ../
- name: Copy FluffyChat web into it
run: |
mkdir public/web
mkdir public/nightly
cp -r build/web/* public/
cp -r build/web/* public/web/
cp -r build/web/* public/nightly/
echo "app.fluffy.chat" >> public/CNAME
echo "fluffychat.im" >> public/CNAME
- name: Deploy to GitHub Pages
if: startsWith(github.ref, 'refs/tags/v')
uses: peaceiris/actions-gh-pages@v4
@ -61,20 +72,15 @@ jobs:
personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }}
publish_dir: ./public
publish_branch: gh-pages
cname: app.fluffy.chat
cname: fluffychat.im
build_apk:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
- uses: actions/setup-java@v5
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'zulu'
- uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
flutter-version-file: .tool_versions.yaml
cache: true
- name: Add Firebase Messaging
run: |
@ -107,9 +113,9 @@ jobs:
runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}}
steps:
- uses: actions/checkout@v6
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
- name: Install dependencies
run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y
- run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV
- name: Install Flutter
run: |
git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git
@ -133,14 +139,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
- uses: actions/setup-java@v5
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'zulu'
- uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
flutter-version-file: .tool_versions.yaml
cache: true
- name: Set up Ruby
uses: ruby/setup-ruby@v1
@ -191,18 +192,18 @@ jobs:
- name: Check out Git repository
uses: actions/checkout@v6
- name: Log in to the Container registry
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@v6
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build and push Docker image
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
context: .
push: true

View file

@ -1,2 +0,0 @@
FLUTTER_VERSION=3.41.2
JAVA_VERSION=17

2
.tool_versions.yaml Normal file
View file

@ -0,0 +1,2 @@
environment:
flutter: 3.41.4

View file

@ -1,3 +1,162 @@
## v2.5.0
FluffyChat 2.5.0 introduces a new homeserver picker for onboarding, better image compression performance and several smaller new features, design adjustments and bug fixes.
- feat: Add mute notification action (Christian Kußowski)
- feat: Add presetHomeserver config to enforce a homeserver for web (Christian Kußowski)
- feat: Display particle animation on login page (Christian Kußowski)
- feat: Display read receipts for every event (Christian Kußowski)
- feat: Enable audio recording on web (Christian Kußowski)
- feat: Implement low priority for rooms (Christian Kußowski)
- feat: Implement matrix native oidc (Christian Kußowski)
- feat: Implement new sign in flow (Christian Kußowski)
- feat: OIDC Login on same page (Christian Kußowski)
- feat: Reenable native imaging for all platforms (Christian Kußowski)
- feat: Remember last successful logged in homeserver (Christian Kußowski)
- Add lld to install custom dependency for Linux in README (Stephen)
- build: Add llvm-18 to packages for snap (krille-chan)
- build: Add maestro based integration tests (Christian Kußowski)
- chore(translations): Added translation using Weblate (Albanian) (Besnik Bleta)
- chore(translations): Added translation using Weblate (Kabyle) (Amadɣas)
- chore(translations): Translated using Weblate (Basque) (xabirequejo)
- chore(translations): Translated using Weblate (Catalan) (fadelkon)
- chore(translations): Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山)
- chore(translations): Translated using Weblate (Croatian) (Milo Ivir)
- chore(translations): Translated using Weblate (Czech) (Matyáš Caras)
- chore(translations): Translated using Weblate (Danish) (Øjvind Fritjof Arnfred)
- chore(translations): Translated using Weblate (Dutch) (Jelv)
- chore(translations): Translated using Weblate (English) (Christian)
- chore(translations): Translated using Weblate (English) (SpikyBee)
- chore(translations): Translated using Weblate (Estonian) (Priit Jõerüüt)
- chore(translations): Translated using Weblate (Galician) (josé m.)
- chore(translations): Translated using Weblate (Georgian) (Dimitri Tabatadze)
- chore(translations): Translated using Weblate (Georgian) (Temuri Doghonadze)
- chore(translations): Translated using Weblate (German) (Christian)
- chore(translations): Translated using Weblate (German) (Ettore Atalan)
- chore(translations): Translated using Weblate (German) (nautilusx)
- chore(translations): Translated using Weblate (Hindi) (Vishal Singh)
- chore(translations): Translated using Weblate (Indonesian) (Arif Budiman)
- chore(translations): Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin)
- chore(translations): Translated using Weblate (Japanese) (NPL)
- chore(translations): Translated using Weblate (Japanese) (Sayaka Halton)
- chore(translations): Translated using Weblate (Kabyle) (Amadɣas)
- chore(translations): Translated using Weblate (Kabyle) (ButterflyOfFire)
- chore(translations): Translated using Weblate (Kabyle) (Christian)
- chore(translations): Translated using Weblate (Latvian) (Edgars Andersons)
- chore(translations): Translated using Weblate (Norwegian Bokmål) (Frank Paul Silye)
- chore(translations): Translated using Weblate (Norwegian Bokmål) (sunniva)
- chore(translations): Translated using Weblate (Persian) (saok91)
- chore(translations): Translated using Weblate (Polish) (gredzikk)
- chore(translations): Translated using Weblate (Portuguese (Brazil)) (Logaritmica)
- chore(translations): Translated using Weblate (Russian) (-)
- chore(translations): Translated using Weblate (Russian) (Artem Pereverzev)
- chore(translations): Translated using Weblate (Russian) (mikinol)
- chore(translations): Translated using Weblate (Spanish) (Kimby)
- chore(translations): Translated using Weblate (Spanish) (SpikyBee)
- chore(translations): Translated using Weblate (Swedish) (Malva Jakobsson)
- chore(translations): Translated using Weblate (Swedish) (spinningpaprika)
- chore(translations): Translated using Weblate (Tamil) (தமிழ்நேரம்)
- chore(translations): Translated using Weblate (Ukrainian) (Andriy Kushnir)
- chore(translations): Translated using Weblate (Ukrainian) (Ihor Hordiichuk)
- chore(translations): Translated using Weblate (Uzbek) (BeMeritus)
- chore: Add config search textfield (Christian Kußowski)
- chore: Add matrix notify workflow (Christian Kußowski)
- chore: Add recommended homeservers (Christian Kußowski)
- chore: Add reset button for config viewer (Christian Kußowski)
- chore: Add support button everywhere (Christian Kußowski)
- chore: Added deeplinks to test protocol (Christian Kußowski)
- chore: Adjust avatar size and chat list item design (krille-chan)
- chore: Adjust chat input row design (Christian Kußowski)
- chore: Adjust design (Christian Kußowski)
- chore: Adjust design of navrail (Christian Kußowski)
- chore: Adjust design of space avatars and more (Christian Kußowski)
- chore: Adjust design of user viewer and popup buttons (Christian Kußowski)
- chore: Adjust join space child UX (Christian Kußowski)
- chore: Adjust paddings (krille-chan)
- chore: Adjust power level UX (Christian Kußowski)
- chore: Adjust search field design (Christian Kußowski)
- chore: Adjust status header design (Christian Kußowski)
- chore: Adjust styles and animations (Christian Kußowski)
- chore: Adjust support button design (Christian Kußowski)
- chore: Always show filter for messages (Christian Kußowski)
- chore: Avoid unnecessary lambdas (Christian Kußowski)
- chore: Better context menu for space children (Christian Kußowski)
- chore: bump ios version (ShootingStarDragons)
- chore: Check conventional commits in CI (krille-chan)
- chore: Check if pubspec.lock is up to date in CI (Christian Kußowski)
- chore: Check of unused localizations (Christian Kußowski)
- chore: Clean up pages build (Christian Kußowski)
- chore: Display spaces filter chip when spaces present even without children (Christian Kußowski)
- chore: Execute dart code linter in CI (Christian Kußowski)
- chore: Exempt assignees from stale (Christian Kußowski)
- chore: Fix oidc login on web (Christian Kußowski)
- chore: Give issues and PRs more time for stale (Christian Kußowski)
- chore: Hide homepage button if not preset (Christian Kußowski)
- chore: Hide status list by default (Christian Kußowski)
- chore: Implement pick SSO provider from dialog and add tchncs.de (Christian Kußowski)
- chore: Introduce tool versions file (Christian Kußowski)
- chore: Login with localhost (Christian Kußowski)
- chore: Make banner light red (Christian Kußowski)
- chore: Make key fingerprints in chat encryption page selectable (Christian Kußowski)
- chore: make sendTimelineEventTimeout configurable (Christian Kußowski)
- chore: Make unread bubble full round (Christian Kußowski)
- chore: Move file cache to subdirectory (Christian Kußowski)
- chore: Move show image viewer one step up (Christian Kußowski)
- chore: Move website back to fluffychat.im (Christian Kußowski)
- chore: Only show confirm dialog once (Christian Kußowski)
- chore: Put oidc behind a feature flag until fixed (Christian Kußowski)
- chore: Remove converser from recommended homeservers as it doesn't have open registration (Christian Kußowski)
- chore: Remove frei.chat from homeserver list (Christian Kußowski)
- chore: Remove web notification custom sound (Christian Kußowski)
- chore: Replace duplicate check for stale bot (Christian Kußowski)
- chore: Retry sign in tap in tests (Christian Kußowski)
- chore: Run matrix notification in pull request target (Christian Kußowski)
- chore: Sanitize hash param for oidc (Christian Kußowski)
- chore: Set erase flag true on account deactivation (krille-chan)
- chore: Set operations per run to 1000 (krille-chan)
- chore: Skip matrix notify for events from myself (Christian Kußowski)
- chore: Update locale config (Christian Kußowski)
- chore: Update matrix ID localization (Christian Kußowski)
- chore: Update recommended homeservers (Christian Kußowski)
- chore: Update redirect android scheme (Christian Kußowski)
- chore: Use fixed version of fcm shared isolate (Christian Kußowski)
- fix: Add app id to TileLayer user agent (Vespe-r)
- fix: Add missing @@locale (Krille-chan)
- fix: Audioplayer on web buggy (Christian Kußowski)
- fix: build failed on archlinux (ShootingStarDragons)
- fix: Do not cancel notification on reply (Christian Kußowski)
- fix: Do not display formatted body if body is just filename (Christian Kußowski)
- fix: Do not route to backup on soft logout (Christian Kußowski)
- fix: Edit space child button opens space details page and not space child details page (Christian Kußowski)
- fix: Fix formatting of messages with newlines (Philip Fritzsche)
- fix: get correct aspect ratio from VideoPlayerController (Matias)
- fix: Join room by alias even if not found (Christian Kußowski)
- fix: Open deep links (Christian Kußowski)
- fix: Receipt row not auto updating (Christian Kußowski)
- fix: Receipts disappear after reaction (Christian Kußowski)
- fix: Reply voice message displays a broken html body (Christian Kußowski)
- fix: Send reply to voice messages (Christian Kußowski)
- fix: Set mimetype for video player on web (Christian Kußowski)
- fix: Use correct own person for android notification replies (Christian Kußowski)
- fix: Wrong placeholder in kab (Christian Kußowski)
- refactor: Add Flutter lints (Christian Kußowski)
- refactor: Add more linter rules (Christian Kußowski)
- refactor: Add more stricter lints (Christian Kußowski)
- refactor: Avoid redundant async (Christian Kußowski)
- refactor: Avoid unnecessary bool comparison (Christian Kußowski)
- refactor: Better UX for create space children (Christian Kußowski)
- refactor: Disable custom image resizer for macOS and windows (Christian Kußowski)
- refactor: Do show message bubble even for big emotes (Christian Kußowski)
- refactor: Enable avoid-returning-widgets lint (Christian Kußowski)
- refactor: Enable more strict lints (Christian Kußowski)
- refactor: Enable rule avoid dynamic (Christian Kußowski)
- refactor: Make file events more fail safe for failed to send (Christian Kußowski)
- refactor: Remove animation dependency (Christian Kußowski)
- refactor: Remove unused localizations (Christian Kußowski)
- refactor: Remove unused translations (Christian Kußowski)
- refactor: Use getCryptoIdentityState to check backup state (krille-chan)
- refactor: Use more robust and performant way to detect single emoji messages (Christian Kußowski)
- refactor: Use native uri data from bytes instead of html (Christian Kußowski)
## v2.4.0
FluffyChat 2.4.0 adds a new improved GUI for managing stickers with tutorials how to
easily add your own sticker packs.

View file

@ -106,7 +106,7 @@
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="im.fluffychat" android:host="login"/>
<data android:scheme="im.fluffychat" android:path="/login"/>
</intent-filter>
</activity>

View file

@ -1,4 +1,3 @@
FluffyChat 2.4.0 adds a new improved GUI for managing stickers with tutorials how to
easily add your own sticker packs.
It also improves the search and image gallery in chats, especially encrypted chats.
Besides that this update comes with a lot of fixes and improvements under the hood.
FluffyChat 2.5.0 introduces a new homeserver picker for onboarding,
better image compression performance and several smaller new features,
design adjustments and bug fixes.

View file

@ -0,0 +1,3 @@
ignore:
- handy_window
- sqlcipher_flutter_libs

View file

@ -1,7 +1,12 @@
appId: chat.fluffy.fluffychat
---
- assertVisible: "Sign in"
- tapOn: "Sign in"
- extendedWaitUntil: # Wait for app to be visible
visible: "Sign in"
timeout: 60000
- retry:
maxRetries: 10 # Emulator might need some time to be ready to
commands:
- tapOn: "Sign in"
- tapOn: "Search or enter homeserver address"
- inputText: "http://${HOMESERVER}"
- pressKey: "back"

View file

@ -17,28 +17,26 @@ abstract class AppConfig {
static const String schemePrefix = 'matrix:';
static const String pushNotificationsChannelId = 'fluffychat_push';
static const String pushNotificationsAppId = 'chat.fluffy.fluffychat';
static const double borderRadius = 18.0;
static const double borderRadius = 16.0;
static const double spaceBorderRadius = 11.0;
static const double columnWidth = 360.0;
static const String website = 'https://fluffy.chat';
static const String enablePushTutorial =
'https://fluffy.chat/faq/#push_without_google_services';
'https://fluffychat.im/faq/#push_without_google_services';
static const String encryptionTutorial =
'https://fluffy.chat/faq/#how_to_use_end_to_end_encryption';
'https://fluffychat.im/faq/#how_to_use_end_to_end_encryption';
static const String startChatTutorial =
'https://fluffy.chat/faq/#how_do_i_find_other_users';
'https://fluffychat.im/faq/#how_do_i_find_other_users';
static const String howDoIGetStickersTutorial =
'https://fluffy.chat/faq/#how_do_i_get_stickers';
'https://fluffychat.im/faq/#how_do_i_get_stickers';
static const String appId = 'im.fluffychat.FluffyChat';
static const String appOpenUrlScheme = 'chat.fluffy';
static const String appOpenUrlScheme = 'im.fluffychat';
static const String sourceCodeUrl =
'https://github.com/krille-chan/fluffychat';
static const String supportUrl =
'https://github.com/krille-chan/fluffychat/issues';
static const String changelogUrl = 'https://fluffy.chat/en/changelog/';
static const String donationUrl = 'https://ko-fi.com/krille';
static const Set<String> defaultReactions = {'👍', '❤️', '😂', '😮', '😢'};
@ -54,12 +52,6 @@ abstract class AppConfig {
path: 'krille-chan/fluffychat/refs/heads/main/recommended_homeservers.json',
);
static final Uri privacyUrl = Uri(
scheme: 'https',
host: 'fluffy.chat',
path: '/en/privacy',
);
static const String mainIsolatePortName = 'main_isolate';
static const String pushIsolatePortName = 'push_isolate';
}

View file

@ -170,8 +170,14 @@ abstract class AppRoutes {
),
GoRoute(
path: 'newprivatechat',
pageBuilder: (context, state) =>
defaultPageBuilder(context, state, const NewPrivateChat()),
pageBuilder: (context, state) => defaultPageBuilder(
context,
state,
NewPrivateChat(
key: ValueKey('new_chat_${state.uri.query}'),
deeplink: state.uri.queryParameters['deeplink'],
),
),
redirect: loggedOutRedirect,
),
GoRoute(

View file

@ -55,7 +55,20 @@ enum AppSettings<T> {
enableSoftLogout<bool>('chat.fluffy.enable_soft_logout', false),
enableMatrixNativeOIDC<bool>('chat.fluffy.enable_matrix_native_oidc', false),
presetHomeserver<String>('chat.fluffy.preset_homeserver', ''),
welcomeText<String>('chat.fluffy.welcome_text', '');
welcomeText<String>('chat.fluffy.welcome_text', ''),
website<String>('chat.fluffy.website_url', 'https://fluffychat.im'),
logoUrl<String>(
'chat.fluffy.logo_url',
'https://fluffychat.im/assets/favicon.png',
),
privacyPolicy<String>(
'chat.fluffy.privacy_policy_url',
'https://fluffychat.im/en/privacy',
),
tos<String>('chat.fluffy.tos_url', 'https://fluffychat.im/en/tos'),
sendTimelineEventTimeout<int>('chat.fluffy.send_timeline_event_timeout', 15),
lastSeenSupportBanner<int>('chat.fluffy.last_seen_support_banner', 0),
supportBannerOptOut<bool>('chat.fluffy.support_banner_opt_out', false);
final String key;
final T defaultValue;
@ -65,6 +78,11 @@ enum AppSettings<T> {
static SharedPreferences get store => _store!;
static SharedPreferences? _store;
static Future<void> reset({bool loadWebConfigFile = true}) async {
await AppSettings._store!.clear();
await init(loadWebConfigFile: loadWebConfigFile);
}
static Future<SharedPreferences> init({bool loadWebConfigFile = true}) async {
if (AppSettings._store != null) return AppSettings.store;

View file

@ -74,7 +74,7 @@ abstract class FluffyThemes {
),
inputDecorationTheme: InputDecorationTheme(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2),
),
contentPadding: const EdgeInsets.all(12),
),

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,155 +1,160 @@
{
"@@last_modified": "2021-08-14 12:41:10.154280",
"about": "সম্পর্কে",
"@about": {
"type": "String",
"placeholders": {}
},
"accept": "স্বীকার করি",
"@accept": {
"type": "String",
"placeholders": {}
},
"acceptedTheInvitation": "{username} আমন্ত্রণ গ্রহণ করেছে",
"@acceptedTheInvitation": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
"@@last_modified": "2021-08-14 12:41:10.154280",
"about": "সম্পর্কে",
"@about": {
"type": "String",
"placeholders": {}
},
"accept": "স্বীকার করি",
"@accept": {
"type": "String",
"placeholders": {}
},
"acceptedTheInvitation": "{username} আমন্ত্রণ গ্রহণ করেছে",
"@acceptedTheInvitation": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"account": "অ্যাকাউন্ট",
"@account": {
"type": "String",
"placeholders": {}
},
"alwaysUse24HourFormat": "না",
"@alwaysUse24HourFormat": {
"description": "Set to true to always display time of day in 24 hour format."
},
"repeatPassword": "পাসওয়ার্ড আবার লিখো",
"@repeatPassword": {},
"notAnImage": "ইমেজ ফাইল না।",
"@notAnImage": {},
"admin": "অ্যাডমিস",
"@admin": {
"type": "String",
"placeholders": {}
},
"alias": "অ্যালিয়াস",
"@alias": {
"type": "String",
"placeholders": {}
},
"archive": "আর্কাইভ",
"@archive": {
"type": "String",
"placeholders": {}
},
"banned": "ব্যানড",
"@banned": {
"type": "String",
"placeholders": {}
},
"cancel": "বাতিল",
"@cancel": {
"type": "String",
"placeholders": {}
},
"chat": "চ্যাট",
"@chat": {
"type": "String",
"placeholders": {}
},
"close": "বন্ধ",
"@close": {
"type": "String",
"placeholders": {}
},
"copy": "অনুলিপি",
"@copy": {
"type": "String",
"placeholders": {}
},
"create": "তৈরি",
"@create": {
"type": "String",
"placeholders": {}
},
"delete": "অপসারণ",
"@delete": {
"type": "String",
"placeholders": {}
},
"device": "ডিভাইস",
"@device": {
"type": "String",
"placeholders": {}
},
"devices": "ডিভাইস",
"@devices": {
"type": "String",
"placeholders": {}
},
"notifications": "বিজ্ঞপ্তি",
"@notifications": {
"type": "String",
"placeholders": {}
},
"edit": "সম্পাদন",
"@edit": {
"type": "String",
"placeholders": {}
},
"encryption": "এনক্রিপশন",
"@encryption": {
"type": "String",
"placeholders": {}
},
"encrypted": "এনক্রিপ্টকৃত",
"@encrypted": {
"type": "String",
"placeholders": {}
},
"fluffychat": "ফ্লাফিচ্যাট",
"@fluffychat": {
"type": "String",
"placeholders": {}
},
"forward": "ফরওয়ার্ড",
"@forward": {
"type": "String",
"placeholders": {}
},
"group": "গ্রুপ",
"@group": {
"type": "String",
"placeholders": {}
},
"help": "সাহায্য",
"@help": {
"type": "String",
"placeholders": {}
},
"id": "আইডি",
"@id": {
"type": "String",
"placeholders": {}
},
"invited": "আমন্ত্রিত",
"@invited": {
"type": "String",
"placeholders": {}
},
"leave": "ছেড়ে যাও",
"@leave": {
"type": "String",
"placeholders": {}
},
"logout": "প্রস্থান",
"@logout": {
"type": "String",
"placeholders": {}
},
"login": "প্রবেশ",
"@login": {
"type": "String",
"placeholders": {}
}
},
"account": "অ্যাকাউন্ট",
"@account": {
"type": "String",
"placeholders": {}
},
"alwaysUse24HourFormat": "না",
"@alwaysUse24HourFormat": {
"description": "Set to true to always display time of day in 24 hour format."
},
"repeatPassword": "পাসওয়ার্ড আবার লিখো",
"@repeatPassword": {},
"notAnImage": "ইমেজ ফাইল না।",
"@notAnImage": {},
"admin": "অ্যাডমিস",
"@admin": {
"type": "String",
"placeholders": {}
},
"alias": "অ্যালিয়াস",
"@alias": {
"type": "String",
"placeholders": {}
},
"archive": "আর্কাইভ",
"@archive": {
"type": "String",
"placeholders": {}
},
"banned": "ব্যানড",
"@banned": {
"type": "String",
"placeholders": {}
},
"cancel": "বাতিল",
"@cancel": {
"type": "String",
"placeholders": {}
},
"chat": "চ্যাট",
"@chat": {
"type": "String",
"placeholders": {}
},
"close": "বন্ধ",
"@close": {
"type": "String",
"placeholders": {}
},
"copy": "অনুলিপি",
"@copy": {
"type": "String",
"placeholders": {}
},
"create": "তৈরি",
"@create": {
"type": "String",
"placeholders": {}
},
"delete": "অপসারণ",
"@delete": {
"type": "String",
"placeholders": {}
},
"devices": "ডিভাইস",
"@devices": {
"type": "String",
"placeholders": {}
},
"notifications": "বিজ্ঞপ্তি",
"@notifications": {
"type": "String",
"placeholders": {}
},
"edit": "সম্পাদন",
"@edit": {
"type": "String",
"placeholders": {}
},
"encryption": "এনক্রিপশন",
"@encryption": {
"type": "String",
"placeholders": {}
},
"encrypted": "এনক্রিপ্টকৃত",
"@encrypted": {
"type": "String",
"placeholders": {}
},
"fluffychat": "ফ্লাফিচ্যাট",
"@fluffychat": {
"type": "String",
"placeholders": {}
},
"forward": "ফরওয়ার্ড",
"@forward": {
"type": "String",
"placeholders": {}
},
"group": "গ্রুপ",
"@group": {
"type": "String",
"placeholders": {}
},
"help": "সাহায্য",
"@help": {
"type": "String",
"placeholders": {}
},
"id": "আইডি",
"@id": {
"type": "String",
"placeholders": {}
},
"invited": "আমন্ত্রিত",
"@invited": {
"type": "String",
"placeholders": {}
},
"leave": "ছেড়ে যাও",
"@leave": {
"type": "String",
"placeholders": {}
},
"logout": "প্রস্থান",
"@logout": {
"type": "String",
"placeholders": {}
},
"login": "প্রবেশ",
"@login": {
"type": "String",
"placeholders": {}
}
}

View file

@ -27,15 +27,7 @@
"type": "String",
"placeholders": {}
},
"@connect": {
"type": "String",
"placeholders": {}
},
"@jumpToLastReadMessage": {},
"@allRooms": {
"type": "String",
"placeholders": {}
},
"@obtainingLocation": {
"type": "String",
"placeholders": {}
@ -45,7 +37,6 @@
"type": "String",
"placeholders": {}
},
"@widgetVideo": {},
"@dismiss": {},
"@unknownDevice": {
"type": "String",
@ -68,10 +59,6 @@
"type": "String",
"placeholders": {}
},
"@setPermissionsLevel": {
"type": "String",
"placeholders": {}
},
"@inviteContactToGroup": {
"type": "String",
"placeholders": {
@ -89,7 +76,6 @@
"type": "String",
"placeholders": {}
},
"@chatHasBeenAddedToThisSpace": {},
"@reply": {
"type": "String",
"placeholders": {}
@ -115,7 +101,6 @@
"type": "String",
"description": "Usage hint for the command /html"
},
"@widgetJitsi": {},
"@youAreNoLongerParticipatingInThisChat": {
"type": "String",
"placeholders": {}
@ -125,12 +110,7 @@
"placeholders": {}
},
"@messageType": {},
"@indexedDbErrorLong": {},
"@oneClientLoggedOut": {},
"@toggleMuted": {
"type": "String",
"placeholders": {}
},
"@unsupportedAndroidVersionLong": {},
"@kicked": {
"type": "String",
@ -172,8 +152,6 @@
"type": "String",
"placeholders": {}
},
"@startFirstChat": {},
"@callingAccount": {},
"@requestPermission": {
"type": "String",
"placeholders": {}
@ -202,15 +180,10 @@
}
},
"@setColorTheme": {},
"@nextAccount": {},
"@commandHint_create": {
"type": "String",
"description": "Usage hint for the command /create"
},
"@singlesignon": {
"type": "String",
"placeholders": {}
},
"@warning": {
"type": "String",
"placeholders": {}
@ -312,7 +285,6 @@
"type": "String",
"placeholders": {}
},
"@widgetEtherpad": {},
"@waitingPartnerAcceptRequest": {
"type": "String",
"placeholders": {}
@ -353,10 +325,6 @@
}
}
},
"@separateChatTypes": {
"type": "String",
"placeholders": {}
},
"@tryAgain": {},
"@areGuestsAllowedToJoin": {
"type": "String",
@ -373,21 +341,6 @@
}
}
},
"@dateWithoutYear": {
"type": "String",
"placeholders": {
"month": {
"type": "String"
},
"day": {
"type": "String"
}
}
},
"@removeDevice": {
"type": "String",
"placeholders": {}
},
"@unbanUserDescription": {},
"@userAndUserAreTyping": {
"type": "String",
@ -422,7 +375,6 @@
}
},
"@youRejectedTheInvitation": {},
"@otherCallingPermissions": {},
"@messagesStyle": {},
"@couldNotDecryptMessage": {
"type": "String",
@ -437,11 +389,8 @@
"placeholders": {}
},
"@link": {},
"@widgetUrlError": {},
"@emailOrUsername": {},
"@newSpaceDescription": {},
"@chatDescription": {},
"@callingAccountDetails": {},
"@next": {
"type": "String",
"placeholders": {}
@ -458,25 +407,10 @@
}
}
},
"@dateWithYear": {
"type": "String",
"placeholders": {
"year": {
"type": "String"
},
"month": {
"type": "String"
},
"day": {
"type": "String"
}
}
},
"@editRoomAliases": {
"type": "String",
"placeholders": {}
},
"@enterSpace": {},
"@encryptThisChat": {},
"@fileName": {
"type": "String",
@ -486,7 +420,6 @@
"type": "String",
"placeholders": {}
},
"@previousAccount": {},
"@publicRooms": {
"type": "String",
"placeholders": {}
@ -503,20 +436,11 @@
"type": "String",
"placeholders": {}
},
"@emoteWarnNeedToPick": {
"type": "String",
"placeholders": {}
},
"@reopenChat": {},
"@pleaseEnterRecoveryKey": {},
"@create": {
"type": "String",
"placeholders": {}
},
"@toggleFavorite": {
"type": "String",
"placeholders": {}
},
"@no": {
"type": "String",
"placeholders": {}
@ -525,7 +449,6 @@
"type": "String",
"placeholders": {}
},
"@widgetNameError": {},
"@inoffensive": {
"type": "String",
"placeholders": {}
@ -543,7 +466,6 @@
"type": "String",
"placeholders": {}
},
"@addWidget": {},
"@all": {
"type": "String",
"placeholders": {}
@ -596,7 +518,6 @@
}
}
},
"@hydrateTor": {},
"@pushNotificationsNotAvailable": {},
"@passwordRecovery": {
"type": "String",
@ -647,7 +568,6 @@
"type": "String",
"placeholders": {}
},
"@signInWithPassword": {},
"@ignoredUsers": {
"type": "String",
"placeholders": {}
@ -712,10 +632,6 @@
"type": "String",
"placeholders": {}
},
"@goToTheNewRoom": {
"type": "String",
"placeholders": {}
},
"@commandHint_clearcache": {
"type": "String",
"description": "Usage hint for the command /clearcache"
@ -739,14 +655,6 @@
"placeholders": {}
},
"@whyIsThisMessageEncrypted": {},
"@unreadChats": {
"type": "String",
"placeholders": {
"unreadCount": {
"type": "int"
}
}
},
"@rejectedTheInvitation": {
"type": "String",
"placeholders": {
@ -769,19 +677,11 @@
"placeholders": {}
},
"@importFromZipFile": {},
"@toggleUnread": {
"type": "String",
"placeholders": {}
},
"@or": {
"type": "String",
"placeholders": {}
},
"@dehydrateWarning": {},
"@sendOriginal": {
"type": "String",
"placeholders": {}
},
"@noOtherDevicesFound": {},
"@whoIsAllowedToJoinThisGroup": {
"type": "String",
@ -791,14 +691,6 @@
"type": "String",
"placeholders": {}
},
"@seenByUser": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"@storeSecurlyOnThisDevice": {},
"@yourChatBackupHasBeenSetUp": {},
"@chatBackup": {
@ -862,18 +754,6 @@
"type": "String",
"placeholders": {}
},
"@containsDisplayName": {
"type": "String",
"placeholders": {}
},
"@signInWith": {
"type": "String",
"placeholders": {
"provider": {
"type": "String"
}
}
},
"@username": {
"type": "String",
"placeholders": {}
@ -896,10 +776,6 @@
"type": "String",
"placeholders": {}
},
"@people": {
"type": "String",
"placeholders": {}
},
"@changedTheHistoryVisibilityTo": {
"type": "String",
"placeholders": {
@ -932,7 +808,6 @@
}
}
},
"@callingPermissions": {},
"@delete": {
"type": "String",
"placeholders": {}
@ -956,18 +831,6 @@
"placeholders": {}
},
"@unlockOldMessages": {},
"@identity": {
"type": "String",
"placeholders": {}
},
"@numChats": {
"type": "number",
"placeholders": {
"number": {
"type": "String"
}
}
},
"@changedTheJoinRulesTo": {
"type": "String",
"placeholders": {
@ -1067,10 +930,6 @@
"@sendAsText": {
"type": "String"
},
"@inviteForMe": {
"type": "String",
"placeholders": {}
},
"@archiveRoomDescription": {},
"@exportEmotePack": {},
"@changedTheChatNameTo": {
@ -1084,22 +943,10 @@
}
}
},
"@sendSticker": {
"type": "String",
"placeholders": {}
},
"@account": {
"type": "String",
"placeholders": {}
},
"@switchToAccount": {
"type": "number",
"placeholders": {
"number": {
"type": "String"
}
}
},
"@commandInvalid": {
"type": "String"
},
@ -1170,7 +1017,6 @@
"type": "String",
"placeholders": {}
},
"@inviteContactToGroupQuestion": {},
"@emoteExists": {
"type": "String",
"placeholders": {}
@ -1213,12 +1059,10 @@
"type": "String",
"placeholders": {}
},
"@appearOnTopDetails": {},
"@roomHasBeenUpgraded": {
"type": "String",
"placeholders": {}
},
"@enterRoom": {},
"@enableEmotesGlobally": {
"type": "String",
"placeholders": {}
@ -1276,17 +1120,6 @@
}
},
"@confirmEventUnpin": {},
"@badServerVersionsException": {
"type": "String",
"placeholders": {
"serverVersions": {
"type": "String"
},
"supportedVersions": {
"type": "String"
}
}
},
"@youInvitedUser": {
"placeholders": {
"user": {
@ -1317,10 +1150,6 @@
}
}
},
"@license": {
"type": "String",
"placeholders": {}
},
"@addToSpace": {},
"@unbanFromChat": {
"type": "String",
@ -1336,10 +1165,6 @@
"description": "State that {command} is not a valid /command."
},
"@redactMessageDescription": {},
"@rejoin": {
"type": "String",
"placeholders": {}
},
"@recoveryKey": {},
"@redactMessage": {
"type": "String",
@ -1366,7 +1191,6 @@
"type": "String",
"placeholders": {}
},
"@dehydrateTorLong": {},
"@yourPublicKey": {
"type": "String",
"placeholders": {}
@ -1428,10 +1252,6 @@
"type": "String",
"placeholders": {}
},
"@memberChanges": {
"type": "String",
"placeholders": {}
},
"@joinRoom": {
"type": "String",
"placeholders": {}
@ -1446,9 +1266,7 @@
"placeholders": {}
},
"@serverRequiresEmail": {},
"@hideUnimportantStateEvents": {},
"@screenSharingTitle": {},
"@widgetCustom": {},
"@sentCallInformations": {
"type": "String",
"placeholders": {
@ -1457,7 +1275,6 @@
}
}
},
"@addToSpaceDescription": {},
"@googlyEyesContent": {
"type": "String",
"placeholders": {
@ -1485,7 +1302,6 @@
"type": "String",
"placeholders": {}
},
"@addChatDescription": {},
"@sentAnAudio": {
"type": "String",
"placeholders": {
@ -1521,7 +1337,6 @@
}
}
},
"@publish": {},
"@openLinkInBrowser": {},
"@clearArchive": {},
"@appLock": {
@ -1569,8 +1384,6 @@
"placeholders": {}
},
"@inviteGroupChat": {},
"@appearOnTop": {},
"@invitePrivateChat": {},
"@verifyTitle": {
"type": "String",
"placeholders": {}
@ -1606,10 +1419,6 @@
"description": "Usage hint for the command /ban"
},
"@importEmojis": {},
"@confirm": {
"type": "String",
"placeholders": {}
},
"@wasDirectChatDisplayName": {
"type": "String",
"placeholders": {
@ -1660,7 +1469,6 @@
},
"@newGroup": {},
"@bundleName": {},
"@dehydrateTor": {},
"@removeFromSpace": {},
"@dateAndTimeOfDay": {
"type": "String",
@ -1730,7 +1538,6 @@
}
}
},
"@profileNotFound": {},
"@jump": {},
"@groups": {
"type": "String",
@ -1759,14 +1566,6 @@
}
},
"@sorryThatsNotPossible": {},
"@videoWithSize": {
"type": "String",
"placeholders": {
"size": {
"type": "String"
}
}
},
"@oopsSomethingWentWrong": {
"type": "String",
"placeholders": {}
@ -1798,10 +1597,6 @@
}
}
},
"@containsUserName": {
"type": "String",
"placeholders": {}
},
"@messages": {
"type": "String",
"placeholders": {}
@ -1831,10 +1626,6 @@
"type": "String",
"placeholders": {}
},
"@setCustomEmotes": {
"type": "String",
"placeholders": {}
},
"@startedACall": {
"type": "String",
"placeholders": {
@ -1851,10 +1642,6 @@
"type": "String",
"placeholders": {}
},
"@notificationsEnabledForThisAccount": {
"type": "String",
"placeholders": {}
},
"@deleteMessage": {
"type": "String",
"placeholders": {}
@ -1867,20 +1654,11 @@
"type": "String",
"placeholders": {}
},
"@setTheme": {},
"@changeTheHomeserver": {
"type": "String",
"placeholders": {}
},
"@youJoinedTheChat": {},
"@wallpaper": {
"type": "String",
"placeholders": {}
},
"@openVideoCamera": {
"type": "String",
"placeholders": {}
},
"@play": {
"type": "String",
"placeholders": {
@ -1914,7 +1692,6 @@
"type": "String",
"placeholders": {}
},
"@widgetName": {},
"@sentASticker": {
"type": "String",
"placeholders": {
@ -1923,7 +1700,6 @@
}
}
},
"@errorAddingWidget": {},
"@commandHint_dm": {
"type": "String",
"description": "Usage hint for the command /dm"
@ -2003,16 +1779,11 @@
"type": "String",
"placeholders": {}
},
"@pleaseChoose": {
"type": "String",
"placeholders": {}
},
"@share": {
"type": "String",
"placeholders": {}
},
"@commandHint_googly": {},
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"@createGroup": {},
"@privacy": {
"type": "String",
@ -2026,16 +1797,7 @@
"type": "String",
"placeholders": {}
},
"@hydrateTorLong": {},
"@time": {},
"@enterYourHomeserver": {
"type": "String",
"placeholders": {}
},
"@botMessages": {
"type": "String",
"placeholders": {}
},
"@contentHasBeenReported": {
"type": "String",
"placeholders": {}
@ -2070,10 +1832,6 @@
"type": "String",
"placeholders": {}
},
"@setInvitationLink": {
"type": "String",
"placeholders": {}
},
"@pinMessage": {},
"@screenSharingDetail": {},
"@muteChat": {
@ -2090,7 +1848,6 @@
"type": "String",
"placeholders": {}
},
"@indexedDbErrorTitle": {},
"@endedTheCall": {
"type": "String",
"placeholders": {
@ -2099,4 +1856,4 @@
}
}
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,133 +1,133 @@
{
"repeatPassword": "Gentag password",
"notAnImage": "Ikke en billedfil.",
"ignoreUser": "Ignorér bruger",
"remove": "Fjern",
"@remove": {
"type": "String",
"placeholders": {}
},
"importNow": "Importer nu",
"importEmojis": "Importer emojis",
"importFromZipFile": "Importer fra .zip fil",
"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",
"replace": "Erstat",
"about": "Om",
"aboutHomeserver": "Om {homeserver}",
"@aboutHomeserver": {
"type": "String",
"placeholders": {
"homeserver": {
"type": "String"
}
"repeatPassword": "Gentag password",
"notAnImage": "Ikke en billedfil.",
"ignoreUser": "Ignorér bruger",
"remove": "Fjern",
"@remove": {
"type": "String",
"placeholders": {}
},
"importNow": "Importer nu",
"importEmojis": "Importer emojis",
"importFromZipFile": "Importer fra .zip fil",
"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",
"replace": "Erstat",
"about": "Om",
"aboutHomeserver": "Om {homeserver}",
"@aboutHomeserver": {
"type": "String",
"placeholders": {
"homeserver": {
"type": "String"
}
}
},
"accept": "Acceptér",
"@accept": {
"type": "String",
"placeholders": {}
},
"acceptedTheInvitation": "👍 {username} accepterede invitationen",
"@acceptedTheInvitation": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"account": "Konto",
"@account": {
"type": "String",
"placeholders": {}
},
"activatedEndToEndEncryption": "🔐 {username} aktiverede end-to-end kryptering",
"@activatedEndToEndEncryption": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"addEmail": "Tilføj e-mail",
"@addEmail": {
"type": "String",
"placeholders": {}
},
"confirmMatrixId": "Bekræft din Matrix-ID for at slette din konto.",
"supposedMxid": "Den burde være {mxid}",
"@supposedMxid": {
"type": "String",
"placeholders": {
"mxid": {
"type": "String"
}
}
},
"addToSpace": "Tilføj til gruppe",
"admin": "Admin",
"@admin": {
"type": "String",
"placeholders": {}
},
"alias": "alias",
"@alias": {
"type": "String",
"placeholders": {}
},
"allChats": "Alle samtaler",
"@allChats": {
"type": "String",
"placeholders": {}
},
"commandHint_roomupgrade": "Opgrader dette rum til den givne rumversion",
"commandHint_googly": "Send googly-eyes",
"commandHint_cuddle": "Send et varmt smil",
"commandHint_hug": "Send et kram",
"googlyEyesContent": "{senderName} sender dig googly-eyes",
"@googlyEyesContent": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"cuddleContent": "{senderName} sender dig et varmt smil",
"@cuddleContent": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"hugContent": "{senderName} krammer dig",
"@hugContent": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"answeredTheCall": "{senderName} svarer på dit opkald",
"@answeredTheCall": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"anyoneCanJoin": "Enhver kan deltage",
"@anyoneCanJoin": {
"type": "String",
"placeholders": {}
}
},
"accept": "Acceptér",
"@accept": {
"type": "String",
"placeholders": {}
},
"acceptedTheInvitation": "👍 {username} accepterede invitationen",
"@acceptedTheInvitation": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"account": "Konto",
"@account": {
"type": "String",
"placeholders": {}
},
"activatedEndToEndEncryption": "🔐 {username} aktiverede end-to-end kryptering",
"@activatedEndToEndEncryption": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"addEmail": "Tilføj e-mail",
"@addEmail": {
"type": "String",
"placeholders": {}
},
"confirmMatrixId": "Bekræft din Matrix-ID for at slette din konto.",
"supposedMxid": "Den burde være {mxid}",
"@supposedMxid": {
"type": "String",
"placeholders": {
"mxid": {
"type": "String"
}
}
},
"addToSpace": "Tilføj til gruppe",
"admin": "Admin",
"@admin": {
"type": "String",
"placeholders": {}
},
"alias": "alias",
"@alias": {
"type": "String",
"placeholders": {}
},
"allChats": "Alle samtaler",
"@allChats": {
"type": "String",
"placeholders": {}
},
"commandHint_roomupgrade": "Opgrader dette rum til den givne rumversion",
"commandHint_googly": "Send googly-eyes",
"commandHint_cuddle": "Send et varmt smil",
"commandHint_hug": "Send et kram",
"googlyEyesContent": "{senderName} sender dig googly-eyes",
"@googlyEyesContent": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"cuddleContent": "{senderName} sender dig et varmt smil",
"@cuddleContent": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"hugContent": "{senderName} krammer dig",
"@hugContent": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"answeredTheCall": "{senderName} svarer på dit opkald",
"@answeredTheCall": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"anyoneCanJoin": "Enhver kan deltage",
"@anyoneCanJoin": {
"type": "String",
"placeholders": {}
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,438 +1,462 @@
{
"hugContent": "{senderName} σε αγκαλιάζει",
"@hugContent": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
"hugContent": "{senderName} σε αγκαλιάζει",
"@hugContent": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"commandHint_cuddle": "Στείλε μια αγκαλιά",
"@commandHint_cuddle": {},
"admin": "Διαχειριστής",
"@admin": {
"type": "String",
"placeholders": {}
},
"blockDevice": "Αποκλεισμός Συσκευής",
"@blockDevice": {
"type": "String",
"placeholders": {}
},
"supposedMxid": "Αυτό θα πρέπει να είναι {mxid}",
"@supposedMxid": {
"type": "String",
"placeholders": {
"mxid": {
"type": "String"
}
}
},
"banFromChat": "Αποκλεισμός από τη συνομιλία",
"@banFromChat": {
"type": "String",
"placeholders": {}
},
"askSSSSSign": "Για να μπορέσεις να υπογράψεις το άλλο άτομο, πληκτρολόγησε τη συνθηματική φράση ασφαλούς αποθήκευσης ή το κλειδί ανάκτησης.",
"@askSSSSSign": {
"type": "String",
"placeholders": {}
},
"remove": "Αφαίρεση",
"@remove": {
"type": "String",
"placeholders": {}
},
"areGuestsAllowedToJoin": "Επιτρέπεται στους επισκέπτες χρήστες να συμμετάσχουν",
"@areGuestsAllowedToJoin": {
"type": "String",
"placeholders": {}
},
"blocked": "Αποκλείστηκε",
"@blocked": {
"type": "String",
"placeholders": {}
},
"sendOnEnter": "Αποστολή με enter",
"@sendOnEnter": {},
"answeredTheCall": "{senderName} απάντησε στην κλήση",
"@answeredTheCall": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"alias": "ψευδώνυμο",
"@alias": {
"type": "String",
"placeholders": {}
},
"all": "Όλα",
"@all": {
"type": "String",
"placeholders": {}
},
"badServerLoginTypesException": "Ο οικιακός διακομιστής υποστηρίζει τους τύπους σύνδεσης:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο:\n{supportedVersions}",
"@badServerLoginTypesException": {
"type": "String",
"placeholders": {
"serverVersions": {
"type": "String"
},
"supportedVersions": {
"type": "String"
}
}
},
"cantOpenUri": "Δεν μπορεί να ανοίξει το URI {uri}",
"@cantOpenUri": {
"type": "String",
"placeholders": {
"uri": {
"type": "String"
}
}
},
"importFromZipFile": "Εισαγωγή από αρχείο .zip",
"@importFromZipFile": {},
"autoplayImages": "Αυτόματη αναπαραγωγή κινούμενων αυτοκόλλητων και emotes",
"@autoplayImages": {
"type": "String",
"placeholder": {}
},
"repeatPassword": "Επανάληψη κωδικού πρόσβασης",
"@repeatPassword": {},
"acceptedTheInvitation": "👍 {username} αποδέχτηκε την πρόσκληση",
"@acceptedTheInvitation": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"banned": "Αποκλείστηκε",
"@banned": {
"type": "String",
"placeholders": {}
},
"exportEmotePack": "Εξαγωγή πακέτου Emote ως .zip",
"@exportEmotePack": {},
"account": "Λογαριασμός",
"@account": {
"type": "String",
"placeholders": {}
},
"areYouSure": "Σίγουρα;",
"@areYouSure": {
"type": "String",
"placeholders": {}
},
"allChats": "Όλες οι συνομιλίες",
"@allChats": {
"type": "String",
"placeholders": {}
},
"addToSpace": "Προσθήκη στο χώρο",
"@addToSpace": {},
"about": "Σχετικά",
"@about": {
"type": "String",
"placeholders": {}
},
"activatedEndToEndEncryption": "🔐 {username} ενεργοποίησε την κρυπτογράφηση από άκρο σε άκρο",
"@activatedEndToEndEncryption": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"googlyEyesContent": "{senderName} σού στέλνει αστεία μάτια",
"@googlyEyesContent": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"cancel": "Ακύρωση",
"@cancel": {
"type": "String",
"placeholders": {}
},
"appLock": "Κλείδωμα εφαρμογής",
"@appLock": {
"type": "String",
"placeholders": {}
},
"sendTypingNotifications": "Αποστολή ειδοποιήσεων πληκτρολόγησης",
"@sendTypingNotifications": {},
"importEmojis": "Εισαγωγή Emojis",
"@importEmojis": {},
"confirmMatrixId": "Παρακαλούμε επιβεβαίωσε το Matrix ID σου για να διαγράψεις τον λογαριασμό σου.",
"@confirmMatrixId": {},
"notAnImage": "Δεν είναι αρχείο εικόνας.",
"@notAnImage": {},
"areYouSureYouWantToLogout": "Σίγουρα θες να αποσυνδεθείς;",
"@areYouSureYouWantToLogout": {
"type": "String",
"placeholders": {}
},
"bannedUser": "{username} απέκλεισε {targetName}",
"@bannedUser": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"targetName": {
"type": "String"
}
}
},
"cuddleContent": "{senderName} σέ αγκαλιάζει",
"@cuddleContent": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"askVerificationRequest": "Αποδοχή αυτού του αιτήματος επαλήθευσης από {username};",
"@askVerificationRequest": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"addEmail": "Προσθήκη email",
"@addEmail": {
"type": "String",
"placeholders": {}
},
"commandHint_hug": "Στείλτε μια αγκαλιά",
"@commandHint_hug": {},
"replace": "Αντικατάσταση",
"@replace": {},
"archive": "Αρχείο",
"@archive": {
"type": "String",
"placeholders": {}
},
"accept": "Αποδοχή",
"@accept": {
"type": "String",
"placeholders": {}
},
"commandHint_googly": "Στείλε αστεία μάτια",
"@commandHint_googly": {},
"importNow": "Εισαγωγή τώρα",
"@importNow": {},
"anyoneCanJoin": "Οποιοσδήποτε μπορεί να συμμετάσχει",
"@anyoneCanJoin": {
"type": "String",
"placeholders": {}
},
"alwaysUse24HourFormat": "Ψευδής",
"@alwaysUse24HourFormat": {
"description": "Set to true to always display time of day in 24 hour format."
},
"ignoreUser": "Αγνόηση χρήστη",
"@ignoreUser": {},
"aboutHomeserver": "Σχετικά με {homeserver}",
"@aboutHomeserver": {
"type": "String",
"placeholders": {
"homeserver": {
"type": "String"
}
}
},
"commandHint_roomupgrade": "Αναβάθμιση αυτού του δωματίου στην δεδομένη έκδοση δωματίου",
"@commandHint_roomupgrade": {},
"appLockDescription": "Κλείδωμα εφαρμογής όταν δεν χρησιμοποιείται με κωδικό PIN",
"@appLockDescription": {},
"swipeRightToLeftToReply": "Σύρσιμο δεξιά προς αριστερά για απάντηση",
"@swipeRightToLeftToReply": {},
"noMoreChatsFound": "Δεν βρέθηκαν άλλες συνομιλίες...",
"@noMoreChatsFound": {},
"noChatsFoundHere": "Δεν υπάρχουν συνομιλίες ακόμα. Ξεκίνα μια νέα συνομιλία με κάποιον χρησιμοποιώντας το κουμπί παρακάτω. ⤵️",
"@noChatsFoundHere": {},
"unread": "Μη αναγνωσμένα",
"@unread": {},
"space": "Χώρος",
"@space": {},
"spaces": "Χώροι",
"@spaces": {},
"changeDeviceName": "Αλλαγή ονόματος συσκευής",
"@changeDeviceName": {
"type": "String",
"placeholders": {}
},
"changedTheChatAvatar": "{username} άλλαξε το άβαταρ συνομιλίας",
"@changedTheChatAvatar": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changedTheChatDescriptionTo": "{username} άλλαξε την περιγραφή συνομιλίας σε: '{description}'",
"@changedTheChatDescriptionTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"description": {
"type": "String"
}
}
},
"changedTheChatNameTo": "{username} άλλαξε το όνομα συνομιλίας σε: '{chatname}'",
"@changedTheChatNameTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"chatname": {
"type": "String"
}
}
},
"changedTheChatPermissions": "{username} άλλαξε τα δικαιώματα συνομιλίας",
"@changedTheChatPermissions": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changedTheDisplaynameTo": "{username} άλλαξε το εμφανιζόμενο όνομά του σε: '{displayname}'",
"@changedTheDisplaynameTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"displayname": {
"type": "String"
}
}
},
"changedTheGuestAccessRules": "{username} άλλαξε τους κανόνες πρόσβασης των επισκεπτών",
"@changedTheGuestAccessRules": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changedTheGuestAccessRulesTo": "{username} άλλαξε τους κανόνες πρόσβασης των επισκεπτών σε: {rules}",
"@changedTheGuestAccessRulesTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"rules": {
"type": "String"
}
}
},
"changedTheHistoryVisibility": "{username} άλλαξε την ορατότητα ιστορικού",
"@changedTheHistoryVisibility": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changedTheHistoryVisibilityTo": "{username} άλλαξε την ορατότητα ιστορικού σε: {rules}",
"@changedTheHistoryVisibilityTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"rules": {
"type": "String"
}
}
},
"changedTheJoinRules": "{username} άλλαξε τους κανόνες συμμετοχής",
"@changedTheJoinRules": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changedTheJoinRulesTo": "{username} άλλαξε τους κανόνες συμμετοχής σε: {joinRules}",
"@changedTheJoinRulesTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"joinRules": {
"type": "String"
}
}
},
"changedTheProfileAvatar": "Ο χρήστης {username} άλλαξε την εικόνα προφίλ του",
"@changedTheProfileAvatar": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changePassword": "Αλλαγή κωδικού πρόσβασης",
"@changePassword": {
"type": "String",
"placeholders": {}
},
"changeTheme": "Άλλαξε το στυλ σου",
"@changeTheme": {
"type": "String",
"placeholders": {}
},
"changeYourAvatar": "Αλλαγή εικόνας προφιλ",
"@changeYourAvatar": {
"type": "String",
"placeholders": {}
},
"chatBackup": "Αντίγραφο ασφαλείας συνομιλίας",
"@chatBackup": {
"type": "String",
"placeholders": {}
},
"chatDetails": "Λεπτομέρειες συνομιλίας",
"@chatDetails": {
"type": "String",
"placeholders": {}
},
"chats": "Συνομιλίες",
"@chats": {
"type": "String",
"placeholders": {}
},
"chooseAStrongPassword": "Εισάγετε ένα δυνατό κωδικό πρόσβασης",
"@chooseAStrongPassword": {
"type": "String",
"placeholders": {}
},
"close": "Κλείσιμο",
"@close": {
"type": "String",
"placeholders": {}
},
"commandHint_ban": "Αποκλεισμός χρήστη από το δωμάτιο",
"@commandHint_ban": {
"type": "String",
"description": "Usage hint for the command /ban"
},
"commandHint_clearcache": "Εκκαθάριση προσωρινής μνήμης",
"@commandHint_clearcache": {
"type": "String",
"description": "Usage hint for the command /clearcache"
},
"commandHint_invite": "Πρόσκληση αυτού του χρήστη στο δωμάτιο",
"@commandHint_invite": {
"type": "String",
"description": "Usage hint for the command /invite"
}
},
"commandHint_cuddle": "Στείλε μια αγκαλιά",
"@commandHint_cuddle": {},
"admin": "Διαχειριστής",
"@admin": {
"type": "String",
"placeholders": {}
},
"blockDevice": "Αποκλεισμός Συσκευής",
"@blockDevice": {
"type": "String",
"placeholders": {}
},
"supposedMxid": "Αυτό θα πρέπει να είναι {mxid}",
"@supposedMxid": {
"type": "String",
"placeholders": {
"mxid": {
"type": "String"
}
}
},
"banFromChat": "Αποκλεισμός από τη συνομιλία",
"@banFromChat": {
"type": "String",
"placeholders": {}
},
"askSSSSSign": "Για να μπορέσεις να υπογράψεις το άλλο άτομο, πληκτρολόγησε τη συνθηματική φράση ασφαλούς αποθήκευσης ή το κλειδί ανάκτησης.",
"@askSSSSSign": {
"type": "String",
"placeholders": {}
},
"remove": "Αφαίρεση",
"@remove": {
"type": "String",
"placeholders": {}
},
"areGuestsAllowedToJoin": "Επιτρέπεται στους επισκέπτες χρήστες να συμμετάσχουν",
"@areGuestsAllowedToJoin": {
"type": "String",
"placeholders": {}
},
"blocked": "Αποκλείστηκε",
"@blocked": {
"type": "String",
"placeholders": {}
},
"sendOnEnter": "Αποστολή με enter",
"@sendOnEnter": {},
"answeredTheCall": "{senderName} απάντησε στην κλήση",
"@answeredTheCall": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"alias": "ψευδώνυμο",
"@alias": {
"type": "String",
"placeholders": {}
},
"all": "Όλα",
"@all": {
"type": "String",
"placeholders": {}
},
"badServerLoginTypesException": "Ο οικιακός διακομιστής υποστηρίζει τους τύπους σύνδεσης:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο:\n{supportedVersions}",
"@badServerLoginTypesException": {
"type": "String",
"placeholders": {
"serverVersions": {
"type": "String"
},
"supportedVersions": {
"type": "String"
}
}
},
"cantOpenUri": "Δεν μπορεί να ανοίξει το URI {uri}",
"@cantOpenUri": {
"type": "String",
"placeholders": {
"uri": {
"type": "String"
}
}
},
"importFromZipFile": "Εισαγωγή από αρχείο .zip",
"@importFromZipFile": {},
"autoplayImages": "Αυτόματη αναπαραγωγή κινούμενων αυτοκόλλητων και emotes",
"@autoplayImages": {
"type": "String",
"placeholder": {}
},
"repeatPassword": "Επανάληψη κωδικού πρόσβασης",
"@repeatPassword": {},
"acceptedTheInvitation": "👍 {username} αποδέχτηκε την πρόσκληση",
"@acceptedTheInvitation": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"banned": "Αποκλείστηκε",
"@banned": {
"type": "String",
"placeholders": {}
},
"exportEmotePack": "Εξαγωγή πακέτου Emote ως .zip",
"@exportEmotePack": {},
"account": "Λογαριασμός",
"@account": {
"type": "String",
"placeholders": {}
},
"areYouSure": "Σίγουρα;",
"@areYouSure": {
"type": "String",
"placeholders": {}
},
"allChats": "Όλες οι συνομιλίες",
"@allChats": {
"type": "String",
"placeholders": {}
},
"addToSpace": "Προσθήκη στο χώρο",
"@addToSpace": {},
"about": "Σχετικά",
"@about": {
"type": "String",
"placeholders": {}
},
"activatedEndToEndEncryption": "🔐 {username} ενεργοποίησε την κρυπτογράφηση από άκρο σε άκρο",
"@activatedEndToEndEncryption": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"googlyEyesContent": "{senderName} σού στέλνει αστεία μάτια",
"@googlyEyesContent": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"cancel": "Ακύρωση",
"@cancel": {
"type": "String",
"placeholders": {}
},
"appLock": "Κλείδωμα εφαρμογής",
"@appLock": {
"type": "String",
"placeholders": {}
},
"sendTypingNotifications": "Αποστολή ειδοποιήσεων πληκτρολόγησης",
"@sendTypingNotifications": {},
"importEmojis": "Εισαγωγή Emojis",
"@importEmojis": {},
"confirmMatrixId": "Παρακαλούμε επιβεβαίωσε το Matrix ID σου για να διαγράψεις τον λογαριασμό σου.",
"@confirmMatrixId": {},
"notAnImage": "Δεν είναι αρχείο εικόνας.",
"@notAnImage": {},
"areYouSureYouWantToLogout": "Σίγουρα θες να αποσυνδεθείς;",
"@areYouSureYouWantToLogout": {
"type": "String",
"placeholders": {}
},
"bannedUser": "{username} απέκλεισε {targetName}",
"@bannedUser": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"targetName": {
"type": "String"
}
}
},
"cuddleContent": "{senderName} σέ αγκαλιάζει",
"@cuddleContent": {
"type": "String",
"placeholders": {
"senderName": {
"type": "String"
}
}
},
"askVerificationRequest": "Αποδοχή αυτού του αιτήματος επαλήθευσης από {username};",
"@askVerificationRequest": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"addEmail": "Προσθήκη email",
"@addEmail": {
"type": "String",
"placeholders": {}
},
"commandHint_hug": "Στείλτε μια αγκαλιά",
"@commandHint_hug": {},
"replace": "Αντικατάσταση",
"@replace": {},
"archive": "Αρχείο",
"@archive": {
"type": "String",
"placeholders": {}
},
"accept": "Αποδοχή",
"@accept": {
"type": "String",
"placeholders": {}
},
"commandHint_googly": "Στείλε αστεία μάτια",
"@commandHint_googly": {},
"importNow": "Εισαγωγή τώρα",
"@importNow": {},
"anyoneCanJoin": "Οποιοσδήποτε μπορεί να συμμετάσχει",
"@anyoneCanJoin": {
"type": "String",
"placeholders": {}
},
"alwaysUse24HourFormat": "Ψευδής",
"@alwaysUse24HourFormat": {
"description": "Set to true to always display time of day in 24 hour format."
},
"ignoreUser": "Αγνόηση χρήστη",
"@ignoreUser": {},
"aboutHomeserver": "Σχετικά με {homeserver}",
"@aboutHomeserver": {
"type": "String",
"placeholders": {
"homeserver": {
"type": "String"
}
}
},
"commandHint_roomupgrade": "Αναβάθμιση αυτού του δωματίου στην δεδομένη έκδοση δωματίου",
"@commandHint_roomupgrade": {},
"appLockDescription": "Κλείδωμα εφαρμογής όταν δεν χρησιμοποιείται με κωδικό PIN",
"@appLockDescription": {},
"swipeRightToLeftToReply": "Σύρσιμο δεξιά προς αριστερά για απάντηση",
"@swipeRightToLeftToReply": {},
"noMoreChatsFound": "Δεν βρέθηκαν άλλες συνομιλίες...",
"@noMoreChatsFound": {},
"noChatsFoundHere": "Δεν υπάρχουν συνομιλίες ακόμα. Ξεκίνα μια νέα συνομιλία με κάποιον χρησιμοποιώντας το κουμπί παρακάτω. ⤵️",
"@noChatsFoundHere": {},
"unread": "Μη αναγνωσμένα",
"@unread": {},
"space": "Χώρος",
"@space": {},
"spaces": "Χώροι",
"@spaces": {},
"changeDeviceName": "Αλλαγή ονόματος συσκευής",
"@changeDeviceName": {
"type": "String",
"placeholders": {}
},
"changedTheChatAvatar": "{username} άλλαξε το άβαταρ συνομιλίας",
"@changedTheChatAvatar": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changedTheChatPermissions": "{username} άλλαξε τα δικαιώματα συνομιλίας",
"@changedTheChatPermissions": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changedTheDisplaynameTo": "{username} άλλαξε το εμφανιζόμενο όνομά του σε: '{displayname}'",
"@changedTheDisplaynameTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"displayname": {
"type": "String"
}
}
},
"changedTheGuestAccessRules": "{username} άλλαξε τους κανόνες πρόσβασης των επισκεπτών",
"@changedTheGuestAccessRules": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changedTheGuestAccessRulesTo": "{username} άλλαξε τους κανόνες πρόσβασης των επισκεπτών σε: {rules}",
"@changedTheGuestAccessRulesTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"rules": {
"type": "String"
}
}
},
"changedTheHistoryVisibility": "{username} άλλαξε την ορατότητα ιστορικού",
"@changedTheHistoryVisibility": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changedTheHistoryVisibilityTo": "{username} άλλαξε την ορατότητα ιστορικού σε: {rules}",
"@changedTheHistoryVisibilityTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"rules": {
"type": "String"
}
}
},
"changedTheJoinRules": "{username} άλλαξε τους κανόνες συμμετοχής",
"@changedTheJoinRules": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changedTheJoinRulesTo": "{username} άλλαξε τους κανόνες συμμετοχής σε: {joinRules}",
"@changedTheJoinRulesTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"joinRules": {
"type": "String"
}
}
},
"changedTheProfileAvatar": "Ο χρήστης {username} άλλαξε την εικόνα προφίλ του",
"@changedTheProfileAvatar": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changePassword": "Αλλαγή κωδικού πρόσβασης",
"@changePassword": {
"type": "String",
"placeholders": {}
},
"changeTheme": "Άλλαξε το στυλ σου",
"@changeTheme": {
"type": "String",
"placeholders": {}
},
"changeYourAvatar": "Αλλαγή εικόνας προφιλ",
"@changeYourAvatar": {
"type": "String",
"placeholders": {}
},
"chatBackup": "Αντίγραφο ασφαλείας συνομιλίας",
"@chatBackup": {
"type": "String",
"placeholders": {}
},
"chatDetails": "Λεπτομέρειες συνομιλίας",
"@chatDetails": {
"type": "String",
"placeholders": {}
},
"chats": "Συνομιλίες",
"@chats": {
"type": "String",
"placeholders": {}
},
"chooseAStrongPassword": "Εισάγετε ένα δυνατό κωδικό πρόσβασης",
"@chooseAStrongPassword": {
"type": "String",
"placeholders": {}
},
"close": "Κλείσιμο",
"@close": {
"type": "String",
"placeholders": {}
},
"commandHint_ban": "Αποκλεισμός χρήστη από το δωμάτιο",
"@commandHint_ban": {
"type": "String",
"description": "Usage hint for the command /ban"
},
"commandHint_clearcache": "Εκκαθάριση προσωρινής μνήμης",
"@commandHint_clearcache": {
"type": "String",
"description": "Usage hint for the command /clearcache"
},
"commandHint_invite": "Πρόσκληση αυτού του χρήστη στο δωμάτιο",
"@commandHint_invite": {
"type": "String",
"description": "Usage hint for the command /invite"
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -370,6 +370,18 @@
}
}
},
"changedTheChatDescriptionTo": "Pinalitan ni {username} ang deskripsyon ng chat sa: '{description}'",
"@changedTheChatDescriptionTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"description": {
"type": "String"
}
}
},
"changedTheProfileAvatar": "Pinalitan ni {username} ang kanilang avatar",
"@changedTheProfileAvatar": {
"type": "String",
@ -379,6 +391,18 @@
}
}
},
"changedTheChatNameTo": "Pinalitan ni {username} ang pangalan ng chat sa: '{chatname}'",
"@changedTheChatNameTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"chatname": {
"type": "String"
}
}
},
"changedTheRoomInvitationLink": "Pinalitan ni {username} ang link ng imbitasyon",
"@changedTheRoomInvitationLink": {
"type": "String",
@ -705,6 +729,11 @@
"type": "String",
"placeholders": {}
},
"device": "Device",
"@device": {
"type": "String",
"placeholders": {}
},
"deviceId": "ID ng Device",
"@deviceId": {
"type": "String",
@ -806,6 +835,11 @@
"type": "String",
"placeholders": {}
},
"emotePacks": "Mga emote pack para sa room",
"@emotePacks": {
"type": "String",
"placeholders": {}
},
"emoteSettings": "Mga Setting ng Emote",
"@emoteSettings": {
"type": "String",
@ -831,6 +865,11 @@
}
}
},
"fileName": "Pangalan ng file",
"@fileName": {
"type": "String",
"placeholders": {}
},
"fluffychat": "FluffyChat",
"@fluffychat": {
"type": "String",

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,68 +1,68 @@
{
"remove": "निकालना",
"@remove": {
"type": "String",
"placeholders": {}
},
"importFromZipFile": ".zip फ़ाइल से आयात करें",
"repeatPassword": "पासवर्ड दोहराएं",
"exportEmotePack": "इमोट पैक को .zip के रूप में निर्यात करें",
"importEmojis": "इमोजी आयात करें",
"notAnImage": "कोई छवि फ़ाइल नहीं।",
"importNow": "अभी आयात करें",
"ignoreUser": "उपयोगकर्ता को नजरअंदाज करें",
"replace": "बदलें",
"about": "हमारे बारे में",
"aboutHomeserver": "{homeserver} की जानकारी",
"@aboutHomeserver": {
"type": "String",
"placeholders": {
"homeserver": {
"type": "String"
}
"remove": "निकालना",
"@remove": {
"type": "String",
"placeholders": {}
},
"importFromZipFile": ".zip फ़ाइल से आयात करें",
"repeatPassword": "पासवर्ड दोहराएं",
"exportEmotePack": "इमोट पैक को .zip के रूप में निर्यात करें",
"importEmojis": "इमोजी आयात करें",
"notAnImage": "कोई छवि फ़ाइल नहीं।",
"importNow": "अभी आयात करें",
"ignoreUser": "उपयोगकर्ता को नजरअंदाज करें",
"replace": "बदलें",
"about": "हमारे बारे में",
"aboutHomeserver": "{homeserver} की जानकारी",
"@aboutHomeserver": {
"type": "String",
"placeholders": {
"homeserver": {
"type": "String"
}
}
},
"accept": "स्वीकार करें",
"@accept": {
"type": "String",
"placeholders": {}
},
"acceptedTheInvitation": "👍 {username} ने निमंत्रण स्वीकार किया",
"@acceptedTheInvitation": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"account": "अकाउंट",
"@account": {
"type": "String",
"placeholders": {}
},
"activatedEndToEndEncryption": "🔐 {username} ने एंड-टू-एंड एन्क्रिप्शन चालू किया",
"@activatedEndToEndEncryption": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"addEmail": "ईमेल ऐड करें",
"@addEmail": {
"type": "String",
"placeholders": {}
},
"confirmMatrixId": "कृपया अपना अकाउंट हटाने के लिए अपनी मैट्रिक्स आईडी की पुष्टि करें।",
"supposedMxid": "यह {mxid} होना चाहिए",
"@supposedMxid": {
"type": "String",
"placeholders": {
"mxid": {
"type": "String"
}
}
}
},
"accept": "स्वीकार करें",
"@accept": {
"type": "String",
"placeholders": {}
},
"acceptedTheInvitation": "👍 {username} ने निमंत्रण स्वीकार किया",
"@acceptedTheInvitation": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"account": "अकाउंट",
"@account": {
"type": "String",
"placeholders": {}
},
"activatedEndToEndEncryption": "🔐 {username} ने एंड-टू-एंड एन्क्रिप्शन चालू किया",
"@activatedEndToEndEncryption": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"addEmail": "ईमेल ऐड करें",
"@addEmail": {
"type": "String",
"placeholders": {}
},
"confirmMatrixId": "कृपया अपना अकाउंट हटाने के लिए अपनी मैट्रिक्स आईडी की पुष्टि करें।",
"supposedMxid": "यह {mxid} होना चाहिए",
"@supposedMxid": {
"type": "String",
"placeholders": {
"mxid": {
"type": "String"
}
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -57,4 +57,4 @@
}
},
"@custom": {}
}
}

File diff suppressed because it is too large Load diff

View file

@ -85,6 +85,11 @@
"type": "String",
"placeholders": {}
},
"fileName": "Nómine de file",
"@fileName": {
"type": "String",
"placeholders": {}
},
"fontSize": "Dimension de fonde",
"@fontSize": {
"type": "String",
@ -236,6 +241,11 @@
"type": "String",
"placeholders": {}
},
"pushRules": "Regules de push-notificationes",
"@pushRules": {
"type": "String",
"placeholders": {}
},
"redactMessage": "Redacter li missage",
"@redactMessage": {
"type": "String",
@ -437,6 +447,8 @@
"@time": {},
"sender": "Autor",
"@sender": {},
"dismiss": "Demisser",
"@dismiss": {},
"custom": "Personalisat",
"@custom": {},
"emojis": "Emoji",
@ -502,6 +514,11 @@
"type": "String",
"placeholders": {}
},
"recording": "Registrante",
"@recording": {
"type": "String",
"placeholders": {}
},
"register": "Inregistrar se",
"@register": {
"type": "String",
@ -765,6 +782,8 @@
},
"commandHint_markasgroup": "Marcar quam gruppe",
"@commandHint_markasgroup": {},
"screenSharingTitle": "partir li ecran",
"@screenSharingTitle": {},
"bannedUser": "{username} ha bannit {targetName}",
"@bannedUser": {
"type": "String",
@ -877,6 +896,11 @@
}
}
},
"device": "Aparate",
"@device": {
"type": "String",
"placeholders": {}
},
"account": "Conto",
"@account": {
"type": "String",
@ -928,6 +952,8 @@
"@newGroup": {},
"newSpace": "Crear un spacie",
"@newSpace": {},
"allSpaces": "Omni spacies",
"@allSpaces": {},
"logout": "Cluder li session",
"@logout": {
"type": "String",
@ -1003,20 +1029,12 @@
"placeholders": {}
},
"@jumpToLastReadMessage": {},
"@allRooms": {
"type": "String",
"placeholders": {}
},
"@commandHint_cuddle": {},
"@noEncryptionForPublicRooms": {
"type": "String",
"placeholders": {}
},
"@reportErrorDescription": {},
"@setPermissionsLevel": {
"type": "String",
"placeholders": {}
},
"@inviteContactToGroup": {
"type": "String",
"placeholders": {
@ -1025,7 +1043,6 @@
}
}
},
"@chatHasBeenAddedToThisSpace": {},
"@removeYourAvatar": {
"type": "String",
"placeholders": {}
@ -1035,12 +1052,7 @@
"type": "String",
"placeholders": {}
},
"@indexedDbErrorLong": {},
"@oneClientLoggedOut": {},
"@toggleMuted": {
"type": "String",
"placeholders": {}
},
"@unsupportedAndroidVersionLong": {},
"@kicked": {
"type": "String",
@ -1069,7 +1081,6 @@
"type": "String",
"placeholders": {}
},
"@startFirstChat": {},
"@sentAPicture": {
"type": "String",
"placeholders": {
@ -1094,10 +1105,6 @@
"type": "String",
"description": "Usage hint for the command /create"
},
"@singlesignon": {
"type": "String",
"placeholders": {}
},
"@sentAFile": {
"type": "String",
"placeholders": {
@ -1181,10 +1188,6 @@
}
}
},
"@separateChatTypes": {
"type": "String",
"placeholders": {}
},
"@tryAgain": {},
"@areGuestsAllowedToJoin": {
"type": "String",
@ -1226,7 +1229,6 @@
}
},
"@youRejectedTheInvitation": {},
"@otherCallingPermissions": {},
"@messagesStyle": {},
"@couldNotDecryptMessage": {
"type": "String",
@ -1236,11 +1238,8 @@
}
}
},
"@widgetUrlError": {},
"@emailOrUsername": {},
"@newSpaceDescription": {},
"@chatDescription": {},
"@callingAccountDetails": {},
"@pleaseFollowInstructionsOnWeb": {
"type": "String",
"placeholders": {}
@ -1258,17 +1257,7 @@
"type": "String",
"placeholders": {}
},
"@emoteWarnNeedToPick": {
"type": "String",
"placeholders": {}
},
"@reopenChat": {},
"@pleaseEnterRecoveryKey": {},
"@toggleFavorite": {
"type": "String",
"placeholders": {}
},
"@widgetNameError": {},
"@addToBundle": {},
"@spaceIsPublic": {
"type": "String",
@ -1302,7 +1291,6 @@
}
}
},
"@hydrateTor": {},
"@pushNotificationsNotAvailable": {},
"@storeInAppleKeyChain": {},
"@replaceRoomWithNewerVersion": {
@ -1321,7 +1309,6 @@
"type": "String",
"placeholders": {}
},
"@signInWithPassword": {},
"@changedTheGuestAccessRulesTo": {
"type": "String",
"placeholders": {
@ -1358,21 +1345,9 @@
"type": "String",
"placeholders": {}
},
"@goToTheNewRoom": {
"type": "String",
"placeholders": {}
},
"@saveKeyManuallyDescription": {},
"@editBundlesForAccount": {},
"@whyIsThisMessageEncrypted": {},
"@unreadChats": {
"type": "String",
"placeholders": {
"unreadCount": {
"type": "int"
}
}
},
"@rejectedTheInvitation": {
"type": "String",
"placeholders": {
@ -1397,14 +1372,6 @@
"type": "String",
"placeholders": {}
},
"@seenByUser": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"@storeSecurlyOnThisDevice": {},
"@yourChatBackupHasBeenSetUp": {},
"@redactedBy": {
@ -1448,14 +1415,6 @@
}
}
},
"@signInWith": {
"type": "String",
"placeholders": {
"provider": {
"type": "String"
}
}
},
"@changedTheRoomAliases": {
"type": "String",
"placeholders": {
@ -1554,14 +1513,6 @@
}
}
},
"@switchToAccount": {
"type": "number",
"placeholders": {
"number": {
"type": "String"
}
}
},
"@setAsCanonicalAlias": {
"type": "String",
"placeholders": {}
@ -1601,7 +1552,6 @@
"type": "String",
"placeholders": {}
},
"@inviteContactToGroupQuestion": {},
"@redactedByBecause": {
"type": "String",
"placeholders": {
@ -1620,7 +1570,6 @@
}
}
},
"@appearOnTopDetails": {},
"@roomHasBeenUpgraded": {
"type": "String",
"placeholders": {}
@ -1722,7 +1671,6 @@
"type": "String",
"placeholders": {}
},
"@dehydrateTorLong": {},
"@yourPublicKey": {
"type": "String",
"placeholders": {}
@ -1758,7 +1706,6 @@
"placeholders": {}
},
"@serverRequiresEmail": {},
"@hideUnimportantStateEvents": {},
"@sentCallInformations": {
"type": "String",
"placeholders": {
@ -1767,7 +1714,6 @@
}
}
},
"@addToSpaceDescription": {},
"@googlyEyesContent": {
"type": "String",
"placeholders": {
@ -1795,7 +1741,6 @@
"type": "String",
"placeholders": {}
},
"@addChatDescription": {},
"@sentAnAudio": {
"type": "String",
"placeholders": {
@ -1852,8 +1797,6 @@
},
"@sendTypingNotifications": {},
"@inviteGroupChat": {},
"@appearOnTop": {},
"@invitePrivateChat": {},
"@verifyTitle": {
"type": "String",
"placeholders": {}
@ -1914,7 +1857,6 @@
"@notAnImage": {},
"@chatDescriptionHasBeenChanged": {},
"@bundleName": {},
"@dehydrateTor": {},
"@removeFromSpace": {},
"@commandHint_op": {
"type": "String",
@ -1960,7 +1902,6 @@
}
}
},
"@profileNotFound": {},
"@jump": {},
"@reactedWith": {
"type": "String",
@ -2010,10 +1951,6 @@
"type": "String",
"placeholders": {}
},
"@setCustomEmotes": {
"type": "String",
"placeholders": {}
},
"@startedACall": {
"type": "String",
"placeholders": {
@ -2026,20 +1963,11 @@
"type": "String",
"placeholders": {}
},
"@notificationsEnabledForThisAccount": {
"type": "String",
"placeholders": {}
},
"@visibilityOfTheChatHistory": {
"type": "String",
"placeholders": {}
},
"@setTheme": {},
"@youJoinedTheChat": {},
"@openVideoCamera": {
"type": "String",
"placeholders": {}
},
"@chatBackupDescription": {
"type": "String",
"placeholders": {}
@ -2057,7 +1985,6 @@
}
}
},
"@errorAddingWidget": {},
"@commandHint_dm": {
"type": "String",
"description": "Usage hint for the command /dm"
@ -2108,9 +2035,7 @@
"placeholders": {}
},
"@commandHint_googly": {},
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"@createGroup": {},
"@hydrateTorLong": {},
"@contentHasBeenReported": {
"type": "String",
"placeholders": {}
@ -2123,10 +2048,6 @@
"placeholders": {}
},
"@importNow": {},
"@setInvitationLink": {
"type": "String",
"placeholders": {}
},
"@pinMessage": {},
"@screenSharingDetail": {},
"@invite": {},
@ -2135,7 +2056,6 @@
"type": "String",
"placeholders": {}
},
"@indexedDbErrorTitle": {},
"@endedTheCall": {
"type": "String",
"placeholders": {

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -423,6 +423,18 @@
"type": "String",
"placeholders": {}
},
"changedTheChatDescriptionTo": "{username} je spremenil opis klepeta v: '{description}'",
"@changedTheChatDescriptionTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"description": {
"type": "String"
}
}
},
"areGuestsAllowedToJoin": "Ali se lahko gostujoči uporabniki pridružijo",
"@areGuestsAllowedToJoin": {
"type": "String",
@ -433,6 +445,18 @@
"type": "String",
"placeholders": {}
},
"changedTheChatNameTo": "{username} je spremenil ime klepeta v: '{chatname}'",
"@changedTheChatNameTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"chatname": {
"type": "String"
}
}
},
"changeDeviceName": "Spremenite ime naprave",
"@changeDeviceName": {
"type": "String",

View file

@ -1 +1 @@
{}
{}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -12,4 +12,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -261,15 +261,7 @@
"type": "String",
"placeholders": {}
},
"@connect": {
"type": "String",
"placeholders": {}
},
"@jumpToLastReadMessage": {},
"@allRooms": {
"type": "String",
"placeholders": {}
},
"@obtainingLocation": {
"type": "String",
"placeholders": {}
@ -278,7 +270,6 @@
"type": "String",
"placeholders": {}
},
"@widgetVideo": {},
"@dismiss": {},
"@unknownDevice": {
"type": "String",
@ -297,10 +288,6 @@
"type": "String",
"placeholders": {}
},
"@setPermissionsLevel": {
"type": "String",
"placeholders": {}
},
"@inviteContactToGroup": {
"type": "String",
"placeholders": {
@ -318,7 +305,6 @@
"type": "String",
"placeholders": {}
},
"@chatHasBeenAddedToThisSpace": {},
"@reply": {
"type": "String",
"placeholders": {}
@ -344,7 +330,6 @@
"type": "String",
"description": "Usage hint for the command /html"
},
"@widgetJitsi": {},
"@youAreNoLongerParticipatingInThisChat": {
"type": "String",
"placeholders": {}
@ -354,12 +339,7 @@
"placeholders": {}
},
"@messageType": {},
"@indexedDbErrorLong": {},
"@oneClientLoggedOut": {},
"@toggleMuted": {
"type": "String",
"placeholders": {}
},
"@unsupportedAndroidVersionLong": {},
"@kicked": {
"type": "String",
@ -401,8 +381,6 @@
"type": "String",
"placeholders": {}
},
"@startFirstChat": {},
"@callingAccount": {},
"@requestPermission": {
"type": "String",
"placeholders": {}
@ -431,15 +409,10 @@
}
},
"@setColorTheme": {},
"@nextAccount": {},
"@commandHint_create": {
"type": "String",
"description": "Usage hint for the command /create"
},
"@singlesignon": {
"type": "String",
"placeholders": {}
},
"@warning": {
"type": "String",
"placeholders": {}
@ -529,7 +502,6 @@
"type": "String",
"placeholders": {}
},
"@widgetEtherpad": {},
"@waitingPartnerAcceptRequest": {
"type": "String",
"placeholders": {}
@ -566,10 +538,6 @@
}
}
},
"@separateChatTypes": {
"type": "String",
"placeholders": {}
},
"@tryAgain": {},
"@blocked": {
"type": "String",
@ -582,21 +550,6 @@
}
}
},
"@dateWithoutYear": {
"type": "String",
"placeholders": {
"month": {
"type": "String"
},
"day": {
"type": "String"
}
}
},
"@removeDevice": {
"type": "String",
"placeholders": {}
},
"@unbanUserDescription": {},
"@userAndUserAreTyping": {
"type": "String",
@ -622,7 +575,6 @@
"placeholders": {}
},
"@youRejectedTheInvitation": {},
"@otherCallingPermissions": {},
"@messagesStyle": {},
"@couldNotDecryptMessage": {
"type": "String",
@ -637,11 +589,8 @@
"placeholders": {}
},
"@link": {},
"@widgetUrlError": {},
"@emailOrUsername": {},
"@newSpaceDescription": {},
"@chatDescription": {},
"@callingAccountDetails": {},
"@next": {
"type": "String",
"placeholders": {}
@ -658,25 +607,10 @@
}
}
},
"@dateWithYear": {
"type": "String",
"placeholders": {
"year": {
"type": "String"
},
"month": {
"type": "String"
},
"day": {
"type": "String"
}
}
},
"@editRoomAliases": {
"type": "String",
"placeholders": {}
},
"@enterSpace": {},
"@encryptThisChat": {},
"@fileName": {
"type": "String",
@ -686,7 +620,6 @@
"type": "String",
"placeholders": {}
},
"@previousAccount": {},
"@publicRooms": {
"type": "String",
"placeholders": {}
@ -703,25 +636,15 @@
"type": "String",
"placeholders": {}
},
"@emoteWarnNeedToPick": {
"type": "String",
"placeholders": {}
},
"@reopenChat": {},
"@pleaseEnterRecoveryKey": {},
"@create": {
"type": "String",
"placeholders": {}
},
"@toggleFavorite": {
"type": "String",
"placeholders": {}
},
"@no": {
"type": "String",
"placeholders": {}
},
"@widgetNameError": {},
"@inoffensive": {
"type": "String",
"placeholders": {}
@ -739,7 +662,6 @@
"type": "String",
"placeholders": {}
},
"@addWidget": {},
"@removeAllOtherDevices": {
"type": "String",
"placeholders": {}
@ -788,7 +710,6 @@
}
}
},
"@hydrateTor": {},
"@pushNotificationsNotAvailable": {},
"@passwordRecovery": {
"type": "String",
@ -828,7 +749,6 @@
"type": "String",
"placeholders": {}
},
"@signInWithPassword": {},
"@ignoredUsers": {
"type": "String",
"placeholders": {}
@ -889,10 +809,6 @@
"type": "String",
"placeholders": {}
},
"@goToTheNewRoom": {
"type": "String",
"placeholders": {}
},
"@commandHint_clearcache": {
"type": "String",
"description": "Usage hint for the command /clearcache"
@ -912,14 +828,6 @@
"placeholders": {}
},
"@whyIsThisMessageEncrypted": {},
"@unreadChats": {
"type": "String",
"placeholders": {
"unreadCount": {
"type": "int"
}
}
},
"@rejectedTheInvitation": {
"type": "String",
"placeholders": {
@ -941,19 +849,11 @@
"type": "String",
"placeholders": {}
},
"@toggleUnread": {
"type": "String",
"placeholders": {}
},
"@or": {
"type": "String",
"placeholders": {}
},
"@dehydrateWarning": {},
"@sendOriginal": {
"type": "String",
"placeholders": {}
},
"@noOtherDevicesFound": {},
"@whoIsAllowedToJoinThisGroup": {
"type": "String",
@ -963,14 +863,6 @@
"type": "String",
"placeholders": {}
},
"@seenByUser": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"@storeSecurlyOnThisDevice": {},
"@yourChatBackupHasBeenSetUp": {},
"@chatBackup": {
@ -1030,18 +922,6 @@
"type": "String",
"placeholders": {}
},
"@containsDisplayName": {
"type": "String",
"placeholders": {}
},
"@signInWith": {
"type": "String",
"placeholders": {
"provider": {
"type": "String"
}
}
},
"@username": {
"type": "String",
"placeholders": {}
@ -1056,10 +936,6 @@
},
"@fileIsTooBigForServer": {},
"@homeserver": {},
"@people": {
"type": "String",
"placeholders": {}
},
"@changedTheHistoryVisibilityTo": {
"type": "String",
"placeholders": {
@ -1091,7 +967,6 @@
}
}
},
"@callingPermissions": {},
"@newMessageInFluffyChat": {
"type": "String",
"placeholders": {}
@ -1111,18 +986,6 @@
"placeholders": {}
},
"@unlockOldMessages": {},
"@identity": {
"type": "String",
"placeholders": {}
},
"@numChats": {
"type": "number",
"placeholders": {
"number": {
"type": "String"
}
}
},
"@changedTheJoinRulesTo": {
"type": "String",
"placeholders": {
@ -1210,10 +1073,6 @@
"@sendAsText": {
"type": "String"
},
"@inviteForMe": {
"type": "String",
"placeholders": {}
},
"@archiveRoomDescription": {},
"@changedTheChatNameTo": {
"type": "String",
@ -1226,18 +1085,6 @@
}
}
},
"@sendSticker": {
"type": "String",
"placeholders": {}
},
"@switchToAccount": {
"type": "number",
"placeholders": {
"number": {
"type": "String"
}
}
},
"@commandInvalid": {
"type": "String"
},
@ -1308,7 +1155,6 @@
"type": "String",
"placeholders": {}
},
"@inviteContactToGroupQuestion": {},
"@emoteExists": {
"type": "String",
"placeholders": {}
@ -1347,12 +1193,10 @@
"type": "String",
"placeholders": {}
},
"@appearOnTopDetails": {},
"@roomHasBeenUpgraded": {
"type": "String",
"placeholders": {}
},
"@enterRoom": {},
"@enableEmotesGlobally": {
"type": "String",
"placeholders": {}
@ -1402,17 +1246,6 @@
}
},
"@confirmEventUnpin": {},
"@badServerVersionsException": {
"type": "String",
"placeholders": {
"serverVersions": {
"type": "String"
},
"supportedVersions": {
"type": "String"
}
}
},
"@youInvitedUser": {
"placeholders": {
"user": {
@ -1443,10 +1276,6 @@
}
}
},
"@license": {
"type": "String",
"placeholders": {}
},
"@unbanFromChat": {
"type": "String",
"placeholders": {}
@ -1461,10 +1290,6 @@
"description": "State that {command} is not a valid /command."
},
"@redactMessageDescription": {},
"@rejoin": {
"type": "String",
"placeholders": {}
},
"@recoveryKey": {},
"@redactMessage": {
"type": "String",
@ -1487,7 +1312,6 @@
"type": "String",
"placeholders": {}
},
"@dehydrateTorLong": {},
"@yourPublicKey": {
"type": "String",
"placeholders": {}
@ -1541,10 +1365,6 @@
"type": "String",
"placeholders": {}
},
"@memberChanges": {
"type": "String",
"placeholders": {}
},
"@joinRoom": {
"type": "String",
"placeholders": {}
@ -1555,9 +1375,7 @@
"placeholders": {}
},
"@serverRequiresEmail": {},
"@hideUnimportantStateEvents": {},
"@screenSharingTitle": {},
"@widgetCustom": {},
"@sentCallInformations": {
"type": "String",
"placeholders": {
@ -1566,7 +1384,6 @@
}
}
},
"@addToSpaceDescription": {},
"@youBannedUser": {
"placeholders": {
"user": {
@ -1621,7 +1438,6 @@
}
}
},
"@publish": {},
"@openLinkInBrowser": {},
"@clearArchive": {},
"@commandHint_react": {
@ -1664,8 +1480,6 @@
"placeholders": {}
},
"@inviteGroupChat": {},
"@appearOnTop": {},
"@invitePrivateChat": {},
"@verifyTitle": {
"type": "String",
"placeholders": {}
@ -1700,10 +1514,6 @@
"type": "String",
"description": "Usage hint for the command /ban"
},
"@confirm": {
"type": "String",
"placeholders": {}
},
"@wasDirectChatDisplayName": {
"type": "String",
"placeholders": {
@ -1752,7 +1562,6 @@
},
"@newGroup": {},
"@bundleName": {},
"@dehydrateTor": {},
"@removeFromSpace": {},
"@dateAndTimeOfDay": {
"type": "String",
@ -1818,7 +1627,6 @@
}
}
},
"@profileNotFound": {},
"@jump": {},
"@groups": {
"type": "String",
@ -1847,14 +1655,6 @@
}
},
"@sorryThatsNotPossible": {},
"@videoWithSize": {
"type": "String",
"placeholders": {
"size": {
"type": "String"
}
}
},
"@oopsSomethingWentWrong": {
"type": "String",
"placeholders": {}
@ -1870,10 +1670,6 @@
"@shareInviteLink": {},
"@commandHint_markasdm": {},
"@recoveryKeyLost": {},
"@containsUserName": {
"type": "String",
"placeholders": {}
},
"@messages": {
"type": "String",
"placeholders": {}
@ -1899,10 +1695,6 @@
"type": "String",
"placeholders": {}
},
"@setCustomEmotes": {
"type": "String",
"placeholders": {}
},
"@startedACall": {
"type": "String",
"placeholders": {
@ -1919,10 +1711,6 @@
"type": "String",
"placeholders": {}
},
"@notificationsEnabledForThisAccount": {
"type": "String",
"placeholders": {}
},
"@deleteMessage": {
"type": "String",
"placeholders": {}
@ -1935,20 +1723,11 @@
"type": "String",
"placeholders": {}
},
"@setTheme": {},
"@changeTheHomeserver": {
"type": "String",
"placeholders": {}
},
"@youJoinedTheChat": {},
"@wallpaper": {
"type": "String",
"placeholders": {}
},
"@openVideoCamera": {
"type": "String",
"placeholders": {}
},
"@play": {
"type": "String",
"placeholders": {
@ -1982,7 +1761,6 @@
"type": "String",
"placeholders": {}
},
"@widgetName": {},
"@sentASticker": {
"type": "String",
"placeholders": {
@ -1991,7 +1769,6 @@
}
}
},
"@errorAddingWidget": {},
"@commandHint_dm": {
"type": "String",
"description": "Usage hint for the command /dm"
@ -2061,15 +1838,10 @@
"type": "String",
"placeholders": {}
},
"@pleaseChoose": {
"type": "String",
"placeholders": {}
},
"@share": {
"type": "String",
"placeholders": {}
},
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"@createGroup": {},
"@privacy": {
"type": "String",
@ -2083,16 +1855,7 @@
"type": "String",
"placeholders": {}
},
"@hydrateTorLong": {},
"@time": {},
"@enterYourHomeserver": {
"type": "String",
"placeholders": {}
},
"@botMessages": {
"type": "String",
"placeholders": {}
},
"@contentHasBeenReported": {
"type": "String",
"placeholders": {}
@ -2122,10 +1885,6 @@
"type": "String",
"placeholders": {}
},
"@setInvitationLink": {
"type": "String",
"placeholders": {}
},
"@pinMessage": {},
"@screenSharingDetail": {},
"@muteChat": {
@ -2138,7 +1897,6 @@
"type": "String",
"placeholders": {}
},
"@indexedDbErrorTitle": {},
"@endedTheCall": {
"type": "String",
"placeholders": {

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -55,6 +55,18 @@
}
}
},
"changedTheChatDescriptionTo": "{username} 改咗呢個偈嘅介紹: 「'{description}'」",
"@changedTheChatDescriptionTo": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
},
"description": {
"type": "String"
}
}
},
"addEmail": "加 Email",
"@addEmail": {
"type": "String",

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -462,21 +462,18 @@ class ChatController extends State<ChatPageWithRoom>
scrollUpBannerEventId = eventId;
});
bool firstUpdateReceived = false;
void updateView() {
if (!mounted) return;
setReadMarker();
setState(() {});
setState(() {
firstUpdateReceived = true;
});
}
Future<void>? loadTimelineFuture;
int? animateInEventIndex;
void onInsert(int i) {
// setState will be called by updateView() anyway
if (timeline?.allowNewEvent == true) animateInEventIndex = i;
}
Future<void> _getTimeline({String? eventContextId}) async {
await Matrix.of(context).client.roomsLoading;
await Matrix.of(context).client.accountDataLoading;
@ -489,15 +486,11 @@ class ChatController extends State<ChatPageWithRoom>
timeline = await room.getTimeline(
onUpdate: updateView,
eventContextId: eventContextId,
onInsert: onInsert,
);
} catch (e, s) {
Logs().w('Unable to load timeline on event ID $eventContextId', e, s);
if (!mounted) return;
timeline = await room.getTimeline(
onUpdate: updateView,
onInsert: onInsert,
);
timeline = await room.getTimeline(onUpdate: updateView);
if (!mounted) return;
if (e is TimeoutException || e is IOException) {
_showScrollUpMaterialBanner(eventContextId!);

View file

@ -35,7 +35,6 @@ class ChatEventList extends StatelessWidget {
final events = timeline.events.filterByVisibleInGui(
threadId: controller.activeThreadId,
);
final animateInEventIndex = controller.animateInEventIndex;
// create a map of eventId --> index to greatly improve performance of
// ListView's findChildIndexCallback
@ -120,10 +119,7 @@ class ChatEventList extends StatelessWidget {
// The message at this index:
final event = events[i];
final animateIn =
animateInEventIndex != null &&
timeline.events.length > animateInEventIndex &&
event == timeline.events[animateInEventIndex];
final animateIn = i == 0 && controller.firstUpdateReceived;
final nextEvent = i + 1 < events.length ? events[i + 1] : null;
final previousEvent = i > 0 ? events[i - 1] : null;
@ -139,16 +135,13 @@ class ChatEventList extends StatelessWidget {
!controller.expandedEventIds.contains(event.eventId);
return AutoScrollTag(
key: ValueKey(event.eventId),
key: ValueKey(event.transactionId ?? event.eventId),
index: i,
controller: controller.scrollController,
child: Message(
event,
bigEmojis: controller.bigEmojis,
animateIn: animateIn,
resetAnimateIn: () {
controller.animateInEventIndex = null;
},
onSwipe: () => controller.replyAction(replyTo: event),
onInfoTab: controller.showEventInfo,
onMention: () => controller.sendController.text +=

View file

@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:animations/animations.dart';
import 'package:emoji_picker_flutter/locales/default_emoji_set_locale.dart';
import 'package:matrix/matrix.dart';
@ -273,27 +272,11 @@ class ChatInputRow extends StatelessWidget {
child: IconButton(
tooltip: L10n.of(context).emojis,
color: theme.colorScheme.onPrimaryContainer,
icon: PageTransitionSwitcher(
transitionBuilder:
(
Widget child,
Animation<double> primaryAnimation,
Animation<double> secondaryAnimation,
) {
return SharedAxisTransition(
animation: primaryAnimation,
secondaryAnimation: secondaryAnimation,
transitionType: SharedAxisTransitionType.scaled,
fillColor: Colors.transparent,
child: child,
);
},
child: Icon(
controller.showEmojiPicker
? Icons.keyboard
: Icons.add_reaction_outlined,
key: ValueKey(controller.showEmojiPicker),
),
icon: Icon(
controller.showEmojiPicker
? Icons.keyboard
: Icons.add_reaction_outlined,
key: ValueKey(controller.showEmojiPicker),
),
onPressed: controller.emojiPickerAction,
),

View file

@ -10,7 +10,6 @@ import 'package:just_audio/just_audio.dart';
import 'package:matrix/matrix.dart';
import 'package:opus_caf_converter_dart/opus_caf_converter_dart.dart';
import 'package:path_provider/path_provider.dart';
import 'package:universal_html/html.dart' as html;
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/themes.dart';
@ -166,11 +165,11 @@ class AudioPlayerState extends State<AudioPlayerWidget> {
: null,
);
if (!kIsWeb) {
final attachmentUrl = widget.event.attachmentOrThumbnailMxcUrl();
if (!kIsWeb && attachmentUrl != null) {
final tempDir = await getTemporaryDirectory();
final fileName = Uri.encodeComponent(
widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last,
);
final fileName = Uri.encodeComponent(attachmentUrl.pathSegments.last);
file = File('${tempDir.path}/${fileName}_${matrixFile.name}');
await file.writeAsBytes(matrixFile.bytes);
@ -203,12 +202,12 @@ class AudioPlayerState extends State<AudioPlayerWidget> {
if (file != null) {
audioPlayer.setFilePath(file.path);
} else if (kIsWeb) {
final blob = html.Blob([matrixFile.bytes], 'audio/mpeg');
final url = html.Url.createObjectUrlFromBlob(blob);
await audioPlayer.setAudioSource(AudioSource.uri(Uri.parse(url)));
} else {
throw Exception('No audio file provided!');
await audioPlayer.setAudioSource(
AudioSource.uri(
Uri.dataFromBytes(matrixFile.bytes, mimeType: matrixFile.mimeType),
),
);
}
audioPlayer.play().onError(

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,9 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:async/async.dart' show Result;
import 'package:cross_file/cross_file.dart';
import 'package:matrix/matrix.dart';
import 'package:matrix/matrix.dart' hide Result;
import 'package:mime/mime.dart';
import 'package:fluffychat/config/app_config.dart';
@ -53,8 +54,9 @@ class SendFileDialogState extends State<SendFileDialog> {
}
scaffoldMessenger.showLoadingSnackBar(l10n.prepareSendingAttachment);
Navigator.of(context, rootNavigator: false).pop();
final clientConfig = await widget.room.client.getConfig();
final maxUploadSize = clientConfig.mUploadSize ?? 100 * 1000 * 1000;
final clientConfig = await Result.capture(widget.room.client.getConfig());
final maxUploadSize =
clientConfig.asValue?.value.mUploadSize ?? 100 * 1000 * 1000;
for (final xfile in widget.files) {
final MatrixFile file;

View file

@ -1,16 +1,18 @@
import 'dart:async';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:app_links/app_links.dart';
import 'package:cross_file/cross_file.dart';
import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart';
import 'package:go_router/go_router.dart';
import 'package:matrix/matrix.dart' as sdk;
import 'package:matrix/matrix.dart';
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
import 'package:url_launcher/url_launcher_string.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pages/chat_list/chat_list_view.dart';
import 'package:fluffychat/utils/localized_exception_extension.dart';
@ -71,8 +73,6 @@ class ChatListController extends State<ChatList>
StreamSubscription? _intentFileStreamSubscription;
StreamSubscription? _intentUriStreamSubscription;
late ActiveFilter activeFilter;
String? _activeSpaceId;
@ -308,6 +308,12 @@ class ChatListController extends State<ChatList>
void _processIncomingSharedMedia(List<SharedMediaFile> files) {
if (files.isEmpty) return;
if (files.singleOrNull?.path.startsWith(AppConfig.deepLinkPrefix) == true) {
return;
}
inspect(files);
showScaffoldDialog(
context: context,
builder: (context) => ShareScaffoldDialog(
@ -326,14 +332,6 @@ class ChatListController extends State<ChatList>
);
}
Future<void> _processIncomingUris(Uri? uri) async {
if (uri == null) return;
context.go('/rooms');
WidgetsBinding.instance.addPostFrameCallback((_) {
UrlLauncher(context, uri.toString()).openMatrixToUrl();
});
}
void _initReceiveSharingIntent() {
if (!PlatformInfos.isMobile) return;
@ -347,11 +345,6 @@ class ChatListController extends State<ChatList>
_processIncomingSharedMedia,
);
// For receiving shared Uris
_intentUriStreamSubscription = AppLinks().uriLinkStream.listen(
_processIncomingUris,
);
if (PlatformInfos.isAndroid) {
final shortcuts = FlutterShortcuts();
shortcuts.initialize().then(
@ -374,6 +367,7 @@ class ChatListController extends State<ChatList>
_hackyWebRTCFixForWeb();
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) {
_showLastSeenSupportBanner();
searchServer = Matrix.of(
context,
).store.getString(_serverStoreNamespace);
@ -394,11 +388,86 @@ class ChatListController extends State<ChatList>
void dispose() {
_intentDataStreamSubscription?.cancel();
_intentFileStreamSubscription?.cancel();
_intentUriStreamSubscription?.cancel();
scrollController.removeListener(_onScroll);
super.dispose();
}
Future<void> _showLastSeenSupportBanner() async {
if (AppSettings.supportBannerOptOut.value) return;
if (AppSettings.lastSeenSupportBanner.value == 0) {
await AppSettings.lastSeenSupportBanner.setItem(
DateTime.now().millisecondsSinceEpoch,
);
return;
}
final lastSeenSupportBanner = DateTime.fromMillisecondsSinceEpoch(
AppSettings.lastSeenSupportBanner.value,
);
if (DateTime.now().difference(lastSeenSupportBanner) >=
Duration(days: 6 * 7)) {
final theme = Theme.of(context);
final messenger = ScaffoldMessenger.of(context);
messenger.showMaterialBanner(
MaterialBanner(
backgroundColor: theme.colorScheme.errorContainer,
leading: CloseButton(
color: theme.colorScheme.onErrorContainer,
onPressed: () async {
final okCancelResult = await showOkCancelAlertDialog(
context: context,
title: L10n.of(context).skipSupportingFluffyChat,
message: L10n.of(context).fluffyChatSupportBannerMessage,
okLabel: L10n.of(context).iDoNotWantToSupport,
cancelLabel: L10n.of(context).iAlreadySupportFluffyChat,
isDestructive: true,
);
switch (okCancelResult) {
case null:
return;
case OkCancelResult.ok:
messenger.clearMaterialBanners();
return;
case OkCancelResult.cancel:
messenger.clearMaterialBanners();
await AppSettings.supportBannerOptOut.setItem(true);
return;
}
},
),
content: Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Text(
L10n.of(context).fluffyChatSupportBannerMessage,
style: TextStyle(color: theme.colorScheme.onErrorContainer),
),
),
actions: [
TextButton(
onPressed: () {
messenger.clearMaterialBanners();
launchUrlString(
'https://fluffychat.im/faq/#how_can_i_support_fluffychat',
);
},
child: Text(
L10n.of(context).support,
style: TextStyle(color: theme.colorScheme.onErrorContainer),
),
),
],
),
);
await AppSettings.lastSeenSupportBanner.setItem(
DateTime.now().millisecondsSinceEpoch,
);
}
return;
}
Future<void> chatContextAction(
Room room,
BuildContext posContext, [
@ -509,23 +578,44 @@ class ChatListController extends State<ChatList>
],
),
),
PopupMenuItem(
value: ChatContextAction.favorite,
child: Row(
mainAxisSize: .min,
children: [
Icon(
room.isFavourite ? Icons.push_pin : Icons.push_pin_outlined,
),
const SizedBox(width: 12),
Text(
room.isFavourite
? L10n.of(context).unpin
: L10n.of(context).pin,
),
],
if (!room.isLowPriority)
PopupMenuItem(
value: ChatContextAction.favorite,
child: Row(
mainAxisSize: .min,
children: [
Icon(
room.isFavourite ? Icons.push_pin : Icons.push_pin_outlined,
),
const SizedBox(width: 12),
Text(
room.isFavourite
? L10n.of(context).unpin
: L10n.of(context).pin,
),
],
),
),
if (!room.isFavourite)
PopupMenuItem(
value: ChatContextAction.lowPriority,
child: Row(
mainAxisSize: .min,
children: [
Icon(
room.isLowPriority
? Icons.low_priority
: Icons.low_priority_outlined,
),
const SizedBox(width: 12),
Text(
room.isLowPriority
? L10n.of(context).unsetLowPriority
: L10n.of(context).setLowPriority,
),
],
),
),
),
if (spacesWithPowerLevels.isNotEmpty)
PopupMenuItem(
value: ChatContextAction.addToSpace,
@ -659,6 +749,12 @@ class ChatListController extends State<ChatList>
context: context,
future: () => space.setSpaceChild(room.id),
);
case ChatContextAction.lowPriority:
await showFutureLoadingDialog(
context: context,
future: () => room.setLowPriority(!room.isLowPriority),
);
return;
}
}
@ -868,6 +964,7 @@ enum ChatContextAction {
open,
goToSpace,
favorite,
lowPriority,
markUnread,
mute,
leave,

View file

@ -191,6 +191,17 @@ class ChatListItem extends StatelessWidget {
padding: EdgeInsets.only(left: 4.0),
child: Icon(Icons.notifications_off_outlined, size: 16),
),
if (room.isLowPriority)
Padding(
padding: EdgeInsets.only(
right: hasNotifications ? 4.0 : 0.0,
),
child: Icon(
Icons.low_priority,
size: 16,
color: theme.colorScheme.primary,
),
),
if (room.isFavourite)
Padding(
padding: EdgeInsets.only(

View file

@ -4,7 +4,6 @@ import 'package:go_router/go_router.dart';
import 'package:matrix/matrix.dart';
import 'package:url_launcher/url_launcher_string.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart';
@ -69,17 +68,6 @@ class ClientChooserButton extends StatelessWidget {
],
),
),
if (Matrix.of(context).backgroundPush?.firebaseEnabled != true)
PopupMenuItem(
value: SettingsAction.support,
child: Row(
children: [
const Icon(Icons.favorite, color: Colors.red),
const SizedBox(width: 18),
Text(L10n.of(context).donate),
],
),
),
PopupMenuItem(
value: SettingsAction.settings,
child: Row(
@ -90,6 +78,16 @@ class ClientChooserButton extends StatelessWidget {
],
),
),
PopupMenuItem(
value: SettingsAction.support,
child: Row(
children: [
Icon(Icons.favorite, color: Colors.red),
const SizedBox(width: 18),
Text(L10n.of(context).supportFluffyChat),
],
),
),
const PopupMenuDivider(),
for (final bundle in bundles) ...[
if (matrix.accountBundles[bundle]!.length != 1 ||
@ -224,7 +222,9 @@ class ClientChooserButton extends StatelessWidget {
FluffyShare.shareInviteLink(context);
break;
case SettingsAction.support:
launchUrlString(AppConfig.donationUrl);
launchUrlString(
'https://fluffychat.im/faq/#how_can_i_support_fluffychat',
);
break;
case SettingsAction.settings:
context.go('/rooms/settings');

View file

@ -6,7 +6,6 @@ import 'package:flutter/material.dart';
import 'package:chewie/chewie.dart';
import 'package:matrix/matrix.dart';
import 'package:path_provider/path_provider.dart';
import 'package:universal_html/html.dart' as html;
import 'package:video_player/video_player.dart';
import 'package:fluffychat/utils/localized_exception_extension.dart';
@ -64,9 +63,9 @@ class EventVideoPlayerState extends State<EventVideoPlayer> {
// Create the VideoPlayerController from the contents of videoFile.
if (kIsWeb) {
final blob = html.Blob([videoFile.bytes], videoFile.mimeType);
final networkUri = Uri.parse(html.Url.createObjectUrlFromBlob(blob));
videoPlayerController = VideoPlayerController.networkUrl(networkUri);
videoPlayerController = VideoPlayerController.networkUrl(
Uri.dataFromBytes(videoFile.bytes, mimeType: videoFile.mimeType),
);
} else {
final tempDir = await getTemporaryDirectory();
final fileName = Uri.encodeComponent(

View file

@ -2,10 +2,9 @@ import 'package:flutter/material.dart';
import 'package:flutter_linkify/flutter_linkify.dart';
import 'package:go_router/go_router.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:url_launcher/url_launcher_string.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/setting_keys.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pages/intro/flows/restore_backup_flow.dart';
import 'package:fluffychat/utils/platform_infos.dart';
@ -58,7 +57,7 @@ class IntroPage extends StatelessWidget {
),
),
PopupMenuItem(
onTap: () => launchUrl(AppConfig.privacyUrl),
onTap: () => launchUrlString(AppSettings.privacyPolicy.value),
child: Row(
mainAxisSize: .min,
children: [
@ -69,7 +68,7 @@ class IntroPage extends StatelessWidget {
),
),
PopupMenuItem(
value: () => PlatformInfos.showDialog(context),
onTap: () => PlatformInfos.showDialog(context),
child: Row(
mainAxisSize: .min,
children: [

View file

@ -77,6 +77,7 @@ class _IntroPagePresenterState extends State<IntroPagePresenter> {
final client = await Matrix.of(context).getLoginClient();
await client.checkHomeserver(homeserverUrl);
await client.oidcLogin(session: session, code: code, state: state);
if (context.mounted) context.go('/backup');
} catch (e, s) {
Logs().w('Unable to login via OIDC', e, s);
if (mounted) {

View file

@ -191,10 +191,9 @@ class _InviteContactListTile extends StatelessWidget {
overflow: TextOverflow.ellipsis,
style: TextStyle(color: theme.colorScheme.secondary),
),
trailing: TextButton.icon(
trailing: TextButton(
onPressed: isMember ? null : onTap,
label: Text(isMember ? l10n.participant : l10n.invite),
icon: Icon(isMember ? Icons.check : Icons.add),
child: Text(isMember ? l10n.participant : l10n.invite),
),
);
}

View file

@ -17,7 +17,8 @@ import 'package:fluffychat/widgets/matrix.dart';
import '../../widgets/adaptive_dialogs/user_dialog.dart';
class NewPrivateChat extends StatefulWidget {
const NewPrivateChat({super.key});
final String? deeplink;
const NewPrivateChat({super.key, required this.deeplink});
@override
NewPrivateChatController createState() => NewPrivateChatController();
@ -33,6 +34,18 @@ class NewPrivateChatController extends State<NewPrivateChat> {
static const Duration _coolDown = Duration(milliseconds: 500);
@override
void initState() {
super.initState();
final deeplink = widget.deeplink;
if (deeplink != null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
UrlLauncher(context, deeplink).openMatrixToUrl();
});
}
}
Future<void> searchUsers([String? input]) async {
final searchTerm = input ?? controller.text;
if (searchTerm.isEmpty) {

View file

@ -3,8 +3,9 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:matrix/matrix.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:url_launcher/url_launcher_string.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/setting_keys.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/fluffy_share.dart';
import 'package:fluffychat/utils/platform_infos.dart';
@ -200,7 +201,7 @@ class SettingsView extends StatelessWidget {
ListTile(
leading: const Icon(Icons.privacy_tip_outlined),
title: Text(L10n.of(context).privacy),
onTap: () => launchUrl(AppConfig.privacyUrl),
onTap: () => launchUrlString(AppSettings.privacyPolicy.value),
),
ListTile(
leading: const Icon(Icons.info_outline_rounded),

View file

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:file_picker/file_picker.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/setting_keys.dart';
import 'package:fluffychat/utils/account_config.dart';
import 'package:fluffychat/utils/file_selector.dart';
@ -111,32 +110,6 @@ class SettingsStyleController extends State<SettingsStyle> {
ThemeMode get currentTheme => ThemeController.of(context).themeMode;
Color? get currentColor => ThemeController.of(context).primaryColor;
static final List<Color?> customColors = [
null,
AppConfig.chatColor,
Colors.indigo,
Colors.blue,
Colors.blueAccent,
Colors.teal,
Colors.tealAccent,
Colors.green,
Colors.greenAccent,
Colors.yellow,
Colors.yellowAccent,
Colors.orange,
Colors.orangeAccent,
Colors.red,
Colors.redAccent,
Colors.pink,
Colors.pinkAccent,
Colors.purple,
Colors.purpleAccent,
Colors.blueGrey,
Colors.grey,
Colors.white,
Colors.black,
];
void switchTheme(ThemeMode? newTheme) {
if (newTheme == null) return;
switch (newTheme) {

View file

@ -82,14 +82,13 @@ class SettingsStyleView extends StatelessWidget {
Theme.of(context).brightness == Brightness.light
? light?.primary
: dark?.primary;
final colors = List<Color?>.from(
SettingsStyleController.customColors,
);
final colors = [null, AppConfig.chatColor, ...Colors.primaries];
if (systemColor == null) {
colors.remove(null);
}
return GridView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 64,
),

View file

@ -98,19 +98,11 @@ class SignInPage extends StatelessWidget {
final website = server.website;
return Semantics(
identifier: 'homeserver_tile_$i',
child: RadioListTile.adaptive(
child: RadioListTile(
value: server,
enabled:
state.loginLoading.connectionState !=
ConnectionState.waiting,
radioScaleFactor:
FluffyThemes.isColumnMode(context) ||
{
TargetPlatform.iOS,
TargetPlatform.macOS,
}.contains(theme.platform)
? 2
: 1,
title: Row(
children: [
Expanded(

View file

@ -1,24 +0,0 @@
import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart';
int sortHomeservers(PublicHomeserverData a, PublicHomeserverData b) {
return _calcHomeserverScore(b).compareTo(_calcHomeserverScore(a));
}
int _calcHomeserverScore(PublicHomeserverData homeserver) {
var score = 0;
if (homeserver.description?.isNotEmpty == true) score++;
if (homeserver.website?.isNotEmpty == true) score++;
score += (homeserver.languages?.length ?? 0);
score += (homeserver.features?.length ?? 0);
score += (homeserver.onlineStatus ?? 0);
if (homeserver.ipv6 == true) score++;
if (homeserver.isp?.isNotEmpty == true) score++;
if (homeserver.privacy?.isNotEmpty == true) score++;
if (homeserver.rules?.isNotEmpty == true) score++;
if (homeserver.version?.isNotEmpty == true) score++;
if (homeserver.usingVanillaReg == true) score--;
if (homeserver.regLink != null) score--;
if (homeserver.regMethod != 'SSO') score--;
if (homeserver.regMethod == 'In-house Element') score--;
return score;
}

View file

@ -7,7 +7,6 @@ import 'package:matrix/matrix_api_lite/utils/logs.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/setting_keys.dart';
import 'package:fluffychat/pages/sign_in/utils/sort_homeservers.dart';
import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart';
import 'package:fluffychat/pages/sign_in/view_model/sign_in_state.dart';
import 'package:fluffychat/widgets/matrix.dart';
@ -39,7 +38,9 @@ class SignInViewModel extends ValueNotifier<SignInState> {
)
.toList() ??
[];
if (Uri.tryParse(filterText) != null &&
if (filterText.length >= 3 &&
(filterText.contains('.') || filterText == 'localhost') &&
Uri.tryParse(filterText) != null &&
!filteredPublicHomeservers.any(
(homeserver) => homeserver.name == filterText,
)) {
@ -72,8 +73,6 @@ class SignInViewModel extends ValueNotifier<SignInState> {
});
}
publicHomeservers.sort(sortHomeservers);
final defaultServer = publicHomeservers.singleWhereOrNull(
(server) => server.name == AppSettings.defaultHomeserver.value,
);

View file

@ -123,7 +123,9 @@ abstract class ClientManager {
// To make room emotes work
'im.ponies.room_emotes',
},
customImageResizer: customImageResizer,
customImageResizer: PlatformInfos.supportsCustomImageResizer
? customImageResizer
: null,
logLevel: kReleaseMode ? Level.warning : Level.verbose,
database: await flutterMatrixSdkDatabaseBuilder(clientName),
supportedLoginTypes: {
@ -141,6 +143,9 @@ abstract class ClientManager {
onSoftLogout: enableSoftLogout
? (client) => client.refreshAccessToken()
: null,
sendTimelineEventTimeout: Duration(
seconds: AppSettings.sendTimelineEventTimeout.value,
),
);
}

View file

@ -9,10 +9,7 @@ import 'package:go_router/go_router.dart';
import 'package:matrix/matrix.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/client_download_content_extension.dart';
import 'package:fluffychat/utils/client_manager.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/utils/push_helper.dart';
import '../config/app_config.dart';
import '../config/setting_keys.dart';
@ -172,91 +169,15 @@ Future<void> notificationTap(
);
}
final eventId = await room.sendTextEvent(
await room.sendTextEvent(
input,
parseCommands: false,
displayPendingEvent: false,
);
if (PlatformInfos.isAndroid) {
final ownProfile = await room.client.fetchOwnProfile();
final avatar = ownProfile.avatarUrl;
final avatarFile = avatar == null
? null
: await client
.downloadMxcCached(
avatar,
thumbnailMethod: ThumbnailMethod.crop,
width: notificationAvatarDimension,
height: notificationAvatarDimension,
animated: false,
isThumbnail: true,
rounded: true,
)
.timeout(const Duration(seconds: 3));
final messagingStyleInformation =
await AndroidFlutterLocalNotificationsPlugin()
.getActiveNotificationMessagingStyle(id: room.id.hashCode);
if (messagingStyleInformation == null) return;
l10n ??= await lookupL10n(PlatformDispatcher.instance.locale);
messagingStyleInformation.messages?.add(
Message(
input,
DateTime.now(),
Person(
key: room.client.userID,
name: l10n.you,
icon: avatarFile == null
? null
: ByteArrayAndroidIcon(avatarFile),
),
),
);
await FlutterLocalNotificationsPlugin().show(
id: room.id.hashCode,
title: room.getLocalizedDisplayname(MatrixLocals(l10n)),
body: input,
notificationDetails: NotificationDetails(
android: AndroidNotificationDetails(
AppConfig.pushNotificationsChannelId,
l10n.incomingMessages,
category: AndroidNotificationCategory.message,
shortcutId: room.id,
styleInformation: messagingStyleInformation,
groupKey: room.id,
playSound: false,
enableVibration: false,
actions: <AndroidNotificationAction>[
AndroidNotificationAction(
FluffyChatNotificationActions.reply.name,
l10n.reply,
inputs: [
AndroidNotificationActionInput(
label: l10n.writeAMessage,
),
],
cancelNotification: false,
allowGeneratedReplies: true,
semanticAction: SemanticAction.reply,
),
AndroidNotificationAction(
FluffyChatNotificationActions.markAsRead.name,
l10n.markAsRead,
semanticAction: SemanticAction.markAsRead,
),
],
),
),
payload: FluffyChatPushPayload(
client.clientName,
room.id,
eventId,
).toString(),
);
}
case FluffyChatNotificationActions.mute:
await room.setPushRuleState(PushRuleState.mentionsOnly);
}
}
}
enum FluffyChatNotificationActions { markAsRead, reply }
enum FluffyChatNotificationActions { markAsRead, reply, mute }

View file

@ -33,6 +33,9 @@ abstract class PlatformInfos {
static bool get supportsVideoPlayer =>
!PlatformInfos.isWindows && !PlatformInfos.isLinux;
static bool get supportsCustomImageResizer =>
PlatformInfos.isWeb || PlatformInfos.isMobile;
/// Web could also record in theory but currently only wav which is too large
static bool get platformCanRecord => (isMobile || isMacOS || isWeb);

View file

@ -162,43 +162,15 @@ Future<void> _tryPushHelper(
? avatar
: event.senderFromMemoryOrFallback.avatarUrl;
Uint8List? roomAvatarFile, senderAvatarFile;
try {
roomAvatarFile = avatar == null
? null
: await client
.downloadMxcCached(
avatar,
thumbnailMethod: ThumbnailMethod.crop,
width: notificationAvatarDimension,
height: notificationAvatarDimension,
animated: false,
isThumbnail: true,
rounded: true,
)
.timeout(const Duration(seconds: 3));
} catch (e, s) {
Logs().e('Unable to get avatar picture', e, s);
}
try {
senderAvatarFile = event.room.isDirectChat
? roomAvatarFile
: senderAvatar == null
? null
: await client
.downloadMxcCached(
senderAvatar,
thumbnailMethod: ThumbnailMethod.crop,
width: notificationAvatarDimension,
height: notificationAvatarDimension,
animated: false,
isThumbnail: true,
rounded: true,
)
.timeout(const Duration(seconds: 3));
} catch (e, s) {
Logs().e('Unable to get avatar picture', e, s);
}
final ownUser = event.room.unsafeGetUserFromMemoryOrFallback(client.userID!);
final userAvatarFile = await client.tryDownloadNotificationAvatar(
ownUser.avatarUrl,
);
final roomAvatarFile = await client.tryDownloadNotificationAvatar(avatar);
final senderAvatarFile = await client.tryDownloadNotificationAvatar(
senderAvatar,
);
final id = notification.roomId.hashCode;
@ -262,12 +234,11 @@ Future<void> _tryPushHelper(
messagingStyleInformation ??
MessagingStyleInformation(
Person(
name: senderName,
icon: roomAvatarFile == null
name: ownUser.calcDisplayname(),
icon: userAvatarFile == null
? null
: ByteArrayAndroidIcon(roomAvatarFile),
key: event.roomId,
important: event.room.isFavourite,
: ByteArrayAndroidIcon(userAvatarFile),
key: event.room.client.userID,
),
conversationTitle: event.room.isDirectChat ? null : roomName,
groupConversation: !event.room.isDirectChat,
@ -293,7 +264,6 @@ Future<void> _tryPushHelper(
inputs: [
AndroidNotificationActionInput(label: l10n.writeAMessage),
],
cancelNotification: false,
allowGeneratedReplies: true,
semanticAction: SemanticAction.reply,
),
@ -302,6 +272,11 @@ Future<void> _tryPushHelper(
l10n.markAsRead,
semanticAction: SemanticAction.markAsRead,
),
AndroidNotificationAction(
FluffyChatNotificationActions.mute.name,
l10n.mute,
semanticAction: SemanticAction.mute,
),
],
);
const iOSPlatformChannelSpecifics = DarwinNotificationDetails();
@ -372,3 +347,23 @@ Future<void> _setShortcut(
),
);
}
extension on Client {
Future<Uint8List?> tryDownloadNotificationAvatar(Uri? avatar) async {
if (avatar == null) return null;
try {
return await downloadMxcCached(
avatar,
thumbnailMethod: ThumbnailMethod.crop,
width: notificationAvatarDimension,
height: notificationAvatarDimension,
animated: false,
isThumbnail: true,
rounded: true,
).timeout(const Duration(seconds: 3));
} catch (e, s) {
Logs().e('Unable to get avatar picture', e, s);
return null;
}
}
}

View file

@ -0,0 +1,27 @@
import 'package:flutter/foundation.dart';
import 'package:universal_html/html.dart' as html;
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/utils/platform_infos.dart';
(Uri redirectUrl, String urlScheme) calcRedirectUrl({
bool withAuthHtmlPath = false,
}) {
var redirectUrl = kIsWeb
? Uri.parse(html.window.location.href.split('#').first.split('?').first)
: (PlatformInfos.isMobile || PlatformInfos.isMacOS)
? Uri.parse('${AppConfig.appOpenUrlScheme.toLowerCase()}:/login')
: Uri.parse('http://localhost:3001/login');
if (kIsWeb && withAuthHtmlPath) {
redirectUrl = redirectUrl.resolveUri(Uri(pathSegments: ['auth.html']));
}
final urlScheme =
(PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
? redirectUrl.scheme
: 'http://localhost:3001';
return (redirectUrl, urlScheme);
}

View file

@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:matrix/matrix.dart';
import 'package:url_launcher/url_launcher_string.dart';
import 'package:fluffychat/config/setting_keys.dart';
@ -51,7 +52,7 @@ Future<void> connectToHomeserverFlow(
if (authMetadata != null && AppSettings.enableMatrixNativeOIDC.value) {
await oidcLoginFlow(client, context, signUp);
} else if (supportsSso) {
await ssoLoginFlow(client, context, signUp);
await ssoLoginFlow(client, context, signUp, loginFlows);
} else {
if (signUp && regLink != null) {
await launchUrlString(regLink);
@ -73,6 +74,7 @@ Future<void> connectToHomeserverFlow(
context.go('/backup');
}
} catch (e, s) {
Logs().w('Unable to login', e, s);
setState(AsyncSnapshot.withError(ConnectionState.done, e, s));
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(

View file

@ -6,12 +6,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_web_auth_2/flutter_web_auth_2.dart';
import 'package:matrix/matrix.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:universal_html/html.dart' as html;
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/setting_keys.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart';
Future<void> oidcLoginFlow(
Client client,
@ -19,24 +18,16 @@ Future<void> oidcLoginFlow(
bool signUp,
) async {
Logs().i('Starting Matrix Native OIDC Flow...');
final redirectUrl = kIsWeb
? Uri.parse(html.window.location.href.split('#').first.split('?').first)
: (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
? Uri.parse('${AppConfig.appOpenUrlScheme.toLowerCase()}:/login')
: Uri.parse('http://localhost:3001/login');
final urlScheme =
(PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
? redirectUrl.scheme
: 'http://localhost:3001';
final (redirectUrl, urlScheme) = calcRedirectUrl();
final clientUri = Uri.parse(AppConfig.website);
final clientUri = Uri.parse(AppSettings.website.value);
final supportWebPlatform =
kIsWeb &&
kReleaseMode &&
redirectUrl.scheme == 'https' &&
redirectUrl.host.contains(clientUri.host);
if (!supportWebPlatform) {
if (kIsWeb && !supportWebPlatform) {
Logs().w(
'OIDC Application Type web is not supported. Using native now. Please use this instance not in production!',
);
@ -50,9 +41,9 @@ Future<void> oidcLoginFlow(
clientInformation: OidcClientInformation(
clientName: AppSettings.applicationName.value,
clientUri: clientUri,
logoUri: Uri.parse('https://fluffy.chat/assets/favicon.png'),
tosUri: null,
policyUri: AppConfig.privacyUrl,
logoUri: Uri.parse(AppSettings.logoUrl.value),
tosUri: Uri.parse(AppSettings.tos.value),
policyUri: Uri.parse(AppSettings.privacyPolicy.value),
),
);

View file

@ -1,39 +1,60 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_web_auth_2/flutter_web_auth_2.dart';
import 'package:matrix/matrix.dart';
import 'package:universal_html/html.dart' as html;
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart';
Future<void> ssoLoginFlow(
Client client,
BuildContext context,
bool signUp,
List<LoginFlow> loginFlows,
) async {
Logs().i('Starting legacy SSO Flow...');
final redirectUrl = kIsWeb
? Uri.parse(
html.window.location.href,
).resolveUri(Uri(pathSegments: ['auth.html'])).toString()
: (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
? '${AppConfig.appOpenUrlScheme.toLowerCase()}://login'
: 'http://localhost:3001//login';
final (redirectUrl, urlScheme) = calcRedirectUrl(withAuthHtmlPath: true);
Logs().i('Starting legacy SSO Flow with redirect URL', redirectUrl);
final ssoProviders =
(loginFlows
.firstWhere((flow) => flow.type == 'm.login.sso')
.additionalProperties['identity_providers']
as List?)
?.map(
(json) => (
name: json['name'] as String,
id: json['id'] as String,
brand: json['brand'] as String?,
icon: json['icon'] as String?,
),
)
.toList();
final provider = ssoProviders == null
? null
: await showModalActionPopup(
context: context,
title: L10n.of(context).logInTo(client.homeserver!.host),
actions: ssoProviders
.map(
(provider) =>
AdaptiveModalAction(label: provider.name, value: provider),
)
.toList(),
);
final url = client.homeserver!.replace(
path: '/_matrix/client/v3/login/sso/redirect',
path:
'/_matrix/client/v3/login/sso/redirect${provider == null ? '' : '/${provider.id}'}',
queryParameters: {
'redirectUrl': redirectUrl,
'redirectUrl': redirectUrl.toString(),
'action': signUp ? 'register' : 'login',
},
);
final urlScheme =
(PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
? Uri.parse(redirectUrl).scheme
: 'http://localhost:3001';
final result = await FlutterWebAuth2.authenticate(
url: url.toString(),
callbackUrlScheme: urlScheme,

Some files were not shown because too many files have changed in this diff Show more