Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
12d552e4a6 |
|||
|
3019449e0b |
|||
|
98c3bb1c8e |
|||
|
fbd7551003 |
|||
| d25d24a692 | |||
| 90a5579e7c | |||
| f3787d7f83 | |||
| f3ea9d67a6 | |||
| 606bf78152 |
20
.github/workflows/ios.yml
vendored
|
|
@ -1,4 +1,4 @@
|
||||||
name: "Build iOS App"
|
name: "Build IPA"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
|
@ -16,22 +16,24 @@ jobs:
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- name: Set up Flutter
|
- name: Lix GHA Installer Action
|
||||||
uses: subosito/flutter-action@v2
|
uses: samueldr/lix-gha-installer-action@v2026-02-22
|
||||||
with:
|
with:
|
||||||
flutter-version: 3.44.4
|
extra_nix_config: experimental-features = nix-command flakes flake-self-attrs
|
||||||
|
|
||||||
- name: Set up Go
|
|
||||||
uses: actions/setup-go@v6
|
|
||||||
with:
|
|
||||||
go-version-file: gomuks/go.mod
|
|
||||||
|
|
||||||
- name: Build app
|
- name: Build app
|
||||||
run: |
|
run: |
|
||||||
|
nix develop --command bash -c '
|
||||||
|
set -e
|
||||||
flutter pub get
|
flutter pub get
|
||||||
dart scripts/generate.dart
|
dart scripts/generate.dart
|
||||||
flutter pub run build_runner build
|
flutter pub run build_runner build
|
||||||
|
|
||||||
|
FLUTTER_ROOT="$(dirname "$(dirname "$(readlink -f "$(command -v flutter)")")")"
|
||||||
|
sudo find -L "$FLUTTER_ROOT" -type d -iname "*.framework" -exec chmod -R u+w {} +
|
||||||
|
|
||||||
flutter build ios --release --no-codesign
|
flutter build ios --release --no-codesign
|
||||||
|
'
|
||||||
|
|
||||||
# Unsigned IPA: SideStore/AltStore re-sign this on-device with the
|
# Unsigned IPA: SideStore/AltStore re-sign this on-device with the
|
||||||
# user's own Apple ID at install time, so no certificate is needed here.
|
# user's own Apple ID at install time, so no certificate is needed here.
|
||||||
|
|
|
||||||
33
.github/workflows/macos.yml
vendored
|
|
@ -16,32 +16,27 @@ jobs:
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- name: Set up Flutter
|
- name: Lix GHA Installer Action
|
||||||
uses: subosito/flutter-action@v2
|
uses: samueldr/lix-gha-installer-action@v2026-02-22
|
||||||
with:
|
with:
|
||||||
flutter-version: 3.44.4
|
extra_nix_config: experimental-features = nix-command flakes flake-self-attrs
|
||||||
|
|
||||||
- name: Set up Go
|
- name: Build app
|
||||||
uses: actions/setup-go@v6
|
|
||||||
with:
|
|
||||||
go-version-file: gomuks/go.mod
|
|
||||||
|
|
||||||
- name: Build App
|
|
||||||
run: |
|
run: |
|
||||||
|
nix develop --command bash -c '
|
||||||
|
set -e
|
||||||
flutter pub get
|
flutter pub get
|
||||||
dart scripts/generate.dart
|
dart scripts/generate.dart
|
||||||
flutter pub run build_runner build
|
flutter pub run build_runner build
|
||||||
|
|
||||||
|
FLUTTER_ROOT="$(dirname "$(dirname "$(readlink -f "$(command -v flutter)")")")"
|
||||||
|
sudo find -L "$FLUTTER_ROOT" -type d -iname "*.framework" -exec chmod -R u+w {} +
|
||||||
|
|
||||||
flutter build macos --release
|
flutter build macos --release
|
||||||
|
'
|
||||||
|
|
||||||
- name: Create DMG
|
- name: Upload installer artifact
|
||||||
id: create-dmg
|
|
||||||
uses: L-Super/create-dmg-actions@28511e988b13ca34096d439159a66d468b8e724f
|
|
||||||
with:
|
|
||||||
dmg_name: nexus
|
|
||||||
src_dir: build/macos/Build/Products/Release/Nexus.app
|
|
||||||
|
|
||||||
- name: Upload DMG
|
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v6
|
||||||
with:
|
with:
|
||||||
name: nexus.dmg
|
name: App
|
||||||
path: ${{ steps.create-dmg.outputs.dmg_path }}
|
path: build/macos/Build/Products/Release/Nexus.app
|
||||||
|
|
|
||||||
3
.gitignore
vendored
|
|
@ -42,3 +42,6 @@ password.txt
|
||||||
|
|
||||||
# Nix
|
# Nix
|
||||||
/result
|
/result
|
||||||
|
|
||||||
|
# Local IPA builds
|
||||||
|
*.ipa
|
||||||
15
README.md
|
|
@ -15,12 +15,12 @@ A simple and user-friendly Matrix client made with Flutter and a Gomuks backend.
|
||||||
|
|
||||||
## Progress
|
## Progress
|
||||||
|
|
||||||
- [x] Platform Support
|
- [ ] Platform Support
|
||||||
- [x] Linux
|
- [x] Linux
|
||||||
- [x] Windows - Currently has some bugs, due to us not having any developers on Windows. If you want to fix these, get in contact with us though the [Nexus Client Matrix room](https://matrix.to/#/#nexus:federated.nexus).
|
- [x] Windows
|
||||||
- [x] Android
|
- [x] Android
|
||||||
- [x] MacOS - Unsigned .dmg only
|
- [ ] MacOS ([#50](https://git.federated.nexus/Nexus/nexus/issues/50))
|
||||||
- [x] iOS - Unsigned .ipa only
|
- [ ] iOS
|
||||||
- [ ] Web (may not be possible)
|
- [ ] Web (may not be possible)
|
||||||
- [x] Login (via OAuth)
|
- [x] Login (via OAuth)
|
||||||
- [x] Rooms / Spaces
|
- [x] Rooms / Spaces
|
||||||
|
|
@ -116,9 +116,6 @@ If you want to try out Nexus, grab one of the following artifacts from CI:
|
||||||
|
|
||||||
- [Android APK](https://nightly.link/Henry-Hiles/nexus/workflows/android/main/APK.zip)
|
- [Android APK](https://nightly.link/Henry-Hiles/nexus/workflows/android/main/APK.zip)
|
||||||
- [Windows EXE](https://nightly.link/Henry-Hiles/nexus/workflows/windows/main/windows-installer.zip)
|
- [Windows EXE](https://nightly.link/Henry-Hiles/nexus/workflows/windows/main/windows-installer.zip)
|
||||||
- [Unsigned iOS IPA](https://nightly.link/Henry-Hiles/nexus/workflows/ios/main/Nexus.ipa.zip)
|
|
||||||
- [Unsigned MacOS DMG](https://nightly.link/Henry-Hiles/nexus/workflows/macos/main/nexus.dmg.zip)
|
|
||||||
- [Windows EXE](https://nightly.link/Henry-Hiles/nexus/workflows/windows/main/windows-installer.zip)
|
|
||||||
- Flatpak
|
- Flatpak
|
||||||
- [AArch64/Arm64](https://nightly.link/Henry-Hiles/nexus/workflows/flatpak/main/flatpak-aarch64.zip)
|
- [AArch64/Arm64](https://nightly.link/Henry-Hiles/nexus/workflows/flatpak/main/flatpak-aarch64.zip)
|
||||||
- [x86_64/AMD64](https://nightly.link/Henry-Hiles/nexus/workflows/flatpak/main/flatpak-x86_64.zip)
|
- [x86_64/AMD64](https://nightly.link/Henry-Hiles/nexus/workflows/flatpak/main/flatpak-x86_64.zip)
|
||||||
|
|
@ -129,8 +126,8 @@ If you want to try out Nexus, grab one of the following artifacts from CI:
|
||||||
|
|
||||||
#### Linux
|
#### Linux
|
||||||
|
|
||||||
- On NixOS: Either use direnv and `direnv allow`, or `nix flake develop`
|
- With Nix: Either use direnv and `direnv allow`, or `nix flake develop`
|
||||||
- On other distros: Install Flutter, Go, Git, Libclang, Libass, MPV, and Glibc. Do not use any Snap packages, they cause various compilation issues.
|
- Without Nix: Install Flutter, Go, Git, Libclang, Libass, MPV, and Glibc. Do not use any Snap packages, they cause various compilation issues.
|
||||||
|
|
||||||
#### Windows
|
#### Windows
|
||||||
|
|
||||||
|
|
|
||||||
18
flake.lock
generated
|
|
@ -5,11 +5,11 @@
|
||||||
"nixpkgs-lib": "nixpkgs-lib"
|
"nixpkgs-lib": "nixpkgs-lib"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1785627969,
|
"lastModified": 1782949081,
|
||||||
"narHash": "sha256-4dtXQk/NMePegK/nWp5NSeuZKLATItOq61lpEvmXqGw=",
|
"narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "flake-parts",
|
"repo": "flake-parts",
|
||||||
"rev": "427bf4bd9435fdf21321c8cc628c24efc14c0f7a",
|
"rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -73,11 +73,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs-lib": {
|
"nixpkgs-lib": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1785031560,
|
"lastModified": 1782614948,
|
||||||
"narHash": "sha256-OmshNvn2vupOFpYinLUu+1Dnpu4n7Q5N3ggGVNHpkUI=",
|
"narHash": "sha256-ePjCwr1sNm9NYUqywL7QfK3JnlS015msC+eBu2zKlp8=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "nixpkgs.lib",
|
"repo": "nixpkgs.lib",
|
||||||
"rev": "0e79af5e3d4dcfcd676ab5ba3f95d2e3352e078c",
|
"rev": "db3f255737b94216eb71cce308e2912cf6bc2d7c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -88,11 +88,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs_2": {
|
"nixpkgs_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1785967620,
|
"lastModified": 1784497964,
|
||||||
"narHash": "sha256-IItrdb7Puk05RqOBWZYFC5X6Wl1sJmCfh5MWVHw5iMM=",
|
"narHash": "sha256-vlHUuqAcbcH2RKmHbPiuQzbv1pnzzavXnI62RD0bqCU=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "b7c2ada94fe99c15b0dbcf4d11fd7850b957a436",
|
"rev": "241313f4e8e508cb9b13278c2b0fa25b9ca27163",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,6 @@ Future<void> main(List<String> args) => build(args, (input, output) async {
|
||||||
iosSdk = iosConfig.targetSdk;
|
iosSdk = iosConfig.targetSdk;
|
||||||
final minVersion = iosConfig.targetVersion;
|
final minVersion = iosConfig.targetVersion;
|
||||||
iosSdkPath = await getXCodeTool(sdkType: iosSdk.type);
|
iosSdkPath = await getXCodeTool(sdkType: iosSdk.type);
|
||||||
|
|
||||||
final archTriple = switch (targetArch) {
|
final archTriple = switch (targetArch) {
|
||||||
Architecture.arm64 => "arm64",
|
Architecture.arm64 => "arm64",
|
||||||
Architecture.x64 => "x86_64",
|
Architecture.x64 => "x86_64",
|
||||||
|
|
@ -37,7 +36,6 @@ Future<void> main(List<String> args) => build(args, (input, output) async {
|
||||||
"Unsupported iOS architecture: $targetArch",
|
"Unsupported iOS architecture: $targetArch",
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
iosTargetTriple = iosSdk == IOSSdk.iPhoneSimulator
|
iosTargetTriple = iosSdk == IOSSdk.iPhoneSimulator
|
||||||
? "$archTriple-apple-ios$minVersion.0-simulator"
|
? "$archTriple-apple-ios$minVersion.0-simulator"
|
||||||
: "$archTriple-apple-ios$minVersion.0";
|
: "$archTriple-apple-ios$minVersion.0";
|
||||||
|
|
@ -50,10 +48,7 @@ Future<void> main(List<String> args) => build(args, (input, output) async {
|
||||||
break;
|
break;
|
||||||
case OS.macOS:
|
case OS.macOS:
|
||||||
libFileName = "libgomuks.dylib";
|
libFileName = "libgomuks.dylib";
|
||||||
extraEnv = {
|
extraEnv = {"SDKROOT": await getXCodeTool()};
|
||||||
"SDKROOT": await getXCodeTool(),
|
|
||||||
"MACOSX_DEPLOYMENT_TARGET": codeConfig.macOS.targetVersion.toString(),
|
|
||||||
};
|
|
||||||
break;
|
break;
|
||||||
case OS.windows:
|
case OS.windows:
|
||||||
libFileName = "libgomuks.dll";
|
libFileName = "libgomuks.dll";
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 846 B After Width: | Height: | Size: 712 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 5 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 6.9 KiB |
|
|
@ -38,7 +38,6 @@ import "package:nexus/models/requests/set_membership.dart";
|
||||||
import "package:nexus/models/requests/set_state.dart";
|
import "package:nexus/models/requests/set_state.dart";
|
||||||
import "package:nexus/models/requests/upload_media.dart";
|
import "package:nexus/models/requests/upload_media.dart";
|
||||||
import "package:nexus/models/room.dart";
|
import "package:nexus/models/room.dart";
|
||||||
import "package:nexus/models/room_summary.dart";
|
|
||||||
import "package:nexus/models/spec_versions_response.dart";
|
import "package:nexus/models/spec_versions_response.dart";
|
||||||
import "package:nexus/models/sync_data.dart";
|
import "package:nexus/models/sync_data.dart";
|
||||||
import "package:nexus/src/third_party/gomuks.g.dart";
|
import "package:nexus/src/third_party/gomuks.g.dart";
|
||||||
|
|
@ -214,11 +213,10 @@ class ClientController extends AsyncNotifier<int> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> joinRoom(JoinRoomRequest request) async =>
|
Future<String> joinRoom(JoinRoomRequest request) async {
|
||||||
(await _sendCommand("join_room", request.toJson()))["room_id"];
|
final response = await _sendCommand("join_room", request.toJson());
|
||||||
|
return response["room_id"];
|
||||||
Future<RoomSummary> getRoomSummary(JoinRoomRequest request) async =>
|
}
|
||||||
.fromJson(await _sendCommand("get_room_summary", request.toJson()));
|
|
||||||
|
|
||||||
Future<void> leaveRoom(Room room) async {
|
Future<void> leaveRoom(Room room) async {
|
||||||
if (room.metadata == null) return;
|
if (room.metadata == null) return;
|
||||||
|
|
@ -313,7 +311,7 @@ class ClientController extends AsyncNotifier<int> {
|
||||||
Future<Uri?> discoverHomeserver(Uri homeserver) async {
|
Future<Uri?> discoverHomeserver(Uri homeserver) async {
|
||||||
try {
|
try {
|
||||||
final response = await _sendCommand("discover_homeserver", {
|
final response = await _sendCommand("discover_homeserver", {
|
||||||
"user_id": "@fake-user:${homeserver.authority}",
|
"user_id": "@fake-user:${homeserver.host}",
|
||||||
});
|
});
|
||||||
return Uri.parse(response["m.homeserver"]?["base_url"]);
|
return Uri.parse(response["m.homeserver"]?["base_url"]);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
|
||||||
|
|
@ -75,13 +75,12 @@ class RoomChatController extends AsyncNotifier<IList<Event>?> {
|
||||||
);
|
);
|
||||||
|
|
||||||
Future<bool> loadOlder() async {
|
Future<bool> loadOlder() async {
|
||||||
state = AsyncLoading();
|
|
||||||
final timelineKeys = ref
|
final timelineKeys = ref
|
||||||
.read(RoomsController.provider.select((value) => value[roomId]))
|
.read(RoomsController.provider.select((value) => value[roomId]))
|
||||||
?.timeline
|
?.timeline
|
||||||
.keys;
|
.keys;
|
||||||
final response = await ref
|
final response = await ref
|
||||||
.read(ClientController.provider.notifier)
|
.watch(ClientController.provider.notifier)
|
||||||
.paginate(
|
.paginate(
|
||||||
.new(
|
.new(
|
||||||
roomId: roomId,
|
roomId: roomId,
|
||||||
|
|
@ -91,11 +90,8 @@ class RoomChatController extends AsyncNotifier<IList<Event>?> {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (response.events.isEmpty) {
|
|
||||||
state = .data(state.value);
|
|
||||||
} else {
|
|
||||||
ref
|
ref
|
||||||
.read(RoomsController.provider.notifier)
|
.watch(RoomsController.provider.notifier)
|
||||||
.update(
|
.update(
|
||||||
IMap({
|
IMap({
|
||||||
roomId: Room(
|
roomId: Room(
|
||||||
|
|
@ -114,7 +110,6 @@ class RoomChatController extends AsyncNotifier<IList<Event>?> {
|
||||||
}),
|
}),
|
||||||
.new(),
|
.new(),
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
return response.hasMore;
|
return response.hasMore;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
import "package:hooks_riverpod/hooks_riverpod.dart";
|
|
||||||
import "package:nexus/controllers/client.dart";
|
|
||||||
import "package:nexus/models/requests/join_room.dart";
|
|
||||||
import "package:nexus/models/room_summary.dart";
|
|
||||||
|
|
||||||
class RoomSummaryController extends AsyncNotifier<RoomSummary> {
|
|
||||||
final JoinRoomRequest request;
|
|
||||||
RoomSummaryController(this.request);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<RoomSummary> build() =>
|
|
||||||
ref.watch(ClientController.provider.notifier).getRoomSummary(request);
|
|
||||||
|
|
||||||
static final provider = AsyncNotifierProvider.family
|
|
||||||
.autoDispose<RoomSummaryController, RoomSummary, JoinRoomRequest>(
|
|
||||||
RoomSummaryController.new,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -9,14 +9,14 @@ class SettingsController extends AsyncNotifier<Settings> {
|
||||||
final file = await ref.watch(SettingsFileController.provider.future);
|
final file = await ref.watch(SettingsFileController.provider.future);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return .fromJson(json.decode(await file.readAsString()));
|
return Settings.fromJson(json.decode(await file.readAsString()));
|
||||||
} catch (_) {
|
} catch (_) {
|
||||||
return .new();
|
return Settings();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> set(Settings settings) async {
|
Future<void> set(Settings settings) async {
|
||||||
state = .data(settings);
|
state = AsyncData(settings);
|
||||||
final file = await ref.watch(SettingsFileController.provider.future);
|
final file = await ref.watch(SettingsFileController.provider.future);
|
||||||
await file.writeAsString(json.encode(settings.toJson()));
|
await file.writeAsString(json.encode(settings.toJson()));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ extension LinkToMention on String {
|
||||||
///
|
///
|
||||||
/// Returns the decoded identifier (e.g. "#room:matrix.org")
|
/// Returns the decoded identifier (e.g. "#room:matrix.org")
|
||||||
/// or null if this is not a Matrix link.
|
/// or null if this is not a Matrix link.
|
||||||
/// TODO: Needs to be reworked to handle event links. Might be worth just rewriting, I don't like this code.
|
|
||||||
String? get mention {
|
String? get mention {
|
||||||
final trimmed = trim();
|
final trimmed = trim();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,7 @@ class App extends StatelessWidget {
|
||||||
data: (settings) =>
|
data: (settings) =>
|
||||||
settings.useDynamicTheming ? lightDynamic : null,
|
settings.useDynamicTheming ? lightDynamic : null,
|
||||||
) ??
|
) ??
|
||||||
ThemeData.light().colorScheme)
|
ColorScheme.fromSeed(seedColor: Colors.indigo))
|
||||||
.theme,
|
.theme,
|
||||||
darkTheme:
|
darkTheme:
|
||||||
(ref
|
(ref
|
||||||
|
|
@ -122,7 +122,10 @@ class App extends StatelessWidget {
|
||||||
data: (settings) =>
|
data: (settings) =>
|
||||||
settings.useDynamicTheming ? darkDynamic : null,
|
settings.useDynamicTheming ? darkDynamic : null,
|
||||||
) ??
|
) ??
|
||||||
ThemeData.dark().colorScheme)
|
ColorScheme.fromSeed(
|
||||||
|
seedColor: Colors.indigo,
|
||||||
|
brightness: Brightness.dark,
|
||||||
|
))
|
||||||
.theme,
|
.theme,
|
||||||
themeMode: ref
|
themeMode: ref
|
||||||
.watch(SettingsController.provider)
|
.watch(SettingsController.provider)
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ part "join_room.g.dart";
|
||||||
abstract class JoinRoomRequest with _$JoinRoomRequest {
|
abstract class JoinRoomRequest with _$JoinRoomRequest {
|
||||||
const factory JoinRoomRequest({
|
const factory JoinRoomRequest({
|
||||||
required String roomIdOrAlias,
|
required String roomIdOrAlias,
|
||||||
@Default(IList.empty()) IList<String> via,
|
required IList<String> via,
|
||||||
}) = _JoinRoomRequest;
|
}) = _JoinRoomRequest;
|
||||||
|
|
||||||
factory JoinRoomRequest.fromJson(Map<String, Object?> json) =>
|
factory JoinRoomRequest.fromJson(Map<String, Object?> json) =>
|
||||||
|
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
import "package:freezed_annotation/freezed_annotation.dart";
|
|
||||||
import "package:nexus/models/content/create.dart";
|
|
||||||
import "package:nexus/models/join_rule.dart";
|
|
||||||
part "room_summary.freezed.dart";
|
|
||||||
part "room_summary.g.dart";
|
|
||||||
|
|
||||||
@freezed
|
|
||||||
abstract class RoomSummary with _$RoomSummary {
|
|
||||||
const factory RoomSummary({
|
|
||||||
required String roomId,
|
|
||||||
@JsonKey(name: "num_joined_members") required int joinedMembers,
|
|
||||||
JoinRule? joinRule,
|
|
||||||
String? name,
|
|
||||||
Uri? avatarUrl,
|
|
||||||
String? canonicalAlias,
|
|
||||||
String? topic,
|
|
||||||
String? roomVersion,
|
|
||||||
@JsonKey(unknownEnumValue: RoomType.room) RoomType? roomType,
|
|
||||||
}) = _RoomSummary;
|
|
||||||
|
|
||||||
factory RoomSummary.fromJson(Map<String, Object?> json) =>
|
|
||||||
_$RoomSummaryFromJson(json);
|
|
||||||
}
|
|
||||||
|
|
@ -26,17 +26,6 @@ class SelectServerPage extends HookConsumerWidget {
|
||||||
final homeserverUrl = useTextEditingController();
|
final homeserverUrl = useTextEditingController();
|
||||||
|
|
||||||
Future<void> setHomeserver(Uri? newHomeserver) async {
|
Future<void> setHomeserver(Uri? newHomeserver) async {
|
||||||
if (newHomeserver == null) {
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
|
||||||
SnackBar(
|
|
||||||
content: Text(
|
|
||||||
"Failed to parse homeserver URL. Are you sure you typed it correctly?",
|
|
||||||
style: .new(color: theme.colorScheme.onErrorContainer),
|
|
||||||
),
|
|
||||||
backgroundColor: theme.colorScheme.errorContainer,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
@ -44,14 +33,26 @@ class SelectServerPage extends HookConsumerWidget {
|
||||||
newHomeserver = Uri.https(newHomeserver!.path);
|
newHomeserver = Uri.https(newHomeserver!.path);
|
||||||
}
|
}
|
||||||
|
|
||||||
final newUrl = await ref
|
final newUrl = newHomeserver == null
|
||||||
|
? null
|
||||||
|
: await ref
|
||||||
.read(ClientController.provider.notifier)
|
.read(ClientController.provider.notifier)
|
||||||
.discoverHomeserver(newHomeserver!);
|
.discoverHomeserver(newHomeserver);
|
||||||
|
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
Future<void> tryLogin(Uri url) async {
|
if (newUrl == null) {
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
content: Text(
|
||||||
|
"Homeserver verification failed. Is your homeserver down?",
|
||||||
|
style: .new(color: theme.colorScheme.onErrorContainer),
|
||||||
|
),
|
||||||
|
backgroundColor: theme.colorScheme.errorContainer,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
final codeResponse = await ref.watch(
|
final codeResponse = await ref.watch(
|
||||||
AuthUrlController.provider(url).future,
|
AuthUrlController.provider(newUrl).future,
|
||||||
);
|
);
|
||||||
|
|
||||||
await ref.watch(LaunchHelper.provider).launchUrl(codeResponse.url);
|
await ref.watch(LaunchHelper.provider).launchUrl(codeResponse.url);
|
||||||
|
|
@ -69,7 +70,7 @@ class SelectServerPage extends HookConsumerWidget {
|
||||||
.watch(ClientController.provider.notifier)
|
.watch(ClientController.provider.notifier)
|
||||||
.exchangeToken(
|
.exchangeToken(
|
||||||
.new(
|
.new(
|
||||||
homeserverUrl: url,
|
homeserverUrl: newUrl,
|
||||||
codeVerifier: codeResponse.codeVerifier,
|
codeVerifier: codeResponse.codeVerifier,
|
||||||
redirectUri: .new(
|
redirectUri: .new(
|
||||||
scheme: "nexus.federated.nexus",
|
scheme: "nexus.federated.nexus",
|
||||||
|
|
@ -77,7 +78,7 @@ class SelectServerPage extends HookConsumerWidget {
|
||||||
),
|
),
|
||||||
code: code,
|
code: code,
|
||||||
clientId: await ref.watch(
|
clientId: await ref.watch(
|
||||||
ClientIdController.provider(url).future,
|
ClientIdController.provider(newUrl).future,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -88,25 +89,6 @@ class SelectServerPage extends HookConsumerWidget {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newUrl == null) {
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
|
||||||
SnackBar(
|
|
||||||
content: Text(
|
|
||||||
"Homeserver verification failed.",
|
|
||||||
style: .new(color: theme.colorScheme.onErrorContainer),
|
|
||||||
),
|
|
||||||
action: SnackBarAction(
|
|
||||||
onPressed: () => tryLogin(newHomeserver!),
|
|
||||||
label: "Attempt log in anyways",
|
|
||||||
textColor: theme.colorScheme.onErrorContainer,
|
|
||||||
),
|
|
||||||
backgroundColor: theme.colorScheme.errorContainer,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
tryLogin(newUrl);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (error, stackTrace) {
|
} catch (error, stackTrace) {
|
||||||
showError(error, stackTrace);
|
showError(error, stackTrace);
|
||||||
|
|
|
||||||
|
|
@ -235,11 +235,9 @@ class Composer extends HookConsumerWidget {
|
||||||
maxLines: 12,
|
maxLines: 12,
|
||||||
minLines: 1,
|
minLines: 1,
|
||||||
autofocus:
|
autofocus:
|
||||||
(Platform.isLinux ||
|
Platform.isLinux ||
|
||||||
Platform.isMacOS ||
|
Platform.isMacOS ||
|
||||||
Platform.isWindows)
|
Platform.isWindows,
|
||||||
? true
|
|
||||||
: false,
|
|
||||||
decoration: .new(
|
decoration: .new(
|
||||||
hintText: "Your message here...",
|
hintText: "Your message here...",
|
||||||
border: .none,
|
border: .none,
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,8 @@
|
||||||
import "package:flutter/material.dart";
|
import "package:flutter/material.dart";
|
||||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||||
import "package:nexus/controllers/room_summary.dart";
|
|
||||||
import "package:nexus/controllers/user.dart";
|
import "package:nexus/controllers/user.dart";
|
||||||
import "package:nexus/helpers/extensions/link_to_mention.dart";
|
import "package:nexus/helpers/extensions/link_to_mention.dart";
|
||||||
import "package:nexus/helpers/extensions/show_user_popover.dart";
|
import "package:nexus/helpers/extensions/show_user_popover.dart";
|
||||||
import "package:nexus/models/content/membership.dart";
|
|
||||||
import "package:nexus/models/room_summary.dart";
|
|
||||||
|
|
||||||
class MentionChip extends ConsumerWidget {
|
class MentionChip extends ConsumerWidget {
|
||||||
final String? roomId;
|
final String? roomId;
|
||||||
|
|
@ -15,48 +12,29 @@ class MentionChip extends ConsumerWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final mention = content.mention;
|
final mention = content.mention;
|
||||||
final data = switch (mention?.characters.firstOrNull) {
|
final membership = mention?.startsWith("@") == true
|
||||||
"@" =>
|
? ref
|
||||||
ref
|
|
||||||
.watch(
|
.watch(
|
||||||
UserController.provider(.new(roomId: roomId, userId: mention!)),
|
UserController.provider(.new(roomId: roomId, userId: mention!)),
|
||||||
)
|
)
|
||||||
.whenOrNull(data: (data) => data),
|
.whenOrNull(data: (data) => data)
|
||||||
|
: null;
|
||||||
"#" || "!" =>
|
|
||||||
ref
|
|
||||||
.watch(
|
|
||||||
RoomSummaryController.provider(.new(roomIdOrAlias: mention!)),
|
|
||||||
)
|
|
||||||
.whenOrNull(data: (data) => data),
|
|
||||||
|
|
||||||
_ => null,
|
|
||||||
};
|
|
||||||
|
|
||||||
return mention == null
|
return mention == null
|
||||||
? SizedBox.shrink()
|
? SizedBox.shrink()
|
||||||
: InkWell(
|
: InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (data case MembershipContent membership) {
|
if (membership != null) {
|
||||||
context.showUserPopover(membership, mention, roomId: roomId);
|
context.showUserPopover(membership, mention, roomId: roomId);
|
||||||
} else if (data case RoomSummary summary) {
|
|
||||||
// TODO: Handle summary
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: IgnorePointer(
|
child: IgnorePointer(
|
||||||
child: Chip(
|
child: Chip(
|
||||||
label: Text(
|
label: Text(
|
||||||
switch (data) {
|
(membership?.displayName == null
|
||||||
RoomSummary summary =>
|
? null
|
||||||
(summary.name == null ? null : "#${summary.name}") ??
|
: "@${membership!.displayName}") ??
|
||||||
summary.canonicalAlias ??
|
mention,
|
||||||
summary.roomId,
|
|
||||||
MembershipContent membership =>
|
|
||||||
membership.displayName == null
|
|
||||||
? mention
|
|
||||||
: "@${membership.displayName}",
|
|
||||||
_ => mention,
|
|
||||||
},
|
|
||||||
style: .new(
|
style: .new(
|
||||||
fontWeight: .bold,
|
fontWeight: .bold,
|
||||||
color: Theme.of(context).colorScheme.onPrimary,
|
color: Theme.of(context).colorScheme.onPrimary,
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,6 @@ class RoomChat extends HookConsumerWidget {
|
||||||
final controllerData = ref.watch(controllerProvider);
|
final controllerData = ref.watch(controllerProvider);
|
||||||
|
|
||||||
final topEventBeforeLoad = useState<String?>(null);
|
final topEventBeforeLoad = useState<String?>(null);
|
||||||
final hasMore = useState<bool>(true);
|
|
||||||
|
|
||||||
Future<void> jumpToId(String eventId) async {
|
Future<void> jumpToId(String eventId) async {
|
||||||
final index = controllerData.value?.indexWhere(
|
final index = controllerData.value?.indexWhere(
|
||||||
|
|
@ -106,7 +105,7 @@ class RoomChat extends HookConsumerWidget {
|
||||||
Future<void> loadOlder() async {
|
Future<void> loadOlder() async {
|
||||||
if (controllerData case AsyncData(:final value?)) {
|
if (controllerData case AsyncData(:final value?)) {
|
||||||
topEventBeforeLoad.value = value.firstOrNull?.eventId;
|
topEventBeforeLoad.value = value.firstOrNull?.eventId;
|
||||||
hasMore.value = await notifier.loadOlder();
|
await notifier.loadOlder();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -311,7 +310,7 @@ class RoomChat extends HookConsumerWidget {
|
||||||
await Clipboard.setData(
|
await Clipboard.setData(
|
||||||
ClipboardData(
|
ClipboardData(
|
||||||
text:
|
text:
|
||||||
"matrix:roomid/${room.metadata?.id.substring(1)}/e/${event.eventId}$vias",
|
"matrix:roomid/${room.metadata?.id.substring(1)}/e/${event.eventId}$vias)",
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
@ -467,11 +466,10 @@ class RoomChat extends HookConsumerWidget {
|
||||||
child: switch (controllerData) {
|
child: switch (controllerData) {
|
||||||
AsyncData(:final value?) ||
|
AsyncData(:final value?) ||
|
||||||
AsyncLoading(:final value?) => CustomScrollView(
|
AsyncLoading(:final value?) => CustomScrollView(
|
||||||
|
controller: scrollController,
|
||||||
keyboardDismissBehavior:
|
keyboardDismissBehavior:
|
||||||
ScrollViewKeyboardDismissBehavior.onDrag,
|
ScrollViewKeyboardDismissBehavior.onDrag,
|
||||||
controller: scrollController,
|
|
||||||
slivers: [
|
slivers: [
|
||||||
if (hasMore.value)
|
|
||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: .symmetric(vertical: 36),
|
padding: .symmetric(vertical: 36),
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,8 @@ class RoomMenu extends ConsumerWidget {
|
||||||
|
|
||||||
await Clipboard.setData(
|
await Clipboard.setData(
|
||||||
.new(
|
.new(
|
||||||
text: "matrix:roomid/${room!.metadata?.id.substring(1)}$vias",
|
text:
|
||||||
|
"matrix:roomid/${room!.metadata?.id.substring(1)}$vias)",
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
platform :osx, '13.0'
|
platform :osx, '10.15'
|
||||||
|
|
||||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|
|
||||||
|
|
@ -567,7 +567,7 @@
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 13.0;
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
SDKROOT = macosx;
|
SDKROOT = macosx;
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
|
|
@ -649,7 +649,7 @@
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 13.0;
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
SDKROOT = macosx;
|
SDKROOT = macosx;
|
||||||
|
|
@ -699,7 +699,7 @@
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 13.0;
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
SDKROOT = macosx;
|
SDKROOT = macosx;
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,4 @@
|
||||||
{
|
{
|
||||||
"info": {
|
|
||||||
"version": 1,
|
|
||||||
"author": "xcode"
|
|
||||||
},
|
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"size" : "16x16",
|
"size" : "16x16",
|
||||||
|
|
@ -64,5 +60,9 @@
|
||||||
"filename" : "app_icon_1024.png",
|
"filename" : "app_icon_1024.png",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "xcode"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 678 B After Width: | Height: | Size: 520 B |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.2 KiB |
24
pubspec.lock
|
|
@ -293,10 +293,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: dynamic_color
|
name: dynamic_color
|
||||||
sha256: "4aeb76de323e8eb660bab5557d826ad7ebbf1434a598f0c6aa8a11a9696a6757"
|
sha256: "43a5a6679649a7731ab860334a5812f2067c2d9ce6452cf069c5e0c25336c17c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.9.0"
|
version: "1.8.1"
|
||||||
dynamic_polls:
|
dynamic_polls:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -366,10 +366,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: ffigen
|
name: ffigen
|
||||||
sha256: "56fc0be88937409839a59c133dfdee4165e80da324c9e39f59013060249ffb44"
|
sha256: b7803707faeec4ce3c1b0c2274906504b796e3b70ad573577e72333bd1c9b3ba
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "21.0.0"
|
version: "20.1.1"
|
||||||
file:
|
file:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -762,10 +762,10 @@ packages:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: json_serializable
|
name: json_serializable
|
||||||
sha256: e45aefa0324f08c683caafbb94b72837aa6193c61822799c916e45f4a263113d
|
sha256: ffcd10cde35a93b2abbbcc26bd9971f4ca93763e8abe78d855e3c4177797e501
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.14.1"
|
version: "6.14.0"
|
||||||
leak_tracker:
|
leak_tracker:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -819,10 +819,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: m3e_buttons
|
name: m3e_buttons
|
||||||
sha256: "20b29df165d4d866ffd0d4808090210740690707705f44fc61c9b275bec3af36"
|
sha256: af1b19bd5ec7327d20b5a57c6c91e1ed30ee15a4dbade781c0cdbc72e6b04b5e
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.0.5"
|
version: "0.0.4"
|
||||||
m3e_card_list:
|
m3e_card_list:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -951,14 +951,6 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.1.0"
|
||||||
native_toolchain_c:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: native_toolchain_c
|
|
||||||
sha256: f9c168717100ae6d9fee9ffb0be379bf1f8b26b0f6bcbd4fdddcd931993a6a72
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.19.2"
|
|
||||||
navigation_rail_m3e:
|
navigation_rail_m3e:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
|
||||||
15
pubspec.yaml
|
|
@ -39,7 +39,7 @@ dependencies:
|
||||||
freezed_annotation: 3.1.0
|
freezed_annotation: 3.1.0
|
||||||
image_picker: ^1.2.3
|
image_picker: ^1.2.3
|
||||||
path: 1.9.1
|
path: 1.9.1
|
||||||
dynamic_color: 1.9.0
|
dynamic_color: 1.8.1
|
||||||
collection: 1.19.1
|
collection: 1.19.1
|
||||||
window_manager: 0.5.2
|
window_manager: 0.5.2
|
||||||
color_hash: 1.0.1
|
color_hash: 1.0.1
|
||||||
|
|
@ -53,7 +53,7 @@ dependencies:
|
||||||
ffi: 2.2.0
|
ffi: 2.2.0
|
||||||
hooks: 2.0.2
|
hooks: 2.0.2
|
||||||
code_assets: 1.2.1
|
code_assets: 1.2.1
|
||||||
ffigen: 21.0.0
|
ffigen: 20.1.1
|
||||||
timeago: 3.7.1
|
timeago: 3.7.1
|
||||||
http: 1.6.0
|
http: 1.6.0
|
||||||
flutter_linkify: 6.0.0
|
flutter_linkify: 6.0.0
|
||||||
|
|
@ -67,7 +67,7 @@ dependencies:
|
||||||
media_kit_video: 2.0.1
|
media_kit_video: 2.0.1
|
||||||
media_kit_libs_video: 1.0.7
|
media_kit_libs_video: 1.0.7
|
||||||
measure_size: 5.0.2
|
measure_size: 5.0.2
|
||||||
m3e_buttons: 0.0.5
|
m3e_buttons: 0.0.4
|
||||||
navigation_rail_m3e:
|
navigation_rail_m3e:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/Henry-Hiles/material_3_expressive
|
url: https://github.com/Henry-Hiles/material_3_expressive
|
||||||
|
|
@ -84,18 +84,15 @@ dev_dependencies:
|
||||||
freezed: 3.2.6-dev.1
|
freezed: 3.2.6-dev.1
|
||||||
riverpod_lint: 3.1.4
|
riverpod_lint: 3.1.4
|
||||||
flutter_launcher_icons: 0.14.4
|
flutter_launcher_icons: 0.14.4
|
||||||
json_serializable: 6.14.1
|
json_serializable: 6.14.0
|
||||||
|
|
||||||
flutter_launcher_icons:
|
flutter_launcher_icons:
|
||||||
image_path: assets/icon.png
|
|
||||||
ios: true
|
ios: true
|
||||||
image_path_ios: assets/mobile.png
|
|
||||||
android: true
|
android: true
|
||||||
|
image_path: assets/icon.png
|
||||||
adaptive_icon_background: assets/background.png
|
adaptive_icon_background: assets/background.png
|
||||||
adaptive_icon_foreground: assets/foreground.png
|
adaptive_icon_foreground: assets/foreground.png
|
||||||
adaptive_icon_monochrome: assets/monochrome.png
|
adaptive_icon_monochrome: assets/monochrome.png
|
||||||
|
remove_alpha_ios: true
|
||||||
windows:
|
windows:
|
||||||
generate: true
|
generate: true
|
||||||
macos:
|
|
||||||
generate: true
|
|
||||||
image_path: assets/mobile.png
|
|
||||||
|
|
|
||||||